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