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

AssetOperations.cs 12KB

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