/******************************************************************************* * Copyright (c) 2011, 2014 Wind River Systems, Inc. and others. All rights reserved. * This program and the accompanying materials are 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.runtime.utils; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.tcf.te.runtime.activator.CoreBundleActivator; import org.eclipse.tcf.te.runtime.callback.Callback; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; import org.eclipse.tcf.te.runtime.interfaces.tracing.ITraceIds; /** * Helper implementation to deal with progress monitors and callbacks. */ public final class ProgressHelper { public static final int PROGRESS_DONE = 0; public static final int PROGRESS_NONE = -1; /** * Checks if there was an error or the operation was canceled. * * @param caller The caller or <code>null</code>. * @param status The status. <code>null</code> if status should not be checked. * @param progress The progress monitor. <code>null</code> if cancel should not be checked. * @param callback The callback to call on cancel or error. * * @return <code>false</code> if everything is OK. */ public static final boolean isCancelOrError(Object caller, IStatus status, IProgressMonitor progress, ICallback callback) { if (status == null) status = Status.OK_STATUS; if (!status.isOK() || (progress != null && progress.isCanceled())) { if (status.getSeverity() == IStatus.CANCEL || (progress != null && progress.isCanceled())) { status = new Status(IStatus.CANCEL, status.getPlugin(), status.getCode(), status.getMessage(), new OperationCanceledException()); } else if (status.getSeverity() == IStatus.ERROR) { Throwable e = status.getException(); try { throw e; } catch (Throwable thrown) { e = thrown; } CoreBundleActivator.getTraceHandler().trace(status.getMessage(), 1, ITraceIds.TRACE_CALLBACKS, status.getSeverity(), caller != null ? caller.getClass() : ProgressHelper.class); status = new Status(IStatus.ERROR, status.getPlugin(), status.getCode(), status.getMessage(), e); } if (callback != null) { if (caller instanceof ICallback) { Callback.copyProperties((ICallback) caller, callback); } callback.done(caller, status); } return true; } return false; } /** * Checks if the operation was canceled. * * @param caller The caller or <code>null</code>. * @param progress The progress monitor. Must not be <code>null</code> * @param callback The callback to call on cancel or error. * * @return <code>false</code> if everything is OK. */ public static final boolean isCancel(Object caller, IProgressMonitor progress, ICallback callback) { Assert.isNotNull(progress); return isCancel(caller, null, progress, callback); } /** * Checks if the operation was canceled. * * @param caller The caller or <code>null</code>. * @param status The status. Must not be <code>null</code>. * @param callback The callback to call on cancel or error. * * @return <code>false</code> if everything is OK. */ public static final boolean isCancel(Object caller, IStatus status, ICallback callback) { Assert.isNotNull(status); return isCancel(caller, status, null, callback); } /** * Checks if the operation was canceled. * * @param caller The caller or <code>null</code>. * @param status The status. <code>null</code> if status should not be checked. * @param progress The progress monitor. <code>null</code> if cancel should not be checked. * @param callback The callback to call on cancel or error. * * @return <code>false</code> if everything is OK. */ public static final boolean isCancel(Object caller, IStatus status, IProgressMonitor progress, ICallback callback) { if (status == null) status = Status.OK_STATUS; if (status.getSeverity() == IStatus.CANCEL || (progress != null && progress.isCanceled())) { status = new Status(IStatus.CANCEL, status.getPlugin(), status.getCode(), status.getMessage(), new OperationCanceledException()); if (callback != null) { if (caller instanceof ICallback) { Callback.copyProperties((ICallback) caller, callback); } callback.done(caller, status); } return true; } return false; } /** * Checks if there was an error. * * @param caller The caller or <code>null</code>. * @param status The status. <code>null</code> if status should not be checked. * @param callback The callback to call on cancel or error. * * @return <code>false</code> if everything is OK. */ public static final boolean isError(Object caller, IStatus status, ICallback callback) { if (status == null) status = Status.OK_STATUS; if (!status.isOK() && status.getSeverity() != IStatus.CANCEL) { if (status.getSeverity() == IStatus.ERROR) { Throwable e = status.getException(); try { throw e; } catch (Throwable thrown) { e = thrown; } CoreBundleActivator .getTraceHandler() .trace(status.getMessage(), 1, ITraceIds.TRACE_CALLBACKS, status.getSeverity(), caller != null ? caller .getClass() : ProgressHelper.class); status = new Status(IStatus.ERROR, status.getPlugin(), status.getCode(), status.getMessage(), e); } if (callback != null) { if (caller instanceof ICallback) { Callback.copyProperties((ICallback) caller, callback); } callback.done(caller, status); } return true; } return false; } /** * Wraps the given progress monitor into a {@link SubProgressMonitor}. If the given monitor is * <code>null</code>, a {@link NullProgressMonitor} is returned. * * @param progress The global progress monitor or <code>null</code>. * @param ticksToUse The ticks to use. * * @return The progress monitor to use. */ public static final IProgressMonitor getProgressMonitor(IProgressMonitor progress, int ticksToUse) { if (progress != null) { progress = new SubProgressMonitor(progress, ticksToUse, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK); } else { progress = new NullProgressMonitor(); } return progress; } /** * Start a task. * * @param progress The progress monitor or <code>null</code>. * @param name The name (label) of the task. * @param ticks The ticks for this task. */ public static final void beginTask(IProgressMonitor progress, String name, int ticks) { if (progress != null) { progress.beginTask("", ticks); //$NON-NLS-1$ progress.setTaskName(name); } } /** * Set a new task name. * * @param progress The progress monitor or <code>null</code>. * @param taskName The name (label) of the task. */ public static final void setTaskName(IProgressMonitor progress, String taskName) { if (progress != null) { progress.setTaskName(taskName); } } /** * Set a new sub task name. * * @param progress The progress monitor or <code>null</code>. * @param subTask The name (label) of the sub task. */ public static final void setSubTaskName(IProgressMonitor progress, String subTaskName) { if (progress != null) { progress.subTask(subTaskName); } } /** * Add the given amount of worked steps to the progress monitor. * <p> * If the given amount of worked steps is less or equal than 0, the method will do nothing. * * @param progress The progress monitor or <code>null</code>. * @param worked The amount of worked steps. */ public static final void worked(IProgressMonitor progress, int worked) { if (progress != null && !progress.isCanceled() && worked > 0) { progress.worked(worked); } } /** * Set the progress monitor done. * * @param progress The progress monitor or <code>null</code>. */ public static final void done(IProgressMonitor progress) { if (progress != null) { progress.setTaskName(""); //$NON-NLS-1$ progress.subTask(""); //$NON-NLS-1$ progress.done(); } } /** * Set the progress monitor canceled. * * @param progress The progress monitor or <code>null</code>. */ public static final void cancel(IProgressMonitor progress) { if (progress != null && !progress.isCanceled()) { progress.setCanceled(true); } } /** * Get the canceled state of the progress monitor. * * @param progress The progress monitor or <code>null</code>. * * @return <code>True</code> if the progress monitor is not <code>null</code> and if the * progress monitor is canceled. */ public static final boolean isCanceled(IProgressMonitor progress) { if (progress != null) { return progress.isCanceled(); } return false; } }