]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/toolbar/CommandStateRegistry.java
c9dab6fa3e53d98473d4bdeeb5173242576f4c08
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / toolbar / CommandStateRegistry.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g3d.toolbar;\r
13 \r
14 import java.util.HashMap;\r
15 import java.util.Map;\r
16 \r
17 import org.eclipse.core.commands.Command;\r
18 import org.eclipse.core.commands.State;\r
19 import org.eclipse.ui.IWorkbenchPart;\r
20 import org.eclipse.ui.PlatformUI;\r
21 import org.eclipse.ui.commands.ICommandService;\r
22 import org.eclipse.ui.handlers.IHandlerService;\r
23 import org.eclipse.ui.handlers.RadioState;\r
24 import org.eclipse.ui.handlers.RegistryToggleState;\r
25 \r
26 /**\r
27  * Registry for storing command states separately for each IEditorPart\r
28  * \r
29  * TODO : how to change toggle/radios state from editor?\r
30  *   TODO : how to update visible buttons (ToolbarContributor)\r
31  * \r
32  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
33  *\r
34  */\r
35 public class CommandStateRegistry {\r
36 \r
37         \r
38         private static CommandStateRegistry instance;\r
39         \r
40         \r
41         public static CommandStateRegistry getInstance() {\r
42                 if (instance == null)\r
43                         instance = new CommandStateRegistry();\r
44                 return instance;\r
45         }\r
46         \r
47         \r
48         \r
49         private Map<IWorkbenchPart,Map<String,Boolean>> toggleStates = new HashMap<IWorkbenchPart, Map<String,Boolean>>();\r
50         private Map<String,Boolean> defaultToggleStates = new HashMap<String, Boolean>();\r
51         \r
52         private Map<String,String> defaultRadioStates = new HashMap<String, String>();\r
53         private Map<IWorkbenchPart,Map<String,String>> radioStates = new HashMap<IWorkbenchPart, Map<String,String>>();\r
54 \r
55         private ICommandService service;\r
56         private IHandlerService handlerService;\r
57         \r
58         private CommandStateRegistry() {\r
59                 service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);\r
60                 handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);\r
61         }\r
62         \r
63         /**\r
64          * Stores default state for a command.\r
65          * \r
66          * Note: uses current state as default. \r
67          * \r
68          * @param commandId\r
69          */\r
70         public void storeDefaultState(String commandId) {\r
71                 Command command = service.getCommand(commandId);\r
72                 State toggleState = command.getState(RegistryToggleState.STATE_ID);\r
73                 State radioState = command.getState(RadioState.STATE_ID);\r
74                 if (toggleState != null) {\r
75                         if (!defaultToggleStates.containsKey(commandId))\r
76                                 defaultToggleStates.put(commandId, getToggleState(command));\r
77                 } else if (radioState != null) {\r
78                         String value = (String) radioState.getValue();\r
79                         if (!defaultRadioStates.containsKey(commandId))\r
80                                 defaultRadioStates.put(commandId, value);\r
81                 } else {\r
82                         throw new IllegalArgumentException("Command " + commandId + " does not have a state");\r
83                 }\r
84         }\r
85         /**\r
86          * Stores toggle state of a command.\r
87          * @param part\r
88          * @param commandId\r
89          * @param checked\r
90          */\r
91         public void setEditorState(IWorkbenchPart part, String commandId, boolean checked) {\r
92                 Map<String,Boolean> editorStates = toggleStates.get(part);\r
93                 if (editorStates == null) {\r
94                         editorStates = new HashMap<String, Boolean>();\r
95                         toggleStates.put(part, editorStates);\r
96                 }\r
97                 editorStates.put(commandId, checked);\r
98         }\r
99         \r
100         /**\r
101          * Stores radio state of a command.\r
102          * @param part\r
103          * @param commandId\r
104          * @param value\r
105          */\r
106         public void setEditorState(IWorkbenchPart part, String commandId, String value) {\r
107                 Map<String,String> editorStates = radioStates.get(part);\r
108                 if (editorStates == null) {\r
109                         editorStates = new HashMap<String, String>();\r
110                         radioStates.put(part, editorStates);\r
111                 }\r
112                 editorStates.put(commandId, value);\r
113         }\r
114         \r
115         public Map<String, Boolean> getDefaultToggleStates() {\r
116                 return defaultToggleStates;\r
117         }\r
118         \r
119         public Map<String, String> getDefaultRadioStates() {\r
120                 return defaultRadioStates;\r
121         }\r
122         \r
123         public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {\r
124                 return toggleStates.get(part);\r
125         }\r
126         \r
127         public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {\r
128                 return radioStates.get(part);\r
129         }\r
130         \r
131         public Boolean getToggleState(IWorkbenchPart part, String commandId) {\r
132                 if (part == null)\r
133                         return defaultToggleStates.get(commandId);\r
134                 Map<String,Boolean> editorStates = toggleStates.get(part);\r
135                 if (editorStates == null) {\r
136                         return defaultToggleStates.get(commandId);\r
137                 }\r
138                 return editorStates.get(commandId);\r
139         }\r
140         \r
141         public String getRadioState(IWorkbenchPart part, String commandId) {\r
142                 if (part == null)\r
143                         return defaultRadioStates.get(commandId);\r
144                 Map<String,String> editorStates = radioStates.get(part);\r
145                 if (editorStates == null) {\r
146                         return defaultRadioStates.get(commandId);\r
147                 }\r
148                 return editorStates.get(commandId);\r
149         }\r
150         \r
151         public void clearStates(IWorkbenchPart part) {\r
152                 toggleStates.remove(part);\r
153                 radioStates.remove(part);\r
154         }\r
155         \r
156         private boolean getToggleState(Command command) {\r
157                 State toggleState = command.getState(RegistryToggleState.STATE_ID);\r
158                 return (Boolean)toggleState.getValue();\r
159         }\r
160         \r
161         \r
162 }\r