1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189 |
- using System;
- using System.Collections.Generic;
-
- using UnityEditor;
- using UnityEditor.IMGUI.Controls;
- using UnityEngine;
-
- using Codice.Client.BaseCommands;
- using Codice.Client.Commands;
- using Codice.Client.Common;
- using Codice.Client.Common.EventTracking;
- using Codice.Client.Common.FsNodeReaders;
- using Codice.Client.Common.Threading;
- using Codice.CM.Client.Gui;
- using Codice.CM.Common;
- using Codice.CM.Common.Merge;
- using Codice.CM.Common.Mount;
- using Codice.LogWrapper;
- using GluonGui;
- using GluonGui.WorkspaceWindow.Views.Checkin.Operations;
- using PlasticGui;
- using PlasticGui.Help.Actions;
- using PlasticGui.Help.Conditions;
- using PlasticGui.WorkspaceWindow;
- using PlasticGui.WorkspaceWindow.Diff;
- using PlasticGui.WorkspaceWindow.Items;
- using PlasticGui.WorkspaceWindow.Open;
- using PlasticGui.WorkspaceWindow.PendingChanges;
- using PlasticGui.WorkspaceWindow.PendingChanges.Changelists;
- using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
- using Unity.PlasticSCM.Editor.AssetUtils;
- using Unity.PlasticSCM.Editor.AssetUtils.Processor;
- using Unity.PlasticSCM.Editor.Help;
- using Unity.PlasticSCM.Editor.Tool;
- using Unity.PlasticSCM.Editor.UI;
- using Unity.PlasticSCM.Editor.UI.Progress;
- using Unity.PlasticSCM.Editor.UI.StatusBar;
- using Unity.PlasticSCM.Editor.UI.Tree;
- using Unity.PlasticSCM.Editor.Views.PendingChanges.Dialogs;
- using Unity.PlasticSCM.Editor.Views.PendingChanges.PendingMergeLinks;
- using Unity.PlasticSCM.Editor.Views.Changesets;
-
- using GluonNewIncomingChangesUpdater = PlasticGui.Gluon.WorkspaceWindow.NewIncomingChangesUpdater;
-
- namespace Unity.PlasticSCM.Editor.Views.PendingChanges
- {
- internal partial class PendingChangesTab :
- IRefreshableView,
- PlasticProjectSettingsProvider.IAutoRefreshView,
- IPendingChangesView,
- CheckinUIOperation.ICheckinView,
- PendingChangesViewPendingChangeMenu.IMetaMenuOperations,
- IPendingChangesMenuOperations,
- IChangelistMenuOperations,
- IOpenMenuOperations,
- PendingChangesViewPendingChangeMenu.IAdvancedUndoMenuOperations,
- IFilesFilterPatternsMenuOperations,
- PendingChangesViewMenu.IGetSelectedNodes,
- ChangesetsTab.IRevertToChangesetListener
- {
- internal IProgressControls ProgressControlsForTesting { get { return mProgressControls; } }
- internal HelpPanel HelpPanelForTesting { get { return mHelpPanel; } }
-
- internal void SetMergeLinksForTesting(
- IDictionary<MountPoint, IList<PendingMergeLink>> mergeLinks)
- {
- mPendingMergeLinks = mergeLinks;
-
- UpdateMergeLinksList();
- }
-
- internal string CommentText { get; set; }
-
- internal bool ForceToShowComment { get; set; }
-
- internal PendingChangesTab(
- WorkspaceInfo wkInfo,
- ViewHost viewHost,
- bool isGluonMode,
- WorkspaceWindow workspaceWindow,
- IViewSwitcher switcher,
- IMergeViewLauncher mergeViewLauncher,
- IHistoryViewLauncher historyViewLauncher,
- LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
- WorkspaceOperationsMonitor workspaceOperationsMonitor,
- NewIncomingChangesUpdater developerNewIncomingChangesUpdater,
- GluonNewIncomingChangesUpdater gluonNewIncomingChangesUpdater,
- IAssetStatusCache assetStatusCache,
- StatusBar statusBar,
- EditorWindow parentWindow)
- {
- mWkInfo = wkInfo;
- mViewHost = viewHost;
- mIsGluonMode = isGluonMode;
- mWorkspaceWindow = workspaceWindow;
- mHistoryViewLauncher = historyViewLauncher;
- mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
- mWorkspaceOperationsMonitor = workspaceOperationsMonitor;
- mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater;
- mGluonNewIncomingChangesUpdater = gluonNewIncomingChangesUpdater;
- mAssetStatusCache = assetStatusCache;
- mStatusBar = statusBar;
- mParentWindow = parentWindow;
- mGuiMessage = new UnityPlasticGuiMessage();
- mCheckedStateManager = new PendingChangesViewCheckedStateManager();
-
- mNewChangesInWk = NewChangesInWk.Build(
- mWkInfo,
- new BuildWorkspacekIsRelevantNewChange());
-
- BuildComponents(isGluonMode, parentWindow);
-
- mBorderColor = EditorGUIUtility.isProSkin
- ? (Color)new Color32(35, 35, 35, 255)
- : (Color)new Color32(153, 153, 153, 255);
-
- mProgressControls = new ProgressControlsForViews();
-
- mCooldownClearCheckinSuccessAction = new CooldownWindowDelayer(
- DelayedClearCheckinSuccess,
- UnityConstants.NOTIFICATION_CLEAR_INTERVAL);
-
- workspaceWindow.RegisterPendingChangesProgressControls(mProgressControls);
-
- mPendingChangesOperations = new PendingChangesOperations(
- mWkInfo,
- workspaceWindow,
- switcher,
- mergeViewLauncher,
- this,
- mProgressControls,
- workspaceWindow,
- null,
- null,
- null);
-
- InitIgnoreRulesAndRefreshView(mWkInfo.ClientPath, this);
- }
-
- internal void AutoRefresh()
- {
- if (mIsAutoRefreshDisabled)
- return;
-
- if (!PlasticGuiConfig.Get().Configuration.CommitAutoRefresh)
- return;
-
- if (mNewChangesInWk != null && !mNewChangesInWk.Detected())
- return;
-
- ((IRefreshableView)this).Refresh();
- }
-
- internal void ClearIsCommentWarningNeeded()
- {
- mIsEmptyCheckinCommentWarningNeeded = false;
- }
-
- internal void UpdateIsCommentWarningNeeded(string comment)
- {
- mIsEmptyCheckinCommentWarningNeeded =
- string.IsNullOrEmpty(comment) &&
- GuiClientConfig.Get().Configuration.ShowEmptyCommentWarning;
-
- mNeedsToShowEmptyCommentDialog = mIsEmptyCheckinCommentWarningNeeded;
- }
-
- internal void OnDisable()
- {
- mSearchField.downOrUpArrowKeyPressed -=
- SearchField_OnDownOrUpArrowKeyPressed;
-
- TreeHeaderSettings.Save(
- mPendingChangesTreeView.multiColumnHeader.state,
- UnityConstants.PENDING_CHANGES_TABLE_SETTINGS_NAME);
- }
-
- internal void Update()
- {
- mProgressControls.UpdateProgress(mParentWindow);
-
- // Displaying the dialog here, because showing it during the window's OnGUI function
- // caused errors
- if(mNeedsToShowEmptyCommentDialog)
- {
- mNeedsToShowEmptyCommentDialog = false;
-
- mHasPendingCheckinFromPreviousUpdate =
- EmptyCheckinMessageDialog.ShouldContinueWithCheckin(mParentWindow, mWkInfo);
-
- mIsEmptyCheckinCommentWarningNeeded = !mHasPendingCheckinFromPreviousUpdate;
- }
- }
-
- internal void OnGUI()
- {
- if (!string.IsNullOrEmpty(mGluonWarningMessage))
- DoWarningMessage(mGluonWarningMessage);
-
- DoActionsToolbar(
- mWkInfo,
- mIsGluonMode,
- mProgressControls);
-
- DoChangesArea(
- mPendingChangesTreeView,
- mProgressControls.IsOperationRunning(),
- mIsCheckedInSuccessful,
- mOrganizationToInviteUsers);
-
- if (HasPendingMergeLinks() && !mHasPendingMergeLinksFromRevert)
- DoMergeLinksArea(mMergeLinksListView, mParentWindow.position.width);
-
- // Border
- Rect result = GUILayoutUtility.GetRect(mParentWindow.position.width, 1);
- EditorGUI.DrawRect(result, mBorderColor);
-
- DoCommentsSection();
-
- if (mProgressControls.HasNotification())
- {
- DrawProgressForViews.ForNotificationArea(mProgressControls.ProgressData);
- }
-
- DrawHelpPanel.For(mHelpPanel);
- }
-
- internal void DrawSearchFieldForPendingChangesTab()
- {
- DrawSearchField.For(
- mSearchField,
- mPendingChangesTreeView,
- UnityConstants.SEARCH_FIELD_WIDTH);
- }
-
- void IPendingChangesView.SetDefaultComment(string defaultComment)
- {
- }
-
- void IPendingChangesView.ClearComments()
- {
- ClearComments();
- }
-
- void IRefreshableView.Refresh()
- {
- if (mProgressControls.IsOperationRunning())
- return;
-
- if (!mAreIgnoreRulesInitialized)
- return;
-
- if (mDeveloperNewIncomingChangesUpdater != null)
- mDeveloperNewIncomingChangesUpdater.Update(DateTime.Now);
-
- if (mGluonNewIncomingChangesUpdater != null)
- mGluonNewIncomingChangesUpdater.Update(DateTime.Now);
-
- FillPendingChanges(mNewChangesInWk);
- }
-
- void PlasticProjectSettingsProvider.IAutoRefreshView.DisableAutoRefresh()
- {
- mIsAutoRefreshDisabled = true;
- }
-
- void PlasticProjectSettingsProvider.IAutoRefreshView.EnableAutoRefresh()
- {
- mIsAutoRefreshDisabled = false;
- }
-
- void PlasticProjectSettingsProvider.IAutoRefreshView.ForceRefresh()
- {
- ((IRefreshableView)this).Refresh();
- }
-
- void IPendingChangesView.ClearChangesToCheck(List<string> changes)
- {
- mCheckedStateManager.ClearChangesToCheck(changes);
-
- mParentWindow.Repaint();
- }
-
- void IPendingChangesView.CleanCheckedElements(List<ChangeInfo> checkedChanges)
- {
- mCheckedStateManager.Clean(checkedChanges);
-
- mParentWindow.Repaint();
- }
-
- void IPendingChangesView.CheckChanges(List<string> changesToCheck)
- {
- mCheckedStateManager.SetChangesToCheck(changesToCheck);
-
- mParentWindow.Repaint();
- }
-
- bool IPendingChangesView.IncludeDependencies(
- IList<ChangeDependencies<ChangeInfo>> changesDependencies,
- string operation)
- {
- return DependenciesDialog.IncludeDependencies(
- mWkInfo, changesDependencies, operation, mParentWindow);
- }
-
- SearchMatchesData IPendingChangesView.AskForMatches(string changePath)
- {
- throw new NotImplementedException();
- }
-
- void IPendingChangesView.CleanLinkedTasks()
- {
- }
-
- void CheckinUIOperation.ICheckinView.CollapseWarningMessagePanel()
- {
- mGluonWarningMessage = string.Empty;
-
- mParentWindow.Repaint();
- }
-
- void CheckinUIOperation.ICheckinView.ExpandWarningMessagePanel(string text)
- {
- mGluonWarningMessage = text;
-
- mParentWindow.Repaint();
- }
-
- void CheckinUIOperation.ICheckinView.ClearComments()
- {
- ClearComments();
- }
-
- bool PendingChangesViewPendingChangeMenu.IMetaMenuOperations.SelectionHasMeta()
- {
- return mPendingChangesTreeView.SelectionHasMeta();
- }
-
- void PendingChangesViewPendingChangeMenu.IMetaMenuOperations.DiffMeta()
- {
- if (mShowDownloadPlasticExeWindow.Show(
- mWkInfo,
- mIsGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffWorkspaceContent,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffWorkspaceContent,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffWorkspaceContent))
- return;
-
- ChangeInfo selectedChange = PendingChangesSelection
- .GetSelectedChange(mPendingChangesTreeView);
- ChangeInfo selectedChangeMeta = mPendingChangesTreeView.GetMetaChange(
- selectedChange);
-
- ChangeInfo changedForMoved = mPendingChangesTreeView.GetChangedForMoved(selectedChange);
- ChangeInfo changedForMovedMeta = (changedForMoved == null) ?
- null : mPendingChangesTreeView.GetMetaChange(changedForMoved);
-
- DiffOperation.DiffWorkspaceContent(
- mWkInfo,
- selectedChangeMeta,
- changedForMovedMeta,
- mProgressControls,
- null,
- null);
- }
-
- void PendingChangesViewPendingChangeMenu.IMetaMenuOperations.HistoryMeta()
- {
- ChangeInfo selectedChange = PendingChangesSelection
- .GetSelectedChange(mPendingChangesTreeView);
- ChangeInfo selectedChangeMeta = mPendingChangesTreeView.GetMetaChange(
- selectedChange);
-
- mHistoryViewLauncher.ShowHistoryView(
- selectedChangeMeta.RepositorySpec,
- selectedChangeMeta.RevInfo.ItemId,
- selectedChangeMeta.Path,
- selectedChangeMeta.IsDirectory);
- }
-
- void PendingChangesViewPendingChangeMenu.IMetaMenuOperations.OpenMeta()
- {
- List<string> selectedPaths = PendingChangesSelection
- .GetSelectedMetaPaths(mPendingChangesTreeView);
-
- FileSystemOperation.Open(selectedPaths);
- }
-
- void PendingChangesViewPendingChangeMenu.IMetaMenuOperations.OpenMetaWith()
- {
- List<string> selectedPaths = PendingChangesSelection
- .GetSelectedMetaPaths(mPendingChangesTreeView);
-
- OpenOperation.OpenWith(
- FileSystemOperation.GetExePath(),
- selectedPaths);
- }
-
- void PendingChangesViewPendingChangeMenu.IMetaMenuOperations.OpenMetaInExplorer()
- {
- List<string> selectedPaths = PendingChangesSelection
- .GetSelectedMetaPaths(mPendingChangesTreeView);
-
- if (selectedPaths.Count < 1)
- return;
-
- FileSystemOperation.OpenInExplorer(selectedPaths[0]);
- }
-
- SelectedChangesGroupInfo IPendingChangesMenuOperations.GetSelectedChangesGroupInfo()
- {
- return PendingChangesSelection.GetSelectedChangesGroupInfo(
- mWkInfo.ClientPath, mPendingChangesTreeView);
- }
-
- void IPendingChangesMenuOperations.Diff()
- {
- if (mShowDownloadPlasticExeWindow.Show(
- mWkInfo,
- mIsGluonMode,
- TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffWorkspaceContent,
- TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffWorkspaceContent,
- TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffWorkspaceContent))
- return;
-
- ChangeInfo selectedChange = PendingChangesSelection
- .GetSelectedChange(mPendingChangesTreeView);
-
- DiffOperation.DiffWorkspaceContent(
- mWkInfo,
- selectedChange,
- mPendingChangesTreeView.GetChangedForMoved(selectedChange),
- null,
- null,
- null);
- }
-
- void IPendingChangesMenuOperations.UndoChanges()
- {
- List<ChangeInfo> changesToUndo = PendingChangesSelection
- .GetSelectedChanges(mPendingChangesTreeView);
-
- List<ChangeInfo> dependenciesCandidates =
- mPendingChangesTreeView.GetDependenciesCandidates(changesToUndo, true);
-
- UndoChangesForMode(
- mWkInfo, mIsGluonMode,
- changesToUndo, dependenciesCandidates);
- }
-
- void IPendingChangesMenuOperations.SearchMatches()
- {
- ChangeInfo selectedChange = PendingChangesSelection
- .GetSelectedChange(mPendingChangesTreeView);
-
- if (selectedChange == null)
- return;
-
- SearchMatchesOperation operation = new SearchMatchesOperation(
- mWkInfo, mWorkspaceWindow, this,
- mProgressControls, mDeveloperNewIncomingChangesUpdater);
-
- operation.SearchMatches(
- selectedChange,
- PendingChangesSelection.GetAllChanges(mPendingChangesTreeView),
- null);
- }
-
- void IPendingChangesMenuOperations.ApplyLocalChanges()
- {
- List<ChangeInfo> selectedChanges = PendingChangesSelection
- .GetSelectedChanges(mPendingChangesTreeView);
-
- if (selectedChanges.Count == 0)
- return;
-
- ApplyLocalChangesOperation operation = new ApplyLocalChangesOperation(
- mWkInfo, mWorkspaceWindow, this,
- mProgressControls, mDeveloperNewIncomingChangesUpdater);
-
- operation.ApplyLocalChanges(
- selectedChanges,
- PendingChangesSelection.GetAllChanges(mPendingChangesTreeView),
- null);
- }
-
- void IPendingChangesMenuOperations.Delete()
- {
- List<string> privateDirectoriesToDelete;
- List<string> privateFilesToDelete;
-
- if (!mPendingChangesTreeView.GetSelectedPathsToDelete(
- out privateDirectoriesToDelete,
- out privateFilesToDelete))
- return;
-
- DeleteOperation.Delete(
- mProgressControls,
- privateDirectoriesToDelete,
- privateFilesToDelete,
- mDeveloperNewIncomingChangesUpdater,
- RefreshAsset.UnityAssetDatabase,
- () => ((IWorkspaceWindow)mWorkspaceWindow).RefreshView(ViewType.ItemsView),
- () => ((IWorkspaceWindow)mWorkspaceWindow).RefreshView(ViewType.PendingChangesView));
- }
-
- void IPendingChangesMenuOperations.Annotate()
- {
- throw new NotImplementedException();
- }
-
- void IPendingChangesMenuOperations.History()
- {
- ChangeInfo selectedChange = PendingChangesSelection.
- GetSelectedChange(mPendingChangesTreeView);
-
- mHistoryViewLauncher.ShowHistoryView(
- selectedChange.RepositorySpec,
- selectedChange.RevInfo.ItemId,
- selectedChange.Path,
- selectedChange.IsDirectory);
- }
-
- SelectedChangesGroupInfo IChangelistMenuOperations.GetSelectedChangesGroupInfo()
- {
- return PendingChangesSelection.GetSelectedChangesGroupInfo(
- mWkInfo.ClientPath, mPendingChangesTreeView);
- }
-
- List<ChangeListInfo> IChangelistMenuOperations.GetSelectedChangelistInfos()
- {
- return PendingChangesSelection.GetSelectedChangeListInfos(
- mPendingChangesTreeView);
- }
-
- void IChangelistMenuOperations.Checkin()
- {
- List<ChangeInfo> changesToCheckin;
- List<ChangeInfo> dependenciesCandidates;
-
- mPendingChangesTreeView.GetCheckedChanges(
- PendingChangesSelection.GetSelectedChangelistNodes(mPendingChangesTreeView),
- false, out changesToCheckin, out dependenciesCandidates);
-
- CheckinChangesForMode(
- changesToCheckin, dependenciesCandidates,
- mWkInfo, mIsGluonMode, mKeepItemsLocked);
- }
-
- void IChangelistMenuOperations.Shelve()
- {
- if (mIsGluonMode)
- return;
-
- List<ChangeInfo> changesToShelve;
- List<ChangeInfo> dependenciesCandidates;
-
- mPendingChangesTreeView.GetCheckedChanges(
- PendingChangesSelection.GetSelectedChangelistNodes(mPendingChangesTreeView),
- false, out changesToShelve, out dependenciesCandidates);
-
- ShelveChanges(changesToShelve, dependenciesCandidates, mWkInfo);
- }
-
- void IChangelistMenuOperations.Undo()
- {
- List<ChangeInfo> changesToUndo;
- List<ChangeInfo> dependenciesCandidates;
-
- mPendingChangesTreeView.GetCheckedChanges(
- PendingChangesSelection.GetSelectedChangelistNodes(mPendingChangesTreeView),
- true, out changesToUndo, out dependenciesCandidates);
-
- UndoChangesForMode(
- mWkInfo, mIsGluonMode,
- changesToUndo, dependenciesCandidates);
- }
-
- void IChangelistMenuOperations.CreateNew()
- {
- ChangelistCreationData changelistCreationData =
- CreateChangelistDialog.CreateChangelist(mWkInfo, mParentWindow);
-
- ChangelistOperations.CreateNew(mWkInfo, this, changelistCreationData);
- }
-
- void IChangelistMenuOperations.MoveToNewChangelist(List<ChangeInfo> changes)
- {
- ChangelistCreationData changelistCreationData =
- CreateChangelistDialog.CreateChangelist(mWkInfo, mParentWindow);
-
- if (!changelistCreationData.Result)
- return;
-
- ChangelistOperations.CreateNew(mWkInfo, this, changelistCreationData);
-
- ChangelistOperations.MoveToChangelist(
- mWkInfo, this, changes,
- changelistCreationData.ChangelistInfo.Name);
- }
-
- void IChangelistMenuOperations.Edit()
- {
- ChangeListInfo changelistToEdit = PendingChangesSelection.GetSelectedChangeListInfo(
- mPendingChangesTreeView);
-
- ChangelistCreationData changelistCreationData = CreateChangelistDialog.EditChangelist(
- mWkInfo,
- changelistToEdit,
- mParentWindow);
-
- ChangelistOperations.Edit(mWkInfo, this, changelistToEdit, changelistCreationData);
- }
-
- void IChangelistMenuOperations.Delete()
- {
- ChangelistOperations.Delete(
- mWkInfo,
- this,
- PendingChangesSelection.GetSelectedChangelistNodes(mPendingChangesTreeView));
- }
-
- void IChangelistMenuOperations.MoveToChangelist(
- List<ChangeInfo> changes,
- string targetChangelist)
- {
- ChangelistOperations.MoveToChangelist(
- mWkInfo,
- this,
- changes,
- targetChangelist);
- }
-
- void IOpenMenuOperations.Open()
- {
- List<string> selectedPaths = PendingChangesSelection.
- GetSelectedPathsWithoutMeta(mPendingChangesTreeView);
-
- FileSystemOperation.Open(selectedPaths);
- }
-
- void IOpenMenuOperations.OpenWith()
- {
- List<string> selectedPaths = PendingChangesSelection.
- GetSelectedPathsWithoutMeta(mPendingChangesTreeView);
-
- OpenOperation.OpenWith(
- FileSystemOperation.GetExePath(),
- selectedPaths);
- }
-
- void IOpenMenuOperations.OpenWithCustom(string exePath, string args)
- {
- List<string> selectedPaths = PendingChangesSelection.
- GetSelectedPathsWithoutMeta(mPendingChangesTreeView);
-
- OpenOperation.OpenWith(exePath, selectedPaths);
- }
-
- void IOpenMenuOperations.OpenInExplorer()
- {
- List<string> selectedPaths = PendingChangesSelection
- .GetSelectedPathsWithoutMeta(mPendingChangesTreeView);
-
- if (selectedPaths.Count < 1)
- return;
-
- FileSystemOperation.OpenInExplorer(selectedPaths[0]);
- }
-
- void IFilesFilterPatternsMenuOperations.AddFilesFilterPatterns(
- FilterTypes type, FilterActions action, FilterOperationType operation)
- {
- List<string> selectedPaths = PendingChangesSelection.GetSelectedPaths(
- mPendingChangesTreeView);
-
- string[] rules = FilterRulesGenerator.GenerateRules(
- selectedPaths, mWkInfo.ClientPath, action, operation);
-
- bool isApplicableToAllWorkspaces = !mIsGluonMode;
- bool isAddOperation = operation == FilterOperationType.Add;
-
- FilterRulesConfirmationData filterRulesConfirmationData =
- FilterRulesConfirmationDialog.AskForConfirmation(
- rules, isAddOperation, isApplicableToAllWorkspaces, mParentWindow);
-
- AddFilesFilterPatternsOperation.Run(
- mWkInfo, mWorkspaceWindow, type, operation, filterRulesConfirmationData);
- }
-
- void PendingChangesViewPendingChangeMenu.IAdvancedUndoMenuOperations.UndoUnchanged()
- {
- UndoUnchangedFor(PendingChangesSelection.GetSelectedChanges(mPendingChangesTreeView));
- }
-
- void PendingChangesViewPendingChangeMenu.IAdvancedUndoMenuOperations.UndoCheckoutsKeepingChanges()
- {
- UndoCheckoutsKeepingChangesFor(PendingChangesSelection.GetSelectedChanges(mPendingChangesTreeView));
- }
-
- List<IPlasticTreeNode> PendingChangesViewMenu.IGetSelectedNodes.GetSelectedNodes()
- {
- return mPendingChangesTreeView.GetSelectedNodes();
- }
-
- void ChangesetsTab.IRevertToChangesetListener.OnSuccessOperation()
- {
- mHasPendingMergeLinksFromRevert = true;
- }
-
- void SearchField_OnDownOrUpArrowKeyPressed()
- {
- mPendingChangesTreeView.SetFocusAndEnsureSelectedItem();
- }
-
- void InitIgnoreRulesAndRefreshView(
- string wkPath, IRefreshableView view)
- {
- IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
- waiter.Execute(
- /*threadOperationDelegate*/ delegate
- {
- if (IsIgnoreConfigDefined.For(wkPath))
- return;
-
- AddIgnoreRules.WriteRules(
- wkPath, UnityConditions.GetMissingIgnoredRules(wkPath));
- },
- /*afterOperationDelegate*/ delegate
- {
- mAreIgnoreRulesInitialized = true;
-
- view.Refresh();
-
- if (waiter.Exception == null)
- return;
-
- mLog.ErrorFormat(
- "Error adding ignore rules for Unity: {0}",
- waiter.Exception);
-
- mLog.DebugFormat(
- "Stack trace: {0}",
- waiter.Exception.StackTrace);
- });
- }
-
- void FillPendingChanges(INewChangesInWk newChangesInWk)
- {
- if (mIsRefreshing)
- return;
-
- mIsRefreshing = true;
-
- List<ChangeInfo> changesToSelect =
- PendingChangesSelection.GetChangesToFocus(mPendingChangesTreeView);
-
- ((IProgressControls)mProgressControls).ShowProgress(PlasticLocalization.
- GetString(PlasticLocalization.Name.LoadingPendingChanges));
-
- IDictionary<MountPoint, IList<PendingMergeLink>> mergeLinks = null;
-
- WorkspaceStatusResult status = null;
-
- IThreadWaiter waiter = ThreadWaiter.GetWaiter();
- waiter.Execute(
- /*threadOperationDelegate*/ delegate
- {
- FilterManager.Get().Reload(mWkInfo);
-
- WorkspaceStatusOptions options = WorkspaceStatusOptions.None;
- options |= WorkspaceStatusOptions.FindAdded;
- options |= WorkspaceStatusOptions.FindDeleted;
- options |= WorkspaceStatusOptions.FindMoved;
- options |= WorkspaceStatusOptions.SplitModifiedMoved;
- options |= PendingChangesOptions.GetWorkspaceStatusOptions();
-
- if (newChangesInWk != null)
- newChangesInWk.Detected();
-
- status = GetStatus.ForWorkspace(
- mWkInfo,
- options,
- PendingChangesOptions.GetMovedMatchingOptions());
-
- mergeLinks = PlasticGui.Plastic.API.GetPendingMergeLinks(mWkInfo);
- },
- /*afterOperationDelegate*/ delegate
- {
- mPendingMergeLinks = mergeLinks;
-
- try
- {
- if (waiter.Exception != null)
- {
- ExceptionsHandler.DisplayException(waiter.Exception);
- return;
- }
-
- UpdateChangesTree(status.Changes);
-
- UpdateMergeLinksList();
-
- PendingChangesSelection.SelectChanges(
- mPendingChangesTreeView, changesToSelect);
-
- ClearAssetStatusCache();
- }
- finally
- {
- ((IProgressControls)mProgressControls).HideProgress();
-
- //UpdateIsCommentWarningNeeded(CommentText);
-
- UpdateNotificationPanel();
-
- mIsRefreshing = false;
- }
- });
- }
-
- void DoCommentsSection()
- {
- EditorGUILayout.BeginVertical(UnityStyles.PendingChangesTab.Comment);
- EditorGUILayout.Space(10);
-
- EditorGUILayout.BeginHorizontal();
- EditorGUILayout.Space(2);
-
- EditorGUILayout.BeginVertical();
- GUILayout.FlexibleSpace();
- DrawUserIcon.ForPendingChangesTab(CommentText);
- GUILayout.FlexibleSpace();
- EditorGUILayout.EndVertical();
-
- float width = Mathf.Clamp(mParentWindow.position.width, 300f, 820f);
-
- DrawCommentTextArea.For(
- this,
- width,
- mProgressControls.IsOperationRunning());
-
- EditorGUILayout.Space(2);
-
- // To center the action buttons vertically
- EditorGUILayout.BeginVertical();
- GUILayout.FlexibleSpace();
- DoOperationsToolbar(
- mWkInfo,
- mIsGluonMode,
- mUndoDropdownMenu,
- mProgressControls.IsOperationRunning());
- GUILayout.FlexibleSpace();
- EditorGUILayout.EndVertical();
-
- GUILayout.FlexibleSpace();
-
- EditorGUILayout.EndHorizontal();
-
- EditorGUILayout.Space(10);
-
- EditorGUILayout.EndVertical();
- }
-
- void DoOperationsToolbar(
- WorkspaceInfo wkInfo,
- bool isGluonMode,
- GenericMenu undoDropdownMenu,
- bool isOperationRunning)
- {
- EditorGUILayout.BeginHorizontal();
-
- using (new GuiEnabled(!isOperationRunning))
- {
- if(mHasPendingCheckinFromPreviousUpdate)
- {
- mHasPendingCheckinFromPreviousUpdate = false;
- CheckinForMode(wkInfo, isGluonMode, mKeepItemsLocked);
- }
-
- if (DrawActionButton.ForCommentSection(
- PlasticLocalization.GetString(
- PlasticLocalization.Name.CheckinChanges)))
- {
- UpdateIsCommentWarningNeeded(CommentText);
-
- if (!mIsEmptyCheckinCommentWarningNeeded)
- {
- CheckinForMode(wkInfo, isGluonMode, mKeepItemsLocked);
- }
- }
-
- GUILayout.Space(2);
-
- DoUndoButton(wkInfo, isGluonMode, undoDropdownMenu);
-
- if (isGluonMode)
- {
- mKeepItemsLocked = EditorGUILayout.ToggleLeft(
- PlasticLocalization.GetString(PlasticLocalization.Name.KeepLocked),
- mKeepItemsLocked,
- GUILayout.Width(UnityConstants.EXTRA_LARGE_BUTTON_WIDTH));
- }
- }
-
- EditorGUILayout.EndHorizontal();
- }
-
- void DoUndoButton(WorkspaceInfo wkInfo, bool isGluonMode, GenericMenu undoDropdownMenu)
- {
- string undoText = PlasticLocalization.GetString(PlasticLocalization.Name.UndoChanges);
-
- if (isGluonMode)
- {
- if (DrawActionButton.ForCommentSection(undoText))
- {
- UndoChangesAction(wkInfo, true);
- }
- }
- else
- {
- DrawActionButtonWithMenu.For(
- undoText,
- () => UndoChangesAction(wkInfo, false),
- undoDropdownMenu);
- }
- }
-
- void UndoChangesAction(WorkspaceInfo wkInfo, bool isGluonMode)
- {
- TrackFeatureUseEvent.For(PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
- TrackFeatureUseEvent.Features.UndoTextButton);
-
- UndoForMode(wkInfo, isGluonMode);
- }
-
- void UpdateChangesTree(List<ChangeInfo> changes)
- {
- mPendingChangesTreeView.BuildModel(changes, mCheckedStateManager);
-
- mPendingChangesTreeView.Refilter();
-
- mPendingChangesTreeView.Sort();
-
- mPendingChangesTreeView.Reload();
- }
-
- static void DoWarningMessage(string message)
- {
- GUILayout.Label(message, UnityStyles.WarningMessage);
- }
-
- void UpdateMergeLinksList()
- {
- mMergeLinksListView.BuildModel(mPendingMergeLinks);
-
- mMergeLinksListView.Reload();
-
- if (!HasPendingMergeLinks())
- mHasPendingMergeLinksFromRevert = false;
- }
-
- void ClearAssetStatusCache()
- {
- if (mAssetStatusCache != null)
- mAssetStatusCache.Clear();
-
- ProjectWindow.Repaint();
- RepaintInspector.All();
- }
-
- void UpdateNotificationPanel()
- {
- if (PlasticGui.Plastic.API.IsFsReaderWatchLimitReached(mWkInfo))
- {
- ((IProgressControls)mProgressControls).ShowWarning(PlasticLocalization.
- GetString(PlasticLocalization.Name.NotifyLinuxWatchLimitWarning));
- return;
- }
- }
-
- void DoActionsToolbar(
- WorkspaceInfo workspaceInfo,
- bool isGluonMode,
- ProgressControlsForViews progressControls)
- {
- EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
-
- if (progressControls.IsOperationRunning())
- {
- DrawProgressForViews.ForIndeterminateProgress(
- progressControls.ProgressData);
- }
-
- GUILayout.FlexibleSpace();
-
- EditorGUILayout.EndHorizontal();
- }
-
- static void DoChangesArea(
- PendingChangesTreeView changesTreeView,
- bool isOperationRunning,
- bool isCheckedInSuccessful,
- string organizationToInviteUsers)
- {
- GUI.enabled = !isOperationRunning;
-
- Rect rect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
- changesTreeView.OnGUI(rect);
-
- if (changesTreeView.GetTotalItemCount() == 0)
- {
- DrawEmptyState(rect, isCheckedInSuccessful, organizationToInviteUsers);
- }
-
- GUI.enabled = true;
- }
-
- static void DrawEmptyState(
- Rect rect,
- bool isCheckedInSuccessful,
- string organizationToInviteUsers)
- {
- if (isCheckedInSuccessful)
- {
- DrawCheckinSuccessfulEmptyState(rect, organizationToInviteUsers);
- return;
- }
-
- DrawNoPendingChangesEmptyState(rect);
- }
-
- static void DrawNoPendingChangesEmptyState(Rect rect)
- {
- DrawTreeViewEmptyState.For(
- rect,
- PlasticLocalization.GetString(PlasticLocalization.Name.NoPendingChanges));
- }
-
- static void DrawCheckinSuccessfulEmptyState(
- Rect rect,
- string organizationToInviteUsers)
- {
- if (string.IsNullOrEmpty(organizationToInviteUsers))
- {
- DrawTreeViewEmptyState.For(
- rect,
- PlasticLocalization.GetString(PlasticLocalization.Name.CheckinCompleted),
- Images.GetStepOkIcon());
-
- return;
- }
-
- DrawInviteOtherTeamMembersEmptyState(rect, organizationToInviteUsers);
- }
-
- static void DrawInviteOtherTeamMembersEmptyState(Rect rect, string organizationToInviteUsers)
- {
- ExternalLink inviteUsersLink = new ExternalLink
- {
- Label = PlasticLocalization.GetString(PlasticLocalization.Name.InviteOtherTeamMembers),
- Url = UnityUrl.UnityDashboard.Plastic.GetForInviteUsers(
- organizationToInviteUsers, UnityUrl.UnityDashboard.UnityCloudRequestSource.Editor)
- };
-
- DrawTreeViewEmptyState.For(
- rect,
- PlasticLocalization.GetString(PlasticLocalization.Name.CheckinCompleted),
- Images.GetStepOkIcon(),
- inviteUsersLink);
- }
-
- bool HasPendingMergeLinks()
- {
- if (mPendingMergeLinks == null)
- return false;
-
- return mPendingMergeLinks.Count > 0;
- }
-
- static void DoMergeLinksArea(
- MergeLinksListView mergeLinksListView, float width)
- {
- GUILayout.Label(
- PlasticLocalization.GetString(
- PlasticLocalization.Name.MergeLinkDescriptionColumn),
- EditorStyles.boldLabel);
-
- float desiredTreeHeight = mergeLinksListView.DesiredHeight;
-
- Rect treeRect = GUILayoutUtility.GetRect(
- 0,
- width,
- desiredTreeHeight,
- desiredTreeHeight);
-
- mergeLinksListView.OnGUI(treeRect);
- }
-
- void BuildComponents(
- bool isGluonMode,
- EditorWindow plasticWindow)
- {
- mHelpPanel = new HelpPanel(plasticWindow);
-
- mUndoDropdownMenu = new GenericMenu();
- mUndoDropdownMenu.AddItem(
- new GUIContent(PlasticLocalization.GetString(PlasticLocalization.Name.UndoUnchangedButton)),
- false, UndoUnchanged);
- mUndoDropdownMenu.AddItem(
- new GUIContent(PlasticLocalization.GetString(PlasticLocalization.Name.UndoCheckoutsKeepingChanges)),
- false, UndoCheckoutsKeepingChanges);
-
- mSearchField = new SearchField();
- mSearchField.downOrUpArrowKeyPressed += SearchField_OnDownOrUpArrowKeyPressed;
-
- PendingChangesTreeHeaderState headerState =
- PendingChangesTreeHeaderState.GetDefault(isGluonMode);
- TreeHeaderSettings.Load(headerState,
- UnityConstants.PENDING_CHANGES_TABLE_SETTINGS_NAME,
- (int)PendingChangesTreeColumn.Item, true);
-
- mPendingChangesTreeView = new PendingChangesTreeView(
- mWkInfo, mIsGluonMode, headerState,
- PendingChangesTreeHeaderState.GetColumnNames(),
- new PendingChangesViewMenu(mWkInfo, this, this, this, this, this, this, this, mIsGluonMode),
- mAssetStatusCache);
- mPendingChangesTreeView.Reload();
-
- mMergeLinksListView = new MergeLinksListView();
- mMergeLinksListView.Reload();
- }
-
- INewChangesInWk mNewChangesInWk;
- GenericMenu mUndoDropdownMenu;
-
- void ClearComments()
- {
- CommentText = string.Empty;
- ForceToShowComment = true;
-
- mParentWindow.Repaint();
- }
-
- PendingChangesTreeView mPendingChangesTreeView;
- MergeLinksListView mMergeLinksListView;
- HelpPanel mHelpPanel;
-
- volatile bool mAreIgnoreRulesInitialized = false;
- bool mIsRefreshing;
-
- bool mIsAutoRefreshDisabled;
- bool mIsEmptyCheckinCommentWarningNeeded = false;
- bool mNeedsToShowEmptyCommentDialog = false;
- bool mHasPendingCheckinFromPreviousUpdate = false;
- bool mHasPendingMergeLinksFromRevert = false;
- bool mKeepItemsLocked;
- string mGluonWarningMessage;
- bool mIsCheckedInSuccessful;
- string mOrganizationToInviteUsers;
-
- IDictionary<MountPoint, IList<PendingMergeLink>> mPendingMergeLinks;
-
- SearchField mSearchField;
-
- Color mBorderColor;
-
- readonly ProgressControlsForViews mProgressControls;
- readonly EditorWindow mParentWindow;
- readonly StatusBar mStatusBar;
- readonly CooldownWindowDelayer mCooldownClearCheckinSuccessAction;
- readonly IAssetStatusCache mAssetStatusCache;
-
- readonly PendingChangesOperations mPendingChangesOperations;
- readonly PendingChangesViewCheckedStateManager mCheckedStateManager;
- readonly GuiMessage.IGuiMessage mGuiMessage;
- readonly NewIncomingChangesUpdater mDeveloperNewIncomingChangesUpdater;
- readonly GluonNewIncomingChangesUpdater mGluonNewIncomingChangesUpdater;
- readonly bool mIsGluonMode;
- readonly WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
- readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
- readonly IHistoryViewLauncher mHistoryViewLauncher;
- readonly WorkspaceWindow mWorkspaceWindow;
- readonly ViewHost mViewHost;
- readonly WorkspaceInfo mWkInfo;
-
- static readonly ILog mLog = PlasticApp.GetLogger("PendingChangesTab");
- }
- }
|