home *** CD-ROM | disk | FTP | other *** search
/ The Net: Ultimate Internet Guide / WWLCD1.ISO / pc / java / ed8n1t2i / digsimframe.java < prev    next >
Encoding:
Java Source  |  1996-08-14  |  30.3 KB  |  721 lines

  1. //****************************************************************************
  2. // ---- version information ----
  3. //
  4. // DigSimFrame.java      v 1.00 b1
  5. // Written by:           I. van Rienen / E-mail ivr@bart.nl
  6. // URL:                  http://www/bart.nl/~ivr
  7. // Initial release:
  8. // Released in public domain:
  9. //
  10. // ---- Description ----
  11. // Java class containing methods for the Main simulator frame,
  12. // which contains three panels:
  13. //
  14. // - The imagebuttons.
  15. // - The schematic panel.
  16. // - The status panel.
  17. //
  18. // This program and the Java source is in the public domain.
  19. // Permission to use, copy, modify, and distribute this software
  20. // and its documentation for NON-COMMERCIAL purposes and
  21. // without fee is hereby granted.
  22. //
  23. //    Copyright 1996
  24. //
  25. //    Iwan van Rienen
  26. //    Joan Maetsuyckerstr. 145
  27. //    2593 ZG  The Hague
  28. //    The Netherlands
  29. //
  30. // I am not responsible for any bugs in this program and
  31. // possible damage to hard- or software when using this program.
  32. //****************************************************************************
  33. import java.awt.*;
  34. import java.util.Vector;
  35. import java.lang.Integer;
  36. import java.io.File;
  37. import java.io.FileInputStream;
  38. import java.io.FileOutputStream;
  39. import java.io.RandomAccessFile;
  40. import java.net.URL;
  41. import java.io.InputStream;
  42.  
  43. class DigSimFrame extends Frame {
  44.     Vector AvailableComponents;
  45.     DigSim applet;
  46.     Menu FileMenu;
  47.     Menu EditMenu;
  48.     Menu PassiveMenu;
  49.     Menu PortMenu;
  50.     Menu BiStableMenu;
  51.     Menu DisplayMenu;
  52.     Menu SpecialMenu;
  53.     Menu SimulateMenu;
  54.     Menu HelpMenu;
  55.     MenuBar MyMenuBar;
  56.     MenuItem CutMenuItem;
  57.     MenuItem CopyMenuItem;
  58.     MenuItem PasteMenuItem;
  59.     MenuItem CopyDiskMenuItem;
  60.     MenuItem PasteDiskMenuItem;
  61.     MenuItem StartMenuItem;
  62.     MenuItem StopMenuItem;
  63.     SimpleDialog ExitDialog = null;
  64.     SimpleDialog NewDialog = null;
  65.     SimpleDialog OpenDialog = null;
  66.     SimpleDialog OpenExampleDialog = null;
  67.     TextDialog MyTextDialog = null;
  68.     TextDialog MyTextChangeDialog = null;
  69.     TextDialog MyTextProbeChangeDialog = null;
  70.     Vector MenuItemsToDisable;
  71.  
  72.     static final int EXITDIALOG_ID = 1;
  73.     static final int NEWDIALOG_ID = 2;
  74.     static final int OPENDIALOG_ID = 3;
  75.     static final int NEWTEXTDIALOG_ID = 5;
  76.     static final int CHANGETEXTDIALOG_ID = 6;
  77.     static final int OPENEXAMPLE_ID = 7;
  78.     static final int CHANGETEXTPROBEDIALOG_ID = 8;
  79.  
  80.     String SaveFileDirectory = null;
  81.     String SaveFileName = null;
  82.  
  83.     String ExampleFileName = null;
  84.  
  85. //----------------------------------------------------------------------------
  86. // Set up the Simulator Frame with three Panels.
  87. //----------------------------------------------------------------------------
  88.     public DigSimFrame( DigSim app) {
  89.         super("Digital Simulator");
  90.         MenuItemsToDisable = new Vector();
  91.         applet = app;
  92.         setLayout(new BorderLayout());
  93.         add("North", applet.MyControlPanel = new ControlPanel(app));
  94.         add("Center", applet.MySchematicPanel = new SchematicPanel(app));
  95.         add("South", applet.MyStatusPanel = new StatusPanel(app));
  96.         RegisterComponentNames();
  97.         setMenuBar(DigSimMenuBar());
  98.         DisableAllMenus();
  99.         resize(500, 400);
  100.         show();
  101.         resize(500, 400);
  102.     }
  103.  
  104. //----------------------------------------------------------------------------
  105. // Disable all menus in the MenuItemsToDisable vector
  106. // when simulation is in progress
  107. //----------------------------------------------------------------------------
  108.     public void DisableAllMenus() {
  109.         MenuItem TempMenuItem;
  110.  
  111.         for (int ix = 0; ix < MenuItemsToDisable.size(); ix++) {
  112.             TempMenuItem = (MenuItem)MenuItemsToDisable.elementAt(ix);
  113.             TempMenuItem.disable();
  114.         }
  115.     }
  116.  
  117. //----------------------------------------------------------------------------
  118. // Enable all menus in the MenuItemsToDisable vector after simulating.
  119. //----------------------------------------------------------------------------
  120.     public void EnableAllMenus() {
  121.          MenuItem TempMenuItem;
  122.  
  123.         for (int ix = 0; ix < MenuItemsToDisable.size(); ix++) {
  124.             TempMenuItem = (MenuItem)MenuItemsToDisable.elementAt(ix);
  125.             TempMenuItem.enable();
  126.         }
  127.  
  128.         CutMenuItem.disable(); // After simulate no components are selected
  129.         CopyMenuItem.disable();
  130.         applet.MyControlPanel.DisableButton ("Cut");
  131.         applet.MyControlPanel.DisableButton ("Copy");
  132.  
  133.         if (applet.MySchematicPanel.CopySchematic != null && applet.MySchematicPanel.CopySchematic.size() > 0) { // Components in copy buffer?
  134.             PasteMenuItem.enable();
  135.             applet.MyControlPanel.EnableButton ("Paste");
  136.         } else {
  137.             PasteMenuItem.disable();
  138.             applet.MyControlPanel.DisableButton ("Paste");
  139.         }
  140.     }
  141.  
  142. //----------------------------------------------------------------------------
  143. // Register all component names. It's used to lookup a component name
  144. // when the user wants to add a component.
  145. //----------------------------------------------------------------------------
  146.     public void RegisterComponentNames() {
  147.         AvailableComponents = new Vector();
  148.         AvailableComponents.addElement("Wire");
  149.         AvailableComponents.addElement("Junction");
  150.         AvailableComponents.addElement("Vcc");
  151.         AvailableComponents.addElement("GND");
  152.         AvailableComponents.addElement("Switch");
  153.         AvailableComponents.addElement("Push button");
  154.  
  155.         AvailableComponents.addElement("Buffer");
  156.         AvailableComponents.addElement("Inverter");
  157.         AvailableComponents.addElement("2-input AND port");
  158.         AvailableComponents.addElement("3-input AND port");
  159.         AvailableComponents.addElement("2-input OR port");
  160.         AvailableComponents.addElement("3-input OR port");
  161.         AvailableComponents.addElement("2-input XOR port");
  162.  
  163.         AvailableComponents.addElement("2-input NAND port");
  164.         AvailableComponents.addElement("3-input NAND port");
  165.         AvailableComponents.addElement("2-input NOR port");
  166.         AvailableComponents.addElement("3-input NOR port");
  167.         AvailableComponents.addElement("2-input XNOR port");
  168.  
  169.         AvailableComponents.addElement("SR-latch");
  170.         AvailableComponents.addElement("Gated SR-latch");
  171.         AvailableComponents.addElement("D-latch");
  172.  
  173.         AvailableComponents.addElement("D-flipflop");
  174.         AvailableComponents.addElement("T-flipflop");
  175.         AvailableComponents.addElement("JK-flipflop");
  176.         AvailableComponents.addElement("Edge-triggered T-flipflop");
  177.         AvailableComponents.addElement("Octal D-flipflop");
  178.         AvailableComponents.addElement("Octal latch");
  179.  
  180.         AvailableComponents.addElement("Red LED");
  181.         AvailableComponents.addElement("Green LED");
  182.         AvailableComponents.addElement("Yellow LED");
  183.         AvailableComponents.addElement("Bi-color LED");
  184.         AvailableComponents.addElement("7-segment display");
  185.  
  186.         AvailableComponents.addElement("Oscilator");
  187.         AvailableComponents.addElement("Analyzer probe");
  188.         AvailableComponents.addElement("BCD to 7-segment decoder");
  189.         AvailableComponents.addElement("3- to 8-line decoder");
  190.         AvailableComponents.addElement("4-bit binary counter");
  191.         AvailableComponents.addElement("8-bit serial in shift register");
  192.         AvailableComponents.addElement("8-bit parallel in shift register");
  193.     }
  194.  
  195. //----------------------------------------------------------------------------
  196. // Set up all menus.
  197. //----------------------------------------------------------------------------
  198.     public MenuBar DigSimMenuBar() {
  199.         MenuItem mi;
  200.         MyMenuBar = new MenuBar();
  201.         FileMenu = new Menu("File",false);
  202.         MenuItemsToDisable.addElement (mi = new MenuItem ("New") );
  203.         FileMenu.add(mi);
  204.         FileMenu.addSeparator();
  205.         MenuItemsToDisable.addElement (mi = new MenuItem ("Open example") );
  206.         FileMenu.add(mi);
  207.         if (applet.EnableFileOperations) {
  208.             MenuItemsToDisable.addElement (mi = new MenuItem ("Open file") );
  209.             FileMenu.add(mi);
  210.             MenuItemsToDisable.addElement (mi = new MenuItem ("Save") );
  211.             FileMenu.add(mi);
  212.             MenuItemsToDisable.addElement (mi = new MenuItem ("Save as") );
  213.             FileMenu.add(mi);
  214.         } else {
  215.             FileMenu.add(mi = new MenuItem ("Open"));
  216.             mi.disable();
  217.             FileMenu.add(mi = new MenuItem ("Save"));
  218.             mi.disable();
  219.             FileMenu.add(mi = new MenuItem ("Save as"));
  220.             mi.disable();
  221.         }
  222.         FileMenu.addSeparator();
  223.         FileMenu.add(new MenuItem("Close"));
  224.         FileMenu.add(new MenuItem("Exit"));
  225.         MyMenuBar.add(FileMenu);
  226.  
  227.         EditMenu = new Menu("Edit",false);
  228.         MenuItemsToDisable.addElement (CutMenuItem = new MenuItem ("Cut") );
  229.         EditMenu.add(CutMenuItem);
  230.         MenuItemsToDisable.addElement (CopyMenuItem = new MenuItem ("Copy") );
  231.         EditMenu.add(CopyMenuItem);
  232.         MenuItemsToDisable.addElement (PasteMenuItem = new MenuItem ("Paste") );
  233.         EditMenu.add(PasteMenuItem);
  234.         MenuItemsToDisable.addElement (mi = new MenuItem ("Select All") );
  235.         EditMenu.add(mi);
  236.         EditMenu.addSeparator();
  237.         if (applet.EnableFileOperations) {
  238.             MenuItemsToDisable.addElement (CopyDiskMenuItem = new MenuItem ("Copy to") );
  239.             EditMenu.add(CopyDiskMenuItem);
  240.             MenuItemsToDisable.addElement (PasteDiskMenuItem = new MenuItem ("Paste from") );
  241.             EditMenu.add(PasteDiskMenuItem);
  242.         } else {
  243.             EditMenu.add (CopyDiskMenuItem = new MenuItem ("Copy to") );
  244.             CopyDiskMenuItem.disable();
  245.             EditMenu.add (PasteDiskMenuItem = new MenuItem ("Paste from") );
  246.             PasteDiskMenuItem.disable();
  247.         }
  248.  
  249.         CutMenuItem.disable();
  250.         CopyMenuItem.disable();
  251.         PasteMenuItem.disable();
  252.         CopyDiskMenuItem.disable();
  253.         MyMenuBar.add(EditMenu);
  254.  
  255.         PassiveMenu = new Menu("Passive",false);
  256.         MenuItemsToDisable.addElement (mi = new MenuItem ("Wire") );
  257.         PassiveMenu.add(mi);
  258.         MenuItemsToDisable.addElement (mi = new MenuItem ("Junction") );
  259.         PassiveMenu.add(mi);
  260.         PassiveMenu.addSeparator();
  261.         MenuItemsToDisable.addElement (mi = new MenuItem ("Vcc") );
  262.         PassiveMenu.add(mi);
  263.         MenuItemsToDisable.addElement (mi = new MenuItem ("GND") );
  264.         PassiveMenu.add(mi);
  265.         PassiveMenu.addSeparator();
  266.         MenuItemsToDisable.addElement (mi = new MenuItem ("Switch") );
  267.         PassiveMenu.add(mi);
  268.         MenuItemsToDisable.addElement (mi = new MenuItem ("Push button") );
  269.         PassiveMenu.add(mi);
  270.         MyMenuBar.add(PassiveMenu);
  271.  
  272.         PortMenu = new Menu("Ports",false);
  273.         MenuItemsToDisable.addElement (mi = new MenuItem ("Buffer") );
  274.         PortMenu.add(mi);
  275.         MenuItemsToDisable.addElement (mi = new MenuItem ("Inverter") );
  276.         PortMenu.add(mi);
  277.         PortMenu.addSeparator();
  278.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input AND port") );
  279.         PortMenu.add(mi);
  280.         MenuItemsToDisable.addElement (mi = new MenuItem ("3-input AND port") );
  281.         PortMenu.add(mi);
  282.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input OR port") );
  283.         PortMenu.add(mi);
  284.         MenuItemsToDisable.addElement (mi = new MenuItem ("3-input OR port") );
  285.         PortMenu.add(mi);
  286.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input XOR port") );
  287.         PortMenu.add(mi);
  288.         PortMenu.addSeparator();
  289.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input NAND port") );
  290.         PortMenu.add(mi);
  291.         MenuItemsToDisable.addElement (mi = new MenuItem ("3-input NAND port") );
  292.         PortMenu.add(mi);
  293.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input NOR port") );
  294.         PortMenu.add(mi);
  295.         MenuItemsToDisable.addElement (mi = new MenuItem ("3-input NOR port") );
  296.         PortMenu.add(mi);
  297.         MenuItemsToDisable.addElement (mi = new MenuItem ("2-input XNOR port") );
  298.         PortMenu.add(mi);
  299.         MyMenuBar.add(PortMenu);
  300.  
  301.         BiStableMenu = new Menu("Bi-stable",false);
  302.         MenuItemsToDisable.addElement (mi = new MenuItem ("SR-latch") );
  303.         BiStableMenu.add(mi);
  304.         MenuItemsToDisable.addElement (mi = new MenuItem ("Gated SR-latch") );
  305.         BiStableMenu.add(mi);
  306.         MenuItemsToDisable.addElement (mi = new MenuItem ("D-latch") );
  307.         BiStableMenu.add(mi);
  308.         BiStableMenu.addSeparator();
  309.         MenuItemsToDisable.addElement (mi = new MenuItem ("D-flipflop") );
  310.         BiStableMenu.add(mi);
  311.         MenuItemsToDisable.addElement (mi = new MenuItem ("T-flipflop") );
  312.         BiStableMenu.add(mi);
  313.         MenuItemsToDisable.addElement (mi = new MenuItem ("JK-flipflop") );
  314.         BiStableMenu.add(mi);
  315.         MenuItemsToDisable.addElement (mi = new MenuItem ("Edge-triggered T-flipflop") );
  316.         BiStableMenu.add(mi);
  317.         MenuItemsToDisable.addElement (mi = new MenuItem ("Octal D-flipflop") );
  318.         BiStableMenu.add(mi);
  319.         MenuItemsToDisable.addElement (mi = new MenuItem ("Octal latch") );
  320.         BiStableMenu.add(mi);
  321.         MyMenuBar.add(BiStableMenu);
  322.  
  323.         DisplayMenu = new Menu("Display",false);
  324.         MenuItemsToDisable.addElement (mi = new MenuItem ("Red LED") );
  325.         DisplayMenu.add(mi);
  326.         MenuItemsToDisable.addElement (mi = new MenuItem ("Green LED") );
  327.         DisplayMenu.add(mi);
  328.         MenuItemsToDisable.addElement (mi = new MenuItem ("Yellow LED") );
  329.         DisplayMenu.add(mi);
  330.         MenuItemsToDisable.addElement (mi = new MenuItem ("Bi-color LED") );
  331.         DisplayMenu.add(mi);
  332.         MenuItemsToDisable.addElement (mi = new MenuItem ("7-segment display") );
  333.         DisplayMenu.add(mi);
  334.         MyMenuBar.add(DisplayMenu);
  335.  
  336.         SpecialMenu = new Menu("Special",false);
  337.         MenuItemsToDisable.addElement (mi = new MenuItem ("Oscilator") );
  338.         SpecialMenu.add(mi);
  339.         MenuItemsToDisable.addElement (mi = new MenuItem ("BCD to 7-segment decoder") );
  340.         SpecialMenu.add(mi);
  341.         MenuItemsToDisable.addElement (mi = new MenuItem ("3- to 8-line decoder") );
  342.         SpecialMenu.add(mi);
  343.         MenuItemsToDisable.addElement (mi = new MenuItem ("4-bit binary counter") );
  344.         SpecialMenu.add(mi);
  345.         MenuItemsToDisable.addElement (mi = new MenuItem ("8-bit serial in shift register") );
  346.         SpecialMenu.add(mi);
  347.         MenuItemsToDisable.addElement (mi = new MenuItem ("8-bit parallel in shift register") );
  348.         SpecialMenu.add(mi);
  349.  
  350.         MenuItemsToDisable.addElement (mi = new MenuItem ("Analyzer probe") );
  351.         SpecialMenu.add(mi);
  352.         SpecialMenu.addSeparator();
  353.         MenuItemsToDisable.addElement (mi = new MenuItem ("Text") );
  354.         SpecialMenu.add(mi);
  355.         MyMenuBar.add(SpecialMenu);
  356.  
  357.         SimulateMenu = new Menu("Simulate",false);
  358.         SimulateMenu.add(StartMenuItem = new MenuItem("Start"));
  359.         SimulateMenu.add(StopMenuItem = new MenuItem("Stop"));
  360.         StopMenuItem.disable();
  361.         SimulateMenu.addSeparator();
  362.         SimulateMenu.add(new MenuItem("Show analyzer"));
  363.         SimulateMenu.addSeparator();
  364.         MenuItemsToDisable.addElement (mi = new MenuItem ("Options") );
  365.         SimulateMenu.add(mi);
  366.         MyMenuBar.add(SimulateMenu);
  367.  
  368.         HelpMenu = new Menu("Help",false);
  369.         HelpMenu.add(new MenuItem("Help"));
  370.         HelpMenu.add(new MenuItem("About DigSim"));
  371.         HelpMenu.add(new MenuItem("Frequently asked questions"));
  372.         MyMenuBar.add(HelpMenu);
  373.         MyMenuBar.setHelpMenu(HelpMenu);
  374.  
  375.         return(MyMenuBar);
  376.     }
  377.  
  378. //----------------------------------------------------------------------------
  379. // Check if 'label' is a component name
  380. //----------------------------------------------------------------------------
  381.     public boolean IsComponentName(String label) {
  382.         for (int ix = 0; ix < AvailableComponents.size(); ix++) {
  383.             if (AvailableComponents.elementAt(ix).equals(label)) return true;
  384.         }
  385.         return false;
  386.     }
  387.  
  388. //----------------------------------------------------------------------------
  389. // Handle events
  390. //----------------------------------------------------------------------------
  391.     public boolean handleEvent(Event ev) {
  392.         if (ev.id == Event.WINDOW_DESTROY) {
  393.             //System.out.println("destroy window");
  394.             applet.destroyFrame();
  395.             return true;
  396.         }
  397.         return super.handleEvent(ev);
  398.     }
  399.  
  400. //----------------------------------------------------------------------------
  401. // Handle all events in the Simple Dialogs.
  402. //----------------------------------------------------------------------------
  403.     public boolean SimpleDialogHandler(String label) {
  404.         String strip = label.substring("SIMPLEDIALOG_".length());
  405.         String Command = strip.substring(0, strip.indexOf("_"));
  406.         int ID = Integer.parseInt(strip.substring (strip.indexOf("_") + 1, strip.length()));
  407.         Schematic OpenSchematic;
  408.  
  409.         switch (ID) {
  410.             case EXITDIALOG_ID:
  411.                 ExitDialog = null;
  412.                 if (Command.equals("OK")) {
  413.                     if (applet.SimulateRunning()) {
  414.                         applet.SimulateStop();
  415.                     }
  416.                     System.exit(1);
  417.                     return true;
  418.                 } else if (Command.equals("Cancel")) {
  419.                     return true;
  420.                 }
  421.                 break;
  422.  
  423.             case NEWDIALOG_ID:
  424.                 NewDialog = null;
  425.                 if (Command.equals("OK")) {
  426.                     applet.MySchematic.DestroyComponents(applet.PinGrid); // Destroy schematic and remove components from grid.
  427.                     setTitle ("Digital Simulator [untitled]");
  428.                     applet.MySchematic.FileName = null;
  429.                     applet.MySchematic.Modified = false;
  430.                     applet.MySchematicPanel.repaint();
  431.                     return true;
  432.                 } else if (Command.equals("Cancel")) {
  433.                     return true;
  434.                 }
  435.                 break;
  436.  
  437.             case OPENDIALOG_ID:
  438.                 OpenDialog = null;
  439.                 if (Command.equals("OK")) {
  440.                     OpenSchematic = DoFileOpenDialog(applet.PinGrid, "Open schematic");
  441.                     if (OpenSchematic != null) {
  442.                         applet.MySchematic = OpenSchematic;
  443.                         setTitle("Digital Simulator [" + OpenSchematic.FileName + "]");
  444.                         applet.MySchematicPanel.repaint();
  445.                         return true;
  446.                     }
  447.                 } else if (Command.equals("Cancel")) {
  448.                     return true;
  449.                 }
  450.                 break;
  451.  
  452.             case OPENEXAMPLE_ID:
  453.                 OpenExampleDialog = null;
  454.                 if (Command.equals("OK")) {
  455.                     LoadExample(ExampleFileName);
  456.                     return true;
  457.                 } else if (Command.equals("Cancel")) {
  458.                     return true;
  459.                 }
  460.                 break;
  461.  
  462.         }
  463.         return false;
  464.     }
  465.  
  466. //----------------------------------------------------------------------------
  467. // Handle all events in the TextDialogs.
  468. //----------------------------------------------------------------------------
  469.     public boolean TextDialogHandler(String label) {
  470.         // System.out.println ("TextDialogHandler text [" + label + "]");
  471.         String strip = label.substring("TEXTDIALOG_".length());
  472.         // System.out.println ("strip = [" + strip + "]");
  473.         String Command = strip.substring(0, strip.indexOf("_"));
  474.         String Text = strip.substring (strip.indexOf("_") + 1, strip.lastIndexOf("_"));
  475.         int ID = Integer.parseInt(strip.substring (strip.lastIndexOf("_") + 1, strip.length()));
  476.         // System.out.println ("Command: " + Command + " ID = " + ID);
  477.  
  478.         switch (ID) {
  479.             case NEWTEXTDIALOG_ID:
  480.                 MyTextDialog = null;
  481.                 if (Command.equals("OK")) {
  482.                     if (Text.length() > 0) {
  483.                         applet.MySchematic.addComponent(new Caption(applet.MySchematicPanel.GridXOffset + 1, applet.MySchematicPanel.GridYOffset, Text));
  484.                         applet.MySchematicPanel.repaint();
  485.                     }
  486.                     return true;
  487.                 } else if (Command.equals("Cancel")) {
  488.                     return true;
  489.                 }
  490.                 break;
  491.  
  492.             case CHANGETEXTDIALOG_ID:
  493.                 MyTextChangeDialog = null;
  494.                 if (Command.equals("OK")) {
  495.                     return true;
  496.                 } else if (Command.equals("Cancel")) {
  497.                     applet.MySchematicPanel.repaint();
  498.                     return true;
  499.                 }
  500.                 break;
  501.  
  502.             case CHANGETEXTPROBEDIALOG_ID:
  503.                 MyTextProbeChangeDialog = null;
  504.                 applet.MySchematicPanel.repaint();
  505.                 applet.updateAnalyzer();
  506.                 return true;
  507.         }
  508.  
  509.         return false;
  510.     }
  511.  
  512. //----------------------------------------------------------------------------
  513. // Show a file-open dialog
  514. //----------------------------------------------------------------------------
  515.     public Schematic DoFileOpenDialog(Pin PinGrid[][], String capt) {
  516.         Schematic NewSchematic = null;
  517.         FileInputStream  is;
  518.  
  519.         FileDialog FileOpenDialog = new FileDialog (this, capt, FileDialog.LOAD);
  520.         FileOpenDialog.show();
  521.         String Directory = FileOpenDialog.getDirectory();
  522.         String FileName = FileOpenDialog.getFile();
  523.  
  524.         if (Directory != null && FileName != null) {
  525.             if (PinGrid != null) {
  526.                 applet.MySchematic.DestroyComponents(applet.PinGrid); // Destroy old schematic and remove components from grid.
  527.             }
  528.             try {
  529.                 is = new FileInputStream(Directory + FileName);
  530.                 NewSchematic = new Schematic (PinGrid, is);
  531.             } catch(Exception e) {
  532.                 String message = e.toString();
  533.                 String DlgButtons[] = { "OK" };
  534.                 SimpleDialog ExceptionDialog = new SimpleDialog(this, capt, message, DlgButtons, 1, 0, 0, SimpleDialog.IMAGE_STOP);
  535.                 applet.MySchematicPanel.repaint();
  536.                 return null;
  537.             }
  538.             try {
  539.                 if (is != null)
  540.                     is.close();
  541.             } catch(Exception e) {
  542.             }
  543.             NewSchematic.FileDir = Directory;
  544.             NewSchematic.FileName = FileName;
  545.             NewSchematic.Modified = false;
  546.             applet.updateAnalyzer();
  547.         }
  548.  
  549.         return NewSchematic;
  550.     }
  551.  
  552. //----------------------------------------------------------------------------
  553. // Load an example from the specified URL.
  554. //----------------------------------------------------------------------------
  555.     public void LoadExample(String FileName) {
  556.         InputStream  is;
  557.         applet.MySchematic.DestroyComponents(applet.PinGrid); // Destroy old schematic and remove components from grid.
  558.         try {
  559.             is = new URL (applet.getDocumentBase(), FileName).openStream();
  560.             applet.MySchematic = new Schematic (applet.PinGrid, is);
  561.         } catch(Exception e) {
  562.             String message = e.toString();
  563.             String DlgButtons[] = { "OK" };
  564.             SimpleDialog ExceptionDialog = new SimpleDialog(this, "Open schematic", message, DlgButtons, 1, 0, 0, SimpleDialog.IMAGE_STOP);
  565.             applet.MySchematicPanel.repaint();
  566.             return;
  567.         }
  568.         try {
  569.             if (is != null)
  570.                 is.close();
  571.         } catch(Exception e) {
  572.         }
  573.         applet.MySchematic.FileDir = "";
  574.         applet.MySchematic.FileName = FileName;
  575.         applet.MySchematic.Modified = false;
  576.         setTitle("Digital Simulator [" + FileName + "]");
  577.         applet.MySchematicPanel.repaint();
  578.         applet.updateAnalyzer();
  579.  
  580.     }
  581.  
  582. //----------------------------------------------------------------------------
  583. // Show a save-as dialog
  584. //----------------------------------------------------------------------------
  585.     public void DoFileSaveDialog(Schematic ActSchematic, boolean SaveAs, String capt) {
  586.         FileDialog FileSaveDialog = null;
  587.         FileOutputStream os;
  588.  
  589.         if (SaveAs) {
  590.             FileSaveDialog = new FileDialog (this, capt, FileDialog.SAVE);
  591.             FileSaveDialog.show();
  592.             SaveFileDirectory = FileSaveDialog.getDirectory();
  593.             SaveFileName = FileSaveDialog.getFile();
  594.         } else {
  595.             SaveFileDirectory = ActSchematic.FileDir;
  596.             SaveFileName = ActSchematic.FileName;
  597.         }
  598.  
  599.         if (SaveFileDirectory != null && SaveFileName != null) {
  600.             if (SaveFileName.endsWith(".*.*")) {
  601.                 // Java/win95 bug???
  602.                 SaveFileName = SaveFileName.substring(0, SaveFileName.length() - 4);
  603.             }
  604.  
  605.             ActSchematic.FileDir = SaveFileDirectory;
  606.             ActSchematic.FileName = SaveFileName;
  607.             // System.out.println ("SaveFileDirectory: " + SaveFileDirectory );
  608.             // System.out.println ("SaveFileName: " + SaveFileName );
  609.             try {
  610.                 os = new FileOutputStream(SaveFileDirectory + SaveFileName);
  611.                 ActSchematic.Save (os);
  612.             } catch(Exception e) {
  613.                 String message = e.toString();
  614.                 String DlgButtons[] = { "OK" };
  615.                 SimpleDialog ExceptionDialog = new SimpleDialog(this, capt, message, DlgButtons, 1, 0, 0, SimpleDialog.IMAGE_STOP);
  616.                 return;
  617.             }
  618.             try {
  619.                 if (os != null)
  620.                     os.close();
  621.             } catch(Exception e) {
  622.             }
  623.             ActSchematic.Modified = false;
  624.         }
  625.     }
  626.  
  627. //----------------------------------------------------------------------------
  628. // Handle actions in this frame.
  629. //----------------------------------------------------------------------------
  630.     public boolean action(Event ev, Object arg) {
  631.         String label = (String)arg;
  632.         // System.out.println (label);
  633.         if (label.startsWith("SIMPLEDIALOG_")) {
  634.             return SimpleDialogHandler(label);
  635.         } else if (label.startsWith("TEXTDIALOG_")) {
  636.             return TextDialogHandler(label);
  637.         } else if(ev.target instanceof MenuItem) {
  638.             if (label.equals("Open file")) {
  639.                 applet.UserWantsOpenSchematic();
  640.             } else if (label.equals("Open example")) {
  641.                 applet.UserWantsOpenExample();
  642.             } else if (label.equals("Save")) {
  643.                 applet.UserWantsSaveSchematic();
  644.             } else if (label.equals("Save as")) {
  645.                 if (applet.HelpWanted) {
  646.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Save as");
  647.                 } else {
  648.                     DoFileSaveDialog(applet.MySchematic, true, "Save schematic"); // save as
  649.                     setTitle("Digital Simulator [" + applet.MySchematic.FileName + "]");
  650.                     applet.MySchematicPanel.repaint();
  651.                 }
  652.             } else if (label.equals("Close")) {
  653.                 if (applet.HelpWanted) {
  654.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Close");
  655.                 } else {
  656.                     applet.destroyFrame();
  657.                 }
  658.             } else if (label.equals("New")) {
  659.                 applet.UserWantsNewSchematic();
  660.             } else if (label.equals("Exit")) {
  661.                 if (applet.HelpWanted) {
  662.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Exit");
  663.                 } else {
  664.                     if (ExitDialog == null) {
  665.                         String DlgButtons[] = {"OK",  "Cancel"};
  666.                         ExitDialog = new SimpleDialog(this, "Exit DigSim", "Are you sure you want to exit?", DlgButtons, 2, 1, EXITDIALOG_ID, SimpleDialog.IMAGE_WARNING);
  667.                     }
  668.                 }
  669.             } else if (label.equals("Text")) {
  670.                 applet.UserWantsTextDrawing();
  671.             } else if (label.equals("About DigSim")) {
  672.                     HelpDialog MyHelpDialog = new HelpDialog(this, "About DigSim");
  673.             } else if (label.equals("Frequently asked questions" )) {
  674.                     HelpDialog MyFAQDialog = new HelpDialog(this, "FAQ");
  675.             } else if (label.equals("Help")) {
  676.                 applet.UserWantsHelp();
  677.             } else if (label.equals("Cut")) {
  678.                 applet.UserWantsCutSchematic();
  679.             } else if (label.equals("Copy")) {
  680.                 applet.UserWantsCopySchematic();
  681.             } else if (label.equals("Paste")) {
  682.                 applet.UserWantsPasteSchematic();
  683.             } else if (label.equals("Copy to")) {
  684.                 applet.UserWantsCopyToSchematic();
  685.             } else if (label.equals("Paste from")) {
  686.                 applet.UserWantsPasteFromSchematic();
  687.             } else if (label.equals("Select All")) {
  688.                 if (applet.HelpWanted) {
  689.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Select All");
  690.                 } else {
  691.                     applet.MySchematicPanel.SelectAll();
  692.                 }
  693.             } else if (IsComponentName(label)) {
  694.                 if (applet.HelpWanted) {
  695.                     HelpDialog MyHelpDialog = new HelpDialog(this, label);
  696.                 } else {
  697.                     applet.addComponent(label);
  698.                 }
  699.             } else if ("Start".equals(arg)) {
  700.                if (applet.HelpWanted) {
  701.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Start");
  702.                 } else {
  703.                     applet.UserWantsSimulate();
  704.                 }
  705.             } else if ("Stop".equals(arg)) {
  706.                if (applet.HelpWanted) {
  707.                     HelpDialog MyHelpDialog = new HelpDialog(this, "Stop");
  708.                 } else {
  709.                     applet.UserWantsSimulate();
  710.                 }
  711.             } else if ("Show analyzer".equals(arg)) {
  712.                 applet.UserWantsAnalyzer();
  713.  
  714.             } else if ("Options".equals(arg)) {
  715.                 applet.UserWantsOptions();
  716.             }
  717.             return true;
  718.         }
  719.         return false;
  720.     }
  721. }