source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/layer/MergeAction.java@ 10428

Last change on this file since 10428 was 10428, checked in by stoecker, 8 years ago

see #9995 - patch mainly by strump - improve HIDPI behaviour

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.layer;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.event.ActionEvent;
8import java.util.List;
9
10import javax.swing.AbstractAction;
11import javax.swing.JMenuItem;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
15import org.openstreetmap.josm.gui.help.HelpUtil;
16import org.openstreetmap.josm.gui.layer.Layer;
17import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
18import org.openstreetmap.josm.tools.CheckParameterUtil;
19import org.openstreetmap.josm.tools.ImageProvider;
20
21/**
22 * The action to merge the currently selected layer into another layer.
23 */
24public final class MergeAction extends AbstractAction implements IEnabledStateUpdating, LayerAction, Layer.MultiLayerAction {
25 private transient Layer layer;
26 private transient List<Layer> layers;
27 private final LayerListModel model;
28
29 /**
30 * Constructs a new {@code MergeAction}.
31 * @param layer the layer
32 * @param model layer list model
33 * @throws IllegalArgumentException if {@code layer} is null
34 */
35 public MergeAction(Layer layer, LayerListModel model) {
36 this(layer, null, model);
37 CheckParameterUtil.ensureParameterNotNull(layer, "layer");
38 }
39
40 /**
41 * Constructs a new {@code MergeAction}.
42 * @param layers the layer list
43 * @param model layer list model
44 * @throws IllegalArgumentException if {@code layers} is null
45 */
46 public MergeAction(List<Layer> layers, LayerListModel model) {
47 this(null, layers, model);
48 CheckParameterUtil.ensureParameterNotNull(layers, "layers");
49 }
50
51 /**
52 * Constructs a new {@code MergeAction}.
53 * @param layer the layer (null if layer list if specified)
54 * @param layers the layer list (null if a single layer is specified)
55 * @param model layer list model
56 */
57 private MergeAction(Layer layer, List<Layer> layers, LayerListModel model) {
58 this.layer = layer;
59 this.layers = layers;
60 this.model = model;
61 putValue(NAME, tr("Merge"));
62 new ImageProvider("dialogs", "mergedown").getResource().attachImageIcon(this, true);
63 putValue(SHORT_DESCRIPTION, tr("Merge this layer into another layer"));
64 putValue("help", HelpUtil.ht("/Dialog/LayerList#MergeLayer"));
65 updateEnabledState();
66 }
67
68 @Override
69 public void actionPerformed(ActionEvent e) {
70 if (layer != null) {
71 Main.main.menu.merge.merge(layer);
72 } else if (layers != null) {
73 Main.main.menu.merge.merge(layers);
74 } else {
75 if (model.getSelectedLayers().size() == 1) {
76 Layer selectedLayer = model.getSelectedLayers().get(0);
77 Main.main.menu.merge.merge(selectedLayer);
78 } else {
79 Main.main.menu.merge.merge(model.getSelectedLayers());
80 }
81 }
82 }
83
84 @Override
85 public void updateEnabledState() {
86 if (layer == null && layers == null) {
87 if (model.getSelectedLayers().isEmpty()) {
88 setEnabled(false);
89 } else if (model.getSelectedLayers().size() > 1) {
90 setEnabled(supportLayers(model.getSelectedLayers()));
91 } else {
92 Layer selectedLayer = model.getSelectedLayers().get(0);
93 List<Layer> targets = model.getPossibleMergeTargets(selectedLayer);
94 setEnabled(!targets.isEmpty());
95 }
96 } else if (layer != null) {
97 List<Layer> targets = model.getPossibleMergeTargets(layer);
98 setEnabled(!targets.isEmpty());
99 } else {
100 setEnabled(supportLayers(layers));
101 }
102 }
103
104 @Override
105 public boolean supportLayers(List<Layer> layers) {
106 if (layers.isEmpty()) {
107 return false;
108 } else {
109 final Layer firstLayer = layers.get(0);
110 final List<Layer> remainingLayers = layers.subList(1, layers.size());
111 return model.getPossibleMergeTargets(firstLayer).containsAll(remainingLayers);
112 }
113 }
114
115 @Override
116 public Component createMenuComponent() {
117 return new JMenuItem(this);
118 }
119
120 @Override
121 public MergeAction getMultiLayerAction(List<Layer> layers) {
122 return new MergeAction(layers, model);
123 }
124}
Note: See TracBrowser for help on using the repository browser.