| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715 |
- using System;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEngine;
- using Codice.Client.BaseCommands;
- using Codice.Client.Commands;
- using Codice.Client.Common.FsNodeReaders;
- using Codice.CM.Common;
- using GluonGui;
- using PlasticGui;
- using PlasticGui.Gluon.WorkspaceWindow;
- using PlasticGui.Gluon.WorkspaceWindow.Views.IncomingChanges;
- using PlasticGui.WorkspaceWindow.Diff;
- using Unity.PlasticSCM.Editor.AssetUtils;
- using Unity.PlasticSCM.Editor.UI;
- using Unity.PlasticSCM.Editor.UI.Progress;
- using Unity.PlasticSCM.Editor.UI.Tree;
- using Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon.Errors;
- using Unity.PlasticSCM.Editor.Tool;
- namespace Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon
- {
- internal class IncomingChangesTab :
- IIncomingChangesTab,
- IRefreshableView,
- IncomingChangesViewLogic.IIncomingChangesView,
- IIncomingChangesViewMenuOperations,
- IncomingChangesViewMenu.IMetaMenuOperations
- {
- internal IncomingChangesTab(
- WorkspaceInfo wkInfo,
- ViewHost viewHost,
- WorkspaceWindow workspaceWindow,
- NewIncomingChangesUpdater newIncomingChangesUpdater,
- CheckIncomingChanges.IUpdateIncomingChanges updateIncomingChanges,
- EditorWindow parentWindow)
- {
- mWkInfo = wkInfo;
- mNewIncomingChangesUpdater = newIncomingChangesUpdater;
- mParentWindow = parentWindow;
- BuildComponents();
- mProgressControls = new ProgressControlsForViews();
- mErrorsSplitterState = PlasticSplitterGUILayout.InitSplitterState(
- new float[] { 0.75f, 0.25f },
- new int[] { 100, 100 },
- new int[] { 100000, 100000 }
- );
- mErrorDetailsSplitterState = PlasticSplitterGUILayout.InitSplitterState(
- new float[] { 0.60f, 0.40f },
- new int[] { 100, 100 },
- new int[] { 100000, 100000 }
- );
- mIncomingChangesViewLogic = new IncomingChangesViewLogic(
- wkInfo, viewHost, this, new UnityPlasticGuiMessage(parentWindow),
- mProgressControls, updateIncomingChanges,
- workspaceWindow.GluonProgressOperationHandler, workspaceWindow,
- new IncomingChangesViewLogic.ApplyWorkspaceLocalChanges(),
- new IncomingChangesViewLogic.OutOfDateItemsOperations(),
- new IncomingChangesViewLogic.ResolveUserName(),
- new IncomingChangesViewLogic.GetWorkingBranch(),
- NewChangesInWk.Build(wkInfo, new BuildWorkspacekIsRelevantNewChange()),
- null);
- mIncomingChangesViewLogic.Refresh();
- }
- bool IIncomingChangesTab.IsVisible
- {
- get { return mIsVisible; }
- set { mIsVisible = value; }
- }
- void IIncomingChangesTab.OnDisable()
- {
- TreeHeaderSettings.Save(
- mIncomingChangesTreeView.multiColumnHeader.state,
- UnityConstants.GLUON_INCOMING_CHANGES_TABLE_SETTINGS_NAME);
- TreeHeaderSettings.Save(
- mErrorsListView.multiColumnHeader.state,
- UnityConstants.GLUON_INCOMING_ERRORS_TABLE_SETTINGS_NAME);
- }
- void IIncomingChangesTab.Update()
- {
- mProgressControls.UpdateProgress(mParentWindow);
- }
- void IIncomingChangesTab.OnGUI()
- {
- DoActionsToolbar(
- mIsProcessMergesButtonVisible,
- mIsCancelMergesButtonVisible,
- mIsProcessMergesButtonEnabled,
- mIsCancelMergesButtonEnabled,
- mProcessMergesButtonText,
- mIncomingChangesViewLogic,
- mIncomingChangesTreeView,
- mProgressControls);
- bool splitterNeeded = mIsErrorsListVisible;
- if (splitterNeeded)
- PlasticSplitterGUILayout.BeginVerticalSplit(mErrorsSplitterState);
- DoIncomingChangesArea(
- mIncomingChangesTreeView,
- mPendingConflictsLabelData,
- mChangesToApplySummaryLabelText,
- mMessageLabelText,
- mIsMessageLabelVisible,
- mProgressControls.IsOperationRunning());
- DoErrorsArea(
- mErrorsListView,
- mErrorDetailsSplitterState,
- mErrorMessageLabelText,
- mIsErrorsListVisible,
- mIsErrorMessageLabelVisible);
- if (splitterNeeded)
- PlasticSplitterGUILayout.EndVerticalSplit();
- if (mProgressControls.HasNotification())
- {
- DrawProgressForViews.ForNotificationArea(
- mProgressControls.ProgressData);
- }
- }
- void IIncomingChangesTab.AutoRefresh()
- {
- mIncomingChangesViewLogic.AutoRefresh(DateTime.Now);
- }
- void IRefreshableView.Refresh()
- {
- if (mNewIncomingChangesUpdater != null)
- mNewIncomingChangesUpdater.Update(DateTime.Now);
- mIncomingChangesViewLogic.Refresh();
- }
- void IncomingChangesViewLogic.IIncomingChangesView.UpdateData(
- IncomingChangesTree tree,
- List<ErrorMessage> errorMessages,
- string processMergesButtonText,
- PendingConflictsLabelData conflictsLabelData,
- string changesToApplySummaryText)
- {
- ShowProcessMergesButton(processMergesButtonText);
- ((IncomingChangesViewLogic.IIncomingChangesView)this).
- UpdatePendingConflictsLabel(conflictsLabelData);
- mChangesToApplySummaryLabelText = changesToApplySummaryText;
- UpdateIncomingChangesTree(mIncomingChangesTreeView, tree);
- UpdateErrorsList(mErrorsListView, errorMessages);
- mIsErrorsListVisible = errorMessages.Count > 0;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.UpdatePendingConflictsLabel(
- PendingConflictsLabelData data)
- {
- mPendingConflictsLabelData = data;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.UpdateSolvedFileConflicts(
- List<IncomingChangeInfo> solvedConflicts,
- IncomingChangeInfo currentConflict)
- {
- mIncomingChangesTreeView.UpdateSolvedFileConflicts(
- solvedConflicts, currentConflict);
- }
- void IncomingChangesViewLogic.IIncomingChangesView.ShowMessage(
- string message, bool isErrorMessage)
- {
- if (isErrorMessage)
- {
- mErrorMessageLabelText = message;
- mIsErrorMessageLabelVisible = true;
- return;
- }
- mMessageLabelText = message;
- mIsMessageLabelVisible = true;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.HideMessage()
- {
- mMessageLabelText = string.Empty;
- mIsMessageLabelVisible = false;
- mErrorMessageLabelText = string.Empty;
- mIsErrorMessageLabelVisible = false;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.DisableProcessMergesButton()
- {
- mIsProcessMergesButtonEnabled = false;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.ShowCancelButton()
- {
- mIsCancelMergesButtonEnabled = true;
- mIsCancelMergesButtonVisible = true;
- }
- void IncomingChangesViewLogic.IIncomingChangesView.HideCancelButton()
- {
- mIsCancelMergesButtonEnabled = false;
- mIsCancelMergesButtonVisible = false;
- }
- SelectedIncomingChangesGroupInfo IIncomingChangesViewMenuOperations.GetSelectedIncomingChangesGroupInfo()
- {
- return IncomingChangesSelection.GetSelectedGroupInfo(mIncomingChangesTreeView);
- }
- void IIncomingChangesViewMenuOperations.MergeContributors()
- {
- List<IncomingChangeInfo> fileConflicts = IncomingChangesSelection.
- GetSelectedFileConflictsIncludingMeta(mIncomingChangesTreeView);
- mIncomingChangesViewLogic.ProcessMergesForConflicts(
- MergeContributorType.MergeContributors,
- fileConflicts,
- RefreshAsset.UnityAssetDatabase);
- }
- void IIncomingChangesViewMenuOperations.MergeKeepingSourceChanges()
- {
- List<IncomingChangeInfo> fileConflicts = IncomingChangesSelection.
- GetSelectedFileConflictsIncludingMeta(mIncomingChangesTreeView);
- mIncomingChangesViewLogic.ProcessMergesForConflicts(
- MergeContributorType.KeepSource,
- fileConflicts,
- RefreshAsset.UnityAssetDatabase);
- }
- void IIncomingChangesViewMenuOperations.MergeKeepingWorkspaceChanges()
- {
- List<IncomingChangeInfo> fileConflicts = IncomingChangesSelection.
- GetSelectedFileConflictsIncludingMeta(mIncomingChangesTreeView);
- mIncomingChangesViewLogic.ProcessMergesForConflicts(
- MergeContributorType.KeepDestination,
- fileConflicts,
- RefreshAsset.UnityAssetDatabase);
- }
- void IIncomingChangesViewMenuOperations.DiffIncomingChanges()
- {
- IncomingChangeInfo incomingChange = IncomingChangesSelection.
- GetSingleSelectedIncomingChange(mIncomingChangesTreeView);
- if (incomingChange == null)
- return;
- DiffIncomingChanges(
- incomingChange,
- mWkInfo);
- }
- void IIncomingChangesViewMenuOperations.DiffYoursWithIncoming()
- {
- if (LaunchTool.ShowDownloadPlasticExeWindow(true))
- return;
- IncomingChangeInfo incomingChange = IncomingChangesSelection.
- GetSingleSelectedIncomingChange(mIncomingChangesTreeView);
- if (incomingChange == null)
- return;
- DiffYoursWithIncoming(
- incomingChange,
- mWkInfo);
- }
- void IncomingChangesViewMenu.IMetaMenuOperations.DiffIncomingChanges()
- {
- IncomingChangeInfo incomingChange = IncomingChangesSelection.
- GetSingleSelectedIncomingChange(mIncomingChangesTreeView);
- if (incomingChange == null)
- return;
- DiffIncomingChanges(
- mIncomingChangesTreeView.GetMetaChange(incomingChange),
- mWkInfo);
- }
- void IncomingChangesViewMenu.IMetaMenuOperations.DiffYoursWithIncoming()
- {
- if (LaunchTool.ShowDownloadPlasticExeWindow(true))
- return;
- IncomingChangeInfo incomingChange = IncomingChangesSelection.
- GetSingleSelectedIncomingChange(mIncomingChangesTreeView);
- if (incomingChange == null)
- return;
- DiffYoursWithIncoming(
- mIncomingChangesTreeView.GetMetaChange(incomingChange),
- mWkInfo);
- }
- bool IncomingChangesViewMenu.IMetaMenuOperations.SelectionHasMeta()
- {
- return mIncomingChangesTreeView.SelectionHasMeta();
- }
- static void DiffIncomingChanges(
- IncomingChangeInfo incomingChange,
- WorkspaceInfo wkInfo)
- {
- if (LaunchTool.ShowDownloadPlasticExeWindow(true))
- return;
- DiffOperation.DiffRevisions(
- wkInfo,
- incomingChange.GetMount().RepSpec,
- incomingChange.GetBaseRevision(),
- incomingChange.GetRevision(),
- incomingChange.GetPath(),
- incomingChange.GetPath(),
- true,
- xDiffLauncher: null,
- imageDiffLauncher: null);
- }
- static void DiffYoursWithIncoming(
- IncomingChangeInfo incomingChange,
- WorkspaceInfo wkInfo)
- {
- if (LaunchTool.ShowDownloadPlasticExeWindow(true))
- return;
- DiffOperation.DiffYoursWithIncoming(
- wkInfo,
- incomingChange.GetMount(),
- incomingChange.GetRevision(),
- incomingChange.GetPath(),
- xDiffLauncher: null,
- imageDiffLauncher: null);
- }
- static void UpdateErrorsList(
- ErrorsListView errorsListView,
- List<ErrorMessage> errorMessages)
- {
- errorsListView.BuildModel(errorMessages);
- errorsListView.Reload();
- }
- void UpdateProcessMergesButtonText()
- {
- mProcessMergesButtonText =
- mIncomingChangesViewLogic.GetProcessMergesButtonText();
- }
- void ShowProcessMergesButton(string processMergesButtonText)
- {
- mProcessMergesButtonText = processMergesButtonText;
- mIsProcessMergesButtonEnabled = true;
- mIsProcessMergesButtonVisible = true;
- }
- void DoActionsToolbar(
- bool isProcessMergesButtonVisible,
- bool isCancelMergesButtonVisible,
- bool isProcessMergesButtonEnabled,
- bool isCancelMergesButtonEnabled,
- string processMergesButtonText,
- IncomingChangesViewLogic incomingChangesViewLogic,
- IncomingChangesTreeView incomingChangesTreeView,
- ProgressControlsForViews progressControls)
- {
- GUIStyle guiStyle = new GUIStyle();
- guiStyle.margin = new RectOffset(5, 5, 5, 5);
- EditorGUILayout.BeginHorizontal(guiStyle);
- if (isProcessMergesButtonVisible)
- {
- DoProcessMergesButton(
- isProcessMergesButtonEnabled,
- processMergesButtonText,
- incomingChangesViewLogic,
- incomingChangesTreeView);
- }
- if (isCancelMergesButtonVisible)
- {
- DoCancelMergesButton(
- isCancelMergesButtonEnabled,
- incomingChangesViewLogic);
- }
- if (progressControls.IsOperationRunning())
- {
- DrawProgressForViews.ForIndeterminateProgress(
- progressControls.ProgressData);
- }
- GUILayout.FlexibleSpace();
- DoRefreshButton(
- !progressControls.IsOperationRunning(),
- incomingChangesViewLogic);
- EditorGUILayout.EndHorizontal();
- }
- static void DoIncomingChangesArea(
- IncomingChangesTreeView incomingChangesTreeView,
- PendingConflictsLabelData pendingConflictsLabelData,
- string changesToApplySummaryLabelText,
- string messageLabelText,
- bool isMessageLabelVisible,
- bool isOperationRunning)
- {
- EditorGUILayout.BeginVertical();
- DoPendingConflictsAndChangesToApplyLabel(
- pendingConflictsLabelData,
- changesToApplySummaryLabelText);
- DoIncomingChangesTreeViewArea(
- incomingChangesTreeView,
- isOperationRunning);
- if (isMessageLabelVisible)
- DoInfoMessageArea(messageLabelText);
- EditorGUILayout.EndVertical();
- }
- static void DoProcessMergesButton(
- bool isEnabled,
- string processMergesButtonText,
- IncomingChangesViewLogic incomingChangesViewLogic,
- IncomingChangesTreeView incomingChangesTreeView)
- {
- GUI.enabled = isEnabled;
- if (DrawActionButton.For(processMergesButtonText))
- {
- List<IncomingChangeInfo> incomingChanges =
- incomingChangesViewLogic.GetCheckedChanges();
- incomingChangesTreeView.FillWithMeta(incomingChanges);
- if (incomingChanges.Count == 0)
- return;
- incomingChangesViewLogic.ProcessMergesForItems(
- incomingChanges,
- RefreshAsset.UnityAssetDatabase);
- }
- GUI.enabled = true;
- }
- void DoCancelMergesButton(
- bool isEnabled,
- IncomingChangesViewLogic incomingChangesViewLogic)
- {
- GUI.enabled = isEnabled;
- if (DrawActionButton.For(PlasticLocalization.GetString(
- PlasticLocalization.Name.CancelButton)))
- {
- incomingChangesViewLogic.Cancel();
- mIsCancelMergesButtonEnabled = false;
- }
- GUI.enabled = true;
- }
- void DoErrorsArea(
- ErrorsListView errorsListView,
- object splitterState,
- string errorMessageLabelText,
- bool isErrorsListVisible,
- bool isErrorMessageLabelVisible)
- {
- EditorGUILayout.BeginVertical();
- if (isErrorsListVisible)
- {
- DrawSplitter.ForHorizontalIndicator();
- DoErrorsListArea(errorsListView, splitterState);
- }
- if (isErrorMessageLabelVisible)
- DoErrorMessageArea(errorMessageLabelText);
- EditorGUILayout.EndVertical();
- }
- static void DoPendingConflictsAndChangesToApplyLabel(
- PendingConflictsLabelData pendingConflictsLabelData,
- string changesToApplySummaryLabelText)
- {
- EditorGUILayout.BeginHorizontal();
- GUIStyle pendingConflictsOfTotalStyle =
- pendingConflictsLabelData.HasPendingConflicts ?
- UnityStyles.IncomingChangesTab.RedPendingConflictsOfTotalLabel :
- UnityStyles.IncomingChangesTab.GreenPendingConflictsOfTotalLabel;
- GUILayout.Label(
- pendingConflictsLabelData.PendingConflictsOfTotalText,
- pendingConflictsOfTotalStyle);
- GUILayout.Label(
- pendingConflictsLabelData.PendingConflictsLabelText,
- UnityStyles.IncomingChangesTab.PendingConflictsLabel);
- GUILayout.Space(5);
- GUILayout.Label(
- changesToApplySummaryLabelText,
- UnityStyles.IncomingChangesTab.ChangesToApplySummaryLabel);
- GUILayout.FlexibleSpace();
- EditorGUILayout.EndHorizontal();
- }
- static void UpdateIncomingChangesTree(
- IncomingChangesTreeView incomingChangesTreeView,
- IncomingChangesTree tree)
- {
- incomingChangesTreeView.BuildModel(
- UnityIncomingChangesTree.BuildIncomingChangeCategories(tree));
- incomingChangesTreeView.Sort();
- incomingChangesTreeView.Reload();
- }
- static void DoIncomingChangesTreeViewArea(
- IncomingChangesTreeView incomingChangesTreeView,
- bool isOperationRunning)
- {
- GUI.enabled = !isOperationRunning;
- Rect rect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
- incomingChangesTreeView.OnGUI(rect);
- GUI.enabled = true;
- }
- void DoErrorsListArea(
- ErrorsListView errorsListView,
- object splitterState)
- {
- EditorGUILayout.BeginVertical();
- GUILayout.Label(
- PlasticLocalization.GetString(
- PlasticLocalization.Name.IncomingChangesCannotBeApplied),
- EditorStyles.boldLabel);
- DoErrorsListSplitViewArea(
- errorsListView, splitterState);
- EditorGUILayout.EndVertical();
- }
- static void DoErrorMessageArea(string message)
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.HelpBox(message, MessageType.Error);
- EditorGUILayout.EndHorizontal();
- }
- void DoErrorsListSplitViewArea(
- ErrorsListView errorsListView,
- object splitterState)
- {
- EditorGUILayout.BeginHorizontal();
- PlasticSplitterGUILayout.BeginHorizontalSplit(splitterState);
- DoErrorsListViewArea(errorsListView);
- DoErrorDetailsTextArea(errorsListView.GetSelectedError());
- PlasticSplitterGUILayout.EndHorizontalSplit();
- EditorGUILayout.EndHorizontal();
- }
- static void DoErrorsListViewArea(
- ErrorsListView errorsListView)
- {
- Rect treeRect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
- errorsListView.OnGUI(treeRect);
- }
- void DoErrorDetailsTextArea(ErrorMessage selectedErrorMessage)
- {
- string errorDetailsText = selectedErrorMessage == null ?
- string.Empty : selectedErrorMessage.Error;
- mErrorDetailsScrollPosition = GUILayout.BeginScrollView(
- mErrorDetailsScrollPosition);
- GUILayout.TextArea(
- errorDetailsText, UnityStyles.TextFieldWithWrapping,
- GUILayout.ExpandHeight(true));
- GUILayout.EndScrollView();
- }
- static void DoRefreshButton(
- bool isEnabled,
- IncomingChangesViewLogic incomingChangesViewLogic)
- {
- GUI.enabled = isEnabled;
- if (GUILayout.Button(new GUIContent(
- Images.GetRefreshIcon())))
- incomingChangesViewLogic.Refresh();
- GUI.enabled = true;
- }
- static void DoInfoMessageArea(string message)
- {
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.HelpBox(message, MessageType.Info);
- EditorGUILayout.EndHorizontal();
- }
- void BuildComponents()
- {
- IncomingChangesTreeHeaderState incomingChangesHeaderState =
- IncomingChangesTreeHeaderState.GetDefault();
- TreeHeaderSettings.Load(incomingChangesHeaderState,
- UnityConstants.GLUON_INCOMING_CHANGES_TABLE_SETTINGS_NAME,
- (int)IncomingChangesTreeColumn.Path, true);
- mIncomingChangesTreeView = new IncomingChangesTreeView(
- mWkInfo, incomingChangesHeaderState,
- IncomingChangesTreeHeaderState.GetColumnNames(),
- new IncomingChangesViewMenu(this, this),
- UpdateProcessMergesButtonText);
- mIncomingChangesTreeView.Reload();
- ErrorsListHeaderState errorsListHeaderState =
- ErrorsListHeaderState.GetDefault();
- TreeHeaderSettings.Load(errorsListHeaderState,
- UnityConstants.GLUON_INCOMING_ERRORS_TABLE_SETTINGS_NAME,
- UnityConstants.UNSORT_COLUMN_ID);
- mErrorsListView = new ErrorsListView(errorsListHeaderState);
- mErrorsListView.Reload();
- }
- bool mIsVisible;
- bool mIsProcessMergesButtonVisible;
- bool mIsCancelMergesButtonVisible;
- bool mIsMessageLabelVisible;
- bool mIsErrorMessageLabelVisible;
- bool mIsErrorsListVisible;
- bool mIsProcessMergesButtonEnabled;
- bool mIsCancelMergesButtonEnabled;
- string mProcessMergesButtonText;
- string mMessageLabelText;
- string mErrorMessageLabelText;
- PendingConflictsLabelData mPendingConflictsLabelData;
- string mChangesToApplySummaryLabelText;
- IncomingChangesTreeView mIncomingChangesTreeView;
- ErrorsListView mErrorsListView;
- object mErrorsSplitterState;
- object mErrorDetailsSplitterState;
- readonly ProgressControlsForViews mProgressControls;
- Vector2 mErrorDetailsScrollPosition;
- readonly IncomingChangesViewLogic mIncomingChangesViewLogic;
- readonly EditorWindow mParentWindow;
- readonly NewIncomingChangesUpdater mNewIncomingChangesUpdater;
- readonly WorkspaceInfo mWkInfo;
- }
- }
|