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