/**
* Copyright (c) 2002-2006 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 - Initial API and implementation
*/
package org.eclipse.emf.edit.ui.action;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheet;
/**
* This is a contributor for an editor, multi-page or otherwise,
* that implements {@link IEditingDomainProvider}.
* It automatically hooks up the Undo, Redo, Cut, Copy, Paste, and Delete actions on the Edit menu
* to the corresponding commands supported by the {@link org.eclipse.emf.edit.domain.EditingDomain}.
* The editor site'selection provider is used to keep the Cut, Copy, Paste, and Delete actions up-to-date.
* The actions are also refreshed every time the editor fires to its {@link IPropertyListener}s.
* <p>
* Another very useful feature of this contributor is that it can be used as follows:
* <pre>
* ((IMenuListener)((IEditorSite)getSite()).getActionBarContributor()).menuAboutToShow(menuManager);
* </pre>
* to contribute the Edit menu actions to a pop-up menu.
*/
public class EditingDomainActionBarContributor
extends
MultiPageEditorActionBarContributor
implements
IMenuListener,
IPropertyListener
{
/**
* This keeps track of the current editor part.
*/
protected IEditorPart activeEditor;
/**
* This is the action used to implement delete.
*/
protected DeleteAction deleteAction;
/**
* This is the action used to implement cut.
*/
protected CutAction cutAction;
/**
* This is the action used to implement copy.
*/
protected CopyAction copyAction;
/**
* This is the action used to implement paste.
*/
protected PasteAction pasteAction;
/**
* This is the action used to implement undo.
*/
protected UndoAction undoAction;
/**
* This is the action used to implement redo.
*/
protected RedoAction redoAction;
/**
* This is the action used to load a resource.
*/
protected LoadResourceAction loadResourceAction;
/**
* This is the action used to control or uncontrol a contained object.
*/
protected ControlAction controlAction;
/**
* This is the action used to perform validation.
*/
protected ValidateAction validateAction;
/**
* This is the action used to perform validation.
* @since 2.9
*/
protected DiagnosticDecorator.LiveValidator.LiveValidationAction liveValidationAction;
/**
* This style bit indicates that the "additions" separator should come after the "edit" separator.
*/
public static final int ADDITIONS_LAST_STYLE = 0x1;
/**
* This is used to encode the style bits.
*/
protected int style;
/**
* This creates an instance of the contributor.
*/
public EditingDomainActionBarContributor()
{
super();
}
/**
* This creates an instance of the contributor.
*/
public EditingDomainActionBarContributor(int style)
{
super();
this.style = style;
}
@Override
public void init(IActionBars actionBars)
{
super.init(actionBars);
ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
deleteAction = createDeleteAction();
deleteAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
cutAction = createCutAction();
cutAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
copyAction = createCopyAction();
copyAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
pasteAction = createPasteAction();
pasteAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
undoAction = createUndoAction();
undoAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
redoAction = createRedoAction();
redoAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction);
}
/**
* Returns the action used to implement delete.
* @see #deleteAction
* @since 2.6
*/
protected DeleteAction createDeleteAction()
{
return new DeleteAction(removeAllReferencesOnDelete());
}
/**
* Returns the action used to implement cut.
* @see #cutAction
* @since 2.6
*/
protected CutAction createCutAction()
{
return new CutAction();
}
/**
* Returns the action used to implement copy.
* @see #copyAction
* @since 2.6
*/
protected CopyAction createCopyAction()
{
return new CopyAction();
}
/**
* Returns the action used to implement paste.
* @see #pasteAction
* @since 2.6
*/
protected PasteAction createPasteAction()
{
return new PasteAction();
}
/**
* Returns the action used to implement undo.
* @see #undoAction
* @since 2.6
*/
protected UndoAction createUndoAction()
{
return new UndoAction();
}
/**
* Returns the action used to implement redo.
* @see #redoAction
* @since 2.6
*/
protected RedoAction createRedoAction()
{
return new RedoAction();
}
/**
* This determines whether or not the delete action should clean up all references to the deleted objects.
* It is false by default, to provide the same beahviour, by default, as in EMF 2.1 and before.
* You should probably override this method to return true, in order to get the new, more useful beahviour.
* @since 2.2
*/
protected boolean removeAllReferencesOnDelete()
{
return false;
}
@Override
public void contributeToMenu(IMenuManager menuManager)
{
super.contributeToMenu(menuManager);
}
@Override
public void contributeToStatusLine(IStatusLineManager statusLineManager)
{
super.contributeToStatusLine(statusLineManager);
}
@Override
public void contributeToToolBar(IToolBarManager toolBarManager)
{
super.contributeToToolBar(toolBarManager);
}
public void shareGlobalActions(IPage page, IActionBars actionBars)
{
if (!(page instanceof IPropertySheetPage))
{
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
}
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction);
}
/**
* @deprecated
*/
@Deprecated
public void setActiveView(IViewPart part)
{
IActionBars actionBars = part.getViewSite().getActionBars();
if (!(part instanceof PropertySheet))
{
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
}
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction);
actionBars.updateActionBars();
}
public IEditorPart getActiveEditor()
{
return activeEditor;
}
@Override
public void setActiveEditor(IEditorPart part)
{
super.setActiveEditor(part);
if (part != activeEditor)
{
if (activeEditor != null)
{
deactivate();
}
if (part instanceof IEditingDomainProvider)
{
activeEditor = part;
activate();
}
}
}
@Override
public void setActivePage(IEditorPart part)
{
// Do nothing
}
public void deactivate()
{
activeEditor.removePropertyListener(this);
deleteAction.setActiveWorkbenchPart(null);
cutAction.setActiveWorkbenchPart(null);
copyAction.setActiveWorkbenchPart(null);
pasteAction.setActiveWorkbenchPart(null);
undoAction.setActiveWorkbenchPart(null);
redoAction.setActiveWorkbenchPart(null);
if (loadResourceAction != null)
{
loadResourceAction.setActiveWorkbenchPart(null);
}
if (controlAction != null)
{
controlAction.setActiveWorkbenchPart(null);
}
if (validateAction != null)
{
validateAction.setActiveWorkbenchPart(null);
}
if (liveValidationAction != null)
{
liveValidationAction.setActiveWorkbenchPart(null);
}
ISelectionProvider selectionProvider =
activeEditor instanceof ISelectionProvider ?
(ISelectionProvider)activeEditor :
activeEditor.getEditorSite().getSelectionProvider();
if (selectionProvider != null)
{
selectionProvider.removeSelectionChangedListener(deleteAction);
selectionProvider.removeSelectionChangedListener(cutAction);
selectionProvider.removeSelectionChangedListener(copyAction);
selectionProvider.removeSelectionChangedListener(pasteAction);
if (validateAction != null)
{
selectionProvider.removeSelectionChangedListener(validateAction);
}
if (controlAction != null)
{
selectionProvider.removeSelectionChangedListener(controlAction);
}
}
}
public void activate()
{
activeEditor.addPropertyListener(this);
deleteAction.setActiveWorkbenchPart(activeEditor);
cutAction.setActiveWorkbenchPart(activeEditor);
copyAction.setActiveWorkbenchPart(activeEditor);
pasteAction.setActiveWorkbenchPart(activeEditor);
undoAction.setActiveWorkbenchPart(activeEditor);
redoAction.setActiveWorkbenchPart(activeEditor);
if (loadResourceAction != null)
{
loadResourceAction.setActiveWorkbenchPart(activeEditor);
}
if (controlAction != null)
{
controlAction.setActiveWorkbenchPart(activeEditor);
}
if (validateAction != null)
{
validateAction.setActiveWorkbenchPart(activeEditor);
}
if (liveValidationAction != null)
{
liveValidationAction.setActiveWorkbenchPart(activeEditor);
}
ISelectionProvider selectionProvider =
activeEditor instanceof ISelectionProvider ?
(ISelectionProvider)activeEditor :
activeEditor.getEditorSite().getSelectionProvider();
if (selectionProvider != null)
{
selectionProvider.addSelectionChangedListener(deleteAction);
selectionProvider.addSelectionChangedListener(cutAction);
selectionProvider.addSelectionChangedListener(copyAction);
selectionProvider.addSelectionChangedListener(pasteAction);
if (validateAction != null)
{
selectionProvider.addSelectionChangedListener(validateAction);
}
if (controlAction != null)
{
selectionProvider.addSelectionChangedListener(controlAction);
}
}
update();
}
public void update()
{
ISelectionProvider selectionProvider =
activeEditor instanceof ISelectionProvider ?
(ISelectionProvider)activeEditor :
activeEditor.getEditorSite().getSelectionProvider();
if (selectionProvider != null)
{
ISelection selection = selectionProvider.getSelection();
IStructuredSelection structuredSelection =
selection instanceof IStructuredSelection ? (IStructuredSelection)selection : StructuredSelection.EMPTY;
deleteAction.updateSelection(structuredSelection);
cutAction.updateSelection(structuredSelection);
copyAction.updateSelection(structuredSelection);
pasteAction.updateSelection(structuredSelection);
if (validateAction != null)
{
validateAction.updateSelection(structuredSelection);
}
if (controlAction != null)
{
controlAction.updateSelection(structuredSelection);
}
}
undoAction.update();
redoAction.update();
if (loadResourceAction != null)
{
loadResourceAction.update();
}
if (liveValidationAction != null)
{
liveValidationAction.update();
}
}
/**
* This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu.
*/
public void menuAboutToShow(IMenuManager menuManager)
{
// Add our standard marker.
//
if ((style & ADDITIONS_LAST_STYLE) == 0)
{
menuManager.add(new Separator("additions"));
}
menuManager.add(new Separator("edit"));
// Add the edit menu actions.
//
menuManager.add(new ActionContributionItem(undoAction));
menuManager.add(new ActionContributionItem(redoAction));
menuManager.add(new Separator());
menuManager.add(new ActionContributionItem(cutAction));
menuManager.add(new ActionContributionItem(copyAction));
menuManager.add(new ActionContributionItem(pasteAction));
menuManager.add(new Separator());
menuManager.add(new ActionContributionItem(deleteAction));
menuManager.add(new Separator());
if ((style & ADDITIONS_LAST_STYLE) != 0)
{
menuManager.add(new Separator("additions"));
menuManager.add(new Separator());
}
// Add our other standard marker.
//
menuManager.add(new Separator("additions-end"));
addGlobalActions(menuManager);
}
/**
* This inserts global actions before the "additions-end" separator.
*/
protected void addGlobalActions(IMenuManager menuManager)
{
String key = (style & ADDITIONS_LAST_STYLE) == 0 ? "additions-end" : "additions";
if (validateAction != null)
{
menuManager.insertBefore(key, new ActionContributionItem(validateAction));
}
if (liveValidationAction != null)
{
menuManager.insertBefore(key, new ActionContributionItem(liveValidationAction));
}
if (controlAction != null)
{
menuManager.insertBefore(key, new ActionContributionItem(controlAction));
}
if (validateAction != null || controlAction != null)
{
menuManager.insertBefore(key, new Separator());
}
if (loadResourceAction != null)
{
menuManager.insertBefore("additions-end", new ActionContributionItem(loadResourceAction));
menuManager.insertBefore("additions-end", new Separator());
}
}
public void propertyChanged(Object source, int id)
{
update();
}
}