7a7fb32a9813523affc8fdc6b860d84303f4eb03
[debian/openrocket] / core / src / net / sf / openrocket / gui / customexpression / CustomExpressionPanel.java
1 package net.sf.openrocket.gui.customexpression;
2
3 import java.awt.Color;
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;
9
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;
16
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;
27
28 public class CustomExpressionPanel extends JPanel {
29         
30         private static final LogHelper log = Application.getLogger();
31         private static final Translator trans = Application.getTranslator();
32         
33         private JPanel expressionSelectorPanel;
34         private Simulation simulation;
35         
36         public CustomExpressionPanel(final Simulation simulation) {
37                 super(new MigLayout("fill"));
38                 this.simulation = simulation;
39
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");
43                 
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");
47                 
48                 //// New expression
49                 JButton button = new JButton(trans.get("customExpressionPanel.but.NewExpression"));
50                 button.addActionListener(new ActionListener() {
51                         @Override
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);
57                                 updateExpressions();
58                         }
59                 });
60                                 
61                 this.add(button, "left");
62                 
63                 updateExpressions();
64         }
65         
66         /*
67          * Update the expressionSelectorPanel
68          */
69         private void updateExpressions(){
70                 
71                 expressionSelectorPanel.removeAll();
72                 for (CustomExpression expression : simulation.getCustomExpressions()){
73                         SingleExpression se = new SingleExpression(expression);
74                         expressionSelectorPanel.add(se, "wrap");
75                 }
76
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
80                 
81                 
82         }
83         
84         private void deleteExpression(CustomExpression expression){
85                 simulation.getCustomExpressions().remove(expression);
86         }
87         
88         /**
89          * Moves an expression up or down in the expression list
90          * @param expression
91          * @param move integer - +1 to move down, -1 to move up
92          */
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)
97                         return;
98                 else
99                         Collections.swap(expressions, i, i+move);
100         }
101
102         
103         /*
104          * A JPanel which configures a single expression
105          */
106         private class SingleExpression extends JPanel {
107                 
108                 // Convenience method to make the labels consistent
109                 private JLabel setLabelStyle(JLabel l){
110                         l.setBackground(Color.WHITE);
111                         l.setOpaque(true);
112                         l.setBorder(BorderFactory.createRaisedBevelBorder() );
113                         l.setText(" " + l.getText() + " ");
114                         return l;
115                 }
116                 
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]",""));
121                         
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);
129                         
130                         JLabel unitLabel = new JLabel( trans.get("customExpression.Units")+ " :");
131                         UnitSelector unitSelector = new UnitSelector(expression.getType().getUnitGroup());
132                         
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() {
137                                 @Override
138                                 public void actionPerformed(ActionEvent e){
139                                         Window parent = SwingUtilities.getWindowAncestor(CustomExpressionPanel.this);
140                                         new ExpressionBuilderDialog(parent, expression.getSimulation(), expression).setVisible(true);
141                                         updateExpressions();
142                                 }
143                         });
144                         
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() {
149                                 @Override
150                                 public void actionPerformed(ActionEvent e) {
151                                         moveExpression(expression, -1);
152                                         updateExpressions();
153                                 }
154                         });
155                         
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() {
160                                 @Override
161                                 public void actionPerformed(ActionEvent e) {
162                                         moveExpression(expression, 1);
163                                         updateExpressions();
164                                 }
165                         });
166                         
167                         
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() {
173                                 @Override
174                                 public void actionPerformed(ActionEvent e) {
175                                         deleteExpression(expression);
176                                         updateExpressions();
177                                 }
178                         });
179                         
180                         this.add(nameLabel);
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());
186                         this.add(unitLabel);
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");
193                 }
194         }
195 }