X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.eclipse.swt.win32.win32.x86_64%2Fsrc%2Forg%2Feclipse%2Fswt%2Fcustom%2FBusyIndicator.java;fp=bundles%2Forg.eclipse.swt.win32.win32.x86_64%2Fsrc%2Forg%2Feclipse%2Fswt%2Fcustom%2FBusyIndicator.java;h=c100fb7500b845e70529365844b1e9daae45e0b2;hb=6b98970d0458754dd67f789afbd0a39e1e7ac6eb;hp=0000000000000000000000000000000000000000;hpb=56a61575ce0d27b340cb12438c8a7f303842095e;p=simantics%2Fplatform.git diff --git a/bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/custom/BusyIndicator.java b/bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/custom/BusyIndicator.java new file mode 100644 index 000000000..c100fb750 --- /dev/null +++ b/bundles/org.eclipse.swt.win32.win32.x86_64/src/org/eclipse/swt/custom/BusyIndicator.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2000, 2011 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.custom; + + +import org.eclipse.swt.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.widgets.*; + +/** + * Support for showing a Busy Cursor during a long running process. + * + * @see BusyIndicator snippets + * @see Sample code and further information + */ +public class BusyIndicator { + + static int nextBusyId = 1; + static final String BUSYID_NAME = "SWT BusyIndicator"; //$NON-NLS-1$ + static final String BUSY_CURSOR = "SWT BusyIndicator Cursor"; //$NON-NLS-1$ + + /** + * Runs the given Runnable 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 + */ + + public static void showWhile(Display display, Runnable runnable) { + if (runnable == null) + SWT.error(SWT.ERROR_NULL_ARGUMENT); + if (display == null) { + 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 (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 (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); + } + } +}