001// License: GPL. For details, see Readme.txt file.
002package org.openstreetmap.gui.jmapviewer.checkBoxTree;
003
004import java.awt.Component;
005import java.awt.event.ItemEvent;
006import java.awt.event.ItemListener;
007import java.awt.event.MouseAdapter;
008import java.awt.event.MouseEvent;
009import java.util.EventObject;
010
011import javax.swing.AbstractCellEditor;
012import javax.swing.JTree;
013import javax.swing.tree.DefaultMutableTreeNode;
014import javax.swing.tree.TreeCellEditor;
015import javax.swing.tree.TreePath;
016
017/**
018 * Editor for checkBox Tree
019 *
020 * @author galo
021 */
022public class CheckBoxNodeEditor extends AbstractCellEditor implements TreeCellEditor {
023    /** SerialVersionUID */
024    private static final long serialVersionUID = -8921320784224636657L;
025
026    private final CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
027
028    private final CheckBoxTree theTree;
029
030    public CheckBoxNodeEditor(final CheckBoxTree tree) {
031        theTree = tree;
032    }
033
034    @Override
035    public Object getCellEditorValue() {
036        final CheckBoxNodePanel panel = renderer.getPanel();
037        /*final CheckBoxNodeData checkBoxNode =
038            new CheckBoxNodeData(panel.label.getText(), panel.check.isSelected());
039        return checkBoxNode;
040        CheckBoxNodeData data = search(theTree.rootNode(), panel.label.getText());
041        data.setSelected(panel.check.isSelected());*/
042        return panel.getData();
043    }
044    /*public CheckBoxNodeData search(DefaultMutableTreeNode node, String name){
045        CheckBoxNodeData data = CheckBoxTree.data(node);
046        if(data.getText().equals(name)) return data;
047        else{
048            data = null;
049            for(int i=0; i<node.getChildCount() && data==null; i++){
050                data = search((DefaultMutableTreeNode)node.getChildAt(i), name);
051            }
052            return data;
053        }
054    }*/
055
056    public void addNodeListener(MouseAdapter listener) {
057        renderer.addNodeListener(listener);
058    }
059
060    @Override
061    public boolean isCellEditable(final EventObject event) {
062        if (!(event instanceof MouseEvent)) return false;
063        final MouseEvent mouseEvent = (MouseEvent) event;
064
065        final TreePath path =
066            theTree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());
067        if (path == null) return false;
068
069        final Object node = path.getLastPathComponent();
070        if (!(node instanceof DefaultMutableTreeNode)) return false;
071        final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
072
073        final Object userObject = treeNode.getUserObject();
074        return userObject instanceof CheckBoxNodeData;
075    }
076
077    @Override
078    public Component getTreeCellEditorComponent(final JTree tree,
079        final Object value, final boolean selected, final boolean expanded,
080        final boolean leaf, final int row) {
081
082        final Component editor =
083            renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf,
084                row, true);
085
086        // editor always selected / focused
087        final ItemListener itemListener = new ItemListener() {
088
089            @Override
090            public void itemStateChanged(final ItemEvent itemEvent) {
091                if (stopCellEditing()) {
092                    fireEditingStopped();
093                }
094            }
095        };
096        if (editor instanceof CheckBoxNodePanel) {
097            final CheckBoxNodePanel panel = (CheckBoxNodePanel) editor;
098            panel.check.addItemListener(itemListener);
099        }
100
101        return editor;
102    }
103}