| /****************************************************************************** |
| * Copyright (c) 2002, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| ****************************************************************************/ |
| |
| package org.eclipse.gmf.runtime.common.ui.util; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.actions.ActionFactory; |
| |
| /** |
| * A class that is used to handle all global menu/keyboard generated text actions |
| * associated with the displayed text editor |
| * |
| * @author Yasser Lulu |
| * |
| */ |
| public class InlineTextActionHandler |
| extends BaseInlineTextActionHandler |
| implements IInlineTextActionHandler { |
| /** |
| * the action bars for the site that the text editor is displayed within |
| */ |
| private IActionBars actionBars; |
| |
| /** |
| * a map used to maintain the global-textEditing action-pairs |
| */ |
| private Map actionPairMap; |
| /** |
| * global actions ids that are non-Eclipse, which the caller needs to have us |
| * disable while editing is in progress |
| */ |
| private List disableActionsIds; |
| |
| /** |
| * Constructor for InlineTextActionHandler. |
| * |
| * @param actionBars list of action bars for the site that the text editor is displayed within |
| * @param text widget used for editing |
| * @param disableActionsIds list of actions that must be disabled while editing is in progress |
| */ |
| public InlineTextActionHandler( |
| IActionBars actionBars, |
| Text text, |
| List disableActionsIds) { |
| super(text); |
| setActionPairMap(new HashMap()); |
| setActionBars(actionBars); |
| this.disableActionsIds = disableActionsIds; |
| } |
| /** |
| * a class used to insert a disabled action to be used whenever a given |
| * global action has no corresponding replacement for text (e.g., find) |
| */ |
| private class DisabledTextActionHandler extends Action { |
| /** |
| * Constructor. |
| * |
| * @param name name label |
| */ |
| protected DisabledTextActionHandler(String name) { |
| super(name); |
| setEnabled(false); |
| } |
| public void setEnabled(boolean enabled) { |
| super.setEnabled(false); |
| } |
| } |
| /** |
| * a structure used to hold the global-action and its correponding |
| * text-action replacement |
| */ |
| private class ActionPair { |
| /** |
| * the action id |
| */ |
| String actionId; |
| /** |
| * the original action as installed by the app |
| */ |
| IAction originalAction; |
| /** |
| * our own corresponding action replacement for handling text |
| */ |
| IAction textHandlerAction; |
| } |
| |
| /** |
| * returns the action-bars for the view-site |
| * @return IActionBars The action-bars |
| */ |
| private IActionBars getActionBars() { |
| return actionBars; |
| } |
| /** |
| * sets the action bars for the site |
| * @param actionBars the IActionBars |
| */ |
| private void setActionBars(IActionBars actionBars) { |
| this.actionBars = actionBars; |
| } |
| |
| /** |
| * builds the action map pair |
| */ |
| private void buildActionPairMap() { |
| if (getActionPairMap().isEmpty() == false) { |
| return; |
| } |
| ActionPair actionPair = null; |
| IAction action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.CUT.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.CUT.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = new Action(action.getText()) { |
| public void run() { |
| handleCut(); |
| } |
| }; |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| ////////////////// |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.COPY.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.COPY.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = new Action(action.getText()) { |
| public void run() { |
| handleCopy(); |
| } |
| }; |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| ////////////////// |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.PASTE.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.PASTE.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = new Action(action.getText()) { |
| public void run() { |
| handlePaste(); |
| } |
| }; |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| ////////////////// |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.DELETE.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.DELETE.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = new Action(action.getText()) { |
| public void run() { |
| handleDelete(); |
| } |
| }; |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| ////////////////// |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.SELECT_ALL.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.SELECT_ALL.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = new Action(action.getText()) { |
| public void run() { |
| handleSelectAll(); |
| } |
| }; |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| ////////////// |
| |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.UNDO.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.UNDO.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = |
| new DisabledTextActionHandler(action.getText()); |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.REDO.getId()); |
| if (action != null) { |
| action.setEnabled(false); |
| |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.REDO.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = |
| new DisabledTextActionHandler(action.getText()); |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| |
| action = |
| getActionBars().getGlobalActionHandler( |
| ActionFactory.FIND.getId()); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = ActionFactory.FIND.getId(); |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = |
| new DisabledTextActionHandler(action.getText()); |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| |
| Iterator it = disableActionsIds.iterator(); |
| String specialCommandId = null; |
| while (it.hasNext()) { |
| specialCommandId = (String) it.next(); |
| action = getActionBars().getGlobalActionHandler(specialCommandId); |
| if (action != null) { |
| actionPair = new ActionPair(); |
| actionPair.actionId = specialCommandId; |
| actionPair.originalAction = action; |
| actionPair.textHandlerAction = |
| new DisabledTextActionHandler(action.getText()); |
| getActionPairMap().put(actionPair.actionId, actionPair); |
| } |
| } |
| |
| } |
| /** |
| * hooks our text actions by replacing the installed global actions with |
| * one suitable for text editing, in order to retarget them correctly while |
| * the editing is in progress |
| */ |
| public void hookHandlers() { |
| buildActionPairMap(); |
| ActionPair actionPair = null; |
| Iterator it = getActionPairMap().values().iterator(); |
| while (it.hasNext()) { |
| actionPair = (ActionPair) it.next(); |
| getActionBars().setGlobalActionHandler(actionPair.actionId, null); |
| } |
| getActionBars().updateActionBars(); |
| it = getActionPairMap().values().iterator(); |
| while (it.hasNext()) { |
| actionPair = (ActionPair) it.next(); |
| getActionBars().setGlobalActionHandler( |
| actionPair.actionId, |
| actionPair.textHandlerAction); |
| actionPair.textHandlerAction.setEnabled(true); |
| } |
| getActionBars().updateActionBars(); |
| setHooked(true); |
| } |
| /** |
| * unhooks and uninstall our text actions and re-install the original global |
| * actions |
| */ |
| public void unHookHandlers() { |
| ActionPair actionPair = null; |
| Iterator it = getActionPairMap().values().iterator(); |
| while (it.hasNext()) { |
| actionPair = (ActionPair) it.next(); |
| getActionBars().setGlobalActionHandler(actionPair.actionId, null); |
| } |
| getActionBars().updateActionBars(); |
| it = getActionPairMap().values().iterator(); |
| while (it.hasNext()) { |
| actionPair = (ActionPair) it.next(); |
| getActionBars().setGlobalActionHandler( |
| actionPair.actionId, |
| actionPair.originalAction); |
| actionPair.originalAction.setEnabled( |
| actionPair.originalAction.isEnabled()); |
| } |
| getActionBars().updateActionBars(); |
| setHooked(false); |
| } |
| |
| /** |
| * diposes this action-handler |
| * |
| */ |
| public void dispose() { |
| super.dispose(); |
| setActionPairMap(null); |
| setActionBars(null); |
| disableActionsIds = null; |
| } |
| /** |
| * Returns the actionPairMap. |
| * @return Map |
| */ |
| private Map getActionPairMap() { |
| return actionPairMap; |
| } |
| |
| /** |
| * Sets the actionPairMap. |
| * @param actionPairMap The actionPairMap to set |
| */ |
| private void setActionPairMap(Map actionPairMap) { |
| this.actionPairMap = actionPairMap; |
| } |
| } |