From 147c178688aee41f198c2c561b8aff23fe39aa4a Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Wed, 15 Jul 2009 22:24:02 +0000 Subject: [PATCH] Added menus --- .../visual/workbench/MotorEditor.java | 7 + .../visual/workbench/MotorWorkbench.java | 168 ++++++++++++++++-- .../visual/workbench/WorkbenchTreeModel.java | 21 ++- 3 files changed, 181 insertions(+), 15 deletions(-) diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index 126871b..ba20926 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -68,9 +68,11 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener, private static final int FUEL_TAB = 3; private static final int BURN_TAB = 4; + @SuppressWarnings("unchecked") private Class[] grainTypes = { CoredCylindricalGrain.class, Finocyl.class, Moonburner.class, RodAndTubeGrain.class }; + @SuppressWarnings("unchecked") private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class, KNDX.class, EditableFuel.class }; @@ -102,6 +104,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener, } private class BurnTab extends JPanel { + private static final long serialVersionUID = 1L; public BurnTab() { setLayout(new BorderLayout()); setName("Burn"); @@ -252,6 +255,10 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener, add(text, XML_TAB); setMotor(m, true); } + + public Motor getMotor(){ + return motor; + } private void reText() { try { diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java index 9027d8d..9882fec 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java @@ -4,16 +4,21 @@ import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.util.HashMap; import javax.swing.ButtonGroup; import javax.swing.JButton; +import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollPane; +import javax.swing.JSeparator; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JToolBar; @@ -28,6 +33,7 @@ import javax.swing.tree.TreeSelectionModel; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference; +import com.billkuker.rocketry.motorsim.io.MotorIO; public class MotorWorkbench extends JFrame implements TreeSelectionListener { private static final long serialVersionUID = 1L; @@ -38,6 +44,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { private JToolBar bar; private WorkbenchTreeModel tm; + private HashMap e2f = new HashMap(); + private HashMap f2e = new HashMap(); + private HashMap m2e = new HashMap(); public MotorWorkbench() { @@ -71,26 +80,140 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setVisible(true); - Motor mot = MotorEditor.defaultMotor(); - addMotor(mot); - // mot = MotorEditor.defaultMotor(); - // addMotor(mot); - } private void addMenu() { - setJMenuBar(new JMenuBar() { + private static final long serialVersionUID = 1L; + { add(new JMenu("File") { + private static final long serialVersionUID = 1L; + + { + add(new JMenuItem("New") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + addMotor(MotorEditor.defaultMotor(), + null); + } + }); + + } + }); + add(new JMenuItem("Open...") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + + final JFileChooser fc = new JFileChooser(); + int returnVal = fc + .showOpenDialog(MotorWorkbench.this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + if (f2e.get(file) != null) { + motors.setSelectedComponent(f2e + .get(file)); + return; + } + try { + Motor m = MotorIO + .readMotor(file); + addMotor(m, file); + } catch (Exception e) { + JOptionPane.showMessageDialog( + MotorWorkbench.this, e + .getMessage()); + } + } + } + }); + } + }); + add(new JMenuItem("Close") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ev) { + MotorEditor e = (MotorEditor) motors + .getSelectedComponent(); + tm.removeMotor(e.getMotor()); + motors.remove(e); + f2e.remove(e2f.get(e)); + e2f.remove(e); + m2e.remove(e.getMotor()); + } + }); + } + }); + add(new JSeparator()); + add(new JMenuItem("Save") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + MotorEditor m = (MotorEditor) motors + .getSelectedComponent(); + File f = e2f.get(m); + if (f != null) + save(m.getMotor(), f); + + } + }); + } + }); + add(new JMenuItem("Save As...") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + + final JFileChooser fc = new JFileChooser(); + int returnVal = fc + .showSaveDialog(MotorWorkbench.this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + MotorEditor m = (MotorEditor) motors + .getSelectedComponent(); + try { + save(m.getMotor(), file); + e2f.put(m, file); + f2e.put(file, m); + motors.setTitleAt(motors + .getSelectedIndex(), + file.getName()); + // TODO Set tab title + } catch (Exception e) { + JOptionPane.showMessageDialog( + MotorWorkbench.this, e + .getMessage()); + } + } + } + }); + } + }); + } }); add(new JMenu("Settings") { + private static final long serialVersionUID = 1L; { ButtonGroup units = new ButtonGroup(); - JRadioButtonMenuItem sci = new JRadioButtonMenuItem("SI"); - JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem("NonSI"); + JRadioButtonMenuItem sci = new JRadioButtonMenuItem( + "SI"); + JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem( + "NonSI"); units.add(sci); units.add(nonsci); sci.setSelected(true); @@ -112,24 +235,41 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { }); } - public void addMotor(Motor m) { + private void save(Motor m, File f) { + try { + MotorIO.writeMotor(m, f); + } catch (Throwable t) { + JOptionPane.showMessageDialog(MotorWorkbench.this, t.getMessage()); + } + } + + public void addMotor(Motor m, File f) { tm.addMotor(m); MotorEditor e = new MotorEditor(m); + String title; + if (f == null) { + title = "New Motor"; + } else { + title = f.getName(); + e2f.put(e, f); + f2e.put(f, e); + } m2e.put(m, e); - motors.addTab("Motor", e); + motors.addTab(title, e); } public static void main(String args[]) throws Exception { - + try { System.setProperty("apple.laf.useScreenMenuBar", "true"); - System.setProperty("com.apple.mrj.application.apple.menu.about.name", - "MotorWorkbench"); + System.setProperty( + "com.apple.mrj.application.apple.menu.about.name", + "MotorWorkbench"); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e1) { e1.printStackTrace(); } - new MotorWorkbench().show(); + new MotorWorkbench().setVisible(true); } @Override diff --git a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java index 1bb769e..4d84457 100644 --- a/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java +++ b/src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java @@ -2,9 +2,11 @@ package com.billkuker.rocketry.motorsim.visual.workbench; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Enumeration; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.MotorPart; @@ -92,11 +94,28 @@ public class WorkbenchTreeModel extends DefaultTreeModel { super(new DefaultMutableTreeNode(), true); } + @Override + public DefaultMutableTreeNode getRoot(){ + return (DefaultMutableTreeNode)super.getRoot(); + } + public void addMotor(Motor m){ - DefaultMutableTreeNode root = (DefaultMutableTreeNode)getRoot(); + DefaultMutableTreeNode root = getRoot(); root.add(new MotorNode(m)); nodesWereInserted(root, new int[]{root.getChildCount()-1}); } + + public void removeMotor(Motor m){ + Enumeration e = getRoot().children(); + while ( e.hasMoreElements() ){ + TreeNode n = e.nextElement(); + if ( n instanceof MotorNode ){ + if ( ((MotorNode)n).getUserObject() == m ){ + removeNodeFromParent((MotorNode)n); + } + } + } + } } -- 2.47.2