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