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    public void addNodeListener(MouseAdapter listener){
056        renderer.addNodeListener(listener);
057    }
058    @Override
059    public boolean isCellEditable(final EventObject event) {
060        if (!(event instanceof MouseEvent)) return false;
061        final MouseEvent mouseEvent = (MouseEvent) event;
062
063        final TreePath path =
064            theTree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());
065        if (path == null) return false;
066
067        final Object node = path.getLastPathComponent();
068        if (!(node instanceof DefaultMutableTreeNode)) return false;
069        final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
070
071        final Object userObject = treeNode.getUserObject();
072        return userObject instanceof CheckBoxNodeData;
073    }
074
075    @Override
076    public Component getTreeCellEditorComponent(final JTree tree,
077        final Object value, final boolean selected, final boolean expanded,
078        final boolean leaf, final int row)
079    {
080
081        final Component editor =
082            renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf,
083                row, true);
084
085        // editor always selected / focused
086        final ItemListener itemListener = new ItemListener() {
087
088            @Override
089            public void itemStateChanged(final ItemEvent itemEvent) {
090                if (stopCellEditing()) {
091                    fireEditingStopped();
092                }
093            }
094        };
095        if (editor instanceof CheckBoxNodePanel) {
096            final CheckBoxNodePanel panel = (CheckBoxNodePanel) editor;
097            panel.check.addItemListener(itemListener);
098        }
099
100        return editor;
101    }
102}