暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

AssetOperations.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. using System.IO;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEditor.VersionControl;
  5. using Codice.Client.BaseCommands;
  6. using Codice.Client.Commands;
  7. using Codice.Client.Commands.WkTree;
  8. using Codice.Client.Common;
  9. using Codice.Client.Common.EventTracking;
  10. using Codice.Client.Common.Threading;
  11. using Codice.CM.Common;
  12. using GluonGui;
  13. using PlasticGui;
  14. using PlasticGui.Gluon;
  15. using PlasticGui.WorkspaceWindow;
  16. using PlasticGui.WorkspaceWindow.Diff;
  17. using PlasticGui.WorkspaceWindow.Items;
  18. using Unity.PlasticSCM.Editor.AssetMenu.Dialogs;
  19. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  20. using Unity.PlasticSCM.Editor.AssetUtils;
  21. using Unity.PlasticSCM.Editor.AssetUtils.Processor;
  22. using Unity.PlasticSCM.Editor.Tool;
  23. using Unity.PlasticSCM.Editor.UI;
  24. using Unity.PlasticSCM.Editor.Views.PendingChanges.Dialogs;
  25. using GluonCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.CheckoutOperation;
  26. using GluonUndoCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.UndoCheckoutOperation;
  27. using GluonAddoperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.AddOperation;
  28. namespace Unity.PlasticSCM.Editor.AssetMenu
  29. {
  30. internal class AssetOperations :
  31. IAssetMenuOperations,
  32. IAssetFilesFilterPatternsMenuOperations
  33. {
  34. internal interface IAssetSelection
  35. {
  36. AssetList GetSelectedAssets();
  37. }
  38. internal AssetOperations(
  39. WorkspaceInfo wkInfo,
  40. IWorkspaceWindow workspaceWindow,
  41. IViewSwitcher viewSwitcher,
  42. IHistoryViewLauncher historyViewLauncher,
  43. ViewHost viewHost,
  44. WorkspaceOperationsMonitor workspaceOperationsMonitor,
  45. NewIncomingChangesUpdater newIncomingChangesUpdater,
  46. IAssetStatusCache assetStatusCache,
  47. IMergeViewLauncher mergeViewLauncher,
  48. IGluonViewSwitcher gluonViewSwitcher,
  49. IAssetSelection assetSelection,
  50. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  51. bool isGluonMode)
  52. {
  53. mWkInfo = wkInfo;
  54. mWorkspaceWindow = workspaceWindow;
  55. mViewSwitcher = viewSwitcher;
  56. mHistoryViewLauncher = historyViewLauncher;
  57. mViewHost = viewHost;
  58. mWorkspaceOperationsMonitor = workspaceOperationsMonitor;
  59. mNewIncomingChangesUpdater = newIncomingChangesUpdater;
  60. mAssetStatusCache = assetStatusCache;
  61. mMergeViewLauncher = mergeViewLauncher;
  62. mGluonViewSwitcher = gluonViewSwitcher;
  63. mAssetSelection = assetSelection;
  64. mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
  65. mIsGluonMode = isGluonMode;
  66. mGuiMessage = new UnityPlasticGuiMessage();
  67. mProgressControls = new EditorProgressControls(mGuiMessage);
  68. }
  69. void IAssetMenuOperations.ShowPendingChanges()
  70. {
  71. mViewSwitcher.ShowPendingChanges();
  72. }
  73. void IAssetMenuOperations.Add()
  74. {
  75. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  76. mWkInfo.ClientPath,
  77. mAssetSelection.GetSelectedAssets(),
  78. mAssetStatusCache,
  79. AssetMenuOperations.Add);
  80. if (mIsGluonMode)
  81. {
  82. GluonAddoperation.Add(
  83. mViewHost,
  84. mProgressControls,
  85. mGuiMessage,
  86. selectedPaths.ToArray(),
  87. false,
  88. RefreshAsset.VersionControlCache);
  89. return;
  90. }
  91. AddOperation.Run(
  92. mWorkspaceWindow,
  93. mProgressControls,
  94. null,
  95. null,
  96. selectedPaths,
  97. false,
  98. mNewIncomingChangesUpdater,
  99. RefreshAsset.VersionControlCache);
  100. }
  101. void IAssetMenuOperations.Checkout()
  102. {
  103. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  104. mWkInfo.ClientPath,
  105. mAssetSelection.GetSelectedAssets(),
  106. mAssetStatusCache,
  107. AssetMenuOperations.Checkout);
  108. if (mIsGluonMode)
  109. {
  110. GluonCheckoutOperation.Checkout(
  111. mViewHost,
  112. mProgressControls,
  113. mGuiMessage,
  114. selectedPaths.ToArray(),
  115. false,
  116. RefreshAsset.VersionControlCache,
  117. mWkInfo);
  118. return;
  119. }
  120. CheckoutOperation.Checkout(
  121. mWorkspaceWindow,
  122. null,
  123. mProgressControls,
  124. selectedPaths,
  125. mNewIncomingChangesUpdater,
  126. RefreshAsset.VersionControlCache,
  127. mWkInfo);
  128. }
  129. void IAssetMenuOperations.Checkin()
  130. {
  131. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  132. mWkInfo.ClientPath,
  133. mAssetSelection.GetSelectedAssets(),
  134. mAssetStatusCache,
  135. AssetMenuOperations.Checkin);
  136. if (!CheckinDialog.CheckinPaths(
  137. mWkInfo,
  138. selectedPaths,
  139. mAssetStatusCache,
  140. mIsGluonMode,
  141. mWorkspaceWindow,
  142. mViewHost,
  143. mWorkspaceOperationsMonitor,
  144. mGuiMessage,
  145. mMergeViewLauncher,
  146. mGluonViewSwitcher))
  147. return;
  148. RefreshAsset.UnityAssetDatabase();
  149. }
  150. void IAssetMenuOperations.Undo()
  151. {
  152. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  153. mWkInfo.ClientPath,
  154. mAssetSelection.GetSelectedAssets(),
  155. mAssetStatusCache,
  156. AssetMenuOperations.Undo);
  157. SaveAssets.ForPathsWithoutConfirmation(
  158. selectedPaths, mWorkspaceOperationsMonitor);
  159. if (mIsGluonMode)
  160. {
  161. GluonUndoCheckoutOperation.UndoCheckout(
  162. mWkInfo,
  163. mViewHost,
  164. mProgressControls,
  165. selectedPaths.ToArray(),
  166. false,
  167. RefreshAsset.UnityAssetDatabase);
  168. return;
  169. }
  170. UndoCheckoutOperation.Run(
  171. mWorkspaceWindow,
  172. null,
  173. mProgressControls,
  174. selectedPaths,
  175. mNewIncomingChangesUpdater,
  176. RefreshAsset.UnityAssetDatabase);
  177. }
  178. void IAssetMenuOperations.ShowDiff()
  179. {
  180. if (mShowDownloadPlasticExeWindow.Show(
  181. mWkInfo,
  182. mIsGluonMode,
  183. TrackFeatureUseEvent.Features.InstallPlasticCloudFromShowDiff,
  184. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromFromShowDiff,
  185. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromFromShowDiff))
  186. return;
  187. string selectedPath = AssetsSelection.GetSelectedPath(
  188. mWkInfo.ClientPath,
  189. mAssetSelection.GetSelectedAssets());
  190. DiffInfo diffInfo = null;
  191. IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
  192. waiter.Execute(
  193. /*threadOperationDelegate*/ delegate
  194. {
  195. string symbolicName = GetSymbolicName(selectedPath);
  196. string extension = Path.GetExtension(selectedPath);
  197. diffInfo = PlasticGui.Plastic.API.BuildDiffInfoForDiffWithPrevious(
  198. selectedPath, symbolicName, selectedPath, extension, mWkInfo);
  199. },
  200. /*afterOperationDelegate*/ delegate
  201. {
  202. if (waiter.Exception != null)
  203. {
  204. ExceptionsHandler.DisplayException(waiter.Exception);
  205. return;
  206. }
  207. DiffOperation.DiffWithPrevious(
  208. diffInfo,
  209. null,
  210. null);
  211. });
  212. }
  213. void IAssetMenuOperations.ShowHistory()
  214. {
  215. if (mShowDownloadPlasticExeWindow.Show(
  216. mWkInfo,
  217. mIsGluonMode,
  218. TrackFeatureUseEvent.Features.InstallPlasticCloudFromShowHistory,
  219. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromShowHistory,
  220. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromShowHistory))
  221. return;
  222. Asset selectedAsset = AssetsSelection.GetSelectedAsset(
  223. mWkInfo.ClientPath,
  224. mAssetSelection.GetSelectedAssets());
  225. string selectedPath = Path.GetFullPath(selectedAsset.path);
  226. WorkspaceTreeNode node = PlasticGui.Plastic.API.
  227. GetWorkspaceTreeNode(selectedPath);
  228. mHistoryViewLauncher.ShowHistoryView(
  229. node.RepSpec,
  230. node.RevInfo.ItemId,
  231. selectedPath,
  232. selectedAsset.isFolder);
  233. }
  234. void IAssetFilesFilterPatternsMenuOperations.AddFilesFilterPatterns(
  235. FilterTypes type,
  236. FilterActions action,
  237. FilterOperationType operation)
  238. {
  239. List<string> selectedPaths = AssetsSelection.GetSelectedPaths(
  240. mWkInfo.ClientPath,
  241. mAssetSelection.GetSelectedAssets());
  242. string[] rules = FilterRulesGenerator.GenerateRules(
  243. selectedPaths, mWkInfo.ClientPath, action, operation);
  244. bool isApplicableToAllWorkspaces = !mIsGluonMode;
  245. bool isAddOperation = operation == FilterOperationType.Add;
  246. FilterRulesConfirmationData filterRulesConfirmationData =
  247. FilterRulesConfirmationDialog.AskForConfirmation(
  248. rules, isAddOperation, isApplicableToAllWorkspaces, null);
  249. AddFilesFilterPatternsOperation.Run(
  250. mWkInfo, mWorkspaceWindow, type, operation, filterRulesConfirmationData);
  251. }
  252. static string GetSymbolicName(string selectedPath)
  253. {
  254. WorkspaceTreeNode node = PlasticGui.Plastic.API.
  255. GetWorkspaceTreeNode(selectedPath);
  256. string branchName = string.Empty;
  257. BranchInfoCache.TryGetBranchName(
  258. node.RepSpec, node.RevInfo.BranchId, out branchName);
  259. string userName = PlasticGui.Plastic.API.GetUserName(
  260. node.RepSpec.Server, node.RevInfo.Owner);
  261. string symbolicName = string.Format(
  262. "cs:{0}@{1} {2} {3}",
  263. node.RevInfo.Changeset,
  264. string.Format("br:{0}", branchName),
  265. userName,
  266. "Workspace Revision");
  267. return symbolicName;
  268. }
  269. readonly WorkspaceInfo mWkInfo;
  270. readonly IViewSwitcher mViewSwitcher;
  271. readonly IHistoryViewLauncher mHistoryViewLauncher;
  272. readonly IWorkspaceWindow mWorkspaceWindow;
  273. readonly ViewHost mViewHost;
  274. readonly WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
  275. readonly NewIncomingChangesUpdater mNewIncomingChangesUpdater;
  276. readonly IAssetStatusCache mAssetStatusCache;
  277. readonly IMergeViewLauncher mMergeViewLauncher;
  278. readonly IGluonViewSwitcher mGluonViewSwitcher;
  279. readonly bool mIsGluonMode;
  280. readonly GuiMessage.IGuiMessage mGuiMessage;
  281. readonly EditorProgressControls mProgressControls;
  282. readonly IAssetSelection mAssetSelection;
  283. readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
  284. }
  285. }