// License: GPL. For details, see Readme.txt file.
package org.openstreetmap.gui.jmapviewer.checkBoxTree;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreePath;
/**
* Editor for checkBox Tree
*
* @author galo
*/
public class CheckBoxNodeEditor extends AbstractCellEditor implements TreeCellEditor {
/** SerialVersionUID */
private static final long serialVersionUID = -8921320784224636657L;
private final CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
private final CheckBoxTree theTree;
public CheckBoxNodeEditor(final CheckBoxTree tree) {
theTree = tree;
}
@Override
public Object getCellEditorValue() {
final CheckBoxNodePanel panel = renderer.getPanel();
/*final CheckBoxNodeData checkBoxNode =
new CheckBoxNodeData(panel.label.getText(), panel.check.isSelected());
return checkBoxNode;
CheckBoxNodeData data = search(theTree.rootNode(), panel.label.getText());
data.setSelected(panel.check.isSelected());*/
return panel.getData();
}
/*public CheckBoxNodeData search(DefaultMutableTreeNode node, String name){
CheckBoxNodeData data = CheckBoxTree.data(node);
if(data.getText().equals(name)) return data;
else{
data = null;
for(int i=0; i<node.getChildCount() && data==null; i++){
data = search((DefaultMutableTreeNode)node.getChildAt(i), name);
}
return data;
}
}*/
public void addNodeListener(MouseAdapter listener) {
renderer.addNodeListener(listener);
}
@Override
public boolean isCellEditable(final EventObject event) {
if (!(event instanceof MouseEvent)) return false;
final MouseEvent mouseEvent = (MouseEvent) event;
final TreePath path =
theTree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());
if (path == null) return false;
final Object node = path.getLastPathComponent();
if (!(node instanceof DefaultMutableTreeNode)) return false;
final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
final Object userObject = treeNode.getUserObject();
return userObject instanceof CheckBoxNodeData;
}
@Override
public Component getTreeCellEditorComponent(final JTree tree,
final Object value, final boolean selected, final boolean expanded,
final boolean leaf, final int row) {
final Component editor =
renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf,
row, true);
// editor always selected / focused
final ItemListener itemListener = new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof CheckBoxNodePanel) {
final CheckBoxNodePanel panel = (CheckBoxNodePanel) editor;
panel.check.addItemListener(itemListener);
}
return editor;
}
}