/**************************************************************************
* ERA - Eclipse Requirements Analysis
* ==============================================
* Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann
* and Bernd Haberstumpf (http://era.origo.ethz.ch)
**************************************************************************
* Licensed under the Eclipse Public License - v 1.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.eclipse.org/org/documents/epl-v10.html
* 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 era.foss.erf.presentation;
import java.util.ArrayList;
import java.util.Collection;
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.ControlAction;
import org.eclipse.emf.edit.ui.action.CreateChildAction;
import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
import org.eclipse.emf.edit.ui.action.LoadResourceAction;
import org.eclipse.emf.edit.ui.action.ValidateAction;
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.Viewer;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
/**
* This is the action bar contributor for the Erf model editor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public class ErfActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener {
/**
* This keeps track of the active editor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IEditorPart activeEditorPart;
/**
* This keeps track of the current selection provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ISelectionProvider selectionProvider;
/**
* This action opens the Properties view.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IAction showPropertiesViewAction = new Action( ErfEditorPlugin.INSTANCE.getString( "_UI_ShowPropertiesView_menu_item" ) ) {
@Override
public void run() {
try {
getPage().showView( "org.eclipse.ui.views.PropertySheet" );
} catch( PartInitException exception ) {
ErfEditorPlugin.INSTANCE.log( exception );
}
}
};
/**
* This action refreshes the viewer of the current editor if the editor
* implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IAction refreshViewerAction = new Action( ErfEditorPlugin.INSTANCE.getString( "_UI_RefreshViewer_menu_item" ) ) {
@Override
public boolean isEnabled() {
return activeEditorPart instanceof IViewerProvider;
}
@Override
public void run() {
if( activeEditorPart instanceof IViewerProvider ) {
Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();
if( viewer != null ) {
viewer.refresh();
}
}
}
};
/**
* 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.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> createChildActions;
/**
* This is the menu manager into which menu contribution items should be added for CreateChild actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
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.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> createSiblingActions;
/**
* This is the menu manager into which menu contribution items should be added for CreateSibling actions.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected IMenuManager createSiblingMenuManager;
/**
* This creates an instance of the contributor.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public ErfActionBarContributor() {
super( ADDITIONS_LAST_STYLE );
loadResourceAction = new LoadResourceAction();
validateAction = new ValidateAction();
controlAction = new ControlAction();
}
/**
* This adds Separators for editor additions to the tool bar.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void contributeToToolBar( IToolBarManager toolBarManager ) {
toolBarManager.add( new Separator( "erf-settings" ) );
toolBarManager.add( new Separator( "erf-additions" ) );
}
/**
* This adds to the menu bar a menu and some separators for editor additions,
* as well as the sub-menus for object creation items.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void contributeToMenu( IMenuManager menuManager ) {
super.contributeToMenu( menuManager );
IMenuManager submenuManager = new MenuManager(
ErfEditorPlugin.INSTANCE.getString( "_UI_ErfEditor_menu" ),
"era.foss.erfMenuID" );
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( ErfEditorPlugin.INSTANCE.getString( "_UI_CreateChild_menu_item" ) );
submenuManager.insertBefore( "additions", createChildMenuManager );
// Prepare for CreateSibling item addition or removal.
//
createSiblingMenuManager = new MenuManager(
ErfEditorPlugin.INSTANCE.getString( "_UI_CreateSibling_menu_item" ) );
submenuManager.insertBefore( "additions", createSiblingMenuManager );
// Force an update because Eclipse hides empty menus now.
//
submenuManager.addMenuListener( new IMenuListener() {
public void menuAboutToShow( IMenuManager menuManager ) {
menuManager.updateAll( true );
}
} );
addGlobalActions( submenuManager );
}
/**
* When the active editor changes, this remembers the change and registers with it as a selection provider.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@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() ) );
}
}
}
/**
* This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
* handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
* that can be added to the selected object and updating the menus accordingly.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
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 );
}
}
/**
* 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.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> generateCreateChildActions( Collection<?> descriptors, ISelection selection ) {
Collection<IAction> actions = new ArrayList<IAction>();
if( descriptors != null ) {
for( Object descriptor : descriptors ) {
actions.add( new CreateChildAction( activeEditorPart, selection, descriptor ) );
}
}
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.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected Collection<IAction> generateCreateSiblingActions( Collection<?> descriptors, ISelection selection ) {
Collection<IAction> actions = new ArrayList<IAction>();
if( descriptors != null ) {
for( Object descriptor : descriptors ) {
actions.add( new CreateSiblingAction( activeEditorPart, selection, descriptor ) );
}
}
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>contributionID</code> is <code>null</code>, they are simply added.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected void populateManager( IContributionManager 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 );
}
}
}
}
/**
* 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.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
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 );
}
}
}
}
}
/**
* This populates the pop-up menu before it appears.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void menuAboutToShow( IMenuManager menuManager ) {
super.menuAboutToShow( menuManager );
MenuManager submenuManager = null;
submenuManager = new MenuManager( ErfEditorPlugin.INSTANCE.getString( "_UI_CreateChild_menu_item" ) );
populateManager( submenuManager, createChildActions, null );
menuManager.insertBefore( "edit", submenuManager );
submenuManager = new MenuManager( ErfEditorPlugin.INSTANCE.getString( "_UI_CreateSibling_menu_item" ) );
populateManager( submenuManager, createSiblingActions, null );
menuManager.insertBefore( "edit", submenuManager );
}
/**
* This inserts global actions before the "additions-end" separator.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected void addGlobalActions( IMenuManager menuManager ) {
menuManager.insertAfter( "additions-end", new Separator( "ui-actions" ) );
menuManager.insertAfter( "ui-actions", showPropertiesViewAction );
refreshViewerAction.setEnabled( refreshViewerAction.isEnabled() );
menuManager.insertAfter( "ui-actions", refreshViewerAction );
super.addGlobalActions( menuManager );
}
/**
* This ensures that a delete action will clean up all references to deleted objects.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected boolean removeAllReferencesOnDelete() {
return true;
}
}