using System.Collections.Generic; using UnityEditor.IMGUI.Controls; using UnityEngine; using Codice.Client.Commands; using Codice.Client.Common; using Codice.CM.Common; using Codice.CM.Common.Merge; using Codice.CM.Common.Mount; using PlasticGui.WorkspaceWindow.PendingChanges; using Unity.PlasticSCM.Editor.UI; using Unity.PlasticSCM.Editor.UI.Tree; namespace Unity.PlasticSCM.Editor.Views.PendingChanges.PendingMergeLinks { internal class MergeLinksListView : TreeView { internal float DesiredHeight { get { return rowHeight * (mMergeLinks.Count + 1); } } internal MergeLinksListView() : base(new TreeViewState()) { rowHeight = UnityConstants.TREEVIEW_ROW_HEIGHT; showAlternatingRowBackgrounds = false; } public override IList GetRows() { return mRows; } protected override TreeViewItem BuildRoot() { return new TreeViewItem(0, -1, string.Empty); } protected override IList BuildRows(TreeViewItem rootItem) { RegenerateRows(mMergeLinks, rootItem, mRows); return mRows; } internal void BuildModel( IDictionary> pendingMergeLinks) { mMergeLinks = BuildMountPendingMergeLink(pendingMergeLinks); } protected override void BeforeRowsGUI() { int firstRowVisible; int lastRowVisible; GetFirstAndLastVisibleRows(out firstRowVisible, out lastRowVisible); GUI.DrawTexture(new Rect(0, firstRowVisible * rowHeight, GetRowRect(0).width, (lastRowVisible * rowHeight) + 500), Images.GetTreeviewBackgroundTexture()); DrawTreeViewItem.InitializeStyles(); base.BeforeRowsGUI(); } static void RegenerateRows( List mergeLinks, TreeViewItem rootItem, List rows) { ClearRows(rootItem, rows); if (mergeLinks.Count == 0) return; for (int i = 0; i < mergeLinks.Count; i++) { MergeLinkListViewItem mergeLinkListViewItem = new MergeLinkListViewItem(i + 1, mergeLinks[i]); rootItem.AddChild(mergeLinkListViewItem); rows.Add(mergeLinkListViewItem); } } static void ClearRows( TreeViewItem rootItem, List rows) { if (rootItem.hasChildren) rootItem.children.Clear(); rows.Clear(); } static List BuildMountPendingMergeLink( IDictionary> pendingMergeLinks) { List result = new List(); if (pendingMergeLinks == null) return result; foreach (KeyValuePair> mountLink in pendingMergeLinks) { result.AddRange(BuildMountPendingMergeLinks( mountLink.Key, mountLink.Value)); } return result; } static List BuildMountPendingMergeLinks( MountPoint mount, IList links) { List result = new List(); RepositoryInfo repInfo = RepositorySpecResolverProvider.Get(). GetRepInfo(mount.RepSpec); foreach (PendingMergeLink link in links) result.Add(new MountPendingMergeLink(repInfo.GetRepSpec(), link)); return result; } List mRows = new List(); List mMergeLinks = new List(); } }