/* * Console.java * * Created on Aug 9, 2010, 9:13:39 AM */ package ngmfconsole; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.MalformedURLException; import java.util.Arrays; import java.util.Comparator; import java.util.Properties; import java.util.logging.Level; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTabbedPane; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; import javax.swing.plaf.basic.BasicComboBoxRenderer; /** Console * * @author od */ public class Console extends JFrame { static final String PREF_OPEN_FILES = "console.file.open"; static final String PREF_ACTIVE_FILE = "console.file.active"; // static final String PREF_JAVA_OPTIONS = "oms.java.options"; static final String PREF_WORK_DIR = "oms.java.workingdir"; static final String PREF_JAVA_HOME = "oms.java.home"; static final String PREF_OMS_VERSION = "oms.version"; // static final String SIMULATION_DIR = "simulation"; // static final String OMS_DIR = ".oms"; static final String PROJECT_PROPERTIES = "project.properties"; // static final File dotoms3 = new File(System.getProperty("user.home") + File.separatorChar + OMS_DIR); // static final File oms3Home = new File(dotoms3, Utils.getOMSAppVersion()); static final File prefsFile = new File(dotoms3, PROJECT_PROPERTIES); // static final String[] jars = { "oms-all.jar", "groovy-all-1.7.10.jar", "jfreechart-1.0.12.jar", "jcommon-1.0.15.jar", "cpptasks-1.0b6-od.jar" }; static File getOMSHome(String version) { return new File(dotoms3, version); } // static final FileFilter oms3FileFilter = new FileFilter() { @Override public boolean accept(File f) { String n = f.getName(); return n.endsWith(".sim") || n.endsWith(".esp") || n.endsWith(".fast") || n.endsWith(".luca") || n.endsWith(".test") || n.endsWith(".groovy") || f.isDirectory(); } @Override public String getDescription() { return "OMS Files (*.sim, *.esp, *.luca, *.fast)"; } }; class MyComboBoxRenderer extends BasicComboBoxRenderer { ListCellRenderer delegate; public MyComboBoxRenderer(ListCellRenderer delegate) { this.delegate = delegate; } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected && (-1 < index)) { list.setToolTipText(((File) list.getModel().getElementAt(index)).getPath()); } return delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } } // JFileChooser workChooser = new JFileChooser(); JFileChooser openChooser = new JFileChooser(); // TabMenu menu; boolean installing = false; boolean clearOutput = true; static class FileDisplayer extends File { public FileDisplayer(File f) { super(f.toString()); } @Override public String toString() { return super.getName(); } } Console() { initComponents(); setupComponents(); } private void setupComponents() { setTitle(title()); setIconImage(new ImageIcon(getClass().getResource("/ngmfconsole/resources/objects-32.png")).getImage()); workCombo.setRenderer(new MyComboBoxRenderer(workCombo.getRenderer())); jToolBar1.addSeparator(); optionsToolbar.add(JPanelButton.panelButton(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String n = evt.getPropertyName(); if (n.equals(Preferences.SHOW_HIDDEN)) { openChooser.setFileHidingEnabled(!(Boolean) evt.getNewValue()); workChooser.setFileHidingEnabled(!(Boolean) evt.getNewValue()); } else if (n.equals(Preferences.CLEAR_OUT)) { clearOutput = (Boolean) evt.getNewValue(); } } })); exitMI.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Console.this.dispatchEvent( new WindowEvent(Console.this, WindowEvent.WINDOW_CLOSING)); } }); openChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); openChooser.setMultiSelectionEnabled(true); openChooser.addChoosableFileFilter(oms3FileFilter); workChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); workChooser.setMultiSelectionEnabled(false); workChooser.setApproveButtonText("Select"); workChooser.setDialogTitle("Project Directory"); // last session restore Properties prefs = new Properties(); if (prefsFile.exists()) { try { FileReader r = new FileReader(prefsFile); prefs.load(r); r.close(); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); } } enableProjectControls(false); workCombo.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { try { String wd = ((File) e.getItem()).getPath(); if (e.getStateChange() == ItemEvent.DESELECTED) { saveProjectConf(wd); closeAll(); } else { loadProjectConf(wd); File simDir = new File(wd, SIMULATION_DIR); openChooser.setCurrentDirectory(simDir.exists() ? simDir : new File(wd)); enableProjectControls(true); } } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } } }); workCombo.requestFocus(); tabs.addMouseListener(new PopupListener(tabs)); tabs.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if (tabs.getSelectedIndex() > -1) { setTitle(tabs.getTitleAt(tabs.getSelectedIndex()) + " - " + title()); } else { setTitle(title()); } } }); menu = new TabMenu(tabs); // some checks adjustForNB(); checkButtons(); clearIndicator(); String wd = prefs.getProperty(PREF_OPEN_FILES); if (wd != null && !wd.isEmpty()) { for (String w1 : wd.split("\\s*;\\s*")) { loadProject(new File(w1)); } String active = prefs.getProperty(PREF_ACTIVE_FILE); if (active != null && !active.isEmpty()) { activateProject(active); } } new Thread() { @Override public void run() { File installDir = oms3Home; try { if (!needToInstall(installDir)) { statusMessageLabel.setText("Runtime found in '" + installDir + "'"); return; } setInstalling(true); setDownloadingIndicator(); installDir.mkdirs(); for (int i = 0; i < jars.length; i++) { statusMessageLabel.setText("Installing (" + (i + 1) + "/" + jars.length + ") " + new File(installDir, jars[i]) + " ... "); Utils.download(new File(Utils.downloadDir(), jars[i]), new File(installDir, jars[i])); } statusMessageLabel.setText("Runtime (re)installed in '" + installDir + "'"); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } finally { setInstalling(false); clearIndicator(); } } }.start(); } boolean getClearOutput() { return clearOutput; } boolean needToInstall(File installDir) throws MalformedURLException { File downloadDir = Utils.downloadDir(); for (int i = 0; i < jars.length; i++) { File d = new File(downloadDir,jars[i]); File f = new File(installDir, jars[i]); if (!f.exists() || f.length() == 0 || !f.canRead() || d.length() != f.length() || d.lastModified() > f.lastModified()) { // newer file same version, need to install return true; } } return false; } private void enableProjectControls(boolean b) { workCombo.setEnabled(b); newButton.setEnabled(b); openButton.setEnabled(b); saveAllButton.setEnabled(b); closeProject.setEnabled(b); } void savePrefs() { Properties prefs = new Properties(); StringBuilder b = new StringBuilder(); for (int i = 0; i < workCombo.getItemCount(); i++) { String dir = ((File) workCombo.getItemAt(i)).getPath(); b.append(dir.replace('\\', '/')); if (i < workCombo.getItemCount() - 1) { b.append(";"); } } prefs.setProperty(PREF_OPEN_FILES, b.toString()); prefs.setProperty(PREF_ACTIVE_FILE, Integer.toString(workCombo.getSelectedIndex())); try { FileWriter w = new FileWriter(prefsFile); prefs.store(w, "OMS Preferences."); w.close(); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } } private void adjustForNB() { File nbDir = new File(System.getProperty("user.home") + File.separatorChar + ".netbeans"); if (nbDir.exists()) { File[] files = nbDir.listFiles(); if (files != null && files.length > 0) { Arrays.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { return o1.getName().compareTo(o2.getName()); } }); File lastNB = files[files.length - 1]; if (lastNB.exists()) { File bp = new File(lastNB, "build.properties"); try { Properties p = new Properties(); p.load(new FileReader(bp)); if (p.getProperty("oms.ignore") == null) { p.setProperty("oms.version", Utils.getOMSAppVersion()); FileWriter w = new FileWriter(bp); p.store(w, ""); w.close(); } } catch (IOException E) { return; } } //System.out.println("File " + files[files.length - 1].getAbsolutePath()); } } } void setDownloadingIndicator() { statusIndicator.setIcon( new ImageIcon(getClass().getResource("/ngmfconsole/resources/ajax-loader.gif"))); } void clearIndicator() { statusIndicator.setIcon(null); } synchronized boolean isInstalling() { return installing; } synchronized void setInstalling(boolean installing) { this.installing = installing; } void loadFile(File file) { SimPanel p = new SimPanel(this); p.loadFile(file); tabs.addTab(file.getName(), p); tabs.setToolTipTextAt(tabs.getTabCount() - 1, file.toString()); tabs.setSelectedIndex(tabs.getTabCount() - 1); statusMessageLabel.setText("Loaded: " + file); checkButtons(); } void checkButtons() { saveAllButton.setEnabled(tabs.getTabCount() > 0); } File getOpenChooser() { return openChooser.getCurrentDirectory(); } String getWork() { return ((File) workCombo.getSelectedItem()).getPath(); } String title() { return "Console (OMS " + Utils.getOMSAppVersion() + ")"; } void toggleTitle(SimPanel p) { int index = tabs.indexOfComponent(p); String s = SimPanel.newFile.getName(); if (p.getFile() != null) { s = p.getFile().getName(); } tabs.setTitleAt(index, s + (p.isModified() ? "*" : " ")); } void saveProjectConf(String dir) throws IOException { StringBuilder b = new StringBuilder(); for (int i = 0; i < tabs.getTabCount(); i++) { SimPanel t = (SimPanel) tabs.getComponentAt(i); if (t.getFile() != null) { if (b.length() != 0) { b.append(";"); } b.append(t.getFile().toString().substring(dir.length() + 1).replace('\\', '/')); } } int activeFile = tabs.getSelectedIndex() < 0 ? 0 : tabs.getSelectedIndex(); File conf = new File(dir + File.separatorChar + OMS_DIR, PROJECT_PROPERTIES); String f = ""; if (conf.exists()) { f = readFile(conf.toString()); } if (f.indexOf(PREF_OPEN_FILES) > -1) { f = f.replaceFirst(PREF_OPEN_FILES + "\\s*=(.)*\n", PREF_OPEN_FILES + "=" + b.toString() + "\n"); } else { f = f + "\n\n# OMS Console configuration:\n"; f = f + PREF_OPEN_FILES + "=" + b.toString() + "\n"; } if (f.indexOf(PREF_ACTIVE_FILE) > -1) { f = f.replaceFirst(PREF_ACTIVE_FILE + "\\s*=(.)*\n", PREF_ACTIVE_FILE + "=" + activeFile + "\n"); } else { f = f + PREF_ACTIVE_FILE + "=" + activeFile + "\n"; } conf.getParentFile().mkdirs(); PrintWriter fo = new PrintWriter(conf); fo.print(f); fo.close(); } public static String readFile(String name) { StringBuilder b = new StringBuilder(); try { BufferedReader r = new BufferedReader(new FileReader(name)); String line; while ((line = r.readLine()) != null) { b.append(line).append('\n'); } r.close(); } catch (IOException E) { throw new RuntimeException(E.getMessage()); } return b.toString(); } void loadProjectConf(String dir) throws IOException { Properties p = new Properties(); File conf = new File(dir + File.separatorChar + OMS_DIR, PROJECT_PROPERTIES); if (conf.exists()) { FileInputStream fi = new FileInputStream(conf); p.load(fi); fi.close(); String s = p.getProperty(PREF_OPEN_FILES); if (s == null || s.isEmpty() || s.trim().isEmpty()) { return; } for (String s1 : s.split("\\s*;\\s*")) { File f = new File(dir, s1); if (f.exists()) { loadFile(f); } } String a = p.getProperty(PREF_ACTIVE_FILE, "0"); try { int idx = Integer.parseInt(a); if (idx > -1 && (idx < tabs.getTabCount())) { tabs.setSelectedIndex(idx); } } catch (NumberFormatException E) { } } if (tabs.getTabCount() == 0) { loadFile(SimPanel.newFile); } } void closeAll() { tabs.removeAll(); checkButtons(); } /** * */ class TabMenu extends JPopupMenu implements ActionListener { private static final long serialVersionUID = 1L; private String saveTabLabel = "Save"; private String saveAsTabLabel = "Save As..."; private String closeTabLabel = "Close"; private String closeAllLabel = "Close All"; private String closeOtherLabel = "Close Other"; private JTabbedPane pane; private int curTab = -1; TabMenu(JTabbedPane pane) { this.pane = pane; JMenuItem saveTab = new JMenuItem(saveTabLabel); saveTab.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); JMenuItem saveAsTab = new JMenuItem(saveAsTabLabel); JMenuItem closeTab = new JMenuItem(closeTabLabel); JMenuItem closeAll = new JMenuItem(closeAllLabel); JMenuItem closeOther = new JMenuItem(closeOtherLabel); add(saveAsTab); addSeparator(); add(closeTab); add(closeAll); add(closeOther); add(saveTab); saveTab.addActionListener(this); saveAsTab.addActionListener(this); closeTab.addActionListener(this); closeAll.addActionListener(this); closeOther.addActionListener(this); } void setCurrentTab(int index) { curTab = index; } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(saveTabLabel)) { if (curTab > -1) { ((SimPanel) tabs.getComponentAt(curTab)).save(false); } } else if (e.getActionCommand().equals(saveAsTabLabel)) { if (curTab > -1) { ((SimPanel) tabs.getComponentAt(curTab)).save(true); } } else if (e.getActionCommand().equals(closeTabLabel)) { if (curTab > -1) { if (((SimPanel) tabs.getComponentAt(curTab)).checkClose()) { pane.remove(curTab); } } } else if (e.getActionCommand().equals(closeAllLabel)) { pane.removeAll(); } else if (e.getActionCommand().equals(closeOtherLabel)) { if (curTab > -1) { while (tabs.getTabCount() > curTab + 1) {//close tabs after tabs.remove(curTab + 1); } while (tabs.getTabCount() > 1) {//close tabs before tabs.remove(0); } } } checkButtons(); try { saveProjectConf(getWork()); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } } } /** * triggers popup menu with right click on tab */ class PopupListener extends MouseAdapter { JTabbedPane pane; PopupListener(JTabbedPane pane) { this.pane = pane; } @Override public void mousePressed(MouseEvent e) { checkForPopup(e); } @Override public void mouseReleased(MouseEvent e) { checkForPopup(e); } @Override public void mouseClicked(MouseEvent e) { checkForPopup(e); } private void checkForPopup(MouseEvent e) { if (e.isPopupTrigger()) { int tabNumber = pane.getUI().tabForCoordinate(pane, e.getX(), e.getY()); if (tabNumber >= 0) {//must be a tab Component c = e.getComponent(); menu.setCurrentTab(tabNumber);//set the selected tab menu.show(c, e.getX(), e.getY()); } } } } // public static void main(String[] args) { // String f = // PREF_ACTIVE_FILE + "=2\n" // + "\n"; // System.out.println(f); // f = f.replaceFirst(PREF_ACTIVE_FILE + "\\s*=(.)+\n", PREF_ACTIVE_FILE + "=" + 5); // System.out.println(f); // } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { tabs = new javax.swing.JTabbedPane(); tools = new javax.swing.JPanel(); jPanel3 = new javax.swing.JPanel(); jToolBar2 = new javax.swing.JToolBar(); jSeparator1 = new javax.swing.JToolBar.Separator(); newProject = new javax.swing.JButton(); closeProject = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); workCombo = new javax.swing.JComboBox(); jLabel1 = new javax.swing.JLabel(); workDirButton = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); optionsToolbar = new javax.swing.JToolBar(); jToolBar1 = new javax.swing.JToolBar(); newButton = new javax.swing.JButton(); openButton = new javax.swing.JButton(); saveAllButton = new javax.swing.JButton(); status = new javax.swing.JPanel(); statusMessageLabel = new javax.swing.JLabel(); space = new javax.swing.JLabel(); statusIndicator = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); exitMI = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); tabs.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT); getContentPane().add(tabs, java.awt.BorderLayout.CENTER); jToolBar2.setFloatable(false); jToolBar2.setRollover(true); jToolBar2.add(jSeparator1); newProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/oxygen/Actions-project-development-new-template-icon.png"))); // NOI18N newProject.setToolTipText("New project."); newProject.setEnabled(false); newProject.setFocusable(false); newProject.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); newProject.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); jToolBar2.add(newProject); closeProject.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/oxygen/Actions-project-development-close-icon.png"))); // NOI18N closeProject.setToolTipText("Close project."); closeProject.setFocusable(false); closeProject.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); closeProject.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); closeProject.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { closeProjectActionPerformed(evt); } }); jToolBar2.add(closeProject); workCombo.setToolTipText("Switch projects."); workCombo.setMaximumSize(new java.awt.Dimension(263, 2000)); workCombo.setPreferredSize(new java.awt.Dimension(263, 24)); jLabel1.setText("Project:"); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addGap(26, 26, 26) .addComponent(jLabel1) .addGap(4, 4, 4) .addComponent(workCombo, 0, 201, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(workCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); jToolBar2.add(jPanel2); workDirButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/oxygen/Actions-document-open-folder-icon.png"))); // NOI18N workDirButton.setToolTipText("Open project."); workDirButton.setBorderPainted(false); workDirButton.setFocusable(false); workDirButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); workDirButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); workDirButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { workDirButtonActionPerformed(evt); } }); jToolBar2.add(workDirButton); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); optionsToolbar.setFloatable(false); optionsToolbar.setRollover(true); optionsToolbar.setBorderPainted(false); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 155, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap(39, Short.MAX_VALUE) .addComponent(optionsToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap())) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 38, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(optionsToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 38, Short.MAX_VALUE)) ); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); newButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/oxygen/Actions-document-new-icon.png"))); // NOI18N newButton.setToolTipText("New simulation"); newButton.setEnabled(false); newButton.setFocusable(false); newButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); newButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newButtonActionPerformed(evt); } }); jToolBar1.add(newButton); openButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/oxygen/Actions-document-open-icon.png"))); // NOI18N openButton.setToolTipText("Open simulation."); openButton.setEnabled(false); openButton.setFocusable(false); openButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); openButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); openButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openButtonActionPerformed(evt); } }); jToolBar1.add(openButton); saveAllButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/saveall-24.png"))); // NOI18N saveAllButton.setToolTipText("Save all simulations."); saveAllButton.setEnabled(false); saveAllButton.setFocusable(false); saveAllButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); saveAllButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); saveAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveAllButtonActionPerformed(evt); } }); jToolBar1.add(saveAllButton); javax.swing.GroupLayout toolsLayout = new javax.swing.GroupLayout(tools); tools.setLayout(toolsLayout); toolsLayout.setHorizontalGroup( toolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, toolsLayout.createSequentialGroup() .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); toolsLayout.setVerticalGroup( toolsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); getContentPane().add(tools, java.awt.BorderLayout.NORTH); status.setLayout(new java.awt.BorderLayout()); statusMessageLabel.setText("status"); status.add(statusMessageLabel, java.awt.BorderLayout.CENTER); space.setText(" "); status.add(space, java.awt.BorderLayout.WEST); statusIndicator.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ngmfconsole/resources/ajax-loader.gif"))); // NOI18N statusIndicator.setText(" "); status.add(statusIndicator, java.awt.BorderLayout.LINE_END); getContentPane().add(status, java.awt.BorderLayout.SOUTH); fileMenu.setText("File"); exitMI.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK)); exitMI.setMnemonic('x'); exitMI.setText("Exit"); fileMenu.add(exitMI); jMenuBar1.add(fileMenu); setJMenuBar(jMenuBar1); pack(); }// </editor-fold>//GEN-END:initComponents private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed loadFile(SimPanel.newFile); }//GEN-LAST:event_newButtonActionPerformed private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed int result = openChooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File[] selected = openChooser.getSelectedFiles(); if (selected.length > 0) { for (File file : selected) { loadFile(file); } } else { loadFile(openChooser.getSelectedFile()); } try { saveProjectConf(getWork()); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } } }//GEN-LAST:event_openButtonActionPerformed private void saveAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAllButtonActionPerformed for (int i = 0; i < tabs.getTabCount(); i++) { SimPanel t = (SimPanel) tabs.getComponentAt(i); if (t.isModified()) { t.save(false); } } try { saveProjectConf(getWork()); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } }//GEN-LAST:event_saveAllButtonActionPerformed File currWork = new File(System.getProperty("user.home")); void loadProject(File folder) { if (!folder.exists()) { return; } workCombo.addItem(new FileDisplayer(folder)); File simDir = new File(folder, SIMULATION_DIR); openChooser.setCurrentDirectory(simDir.exists() ? simDir : folder); currWork = folder; enableProjectControls(true); workCombo.setSelectedIndex(workCombo.getItemCount() - 1); } void activateProject(String idx) { try { int i = Integer.parseInt(idx); if (i > -1 && i < workCombo.getItemCount()) { workCombo.setSelectedIndex(i); } } catch (NumberFormatException E) { } } private void workDirButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_workDirButtonActionPerformed workChooser.setCurrentDirectory(currWork); int result = workChooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File selected = workChooser.getSelectedFile(); loadProject(selected); } }//GEN-LAST:event_workDirButtonActionPerformed private void closeProjectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeProjectActionPerformed if (workCombo.getItemCount() > 0) { String wd = ((File) workCombo.getSelectedItem()).getPath(); try { saveProjectConf(wd); closeAll(); workCombo.removeItemAt(workCombo.getSelectedIndex()); } catch (IOException ex) { Main.logger.log(Level.SEVERE, "Error", ex); ex.printStackTrace(System.err); } } }//GEN-LAST:event_closeProjectActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton closeProject; private javax.swing.JMenuItem exitMI; private javax.swing.JMenu fileMenu; private javax.swing.JLabel jLabel1; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JToolBar.Separator jSeparator1; private javax.swing.JToolBar jToolBar1; private javax.swing.JToolBar jToolBar2; private javax.swing.JButton newButton; private javax.swing.JButton newProject; private javax.swing.JButton openButton; private javax.swing.JToolBar optionsToolbar; private javax.swing.JButton saveAllButton; private javax.swing.JLabel space; private javax.swing.JPanel status; private javax.swing.JLabel statusIndicator; private javax.swing.JLabel statusMessageLabel; private javax.swing.JTabbedPane tabs; private javax.swing.JPanel tools; private javax.swing.JComboBox workCombo; private javax.swing.JButton workDirButton; // End of variables declaration//GEN-END:variables }