From 8a4a3eebf1ebf6509b3a2d2bb9497037b17f75ed Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Mon, 1 Sep 2014 13:11:25 +0000
Subject: [PATCH] - Fix disposal of CreateAnnotationInstanceColumn's "create"
 Button by installing a DisposeListener - Optimize drawing speed by disabling
 the redraw while the new set of columns is beeing created

---
 .../view/CreateAnnotationInstanceColumn.java  |  9 +++
 .../view/GenericAnnotationView.java           | 67 +++++++++----------
 2 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/CreateAnnotationInstanceColumn.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/CreateAnnotationInstanceColumn.java
index c5a40ed01..bbf47efbf 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/CreateAnnotationInstanceColumn.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/CreateAnnotationInstanceColumn.java
@@ -31,6 +31,8 @@ import org.eclipse.jface.viewers.ViewerColumn;
 import org.eclipse.jface.window.Window;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
@@ -128,6 +130,13 @@ public class CreateAnnotationInstanceColumn extends ViewerColumn {
 		column.setText(entry.getSpecificationAnnotationName(spec.getClass()));
 
 		setLabelProvider(new CreateNewAnnotationColumn());
+		column.addDisposeListener(new DisposeListener() {
+
+			@Override
+			public void widgetDisposed(DisposeEvent e) {
+				crButton.dispose();
+			}
+		});
 	}
 
 	/**
diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java
index a6cc52461..a8ddfe832 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/GenericAnnotationView.java
@@ -17,9 +17,7 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.ui.annotation.view;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -31,6 +29,7 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
 import org.fortiss.tooling.base.model.element.IAnnotatedSpecification;
 import org.fortiss.tooling.base.ui.annotation.AnnotationEntry;
 import org.fortiss.tooling.base.ui.annotation.editingsupport.ElementNameEditingSupport;
@@ -55,13 +54,6 @@ import org.fortiss.tooling.base.ui.annotation.valueprovider.IAnnotationValueProv
  */
 public class GenericAnnotationView extends AnnotationViewPartBase {
 
-	/**
-	 * List containing the columns that are responsible for creating new keys. Required for
-	 * disposing when updating the view.
-	 */
-	private List<CreateAnnotationInstanceColumn> createColumns =
-			new ArrayList<CreateAnnotationInstanceColumn>();
-
 	/** The table viewer */
 	protected TableViewer tableViewer;
 
@@ -189,6 +181,9 @@ public class GenericAnnotationView extends AnnotationViewPartBase {
 	/** {@inheritDoc} */
 	@Override
 	protected void update(Collection<AnnotationEntry> annotationEntries) {
+		// Minimize flickering while updating the table
+		tableViewer.getTable().setRedraw(false);
+
 		/*
 		 * Sorted set of {@link ColumnHandle} used to instantiate this {@link
 		 * GenericAnnotationView}'s columns in the right order.
@@ -203,10 +198,6 @@ public class GenericAnnotationView extends AnnotationViewPartBase {
 			tableViewer.getTable().getColumn(1).dispose();
 		}
 
-		for(CreateAnnotationInstanceColumn col : createColumns) {
-			col.dispose();
-		}
-
 		// Aggregate required columns. Column order is defined by ColumnHandle.compareTo().
 		for(AnnotationEntry entry : annotationEntries) {
 			for(IAnnotatedSpecification spec : entry.getSpecificationsList()) {
@@ -237,7 +228,8 @@ public class GenericAnnotationView extends AnnotationViewPartBase {
 			createAnnotationColumn(columnHandle);
 		}
 
-		// Register content provider
+		// Update the view
+		tableViewer.getTable().setRedraw(true);
 		if(!tableViewer.getTable().isDisposed()) {
 			tableViewer.setInput(annotationEntries);
 		}
@@ -274,36 +266,41 @@ public class GenericAnnotationView extends AnnotationViewPartBase {
 	/** Creates a column in tableViewer that displays the annotation given in spec */
 	protected void createAnnotationColumn(ColumnHandle columnHandle) {
 
+		TableColumn tableColumn;
 		if(columnHandle.isCreateColumn()) {
 			// Create column that contains a button for adding new instances of the
 			// current annotation type.
-			createColumns.add(new CreateAnnotationInstanceColumn(tableViewer, SWT.NONE,
-					columnHandle.getAnnotatedSpecification(), columnHandle.getEntry()));
-			(createColumns.get(createColumns.size() - 1)).getColumn().setWidth(125);
-			return;
-		}
 
-		String specName = getColumnName(columnHandle);
+			CreateAnnotationInstanceColumn column =
+					new CreateAnnotationInstanceColumn(tableViewer, SWT.NONE,
+							columnHandle.getAnnotatedSpecification(), columnHandle.getEntry());
+			tableColumn = column.getColumn();
+
+		} else {
 
-		// Add new new column
-		TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
-		column.getColumn().setText(specName);
+			// Add new new column
+			TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
+			tableColumn = column.getColumn();
 
-		Class<? extends IAnnotatedSpecification> annotationClass =
-				columnHandle.getAnnotatedSpecification().getClass();
+			String specName = getColumnName(columnHandle);
+			tableColumn.setText(specName);
 
-		column.getColumn().setWidth(125);
+			Class<? extends IAnnotatedSpecification> annotationClass =
+					columnHandle.getAnnotatedSpecification().getClass();
 
-		// Have the matching EditingSupport created for the current annotated specification
-		// (work is delegated to respective IAnnotationValueProvider implementation)
-		EditingSupport editingSupport =
-				columnHandle.getEntry().createSpecificationEditElement(tableViewer,
-						annotationClass, columnHandle.getInstanceKey());
+			// Have the matching EditingSupport created for the current annotated specification
+			// (work is delegated to respective IAnnotationValueProvider implementation)
+			EditingSupport editingSupport =
+					columnHandle.getEntry().createSpecificationEditElement(tableViewer,
+							annotationClass, columnHandle.getInstanceKey());
+			column.setEditingSupport(editingSupport);
+
+			// Add column label provider, and set EditingSupport
+			column.setLabelProvider(new AnnotationLabelProvider(annotationClass, this, columnHandle
+					.getInstanceKey()));
+		}
 
-		// Add column label provider, and set EditingSupport
-		column.setLabelProvider(new AnnotationLabelProvider(annotationClass, this, columnHandle
-				.getInstanceKey()));
-		column.setEditingSupport(editingSupport);
+		tableColumn.setWidth(125);
 
 	}
 
-- 
GitLab