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}