X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Ftoolbar%2FCommandStateRegistry.java;fp=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Ftoolbar%2FCommandStateRegistry.java;h=abb92f9e7dd766fd9dd9dfec8e04a9bfcf65343d;hb=87b3241ec277ba3d8e414b26186a032c9cdcaeed;hp=0000000000000000000000000000000000000000;hpb=1f0bcd66274375f2278d2e6c486cb28257a5f7b2;p=simantics%2F3d.git 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 index 00000000..abb92f9e --- /dev/null +++ b/org.simantics.g3d/src/org/simantics/g3d/toolbar/CommandStateRegistry.java @@ -0,0 +1,151 @@ +package org.simantics.g3d.toolbar; + +import java.util.HashMap; +import java.util.Map; + +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; + +/** + * Registry for storing command states separately for each IEditorPart + * + * TODO : how to change toggle/radios state from editor? + * TODO : how to update visible buttons (ToolbarContributor) + * + * @author Marko Luukkainen + * + */ +public class CommandStateRegistry { + + + private static CommandStateRegistry instance; + + + public static CommandStateRegistry getInstance() { + if (instance == null) + instance = new CommandStateRegistry(); + return instance; + } + + + + private Map> toggleStates = new HashMap>(); + private Map defaultToggleStates = new HashMap(); + + private Map defaultRadioStates = new HashMap(); + private Map> radioStates = new HashMap>(); + + 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 editorStates = toggleStates.get(part); + if (editorStates == null) { + editorStates = new HashMap(); + toggleStates.put(part, editorStates); + } + editorStates.put(commandId, checked); + } + + /** + * Stores radio state of a command. + * @param part + * @param commandId + * @param value + */ + public void setEditorState(IWorkbenchPart part, String commandId, String value) { + Map editorStates = radioStates.get(part); + if (editorStates == null) { + editorStates = new HashMap(); + radioStates.put(part, editorStates); + } + editorStates.put(commandId, value); + } + + public Map getDefaultToggleStates() { + return defaultToggleStates; + } + + public Map getDefaultRadioStates() { + return defaultRadioStates; + } + + public Map getEditorToggleStates(IWorkbenchPart part) { + return toggleStates.get(part); + } + + public Map getEditorRadioStates(IWorkbenchPart part) { + return radioStates.get(part); + } + + public Boolean getToggleState(IWorkbenchPart part, String commandId) { + if (part == null) + return defaultToggleStates.get(commandId); + Map 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 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); + } + + private boolean getToggleState(Command command) { + State toggleState = command.getState(RegistryToggleState.STATE_ID); + return (Boolean)toggleState.getValue(); + } + + +}