blob: 8d43f83ac902099db12b6e25c45dcc33a0a720b5 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.action.CopyAction;
import org.eclipse.emf.edit.ui.action.CutAction;
import org.eclipse.emf.edit.ui.action.DeleteAction;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
import org.eclipse.emf.edit.ui.action.PasteAction;
import org.eclipse.emf.edit.ui.action.RedoAction;
import org.eclipse.emf.edit.ui.action.UndoAction;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
import org.eclipse.epf.validation.LibraryEValidator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.SubContributionItem;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
/**
* The Library view action bar contributor.
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class LibraryActionBarContributor extends
EditingDomainActionBarContributor implements
ILibraryActionBarContributor, ISelectionChangedListener {
// Keep track of the active editor.
protected IViewPart activeViewPart;
// Keep track of the current selection provider.
protected ISelectionProvider selectionProvider;
protected IActionBars viewActionBars;
// Library view edit action
protected LibraryViewEditAction libraryViewEditAction;
// Configuration view edit action
protected ConfigurationViewEditAction configViewEditAction;
private EditingDomain editingDomain;
/**
* Displays the Properties view.
*/
protected IAction showPropertiesViewAction = new Action(
AuthoringUIResources._UI_ShowPropertiesView_menu_item) { //$NON-NLS-1$
public void run() {
try {
try {
getPage().showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
} catch (PartInitException exception) {
exception.printStackTrace();
}
} catch (RuntimeException e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
}
};
/**
* Refreshes the viewer of the current editor if the editor implements
* {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
*/
protected IAction refreshViewerAction = new Action(
AuthoringUIResources._UI_RefreshViewer_menu_item) { //$NON-NLS-1$
public boolean isEnabled() {
return activeViewPart instanceof IViewerProvider;
}
public void run() {
if (activeViewPart instanceof IViewerProvider) {
Viewer viewer = ((IViewerProvider) activeViewPart).getViewer();
if (viewer != null) {
refreshViewer(viewer);
}
}
}
};
/**
* This will contain one
* {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to
* each descriptor generated for the current selection by the item provider.
*/
protected Collection createChildActions;
/**
* The menu manager into which menu contribution items should be added for
* CreateChild actions.
*/
protected IMenuManager createChildMenuManager;
/**
* This will contain one
* {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding
* to each descriptor generated for the current selection by the item
* provider.
*/
protected Collection createSiblingActions;
/**
* This is the menu manager into which menu contribution items should be
* added for CreateSibling actions.
*/
protected IMenuManager createSiblingMenuManager;
/**
* Creates a new instance.
*/
public LibraryActionBarContributor(EditingDomain editingDomain) {
this.editingDomain = editingDomain;
validateAction = new LibraryValidateAction();
((LibraryValidateAction)validateAction).putContextData(LibraryEValidator.CTX_ADAPTER_FACTORY_PROVIDER,
ProcessEditor.adapterFactoryProvider);
}
/**
* @param viewer
*/
protected void refreshViewer(Viewer viewer) {
viewer.refresh();
}
/**
* Adds Separators for editor additions to the tool bar.
*/
public void contributeToToolBar(IToolBarManager toolBarManager) {
toolBarManager.add(new Separator("method-settings")); //$NON-NLS-1$
toolBarManager.add(new Separator("method-additions")); //$NON-NLS-1$
}
/**
* Adds to the menu bar a menu and some separators for editor
* additions, as well as the sub-menus for object creation items.
*/
public void contributeToMenu(IMenuManager menuManager) {
super.contributeToMenu(menuManager);
IMenuManager submenuManager = new MenuManager(
AuthoringUIResources._UI_MethodEditor_menu, "com.ibm.methodMenuID"); //$NON-NLS-1$ //$NON-NLS-2$
menuManager.insertAfter("additions", submenuManager); //$NON-NLS-1$
submenuManager.add(new Separator("settings")); //$NON-NLS-1$
submenuManager.add(new Separator("actions")); //$NON-NLS-1$
submenuManager.add(new Separator("additions")); //$NON-NLS-1$
submenuManager.add(new Separator("additions-end")); //$NON-NLS-1$
// Prepare for CreateChild item addition or removal.
createChildMenuManager = new MenuManager(
AuthoringUIResources._UI_CreateChild_menu_item); //$NON-NLS-1$
submenuManager.insertBefore("additions", createChildMenuManager); //$NON-NLS-1$
// Prepare for CreateSibling item addition or removal.
createSiblingMenuManager = new MenuManager(
AuthoringUIResources._UI_CreateSibling_menu_item); //$NON-NLS-1$
submenuManager.insertBefore("additions", createSiblingMenuManager); //$NON-NLS-1$
// Force an update because Eclipse hides empty menus now.
submenuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager menuManager) {
menuManager.updateAll(true);
}
});
addGlobalActions(submenuManager);
}
public IViewPart getActiveView() {
return activeViewPart;
}
public void setActiveView(IViewPart part) {
// TODO - may need to check other method
if (part != null)
super.setActiveView(part);
if (part == activeViewPart)
return;
if (activeViewPart != null) {
deactivate();
}
if (part == null) {
selectionProvider = null;
}
if (!(part instanceof IEditingDomainProvider))
return;
activeViewPart = part;
editingDomain = ((IEditingDomainProvider) part).getEditingDomain();
// Switch to the new selection provider.
if (selectionProvider != null) {
selectionProvider.removeSelectionChangedListener(this);
} else {
selectionProvider = part.getSite().getSelectionProvider();
selectionProvider.addSelectionChangedListener(this);
// Fake a selection changed event to update the menus.
if (selectionProvider.getSelection() != null) {
selectionChanged(new SelectionChangedEvent(selectionProvider,
selectionProvider.getSelection()));
}
}
activate();
}
public void deactivate() {
activeViewPart.removePropertyListener(this);
deleteAction.setEditingDomain(null);
cutAction.setEditingDomain(null);
copyAction.setEditingDomain(null);
pasteAction.setEditingDomain(null);
undoAction.setEditingDomain(null);
redoAction.setEditingDomain(null);
if (loadResourceAction != null) {
loadResourceAction.setEditingDomain(null);
}
ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
: activeViewPart.getSite().getSelectionProvider();
selectionProvider.removeSelectionChangedListener(deleteAction);
selectionProvider.removeSelectionChangedListener(libraryViewEditAction);
selectionProvider.removeSelectionChangedListener(cutAction);
selectionProvider.removeSelectionChangedListener(copyAction);
selectionProvider.removeSelectionChangedListener(pasteAction);
}
public void disableGlobalEditMenu() {
deleteAction.setEnabled(false);
if (libraryViewEditAction != null)
libraryViewEditAction.setEnabled(false);
if (configViewEditAction != null)
configViewEditAction.setEnabled(false);
cutAction.setEnabled(false);
copyAction.setEnabled(false);
pasteAction.setEnabled(false);
undoAction.setEnabled(false);
redoAction.setEnabled(false);
}
public void enableGlobalEditMenu() {
deleteAction.setEnabled(true);
if (libraryViewEditAction != null)
libraryViewEditAction.setEnabled(true);
if (configViewEditAction != null)
configViewEditAction.setEnabled(true);
cutAction.setEnabled(true);
copyAction.setEnabled(true);
pasteAction.setEnabled(true);
undoAction.setEnabled(true);
redoAction.setEnabled(true);
}
/**
* @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#activate()
*/
public void activate() {
activeViewPart.addPropertyListener(this);
deleteAction.setEditingDomain(editingDomain);
cutAction.setEditingDomain(editingDomain);
copyAction.setEditingDomain(editingDomain);
pasteAction.setEditingDomain(editingDomain);
undoAction.setEditingDomain(editingDomain);
redoAction.setEditingDomain(editingDomain);
if (loadResourceAction != null) {
loadResourceAction.setEditingDomain(editingDomain);
}
ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
: activeViewPart.getSite().getSelectionProvider();
selectionProvider.addSelectionChangedListener(deleteAction);
selectionProvider.addSelectionChangedListener(libraryViewEditAction);
selectionProvider.addSelectionChangedListener(cutAction);
selectionProvider.addSelectionChangedListener(copyAction);
selectionProvider.addSelectionChangedListener(pasteAction);
if (validateAction != null) {
selectionProvider.addSelectionChangedListener(validateAction);
}
if (controlAction != null) {
selectionProvider.addSelectionChangedListener(controlAction);
}
update();
}
/**
* @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#update()
*/
public void update() {
if (activeViewPart == null)
return;
ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
: activeViewPart.getSite().getSelectionProvider();
ISelection selection = selectionProvider.getSelection();
IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection
: StructuredSelection.EMPTY;
deleteAction.updateSelection(structuredSelection);
libraryViewEditAction.updateSelection(structuredSelection);
cutAction.updateSelection(structuredSelection);
copyAction.updateSelection(structuredSelection);
pasteAction.updateSelection(structuredSelection);
undoAction.update();
redoAction.update();
if (loadResourceAction != null) {
loadResourceAction.update();
}
if (validateAction != null) {
validateAction.updateSelection(structuredSelection);
}
}
/**
* This implements
* {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling
* {@link org.eclipse.jface.viewers.SelectionChangedEvent} by querying for
* the children and siblings that can be added to the selected object and
* updating the menus accordingly.
*/
public void selectionChanged(SelectionChangedEvent event) {
// Remove any menu items for old selection.
if (createChildMenuManager != null) {
depopulateManager(createChildMenuManager, createChildActions);
}
if (createSiblingMenuManager != null) {
depopulateManager(createSiblingMenuManager, createSiblingActions);
}
// Query the new selection for appropriate new child/sibling descriptors
Collection newChildDescriptors = null;
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection
&& ((IStructuredSelection) selection).size() == 1) {
Object object = ((IStructuredSelection) selection)
.getFirstElement();
EditingDomain domain = ((IEditingDomainProvider) activeViewPart)
.getEditingDomain();
newChildDescriptors = domain.getNewChildDescriptors(object, null);
}
// Generate actions for selection; populate and redraw the menus.
createChildActions = generateCreateChildActions(newChildDescriptors,
selection);
if (createChildMenuManager != null) {
populateManager(createChildMenuManager, createChildActions, null);
createChildMenuManager.update(true);
}
}
/**
* This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction}
* for each object in <code>descriptors</code>, and returns the
* collection of these actions.
*/
protected Collection generateCreateChildActions(Collection descriptors,
ISelection selection) {
Collection actions = new ArrayList();
if (descriptors != null) {
for (Iterator i = descriptors.iterator(); i.hasNext();) {
actions.add(new MethodCreateChildAction(editingDomain,
selection, i.next()));
}
}
return actions;
}
/**
* This generates a
* {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each
* object in <code>descriptors</code>, and returns the collection of
* these actions.
*/
protected Collection generateCreateSiblingActions(Collection descriptors,
ISelection selection) {
Collection actions = new ArrayList();
if (descriptors != null) {
for (Iterator i = descriptors.iterator(); i.hasNext();) {
actions.add(new MethodCreateSiblingAction(activeViewPart,
selection, i.next()));
}
}
return actions;
}
/**
* This populates the specified <code>manager</code> with
* {@link org.eclipse.jface.action.ActionContributionItem}s based on the
* {@link org.eclipse.jface.action.IAction}s contained in the
* <code>actions</code> collection, by inserting them before the specified
* contribution item <code>contributionID</code>. If <code>ID</code> is
* <code>null</code>, they are simply added.
*/
protected void populateManager(IContributionManager manager,
Collection actions, String contributionID) {
if (actions != null) {
for (Iterator i = actions.iterator(); i.hasNext();) {
IAction action = (IAction) i.next();
if (contributionID != null) {
manager.insertBefore(contributionID, action);
} else {
manager.add(action);
}
}
}
}
/**
* This removes from the specified <code>manager</code> all
* {@link org.eclipse.jface.action.ActionContributionItem}s based on the
* {@link org.eclipse.jface.action.IAction}s contained in the
* <code>actions</code> collection.
*/
protected void depopulateManager(IContributionManager manager,
Collection actions) {
if (actions != null) {
IContributionItem[] items = manager.getItems();
for (int i = 0; i < items.length; i++) {
// Look into SubContributionItems
IContributionItem contributionItem = items[i];
while (contributionItem instanceof SubContributionItem) {
contributionItem = ((SubContributionItem) contributionItem)
.getInnerItem();
}
// Delete the ActionContributionItems with matching action.
if (contributionItem instanceof ActionContributionItem) {
IAction action = ((ActionContributionItem) contributionItem)
.getAction();
if (actions.contains(action)) {
manager.remove(contributionItem);
}
}
}
}
}
/**
* This populates the pop-up menu before it appears.
*/
public void menuAboutToShow(IMenuManager menuManager) {
super.menuAboutToShow(menuManager);
MenuManager submenuManager = null;
submenuManager = new MenuManager(AuthoringUIResources._UI_CreateChild_menu_item); //$NON-NLS-1$
populateManager(submenuManager, createChildActions, null);
menuManager.insertBefore("additions", submenuManager); //$NON-NLS-1$
}
/**
* Inserts global actions before the "additions-end" separator.
*/
protected void addGlobalActions(IMenuManager menuManager) {
menuManager.insertAfter("additions-end", new Separator("ui-actions")); //$NON-NLS-1$ //$NON-NLS-2$
refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$
menuManager.insertBefore("additions-end", new Separator()); //$NON-NLS-1$
String key = (style & ADDITIONS_LAST_STYLE) == 0 ? "additions-end" : "additions";
if (validateAction != null)
{
menuManager.insertBefore(key, new ActionContributionItem(validateAction));
}
}
/**
* @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars,
* IWorkbenchPage)
*/
public void init(IActionBars actionBars, IWorkbenchPage page) {
super.init(actionBars, page);
}
/**
* @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars)
*/
public void init(IActionBars actionBars) {
viewActionBars = actionBars;
ISharedImages sharedImages = PlatformUI.getWorkbench()
.getSharedImages();
libraryViewEditAction = new LibraryViewEditAction(AuthoringUIResources.actionLabel_edit); //$NON-NLS-1$
actionBars.setGlobalActionHandler(LibraryViewEditAction.ACTION_ID,
libraryViewEditAction);
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);
deleteAction = createDeleteAction();
deleteAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
deleteAction);
undoAction = new UndoAction();
undoAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
undoAction);
redoAction = new RedoAction();
redoAction.setImageDescriptor(sharedImages
.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
redoAction);
libraryViewEditAction.setEnabled(false);
}
/**
* Creates cut action
* @return action
*/
protected CutAction createCutAction() {
return new CutAction();
}
/**
* Creates paste action
* @return action
*/
protected PasteAction createPasteAction() {
return new PasteAction();
}
/**
* Creates copy action
* @return action
*/
protected CopyAction createCopyAction() {
return new CopyAction();
}
/**
* Creates delete action
* @return action
*/
protected DeleteAction createDeleteAction() {
return new DeleteAction();
}
/**
* @see org.eclipse.ui.part.EditorActionBarContributor#getActionBars()
*/
public IActionBars getActionBars() {
return viewActionBars;
}
}