diff options
author | Robin Stocker | 2014-08-10 13:05:05 +0000 |
---|---|---|
committer | Matthias Sohn | 2014-09-04 00:20:58 +0000 |
commit | 00f06f8ab1724347afed7ed3384a1f423599466d (patch) | |
tree | 66543768396e66c46d723246e048a7044d2cb312 | |
parent | 5c30dca8648889ae98c355096310ddec1d0a7215 (diff) | |
download | egit-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>
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 |