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