001package org.openstreetmap.gui.jmapviewer;
002
003import java.awt.BorderLayout;
004import java.awt.Dimension;
005import java.awt.event.ActionEvent;
006import java.awt.event.ActionListener;
007import java.awt.event.MouseAdapter;
008import java.awt.event.MouseEvent;
009import java.util.List;
010
011import javax.swing.JLabel;
012import javax.swing.JMenuItem;
013import javax.swing.JPanel;
014import javax.swing.JPopupMenu;
015import javax.swing.JSplitPane;
016import javax.swing.event.TreeModelEvent;
017import javax.swing.event.TreeModelListener;
018
019import org.openstreetmap.gui.jmapviewer.checkBoxTree.CheckBoxNodePanel;
020import org.openstreetmap.gui.jmapviewer.checkBoxTree.CheckBoxTree;
021import org.openstreetmap.gui.jmapviewer.interfaces.MapObject;
022
023/**
024 * Tree of layers for JMapViewer component
025 * @author galo
026 */
027public class JMapViewerTree extends JPanel{
028    /** Serial Version UID */
029    private static final long serialVersionUID = 3050203054402323972L;
030
031    private JMapViewer map;
032    private CheckBoxTree tree;
033    private JPanel treePanel;
034    private JSplitPane splitPane;
035
036    public JMapViewerTree(String name){
037        this(name, false);
038    }
039    public JMapViewerTree(String name, boolean treeVisible){
040        super();
041        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
042        
043        tree = new CheckBoxTree(name);
044        treePanel = new JPanel();
045        treePanel.setLayout(new BorderLayout());
046        treePanel.add(tree, BorderLayout.CENTER);
047        treePanel.add(new JLabel("<html><center>Use right mouse button to<br />show/hide texts</center></html>"), BorderLayout.SOUTH);
048        map = new JMapViewer();
049
050        splitPane.setOneTouchExpandable(true);
051        splitPane.setDividerLocation(150);
052        
053        //Provide minimum sizes for the two components in the split pane
054        Dimension minimumSize = new Dimension(100, 50);
055        //tree.setMinimumSize(minimumSize);
056        map.setMinimumSize(minimumSize);
057        createRefresh();
058        setLayout(new BorderLayout());
059        setTreeVisible(treeVisible);
060        tree.addNodeListener(new MouseAdapter() {
061            public void mousePressed(MouseEvent e) {
062                maybeShowPopup(e);
063            }
064            public void mouseReleased(MouseEvent e) {
065                maybeShowPopup(e);
066            }
067            private void maybeShowPopup(MouseEvent e) {
068                if (e.isPopupTrigger()) {
069                    e.getSource();
070                    AbstractLayer layer = ((CheckBoxNodePanel)e.getComponent()).getData().getAbstractLayer();
071                    if(layer!=null)
072                        JMapViewerTree.this.createPopupMenu(layer).show(e.getComponent(), e.getX(), e.getY());
073                }
074            }
075        });
076    }
077    private JPopupMenu createPopupMenu(final AbstractLayer layer) {
078        JMenuItem menuItemShow = new JMenuItem("show texts");
079        JMenuItem menuItemHide = new JMenuItem("hide texts");
080 
081        //Create the popup menu.
082        JPopupMenu popup = new JPopupMenu();
083        
084        // Create items
085        if(layer.isVisibleTexts()==null){
086            popup.add(menuItemShow);
087            popup.add(menuItemHide);
088        }else if(layer.isVisibleTexts()) popup.add(menuItemHide);
089        else popup.add(menuItemShow);
090        
091        menuItemShow.addActionListener(new ActionListener(){
092            @Override
093            public void actionPerformed(ActionEvent arg0) {
094                setVisibleTexts(layer, true);
095                if(layer.getParent()!=null) layer.getParent().calculateVisibleTexts();
096                map.repaint();
097            }
098        });
099        menuItemHide.addActionListener(new ActionListener(){
100            @Override
101            public void actionPerformed(ActionEvent arg0) {
102                setVisibleTexts(layer, false);
103                if(layer.getParent()!=null) layer.getParent().calculateVisibleTexts();
104                map.repaint();
105            }
106        });
107 
108        return popup;
109    }
110    private void setVisibleTexts(AbstractLayer layer, boolean visible){
111        layer.setVisibleTexts(visible);
112        if(layer instanceof LayerGroup){
113            LayerGroup group = (LayerGroup)layer;
114            if(group.getLayers()!=null) for(AbstractLayer al: group.getLayers()) setVisibleTexts(al, visible);
115        }
116    }
117    public Layer addLayer(String name){
118        Layer layer = new Layer(name);
119        this.addLayer(layer);
120        return layer;
121    }
122    public JMapViewerTree addLayer(Layer layer){
123        tree.addLayer(layer);
124        return this;
125    }
126    public JMapViewerTree addLayer(MapObject element){
127        //element.getLayer().add(element);
128        return addLayer(element.getLayer());
129    }
130    public Layer removeFromLayer(MapObject element){
131        element.getLayer().getElements().remove(element);
132        return element.getLayer();
133    }
134    public static int size(List<?> list){
135        return list==null?0:list.size();
136    }
137    public JMapViewer getViewer(){
138        return map;
139    }
140    public CheckBoxTree getTree(){
141        return tree;
142    }
143    public void addMapObject(MapObject o){
144        
145    }
146    public void setTreeVisible(boolean visible){
147        removeAll();
148        revalidate();
149        if(visible){
150            splitPane.setLeftComponent(treePanel);
151            splitPane.setRightComponent(map);
152            add(splitPane, BorderLayout.CENTER);
153        }else add(map, BorderLayout.CENTER);
154        repaint();
155    }
156    private void createRefresh(){
157        tree.getModel().addTreeModelListener(new TreeModelListener() {
158            @Override
159            public void treeNodesChanged(final TreeModelEvent e) {
160                repaint();
161            }
162            @Override
163            public void treeNodesInserted(TreeModelEvent arg0) {
164                // TODO Auto-generated method stub
165            }
166            @Override
167            public void treeNodesRemoved(TreeModelEvent arg0) {
168                // TODO Auto-generated method stub
169            }
170            @Override
171            public void treeStructureChanged(TreeModelEvent arg0) {
172                // TODO Auto-generated method stub
173            }
174        });
175    }
176}