001package org.openstreetmap.gui.jmapviewer.checkBoxTree; 002 003import java.awt.Color; 004import java.awt.Component; 005import java.awt.Font; 006import java.awt.event.ActionEvent; 007import java.awt.event.ActionListener; 008import java.awt.event.MouseAdapter; 009 010import javax.swing.JMenuItem; 011import javax.swing.JPopupMenu; 012import javax.swing.JTree; 013import javax.swing.UIManager; 014import javax.swing.tree.DefaultMutableTreeNode; 015import javax.swing.tree.DefaultTreeCellRenderer; 016import javax.swing.tree.TreeCellRenderer; 017 018import org.openstreetmap.gui.jmapviewer.AbstractLayer; 019import org.openstreetmap.gui.jmapviewer.LayerGroup; 020 021/** 022 * Renderer for checkBox Tree 023 * 024 * @author galo 025 */ 026public class CheckBoxNodeRenderer implements TreeCellRenderer{ 027 028 private final CheckBoxNodePanel panel = new CheckBoxNodePanel(); 029 private final DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); 030 private final Color selectionForeground, selectionBackground; 031 private final Color textForeground, textBackground; 032 033 protected CheckBoxNodePanel getPanel() { 034 return panel; 035 } 036 037 public CheckBoxNodeRenderer() { 038 final Font fontValue = UIManager.getFont("Tree.font"); 039 if (fontValue != null) panel.getLabel().setFont(fontValue); 040 041 final Boolean focusPainted = 042 (Boolean) UIManager.get("Tree.drawsFocusBorderAroundIcon"); 043 panel.check.setFocusPainted(focusPainted != null && focusPainted); 044 045 selectionForeground = UIManager.getColor("Tree.selectionForeground"); 046 selectionBackground = UIManager.getColor("Tree.selectionBackground"); 047 textForeground = UIManager.getColor("Tree.textForeground"); 048 textBackground = UIManager.getColor("Tree.textBackground"); 049 } 050 public void addNodeListener(MouseAdapter listener){ 051 panel.addMouseListener(listener); 052 } 053 // -- TreeCellRenderer methods -- 054 055 @Override 056 public Component getTreeCellRendererComponent(final JTree tree, 057 final Object value, final boolean selected, final boolean expanded, 058 final boolean leaf, final int row, final boolean hasFocus) 059 { 060 CheckBoxNodeData data = null; 061 if (value instanceof DefaultMutableTreeNode) { 062 final DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 063 final Object userObject = node.getUserObject(); 064 if (userObject instanceof CheckBoxNodeData) { 065 data = (CheckBoxNodeData) userObject; 066 } 067 } 068 069 //final String stringValue = 070 // tree.convertValueToText(value, selected, expanded, leaf, row, false); 071 //panel.label.setText(stringValue); 072 073 panel.setSelected(false); 074 075 panel.setEnabled(tree.isEnabled()); 076 077 if (selected) { 078 panel.setForeground(selectionForeground); 079 panel.setBackground(selectionBackground); 080 panel.getLabel().setForeground(selectionForeground); 081 panel.getLabel().setBackground(selectionBackground); 082 } 083 else { 084 panel.setForeground(textForeground); 085 panel.setBackground(textBackground); 086 panel.getLabel().setForeground(textForeground); 087 panel.getLabel().setBackground(textBackground); 088 } 089 090 if (data == null) { 091 // not a check box node; return default cell renderer 092 return defaultRenderer.getTreeCellRendererComponent(tree, value, 093 selected, expanded, leaf, row, hasFocus); 094 } 095 096 //panel.label.setText(data.getText()); 097 panel.setData(data); 098 panel.setSelected(data.isSelected()); 099 100 return panel; 101 } 102 private JPopupMenu createPopupMenu(final AbstractLayer layer) { 103 JMenuItem menuItem; 104 105 //Create the popup menu. 106 if(layer.isVisibleTexts()) menuItem = new JMenuItem("hide texts"); 107 else menuItem = new JMenuItem("show texts"); 108 JPopupMenu popup = new JPopupMenu(); 109 popup.add(menuItem); 110 menuItem.addActionListener(new ActionListener(){ 111 @Override 112 public void actionPerformed(ActionEvent arg0) { 113 setVisibleTexts(layer, !layer.isVisibleTexts()); 114 } 115 }); 116 117 return popup; 118 } 119 private void setVisibleTexts(AbstractLayer layer, boolean visible){ 120 layer.setVisibleTexts(visible); 121 if(layer instanceof LayerGroup){ 122 LayerGroup group = (LayerGroup)layer; 123 if(group.getLayers()!=null) for(AbstractLayer al: group.getLayers()) setVisibleTexts(al, visible); 124 } 125 } 126}