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}