001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.actions;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.Component;
007    import java.awt.GridBagLayout;
008    import java.util.List;
009    
010    import javax.swing.DefaultListCellRenderer;
011    import javax.swing.Icon;
012    import javax.swing.JLabel;
013    import javax.swing.JList;
014    import javax.swing.JOptionPane;
015    import javax.swing.JPanel;
016    
017    import org.openstreetmap.josm.Main;
018    import org.openstreetmap.josm.gui.ExtendedDialog;
019    import org.openstreetmap.josm.gui.layer.Layer;
020    import org.openstreetmap.josm.gui.widgets.JosmComboBox;
021    import org.openstreetmap.josm.tools.GBC;
022    import org.openstreetmap.josm.tools.Shortcut;
023    
024    public abstract class AbstractMergeAction extends JosmAction {
025    
026        /**
027         * the list cell renderer used to render layer list entries
028         *
029         */
030        static public class LayerListCellRenderer extends DefaultListCellRenderer {
031    
032            @Override
033            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
034                    boolean cellHasFocus) {
035                Layer layer = (Layer) value;
036                JLabel label = (JLabel) super.getListCellRendererComponent(list, layer.getName(), index, isSelected,
037                        cellHasFocus);
038                Icon icon = layer.getIcon();
039                label.setIcon(icon);
040                label.setToolTipText(layer.getToolTipText());
041                return label;
042            }
043        }
044    
045        public AbstractMergeAction() {
046            super();
047        }
048    
049        public AbstractMergeAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean register) {
050            super(name, iconName, tooltip, shortcut, register);
051        }
052    
053        public AbstractMergeAction(String name, String iconName, String tooltip, Shortcut shortcut,
054        boolean register, String toolbar, boolean installAdapters) {
055            super(name, iconName, tooltip, shortcut, register, toolbar, installAdapters);
056        }
057    
058        protected Layer askTargetLayer(List<Layer> targetLayers) {
059            JosmComboBox layerList = new JosmComboBox(targetLayers.toArray());
060            layerList.setRenderer(new LayerListCellRenderer());
061            layerList.setSelectedIndex(0);
062    
063            JPanel pnl = new JPanel(new GridBagLayout());
064            pnl.add(new JLabel(tr("Please select the target layer.")), GBC.eol());
065            pnl.add(layerList, GBC.eol());
066    
067            ExtendedDialog ed = new ExtendedDialog(Main.parent,
068                    tr("Select target layer"),
069                    new String[] { tr("Merge"), tr("Cancel") });
070            ed.setButtonIcons(new String[] { "dialogs/mergedown", "cancel" });
071            ed.setContent(pnl);
072            ed.showDialog();
073            if (ed.getValue() != 1)
074                return null;
075    
076            Layer targetLayer = (Layer) layerList.getSelectedItem();
077            return targetLayer;
078        }
079    
080        protected void warnNoTargetLayersForSourceLayer(Layer sourceLayer) {
081            JOptionPane.showMessageDialog(Main.parent,
082                    tr("<html>There are no layers the source layer<br>''{0}''<br>could be merged to.</html>", sourceLayer.getName()),
083                    tr("No target layers"), JOptionPane.WARNING_MESSAGE);
084        }
085    }