Handle closing Workbench window in Java RCP application

I am writing Eclipse RCP and I want to ask the user whether to back up the database when closing the application. Doing this from the File> Exit menu was simple since I determined the output of the command:

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; }} 

Then I linked this to the Record menu entry, and this work is right. However, the user can also close the application by pressing the "close window" button. Is there any way to catch this event?

I found a suggestion in a previous topic ( see here ) using shutdownHook. However, the thread I want to execute must open a dialog, and as I understand it, this cannot be done by an external thread.

Thanks!

Edit I am adding here the code for shutdownHook that I am using. In the Application class: public class Application implements IApplication {

 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)); } }}); } } } 

The error I get when I try to run:

 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) 

Thanks again.

+6
source share

Source: https://habr.com/ru/post/898651/


All Articles