| /*=============================================================================# |
| # Copyright (c) 2012, 2020 Stephan Wahlbrink and others. |
| # |
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 |
| # which is available at https://www.apache.org/licenses/LICENSE-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 |
| # |
| # Contributors: |
| # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation |
| #=============================================================================*/ |
| |
| package org.eclipse.statet.internal.rtm.ftable.ui.editors; |
| |
| 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; |
| |
| import org.eclipse.statet.rtm.ftable.ui.RtFTableEditorPlugin; |
| |
| |
| /** |
| * This is the action bar contributor for the FTable model editor. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| public class FTableActionBarContributor |
| 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(RtFTableEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) //$NON-NLS-1$ |
| { |
| @Override |
| public void run() { |
| try { |
| getPage().showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$ |
| } |
| catch (final PartInitException exception) { |
| RtFTableEditorPlugin.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(RtFTableEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) //$NON-NLS-1$ |
| { |
| @Override |
| public boolean isEnabled() { |
| return FTableActionBarContributor.this.activeEditorPart instanceof IViewerProvider; |
| } |
| |
| @Override |
| public void run() { |
| if (FTableActionBarContributor.this.activeEditorPart instanceof IViewerProvider) { |
| final Viewer viewer= ((IViewerProvider)FTableActionBarContributor.this.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 FTableActionBarContributor() { |
| super(ADDITIONS_LAST_STYLE); |
| this.loadResourceAction= new LoadResourceAction(); |
| this.validateAction= new ValidateAction(); |
| this.controlAction= new ControlAction(); |
| } |
| |
| /** |
| * This adds Separators for editor additions to the tool bar. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| public void contributeToToolBar(final IToolBarManager toolBarManager) { |
| toolBarManager.add(new Separator("ftable-settings")); //$NON-NLS-1$ |
| toolBarManager.add(new Separator("ftable-additions")); //$NON-NLS-1$ |
| } |
| |
| /** |
| * 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(final IMenuManager menuManager) { |
| super.contributeToMenu(menuManager); |
| |
| final IMenuManager submenuManager= new MenuManager(RtFTableEditorPlugin.INSTANCE.getString("_UI_FTableEditor_menu"), "org.eclipse.statet.rtm.ftableMenuID"); //$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. |
| // |
| this.createChildMenuManager= new MenuManager(RtFTableEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); //$NON-NLS-1$ |
| submenuManager.insertBefore("additions", this.createChildMenuManager); //$NON-NLS-1$ |
| |
| // Prepare for CreateSibling item addition or removal. |
| // |
| this.createSiblingMenuManager= new MenuManager(RtFTableEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); //$NON-NLS-1$ |
| submenuManager.insertBefore("additions", this.createSiblingMenuManager); //$NON-NLS-1$ |
| |
| // Force an update because Eclipse hides empty menus now. |
| // |
| submenuManager.addMenuListener |
| (new IMenuListener() { |
| @Override |
| public void menuAboutToShow(final 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(final IEditorPart part) { |
| super.setActiveEditor(part); |
| this.activeEditorPart= part; |
| |
| // Switch to the new selection provider. |
| // |
| if (this.selectionProvider != null) { |
| this.selectionProvider.removeSelectionChangedListener(this); |
| } |
| if (part == null) { |
| this.selectionProvider= null; |
| } |
| else { |
| this.selectionProvider= part.getSite().getSelectionProvider(); |
| this.selectionProvider.addSelectionChangedListener(this); |
| |
| // Fake a selection changed event to update the menus. |
| // |
| if (this.selectionProvider.getSelection() != null) { |
| selectionChanged(new SelectionChangedEvent(this.selectionProvider, this.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 |
| */ |
| @Override |
| public void selectionChanged(final SelectionChangedEvent event) { |
| // Remove any menu items for old selection. |
| // |
| if (this.createChildMenuManager != null) { |
| depopulateManager(this.createChildMenuManager, this.createChildActions); |
| } |
| if (this.createSiblingMenuManager != null) { |
| depopulateManager(this.createSiblingMenuManager, this.createSiblingActions); |
| } |
| |
| // Query the new selection for appropriate new child/sibling descriptors |
| // |
| Collection<?> newChildDescriptors= null; |
| Collection<?> newSiblingDescriptors= null; |
| |
| final ISelection selection= event.getSelection(); |
| if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1) { |
| final Object object= ((IStructuredSelection)selection).getFirstElement(); |
| |
| final EditingDomain domain= ((IEditingDomainProvider)this.activeEditorPart).getEditingDomain(); |
| |
| newChildDescriptors= domain.getNewChildDescriptors(object, null); |
| newSiblingDescriptors= domain.getNewChildDescriptors(null, object); |
| } |
| |
| // Generate actions for selection; populate and redraw the menus. |
| // |
| this.createChildActions= generateCreateChildActions(newChildDescriptors, selection); |
| this.createSiblingActions= generateCreateSiblingActions(newSiblingDescriptors, selection); |
| |
| if (this.createChildMenuManager != null) { |
| populateManager(this.createChildMenuManager, this.createChildActions, null); |
| this.createChildMenuManager.update(true); |
| } |
| if (this.createSiblingMenuManager != null) { |
| populateManager(this.createSiblingMenuManager, this.createSiblingActions, null); |
| this.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(final Collection<?> descriptors, final ISelection selection) { |
| final Collection<IAction> actions= new ArrayList<>(); |
| if (descriptors != null) { |
| for (final Object descriptor : descriptors) { |
| actions.add(new CreateChildAction(this.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(final Collection<?> descriptors, final ISelection selection) { |
| final Collection<IAction> actions= new ArrayList<>(); |
| if (descriptors != null) { |
| for (final Object descriptor : descriptors) { |
| actions.add(new CreateSiblingAction(this.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(final IContributionManager manager, final Collection<? extends IAction> actions, final String contributionID) { |
| if (actions != null) { |
| for (final 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(final IContributionManager manager, final Collection<? extends IAction> actions) { |
| if (actions != null) { |
| final 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) { |
| final 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(final IMenuManager menuManager) { |
| super.menuAboutToShow(menuManager); |
| MenuManager submenuManager= null; |
| |
| submenuManager= new MenuManager(RtFTableEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); //$NON-NLS-1$ |
| populateManager(submenuManager, this.createChildActions, null); |
| menuManager.insertBefore("edit", submenuManager); //$NON-NLS-1$ |
| |
| submenuManager= new MenuManager(RtFTableEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); //$NON-NLS-1$ |
| populateManager(submenuManager, this.createSiblingActions, null); |
| menuManager.insertBefore("edit", submenuManager); //$NON-NLS-1$ |
| } |
| |
| /** |
| * This inserts global actions before the "additions-end" separator. |
| * <!-- begin-user-doc --> |
| * <!-- end-user-doc --> |
| * @generated |
| */ |
| @Override |
| protected void addGlobalActions(final IMenuManager menuManager) { |
| menuManager.insertAfter("additions-end", new Separator("ui-actions")); //$NON-NLS-1$ //$NON-NLS-2$ |
| menuManager.insertAfter("ui-actions", this.showPropertiesViewAction); //$NON-NLS-1$ |
| |
| this.refreshViewerAction.setEnabled(this.refreshViewerAction.isEnabled()); |
| menuManager.insertAfter("ui-actions", this.refreshViewerAction); //$NON-NLS-1$ |
| |
| 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; |
| } |
| |
| } |