home *** CD-ROM | disk | FTP | other *** search
/ Late Night VRML 2.0 with Java CD-ROM / code.zip / Ch12 / ui / EditWindow.java < prev    next >
Text File  |  1997-01-04  |  13KB  |  478 lines

  1. // VRML Generator
  2. // (c) Justin Couch
  3. //
  4. // From Chapter 13: Late Night VRML 2.0 and Java
  5. //
  6. // The container window that holds the editing window
  7.  
  8. package ui;
  9.  
  10. import java.awt.*;
  11. import java.net.*;
  12. import vrml.external.Browser;
  13. import VrmlScene;
  14. import VrmlTypes;
  15. import ui.ImageButton;
  16. import ui.VrmlTree;
  17. import ui.dialogs.*;
  18.  
  19. public class EditWindow extends Frame
  20. {
  21.     private MenuBar menu_bar;
  22.     private Menu file_menu;
  23.     private Menu edit_menu;
  24.     private Menu node_menu;
  25.     private Menu group_menu;
  26.     private Menu geom_menu;
  27.     private Menu appear_menu;
  28.     private Menu interp_menu;
  29.     private Menu sensor_menu;
  30.     private Menu misc_menu;
  31.  
  32.     private NotImpDialog        warn;
  33.     private NoSelectionDialog    select_warn;
  34.     private GeneralWarnDialog    select_delete_warn;
  35.     private String                 CodeBase;
  36.     private VrmlTree            screen_data;
  37.     private VrmlScene            vrml_data;
  38.     private VrmlCheck            vrml_checker;
  39.  
  40.     // the constructor - create the basic frame window
  41.     public EditWindow (String code_base)
  42.     {
  43.         super("VRML Generator");
  44.  
  45.         CodeBase = code_base;
  46.  
  47.         // general housekeeping
  48.         resize(400, 600);
  49.         setBackground(Color.lightGray);
  50.         setLayout( new BorderLayout());
  51.  
  52.         // create the menu
  53.         createMenu();
  54.  
  55.         // create the side panel
  56.         add("East", createPanel());
  57.  
  58.         // create the tree list
  59.         screen_data = new VrmlTree("Unknown.wrl", code_base);
  60.         add("Center", screen_data.display);
  61.  
  62.         // create the one size fits all warning dialog
  63.         warn = new NotImpDialog(this);
  64.         select_warn = new NoSelectionDialog(this);
  65.         select_delete_warn = new GeneralWarnDialog(this, "Warning: No node selected to delete");
  66.     }
  67.  
  68.     // force remove all references to the internal datastructures.
  69.     public void finalize()
  70.     {
  71.         menu_bar = null;
  72.         file_menu = null;
  73.         edit_menu = null;
  74.         node_menu = null;
  75.         group_menu = null;
  76.         geom_menu = null;
  77.         appear_menu = null;
  78.         interp_menu = null;
  79.         sensor_menu = null;
  80.         misc_menu = null;
  81.         warn = null;
  82.         CodeBase = null;
  83.         screen_data = null;
  84.         vrml_data = null;
  85.         vrml_checker = null;
  86.     }
  87.  
  88.     // another version of the show method. Also sets the internal
  89.     // variables.
  90.     public void show(VrmlScene data, Browser b)
  91.     {
  92.         vrml_data = data;
  93.  
  94.         // notify the scene handler of the tree to complete its setup
  95.         vrml_data.setScreenHandler(screen_data);
  96.  
  97.         this.show();
  98.  
  99.         vrml_checker = new VrmlCheck(b, this, screen_data, vrml_data);
  100.     }
  101.  
  102.     private URL getURL(String relativepath)
  103.     {
  104.         try {
  105.             return new URL(CodeBase + relativepath);
  106.         }
  107.         catch (MalformedURLException e)
  108.         {
  109.             System.out.println("Editwindow Bad URL " + relativepath);
  110.             return null;
  111.         }
  112.         catch (NullPointerException e)
  113.         {
  114.             System.out.println("EditWindow Null URL : " + relativepath);
  115.             return null;
  116.         }
  117.     }
  118.  
  119.     private void createMenu()
  120.     {
  121.         menu_bar = new MenuBar();
  122.  
  123.         file_menu = new Menu("&File", false);
  124.         edit_menu = new Menu("&Edit", false);
  125.         node_menu = new Menu("&Node", true); // is a tear-off
  126.  
  127.         file_menu.add(new MenuItem("&New"));
  128.         file_menu.add(new MenuItem("&Save"));
  129.         file_menu.add(new MenuItem("Save &As"));
  130.         file_menu.addSeparator();
  131.         file_menu.add(new MenuItem("&Close"));
  132.  
  133.         edit_menu.add(new MenuItem("Cu&t"));
  134.         edit_menu.add(new MenuItem("&Copy"));
  135.         edit_menu.add(new MenuItem("Paste &Before"));
  136.         edit_menu.add(new MenuItem("&Paste After"));
  137.         edit_menu.add(new MenuItem("&Delete"));
  138.  
  139.         // Create the Nodes menu. Each contains a submenu
  140.         group_menu = new Menu("&Grouping");
  141.         geom_menu = new Menu("Geometr&y");
  142.         appear_menu = new Menu("&Appearance");
  143.         interp_menu = new Menu("&Interpolators");
  144.         sensor_menu = new Menu("&Sensors");
  145.         misc_menu = new Menu("&Miscellaneous");
  146.  
  147.         // create the submenus
  148.         group_menu.add(new MenuItem("&Anchor"));
  149.         group_menu.add(new MenuItem("&Billboard"));
  150.         group_menu.add(new MenuItem("&Collision"));
  151.         group_menu.add(new MenuItem("&Group"));
  152.         group_menu.add(new MenuItem("&Inline"));
  153.         group_menu.add(new MenuItem("&LOD"));
  154.         group_menu.add(new MenuItem("&Switch"));
  155.         group_menu.add(new MenuItem("&Transform"));
  156.  
  157.         geom_menu.add(new MenuItem("&Shape"));
  158.         geom_menu.addSeparator();
  159.         geom_menu.add(new MenuItem("&Box"));
  160.         geom_menu.add(new MenuItem("&Cone"));
  161.         geom_menu.add(new MenuItem("Cylinde&r"));
  162.         geom_menu.add(new MenuItem("&ElevationGrid"));
  163.         geom_menu.add(new MenuItem("E&xtrusion"));
  164.         geom_menu.add(new MenuItem("Indexed&FaceSet"));
  165.         geom_menu.add(new MenuItem("Indexed&LineSet"));
  166.         geom_menu.add(new MenuItem("&PointSet"));
  167.         geom_menu.add(new MenuItem("Sp&here"));
  168.         geom_menu.add(new MenuItem("&Text"));
  169.  
  170.         appear_menu.add(new MenuItem("&Appearance"));
  171.         appear_menu.add(new MenuItem("&FontStyle"));
  172.         appear_menu.add(new MenuItem("&ImageTexture"));
  173.         appear_menu.add(new MenuItem("&Material"));
  174.         appear_menu.add(new MenuItem("Mo&vieTexture"));
  175.         appear_menu.add(new MenuItem("&PixelTexture"));
  176.         appear_menu.add(new MenuItem("&TextureTransform"));
  177.  
  178.         interp_menu.add(new MenuItem("&ColorInterpolator"));
  179.         interp_menu.add(new MenuItem("Coor&dinateInterpolator"));
  180.         interp_menu.add(new MenuItem("&NormalInterpolator"));
  181.         interp_menu.add(new MenuItem("&OrientationInterpolator"));
  182.         interp_menu.add(new MenuItem("&PositionInterpolator"));
  183.         interp_menu.add(new MenuItem("&ScalarInterpolator"));
  184.  
  185.         sensor_menu.add(new MenuItem("&CylinderSensor"));
  186.         sensor_menu.add(new MenuItem("&PlaneSensor"));
  187.         sensor_menu.add(new MenuItem("Pro&ximitySensor"));
  188.         sensor_menu.add(new MenuItem("&SphereSensor"));
  189.         sensor_menu.add(new MenuItem("&TimeSensor"));
  190.         sensor_menu.add(new MenuItem("T&ouchSensor"));
  191.         sensor_menu.add(new MenuItem("&VisibilitySensor"));
  192.  
  193.         misc_menu.add(new MenuItem("&AudioClip"));
  194.         misc_menu.add(new MenuItem("&Background"));
  195.         misc_menu.add(new MenuItem("&Fog"));
  196.         misc_menu.add(new MenuItem("&NavigationInfo"));
  197.         misc_menu.add(new MenuItem("&Script"));
  198.         misc_menu.add(new MenuItem("S&ound"));
  199.         misc_menu.add(new MenuItem("&ViewPoint"));
  200.         misc_menu.add(new MenuItem("&WorldInfo"));
  201.  
  202.         node_menu.add(group_menu);
  203.         node_menu.add(geom_menu);
  204.         node_menu.add(appear_menu);
  205.         node_menu.add(interp_menu);
  206.         node_menu.add(sensor_menu);
  207.         node_menu.add(misc_menu);
  208.  
  209.         // now add it to the window
  210.         menu_bar.add(file_menu);
  211.         menu_bar.add(edit_menu);
  212.         menu_bar.add(node_menu);
  213.         setMenuBar(menu_bar);
  214.     }
  215.  
  216.     private Panel createPanel()
  217.     {
  218.         // create the basic panel
  219.         Panel p = new Panel();
  220.         p.setLayout(new GridLayout(14, 0));
  221.         p.add(new Button("Shape"));
  222. //        p.add(new ImageButton("Box", getURL("images/box.gif"), 0, 0));
  223. //        p.add(new ImageButton("Sphere", getURL("images/sphere.gif"), 0, 0));
  224. //        p.add(new ImageButton("Cone", getURL("images/cone.gif"), 0, 0));
  225. //        p.add(new ImageButton("Cylinder", getURL("images/cylinder.gif"), 0, 0));
  226.         p.add(new Button("Box"));
  227.         p.add(new Button("Cone"));
  228.         p.add(new Button("Cylinder"));
  229.         p.add(new Button("Sphere"));
  230.         p.add(new Button("Transform"));
  231.         p.add(new Button("Group"));
  232.         p.add(new Button("Appearance"));
  233.         p.add(new Button("Material"));
  234.         p.add(new Button("ImageTexture"));
  235.         p.add(new Button("MovieTexture"));
  236.         p.add(new Button("PixelTexture"));
  237.         p.add(new Button("TextureTranform"));
  238.  
  239.         return(p);
  240.     }
  241.  
  242.     private void processEditMenu(Event e, Object arg)
  243.     {
  244.         if("Cu&t".equals(arg))
  245.             warn.show();
  246.         else if("&Copy".equals(arg))
  247.             warn.show();
  248.         else if("Paste &Before".equals(arg))
  249.             warn.show();
  250.         else if("&Paste After".equals(arg))
  251.             warn.show();
  252.         else if("&Delete".equals(arg))
  253.         {
  254.             deleteNode();
  255.         }
  256.     }
  257.  
  258.     private void processNodeMenu(Event e, Object arg, Menu parent_menu)
  259.     {
  260.         // error checking
  261.         if(screen_data.selected == null)
  262.         {
  263.             select_warn.show();
  264.             return;
  265.         }
  266.  
  267.         if(parent_menu == group_menu)
  268.         {
  269.             if("&Anchor".equals(arg))
  270.                 warn.show();
  271.             else if("&Billboard".equals(arg))
  272.                 warn.show();
  273.             else if("&Collision".equals(arg))
  274.                 warn.show();
  275.             else if("&Group".equals(arg))
  276.                 vrml_checker.checkNode(VrmlTypes.Group);
  277.             else if("&Inline".equals(arg))
  278.                 warn.show();
  279.             else if("&LOD".equals(arg))
  280.                 warn.show();
  281.             else if("&Switch".equals(arg))
  282.                 warn.show();
  283.             else if("&Transform".equals(arg))
  284.                 vrml_checker.checkNode(VrmlTypes.Transform);
  285.         }
  286.         else if(parent_menu == geom_menu)
  287.         {
  288.             if("&Shape".equals(arg))
  289.                 vrml_checker.checkNode(VrmlTypes.Shape);
  290.             else if("&Box".equals(arg))
  291.                 vrml_checker.checkNode(VrmlTypes.Box);
  292.             else if("&Cone".equals(arg))
  293.                 vrml_checker.checkNode(VrmlTypes.Cone);
  294.             else if("Cylinde&r".equals(arg))
  295.                 vrml_checker.checkNode(VrmlTypes.Cylinder);
  296.             else if("&ElevationGrid".equals(arg))
  297.                 warn.show();
  298.             else if("E&xtrusion".equals(arg))
  299.                 warn.show();
  300.             else if("Indexed&FaceSet".equals(arg))
  301.                 warn.show();
  302.             else if("Indexed&LineSet".equals(arg))
  303.                 warn.show();
  304.             else if("&PointSet".equals(arg))
  305.                 warn.show();
  306.             else if("Sp&here".equals(arg))
  307.                 vrml_checker.checkNode(VrmlTypes.Sphere);
  308.             else if("&Text".equals(arg))
  309.                 warn.show();
  310.         }
  311.         else if(parent_menu == appear_menu)
  312.         {
  313.             if("&Appearance".equals(arg))
  314.                 vrml_checker.checkNode(VrmlTypes.Appearance);
  315.             else if("&FontStyle".equals(arg))
  316.                 warn.show();
  317.             else if("&ImageTexture".equals(arg))
  318.                 vrml_checker.checkNode(VrmlTypes.ImageTexture);
  319.             else if("&Material".equals(arg))
  320.                 vrml_checker.checkNode(VrmlTypes.Material);
  321.             else if("Mo&vieTexture".equals(arg))
  322.                 vrml_checker.checkNode(VrmlTypes.MovieTexture);
  323.             else if("&PixelTexture".equals(arg))
  324.                 warn.show();
  325.             else if("&TextureTransform".equals(arg))
  326.                 vrml_checker.checkNode(VrmlTypes.TextureTransform);
  327.         }
  328.         else if(parent_menu == interp_menu)
  329.         {
  330.             if("&ColorInterpolator".equals(arg))
  331.                 warn.show();
  332.             else if("Coor&dinateInterpolator".equals(arg))
  333.                 warn.show();
  334.             else if("&NormalInterpolator".equals(arg))
  335.                 warn.show();
  336.             else if("&OrientationInterpolator".equals(arg))
  337.                 warn.show();
  338.             else if("&PositionInterpolator".equals(arg))
  339.                 warn.show();
  340.             else if("&ScalarInterpolator".equals(arg))
  341.                 warn.show();
  342.         }
  343.         else if(parent_menu == sensor_menu)
  344.         {
  345.             if("&CylinerSensor".equals(arg))
  346.                 warn.show();
  347.             else if("&PlaneSensor".equals(arg))
  348.                 warn.show();
  349.             else if("Pro&ximitySensor".equals(arg))
  350.                 warn.show();
  351.             else if("&SphereSensor".equals(arg))
  352.                 warn.show();
  353.             else if("&TimeSensor".equals(arg))
  354.                 warn.show();
  355.             else if("T&ouchSensor".equals(arg))
  356.                 warn.show();
  357.             else if("&VisibilitySensor".equals(arg))
  358.                 warn.show();
  359.         }
  360.         else if(parent_menu == misc_menu)
  361.         {
  362.             if("&AudioClip".equals(arg))
  363.                 warn.show();
  364.             else if("&Background".equals(arg))
  365.                 warn.show();
  366.             else if("&Fog".equals(arg))
  367.                 warn.show();
  368.             else if("&NavigationInfo".equals(arg))
  369.                 warn.show();
  370.             else if("&Script".equals(arg))
  371.                 warn.show();
  372.             else if("S&ound".equals(arg))
  373.                 warn.show();
  374.             else if("&Viewpoint".equals(arg))
  375.                 warn.show();
  376.             else if("&WorldInfo".equals(arg))
  377.                 warn.show();
  378.         }
  379.     }
  380.  
  381.     private void processMenu(Event e, Object arg)
  382.     {
  383.         Menu parent = (Menu)((MenuItem)e.target).getParent();
  384.  
  385.         if(parent == file_menu)
  386.         {
  387.             if("&New".equals(arg))
  388.             {
  389.                 screen_data.deleteAll();
  390.                 vrml_data.deleteAll();
  391.             }
  392.             else if("&Save".equals(arg))
  393.                 warn.show();
  394.             else if("Save &As".equals(arg))
  395.                 warn.show();
  396.             else if("&Close".equals(arg))
  397.                 this.hide();
  398.         }
  399.         else if(parent == edit_menu)
  400.             processEditMenu(e, arg);
  401.         else
  402.             processNodeMenu(e, arg, parent);
  403.  
  404.     }
  405.  
  406.     // the button bar on the side of the screen
  407.     private void processButton(Event e, Object arg)
  408.     {
  409.         // bit of error checking first.
  410.         if(screen_data.selected == null)
  411.         {
  412.             select_warn.show();
  413.             return;
  414.         }
  415.  
  416.         if("Shape".equals(arg))
  417.                 vrml_checker.checkNode(VrmlTypes.Shape);
  418.         else if("Box".equals(arg))
  419.                 vrml_checker.checkNode(VrmlTypes.Box);
  420.         else if("Cone".equals(arg))
  421.                 vrml_checker.checkNode(VrmlTypes.Cone);
  422.         else if("Cylinder".equals(arg))
  423.                 vrml_checker.checkNode(VrmlTypes.Cylinder);
  424.         else if("Sphere".equals(arg))
  425.                 vrml_checker.checkNode(VrmlTypes.Sphere);
  426.         else if("Transform".equals(arg))
  427.                 vrml_checker.checkNode(VrmlTypes.Transform);
  428.         else if("Group".equals(arg))
  429.                 vrml_checker.checkNode(VrmlTypes.Group);
  430.         else if("Appearance".equals(arg))
  431.                 vrml_checker.checkNode(VrmlTypes.Appearance);
  432.         else if("Material".equals(arg))
  433.                 vrml_checker.checkNode(VrmlTypes.Material);
  434.         else if("ImageTexture".equals(arg))
  435.                 vrml_checker.checkNode(VrmlTypes.ImageTexture);
  436.         else if("MovieTexture".equals(arg))
  437.                 vrml_checker.checkNode(VrmlTypes.MovieTexture);
  438.         else if("PixelTexture".equals(arg))
  439.                 warn.show();
  440.         else if("TextureTranform".equals(arg))
  441.                 vrml_checker.checkNode(VrmlTypes.TextureTransform);
  442.     }
  443.  
  444.     private void deleteNode()
  445.     {
  446.         if(screen_data.selected == null)
  447.         {
  448.             select_delete_warn.show();
  449.             return;
  450.         }
  451.  
  452.         vrml_checker.deleteNode();
  453.     }
  454.  
  455.     // a few event handling routines
  456.     public boolean action(Event e, Object arg)
  457.     {
  458.         if(e.target instanceof MenuItem)
  459.             processMenu(e, arg);
  460.         else if(e.target instanceof Button)
  461.             processButton(e, arg);
  462.  
  463.         return true;
  464.     }
  465.  
  466.     public boolean handleEvent(Event e)
  467.     {
  468.         if(e.id == Event.WINDOW_DESTROY)
  469.         {
  470.             // exit the program
  471.             System.exit(0);
  472.             return true;
  473.         }
  474.  
  475.         return super.handleEvent(e);
  476.     }
  477. }
  478.