Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Loskutov2018-07-28 22:09:51 +0000
committerAndrey Loskutov2018-07-28 22:09:51 +0000
commit575cefefcb59507538ad44f6a3bec859d874c40b (patch)
treeb263ce401c5191a23d78627b01332ba15aa3477c
parent7f884af923d9c594f88d65605f1bb372d59549e8 (diff)
downloadeclipse.platform.swt-575cefefcb59507538ad44f6a3bec859d874c40b.tar.gz
eclipse.platform.swt-575cefefcb59507538ad44f6a3bec859d874c40b.tar.xz
eclipse.platform.swt-575cefefcb59507538ad44f6a3bec859d874c40b.zip
Bug 532632 - added guard for disposed shell in BusyIndicator
This is a paranoia check, see comment 20 for an attempt to explain it. Change-Id: I573410c898470bc725ea820252b4da36ac4bc092 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java96
1 files changed, 53 insertions, 43 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java
index ba5b7a3d52..7fbacc48af 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java
@@ -27,56 +27,66 @@ public class BusyIndicator {
static final String BUSYID_NAME = "SWT BusyIndicator"; //$NON-NLS-1$
static final String BUSY_CURSOR = "SWT BusyIndicator Cursor"; //$NON-NLS-1$
-/**
- * Runs the given <code>Runnable</code> while providing
- * busy feedback using this busy indicator.
- *
- * @param display the display on which the busy feedback should be
- * displayed. If the display is null, the Display for the current
- * thread will be used. If there is no Display for the current thread,
- * the runnable code will be executed and no busy feedback will be displayed.
- * @param runnable the runnable for which busy feedback is to be shown.
- * Must not be null.
- *
-* @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
- * </ul>
- */
+ /**
+ * Runs the given <code>Runnable</code> while providing
+ * busy feedback using this busy indicator.
+ *
+ * @param display the display on which the busy feedback should be
+ * displayed. If the display is null, the Display for the current
+ * thread will be used. If there is no Display for the current thread,
+ * the runnable code will be executed and no busy feedback will be displayed.
+ * @param runnable the runnable for which busy feedback is to be shown.
+ * Must not be null.
+ *
+ * @exception IllegalArgumentException <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
+ * </ul>
+ */
-public static void showWhile(Display display, Runnable runnable) {
- if (runnable == null)
- SWT.error(SWT.ERROR_NULL_ARGUMENT);
- if (display == null) {
- display = Display.getCurrent();
+ public static void showWhile(Display display, Runnable runnable) {
+ if (runnable == null)
+ SWT.error(SWT.ERROR_NULL_ARGUMENT);
if (display == null) {
- runnable.run();
- return;
+ display = Display.getCurrent();
+ if (display == null) {
+ runnable.run();
+ return;
+ }
}
- }
- Integer busyId = Integer.valueOf(nextBusyId);
- nextBusyId++;
- Cursor cursor = display.getSystemCursor(SWT.CURSOR_WAIT);
- Shell[] shells = display.getShells();
- for (int i = 0; i < shells.length; i++) {
- Integer id = (Integer)shells[i].getData(BUSYID_NAME);
- if (id == null) {
- shells[i].setCursor(cursor);
- shells[i].setData(BUSYID_NAME, busyId);
+ Integer busyId = Integer.valueOf(nextBusyId);
+ nextBusyId++;
+ Cursor cursor = display.getSystemCursor(SWT.CURSOR_WAIT);
+ Shell[] shells = display.getShells();
+ for (Shell shell : shells) {
+ Integer id = (Integer)shell.getData(BUSYID_NAME);
+ if (id == null) {
+ setCursorAndId(shell, cursor, busyId);
+ }
}
- }
- try {
- runnable.run();
- } finally {
- shells = display.getShells();
- for (int i = 0; i < shells.length; i++) {
- Integer id = (Integer)shells[i].getData(BUSYID_NAME);
- if (id == busyId) {
- shells[i].setCursor(null);
- shells[i].setData(BUSYID_NAME, null);
+ try {
+ runnable.run();
+ } finally {
+ shells = display.getShells();
+ for (Shell shell : shells) {
+ Integer id = (Integer)shell.getData(BUSYID_NAME);
+ if (id == busyId) {
+ setCursorAndId(shell, null, null);
+ }
}
}
}
-}
+
+ /**
+ * Paranoia code to make sure we don't break UI because of one shell disposed, see bug 532632 comment 20
+ */
+ private static void setCursorAndId(Shell shell, Cursor cursor, Integer busyId) {
+ if (!shell.isDisposed()) {
+ shell.setCursor(cursor);
+ }
+ if (!shell.isDisposed()) {
+ shell.setData(BUSYID_NAME, busyId);
+ }
+ }
}

Back to the top