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