// Gui.java import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.filechooser.*; import java.util.*; public class Gui extends SwingApp { static String equations = "equations"; // initialize constants used in the application // REMEMBER -- make constants static! public static JTabbedPane tabs = new JTabbedPane(); public void initConstants() { } // declare and initialize atomic components here JFileChooser fc; //file chooser javax.swing.filechooser.FileFilter conf; //file filters javax.swing.filechooser.FileFilter equat; public void initAtoms() { fc = new JFileChooser(System.getProperty("user.dir")); //create file filters for accepting .config files conf = new javax.swing.filechooser.FileFilter(){ public boolean accept(File f){ if(f != null) { String filename = f.getName(); int i = filename.lastIndexOf('.'); if(i>0 && i<filename.length()-1) { String ext = filename.substring(i+1).toLowerCase(); if (ext.equals("config")) return true; }; } return false; } public String getDescription(){ return new String("Config files"); } }; fc.addChoosableFileFilter(conf);//add this filter to the file chooser //create a file filter for accepting just .equations files equat = new javax.swing.filechooser.FileFilter(){ public boolean accept(File f){ if (f!= null){ String filename = f.getName(); int i = filename.lastIndexOf('.'); if(i>0 && i<filename.length()-1){ String ext = filename.substring(i+1).toLowerCase(); if(ext.equals(equations)) return true; } } return false; } public String getDescription(){ return new String("Equations files"); } }; fc.addChoosableFileFilter(equat);//add this filter to the file chooser } // declare and initialize layout components here private JMenuBar menubar; private JToolBar toolbar; private JPanel content;//wraps around the tabs, has scrollbars //Create the menu that contains the items private JMenu file, help; //Create the menu items private JMenuItem reset, exit, saveConfig, saveEquat, openConfig, openEquat, initTable, propForm, debugModel, helpFile; private JButton resetb, openb, sv, htmlfile, opene, savee;//toolbar buttons private JPanel meaning;//wraps around the textarea, has scrollbars public JTextArea tarea; public int showhelp;//whether to display help or why a variable is marked with respect to help menu public void initLayout() { //for setting the menu bar setJMenuBar(menubar= new JMenuBar()); //create toolbar toolbar = new JToolBar("Toolbar"); //add buttons to the toolbar resetb = new JButton("Reset"); resetb.setToolTipText("Reset the model"); toolbar.add(resetb); openb = new JButton("Open Cfg"); openb.setToolTipText("Open configuration"); toolbar.add(openb); sv = new JButton("Save Cfg"); sv.setToolTipText("Save Configuration"); toolbar.add(sv); opene = new JButton("Open Eqn"); opene.setToolTipText("Open Equation"); toolbar.add(opene); savee = new JButton("Save Eqn"); savee.setToolTipText("Save Equation"); toolbar.add(savee); toolbar.addSeparator(); JButton dbt = new JButton("DB Table"); dbt.setToolTipText("Display Variable Table"); dbt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ grammar.initDebugTable(); } }); toolbar.add(dbt); JButton propform = new JButton("Formulas"); propform.setToolTipText("Display Propagation Formulas"); propform.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ grammar.initFormulas(); } }); toolbar.add(propform); JButton showdeb = new JButton("Debugger"); showdeb.setToolTipText("Launch Model Debugger"); final Gui current = this; showdeb.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ new ModelDebuggerGui(current, "Model Debugger", false); } }); toolbar.add(showdeb); toolbar.addSeparator(); htmlfile = new JButton("Help"); htmlfile.setToolTipText("Open Help File"); toolbar.add(htmlfile); //adding file, help to the menu bar menubar.add(file = new JMenu("File")); menubar.add(help = new JMenu("Help")); //adding menu items to file menu file.add(reset = new JMenuItem("Reset")); file.addSeparator(); file.add(saveConfig = new JMenuItem("Save Configuration")); file.add(saveEquat = new JMenuItem("Save Equations")); file.addSeparator(); file.add(openConfig = new JMenuItem("Open Configuration")); file.add(openEquat = new JMenuItem("Open Equations")); file.addSeparator(); file.add(exit = new JMenuItem("Close Program")); //adding menu items to help menu help.add(initTable = new JMenuItem("Display Variable Table")); help.add(propForm = new JMenuItem("Display Propagation Formulas")); help.add(debugModel = new JMenuItem("Launch Model Debugger")); showhelp = 0; help.addSeparator(); final JRadioButtonMenuItem bhelp = new JRadioButtonMenuItem("Display help for variables"); final JRadioButtonMenuItem breason = new JRadioButtonMenuItem("Display reason for variable selection"); breason.setSelected(true); ButtonGroup bg = new ButtonGroup(); bg.add(bhelp);// add radio buttons bg.add(breason); //to the button group bhelp.addChangeListener(new ChangeListener(){//uses showhelp to determine what should be displayed public void stateChanged(ChangeEvent e){ if (breason.isSelected()) showhelp = 0; else showhelp = 1; } }); help.add(bhelp); help.add(breason); help.addSeparator(); help.add(helpFile = new JMenuItem("Open Help File")); grammar.rootProduction.draw(0); //tabs have the gui now //wrap the tabs into the panel for scrollpane content = new JPanel(); content.setLayout(new BorderLayout()); content.add(tabs, BorderLayout.CENTER); //create the panel to wrap the text area in meaning = new JPanel(); meaning.setLayout(new BorderLayout()); meaning.setBackground(Color.lightGray); meaning.setOpaque(false);//transparent //create the text area tarea = new JTextArea(); tarea.setRows(4); tarea.setMargin(new Insets(5, 5, 5, 5)); tarea.setEditable(false);//do not allow users to change what is shown manually tarea.setLineWrap(true); tarea.setWrapStyleWord(true); tarea.setBackground(Color.white); //wrap the text area in jpanel JScrollPane scroll = new JScrollPane(tarea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); meaning.add(scroll); } // initialize ContentPane here public void initContentPane() { ContentPane = new JPanel(new BorderLayout()); ContentPane.setBorder(BorderFactory.createEtchedBorder()); ContentPane.add(toolbar, BorderLayout.NORTH); ContentPane.add (new JScrollPane(content, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); ContentPane.add( meaning, BorderLayout.SOUTH); ContentPane.setPreferredSize(new Dimension(600, 400)); ContentPane.setMinimumSize(new Dimension(100, 70)); } //helper functions to read and write configurations void writeConfig(File file){ try{ FileWriter fw = new FileWriter(file); Iterator it = grammar.UserSelections.iterator(); fw.write("## "); while(it.hasNext()){ variable vt = (variable)(it.next()); fw.write(vt.name); fw.write(" "); } fw.close();//write to the file } catch(IOException e){} } void readConfig(File file){ try{ FileReader fr = new FileReader(file); StringBuffer sb = new StringBuffer(); char[] b = new char[8192]; int n; while ((n = fr.read(b)) > 0) sb.append(b, 0, n); String input = sb.toString(); input = input.substring(input.indexOf("#")+2); if (input != null){//parse and assign the variables; StringTokenizer init = new StringTokenizer(input, "\n\r\f"); if (init.hasMoreTokens()){ StringTokenizer sttok = new StringTokenizer(init.nextToken()); grammar.UserSelections.clear(); while (sttok.hasMoreTokens()){ String cur = sttok.nextToken(); variable var = (variable)(variable.Vtable.get(cur)); grammar.UserSelections.add(var); } grammar.propagate(); ActionList.setGui(); } } else JOptionPane.showMessageDialog(null, "Error", "Empty file given, cannot read a configuration", JOptionPane.INFORMATION_MESSAGE); } catch(IOException e){} } /**********INITIALIZE ACTION LISTENERS**************/ public void initListeners() { final Gui current = this;//since listeners need to know about the gui //create reset action listener resetal ral = new resetal(); reset.addActionListener(ral); resetb.addActionListener(ral); //save config action listener saveconfigal scal = new saveconfigal(this); saveConfig.addActionListener(scal); sv.addActionListener(scal); //save equations action listener saveequat seq = new saveequat(this); saveEquat.addActionListener(seq); savee.addActionListener(seq); //open config action listener openconfigal ocal = new openconfigal(this, conf); openConfig.addActionListener(ocal); openb.addActionListener(ocal); //open equations action listener openconfigal openeq = new openconfigal(this, equat); openEquat.addActionListener(openeq); opene.addActionListener(openeq); //help menu table initialization action listener initTable.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ grammar.initDebugTable(); } }); //table menu propagation formulas window action listener propForm.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ grammar.initFormulas(); } }); //file menu exit action listener exit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ System.exit(0); } }); //help menu debug model window action listener debugModel.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ new ModelDebuggerGui(current, "Model Debugger", false); } }); //help menu help file windown action listener helpfileal hfal = new helpfileal(this); helpFile.addActionListener(hfal); htmlfile.addActionListener(hfal); } // place in this method any action for exiting application public void applicationExit() { } //was used when user would click on a feature button that's not yet implemented private void notImplemented(){ JOptionPane.showMessageDialog(null, "Not yet implemented", "Not yet implemented", JOptionPane.INFORMATION_MESSAGE); } public Gui() { super(); setLocationRelativeTo(null); // setResizable(false); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public Gui(String AppTitle) { super(AppTitle); setLocationRelativeTo(null); // setResizable(false); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new Gui("Gui"); } }