/// <summary> /// Generates the diff from the current selection. /// </summary> /// <param name="context"></param> /// <param name="selection"></param> /// <param name="revisions"></param> /// <param name="visibleFilter"></param> /// <returns>The diff as a string.</returns> protected virtual string GetDiff(IAnkhServiceProvider context, ISelectionContext selection, SvnRevisionRange revisions, Predicate<SvnItem> visibleFilter) { if (selection == null) throw new ArgumentNullException("selection"); if (context == null) throw new ArgumentNullException("context"); IUIShell uiShell = context.GetService<IUIShell>(); bool foundModified = false; foreach (SvnItem item in selection.GetSelectedSvnItems(true)) { if (item.IsModified || item.IsDocumentDirty) { foundModified = true; break; // no need (yet) to keep searching } } PathSelectorInfo info = new PathSelectorInfo("Select items for diffing", selection.GetSelectedSvnItems(true)); info.VisibleFilter += visibleFilter; if (foundModified) info.CheckedFilter += delegate(SvnItem item) { return item.IsFile && (item.IsModified || item.IsDocumentDirty); }; info.RevisionStart = revisions == null ? SvnRevision.Base : revisions.StartRevision; info.RevisionEnd = revisions == null ? SvnRevision.Working : revisions.EndRevision; PathSelectorResult result; // should we show the path selector? if (!Shift && (revisions == null || !foundModified)) { result = uiShell.ShowPathSelector(info); if (!result.Succeeded) return null; } else result = info.DefaultResult; if (!result.Succeeded) return null; SaveAllDirtyDocuments(selection, context); return DoExternalDiff(context, result); }