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