/*
 *      @(#)HelloUniverse.java 1.48 99/05/20 14:07:00
 *
 * Copyright (c) 1996-1998 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.swing.*;

public class HelloUniverse extends JFrame {
    public BranchGroup createSceneGraph() {
        // Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup();

        // Create the transform group node and initialize it to the
        // identity.  Enable the TRANSFORM_WRITE capability so that
        // our behavior code can modify it at runtime.  Add it to the
        // root of the subgraph.
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRoot.addChild(objTrans);

        // Create a simple shape leaf node, add it to the scene graph.
        objTrans.addChild(new ColorCube(0.4));

        objRoot.compile();

        return objRoot;
    }

    PopupMenu popup;
    Canvas3D c;
    
    JMenuItem createMenuItem(String textStr) {
        JMenuItem mitem = new JMenuItem();
        mitem.setText(textStr);
        return mitem;
    }
    
    void createMenuBar() {
        JMenuBar menubar = new JMenuBar();
        JMenu    menu    = new JMenu();
        menu.setText("J Family");
        menu.getPopupMenu().setLightWeightPopupEnabled(false);
        menu.add(createMenuItem("Joe"));
        menu.add(createMenuItem("John"));
        menu.add(createMenuItem("Jennifer"));
        menu.add(createMenuItem("Josh"));
        menubar.add(menu);
        
        menu    = new JMenu();
        menu.setText("M Family");
        menu.getPopupMenu().setLightWeightPopupEnabled(false);
        menu.add(createMenuItem("Mike"));
        menu.add(createMenuItem("Mary"));
        menu.add(createMenuItem("Monika"));
        menu.add(createMenuItem("Mitch"));       
        menubar.add(menu);
        
        setJMenuBar(menubar);
    }

    public HelloUniverse() {
        // add menubar
        createMenuBar();
        GraphicsConfiguration config =
           SimpleUniverse.getPreferredConfiguration();
        
        // create a popup
        popup = new PopupMenu();
        CheckboxMenuItem item = new CheckboxMenuItem("Hi", false);
        popup.add(item);

        c = new Canvas3D(config);
        //
        // works fine if popup is Applet's child
        //
        add(popup);
        // c.add(popup);
        c.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if ((e.getModifiers()  & InputEvent.BUTTON3_MASK) != 0) {
                    System.out.println("Button 3 pressed.");
                    popup.show(c, e.getX(), e.getY());
                }
            }
          });
          
        // create a split pane
        // Canvas3D --> JPanel
        JPanel pane = new JPanel();
        pane.setLayout(new BorderLayout());
        pane.add(c);
        
        // JScrollPane (L)
        JScrollPane leftPane  = new JScrollPane();
        JPanel pane0 = new JPanel();
        JLabel dummy = new JLabel("Dummy");
        leftPane.getViewport().add(dummy);
        
        // JPanel --> JScrollPane (R)
        JScrollPane rightPane = new JScrollPane();
        rightPane.getViewport().setView(pane);
        
        // JScrollPane (R0)
        JScrollPane rightPane0 = new JScrollPane();
        JLabel empty = new JLabel("Empty");
        rightPane0.getViewport().add(empty);
        
        // JScrollPane (R0) --> JTabbedPane
        // JScrollPane (R)  --> JTabbedPane
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add(rightPane0, "Empty", 0);
        tabbedPane.add(rightPane, "Canvas 3D", 1);
        
        tabbedPane.setSelectedIndex(0);
        
        leftPane.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if ((e.getModifiers()  & InputEvent.BUTTON3_MASK) != 0) {
                    System.out.println("button 3 pressed");
                    getJPopupMenu().show(e.getComponent(), e.getX(), e.getY());
                }
            }
          });
        // JScrollPane (L) --> JSplitPane
        // JTabbedPane (R) --> JSplitPane
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane, tabbedPane);
        
        // JSplitPane --> JFrame
        getContentPane().add("Center", splitPane);

        // Create a simple scene and attach it to the virtual universe
        BranchGroup scene = createSceneGraph();
        SimpleUniverse u = new SimpleUniverse(c);

        // This will move the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        u.getViewingPlatform().setNominalViewingTransform();

        u.addBranchGraph(scene);
        
        setSize(400, 300);
        
        show();
    }
    
    JPopupMenu jpopup;
    
    JPopupMenu getJPopupMenu() {
        if (jpopup == null) {
            jpopup = new JPopupMenu();
            jpopup.setLightWeightPopupEnabled(false);
            jpopup.setLabel("JPopupMenu");
            JMenuItem item = new JMenuItem("Hi there");
            jpopup.add(item);
        }
        return jpopup;
    }


    //
    // The following allows HelloUniverse to be run as an application
    // as well as an applet
    //
    public static void main(String[] args) {
        new HelloUniverse();
    }
}
