diff options
author | Jan-Philipp Steghöfer | 2019-06-25 11:49:09 +0000 |
---|---|---|
committer | Salome Maro | 2019-07-02 11:01:47 +0000 |
commit | b1481e5301e470a5d5c14c255ed37234566ab094 (patch) | |
tree | 71bdf62909e0ec012755116db66fd0bf156decaa | |
parent | 0aa692b3f552e1d9d6cfa537b9f58ca29698f62a (diff) | |
download | org.eclipse.capra-b1481e5301e470a5d5c14c255ed37234566ab094.tar.gz org.eclipse.capra-b1481e5301e470a5d5c14c255ed37234566ab094.tar.xz org.eclipse.capra-b1481e5301e470a5d5c14c255ed37234566ab094.zip |
Added ability to select trace type in SelectionView
The selection view has been extended with a combo box that contains the
applicable trace type for any set of artifacts that is dropped into the
view. The combo box is updated whenever the selection changes. If the
user selects an applicable trace type from the combo box, the link is
created immediately. If no trace type is selected, a dialog for
selecting it pops up as before.
This feature has been inspired by the AMASS version of Eclipse Capra.
3 files changed, 110 insertions, 25 deletions
diff --git a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/TraceCreationHandler.java b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/TraceCreationHandler.java index cf70018d..32e8207f 100644 --- a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/TraceCreationHandler.java +++ b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/TraceCreationHandler.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.capra.ui.handlers; +import java.util.Optional; + import org.eclipse.capra.ui.operations.CreateTraceOperation; import org.eclipse.capra.ui.views.SelectionView; import org.eclipse.core.commands.AbstractHandler; @@ -36,6 +38,11 @@ public class TraceCreationHandler extends AbstractHandler { CreateTraceOperation createTraceOperation = new CreateTraceOperation("Create trace link", SelectionView.getOpenedView().getSelection()); createTraceOperation.addContext(undoContext); + if (SelectionView.getOpenedView().getSelectedTraceType() != null) { + createTraceOperation.setChooseTraceType((a, b) -> { + return Optional.of(SelectionView.getOpenedView().getSelectedTraceType()); + }); + } operationHistory.execute(createTraceOperation, null, adapter); return null; } diff --git a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/selection/RemoveSelectionHandler.java b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/selection/RemoveSelectionHandler.java index d2641cf1..5373929f 100644 --- a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/selection/RemoveSelectionHandler.java +++ b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/handlers/selection/RemoveSelectionHandler.java @@ -31,7 +31,9 @@ public class RemoveSelectionHandler extends AbstractHandler { @Override public Object execute(ExecutionEvent event) throws ExecutionException { List<Object> selection = TraceCreationHelper.extractSelectedElements(event); - SelectionView.getOpenedView().removeFromSelection(selection); + if (selection != null) { + SelectionView.getOpenedView().removeFromSelection(selection); + } return null; } } diff --git a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/views/SelectionView.java b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/views/SelectionView.java index 45d3aa00..8412102d 100644 --- a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/views/SelectionView.java +++ b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/views/SelectionView.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.eclipse.capra.core.adapters.TraceMetaModelAdapter; import org.eclipse.capra.core.adapters.TracePersistenceAdapter; import org.eclipse.capra.core.handlers.IArtifactHandler; import org.eclipse.capra.core.handlers.PriorityHandler; @@ -31,12 +32,16 @@ import org.eclipse.capra.core.helpers.ArtifactHelper; import org.eclipse.capra.core.helpers.ExtensionPointHelper; import org.eclipse.core.commands.operations.IOperationHistory; import org.eclipse.core.commands.operations.IUndoContext; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; @@ -51,6 +56,8 @@ import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.graphics.Image; +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.IActionBars; @@ -82,10 +89,19 @@ public class SelectionView extends ViewPart { org.eclipse.jface.util.LocalSelectionTransfer.getTransfer(), org.eclipse.emf.edit.ui.dnd.LocalTransfer.getInstance() }; - /** The actual table containing selected elements */ - public TableViewer viewer; + /** + * The actual table containing selected elements. + */ + public TableViewer artifactTable; + + /** + * The combo box to select the trace type. + */ + public ComboViewer traceTypeCombo; - /** The maintained selection of EObjects */ + /** + * The maintained selection of EObjects . + */ private Set<Object> selection = new LinkedHashSet<>(); /** @@ -104,22 +120,45 @@ public class SelectionView extends ViewPart { */ private RedoActionHandler redoAction; - class ViewContentProvider implements IStructuredContentProvider { + private Collection<EClass> traceTypes = new ArrayList<>(); + + /** + * Content provider for the viewer that lists the artifacts. + */ + class ArtifactTableContentProvider implements IStructuredContentProvider { + @Override - public void inputChanged(Viewer v, Object oldInput, Object newInput) { + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } @Override - public void dispose() { + public Object[] getElements(Object parent) { + return selection.toArray(); } + } + + class TraceTypeContentProvider implements IStructuredContentProvider { @Override public Object[] getElements(Object parent) { - return selection.toArray(); + return traceTypes.toArray(); } } - class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { + class TraceTypeLabelProvider extends LabelProvider implements IBaseLabelProvider { + + @Override + public String getText(Object element) { + return (element == null || !(element instanceof EClass)) ? "" : ((EClass) element).getName();//$NON-NLS-1$ + } + + } + + /** + * Label provider for the viewer that lists the artifacts. + */ + class ArtifactTableLabelProvider extends LabelProvider implements ITableLabelProvider { @Override public String getText(Object element) { @@ -166,7 +205,7 @@ public class SelectionView extends ViewPart { TableViewer view; public SelectionDropAdapter(TableViewer view) { - super(viewer); + super(artifactTable); this.view = view; } @@ -185,13 +224,24 @@ public class SelectionView extends ViewPart { @Override public void createPartControl(Composite parent) { - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - viewer.setContentProvider(new ViewContentProvider()); - viewer.setLabelProvider(new ViewLabelProvider()); - viewer.setComparator(new NoChangeComparator()); - viewer.setInput(getViewSite()); - - getSite().setSelectionProvider(viewer); + Composite area = new Composite(parent, SWT.NONE); + area.setLayout(new GridLayout(1, false)); + area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + traceTypeCombo = new ComboViewer(area); + traceTypeCombo.setContentProvider(new TraceTypeContentProvider()); + traceTypeCombo.setLabelProvider(new TraceTypeLabelProvider()); + traceTypeCombo.setInput(getViewSite()); + traceTypeCombo.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + artifactTable = new TableViewer(area, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + artifactTable.setContentProvider(new ArtifactTableContentProvider()); + artifactTable.setLabelProvider(new ArtifactTableLabelProvider()); + artifactTable.setComparator(new NoChangeComparator()); + artifactTable.setInput(getViewSite()); + artifactTable.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + getSite().setSelectionProvider(artifactTable); hookContextMenu(); int ops = DND.DROP_COPY | DND.DROP_MOVE; @@ -202,7 +252,8 @@ public class SelectionView extends ViewPart { transfers.addAll(ExtensionPointHelper.getExtensions(TRANSFER_EXTENSION_POINT_ID, "class").stream() .map(Transfer.class::cast).collect(Collectors.toList())); - viewer.addDropSupport(ops, transfers.toArray(DEFAULT_TRANSFERS), new SelectionDropAdapter(viewer)); + artifactTable.addDropSupport(ops, transfers.toArray(DEFAULT_TRANSFERS), + new SelectionDropAdapter(artifactTable)); createGlobalActionHandlers(); } @@ -216,14 +267,14 @@ public class SelectionView extends ViewPart { } }); - Menu menu = menuMgr.createContextMenu(viewer.getControl()); - viewer.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, viewer); + Menu menu = menuMgr.createContextMenu(artifactTable.getControl()); + artifactTable.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, artifactTable); } @Override public void setFocus() { - viewer.getControl().setFocus(); + artifactTable.getControl().setFocus(); } @SuppressWarnings("unchecked") @@ -243,7 +294,26 @@ public class SelectionView extends ViewPart { } else if (validateSelection(data)) selection.add(data); - viewer.refresh(); + artifactTable.refresh(); + refreshAvailableTraceTypes(); + } + + private void refreshAvailableTraceTypes() { + TraceMetaModelAdapter traceAdapter = ExtensionPointHelper.getTraceMetamodelAdapter().get(); + TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().get(); + + ResourceSet resourceSet = new ResourceSetImpl(); + // add artifact model to resource set + EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet); + + ArtifactHelper artifactHelper = new ArtifactHelper(artifactModel); + + // Create the artifact wrappers + List<EObject> wrappers = artifactHelper.createWrappers(new ArrayList<Object>(selection)); + + // Get the type of trace to be created + traceTypes = traceAdapter.getAvailableTraceTypes(wrappers); + traceTypeCombo.refresh(); } private boolean validateSelection(Object target) { @@ -272,7 +342,8 @@ public class SelectionView extends ViewPart { public void clearSelection() { selection.clear(); - viewer.refresh(); + artifactTable.refresh(); + refreshAvailableTraceTypes(); } public static SelectionView getOpenedView() { @@ -287,7 +358,12 @@ public class SelectionView extends ViewPart { public void removeFromSelection(List<Object> currentselection) { selection.removeAll(currentselection); - viewer.refresh(); + artifactTable.refresh(); + refreshAvailableTraceTypes(); + } + + public EClass getSelectedTraceType() { + return (EClass) traceTypeCombo.getStructuredSelection().getFirstElement(); } private void createGlobalActionHandlers() { |