@Override
  public void run(boolean fork, boolean cancelable, final IRunnableWithProgress request)
      throws InvocationTargetException, InterruptedException {
    if (headless && Display.getCurrent() == null) {
      PlatformGIS.run(request);
      return;
    }

    if (getProgressMonitor() instanceof ProgressMonitorPart) {
      ProgressMonitorPart part = (ProgressMonitorPart) getProgressMonitor();
      if (Display.getCurrent() != null) part.setVisible(true);

      try {
        setEnablement(buttonBar, false);
        if (fork) {
          PlatformGIS.run(request, part);
        } else {
          PlatformGIS.runBlockingOperation(request, part);
        }
      } finally {
        setEnablement(buttonBar, true);
        if (Display.getCurrent() != null && !part.isDisposed()) part.setVisible(false);
      }
    } else {
      if (fork) {
        PlatformGIS.run(request);
      } else {
        PlatformGIS.runBlockingOperation(request, ProgressManager.instance().get());
      }
    }
  }