353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.IO; | ||
|  | using System.Collections.Generic; | ||
|  | 
 | ||
|  | using UnityEditor; | ||
|  | using UnityEditor.VersionControl; | ||
|  | 
 | ||
|  | using Codice.Client.BaseCommands; | ||
|  | using Codice.Client.Commands; | ||
|  | using Codice.Client.Commands.WkTree; | ||
|  | using Codice.Client.Common; | ||
|  | using Codice.Client.Common.Threading; | ||
|  | using Codice.CM.Common; | ||
|  | using GluonGui; | ||
|  | using PlasticGui; | ||
|  | using PlasticGui.Gluon; | ||
|  | using PlasticGui.WorkspaceWindow; | ||
|  | using PlasticGui.WorkspaceWindow.Diff; | ||
|  | using PlasticGui.WorkspaceWindow.Items; | ||
|  | using Unity.PlasticSCM.Editor.AssetMenu.Dialogs; | ||
|  | using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; | ||
|  | using Unity.PlasticSCM.Editor.AssetUtils; | ||
|  | using Unity.PlasticSCM.Editor.AssetUtils.Processor; | ||
|  | using Unity.PlasticSCM.Editor.Tool; | ||
|  | using Unity.PlasticSCM.Editor.UI; | ||
|  | using Unity.PlasticSCM.Editor.Views.PendingChanges.Dialogs; | ||
|  | 
 | ||
|  | using GluonIncomingChangesUpdater = PlasticGui.Gluon.WorkspaceWindow.IncomingChangesUpdater; | ||
|  | using GluonCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.CheckoutOperation; | ||
|  | using GluonUndoCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.UndoCheckoutOperation; | ||
|  | using GluonAddoperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.AddOperation; | ||
|  | 
 | ||
|  | namespace Unity.PlasticSCM.Editor.AssetMenu | ||
|  | { | ||
|  |     internal class AssetUVCSOperations : | ||
|  |         IAssetMenuUVCSOperations, | ||
|  |         IAssetFilesFilterPatternsMenuOperations | ||
|  |     { | ||
|  |         internal interface IAssetSelection | ||
|  |         { | ||
|  |             AssetList GetSelectedAssets(); | ||
|  |         } | ||
|  | 
 | ||
|  |         internal AssetUVCSOperations( | ||
|  |             WorkspaceInfo wkInfo, | ||
|  |             IPlasticAPI plasticApi, | ||
|  |             ViewHost viewHost, | ||
|  |             IWorkspaceWindow workspaceWindow, | ||
|  |             IViewSwitcher viewSwitcher, | ||
|  |             IGluonViewSwitcher gluonViewSwitcher, | ||
|  |             IMergeViewLauncher mergeViewLauncher, | ||
|  |             IHistoryViewLauncher historyViewLauncher, | ||
|  |             IAssetStatusCache assetStatusCache, | ||
|  |             IAssetSelection assetSelection, | ||
|  |             ISaveAssets saveAssets, | ||
|  |             LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow, | ||
|  |             WorkspaceOperationsMonitor workspaceOperationsMonitor, | ||
|  |             PendingChangesUpdater pendingChangesUpdater, | ||
|  |             IncomingChangesUpdater developerIncomingChangesUpdater, | ||
|  |             GluonIncomingChangesUpdater gluonIncomingChangesUpdater, | ||
|  |             ShelvedChangesUpdater shelvedChangesUpdater, | ||
|  |             bool isGluonMode) | ||
|  |         { | ||
|  |             mWkInfo = wkInfo; | ||
|  |             mPlasticAPI = plasticApi; | ||
|  |             mViewHost = viewHost; | ||
|  |             mWorkspaceWindow = workspaceWindow; | ||
|  |             mViewSwitcher = viewSwitcher; | ||
|  |             mGluonViewSwitcher = gluonViewSwitcher; | ||
|  |             mMergeViewLauncher = mergeViewLauncher; | ||
|  |             mHistoryViewLauncher = historyViewLauncher; | ||
|  |             mAssetStatusCache = assetStatusCache; | ||
|  |             mAssetSelection = assetSelection; | ||
|  |             mSaveAssets = saveAssets; | ||
|  |             mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow; | ||
|  |             mWorkspaceOperationsMonitor = workspaceOperationsMonitor; | ||
|  |             mPendingChangesUpdater = pendingChangesUpdater; | ||
|  |             mDeveloperIncomingChangesUpdater = developerIncomingChangesUpdater; | ||
|  |             mGluonIncomingChangesUpdater = gluonIncomingChangesUpdater; | ||
|  |             mShelvedChangesUpdater = shelvedChangesUpdater; | ||
|  |             mIsGluonMode = isGluonMode; | ||
|  | 
 | ||
|  |             mGuiMessage = new UnityPlasticGuiMessage(); | ||
|  |             mProgressControls = new EditorProgressControls( | ||
|  |                 mGuiMessage, UnityConstants.UVCS_WINDOW_TITLE); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.ShowPendingChanges() | ||
|  |         { | ||
|  |             mViewSwitcher.ShowPendingChanges(); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.Add() | ||
|  |         { | ||
|  |             List<string> selectedPaths = GetSelectedPaths.ForOperation( | ||
|  |                 mWkInfo, | ||
|  |                 mAssetSelection.GetSelectedAssets(), | ||
|  |                 mPlasticAPI, | ||
|  |                 mAssetStatusCache, | ||
|  |                 AssetMenuOperations.Add); | ||
|  | 
 | ||
|  |             if (mIsGluonMode) | ||
|  |             { | ||
|  |                 GluonAddoperation.Add( | ||
|  |                     mWkInfo, | ||
|  |                     mViewHost, | ||
|  |                     mProgressControls, | ||
|  |                     mGuiMessage, | ||
|  |                     selectedPaths.ToArray(), | ||
|  |                     false, | ||
|  |                     mPendingChangesUpdater, | ||
|  |                     mGluonIncomingChangesUpdater, | ||
|  |                     () => RefreshAsset.VersionControlCache(mAssetStatusCache)); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             AddOperation.Run( | ||
|  |                 mWkInfo, | ||
|  |                 mWorkspaceWindow, | ||
|  |                 mProgressControls, | ||
|  |                 null, | ||
|  |                 null, | ||
|  |                 selectedPaths, | ||
|  |                 false, | ||
|  |                 mPendingChangesUpdater, | ||
|  |                 mDeveloperIncomingChangesUpdater, | ||
|  |                 mShelvedChangesUpdater, | ||
|  |                 () => RefreshAsset.VersionControlCache(mAssetStatusCache)); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.Checkout() | ||
|  |         { | ||
|  |             List<string> selectedPaths = GetSelectedPaths.ForOperation( | ||
|  |                 mWkInfo, | ||
|  |                 mAssetSelection.GetSelectedAssets(), | ||
|  |                 mPlasticAPI, | ||
|  |                 mAssetStatusCache, | ||
|  |                 AssetMenuOperations.Checkout); | ||
|  | 
 | ||
|  |             if (mIsGluonMode) | ||
|  |             { | ||
|  |                 GluonCheckoutOperation.Checkout( | ||
|  |                     mViewHost, | ||
|  |                     mProgressControls, | ||
|  |                     mGuiMessage, | ||
|  |                     selectedPaths.ToArray(), | ||
|  |                     false, | ||
|  |                     mPendingChangesUpdater, | ||
|  |                     mGluonIncomingChangesUpdater, | ||
|  |                     () => RefreshAsset.VersionControlCache(mAssetStatusCache), | ||
|  |                     mWkInfo); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             CheckoutOperation.Checkout( | ||
|  |                 mWorkspaceWindow, | ||
|  |                 null, | ||
|  |                 mProgressControls, | ||
|  |                 selectedPaths, | ||
|  |                 mPendingChangesUpdater, | ||
|  |                 mDeveloperIncomingChangesUpdater, | ||
|  |                 mShelvedChangesUpdater, | ||
|  |                 () => RefreshAsset.VersionControlCache(mAssetStatusCache), | ||
|  |                 mWkInfo); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.Checkin() | ||
|  |         { | ||
|  |             List<string> selectedPaths = GetSelectedPaths.ForOperation( | ||
|  |                 mWkInfo, | ||
|  |                 mAssetSelection.GetSelectedAssets(), | ||
|  |                 mPlasticAPI, | ||
|  |                 mAssetStatusCache, | ||
|  |                 AssetMenuOperations.Checkin); | ||
|  | 
 | ||
|  |             if (!CheckinDialog.CheckinPaths( | ||
|  |                     mWkInfo, | ||
|  |                     selectedPaths, | ||
|  |                     mAssetStatusCache, | ||
|  |                     mIsGluonMode, | ||
|  |                     mWorkspaceWindow, | ||
|  |                     mViewHost, | ||
|  |                     mWorkspaceOperationsMonitor, | ||
|  |                     mPendingChangesUpdater, | ||
|  |                     mSaveAssets, | ||
|  |                     mGuiMessage, | ||
|  |                     mMergeViewLauncher, | ||
|  |                     mGluonViewSwitcher)) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             RefreshAsset.UnityAssetDatabase(mAssetStatusCache); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.Undo() | ||
|  |         { | ||
|  |             List<string> selectedPaths = GetSelectedPaths.ForOperation( | ||
|  |                 mWkInfo, | ||
|  |                 mAssetSelection.GetSelectedAssets(), | ||
|  |                 mPlasticAPI, | ||
|  |                 mAssetStatusCache, | ||
|  |                 AssetMenuOperations.Undo); | ||
|  | 
 | ||
|  |             mSaveAssets.ForPathsWithoutConfirmation( | ||
|  |                 mWkInfo.ClientPath, selectedPaths, mWorkspaceOperationsMonitor); | ||
|  | 
 | ||
|  |             if (mIsGluonMode) | ||
|  |             { | ||
|  |                 GluonUndoCheckoutOperation.UndoCheckout( | ||
|  |                     mWkInfo, | ||
|  |                     mViewHost, | ||
|  |                     mProgressControls, | ||
|  |                     selectedPaths.ToArray(), | ||
|  |                     false, | ||
|  |                     mPendingChangesUpdater, | ||
|  |                     mGluonIncomingChangesUpdater, | ||
|  |                     () => RefreshAsset.UnityAssetDatabase(mAssetStatusCache)); | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             UndoCheckoutOperation.Run( | ||
|  |                 mWorkspaceWindow, | ||
|  |                 null, | ||
|  |                 mProgressControls, | ||
|  |                 selectedPaths, | ||
|  |                 mPendingChangesUpdater, | ||
|  |                 mDeveloperIncomingChangesUpdater, | ||
|  |                 mShelvedChangesUpdater, | ||
|  |                 () => RefreshAsset.UnityAssetDatabase(mAssetStatusCache)); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.ShowDiff() | ||
|  |         { | ||
|  |             string selectedPath = AssetsSelection.GetSelectedPath( | ||
|  |                 mWkInfo.ClientPath, | ||
|  |                 mAssetSelection.GetSelectedAssets()); | ||
|  | 
 | ||
|  |             DiffInfo diffInfo = null; | ||
|  | 
 | ||
|  |             IThreadWaiter waiter = ThreadWaiter.GetWaiter(10); | ||
|  |             waiter.Execute( | ||
|  |                 /*threadOperationDelegate*/ delegate | ||
|  |                 { | ||
|  |                     string symbolicName = GetSymbolicName(mWkInfo, selectedPath); | ||
|  |                     string extension = Path.GetExtension(selectedPath); | ||
|  | 
 | ||
|  |                     diffInfo = PlasticGui.Plastic.API.BuildDiffInfoForDiffWithPrevious( | ||
|  |                         selectedPath, symbolicName, selectedPath, extension, mWkInfo); | ||
|  |                 }, | ||
|  |                 /*afterOperationDelegate*/ delegate | ||
|  |                 { | ||
|  |                     if (waiter.Exception != null) | ||
|  |                     { | ||
|  |                         ExceptionsHandler.DisplayException(waiter.Exception); | ||
|  |                         return; | ||
|  |                     } | ||
|  | 
 | ||
|  |                     DiffOperation.DiffWithPrevious( | ||
|  |                         diffInfo, | ||
|  |                         PlasticExeLauncher.BuildForShowDiff(mWkInfo, mIsGluonMode, mShowDownloadPlasticExeWindow), | ||
|  |                         null); | ||
|  |                 }); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetMenuUVCSOperations.ShowHistory() | ||
|  |         { | ||
|  |             Asset selectedAsset = AssetsSelection.GetSelectedAsset( | ||
|  |                 mWkInfo.ClientPath, | ||
|  |                 mAssetSelection.GetSelectedAssets()); | ||
|  | 
 | ||
|  |             string selectedPath = Path.GetFullPath(selectedAsset.path); | ||
|  | 
 | ||
|  |             WorkspaceTreeNode node = PlasticGui.Plastic.API. | ||
|  |                 GetWorkspaceTreeNode(mWkInfo, selectedPath); | ||
|  | 
 | ||
|  |             mHistoryViewLauncher.ShowHistoryView( | ||
|  |                 node.RepSpec, | ||
|  |                 node.RevInfo.ItemId, | ||
|  |                 selectedPath, | ||
|  |                 selectedAsset.isFolder); | ||
|  |         } | ||
|  | 
 | ||
|  |         void IAssetFilesFilterPatternsMenuOperations.AddFilesFilterPatterns( | ||
|  |             FilterTypes type, | ||
|  |             FilterActions action, | ||
|  |             FilterOperationType operation) | ||
|  |         { | ||
|  |             List<string> selectedPaths = AssetsSelection.GetSelectedPaths( | ||
|  |                 mWkInfo.ClientPath, | ||
|  |                 mAssetSelection.GetSelectedAssets()); | ||
|  | 
 | ||
|  |             string[] rules = FilterRulesGenerator.GenerateRules( | ||
|  |                 selectedPaths, mWkInfo.ClientPath, action, operation); | ||
|  | 
 | ||
|  |             bool isApplicableToAllWorkspaces = !mIsGluonMode; | ||
|  |             bool isAddOperation = operation == FilterOperationType.Add; | ||
|  | 
 | ||
|  |             FilterRulesConfirmationData filterRulesConfirmationData = | ||
|  |                 FilterRulesConfirmationDialog.AskForConfirmation( | ||
|  |                     rules, isAddOperation, isApplicableToAllWorkspaces, EditorWindow.focusedWindow); | ||
|  | 
 | ||
|  |             AddFilesFilterPatternsOperation.Run( | ||
|  |                 mWkInfo, | ||
|  |                 mWorkspaceWindow, | ||
|  |                 type, | ||
|  |                 operation, | ||
|  |                 filterRulesConfirmationData, | ||
|  |                 mPendingChangesUpdater); | ||
|  |         } | ||
|  | 
 | ||
|  |         static string GetSymbolicName(WorkspaceInfo wkInfo, string selectedPath) | ||
|  |         { | ||
|  |             WorkspaceTreeNode node = PlasticGui.Plastic.API. | ||
|  |                 GetWorkspaceTreeNode(wkInfo, selectedPath); | ||
|  | 
 | ||
|  |             string branchName = string.Empty; | ||
|  |             BranchInfoCache.TryGetBranchName( | ||
|  |                 node.RepSpec, node.RevInfo.BranchId, out branchName); | ||
|  | 
 | ||
|  |             string userName = PlasticGui.Plastic.API.GetUserName( | ||
|  |                 node.RepSpec.Server, node.RevInfo.Owner); | ||
|  | 
 | ||
|  |             string symbolicName = string.Format( | ||
|  |                 "cs:{0}@{1} {2} {3}", | ||
|  |                 node.RevInfo.Changeset, | ||
|  |                 string.Format("br:{0}", branchName), | ||
|  |                 userName, | ||
|  |                 "Workspace Revision"); | ||
|  | 
 | ||
|  |             return symbolicName; | ||
|  |         } | ||
|  | 
 | ||
|  |         readonly WorkspaceInfo mWkInfo; | ||
|  |         readonly IPlasticAPI mPlasticAPI; | ||
|  |         readonly ViewHost mViewHost; | ||
|  |         readonly IWorkspaceWindow mWorkspaceWindow; | ||
|  |         readonly IViewSwitcher mViewSwitcher; | ||
|  |         readonly IGluonViewSwitcher mGluonViewSwitcher; | ||
|  |         readonly IMergeViewLauncher mMergeViewLauncher; | ||
|  |         readonly IHistoryViewLauncher mHistoryViewLauncher; | ||
|  |         readonly IAssetStatusCache mAssetStatusCache; | ||
|  |         readonly IAssetSelection mAssetSelection; | ||
|  |         readonly ISaveAssets mSaveAssets; | ||
|  |         readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow; | ||
|  |         readonly WorkspaceOperationsMonitor mWorkspaceOperationsMonitor; | ||
|  |         readonly PendingChangesUpdater mPendingChangesUpdater; | ||
|  |         readonly IncomingChangesUpdater mDeveloperIncomingChangesUpdater; | ||
|  |         readonly GluonIncomingChangesUpdater mGluonIncomingChangesUpdater; | ||
|  |         readonly ShelvedChangesUpdater mShelvedChangesUpdater; | ||
|  |         readonly bool mIsGluonMode; | ||
|  |         readonly GuiMessage.IGuiMessage mGuiMessage; | ||
|  |         readonly EditorProgressControls mProgressControls; | ||
|  |     } | ||
|  | } |