Replaced VexWidget#dispose with a DisposeListener

The dispose method is not called, when the VexEditor is closed, so
instances of VexWidget remain on the heap.
According to the javadocs of Widget#dispose we now use a listener
instead. 

Change-Id: I41a9fabb6d5397123dc297bfcc10313e78deb4fb
Signed-off-by: Carsten Hiesserich <carsten.hie@gmail.com>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
index 9dc13db..a597d28 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/BaseVexWidget.java
@@ -13,6 +13,7 @@
  *     Carsten Hiesserich - handling of elements within comments (bug 407801)
  *     Carsten Hiesserich - allow insertion of newline into pre elements (bug 407827)
  *     Carsten Hiesserich - handling of preformatted elements, XML insertion(bug 407827, bug 408501 )
+ *     Carsten Hiesserich - added dispose()
  *******************************************************************************/
 package org.eclipse.vex.core.internal.widget;
 
@@ -202,6 +203,18 @@
 		this.hostComponent = hostComponent;
 	}
 
+	/**
+	 * @see org.eclipse.swt.widgets.Widget#dispose()
+	 * 
+	 */
+	public void dispose() {
+		if (document != null) {
+			final IDocument doc = document;
+			doc.removeDocumentListener(documentListener);
+		}
+		styleSheet = null;
+	}
+
 	public void beginWork() {
 		if (beginWorkCount == 0) {
 			beginWorkCaretOffset = getCaretOffset();
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/VexWidget.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/VexWidget.java
index ed1025a..34b5a8f 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/VexWidget.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/swt/VexWidget.java
@@ -9,6 +9,7 @@
  *     John Krasnay - initial API and implementation
  *     Igor Jacy Lino Campista - Java 5 warnings fixed (bug 311325)
  *     Carsten Hiesserich - changed fragment pasting to allow XML content
+ *     Carsten Hiesserich - replaced dispose override by disposeListener
  *******************************************************************************/
 package org.eclipse.vex.core.internal.widget.swt;
 
@@ -35,6 +36,8 @@
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.KeyAdapter;
@@ -62,10 +65,10 @@
 import org.eclipse.vex.core.internal.css.IWhitespacePolicy;
 import org.eclipse.vex.core.internal.css.StyleSheet;
 import org.eclipse.vex.core.internal.io.XMLFragment;
+import org.eclipse.vex.core.internal.widget.BaseVexWidget;
 import org.eclipse.vex.core.internal.widget.IHostComponent;
 import org.eclipse.vex.core.internal.widget.IVexWidget;
 import org.eclipse.vex.core.internal.widget.ReadOnlyException;
-import org.eclipse.vex.core.internal.widget.BaseVexWidget;
 import org.eclipse.vex.core.provisional.dom.ContentRange;
 import org.eclipse.vex.core.provisional.dom.DocumentValidationException;
 import org.eclipse.vex.core.provisional.dom.IComment;
@@ -101,12 +104,7 @@
 		addMouseListener(mouseListener);
 		addMouseMoveListener(mouseMoveListener);
 		addPaintListener(painter);
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		impl.setFocus(false); // This stops the caret timer, in case the control is disposed before focus is lost.
+		addDisposeListener(disposeListener);
 	}
 
 	public Object getInput() {
@@ -716,6 +714,19 @@
 		}
 	};
 
+	/**
+	 * The DisposedEvent is Fired when this Widget is disposed. The event is used instead of re-implementing
+	 * Wigdet#dispose, which does not work.
+	 * 
+	 * @see org.eclipse.swt.widgets.Widget#dispose
+	 */
+	private final DisposeListener disposeListener = new DisposeListener() {
+		public void widgetDisposed(final DisposeEvent e) {
+			impl.dispose();
+			caretTimer.stop();
+		}
+	};
+
 	private static void addKey(final char character, final int keyCode, final int stateMask, final Action action) {
 		keyMap.put(new KeyStroke(character, keyCode, stateMask), action);
 	}