/*
* AnnotationDialog.java
*
* Copyright (C) 2006-2014 Andrew Rambaut
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package figtree.treeviewer.annotations;
import jam.panels.OptionsPanel;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.event.*;
import java.util.*;
import jebl.util.Attributable;
import figtree.ui.components.WholeNumberField;
import figtree.ui.components.RealNumberField;
import figtree.treeviewer.ExtendedTreeViewer;
/**
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class AnnotationDialog {
public final static String CREATE_NEW = "Create new...";
private JFrame frame;
private OptionsPanel options;
private JComboBox annotationCombo;
private Attributable item;
private List<AnnotationDefinition> definitions;
private JComponent component = null;
private JComponent component2 = null;
AnnotationDefinition definition = null;
public AnnotationDialog(JFrame frame) {
this.frame = frame;
}
public int showDialog(List<AnnotationDefinition> definitions, Attributable item) {
this.definitions = definitions;
this.item = item;
options = new OptionsPanel(6, 6);
annotationCombo = new JComboBox(definitions.toArray());
// todo This requires a bit more work so has been disabled for now...
// annotationCombo.addItem(CREATE_NEW);
annotationCombo.setSelectedIndex(0);
setupOptionsPanel();
JOptionPane optionPane = new JOptionPane(options,
JOptionPane.QUESTION_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null,
null,
null);
optionPane.setBorder(new EmptyBorder(12, 12, 12, 12));
final JDialog dialog = optionPane.createDialog(frame, "Annotate Selection");
dialog.pack();
annotationCombo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
setupOptionsPanel();
dialog.pack();
}});
dialog.setVisible(true);
int result = JOptionPane.CANCEL_OPTION;
Integer value = (Integer)optionPane.getValue();
if (value != null && value.intValue() != -1) {
result = value.intValue();
}
return result;
}
private void setupOptionsPanel() {
definition = getDefinition();
options.removeAll();
options.addComponentWithLabel("Annotation:", annotationCombo);
if (definition == null) {
// Create new has been selected
final JTextField nameField = new JTextField();
nameField.setColumns(24);
options.addComponentWithLabel("Name:", nameField);
final JComboBox typeCombo = new JComboBox(new Object[] {
AnnotationDefinition.Type.INTEGER,
AnnotationDefinition.Type.REAL,
AnnotationDefinition.Type.STRING,
AnnotationDefinition.Type.BOOLEAN,
AnnotationDefinition.Type.RANGE
});
options.addComponentWithLabel("Type:", typeCombo);
typeCombo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
definition = new AnnotationDefinition(nameField.getText(), (AnnotationDefinition.Type)typeCombo.getSelectedItem());
setupValues();
}});
typeCombo.setSelectedIndex(0);
} else {
setupValues();
}
}
private void setupValues() {
Object value = null;
if (item != null) {
value = item.getAttribute(definition.getCode());
}
component2 = null;
switch (definition.getType()) {
case BOOLEAN:
component = new JComboBox(new String[] { "True", "False" });
if (value != null) {
((JComboBox)component).setSelectedIndex(value.equals(Boolean.TRUE) ? 0 : 1);
}
options.addComponentWithLabel("Value:", component);
break;
case INTEGER:
component = new WholeNumberField();
options.addComponentWithLabel("Value:", component);
((WholeNumberField)component).setColumns(12);
if (value != null) {
((WholeNumberField)component).setValue((Integer)value);
}
break;
case REAL:
component = new RealNumberField();
options.addComponentWithLabel("Value:", component);
((RealNumberField)component).setColumns(12);
if (value != null) {
((RealNumberField)component).setValue((Double)value);
}
break;
case STRING:
component = new JTextField();
options.addComponentWithLabel("Value:", component);
((JTextField)component).setColumns(20);
if (value != null) {
((JTextField)component).setText((String)value);
}
break;
case RANGE:
component = new RealNumberField();
((RealNumberField)component).setColumns(12);
options.addComponentWithLabel("Lower:", component);
component2 = new RealNumberField();
((RealNumberField)component2).setColumns(12);
options.addComponentWithLabel("Upper:", component2);
if (value != null) {
((RealNumberField)component).setValue((Double)((Object[])value)[0]);
((RealNumberField)component2).setValue((Double)((Object[])value)[1]);
}
break;
default:
throw new IllegalArgumentException("Unrecognised enum value");
}
// if (definition.getValues() != null) {
// valuesCombo = new JComboBox(definition.getValues());
// options.addComponentWithLabel("Value:", valuesCombo);
// }
}
public AnnotationDefinition getDefinition() {
if (annotationCombo.getSelectedItem().equals(CREATE_NEW)) {
return null;
}
return (AnnotationDefinition)annotationCombo.getSelectedItem();
}
public Object getValue() {
AnnotationDefinition definition = getDefinition();
switch (definition.getType()) {
case BOOLEAN:
return new Boolean(((JComboBox)component).getSelectedItem().toString());
case INTEGER:
return ((WholeNumberField)component).getValue();
case REAL:
return ((RealNumberField)component).getValue();
case STRING:
String value = ((JTextField)component).getText().trim();
if (value.length() == 0) {
return null;
}
return value;
case RANGE:
double lower = ((RealNumberField)component).getValue();
double upper = ((RealNumberField)component2).getValue();
return new Double[] { lower, upper };
default:
throw new IllegalArgumentException("Unrecognised enum value");
}
}
}