]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/toolbar/CommandStateRegistry.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / toolbar / CommandStateRegistry.java
diff --git a/org.simantics.g3d/src/org/simantics/g3d/toolbar/CommandStateRegistry.java b/org.simantics.g3d/src/org/simantics/g3d/toolbar/CommandStateRegistry.java
new file mode 100644 (file)
index 0000000..abb92f9
--- /dev/null
@@ -0,0 +1,151 @@
+package org.simantics.g3d.toolbar;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.eclipse.core.commands.Command;\r
+import org.eclipse.core.commands.State;\r
+import org.eclipse.ui.IWorkbenchPart;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.eclipse.ui.commands.ICommandService;\r
+import org.eclipse.ui.handlers.IHandlerService;\r
+import org.eclipse.ui.handlers.RadioState;\r
+import org.eclipse.ui.handlers.RegistryToggleState;\r
+\r
+/**\r
+ * Registry for storing command states separately for each IEditorPart\r
+ * \r
+ * TODO : how to change toggle/radios state from editor?\r
+ *   TODO : how to update visible buttons (ToolbarContributor)\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class CommandStateRegistry {\r
+\r
+       \r
+       private static CommandStateRegistry instance;\r
+       \r
+       \r
+       public static CommandStateRegistry getInstance() {\r
+               if (instance == null)\r
+                       instance = new CommandStateRegistry();\r
+               return instance;\r
+       }\r
+       \r
+       \r
+       \r
+       private Map<IWorkbenchPart,Map<String,Boolean>> toggleStates = new HashMap<IWorkbenchPart, Map<String,Boolean>>();\r
+       private Map<String,Boolean> defaultToggleStates = new HashMap<String, Boolean>();\r
+       \r
+       private Map<String,String> defaultRadioStates = new HashMap<String, String>();\r
+       private Map<IWorkbenchPart,Map<String,String>> radioStates = new HashMap<IWorkbenchPart, Map<String,String>>();\r
+\r
+       private ICommandService service;\r
+       private IHandlerService handlerService;\r
+       \r
+       private CommandStateRegistry() {\r
+               service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);\r
+               handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);\r
+       }\r
+       \r
+       /**\r
+        * Stores default state for a command.\r
+        * \r
+        * Note: uses current state as default. \r
+        * \r
+        * @param commandId\r
+        */\r
+       public void storeDefaultState(String commandId) {\r
+               Command command = service.getCommand(commandId);\r
+               State toggleState = command.getState(RegistryToggleState.STATE_ID);\r
+               State radioState = command.getState(RadioState.STATE_ID);\r
+               if (toggleState != null) {\r
+                       if (!defaultToggleStates.containsKey(commandId))\r
+                               defaultToggleStates.put(commandId, getToggleState(command));\r
+               } else if (radioState != null) {\r
+                       String value = (String) radioState.getValue();\r
+                       if (!defaultRadioStates.containsKey(commandId))\r
+                               defaultRadioStates.put(commandId, value);\r
+               } else {\r
+                       throw new IllegalArgumentException("Command " + commandId + " does not have a state");\r
+               }\r
+       }\r
+       /**\r
+        * Stores toggle state of a command.\r
+        * @param part\r
+        * @param commandId\r
+        * @param checked\r
+        */\r
+       public void setEditorState(IWorkbenchPart part, String commandId, boolean checked) {\r
+               Map<String,Boolean> editorStates = toggleStates.get(part);\r
+               if (editorStates == null) {\r
+                       editorStates = new HashMap<String, Boolean>();\r
+                       toggleStates.put(part, editorStates);\r
+               }\r
+               editorStates.put(commandId, checked);\r
+       }\r
+       \r
+       /**\r
+        * Stores radio state of a command.\r
+        * @param part\r
+        * @param commandId\r
+        * @param value\r
+        */\r
+       public void setEditorState(IWorkbenchPart part, String commandId, String value) {\r
+               Map<String,String> editorStates = radioStates.get(part);\r
+               if (editorStates == null) {\r
+                       editorStates = new HashMap<String, String>();\r
+                       radioStates.put(part, editorStates);\r
+               }\r
+               editorStates.put(commandId, value);\r
+       }\r
+       \r
+       public Map<String, Boolean> getDefaultToggleStates() {\r
+               return defaultToggleStates;\r
+       }\r
+       \r
+       public Map<String, String> getDefaultRadioStates() {\r
+               return defaultRadioStates;\r
+       }\r
+       \r
+       public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {\r
+               return toggleStates.get(part);\r
+       }\r
+       \r
+       public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {\r
+               return radioStates.get(part);\r
+       }\r
+       \r
+       public Boolean getToggleState(IWorkbenchPart part, String commandId) {\r
+               if (part == null)\r
+                       return defaultToggleStates.get(commandId);\r
+               Map<String,Boolean> editorStates = toggleStates.get(part);\r
+               if (editorStates == null) {\r
+                       return defaultToggleStates.get(commandId);\r
+               }\r
+               return editorStates.get(commandId);\r
+       }\r
+       \r
+       public String getRadioState(IWorkbenchPart part, String commandId) {\r
+               if (part == null)\r
+                       return defaultRadioStates.get(commandId);\r
+               Map<String,String> editorStates = radioStates.get(part);\r
+               if (editorStates == null) {\r
+                       return defaultRadioStates.get(commandId);\r
+               }\r
+               return editorStates.get(commandId);\r
+       }\r
+       \r
+       public void clearStates(IWorkbenchPart part) {\r
+               toggleStates.remove(part);\r
+               radioStates.remove(part);\r
+       }\r
+       \r
+       private boolean getToggleState(Command command) {\r
+               State toggleState = command.getState(RegistryToggleState.STATE_ID);\r
+               return (Boolean)toggleState.getValue();\r
+       }\r
+       \r
+       \r
+}\r