| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- using System.Collections.Generic;
- using System.IO;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
- using Codice.Client.BaseCommands.Merge;
- using Codice.Client.Common;
- using Codice.CM.Common;
- using PlasticGui.WorkspaceWindow.Merge;
- using Unity.PlasticSCM.Editor.UI;
- using Unity.PlasticSCM.Editor.UI.Tree;
- namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Developer
- {
- internal class IncomingChangesTreeView : TreeView
- {
- internal IncomingChangesTreeView(
- WorkspaceInfo wkInfo,
- IncomingChangesTreeHeaderState headerState,
- List<string> columnNames,
- IncomingChangesViewMenu menu)
- : base(new TreeViewState())
- {
- mWkInfo = wkInfo;
- mColumnNames = columnNames;
- mMenu = menu;
- multiColumnHeader = new MultiColumnHeader(headerState);
- multiColumnHeader.canSort = true;
- multiColumnHeader.sortingChanged += SortingChanged;
- customFoldoutYOffset = UnityConstants.TREEVIEW_FOLDOUT_Y_OFFSET;
- rowHeight = UnityConstants.TREEVIEW_ROW_HEIGHT;
- showAlternatingRowBackgrounds = false;
- }
- public override IList<TreeViewItem> GetRows()
- {
- return mRows;
- }
- protected override bool CanChangeExpandedState(TreeViewItem item)
- {
- return item is ChangeCategoryTreeViewItem;
- }
- protected override TreeViewItem BuildRoot()
- {
- return new TreeViewItem(0, -1, string.Empty);
- }
- protected override IList<TreeViewItem> BuildRows(TreeViewItem rootItem)
- {
- try
- {
- RegenerateRows(
- mIncomingChangesTree,
- mTreeViewItemIds,
- this,
- rootItem,
- mRows,
- mExpandCategories);
- }
- finally
- {
- mExpandCategories = false;
- }
- return mRows;
- }
- protected override void CommandEventHandling()
- {
- // NOTE - empty override to prevent crash when pressing ctrl-a in the treeview
- }
- protected override void ContextClickedItem(int id)
- {
- mMenu.Popup();
- Repaint();
- }
- protected override void RowGUI(RowGUIArgs args)
- {
- DrawTreeViewItem.InitializeStyles();
- if (args.item is ChangeCategoryTreeViewItem)
- {
- ChangeCategoryTreeViewItem categoryItem =
- (ChangeCategoryTreeViewItem)args.item;
- CategoryTreeViewItemGUI(
- args.rowRect, rowHeight,
- categoryItem,
- GetSolvedChildrenCount(categoryItem.Category, mSolvedFileConflicts),
- args.selected,
- args.focused);
- return;
- }
- if (args.item is ChangeTreeViewItem)
- {
- ChangeTreeViewItem changeTreeViewItem =
- (ChangeTreeViewItem)args.item;
- MergeChangeInfo changeInfo =
- changeTreeViewItem.ChangeInfo;
- bool isCurrentConflict = IsCurrent.Conflict(
- changeInfo,
- mIncomingChangesTree.GetMetaChange(changeInfo),
- mSolvedFileConflicts);
- bool isSolvedConflict = IsSolved.Conflict(
- changeInfo,
- mIncomingChangesTree.GetMetaChange(changeInfo),
- mSolvedFileConflicts);
- IncomingChangeTreeViewItemGUI(
- mWkInfo.ClientPath,
- mIncomingChangesTree,
- this,
- changeTreeViewItem,
- args,
- isCurrentConflict,
- isSolvedConflict);
- return;
- }
- base.RowGUI(args);
- }
- internal void SelectFirstUnsolvedDirectoryConflict()
- {
- foreach (MergeChangesCategory category in mIncomingChangesTree.GetNodes())
- {
- if (category.CategoryType != MergeChangesCategory.Type.DirectoryConflicts)
- continue;
- foreach (MergeChangeInfo changeInfo in category.GetChanges())
- {
- if (changeInfo.DirectoryConflict.IsResolved())
- continue;
- int itemId = -1;
- if (mTreeViewItemIds.TryGetInfoItemId(changeInfo, out itemId))
- {
- SetSelection(new List<int>() { itemId });
- return;
- }
- }
- }
- }
- internal void BuildModel(UnityIncomingChangesTree tree)
- {
- mTreeViewItemIds.Clear();
- mIncomingChangesTree = tree;
- mSolvedFileConflicts = null;
- mExpandCategories = true;
- }
- internal void Sort()
- {
- int sortedColumnIdx = multiColumnHeader.state.sortedColumnIndex;
- bool sortAscending = multiColumnHeader.IsSortedAscending(sortedColumnIdx);
- mIncomingChangesTree.Sort(mColumnNames[sortedColumnIdx], sortAscending);
- }
- internal void UpdateSolvedFileConflicts(
- MergeSolvedFileConflicts solvedFileConflicts)
- {
- mSolvedFileConflicts = solvedFileConflicts;
- }
- internal MergeChangeInfo GetMetaChange(MergeChangeInfo change)
- {
- if (change == null)
- return null;
- return mIncomingChangesTree.GetMetaChange(change);
- }
- internal void FillWithMeta(List<MergeChangeInfo> changes)
- {
- mIncomingChangesTree.FillWithMeta(changes);
- }
- internal bool SelectionHasMeta()
- {
- MergeChangeInfo selectedChangeInfo = GetSelectedIncomingChange();
- if (selectedChangeInfo == null)
- return false;
- return mIncomingChangesTree.HasMeta(selectedChangeInfo);
- }
- internal MergeChangeInfo GetSelectedIncomingChange()
- {
- IList<int> selectedIds = GetSelection();
- if (selectedIds.Count != 1)
- return null;
- int selectedId = selectedIds[0];
- foreach (KeyValuePair<MergeChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (selectedId == item.Value)
- return item.Key;
- }
- return null;
- }
- internal List<MergeChangeInfo> GetSelectedIncomingChanges()
- {
- List<MergeChangeInfo> result = new List<MergeChangeInfo>();
- IList<int> selectedIds = GetSelection();
- if (selectedIds.Count == 0)
- return result;
- foreach (KeyValuePair<MergeChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
- result.Add(item.Key);
- }
- return result;
- }
- internal List<MergeChangeInfo> GetSelectedFileConflicts()
- {
- List<MergeChangeInfo> result = new List<MergeChangeInfo>();
- IList<int> selectedIds = GetSelection();
- if (selectedIds.Count == 0)
- return result;
- foreach (KeyValuePair<MergeChangeInfo, int> item
- in mTreeViewItemIds.GetInfoItems())
- {
- if (!selectedIds.Contains(item.Value))
- continue;
- if (item.Key.CategoryType !=
- MergeChangesCategory.Type.FileConflicts)
- continue;
- result.Add(item.Key);
- }
- return result;
- }
- void SortingChanged(MultiColumnHeader multiColumnHeader)
- {
- Sort();
- Reload();
- }
- static void RegenerateRows(
- UnityIncomingChangesTree incomingChangesTree,
- TreeViewItemIds<MergeChangesCategory, MergeChangeInfo> treeViewItemIds,
- IncomingChangesTreeView treeView,
- TreeViewItem rootItem,
- List<TreeViewItem> rows,
- bool expandCategories)
- {
- if (incomingChangesTree == null)
- return;
- ClearRows(rootItem, rows);
- List<MergeChangesCategory> categories = incomingChangesTree.GetNodes();
- if (categories == null)
- return;
- List<int> categoriesToExpand = new List<int>();
- foreach (MergeChangesCategory category in categories)
- {
- int categoryId;
- if (!treeViewItemIds.TryGetCategoryItemId(category, out categoryId))
- categoryId = treeViewItemIds.AddCategoryItem(category);
- ChangeCategoryTreeViewItem categoryTreeViewItem =
- new ChangeCategoryTreeViewItem(categoryId, category);
- rootItem.AddChild(categoryTreeViewItem);
- rows.Add(categoryTreeViewItem);
- if (!ShouldExpandCategory(
- treeView,
- categoryTreeViewItem,
- expandCategories,
- categories.Count))
- continue;
- categoriesToExpand.Add(categoryTreeViewItem.id);
- foreach (MergeChangeInfo changeInfo in category.GetChanges())
- {
- int differenceId;
- if (!treeViewItemIds.TryGetInfoItemId(changeInfo, out differenceId))
- differenceId = treeViewItemIds.AddInfoItem(changeInfo);
- TreeViewItem changeTreeViewItem =
- new ChangeTreeViewItem(differenceId, changeInfo);
- categoryTreeViewItem.AddChild(changeTreeViewItem);
- rows.Add(changeTreeViewItem);
- }
- }
- treeView.state.expandedIDs = categoriesToExpand;
- }
- static void ClearRows(
- TreeViewItem rootItem,
- List<TreeViewItem> rows)
- {
- if (rootItem.hasChildren)
- rootItem.children.Clear();
- rows.Clear();
- }
- static void CategoryTreeViewItemGUI(
- Rect rowRect,
- float rowHeight,
- ChangeCategoryTreeViewItem item,
- int solvedChildrenCount,
- bool isSelected,
- bool isFocused)
- {
- Texture icon = GetCategoryIcon(item.Category.CategoryType);
- string label = item.Category.GetHeaderText();
- DefaultStyles.label = GetCategoryStyle(
- item.Category,
- solvedChildrenCount,
- isSelected);
- DrawTreeViewItem.ForCategoryItem(
- rowRect,
- rowHeight,
- item.depth,
- icon,
- label,
- isSelected,
- isFocused);
- DefaultStyles.label = UnityStyles.Tree.Label;
- }
- static void IncomingChangeTreeViewItemGUI(
- string wkPath,
- UnityIncomingChangesTree incomingChangesTree,
- IncomingChangesTreeView treeView,
- ChangeTreeViewItem item,
- RowGUIArgs args,
- bool isCurrentConflict,
- bool isSolvedConflict)
- {
- for (int visibleColumnIdx = 0; visibleColumnIdx < args.GetNumVisibleColumns(); visibleColumnIdx++)
- {
- Rect cellRect = args.GetCellRect(visibleColumnIdx);
- IncomingChangesTreeColumn column =
- (IncomingChangesTreeColumn)args.GetColumn(visibleColumnIdx);
- IncomingChangeTreeViewItemCellGUI(
- wkPath,
- cellRect,
- treeView.rowHeight,
- incomingChangesTree,
- treeView,
- item,
- column,
- args.selected,
- args.focused,
- isCurrentConflict,
- isSolvedConflict);
- }
- }
- static void IncomingChangeTreeViewItemCellGUI(
- string wkPath,
- Rect rect,
- float rowHeight,
- UnityIncomingChangesTree incomingChangesTree,
- IncomingChangesTreeView treeView,
- ChangeTreeViewItem item,
- IncomingChangesTreeColumn column,
- bool isSelected,
- bool isFocused,
- bool isCurrentConflict,
- bool isSolvedConflict)
- {
- MergeChangeInfo incomingChange = item.ChangeInfo;
- string label = incomingChange.GetColumnText(
- IncomingChangesTreeHeaderState.GetColumnName(column));
- if (column == IncomingChangesTreeColumn.Path)
- {
- if (incomingChangesTree.HasMeta(item.ChangeInfo))
- label = string.Concat(label, UnityConstants.TREEVIEW_META_LABEL);
- Texture icon = GetIcon(wkPath, incomingChange);
- GetChangesOverlayIcon.Data overlayIconData =
- GetChangesOverlayIcon.ForPlasticIncomingChange(
- incomingChange, isSolvedConflict);
- DrawTreeViewItem.ForItemCell(
- rect,
- rowHeight,
- item.depth,
- icon,
- overlayIconData,
- label,
- isSelected,
- isFocused,
- isCurrentConflict,
- false);
- return;
- }
- if (column == IncomingChangesTreeColumn.Size)
- {
- DrawTreeViewItem.ForSecondaryLabelRightAligned(
- rect, label, isSelected, isFocused, isCurrentConflict);
- return;
- }
- DrawTreeViewItem.ForSecondaryLabel(
- rect, label, isSelected, isFocused, isCurrentConflict);
- }
- static Texture GetCategoryIcon(
- MergeChangesCategory.Type categoryType)
- {
- switch (categoryType)
- {
- case MergeChangesCategory.Type.DirectoryConflicts:
- case MergeChangesCategory.Type.FileConflicts:
- return Images.GetImage(Images.Name.IconMergeConflict);
- case MergeChangesCategory.Type.Changed:
- return Images.GetImage(Images.Name.IconChanged);
- case MergeChangesCategory.Type.Moved:
- return Images.GetImage(Images.Name.IconMoved);
- case MergeChangesCategory.Type.Deleted:
- return Images.GetImage(Images.Name.IconDeleted);
- case MergeChangesCategory.Type.Added:
- return Images.GetImage(Images.Name.IconAdded);
- default:
- return null;
- }
- }
- static Texture GetIcon(
- string wkPath,
- MergeChangeInfo incomingChange)
- {
- RevisionInfo revInfo = incomingChange.GetRevision();
- bool isDirectory = revInfo.
- Type == EnumRevisionType.enDirectory;
- if (isDirectory || incomingChange.IsXLink())
- return Images.GetDirectoryIcon();
- string fullPath = WorkspacePath.GetWorkspacePathFromCmPath(
- wkPath,
- incomingChange.GetPath(),
- Path.DirectorySeparatorChar);
- return Images.GetFileIcon(fullPath);
- }
- static GUIStyle GetCategoryStyle(
- MergeChangesCategory category,
- int solvedChildrenCount,
- bool isSelected)
- {
- if (isSelected)
- return UnityStyles.Tree.Label;
- if (category.CategoryType == MergeChangesCategory.Type.FileConflicts ||
- category.CategoryType == MergeChangesCategory.Type.DirectoryConflicts)
- {
- return category.GetChildrenCount() > solvedChildrenCount ?
- UnityStyles.Tree.RedLabel : UnityStyles.Tree.GreenLabel;
- }
- return UnityStyles.Tree.Label;
- }
- static bool ShouldExpandCategory(
- IncomingChangesTreeView treeView,
- ChangeCategoryTreeViewItem categoryTreeViewItem,
- bool expandCategories,
- int categoriesCount)
- {
- if (expandCategories)
- {
- if (categoriesCount == 1)
- return true;
- if (categoryTreeViewItem.Category.CategoryType ==
- MergeChangesCategory.Type.FileConflicts)
- return true;
- if (categoryTreeViewItem.Category.GetChildrenCount() >
- NODES_TO_EXPAND_CATEGORY)
- return false;
- return true;
- }
- return treeView.IsExpanded(categoryTreeViewItem.id);
- }
- static int GetSolvedChildrenCount(
- MergeChangesCategory category,
- MergeSolvedFileConflicts solvedFileConflicts)
- {
- int solvedDirConflicts = 0;
- if (category.CategoryType == MergeChangesCategory.Type.DirectoryConflicts)
- {
- foreach (MergeChangeInfo change in category.GetChanges())
- {
- if (change.DirectoryConflict.IsResolved())
- solvedDirConflicts++;
- }
- return solvedDirConflicts;
- }
- return (solvedFileConflicts == null) ? 0 :
- solvedFileConflicts.GetCount();
- }
- bool mExpandCategories;
- TreeViewItemIds<MergeChangesCategory, MergeChangeInfo> mTreeViewItemIds =
- new TreeViewItemIds<MergeChangesCategory, MergeChangeInfo>();
- List<TreeViewItem> mRows = new List<TreeViewItem>();
- MergeSolvedFileConflicts mSolvedFileConflicts;
- UnityIncomingChangesTree mIncomingChangesTree;
- readonly IncomingChangesViewMenu mMenu;
- readonly List<string> mColumnNames;
- readonly WorkspaceInfo mWkInfo;
- const int NODES_TO_EXPAND_CATEGORY = 10;
- }
- }
|