Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / nonSpatial / calculator / CalculatorModelerParametersPanel.java @ 59

History | View | Annotate | Download (9.26 KB)

1 59 nbrodin
package es.unex.sextante.nonSpatial.calculator;
2
3
import info.clearthought.layout.TableLayout;
4
import info.clearthought.layout.TableLayoutConstants;
5
6
import java.awt.event.MouseAdapter;
7
import java.awt.event.MouseEvent;
8
import java.awt.event.MouseListener;
9
import java.util.HashMap;
10
import java.util.Iterator;
11
import java.util.Set;
12
13
import javax.swing.BorderFactory;
14
import javax.swing.JScrollPane;
15
import javax.swing.JTextArea;
16
import javax.swing.JTree;
17
import javax.swing.ScrollPaneConstants;
18
import javax.swing.border.BevelBorder;
19
import javax.swing.tree.DefaultMutableTreeNode;
20
import javax.swing.tree.DefaultTreeCellRenderer;
21
import javax.swing.tree.DefaultTreeModel;
22
import javax.swing.tree.TreePath;
23
24
import org.nfunk.jep.JEP;
25
26
import es.unex.sextante.core.ObjectAndDescription;
27
import es.unex.sextante.core.OutputObjectsSet;
28
import es.unex.sextante.core.Sextante;
29
import es.unex.sextante.gui.modeler.GeoAlgorithmModelerParametersPanel;
30
import es.unex.sextante.modeler.elements.ModelElementNumericalValue;
31
import es.unex.sextante.outputs.Output;
32
import es.unex.sextante.parameters.Parameter;
33
34
public class CalculatorModelerParametersPanel
35
         extends
36
            GeoAlgorithmModelerParametersPanel {
37
38
39
   private JTextArea           jTextExpression;
40
   private JScrollPane         jScrollPane;
41
   private JTree               jTree;
42
   private JScrollPane         jScrollPane1;
43
   private CalculatorKeysPanel m_KeysPanel;
44
   private HashMap             m_Constants;
45
46
47
   public CalculatorModelerParametersPanel() {
48
49
      super();
50
51
   }
52
53
54
   @Override
55
   protected void initGUI() {
56
57
      this.setPreferredSize(new java.awt.Dimension(570, 350));
58
      final TableLayout thisLayout = new TableLayout(new double[][] {
59
               { 10.0, TableLayoutConstants.FILL, TableLayoutConstants.FILL, TableLayoutConstants.FILL,
60
                        TableLayoutConstants.FILL, 10.0 },
61
               { 10.0, TableLayoutConstants.FILL, TableLayoutConstants.FILL, TableLayoutConstants.FILL, 50.0, 5.0, 50.0, 5.0,
62
                        10.0 } });
63
      thisLayout.setHGap(10);
64
      thisLayout.setVGap(10);
65
      this.setLayout(thisLayout);
66
      this.setSize(new java.awt.Dimension(350, 350));
67
      {
68
         jScrollPane = new JScrollPane();
69
         this.add(jScrollPane, "1, 4, 4, 4");
70
         jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
71
         {
72
            jTextExpression = new JTextArea();
73
            jScrollPane.setViewportView(jTextExpression);
74
            jTextExpression.setPreferredSize(new java.awt.Dimension(0, 0));
75
            jTextExpression.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
76
            try {
77
               final Parameter param = m_Algorithm.getParameters().getParameter(CalculatorAlgorithm.FORMULA);
78
               final ObjectAndDescription oad = ((ObjectAndDescription) getParameterValue(param));
79
               if (oad != null) {
80
                  final String sFormula = (String) oad.getObject();
81
                  jTextExpression.setText(sFormula);
82
               }
83
            }
84
            catch (final Exception e) {
85
               Sextante.addErrorToLog(e);
86
            }
87
         }
88
      }
89
      {
90
         m_KeysPanel = new CalculatorKeysPanel(jTextExpression);
91
         this.add(m_KeysPanel, "3, 1, 4, 3");
92
      }
93
      {
94
         jScrollPane1 = new JScrollPane();
95
         this.add(jScrollPane1, "1, 1, 2, 3");
96
         {
97
            jTree = new JTree();
98
            jScrollPane1.setViewportView(jTree);
99
            jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
100
            jTree.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
101
            final MouseListener ml = new MouseAdapter() {
102
               @Override
103
               public void mousePressed(MouseEvent e) {
104
                  int iRow = jTree.getRowForLocation(e.getX(), e.getY());
105
                  TreePath path = jTree.getPathForLocation(e.getX(), e.getY());
106
                  if ((iRow != -1) && (e.getClickCount() == 2)) {
107
                     insertTextFromTree(path);
108
                  }
109
               }
110
            };
111
            jTree.addMouseListener(ml);
112
            try {
113
               populateTree();
114
            }
115
            catch (final Exception e) {
116
               e.printStackTrace();
117
            }
118
         }
119
      }
120
121
   }
122
123
124
   private void populateTree() {
125
126
      int i;
127
      final int j;
128
129
      jTree.setModel(null);
130
131
      //numerical values
132
      final ObjectAndDescription[] values = getElementsOfClass(ModelElementNumericalValue.class, false);
133
      final DefaultMutableTreeNode main = new DefaultMutableTreeNode(Sextante.getText("ELEMENTS"));
134
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(Sextante.getText("Numerical_values"));
135
      DefaultMutableTreeNode child;
136
      for (i = 0; i < values.length; i++) {
137
         final String sName = values[i].getDescription();
138
         final String sVariableName = values[i].getObject().toString();
139
         child = new DefaultMutableTreeNode(new ObjectAndDescription(sName, sVariableName));
140
         node.add(child);
141
      }
142
      main.add(node);
143
144
      //functions
145
      final String sFunctions[] = { "sin", "cos", "tan", "asin", "acos", "atan", "atan2", "sinh", "cosh", "tanh", "asinh",
146
               "acosh", "atanh", "ln", "log", "exp", "abs", "rand", "mod", "sqrt", "if" };
147
      node = new DefaultMutableTreeNode(Sextante.getText("Functions"));
148
      for (i = 0; i < sFunctions.length; i++) {
149
         child = new DefaultMutableTreeNode(" " + sFunctions[i] + "() ");
150
         node.add(child);
151
      }
152
      main.add(node);
153
154
      //operators
155
      final String sOperators[] = { "+", "-", "*", "/", "%", "!", "^", "&&", "||", "<", ">", "<=", ">=", "==", "!=" };
156
      node = new DefaultMutableTreeNode(Sextante.getText("Operators"));
157
      for (i = 0; i < sOperators.length; i++) {
158
         final String s = " " + sOperators[i] + " ";
159
         child = new DefaultMutableTreeNode(new ObjectAndDescription(s, s));
160
         node.add(child);
161
      }
162
      main.add(node);
163
164
      //constants
165
      node = new DefaultMutableTreeNode(Sextante.getText("Constants"));
166
      m_Constants = new HashMap();
167
      m_Constants.put("e", " " + Double.toString(Math.E) + " ");
168
      m_Constants.put("Pi", " " + Double.toString(Math.PI) + " ");
169
170
      final Set set = m_Constants.keySet();
171
      final Iterator iter = set.iterator();
172
      while (iter.hasNext()) {
173
         final String s = (String) iter.next();
174
         child = new DefaultMutableTreeNode(new ObjectAndDescription(s, s));
175
         node.add(child);
176
      }
177
178
      main.add(node);
179
180
      jTree.setModel(new DefaultTreeModel(main));
181
      final DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) jTree.getCellRenderer();
182
      renderer.setOpenIcon(null);
183
      renderer.setClosedIcon(null);
184
      renderer.setLeafIcon(null);
185
186
   }
187
188
189
   private void insertTextFromTree(final TreePath path) {
190
191
      final TreePath parent = path.getParentPath();
192
193
      if ((parent != null) && !parent.toString().equals("[" + Sextante.getText("ELEMENTS") + "]")) {
194
         final String sParentName = parent.toString();
195
         final DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
196
         String s = (String) ((ObjectAndDescription) node.getUserObject()).getObject();
197
198
         if (sParentName.equals("[" + Sextante.getText("ELEMENTS") + ", " + Sextante.getText("Constants]"))) {
199
            if (m_Constants.containsKey(s)) {
200
               s = (String) m_Constants.get(s);
201
            }
202
            else {
203
               s = "";
204
            }
205
         }
206
207
         jTextExpression.insert(s, jTextExpression.getCaretPosition());
208
209
         if (sParentName.equals("[" + Sextante.getText("ELEMENTS") + ", " + Sextante.getText("Functions]"))) {
210
            jTextExpression.setCaretPosition(jTextExpression.getCaretPosition() - 2);
211
         }
212
      }
213
214
   }
215
216
217
   @Override
218
   public boolean assignParameters(final HashMap map) {
219
220
      final ObjectAndDescription[] values = getElementsOfClass(ModelElementNumericalValue.class, false);
221
222
      final JEP jep = new JEP();
223
224
      jep.addStandardConstants();
225
      jep.addStandardFunctions();
226
227
      for (int i = 0; i < values.length; i++) {
228
         if (jTextExpression.getText().contains(values[i].getObject().toString())) {
229
            jep.addVariable(values[i].getObject().toString(), 0);
230
            map.put("DUMMY" + this.getInnerParameterKey(), values[i].getObject().toString());
231
         }
232
      }
233
234
      jep.parseExpression(jTextExpression.getText());
235
236
      if (jep.hasError()) {
237
         return false;
238
      }
239
240
241
      final String sFormulaKey = getInnerParameterKey();
242
      map.put(CalculatorAlgorithm.FORMULA, sFormulaKey);
243
      m_DataObjects.put(sFormulaKey, new ObjectAndDescription("String", jTextExpression.getText()));
244
245
      final OutputObjectsSet oosetGlobal = this.m_GlobalAlgorithm.getOutputObjects();
246
      final OutputObjectsSet ooset = this.m_Algorithm.getOutputObjects();
247
248
      final String sName = CalculatorAlgorithm.RESULT + this.m_sAlgorithmName;
249
      try {
250
         final Output out = ooset.getOutput(CalculatorAlgorithm.RESULT);
251
         final Output outToAdd = out.getClass().newInstance();
252
         outToAdd.setName(sName);
253
         outToAdd.setDescription(sName); //TODO!!!!!!!!!!!!!!!
254
         oosetGlobal.add(outToAdd);
255
      }
256
      catch (final Exception e) {}
257
258
      return true;
259
260
   }
261
262
}