]> gerrit.simantics Code Review - simantics/sysdyn.git/blob
bbd5d254a326122a8eeacdbab959b11e685ce296
[simantics/sysdyn.git] /
1 /*******************************************************************************\r
2  * Copyright (c) 2010 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.sysdyn.ui.properties.widgets.expressions;\r
13 \r
14 import java.awt.geom.Point2D;\r
15 import java.util.ArrayList;\r
16 import java.util.List;\r
17 \r
18 import org.eclipse.jface.layout.GridDataFactory;\r
19 import org.eclipse.jface.layout.GridLayoutFactory;\r
20 import org.eclipse.jface.viewers.ArrayContentProvider;\r
21 import org.eclipse.jface.viewers.CellEditor;\r
22 import org.eclipse.jface.viewers.ICellModifier;\r
23 import org.eclipse.jface.viewers.ITableLabelProvider;\r
24 import org.eclipse.jface.viewers.LabelProvider;\r
25 import org.eclipse.jface.viewers.TableViewer;\r
26 import org.eclipse.jface.viewers.TextCellEditor;\r
27 import org.eclipse.jface.viewers.Viewer;\r
28 import org.eclipse.jface.viewers.ViewerComparator;\r
29 import org.eclipse.swt.SWT;\r
30 import org.eclipse.swt.graphics.Image;\r
31 import org.eclipse.swt.widgets.Composite;\r
32 import org.eclipse.swt.widgets.Event;\r
33 import org.eclipse.swt.widgets.Item;\r
34 import org.eclipse.swt.widgets.Listener;\r
35 import org.eclipse.swt.widgets.Table;\r
36 import org.eclipse.swt.widgets.TableColumn;\r
37 \r
38 public class LookupInputOutputTable extends Composite {\r
39 \r
40     public static final String INPUT = "Input";\r
41     public static final String OUTPUT = "Output";\r
42     public static final String[] PROPS = { INPUT, OUTPUT };\r
43 \r
44     private Table table;\r
45     private TableViewer tableViewer;\r
46     private List<InputOutput> tableRows;\r
47 \r
48     public LookupInputOutputTable(Composite parent, int style) {\r
49         super(parent, style);\r
50 \r
51         GridLayoutFactory.fillDefaults().applyTo(this);\r
52         GridDataFactory.fillDefaults().grab(true, true).applyTo(this);\r
53         table = new Table(this, SWT.BORDER|SWT.SINGLE|SWT.FULL_SELECTION);\r
54         GridDataFactory.fillDefaults().grab(true, true).applyTo(table);\r
55         table.setHeaderVisible (true);\r
56         table.setLinesVisible(true);\r
57         table.getVerticalBar().setVisible(true);\r
58         TableColumn column1 = new TableColumn (table, SWT.LEFT);\r
59         column1.setText (INPUT);\r
60         column1.setWidth (85);\r
61 \r
62         TableColumn column2 = new TableColumn (table, SWT.LEFT);\r
63         column2.setText (OUTPUT);\r
64         column2.setWidth (85);\r
65 \r
66         // Create the viewer and connect it to the view\r
67         tableViewer = new TableViewer (table);\r
68 \r
69         tableViewer.setContentProvider (new ArrayContentProvider());\r
70         tableViewer.setLabelProvider (new InputOutputLabelProvider());\r
71         tableViewer.setCellModifier(new InputOutputCellModifier());\r
72 \r
73         tableRows = new ArrayList<InputOutput>();     \r
74         tableViewer.setInput(tableRows);\r
75 \r
76         CellEditor[] editors = new CellEditor[2];\r
77         editors[0] = new TextCellEditor(table);\r
78         editors[1] = new TextCellEditor(table);\r
79         tableViewer.setCellEditors(editors);\r
80         tableViewer.setColumnProperties(PROPS);\r
81 \r
82     }\r
83 \r
84     private class InputOutputLabelProvider extends LabelProvider implements ITableLabelProvider {\r
85         public Image getColumnImage (Object element, int columnIndex) {\r
86             return null;\r
87         }\r
88         public String getColumnText (Object element, int columnIndex) {\r
89             if(element instanceof InputOutput) {\r
90                 InputOutput io = (InputOutput)element;\r
91                 switch (columnIndex) {\r
92                     case 0: return (String)io.getInput(String.class);\r
93                     case 1: return (String)io.getOutput(String.class);\r
94                 }\r
95             }\r
96             return "";\r
97         }\r
98     }\r
99 \r
100     public void addLocation(Point2D location) {\r
101         tableRows.add(new InputOutput(location.getX(), location.getY()));\r
102         tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
103 \r
104             @Override\r
105             public void run() {\r
106                 refresh();\r
107             }\r
108         });\r
109 \r
110     }\r
111 \r
112     public void removeItem(int index) {\r
113         tableRows.remove(index);\r
114         tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
115 \r
116             @Override\r
117             public void run() {\r
118                 refresh();\r
119             }\r
120         });\r
121     }\r
122 \r
123     public void clearTable() {\r
124         this.tableRows.clear();\r
125         tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
126 \r
127             @Override\r
128             public void run() {\r
129                 refresh();\r
130             }\r
131         });\r
132     }\r
133 \r
134 \r
135     public class InputOutput {\r
136         private double input, output;\r
137 \r
138         public InputOutput(double input, double output) {\r
139             this.input = input;\r
140             this.output = output;\r
141         }\r
142 \r
143         /**\r
144          * \r
145          * @param clazz String.class or Double.class\r
146          * @return input as string or double or null if asked for something else\r
147          */\r
148         @SuppressWarnings("rawtypes")\r
149                 public Object getInput(Class clazz) {\r
150             if(clazz == String.class) {\r
151                 return "" + input;\r
152             } else if (clazz == Double.class) {\r
153                 return input;\r
154             }\r
155             return null;\r
156         }\r
157 \r
158         public Double setInput(String input) {\r
159             try {\r
160                 this.input = Double.parseDouble(input);\r
161                 return this.input;\r
162             } catch (NumberFormatException e) {\r
163                 return null;\r
164             }\r
165         }\r
166 \r
167         public void setInput(double input) {\r
168             this.input = input;\r
169         }\r
170 \r
171         /**\r
172          * \r
173          * @param clazz String.class or Double.class\r
174          * @return output as string or double or null if asked for something else\r
175          */\r
176         @SuppressWarnings("rawtypes")\r
177                 public Object getOutput(Class clazz) {\r
178             if(clazz == String.class) {\r
179                 return "" + output;\r
180             } else if (clazz == Double.class) {\r
181                 return output;\r
182             }\r
183             return null;\r
184         }\r
185 \r
186         public void setOutput(String output) {\r
187             try {\r
188                 this.output = Double.parseDouble(output);\r
189             } catch (NumberFormatException e) {\r
190 \r
191             }\r
192         }\r
193 \r
194         public void setOutput(double output) {\r
195             this.output = output;\r
196         }\r
197 \r
198     }\r
199 \r
200     class InputOutputComparator extends ViewerComparator {\r
201         @Override\r
202         public int compare(Viewer viewer, Object e1, Object e2) {\r
203             if ((e1 instanceof InputOutput) &&\r
204                     (e2 instanceof InputOutput)) {\r
205                 InputOutput io1 = (InputOutput)e1;\r
206                 InputOutput io2 = (InputOutput)e2;\r
207                 Double d1 = (Double)io1.getInput((Double.class));\r
208                 Double d2 = (Double)io2.getInput((Double.class));\r
209                 return d1.compareTo(d2);\r
210             }\r
211             return 0;\r
212         }\r
213     }\r
214 \r
215     public TableViewer getTableViewer() {\r
216         return this.tableViewer;\r
217     }\r
218 \r
219     public void refresh() {\r
220         if(!tableViewer.getTable().isDisposed()) {\r
221             tableViewer.setComparator(new InputOutputComparator());\r
222             tableViewer.refresh();\r
223         }\r
224     }\r
225 \r
226     class InputOutputCellModifier implements ICellModifier {\r
227 \r
228         public InputOutputCellModifier() {}\r
229 \r
230         public boolean canModify(Object element, String property) {\r
231             return true;\r
232         }\r
233 \r
234         public Object getValue(Object element, String property) {\r
235             InputOutput io = (InputOutput)element;\r
236             if (LookupInputOutputTable.INPUT.equals(property))\r
237                 return (String)io.getInput(String.class);\r
238             else if (LookupInputOutputTable.OUTPUT.equals(property))\r
239                 return (String)io.getOutput(String.class);\r
240             else\r
241                 return null;\r
242         }\r
243 \r
244         public void modify(Object element, String property, Object value) {\r
245             if (element instanceof Item) element = ((Item) element).getData();\r
246 \r
247             InputOutput io = (InputOutput)element;\r
248 \r
249             if (LookupInputOutputTable.INPUT.equals(property)) {\r
250                 io.setInput((String)value);\r
251             } else if (LookupInputOutputTable.OUTPUT.equals(property)) {\r
252                 io.setOutput((String)value);\r
253             }\r
254             tableModified();\r
255             refresh();\r
256         }\r
257     }\r
258 \r
259     private void tableModified() {\r
260         tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
261 \r
262             @Override\r
263             public void run() {\r
264                 for (Listener listener : getListeners(SWT.Modify)) {\r
265                     Event e = new Event();\r
266                     listener.handleEvent(e);\r
267                 }\r
268             }\r
269         });\r
270 \r
271     }\r
272 }\r