Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonrad Kügler2014-02-15 18:33:09 +0000
committerKonrad Kügler2014-03-30 21:27:33 +0000
commitdf90f993af83abcfe818e595daf61dba08fdb4c6 (patch)
treee065e6a8acc31446f118df4caab90585136cbd6b
parentf51188fa7f4b702d7cb78d158b171c16a63a48b6 (diff)
downloadegit-df90f993af83abcfe818e595daf61dba08fdb4c6.tar.gz
egit-df90f993af83abcfe818e595daf61dba08fdb4c6.tar.xz
egit-df90f993af83abcfe818e595daf61dba08fdb4c6.zip
Open workspace version from context menu of the compare editor
Bug: 426614 Change-Id: I93393f73d0ba246c45e2d9918b06bcefd9334e1f Signed-off-by: Konrad Kügler <swamblumat-eclipsebugs@yahoo.de>
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java9
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java11
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java31
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java11
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java95
5 files changed, 150 insertions, 7 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java
index ee0f2ca420..822b2653e5 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/CommitFileRevision.java
@@ -35,7 +35,8 @@ import org.eclipse.team.core.history.ITag;
* An {@link IFileRevision} for a version of a specified resource in the
* specified commit (revision).
*/
-class CommitFileRevision extends GitFileRevision {
+class CommitFileRevision extends GitFileRevision implements
+ OpenWorkspaceVersionEnabled {
private final Repository db;
private final RevCommit commit;
@@ -61,7 +62,11 @@ class CommitFileRevision extends GitFileRevision {
blobId = blob;
}
- String getGitPath() {
+ public Repository getRepository() {
+ return db;
+ }
+
+ public String getGitPath() {
return path;
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java
index a9bb41d213..11aeb0781c 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/IndexFileRevision.java
@@ -27,7 +27,8 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.history.IFileRevision;
/** An {@link IFileRevision} for the version in the Git index. */
-public class IndexFileRevision extends GitFileRevision {
+public class IndexFileRevision extends GitFileRevision implements
+ OpenWorkspaceVersionEnabled {
// This is to maintain compatibility with the old behavior
private static final int FIRST_AVAILABLE = -1;
@@ -102,4 +103,12 @@ public class IndexFileRevision extends GitFileRevision {
CoreText.IndexFileRevision_errorLookingUpPath, path), e));
}
}
+
+ public Repository getRepository() {
+ return db;
+ }
+
+ public String getGitPath() {
+ return path;
+ }
}
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java
new file mode 100644
index 0000000000..a5b7233320
--- /dev/null
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/storage/OpenWorkspaceVersionEnabled.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (C) 2014, Konrad Kügler <swamblumat-eclipsebugs@yahoo.de>
+ *
+ * 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 org.eclipse.egit.core.internal.storage;
+
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Provides the workspace version of a file. <br>
+ *
+ * This interface serves as a hint to GitCompareFileRevisionEditorInput to
+ * provide a "Open Workspace Version" action to the user.
+ */
+public interface OpenWorkspaceVersionEnabled {
+
+ /**
+ * @return the repository containing this file
+ */
+ public Repository getRepository();
+
+ /**
+ * @return the file path relative to the repository's working directory
+ */
+ public String getGitPath();
+
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java
index ceb7ef34ca..bccf1b5068 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/EgitUiEditorUtils.java
@@ -133,14 +133,16 @@ public class EgitUiEditorUtils {
* @param file
* File to open an editor for. {@code file} must exist.
* @param page
+ * @return the created editor or null in case of an error
*/
- public static void openEditor(File file, IWorkbenchPage page) {
+ public static IEditorPart openEditor(File file, IWorkbenchPage page) {
if (!file.exists())
- return;
+ return null;
IFile fileResource = ResourceUtil.getFileForLocation(new Path(file.getAbsolutePath()));
if (fileResource != null) {
try {
- IDE.openEditor(page, fileResource, OpenStrategy.activateOnOpen());
+ return IDE.openEditor(page, fileResource,
+ OpenStrategy.activateOnOpen());
} catch (PartInitException e) {
Activator.handleError(UIText.EgitUiEditorUtils_openFailed, e,
true);
@@ -149,13 +151,14 @@ public class EgitUiEditorUtils {
IFileStore store = EFS.getLocalFileSystem().getStore(
new Path(file.getAbsolutePath()));
try {
- IDE.openEditor(page, new FileStoreEditorInput(store),
+ return IDE.openEditor(page, new FileStoreEditorInput(store),
EditorsUI.DEFAULT_TEXT_EDITOR_ID);
} catch (PartInitException e) {
Activator.handleError(UIText.EgitUiEditorUtils_openFailed, e,
true);
}
}
+ return null;
}
private static String getEditorId(FileRevisionEditorInput editorInput) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java
index f8c5bc5045..e71256ac30 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/GitCompareFileRevisionEditorInput.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal;
+import java.io.File;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.CompareConfiguration;
@@ -33,18 +34,33 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.internal.storage.IndexFileRevision;
+import org.eclipse.egit.core.internal.storage.OpenWorkspaceVersionEnabled;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.team.core.history.IFileRevision;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.synchronize.EditableSharedDocumentAdapter.ISharedDocumentAdapterListener;
import org.eclipse.team.internal.ui.synchronize.LocalResourceSaveableComparison;
import org.eclipse.team.internal.ui.synchronize.LocalResourceTypedElement;
import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
+import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISaveablesLifecycleListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.Saveable;
import org.eclipse.ui.SaveablesLifecycleEvent;
+import org.eclipse.ui.texteditor.ITextEditor;
/**
* The input provider for the compare editor when working on resources
@@ -449,6 +465,85 @@ public class GitCompareFileRevisionEditorInput extends SaveableCompareEditorInpu
}
}
}
+
+ @Override
+ public void registerContextMenu(MenuManager menu,
+ final ISelectionProvider selectionProvider) {
+ super.registerContextMenu(menu, selectionProvider);
+ registerOpenWorkspaceVersion(menu, selectionProvider);
+ }
+
+ private void registerOpenWorkspaceVersion(MenuManager menu,
+ final ISelectionProvider selectionProvider) {
+ FileRevisionTypedElement leftRevision = getLeftRevision();
+ if (leftRevision != null) {
+ IFileRevision fileRevision = leftRevision.getFileRevision();
+ if (fileRevision instanceof OpenWorkspaceVersionEnabled) {
+ OpenWorkspaceVersionEnabled workspaceVersion = (OpenWorkspaceVersionEnabled) fileRevision;
+ final File workspaceFile = new File(workspaceVersion
+ .getRepository().getWorkTree(),
+ workspaceVersion.getGitPath());
+ if (workspaceFile.exists())
+ menu.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ Action action = new OpenWorkspaceVersionAction(
+ UIText.CommitFileDiffViewer_OpenWorkingTreeVersionInEditorMenuLabel,
+ selectionProvider, workspaceFile);
+ manager.insertAfter("file", action); //$NON-NLS-1$
+ }
+ });
+ }
+ }
+ }
+
+ private class OpenWorkspaceVersionAction extends Action {
+
+ private final ISelectionProvider selectionProvider;
+
+ private final File workspaceFile;
+
+ private OpenWorkspaceVersionAction(String text,
+ ISelectionProvider selectionProvider, File workspaceFile) {
+ super(text);
+ this.selectionProvider = selectionProvider;
+ this.workspaceFile = workspaceFile;
+ }
+
+ @Override
+ public void run() {
+ int selectedLine = 0;
+ if (selectionProvider.getSelection() instanceof ITextSelection) {
+ ITextSelection selection = (ITextSelection) selectionProvider
+ .getSelection();
+ selectedLine = selection.getStartLine();
+ }
+
+ IWorkbenchWindow window = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow();
+ IWorkbenchPage page = window.getActivePage();
+ IEditorPart editor = EgitUiEditorUtils.openEditor(workspaceFile,
+ page);
+ selectLine(editor, selectedLine);
+ }
+
+ private void selectLine(IEditorPart editorPart, int selectedLine) {
+ if (editorPart instanceof ITextEditor) {
+ ITextEditor editor = (ITextEditor) editorPart;
+ IDocument document = editor.getDocumentProvider().getDocument(
+ editor.getEditorInput());
+ if (document != null)
+ try {
+ IRegion line = document
+ .getLineInformation(selectedLine);
+ editor.selectAndReveal(line.getOffset(), 0);
+ } catch (BadLocationException e) {
+ // line seems not to exist in
+ // workspace version
+ }
+ }
+ }
+ }
+
/**
* ITypedElement without content. May be used to indicate that a file is not
* available.

Back to the top