Fixed: [Issue 5] Terminal should warn when being closed
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/GeneralPreferences.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/GeneralPreferences.java
index 124f882..4e70760 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/GeneralPreferences.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/GeneralPreferences.java
@@ -23,5 +23,13 @@
return preferenceStore().getBoolean(CLOSE_VIEW_ON_EXIT);
}
+ public static boolean warnOnClose() {
+ return preferenceStore().getBoolean(WARN_ON_CLOSE);
+ }
+
+ public static void warnOnClose(boolean newValue) {
+ preferenceStore().setValue(WARN_ON_CLOSE, newValue);
+ }
+
private GeneralPreferences() {}
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.java
index b052984..63d42a9 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.java
@@ -28,6 +28,7 @@
public static String unableToLoadPreviewContent;
public static String useCustomFont;
public static String useTextFont;
+ public static String warnOnClose;
static {
Class<Messages> type = Messages.class;
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.properties b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.properties
index 9696700..ce8b911 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.properties
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/Messages.properties
@@ -12,4 +12,5 @@
unableToLoadPreviewContent=Unable to load preview content
useCustomFont=Use custom font
useTextFont=Use Eclipse's "Text Font"
+warnOnClose=Warn on close
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceInitializer.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceInitializer.java
index d598e9a..74dd573 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceInitializer.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceInitializer.java
@@ -23,6 +23,7 @@
@Override public void initializeDefaultPreferences() {
preferenceStore().setDefault(BUFFER_LINE_COUNT, 1000);
preferenceStore().setDefault(CLOSE_VIEW_ON_EXIT, true);
+ preferenceStore().setDefault(WARN_ON_CLOSE, true);
setDefault(BACKGROUND_COLOR, new RGB(0, 0, 0));
setDefault(FOREGROUND_COLOR, new RGB(229, 229, 229));
preferenceStore().setDefault(USE_CUSTOM_FONT, false);
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceNames.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceNames.java
index 4dea3b0..7983517 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceNames.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/PreferenceNames.java
@@ -14,6 +14,7 @@
final class PreferenceNames {
static final String BUFFER_LINE_COUNT = "bufferLineCount";
static final String CLOSE_VIEW_ON_EXIT = "exitViewOnExit";
+ static final String WARN_ON_CLOSE = "warnOnClose";
static final String BACKGROUND_COLOR = "backgroundColor";
static final String FOREGROUND_COLOR = "foregroundColor";
static final String USE_CUSTOM_FONT = "useCustomFont";
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/RootPreferencePage.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/RootPreferencePage.java
index 95f057a..b386521 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/RootPreferencePage.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/RootPreferencePage.java
@@ -29,8 +29,9 @@
private static final String INVALID_BUFFER_LINE_COUNT_MESSAGE =
NLS.bind(invalidBufferLineCount, MINIMUM_BUFFER_LINE_COUNT, MAXIMUM_BUFFER_LINE_COUNT);
- private Button btnCloseViewOnExit;
private Text txtBufferLineCount;
+ private Button btnCloseViewOnExit;
+ private Button btnWarnOnClose;
private int newBufferLineCount;
@@ -75,6 +76,10 @@
btnCloseViewOnExit.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
btnCloseViewOnExit.setText(closeViewOnExit);
+ btnWarnOnClose = new Button(contents, SWT.CHECK);
+ btnWarnOnClose.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+ btnWarnOnClose.setText(warnOnClose);
+
updateContents();
return contents;
}
@@ -85,17 +90,21 @@
}
private void updateContents() {
- btnCloseViewOnExit.setSelection(getPreferenceStore().getBoolean(CLOSE_VIEW_ON_EXIT));
txtBufferLineCount.setText(getPreferenceStore().getString(BUFFER_LINE_COUNT));
+ btnCloseViewOnExit.setSelection(getPreferenceStore().getBoolean(CLOSE_VIEW_ON_EXIT));
+ btnWarnOnClose.setSelection(getPreferenceStore().getBoolean(WARN_ON_CLOSE));
}
@Override public boolean performOk() {
getPreferenceStore().setValue(BUFFER_LINE_COUNT, newBufferLineCount);
getPreferenceStore().setValue(CLOSE_VIEW_ON_EXIT, btnCloseViewOnExit.getSelection());
+ getPreferenceStore().setValue(WARN_ON_CLOSE, btnWarnOnClose.getSelection());
return true;
}
@Override protected void performDefaults() {
+ txtBufferLineCount.setText(getPreferenceStore().getDefaultString(BUFFER_LINE_COUNT));
btnCloseViewOnExit.setSelection(getPreferenceStore().getDefaultBoolean(CLOSE_VIEW_ON_EXIT));
+ btnWarnOnClose.setSelection(getPreferenceStore().getDefaultBoolean(WARN_ON_CLOSE));
}
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.java
index 1fbc4cc..96db96b 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.java
@@ -14,6 +14,9 @@
* @author alruiz@google.com (Alex Ruiz)
*/
public class Messages extends NLS {
+ public static String alwaysCloseWithoutWarn;
+ public static String closeTerminalQuestion;
+ public static String confirmCloseDialogTitle;
public static String defaultViewTitle;
public static String newLocalTerminal;
public static String scrollLock;
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.properties b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.properties
index 0a447fb..a5c0377 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.properties
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/Messages.properties
@@ -1,3 +1,6 @@
+alwaysCloseWithoutWarn=Always close without warn
+closeTerminalQuestion=Close terminal?
+confirmCloseDialogTitle=Confirm Close
defaultViewTitle=Local Terminal
newLocalTerminal=New Local Terminal
scrollLock=Scroll Lock
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalView.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalView.java
index e1da3b4..e361343 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalView.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalView.java
@@ -40,7 +40,7 @@
/**
* @author alruiz@google.com (Alex Ruiz)
*/
-public class TerminalView extends ViewPart {
+public class TerminalView extends ViewPart implements ISaveablePart2 {
private static final String SCROLL_LOCK_ENABLED = "scrollLock";
private static final String TITLE_STATE_TYPE = "title";
private static final String WORKING_DIRECTORY_STATE_TYPE = "workingDirectory";
@@ -56,6 +56,9 @@
private Action newTerminalAction;
private Action scrollLockAction;
+ private boolean checkCanBeClosed;
+ private boolean forceClose;
+
public static void openTerminalView(IPath workingDirectory) {
openTerminalView(null, workingDirectory);
}
@@ -150,6 +153,7 @@
private void closeViewOnExitIfPossible() {
if (closeViewOnExit() && terminalWidget != null && !terminalWidget.isDisposed()) {
// must run in UI thread.
+ forceClose = true;
terminalWidget.getDisplay().asyncExec(new Runnable() {
@Override public void run() {
IWorkbenchPartSite site = getSite();
@@ -274,4 +278,38 @@
enableScrollLockAndUpdateAction(newValue);
}
}
+
+ @Override public boolean isDirty() {
+ if (checkCanBeClosed) {
+ checkCanBeClosed = false;
+ return true;
+ }
+ return false;
+ }
+
+ @Override public boolean isSaveOnCloseNeeded() {
+ if (forceClose) {
+ return false;
+ }
+ checkCanBeClosed = true;
+ return true;
+ }
+
+ @Override public int promptToSaveOnClose() {
+ if (warnOnClose()) {
+ boolean close = WarnOnCloseDialog.open(terminalWidget.getShell());
+ if (!close) {
+ return CANCEL;
+ }
+ }
+ return NO;
+ }
+
+ @Override public void doSave(IProgressMonitor monitor) {}
+
+ @Override public void doSaveAs() {}
+
+ @Override public boolean isSaveAsAllowed() {
+ return false;
+ }
}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/WarnOnCloseDialog.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/WarnOnCloseDialog.java
new file mode 100644
index 0000000..e6261b7
--- /dev/null
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/WarnOnCloseDialog.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * 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.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.terminal.local.ui.view;
+
+import static com.google.eclipse.terminal.local.ui.preferences.GeneralPreferences.warnOnClose;
+import static com.google.eclipse.terminal.local.ui.view.Messages.*;
+import static org.eclipse.jface.dialogs.IDialogConstants.*;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class WarnOnCloseDialog extends MessageDialog {
+ private static final String[] BUTTON_LABELS = { YES_LABEL, NO_LABEL };
+
+ private Button btnCloseWithoutWarn;
+
+ static boolean open(Shell parent) {
+ WarnOnCloseDialog dialog = new WarnOnCloseDialog(parent);
+ return dialog.open() == OK;
+ }
+
+ private WarnOnCloseDialog(Shell parentShell) {
+ super(parentShell, confirmCloseDialogTitle, null, closeTerminalQuestion, QUESTION, BUTTON_LABELS, 0);
+ }
+
+ @Override protected Control createCustomArea(Composite parent) {
+ btnCloseWithoutWarn = new Button(parent, SWT.CHECK);
+ btnCloseWithoutWarn.setText(alwaysCloseWithoutWarn);
+ btnCloseWithoutWarn.setSelection(!warnOnClose());
+ return btnCloseWithoutWarn;
+ }
+
+ @Override protected void buttonPressed(int buttonId) {
+ boolean closeWithoutWarn = btnCloseWithoutWarn.getSelection();
+ warnOnClose(!closeWithoutWarn);
+ super.buttonPressed(buttonId);
+ }
+}