blob: d9c04c51a67c1de4f9c67b5112648e23566fcd7a [file] [log] [blame]
/**
* Copyright (c) 2009, 2010 Anyware Technologies 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:
* Anyware Technologies - initial API and implementation
*
* $Id: EmfActionBarContributor.java,v 1.7 2009/12/02 11:24:33 bcabe Exp $
*/
package org.eclipse.pde.emfforms.editor;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.action.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.pde.emfforms.internal.Activator;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.ActionFactory;
/**
* A specialized {@link EditingDomainActionBarContributor} very similar
* to what EMF codegen generates in the editor layer.
*/
public class EmfActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener {
/** The create child menu manager. */
private MenuManager createChildMenuManager;
/** The create child menu manager. */
private MenuManager createSiblingMenuManager;
/** The active editor part. */
private IEditorPart activeEditorPart;
/** The selection provider. */
private ISelectionProvider selectionProvider;
/** The create child actions. */
private Collection<IAction> createChildActions;
/** The create sibling actions */
protected Collection<IAction> createSiblingActions;
@Override
public void init(IActionBars actionBars) {
super.init(actionBars);
// initially disable every global action redirection
disableGlobalHandlers();
}
public void disableGlobalHandlers() {
getActionBars().clearGlobalActionHandlers();
getActionBars().updateActionBars();
}
public void enableGlobalHandlers() {
IActionBars actionBars = getActionBars();
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 IAction getDeleteAction() {
return deleteAction;
}
/** The show properties view action. */
protected IAction showPropertiesViewAction = new Action("Open properties") {
@Override
public void run() {
try {
getPage().showView("org.eclipse.ui.views.PropertySheet");
} catch (PartInitException exception) {
Activator.logErrorMessage("The properties view is not available");
}
}
};
/** The filter for create child actions . */
private IFilter createChildMenuFilter = AcceptAllFilter.getInstance();
/** The filter for create sibling actions. */
private IFilter createSiblingMenuFilter = AcceptAllFilter.getInstance();
private String menuID;
public void setMenuID(String menuID) {
this.menuID = menuID;
}
/**
* Instantiates a new emf action bar contributor.
*/
public EmfActionBarContributor() {
super(ADDITIONS_LAST_STYLE);
loadResourceAction = new LoadResourceAction();
validateAction = new ValidateAction();
controlAction = new ControlAction();
}
public EmfActionBarContributor(String menuID) {
this();
setMenuID(menuID);
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void contributeToMenu(IMenuManager menuManager) {
super.contributeToMenu(menuManager);
IMenuManager submenuManager = new MenuManager("", menuID);
menuManager.insertAfter("additions", submenuManager);
submenuManager.add(new Separator("settings"));
submenuManager.add(new Separator("actions"));
submenuManager.add(new Separator("additions"));
submenuManager.add(new Separator("additions-end"));
// Prepare for CreateChild item addition or removal.
createChildMenuManager = new MenuManager("New");
submenuManager.insertBefore("additions", createChildMenuManager);
// Force an update because Eclipse hides empty menus now.
submenuManager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager menuManager) {
menuManager.updateAll(true);
}
});
addGlobalActions(submenuManager);
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
*/
@Override
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
activeEditorPart = part;
// Switch to the new selection provider.
if (selectionProvider != null) {
selectionProvider.removeSelectionChangedListener(this);
}
if (part == null) {
selectionProvider = null;
} 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()));
}
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
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;
Collection<?> newSiblingDescriptors = null;
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1) {
Object object = ((IStructuredSelection) selection).getFirstElement();
EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain();
newChildDescriptors = domain.getNewChildDescriptors(object, null);
newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
}
// Generate actions for selection; populate and redraw the menus.
createChildActions = generateCreateChildActions(newChildDescriptors, selection);
createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
if (createChildMenuManager != null) {
populateManager(createChildMenuManager, createChildActions, null);
createChildMenuManager.update(true);
}
if (createSiblingMenuManager != null) {
populateManager(createSiblingMenuManager, createSiblingActions, null);
createSiblingMenuManager.update(true);
}
}
/**
* Populate manager.
*
* @param manager the manager
* @param actions the actions
* @param contributionID the contribution id
*/
private void populateManager(MenuManager manager, Collection<? extends IAction> actions, String contributionID) {
if (actions != null) {
for (IAction action : actions) {
if (contributionID != null) {
manager.insertBefore(contributionID, action);
} else {
manager.add(action);
}
}
}
}
/**
* Generate create actions for child menu.
*
* @param childDescriptors the child descriptors
* @param selection the selection
*
* @return the collection< i action>
*/
public Collection<IAction> generateCreateChildActions(Collection<?> childDescriptors, ISelection selection) {
Collection<IAction> actions = new ArrayList<IAction>();
if (childDescriptors != null) {
for (Object descriptor : childDescriptors) {
if (this.createChildMenuFilter.select(((CommandParameter) descriptor).value))
actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));
}
}
return actions;
}
/**
* Generate create actions for sibling menu.
*
* @param descriptors the sibling descriptors
* @param selection the selection
*
* @return the collection< i action>
*/
public Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) {
Collection<IAction> actions = new ArrayList<IAction>();
if (descriptors != null) {
for (Object descriptor : descriptors) {
if (this.createSiblingMenuFilter.select(((CommandParameter) descriptor).value))
actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));
}
}
return actions;
}
/**
* Depopulate manager.
*
* @param manager the manager
* @param actions the actions
*/
protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> 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);
}
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void menuAboutToShow(IMenuManager menuManager) {
super.menuAboutToShow(menuManager);
MenuManager submenuManager = null;
submenuManager = new MenuManager("New child");
populateManager(submenuManager, createChildActions, null);
menuManager.insertBefore("edit", submenuManager);
submenuManager = new MenuManager("New sibling");
populateManager(submenuManager, createSiblingActions, null);
menuManager.insertBefore("edit", submenuManager);
}
/**
* Sets the filter used to selection actions to display in the create child menu.
*
* @param filter the new filter
*/
public void setCreateChildMenuFilter(IFilter filter) {
this.createChildMenuFilter = filter;
}
/**
* Sets the filter used to selection actions to display in the create sibling menu.
*
* @param filter the new filter
*/
public void setCreateSiblingMenuFilter(IFilter filter) {
this.createSiblingMenuFilter = filter;
}
}