Package org.rssowl.ui.internal.util

Source Code of org.rssowl.ui.internal.util.JobRunner

/*   **********************************************************************  **
**   Copyright notice                                                       **
**                                                                          **
**   (c) 2005-2006 RSSOwl Development Team                                  **
**   http://www.rssowl.org/                                                 **
**                                                                          **
**   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.rssowl.org/legal/epl-v10.html                               **
**                                                                          **
**   A copy is found in the file epl-v10.html and important notices to the  **
**   license from the team is found in the textfile LICENSE.txt distributed **
**   in this package.                                                       **
**                                                                          **
**   This copyright notice MUST APPEAR in all copies of the file!           **
**                                                                          **
**   Contributors:                                                          **
**     RSSOwl Development Team - initial API and implementation             **
**                                                                          **
**  **********************************************************************  */

package org.rssowl.ui.internal.util;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.progress.UIJob;

import java.util.concurrent.atomic.AtomicBoolean;

/**
* @author bpasero
*/
public class JobRunner {

  /* Copied from BusyIndicator */
  private static int nextBusyId = 1;
  private static final String BUSYID_NAME = "SWT BusyIndicator"; //$NON-NLS-1$

  /* Default Delay */
  private static final int DELAY = 800;

  /**
   * @param runnable
   * @param widget
   */
  public static void runInUIThread(final Widget widget, final Runnable runnable) {
    runInUIThread(0, widget, runnable);
  }

  /**
   * @param runnable
   * @param widget
   */
  public static void runDelayedInUIThread(final Widget widget, final Runnable runnable) {
    runInUIThread(DELAY, widget, runnable);
  }

  /**
   * @param delay
   * @param runnable
   * @param widget
   */
  public static void runInUIThread(int delay, final Widget widget, final Runnable runnable) {
    Assert.isNotNull(runnable);
    UIJob uiJob = new UIJob("UIJob Runner") { //$NON-NLS-1$
      @Override
      public IStatus runInUIThread(IProgressMonitor monitor) {
        if (widget == null || !widget.isDisposed())
          runnable.run();
        return Status.OK_STATUS;
      }
    };

    uiJob.setSystem(true);
    uiJob.setUser(false);
    uiJob.schedule(delay);
  }

  /**
   * @param runnable
   * @param widget
   */
  public static void runSyncedInUIThread(final Widget widget, final Runnable runnable) {
    Assert.isNotNull(runnable);
    Assert.isNotNull(widget);

    if (!widget.isDisposed()) {
      widget.getDisplay().syncExec(new Runnable() {
        public void run() {
          if (!widget.isDisposed())
            runnable.run();
        }
      });
    }
  }

  /**
   * @param runnable
   */
  public static void runInBackgroundThread(final Runnable runnable) {
    runInBackgroundThread(0, runnable);
  }

  /**
   * @param runnable
   */
  public static void runDelayedInBackgroundThread(final Runnable runnable) {
    runInBackgroundThread(DELAY, runnable);
  }

  /**
   * @param delay
   * @param runnable
   */
  public static void runInBackgroundThread(int delay, final Runnable runnable) {
    Assert.isNotNull(runnable);
    Job job = new Job("Job Runner") { //$NON-NLS-1$
      @Override
      public IStatus run(IProgressMonitor monitor) {
        runnable.run();
        return Status.OK_STATUS;
      }
    };

    job.setSystem(true);
    job.setUser(false);
    job.schedule(delay);
  }

  /**
   * @param job
   */
  public static void runUIUpdater(UIBackgroundJob job) {
    Assert.isNotNull(job);
    job.setSystem(true);
    job.setUser(false);
    job.schedule();
  }

  /**
   * @param runnable
   */
  public static void runInBackgroundWithBusyIndicator(final Runnable runnable) {
    final Display display = Display.getCurrent();
    final Integer busyId = Integer.valueOf(nextBusyId++);

    /* Guard against Illegal-Thread-Access */
    if (display == null)
      throw new IllegalStateException("Method was not called from the UI-Thread!");

    /* Set the Cursor */
    Cursor cursor = display.getSystemCursor(SWT.CURSOR_APPSTARTING);
    Shell[] shells = display.getShells();
    for (Shell shell : shells) {
      Integer id = (Integer) shell.getData(BUSYID_NAME);
      if (id == null) {
        shell.setCursor(cursor);
        shell.setData(BUSYID_NAME, busyId);
      }
    }

    /* Run the Runnable and update cursor afterwards */
    runUIUpdater(new UIBackgroundJob(null) {

      @Override
      protected void runInBackground(IProgressMonitor monitor) {
        runnable.run();
      }

      @Override
      protected void runInUI(IProgressMonitor monitor) {
        if (!display.isDisposed()) {
          Shell[] shells = display.getShells();
          for (Shell shell : shells) {
            Integer id = (Integer) shell.getData(BUSYID_NAME);
            if (busyId.equals(id)) {
              shell.setCursor(null);
              shell.setData(BUSYID_NAME, null);
            }
          }
        }
      }
    });
  }

  /**
   * @param delay
   * @param flag
   */
  public static void runDelayedFlagInversion(int delay, final AtomicBoolean flag) {
    flag.set(!flag.get());
    runInBackgroundThread(delay, new Runnable() {
      public void run() {
        flag.set(!flag.get());
      }
    });
  }
}
TOP

Related Classes of org.rssowl.ui.internal.util.JobRunner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.