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}