Added "Scroll Lock" toolbar action.
diff --git a/com.google.eclipse.terminal.local/icons/scroll_lock.gif b/com.google.eclipse.terminal.local/icons/scroll_lock.gif
new file mode 100644
index 0000000..68fd6cf
--- /dev/null
+++ b/com.google.eclipse.terminal.local/icons/scroll_lock.gif
Binary files differ
diff --git a/com.google.eclipse.terminal.local/plugin.xml b/com.google.eclipse.terminal.local/plugin.xml
index 25c1c48..6cf6dc1 100644
--- a/com.google.eclipse.terminal.local/plugin.xml
+++ b/com.google.eclipse.terminal.local/plugin.xml
@@ -74,7 +74,7 @@
    <extension
          point="org.eclipse.ui.handlers">
       <handler
-            class="com.google.eclipse.terminal.local.ui.OpenTerminalCommand"
+            class="com.google.eclipse.terminal.local.ui.command.OpenTerminalCommand"
             commandId="com.google.eclipse.terminal.local.open">
       </handler>
    </extension>
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/Activator.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/Activator.java
index 4cbb715..61ae1a7 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/Activator.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/Activator.java
@@ -8,10 +8,14 @@
  */
 package com.google.eclipse.terminal.local;
 
+import static com.google.eclipse.terminal.local.ImageKeys.SCROLL_LOCK;
 import static org.eclipse.core.runtime.IStatus.*;
 
+import java.net.URL;
+
 import org.eclipse.core.runtime.*;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.*;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
@@ -35,6 +39,11 @@
     super.stop(context);
   }
 
+  @Override protected void initializeImageRegistry(ImageRegistry registry) {
+    URL scrollLockImageUrl = instance().getBundle().getEntry("icons/scroll_lock.gif");
+    registry.put(SCROLL_LOCK, ImageDescriptor.createFromURL(scrollLockImageUrl));
+  }
+
   public static void log(String message, Throwable cause) {
     log(new Status(ERROR, PLUGIN_ID, OK, message, cause));
   }
@@ -43,6 +52,10 @@
     instance().getLog().log(status);
   }
 
+  public static ImageDescriptor imageDescriptor(String key) {
+    return instance().getImageRegistry().getDescriptor(key);
+  }
+
   public static Activator instance() {
     return plugin;
   }
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ImageKeys.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ImageKeys.java
new file mode 100644
index 0000000..7290c5d
--- /dev/null
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ImageKeys.java
@@ -0,0 +1,18 @@
+/*
+ * 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;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class ImageKeys {
+  public static final String SCROLL_LOCK = "scrollLock";
+
+  private ImageKeys() {}
+}
diff --git a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/OpenTerminalCommand.java b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/command/OpenTerminalCommand.java
similarity index 96%
rename from com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/OpenTerminalCommand.java
rename to com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/command/OpenTerminalCommand.java
index 4be9975..ba818bb 100644
--- a/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/OpenTerminalCommand.java
+++ b/com.google.eclipse.terminal.local/src/com/google/eclipse/terminal/local/ui/command/OpenTerminalCommand.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.terminal.local.ui;
+package com.google.eclipse.terminal.local.ui.command;
 
 import static com.google.eclipse.terminal.local.ui.view.TerminalView.openTerminalView;
 
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 d3c655e..da4c1e0 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
@@ -15,6 +15,7 @@
  */
 public class Messages extends NLS {
   public static String defaultViewTitle;
+  public static String scrollLock;
 
   static {
     Class<Messages> type = Messages.class;
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 950c180..8417f99 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 +1,2 @@
 defaultViewTitle=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 ac56d8d..c5387e1 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
@@ -9,16 +9,18 @@
 package com.google.eclipse.terminal.local.ui.view;
 
 import static com.google.eclipse.terminal.local.Activator.*;
+import static com.google.eclipse.terminal.local.ImageKeys.SCROLL_LOCK;
 import static com.google.eclipse.terminal.local.ui.preferences.ColorsAndFontsPreferences.*;
 import static com.google.eclipse.terminal.local.ui.preferences.GeneralPreferences.*;
 import static com.google.eclipse.terminal.local.ui.util.Displays.runInDisplayThread;
-import static com.google.eclipse.terminal.local.ui.view.Messages.defaultViewTitle;
+import static com.google.eclipse.terminal.local.ui.view.Messages.*;
 import static com.google.eclipse.terminal.local.util.Platform.userHomeDirectory;
 import static org.eclipse.core.runtime.Path.fromOSString;
 import static org.eclipse.jface.resource.JFaceResources.TEXT_FONT;
 import static org.eclipse.ui.IWorkbenchPage.VIEW_ACTIVATE;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.action.*;
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.util.*;
 import org.eclipse.swt.SWT;
@@ -36,6 +38,7 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class TerminalView extends ViewPart implements LifeCycleListener {
+  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";
 
@@ -47,6 +50,8 @@
   private TerminalWidget terminalWidget;
   private IPath workingDirectory;
 
+  private Action scrollLockAction;
+
   public static void openTerminalView(IPath workingDirectory) {
     IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
     try {
@@ -77,6 +82,7 @@
   }
 
   @Override public void saveState(IMemento memento) {
+    saveState(memento, SCROLL_LOCK_ENABLED, String.valueOf(terminalWidget.isScrollLockEnabled()));
     saveState(memento, TITLE_STATE_TYPE, getPartName());
     saveState(memento, WORKING_DIRECTORY_STATE_TYPE, workingDirectory.toOSString());
   }
@@ -130,7 +136,10 @@
     };
     JFaceResources.getFontRegistry().addListener(textFontChangeListener);
     updateFont();
+    scrollLockAction = new ScrollLockAction();
+    setupLocalToolBars();
     if (savedState != null) {
+      updateScrollLockUsingSavedState();
       connectUsingSavedState();
       return;
     }
@@ -138,6 +147,7 @@
       setPartName(defaultViewTitle);
       open(userHomeDirectory());
     }
+    enableScrollLock(scrollLockAction.isChecked());
   }
 
   private void updateColors() {
@@ -163,6 +173,25 @@
     terminalWidget.setBufferLineCount(bufferLineCount());
   }
 
+  private void setupLocalToolBars() {
+    IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
+    toolBarManager.add(scrollLockAction);
+  }
+
+  private void updateScrollLockUsingSavedState() {
+    boolean newValue = Boolean.valueOf(savedState(SCROLL_LOCK_ENABLED));
+    enableScrollLockAndUpdateAction(newValue);
+  }
+
+  private void enableScrollLockAndUpdateAction(boolean enabled) {
+    enableScrollLock(enabled);
+    scrollLockAction.setChecked(enabled);
+  }
+
+  private void enableScrollLock(boolean enabled) {
+    terminalWidget.enableScrollLock(enabled);
+  }
+
   private void connectUsingSavedState() {
     String title = savedState(TITLE_STATE_TYPE);
     setPartName(title);
@@ -199,4 +228,17 @@
     }
     super.dispose();
   }
+
+  private class ScrollLockAction extends Action {
+    ScrollLockAction() {
+      super(scrollLock, AS_RADIO_BUTTON);
+      setChecked(false);
+      setImageDescriptor(imageDescriptor(SCROLL_LOCK));
+    }
+
+    @Override public void run() {
+      boolean newValue = !terminalWidget.isScrollLockEnabled();
+      enableScrollLockAndUpdateAction(newValue);
+    }
+  }
 }
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 184ef70..784acca 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
@@ -144,6 +144,14 @@
     return terminalControl.setFocus();
   }
 
+  public boolean isScrollLockEnabled() {
+    return terminalControl.isScrollLock();
+  }
+
+  void enableScrollLock(boolean enabled) {
+    terminalControl.setScrollLock(enabled);
+  }
+
   private static class TerminalListener implements ITerminalListener {
     ITerminalListener delegate;