Module10- QTZoo/Source/MainFrame.java

import java.awt.*;
import java.awt.event.*;
 
import java.util.Vector;
import java.util.StringTokenizer;
 
import quicktime.QTException;
import quicktime.QTSession;
import quicktime.app.display.QTCanvas;
import quicktime.app.anim.Compositor;
import quicktime.app.image.QTTransition;
import quicktime.std.movies.Atom;
import quicktime.std.movies.AtomContainer;
import quicktime.std.StdQTConstants;
import quicktime.qd.QDDimension;
 
import quicktime.util.EndianOrder;
 
 
/**
 * QTZoo Module 8 - Using QuickTime Transitions
 * This application requires QuickTime for Java
 *
 * @author Levi Brown
 * @author Michael Hopkins
 * @author Apple Computer, Inc.
 * @version 8.0 4/10/2000
 * Copyright:   © Copyright 1999 Apple Computer, Inc. All rights reserved.
 *  
 * Disclaimer:  IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc.
 *              ("Apple") in consideration of your agreement to the following terms, and your
 *              use, installation, modification or redistribution of this Apple software
 *              constitutes acceptance of these terms.  If you do not agree with these terms,
 *              please do not use, install, modify or redistribute this Apple software.
 *
 *              In consideration of your agreement to abide by the following terms, and subject
 *              to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
 *              copyrights in this original Apple software (the "Apple Software"), to use,
 *              reproduce, modify and redistribute the Apple Software, with or without
 *              modifications, in source and/or binary forms; provided that if you redistribute
 *              the Apple Software in its entirety and without modifications, you must retain
 *              this notice and the following text and disclaimers in all such redistributions of
 *              the Apple Software.  Neither the name, trademarks, service marks or logos of
 *              Apple Computer, Inc. may be used to endorse or promote products derived from the
 *              Apple Software without specific prior written permission from Apple.  Except as
 *              expressly stated in this notice, no other rights or licenses, express or implied,
 *              are granted by Apple herein, including but not limited to any patent rights that
 *              may be infringed by your derivative works or by other works in which the Apple
 *              Software may be incorporated.
 *
 *              The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO
 *              WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
 *              WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 *              PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
 *              COMBINATION WITH YOUR PRODUCTS.
 *
 *              IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
 *              CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 *              GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 *              ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
 *              OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
 *              (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
 *              ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * 
 */
 
 
public class MainFrame extends Frame 
{
    public static final int WIDTH  = 640;
    public static final int HEIGHT = 480;
 
    /**
     * Creates the QTCanvas, loads media, and displays window contents
     */
    public MainFrame( String s )
    {
        super( s );
        setResizable( false );
        setBounds( 0, 0, WIDTH, HEIGHT );
        
        myQTCanvas = new QTCanvas( QTCanvas.kInitialSize, 0.5F, 0.5F );     // Create new QT Canvas
        add( myQTCanvas );
        
        loadPanes( );   
        
        try
        {
            myQTCanvas.setClient (mapPane.getCompositor(), true);               //Set the canvas to display the map pane
        }
        catch (QTException exc)
        {
            exc.printStackTrace();
        }                                                                   
        
        addWindowListener( new WindowAdapter() 
        {
            public void windowClosing( WindowEvent we )
            {
                QTSession.close();
                dispose();
            }
            public void windowClosed( WindowEvent we )
            {
                System.exit( 0 );
            }
        });
        
        show();
        toFront();
    }
    
    /**
     * Loads the data displayed in each of the animal panes
     */
    public void loadPanes()
    {
        actionListener = new Action();
 
        mapPane = new MapPane( );
        mapPane.addActionListener(actionListener);
        
        zebraPane = new AnimalPane( );
        zebraPane.addActionListener(actionListener);
    }
    
    protected void transition(ZooPane fromPane, ZooPane toPane, Point effectLoc )
    {
        Compositor fromComp = fromPane.getCompositor();
        Compositor toComp = toPane.getCompositor();
        try
        {
            //Make sure the compositor has had a chance to drawn itself
            toComp.setGWorld(quicktime.qd.QDGraphics.validScratch);
            toComp.redraw(null);
            
            QTTransition transition = new QTTransition(new QDDimension(MainFrame.WIDTH, MainFrame.HEIGHT));
            transition.setTime(1000);
            transition.setSourceImage(fromComp);
            transition.setDestinationImage(toComp);
            transition.setProfiled(false);
            myQTCanvas.setClient (transition, true);
 
            AtomContainer effectSample = new AtomContainer();
 
            if (effectLoc == null)
            {
                // We are using SMPTE Effects so set the what atom to smpt
                effectSample.insertChild (Atom.kParentIsContainer, StdQTConstants.kEffectWhatAtom, 1, 0, EndianOrder.flipNativeToBigEndian32(StdQTConstants.kWipeTransitionType));      
                // We are using SMPTE effect number 74  - start at 0%, stop at 100%
                effectSample.insertChild(Atom.kParentIsContainer, StdQTConstants.kEffectWipe, 1, 0, EndianOrder.flipNativeToBigEndian32(StdQTConstants.kRandomWipeTransitionType));
            }
            else
            {
                effectSample.insertChild(Atom.kParentIsContainer, StdQTConstants.kEffectWhatAtom, 1, 0, EndianOrder.flipNativeToBigEndian32(StdQTConstants.kExplodeTransitionType));        
                effectSample.insertChild(Atom.kParentIsContainer, StdQTConstants.kExplodeTransitionType, 1, 0, EndianOrder.flipNativeToBigEndian32(StdQTConstants.kExplodeTransitionType));
            }
            transition.setEffect(effectSample);
            transition.doTransition();
 
            myQTCanvas.setClient (toComp, true);
 
            toPane.start();
            fromPane.stop();
        }
        catch (QTException exc)
        {
            exc.printStackTrace();
        }
    }
 
    
    /**
     * Responds to actions targeting the MainFrame
     * Responsible for handling clicks in the animal regions in the Map Pane
     */
    class Action implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            Object source = event.getSource();
            String command = event.getActionCommand();
            StringTokenizer st = new StringTokenizer(command, ";");
            Vector params = new Vector();
            
            while (st.hasMoreTokens())
            {
                params.addElement(st.nextToken());
            }
 
            //Minimalistic error checking...
            if (params.size() < 3)
            {
                System.err.println("Not enough parameters in command");
                return;
            }
            
            //Parse our action command for pertinate info   
            String area = (String)params.elementAt(0);
            int xLoc = 0;
            int yLoc = 0;
            
            try
            {
                xLoc = Integer.parseInt((String)params.elementAt(1));
            } catch (NumberFormatException exc)
            {
                exc.printStackTrace();
            }
            try
            {
                yLoc = Integer.parseInt((String)params.elementAt(2));
            } catch (NumberFormatException exc)
            {
                exc.printStackTrace();
            }
                
            //Distribute appropriately
            
            if (source.equals(mapPane))
            {
                zebraPane.playSound();
                transition(mapPane, zebraPane, new Point(xLoc, yLoc));
            }
            else if (source instanceof AnimalPane)
            {
                if (area.equals("map"))
                {
                    transition((AnimalPane)source, mapPane, null );
                }
            }
        }
    }
 
    protected ActionListener actionListener;
    protected QTCanvas myQTCanvas;
    protected MapPane mapPane;
    protected AnimalPane zebraPane;
}