diff options
author | Brian Vosburgh | 2013-06-10 20:03:15 +0000 |
---|---|---|
committer | Brian Vosburgh | 2013-06-10 20:39:39 +0000 |
commit | d41a16b9df9c345758513980ef0c0a1e085fa944 (patch) | |
tree | 868b383f644a5e4dfbfb0d7ca3ca3a24158f6434 /common/plugins/org.eclipse.jpt.common.ui | |
parent | a11ef4b8fc1949f88e4d3cb6f83b9d4b5d6d3b2e (diff) | |
download | webtools.dali-d41a16b9df9c345758513980ef0c0a1e085fa944.tar.gz webtools.dali-d41a16b9df9c345758513980ef0c0a1e085fa944.tar.xz webtools.dali-d41a16b9df9c345758513980ef0c0a1e085fa944.zip |
rework SWT listener wrappers
Diffstat (limited to 'common/plugins/org.eclipse.jpt.common.ui')
25 files changed, 543 insertions, 298 deletions
diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/AbstractSWTListenerWrapper.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/AbstractSWTListenerWrapper.java new file mode 100644 index 0000000000..c461d7d2a5 --- /dev/null +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/AbstractSWTListenerWrapper.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2007, 2013 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.common.ui.internal.listeners; + +import java.util.EventListener; +import java.util.EventObject; +import org.eclipse.jpt.common.utility.ExceptionHandler; +import org.eclipse.swt.widgets.Display; + +/** + * Wrap another listener and forward events to it on the SWT + * UI thread, asynchronously if necessary. + * @see SWTListenerWrapperDelegate + */ +public abstract class AbstractSWTListenerWrapper<E extends EventObject, L extends EventListener> + implements SWTListenerWrapperDelegate.Wrapper<E> +{ + /* private-*/ protected final L listener; + /* private-*/ protected final SWTListenerWrapperDelegate<E> delegate; + + + protected AbstractSWTListenerWrapper(L listener, Display display, ExceptionHandler exceptionHandler) { + super(); + if (listener == null) { + throw new NullPointerException(); + } + this.listener = listener; + this.delegate = new SWTListenerWrapperDelegate<E>(this, display, exceptionHandler); + } + + @Override + public String toString() { + return "SWT[" + this.listener + ']'; //$NON-NLS-1$ + } +} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTCollectionChangeListenerWrapper.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTCollectionChangeListenerWrapper.java index 7c09e40eda..2b36997abc 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTCollectionChangeListenerWrapper.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTCollectionChangeListenerWrapper.java @@ -9,79 +9,44 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.listeners; -import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; -import org.eclipse.jpt.common.utility.internal.RunnableAdapter; -import org.eclipse.jpt.common.utility.internal.collection.SynchronizedQueue; +import org.eclipse.jpt.common.utility.ExceptionHandler; import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent; import org.eclipse.jpt.common.utility.model.event.CollectionChangeEvent; import org.eclipse.jpt.common.utility.model.event.CollectionClearEvent; import org.eclipse.jpt.common.utility.model.event.CollectionEvent; import org.eclipse.jpt.common.utility.model.event.CollectionRemoveEvent; import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener; +import org.eclipse.swt.widgets.Display; /** * Wrap another collection change listener and forward events to it on the SWT * UI thread, asynchronously if necessary. - * - * @see SWTPropertyChangeListenerWrapper */ public class SWTCollectionChangeListenerWrapper + extends AbstractSWTListenerWrapper<CollectionEvent, CollectionChangeListener> implements CollectionChangeListener { - private final CollectionChangeListener listener; - private final SynchronizedQueue<CollectionEvent> events = new SynchronizedQueue<CollectionEvent>(); - - - public SWTCollectionChangeListenerWrapper(CollectionChangeListener listener) { - super(); - if (listener == null) { - throw new NullPointerException(); - } - this.listener = listener; + public SWTCollectionChangeListenerWrapper(CollectionChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + super(listener, display, exceptionHandler); } public void itemsAdded(CollectionAddEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void itemsRemoved(CollectionRemoveEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void collectionCleared(CollectionClearEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void collectionChanged(CollectionChangeEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); - } - - /* CU private */ class ForwardEventsRunnable - extends RunnableAdapter - { - @Override - public void run() { - SWTCollectionChangeListenerWrapper.this.forwardEvents(); - } + this.delegate.handle(event); } - void forwardEvents() { - Iterable<CollectionEvent> temp = this.events.drain(); // debug - for (CollectionEvent event : temp) { - try { - this.forwardEvent(event); - } catch (RuntimeException ex) { - JptCommonUiPlugin.instance().logError(ex); - } - } - } - - private void forwardEvent(CollectionEvent event) { + public void forward(CollectionEvent event) { if (event instanceof CollectionAddEvent) { this.listener.itemsAdded((CollectionAddEvent) event); } @@ -95,19 +60,4 @@ public class SWTCollectionChangeListenerWrapper this.listener.collectionChanged((CollectionChangeEvent) event); } } - - /** - * {@link DisplayTools#execute(Runnable)} seems to work OK; - * but using {@link DisplayTools#syncExec(Runnable)} can somtimes make things - * more predictable when debugging, at the risk of deadlocks. - */ - private void execute(Runnable r) { - DisplayTools.execute(r); -// SWTUtil.syncExec(r); - } - - @Override - public String toString() { - return "SWT(" + this.listener + ')'; //$NON-NLS-1$ - } } diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListChangeListenerWrapper.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListChangeListenerWrapper.java index c820a81230..89d41891b6 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListChangeListenerWrapper.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListChangeListenerWrapper.java @@ -9,10 +9,7 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.listeners; -import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; -import org.eclipse.jpt.common.utility.internal.RunnableAdapter; -import org.eclipse.jpt.common.utility.internal.collection.SynchronizedQueue; +import org.eclipse.jpt.common.utility.ExceptionHandler; import org.eclipse.jpt.common.utility.model.event.ListAddEvent; import org.eclipse.jpt.common.utility.model.event.ListChangeEvent; import org.eclipse.jpt.common.utility.model.event.ListClearEvent; @@ -21,79 +18,45 @@ import org.eclipse.jpt.common.utility.model.event.ListMoveEvent; import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent; import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent; import org.eclipse.jpt.common.utility.model.listener.ListChangeListener; +import org.eclipse.swt.widgets.Display; /** * Wrap another list change listener and forward events to it on the SWT * UI thread, asynchronously if necessary. - * - * @see SWTPropertyChangeListenerWrapper */ public class SWTListChangeListenerWrapper + extends AbstractSWTListenerWrapper<ListEvent, ListChangeListener> implements ListChangeListener { - private final ListChangeListener listener; - private final SynchronizedQueue<ListEvent> events = new SynchronizedQueue<ListEvent>(); - - - public SWTListChangeListenerWrapper(ListChangeListener listener) { - super(); - if (listener == null) { - throw new NullPointerException(); - } - this.listener = listener; + public SWTListChangeListenerWrapper(ListChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + super(listener, display, exceptionHandler); } public void itemsAdded(ListAddEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void itemsRemoved(ListRemoveEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void itemsMoved(ListMoveEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void itemsReplaced(ListReplaceEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void listCleared(ListClearEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); + this.delegate.handle(event); } public void listChanged(ListChangeEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); - } - - /* CU private */ class ForwardEventsRunnable - extends RunnableAdapter - { - @Override - public void run() { - SWTListChangeListenerWrapper.this.forwardEvents(); - } + this.delegate.handle(event); } - void forwardEvents() { - Iterable<ListEvent> temp = this.events.drain(); // debug - for (ListEvent event : temp) { - try { - this.forwardEvent(event); - } catch (RuntimeException ex) { - JptCommonUiPlugin.instance().logError(ex); - } - } - } - - private void forwardEvent(ListEvent event) { + public void forward(ListEvent event) { if (event instanceof ListAddEvent) { this.listener.itemsAdded((ListAddEvent) event); } @@ -113,19 +76,4 @@ public class SWTListChangeListenerWrapper this.listener.listChanged((ListChangeEvent) event); } } - - /** - * {@link DisplayTools#execute(Runnable)} seems to work OK; - * but using {@link DisplayTools#syncExec(Runnable)} can somtimes make things - * more predictable when debugging, at the risk of deadlocks. - */ - private void execute(Runnable r) { - DisplayTools.execute(r); -// SWTUtil.syncExec(r); - } - - @Override - public String toString() { - return "SWT(" + this.listener + ')'; //$NON-NLS-1$ - } } diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperDelegate.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperDelegate.java new file mode 100644 index 0000000000..99288a8902 --- /dev/null +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperDelegate.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright (c) 2007, 2013 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.common.ui.internal.listeners; + +import java.util.EventObject; +import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; +import org.eclipse.jpt.common.utility.ExceptionHandler; +import org.eclipse.jpt.common.utility.internal.ObjectTools; +import org.eclipse.jpt.common.utility.internal.RunnableAdapter; +import org.eclipse.jpt.common.utility.internal.collection.SynchronizedQueue; +import org.eclipse.swt.widgets.Display; + +/** + * Delegate used by a {@link Wrapper} to forward events to its + * wrapped listener on the SWT UI thread, asynchronously if necessary. + * If the event arrived on the UI + * thread that is probably because it was initiated by a UI widget; as a + * result, we want to loop back synchronously so the events can be + * short-circuited. (Typically, the adapter(s) between a <em>property</em> and + * its corresponding UI widget are read-write; as opposed to the adapter(s) + * between a <em>collection</em> (or <em>list</em>) and its UI widget, which + * is read-only.) + * <p> + * Any events received earlier (on a non-UI thread) will be + * forwarded, in the order received, before the current event is forwarded. + */ +public class SWTListenerWrapperDelegate<E extends EventObject> { + private final Wrapper<E> wrapper; + private final Display display; + private final Runnable forwardEventsRunnable = new ForwardEventsRunnable(); + private final ExceptionHandler exceptionHandler; + private final SynchronizedQueue<E> events = new SynchronizedQueue<E>(); + + + public SWTListenerWrapperDelegate(Wrapper<E> wrapper, Display display, ExceptionHandler exceptionHandler) { + super(); + if (wrapper == null) { + throw new NullPointerException(); + } + this.wrapper = wrapper; + if (display == null) { + throw new NullPointerException(); + } + this.display = display; + if (exceptionHandler == null) { + throw new NullPointerException(); + } + this.exceptionHandler = exceptionHandler; + } + + /** + * Called by the wrapper. + */ + public void handle(E event) { + this.events.enqueue(event); + this.execute(this.forwardEventsRunnable); + } + + /** + * {@link DisplayTools#execute(Runnable)} seems to work OK; + * but using {@link Display#syncExec(Runnable)} can somtimes make things + * more predictable when debugging, at the risk of deadlocks. + */ + private void execute(Runnable runnable) { + DisplayTools.execute(this.display, runnable); +// this.display.syncExec(runnable); + } + + /* CU private */ class ForwardEventsRunnable + extends RunnableAdapter + { + @Override + public void run() { + SWTListenerWrapperDelegate.this.forwardEvents(); + } + } + + /** + * Dispatch the events back to the wrapper once we are on the UI thread. + */ + /* CU private */ void forwardEvents() { + Iterable<E> temp = this.events.drain(); // debug aid + for (E event : temp) { + try { + this.wrapper.forward(event); + } catch (RuntimeException ex) { + this.exceptionHandler.handleException(ex); + } + } + } + + @Override + public String toString() { + return ObjectTools.toString(this, this.wrapper); + } + + + // ********** wrapper interface ********** + + /** + * The interface used by {@link SWTListenerWrapperDelegate} to forward + * events to the wrapped listener from the UI thread. + */ + public interface Wrapper<E extends EventObject> { + /** + * Forward the specified event to the wrapped listener. + */ + void forward(E event); + } +} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperTools.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperTools.java new file mode 100644 index 0000000000..1c4dbb00f0 --- /dev/null +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTListenerWrapperTools.java @@ -0,0 +1,288 @@ +/******************************************************************************* + * Copyright (c) 2012, 2013 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.common.ui.internal.listeners; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; +import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; +import org.eclipse.jpt.common.utility.ExceptionHandler; +import org.eclipse.jpt.common.utility.internal.RuntimeExceptionHandler; +import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener; +import org.eclipse.jpt.common.utility.model.listener.ListChangeListener; +import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; +import org.eclipse.jpt.common.utility.model.listener.StateChangeListener; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Widget; + +public final class SWTListenerWrapperTools { + + private static final ExceptionHandler DEFAULT_EXCEPTION_HANDLER = + (JptCommonUiPlugin.instance() != null) ? + JptCommonUiPlugin.instance().getExceptionHandler() : + RuntimeExceptionHandler.instance(); + + // ********** property ********** + + /** + * Wrap the specified property change listener and forward events to it on + * the SWT UI thread, asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTPropertyChangeListenerWrapper + */ + public static PropertyChangeListener wrap(PropertyChangeListener listener) { + return wrap(listener, DisplayTools.getDisplay()); + } + + /** + * Wrap the specified property change listener and forward events to it on + * the SWT UI thread associated with the specified viewer, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTPropertyChangeListenerWrapper + */ + public static PropertyChangeListener wrap(PropertyChangeListener listener, Viewer viewer) { + return wrap(listener, viewer.getControl()); + } + + /** + * Wrap the specified property change listener and forward events to it on + * the SWT UI thread associated with the specified widget, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTPropertyChangeListenerWrapper + */ + public static PropertyChangeListener wrap(PropertyChangeListener listener, Widget widget) { + return wrap(listener, widget.getDisplay()); + } + + /** + * Wrap the specified property change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTPropertyChangeListenerWrapper + */ + public static PropertyChangeListener wrap(PropertyChangeListener listener, Display display) { + return wrap(listener, display, DEFAULT_EXCEPTION_HANDLER); + } + + /** + * Wrap the specified property change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be forwarded to the + * specified exception handler. + * @see SWTPropertyChangeListenerWrapper + */ + public static PropertyChangeListener wrap(PropertyChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + return new SWTPropertyChangeListenerWrapper(listener, display, exceptionHandler); + } + + + // ********** collection ********** + + /** + * Wrap the specified collection change listener and forward events to it on + * the SWT UI thread, asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTCollectionChangeListenerWrapper + */ + public static CollectionChangeListener wrap(CollectionChangeListener listener) { + return wrap(listener, DisplayTools.getDisplay()); + } + + /** + * Wrap the specified collection change listener and forward events to it on + * the SWT UI thread associated with the specified viewer, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTCollectionChangeListenerWrapper + */ + public static CollectionChangeListener wrap(CollectionChangeListener listener, Viewer viewer) { + return wrap(listener, viewer.getControl()); + } + + /** + * Wrap the specified collection change listener and forward events to it on + * the SWT UI thread associated with the specified widget, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTCollectionChangeListenerWrapper + */ + public static CollectionChangeListener wrap(CollectionChangeListener listener, Widget widget) { + return wrap(listener, widget.getDisplay()); + } + + /** + * Wrap the specified collection change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTCollectionChangeListenerWrapper + */ + public static CollectionChangeListener wrap(CollectionChangeListener listener, Display display) { + return wrap(listener, display, DEFAULT_EXCEPTION_HANDLER); + } + + /** + * Wrap the specified collection change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be forwarded to the + * specified exception handler. + * @see SWTCollectionChangeListenerWrapper + */ + public static CollectionChangeListener wrap(CollectionChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + return new SWTCollectionChangeListenerWrapper(listener, display, exceptionHandler); + } + + + // ********** list ********** + + /** + * Wrap the specified list change listener and forward events to it on + * the SWT UI thread, asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTListChangeListenerWrapper + */ + public static ListChangeListener wrap(ListChangeListener listener) { + return wrap(listener, DisplayTools.getDisplay()); + } + + /** + * Wrap the specified list change listener and forward events to it on + * the SWT UI thread associated with the specified viewer, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTListChangeListenerWrapper + */ + public static ListChangeListener wrap(ListChangeListener listener, Viewer viewer) { + return wrap(listener, viewer.getControl()); + } + + /** + * Wrap the specified list change listener and forward events to it on + * the SWT UI thread associated with the specified widget, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTListChangeListenerWrapper + */ + public static ListChangeListener wrap(ListChangeListener listener, Widget widget) { + return wrap(listener, widget.getDisplay()); + } + + /** + * Wrap the specified list change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTListChangeListenerWrapper + */ + public static ListChangeListener wrap(ListChangeListener listener, Display display) { + return wrap(listener, display, DEFAULT_EXCEPTION_HANDLER); + } + + /** + * Wrap the specified list change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be forwarded to the + * specified exception handler. + * @see SWTListChangeListenerWrapper + */ + public static ListChangeListener wrap(ListChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + return new SWTListChangeListenerWrapper(listener, display, exceptionHandler); + } + + + // ********** state ********** + + /** + * Wrap the specified state change listener and forward events to it on + * the SWT UI thread, asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTStateChangeListenerWrapper + */ + public static StateChangeListener wrap(StateChangeListener listener) { + return wrap(listener, DisplayTools.getDisplay()); + } + + /** + * Wrap the specified state change listener and forward events to it on + * the SWT UI thread associated with the specified viewer, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTStateChangeListenerWrapper + */ + public static StateChangeListener wrap(StateChangeListener listener, Viewer viewer) { + return wrap(listener, viewer.getControl()); + } + + /** + * Wrap the specified state change listener and forward events to it on + * the SWT UI thread associated with the specified widget, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTStateChangeListenerWrapper + */ + public static StateChangeListener wrap(StateChangeListener listener, Widget widget) { + return wrap(listener, widget.getDisplay()); + } + + /** + * Wrap the specified state change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be logged by the + * {@link JptCommonUiPlugin Dali UI plug-in}. + * @see SWTStateChangeListenerWrapper + */ + public static StateChangeListener wrap(StateChangeListener listener, Display display) { + return wrap(listener, display, DEFAULT_EXCEPTION_HANDLER); + } + + /** + * Wrap the specified state change listener and forward events to it on + * the SWT UI thread associated with the specified display, + * asynchronously if necessary. + * Any exceptions thrown by the specified listener will be forwarded to the + * specified exception handler. + * @see SWTStateChangeListenerWrapper + */ + public static StateChangeListener wrap(StateChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + return new SWTStateChangeListenerWrapper(listener, display, exceptionHandler); + } + + + // ********** constructor ********** + + /** + * Suppress default constructor, ensuring non-instantiability. + */ + private SWTListenerWrapperTools() { + super(); + throw new UnsupportedOperationException(); + } +} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTPropertyChangeListenerWrapper.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTPropertyChangeListenerWrapper.java index add628ba2f..92e6e4878f 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTPropertyChangeListenerWrapper.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTPropertyChangeListenerWrapper.java @@ -9,78 +9,28 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.listeners; -import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; -import org.eclipse.jpt.common.utility.internal.RunnableAdapter; -import org.eclipse.jpt.common.utility.internal.collection.SynchronizedQueue; +import org.eclipse.jpt.common.utility.ExceptionHandler; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; +import org.eclipse.swt.widgets.Display; /** * Wrap another property change listener and forward events to it on the SWT - * UI thread, asynchronously if necessary. If the event arrived on the UI - * thread that is probably because it was initiated by a UI widget; as a - * result, we want to loop back synchronously so the events can be - * short-circuited. (Typically, the adapter(s) between a <em>property</em> and - * its corresponding UI widget are read-write; as opposed to the adapter(s) - * between a <em>collection</em> (or <em>list</em>) and its UI widget, which - * is read-only.) - * <p> - * Any events received earlier (on a non-UI thread) will be - * forwarded, in the order received, before the current event is forwarded. + * UI thread, asynchronously if necessary. */ public class SWTPropertyChangeListenerWrapper + extends AbstractSWTListenerWrapper<PropertyChangeEvent, PropertyChangeListener> implements PropertyChangeListener { - private final PropertyChangeListener listener; - private final SynchronizedQueue<PropertyChangeEvent> events = new SynchronizedQueue<PropertyChangeEvent>(); - - - public SWTPropertyChangeListenerWrapper(PropertyChangeListener listener) { - super(); - if (listener == null) { - throw new NullPointerException(); - } - this.listener = listener; + public SWTPropertyChangeListenerWrapper(PropertyChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + super(listener, display, exceptionHandler); } public void propertyChanged(PropertyChangeEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); - } - - /* CU private */ class ForwardEventsRunnable - extends RunnableAdapter - { - @Override - public void run() { - SWTPropertyChangeListenerWrapper.this.forwardEvents(); - } - } - - void forwardEvents() { - Iterable<PropertyChangeEvent> temp = this.events.drain(); // debug - for (PropertyChangeEvent event : temp) { - try { - this.listener.propertyChanged(event); - } catch (RuntimeException ex) { - JptCommonUiPlugin.instance().logError(ex); - } - } - } - - /** - * {@link DisplayTools#execute(Runnable)} seems to work OK; - * but using {@link DisplayTools#syncExec(Runnable)} can somtimes make things - * more predictable when debugging, at the risk of deadlocks. - */ - private void execute(Runnable r) { - DisplayTools.execute(r); -// SWTUtil.syncExec(r); + this.delegate.handle(event); } - @Override - public String toString() { - return "SWT(" + this.listener + ')'; //$NON-NLS-1$ + public void forward(PropertyChangeEvent event) { + this.listener.propertyChanged(event); } } diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTStateChangeListenerWrapper.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTStateChangeListenerWrapper.java index b05b131328..066f38d1cf 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTStateChangeListenerWrapper.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/listeners/SWTStateChangeListenerWrapper.java @@ -9,73 +9,28 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.listeners; -import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; -import org.eclipse.jpt.common.utility.internal.RunnableAdapter; -import org.eclipse.jpt.common.utility.internal.collection.SynchronizedQueue; +import org.eclipse.jpt.common.utility.ExceptionHandler; import org.eclipse.jpt.common.utility.model.event.StateChangeEvent; import org.eclipse.jpt.common.utility.model.listener.StateChangeListener; +import org.eclipse.swt.widgets.Display; /** * Wrap another state change listener and forward events to it on the SWT * UI thread, asynchronously if necessary. - * <p> - * Any events received earlier (on a non-UI thread) will be - * forwarded, in the order received, before the current event is forwarded. - * @see SWTPropertyChangeListenerWrapper */ public class SWTStateChangeListenerWrapper + extends AbstractSWTListenerWrapper<StateChangeEvent, StateChangeListener> implements StateChangeListener { - private final StateChangeListener listener; - private final SynchronizedQueue<StateChangeEvent> events = new SynchronizedQueue<StateChangeEvent>(); - - - public SWTStateChangeListenerWrapper(StateChangeListener listener) { - super(); - if (listener == null) { - throw new NullPointerException(); - } - this.listener = listener; + public SWTStateChangeListenerWrapper(StateChangeListener listener, Display display, ExceptionHandler exceptionHandler) { + super(listener, display, exceptionHandler); } public void stateChanged(StateChangeEvent event) { - this.events.enqueue(event); - this.execute(new ForwardEventsRunnable()); - } - - /* CU private */ class ForwardEventsRunnable - extends RunnableAdapter - { - @Override - public void run() { - SWTStateChangeListenerWrapper.this.forwardEvents(); - } - } - - void forwardEvents() { - Iterable<StateChangeEvent> temp = this.events.drain(); // debug - for (StateChangeEvent event : temp) { - try { - this.listener.stateChanged(event); - } catch (RuntimeException ex) { - JptCommonUiPlugin.instance().logError(ex); - } - } - } - - /** - * {@link DisplayTools#execute(Runnable)} seems to work OK; - * but using {@link DisplayTools#syncExec(Runnable)} can somtimes make things - * more predictable when debugging, at the risk of deadlocks. - */ - private void execute(Runnable r) { - DisplayTools.execute(r); -// SWTUtil.syncExec(r); + this.delegate.handle(event); } - @Override - public String toString() { - return "SWT(" + this.listener + ')'; //$NON-NLS-1$ + public void forward(StateChangeEvent event) { + this.listener.stateChanged(event); } } diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/AbstractComboModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/AbstractComboModelAdapter.java index 03fdbfd00e..ca9a6f55a6 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/AbstractComboModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/AbstractComboModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Oracle. All rights reserved. + * Copyright (c) 2008, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -12,8 +12,7 @@ package org.eclipse.jpt.common.ui.internal.swt; import java.util.EventListener; import java.util.EventObject; import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.common.ui.internal.listeners.SWTListChangeListenerWrapper; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ArrayTools; import org.eclipse.jpt.common.utility.internal.ListenerList; import org.eclipse.jpt.common.utility.internal.ObjectTools; @@ -174,7 +173,7 @@ public abstract class AbstractComboModelAdapter<E> { // ********** initialization ********** protected ListChangeListener buildListChangeListener() { - return new SWTListChangeListenerWrapper(this.buildListChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildListChangeListener_()); } protected ListChangeListener buildListChangeListener_() { @@ -205,7 +204,7 @@ public abstract class AbstractComboModelAdapter<E> { } protected PropertyChangeListener buildSelectedItemChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSelectedItemChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSelectedItemChangeListener_()); } protected PropertyChangeListener buildSelectedItemChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/DateTimeModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/DateTimeModelAdapter.java index c75e2388c3..a0ace2ae03 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/DateTimeModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/DateTimeModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Oracle. All rights reserved. + * Copyright (c) 2008, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -9,12 +9,12 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; @@ -146,7 +146,7 @@ public class DateTimeModelAdapter { // ********** initialization ********** protected PropertyChangeListener buildHoursPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildHoursPropertyChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildHoursPropertyChangeListener_(), this.dateTime); } protected PropertyChangeListener buildHoursPropertyChangeListener_() { @@ -162,7 +162,7 @@ public class DateTimeModelAdapter { } protected PropertyChangeListener buildMinutesPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildMinutesPropertyChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildMinutesPropertyChangeListener_(), this.dateTime); } protected PropertyChangeListener buildMinutesPropertyChangeListener_() { @@ -178,7 +178,7 @@ public class DateTimeModelAdapter { } protected PropertyChangeListener buildSecondsPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSecondsPropertyChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSecondsPropertyChangeListener_(), this.dateTime); } protected PropertyChangeListener buildSecondsPropertyChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/SpinnerModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/SpinnerModelAdapter.java index 0e79f54a70..768f8788dc 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/SpinnerModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/SpinnerModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Oracle. All rights reserved. + * Copyright (c) 2008, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -9,12 +9,12 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ModifyEvent; @@ -115,7 +115,7 @@ public class SpinnerModelAdapter { // ********** initialization ********** protected PropertyChangeListener buildPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildPropertyChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildPropertyChangeListener_(), this.spinner); } protected PropertyChangeListener buildPropertyChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableItemModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableItemModelAdapter.java index 758ad84dea..4aa949e8c9 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableItemModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableItemModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Oracle. All rights reserved. + * Copyright (c) 2007, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -10,7 +10,7 @@ package org.eclipse.jpt.common.ui.internal.swt; import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.swt.events.DisposeAdapter; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; @@ -117,9 +117,7 @@ public class TableItemModelAdapter { protected PropertyChangeListener buildPropertyChangeListener(int index) { - return new SWTPropertyChangeListenerWrapper( - this.buildPropertyChangeListener_(index) - ); + return SWTListenerWrapperTools.wrap(this.buildPropertyChangeListener_(index), this.tableItem); } protected PropertyChangeListener buildPropertyChangeListener_(int index) { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableModelAdapter.java index c45f0887c4..8efabfa013 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TableModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Oracle. All rights reserved. + * Copyright (c) 2008, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -16,8 +16,7 @@ import java.util.EventListener; import java.util.EventObject; import java.util.List; import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jpt.common.ui.internal.listeners.SWTCollectionChangeListenerWrapper; -import org.eclipse.jpt.common.ui.internal.listeners.SWTListChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ArrayTools; import org.eclipse.jpt.common.utility.internal.ListenerList; import org.eclipse.jpt.common.utility.internal.ObjectTools; @@ -36,8 +35,8 @@ import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener; import org.eclipse.jpt.common.utility.model.listener.ListChangeListener; import org.eclipse.jpt.common.utility.model.value.CollectionValueModel; import org.eclipse.jpt.common.utility.model.value.ListValueModel; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiableCollectionValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -230,7 +229,7 @@ public class TableModelAdapter<E> { // ********** initialization ********** protected ListChangeListener buildListChangeListener() { - return new SWTListChangeListenerWrapper(this.buildListChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildListChangeListener_(), this.table); } protected ListChangeListener buildListChangeListener_() { @@ -261,7 +260,7 @@ public class TableModelAdapter<E> { } protected CollectionChangeListener buildSelectedItemsChangeListener() { - return new SWTCollectionChangeListenerWrapper(this.buildSelectedItemsChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSelectedItemsChangeListener_(), this.table); } protected CollectionChangeListener buildSelectedItemsChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TriStateCheckBoxModelAdapter.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TriStateCheckBoxModelAdapter.java index 9ccf3661c6..8b816ba6a5 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TriStateCheckBoxModelAdapter.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/TriStateCheckBoxModelAdapter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2012 Oracle. All rights reserved. + * Copyright (c) 2008, 2013 Oracle. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0, which accompanies this distribution * and is available at http://www.eclipse.org/legal/epl-v10.html. @@ -10,13 +10,13 @@ package org.eclipse.jpt.common.ui.internal.swt; import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.widgets.TriStateCheckBox; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; @@ -97,7 +97,7 @@ public class TriStateCheckBoxModelAdapter { // ********** initialization ********** protected PropertyChangeListener buildBooleanChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildBooleanChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildBooleanChangeListener_(), this.button.getCheckBox()); } protected PropertyChangeListener buildBooleanChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanButtonModelBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanButtonModelBinding.java index ab29ff242e..f3440c2b8c 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanButtonModelBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanButtonModelBinding.java @@ -9,12 +9,12 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; @@ -97,7 +97,7 @@ final class BooleanButtonModelBinding { // ********** initialization ********** private PropertyChangeListener buildBooleanChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildBooleanChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildBooleanChangeListener_(), this.button); } private PropertyChangeListener buildBooleanChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanStateController.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanStateController.java index 2bcf162ea1..a2baf00731 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanStateController.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/BooleanStateController.java @@ -9,11 +9,11 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.swt.events.DisposeAdapter; import org.eclipse.jpt.common.ui.internal.swt.widgets.DisplayTools; -import org.eclipse.jpt.common.utility.internal.RunnableAdapter; import org.eclipse.jpt.common.utility.internal.ObjectTools; +import org.eclipse.jpt.common.utility.internal.RunnableAdapter; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeAdapter; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; @@ -89,7 +89,7 @@ abstract class BooleanStateController { // ********** initialization ********** private PropertyChangeListener buildBooleanChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildBooleanChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildBooleanChangeListener_()); } private PropertyChangeListener buildBooleanChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/DropDownListBoxSelectionBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/DropDownListBoxSelectionBinding.java index 13a7253196..8ba2eb1e32 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/DropDownListBoxSelectionBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/DropDownListBoxSelectionBinding.java @@ -9,13 +9,13 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; import org.eclipse.jpt.common.utility.model.value.ListValueModel; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; @@ -98,7 +98,7 @@ final class DropDownListBoxSelectionBinding<E> // ********** initialization ********** private PropertyChangeListener buildSelectedItemChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSelectedItemChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSelectedItemChangeListener_()); } private PropertyChangeListener buildSelectedItemChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/LabelModelBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/LabelModelBinding.java index 6e8722cecc..38ec649acf 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/LabelModelBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/LabelModelBinding.java @@ -9,7 +9,7 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.swt.events.DisposeAdapter; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.internal.StringTools; @@ -89,7 +89,7 @@ class LabelModelBinding { } private PropertyChangeListener buildImageListener() { - return new SWTPropertyChangeListenerWrapper(new ImageListener()); + return SWTListenerWrapperTools.wrap(new ImageListener(), this.labelAdapter.getWidget()); } /* CU private */ class ImageListener @@ -102,7 +102,7 @@ class LabelModelBinding { } private PropertyChangeListener buildTextListener() { - return new SWTPropertyChangeListenerWrapper(new TextListener()); + return SWTListenerWrapperTools.wrap(new TextListener(), this.labelAdapter.getWidget()); } /* CU private */ class TextListener diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListBoxSelectionBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListBoxSelectionBinding.java index b832be7820..6f0cae9663 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListBoxSelectionBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListBoxSelectionBinding.java @@ -11,8 +11,7 @@ package org.eclipse.jpt.common.ui.internal.swt.bind; import java.util.ArrayList; import java.util.Arrays; - -import org.eclipse.jpt.common.ui.internal.listeners.SWTCollectionChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ArrayTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent; @@ -100,7 +99,7 @@ final class ListBoxSelectionBinding<E> // ********** initialization ********** private CollectionChangeListener buildSelectedItemsChangeListener() { - return new SWTCollectionChangeListenerWrapper(this.buildSelectedItemsChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSelectedItemsChangeListener_(), this.listBox); } private CollectionChangeListener buildSelectedItemsChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListWidgetModelBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListWidgetModelBinding.java index 5757917d26..488b04fc3f 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListWidgetModelBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/ListWidgetModelBinding.java @@ -10,7 +10,7 @@ package org.eclipse.jpt.common.ui.internal.swt.bind; import java.util.ArrayList; -import org.eclipse.jpt.common.ui.internal.listeners.SWTListChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ArrayTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.ListAddEvent; @@ -109,7 +109,7 @@ final class ListWidgetModelBinding<E> { // ********** initialization ********** private ListChangeListener buildListChangeListener() { - return new SWTListChangeListenerWrapper(this.buildListChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildListChangeListener_()); } private ListChangeListener buildListChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/PageBookModelBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/PageBookModelBinding.java index a7d8af3c73..a9c6edc072 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/PageBookModelBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/PageBookModelBinding.java @@ -9,7 +9,7 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.swt.events.DisposeAdapter; import org.eclipse.jpt.common.ui.internal.swt.widgets.ControlTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; @@ -105,7 +105,7 @@ final class PageBookModelBinding<T> { } private PropertyChangeListener buildValueModelListener() { - return new SWTPropertyChangeListenerWrapper(new ValueModelListener()); + return SWTListenerWrapperTools.wrap(new ValueModelListener(), this.pageBook); } /* CU private */ class ValueModelListener diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/TextFieldModelBinding.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/TextFieldModelBinding.java index bb3ea8442a..f5cada2476 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/TextFieldModelBinding.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/swt/bind/TextFieldModelBinding.java @@ -9,12 +9,12 @@ ******************************************************************************/ package org.eclipse.jpt.common.ui.internal.swt.bind; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ModifyEvent; @@ -94,7 +94,7 @@ class TextFieldModelBinding { // ********** initialization ********** private PropertyChangeListener buildTextModelChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildTextModelChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildTextModelChangeListener_(), this.textField); } private PropertyChangeListener buildTextModelChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java index f1398740fc..fcad76f89c 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java @@ -11,7 +11,7 @@ package org.eclipse.jpt.common.ui.internal.widgets; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jpt.common.ui.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTListChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.utility.internal.iterable.EmptyIterable; import org.eclipse.jpt.common.utility.internal.iterable.EmptyListIterable; import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; @@ -287,7 +287,7 @@ public abstract class AddRemovePane<T extends Model, E extends Object> extends P } private ListChangeListener buildListChangeListener() { - return new SWTListChangeListenerWrapper(buildListChangeListener_()); + return SWTListenerWrapperTools.wrap(buildListChangeListener_()); } private ListChangeListener buildListChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java index 4426cd672d..d4e8273eae 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java @@ -30,7 +30,7 @@ import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jpt.common.core.internal.utility.JavaProjectTools; import org.eclipse.jpt.common.ui.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; import org.eclipse.jpt.common.utility.internal.ClassNameTools; import org.eclipse.jpt.common.utility.internal.StringTools; @@ -198,7 +198,7 @@ public abstract class ClassChooserPane<T extends Model> extends ChooserPane<T> } private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSubjectChangeListener_()); } private PropertyChangeListener buildSubjectChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java index 6dfe784c0b..6b14c2eb95 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java @@ -20,13 +20,13 @@ import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.window.Window; import org.eclipse.jpt.common.ui.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; import org.eclipse.jpt.common.utility.model.Model; import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent; import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.jpt.common.utility.model.value.ModifiablePropertyValueModel; +import org.eclipse.jpt.common.utility.model.value.PropertyValueModel; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; @@ -98,7 +98,7 @@ public abstract class PackageChooserPane<T extends Model> extends ChooserPane<T> } private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSubjectChangeListener_()); } private PropertyChangeListener buildSubjectChangeListener_() { diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java index fc45a97f5e..3f5884d591 100644 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java +++ b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java @@ -19,7 +19,7 @@ import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jpt.common.ui.WidgetFactory; import org.eclipse.jpt.common.ui.internal.WorkbenchTools; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; +import org.eclipse.jpt.common.ui.internal.listeners.SWTListenerWrapperTools; import org.eclipse.jpt.common.ui.internal.plugin.JptCommonUiPlugin; import org.eclipse.jpt.common.ui.internal.swt.ComboModelAdapter; import org.eclipse.jpt.common.ui.internal.swt.DateTimeModelAdapter; @@ -375,7 +375,7 @@ public abstract class Pane<T extends Model> { } private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); + return SWTListenerWrapperTools.wrap(this.buildSubjectChangeListener_()); } private PropertyChangeListener buildSubjectChangeListener_() { @@ -431,7 +431,7 @@ public abstract class Pane<T extends Model> { } private PropertyChangeListener buildAspectChangeListener() { - return new SWTPropertyChangeListenerWrapper(buildAspectChangeListener_()); + return SWTListenerWrapperTools.wrap(buildAspectChangeListener_()); } private PropertyChangeListener buildAspectChangeListener_() { |