From: Patrick Plitzner Date: Wed, 11 Nov 2015 10:07:36 +0000 (+0100) Subject: Merge branch 'develop' into unify_derivative_views X-Git-Tag: 3.12.0^2~62^2~7^2~4 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/b92b32354ea67070b02836f9963dc7d9af6748e7?hp=df5f483298b22b24ee3daf57259d0ef41db5b147 Merge branch 'develop' into unify_derivative_views --- diff --git a/eu.etaxonomy.taxeditor.application/src/main/java/eu/etaxonomy/taxeditor/perspective/DerivatePerspective.java b/eu.etaxonomy.taxeditor.application/src/main/java/eu/etaxonomy/taxeditor/perspective/DerivatePerspective.java index b7e850932..1033f0c7c 100644 --- a/eu.etaxonomy.taxeditor.application/src/main/java/eu/etaxonomy/taxeditor/perspective/DerivatePerspective.java +++ b/eu.etaxonomy.taxeditor.application/src/main/java/eu/etaxonomy/taxeditor/perspective/DerivatePerspective.java @@ -13,9 +13,9 @@ import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPlaceholderFolderLayout; import org.eclipse.ui.progress.IProgressConstants; +import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptiveViewPart; import eu.etaxonomy.taxeditor.navigation.navigator.TaxonNavigator; -import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateSearchView; import eu.etaxonomy.taxeditor.view.datasource.CdmDataSourceViewPart; import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart; @@ -30,16 +30,13 @@ public class DerivatePerspective extends Default { public static final String ADDITIONAL = "additional"; - /* (non-Javadoc) - * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout) - */ @Override public void createInitialLayout(IPageLayout layout) { layout.addView(TaxonNavigator.ID, IPageLayout.LEFT, 0.25f, layout.getEditorArea()); layout.addView(DetailsViewPart.ID, IPageLayout.RIGHT, 0.6f, layout.getEditorArea()); - layout.addView(DerivateSearchView.ID, IPageLayout.TOP, 0.5f, layout.getEditorArea()); + layout.addView(DerivateView.ID, IPageLayout.BOTTOM, 0.5f, layout.getEditorArea()); layout.addView(DescriptiveViewPart.ID, IPageLayout.BOTTOM, 0.6f, TaxonNavigator.ID); diff --git a/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF index 666680ec6..b41d0021e 100644 --- a/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF +++ b/eu.etaxonomy.taxeditor.editor/META-INF/MANIFEST.MF @@ -15,6 +15,7 @@ Export-Package: eu.etaxonomy.taxeditor.editor, eu.etaxonomy.taxeditor.editor.name.operation, eu.etaxonomy.taxeditor.editor.view.concept, eu.etaxonomy.taxeditor.editor.view.dataimport, + eu.etaxonomy.taxeditor.editor.view.derivate, eu.etaxonomy.taxeditor.editor.view.descriptive, eu.etaxonomy.taxeditor.editor.view.media, eu.etaxonomy.taxeditor.editor.view.uses diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties index 55c9c006b..d6cc82eab 100644 --- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties +++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin.properties @@ -101,7 +101,6 @@ command.name.23 = New Reference command.name.24 = New Name command.name.25 = New Team command.name.26 = New Person -command.name.27 = New Specimen category.name.5 = -- Polytomous Keys command.name.28 = New Child Node command.name.29 = New Sibling Node @@ -162,4 +161,4 @@ Bundle-Name = Editor Bundle command.name.48 = delete command.name.49 = delete command.name.50 = delete -command.name.51 = delete \ No newline at end of file +command.name.51 = delete diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties index a4d096a11..c571435e1 100644 --- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties +++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_de.properties @@ -101,7 +101,6 @@ command.name.23 = Neue Referenz command.name.24 = Neuer Name command.name.25 = Neues Team command.name.26 = Neue Person -command.name.27 = Neuer Beleg category.name.5 = -- Polytomer Bestimmungsschl\u00fcssel command.name.28 = Neue Kinderknoten command.name.29 = Neuer Geschwisterknoten diff --git a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties index 17a5b0490..80f1ca7e6 100644 --- a/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties +++ b/eu.etaxonomy.taxeditor.editor/OSGI-INF/l10n/plugin_en.properties @@ -100,7 +100,6 @@ command.name.23 = New Reference command.name.24 = New Name command.name.25 = New Team command.name.26 = New Person -command.name.27 = New Specimen category.name.5 = -- Polytomous Keys command.name.28 = New Child Node command.name.29 = New Sibling Node diff --git a/eu.etaxonomy.taxeditor.editor/icons/synced.gif b/eu.etaxonomy.taxeditor.editor/icons/synced.gif new file mode 100644 index 000000000..870934b69 Binary files /dev/null and b/eu.etaxonomy.taxeditor.editor/icons/synced.gif differ diff --git a/eu.etaxonomy.taxeditor.editor/plugin.xml b/eu.etaxonomy.taxeditor.editor/plugin.xml index 8a6792b11..4d31b47f4 100644 --- a/eu.etaxonomy.taxeditor.editor/plugin.xml +++ b/eu.etaxonomy.taxeditor.editor/plugin.xml @@ -58,13 +58,6 @@ id="eu.etaxonomy.taxeditor.editor.group.authority" name="%editor.name.4"> - - + + @@ -286,17 +286,6 @@ name="eu.etaxonomy.navigation.menu.new.separator2" visible="true"> - - - - - - @@ -309,10 +298,6 @@ - - + + + + + + + + + + + + + + + + + + + + + + @@ -773,11 +799,6 @@ label="%command.label.52" style="push"> - - + locationURI="toolbar:eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView"> + commandId="eu.etaxonomy.taxeditor.editor.derivative.listenToSelectionChange" + icon="icons/synced.gif" + label="Link with Taxon Editor" + style="toggle"> - - - - - - - - - - - - - - - - - - @@ -1406,12 +1397,6 @@ id="eu.etaxonomy.taxeditor.editor.command.new.person" name="%command.name.26"> - - @@ -1539,7 +1524,7 @@ + name="Open Derivative Editor"> + + selectedElementUUIDs = new HashSet(); - Object parameter; - //check if parameter is set - try { - parameter = event.getObjectParameterForExecution("eu.etaxonomy.taxeditor.specimenUuidParameter"); - } catch (ExecutionException e) { - parameter = null; - } - if(parameter instanceof UUID){ - selectedElementUUIDs.add((UUID) parameter); - } - else{ - //if not, try with current selection - ISelection currentSelection = HandlerUtil.getCurrentSelection(event); - if(currentSelection instanceof IStructuredSelection){ - Iterator selectionIterator = ((IStructuredSelection) currentSelection).iterator(); - while(selectionIterator.hasNext()){ - Object object = selectionIterator.next(); - if(object instanceof SpecimenOrObservationBase){ - selectedElementUUIDs.add(((SpecimenOrObservationBase) object).getUuid()); - } - else if(object instanceof IndividualsAssociation){ - SpecimenOrObservationBase specimen = ((IndividualsAssociation) object).getAssociatedSpecimenOrObservation(); - if(specimen!=null){ - selectedElementUUIDs.add(specimen.getUuid()); - } - } - } - } - } - if(!selectedElementUUIDs.isEmpty()){ - DerivateViewEditorInput input = new DerivateViewEditorInput(selectedElementUUIDs); - try { - EditorUtil.open(input); - } catch (PartInitException e) { - MessagingUtils.error(OpenDerivateViewHandler.class, "Could not open Derivative Editor", e); - } catch (NullPointerException npe){ - MessagingUtils.messageDialog("Failed to open Editor", OpenDerivateViewHandler.class, "Could not open Derivative Editor. The derivate hierarchy is corrupted!", npe); - } - } - else{ - MessagingUtils.informationDialog("Empty selection", "No Specimen selected."); - } + AbstractUtility.showView(DerivateView.ID); return null; } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewSpecimenHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewSpecimenHandler.java deleted file mode 100644 index dbd335370..000000000 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/handler/create/NewSpecimenHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -// $Id$ -/** -* Copyright (C) 2007 EDIT -* European Distributed Institute of Taxonomy -* http://www.e-taxonomy.eu -* -* The contents of this file are subject to the Mozilla Public License Version 1.1 -* See LICENSE.TXT at the top of this package for the full license terms. -*/ - -package eu.etaxonomy.taxeditor.editor.handler.create; - -import org.apache.log4j.Logger; -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.jface.wizard.WizardDialog; -import org.eclipse.ui.handlers.HandlerUtil; - -import eu.etaxonomy.taxeditor.newWizard.NewDerivedUnitBaseWizard; - -/** - * @author n.hoffmann - * @created Jun 16, 2010 - * @version 1.0 - */ -public class NewSpecimenHandler extends AbstractHandler { - private static final Logger logger = Logger - .getLogger(NewSpecimenHandler.class); - - /** {@inheritDoc} */ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - - //TODO: we need to discuss how specimens should be created and handled #5244 -// ConversationHolder conversation = CdmStore.createConversation(); -// conversation.bind(); -// FieldUnit fieldUnit = FieldUnit.NewInstance(); -// DerivedUnit derivedUnit = DerivedUnit.NewInstance(SpecimenOrObservationType.PreservedSpecimen); -// DerivationEvent.NewSimpleInstance(fieldUnit, derivedUnit, DerivationEventType.GATHERING_IN_SITU()); -// fieldUnit.setCacheStrategy(new DerivedUnitFacadeFieldUnitCacheStrategy()); -// derivedUnit.setCacheStrategy(new DerivedUnitFacadeCacheStrategy()); -// CdmStore.getService(IOccurrenceService.class).save(fieldUnit); -// CdmStore.getService(IOccurrenceService.class).save(derivedUnit); -// conversation.commit(); -// DerivateViewEditorInput input = new DerivateViewEditorInput(Collections.singleton(fieldUnit.getUuid())); -// try { -// EditorUtil.open(input); -// } catch (PartInitException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } - NewDerivedUnitBaseWizard wizard = new NewDerivedUnitBaseWizard(); - wizard.init(null, null); - WizardDialog dialog = new WizardDialog(HandlerUtil.getActiveShell(event), wizard); - dialog.open(); - return null; - } -} 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 ec05a6b1d..178c3f7f5 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 @@ -1,17 +1,21 @@ package eu.etaxonomy.taxeditor.editor.view.derivate; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; -import java.util.Map.Entry; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.UUID; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeNode; import org.eclipse.jface.viewers.TreeSelection; @@ -19,32 +23,37 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; -import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.part.EditorPart; +import org.eclipse.ui.IMemento; +import org.eclipse.ui.ISaveablePart2; +import org.eclipse.ui.IWorkbenchPart; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; -import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; -import eu.etaxonomy.cdm.api.service.molecular.ISequenceService; +import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; -import eu.etaxonomy.cdm.model.molecular.Sequence; import eu.etaxonomy.cdm.model.molecular.SingleRead; +import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; +import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap; +import eu.etaxonomy.taxeditor.editor.EditorUtil; import eu.etaxonomy.taxeditor.editor.Messages; -import eu.etaxonomy.taxeditor.model.IDirtyMarkable; +import eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter.DerivateSearchCompositeController; +import eu.etaxonomy.taxeditor.model.IContextListener; import eu.etaxonomy.taxeditor.model.IPartContentHasDetails; import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData; import eu.etaxonomy.taxeditor.model.IPartContentHasMedia; import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData; -import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; +import eu.etaxonomy.taxeditor.session.ICdmEntitySession; import eu.etaxonomy.taxeditor.store.CdmStore; +import eu.etaxonomy.taxeditor.view.AbstractCdmViewPart; import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateContentProvider; import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; @@ -52,15 +61,29 @@ import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; * Displays the derivate hierarchy of the specimen specified in the editor input. * */ -public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkable, - IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia, - ISelectionChangedListener, IPostOperationEnabled{ - +public class DerivateView extends AbstractCdmViewPart implements IPartContentHasFactualData, ISaveablePart2, + IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia, IContextListener { public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView"; //$NON-NLS-1$ public static final String YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION = Messages.DerivateView_YOU_NEED_TO_SAVE; public static final String VIEW_HAS_UNSAVED_CHANGES = Messages.DerivateView_UNSAVED_CHANGES; + private static final List SPECIMEN_INIT_STRATEGY = Arrays.asList(new String[] { + "descriptions", + "annotations", + "markers", + "credits", + "extensions", + "rights", + "sources", + "derivationEvents.derivatives.annotations", + "derivationEvents.derivatives.markers", + "derivationEvents.derivatives.credits", + "derivationEvents.derivatives.extensions", + "derivationEvents.derivatives.rights", + "derivationEvents.derivatives.sources" + }); + private ConversationHolder conversation; private TreeViewer viewer; @@ -71,32 +94,88 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa private DerivateLabelProvider labelProvider; - private Set multiLinkSingleReads; + private DerivateContentProvider contentProvider; - private ISelection selection = null; + private DerivateSearchCompositeController derivateSearchCompositeController; + /** + * A map with keys being the derivative entities belonging to the {@link UUID}s passed to the constructor + * and values being the root elements of the hierarchy (may be the same objects as the derivative entities) + */ + private Map, SpecimenOrObservationBase> derivateToRootEntityMap; - private DerivateContentProvider contentProvider; + /** + * The set of root elements + */ + private Set> rootElements; + + private ICdmEntitySession cdmEntitySession; + + /** + * true if this view is listening to selection changes + */ + private boolean listenToSelectionChange; + + private Taxon selectedTaxon; /** * Default constructor */ public DerivateView() { + init(); + } + + /** + * + */ + private void init() { + this.derivateToRootEntityMap = new HashMap, SpecimenOrObservationBase>(); + this.rootElements = new HashSet>(); + + if (CdmStore.isActive() && conversation == null) { + conversation = CdmStore.createConversation(); + } + if (CdmStore.isActive()) { + cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true); + } + //listen to context changes + CdmStore.getContextManager().addContextListener(this); } @Override public void createPartControl(Composite parent) { + + parent.setLayout(new GridLayout()); + + //---search and filter--- + derivateSearchCompositeController = new DerivateSearchCompositeController(parent, this); + GridData gridDataSearchBar = new GridData(); + gridDataSearchBar.horizontalAlignment = GridData.FILL; + gridDataSearchBar.grabExcessHorizontalSpace = true; + derivateSearchCompositeController.setLayoutData(gridDataSearchBar); + derivateSearchCompositeController.setEnabled(CdmStore.isActive()); + + //---tree viewer--- viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION)); + GridData gridDataTree = new GridData(); + gridDataTree.horizontalAlignment = GridData.FILL; + gridDataTree.verticalAlignment = GridData.FILL; + gridDataTree.grabExcessVerticalSpace = true; + gridDataTree.grabExcessHorizontalSpace = true; + viewer.getTree().setLayoutData(gridDataTree); contentProvider = new DerivateContentProvider(); viewer.setContentProvider(contentProvider); labelProvider = new DerivateLabelProvider(); labelProvider.setConversation(conversation); viewer.setLabelProvider(labelProvider); viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); + viewer.getTree().setEnabled(CdmStore.isActive()); // Propagate selection from viewer getSite().setSelectionProvider(viewer); + //listen to selection changes - viewer.addSelectionChangedListener(this); + selectionService = getSite().getWorkbenchWindow().getSelectionService(); + selectionService.addSelectionListener(this); //create context menu MenuManager menuManager = new MenuManager(); @@ -105,20 +184,8 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa Menu menu = menuManager.createContextMenu(control); control.setMenu(menu); - generateMultiLinkSingleReads(); - labelProvider.setMultiLinkSingleReads(multiLinkSingleReads); - IEditorInput editorInput = getEditorInput(); - viewer.setInput(((DerivateViewEditorInput) editorInput).getRootEntities()); - //set selection to selected derivate if only one was selected - if(editorInput instanceof DerivateViewEditorInput){ - Set> derivateEntities = ((DerivateViewEditorInput) editorInput).getDerivateEntities(); - if(derivateEntities.size()==1){ - SpecimenOrObservationBase specimen = derivateEntities.iterator().next(); - if(specimen != null){ - viewer.setSelection(new StructuredSelection(new TreeNode(specimen))); - } - } - } + //init tree + updateRootEntities(); //add drag'n'drop support Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),}; @@ -126,13 +193,59 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this)); } + public void updateRootEntities() { + updateRootEntities(null); + } + + public void updateRootEntities(Collection derivativeUuids) { + if(conversation!=null){ + if (!conversation.isBound()) { + conversation.bind(); + } + /* + * If the active session is not the session of the Derivate Editor then we will + * save it, bind temporarily to our session and rebind to the original session. + * This happens e.g. if a selection change happens in the taxon editor and + * "Link with editor" is enabled. The selection change event and thus the + * loading in updateRootEntities() happens in the session of the taxon + * editor. + */ + ICdmEntitySession previousCdmEntitySession = CdmStore.getCurrentSessionManager().getActiveSession(); + if(cdmEntitySession != null) { + cdmEntitySession.bind(); + } + + if(derivativeUuids!=null){ + this.derivateToRootEntityMap = new HashMap, SpecimenOrObservationBase>(); + this.rootElements = new HashSet>(); + for (UUID uuid : derivativeUuids) { + SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(uuid, SPECIMEN_INIT_STRATEGY); + if(derivate instanceof FieldUnit){ + derivateToRootEntityMap.put(derivate, derivate); + } + else { + SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); + if(topMostDerivate!=null){ + derivateToRootEntityMap.put(derivate, topMostDerivate); + } + else{ + derivateToRootEntityMap.put(derivate, derivate); + } + } + } + for (SpecimenOrObservationBase specimen : derivateToRootEntityMap.values()) { + rootElements.add(specimen); + } + } + viewer.setInput(rootElements); + refreshTree(false); + previousCdmEntitySession.bind(); + } + } + @Override public void doSave(IProgressMonitor monitor) { String taskName = Messages.DerivateView_SAVING_HIERARCHY; - if(getEditorInput() instanceof DerivateViewEditorInput){ - DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput(); - taskName += " "+derivateViewEditorInput.getName(); //$NON-NLS-1$ - } monitor.beginTask(taskName, 3); if (!conversation.isBound()) { conversation.bind(); @@ -141,7 +254,10 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa // commit the conversation and start a new transaction immediately conversation.commit(true); - ((DerivateViewEditorInput) getEditorInput()).merge(); + + if(CdmStore.getCurrentSessionManager().isRemoting()) { + CdmStore.getService(IOccurrenceService.class).merge(new ArrayList(rootElements), true); + } monitor.worked(1); this.setDirty(false); @@ -157,24 +273,9 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa @Override public String getTitleToolTip() { - if(getEditorInput() instanceof DerivateViewEditorInput){ - DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput(); - return derivateViewEditorInput.getName(); - } return Messages.DerivateView_DERIVATIVE_EDITOR; } - @Override - public void init(IEditorSite site, IEditorInput input) throws PartInitException { - setSite(site); - setInput(input); - if(input instanceof DerivateViewEditorInput){ - DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input; - conversation = derivateViewEditorInput.getConversationHolder(); - setPartName(derivateViewEditorInput.getName()); - } - } - @Override public boolean isDirty() { return isDirty; @@ -196,10 +297,12 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa public void setFocus() { viewer.getControl().setFocus(); //make sure to bind again if maybe in another view the conversation was unbound - if(!conversation.isBound()){ + if(conversation!=null && !conversation.isBound()){ conversation.bind(); } - ((DerivateViewEditorInput) getEditorInput()).bind(); + if(cdmEntitySession != null) { + cdmEntitySession.bind(); + } } @Override @@ -214,6 +317,7 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa /** * @return the viewer */ + @Override public TreeViewer getViewer() { return viewer; } @@ -230,6 +334,24 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa changed(null); } + @Override + public Map> getPropertyPathsMap() { + List specimenPropertyPaths = Arrays.asList(new String[] { + "descriptions", + "derivationEvents.derivates", + "annotations", + "markers", + "credits", + "extensions", + "rights", + "sources" + }); + Map> specimenPropertyPathMap = + new HashMap>(); + specimenPropertyPathMap.put(SpecimenOrObservationBase.class,specimenPropertyPaths); + return specimenPropertyPathMap; + } + /** * Refreshes the derivate hierarchy tree and expands the tree * to show and select the given object. @@ -247,43 +369,40 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa * Refreshes the derivate hierarchy tree */ public void refreshTree(){ - generateMultiLinkSingleReads(); - labelProvider.setMultiLinkSingleReads(multiLinkSingleReads); - viewer.refresh(); + refreshTree(true); + } + + /** + * Refreshes the derivate hierarchy tree + * @param refreshViewer if true then also the + * viewer will be refreshed. This was implemented due to + * performance reasons. If passing false + * does what was expected use false preferably. + */ + public void refreshTree(boolean refreshViewer){ + //refresh typedesignations + labelProvider.refresh(); + if(refreshViewer){ + viewer.refresh(); + } } //FIXME:Remoting hack to make this work for remoting //This should actually be resolved using remoting post operations public void remove(Object obj) { - Set> rootEntities = ((DerivateViewEditorInput) getEditorInput()).getRootEntities(); - rootEntities.remove(obj); - viewer.setInput(rootEntities); - } - - private void generateMultiLinkSingleReads() { - Set multiLinkSingleReads = new HashSet(); - for(Entry> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){ - if(entry.getValue().size()>1){ - multiLinkSingleReads.add(entry.getKey()); - } - } - this.multiLinkSingleReads = multiLinkSingleReads; + rootElements.remove(obj); + viewer.setInput(rootElements); } /** * @return a set of {@link SingleRead}s that have multiple parents */ public Set getMultiLinkSingleReads() { - return this.multiLinkSingleReads; - } - - @Override - public void selectionChanged(SelectionChangedEvent event) { - this.selection = event.getSelection(); + return DerivateLabelProvider.getMultiLinkSingleReads(); } - public ISelection getSelection() { - return selection; + public Object getSelectionInput() { + return selectedTaxon; } public DerivateLabelProvider getLabelProvider() { @@ -304,15 +423,130 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa return true; } + + @Override + public boolean canAttachMedia() { + return true; + } + + public void addFieldUnit(FieldUnit fieldUnit) { + rootElements.add(fieldUnit); + derivateToRootEntityMap.put(fieldUnit, fieldUnit); + } + + @Override + public ICdmEntitySession getCdmEntitySession() { + return cdmEntitySession; + } + @Override public void dispose() { - ((DerivateViewEditorInput) getEditorInput()).dispose(); super.dispose(); + if(conversation!=null){ + conversation.close(); + } + if(cdmEntitySession != null) { + cdmEntitySession.dispose(); + } } + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + if(listenToSelectionChange && selection instanceof IStructuredSelection){ + Object selectedElement = ((IStructuredSelection) selection).getFirstElement(); + if(selectedElement instanceof CdmBase && ((CdmBase) selectedElement).isInstanceOf(Taxon.class)){ + selectedTaxon = HibernateProxyHelper.deproxy(selectedElement, Taxon.class); + Collection fieldUnits = CdmStore.getService(IOccurrenceService.class).listFieldUnitsByAssociatedTaxon(selectedTaxon, null, null); + Collection uuids = new HashSet(); + for (SpecimenOrObservationBase specimenOrObservationBase : fieldUnits) { + uuids.add(specimenOrObservationBase.getUuid()); + } + updateRootEntities(uuids); + setPartName("Derivative Editor: " + selectedTaxon.getName()); + } + } + } + /** + * {@inheritDoc} + */ @Override - public boolean canAttachMedia() { - return true; + public List> getRootEntities() { + return new ArrayList>(rootElements); + } + + @Override + public void createViewer(Composite parent) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isSaveOnCloseNeeded() { + return isDirty(); } + + @Override + public int promptToSaveOnClose() { + return ISaveablePart2.DEFAULT; + } + + public void toggleListenToSelectionChange() { + listenToSelectionChange = !listenToSelectionChange; + derivateSearchCompositeController.setEnabled(!listenToSelectionChange); + if(!listenToSelectionChange){ + selectedTaxon = null; + setPartName("Derivative Editor"); + } + else if(selectedTaxon==null){ + setPartName("Derivative Editor [no taxon selected]"); + } + } + + public boolean isListenToSelectionChange(){ + return listenToSelectionChange; + } + + /** + * {@inheritDoc} + */ + @Override + public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) { + } + + /** + * {@inheritDoc} + */ + @Override + public void contextStop(IMemento memento, IProgressMonitor monitor) { + derivateSearchCompositeController.setEnabled(false); + viewer.getTree().setEnabled(false); + viewer.setInput(null); + } + + /** + * {@inheritDoc} + */ + @Override + public void contextStart(IMemento memento, IProgressMonitor monitor) { + init(); + derivateSearchCompositeController.setEnabled(!listenToSelectionChange); + viewer.getTree().setEnabled(true); + refreshTree(); + } + + /** + * {@inheritDoc} + */ + @Override + public void contextRefresh(IProgressMonitor monitor) { + } + + /** + * {@inheritDoc} + */ + @Override + public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) { + } + } 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 198b15a0f..950533d11 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,12 +9,6 @@ */ package eu.etaxonomy.taxeditor.editor.view.derivate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; import java.util.Set; import java.util.UUID; @@ -22,18 +16,8 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IPersistableElement; -import eu.etaxonomy.cdm.api.application.CdmApplicationState; -import eu.etaxonomy.cdm.api.conversation.ConversationHolder; -import eu.etaxonomy.cdm.api.service.IOccurrenceService; -import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; -import eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput; -import eu.etaxonomy.taxeditor.editor.EditorUtil; -import eu.etaxonomy.taxeditor.editor.Messages; -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 @@ -43,74 +27,21 @@ import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; * @date 25.11.2013 * */ -public class DerivateViewEditorInput extends CdmEntitySessionInput implements IEditorInput { +public class DerivateViewEditorInput implements IEditorInput { /** - * The selected derivate {@link UUID}s + * The {@link UUID}s of the derivative entities */ - private final Set> derivateEntities; - /** - * List of the {@link UUID}s of the root elements of the hierarchy (may be the same objects as the derivates) - */ - private Set> rootEntities; - private Set rootUUIDs; - - private final ConversationHolder conversationHolder; - - private static final List SPECIMEN_INIT_STRATEGY = Arrays.asList(new String[] { - "descriptions", - "annotations", - "markers", - "credits", - "extensions", - "rights", - "sources", - "derivationEvents.derivatives.annotations", - "derivationEvents.derivatives.markers", - "derivationEvents.derivatives.credits", - "derivationEvents.derivatives.extensions", - "derivationEvents.derivatives.rights", - "derivationEvents.derivatives.sources" - }); + private Set derivativeUUIDs; /** * 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 + * @param derivativeUUIDs the root of the hierarchy */ public DerivateViewEditorInput(Set derivateUuids) { - super(false); - rootUUIDs = derivateUuids; - //FIXME:Remoting temporary hack for making the sessions work - //This should ideally be changed to initializing the - //super class with a collection of (id) objects which can - //then be used for the hashCode, equals methods - initSession(); - this.conversationHolder = CdmStore.createConversation(); - this.derivateEntities = new HashSet>(); - this.rootEntities = new HashSet>(); - for (UUID uuid : derivateUuids) { - SpecimenOrObservationBase derivate = CdmStore.getService(IOccurrenceService.class).load(uuid, SPECIMEN_INIT_STRATEGY); - derivateEntities.add(derivate); - if(derivate instanceof FieldUnit){ - rootEntities.add(derivate); - } - else if(derivate instanceof DerivedUnit){ - SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); - if(topMostDerivate!=null){ - rootEntities.add(topMostDerivate); - } - } - } - if(rootEntities.isEmpty()){ - rootEntities = derivateEntities; - } - if(rootEntities.isEmpty()){ - MessagingUtils.messageDialog(Messages.DerivateViewEditorInput_FAIL_INIT, DerivateViewEditorInput.class, Messages.DerivateViewEditorInput_NO_ROOT); - } - - + this.derivativeUUIDs = derivateUuids; } /* (non-Javadoc) @@ -164,52 +95,24 @@ public class DerivateViewEditorInput extends CdmEntitySessionInput implements IE } private String getEditorName() { - String name = null; - for( SpecimenOrObservationBase specimen : rootEntities){ - if(specimen!=null){ - if(name==null){ - name = DerivateLabelProvider.getDerivateText(specimen, conversationHolder); - } - else{ - name += " + "+DerivateLabelProvider.getDerivateText(specimen, conversationHolder); //$NON-NLS-1$ - } - } - } - return name; - } - - @Override - public Set> getRootEntities() { - return rootEntities; - } - - public Set> getDerivateEntities() { - return derivateEntities; - } - - public void addRootEntity(SpecimenOrObservationBase root){ - rootEntities.add(root); + return "Derivative Editor"; } - - public ConversationHolder getConversationHolder() { - return conversationHolder; + /** + * @return the derivativeUUIDs + */ + public Set getDerivativeUUIDs() { + return derivativeUUIDs; } - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((rootUUIDs == null) ? 0 : rootUUIDs.hashCode()); + result = prime * result + ((derivativeUUIDs == null) ? 0 : derivativeUUIDs.hashCode()); return result; } - /* (non-Javadoc) - * @see java.lang.Object#equals(java.lang.Object) - */ @Override public boolean equals(Object obj) { if (this == obj) { @@ -222,47 +125,14 @@ public class DerivateViewEditorInput extends CdmEntitySessionInput implements IE return false; } DerivateViewEditorInput other = (DerivateViewEditorInput) obj; - if (rootUUIDs == null) { - if (other.rootUUIDs != null) { + if (derivativeUUIDs == null) { + if (other.derivativeUUIDs != null) { return false; } - } else if (!rootUUIDs.equals(other.rootUUIDs)) { + } else if (!derivativeUUIDs.equals(other.derivativeUUIDs)) { return false; } return true; } - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.editor.CdmEntitySessionInput#merge() - */ - @Override - public void merge() { - if(CdmStore.getCurrentSessionManager().isRemoting()) { - CdmApplicationState.getCurrentAppConfig().getOccurrenceService().merge(new ArrayList(getRootEntities()), true); - } - - } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap() - */ - @Override - public Map> getPropertyPathsMap() { - List specimenPropertyPaths = Arrays.asList(new String[] { - "descriptions", - "derivationEvents.derivates", - "annotations", - "markers", - "credits", - "extensions", - "rights", - "sources" - }); - Map> specimenPropertyPathMap = - new HashMap>(); - specimenPropertyPathMap.put(SpecimenOrObservationBase.class,specimenPropertyPaths); - return specimenPropertyPathMap; - } - - } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java new file mode 100644 index 000000000..838e5c081 --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/CreateFieldUnitContextMenu.java @@ -0,0 +1,105 @@ +package eu.etaxonomy.taxeditor.editor.view.derivate.contextMenu; + +import org.eclipse.jface.action.ContributionItem; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.CompoundContributionItem; + +import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; +import eu.etaxonomy.cdm.model.common.CdmBase; +import eu.etaxonomy.cdm.model.description.Feature; +import eu.etaxonomy.cdm.model.description.IndividualsAssociation; +import eu.etaxonomy.cdm.model.description.TaxonDescription; +import eu.etaxonomy.cdm.model.occurrence.FieldUnit; +import eu.etaxonomy.cdm.model.taxon.Taxon; +import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; +import eu.etaxonomy.taxeditor.model.MessagingUtils; +import eu.etaxonomy.taxeditor.store.CdmStore; + +/** + * Context menu for the SingleReads in the derivate hierarchy. + * + */ +public class CreateFieldUnitContextMenu extends CompoundContributionItem { + + private enum CommandType { + COPY_TO_CLIPBOARD, REMOVE_FROM_SEQUENCE, ADD_TO_SEQUENCE + } + + @Override + protected IContributionItem[] getContributionItems() { + IContributionItem[] contributionItems = new IContributionItem[] { + new ContributionItem() { + @Override + public void fill(Menu menu, int index) { + final IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + IWorkbenchPart activePart = window.getActivePage().getActivePart(); + if(activePart instanceof DerivateView){ + final DerivateView derivateView = (DerivateView) activePart; + if(derivateView.isListenToSelectionChange()){ + Object selectionInput = derivateView.getSelectionInput(); + if(selectionInput instanceof CdmBase && ((CdmBase) selectionInput).isInstanceOf(Taxon.class)){ + final Taxon taxon = HibernateProxyHelper.deproxy(selectionInput, Taxon.class); + MenuItem item = new MenuItem(menu, SWT.NONE); + item.setText("Create FieldUnit for "+taxon.getName()); + item.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if(derivateView.isDirty()){ + MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION); + return; + } + FieldUnit fieldUnit = FieldUnit.NewInstance(); + fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class); + IndividualsAssociation association = IndividualsAssociation.NewInstance(fieldUnit); + association.setFeature(Feature.SPECIMEN()); + TaxonDescription description; + if(!taxon.getDescriptions().isEmpty()){ + description = taxon.getDescriptions().iterator().next(); + } + else{ + description = TaxonDescription.NewInstance(taxon); + } + description.addElement(IndividualsAssociation.NewInstance(fieldUnit)); + + derivateView.getConversationHolder().commit(); + derivateView.addFieldUnit(fieldUnit); + derivateView.refreshTree(); + } + }); + } + } + else{ + MenuItem item = new MenuItem(menu, SWT.NONE); + item.setText("Create FieldUnit"); + item.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if(derivateView.isDirty()){ + MessagingUtils.warningDialog(DerivateView.VIEW_HAS_UNSAVED_CHANGES, this, DerivateView.YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION); + return; + } + FieldUnit fieldUnit = FieldUnit.NewInstance(); + fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class); + derivateView.getConversationHolder().commit(); + derivateView.addFieldUnit(fieldUnit); + derivateView.refreshTree(); + } + }); + } + } + } + } + }; + return contributionItems; + } +} + diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java index 17d95b197..659ea5283 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/contextMenu/DerivateViewContextMenu.java @@ -8,6 +8,7 @@ public class DerivateViewContextMenu extends CompoundContributionItem { @Override protected IContributionItem[] getContributionItems() { IContributionItem[] contributionItems = new IContributionItem[] { + new CreateFieldUnitContextMenu(), new CreateDerivateContextMenu(), new SingleReadSequenceContextMenu() }; diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java index 5129e44c5..21e9f6780 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/CreateFieldUnitHandler.java @@ -8,7 +8,6 @@ import eu.etaxonomy.cdm.api.service.IOccurrenceService; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; -import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput; import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.store.CdmStore; @@ -26,8 +25,7 @@ public class CreateFieldUnitHandler extends AbstractHandler { FieldUnit fieldUnit = FieldUnit.NewInstance(); fieldUnit = CdmBase.deproxy(CdmStore.getService(IOccurrenceService.class).save(fieldUnit), FieldUnit.class); derivateView.getConversationHolder().commit(); - DerivateViewEditorInput input = (DerivateViewEditorInput) derivateView.getEditorInput(); - input.addRootEntity(fieldUnit); + derivateView.addFieldUnit(fieldUnit); derivateView.refreshTree(); } return null; diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/ListenToSelectionChangeHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/ListenToSelectionChangeHandler.java new file mode 100644 index 000000000..413c3772d --- /dev/null +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/handler/ListenToSelectionChangeHandler.java @@ -0,0 +1,23 @@ +package eu.etaxonomy.taxeditor.editor.view.derivate.handler; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.handlers.HandlerUtil; + +import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; + +public class ListenToSelectionChangeHandler extends AbstractHandler { + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + IWorkbenchPart activePart = HandlerUtil.getActivePart(event); + if(activePart instanceof DerivateView){ + DerivateView derivativeEditor = (DerivateView)activePart; + derivativeEditor.toggleListenToSelectionChange(); + } + return null; + } + +} diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java index bfb5f5751..f5956fa1b 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/operation/DeleteDerivateOperation.java @@ -27,7 +27,6 @@ import eu.etaxonomy.cdm.model.molecular.Sequence; import eu.etaxonomy.cdm.model.molecular.SingleRead; import eu.etaxonomy.taxeditor.editor.Messages; import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; -import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.operation.AbstractPostOperation; import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; @@ -94,10 +93,6 @@ public class DeleteDerivateOperation extends AbstractPostOperation { //update DerivateView derivateView.getConversationHolder().commit(); IStatus returnStatus = postExecute(null); - //close if no more items left - if(derivateView.getViewer().getTree().getItemCount()<1){ - AbstractUtility.close(derivateView); - } return returnStatus; } } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchComposite.java similarity index 60% rename from eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java rename to eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchComposite.java index b101a2298..b34b7ab19 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchComposite.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchComposite.java @@ -7,12 +7,9 @@ * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ -package eu.etaxonomy.taxeditor.view.derivateSearch; +package eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter; -import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -20,7 +17,6 @@ import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.wb.swt.ResourceManager; @@ -30,72 +26,82 @@ import org.eclipse.wb.swt.ResourceManager; * */ public class DerivateSearchComposite extends Composite { + + public static final int ALL_SPECIMENS = 0; + public static final int ASSIGNED_SPECIMENS = 1; + public static final int UNASSIGNED_SPECIMENS = 2; + private final FormToolkit formToolkit = new FormToolkit(Display.getDefault()); private final Text searchField; - private final Table table; - private final TableViewer resultViewer; private final Combo comboDerivateType; private final Button buttonSearch; - private final Button btnFilterUndeterminedSpecimen; private final Text textTaxonName; private final Button btnBrowseTaxa; private final Label lblTaxon; private final Label lblDerivateType; private final Button btnClearTaxon; + private Label lbltaxonAssignment; + private Combo comboTaxonAssignment; + private Label lblTitleCache; /** * Create the composite. + * * @param parent * @param style */ public DerivateSearchComposite(Composite parent, int style) { super(parent, style); - setLayout(new GridLayout(4, false)); + setLayout(new GridLayout(7, false)); lblTaxon = new Label(this, SWT.NONE); lblTaxon.setText("Taxon"); - textTaxonName = formToolkit.createText(this, "New Text", SWT.NONE); + textTaxonName = formToolkit.createText(this, "New Text", SWT.BORDER); textTaxonName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); textTaxonName.setEnabled(false); textTaxonName.setText(""); btnBrowseTaxa = formToolkit.createButton(this, "", SWT.NONE); + btnBrowseTaxa.setAlignment(SWT.RIGHT); btnBrowseTaxa.setImage(ResourceManager.getPluginImage("eu.etaxonomy.taxeditor.store", "icons/open.gif")); btnClearTaxon = formToolkit.createButton(this, "", SWT.NONE); - btnClearTaxon.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); + btnClearTaxon.setAlignment(SWT.RIGHT); + btnClearTaxon.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1)); btnClearTaxon.setImage(ResourceManager.getPluginImage("eu.etaxonomy.taxeditor.store", "icons/trash.gif")); + lbltaxonAssignment = new Label(this, SWT.NONE); + lbltaxonAssignment.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lbltaxonAssignment.setText("Taxon assignment"); + + comboTaxonAssignment = new Combo(this, SWT.NONE); + comboTaxonAssignment.setItems(new String[] { "All", "Yes", "No" }); + comboTaxonAssignment.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + formToolkit.adapt(comboTaxonAssignment); + formToolkit.paintBordersFor(comboTaxonAssignment); + comboTaxonAssignment.select(ALL_SPECIMENS); + new Label(this, SWT.NONE); + + lblTitleCache = new Label(this, SWT.NONE); + lblTitleCache.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblTitleCache.setText("Title Cache"); + + searchField = formToolkit.createText(this, "New Text", SWT.BORDER); + searchField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1)); + searchField.setText(""); + lblDerivateType = new Label(this, SWT.NULL); + lblDerivateType.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblDerivateType.setText("Derivative Type"); comboDerivateType = new Combo(this, SWT.READ_ONLY); comboDerivateType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); formToolkit.paintBordersFor(comboDerivateType); - btnFilterUndeterminedSpecimen = new Button(this, SWT.CHECK); - btnFilterUndeterminedSpecimen.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); - btnFilterUndeterminedSpecimen.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - } - }); - btnFilterUndeterminedSpecimen.setText("Determined"); - - buttonSearch = new Button(this, SWT.NONE); - formToolkit.adapt(buttonSearch, true, true); - buttonSearch.setText("Search"); - - searchField = formToolkit.createText(this, "New Text", SWT.NONE); - searchField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); - searchField.setText(""); - new Label(this, SWT.NONE); - new Label(this, SWT.NONE); - - resultViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); - table = resultViewer.getTable(); - table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1)); + buttonSearch = new Button(this, SWT.NONE); + formToolkit.adapt(buttonSearch, true, true); + buttonSearch.setText("Search"); } @@ -103,42 +109,51 @@ public class DerivateSearchComposite extends Composite { protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } + public Text getSearchField() { return searchField; } - public TableViewer getResultViewer() { - return resultViewer; - } + public Combo getComboDerivateType() { return comboDerivateType; } + public Button getButtonSearch() { return buttonSearch; } @Override - public void setEnabled(boolean enabled){ + public void setEnabled(boolean enabled) { super.setEnabled(enabled); searchField.setEnabled(enabled); - table.setEnabled(enabled); - // resultViewer.setEnabled(enabled); comboDerivateType.setEnabled(enabled); + comboTaxonAssignment.setEnabled(enabled); buttonSearch.setEnabled(enabled); - btnFilterUndeterminedSpecimen.setEnabled(enabled); btnBrowseTaxa.setEnabled(enabled); + btnClearTaxon.setEnabled(enabled); lblTaxon.setEnabled(enabled); + lblTitleCache.setEnabled(enabled); + lbltaxonAssignment.setEnabled(enabled); lblDerivateType.setEnabled(enabled); } - public Button getBtnFilterUndeterminedSpecimen() { - return btnFilterUndeterminedSpecimen; - } + + public Button getBtnBrowseTaxa() { return btnBrowseTaxa; } + public Text getTextTaxonName() { return textTaxonName; } + public Button getBtnClearTaxon() { return btnClearTaxon; } + public Combo getComboTaxonAssignment() { + return comboTaxonAssignment; + } + + public Label getLbltaxonAssignment() { + return lbltaxonAssignment; + } } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchCompositeController.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchCompositeController.java similarity index 61% rename from eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchCompositeController.java rename to eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchCompositeController.java index d49716ad6..e87fcc5aa 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchCompositeController.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/searchFilter/DerivateSearchCompositeController.java @@ -7,25 +7,19 @@ * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ -package eu.etaxonomy.taxeditor.view.derivateSearch; +package eu.etaxonomy.taxeditor.editor.view.derivate.searchFilter; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.UUID; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.NotEnabledException; -import org.eclipse.core.commands.NotHandledException; -import org.eclipse.core.commands.common.NotDefinedException; -import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Widget; -import org.eclipse.ui.handlers.IHandlerService; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; import eu.etaxonomy.cdm.api.service.IOccurrenceService; @@ -33,12 +27,13 @@ import eu.etaxonomy.cdm.api.service.config.FindOccurrencesConfigurator; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType; import eu.etaxonomy.cdm.model.taxon.Taxon; -import eu.etaxonomy.taxeditor.model.AbstractUtility; -import eu.etaxonomy.taxeditor.model.MessagingUtils; +import eu.etaxonomy.cdm.model.taxon.TaxonBase; +import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.store.SearchManager; import eu.etaxonomy.taxeditor.ui.dialog.selection.SelectionDialogFactory; import eu.etaxonomy.taxeditor.ui.mvc.combo.EnumTermComboController; +import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider; /** * Controller class for the {@link DerivateSearchComposite}.
@@ -50,17 +45,13 @@ public class DerivateSearchCompositeController implements Listener{ private final DerivateSearchComposite derivateSearchComposite; private EnumTermComboController comboSpecimenTypeController; - private final DerivateSearchView derivateSearchView; private DerivateLabelProvider labelProvider; private Taxon selectedTaxon; + private DerivateView derivativeEditor; - /** - * @param parent - * @param derivateSearchView - */ - public DerivateSearchCompositeController(Composite parent, DerivateSearchView derivateSearchView) { + public DerivateSearchCompositeController(Composite parent, DerivateView derivativeEditor) { this.derivateSearchComposite = new DerivateSearchComposite(parent, SWT.NONE); - this.derivateSearchView = derivateSearchView; + this.derivativeEditor = derivativeEditor; init(); } @@ -75,40 +66,9 @@ public class DerivateSearchCompositeController implements Listener{ derivateSearchComposite.getBtnBrowseTaxa().addListener(SWT.Selection, this); derivateSearchComposite.getBtnClearTaxon().addListener(SWT.Selection, this); - - //result table - TableViewer resultViewer = derivateSearchComposite.getResultViewer(); - resultViewer.setContentProvider(new ArrayContentProvider()); - labelProvider = new DerivateLabelProvider(); - resultViewer.setLabelProvider(labelProvider); - resultViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView"; - - IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class); - try { - handlerService.executeCommand(commandId, null); - } catch (ExecutionException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotDefinedException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotEnabledException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotHandledException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } - - } - }); - } private void searchDerivates(){ - if(!derivateSearchView.getConversationHolder().isBound()){ - derivateSearchView.setFocus(); //rebind the conversation - } - String queryString = derivateSearchComposite.getSearchField().getText(); SpecimenOrObservationType specimenType = comboSpecimenTypeController.getSelection(); @@ -117,7 +77,6 @@ public class DerivateSearchCompositeController implements Listener{ config.setSpecimenType(specimenType.equals(SpecimenOrObservationType.Unknown)?null:specimenType);//unknown := all types config.setTitleSearchString(queryString); if(selectedTaxon!=null){ - config.setRetrieveIndirectlyAssociatedSpecimens(true); config.setSpecimenType(null); } @@ -136,17 +95,31 @@ public class DerivateSearchCompositeController implements Listener{ occurrences = specimensOfCorrectType; } - //filter out assigned specimens - if(derivateSearchComposite.getBtnFilterUndeterminedSpecimen().getSelection()){ - List specimensWithNoDetermination = new ArrayList(); - for(SpecimenOrObservationBase result:occurrences){ - if(CdmStore.getService(IOccurrenceService.class).countDeterminations(result, null)==0){ - specimensWithNoDetermination.add(result); + //filter out (un-)assigned specimens + if(selectedTaxon==null){ + int selectionIndex = derivateSearchComposite.getComboTaxonAssignment().getSelectionIndex(); + List> specimenWithAssociations = new ArrayList>(); + if(selectionIndex!=DerivateSearchComposite.ALL_SPECIMENS){ + for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) { + Collection> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listAssociatedTaxa(specimenOrObservationBase, null, null, null, null); + if(!associatedTaxa.isEmpty()){ + specimenWithAssociations.add(specimenOrObservationBase); + specimenWithAssociations.addAll(CdmStore.getService(IOccurrenceService.class).getFieldUnits(specimenOrObservationBase.getUuid())); + } } } - occurrences = specimensWithNoDetermination; + if(selectionIndex==DerivateSearchComposite.UNASSIGNED_SPECIMENS){ + occurrences.removeAll(specimenWithAssociations); + } + else if(selectionIndex==DerivateSearchComposite.ASSIGNED_SPECIMENS){ + occurrences = new ArrayList(specimenWithAssociations); + } + } + List derivateUuids = new ArrayList(); + for (SpecimenOrObservationBase specimenOrObservationBase : occurrences) { + derivateUuids.add(specimenOrObservationBase.getUuid()); } - derivateSearchComposite.getResultViewer().setInput(occurrences); + derivativeEditor.updateRootEntities(derivateUuids); } @Override @@ -157,14 +130,20 @@ public class DerivateSearchCompositeController implements Listener{ searchDerivates(); } else if(eventSource==derivateSearchComposite.getBtnBrowseTaxa()){ - selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, derivateSearchView.getSite().getShell(), derivateSearchView.getConversationHolder(), null); + selectedTaxon = SelectionDialogFactory.getSelectionFromDialog(Taxon.class, this.derivateSearchComposite.getShell(), derivativeEditor.getConversationHolder(), null); if(selectedTaxon!=null){ derivateSearchComposite.getTextTaxonName().setText(selectedTaxon.getTitleCache()); } + derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ASSIGNED_SPECIMENS); + derivateSearchComposite.getComboTaxonAssignment().setEnabled(false); + derivateSearchComposite.getLbltaxonAssignment().setEnabled(false); } else if(eventSource==derivateSearchComposite.getBtnClearTaxon()){ selectedTaxon = null; derivateSearchComposite.getTextTaxonName().setText(""); + derivateSearchComposite.getComboTaxonAssignment().select(DerivateSearchComposite.ALL_SPECIMENS); + derivateSearchComposite.getComboTaxonAssignment().setEnabled(true); + derivateSearchComposite.getLbltaxonAssignment().setEnabled(true); } } @@ -174,16 +153,22 @@ public class DerivateSearchCompositeController implements Listener{ */ public void setEnabled(boolean enabled) { if(!derivateSearchComposite.isDisposed()){ - derivateSearchComposite.setEnabled(enabled); + GridData layoutData = (GridData) derivateSearchComposite.getLayoutData(); + layoutData.exclude = !enabled; + derivateSearchComposite.setVisible(enabled); + derivateSearchComposite.getParent().layout(true); } } + public void setLayoutData(Object layoutData){ + derivateSearchComposite.setLayoutData(layoutData); + } + /** * Resets all input fields */ public void reset(){ if(!derivateSearchComposite.isDisposed()){ - derivateSearchComposite.getResultViewer().setInput(null); derivateSearchComposite.getSearchField().setText(""); derivateSearchComposite.getComboDerivateType().deselectAll(); comboSpecimenTypeController.setSelection(SpecimenOrObservationType.Unknown); @@ -191,17 +176,6 @@ public class DerivateSearchCompositeController implements Listener{ selectedTaxon = null; } - public TableViewer getResultViewer() { - return derivateSearchComposite.getResultViewer(); - } - - public void setFocus() { - derivateSearchComposite.getResultViewer().getControl().setFocus(); - } - - /** - * @param conversationHolder - */ public void setConversation(ConversationHolder conversationHolder) { labelProvider.setConversation(conversationHolder); } diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java index 3494cd686..60d46862b 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/DescriptiveViewPart.java @@ -11,11 +11,7 @@ package eu.etaxonomy.taxeditor.editor.view.descriptive; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.Map; -import java.util.Set; -import java.util.UUID; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.GroupMarker; @@ -23,14 +19,11 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeNode; -import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; @@ -43,20 +36,17 @@ import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PartInitException; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.description.DescriptionBase; import eu.etaxonomy.cdm.model.description.DescriptionElementBase; import eu.etaxonomy.cdm.model.description.IDescribable; -import eu.etaxonomy.cdm.model.description.IndividualsAssociation; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.taxon.Taxon; import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor; import eu.etaxonomy.taxeditor.editor.EditorUtil; import eu.etaxonomy.taxeditor.editor.view.checklist.ChecklistEditor; import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; -import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput; import eu.etaxonomy.taxeditor.editor.view.media.MediaViewPart; import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.FeatureNodeContainer; @@ -65,15 +55,12 @@ import eu.etaxonomy.taxeditor.model.IPartContentHasDetails; import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData; import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData; import eu.etaxonomy.taxeditor.model.ImageResources; -import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart; import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart; import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart; /** - *

DescriptiveViewPart class.

- * * @author n.hoffmann * @created Jun 9, 2010 * @version 1.0 @@ -126,58 +113,8 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP createToolbar(); - // set initial input -// if(getEditor() != null){ -// viewer.setInput(getEditor().getEditorInput()); -// } - - viewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - //Open derivate editor when specimen description element is double clicked - TreeSelection selection = (TreeSelection) viewer.getSelection(); - Iterator iterator = selection.iterator(); - Set specimenUuids = new HashSet(); - while(iterator.hasNext()){ - Object next = iterator.next(); - if(next instanceof IndividualsAssociation){ - SpecimenOrObservationBase specimen = ((IndividualsAssociation)next).getAssociatedSpecimenOrObservation(); - if(specimen!=null){ - specimenUuids.add(specimen.getUuid()); - } - } - } - try { - if(!specimenUuids.isEmpty()){ - EditorUtil.open(new DerivateViewEditorInput(specimenUuids)); - } - } catch (PartInitException e) { - MessagingUtils.error(DescriptiveViewPart.class, "Could not open Derivative Editor", e); - } - - - //TODO: extend command to accept parameter to open editor -// String commandId = "eu.etaxonomy.taxeditor.editor.handler.openDerivateView"; -// IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class); -// try { -// handlerService.executeCommand(commandId, null); -// } catch (ExecutionException e) { -// MessagingUtils.error(DerivateSearchCompositeController.class, e); -// } catch (NotDefinedException e) { -// MessagingUtils.error(DerivateSearchCompositeController.class, e); -// } catch (NotEnabledException e) { -// MessagingUtils.error(DerivateSearchCompositeController.class, e); -// } catch (NotHandledException e) { -// MessagingUtils.error(DerivateSearchCompositeController.class, e); -// } - - } - }); } - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection() - */ /** {@inheritDoc} */ @Override protected ISelection getInitialSelection() { @@ -356,11 +293,6 @@ public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IP return viewer; } - /** - *

onComplete

- * - * @return a boolean. - */ @Override public boolean onComplete() { return false; diff --git a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/AddImageGalleryHandler.java b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/AddImageGalleryHandler.java index 466428298..894440b0b 100644 --- a/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/AddImageGalleryHandler.java +++ b/eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/media/handler/AddImageGalleryHandler.java @@ -7,28 +7,16 @@ import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.common.NotDefinedException; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.TreeNode; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; +import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.taxon.Taxon; -import eu.etaxonomy.cdm.model.taxon.TaxonBase; -import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor; import eu.etaxonomy.taxeditor.bulkeditor.BulkEditorUtil; -import eu.etaxonomy.taxeditor.bulkeditor.input.OccurrenceEditorInput; import eu.etaxonomy.taxeditor.editor.EditorUtil; -import eu.etaxonomy.taxeditor.editor.TaxonEditorInput; -import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView; -import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateViewEditorInput; -import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptiveViewPart; import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.AddDerivedUnitFacadeMediaOperation; -import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.CreateSpecimenDescriptionOperation; import eu.etaxonomy.taxeditor.editor.view.descriptive.operation.CreateTaxonDescriptionOperation; import eu.etaxonomy.taxeditor.editor.view.media.MediaViewPart; import eu.etaxonomy.taxeditor.model.AbstractUtility; @@ -37,89 +25,44 @@ import eu.etaxonomy.taxeditor.operation.AbstractPostOperation; import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled; /** - *

AddImageGalleryHandler class.

- * * @author p.ciardelli * @version $Id: $ */ public class AddImageGalleryHandler extends AbstractHandler { - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ /** {@inheritDoc} */ @Override public Object execute(ExecutionEvent event) throws ExecutionException { - IWorkbenchPart part = HandlerUtil.getActivePart(event); - IPostOperationEnabled postOperationEnabled = (part instanceof IPostOperationEnabled) ? (IPostOperationEnabled) part : null; + IWorkbenchPart part = HandlerUtil.getActivePart(event); + IPostOperationEnabled postOperationEnabled = (part instanceof IPostOperationEnabled) ? (IPostOperationEnabled) part : null; + if(part instanceof MediaViewPart){ + Object viewerInput = ((MediaViewPart)part).getViewer().getInput(); + try { + if(viewerInput instanceof CdmBase){ + if(((CdmBase) viewerInput).isInstanceOf(Taxon.class)){ + Taxon taxon = HibernateProxyHelper.deproxy(viewerInput, Taxon.class); - IEditorPart editor = HandlerUtil.getActiveEditor(event); - IEditorInput input = editor.getEditorInput(); + AbstractPostOperation operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), + EditorUtil.getUndoContext(), taxon, postOperationEnabled, true); - if (input instanceof TaxonEditorInput) { - Taxon taxon = ((TaxonEditorInput) input).getTaxon(); - AbstractPostOperation operation; - try { - // TODO use undo context specific to editor - operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), - EditorUtil.getUndoContext(), taxon, postOperationEnabled, true); - AbstractUtility.executeOperation(operation); - } catch (NotDefinedException e) { - MessagingUtils.warn(getClass(), "Command name not set."); - } - } - else if(input instanceof OccurrenceEditorInput){ - BulkEditor bulkEditor = (BulkEditor) editor; - ISelection selection = bulkEditor.getSelectionProvider().getSelection(); - invokeOperation(event, postOperationEnabled, selection); - } - else if(input instanceof DerivateViewEditorInput){ - ISelection selection = ((DerivateView)editor).getSelection(); - invokeOperation(event, postOperationEnabled, selection); - } else if(part instanceof MediaViewPart){ - Object viewerInput = ((MediaViewPart)part).getViewer().getInput(); - - if(viewerInput instanceof Taxon){ - Taxon taxon = HibernateProxyHelper.deproxy(viewerInput, Taxon.class); - AbstractPostOperation operation; - try { - // TODO use undo context specific to editor - operation = new CreateTaxonDescriptionOperation(event.getCommand().getName(), - EditorUtil.getUndoContext(), taxon, postOperationEnabled, true); - AbstractUtility.executeOperation(operation); - } catch (NotDefinedException e) { - MessagingUtils.warn(getClass(), "Command name not set."); - } - - } - } - - return null; - } + AbstractUtility.executeOperation(operation); + } + else if(((CdmBase) viewerInput).isInstanceOf(SpecimenOrObservationBase.class)){ + SpecimenOrObservationBase specimen = HibernateProxyHelper.deproxy(viewerInput, SpecimenOrObservationBase.class); - /** - * @param event - * @param postOperationEnabled - * @param selection - */ - private void invokeOperation(ExecutionEvent event, IPostOperationEnabled postOperationEnabled, ISelection selection) { - if(selection instanceof IStructuredSelection){ - Object element = ((IStructuredSelection) selection).getFirstElement(); - if(element instanceof TreeNode){ - element = ((TreeNode) element).getValue(); - } - if(element instanceof SpecimenOrObservationBase){ - try { - AbstractPostOperation operation = new AddDerivedUnitFacadeMediaOperation(event.getCommand().getName(), - BulkEditorUtil.getUndoContext(), (SpecimenOrObservationBase)element, postOperationEnabled); - AbstractUtility.executeOperation(operation); - } catch (NotDefinedException e) { - MessagingUtils.warn(getClass(), "Command name not set."); - } - } - } - } + AbstractPostOperation operation = new AddDerivedUnitFacadeMediaOperation(event.getCommand().getName(), + BulkEditorUtil.getUndoContext(), specimen, postOperationEnabled); + + AbstractUtility.executeOperation(operation); + } + } + } catch (NotDefinedException e) { + MessagingUtils.warn(getClass(), "Command name not set."); + } + } + return null; + } -} +} \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF b/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF index c6f939078..06ed980ec 100644 --- a/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF +++ b/eu.etaxonomy.taxeditor.store/META-INF/MANIFEST.MF @@ -36,6 +36,7 @@ Export-Package: eu.etaxonomy.cdm, eu.etaxonomy.taxeditor.ui.dialog.selection, eu.etaxonomy.taxeditor.ui.element, eu.etaxonomy.taxeditor.ui.group.grantedauthority, + eu.etaxonomy.taxeditor.ui.mvc.combo, eu.etaxonomy.taxeditor.ui.section, eu.etaxonomy.taxeditor.ui.section.agent, eu.etaxonomy.taxeditor.ui.section.classification, @@ -54,7 +55,8 @@ Export-Package: eu.etaxonomy.cdm, eu.etaxonomy.taxeditor.view.derivateSearch, eu.etaxonomy.taxeditor.view.detail, eu.etaxonomy.taxeditor.view.specimenSearch, - eu.etaxonomy.taxeditor.view.supplementaldata + eu.etaxonomy.taxeditor.view.supplementaldata, + org.eclipse.wb.swt Require-Bundle: org.eclipse.osgi, org.eclipse.ui, org.eclipse.jface.text, diff --git a/eu.etaxonomy.taxeditor.store/plugin.xml b/eu.etaxonomy.taxeditor.store/plugin.xml index 21885b855..8e7a4532b 100644 --- a/eu.etaxonomy.taxeditor.store/plugin.xml +++ b/eu.etaxonomy.taxeditor.store/plugin.xml @@ -264,13 +264,6 @@ name="%view.name.5" restorable="true"> - - - - - - - - - - - -
- - - - - - - - - - diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/newWizard/NewDerivedUnitBaseWizard.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/newWizard/NewDerivedUnitBaseWizard.java index c98b8690b..9f382d431 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/newWizard/NewDerivedUnitBaseWizard.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/newWizard/NewDerivedUnitBaseWizard.java @@ -10,23 +10,6 @@ package eu.etaxonomy.taxeditor.newWizard; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.NotEnabledException; -import org.eclipse.core.commands.NotHandledException; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.commands.common.NotDefinedException; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialogWithToggle; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.handlers.IHandlerService; - import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade; import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException; import eu.etaxonomy.cdm.api.service.IOccurrenceService; @@ -36,10 +19,7 @@ import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.cdm.model.occurrence.MediaSpecimen; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType; -import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.IDerivedUnitFacadePart; -import eu.etaxonomy.taxeditor.model.MessagingUtils; -import eu.etaxonomy.taxeditor.preference.IPreferenceKeys; import eu.etaxonomy.taxeditor.preference.PreferencesUtil; import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitBaseWizardPage; @@ -47,7 +27,6 @@ import eu.etaxonomy.taxeditor.ui.section.occurrence.DerivedUnitGeneralWizardPage import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralWizardPage; import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitWizardPage; import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventWizardPage; -import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateSearchCompositeController; /** * @author n.hoffmann @@ -127,54 +106,4 @@ public class NewDerivedUnitBaseWizard extends AbstractNewEntityWizard parameters = new HashMap(); - parameters.put("eu.etaxonomy.taxeditor.specimenUuidParameter", getEntity().getUuid()); - ParameterizedCommand parameterizedCommand = ParameterizedCommand.generateCommand(command, parameters); - - - // execute the command - try { - handlerService.executeCommand(parameterizedCommand, null); - } catch (ExecutionException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotDefinedException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotEnabledException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } catch (NotHandledException e) { - MessagingUtils.error(DerivateSearchCompositeController.class, e); - } - } - - return performFinish; - } - - } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/IPreferenceKeys.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/IPreferenceKeys.java index 51af3ddba..ec73e3044 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/IPreferenceKeys.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/IPreferenceKeys.java @@ -145,8 +145,6 @@ public interface IPreferenceKeys { public static final String SHOW_ADVANCED_MEDIA_SECTION = "eu.etaxonomy.taxeditor.media.showAdvancedMedia"; - public static final String ALWAYS_OPEN_SPECIMEN_IN_EDITOR = "eu.etaxonomy.taxeditor.specimen.alwaysOpenSpecimenInEditor"; - public static final String PROMPT_FOR_OPEN_SPECIMEN_IN_EDITOR = "eu.etaxonomy.taxeditor.specimen.promptForOpenSpecimenInEditor"; // TODO RL diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/SpecimenOrObservationPreferences.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/SpecimenOrObservationPreferences.java index d9a9ac3cc..b0f25bddb 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/SpecimenOrObservationPreferences.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/SpecimenOrObservationPreferences.java @@ -9,9 +9,7 @@ */ package eu.etaxonomy.taxeditor.preference; -import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.BooleanFieldEditor; -import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; @@ -39,10 +37,6 @@ public class SpecimenOrObservationPreferences extends FieldEditorPreferencePage addField(new BooleanFieldEditor(IPreferenceKeys.SHOW_TAXON_ASSOCIATIONS, "Show taxon associations of a specimen in the details view", getFieldEditorParent())); - addField(new ComboFieldEditor(IPreferenceKeys.ALWAYS_OPEN_SPECIMEN_IN_EDITOR, - "Open newly created specimens in specimen editor", new String[][] { - { "always", MessageDialogWithToggle.ALWAYS }, { "never", MessageDialogWithToggle.NEVER } }, - getFieldEditorParent())); } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SelectionDialogFactory.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SelectionDialogFactory.java index f6752d972..a90ce1c9b 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SelectionDialogFactory.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SelectionDialogFactory.java @@ -34,6 +34,7 @@ import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.occurrence.Collection; import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.model.taxon.Classification; import eu.etaxonomy.cdm.model.taxon.Synonym; @@ -103,10 +104,13 @@ public class SelectionDialogFactory { return null; } if(clazz.equals(DerivedUnit.class)){ - return (T) DerivedUnitSelectionDialog.select(shell, conversation, (DerivedUnit) currentSelection); + return (T) DerivedUnitSelectionDialog.select(shell, conversation, (DerivedUnit) currentSelection); } if(clazz.equals(FieldUnit.class)){ - return (T) FieldUnitSelectionDialog.select(shell, conversation, (FieldUnit) currentSelection); + return (T) FieldUnitSelectionDialog.select(shell, conversation, (FieldUnit) currentSelection); + } + if(clazz.equals(SpecimenOrObservationBase.class)){ + return (T) SpecimenOrObservationBaseSelectionDialog.select(shell, conversation, (SpecimenOrObservationBase) currentSelection); } if(clazz.equals(NamedArea.class)){ if(parentElement instanceof IEntityElement && ((IEntityElement) parentElement).getEntity() instanceof DerivedUnitFacade){ diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SpecimenOrObservationBaseSelectionDialog.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SpecimenOrObservationBaseSelectionDialog.java new file mode 100644 index 000000000..589b08440 --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/SpecimenOrObservationBaseSelectionDialog.java @@ -0,0 +1,67 @@ +// $Id$ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.taxeditor.ui.dialog.selection; + +import java.util.UUID; + +import org.eclipse.swt.widgets.Shell; + +import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; +import eu.etaxonomy.taxeditor.newWizard.AbstractNewEntityWizard; +import eu.etaxonomy.taxeditor.newWizard.NewDerivedUnitBaseWizard; +import eu.etaxonomy.taxeditor.store.CdmStore; + +/** + * @author pplitzner + */ +public class SpecimenOrObservationBaseSelectionDialog extends + AbstractFilteredCdmResourceSelectionDialog { + + public static SpecimenOrObservationBase select(Shell shell, ConversationHolder conversation, SpecimenOrObservationBase observation){ + SpecimenOrObservationBaseSelectionDialog dialog = new SpecimenOrObservationBaseSelectionDialog(shell, conversation, + "Choose field unit or derived unit", false, SpecimenOrObservationBaseSelectionDialog.class.getCanonicalName(), observation); + return getSelectionFromDialog(dialog); + } + + protected SpecimenOrObservationBaseSelectionDialog(Shell shell, ConversationHolder conversation, + String title, boolean multi, String settings, + SpecimenOrObservationBase cdmObject) { + super(shell, conversation, title, multi, settings, cdmObject); + } + + /** {@inheritDoc} */ + @Override + protected SpecimenOrObservationBase getPersistentObject(UUID uuid) { + Object object = CdmStore.getService(IOccurrenceService.class).load(uuid); + return HibernateProxyHelper.deproxy(object, SpecimenOrObservationBase.class); + } + + /** {@inheritDoc} */ + @Override + protected void initModel() { + model = CdmStore.getService(IOccurrenceService.class).getUuidAndTitleCache(); + } + + /** {@inheritDoc} */ + @Override + protected AbstractNewEntityWizard getNewEntityWizard(String parameter) { + return new NewDerivedUnitBaseWizard(); + } + + /** {@inheritDoc} */ + @Override + protected String getNewWizardLinkText() { + return String.format("Create a new %1s", "field unit/derived unit"); + } +} diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java index a50561e50..ed5059677 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/AbstractFormSection.java @@ -569,16 +569,19 @@ public abstract class AbstractFormSection extends Section implements ISe */ @Override public ConversationHolder getConversationHolder() { - if(getParentElement() instanceof RootElement || getParentElement() == null){ - - IEditorPart activeEditor = AbstractUtility.getActiveEditor(); - if(activeEditor instanceof IConversationEnabled){ - ConversationHolder conversation = ((IConversationEnabled) AbstractUtility.getActiveEditor()).getConversationHolder(); - return conversation; - } - }else if(getParentElement() instanceof IConversationEnabled){ - return ((IConversationEnabled) getParentElement()).getConversationHolder(); - } + if(AbstractUtility.getActivePart() instanceof IConversationEnabled){ + return ((IConversationEnabled) AbstractUtility.getActivePart()).getConversationHolder(); + } + if(getParentElement() instanceof RootElement || getParentElement() == null){ + + IEditorPart activeEditor = AbstractUtility.getActiveEditor(); + if(activeEditor instanceof IConversationEnabled){ + ConversationHolder conversation = ((IConversationEnabled) AbstractUtility.getActiveEditor()).getConversationHolder(); + return conversation; + } + }else if(getParentElement() instanceof IConversationEnabled){ + return ((IConversationEnabled) getParentElement()).getConversationHolder(); + } MessagingUtils.messageDialog("Could not get conversation for AbstractFormSection", getClass(), "There is an error in the implementation. There should have been an active editor but it wasn't", new IllegalArgumentException()); diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java index d02552384..1ba3c42dd 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/CdmFormFactory.java @@ -232,6 +232,8 @@ import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenCollectionDetailElem import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenCollectionDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenHierarchyDetailElement; import eu.etaxonomy.taxeditor.ui.section.occurrence.SpecimenHierarchyDetailSection; +import eu.etaxonomy.taxeditor.ui.section.occurrence.association.DerivedUnitTypeDesignationElement; +import eu.etaxonomy.taxeditor.ui.section.occurrence.association.DerivedUnitTypeDesignationSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.association.TaxonAssociationDetailElement; import eu.etaxonomy.taxeditor.ui.section.occurrence.association.TaxonAssociationDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.derivedUnit.PreservedSpecimenCurrentDeterminationDetailSection; @@ -1589,6 +1591,12 @@ public class CdmFormFactory extends FormToolkit { return section; } + public DerivedUnitTypeDesignationSection createDerivedUnitTypeDesignationSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){ + DerivedUnitTypeDesignationSection section = new DerivedUnitTypeDesignationSection(this, conversation, parentElement, style); + addAndAdaptSection(parentElement, section); + return section; + } + public TaxonAssociationDetailSection createTaxonAssociationDetailSection(ConversationHolder conversation, ICdmFormElement parentElement, ISelectionProvider selectionProvider, int style){ TaxonAssociationDetailSection section = new TaxonAssociationDetailSection(this, conversation, parentElement, selectionProvider, style); addAndAdaptSection(parentElement, section); @@ -2503,8 +2511,14 @@ public class CdmFormFactory extends FormToolkit { element = new SynonymRelationshipDetailElement(this, parentElement, (SynonymRelationship) entity, removeListener, style); } else if (entity instanceof SpecimenTypeDesignation) { - element = new SpecimenTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity, - removeListener, style); + if(parentElement instanceof DerivedUnitTypeDesignationSection){ + element = new DerivedUnitTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity, + removeListener, style); + } + else{ + element = new SpecimenTypeDesignationElement(this, parentElement, (SpecimenTypeDesignation) entity, + removeListener, style); + } } else if (entity instanceof StateData) { element = new StateDataElement(this, parentElement, (StateData) entity, removeListener, style); } else if (entity instanceof StatisticalMeasurementValue) { diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/description/detail/IndividualsAssociationDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/description/detail/IndividualsAssociationDetailElement.java index acfbf7c6d..b91fc58b7 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/description/detail/IndividualsAssociationDetailElement.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/description/detail/IndividualsAssociationDetailElement.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2007 EDIT - * European Distributed Institute of Taxonomy + * European Distributed Institute of Taxonomy * http://www.e-taxonomy.eu - * + * * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ @@ -16,7 +16,7 @@ import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.Language; import eu.etaxonomy.cdm.model.common.LanguageString; import eu.etaxonomy.cdm.model.description.IndividualsAssociation; -import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; import eu.etaxonomy.taxeditor.store.CdmStore; import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory; import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement; @@ -24,10 +24,6 @@ import eu.etaxonomy.taxeditor.ui.element.TextWithLabelElement; import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement; /** - *

- * IndividualsAssociationDetailElement class. - *

- * * @author n.hoffmann * @created Jun 10, 2010 * @version 1.0 @@ -36,26 +32,8 @@ public class IndividualsAssociationDetailElement extends AbstractDetailedDescriptionDetailElement { private TextWithLabelElement text_description; - private EntitySelectionElement selection_derivedUnit; + private EntitySelectionElement selection_derivedUnit; - /** - *

- * Constructor for IndividualsAssociationDetailElement. - *

- * - * @param formFactory - * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} - * object. - * @param formElement - * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} - * object. - * @param entity - * a - * {@link eu.etaxonomy.cdm.model.description.IndividualsAssociation} - * object. - * @param style - * a int. - */ public IndividualsAssociationDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement, IndividualsAssociation entity, int style) { @@ -67,9 +45,9 @@ public class IndividualsAssociationDetailElement extends protected void createControls(ICdmFormElement formElement, IndividualsAssociation entity, int style) { selection_derivedUnit = formFactory - .createSelectionElement(DerivedUnit.class, - getConversationHolder(), formElement, "Unit", - CdmBase.deproxy(entity.getAssociatedSpecimenOrObservation(),DerivedUnit.class), + .createSelectionElement(SpecimenOrObservationBase.class, + getConversationHolder(), formElement, "Occurrence/Unit", + CdmBase.deproxy(entity.getAssociatedSpecimenOrObservation(),SpecimenOrObservationBase.class), EntitySelectionElement.ALL, style); text_description = formFactory.createMultiLineTextWithLabel( diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationElement.java new file mode 100644 index 000000000..d9b695a58 --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationElement.java @@ -0,0 +1,110 @@ +// $Id$ +/** + * Copyright (C) 2007 EDIT + * European Distributed Institute of Taxonomy + * http://www.e-taxonomy.eu + * + * The contents of this file are subject to the Mozilla Public License Version 1.1 + * See LICENSE.TXT at the top of this package for the full license terms. + */ + +package eu.etaxonomy.taxeditor.ui.section.occurrence.association; + +import java.util.List; +import java.util.Set; + +import org.eclipse.swt.events.SelectionListener; + +import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; +import eu.etaxonomy.cdm.model.common.TermType; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus; +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.taxeditor.ui.combo.TermComboElement; +import eu.etaxonomy.taxeditor.ui.element.AbstractFormSection; +import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory; +import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement; +import eu.etaxonomy.taxeditor.ui.section.name.AbstractTypeDesignationElement; +import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement; + +/** + * @author n.hoffmann + * @created May 17, 2010 + * @version 1.0 + */ +public class DerivedUnitTypeDesignationElement extends AbstractTypeDesignationElement { + + private TermComboElement combo_typeStatus; + + private List> selectionTaxonNames; + private ICdmFormElement parentFormElement; + private int style; + + private EntitySelectionElement selectionTaxonName; + + public DerivedUnitTypeDesignationElement(CdmFormFactory formFactory, + AbstractFormSection section, SpecimenTypeDesignation entity, + SelectionListener removeListener, int style) { + super(formFactory, section, entity, removeListener, style); + } + + @Override + public void setEntity(SpecimenTypeDesignation entity) { + super.setEntity(entity); + Set typifiedNames = entity.getTypifiedNames(); + if(typifiedNames.size()==1){ + selectionTaxonName.setEntity(typifiedNames.iterator().next()); + } + else if(typifiedNames.size()>1){ + formFactory.createLabel(getLayoutComposite(), "!!!!!!!!"); + } + + SpecimenTypeDesignationStatus typeStatus = (SpecimenTypeDesignationStatus) HibernateProxyHelper + .deproxy(entity.getTypeStatus()); + combo_typeStatus.setSelection(typeStatus); + checkbox_notDesignated.setSelection(entity.isNotDesignated()); + +// for (TaxonNameBase taxonNameBase : typifiedNames) { +// EntitySelectionElement selectionElement = formFactory.createSelectionElement( +// TaxonNameBase.class, getConversationHolder(), parentFormElement, "Scientific Name", null, +// EntitySelectionElement.EDITABLE | EntitySelectionElement.SELECTABLE, style); +// selectionElement.setEntity(taxonNameBase); +// } + + + } + + /** {@inheritDoc} */ + @Override + public void createControls(ICdmFormElement element, int style) { + this.parentFormElement = element; + this.style = style; + + selectionTaxonName = formFactory.createSelectionElement( + TaxonNameBase.class, getConversationHolder(), parentFormElement, "Scientific Name", null, + EntitySelectionElement.EDITABLE | EntitySelectionElement.SELECTABLE, style); + + combo_typeStatus = formFactory.createDefinedTermComboElement(TermType.SpecimenTypeDesignationStatus, + parentFormElement, "Designation Status", null, style); + + super.createControls(element, style); + } + + /** {@inheritDoc} */ + @Override + public void handleEvent(Object eventSource) { + if (eventSource == selectionTaxonName) { + selectionTaxonName.getSelection().addTypeDesignation(getEntity(), false); + } else if (eventSource == combo_typeStatus) { + getEntity().setTypeStatus(combo_typeStatus.getSelection()); + } else if (eventSource == checkbox_notDesignated) { + getEntity().setNotDesignated(checkbox_notDesignated.getSelection()); + } else if (eventSource == selection_reference) { + getEntity().setCitation(selection_reference.getSelection()); + } else if (eventSource == text_referenceDetail) { + getEntity().setCitationMicroReference( + text_referenceDetail.getText()); + } + } + +} diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationSection.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationSection.java new file mode 100644 index 000000000..e63f84ba5 --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/DerivedUnitTypeDesignationSection.java @@ -0,0 +1,91 @@ +// $Id$ +/** +* Copyright (C) 2015 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.taxeditor.ui.section.occurrence.association; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; +import eu.etaxonomy.cdm.model.name.TaxonNameBase; +import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory; +import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement; +import eu.etaxonomy.taxeditor.ui.section.AbstractEntityCollectionSection; + +/** + * @author pplitzner + * @date Oct 29, 2015 + * + */ +public class DerivedUnitTypeDesignationSection extends AbstractEntityCollectionSection { + + private Collection typeDesignations; + + public DerivedUnitTypeDesignationSection(CdmFormFactory formFactory, + ConversationHolder conversation, ICdmFormElement parentElement, int style) { + super(formFactory, conversation, parentElement, "Type Designations", style); + } + + /** {@inheritDoc} */ + @Override + public Collection getCollection(DerivedUnitFacade entity) { + typeDesignations = entity.innerDerivedUnit().getSpecimenTypeDesignations(); + return typeDesignations; + } + + /** {@inheritDoc} */ + @Override + public SpecimenTypeDesignation createNewElement() { + return SpecimenTypeDesignation.NewInstance(); + } + + /** {@inheritDoc} */ + @Override + public void addElement(SpecimenTypeDesignation element) { + element.setTypeSpecimen(getEntity().innerDerivedUnit()); + typeDesignations.add(element); + } + + /** {@inheritDoc} */ + @Override + public void removeElement(SpecimenTypeDesignation element) { + List toRemove = new ArrayList(); + for (SpecimenTypeDesignation specimenTypeDesignation : typeDesignations) { + if(element.equals(specimenTypeDesignation)){ + toRemove.add(specimenTypeDesignation); + } + } + for (SpecimenTypeDesignation specimenTypeDesignation : toRemove) { + specimenTypeDesignation.removeType(); + Set names = specimenTypeDesignation.getTypifiedNames(); + for (TaxonNameBase taxonNameBase : names) { + taxonNameBase.removeTypeDesignation(specimenTypeDesignation); + } + } + typeDesignations.removeAll(toRemove); + } + + /** {@inheritDoc} */ + @Override + public String getEmptyString() { + return "No type designation yet."; + } + + /** {@inheritDoc} */ + @Override + protected String getTooltipString() { + return "Add a type designation"; + } + + +} \ No newline at end of file diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/TaxonAssociationDetailElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/TaxonAssociationDetailElement.java index 4ff63d538..53d9ea6ab 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/TaxonAssociationDetailElement.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/occurrence/association/TaxonAssociationDetailElement.java @@ -11,8 +11,6 @@ package eu.etaxonomy.taxeditor.ui.section.occurrence.association; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; -import java.util.Set; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionException; @@ -36,10 +34,6 @@ import org.eclipse.ui.handlers.IHandlerService; import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade; import eu.etaxonomy.cdm.api.service.IOccurrenceService; -import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; -import eu.etaxonomy.cdm.model.common.CdmBase; -import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; -import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.store.CdmStore; @@ -55,9 +49,7 @@ import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement; */ public class TaxonAssociationDetailElement extends AbstractCdmDetailElement implements IDoubleClickListener{ - private TableViewer associationsViewer; - private TableViewer typeDesignationViewer; public TaxonAssociationDetailElement(CdmFormFactory formFactory, ICdmFormElement formElement) { super(formFactory, formElement); @@ -70,7 +62,6 @@ public class TaxonAssociationDetailElement extends AbstractCdmDetailElement> associatedTaxa = CdmStore.getService(IOccurrenceService.class).listAssociatedTaxa(entity.innerDerivedUnit(), null, null, null, null); - Collection typeDesignations = CdmStore.getService(IOccurrenceService.class).listTypeDesignations(entity.innerDerivedUnit(), null, null, null, null); if(!associatedTaxa.isEmpty()){ associationsViewer = new TableViewer(getLayoutComposite(), SWT.FULL_SELECTION); @@ -84,28 +75,6 @@ public class TaxonAssociationDetailElement extends AbstractCdmDetailElement> typedTaxa = new HashSet>(); - for (SpecimenTypeDesignation specimenTypeDesignation : typeDesignations) { - for (TaxonNameBase taxonNameBase : specimenTypeDesignation.getTypifiedNames()) { - Set taxa = taxonNameBase.getTaxa(); - for (Object taxon : taxa) { - if(taxon instanceof CdmBase && ((CdmBase)taxon).isInstanceOf(TaxonBase.class)){ - typedTaxa.add(HibernateProxyHelper.deproxy(taxon, TaxonBase.class)); - } - } - } - } - if(!typedTaxa.isEmpty()){ - Label typeLabel = formFactory.createLabel(getLayoutComposite(), "Type Designations"); - typeLabel.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1)); - - typeDesignationViewer = new TableViewer(getLayoutComposite(), SWT.FULL_SELECTION); - typeDesignationViewer.getTable().setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1)); - typeDesignationViewer.setContentProvider(new ArrayContentProvider()); - typeDesignationViewer.setInput(typedTaxa); - typeDesignationViewer.addDoubleClickListener(this); - } } /** {@inheritDoc} */ diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EditFromSelectionWizard.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EditFromSelectionWizard.java index a91756818..22d5dd7a3 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EditFromSelectionWizard.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/selection/EditFromSelectionWizard.java @@ -30,6 +30,9 @@ import eu.etaxonomy.cdm.model.molecular.Primer; import eu.etaxonomy.cdm.model.name.NonViralName; import eu.etaxonomy.cdm.model.occurrence.Collection; import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; +import eu.etaxonomy.cdm.model.occurrence.FieldUnit; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; +import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.taxeditor.model.AbstractUtility; import eu.etaxonomy.taxeditor.model.IDirtyMarkable; @@ -102,13 +105,21 @@ public class EditFromSelectionWizard extends Wizard implements addPage(new NonViralNameWizardPage(formFactory, selectionElement.getConversationHolder(), (NonViralName) entity)); - } else if (entity instanceof DerivedUnit) { + } else if (entity instanceof SpecimenOrObservationBase) { DerivedUnitFacade facade; try { - facade = DerivedUnitFacade.NewInstance( - (DerivedUnit) entity, - PreferencesUtil.getDerivedUnitConfigurator()); + if(((SpecimenOrObservationBase) entity).isInstanceOf(DerivedUnit.class)){ + facade = DerivedUnitFacade.NewInstance( + HibernateProxyHelper.deproxy(entity, DerivedUnit.class), + PreferencesUtil.getDerivedUnitConfigurator()); + } + else { + facade = DerivedUnitFacade.NewInstance(SpecimenOrObservationType.FieldUnit, + HibernateProxyHelper.deproxy(entity, FieldUnit.class), + PreferencesUtil.getDerivedUnitConfigurator()); + } + } catch (DerivedUnitFacadeNotSupportedException e) { // we should never get here throw new IllegalStateException(); @@ -120,8 +131,10 @@ public class EditFromSelectionWizard extends Wizard implements selectionElement.getConversationHolder(), facade)); addPage(new FieldUnitWizardPage(formFactory, selectionElement.getConversationHolder(), facade)); - addPage(new DerivedUnitBaseWizardPage(formFactory, - selectionElement.getConversationHolder(), facade)); + if(facade.innerDerivedUnit()!=null){ + addPage(new DerivedUnitBaseWizardPage(formFactory, + selectionElement.getConversationHolder(), facade)); + } } else if (entity instanceof Collection) { addPage(new CollectionWizardPage(formFactory, selectionElement.getConversationHolder(), diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java index 27be236e3..f9cedbdb8 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/AbstractCdmViewPart.java @@ -186,7 +186,7 @@ public abstract class AbstractCdmViewPart extends ViewPart implements ISelection } @Override - public List getRootEntities() { + public List getRootEntities() { return Arrays.asList((CdmBase)getViewer().getInput()); } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateContentProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateContentProvider.java index 65efef6d0..27b80b47a 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateContentProvider.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateContentProvider.java @@ -1,6 +1,7 @@ package eu.etaxonomy.taxeditor.view.derivateSearch; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -45,8 +46,8 @@ public class DerivateContentProvider implements ITreeContentProvider { @Override public Object[] getElements(Object inputElement) { rootNodes = new ArrayList(); - if(inputElement instanceof Set){ - for (Object o: (Set)inputElement) { + if(inputElement instanceof Collection){ + for (Object o: (Collection)inputElement) { if(o instanceof SpecimenOrObservationBase){ SpecimenOrObservationBase rootElement = (SpecimenOrObservationBase)o; if(rootElement!=null){ diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java index 7b9a8d063..ad1ec3cf1 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateLabelProvider.java @@ -9,7 +9,13 @@ */ package eu.etaxonomy.taxeditor.view.derivateSearch; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -19,6 +25,8 @@ import org.eclipse.swt.graphics.Image; import org.hibernate.LazyInitializationException; import eu.etaxonomy.cdm.api.conversation.ConversationHolder; +import eu.etaxonomy.cdm.api.service.IOccurrenceService; +import eu.etaxonomy.cdm.api.service.molecular.ISequenceService; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.common.DefinedTerm; @@ -26,6 +34,8 @@ import eu.etaxonomy.cdm.model.common.Identifier; import eu.etaxonomy.cdm.model.molecular.DnaSample; import eu.etaxonomy.cdm.model.molecular.Sequence; import eu.etaxonomy.cdm.model.molecular.SingleRead; +import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation; +import eu.etaxonomy.cdm.model.name.TaxonNameBase; import eu.etaxonomy.cdm.model.occurrence.DerivedUnit; import eu.etaxonomy.cdm.model.occurrence.FieldUnit; import eu.etaxonomy.cdm.model.occurrence.GatheringEvent; @@ -48,7 +58,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider { private static final String NO_SAMPLE_DESIGNATION = "[no sample designation]"; - private Set multiLinkSingleReads; + private static Set multiLinkSingleReads; + + private static Map> typeDesignations; private ConversationHolder conversation; @@ -151,7 +163,9 @@ public class DerivateLabelProvider extends ColumnLabelProvider { derivate = node.getValue(); } - conversation.bind(); + if(conversation!=null){ + conversation.bind(); + } final String emptyString = ""; final String separator = " "; @@ -215,6 +229,12 @@ public class DerivateLabelProvider extends ColumnLabelProvider { else if(derivate instanceof DerivedUnit){ DerivedUnit derivedUnit = (DerivedUnit)derivate; if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.PreservedSpecimen){ + //check for type designation + if(typeDesignations.get(derivedUnit)==null){ + for (SpecimenTypeDesignation specimenTypeDesignation : CdmStore.getService(IOccurrenceService.class).listTypeDesignations(derivedUnit, null, null, null, null)) { + addTypeDesignation(derivedUnit, specimenTypeDesignation); + } + } //java.util.Collection fieldUnits = CdmStore.getService(IOccurrenceService.class).getFieldUnits(derivedUnit.getUuid()); //TODO : This is not generic anymore for performance reasons Set originals = derivedUnit.getOriginals(); @@ -236,6 +256,20 @@ public class DerivateLabelProvider extends ColumnLabelProvider { } String mostSignificantIdentifier = derivedUnit.getMostSignificantIdentifier(); label += mostSignificantIdentifier!=null?mostSignificantIdentifier+separator:emptyString; + //type designation extension + List list = typeDesignations.get(derivedUnit); + if(list!=null){ + for (SpecimenTypeDesignation specimenTypeDesignation : list) { + label += "("+specimenTypeDesignation.getTypeStatus()+" of "; + for (TaxonNameBase taxonNameBase : specimenTypeDesignation.getTypifiedNames()) { + label += taxonNameBase+separator; + } + if(label.endsWith(separator)){ + label = label.substring(0, label.length()-separator.length()); + } + label += ")"; + } + } } else if(derivedUnit.getRecordBasis()==SpecimenOrObservationType.TissueSample){ //TissueSample should only be created by using it's own class @@ -292,9 +326,6 @@ public class DerivateLabelProvider extends ColumnLabelProvider { return label; } - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object) - */ @Override public Image getImage(Object element) { if(element instanceof TreeNode){ @@ -348,7 +379,7 @@ public class DerivateLabelProvider extends ColumnLabelProvider { } else if(cdmBase.isInstanceOf(SingleRead.class)){ - if(multiLinkSingleReads.contains(element)){ + if(multiLinkSingleReads!=null && multiLinkSingleReads.contains(element)){ return ImageResources.getImage(ImageResources.SINGLE_READ_DERIVATE_MULTILINK); } else{ @@ -379,10 +410,30 @@ public class DerivateLabelProvider extends ColumnLabelProvider { } /** - * @param multiLinkSingleReads2 + * Refreshes cached label extensions + * @param multiLinkSingleReads */ - public void setMultiLinkSingleReads(Set multiLinkSingleReads) { - this.multiLinkSingleReads = multiLinkSingleReads; + public void refresh() { + DerivateLabelProvider.multiLinkSingleReads = new HashSet(); + for(Entry> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){ + if(entry.getValue().size()>1){ + multiLinkSingleReads.add(entry.getKey()); + } + } + DerivateLabelProvider.typeDesignations = new HashMap>(); + } + + private static void addTypeDesignation(DerivedUnit derivedUnit, SpecimenTypeDesignation typeDesignation){ + List list = typeDesignations.get(derivedUnit); + if(list==null){ + list = new ArrayList(); + } + list.add(typeDesignation); + typeDesignations.put(derivedUnit, list); + } + + public static Set getMultiLinkSingleReads() { + return multiLinkSingleReads; } } 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 deleted file mode 100644 index 8a14a5a73..000000000 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/derivateSearch/DerivateSearchView.java +++ /dev/null @@ -1,162 +0,0 @@ -// $Id$ -/** - * Copyright (C) 2013 EDIT - * European Distributed Institute of Taxonomy - * http://www.e-taxonomy.eu - * - * The contents of this file are subject to the Mozilla Public License Version 1.1 - * See LICENSE.TXT at the top of this package for the full license terms. - */ -package eu.etaxonomy.taxeditor.view.derivateSearch; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -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; - -import eu.etaxonomy.cdm.api.conversation.ConversationHolder; -import eu.etaxonomy.cdm.model.common.CdmBase; -import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase; -import eu.etaxonomy.taxeditor.model.IContextListener; -import eu.etaxonomy.taxeditor.session.ICdmEntitySession; -import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled; -import eu.etaxonomy.taxeditor.store.CdmStore; - -/** - * This view allows to search for and filter {@link SpecimenOrObservationBase}s and display - * the results in a list. The results can be selected and opened in an editor. - */ -public class DerivateSearchView extends ViewPart implements IContextListener, ICdmEntitySessionEnabled { - - public static final String ID = "eu.etaxonomy.taxeditor.view.derivateSearch.DerivateSearchView"; - private DerivateSearchCompositeController derivateSearchCompositeController; - private ConversationHolder conversationHolder; - private ICdmEntitySession cdmEntitySession; - - /** - * Constructs a new DerivateSearchView and registers it to listen to context changes - */ - public DerivateSearchView() { - CdmStore.getContextManager().addContextListener(this); - } - - @Override - public void createPartControl(Composite parent) { - - 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); - } - - @Override - public void setFocus() { - derivateSearchCompositeController.setFocus(); - //make sure to bind again if maybe in another view the conversation was unbound - if(getConversationHolder()!=null && !getConversationHolder().isClosed() && !getConversationHolder().isBound()){ - getConversationHolder().bind(); - } - if(getCdmEntitySession() != null) { - getCdmEntitySession().bind(); - } - } - - @Override - public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) { - } - - @Override - public void contextStop(IMemento memento, IProgressMonitor monitor) { - derivateSearchCompositeController.setEnabled(false); - derivateSearchCompositeController.reset(); - } - - @Override - public void contextStart(IMemento memento, IProgressMonitor monitor) { - derivateSearchCompositeController.setEnabled(true); - } - - @Override - public void contextRefresh(IProgressMonitor monitor) { - initConversation(); - initSession(); - } - - private void initSession() { - if(CdmStore.isActive()) { - cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true); - } - } - - private void initConversation(){ - if(conversationHolder==null){ - conversationHolder = CdmStore.createConversation(); - derivateSearchCompositeController.setConversation(conversationHolder); - } - } - - @Override - public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) { - } - - public ConversationHolder getConversationHolder() { - if(CdmStore.isActive() && conversationHolder==null){ - initConversation(); - } - return conversationHolder; - } - - - @Override - public void dispose() { - if(conversationHolder!=null){ - conversationHolder.close(); - } - - if(cdmEntitySession != null) { - cdmEntitySession.dispose(); - } - super.dispose(); - } - - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession() - */ - @Override - public ICdmEntitySession getCdmEntitySession() { - initSession(); - return cdmEntitySession; - } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities() - */ - @Override - public Collection getRootEntities() { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap() - */ - @Override - public Map> getPropertyPathsMap() { - // TODO Auto-generated method stub - return null; - } -} diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewPart.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewPart.java index d3f200924..0f0df4522 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewPart.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewPart.java @@ -18,6 +18,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; +import eu.etaxonomy.cdm.api.conversation.IConversationEnabled; import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; import eu.etaxonomy.cdm.model.common.CdmBase; import eu.etaxonomy.cdm.model.description.Feature; @@ -52,7 +53,7 @@ public class DetailsViewPart extends AbstractCdmEditorViewPart implements IPartC @Override protected void selectionChanged_internal(IWorkbenchPart part, ISelection selection){ - if(AbstractUtility.getActiveEditor() == null){ + if(AbstractUtility.getActiveEditor() == null && !(AbstractUtility.getActivePart() instanceof IConversationEnabled)){ showEmptyPage(); return; } diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java index 6a0dab25f..aa63bfbf3 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/view/detail/DetailsViewer.java @@ -90,6 +90,7 @@ import eu.etaxonomy.taxeditor.ui.section.occurrence.EmptySection; import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.FieldUnitGeneralDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.GatheringEventDetailSection; +import eu.etaxonomy.taxeditor.ui.section.occurrence.association.DerivedUnitTypeDesignationSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.association.TaxonAssociationDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.dna.DnaQualityDetailSection; import eu.etaxonomy.taxeditor.ui.section.occurrence.dna.DnaSampleGeneralDetailSection; @@ -594,6 +595,10 @@ public class DetailsViewer extends AbstractCdmDataViewer { addPart(determinationDetailSection); } + formFactory.createHorizontalSeparator(parent, SWT.BORDER); + DerivedUnitTypeDesignationSection derivedUnitTypeDesignationSection = formFactory.createDerivedUnitTypeDesignationSection(getConversationHolder(), parent, this, ExpandableComposite.TWISTIE); + addPart(derivedUnitTypeDesignationSection); + } private void createFieldUnitSection(RootElement parent) {