]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/style/MetricsEditor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / style / MetricsEditor.java
1 package org.simantics.modeling.ui.actions.style;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.awt.FlowLayout;\r
5 import java.awt.GridLayout;\r
6 import java.awt.event.ActionEvent;\r
7 import java.awt.event.ActionListener;\r
8 import java.util.ArrayList;\r
9 import java.util.List;\r
10 \r
11 import javax.swing.JButton;\r
12 import javax.swing.JLabel;\r
13 import javax.swing.JPanel;\r
14 import javax.swing.JScrollPane;\r
15 import javax.swing.JTable;\r
16 import javax.swing.JTextField;\r
17 import javax.swing.ListSelectionModel;\r
18 import javax.swing.event.ListSelectionEvent;\r
19 import javax.swing.event.ListSelectionListener;\r
20 import javax.swing.event.TableModelEvent;\r
21 import javax.swing.event.TableModelListener;\r
22 import javax.swing.table.TableModel;\r
23 \r
24 import org.simantics.utils.strings.format.MetricsFormat;\r
25 import org.simantics.utils.strings.format.MetricsFormatList;\r
26 import org.simantics.utils.strings.format.MetricsFormatListListener;\r
27 \r
28 public class MetricsEditor extends JPanel {\r
29 \r
30     private static final long serialVersionUID = 3781280603509654789L;\r
31     private JTextField valueTestField;\r
32     private JTextField valuePresentationField;\r
33     private JTextField formatNameField;\r
34     private JTextField formatPatternField;\r
35     //          private JTextField formatScaleField;\r
36 \r
37     private MetricsFormat format;\r
38     private MetricsFormatList formatList;\r
39     private double formatValue;\r
40 \r
41     private JTable formatTable;\r
42     private MetricsTableModel tableModel;\r
43 \r
44     public MetricsEditor() {\r
45         super();\r
46         setLayout(new BorderLayout());\r
47 \r
48         JPanel panel = new JPanel();\r
49         panel.setLayout(new BorderLayout());\r
50 \r
51         valueTestField = new JTextField();\r
52         valuePresentationField = new JTextField();\r
53         formatNameField = new JTextField();\r
54         formatPatternField = new JTextField();\r
55         //                      formatScaleField = new JTextField();\r
56 \r
57         JPanel labelPanel = new JPanel(new GridLayout(0,1));\r
58         JPanel fieldPanel = new JPanel(new GridLayout(0,1));\r
59         panel.add(labelPanel,BorderLayout.WEST);\r
60         panel.add(fieldPanel,BorderLayout.CENTER);\r
61 \r
62 \r
63         labelPanel.add(new JLabel("Value test:"));\r
64         fieldPanel.add(valueTestField);\r
65         labelPanel.add(new JLabel("Value presentation:"));\r
66         fieldPanel.add(valuePresentationField);\r
67         labelPanel.add(new JLabel("Format name:"));\r
68         fieldPanel.add(formatNameField);\r
69         labelPanel.add(new JLabel("Format pattern:"));\r
70         fieldPanel.add(formatPatternField);\r
71 \r
72         add(panel,BorderLayout.NORTH);\r
73         //                      add(new JLabel("Format scale:"));\r
74         //                      add(formatScaleField);\r
75 \r
76         JPanel listPanel = new JPanel();\r
77         add(listPanel,BorderLayout.CENTER);\r
78         JTable table = createFormatTable();\r
79         JScrollPane scrollPane = new JScrollPane(table);\r
80         table.setFillsViewportHeight(true);\r
81 \r
82         listPanel.add(scrollPane);\r
83 \r
84         JPanel controlPanel = new JPanel();\r
85         add(controlPanel,BorderLayout.SOUTH);\r
86         controlPanel.setLayout(new FlowLayout(FlowLayout.LEFT));\r
87 \r
88         JButton addTemplateButton = new JButton("Add Format Template");\r
89         addTemplateButton.setToolTipText("Add current format to templates");\r
90         controlPanel.add(addTemplateButton);\r
91         addTemplateButton.addActionListener(new ActionListener() {\r
92 \r
93             @Override\r
94             public void actionPerformed(ActionEvent arg0) {\r
95                 addTemplate();\r
96             }\r
97         });\r
98 \r
99         JButton removeTemplateButton = new JButton("Remove Template");\r
100         removeTemplateButton.setToolTipText("Remove selected template");\r
101         controlPanel.add(removeTemplateButton);\r
102         removeTemplateButton.addActionListener(new ActionListener() {\r
103 \r
104             @Override\r
105             public void actionPerformed(ActionEvent arg0) {\r
106                 removeTemplate();\r
107             }\r
108         });\r
109 \r
110         JButton updateTemplateButton = new JButton("Update Template");\r
111         updateTemplateButton.setToolTipText("Update selected template using current format");\r
112         controlPanel.add(updateTemplateButton);\r
113         updateTemplateButton.addActionListener(new ActionListener() {\r
114 \r
115             @Override\r
116             public void actionPerformed(ActionEvent arg0) {\r
117                 updateTemplate();\r
118             }\r
119         });\r
120 \r
121         JButton newFormatButton = new JButton("New Format");\r
122         newFormatButton.setToolTipText("Create a new Format");\r
123         controlPanel.add(newFormatButton);\r
124         newFormatButton.addActionListener(new ActionListener() {\r
125 \r
126             @Override\r
127             public void actionPerformed(ActionEvent arg0) {\r
128                 newFormat();\r
129             }\r
130         });\r
131 \r
132 \r
133         valuePresentationField.setEditable(false);\r
134 \r
135         ActionListener l = new ActionListener() {\r
136 \r
137             @Override\r
138             public void actionPerformed(ActionEvent e) {\r
139                 updateValues();\r
140 \r
141             }\r
142         };\r
143 \r
144         valueTestField.addActionListener(l);\r
145         formatPatternField.addActionListener(l);\r
146 \r
147         valueTestField.setText("123456.789");\r
148         formatPatternField.setText("%s");\r
149 \r
150         updateValues();\r
151     }\r
152 \r
153     private void addTemplate() {\r
154         MetricsFormat format = createMetricsFormatFromFields();\r
155 \r
156         try {\r
157             formatList.addFormat(format);\r
158         } catch (Exception e) {\r
159             // TODO : show error\r
160         }\r
161     }\r
162 \r
163     private void updateTemplate() {\r
164         int index = formatTable.getSelectedRow();\r
165         if (index == -1)\r
166             return; // TODO : show error, or even better, disable the button\r
167         MetricsFormat format = createMetricsFormatFromFields();\r
168         try {\r
169             formatList.replaceFormatWith(formatList.getFormats()[index], format);\r
170         } catch (Exception e) {\r
171             // TODO : show error\r
172         }\r
173     }\r
174 \r
175     private void removeTemplate() {\r
176         int index = formatTable.getSelectedRow();\r
177         if (index == -1)\r
178             return; // TODO : show error, or even better, disable the button\r
179         try {\r
180             formatList.removeFormat(formatList.getFormats()[index]);\r
181         } catch (Exception e) {\r
182             // TODO : show error\r
183         }\r
184     }\r
185 \r
186     public MetricsFormat getFormat() {\r
187         return format;\r
188     }\r
189 \r
190     private void newFormat() {\r
191         format = null;\r
192         formatNameField.setText("New format");\r
193         formatPatternField.setText("%s");\r
194         updateValues();\r
195     }\r
196 \r
197     private JTable createFormatTable() {\r
198         formatList = MetricsFormatList.getList();\r
199         tableModel = new MetricsTableModel(formatList);\r
200 \r
201         formatTable = new JTable(tableModel);\r
202         formatTable.doLayout();\r
203 \r
204         formatTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
205 \r
206         formatTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {\r
207 \r
208             @Override\r
209             public void valueChanged(ListSelectionEvent e) {\r
210                 if (e.getValueIsAdjusting())\r
211                     return;\r
212                 int index = formatTable.getSelectionModel().getMinSelectionIndex();\r
213                 if (index == -1)\r
214                     return;\r
215                 setMetricsFormat(formatList.getFormats()[index]);\r
216 \r
217             }\r
218         });\r
219         return formatTable;\r
220     }\r
221 \r
222     private void updateValues() {\r
223         String value = valueTestField.getText();\r
224         if (value == null || value.length() == 0)\r
225             return;\r
226         Double d = null;\r
227         try {\r
228             d = Double.parseDouble(value);\r
229         } catch (NumberFormatException e) {\r
230             valuePresentationField.setText("Value test is not a number");\r
231             return;\r
232         }\r
233         formatValue = d;\r
234 \r
235         MetricsFormat format = null;\r
236         try {\r
237             format = createMetricsFormatFromFields();\r
238         } catch (Exception e) {\r
239             valuePresentationField.setText("Format pattern is not correct " + e.getMessage());\r
240         }\r
241         if (format == null)\r
242             return; // TODO : show error\r
243         setMetricsFormat(format);\r
244         tableModel.setFormatValue(formatValue);\r
245     }\r
246 \r
247     private MetricsFormat createMetricsFormatFromFields() {\r
248         if (formatPatternField.getText().length() == 0)\r
249             return null;\r
250         return new MetricsFormat(formatPatternField.getText(),1.0,formatNameField.getText());\r
251     }\r
252 \r
253     public void setMetricsFormat(MetricsFormat format) {\r
254         this.format = format;\r
255         try {\r
256             valuePresentationField.setText(format.formatValue(formatValue));\r
257         } catch (Exception e) {\r
258             valuePresentationField.setText("Format error: "  + e.getMessage());\r
259         }\r
260         formatNameField.setText(format.getName());\r
261         formatPatternField.setText(format.getPattern());\r
262     }\r
263 \r
264     public void dispose() {\r
265         tableModel.dispose();\r
266     }\r
267 \r
268     private class MetricsTableModel implements TableModel, MetricsFormatListListener {\r
269 \r
270         private String[] columnNames = {"Name","Format","Value"};\r
271         private MetricsFormatList formatList;\r
272         private double formatValue = 0;\r
273 \r
274         public MetricsTableModel(MetricsFormatList formatList) {\r
275             this.formatList = formatList;\r
276             this.formatList.addListener(this);\r
277         }\r
278 \r
279         public void setFormatValue(double value) {\r
280             this.formatValue = value;\r
281             fireChanged();\r
282         }\r
283 \r
284         @Override\r
285         public void setValueAt(Object aValue, int rowIndex, int columnIndex) {\r
286             // do nothing\r
287         }\r
288 \r
289         @Override\r
290         public boolean isCellEditable(int rowIndex, int columnIndex) {\r
291             return false;\r
292         }\r
293 \r
294         @Override\r
295         public Object getValueAt(int rowIndex, int columnIndex) {\r
296             MetricsFormat format = formatList.getFormats()[rowIndex];\r
297             if (columnIndex == 0) {\r
298                 return format.getName();\r
299             } else if (columnIndex == 1) {\r
300                 return format.getPattern();\r
301             } else if (columnIndex == 2) {\r
302                 return format.formatValue(formatValue);\r
303             }\r
304             throw new IndexOutOfBoundsException("There is no column " + columnIndex);\r
305         }\r
306 \r
307         @Override\r
308         public int getRowCount() {\r
309             return formatList.getFormats().length;\r
310         }\r
311 \r
312         @Override\r
313         public String getColumnName(int columnIndex) {\r
314             return columnNames[columnIndex];\r
315         }\r
316 \r
317         @Override\r
318         public int getColumnCount() {\r
319             return columnNames.length;\r
320         }\r
321 \r
322         @Override\r
323         public Class<?> getColumnClass(int columnIndex) {\r
324             return String.class;\r
325         }\r
326 \r
327         private List<TableModelListener> listeners = new ArrayList<TableModelListener>();\r
328 \r
329         @Override\r
330         public void addTableModelListener(TableModelListener l) {\r
331             listeners.add(l);\r
332         }\r
333 \r
334         @Override\r
335         public void removeTableModelListener(TableModelListener l) {\r
336             listeners.remove(l);\r
337         }\r
338 \r
339         @Override\r
340         public void onListChanged(MetricsFormatList sender) {\r
341             fireChanged();\r
342         }\r
343 \r
344         private void fireChanged() {\r
345             for (TableModelListener l : listeners) {\r
346                 l.tableChanged(new TableModelEvent(this));\r
347             }\r
348         }\r
349 \r
350         public void dispose() {\r
351             formatList.removeListener(this);\r
352         }\r
353     }\r
354 }\r