| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532 |
- using System;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
- using Codice.Client.Commands;
- using Codice.Client.Common.Threading;
- using Codice.CM.Common;
- using PlasticGui;
- using PlasticGui.WorkspaceWindow.QueryViews;
- using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
- using Unity.PlasticSCM.Editor.UI;
- using Unity.PlasticSCM.Editor.UI.Progress;
- using Unity.PlasticSCM.Editor.UI.Tree;
- using Unity.PlasticSCM.Editor.Views.Diff;
- namespace Unity.PlasticSCM.Editor.Views.Changesets
- {
- internal class ChangesetsTab :
- IRefreshableView,
- IChangesetMenuOperations,
- ChangesetsViewMenu.IMenuOperations
- {
- internal ChangesetsTab(
- WorkspaceInfo wkInfo,
- IWorkspaceWindow workspaceWindow,
- IViewSwitcher viewSwitcher,
- IHistoryViewLauncher historyViewLauncher,
- EditorWindow parentWindow,
- bool isGluonMode)
- {
- mWkInfo = wkInfo;
- mParentWindow = parentWindow;
- mIsGluonMode = isGluonMode;
- BuildComponents(
- wkInfo, workspaceWindow, viewSwitcher,
- historyViewLauncher, parentWindow);
- mProgressControls = new ProgressControlsForViews();
- mSplitterState = PlasticSplitterGUILayout.InitSplitterState(
- new float[] { 0.50f, 0.50f },
- new int[] { 100, 100 },
- new int[] { 100000, 100000 }
- );
- ((IRefreshableView)this).Refresh();
- }
- internal void OnDisable()
- {
- mDiffPanel.OnDisable();
- mSearchField.downOrUpArrowKeyPressed -=
- SearchField_OnDownOrUpArrowKeyPressed;
- TreeHeaderSettings.Save(
- mChangesetsListView.multiColumnHeader.state,
- UnityConstants.CHANGESETS_TABLE_SETTINGS_NAME);
- BoolSetting.Save(
- mIsChangesPanelVisible,
- UnityConstants.CHANGESETS_SHOW_CHANGES_SETTING_NAME);
- }
- internal void Update()
- {
- mDiffPanel.Update();
- mProgressControls.UpdateProgress(mParentWindow);
- }
- internal void OnGUI()
- {
- InitializeShowChangesButtonWidth();
- bool wasChangesPanelVisible = mIsChangesPanelVisible;
- DoActionsToolbar(
- this,
- mProgressControls,
- mSearchField,
- mChangesetsListView,
- mDateFilter,
- mChangesetsLabelText,
- mShowChangesButtonWidth,
- wasChangesPanelVisible);
- if (mIsChangesPanelVisible)
- {
- PlasticSplitterGUILayout.BeginVerticalSplit(mSplitterState);
- }
- DoChangesetsArea(
- mChangesetsListView,
- mProgressControls.IsOperationRunning());
- if (mIsChangesPanelVisible)
- {
- if (!wasChangesPanelVisible)
- mShouldScrollToSelection = true;
- DoChangesArea(mDiffPanel);
- PlasticSplitterGUILayout.EndVerticalSplit();
- }
- }
- void IRefreshableView.Refresh()
- {
- string query = GetChangesetsQuery(mDateFilter);
- FillChangesets(mWkInfo, query);
- }
- int IChangesetMenuOperations.GetSelectedChangesetsCount()
- {
- return ChangesetsSelection.GetSelectedChangesetsCount(mChangesetsListView);
- }
- void IChangesetMenuOperations.DiffChangeset()
- {
- LaunchDiffOperations.DiffChangeset(
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
- ChangesetsSelection.GetSelectedChangeset(mChangesetsListView),
- mIsGluonMode);
- }
- void IChangesetMenuOperations.DiffSelectedChangesets()
- {
- List<RepObjectInfo> selectedChangesets = ChangesetsSelection.
- GetSelectedRepObjectInfos(mChangesetsListView);
- if (selectedChangesets.Count < 2)
- return;
- LaunchDiffOperations.DiffSelectedChangesets(
- ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
- (ChangesetExtendedInfo)selectedChangesets[0],
- (ChangesetExtendedInfo)selectedChangesets[1],
- mIsGluonMode);
- }
- void IChangesetMenuOperations.DiffWithAnotherChangeset() { }
- void IChangesetMenuOperations.CreateBranch() { }
- void IChangesetMenuOperations.LabelChangeset() { }
- void IChangesetMenuOperations.SwitchToChangeset() { }
- 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 SearchField_OnDownOrUpArrowKeyPressed()
- {
- mChangesetsListView.SetFocusAndEnsureSelectedItem();
- }
- void FillChangesets(WorkspaceInfo wkInfo, string query)
- {
- if (mIsRefreshing)
- return;
- mIsRefreshing = true;
- List<RepObjectInfo> changesetsToSelect =
- ChangesetsSelection.GetSelectedRepObjectInfos(mChangesetsListView);
- int defaultRow = TableViewOperations.
- GetFirstSelectedRow(mChangesetsListView);
- ((IProgressControls)mProgressControls).ShowProgress(
- PlasticLocalization.GetString(
- PlasticLocalization.Name.LoadingChangesets));
- long loadedChangesetId = -1;
- ViewQueryResult queryResult = null;
- IThreadWaiter waiter = ThreadWaiter.GetWaiter();
- waiter.Execute(
- /*threadOperationDelegate*/ delegate
- {
- queryResult = new ViewQueryResult(
- PlasticGui.Plastic.API.FindQuery(wkInfo, query));
- loadedChangesetId = GetLoadedChangesetId(
- wkInfo, mIsGluonMode);
- },
- /*afterOperationDelegate*/ delegate
- {
- try
- {
- if (waiter.Exception != null)
- {
- ExceptionsHandler.DisplayException(waiter.Exception);
- return;
- }
- int changesetsCount = GetChangesetsCount(queryResult);
- mChangesetsLabelText = string.Format(
- PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsCount),
- changesetsCount);
- UpdateChangesetsList(
- mChangesetsListView,
- queryResult,
- loadedChangesetId);
- if (changesetsCount == 0)
- {
- mDiffPanel.ClearInfo();
- return;
- }
- ChangesetsSelection.SelectChangesets(
- mChangesetsListView, changesetsToSelect, defaultRow);
- }
- finally
- {
- ((IProgressControls)mProgressControls).HideProgress();
- mIsRefreshing = false;
- }
- });
- }
- void ChangesetsViewMenu.IMenuOperations.DiffBranch()
- {
- LaunchDiffOperations.DiffBranch(
- 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 string GetChangesetsQuery(DateFilter dateFilter)
- {
- if (dateFilter.FilterType == DateFilter.Type.AllTime)
- return QueryConstants.ChangesetsBeginningQuery;
- string whereClause = QueryConstants.GetChangesetsDateWhereClause(
- dateFilter.GetFilterDate(DateTime.UtcNow));
- return string.Format("{0} {1}",
- QueryConstants.ChangesetsBeginningQuery,
- whereClause);
- }
- static int GetChangesetsCount(
- ViewQueryResult queryResult)
- {
- if (queryResult == null)
- return 0;
- return queryResult.Count();
- }
- void DoActionsToolbar(
- IRefreshableView refreshableView,
- ProgressControlsForViews progressControls,
- SearchField searchField,
- ChangesetsListView changesetsListView,
- DateFilter dateFilter,
- string changesetsLabelText,
- float showChangesButtonWidth,
- bool wasChangesPanelVisible)
- {
- EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
- if (!string.IsNullOrEmpty(changesetsLabelText))
- {
- GUILayout.Label(
- changesetsLabelText,
- UnityStyles.ChangesetsTab.HeaderLabel);
- }
- if (progressControls.IsOperationRunning())
- {
- DrawProgressForViews.ForIndeterminateProgress(
- progressControls.ProgressData);
- }
- GUILayout.FlexibleSpace();
- mIsChangesPanelVisible =
- DoShowChangesButton(
- showChangesButtonWidth,
- wasChangesPanelVisible);
- GUILayout.Space(2);
- DrawSearchField.For(
- searchField,
- changesetsListView,
- UnityConstants.SEARCH_FIELD_WIDTH);
- DoDateFilter(
- refreshableView,
- dateFilter,
- progressControls.IsOperationRunning());
- DoRefreshButton(
- refreshableView,
- progressControls.IsOperationRunning());
- 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();
- }
- static bool DoShowChangesButton(
- float showChangesButtonWidth,
- bool wasChecked)
- {
- string buttonText = wasChecked ?
- PlasticLocalization.GetString(PlasticLocalization.Name.HideChanges) :
- PlasticLocalization.GetString(PlasticLocalization.Name.ShowChanges);
- GUIContent buttonContent = new GUIContent(buttonText);
- GUIStyle buttonStyle = EditorStyles.toolbarButton;
- Rect toggleRect = GUILayoutUtility.GetRect(
- buttonContent, buttonStyle,
- GUILayout.Width(showChangesButtonWidth));
- bool isChecked = GUI.Toggle(
- toggleRect, wasChecked, buttonContent, buttonStyle);
- return isChecked;
- }
- static void DoDateFilter(
- IRefreshableView refreshableView,
- DateFilter dateFilter,
- bool isOperationRunning)
- {
- GUI.enabled = !isOperationRunning;
- EditorGUI.BeginChangeCheck();
- dateFilter.FilterType = (DateFilter.Type)
- EditorGUILayout.EnumPopup(
- dateFilter.FilterType,
- EditorStyles.toolbarDropDown,
- GUILayout.Width(100));
- if (EditorGUI.EndChangeCheck())
- {
- EnumPopupSetting<DateFilter.Type>.Save(
- dateFilter.FilterType,
- UnityConstants.CHANGESETS_DATE_FILTER_SETTING_NAME);
- refreshableView.Refresh();
- }
- GUI.enabled = true;
- }
- static void DoRefreshButton(
- IRefreshableView refreshableView,
- bool isOperationRunning)
- {
- EditorGUI.BeginDisabledGroup(isOperationRunning);
- if (GUILayout.Button(new GUIContent(
- Images.GetRefreshIcon()), EditorStyles.toolbarButton))
- refreshableView.Refresh();
- EditorGUI.EndDisabledGroup();
- }
- 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,
- 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);
- mChangesetsListView = new ChangesetsListView(
- headerState,
- ChangesetsListHeaderState.GetColumnNames(),
- new ChangesetsViewMenu(this, this, mIsGluonMode),
- sizeChangedAction: OnChangesetsListViewSizeChanged,
- selectionChangedAction: OnSelectionChanged,
- doubleClickAction: ((IChangesetMenuOperations)this).DiffChangeset);
- mChangesetsListView.Reload();
- mIsChangesPanelVisible = BoolSetting.Load(
- UnityConstants.CHANGESETS_SHOW_CHANGES_SETTING_NAME,
- true);
- mDiffPanel = new DiffPanel(
- wkInfo, workspaceWindow, viewSwitcher,
- historyViewLauncher, parentWindow, mIsGluonMode);
- }
- bool mIsRefreshing;
- bool mShouldScrollToSelection;
- bool mIsChangesPanelVisible;
- float mShowChangesButtonWidth = -1;
- string mChangesetsLabelText;
- object mSplitterState;
- DateFilter mDateFilter;
- SearchField mSearchField;
- ChangesetsListView mChangesetsListView;
- DiffPanel mDiffPanel;
- readonly bool mIsGluonMode;
- readonly ProgressControlsForViews mProgressControls;
- readonly EditorWindow mParentWindow;
- readonly WorkspaceInfo mWkInfo;
- }
- }
|