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