Fixed: [Issue 14] Option to disable blinking cursor
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/AbstractPreferencesChangeListener.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/AbstractPreferencesChangeListener.java
index bf03fca..e0322a1 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/AbstractPreferencesChangeListener.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/AbstractPreferencesChangeListener.java
@@ -27,6 +27,9 @@
     if (CUSTOM_FONT_DATA.equals(property)) {
       onFontChanged();
     }
+    if (USE_BLINKING_CURSOR.equals(property)) {
+      onUseBlinkingCursorChanged();
+    }
   }
 
   protected abstract void onBufferLineCountChanged();
@@ -34,4 +37,6 @@
   protected abstract void onColorChanged();
 
   protected abstract void onFontChanged();
+
+  protected abstract void onUseBlinkingCursorChanged();
 }
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/ColorsAndFontsPreferences.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/ColorsAndFontsPreferences.java
index 0942ce9..7dca06a 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/ColorsAndFontsPreferences.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/preferences/ColorsAndFontsPreferences.java
@@ -19,7 +19,6 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class ColorsAndFontsPreferences {
-
   public static RGB background() {
     return getColor(preferenceStore(), BACKGROUND_COLOR);
   }
@@ -35,4 +34,8 @@
   public static FontData customFontData() {
     return getFontData(preferenceStore(), CUSTOM_FONT_DATA);
   }
+
+  public static boolean useBlinkingCursor() {
+    return preferenceStore().getBoolean(USE_BLINKING_CURSOR);
+  }
 }
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 63d42a9..213eb09 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
@@ -26,6 +26,7 @@
   public static String previewPrompt;
   public static String textFontLink;
   public static String unableToLoadPreviewContent;
+  public static String useBlinkingCursor;
   public static String useCustomFont;
   public static String useTextFont;
   public static String warnOnClose;
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 d62814b..55d4de9 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
@@ -10,6 +10,7 @@
 previewPrompt=Preview:
 textFontLink=Eclipse's "Text Font" can be configured on the <a href=\"org.eclipse.ui.preferencePages.ColorsAndFonts\">'Colors and Fonts'</a> preference page.
 unableToLoadPreviewContent=Unable to load preview content
+useBlinkingCursor=Use blinking cursor
 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 74dd573..8b045e5 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
@@ -27,6 +27,7 @@
     setDefault(BACKGROUND_COLOR, new RGB(0, 0, 0));
     setDefault(FOREGROUND_COLOR, new RGB(229, 229, 229));
     preferenceStore().setDefault(USE_CUSTOM_FONT, false);
+    preferenceStore().setDefault(USE_BLINKING_CURSOR, true);
     PreferenceConverter.setDefault(preferenceStore(), CUSTOM_FONT_DATA, JFaceResources.getTextFont().getFontData());
   }
 
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 7983517..541a43f 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
@@ -19,6 +19,7 @@
   static final String FOREGROUND_COLOR = "foregroundColor";
   static final String USE_CUSTOM_FONT = "useCustomFont";
   static final String CUSTOM_FONT_DATA = "customFontData";
+  static final String USE_BLINKING_CURSOR = "useBlinkingCursor";
 
   private PreferenceNames() {}
 }
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 b386521..f72217e 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
@@ -24,6 +24,8 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class RootPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+  public RootPreferencePage() {
+  }
   private static final int MINIMUM_BUFFER_LINE_COUNT = 100;
   private static final int MAXIMUM_BUFFER_LINE_COUNT = 50000;
   private static final String INVALID_BUFFER_LINE_COUNT_MESSAGE =
@@ -32,6 +34,7 @@
   private Text txtBufferLineCount;
   private Button btnCloseViewOnExit;
   private Button btnWarnOnClose;
+  private Button btnUseBlinkingCursor;
 
   private int newBufferLineCount;
 
@@ -80,6 +83,10 @@
     btnWarnOnClose.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
     btnWarnOnClose.setText(warnOnClose);
 
+    btnUseBlinkingCursor = new Button(contents, SWT.CHECK);
+    btnUseBlinkingCursor.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+    btnUseBlinkingCursor.setText(useBlinkingCursor);
+
     updateContents();
     return contents;
   }
@@ -93,12 +100,14 @@
     txtBufferLineCount.setText(getPreferenceStore().getString(BUFFER_LINE_COUNT));
     btnCloseViewOnExit.setSelection(getPreferenceStore().getBoolean(CLOSE_VIEW_ON_EXIT));
     btnWarnOnClose.setSelection(getPreferenceStore().getBoolean(WARN_ON_CLOSE));
+    btnUseBlinkingCursor.setSelection(getPreferenceStore().getBoolean(USE_BLINKING_CURSOR));
   }
 
   @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());
+    getPreferenceStore().setValue(USE_BLINKING_CURSOR, btnUseBlinkingCursor.getSelection());
     return true;
   }
 
@@ -106,5 +115,6 @@
     txtBufferLineCount.setText(getPreferenceStore().getDefaultString(BUFFER_LINE_COUNT));
     btnCloseViewOnExit.setSelection(getPreferenceStore().getDefaultBoolean(CLOSE_VIEW_ON_EXIT));
     btnWarnOnClose.setSelection(getPreferenceStore().getDefaultBoolean(WARN_ON_CLOSE));
+    btnUseBlinkingCursor.setSelection(getPreferenceStore().getDefaultBoolean(USE_BLINKING_CURSOR));
   }
 }
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 2bfac69..bdc8f33 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
@@ -110,8 +110,7 @@
         updatePartName(title);
       }
 
-      @Override public void setState(TerminalState state) {
-      }
+      @Override public void setState(TerminalState state) {}
     });
     IViewSite viewSite = getViewSite();
     preferencesChangeListener = new AbstractPreferencesChangeListener() {
@@ -126,6 +125,10 @@
       @Override protected void onFontChanged() {
         updateFont();
       }
+
+      @Override protected void onUseBlinkingCursorChanged() {
+        updateUsageOfBlinkingCursor();
+      }
     };
     preferenceStore().addPropertyChangeListener(preferencesChangeListener);
     updateBufferLineCount();
@@ -179,6 +182,10 @@
     setFont(terminalFont());
   }
 
+  private void updateUsageOfBlinkingCursor() {
+    terminalWidget.setBlinkingCursor(useBlinkingCursor());
+  }
+
   private Font terminalFont() {
     if (useCustomFont()) {
       return new Font(Display.getDefault(), customFontData());
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
index 1bb106d..3be64a7 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/view/TerminalWidget.java
@@ -129,6 +129,10 @@
     terminalControl.setScrollLockOn(enabled);
   }
 
+  void setBlinkingCursor(boolean useBlinkingCursor) {
+    terminalControl.setBlinkingCursor(useBlinkingCursor);
+  }
+
   private static class TerminalListener implements ITerminalListener {
     ITerminalListener delegate;
 
diff --git a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
index 8de88a1..c810f85 100644
--- a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
+++ b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java
@@ -849,4 +849,8 @@
   public void setColors(RGB background, RGB foreground) {
     textControl.setColors(background, foreground);
   }
+
+  public void setBlinkingCursor(boolean useBlinkingCursor) {
+    textControl.setBlinkingCursor(useBlinkingCursor);
+  }
 }
diff --git a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
index 5617d05..0afee93 100644
--- a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
+++ b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
@@ -33,11 +33,12 @@
   private int selectionEndColumn;
   private ITerminalTextDataSnapshot selectionSnapshot;
   private String currentSelection = "";
-  /**
-   * do not update while update is running
-   */
+
+  // do not update while update is running
   boolean inUpdate;
+
   private int columns;
+  private boolean useBlinkingCursor;
 
   public AbstractTextCanvasModel(ITerminalTextDataSnapshot snapshot) {
     this.snapshot = snapshot;
@@ -126,6 +127,11 @@
     return showCursor && cursorIsEnabled;
   }
 
+  @Override public void setBlinkingCursor(boolean useBlinkingCursor) {
+    this.useBlinkingCursor = useBlinkingCursor;
+    updateCursor();
+  }
+
   // TODO: should be called regularly to draw an update of the blinking cursor?
   private void updateCursor() {
     if (!cursorIsEnabled) {
@@ -158,20 +164,22 @@
       // Draw the new cursor
       fireCellRangeChanged(this.cursorColumn, this.cursorLine, 1, 1);
     } else {
-      long time = System.currentTimeMillis();
-      // TODO Make the cursor blink time customizable.
-      if (time - cursorTime > 500) {
-        showCursor = !showCursor;
-        cursorTime = time;
-        // On some windows machines, there is some leftover when updating the cursor.
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206363
-        int col = this.cursorColumn;
-        int width = 2;
-        if (col > 0) {
-          col--;
-          width++;
+      if (useBlinkingCursor) {
+        long time = System.currentTimeMillis();
+        // TODO Make the cursor blink time customizable.
+        if (time - cursorTime > 500) {
+          showCursor = !showCursor;
+          cursorTime = time;
+          // On some windows machines, there is some leftover when updating the cursor.
+          // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206363
+          int col = this.cursorColumn;
+          int width = 2;
+          if (col > 0) {
+            col--;
+            width++;
+          }
+          fireCellRangeChanged(col, this.cursorLine, width, 1);
         }
-        fireCellRangeChanged(col, this.cursorLine, width, 1);
       }
     }
   }
diff --git a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
index ffd6ace..1f62e76 100644
--- a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
+++ b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
@@ -54,4 +54,6 @@
   boolean hasLineSelection(int line);
 
   String getSelectedText();
+
+  void setBlinkingCursor(boolean useBlinkingCursor);
 }
\ No newline at end of file
diff --git a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
index a7f46b3..bfafd3c 100644
--- a/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
+++ b/com.google.eclipse.tm.terminal/src/com/google/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
@@ -18,7 +18,7 @@
  * CellRenderer is responsible for painting the cell.
  */
 public class TextCanvas extends GridCanvas {
-  protected final ITextCanvasModel cellCanvasModel;
+  private final ITextCanvasModel cellCanvasModel;
   private final ILinelRenderer cellRenderer;
   private boolean scrollLockOn;
   private Point draggingStart;
@@ -392,4 +392,8 @@
   @Override public Point screenPointToCell(int x, int y) {
     return super.screenPointToCell(x, y);
   }
+
+  public void setBlinkingCursor(boolean useBlinkingCursor) {
+    cellCanvasModel.setBlinkingCursor(useBlinkingCursor);
+  }
 }