Fixed: [Issue 160] Proto files outside workspace should have a different
icon.
diff --git a/com.google.eclipse.protobuf.ui/icons/pb-ro.gif b/com.google.eclipse.protobuf.ui/icons/pb-ro.gif
new file mode 100644
index 0000000..ececd94
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/icons/pb-ro.gif
Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 87ba97d..ff92c08 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -28,6 +28,7 @@
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
 import com.google.eclipse.protobuf.ui.builder.nature.AutoAddNatureEditorCallback;
 import com.google.eclipse.protobuf.ui.documentation.ProtobufDocumentationProvider;
+import com.google.eclipse.protobuf.ui.editor.FileOutsideWorkspaceIconUpdater;
 import com.google.eclipse.protobuf.ui.editor.ProtobufUriEditorOpener;
 import com.google.eclipse.protobuf.ui.editor.hyperlinking.ProtobufHyperlinkDetector;
 import com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider;
@@ -68,7 +69,7 @@
   public Class<? extends IFileUriResolver> bindFileUriResolver() {
     return FileUriResolver.class;
   }
-
+  
   public Class<? extends IHighlightingConfiguration> bindHighlightingConfiguration() {
     return HighlightingConfiguration.class;
   }
@@ -109,6 +110,12 @@
     return ProtobufQuickAssistProcessor.class;
   }
 
+  public void configureFileOutsideWorkspaceIconUpdater(Binder binder) {
+    binder.bind(IXtextEditorCallback.class)
+          .annotatedWith(named("FileOutsideWorkspaceIconUpdater"))
+          .to(FileOutsideWorkspaceIconUpdater.class);
+  }
+  
   @Override public void configureLanguageSpecificURIEditorOpener(Binder binder) {
     if (!isWorkbenchRunning())return;
     binder.bind(IURIEditorOpener.class)
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOutsideWorkspaceIconUpdater.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOutsideWorkspaceIconUpdater.java
new file mode 100644
index 0000000..d33862a
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOutsideWorkspaceIconUpdater.java
@@ -0,0 +1,76 @@
+/*

+ * Copyright (c) 2011 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.protobuf.ui.editor;

+

+import static org.eclipse.core.runtime.Status.OK_STATUS;

+import static org.eclipse.xtext.ui.editor.Messages.XtextEditorErrorTickUpdater_JobName;

+

+import org.eclipse.core.resources.IResource;

+import org.eclipse.core.runtime.IProgressMonitor;

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.jobs.ISchedulingRule;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.ui.IEditorInput;

+import org.eclipse.ui.IEditorSite;

+import org.eclipse.ui.progress.UIJob;

+import org.eclipse.xtext.ui.PluginImageHelper;

+import org.eclipse.xtext.ui.editor.IXtextEditorCallback.NullImpl;

+import org.eclipse.xtext.ui.editor.SchedulingRuleFactory;

+import org.eclipse.xtext.ui.editor.XtextEditor;

+

+import com.google.inject.Inject;

+

+/**

+ * @author alruiz@google.com (Alex Ruiz)

+ */

+public class FileOutsideWorkspaceIconUpdater extends NullImpl {

+

+  private static final ISchedulingRule SEQUENCE_RULE = SchedulingRuleFactory.INSTANCE.newSequence();

+

+  @Inject

+  private PluginImageHelper imageHelper;

+

+  @Override

+  public void afterSetInput(XtextEditor editor) {

+    IEditorInput editorInput = editor.getEditorInput();

+    IResource resource = (IResource) editorInput.getAdapter(IResource.class);

+    if (resource == null) {

+      UpdateEditorImageJob job = new UpdateEditorImageJob();

+      job.scheduleFor(editor, imageHelper.getImage("pb-ro.gif"));

+    }

+  }

+

+  private static class UpdateEditorImageJob extends UIJob {

+    private XtextEditor editor;

+    private Image titleImage;

+

+    public UpdateEditorImageJob() {

+      super(XtextEditorErrorTickUpdater_JobName);

+      setRule(SEQUENCE_RULE);

+    }

+

+    @Override

+    public IStatus runInUIThread(final IProgressMonitor monitor) {

+      IEditorSite site = null != editor ? editor.getEditorSite() : null;

+      if (site != null) {

+        if (!monitor.isCanceled() && titleImage != null && !titleImage.isDisposed() && editor != null) {

+          editor.updatedTitleImage(titleImage);

+        }

+      }

+      return OK_STATUS;

+    }

+

+    void scheduleFor(XtextEditor newEditor, Image newTitleImage) {

+      cancel();

+      editor = newEditor;

+      titleImage = newTitleImage;

+      schedule();

+    }

+  }

+}