From 682248149e35bf1db478ddefe860626942fb8718 Mon Sep 17 00:00:00 2001 From: Patric Plitzner Date: Tue, 18 Nov 2014 13:47:29 +0000 Subject: [PATCH] - extended DerivateSearchView to allow multiple selection - added context menu to open multiple elements in DerivateView - extended DerivateView to show multiple derivate hierarchies in one view --- .../handler/OpenDerivateViewHandler.java | 29 +++--- .../derivate/DerivateContentProvider.java | 20 ++--- .../editor/view/derivate/DerivateView.java | 28 +++--- .../derivate/DerivateViewEditorInput.java | 90 ++++++++++++------- eu.etaxonomy.taxeditor.store/plugin.xml | 22 +++-- .../DerivateSearchComposite.java | 2 +- .../derivateSearch/DerivateSearchView.java | 10 +++ 7 files changed, 127 insertions(+), 74 deletions(-) diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenDerivateViewHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenDerivateViewHandler.java index d6f0df7e6..f06996ef7 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenDerivateViewHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/OpenDerivateViewHandler.java @@ -1,5 +1,10 @@ package eu.etaxonomy.taxeditor.editor.handler; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.UUID; + import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; @@ -22,18 +27,22 @@ public class OpenDerivateViewHandler extends AbstractHandler { public Object execute(ExecutionEvent event) throws ExecutionException { ISelection currentSelection = HandlerUtil.getCurrentSelection(event); if(currentSelection instanceof IStructuredSelection){ - Object selectedElement = ((IStructuredSelection) currentSelection).getFirstElement(); - if(selectedElement instanceof SpecimenOrObservationBase){ - - DerivateViewEditorInput input = new DerivateViewEditorInput(((SpecimenOrObservationBase) selectedElement).getUuid()); - try { - EditorUtil.open(input); - } catch (PartInitException e) { - MessagingUtils.error(OpenDerivateViewHandler.class, "Could not open DerivateView", e); - } catch (NullPointerException npe){ - MessagingUtils.messageDialog("Failed to open Editor", OpenDerivateViewHandler.class, "Could not open DerivateView. The derivate hierarchy is corrupted!", npe); + Iterator selectionIterator = ((IStructuredSelection) currentSelection).iterator(); + Set selectedElementUUIDs = new HashSet(); + while(selectionIterator.hasNext()){ + Object object = selectionIterator.next(); + if(object instanceof SpecimenOrObservationBase){ + selectedElementUUIDs.add(((SpecimenOrObservationBase) object).getUuid()); } } + DerivateViewEditorInput input = new DerivateViewEditorInput(selectedElementUUIDs); + try { + EditorUtil.open(input); + } catch (PartInitException e) { + MessagingUtils.error(OpenDerivateViewHandler.class, "Could not open DerivateView", e); + } catch (NullPointerException npe){ + MessagingUtils.messageDialog("Failed to open Editor", OpenDerivateViewHandler.class, "Could not open DerivateView. The derivate hierarchy is corrupted!", npe); + } } return null; } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java index 1e1da7b5b..023d217fe 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateContentProvider.java @@ -1,10 +1,10 @@ package eu.etaxonomy.taxeditor.editor.view.derivate; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.UUID; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeNode; @@ -34,17 +34,17 @@ public class DerivateContentProvider implements ITreeContentProvider { @Override public Object[] getElements(Object inputElement) { - SpecimenOrObservationBase rootElement = null; + List rootElements = new ArrayList(); if(inputElement instanceof DerivateViewEditorInput){ - rootElement = CdmStore.getService(IOccurrenceService.class).load(((DerivateViewEditorInput) inputElement).getRootElementUUID()); - } - - if(rootElement!=null){ - //show topmost element in the derivate hierarchy if no field unit was found - TreeNode node = new TreeNode(rootElement); - return Collections.singleton(node).toArray(); + Set rootUUIDs = ((DerivateViewEditorInput) inputElement).getRootUUIDs(); + for (UUID uuid : rootUUIDs) { + SpecimenOrObservationBase rootElement = CdmStore.getService(IOccurrenceService.class).load(uuid); + if(rootElement!=null){ + rootElements.add(new TreeNode(rootElement)); + } + } } - return null; + return rootElements.toArray(); } @Override diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java index 963cd911f..13778a6dc 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Map.Entry; import java.util.Set; +import java.util.UUID; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.MenuManager; @@ -104,11 +105,13 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa labelProvider.setMultiLinkSingleReads(multiLinkSingleReads); IEditorInput editorInput = getEditorInput(); viewer.setInput(editorInput); + //set selection to selected derivate if only one was selected if(editorInput instanceof DerivateViewEditorInput){ - SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(((DerivateViewEditorInput) editorInput).getDerivateUUID()); - SpecimenOrObservationBase rootElement = CdmStore.getService(IOccurrenceService.class).load(((DerivateViewEditorInput) editorInput).getRootElementUUID()); - setPartName(labelProvider.getDerivateText(rootElement)); - viewer.setSelection(new StructuredSelection(new TreeNode(specimen))); + Set derivateUUIDs = ((DerivateViewEditorInput) editorInput).getDerivateUUIDs(); + if(derivateUUIDs.size()==1){ + SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(derivateUUIDs.iterator().next()); + viewer.setSelection(new StructuredSelection(new TreeNode(specimen))); + } } //add drag'n'drop support @@ -151,6 +154,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa */ @Override public String getTitleToolTip() { + if(getEditorInput() instanceof DerivateViewEditorInput){ + DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput(); + return derivateViewEditorInput.getName(); + } return "Derivate View"; } @@ -162,7 +169,9 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa setSite(site); setInput(input); if(input instanceof DerivateViewEditorInput){ - conversation = ((DerivateViewEditorInput) input).getConversationHolder(); + DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input; + conversation = derivateViewEditorInput.getConversationHolder(); + setPartName(derivateViewEditorInput.getName()); } } @@ -304,15 +313,6 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa public boolean postOperation(CdmBase objectAffectedByOperation) { refreshTree(); if(objectAffectedByOperation!=null){ - DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput(); - if(objectAffectedByOperation.getUuid().equals(derivateViewEditorInput.getRootElementUUID())){ - // TODO close derivate view if root element is deleted -// this.getViewer().setEditorSite().getPage().close(); - return true; - } - else if(objectAffectedByOperation.getUuid().equals(derivateViewEditorInput.getDerivateUUID())){ - derivateViewEditorInput.setRootAsDerivate(); - } changed(objectAffectedByOperation); return true; } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java index c323cb3f0..141299b61 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java @@ -9,6 +9,8 @@ */ package eu.etaxonomy.taxeditor.editor.view.derivate; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import org.eclipse.jface.resource.ImageDescriptor; @@ -23,6 +25,7 @@ import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.taxeditor.editor.EditorUtil; import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.store.CdmStore; +import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; /** * Editor input for the {@link DerivateView} which holds the currently selected derivate for which @@ -35,38 +38,43 @@ import eu.etaxonomy.taxeditor.store.CdmStore; public class DerivateViewEditorInput implements IEditorInput{ /** - * The selected derivate {@link UUID} + * The selected derivate {@link UUID}s */ - private UUID derivateUUID; + private Set derivateUUIDs; /** - * The {@link UUID} of the root of the hierarchy (may be the same object as the derivate) + * List of the {@link UUID}s of the root elements of the hierarchy (may be the same objects as the derivates) */ - private UUID rootUUID; + private Set rootUUIDs; private final ConversationHolder conversationHolder; /** - * Creates an editor input for the {@link DerivateView} with the currently selected derivate and the - * corresponding {@link FieldUnit} (both may be the same object). - * @param derivateUuid the {@link UUID} of the derivate for which the derivate hierarchy should be shown - * @param rootUUID the root of the hierarchy + * Creates an editor input for the {@link DerivateView} with the currently selected derivates and the + * corresponding {@link FieldUnit}s (both may be the same object). + * @param derivateUuids the {@link UUID}s of the derivates for which the derivate hierarchy should be shown + * @param rootUUIDs the root of the hierarchy */ - public DerivateViewEditorInput(UUID derivateUuid) { + public DerivateViewEditorInput(Set derivateUuids) { super(); this.conversationHolder = CdmStore.createConversation(); - this.derivateUUID = derivateUuid; - SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(derivateUuid); - if(derivate instanceof FieldUnit){ - this.rootUUID = derivateUUID; - } - else if(derivate instanceof DerivedUnit){ - SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); - rootUUID = topMostDerivate==null?null:topMostDerivate.getUuid(); - if(rootUUID==null){ - rootUUID = derivateUUID; + this.derivateUUIDs = derivateUuids; + this.rootUUIDs = new HashSet(); + for (UUID uuid : derivateUuids) { + SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(uuid); + if(derivate instanceof FieldUnit){ + rootUUIDs.add(uuid); + } + else if(derivate instanceof DerivedUnit){ + SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); + if(topMostDerivate!=null){ + rootUUIDs.add(topMostDerivate.getUuid()); + } } } - if(rootUUID==null){ + if(rootUUIDs.isEmpty()){ + rootUUIDs = derivateUUIDs; + } + if(rootUUIDs.isEmpty()){ MessagingUtils.messageDialog("Failed initializing editor", DerivateViewEditorInput.class, "No root element found!"); } } @@ -102,7 +110,7 @@ public class DerivateViewEditorInput implements IEditorInput{ */ @Override public String getName() { - return derivateUUID.toString(); + return getEditorName(); } /* (non-Javadoc) @@ -118,19 +126,38 @@ public class DerivateViewEditorInput implements IEditorInput{ */ @Override public String getToolTipText() { - return derivateUUID.toString(); + return getEditorName(); + } + + private String getEditorName() { + String name = null; + //FIXME consider giving label provider a static method to get the derivate text. Pass the conversation as a method parameter. + DerivateLabelProvider labelProvider = new DerivateLabelProvider(); + labelProvider.setConversation(conversationHolder); + for(UUID uuid:rootUUIDs){ + SpecimenOrObservationBase specimen = CdmStore.getService(IOccurrenceService.class).load(uuid); + if(specimen!=null){ + if(name==null){ + name = labelProvider.getDerivateText(specimen); + } + else{ + name += ", "+labelProvider.getDerivateText(specimen); + } + } + } + return name; } - public UUID getDerivateUUID() { - return derivateUUID; + public Set getRootUUIDs() { + return rootUUIDs; } - public UUID getRootElementUUID() { - return rootUUID; + public Set getDerivateUUIDs() { + return derivateUUIDs; } public void setRootAsDerivate(){ - this.derivateUUID = this.rootUUID; + this.derivateUUIDs = this.rootUUIDs; } public ConversationHolder getConversationHolder() { @@ -144,7 +171,7 @@ public class DerivateViewEditorInput implements IEditorInput{ public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((rootUUID == null) ? 0 : rootUUID.hashCode()); + result = prime * result + ((rootUUIDs == null) ? 0 : rootUUIDs.hashCode()); return result; } @@ -163,14 +190,15 @@ public class DerivateViewEditorInput implements IEditorInput{ return false; } DerivateViewEditorInput other = (DerivateViewEditorInput) obj; - if (rootUUID == null) { - if (other.rootUUID != null) { + if (rootUUIDs == null) { + if (other.rootUUIDs != null) { return false; } - } else if (!rootUUID.equals(other.rootUUID)) { + } else if (!rootUUIDs.equals(other.rootUUIDs)) { return false; } return true; } + } diff --git a/eu.etaxonomy.taxeditor.store/plugin.xml b/eu.etaxonomy.taxeditor.store/plugin.xml index 58b9538ae..44d489e5a 100644 --- a/eu.etaxonomy.taxeditor.store/plugin.xml +++ b/eu.etaxonomy.taxeditor.store/plugin.xml @@ -514,6 +514,15 @@ + + + + @@ -576,14 +585,6 @@ - - - - @@ -653,6 +654,11 @@ id="eu.etaxonomy.taxeditor.store.open.OpenDistributionEditorWizardHandler" name="Open Distribution Editor Wizard"> + + diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java index 60bc2a1c4..8ef16a642 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java @@ -70,7 +70,7 @@ public class DerivateSearchComposite extends Composite { new Label(this, SWT.NONE); new Label(this, SWT.NONE); - resultViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION); + resultViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); table = resultViewer.getTable(); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 6, 4)); diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java index 6da90e1e3..9f950fa3f 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java @@ -10,7 +10,10 @@ package eu.etaxonomy.taxeditor.view.derivateSearch; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.MenuManager; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IMemento; import org.eclipse.ui.part.ViewPart; @@ -44,6 +47,13 @@ public class DerivateSearchView extends ViewPart implements IContextListener { derivateSearchCompositeController = new DerivateSearchCompositeController(parent, this); getSite().setSelectionProvider(derivateSearchCompositeController.getResultViewer()); derivateSearchCompositeController.setEnabled(CdmStore.isActive()); + + //create context menu + MenuManager menuManager = new MenuManager(); + getSite().registerContextMenu(menuManager, derivateSearchCompositeController.getResultViewer()); + Control control = derivateSearchCompositeController.getResultViewer().getControl(); + Menu menu = menuManager.createContextMenu(control); + control.setMenu(menu); } /* (non-Javadoc) -- 2.34.1