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