1 package org.simantics.modeling.ui.actions.style;
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;
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;
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;
29 public class MetricsEditor extends JPanel {
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;
38 private MetricsFormat format;
39 private MetricsFormatList formatList;
40 private double formatValue;
42 private JTable formatTable;
43 private MetricsTableModel tableModel;
45 public MetricsEditor() {
47 setLayout(new BorderLayout());
49 JPanel panel = new JPanel();
50 panel.setLayout(new BorderLayout());
52 valueTestField = new JTextField();
53 valuePresentationField = new JTextField();
54 formatNameField = new JTextField();
55 formatPatternField = new JTextField();
56 // formatScaleField = new JTextField();
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);
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);
73 add(panel,BorderLayout.NORTH);
74 // add(new JLabel("Format scale:"));
75 // add(formatScaleField);
77 JPanel listPanel = new JPanel();
78 add(listPanel,BorderLayout.CENTER);
79 JTable table = createFormatTable();
80 JScrollPane scrollPane = new JScrollPane(table);
81 table.setFillsViewportHeight(true);
83 listPanel.add(scrollPane);
85 JPanel controlPanel = new JPanel();
86 add(controlPanel,BorderLayout.SOUTH);
87 controlPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
89 JButton addTemplateButton = new JButton(Messages.MetricsEditor_AddFormatTemplate);
90 addTemplateButton.setToolTipText(Messages.MetricsEditor_AddFormatTemplateTT);
91 controlPanel.add(addTemplateButton);
92 addTemplateButton.addActionListener(new ActionListener() {
95 public void actionPerformed(ActionEvent arg0) {
100 JButton removeTemplateButton = new JButton(Messages.MetricsEditor_RemoveTemplate);
101 removeTemplateButton.setToolTipText(Messages.MetricsEditor_RemoveTemplateTT);
102 controlPanel.add(removeTemplateButton);
103 removeTemplateButton.addActionListener(new ActionListener() {
106 public void actionPerformed(ActionEvent arg0) {
111 JButton updateTemplateButton = new JButton(Messages.MetricsEditor_UpdateTemplate);
112 updateTemplateButton.setToolTipText(Messages.MetricsEditor_UpdateTemplateTT);
113 controlPanel.add(updateTemplateButton);
114 updateTemplateButton.addActionListener(new ActionListener() {
117 public void actionPerformed(ActionEvent arg0) {
122 JButton newFormatButton = new JButton(Messages.MetricsEditor_NewFormat);
123 newFormatButton.setToolTipText(Messages.MetricsEditor_NewFormatTT);
124 controlPanel.add(newFormatButton);
125 newFormatButton.addActionListener(new ActionListener() {
128 public void actionPerformed(ActionEvent arg0) {
134 valuePresentationField.setEditable(false);
136 ActionListener l = new ActionListener() {
139 public void actionPerformed(ActionEvent e) {
145 valueTestField.addActionListener(l);
146 formatPatternField.addActionListener(l);
148 valueTestField.setText(Messages.MetricsEditor_Numbers);
149 formatPatternField.setText("%s"); //$NON-NLS-1$
154 private void addTemplate() {
155 MetricsFormat format = createMetricsFormatFromFields();
158 formatList.addFormat(format);
159 } catch (Exception e) {
164 private void updateTemplate() {
165 int index = formatTable.getSelectedRow();
167 return; // TODO : show error, or even better, disable the button
168 MetricsFormat format = createMetricsFormatFromFields();
170 formatList.replaceFormatWith(formatList.getFormats()[index], format);
171 } catch (Exception e) {
176 private void removeTemplate() {
177 int index = formatTable.getSelectedRow();
179 return; // TODO : show error, or even better, disable the button
181 formatList.removeFormat(formatList.getFormats()[index]);
182 } catch (Exception e) {
187 public MetricsFormat getFormat() {
191 private void newFormat() {
193 formatNameField.setText(Messages.MetricsEditor_NewFormatField);
194 formatPatternField.setText("%s"); //$NON-NLS-1$
198 private JTable createFormatTable() {
199 formatList = MetricsFormatList.getList();
200 tableModel = new MetricsTableModel(formatList);
202 formatTable = new JTable(tableModel);
203 formatTable.doLayout();
205 formatTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
207 formatTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
210 public void valueChanged(ListSelectionEvent e) {
211 if (e.getValueIsAdjusting())
213 int index = formatTable.getSelectionModel().getMinSelectionIndex();
216 setMetricsFormat(formatList.getFormats()[index]);
223 private void updateValues() {
224 String value = valueTestField.getText();
225 if (value == null || value.length() == 0)
229 d = Double.parseDouble(value);
230 } catch (NumberFormatException e) {
231 valuePresentationField.setText(Messages.MetricsEditor_ValueTestNotANumber);
236 MetricsFormat format = null;
238 format = createMetricsFormatFromFields();
239 } catch (Exception e) {
240 valuePresentationField.setText(NLS.bind(Messages.MetricsEditor_FormatPatternNotCorrect, e.getMessage()));
243 return; // TODO : show error
244 setMetricsFormat(format);
245 tableModel.setFormatValue(formatValue);
248 private MetricsFormat createMetricsFormatFromFields() {
249 if (formatPatternField.getText().length() == 0)
251 return new MetricsFormat(formatPatternField.getText(),1.0,formatNameField.getText());
254 public void setMetricsFormat(MetricsFormat format) {
255 this.format = format;
257 valuePresentationField.setText(format.formatValue(formatValue));
258 } catch (Exception e) {
259 valuePresentationField.setText(NLS.bind(Messages.MetricsEditor_FormatError, e.getMessage()));
261 formatNameField.setText(format.getName());
262 formatPatternField.setText(format.getPattern());
265 public void dispose() {
266 tableModel.dispose();
269 private class MetricsTableModel implements TableModel, MetricsFormatListListener {
271 private String[] columnNames = {Messages.MetricsEditor_Name,Messages.MetricsEditor_Format,Messages.MetricsEditor_Value};
272 private MetricsFormatList formatList;
273 private double formatValue = 0;
275 public MetricsTableModel(MetricsFormatList formatList) {
276 this.formatList = formatList;
277 this.formatList.addListener(this);
280 public void setFormatValue(double value) {
281 this.formatValue = value;
286 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
291 public boolean isCellEditable(int rowIndex, int columnIndex) {
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);
305 throw new IndexOutOfBoundsException("There is no column " + columnIndex); //$NON-NLS-1$
309 public int getRowCount() {
310 return formatList.getFormats().length;
314 public String getColumnName(int columnIndex) {
315 return columnNames[columnIndex];
319 public int getColumnCount() {
320 return columnNames.length;
324 public Class<?> getColumnClass(int columnIndex) {
328 private List<TableModelListener> listeners = new ArrayList<TableModelListener>();
331 public void addTableModelListener(TableModelListener l) {
336 public void removeTableModelListener(TableModelListener l) {
341 public void onListChanged(MetricsFormatList sender) {
345 private void fireChanged() {
346 for (TableModelListener l : listeners) {
347 l.tableChanged(new TableModelEvent(this));
351 public void dispose() {
352 formatList.removeListener(this);