source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java

Last change on this file was 17458, checked in by GerdP, 3 years ago

see #17184: Memory leaks

  • clear collection rememberMovements in OrthogonalizeAction when no edit layer exits
  • clear refs to layers which may disturb GC, maybe because of the complex cyclic deps
  • Property svn:eol-style set to native
File size: 4.4 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.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.util.List;
9
10import javax.swing.AbstractAction;
11
12import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating;
13import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
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.MainLayerManager.ActiveLayerChangeEvent;
18import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
19import org.openstreetmap.josm.gui.util.GuiHelper;
20import org.openstreetmap.josm.gui.util.MultikeyShortcutAction;
21import org.openstreetmap.josm.tools.CheckParameterUtil;
22import org.openstreetmap.josm.tools.Destroyable;
23import org.openstreetmap.josm.tools.ImageProvider;
24import org.openstreetmap.josm.tools.Shortcut;
25
26/**
27 * The action to activate the currently selected layer
28 */
29public final class ActivateLayerAction extends AbstractAction
30implements IEnabledStateUpdating, ActiveLayerChangeListener, MultikeyShortcutAction, Destroyable {
31 private transient Layer layer;
32 private final transient Shortcut multikeyShortcut;
33 private final LayerListModel model;
34
35 /**
36 * Constructs a new {@code ActivateLayerAction}.
37 * @param layer the layer
38 * @param model layer list model
39 */
40 public ActivateLayerAction(Layer layer, LayerListModel model) {
41 this(model);
42 CheckParameterUtil.ensureParameterNotNull(layer, "layer");
43 this.layer = layer;
44 putValue(NAME, tr("Activate"));
45 updateEnabledState();
46 }
47
48 /**
49 * Constructs a new {@code ActivateLayerAction}.
50 * @param model layer list model
51 */
52 public ActivateLayerAction(LayerListModel model) {
53 this.model = model;
54 putValue(NAME, tr("Activate"));
55 new ImageProvider("dialogs", "activate").getResource().attachImageIcon(this, true);
56 putValue(SHORT_DESCRIPTION, tr("Activate the selected layer"));
57 multikeyShortcut = Shortcut.registerShortcut("core_multikey:activateLayer", tr("Multikey: {0}",
58 tr("Activate layer")), KeyEvent.VK_A, Shortcut.SHIFT);
59 multikeyShortcut.setAccelerator(this);
60 putValue("help", HelpUtil.ht("/Dialog/LayerList#ActivateLayer"));
61 }
62
63 @Override
64 public Shortcut getMultikeyShortcut() {
65 return multikeyShortcut;
66 }
67
68 @Override
69 public void actionPerformed(ActionEvent e) {
70 Layer toActivate;
71 if (layer != null) {
72 toActivate = layer;
73 } else {
74 List<Layer> layers = model.getSelectedLayers();
75 if (layers.isEmpty()) {
76 // see #19476 for a possible cause
77 return;
78 }
79 toActivate = layers.get(0);
80 }
81 execute(toActivate);
82 }
83
84 private void execute(Layer layer) {
85 // model is going to be updated via LayerChangeListener and PropertyChangeEvents
86 model.getLayerManager().setActiveLayer(layer);
87 layer.setVisible(true);
88 }
89
90 boolean isActiveLayer(Layer layer) {
91 return model.getLayerManager().getActiveLayer() == layer;
92 }
93
94 @Override
95 public void updateEnabledState() {
96 GuiHelper.runInEDTAndWait(() -> {
97 if (layer == null) {
98 if (model.getSelectedLayers().size() != 1) {
99 setEnabled(false);
100 return;
101 }
102 setEnabled(!isActiveLayer(model.getSelectedLayers().get(0)));
103 } else {
104 setEnabled(!isActiveLayer(layer));
105 }
106 });
107 }
108
109 @Override
110 public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
111 updateEnabledState();
112 }
113
114 @Override
115 public void executeMultikeyAction(int index, boolean repeat) {
116 Layer l = LayerListDialog.getLayerForIndex(index);
117 if (l != null) {
118 execute(l);
119 }
120 }
121
122 @Override
123 public List<MultikeyInfo> getMultikeyCombinations() {
124 return LayerListDialog.getLayerInfoByClass(Layer.class);
125 }
126
127 @Override
128 public MultikeyInfo getLastMultikeyAction() {
129 return null; // Repeating action doesn't make much sense for activating
130 }
131
132 @Override
133 public void destroy() {
134 layer = null;
135 }
136
137}
Note: See TracBrowser for help on using the repository browser.