+// $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.navigation.key.polytomous;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Display;
+
+import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.description.PolytomousKey;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
+import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
+import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
+
+/**
+ * @author n.hoffmann
+ * @created May 5, 2011
+ * @version 1.0
+ */
+public class PolytomousKeyViewPartDataChangeBehavior extends
+ AbstractDataChangeBehaviour {
+
+ private final PolytomousKeyViewPart source;
+
+ /**
+ * @param polytomousKeyViewPart
+ */
+ public PolytomousKeyViewPartDataChangeBehavior(
+ PolytomousKeyViewPart polytomousKeyViewPart) {
+ source = polytomousKeyViewPart;
+ }
+
+ /* (non-Javadoc)
+ * @see eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour#reactOnDataChange(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
+ */
+ @Override
+ public void reactOnDataChange(CdmDataChangeMap changeEvents) {
+ if(isRelevant(changeEvents)){
+ final Display display = Display.getCurrent();
+ Job job = new Job("Updating Polytomous Key Viewer") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask("Updating Polytomous Key Viewer", 3);
+ monitor.worked(1);
+
+ // clear the session completely
+ monitor.subTask("Clearing Polytomous Key Viewer session");
+ display.asyncExec(new Runnable() {
+ public void run() {
+ source.getConversationHolder().clear();
+ }
+ });
+ // FIXME completely clearing the session is a brute force approach.
+ // It would be much more elegant to clear only those elements that have been changed.
+ // I could not get that to work but we should consider workin on this because we might
+ // run into serious performance issues, especially when it comes to large trees
+ //
+ // at least, we moved this to a job so it can run in a background thred
+ // seems to improve the situation but not sure if final solution
+ monitor.worked(1);
+
+ monitor.subTask("Refreshing viewer");
+
+ display.asyncExec(new Runnable() {
+ public void run() {
+ source.refresh();
+ }
+ });
+
+
+
+ monitor.worked(1);
+ monitor.done();
+ return Status.OK_STATUS;
+ }
+ };
+
+ job.setPriority(Job.SHORT);
+ job.schedule();
+
+ }
+ }
+
+ /**
+ * @return
+ */
+ private boolean isRelevant(CdmDataChangeMap changeEvents) {
+ for(CdmDataChangeEvent event : changeEvents.getAllEvents()){
+ EventType eventType = event.getEventType();
+ CdmBase eventEntity = event.getEntity();
+
+ // all poyltomous key changes are relevant
+ if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE)
+ && eventEntity instanceof PolytomousKey){
+ return true;
+ }
+ }
+ return false;
+ }
+}