1 package org.simantics.ui.toolbar;
\r
3 import java.util.ArrayList;
\r
4 import java.util.HashMap;
\r
5 import java.util.HashSet;
\r
6 import java.util.List;
\r
7 import java.util.Map;
\r
8 import java.util.Set;
\r
10 import org.eclipse.core.commands.Command;
\r
11 import org.eclipse.core.commands.State;
\r
12 import org.eclipse.ui.IWorkbenchPart;
\r
13 import org.eclipse.ui.PlatformUI;
\r
14 import org.eclipse.ui.commands.ICommandService;
\r
15 import org.eclipse.ui.handlers.IHandlerService;
\r
16 import org.eclipse.ui.handlers.RadioState;
\r
17 import org.eclipse.ui.handlers.RegistryToggleState;
\r
18 import org.simantics.utils.datastructures.MapList;
\r
21 * Registry for storing command states separately for each IEditorPart
\r
23 * TODO : cleaning editor states and listeners is now implemented through ToolBarContributor. Is this OK?
\r
25 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
28 public class CommandStateRegistry {
\r
31 private static CommandStateRegistry instance;
\r
34 public static CommandStateRegistry getInstance() {
\r
35 if (instance == null)
\r
36 instance = new CommandStateRegistry();
\r
42 private Map<IWorkbenchPart,Map<String,Boolean>> toggleStates = new HashMap<IWorkbenchPart, Map<String,Boolean>>();
\r
43 private Map<String,Boolean> defaultToggleStates = new HashMap<String, Boolean>();
\r
45 private Map<String,String> defaultRadioStates = new HashMap<String, String>();
\r
46 private Map<IWorkbenchPart,Map<String,String>> radioStates = new HashMap<IWorkbenchPart, Map<String,String>>();
\r
48 private ICommandService service;
\r
49 private IHandlerService handlerService;
\r
51 private CommandStateRegistry() {
\r
52 service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
\r
53 handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
\r
57 * Stores default state for a command.
\r
59 * Note: uses current state as default.
\r
63 public void storeDefaultState(String commandId) {
\r
64 Command command = service.getCommand(commandId);
\r
65 State toggleState = command.getState(RegistryToggleState.STATE_ID);
\r
66 State radioState = command.getState(RadioState.STATE_ID);
\r
67 if (toggleState != null) {
\r
68 if (!defaultToggleStates.containsKey(commandId))
\r
69 defaultToggleStates.put(commandId, getToggleState(command));
\r
70 } else if (radioState != null) {
\r
71 String value = (String) radioState.getValue();
\r
72 if (!defaultRadioStates.containsKey(commandId))
\r
73 defaultRadioStates.put(commandId, value);
\r
75 throw new IllegalArgumentException("Command " + commandId + " does not have a state");
\r
79 * Stores toggle state of a command.
\r
84 public void setEditorState(IWorkbenchPart part, String commandId, boolean checked) {
\r
85 Map<String,Boolean> editorStates = toggleStates.get(part);
\r
86 if (editorStates == null) {
\r
87 editorStates = new HashMap<String, Boolean>();
\r
88 toggleStates.put(part, editorStates);
\r
90 editorStates.put(commandId, checked);
\r
91 fireStateChange(part, commandId, Boolean.toString(checked));
\r
95 * Stores radio state of a command.
\r
100 public void setEditorState(IWorkbenchPart part, String commandId, String value) {
\r
101 Map<String,String> editorStates = radioStates.get(part);
\r
102 if (editorStates == null) {
\r
103 editorStates = new HashMap<String, String>();
\r
104 radioStates.put(part, editorStates);
\r
106 editorStates.put(commandId, value);
\r
107 fireStateChange(part, commandId, value);
\r
112 public Map<String, Boolean> getDefaultToggleStates() {
\r
113 return defaultToggleStates;
\r
116 public Map<String, String> getDefaultRadioStates() {
\r
117 return defaultRadioStates;
\r
120 public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {
\r
121 return toggleStates.get(part);
\r
124 public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {
\r
125 return radioStates.get(part);
\r
128 public Boolean getToggleState(IWorkbenchPart part, String commandId) {
\r
130 return defaultToggleStates.get(commandId);
\r
131 Map<String,Boolean> editorStates = toggleStates.get(part);
\r
132 if (editorStates == null) {
\r
133 return defaultToggleStates.get(commandId);
\r
135 return editorStates.get(commandId);
\r
138 public String getRadioState(IWorkbenchPart part, String commandId) {
\r
140 return defaultRadioStates.get(commandId);
\r
141 Map<String,String> editorStates = radioStates.get(part);
\r
142 if (editorStates == null) {
\r
143 return defaultRadioStates.get(commandId);
\r
145 return editorStates.get(commandId);
\r
148 public void clearStates(IWorkbenchPart part) {
\r
149 toggleStates.remove(part);
\r
150 radioStates.remove(part);
\r
151 listenerWithPart.remove(part);
\r
154 private boolean getToggleState(Command command) {
\r
155 State toggleState = command.getState(RegistryToggleState.STATE_ID);
\r
156 return (Boolean)toggleState.getValue();
\r
160 private List<CommandStateListener> listeners = new ArrayList<CommandStateListener>();
\r
161 private MapList<String, CommandStateListener> listenerWithCommandId = new MapList<String, CommandStateListener>();
\r
162 private MapList<IWorkbenchPart, CommandStateListener> listenerWithPart = new MapList<IWorkbenchPart, CommandStateListener>();
\r
165 * Attaches a listener that receives all state changes of all commands and all workbench parts.
\r
168 public void addListener(CommandStateListener listener) {
\r
169 if (!listeners.contains(listener))
\r
170 listeners.add(listener);
\r
174 * Attaches a listener to receive state changes of specific workbench part.
\r
178 public void addListener(IWorkbenchPart part, CommandStateListener listener) {
\r
179 if (!listenerWithPart.contains(part,listener))
\r
180 listenerWithPart.add(part,listener);
\r
184 * Attaches a listener to receive state changes of specific command.
\r
188 public void addListener(String commandId, CommandStateListener listener) {
\r
189 if (!listenerWithCommandId.contains(commandId,listener))
\r
190 listenerWithCommandId.add(commandId, listener);
\r
194 * Removes the listener from the registry.
\r
197 public void removeListener(CommandStateListener listener) {
\r
198 listeners.remove(listener);
\r
199 Set<String> commandIds = new HashSet<String>();
\r
200 commandIds.addAll(listenerWithCommandId.getKeys());
\r
201 for (String commandId : commandIds) {
\r
202 listenerWithCommandId.remove(commandId, listener);
\r
204 commandIds.clear();
\r
205 Set<IWorkbenchPart> parts = new HashSet<IWorkbenchPart>();
\r
206 parts.addAll(listenerWithPart.getKeys());
\r
207 for (IWorkbenchPart part : parts) {
\r
208 listenerWithPart.remove(part, listener);
\r
213 private List<CommandStateListener> fireList = new ArrayList<CommandStateListener>();
\r
215 private void fireStateChange(IWorkbenchPart part, String commandId, String state) {
\r
217 fireList.addAll(listeners);
\r
218 List<CommandStateListener> list = listenerWithCommandId.getValues(commandId);
\r
219 if (list != null) {
\r
220 fireList.addAll(list);
\r
223 list = listenerWithPart.getValues(part);
\r
224 if (list != null) {
\r
225 fireList.addAll(list);
\r
228 for (CommandStateListener l : fireList) {
\r
229 l.stateChanged(part, commandId, state);
\r