public static void handleUnsavedChanges( final int saveAction, String caption, final SourceShim sourceShim, final WorkbenchContext workbenchContext, final UnsavedChangesTarget globalEnvTarget, final QuitContext quitContext) { // see what the unsaved changes situation is and prompt accordingly ArrayList<UnsavedChangesTarget> unsavedSourceDocs = sourceShim.getUnsavedChanges(); // no unsaved changes at all if (saveAction != SaveAction.SAVEASK && unsavedSourceDocs.size() == 0) { // define quit operation final Operation quitOperation = new Operation() { public void execute() { quitContext.onReadyToQuit(saveAction == SaveAction.SAVE); } }; // if this is a quit session then we always prompt if (isQuitSession()) { RStudioGinjector.INSTANCE .getGlobalDisplay() .showYesNoMessage( MessageDialog.QUESTION, caption, "Are you sure you want to quit the R session?", quitOperation, true); } else { quitOperation.execute(); } return; } // just an unsaved environment if (unsavedSourceDocs.size() == 0 && workbenchContext != null) { // confirm quit and do it String prompt = "Save workspace image to " + workbenchContext.getREnvironmentPath() + "?"; RStudioGinjector.INSTANCE .getGlobalDisplay() .showYesNoMessage( GlobalDisplay.MSG_QUESTION, caption, prompt, true, new Operation() { public void execute() { quitContext.onReadyToQuit(true); } }, new Operation() { public void execute() { quitContext.onReadyToQuit(false); } }, new Operation() { public void execute() {} }, "Save", "Don't Save", true); } // a single unsaved document (can be any document in desktop mode, but // must be from the main window in web mode) else if (saveAction != SaveAction.SAVEASK && unsavedSourceDocs.size() == 1 && (Desktop.isDesktop() || !(unsavedSourceDocs.get(0) instanceof UnsavedChangesItem))) { sourceShim.saveWithPrompt( unsavedSourceDocs.get(0), sourceShim.revertUnsavedChangesBeforeExitCommand( new Command() { @Override public void execute() { quitContext.onReadyToQuit(saveAction == SaveAction.SAVE); } }), null); } // multiple save targets else { ArrayList<UnsavedChangesTarget> unsaved = new ArrayList<UnsavedChangesTarget>(); if (saveAction == SaveAction.SAVEASK && globalEnvTarget != null) unsaved.add(globalEnvTarget); unsaved.addAll(unsavedSourceDocs); new UnsavedChangesDialog( caption, unsaved, new OperationWithInput<UnsavedChangesDialog.Result>() { @Override public void execute(Result result) { ArrayList<UnsavedChangesTarget> saveTargets = result.getSaveTargets(); // remote global env target from list (if specified) and // compute the saveChanges value boolean saveGlobalEnv = saveAction == SaveAction.SAVE; if (saveAction == SaveAction.SAVEASK && globalEnvTarget != null) saveGlobalEnv = saveTargets.remove(globalEnvTarget); final boolean saveChanges = saveGlobalEnv; // save specified documents and then quit sourceShim.handleUnsavedChangesBeforeExit( saveTargets, new Command() { @Override public void execute() { quitContext.onReadyToQuit(saveChanges); } }); } }, // no cancel operation null) .showModal(); } }