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

Last change on this file since 8777 was 7025, checked in by Don-vip, 10 years ago

Sonar - fix various issues

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