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}