diff options
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 |