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 }