package com.jgraph.example.mycellmodeleditor;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.CellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
/**
* A basic example JComponent to in place edit both the cell model (user object)
* and the cell label. First of all you have the opportunity to edit the cell
* label. Also you can choose the cell user object inside a JTree. A JTree is
* fine to allow the user to choose within a hierarchy, but you could have
* choosen a combo box instead for instance. You can choose whether you want to
* use the label feature or if you rather prefer to use the toString method of
* the user object instead. Finally you can confirm or cancel your choice.
*
* @author rvalyi
*/
public class MyEditorComponent extends JComponent implements ActionListener,
ItemListener, TreeSelectionListener {
private static JPanel labelPanel = new JPanel();
private static JPanel modelPanel = new JPanel();
private static JPanel actionPanel = new JPanel();
private static JButton okButton = new JButton("OK");
private static JButton cancelButton = new JButton("Cancel");
private static JCheckBox useModelLabel = new JCheckBox("use model label");
private static JTextField labelField = new JTextField();
private static JTree chooserTree = new JTree();
/**
* A temporary clone of the business object to work with before commiting
* the change (allows to undo).
*/
private static BusinessObjectWrapper newModel;
/**
* the old user object
*/
private static BusinessObjectWrapper oldModel;
/**
* a reference to the editor: here we only use it to force the end of the
* editing after the OK button or Cancel button is pressed
*/
public static CellEditor cellEditor;
public MyEditorComponent(CellEditor cellEditor) {
MyEditorComponent.cellEditor = cellEditor;
labelField.setColumns(10);
labelPanel.add(labelField);
labelPanel.add(useModelLabel);
modelPanel.add(chooserTree);
actionPanel.add(okButton);
actionPanel.add(cancelButton);
okButton.addActionListener(this);
cancelButton.addActionListener(this);
okButton.setActionCommand("ok");
cancelButton.setActionCommand("cancel");
this.setLayout(new BorderLayout());
this.add(labelPanel, BorderLayout.NORTH);
this.add(new JScrollPane(modelPanel), BorderLayout.CENTER);
this.add(actionPanel, BorderLayout.SOUTH);
chooserTree.addTreeSelectionListener(this);
chooserTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
useModelLabel.addItemListener(this);
}
/**
* the editor is lightweight so you need to install the graph cell
* properties before using it.
*
* @param value
*/
public void installValue(BusinessObjectWrapper value) {
oldModel = value;
newModel = value;
labelField.setText(new String(newModel.getLabel()));
labelField.setEnabled(true);
useModelLabel.setSelected(false);
chooserTree.setSelectionPath(null);
if (newModel.getValue() != null)
chooserTree.setSelectionPath(new TreePath(
((DefaultTreeModel) chooserTree.getModel())
.getPathToRoot(newModel.getValue())));
}
public BusinessObjectWrapper getValue() {
return oldModel;
}
/**
* Unique action entry point dispatching several component specific actions
*/
public void actionPerformed(ActionEvent e) {
if ("ok".equals(e.getActionCommand())) {
oldModel = newModel;
oldModel.setLabel(labelField.getText());
cellEditor.stopCellEditing();
} else {
cellEditor.stopCellEditing();
}
}
/**
* the tree selection listener
*/
public void valueChanged(TreeSelectionEvent e) {
if (chooserTree.isSelectionEmpty())
return;
TreePath[] treeSelection = chooserTree.getSelectionModel()
.getSelectionPaths();
newModel.setValue((DefaultMutableTreeNode) treeSelection[0]
.getLastPathComponent());
if (!useModelLabel.isSelected()) {
newModel.setLabel(treeSelection[0].getLastPathComponent()
.toString());
labelField.setText(newModel.toString());
}
}
/**
* the checkbox listener
*/
public void itemStateChanged(ItemEvent e) {
if (!useModelLabel.isSelected()) {
if (newModel.getValue() != null)
labelField.setText(newModel.getValue().toString());
labelField.setEnabled(false);
} else {
labelField.setEnabled(true);
labelPanel.requestFocus();
}
}
}