Performance tweak for specimen editor
authorPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 14 Jun 2016 08:46:19 +0000 (10:46 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 14 Jun 2016 09:44:21 +0000 (11:44 +0200)
 - Avoid loading too many specimens in the specimen editor
 - delay the selection too avoid double loading

eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateView.java

index 632d3153003d40695e75497e158151c4564af7c0..7e1a41846b0ee2a60462ddeb69fbda2ad8b31a18 100644 (file)
@@ -27,6 +27,7 @@ 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.Display;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.ui.IEditorInput;
@@ -60,6 +61,7 @@ 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.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
@@ -95,6 +97,50 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
             "derivationEvents.derivatives.sources"
     });
 
+       private static final int WARN_THRESHOLD = 200;
+
+    private DelaySelection delaySelection = null;
+    /**
+     * This is the monitor for the DelaySelection runnable.
+     * If it is <code>true</code> then it is currently delaying a selection.
+     */
+    private boolean isInDelay;
+
+
+    /**
+     * This class invokes internal_selectionChanged() in a separate thread.
+     * This allows an asynchronous and/or delayed handling of selection changes
+     */
+    private class DelaySelection implements Runnable{
+        private IWorkbenchPart part;
+        private ISelection selection;
+
+        public DelaySelection(IWorkbenchPart part, ISelection selection) {
+            super();
+            this.part = part;
+            this.selection = selection;
+        }
+
+        @Override
+        public void run() {
+            try{
+                selectionChanged_internal(part, selection);
+            }
+            finally{
+                isInDelay = false;
+            }
+        }
+
+        public synchronized void setSelection(ISelection selection) {
+            this.selection = selection;
+        }
+
+        public synchronized void setPart(IWorkbenchPart part) {
+            this.part = part;
+        }
+
+    }
+
        private ConversationHolder conversation;
 
        private TreeViewer viewer;
@@ -202,7 +248,9 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
         control.setMenu(menu);
 
         //init tree
-        updateRootEntities(((DerivateViewEditorInput)getEditorInput()).getDerivativeUuids());
+        Collection<UUID> derivativeUuids = ((DerivateViewEditorInput)getEditorInput()).getDerivativeUuids();
+        checkWarnThreshold(derivativeUuids);
+               updateRootEntities(derivativeUuids);
         //set taxon filter
         derivateSearchCompositeController.setTaxonFilter(((DerivateViewEditorInput) getEditorInput()).getTaxonUuid());
         //reset status bar
@@ -479,10 +527,8 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
             cdmEntitySession.dispose();
         }
     }
-
-    @Override
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if(part == this){
+    public void selectionChanged_internal(IWorkbenchPart part, ISelection selection) {
+       if(part == this){
             return;
         }
         if(viewer.getTree().isDisposed()){
@@ -509,12 +555,37 @@ public class DerivateView extends EditorPart implements IPartContentHasFactualDa
                 for (SpecimenOrObservationBase specimenOrObservationBase : fieldUnits) {
                     uuids.add(specimenOrObservationBase.getUuid());
                 }
+                checkWarnThreshold(uuids);
                 updateRootEntities(uuids);
                 setPartName("Derivative Editor: " + selectedTaxon.getName());
             }
         }
     }
 
+    @Override
+    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+       if(delaySelection==null){
+            delaySelection = new DelaySelection(part, selection);
+        }
+        delaySelection.setPart(part);
+        delaySelection.setSelection(selection);
+        if(!isInDelay){
+            isInDelay = true;
+            Display.getCurrent().asyncExec(delaySelection);
+        }
+    }
+
+
+       private void checkWarnThreshold(Collection<UUID> uuids) {
+               if(uuids!=null && uuids.size()>WARN_THRESHOLD){
+                       MessagingUtils.warningDialog("Performance warning", this.getClass(), String.format("Specimens will not be loaded!\n"
+                                       + "There are %d specimens associated with the current "
+                                       + "selection. If you really want to show all of them in the specimen editor please "
+                                       + "use the taxon filter in the search bar.", uuids.size()));
+                       uuids.clear();
+               }
+       }
+
     public TreeViewer getViewer() {
         return viewer;
     }