| /******************************************************************************* |
| * Copyright (c) 2009, 2010 Tasktop Technologies and others. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * https://www.eclipse.org/legal/epl-2.0 |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.discovery.ui.util; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * @author David Green |
| * @author Steffen Pingel much of this is copied from TasksUiInternal |
| */ |
| public abstract class DiscoveryUiUtil { |
| private DiscoveryUiUtil() { |
| } |
| |
| /** |
| * Utility method to get the best parenting possible for a dialog. If there is a modal shell create it so as to |
| * avoid two modal dialogs. If not then return the shell of the active workbench window. If neither can be found |
| * return null. |
| * <p> |
| * <b>Note: Applied from patch on bug 99472.</b> |
| * |
| * @return Shell or <code>null</code> |
| */ |
| public static Shell getShell() { |
| if (!PlatformUI.isWorkbenchRunning() || PlatformUI.getWorkbench().isClosing()) { |
| return null; |
| } |
| Shell modal = getModalShellExcluding(null); |
| if (modal != null) { |
| return modal; |
| } |
| return getNonModalShell(); |
| } |
| |
| /** |
| * Get the active non modal shell. If there isn't one return null. |
| * <p> |
| * <b>Note: Applied from patch on bug 99472.</b> |
| * |
| * @return Shell |
| */ |
| public static Shell getNonModalShell() { |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| if (windows.length > 0) { |
| return windows[0].getShell(); |
| } |
| } else { |
| return window.getShell(); |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Return the modal shell that is currently open. If there isn't one then return null. |
| * <p> |
| * <b>Note: Applied from patch on bug 99472.</b> |
| * |
| * @param shell |
| * A shell to exclude from the search. May be <code>null</code>. |
| * @return Shell or <code>null</code>. |
| */ |
| public static Shell getModalShellExcluding(Shell shell) { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| Shell[] shells = workbench.getDisplay().getShells(); |
| int modal = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL; |
| for (Shell shell2 : shells) { |
| if (shell2.equals(shell)) { |
| break; |
| } |
| // Do not worry about shells that will not block the user. |
| if (shell2.isVisible()) { |
| int style = shell2.getStyle(); |
| if ((style & modal) != 0) { |
| return shell2; |
| } |
| } |
| } |
| return null; |
| } |
| } |