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.simantics.utils.strings.format.MetricsFormat;
25 import org.simantics.utils.strings.format.MetricsFormatList;
26 import org.simantics.utils.strings.format.MetricsFormatListListener;
28 public class MetricsEditor extends JPanel {
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;
37 private MetricsFormat format;
38 private MetricsFormatList formatList;
39 private double formatValue;
41 private JTable formatTable;
42 private MetricsTableModel tableModel;
44 public MetricsEditor() {
46 setLayout(new BorderLayout());
48 JPanel panel = new JPanel();
49 panel.setLayout(new BorderLayout());
51 valueTestField = new JTextField();
52 valuePresentationField = new JTextField();
53 formatNameField = new JTextField();
54 formatPatternField = new JTextField();
55 // formatScaleField = new JTextField();
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);
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);
72 add(panel,BorderLayout.NORTH);
73 // add(new JLabel("Format scale:"));
74 // add(formatScaleField);
76 JPanel listPanel = new JPanel();
77 add(listPanel,BorderLayout.CENTER);
78 JTable table = createFormatTable();
79 JScrollPane scrollPane = new JScrollPane(table);
80 table.setFillsViewportHeight(true);
82 listPanel.add(scrollPane);
84 JPanel controlPanel = new JPanel();
85 add(controlPanel,BorderLayout.SOUTH);
86 controlPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
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() {
94 public void actionPerformed(ActionEvent arg0) {
99 JButton removeTemplateButton = new JButton("Remove Template");
100 removeTemplateButton.setToolTipText("Remove selected template");
101 controlPanel.add(removeTemplateButton);
102 removeTemplateButton.addActionListener(new ActionListener() {
105 public void actionPerformed(ActionEvent arg0) {
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() {
116 public void actionPerformed(ActionEvent arg0) {
121 JButton newFormatButton = new JButton("New Format");
122 newFormatButton.setToolTipText("Create a new Format");
123 controlPanel.add(newFormatButton);
124 newFormatButton.addActionListener(new ActionListener() {
127 public void actionPerformed(ActionEvent arg0) {
133 valuePresentationField.setEditable(false);
135 ActionListener l = new ActionListener() {
138 public void actionPerformed(ActionEvent e) {
144 valueTestField.addActionListener(l);
145 formatPatternField.addActionListener(l);
147 valueTestField.setText("123456.789");
148 formatPatternField.setText("%s");
153 private void addTemplate() {
154 MetricsFormat format = createMetricsFormatFromFields();
157 formatList.addFormat(format);
158 } catch (Exception e) {
163 private void updateTemplate() {
164 int index = formatTable.getSelectedRow();
166 return; // TODO : show error, or even better, disable the button
167 MetricsFormat format = createMetricsFormatFromFields();
169 formatList.replaceFormatWith(formatList.getFormats()[index], format);
170 } catch (Exception e) {
175 private void removeTemplate() {
176 int index = formatTable.getSelectedRow();
178 return; // TODO : show error, or even better, disable the button
180 formatList.removeFormat(formatList.getFormats()[index]);
181 } catch (Exception e) {
186 public MetricsFormat getFormat() {
190 private void newFormat() {
192 formatNameField.setText("New format");
193 formatPatternField.setText("%s");
197 private JTable createFormatTable() {
198 formatList = MetricsFormatList.getList();
199 tableModel = new MetricsTableModel(formatList);
201 formatTable = new JTable(tableModel);
202 formatTable.doLayout();
204 formatTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
206 formatTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
209 public void valueChanged(ListSelectionEvent e) {
210 if (e.getValueIsAdjusting())
212 int index = formatTable.getSelectionModel().getMinSelectionIndex();
215 setMetricsFormat(formatList.getFormats()[index]);
222 private void updateValues() {
223 String value = valueTestField.getText();
224 if (value == null || value.length() == 0)
228 d = Double.parseDouble(value);
229 } catch (NumberFormatException e) {
230 valuePresentationField.setText("Value test is not a number");
235 MetricsFormat format = null;
237 format = createMetricsFormatFromFields();
238 } catch (Exception e) {
239 valuePresentationField.setText("Format pattern is not correct " + e.getMessage());
242 return; // TODO : show error
243 setMetricsFormat(format);
244 tableModel.setFormatValue(formatValue);
247 private MetricsFormat createMetricsFormatFromFields() {
248 if (formatPatternField.getText().length() == 0)
250 return new MetricsFormat(formatPatternField.getText(),1.0,formatNameField.getText());
253 public void setMetricsFormat(MetricsFormat format) {
254 this.format = format;
256 valuePresentationField.setText(format.formatValue(formatValue));
257 } catch (Exception e) {
258 valuePresentationField.setText("Format error: " + e.getMessage());
260 formatNameField.setText(format.getName());
261 formatPatternField.setText(format.getPattern());
264 public void dispose() {
265 tableModel.dispose();
268 private class MetricsTableModel implements TableModel, MetricsFormatListListener {
270 private String[] columnNames = {"Name","Format","Value"};
271 private MetricsFormatList formatList;
272 private double formatValue = 0;
274 public MetricsTableModel(MetricsFormatList formatList) {
275 this.formatList = formatList;
276 this.formatList.addListener(this);
279 public void setFormatValue(double value) {
280 this.formatValue = value;
285 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
290 public boolean isCellEditable(int rowIndex, int columnIndex) {
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);
304 throw new IndexOutOfBoundsException("There is no column " + columnIndex);
308 public int getRowCount() {
309 return formatList.getFormats().length;
313 public String getColumnName(int columnIndex) {
314 return columnNames[columnIndex];
318 public int getColumnCount() {
319 return columnNames.length;
323 public Class<?> getColumnClass(int columnIndex) {
327 private List<TableModelListener> listeners = new ArrayList<TableModelListener>();
330 public void addTableModelListener(TableModelListener l) {
335 public void removeTableModelListener(TableModelListener l) {
340 public void onListChanged(MetricsFormatList sender) {
344 private void fireChanged() {
345 for (TableModelListener l : listeners) {
346 l.tableChanged(new TableModelEvent(this));
350 public void dispose() {
351 formatList.removeListener(this);