--- /dev/null
+package org.simantics.modeling.ui.actions.style;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.FlowLayout;\r
+import java.awt.GridLayout;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.swing.JButton;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+import javax.swing.JScrollPane;\r
+import javax.swing.JTable;\r
+import javax.swing.JTextField;\r
+import javax.swing.ListSelectionModel;\r
+import javax.swing.event.ListSelectionEvent;\r
+import javax.swing.event.ListSelectionListener;\r
+import javax.swing.event.TableModelEvent;\r
+import javax.swing.event.TableModelListener;\r
+import javax.swing.table.TableModel;\r
+\r
+import org.simantics.utils.strings.format.MetricsFormat;\r
+import org.simantics.utils.strings.format.MetricsFormatList;\r
+import org.simantics.utils.strings.format.MetricsFormatListListener;\r
+\r
+public class MetricsEditor extends JPanel {\r
+\r
+ private static final long serialVersionUID = 3781280603509654789L;\r
+ private JTextField valueTestField;\r
+ private JTextField valuePresentationField;\r
+ private JTextField formatNameField;\r
+ private JTextField formatPatternField;\r
+ // private JTextField formatScaleField;\r
+\r
+ private MetricsFormat format;\r
+ private MetricsFormatList formatList;\r
+ private double formatValue;\r
+\r
+ private JTable formatTable;\r
+ private MetricsTableModel tableModel;\r
+\r
+ public MetricsEditor() {\r
+ super();\r
+ setLayout(new BorderLayout());\r
+\r
+ JPanel panel = new JPanel();\r
+ panel.setLayout(new BorderLayout());\r
+\r
+ valueTestField = new JTextField();\r
+ valuePresentationField = new JTextField();\r
+ formatNameField = new JTextField();\r
+ formatPatternField = new JTextField();\r
+ // formatScaleField = new JTextField();\r
+\r
+ JPanel labelPanel = new JPanel(new GridLayout(0,1));\r
+ JPanel fieldPanel = new JPanel(new GridLayout(0,1));\r
+ panel.add(labelPanel,BorderLayout.WEST);\r
+ panel.add(fieldPanel,BorderLayout.CENTER);\r
+\r
+\r
+ labelPanel.add(new JLabel("Value test:"));\r
+ fieldPanel.add(valueTestField);\r
+ labelPanel.add(new JLabel("Value presentation:"));\r
+ fieldPanel.add(valuePresentationField);\r
+ labelPanel.add(new JLabel("Format name:"));\r
+ fieldPanel.add(formatNameField);\r
+ labelPanel.add(new JLabel("Format pattern:"));\r
+ fieldPanel.add(formatPatternField);\r
+\r
+ add(panel,BorderLayout.NORTH);\r
+ // add(new JLabel("Format scale:"));\r
+ // add(formatScaleField);\r
+\r
+ JPanel listPanel = new JPanel();\r
+ add(listPanel,BorderLayout.CENTER);\r
+ JTable table = createFormatTable();\r
+ JScrollPane scrollPane = new JScrollPane(table);\r
+ table.setFillsViewportHeight(true);\r
+\r
+ listPanel.add(scrollPane);\r
+\r
+ JPanel controlPanel = new JPanel();\r
+ add(controlPanel,BorderLayout.SOUTH);\r
+ controlPanel.setLayout(new FlowLayout(FlowLayout.LEFT));\r
+\r
+ JButton addTemplateButton = new JButton("Add Format Template");\r
+ addTemplateButton.setToolTipText("Add current format to templates");\r
+ controlPanel.add(addTemplateButton);\r
+ addTemplateButton.addActionListener(new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+ addTemplate();\r
+ }\r
+ });\r
+\r
+ JButton removeTemplateButton = new JButton("Remove Template");\r
+ removeTemplateButton.setToolTipText("Remove selected template");\r
+ controlPanel.add(removeTemplateButton);\r
+ removeTemplateButton.addActionListener(new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+ removeTemplate();\r
+ }\r
+ });\r
+\r
+ JButton updateTemplateButton = new JButton("Update Template");\r
+ updateTemplateButton.setToolTipText("Update selected template using current format");\r
+ controlPanel.add(updateTemplateButton);\r
+ updateTemplateButton.addActionListener(new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+ updateTemplate();\r
+ }\r
+ });\r
+\r
+ JButton newFormatButton = new JButton("New Format");\r
+ newFormatButton.setToolTipText("Create a new Format");\r
+ controlPanel.add(newFormatButton);\r
+ newFormatButton.addActionListener(new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+ newFormat();\r
+ }\r
+ });\r
+\r
+\r
+ valuePresentationField.setEditable(false);\r
+\r
+ ActionListener l = new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ updateValues();\r
+\r
+ }\r
+ };\r
+\r
+ valueTestField.addActionListener(l);\r
+ formatPatternField.addActionListener(l);\r
+\r
+ valueTestField.setText("123456.789");\r
+ formatPatternField.setText("%s");\r
+\r
+ updateValues();\r
+ }\r
+\r
+ private void addTemplate() {\r
+ MetricsFormat format = createMetricsFormatFromFields();\r
+\r
+ try {\r
+ formatList.addFormat(format);\r
+ } catch (Exception e) {\r
+ // TODO : show error\r
+ }\r
+ }\r
+\r
+ private void updateTemplate() {\r
+ int index = formatTable.getSelectedRow();\r
+ if (index == -1)\r
+ return; // TODO : show error, or even better, disable the button\r
+ MetricsFormat format = createMetricsFormatFromFields();\r
+ try {\r
+ formatList.replaceFormatWith(formatList.getFormats()[index], format);\r
+ } catch (Exception e) {\r
+ // TODO : show error\r
+ }\r
+ }\r
+\r
+ private void removeTemplate() {\r
+ int index = formatTable.getSelectedRow();\r
+ if (index == -1)\r
+ return; // TODO : show error, or even better, disable the button\r
+ try {\r
+ formatList.removeFormat(formatList.getFormats()[index]);\r
+ } catch (Exception e) {\r
+ // TODO : show error\r
+ }\r
+ }\r
+\r
+ public MetricsFormat getFormat() {\r
+ return format;\r
+ }\r
+\r
+ private void newFormat() {\r
+ format = null;\r
+ formatNameField.setText("New format");\r
+ formatPatternField.setText("%s");\r
+ updateValues();\r
+ }\r
+\r
+ private JTable createFormatTable() {\r
+ formatList = MetricsFormatList.getList();\r
+ tableModel = new MetricsTableModel(formatList);\r
+\r
+ formatTable = new JTable(tableModel);\r
+ formatTable.doLayout();\r
+\r
+ formatTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+\r
+ formatTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {\r
+\r
+ @Override\r
+ public void valueChanged(ListSelectionEvent e) {\r
+ if (e.getValueIsAdjusting())\r
+ return;\r
+ int index = formatTable.getSelectionModel().getMinSelectionIndex();\r
+ if (index == -1)\r
+ return;\r
+ setMetricsFormat(formatList.getFormats()[index]);\r
+\r
+ }\r
+ });\r
+ return formatTable;\r
+ }\r
+\r
+ private void updateValues() {\r
+ String value = valueTestField.getText();\r
+ if (value == null || value.length() == 0)\r
+ return;\r
+ Double d = null;\r
+ try {\r
+ d = Double.parseDouble(value);\r
+ } catch (NumberFormatException e) {\r
+ valuePresentationField.setText("Value test is not a number");\r
+ return;\r
+ }\r
+ formatValue = d;\r
+\r
+ MetricsFormat format = null;\r
+ try {\r
+ format = createMetricsFormatFromFields();\r
+ } catch (Exception e) {\r
+ valuePresentationField.setText("Format pattern is not correct " + e.getMessage());\r
+ }\r
+ if (format == null)\r
+ return; // TODO : show error\r
+ setMetricsFormat(format);\r
+ tableModel.setFormatValue(formatValue);\r
+ }\r
+\r
+ private MetricsFormat createMetricsFormatFromFields() {\r
+ if (formatPatternField.getText().length() == 0)\r
+ return null;\r
+ return new MetricsFormat(formatPatternField.getText(),1.0,formatNameField.getText());\r
+ }\r
+\r
+ public void setMetricsFormat(MetricsFormat format) {\r
+ this.format = format;\r
+ try {\r
+ valuePresentationField.setText(format.formatValue(formatValue));\r
+ } catch (Exception e) {\r
+ valuePresentationField.setText("Format error: " + e.getMessage());\r
+ }\r
+ formatNameField.setText(format.getName());\r
+ formatPatternField.setText(format.getPattern());\r
+ }\r
+\r
+ public void dispose() {\r
+ tableModel.dispose();\r
+ }\r
+\r
+ private class MetricsTableModel implements TableModel, MetricsFormatListListener {\r
+\r
+ private String[] columnNames = {"Name","Format","Value"};\r
+ private MetricsFormatList formatList;\r
+ private double formatValue = 0;\r
+\r
+ public MetricsTableModel(MetricsFormatList formatList) {\r
+ this.formatList = formatList;\r
+ this.formatList.addListener(this);\r
+ }\r
+\r
+ public void setFormatValue(double value) {\r
+ this.formatValue = value;\r
+ fireChanged();\r
+ }\r
+\r
+ @Override\r
+ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {\r
+ // do nothing\r
+ }\r
+\r
+ @Override\r
+ public boolean isCellEditable(int rowIndex, int columnIndex) {\r
+ return false;\r
+ }\r
+\r
+ @Override\r
+ public Object getValueAt(int rowIndex, int columnIndex) {\r
+ MetricsFormat format = formatList.getFormats()[rowIndex];\r
+ if (columnIndex == 0) {\r
+ return format.getName();\r
+ } else if (columnIndex == 1) {\r
+ return format.getPattern();\r
+ } else if (columnIndex == 2) {\r
+ return format.formatValue(formatValue);\r
+ }\r
+ throw new IndexOutOfBoundsException("There is no column " + columnIndex);\r
+ }\r
+\r
+ @Override\r
+ public int getRowCount() {\r
+ return formatList.getFormats().length;\r
+ }\r
+\r
+ @Override\r
+ public String getColumnName(int columnIndex) {\r
+ return columnNames[columnIndex];\r
+ }\r
+\r
+ @Override\r
+ public int getColumnCount() {\r
+ return columnNames.length;\r
+ }\r
+\r
+ @Override\r
+ public Class<?> getColumnClass(int columnIndex) {\r
+ return String.class;\r
+ }\r
+\r
+ private List<TableModelListener> listeners = new ArrayList<TableModelListener>();\r
+\r
+ @Override\r
+ public void addTableModelListener(TableModelListener l) {\r
+ listeners.add(l);\r
+ }\r
+\r
+ @Override\r
+ public void removeTableModelListener(TableModelListener l) {\r
+ listeners.remove(l);\r
+ }\r
+\r
+ @Override\r
+ public void onListChanged(MetricsFormatList sender) {\r
+ fireChanged();\r
+ }\r
+\r
+ private void fireChanged() {\r
+ for (TableModelListener l : listeners) {\r
+ l.tableChanged(new TableModelEvent(this));\r
+ }\r
+ }\r
+\r
+ public void dispose() {\r
+ formatList.removeListener(this);\r
+ }\r
+ }\r
+}\r