Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Stocker2014-08-10 13:05:05 +0000
committerMatthias Sohn2014-09-04 00:20:58 +0000
commit00f06f8ab1724347afed7ed3384a1f423599466d (patch)
tree66543768396e66c46d723246e048a7044d2cb312
parent5c30dca8648889ae98c355096310ddec1d0a7215 (diff)
downloadegit-00f06f8ab1724347afed7ed3384a1f423599466d.tar.gz
egit-00f06f8ab1724347afed7ed3384a1f423599466d.tar.xz
egit-00f06f8ab1724347afed7ed3384a1f423599466d.zip
[historyView] Use separate diff viewer instead of embedding into message
The diff viewer is the same as in the "Diff" tab of the commit viewer. It still shares its scroll bar with the message. The advantage is that when a file is selected, only the diff has to be updated, not the whole message. We can also make the commit message collapsible or extract other parts from the comment (such as the list of branches/tags). Also, the hyperlink detectors now only run on the commit message, not on the diff. Bug: 440125 Change-Id: I6dc79f75eb0a63dde64cdf33d8e66fc594c327ab Signed-off-by: Robin Stocker <robin@nibor.org> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java12
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/blame/BlameInformationControl.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorPage.java2
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffViewer.java12
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java172
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java52
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java55
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java144
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties4
9 files changed, 171 insertions, 285 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
index 34003dfc58..bb3e53a591 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
@@ -594,6 +594,9 @@ public class UIText extends NLS {
public static String GitHistoryPage_FollowRenames;
/** */
+ public static String GitHistoryPage_FormatDiffJobName;
+
+ /** */
public static String GitHistoryPage_FilterSubMenuLabel;
/** */
@@ -2391,15 +2394,6 @@ public class UIText extends NLS {
public static String CommitMessageViewer_MoreBranches;
/** */
- public static String CommitMessageViewer_BuildDiffListTaskName;
-
- /** */
- public static String CommitMessageViewer_BuildDiffTaskName;
-
- /** */
- public static String CommitMessageViewer_CanNotRenderDiffMessage;
-
- /** */
public static String CommitMessageViewer_tags;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/blame/BlameInformationControl.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/blame/BlameInformationControl.java
index c101294ba3..fed939859c 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/blame/BlameInformationControl.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/blame/BlameInformationControl.java
@@ -356,7 +356,8 @@ public class BlameInformationControl extends AbstractInformationControl
showAnnotationsLink
.addSelectionListener(showAnnotationsLinkSelectionAdapter);
- DiffViewer diffText = new DiffViewer(diffComposite, null, SWT.NONE);
+ DiffViewer diffText = new DiffViewer(diffComposite, null, SWT.NONE,
+ false);
diffText.setEditable(false);
diffText.getControl().setLayoutData(
GridDataFactory.fillDefaults().grab(true, true).create());
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorPage.java
index 1aa47b4111..c81700bde4 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffEditorPage.java
@@ -205,7 +205,7 @@ public class DiffEditorPage extends FormPage {
GridLayoutFactory.fillDefaults().numColumns(1).applyTo(body);
viewer = new DiffViewer(body, new CompositeRuler(), SWT.V_SCROLL
- | SWT.H_SCROLL);
+ | SWT.H_SCROLL, true);
viewer.setEditable(false);
GridDataFactory.fillDefaults().grab(true, true)
.applyTo(viewer.getControl());
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffViewer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffViewer.java
index 972bb58e5b..285a5f081a 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffViewer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/commit/DiffViewer.java
@@ -115,15 +115,19 @@ public class DiffViewer extends SourceViewer {
* @param parent
* @param ruler
* @param styles
+ * @param showCursorLine
*/
- public DiffViewer(Composite parent, IVerticalRuler ruler, int styles) {
+ public DiffViewer(Composite parent, IVerticalRuler ruler, int styles,
+ boolean showCursorLine) {
super(parent, ruler, styles);
setDocument(new Document());
SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(
this, null, null, EditorsUI.getSharedTextColors());
- support.setCursorLinePainterPreferenceKeys(
- AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
- AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
+ if (showCursorLine) {
+ support.setCursorLinePainterPreferenceKeys(
+ AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
+ AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
+ }
support.install(EditorsUI.getPreferenceStore());
if (ruler instanceof CompositeRuler) {
lineNumberRuler = new LineNumberRulerColumn();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
index 7825af3439..643ec6d971 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
@@ -13,14 +13,9 @@
package org.eclipse.egit.ui.internal.history;
-import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
@@ -31,14 +26,11 @@ import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.history.CommitMessageViewer.ObjectLink;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.diff.RawText;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants;
@@ -51,7 +43,6 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.RevWalkUtils;
-import org.eclipse.jgit.util.io.SafeBufferedOutputStream;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
@@ -76,34 +67,24 @@ public class CommitInfoBuilder {
private final boolean fill;
- // set by selecting files in the file list
- private final List<FileDiff> currentDiffs;
-
private Color linkColor;
private Color darkGrey;
- private Color hunkheaderColor;
-
- private Color linesAddedColor;
-
- private Color linesRemovedColor;
-
private final Collection<Ref> allRefs;
/**
* @param db the repository
* @param commit the commit the info should be shown for
- * @param currentDiffs list of current diffs
* @param fill whether to fill the available space
* @param allRefs all Ref's to examine regarding marge bases
*/
- public CommitInfoBuilder(Repository db, PlotCommit commit, List<FileDiff> currentDiffs, boolean fill, Collection<Ref> allRefs) {
+ public CommitInfoBuilder(Repository db, PlotCommit commit, boolean fill,
+ Collection<Ref> allRefs) {
this.db = db;
this.commit = commit;
this.fill = fill;
this.allRefs = allRefs;
- this.currentDiffs = new ArrayList<FileDiff>(currentDiffs);
}
/**
@@ -111,16 +92,10 @@ public class CommitInfoBuilder {
*
* @param linkColor
* @param darkGrey
- * @param hunkheaderColor
- * @param linesAddedColor
- * @param linesRemovedColor
*/
- public void setColors(Color linkColor, Color darkGrey, Color hunkheaderColor, Color linesAddedColor, Color linesRemovedColor) {
+ public void setColors(Color linkColor, Color darkGrey) {
this.linkColor = linkColor;
this.darkGrey = darkGrey;
- this.hunkheaderColor = hunkheaderColor;
- this.linesAddedColor = linesAddedColor;
- this.linesRemovedColor = linesRemovedColor;
}
/**
@@ -282,9 +257,6 @@ public class CommitInfoBuilder {
- matcher.start(), null, null, SWT.ITALIC));
}
- if (!currentDiffs.isEmpty())
- buildDiffs(d, styles, monitor, trace);
-
if (trace)
GitTraceLocation.getTrace().traceExit(
GitTraceLocation.HISTORYVIEW.getLocation());
@@ -368,90 +340,6 @@ public class CommitInfoBuilder {
}
}
-
- private void buildDiffs(final StringBuilder d,
- final List<StyleRange> styles, IProgressMonitor monitor,
- boolean trace) throws OperationCanceledException,
- IOException {
-
- // the encoding for the currently processed file
- final String[] currentEncoding = new String[1];
-
- if (trace)
- GitTraceLocation.getTrace().traceEntry(
- GitTraceLocation.HISTORYVIEW.getLocation());
- if (commit.getParentCount() > 1) {
- d.append(UIText.CommitMessageViewer_CanNotRenderDiffMessage);
- return;
- }
-
- try {
- monitor.beginTask(UIText.CommitMessageViewer_BuildDiffListTaskName,
- currentDiffs.size());
- BufferedOutputStream bos = new SafeBufferedOutputStream(
- new ByteArrayOutputStream() {
- @Override
- public synchronized void write(byte[] b, int off,
- int len) {
- super.write(b, off, len);
- try {
- if (currentEncoding[0] == null)
- d.append(toString("UTF-8")); //$NON-NLS-1$
- else
- d.append(toString(currentEncoding[0]));
- } catch (UnsupportedEncodingException e) {
- d.append(toString());
- }
- reset();
- }
-
- });
- final DiffFormatter diffFmt = new MessageViewerFormatter(bos,
- styles, d, hunkheaderColor, linesAddedColor, linesRemovedColor);
-
- for (FileDiff currentDiff : currentDiffs) {
- if (monitor.isCanceled())
- throw new OperationCanceledException();
- if (currentDiff.getBlobs().length == 2) {
- String path = currentDiff.getNewPath();
- monitor.setTaskName(NLS.bind(
- UIText.CommitMessageViewer_BuildDiffTaskName, path));
- currentEncoding[0] = CompareCoreUtils.getResourceEncoding(db,
- path);
- d.append(LF);
- int start = d.length();
- String pathLine = formatPathLine(path);
- int len = pathLine.length();
- d.append(pathLine).append(LF);
- styles.add(new StyleRange(start, len, darkGrey, null));
- currentDiff.outputDiff(d, db, diffFmt, true);
- diffFmt.flush();
- }
- monitor.worked(1);
- }
-
- } finally {
- monitor.done();
- if (trace)
- GitTraceLocation.getTrace().traceExit(
- GitTraceLocation.HISTORYVIEW.getLocation());
- }
- }
-
- private String formatPathLine(String path) {
- int n = 80 - path.length() - 2;
- if (n < 0)
- return path;
- final StringBuilder d = new StringBuilder();
- int i = 0;
- for (; i < n / 2; i++)
- d.append("-"); //$NON-NLS-1$
- d.append(SPACE).append(path).append(SPACE);
- for (; i < n - 1; i++)
- d.append("-"); //$NON-NLS-1$
- return d.toString();
- }
-
private String getTagsString() {
StringBuilder sb = new StringBuilder();
Map<String, Ref> tagsMap = db.getTags();
@@ -468,60 +356,6 @@ public class CommitInfoBuilder {
return sb.toString();
}
- private static final class MessageViewerFormatter extends DiffFormatter {
- private final List<StyleRange> styles;
-
- private final StringBuilder d;
-
- private final Color hunkheaderColor;
- private final Color linesAddedColor;
- private final Color linesRemovedColor;
-
- private MessageViewerFormatter(OutputStream out,
- List<StyleRange> styles, StringBuilder d, Color hunkheaderColor, Color linesAddedColor, Color linesRemovedColor) {
- super(out);
- this.styles = styles;
- this.hunkheaderColor = hunkheaderColor;
- this.linesAddedColor = linesAddedColor;
- this.linesRemovedColor = linesRemovedColor;
- this.d = d;
- }
-
- @Override
- protected void writeHunkHeader(int aCur, int aEnd, int bCur, int bEnd)
- throws IOException {
- flush();
- int start = d.length();
- super.writeHunkHeader(aCur, aEnd, bCur, bEnd);
- flush();
- int end = d.length();
- styles.add(new StyleRange(start, end - start, hunkheaderColor,
- null));
- }
-
- @Override
- protected void writeAddedLine(RawText b, int bCur) throws IOException {
- flush();
- int start = d.length();
- super.writeAddedLine(b, bCur);
- flush();
- int end = d.length();
- styles.add(new StyleRange(start, end - start,
- linesAddedColor, null));
- }
-
- @Override
- protected void writeRemovedLine(RawText b, int bCur) throws IOException {
- flush();
- int start = d.length();
- super.writeRemovedLine(b, bCur);
- flush();
- int end = d.length();
- styles.add(new StyleRange(start, end - start,
- linesRemovedColor, null));
- }
- }
-
/**
* Finds next door tagged revision. Searches forwards (in descendants) or
* backwards (in ancestors)
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
index 7ccbeb037d..9488b45d25 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitMessageViewer.java
@@ -39,10 +39,6 @@ import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jgit.events.ListenerHandle;
import org.eclipse.jgit.events.RefsChangedEvent;
import org.eclipse.jgit.events.RefsChangedListener;
@@ -72,8 +68,7 @@ import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-class CommitMessageViewer extends SourceViewer implements
- ISelectionChangedListener {
+class CommitMessageViewer extends SourceViewer {
private static final Color SYS_LINKCOLOR = PlatformUI.getWorkbench()
.getDisplay().getSystemColor(SWT.COLOR_BLUE);
@@ -81,15 +76,6 @@ class CommitMessageViewer extends SourceViewer implements
private static final Color SYS_DARKGRAY = PlatformUI.getWorkbench()
.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
- private static final Color SYS_HUNKHEADER_COLOR = PlatformUI.getWorkbench()
- .getDisplay().getSystemColor(SWT.COLOR_BLUE);
-
- private static final Color SYS_LINES_ADDED_COLOR = PlatformUI
- .getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN);
-
- private static final Color SYS_LINES_REMOVED_COLOR = PlatformUI
- .getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_RED);
-
private static final Cursor SYS_LINK_CURSOR = PlatformUI.getWorkbench()
.getDisplay().getSystemCursor(SWT.CURSOR_HAND);
@@ -98,9 +84,6 @@ class CommitMessageViewer extends SourceViewer implements
// notified when clicking on a link in the message (branch, commit...)
private final ListenerList navListeners = new ListenerList();
- // set by selecting files in the file list
- private final List<FileDiff> currentDiffs = new ArrayList<FileDiff>();
-
// listener to detect changes in the wrap and fill preferences
private final IPropertyChangeListener listener;
@@ -128,7 +111,7 @@ class CommitMessageViewer extends SourceViewer implements
private BooleanPrefAction fillParagraphsPrefAction;
CommitMessageViewer(final Composite parent, final IPageSite site, IWorkbenchPartSite partSite) {
- super(parent, null, SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
+ super(parent, null, SWT.READ_ONLY);
this.partSite = partSite;
final StyledText t = getTextWidget();
@@ -170,11 +153,6 @@ class CommitMessageViewer extends SourceViewer implements
listener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(
- UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_WRAP)) {
- setWrap(((Boolean) event.getNewValue()).booleanValue());
- return;
- }
- if (event.getProperty().equals(
UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_FILL)) {
setFill(((Boolean) event.getNewValue()).booleanValue());
return;
@@ -190,8 +168,6 @@ class CommitMessageViewer extends SourceViewer implements
store.addPropertyChangeListener(listener);
fill = store
.getBoolean(UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_FILL);
- setWrap(store
- .getBoolean(UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_WRAP));
// global action handlers for select all and copy
final IAction selectAll = new Action() {
@@ -325,7 +301,6 @@ class CommitMessageViewer extends SourceViewer implements
// so we only rebuild this when the commit did in fact change
if (input == commit)
return;
- currentDiffs.clear();
commit = (PlotCommit<?>) input;
if (refsChangedListener != null) {
refsChangedListener.remove();
@@ -386,10 +361,8 @@ class CommitMessageViewer extends SourceViewer implements
.getAdapter(IWorkbenchSiteProgressService.class);
if (siteService == null)
return;
- FormatJob.FormatRequest formatRequest = new FormatJob.FormatRequest(getRepository(),
- commit, fill, currentDiffs, SYS_LINKCOLOR, SYS_DARKGRAY,
- SYS_HUNKHEADER_COLOR, SYS_LINES_ADDED_COLOR,
- SYS_LINES_REMOVED_COLOR,
+ FormatJob.FormatRequest formatRequest = new FormatJob.FormatRequest(
+ getRepository(), commit, fill, SYS_LINKCOLOR, SYS_DARKGRAY,
allRefs);
formatJob = new FormatJob(formatRequest);
addDoneListenerToFormatJob();
@@ -445,27 +418,11 @@ class CommitMessageViewer extends SourceViewer implements
}
}
- private void setWrap(boolean wrap) {
- getTextWidget().setWordWrap(wrap);
- }
-
private void setFill(boolean fill) {
this.fill = fill;
format();
}
- public void selectionChanged(SelectionChangedEvent event) {
- currentDiffs.clear();
- ISelection selection = event.getSelection();
- if (selection instanceof IStructuredSelection) {
- IStructuredSelection sel = (IStructuredSelection) selection;
- for (Object obj : sel.toList())
- if (obj instanceof FileDiff)
- currentDiffs.add((FileDiff) obj);
- }
- format();
- }
-
/**
* Get style range at x/y coordinates
*
@@ -487,4 +444,5 @@ class CommitMessageViewer extends SourceViewer implements
else
return null;
}
+
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
index dd79730734..125f0cbf16 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
@@ -64,13 +64,11 @@ class FormatJob extends Job {
synchronized(lock) {
SWTCommit commit = (SWTCommit)formatRequest.getCommit();
commit.parseBody();
- builder = new CommitInfoBuilder(formatRequest.getRepository(), commit,
- formatRequest.getCurrentDiffs(), formatRequest.isFill(), formatRequest.getAllRefs());
+ builder = new CommitInfoBuilder(formatRequest.getRepository(),
+ commit, formatRequest.isFill(),
+ formatRequest.getAllRefs());
builder.setColors(formatRequest.getLinkColor(),
- formatRequest.getDarkGrey(),
- formatRequest.getHunkheaderColor(),
- formatRequest.getLinesAddedColor(),
- formatRequest.getLinesRemovedColor());
+ formatRequest.getDarkGrey());
}
commitInfo = builder.format(styles, monitor);
} catch (IOException e) {
@@ -109,30 +107,6 @@ class FormatJob extends Job {
this.darkGrey = darkGrey;
}
- public Color getHunkheaderColor() {
- return hunkheaderColor;
- }
-
- public void setHunkheaderColor(Color hunkheaderColor) {
- this.hunkheaderColor = hunkheaderColor;
- }
-
- public Color getLinesAddedColor() {
- return linesAddedColor;
- }
-
- public void setLinesAddedColor(Color linesAddedColor) {
- this.linesAddedColor = linesAddedColor;
- }
-
- public Color getLinesRemovedColor() {
- return linesRemovedColor;
- }
-
- public void setLinesRemovedColor(Color linesRemovedColor) {
- this.linesRemovedColor = linesRemovedColor;
- }
-
public Collection<Ref> getAllRefs() {
return allRefs;
}
@@ -147,33 +121,20 @@ class FormatJob extends Job {
private boolean fill;
- List<FileDiff> currentDiffs;
-
private Color linkColor;
private Color darkGrey;
- private Color hunkheaderColor;
-
- private Color linesAddedColor;
-
- private Color linesRemovedColor;
-
private Collection<Ref> allRefs;
FormatRequest(Repository repository, PlotCommit<?> commit,
- boolean fill, List<FileDiff> currentDiffs, Color linkColor,
- Color darkGrey, Color hunkheaderColor, Color linesAddedColor,
- Color linesRemovedColor, Collection<Ref> allRefs) {
+ boolean fill, Color linkColor, Color darkGrey,
+ Collection<Ref> allRefs) {
this.repository = repository;
this.commit = commit;
this.fill = fill;
- this.currentDiffs = new ArrayList<FileDiff>(currentDiffs);
this.linkColor = linkColor;
this.darkGrey = darkGrey;
- this.hunkheaderColor = hunkheaderColor;
- this.linesAddedColor = linesAddedColor;
- this.linesRemovedColor = linesRemovedColor;
this.allRefs = allRefs;
}
@@ -189,10 +150,6 @@ class FormatJob extends Job {
return fill;
}
- public List<FileDiff> getCurrentDiffs() {
- return currentDiffs;
- }
-
}
static class FormatResult{
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
index 8a27d32835..95c4a1d6e9 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
@@ -27,7 +27,10 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.core.AdapterUtils;
@@ -38,6 +41,8 @@ import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.commit.DiffStyleRangeFormatter;
+import org.eclipse.egit.ui.internal.commit.DiffViewer;
import org.eclipse.egit.ui.internal.repository.tree.AdditionalRefNode;
import org.eclipse.egit.ui.internal.repository.tree.FileNode;
import org.eclipse.egit.ui.internal.repository.tree.FolderNode;
@@ -53,12 +58,17 @@ import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
import org.eclipse.jface.text.hyperlink.MultipleHyperlinkPresenter;
@@ -101,12 +111,16 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
@@ -128,6 +142,7 @@ import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.progress.UIJob;
/** Graphical commit history viewer. */
public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
@@ -624,6 +639,8 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
/** Viewer displaying the currently selected commit of {@link #graph}. */
private CommitMessageViewer commentViewer;
+ private DiffViewer diffViewer;
+
/** Viewer displaying file difference implied by {@link #graph}'s commit. */
private CommitFileDiffViewer fileViewer;
@@ -683,6 +700,10 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
if (UIPreferences.HISTORY_MAX_BRANCH_LENGTH.equals(prop)
|| UIPreferences.HISTORY_MAX_TAG_LENGTH.equals(prop))
graph.getTableView().refresh();
+ if (UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_WRAP.equals(prop)) {
+ setWrap(((Boolean) event.getNewValue()).booleanValue());
+ }
+
}
};
@@ -698,6 +719,10 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
private final RenameTracker renameTracker = new RenameTracker();
+ private ScrolledComposite commentAndDiffScrolledComposite;
+
+ private Composite commentAndDiffComposite;
+
/**
* Determine if the input can be shown in this viewer.
*
@@ -789,7 +814,31 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
.addPropertyChangeListener(listener);
revInfoSplit = new SashForm(graphDetailSplit, SWT.HORIZONTAL);
- commentViewer = new CommitMessageViewer(revInfoSplit, getSite(), getPartSite());
+
+ commentAndDiffScrolledComposite = new ScrolledComposite(revInfoSplit,
+ SWT.H_SCROLL | SWT.V_SCROLL);
+ commentAndDiffScrolledComposite.setExpandHorizontal(true);
+ commentAndDiffScrolledComposite.setExpandVertical(true);
+
+ commentAndDiffComposite = new Composite(commentAndDiffScrolledComposite, SWT.NONE);
+ commentAndDiffScrolledComposite.setContent(commentAndDiffComposite);
+ commentAndDiffComposite.setLayout(GridLayoutFactory.fillDefaults()
+ .create());
+
+ commentViewer = new CommitMessageViewer(commentAndDiffComposite,
+ getSite(), getPartSite());
+ commentViewer.getControl().setLayoutData(
+ GridDataFactory.fillDefaults().grab(true, false).create());
+
+ commentViewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ resizeCommentAndDiffScrolledComposite();
+ }
+ });
+
+ commentAndDiffComposite.setBackground(commentViewer.getControl()
+ .getBackground());
+
TextSourceViewerConfiguration configuration = new TextSourceViewerConfiguration(
EditorsUI.getPreferenceStore()) {
@@ -819,7 +868,37 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
commentViewer.configure(configuration);
+ diffViewer = new DiffViewer(commentAndDiffComposite, null, SWT.NONE, false);
+ diffViewer.getControl().setLayoutData(
+ GridDataFactory.fillDefaults().grab(true, false).create());
+ diffViewer.setEditable(false);
+
+ setWrap(store
+ .getBoolean(UIPreferences.RESOURCEHISTORY_SHOW_COMMENT_WRAP));
+
+ commentAndDiffScrolledComposite.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ if (commentViewer.getTextWidget().getWordWrap())
+ resizeCommentAndDiffScrolledComposite();
+ }
+ });
+
fileViewer = new CommitFileDiffViewer(revInfoSplit, getSite());
+ fileViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ List<FileDiff> diffs = new ArrayList<FileDiff>();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection sel = (IStructuredSelection) selection;
+ for (Object obj : sel.toList())
+ if (obj instanceof FileDiff)
+ diffs.add((FileDiff) obj);
+ }
+ formatDiffs(diffs);
+ }
+ });
+
findToolbar = new FindToolbar(historyControl);
layoutSashForm(graphDetailSplit,
@@ -1808,10 +1887,71 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
fileViewer.setTreeWalk(db, fileWalker);
fileViewer.setInterestingPaths(fileViewerInterestingPaths);
fileViewer.refresh();
- fileViewer.addSelectionChangedListener(commentViewer);
return fileWalker;
}
+ private void formatDiffs(final List<FileDiff> diffs) {
+ final Repository repository = fileViewer.getRepository();
+ Job formatJob = new Job(UIText.GitHistoryPage_FormatDiffJobName) {
+ protected IStatus run(IProgressMonitor monitor) {
+ final IDocument document = new Document();
+ final DiffStyleRangeFormatter formatter = new DiffStyleRangeFormatter(
+ document);
+
+ monitor.beginTask("", diffs.size()); //$NON-NLS-1$
+ for (FileDiff diff : diffs) {
+ if (monitor.isCanceled())
+ break;
+ if (diff.getCommit().getParentCount() > 1)
+ break;
+ monitor.setTaskName(diff.getPath());
+ try {
+ formatter.write(repository, diff);
+ } catch (IOException ignore) {
+ // Ignored
+ }
+ monitor.worked(1);
+ }
+ monitor.done();
+ UIJob uiJob = new UIJob(UIText.GitHistoryPage_FormatDiffJobName) {
+ public IStatus runInUIThread(IProgressMonitor uiMonitor) {
+ if (UIUtils.isUsable(diffViewer)) {
+ diffViewer.setDocument(document);
+ diffViewer.setFormatter(formatter);
+ resizeCommentAndDiffScrolledComposite();
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ uiJob.schedule();
+ return Status.OK_STATUS;
+ }
+ };
+ formatJob.schedule();
+ }
+
+ private void setWrap(boolean wrap) {
+ commentViewer.getTextWidget().setWordWrap(wrap);
+ diffViewer.getTextWidget().setWordWrap(wrap);
+ resizeCommentAndDiffScrolledComposite();
+ }
+
+ private void resizeCommentAndDiffScrolledComposite() {
+ int widthHint;
+ if (commentViewer.getTextWidget().getWordWrap()) {
+ widthHint = commentAndDiffScrolledComposite.getClientArea().width;
+ if (commentAndDiffScrolledComposite.getVerticalBar() != null
+ && !commentAndDiffScrolledComposite.getVerticalBar().isVisible())
+ widthHint -= commentAndDiffScrolledComposite.getVerticalBar().getSize().x;
+ } else {
+ widthHint = SWT.DEFAULT;
+ }
+ Point size = commentAndDiffComposite
+ .computeSize(widthHint, SWT.DEFAULT);
+ commentAndDiffComposite.setSize(size);
+ commentAndDiffScrolledComposite.setMinSize(size);
+ }
+
private TreeWalk createFileWalker(RevWalk walk, Repository db, List<FilterPath> paths) {
final TreeWalk fileWalker = new TreeWalk(db);
fileWalker.setRecursive(true);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
index c0993748f9..a9a9241d81 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
@@ -214,6 +214,7 @@ GitHistoryPage_SetAsBaselineMenuLabel=&Set as Baseline
GitHistoryPage_ShowAdditionalRefsMenuLabel=&Additional Refs
GitHistoryPage_ShowAllBranchesMenuLabel=All &Branches and Tags
GitHistoryPage_FollowRenames=&Follow Renames
+GitHistoryPage_FormatDiffJobName=Updating Diff
GitHistoryPage_FilterSubMenuLabel=&Filter
GitHistoryPage_IncompleteListTooltip=Not all commits are shown, the limit may be exceeded or the job building the list may have been aborted
GitHistoryPage_InRevisionCommentSubMenuLabel=&In Revision Comment
@@ -793,9 +794,6 @@ CommitMessageViewer_author=Author
CommitMessageViewer_child=Child
CommitMessageViewer_branches=Branches
CommitMessageViewer_MoreBranches=\ and {0} more branches
-CommitMessageViewer_BuildDiffListTaskName=Building diffs for the selected files
-CommitMessageViewer_BuildDiffTaskName=Building diff for file {0}
-CommitMessageViewer_CanNotRenderDiffMessage=Cannot render diff, as the current commit has multiple parents
CommitMessageViewer_tags=Tags
CommitMessageViewer_follows=Follows
CommitMessageViewer_precedes=Precedes

Back to the top