diff options
author | Andrey Loskutov | 2018-07-28 22:09:51 +0000 |
---|---|---|
committer | Andrey Loskutov | 2018-07-28 22:09:51 +0000 |
commit | 575cefefcb59507538ad44f6a3bec859d874c40b (patch) | |
tree | b263ce401c5191a23d78627b01332ba15aa3477c | |
parent | 7f884af923d9c594f88d65605f1bb372d59549e8 (diff) | |
download | eclipse.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.java | 96 |
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); + } + } } |