-package org.simantics.ui.toolbar;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\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
-import org.simantics.utils.datastructures.MapList;\r
-\r
-/**\r
- * Registry for storing command states separately for each IEditorPart\r
- * \r
- * TODO : cleaning editor states and listeners is now implemented through ToolBarContributor. Is this OK?\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
- fireStateChange(part, commandId, Boolean.toString(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
- fireStateChange(part, commandId, value);\r
- }\r
- \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
- listenerWithPart.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
- private List<CommandStateListener> listeners = new ArrayList<CommandStateListener>();\r
- private MapList<String, CommandStateListener> listenerWithCommandId = new MapList<String, CommandStateListener>();\r
- private MapList<IWorkbenchPart, CommandStateListener> listenerWithPart = new MapList<IWorkbenchPart, CommandStateListener>();\r
- \r
- /**\r
- * Attaches a listener that receives all state changes of all commands and all workbench parts.\r
- * @param listener\r
- */\r
- public void addListener(CommandStateListener listener) {\r
- if (!listeners.contains(listener))\r
- listeners.add(listener);\r
- }\r
- \r
- /**\r
- * Attaches a listener to receive state changes of specific workbench part.\r
- * @param part\r
- * @param listener\r
- */\r
- public void addListener(IWorkbenchPart part, CommandStateListener listener) {\r
- if (!listenerWithPart.contains(part,listener))\r
- listenerWithPart.add(part,listener);\r
- }\r
- \r
- /**\r
- * Attaches a listener to receive state changes of specific command.\r
- * @param part\r
- * @param listener\r
- */\r
- public void addListener(String commandId, CommandStateListener listener) {\r
- if (!listenerWithCommandId.contains(commandId,listener))\r
- listenerWithCommandId.add(commandId, listener);\r
- }\r
- \r
- /**\r
- * Removes the listener from the registry.\r
- * @param listener\r
- */\r
- public void removeListener(CommandStateListener listener) {\r
- listeners.remove(listener);\r
- Set<String> commandIds = new HashSet<String>();\r
- commandIds.addAll(listenerWithCommandId.getKeys());\r
- for (String commandId : commandIds) {\r
- listenerWithCommandId.remove(commandId, listener);\r
- }\r
- commandIds.clear();\r
- Set<IWorkbenchPart> parts = new HashSet<IWorkbenchPart>();\r
- parts.addAll(listenerWithPart.getKeys());\r
- for (IWorkbenchPart part : parts) {\r
- listenerWithPart.remove(part, listener);\r
- }\r
- parts.clear();\r
- }\r
- \r
- private List<CommandStateListener> fireList = new ArrayList<CommandStateListener>();\r
- \r
- private void fireStateChange(IWorkbenchPart part, String commandId, String state) {\r
- fireList.clear();\r
- fireList.addAll(listeners);\r
- List<CommandStateListener> list = listenerWithCommandId.getValues(commandId);\r
- if (list != null) {\r
- fireList.addAll(list);\r
- \r
- }\r
- list = listenerWithPart.getValues(part);\r
- if (list != null) {\r
- fireList.addAll(list);\r
- \r
- } \r
- for (CommandStateListener l : fireList) {\r
- l.stateChanged(part, commandId, state);\r
- }\r
-\r
- }\r
- \r
-}\r
+package org.simantics.ui.toolbar;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.State;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.handlers.RadioState;
+import org.eclipse.ui.handlers.RegistryToggleState;
+import org.simantics.utils.datastructures.MapList;
+
+/**
+ * Registry for storing command states separately for each IEditorPart
+ *
+ * TODO : cleaning editor states and listeners is now implemented through ToolBarContributor. Is this OK?
+ *
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
+ *
+ */
+public class CommandStateRegistry {
+
+
+ private static CommandStateRegistry instance;
+
+
+ public static CommandStateRegistry getInstance() {
+ if (instance == null)
+ instance = new CommandStateRegistry();
+ return instance;
+ }
+
+
+
+ private Map<IWorkbenchPart,Map<String,Boolean>> toggleStates = new HashMap<IWorkbenchPart, Map<String,Boolean>>();
+ private Map<String,Boolean> defaultToggleStates = new HashMap<String, Boolean>();
+
+ private Map<String,String> defaultRadioStates = new HashMap<String, String>();
+ private Map<IWorkbenchPart,Map<String,String>> radioStates = new HashMap<IWorkbenchPart, Map<String,String>>();
+
+ private ICommandService service;
+ private IHandlerService handlerService;
+
+ private CommandStateRegistry() {
+ service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+ }
+
+ /**
+ * Stores default state for a command.
+ *
+ * Note: uses current state as default.
+ *
+ * @param commandId
+ */
+ public void storeDefaultState(String commandId) {
+ Command command = service.getCommand(commandId);
+ State toggleState = command.getState(RegistryToggleState.STATE_ID);
+ State radioState = command.getState(RadioState.STATE_ID);
+ if (toggleState != null) {
+ if (!defaultToggleStates.containsKey(commandId))
+ defaultToggleStates.put(commandId, getToggleState(command));
+ } else if (radioState != null) {
+ String value = (String) radioState.getValue();
+ if (!defaultRadioStates.containsKey(commandId))
+ defaultRadioStates.put(commandId, value);
+ } else {
+ throw new IllegalArgumentException("Command " + commandId + " does not have a state");
+ }
+ }
+ /**
+ * Stores toggle state of a command.
+ * @param part
+ * @param commandId
+ * @param checked
+ */
+ public void setEditorState(IWorkbenchPart part, String commandId, boolean checked) {
+ Map<String,Boolean> editorStates = toggleStates.get(part);
+ if (editorStates == null) {
+ editorStates = new HashMap<String, Boolean>();
+ toggleStates.put(part, editorStates);
+ }
+ editorStates.put(commandId, checked);
+ fireStateChange(part, commandId, Boolean.toString(checked));
+ }
+
+ /**
+ * Stores radio state of a command.
+ * @param part
+ * @param commandId
+ * @param value
+ */
+ public void setEditorState(IWorkbenchPart part, String commandId, String value) {
+ Map<String,String> editorStates = radioStates.get(part);
+ if (editorStates == null) {
+ editorStates = new HashMap<String, String>();
+ radioStates.put(part, editorStates);
+ }
+ editorStates.put(commandId, value);
+ fireStateChange(part, commandId, value);
+ }
+
+
+
+ public Map<String, Boolean> getDefaultToggleStates() {
+ return defaultToggleStates;
+ }
+
+ public Map<String, String> getDefaultRadioStates() {
+ return defaultRadioStates;
+ }
+
+ public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {
+ return toggleStates.get(part);
+ }
+
+ public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {
+ return radioStates.get(part);
+ }
+
+ public Boolean getToggleState(IWorkbenchPart part, String commandId) {
+ if (part == null)
+ return defaultToggleStates.get(commandId);
+ Map<String,Boolean> editorStates = toggleStates.get(part);
+ if (editorStates == null) {
+ return defaultToggleStates.get(commandId);
+ }
+ return editorStates.get(commandId);
+ }
+
+ public String getRadioState(IWorkbenchPart part, String commandId) {
+ if (part == null)
+ return defaultRadioStates.get(commandId);
+ Map<String,String> editorStates = radioStates.get(part);
+ if (editorStates == null) {
+ return defaultRadioStates.get(commandId);
+ }
+ return editorStates.get(commandId);
+ }
+
+ public void clearStates(IWorkbenchPart part) {
+ toggleStates.remove(part);
+ radioStates.remove(part);
+ listenerWithPart.remove(part);
+ }
+
+ private boolean getToggleState(Command command) {
+ State toggleState = command.getState(RegistryToggleState.STATE_ID);
+ return (Boolean)toggleState.getValue();
+ }
+
+
+ private List<CommandStateListener> listeners = new ArrayList<CommandStateListener>();
+ private MapList<String, CommandStateListener> listenerWithCommandId = new MapList<String, CommandStateListener>();
+ private MapList<IWorkbenchPart, CommandStateListener> listenerWithPart = new MapList<IWorkbenchPart, CommandStateListener>();
+
+ /**
+ * Attaches a listener that receives all state changes of all commands and all workbench parts.
+ * @param listener
+ */
+ public void addListener(CommandStateListener listener) {
+ if (!listeners.contains(listener))
+ listeners.add(listener);
+ }
+
+ /**
+ * Attaches a listener to receive state changes of specific workbench part.
+ * @param part
+ * @param listener
+ */
+ public void addListener(IWorkbenchPart part, CommandStateListener listener) {
+ if (!listenerWithPart.contains(part,listener))
+ listenerWithPart.add(part,listener);
+ }
+
+ /**
+ * Attaches a listener to receive state changes of specific command.
+ * @param part
+ * @param listener
+ */
+ public void addListener(String commandId, CommandStateListener listener) {
+ if (!listenerWithCommandId.contains(commandId,listener))
+ listenerWithCommandId.add(commandId, listener);
+ }
+
+ /**
+ * Removes the listener from the registry.
+ * @param listener
+ */
+ public void removeListener(CommandStateListener listener) {
+ listeners.remove(listener);
+ Set<String> commandIds = new HashSet<String>();
+ commandIds.addAll(listenerWithCommandId.getKeys());
+ for (String commandId : commandIds) {
+ listenerWithCommandId.remove(commandId, listener);
+ }
+ commandIds.clear();
+ Set<IWorkbenchPart> parts = new HashSet<IWorkbenchPart>();
+ parts.addAll(listenerWithPart.getKeys());
+ for (IWorkbenchPart part : parts) {
+ listenerWithPart.remove(part, listener);
+ }
+ parts.clear();
+ }
+
+ private List<CommandStateListener> fireList = new ArrayList<CommandStateListener>();
+
+ private void fireStateChange(IWorkbenchPart part, String commandId, String state) {
+ fireList.clear();
+ fireList.addAll(listeners);
+ List<CommandStateListener> list = listenerWithCommandId.getValues(commandId);
+ if (list != null) {
+ fireList.addAll(list);
+
+ }
+ list = listenerWithPart.getValues(part);
+ if (list != null) {
+ fireList.addAll(list);
+
+ }
+ for (CommandStateListener l : fireList) {
+ l.stateChanged(part, commandId, state);
+ }
+
+ }
+
+}