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);
}