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
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
}