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}