public MainWindow()
        {
            InitializeComponent();
            _loader = new Record.LoadDetailsDelegate((r) =>
            {
                Thread.Sleep(2000);
                return(new RevisionChanges
                {
                    ChangedBy = "Test User",
                    AuthorizedAs = "Test Auth",
                    Fields = new[]
                    {
                        new Field {
                            Name = "Id", ReferenceName = "System.Id", OriginalValue = r.Owner.Id, Value = r.Owner.Id
                        },
                        new Field {
                            Name = "Rev", ReferenceName = "System.Rev", OriginalValue = r.Rev, Value = r.Rev
                        },
                        new Field {
                            Name = "test", ReferenceName = "System.test", OriginalValue = "Orig", Value = "val"
                        },
                        new Field {
                            Name = "testusr", ReferenceName = "System.testusr", OriginalValue = "Orig", Value = "val", IsChangedByUser = true
                        },
                        new Field {
                            Name = "testeq", ReferenceName = "System.testeq", OriginalValue = "eq", Value = "eq"
                        }
                    },
                    Attachments = new[]
                    {
                        new Attachment
                        {
                            IsAdded = true,
                            Name = "testAttach",
                            Uri = new Uri("http://localhost/attachment/test.txt")
                        }
                    },
                    Changesets = new[]
                    {
                        new Changeset
                        {
                            Id = 5,
                            Uri = new Uri("http://localhost/changeset/id"),
                            IsAdded = true,
                            Comment = "TestCS"
                        }
                    }
                });
            });

            var controller = (ViewportController)Resources["controller"];

            controller.ShowChangeset = (id) =>
            {
                MessageBox.Show(this, id.ToString());
            };
            var items = GetData(_offset, new [] { "State" });

            DataContext = new DataModel(items);
        }
        private Record MapRecord(Revision r, Revision prev, Item owner,
                                 string[] displayFields, Record.LoadDetailsDelegate loader)
        {
            var prevChangesetHash   = new HashSet <string>(prev == null ? Enumerable.Empty <string>() : prev.Links.OfType <ExternalLink>().Select(a => a.LinkedArtifactUri));
            var prevAttachmentsHash = new HashSet <int>(prev == null ? Enumerable.Empty <int>() : prev.Attachments.OfType <Attachment>().Select(a => a.Id));
            var changesetHash       = new HashSet <string>(r.Links.OfType <ExternalLink>().Select(a => a.LinkedArtifactUri));
            var attachmentsHash     = new HashSet <int>(r.Attachments.OfType <Attachment>().Select(a => a.Id));

            return(new Record(owner, loader)
            {
                Rev = Convert.ToInt32(r.Fields[CoreField.Rev].Value),
                Date = Convert.ToDateTime(r.Fields[CoreField.ChangedDate].Value),
                State = Convert.ToString(r.Fields[CoreField.State].Value),
                AddedAttachments = attachmentsHash.Except(prevAttachmentsHash).Count(),
                RemovedAttachments = prevAttachmentsHash.Except(attachmentsHash).Count(),
                AddedChangesets = changesetHash.Except(prevChangesetHash).Count(),
                RemovedChangesets = prevChangesetHash.Except(changesetHash).Count(),
                DisplayFields = displayFields == null
                                        ? null
                                        : displayFields.Where(d => r.Fields.Contains(d)).
                                Select(d => r.Fields[d]).
                                Select(d => new Details.Field
                {
                    Name = d.Name,
                    ReferenceName = d.ReferenceName,
                    OriginalValue = Convert.ToString(d.OriginalValue),
                    Value = Convert.ToString(d.Value)
                }).ToArray()
            });
        }
        private Item MapItem(WorkItem workItem, string[] displayFields, Record.LoadDetailsDelegate loader)
        {
            var item = new Item
            {
                Id    = workItem.Id,
                Title = workItem.Title
            };
            var      records = new List <Record>();
            Revision prev    = null;

            foreach (Revision r in workItem.Revisions)
            {
                records.Add(MapRecord(r, prev, item, displayFields, loader));
                prev = r;
            }
            item.Records = records.ToArray();
            return(item);
        }
        internal Item[] GetItems(WorkItem[] workItems, string[] displayFields)
        {
            if (workItems == null)
            {
                return(null);
            }
            var loader = new Record.LoadDetailsDelegate((r) =>
            {
                return(GetChanges(r.Owner.Id, r.Rev));
            });
            var items = new Dictionary <WorkItem, Item>(new WorkItemEqualityComparer());

            foreach (var workItem in workItems)
            {
                items.Add(workItem, MapItem(workItem, displayFields, loader));
                foreach (var relatedItem in GetRelatedItems(workItem, displayFields, loader))
                {
                    items.Add(relatedItem.Item1, relatedItem.Item2);
                }
            }
            FillLinks(items);
            return(items.Values.ToArray());
        }
 private IEnumerable <Tuple <WorkItem, Item> > GetRelatedItems(WorkItem workItem, string[] displayFields, Record.LoadDetailsDelegate loader)
 {
     return(workItem.Links.OfType <RelatedLink>().
            Select(l => workItem.Store.GetWorkItem(l.RelatedWorkItemId)).
            Select(w => Tuple.Create(w, MapItem(w, displayFields, loader))));
 }