/******************************************************************************* * Copyright (c) 2014 Hussein Mhanna * * 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: * Hussein Mhanna - initial API and implementation ******************************************************************************/ package org.eclipse.rmf.reqif10.csv.importer.ui.wizards.pages; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.EventObject; import java.util.List; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; import org.eclipse.emf.edit.ui.action.CopyAction; import org.eclipse.emf.edit.ui.action.CreateChildAction; import org.eclipse.emf.edit.ui.action.CutAction; import org.eclipse.emf.edit.ui.action.DeleteAction; import org.eclipse.emf.edit.ui.action.PasteAction; import org.eclipse.emf.edit.ui.action.RedoAction; import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction; import org.eclipse.emf.edit.ui.action.UndoAction; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.rmf.reqif10.csv.importer.CSVImporterPlugin; import org.eclipse.rmf.reqif10.csv.importer.mapping.provider.MappingItemProviderAdapterFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; public class LeftMappingPart extends Composite { /** * The tree viewer */ private TreeViewer treeViewer; /** * The temporary resource */ private Resource resource; /** * The adapter factory */ private ComposedAdapterFactory adapterFactory; /** * The editing domain */ private EditingDomain editingDomain; private EObject input; public LeftMappingPart(Composite parent, EObject input) { super(parent, SWT.NONE); setLayout(new FillLayout()); this.input = input; createControls(); } public EditingDomain getEditingDomain() { return editingDomain; } private void createControls() { createAdapterFactory(); createEditingDomain(); resource = editingDomain.getResourceSet().createResource( URI.createURI("TEMP")); resource.getContents().add(input); Composite composite = new Composite(this, SWT.NONE); composite.setLayout(new GridLayout(1, false)); createTreeViewer(composite); treeViewer.setInput(resource); treeViewer.expandAll(); new TreeViewerActionProvider(treeViewer); } public void addSelectionChangedListener(ISelectionChangedListener listener) { treeViewer.addSelectionChangedListener(listener); } public void removeSelectionChangedListener( ISelectionChangedListener listener) { treeViewer.removeSelectionChangedListener(listener); } /** * Create the {@link AdapterFactory} * */ private void createAdapterFactory() { adapterFactory = new ComposedAdapterFactory(); adapterFactory .addAdapterFactory(new ResourceItemProviderAdapterFactory()); adapterFactory .addAdapterFactory(new MappingItemProviderAdapterFactory()); } /** * Create the {@link EditingDomain} */ private void createEditingDomain() { CommandStack commandStack = new BasicCommandStack(); commandStack.addCommandStackListener(new CommandStackListener() { @Override public void commandStackChanged(EventObject event) { handleCommandStackChanged(((CommandStack) event.getSource()) .getMostRecentCommand()); } }); editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack); } /** * Called when the command stack is changed * * @param mostRecentCommand * : The most recent command */ protected void handleCommandStackChanged(final Command mostRecentCommand) { // Try to select the affected objects. // if (mostRecentCommand != null) { setSelectionToViewer(mostRecentCommand.getAffectedObjects()); } } /** * This sets the selection into whichever viewer is active. * * @param selections * : The selection elements * */ protected void setSelectionToViewer(final Collection<?> selections) { if ((selections != null) && !selections.isEmpty()) { final Object[] selectionsArray = selections.toArray(); final Runnable runnable = new Runnable() { @Override public void run() { // Select the objects if the input of the viewer is not // null, otherwise select them when the // input will be set. if (treeViewer != null) { treeViewer.setSelection(new StructuredSelection( selectionsArray), true); } } }; if (false == isDisposed()) { getDisplay().asyncExec(runnable); } } } private void createTreeViewer(Composite parent) { treeViewer = new TreeViewer(parent); treeViewer.getTree().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); treeViewer.setLabelProvider(new AdapterFactoryLabelProvider( adapterFactory)); treeViewer.setContentProvider(new AdapterFactoryContentProvider( adapterFactory)); } /** * This looks up a string in plugin.properties, making a substitution. * * @param key * the key of the string. * @return a string resource associated with the key. */ protected static String getString(final String key) { return CSVImporterPlugin.INSTANCE.getString(key); } /** * Called to dispose the widgets */ @Override public void dispose() { // saveInput(); try { resource.delete(null); } catch (IOException e) { e.printStackTrace(); } adapterFactory.dispose(); } /** * An extended {@link IMenuListener} that manage undo, redo, cut, copy and * paste action. * * @author Hussein MHANNA * */ protected class TreeViewerActionProvider implements IMenuListener { /** * 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<StaticSelectionCommandAction> createChildActions; /** * This is the action used to implement delete. */ private DeleteAction deleteAction; /** * This is the action used to implement undo. */ private UndoAction undoAction; /** * This is the action used to implement redo. */ private RedoAction redoAction; /** * This is the action used to implement cut. */ private CutAction cutAction; /** * This is the action used to implement copy. */ private CopyAction copyAction; /** * This is the action used to implement paste. */ private PasteAction pasteAction; /** * The tree viewer */ private final TreeViewer viewer; /** * The selection changed listener */ private final ISelectionChangedListener selectionChangedListener; /** * The constructor * * @param viewer * : The viewer on wich the actions will be added */ public TreeViewerActionProvider(final TreeViewer viewer) { this.viewer = viewer; initializeActions(); selectionChangedListener = new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { TreeViewerActionProvider.this .selectionChanged((IStructuredSelection) event .getSelection()); } }; this.viewer.addSelectionChangedListener(selectionChangedListener); this.viewer.getTree().addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent e) { TreeViewerActionProvider.this.viewer .removeSelectionChangedListener(selectionChangedListener); } }); final MenuManager manager = new MenuManager(); final Menu menu = manager.createContextMenu(viewer.getControl()); manager.addMenuListener(this); manager.setRemoveAllWhenShown(true); viewer.getControl().setMenu(menu); } /** * Initialize the actions */ private void initializeActions() { final ISharedImages sharedImages = PlatformUI.getWorkbench() .getSharedImages(); deleteAction = createDeleteAction(); deleteAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); undoAction = createUndoAction(); undoAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)); redoAction = createRedoAction(); redoAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_REDO)); cutAction = createCutAction(); cutAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_CUT)); copyAction = createCopyAction(); copyAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_COPY)); pasteAction = createPasteAction(); pasteAction.setImageDescriptor(sharedImages .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE)); } /** * Create a delete action. * * @return the action used to implement delete. * * @see #deleteAction */ protected DeleteAction createDeleteAction() { return new DeleteAction(editingDomain, true); } /** * Create an undo action. * * @return the action used to implement undo. * * @see #undoAction */ protected UndoAction createUndoAction() { return new UndoAction(editingDomain); } /** * Create a redo action. * * @return the action used to implement redo. * * @see #redoAction */ protected RedoAction createRedoAction() { return new RedoAction(editingDomain); } /** * Create a cut action. * * @return the action used to implement cut. * * @see #cutAction */ protected CutAction createCutAction() { return new CutAction(editingDomain); } /** * Create a copy action. * * @return the action used to implement copy. * * @see #copyAction */ protected CopyAction createCopyAction() { return new CopyAction(editingDomain); } /** * Create a paste action. * * @return the action used to implement paste. * * @see #pasteAction */ protected PasteAction createPasteAction() { return new PasteAction(editingDomain); } /** * This implements {@link org.eclipse.jface.action.IMenuListener} to * help fill the context menus with contributions from the Edit menu. * * @param menuManager * The menu manager. */ @Override public void menuAboutToShow(final IMenuManager menuManager) { MenuManager submenuManager = null; submenuManager = new MenuManager("New"); populateManager(submenuManager, createChildActions, null); menuManager.add(submenuManager); menuManager.add(new Separator()); 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)); } /** * Called when the selection is changed in the tree viewer. * * @param selection * The selection of {@link SelectionChangedEvent}. */ private void selectionChanged(final IStructuredSelection selection) { deleteAction.selectionChanged(selection); undoAction.update(); redoAction.update(); cutAction.selectionChanged(selection); copyAction.selectionChanged(selection); pasteAction.selectionChanged(selection); // Query the new selection for appropriate new child/descriptors // Collection<?> newChildDescriptors = null; if (selection.size() == 1) { final Object object = selection.getFirstElement(); newChildDescriptors = editingDomain.getNewChildDescriptors( object, null); } // Generate actions for selection; populate and redraw the menus. // createChildActions = generateCreateChildActions( newChildDescriptors, selection); } protected Collection<StaticSelectionCommandAction> generateCreateChildActions( final Collection<?> descriptors, final ISelection selection) { final Collection<StaticSelectionCommandAction> actions = new ArrayList<StaticSelectionCommandAction>(); if (descriptors != null) { for (final Object descriptor : descriptors) { actions.add(createCreateChildAction(selection, descriptor)); } } return actions; } protected CreateChildAction createCreateChildAction( final ISelection selection, final Object descriptor) { return new CreateChildAction(editingDomain, selection, descriptor); } } /** * 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(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); } } } } public void setColumnMappingInput(List<String> columnMappingInput) { } }