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}