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

Last change on this file since 15889 was 12643, checked in by Don-vip, 7 years ago

see #15182 - deprecate Main.main.menu. Replacement: gui.MainApplication.getMenu()

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