1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g3d.toolbar;
\r
14 import java.util.HashMap;
\r
15 import java.util.Map;
\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
27 * Registry for storing command states separately for each IEditorPart
\r
29 * TODO : how to change toggle/radios state from editor?
\r
30 * TODO : how to update visible buttons (ToolbarContributor)
\r
32 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
35 public class CommandStateRegistry {
\r
38 private static CommandStateRegistry instance;
\r
41 public static CommandStateRegistry getInstance() {
\r
42 if (instance == null)
\r
43 instance = new CommandStateRegistry();
\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
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
55 private ICommandService service;
\r
56 private IHandlerService handlerService;
\r
58 private CommandStateRegistry() {
\r
59 service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
\r
60 handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
\r
64 * Stores default state for a command.
\r
66 * Note: uses current state as default.
\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
82 throw new IllegalArgumentException("Command " + commandId + " does not have a state");
\r
86 * Stores toggle state of a command.
\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
97 editorStates.put(commandId, checked);
\r
101 * Stores radio state of a command.
\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
112 editorStates.put(commandId, value);
\r
115 public Map<String, Boolean> getDefaultToggleStates() {
\r
116 return defaultToggleStates;
\r
119 public Map<String, String> getDefaultRadioStates() {
\r
120 return defaultRadioStates;
\r
123 public Map<String, Boolean> getEditorToggleStates(IWorkbenchPart part) {
\r
124 return toggleStates.get(part);
\r
127 public Map<String, String> getEditorRadioStates(IWorkbenchPart part) {
\r
128 return radioStates.get(part);
\r
131 public Boolean getToggleState(IWorkbenchPart part, String commandId) {
\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
138 return editorStates.get(commandId);
\r
141 public String getRadioState(IWorkbenchPart part, String commandId) {
\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
148 return editorStates.get(commandId);
\r
151 public void clearStates(IWorkbenchPart part) {
\r
152 toggleStates.remove(part);
\r
153 radioStates.remove(part);
\r
156 private boolean getToggleState(Command command) {
\r
157 State toggleState = command.getState(RegistryToggleState.STATE_ID);
\r
158 return (Boolean)toggleState.getValue();
\r