]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.ui/src/org/simantics/ui/toolbar/CommandStateRegistry.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.ui / src / org / simantics / ui / toolbar / CommandStateRegistry.java
1 package org.simantics.ui.toolbar;\r
2 \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
9 \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
19 \r
20 /**\r
21  * Registry for storing command states separately for each IEditorPart\r
22  * \r
23  * TODO : cleaning editor states and listeners is now implemented through ToolBarContributor. Is this OK?\r
24  * \r
25  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
26  *\r
27  */\r
28 public class CommandStateRegistry {\r
29 \r
30         \r
31         private static CommandStateRegistry instance;\r
32         \r
33         \r
34         public static CommandStateRegistry getInstance() {\r
35                 if (instance == null)\r
36                         instance = new CommandStateRegistry();\r
37                 return instance;\r
38         }\r
39         \r
40         \r
41         \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
44         \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
47 \r
48         private ICommandService service;\r
49         private IHandlerService handlerService;\r
50         \r
51         private CommandStateRegistry() {\r
52                 service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);\r
53                 handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);\r
54         }\r
55         \r
56         /**\r
57          * Stores default state for a command.\r
58          * \r
59          * Note: uses current state as default. \r
60          * \r
61          * @param commandId\r
62          */\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
74                 } else {\r
75                         throw new IllegalArgumentException("Command " + commandId + " does not have a state");\r
76                 }\r
77         }\r
78         /**\r
79          * Stores toggle state of a command.\r
80          * @param part\r
81          * @param commandId\r
82          * @param checked\r
83          */\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
89                 }\r
90                 editorStates.put(commandId, checked);\r
91                 fireStateChange(part, commandId, Boolean.toString(checked));\r
92         }\r
93         \r
94         /**\r
95          * Stores radio state of a command.\r
96          * @param part\r
97          * @param commandId\r
98          * @param value\r
99          */\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
105                 }\r
106                 editorStates.put(commandId, value);\r
107                 fireStateChange(part, commandId, value);\r
108         }\r
109         \r
110         \r
111         \r
112         public Map<String, Boolean> getDefaultToggleStates() {\r
113                 return defaultToggleStates;\r
114         }\r
115         \r
116         public Map<String, String> getDefaultRadioStates() {\r
117                 return defaultRadioStates;\r
118         }\r
119         \r
120         public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {\r
121                 return toggleStates.get(part);\r
122         }\r
123         \r
124         public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {\r
125                 return radioStates.get(part);\r
126         }\r
127         \r
128         public Boolean getToggleState(IWorkbenchPart part, String commandId) {\r
129                 if (part == null)\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
134                 }\r
135                 return editorStates.get(commandId);\r
136         }\r
137         \r
138         public String getRadioState(IWorkbenchPart part, String commandId) {\r
139                 if (part == null)\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
144                 }\r
145                 return editorStates.get(commandId);\r
146         }\r
147         \r
148         public void clearStates(IWorkbenchPart part) {\r
149                 toggleStates.remove(part);\r
150                 radioStates.remove(part);\r
151                 listenerWithPart.remove(part);\r
152         }\r
153         \r
154         private boolean getToggleState(Command command) {\r
155                 State toggleState = command.getState(RegistryToggleState.STATE_ID);\r
156                 return (Boolean)toggleState.getValue();\r
157         }\r
158         \r
159         \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
163         \r
164         /**\r
165          * Attaches a listener that receives all state changes of all commands and all workbench parts.\r
166          * @param listener\r
167          */\r
168         public void addListener(CommandStateListener listener) {\r
169                 if (!listeners.contains(listener))\r
170                         listeners.add(listener);\r
171         }\r
172         \r
173         /**\r
174          * Attaches a listener to receive state changes of specific workbench part.\r
175          * @param part\r
176          * @param listener\r
177          */\r
178         public void addListener(IWorkbenchPart part, CommandStateListener listener) {\r
179                 if (!listenerWithPart.contains(part,listener))\r
180                         listenerWithPart.add(part,listener);\r
181         }\r
182         \r
183         /**\r
184          * Attaches a listener to receive state changes of specific command.\r
185          * @param part\r
186          * @param listener\r
187          */\r
188         public void addListener(String commandId, CommandStateListener listener) {\r
189                 if (!listenerWithCommandId.contains(commandId,listener))\r
190                         listenerWithCommandId.add(commandId, listener);\r
191         }\r
192         \r
193         /**\r
194          * Removes the listener from the registry.\r
195          * @param listener\r
196          */\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
203                 }\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
209                 }\r
210                 parts.clear();\r
211         }\r
212         \r
213         private List<CommandStateListener> fireList = new ArrayList<CommandStateListener>();\r
214         \r
215         private void fireStateChange(IWorkbenchPart part, String commandId, String state) {\r
216                 fireList.clear();\r
217                 fireList.addAll(listeners);\r
218                 List<CommandStateListener> list = listenerWithCommandId.getValues(commandId);\r
219                 if (list != null) {\r
220                         fireList.addAll(list);\r
221                         \r
222                 }\r
223                 list = listenerWithPart.getValues(part);\r
224                 if (list != null) {\r
225                         fireList.addAll(list);\r
226                         \r
227                 }       \r
228                 for (CommandStateListener l : fireList) {\r
229                         l.stateChanged(part, commandId, state);\r
230                 }\r
231 \r
232         }\r
233         \r
234 }\r