/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.plugins.applicationplugins; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.Anchor; import com.intellij.openapi.actionSystem.Constraints; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; import com.intellij.openapi.extensions.PluginId; import jetbrains.mps.plugins.actions.BaseKeymapChanges; import jetbrains.mps.plugins.custom.BaseCustomApplicationPlugin; import jetbrains.mps.workbench.action.IActionsRegistry; import jetbrains.mps.workbench.action.MPSActions; import jetbrains.mps.util.Pair; import jetbrains.mps.workbench.action.BaseAction; import jetbrains.mps.workbench.action.BaseGroup; import org.apache.log4j.Logger; import java.util.*; public abstract class BaseApplicationPlugin implements IActionsRegistry { private static final Logger LOG = org.apache.log4j.LogManager.getLogger(BaseApplicationPlugin.class); private ActionManagerEx myActionManager = ActionManagerEx.getInstanceEx(); private List<BaseCustomApplicationPlugin> myCustomPlugins; private List<BaseGroup> myGroups = new ArrayList<BaseGroup>(); private List<BaseKeymapChanges> myKeymapChanges = new ArrayList<BaseKeymapChanges>(); private Set<Pair<DefaultActionGroup, DefaultActionGroup>> myXmlGroups = new HashSet<Pair<DefaultActionGroup, DefaultActionGroup>>(); private Map<DefaultActionGroup, DefaultActionGroup> myAdjustedGroups = new HashMap<DefaultActionGroup, DefaultActionGroup>(); //----------plugin id------------ protected abstract PluginId getId(); //------actions and groups------- public void createGroups() { } public final void adjustGroups() { adjustInterfaceGroups(); adjustRegularGroups(); } public void adjustInterfaceGroups() { } public void adjustRegularGroups() { } protected void insertInterfaceGroupIntoAnother(String whatId, String toId, String labelName, Anchor anchor) { DefaultActionGroup gTo = (DefaultActionGroup) ActionManager.getInstance().getAction(toId); DefaultActionGroup gWhat = (DefaultActionGroup) ActionManager.getInstance().getAction(whatId); if (gTo == null) { LOG.warn("Destination group was not found id: " + toId + ". Trying to insert " + whatId); return; } if (gWhat == null) { LOG.warn("Group to insert was not found id: " + whatId + ". Trying to insert into " + toId); return; } if (!(gTo instanceof BaseGroup) && !(gWhat instanceof BaseGroup)) { myXmlGroups.add(new Pair<DefaultActionGroup, DefaultActionGroup>(gTo, gWhat)); } myAdjustedGroups.put(gTo, gWhat); if (labelName != null) { Constraints constraints = new Constraints(anchor, labelName); gTo.add(gWhat, constraints); } else { gTo.add(gWhat); } } protected void insertInterfaceGroupIntoAnother(String whatId, String toId, String labelName) { insertInterfaceGroupIntoAnother(whatId,toId, labelName, Anchor.AFTER); } protected void insertGroupIntoAnother(String whatId, String toId, String labelName) { insertInterfaceGroupIntoAnother(whatId, toId, labelName); //todo with this method, we can use Idea's ActionStubs } protected void insertGroupIntoAnother(String whatId, String toId, String labelName, Anchor anchor) { insertInterfaceGroupIntoAnother(whatId, toId, labelName, anchor); //todo with this method, we can use Idea's ActionStubs } @Override public void addParameterizedAction(BaseAction action, Object... params) { addAction(action); String shortId = action.getClass().getName(); for (BaseKeymapChanges kc : myKeymapChanges) { kc.parameterizedActionCreated(shortId, action.getActionId(), params); } } protected void addAction(BaseAction action) { myActionManager.registerAction(action.getActionId(), action, getId()); } protected void addGroup(BaseGroup group) { myActionManager.registerAction(group.getId(), group, getId()); myGroups.add(group); } //----------custom parts---------- public final void createCustomParts() { myCustomPlugins = initCustomParts(); } protected List<BaseCustomApplicationPlugin> initCustomParts() { return new ArrayList<BaseCustomApplicationPlugin>(); } //-------------keymaps------------ public void createKeymaps() { myKeymapChanges = initKeymaps(); for (BaseKeymapChanges change : myKeymapChanges) { change.init(); } } protected List<BaseKeymapChanges> initKeymaps() { return new ArrayList<BaseKeymapChanges>(); } //-------------common------------- public final void dispose() { //groups are disposed in ActionFactory //keymaps are unregistered in ActionFactory for (BaseCustomApplicationPlugin part : myCustomPlugins) { part.dispose(); } for (BaseKeymapChanges change : myKeymapChanges) { change.dispose(); } myKeymapChanges.clear(); for (Map.Entry<DefaultActionGroup, DefaultActionGroup> adjustedGroup : myAdjustedGroups.entrySet()) { adjustedGroup.getKey().remove(adjustedGroup.getValue()); } for (Pair<DefaultActionGroup, DefaultActionGroup> e : myXmlGroups) { e.o1.remove(e.o2); } MPSActions.getInstance().unregisterGroups(myGroups); myGroups.clear(); MPSActions.getInstance().unregisterActions(getId()); } }