source: josm/trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java@ 11088

Last change on this file since 11088 was 10600, checked in by Don-vip, 8 years ago

see #11390 - sonar - squid:S1609 - Java 8: @FunctionalInterface annotation should be used to flag Single Abstract Method interfaces

  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.event.ActionEvent;
8import java.lang.ref.WeakReference;
9import java.util.ArrayList;
10import java.util.Iterator;
11import java.util.List;
12
13import org.openstreetmap.josm.Main;
14
15/**
16 * This action toggles the Expert mode.
17 * @since 4840
18 */
19public class ExpertToggleAction extends ToggleAction {
20
21 @FunctionalInterface
22 public interface ExpertModeChangeListener {
23 void expertChanged(boolean isExpert);
24 }
25
26 private static final List<WeakReference<ExpertModeChangeListener>> listeners = new ArrayList<>();
27 private static final List<WeakReference<Component>> visibilityToggleListeners = new ArrayList<>();
28
29 private static final ExpertToggleAction INSTANCE = new ExpertToggleAction();
30
31 private static synchronized void fireExpertModeChanged(boolean isExpert) {
32 Iterator<WeakReference<ExpertModeChangeListener>> it1 = listeners.iterator();
33 while (it1.hasNext()) {
34 WeakReference<ExpertModeChangeListener> wr = it1.next();
35 ExpertModeChangeListener listener = wr.get();
36 if (listener == null) {
37 it1.remove();
38 continue;
39 }
40 listener.expertChanged(isExpert);
41 }
42 Iterator<WeakReference<Component>> it2 = visibilityToggleListeners.iterator();
43 while (it2.hasNext()) {
44 WeakReference<Component> wr = it2.next();
45 Component c = wr.get();
46 if (c == null) {
47 it2.remove();
48 continue;
49 }
50 c.setVisible(isExpert);
51 }
52 }
53
54 /**
55 * Register a expert mode change listener
56 *
57 * @param listener the listener. Ignored if null.
58 */
59 public static void addExpertModeChangeListener(ExpertModeChangeListener listener) {
60 addExpertModeChangeListener(listener, false);
61 }
62
63 public static synchronized void addExpertModeChangeListener(ExpertModeChangeListener listener, boolean fireWhenAdding) {
64 if (listener == null) return;
65 for (WeakReference<ExpertModeChangeListener> wr : listeners) {
66 // already registered ? => abort
67 if (wr.get() == listener) return;
68 }
69 listeners.add(new WeakReference<>(listener));
70 if (fireWhenAdding) {
71 listener.expertChanged(isExpert());
72 }
73 }
74
75 /**
76 * Removes a expert mode change listener
77 *
78 * @param listener the listener. Ignored if null.
79 */
80 public static synchronized void removeExpertModeChangeListener(ExpertModeChangeListener listener) {
81 if (listener == null) return;
82 Iterator<WeakReference<ExpertModeChangeListener>> it = listeners.iterator();
83 while (it.hasNext()) {
84 WeakReference<ExpertModeChangeListener> wr = it.next();
85 // remove the listener - and any other listener which god garbage
86 // collected in the meantime
87 if (wr.get() == null || wr.get() == listener) {
88 it.remove();
89 }
90 }
91 }
92
93 public static synchronized void addVisibilitySwitcher(Component c) {
94 if (c == null) return;
95 for (WeakReference<Component> wr : visibilityToggleListeners) {
96 // already registered ? => abort
97 if (wr.get() == c) return;
98 }
99 visibilityToggleListeners.add(new WeakReference<>(c));
100 c.setVisible(isExpert());
101 }
102
103 public static synchronized void removeVisibilitySwitcher(Component c) {
104 if (c == null) return;
105 Iterator<WeakReference<Component>> it = visibilityToggleListeners.iterator();
106 while (it.hasNext()) {
107 WeakReference<Component> wr = it.next();
108 // remove the listener - and any other listener which god garbage
109 // collected in the meantime
110 if (wr.get() == null || wr.get() == c) {
111 it.remove();
112 }
113 }
114 }
115
116 /**
117 * Constructs a new {@code ExpertToggleAction}.
118 */
119 public ExpertToggleAction() {
120 super(tr("Expert Mode"),
121 "expert",
122 tr("Enable/disable expert mode"),
123 null,
124 false /* register toolbar */
125 );
126 putValue("toolbar", "expertmode");
127 if (Main.toolbar != null) {
128 Main.toolbar.register(this);
129 }
130 setSelected(Main.pref.getBoolean("expert", false));
131 notifySelectedState();
132 }
133
134 @Override
135 protected final void notifySelectedState() {
136 super.notifySelectedState();
137 fireExpertModeChanged(isSelected());
138 }
139
140 @Override
141 public void actionPerformed(ActionEvent e) {
142 toggleSelectedState(e);
143 Main.pref.put("expert", isSelected());
144 notifySelectedState();
145 }
146
147 /**
148 * Replies the unique instance of this action.
149 * @return The unique instance of this action
150 */
151 public static ExpertToggleAction getInstance() {
152 return INSTANCE;
153 }
154
155 /**
156 * Determines if expert mode is enabled.
157 * @return {@code true} if expert mode is enabled, {@code false} otherwise.
158 */
159 public static boolean isExpert() {
160 return INSTANCE.isSelected();
161 }
162}
Note: See TracBrowser for help on using the repository browser.