package hep.aida.ref.plotter.style.editor; import hep.aida.ref.AidaUtils; import hep.aida.ref.plotter.RevolvingColorStyleParameter; import hep.aida.ref.plotter.RevolvingStyleParameter; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.border.EtchedBorder; import org.freehep.application.studio.Studio; import org.freehep.swing.ColorConverter; public class StylePropertyEditColumnEditor extends DefaultCellEditor { static int minTextFieldLength = 20; static int maxTextFieldLength = 80; protected Studio app; protected StylePropertyState oldValue; protected StylePropertyState currentValue; protected JButton button; protected JTextField valueField; protected JTextField defaultField; protected JTextField optionsField; protected JButton valColor; protected JButton defColor; private JColorChooser colorChooser; private JDialog colorChooserDialog; private OkListener okListener; private boolean addColor; protected JPanel panel; protected StylePropertyTable table; protected int row; protected int column; public StylePropertyEditColumnEditor(StylePropertyTable table, int row, int column) { super(new JCheckBox()); this.app = (Studio) Studio.getApplication(); this.table = table; this.row = row; this.column = column; this.currentValue = new StylePropertyState(); setClickCountToStart(1); //System.out.println("Editor("+row+", "+column+")"); //Must do this so that editing stops when appropriate. button = new JButton(StylePropertyTableModel.EDIT_COLUMN_TEXT); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { editValue(); fireEditingStopped(); } }); editorComponent = button; } protected void fireEditingStopped() { super.fireEditingStopped(); } public Object getCellEditorValue() { return "Edit..."; } protected void createPanel() { if (panel != null) return; defaultField = new JTextField(minTextFieldLength); valueField = new JTextField(minTextFieldLength); optionsField = new JTextField(2*minTextFieldLength); valColor = new JButton("Color"); valColor.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Class t = currentValue.type; if (t == RevolvingStyleParameter.class || t == RevolvingColorStyleParameter.class) { addColor = true; chooseColor(valueField); } else { addColor = false; chooseColor(valueField); } } }); defColor = new JButton("Color"); defColor.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Class t = currentValue.type; if (t == RevolvingStyleParameter.class || t == RevolvingColorStyleParameter.class) { addColor = true; chooseColor(defaultField); } else { addColor = false; chooseColor(defaultField); } } }); java.awt.GridBagConstraints gbc = new java.awt.GridBagConstraints(); gbc.anchor = java.awt.GridBagConstraints.WEST; gbc.insets = new java.awt.Insets(2, 2, 2, 2); JPanel panel1 = new JPanel(); panel1.setLayout(new java.awt.GridBagLayout()); gbc.gridy=0; gbc.gridx=0; panel1.add(new JLabel("Current Value: "), gbc); gbc.gridx=1; panel1.add(valueField, gbc); gbc.gridx=2; panel1.add(valColor, gbc); gbc.gridy=1; gbc.gridx=0; panel1.add(new JLabel("Default Value: "), gbc); gbc.gridx=1; panel1.add(defaultField, gbc); gbc.gridx=2; panel1.add(defColor, gbc); JPanel panel2 = new JPanel(); panel2.setLayout(new java.awt.GridBagLayout()); gbc.gridy=0; gbc.gridx=0; panel2.add(new JLabel("Possible Values: "), gbc); gbc.gridx=1; panel2.add(optionsField, gbc); panel = new JPanel(); panel.setBorder(new EtchedBorder()); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(panel1); panel.add(panel2); } public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { return editorComponent; } // Get current value from the property public void getPropertyValue() { Object value = table.getValueAt(row, StylePropertyTableModel.VALUE_COLUMN); String valueString = null; if (value instanceof StylePropertyState) valueString = ((StylePropertyState) value).toString(true); else if (value != null) valueString = value.toString(); //System.out.println("Editor.setValue :: equals="+currentValue.equals(value)+", newValue: "+valueString); oldValue = new StylePropertyState(currentValue); if (value == null) currentValue.clear(); else currentValue = (StylePropertyState) value; Class t = currentValue.type; if (t == Color.class || t == RevolvingColorStyleParameter.class) { valColor.setEnabled(true); valColor.setVisible(true); defColor.setEnabled(true); defColor.setVisible(true); currentValue.values = null; optionsField.setEditable(false); } else if (t == RevolvingStyleParameter.class) { valColor.setEnabled(false); valColor.setVisible(false); defColor.setEnabled(false); defColor.setVisible(false); currentValue.values = null; optionsField.setEditable(false); } else { valColor.setEnabled(false); valColor.setVisible(false); defColor.setEnabled(false); defColor.setVisible(false); optionsField.setEditable(true); } } // Set modified value back in the table public void setPropertyValue() { //System.out.println("Editor.getValue :: "+currentValue.toString(true)); table.setValueAt(new StylePropertyState(currentValue), row, StylePropertyTableModel.VALUE_COLUMN); } // Sets Swing components according to the new currentValue public void resetComponents() { String valueString = ""; if (currentValue.values != null) { for (int i=0; i<currentValue.values.length; i++) { String val = ""; Object tmp = currentValue.values[i]; if (tmp instanceof String) val = (String) tmp; else if (tmp instanceof Color) val = ColorConverter.get((Color) tmp); else if (tmp != null) val = tmp.toString(); else continue; if (val != null && !val.trim().equals("")) valueString += "\"" + val + "\", "; } } optionsField.setText(valueString.trim()); if (valueString.length() > minTextFieldLength && valueString.length() < maxTextFieldLength) optionsField.setColumns(valueString.length() + 10); String val = ""; String def = ""; if (currentValue != null) { Object tmp = currentValue.currentValue; if (tmp instanceof String) val = (String) tmp; else if (tmp instanceof Color) val = ColorConverter.get((Color) tmp); else if (tmp != null) val = tmp.toString(); tmp = currentValue.defaultValue; if (tmp instanceof String) def = (String) tmp; else if (tmp instanceof Color) def = ColorConverter.get((Color) tmp); else if (tmp != null) def = tmp.toString(); } valueField.setText(val); defaultField.setText(def); if (val.length() > minTextFieldLength && val.length() < maxTextFieldLength) valueField.setColumns(val.length() + 10); if (def.length() > minTextFieldLength && def.length() < maxTextFieldLength) defaultField.setColumns(def.length() + 10); } // Sets currentValue after the user input public void resetValue() throws Exception { String val = null; String def = null; String[] opt = null; String tmp = defaultField.getText().trim(); if (tmp.equals("")) { tmp = null; } def = tmp; tmp = optionsField.getText().trim(); String[] strArray = null; if (tmp != null && !tmp.equals("")) { strArray = AidaUtils.parseString(tmp); } opt = strArray; tmp = valueField.getText().trim(); if (tmp.equals("")) { tmp = null; } val = tmp; checkInput(val, def, opt); currentValue.values = opt; currentValue.defaultValue = def; currentValue.currentValue = val; } protected void editValue() { if (panel == null) createPanel(); getPropertyValue(); resetComponents(); String title ="Edit Style Property"; boolean wrongInput = true; while (wrongInput) { int reply = JOptionPane.showOptionDialog(button, panel, title, JOptionPane.YES_NO_OPTION, JOptionPane.DEFAULT_OPTION, null, new String[] {"Ok", "Cancel"}, "Cancel"); try { if (reply == JOptionPane.YES_OPTION) { oldValue = new StylePropertyState(currentValue); resetValue(); resetComponents(); setPropertyValue(); } else { resetComponents(); } wrongInput = false; } catch (Exception e) { if (app != null) app.error("Wrong input: \n\t"+e.getMessage(), e); String message = "Error: "+e.getMessage(); e.printStackTrace(); } //((AbstractTableModel) table.getModel()).fireTableDataChanged(); } } // Does type checking for string input protected void checkInput(String val, String def, String[] opt) throws Exception { Class t = currentValue.type; if (t == null || t == String.class || t == Boolean.TYPE) return; if (t == Double.TYPE) { double v, d, o; if (val != null) v = Double.parseDouble(val); if (def != null) d = Double.parseDouble(def); if (opt != null) for(int i=0; i<opt.length; i++) o = Double.parseDouble(opt[i]); } else if (t == Float.TYPE) { float v, d, o; if (val != null) v = Float.parseFloat(val); if (def != null) d = Float.parseFloat(def); if (opt != null) for(int i=0; i<opt.length; i++) o = Float.parseFloat(opt[i]); } else if (t == Integer.TYPE) { int v, d, o; if (val != null) v = Integer.parseInt(val); if (def != null) d = Integer.parseInt(def); if (opt != null) for(int i=0; i<opt.length; i++) o = Integer.parseInt(opt[i]); } else if (t == Color.class) { Color v, d, o; if (val != null) v = ColorConverter.get(val); if (def != null) d = ColorConverter.get(def); if (opt != null) for(int i=0; i<opt.length; i++) o = ColorConverter.get(opt[i]); } } // Color Chooser protected void chooseColor(JTextField field) { String title = "Choose Color"; Color initialColor = null; if (okListener == null) { okListener = new OkListener(field); } else { okListener.setField(field); } if (colorChooserDialog == null) { colorChooser = ColorConverter.getColorChooser(); colorChooserDialog = colorChooser.createDialog(panel, title, true, colorChooser, okListener, null); colorChooserDialog.pack(); } colorChooserDialog.setVisible(true); } protected void okAction(JTextField field) { try { Color selectedColor = colorChooser.getColor(); String colorString = ColorConverter.get(selectedColor); if (colorString != null && !colorString.trim().equals("")) { if (addColor) { String tmp = field.getText(); if (tmp == null) tmp = ""; tmp += ", \"" + colorString + "\""; field.setText(tmp); } else { field.setText(colorString); } } } catch (Exception e) { e.printStackTrace(); } } private class OkListener implements ActionListener { private JTextField field; OkListener(JTextField field) { this.field = field; } private void setField(JTextField field) { this.field = field; } public void actionPerformed(ActionEvent e) { okAction(field); } } }