title: Handle the closing of the workbench window in Java RCP application
body: <p>I'm writing an Eclipse RCP and I want to ask the user whether to backup the database when the application is closed. Doing it from the File>Exit menu was easy as I defined a command exit:</p>
  
  <pre><code>public class ExitCommand extends AbstractHandler implements IHandler {
  
  @Override
  public Object execute(ExecutionEvent event) throws ExecutionException {
      final IWorkbench workbench = PlatformUI.getWorkbench();
      if (workbench == null)
          return null;
  
      // Ask whether the user wants to back up the information
      Shell shell = new Shell(workbench.getDisplay());
      MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION
              | SWT.YES | SWT.NO);
      messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)");
      messageBox.setText("On Exit Backup");
      int response = messageBox.open();
      if (response == SWT.YES){
          new BackupDataBaseAction(shell);
      }
  
      final Display display = workbench.getDisplay();
      display.syncExec(new Runnable() {
          public void run() {
              if (!display.isDisposed())
                  workbench.close();
          }
      });
      return null;
  }}
  </code></pre>
  
  <p>I then linked this to a menu entry called Exit and this work right. However the user could close the application also by pressing the "close window" button. Is there any way of catching this event?</p>
  
  <p>I found a suggestion in a previous topic (<a href="https://stackoverflow.com/questions/750026/how-to-handle-a-closing-application-event-in-java">see here</a>) using a shutdownHook. However the thread that I want execute has to open a dialog and, as I understand, this cannot be done by an external thread.</p>
  
  <p>Thank you!</p>
  
  <p><strong>Edit</strong>
  I add here the code for the shutdownHook I'm using. In the Application class:
  public class Application implements IApplication {</p>
  
  <pre><code>final double NIDAQmxPortingVersionDependency = 1.001;
  
  public final static String PLUGIN_ID = "CatsysPD";
  private static Logger logger = Logger.getLogger(Application.class
          .toString());
  
  /*
   * (non-Javadoc)
   * 
   * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.
   * IApplicationContext)
   */
  public Object start(IApplicationContext context) {
      logger.info("Starting the application");
      Display display = PlatformUI.createDisplay();
      systemCheck(display);
      initializeApplication(display);
      try {
          int returnCode = PlatformUI.createAndRunWorkbench(display,
                  new ApplicationWorkbenchAdvisor());
          if (returnCode == PlatformUI.RETURN_RESTART) {
              return IApplication.EXIT_RESTART;
          }
          BackupOnExitHook backupOnExitHook = new BackupOnExitHook(PlatformUI.getWorkbench().getDisplay());
          Runtime.getRuntime().addShutdownHook(backupOnExitHook);
          return IApplication.EXIT_OK;
      } finally {
          display.dispose();
      }
  }
  
  private void systemCheck(Display display) {...}
  
  public void stop() {...}
  
  public void initializeApplication(Display display) {...}
  
  private class BackupOnExitHook extends Thread {
  
      private Display display;
  
      public BackupOnExitHook(Display display){
          this.display = display;
      }
  
      @Override
      public void run(){
          display.syncExec(new Runnable(){
  
              @Override
              public void run() {
                  MessageBox messageBox = new MessageBox(new Shell(display), SWT.ICON_QUESTION
                          | SWT.YES | SWT.NO);
                  messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)");
                  messageBox.setText("On Exit Backup");
                  int response = messageBox.open();
                  if (response == SWT.YES){
                      new BackupDataBaseAction(new Shell(display));
                  }
              }});
  
  
      }
  
  }
  }
  </code></pre>
  
  <p>The error I get when I try to run it is:</p>
  
  <pre><code>Exception in thread "Thread-5" org.eclipse.swt.SWTException: Device is disposed
  at org.eclipse.swt.SWT.error(SWT.java:4083)
  at org.eclipse.swt.SWT.error(SWT.java:3998)
  at org.eclipse.swt.SWT.error(SWT.java:3969)
  at org.eclipse.swt.widgets.Display.error(Display.java:1249)
  at org.eclipse.swt.widgets.Display.syncExec(Display.java:4581)
  at dk.catsys.pd.Application$BackupOnExitHook.run(Application.java:128)
  </code></pre>
  
  <p>Thanks again.</p>