From: Patrick Plitzner Date: Tue, 23 May 2017 16:40:34 +0000 (+0200) Subject: ref #6566 Fix potential StackOverflow when linking with taxon selection X-Git-Tag: 4.8.0^2~69 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/commitdiff_plain/75cdb024f85a1ac051d183be935293969e403255 ref #6566 Fix potential StackOverflow when linking with taxon selection --- 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 c79c608c0..7a5689786 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 @@ -29,6 +29,7 @@ import org.eclipse.e4.ui.workbench.modeling.ESelectionService; 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.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; @@ -149,6 +150,8 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn @Inject private EPartService partService; + private ISelectionChangedListener selectionChangedListener; + /** * Default constructor */ @@ -211,11 +214,14 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); viewer.getTree().setEnabled(CdmStore.isActive()); - // Propagate selection from viewer - viewer.addSelectionChangedListener((SelectionChangedEvent event) -> { - IStructuredSelection isel = (IStructuredSelection) event.getSelection(); - selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray())); - }); + selectionChangedListener = new ISelectionChangedListener() { + @Override + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection isel = (IStructuredSelection) event.getSelection(); + selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray())); + } + }; + viewer.addSelectionChangedListener(selectionChangedListener); //create context menu menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.specimeneditor"); @@ -262,47 +268,52 @@ public class DerivateView implements IPartContentHasFactualData, IConversationEn public void updateRootEntities(List derivates) { - if(derivates!=null){ - this.derivateToRootEntityMap = new HashMap, SpecimenOrObservationBase>(); - this.rootElements = new HashSet>(); - for (SpecimenOrObservationBase derivate : derivates) { + if(derivates!=null){ + this.derivateToRootEntityMap = new HashMap, SpecimenOrObservationBase>(); + this.rootElements = new HashSet>(); + for (SpecimenOrObservationBase derivate : derivates) { - if(derivate instanceof FieldUnit){ - derivateToRootEntityMap.put(derivate, derivate); + if(derivate instanceof FieldUnit){ + derivateToRootEntityMap.put(derivate, derivate); + } + else { + SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); + if(topMostDerivate!=null){ + derivateToRootEntityMap.put(derivate, topMostDerivate); } - else { - SpecimenOrObservationBase topMostDerivate = EditorUtil.getTopMostDerivate(derivate); - if(topMostDerivate!=null){ - derivateToRootEntityMap.put(derivate, topMostDerivate); - } - else{ - derivateToRootEntityMap.put(derivate, derivate); - } + else{ + derivateToRootEntityMap.put(derivate, derivate); } } - for (SpecimenOrObservationBase specimen : derivateToRootEntityMap.values()) { - rootElements.add(specimen); - } } - labelProvider.updateLabelCache(rootElements); - viewer.setInput(rootElements); - - //TODO e4 -// getEditorSite().getActionBars().getStatusLineManager().setMessage(String.format(Messages.DerivateView_CNT_DERIVATIVES_FOUND, rootElements.size())); - - //set selection to derivatives if the filter criteria - //taxon assignment or derivative type are set - if(derivates!=null && !derivateSearchCompositeController.isDefaultSearch()){ - List nodesToSelect = new ArrayList(); - for (SpecimenOrObservationBase specimenOrObservationBase : derivates) { - nodesToSelect.add(new TreeNode(specimenOrObservationBase)); - } - viewer.setSelection(new StructuredSelection(nodesToSelect)); + for (SpecimenOrObservationBase specimen : derivateToRootEntityMap.values()) { + rootElements.add(specimen); } - else{ - viewer.setSelection(null); + } + labelProvider.updateLabelCache(rootElements); + viewer.setInput(rootElements); + + //TODO e4 + // getEditorSite().getActionBars().getStatusLineManager().setMessage(String.format(Messages.DerivateView_CNT_DERIVATIVES_FOUND, rootElements.size())); + + //set selection to derivatives if the filter criteria + //taxon assignment or derivative type are set + if(derivates!=null && !derivateSearchCompositeController.isDefaultSearch()){ + List nodesToSelect = new ArrayList(); + for (SpecimenOrObservationBase specimenOrObservationBase : derivates) { + nodesToSelect.add(new TreeNode(specimenOrObservationBase)); } + setSelection(new StructuredSelection(nodesToSelect)); + } + else{ + setSelection(null); + } + } + private void setSelection(StructuredSelection selection){ + viewer.removeSelectionChangedListener(selectionChangedListener); + viewer.setSelection(selection); + viewer.addSelectionChangedListener(selectionChangedListener); } public void updateLabelCache(){