123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652 |
- using System;
- using System.Collections.Generic;
-
- using UnityEditor;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
-
- using Codice.Client.Commands;
- using Codice.Client.Common;
- using Codice.Client.Common.EventTracking;
- using Codice.Client.Common.Threading;
- using Codice.CM.Common;
- using Codice.CM.Common.Mount;
- using PlasticGui;
- using PlasticGui.WorkspaceWindow;
- using PlasticGui.WorkspaceWindow.Update;
- using PlasticGui.WorkspaceWindow.QueryViews;
- using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
- using GluonGui;
- 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.Tool;
- using Unity.PlasticSCM.Editor.Views.Diff;
-
- using IGluonUpdateReport = PlasticGui.Gluon.IUpdateReport;
-
- namespace Unity.PlasticSCM.Editor.Views.Changesets
- {
- internal partial class ChangesetsTab :
- IRefreshableView,
- IQueryRefreshableView,
- IChangesetMenuOperations,
- ChangesetsViewMenu.IMenuOperations
- {
- internal ChangesetsListView Table { get { return mChangesetsListView; } }
- internal IChangesetMenuOperations Operations { get { return this; } }
-
- internal interface IRevertToChangesetListener
- {
- void OnSuccessOperation();
- }
-
- internal ChangesetsTab(
- WorkspaceInfo wkInfo,
- WorkspaceWindow workspaceWindow,
- IViewSwitcher viewSwitcher,
- IMergeViewLauncher mergeViewLauncher,
- IHistoryViewLauncher historyViewLauncher,
- ViewHost viewHost,
- IUpdateReport updateReport,
- IGluonUpdateReport gluonUpdateReport,
- NewIncomingChangesUpdater newIncomingChangesUpdater,
- IRevertToChangesetListener revertToChangesetListener,
- LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- LaunchTool.IProcessExecutor processExecutor,
- EditorWindow parentWindow,
- bool isGluonMode)
- {
- mWkInfo = wkInfo;
- mViewHost = viewHost;
- mWorkspaceWindow = workspaceWindow;
- mViewSwitcher = viewSwitcher;
- mRevertToChangesetListener = revertToChangesetListener;
- mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
- mProcessExecutor = processExecutor;
- mParentWindow = parentWindow;
- mIsGluonMode = isGluonMode;
- mGluonUpdateReport = gluonUpdateReport;
-
- BuildComponents(
- wkInfo,
- workspaceWindow,
- workspaceWindow,
- viewSwitcher,
- historyViewLauncher,
- parentWindow);
-
- mProgressControls = new ProgressControlsForViews();
-
- mSplitterState = PlasticSplitterGUILayout.InitSplitterState(
- new float[] { 0.50f, 0.50f },
- new int[] { 100, (int)UnityConstants.DIFF_PANEL_MIN_WIDTH },
- new int[] { 100000, 100000 }
- );
-
- mBorderColor = EditorGUIUtility.isProSkin
- ? (Color)new Color32(35, 35, 35, 255)
- : (Color)new Color32(153, 153, 153, 255);
-
- mChangesetOperations = new ChangesetOperations(
- wkInfo,
- workspaceWindow,
- viewSwitcher,
- mergeViewLauncher,
- this,
- ViewType.ChangesetsView,
- mProgressControls,
- updateReport,
- new ContinueWithPendingChangesQuestionerBuilder(viewSwitcher, parentWindow),
- newIncomingChangesUpdater,
- null,
- null);
-
- ((IRefreshableView)this).Refresh();
- }
-
- internal void OnDisable()
- {
- mDiffPanel.OnDisable();
-
- mSearchField.downOrUpArrowKeyPressed -=
- SearchField_OnDownOrUpArrowKeyPressed;
-
- TreeHeaderSettings.Save(
- mChangesetsListView.multiColumnHeader.state,
- UnityConstants.CHANGESETS_TABLE_SETTINGS_NAME);
- }
-
- internal void Update()
- {
- mDiffPanel.Update();
-
- mProgressControls.UpdateProgress(mParentWindow);
- }
-
- internal void OnGUI()
- {
- InitializeShowChangesButtonWidth();
-
- DoActionsToolbar(
- this,
- mProgressControls,
- mSearchField,
- mChangesetsListView,
- mDateFilter);
-
- PlasticSplitterGUILayout.BeginHorizontalSplit(mSplitterState);
-
- DoChangesetsArea(
- mChangesetsListView,
- mProgressControls.IsOperationRunning());
-
- EditorGUILayout.BeginHorizontal();
-
- Rect border = GUILayoutUtility.GetRect(1, 0, 1, 100000);
- EditorGUI.DrawRect(border, mBorderColor);
-
- DoChangesArea(mDiffPanel);
-
- EditorGUILayout.EndHorizontal();
-
- PlasticSplitterGUILayout.EndHorizontalSplit();
-
- }
-
- internal void DrawSearchFieldForChangesetsTab()
- {
- DrawSearchField.For(
- mSearchField,
- mChangesetsListView,
- UnityConstants.SEARCH_FIELD_WIDTH);
-
- VerifyIfSearchFieldIsRecentlyFocused(mSearchField);
- }
-
- internal void SetWorkingObjectInfo(WorkingObjectInfo homeInfo)
- {
- if (mIsGluonMode)
- return;
-
- lock (mLock)
- {
- mLoadedChangesetId = homeInfo.GetChangesetId();
- }
-
- mChangesetsListView.SetLoadedChangesetId(mLoadedChangesetId);
- mChangesetsViewMenu.SetLoadedBranchId(homeInfo.BranchInfo.BranchId);
- }
-
- internal void SetRevertToChangesetOperationInterfacesForTesting(
- RevertToChangesetOperation.IGetStatusForWorkspace getStatusForWorkspace,
- RevertToChangesetOperation.IUndoCheckoutOperation undoCheckoutOperation,
- RevertToChangesetOperation.IRevertToChangesetMergeController revertToChangesetMergeController)
- {
- mGetStatusForWorkspace = getStatusForWorkspace;
- mUndoCheckoutOperation = undoCheckoutOperation;
- mRevertToChangesetMergeController = revertToChangesetMergeController;
- }
-
- internal void SetLaunchToolForTesting(
- LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- LaunchTool.IProcessExecutor processExecutor)
- {
- mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
- mProcessExecutor = processExecutor;
- }
-
- void IRefreshableView.Refresh()
- {
- string query = GetChangesetsQuery(mDateFilter);
-
- FillChangesets(
- mWkInfo,
- query,
- ChangesetsSelection.GetSelectedRepObjectInfos(mChangesetsListView));
- }
-
- void IQueryRefreshableView.RefreshAndSelect(RepObjectInfo repObj)
- {
- string query = GetChangesetsQuery(mDateFilter);
-
- FillChangesets(
- mWkInfo,
- query,
- new List<RepObjectInfo> { repObj });
- }
-
- int IChangesetMenuOperations.GetSelectedChangesetsCount()
- {
- return ChangesetsSelection.GetSelectedChangesetsCount(mChangesetsListView);
- }
-
- void IChangesetMenuOperations.DiffChangeset()
- {
- LaunchDiffOperations.DiffChangeset(
- mShowDownloadPlasticExeWindow,
- mProcessExecutor,
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
- ChangesetsSelection.GetSelectedChangeset(mChangesetsListView),
- mIsGluonMode);
- }
-
- void IChangesetMenuOperations.DiffSelectedChangesets()
- {
- List<RepObjectInfo> selectedChangesets = ChangesetsSelection.
- GetSelectedRepObjectInfos(mChangesetsListView);
-
- if (selectedChangesets.Count < 2)
- return;
-
- LaunchDiffOperations.DiffSelectedChangesets(
- mShowDownloadPlasticExeWindow,
- mProcessExecutor,
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
- (ChangesetExtendedInfo)selectedChangesets[0],
- (ChangesetExtendedInfo)selectedChangesets[1],
- mIsGluonMode);
- }
-
- void IChangesetMenuOperations.SwitchToChangeset()
- {
- SwitchToChangesetForMode(mIsGluonMode);
- }
-
- void IChangesetMenuOperations.DiffWithAnotherChangeset() { }
- void IChangesetMenuOperations.CreateBranch() { }
- void IChangesetMenuOperations.LabelChangeset() { }
- void IChangesetMenuOperations.MergeChangeset() {}
- void IChangesetMenuOperations.CherryPickChangeset() { }
- void IChangesetMenuOperations.SubtractiveChangeset() { }
- void IChangesetMenuOperations.SubtractiveChangesetInterval() { }
- void IChangesetMenuOperations.CherryPickChangesetInterval() { }
- void IChangesetMenuOperations.MergeToChangeset() { }
- void IChangesetMenuOperations.MoveChangeset() { }
- void IChangesetMenuOperations.DeleteChangeset() { }
- void IChangesetMenuOperations.BrowseRepositoryOnChangeset() { }
- void IChangesetMenuOperations.CreateCodeReview() { }
-
- void IChangesetMenuOperations.RevertToChangeset()
- {
- if (((IChangesetMenuOperations)this).GetSelectedChangesetsCount() != 1)
- return;
-
- ChangesetExtendedInfo targetChangesetInfo = ((ChangesetsViewMenu.IMenuOperations)this).GetSelectedChangeset();
-
- RevertToChangesetOperation.RevertTo(
- mWkInfo,
- mViewSwitcher,
- mWorkspaceWindow,
- mProgressControls,
- mGetStatusForWorkspace,
- mUndoCheckoutOperation,
- mRevertToChangesetMergeController,
- GuiMessage.Get(),
- targetChangesetInfo,
- RefreshAsset.BeforeLongAssetOperation,
- RefreshAsset.AfterLongAssetOperation,
- mRevertToChangesetListener.OnSuccessOperation);
- }
-
- void SearchField_OnDownOrUpArrowKeyPressed()
- {
- mChangesetsListView.SetFocusAndEnsureSelectedItem();
- }
-
- void FillChangesets(WorkspaceInfo wkInfo, string query, List<RepObjectInfo> changesetsToSelect)
- {
- if (mIsRefreshing)
- return;
-
- mIsRefreshing = true;
-
- int defaultRow = TableViewOperations.
- GetFirstSelectedRow(mChangesetsListView);
-
- ((IProgressControls)mProgressControls).ShowProgress(
- PlasticLocalization.GetString(
- PlasticLocalization.Name.LoadingChangesets));
-
- ViewQueryResult queryResult = null;
-
- IThreadWaiter waiter = ThreadWaiter.GetWaiter();
- waiter.Execute(
- /*threadOperationDelegate*/ delegate
- {
- long loadedChangesetId = GetLoadedChangesetId(
- wkInfo, mIsGluonMode);
-
- long loadedBranchId = GetLoadedBranchId(
- wkInfo, loadedChangesetId, mIsGluonMode);
-
- lock (mLock)
- {
- mLoadedChangesetId = loadedChangesetId;
- }
-
- mChangesetsViewMenu.SetLoadedBranchId(loadedBranchId);
-
- queryResult = new ViewQueryResult(
- PlasticGui.Plastic.API.FindQuery(wkInfo, query));
- },
- /*afterOperationDelegate*/ delegate
- {
- try
- {
- if (waiter.Exception != null)
- {
- ExceptionsHandler.DisplayException(waiter.Exception);
- return;
- }
-
- UpdateChangesetsList(
- mChangesetsListView,
- queryResult,
- mLoadedChangesetId);
-
- int changesetsCount = GetChangesetsCount(queryResult);
-
- if (changesetsCount == 0)
- {
- mDiffPanel.ClearInfo();
- return;
- }
-
- ChangesetsSelection.SelectChangesets(
- mChangesetsListView, changesetsToSelect, defaultRow);
- }
- finally
- {
- ((IProgressControls)mProgressControls).HideProgress();
- mIsRefreshing = false;
- }
- });
- }
-
- void ChangesetsViewMenu.IMenuOperations.DiffBranch()
- {
- LaunchDiffOperations.DiffBranch(
- mShowDownloadPlasticExeWindow,
- mProcessExecutor,
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
- ChangesetsSelection.GetSelectedChangeset(mChangesetsListView),
- mIsGluonMode);
- }
-
- ChangesetExtendedInfo ChangesetsViewMenu.IMenuOperations.GetSelectedChangeset()
- {
- return ChangesetsSelection.GetSelectedChangeset(
- mChangesetsListView);
- }
-
- void OnChangesetsListViewSizeChanged()
- {
- if (!mShouldScrollToSelection)
- return;
-
- mShouldScrollToSelection = false;
- TableViewOperations.ScrollToSelection(mChangesetsListView);
- }
-
- void OnSelectionChanged()
- {
- List<RepObjectInfo> selectedChangesets = ChangesetsSelection.
- GetSelectedRepObjectInfos(mChangesetsListView);
-
- if (selectedChangesets.Count != 1)
- return;
-
- mDiffPanel.UpdateInfo(
- MountPointWithPath.BuildWorkspaceRootMountPoint(
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView)),
- (ChangesetExtendedInfo)selectedChangesets[0]);
- }
-
- static void UpdateChangesetsList(
- ChangesetsListView changesetsListView,
- ViewQueryResult queryResult,
- long loadedChangesetId)
- {
- changesetsListView.BuildModel(
- queryResult,
- loadedChangesetId);
-
- changesetsListView.Refilter();
-
- changesetsListView.Sort();
-
- changesetsListView.Reload();
- }
-
- static long GetLoadedChangesetId(
- WorkspaceInfo wkInfo,
- bool isGluonMode)
- {
- if (isGluonMode)
- return -1;
-
- return PlasticGui.Plastic.API.GetLoadedChangeset(wkInfo);
- }
-
- static long GetLoadedBranchId(
- WorkspaceInfo wkInfo,
- long loadedChangesetId,
- bool isGluonMode)
- {
- if (isGluonMode)
- return -1;
-
- return PlasticGui.Plastic.API.GetChangesetInfoFromId(
- wkInfo, loadedChangesetId).BranchId;
- }
-
- static string GetChangesetsQuery(DateFilter dateFilter)
- {
- if (dateFilter.FilterType == DateFilter.Type.AllTime)
- return QueryConstants.ChangesetsBeginningQuery;
-
- string whereClause = QueryConstants.GetDateWhereClause(
- dateFilter.GetTimeAgo());
-
- return string.Format("{0} {1}",
- QueryConstants.ChangesetsBeginningQuery,
- whereClause);
- }
-
- static int GetChangesetsCount(
- ViewQueryResult queryResult)
- {
- if (queryResult == null)
- return 0;
-
- return queryResult.Count();
- }
-
- void VerifyIfSearchFieldIsRecentlyFocused(SearchField searchField)
- {
- if (searchField.HasFocus() != mIsSearchFieldFocused)
- {
- mIsSearchFieldFocused = !mIsSearchFieldFocused;
-
- if (mIsSearchFieldFocused)
- {
- TrackFeatureUseEvent.For(
- PlasticGui.Plastic.API.GetRepositorySpec(mWkInfo),
- TrackFeatureUseEvent.Features.ChangesetsViewChangesetsSearchBox);
- }
- }
- }
-
- void DoActionsToolbar(
- IRefreshableView refreshableView,
- ProgressControlsForViews progressControls,
- SearchField searchField,
- ChangesetsListView changesetsListView,
- DateFilter dateFilter)
- {
- EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
-
- if (progressControls.IsOperationRunning())
- {
- DrawProgressForViews.ForIndeterminateProgress(
- progressControls.ProgressData);
- }
-
- GUILayout.FlexibleSpace();
-
- GUILayout.Space(2);
-
- EditorGUILayout.EndHorizontal();
- }
-
- static void DoChangesetsArea(
- ChangesetsListView changesetsListView,
- bool isOperationRunning)
- {
- EditorGUILayout.BeginVertical();
-
- GUI.enabled = !isOperationRunning;
-
- Rect rect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
-
- changesetsListView.OnGUI(rect);
-
- GUI.enabled = true;
-
- EditorGUILayout.EndVertical();
- }
-
- static void DoChangesArea(DiffPanel diffPanel)
- {
- EditorGUILayout.BeginVertical();
-
- diffPanel.OnGUI();
-
- EditorGUILayout.EndVertical();
- }
-
- internal void DrawDateFilter()
- {
- GUI.enabled = !mProgressControls.IsOperationRunning();
-
- EditorGUI.BeginChangeCheck();
-
- mDateFilter.FilterType = (DateFilter.Type)
- EditorGUILayout.EnumPopup(
- mDateFilter.FilterType,
- EditorStyles.toolbarDropDown,
- GUILayout.Width(100));
-
- if (EditorGUI.EndChangeCheck())
- {
- EnumPopupSetting<DateFilter.Type>.Save(
- mDateFilter.FilterType,
- UnityConstants.CHANGESETS_DATE_FILTER_SETTING_NAME);
-
- ((IRefreshableView)this).Refresh();
- }
-
- GUI.enabled = true;
- }
-
- void InitializeShowChangesButtonWidth()
- {
- if (mShowChangesButtonWidth != -1)
- return;
-
- mShowChangesButtonWidth = MeasureMaxWidth.ForTexts(
- EditorStyles.toolbarButton,
- PlasticLocalization.GetString(PlasticLocalization.Name.HideChanges),
- PlasticLocalization.GetString(PlasticLocalization.Name.ShowChanges));
- }
-
- void BuildComponents(
- WorkspaceInfo wkInfo,
- IWorkspaceWindow workspaceWindow,
- IRefreshView refreshView,
- IViewSwitcher viewSwitcher,
- IHistoryViewLauncher historyViewLauncher,
- EditorWindow parentWindow)
- {
- mSearchField = new SearchField();
- mSearchField.downOrUpArrowKeyPressed += SearchField_OnDownOrUpArrowKeyPressed;
-
- DateFilter.Type dateFilterType =
- EnumPopupSetting<DateFilter.Type>.Load(
- UnityConstants.CHANGESETS_DATE_FILTER_SETTING_NAME,
- DateFilter.Type.LastMonth);
- mDateFilter = new DateFilter(dateFilterType);
-
- ChangesetsListHeaderState headerState =
- ChangesetsListHeaderState.GetDefault();
- TreeHeaderSettings.Load(headerState,
- UnityConstants.CHANGESETS_TABLE_SETTINGS_NAME,
- (int)ChangesetsListColumn.CreationDate, false);
-
- mChangesetsViewMenu = new ChangesetsViewMenu(
- wkInfo,
- this,
- this,
- mShowDownloadPlasticExeWindow,
- mIsGluonMode);
-
- mChangesetsListView = new ChangesetsListView(
- headerState,
- ChangesetsListHeaderState.GetColumnNames(),
- mChangesetsViewMenu,
- sizeChangedAction: OnChangesetsListViewSizeChanged,
- selectionChangedAction: OnSelectionChanged,
- doubleClickAction: ((IChangesetMenuOperations)this).DiffChangeset);
- mChangesetsListView.Reload();
-
- mDiffPanel = new DiffPanel(
- wkInfo, workspaceWindow, refreshView, viewSwitcher,
- historyViewLauncher, mShowDownloadPlasticExeWindow,
- parentWindow, mIsGluonMode);
- }
-
- bool mIsRefreshing;
-
- bool mShouldScrollToSelection;
-
- float mShowChangesButtonWidth = -1;
-
- object mSplitterState;
- Color mBorderColor;
-
- DateFilter mDateFilter;
-
- SearchField mSearchField;
- bool mIsSearchFieldFocused = false;
-
- ChangesetsListView mChangesetsListView;
- ChangesetOperations mChangesetOperations;
- DiffPanel mDiffPanel;
- ChangesetsViewMenu mChangesetsViewMenu;
-
- RevertToChangesetOperation.IGetStatusForWorkspace mGetStatusForWorkspace =
- new RevertToChangesetOperation.GetStatusFromWorkspace();
- RevertToChangesetOperation.IUndoCheckoutOperation mUndoCheckoutOperation =
- new RevertToChangesetOperation.UndoCheckout();
- RevertToChangesetOperation.IRevertToChangesetMergeController mRevertToChangesetMergeController =
- new RevertToChangesetOperation.RevertToChangesetMergeController();
-
- long mLoadedChangesetId = -1;
- object mLock = new object();
-
- LaunchTool.IProcessExecutor mProcessExecutor;
- LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
-
- readonly bool mIsGluonMode;
- readonly ViewHost mViewHost;
- readonly IGluonUpdateReport mGluonUpdateReport;
- readonly WorkspaceWindow mWorkspaceWindow;
- readonly IViewSwitcher mViewSwitcher;
- readonly ProgressControlsForViews mProgressControls;
- readonly IRevertToChangesetListener mRevertToChangesetListener;
- readonly EditorWindow mParentWindow;
- readonly WorkspaceInfo mWkInfo;
- }
- }
|