001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.gui.dialogs; 003 004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.awt.event.ActionEvent; 008 import java.util.ArrayList; 009 import java.util.Arrays; 010 import java.util.List; 011 012 import javax.swing.AbstractAction; 013 import javax.swing.Action; 014 import javax.swing.JMenuItem; 015 import javax.swing.JOptionPane; 016 import javax.swing.JPopupMenu; 017 018 import org.openstreetmap.josm.Main; 019 import org.openstreetmap.josm.gui.layer.Layer; 020 import org.openstreetmap.josm.gui.layer.Layer.LayerAction; 021 import org.openstreetmap.josm.gui.layer.Layer.MultiLayerAction; 022 import org.openstreetmap.josm.gui.layer.Layer.SeparatorLayerAction; 023 import org.openstreetmap.josm.tools.ImageProvider; 024 025 /** 026 * Popup menu handler for the layer list. 027 */ 028 public class LayerListPopup extends JPopupMenu { 029 030 public final static class InfoAction extends AbstractAction { 031 private final Layer layer; 032 public InfoAction(Layer layer) { 033 super(tr("Info"), ImageProvider.get("info")); 034 putValue("help", ht("/Action/LayerInfo")); 035 this.layer = layer; 036 } 037 public void actionPerformed(ActionEvent e) { 038 JOptionPane.showMessageDialog( 039 Main.parent, 040 layer.getInfoComponent(), 041 tr("Information about layer"), 042 JOptionPane.INFORMATION_MESSAGE 043 ); 044 } 045 } 046 047 public LayerListPopup(List<Layer> selectedLayers, final Layer layer) { 048 049 List<Action> actions; 050 if (selectedLayers.size() == 1) { 051 actions = Arrays.asList(selectedLayers.get(0).getMenuEntries()); 052 } else { 053 // Very simple algorithm - first selected layer has actions order as in getMenuEntries, actions from other layers go to the end 054 actions = new ArrayList<Action>(); 055 boolean separatorAdded = true; 056 for (Action a: selectedLayers.get(0).getMenuEntries()) { 057 if (!separatorAdded && a instanceof SeparatorLayerAction) { 058 separatorAdded = true; 059 actions.add(a); 060 } else if (a instanceof LayerAction && ((LayerAction)a).supportLayers(selectedLayers)) { 061 separatorAdded = false; 062 if(a instanceof MultiLayerAction) 063 a = ((MultiLayerAction)a).getMultiLayerAction(selectedLayers); 064 actions.add(a); 065 } 066 } 067 // This will usually add no action, because if some action support all selected layers then it was probably used also in first layer 068 for (int i=1; i<selectedLayers.size(); i++) { 069 separatorAdded = false; 070 for (Action a: selectedLayers.get(i).getMenuEntries()) { 071 if (a instanceof LayerAction && !(a instanceof MultiLayerAction) 072 && ((LayerAction)a).supportLayers(selectedLayers) && !actions.contains(a)) { 073 if (!separatorAdded) { 074 separatorAdded = true; 075 actions.add(SeparatorLayerAction.INSTANCE); 076 } 077 actions.add(a); 078 } 079 } 080 } 081 } 082 if (!actions.isEmpty() && actions.get(actions.size() - 1) instanceof SeparatorLayerAction) { 083 actions.remove(actions.size() - 1); 084 } 085 for (Action a : actions) { 086 if (a instanceof LayerAction) { 087 add (((LayerAction) a).createMenuComponent()); 088 } else { 089 add(new JMenuItem(a)); 090 } 091 } 092 } 093 }