1 package net.sf.openrocket.gui.customexpression;
4 import java.awt.Window;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.util.ArrayList;
8 import java.util.Collections;
10 import javax.swing.BorderFactory;
11 import javax.swing.JButton;
12 import javax.swing.JLabel;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.SwingUtilities;
17 import net.miginfocom.swing.MigLayout;
18 import net.sf.openrocket.document.Simulation;
19 import net.sf.openrocket.gui.components.DescriptionArea;
20 import net.sf.openrocket.gui.components.UnitSelector;
21 import net.sf.openrocket.gui.customexpression.ExpressionBuilderDialog;
22 import net.sf.openrocket.gui.util.Icons;
23 import net.sf.openrocket.l10n.Translator;
24 import net.sf.openrocket.logging.LogHelper;
25 import net.sf.openrocket.simulation.CustomExpression;
26 import net.sf.openrocket.startup.Application;
28 public class CustomExpressionPanel extends JPanel {
30 private static final LogHelper log = Application.getLogger();
31 private static final Translator trans = Application.getTranslator();
33 private JPanel expressionSelectorPanel;
34 private Simulation simulation;
36 public CustomExpressionPanel(final Simulation simulation) {
37 super(new MigLayout("fill"));
38 this.simulation = simulation;
40 expressionSelectorPanel = new JPanel(new MigLayout("gapy rel"));
41 JScrollPane scroll = new JScrollPane(expressionSelectorPanel);
42 this.add(scroll, "spany 2, height 10px, wmin 400lp, grow 100, gapright para");
44 DescriptionArea desc = new DescriptionArea(trans.get("customExpressionPanel.lbl.UpdateNote")+"\n\n"+trans.get("customExpressionPanel.lbl.CalcNote"), 8, -2f);
45 desc.setViewportBorder(BorderFactory.createEmptyBorder());
46 this.add(desc, "width 1px, growx 1, wrap unrel");
49 JButton button = new JButton(trans.get("customExpressionPanel.but.NewExpression"));
50 button.addActionListener(new ActionListener() {
52 public void actionPerformed(ActionEvent e) {
53 // Open window to configure expression
54 log.debug("Opening window to configure new expression");
55 Window parent = SwingUtilities.getWindowAncestor(CustomExpressionPanel.this);
56 new ExpressionBuilderDialog(parent, simulation).setVisible(true);
61 this.add(button, "left");
67 * Update the expressionSelectorPanel
69 private void updateExpressions(){
71 expressionSelectorPanel.removeAll();
72 for (CustomExpression expression : simulation.getCustomExpressions()){
73 SingleExpression se = new SingleExpression(expression);
74 expressionSelectorPanel.add(se, "wrap");
77 //TODO: High : Find out why repaint method not working properly here.
78 //expressionSelectorPanel.repaint();
79 expressionSelectorPanel.updateUI(); // Not the correct method to use but works
84 private void deleteExpression(CustomExpression expression){
85 simulation.getCustomExpressions().remove(expression);
89 * Moves an expression up or down in the expression list
91 * @param move integer - +1 to move down, -1 to move up
93 private void moveExpression(CustomExpression expression, int move){
94 ArrayList<CustomExpression> expressions = simulation.getCustomExpressions();
95 int i = expressions.indexOf(expression);
96 if (i+move == expressions.size() || i+move < 0)
99 Collections.swap(expressions, i, i+move);
104 * A JPanel which configures a single expression
106 private class SingleExpression extends JPanel {
108 // Convenience method to make the labels consistent
109 private JLabel setLabelStyle(JLabel l){
110 l.setBackground(Color.WHITE);
112 l.setBorder(BorderFactory.createRaisedBevelBorder() );
113 l.setText(" " + l.getText() + " ");
117 private SingleExpression(final CustomExpression expression) {
118 super(new MigLayout("ins 0"));
119 // name: aName symbol: a Unit: m/s
120 //super(new MigLayout("","[::100][:200:400][::100][:100:200][::100][:100:200]",""));
122 JLabel nameLabel = new JLabel( trans.get("customExpression.Name")+ " :");
123 JLabel name = new JLabel ( expression.getName() );
124 name = setLabelStyle(name);
125 JLabel symbolLabel = new JLabel( trans.get("customExpression.Symbol")+ " :" );
126 JLabel symbol = new JLabel ( expression.getSymbol());
127 symbol = setLabelStyle(symbol);
128 symbol.setBackground(Color.WHITE);
130 JLabel unitLabel = new JLabel( trans.get("customExpression.Units")+ " :");
131 UnitSelector unitSelector = new UnitSelector(expression.getType().getUnitGroup());
133 JButton editButton = new JButton(Icons.EDIT);
134 editButton.setToolTipText(trans.get("customExpression.Units.but.ttip.Edit"));
135 editButton.setBorderPainted(false);
136 editButton.addActionListener( new ActionListener() {
138 public void actionPerformed(ActionEvent e){
139 Window parent = SwingUtilities.getWindowAncestor(CustomExpressionPanel.this);
140 new ExpressionBuilderDialog(parent, expression.getSimulation(), expression).setVisible(true);
145 JButton upButton = new JButton(Icons.UP);
146 upButton.setToolTipText(trans.get("customExpression.Units.but.ttip.MoveUp"));
147 upButton.setBorderPainted(false);
148 upButton.addActionListener( new ActionListener() {
150 public void actionPerformed(ActionEvent e) {
151 moveExpression(expression, -1);
156 JButton downButton = new JButton(Icons.DOWN);
157 downButton.setToolTipText(trans.get("customExpression.Units.but.ttip.MoveDown"));
158 downButton.setBorderPainted(false);
159 downButton.addActionListener( new ActionListener() {
161 public void actionPerformed(ActionEvent e) {
162 moveExpression(expression, 1);
168 JButton deleteButton = new JButton(Icons.DELETE);
169 //// Remove this expression
170 deleteButton.setToolTipText(trans.get("customExpression.Units.but.ttip.Remove"));
171 deleteButton.setBorderPainted(false);
172 deleteButton.addActionListener(new ActionListener() {
174 public void actionPerformed(ActionEvent e) {
175 deleteExpression(expression);
181 this.add(name, "width 200:200:400, growx");
182 this.add(new JPanel());
183 this.add(symbolLabel);
184 this.add(symbol, "width :50:200");
185 this.add(new JPanel());
187 this.add(unitSelector, "width :50:100");
188 this.add(new JPanel(), "growx");
189 this.add(upButton, "right");
190 this.add(downButton, "right");
191 this.add(editButton, "right");
192 this.add(deleteButton, "right");