/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.wizards.special; import java.lang.reflect.InvocationTargetException; import java.util.*; import org.eclipse.core.runtime.*; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.operation.*; import org.eclipse.jface.wizard.ProgressMonitorPart; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; public class ProgressPart implements IRunnableContext { DefaultSpecialWizard wizard = null; Shell shell = null; // The progress monitor private ProgressMonitorPart progressMonitorPart; private boolean lockedUI = false; private long activeRunningOperations = 0; private static final String FOCUS_CONTROL = "focusControl"; //$NON-NLS-1$ public ProgressPart(Shell shell, DefaultSpecialWizard wizard) { this.shell = shell; this.wizard = wizard; } Shell getShell() { return shell; } protected void createProgressMonitorPart(Composite composite) { GridLayout pmlayout = new GridLayout(); pmlayout.numColumns = 1; progressMonitorPart = createProgressMonitorPart(composite, pmlayout); progressMonitorPart.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); //// progressMonitorPart.setVisible(false); } private Map<Object,Object> aboutToStart(boolean enableCancelButton) { Map<Object,Object> savedState = null; if (getShell() != null) { Control focusControl = getShell().getDisplay().getFocusControl(); if (focusControl != null && focusControl.getShell() != getShell()) { focusControl = null; } setWaitCursor(); savedState = saveUIState(true && enableCancelButton); saveFocus(savedState, focusControl); } return savedState; } private void setWaitCursor() { setDisplayCursor(getShell().getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); } private void saveFocus(Map<Object,Object> state, Control focusControl) { if (focusControl != null) { state.put(FOCUS_CONTROL, focusControl); } } private void setDisplayCursor(Cursor c) { Shell[] shells = getShell().getDisplay().getShells(); for (int i = 0; i < shells.length; i++) shells[i].setCursor(c); } private Map<Object,Object> saveUIState(boolean keepCancelEnabled) { Map<Object,Object> savedState = new HashMap<Object,Object>(10); // saveEnableStateAndSet(backButton, savedState, "back", false); //$NON-NLS-1$ // saveEnableStateAndSet(nextButton, savedState, "next", false); //$NON-NLS-1$ // saveEnableStateAndSet(finishButton, savedState, "finish", false); //$NON-NLS-1$ // saveEnableStateAndSet(cancelButton, savedState, // "cancel", keepCancelEnabled); //$NON-NLS-1$ // saveEnableStateAndSet(helpButton, savedState, "help", false); //$NON-NLS-1$ // if (currentPage != null) // savedState.put("page", ControlEnableState.disable(currentPage.getControl())); //$NON-NLS-1$ return savedState; } protected ProgressMonitorPart createProgressMonitorPart( Composite composite, GridLayout pmlayout) { return new ProgressMonitorPart(composite, pmlayout, SWT.DEFAULT) { String currentTask = null; public void setBlocked(IStatus reason) { super.setBlocked(reason); if (!lockedUI)//Do not show blocked if we are locking the UI Dialog.getBlockedHandler().showBlocked(getShell(), this, reason, currentTask); } public void clearBlocked() { super.clearBlocked(); if (!lockedUI)//Do not vlear if we never set it Dialog.getBlockedHandler().clearBlocked(); } public void beginTask(String name, int totalWork) { super.beginTask(name, totalWork); currentTask = name; } public void setTaskName(String name) { super.setTaskName(name); currentTask = name; } public void subTask(String name) { super.subTask(name); //If we haven't got anything yet use this value for more context if (currentTask == null) currentTask = name; } }; } public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { // The operation can only be canceled if it is executed in a separate thread. // Otherwise the UI is blocked anyway. Map<Object,Object> state = null; if (activeRunningOperations == 0) state = aboutToStart(fork && cancelable); activeRunningOperations++; try { if (!fork)//If we are not forking do not open other dialogs lockedUI = true; ModalContext.run(runnable, fork, getProgressMonitor(), getShell() .getDisplay()); lockedUI = false; } finally { activeRunningOperations--; //Stop if this is the last one if (state != null) stopped(state); } } protected IProgressMonitor getProgressMonitor() { return progressMonitorPart; } private void stopped(Map<Object,Object> savedState) { if (getShell() != null) { if (wizard.needsProgressMonitor()) { //// progressMonitorPart.setVisible(false); ////progressMonitorPart.removeFromCancelComponent(cancelButton); } ////restoreUIState(state); ////cancelButton.addSelectionListener(cancelListener); setDisplayCursor(null); ////cancelButton.setCursor(null); Control focusControl = (Control) savedState.get(FOCUS_CONTROL); if (focusControl != null) focusControl.setFocus(); } } public void dispose() { if(progressMonitorPart != null) { progressMonitorPart.dispose(); progressMonitorPart = null; } } }