]> gerrit.simantics Code Review - simantics/sysdyn.git/blob
4a63d81831d5a93295be62abac50faccb542b129
[simantics/sysdyn.git] /
1 package org.simantics.sysdyn.ui.equation.expressions;\r
2 \r
3 import java.awt.geom.Point2D;\r
4 import java.util.ArrayList;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.jface.layout.GridDataFactory;\r
8 import org.eclipse.jface.layout.GridLayoutFactory;\r
9 import org.eclipse.jface.viewers.ArrayContentProvider;\r
10 import org.eclipse.jface.viewers.CellEditor;\r
11 import org.eclipse.jface.viewers.ITableLabelProvider;\r
12 import org.eclipse.jface.viewers.LabelProvider;\r
13 import org.eclipse.jface.viewers.TableViewer;\r
14 import org.eclipse.jface.viewers.TextCellEditor;\r
15 import org.eclipse.jface.viewers.Viewer;\r
16 import org.eclipse.jface.viewers.ViewerComparator;\r
17 import org.eclipse.swt.SWT;\r
18 import org.eclipse.swt.graphics.Image;\r
19 import org.eclipse.swt.widgets.Composite;\r
20 import org.eclipse.swt.widgets.Table;\r
21 import org.eclipse.swt.widgets.TableColumn;\r
22 \r
23 public class LookupInputOutputTable extends Composite {\r
24 \r
25     public static final String INPUT = "Input";\r
26     public static final String OUTPUT = "Output";\r
27     public static final String[] PROPS = { INPUT, OUTPUT };\r
28 \r
29     Table table;\r
30     TableViewer tableViewer;\r
31     List<InputOutput> tableRows;\r
32 \r
33 \r
34     public LookupInputOutputTable(Composite parent, int style) {\r
35         super(parent, style);\r
36 \r
37         GridLayoutFactory.fillDefaults().applyTo(this);\r
38         GridDataFactory.fillDefaults().grab(true, true).applyTo(this);\r
39         table = new Table(this, SWT.BORDER|SWT.SINGLE|SWT.FULL_SELECTION);\r
40         GridDataFactory.fillDefaults().grab(true, true).applyTo(table);\r
41         table.setHeaderVisible (true);\r
42         table.setLinesVisible(true);\r
43 \r
44         TableColumn column = new TableColumn (table, SWT.LEFT);\r
45         column.setText (INPUT);\r
46         column.setWidth (60);\r
47 \r
48         column = new TableColumn (table, SWT.LEFT);\r
49         column.setText (OUTPUT);\r
50         column.setWidth (60);\r
51 \r
52         // Create the viewer and connect it to the view\r
53         tableViewer = new TableViewer (table);\r
54 \r
55         tableViewer.setContentProvider (new ArrayContentProvider());\r
56         tableViewer.setLabelProvider (new InputOutputLabelProvider());\r
57 \r
58         tableRows = new ArrayList<InputOutput>();     \r
59         tableViewer.setInput(tableRows);\r
60 \r
61         CellEditor[] editors = new CellEditor[2];\r
62         editors[0] = new TextCellEditor(table);\r
63         editors[1] = new TextCellEditor(table);\r
64         tableViewer.setCellEditors(editors);\r
65         tableViewer.setColumnProperties(PROPS);\r
66         \r
67     }\r
68 \r
69     private class InputOutputLabelProvider extends LabelProvider implements ITableLabelProvider {\r
70         public Image getColumnImage (Object element, int columnIndex) {\r
71             return null;\r
72         }\r
73         public String getColumnText (Object element, int columnIndex) {\r
74             if(element instanceof InputOutput) {\r
75                 InputOutput io = (InputOutput)element;\r
76                 switch (columnIndex) {\r
77                     case 0: return (String)io.getInput(String.class);\r
78                     case 1: return (String)io.getOutput(String.class);\r
79                 }\r
80             }\r
81             return "";\r
82         }\r
83     }\r
84 \r
85     public void addLocation(Point2D location) {\r
86         tableRows.add(new InputOutput(location.getX(), location.getY()));\r
87         tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
88 \r
89             @Override\r
90             public void run() {\r
91                 refresh();\r
92             }\r
93         });\r
94 \r
95     }\r
96 \r
97     public void removeLocation(Point2D location) {\r
98         for(InputOutput io : tableRows) {\r
99             if((Double)io.getInput(Double.class) == location.getX()) {\r
100                 tableRows.remove(io);\r
101                 tableViewer.getTable().getDisplay().asyncExec(new Runnable() {\r
102 \r
103                     @Override\r
104                     public void run() {\r
105                         refresh();\r
106                     }\r
107                 });\r
108                 break;\r
109             }\r
110         }\r
111 \r
112     }\r
113 \r
114  \r
115     class InputOutput {\r
116         private double input, output;\r
117 \r
118         public InputOutput(double input, double output) {\r
119             this.input = input;\r
120             this.output = output;\r
121         }\r
122 \r
123         /**\r
124          * \r
125          * @param clazz String.class or Double.class\r
126          * @return input as string or double or null if asked for something else\r
127          */\r
128         @SuppressWarnings("unchecked")\r
129         public Object getInput(Class clazz) {\r
130             if(clazz == String.class) {\r
131                 return "" + input;\r
132             } else if (clazz == Double.class) {\r
133                 return input;\r
134             }\r
135             return null;\r
136         }\r
137 \r
138         public Double setInput(String input) {\r
139             try {\r
140                 this.input = Double.parseDouble(input);\r
141                 return this.input;\r
142             } catch (NumberFormatException e) {\r
143                 return null;\r
144             }\r
145         }\r
146 \r
147         public void setInput(double input) {\r
148             this.input = input;\r
149         }\r
150 \r
151         /**\r
152          * \r
153          * @param clazz String.class or Double.class\r
154          * @return output as string or double or null if asked for something else\r
155          */\r
156         @SuppressWarnings("unchecked")\r
157         public Object getOutput(Class clazz) {\r
158             if(clazz == String.class) {\r
159                 return "" + output;\r
160             } else if (clazz == Double.class) {\r
161                 return output;\r
162             }\r
163             return null;\r
164         }\r
165 \r
166         public void setOutput(String output) {\r
167             try {\r
168                 this.output = Double.parseDouble(output);\r
169             } catch (NumberFormatException e) {\r
170 \r
171             }\r
172         }\r
173 \r
174         public void setOutput(double output) {\r
175             this.output = output;\r
176         }\r
177 \r
178     }\r
179 \r
180     class InputOutputComparator extends ViewerComparator {\r
181         @Override\r
182         public int compare(Viewer viewer, Object e1, Object e2) {\r
183             if ((e1 instanceof InputOutput) &&\r
184                     (e2 instanceof InputOutput)) {\r
185                 InputOutput io1 = (InputOutput)e1;\r
186                 InputOutput io2 = (InputOutput)e2;\r
187                 Double d1 = (Double)io1.getInput((Double.class));\r
188                 Double d2 = (Double)io2.getInput((Double.class));\r
189                 return d1.compareTo(d2);\r
190             }\r
191             return 0;\r
192         }\r
193     }\r
194     \r
195     public TableViewer getTableViewer() {\r
196         return this.tableViewer;\r
197     }\r
198     \r
199     public void refresh() {\r
200         tableViewer.setComparator(new InputOutputComparator());\r
201         tableViewer.refresh();\r
202     }\r
203 }\r