No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ChangesetsViewMenu.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. using UnityEditor;
  2. using UnityEngine;
  3. using Codice.Client.Common.EventTracking;
  4. using Codice.CM.Common;
  5. using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
  6. using PlasticGui;
  7. using Unity.PlasticSCM.Editor.Tool;
  8. using Unity.PlasticSCM.Editor.UI;
  9. namespace Unity.PlasticSCM.Editor.Views.Changesets
  10. {
  11. internal class ChangesetsViewMenu
  12. {
  13. internal GenericMenu Menu { get { return mMenu; } }
  14. public interface IMenuOperations
  15. {
  16. void DiffBranch();
  17. ChangesetExtendedInfo GetSelectedChangeset();
  18. }
  19. internal ChangesetsViewMenu(
  20. WorkspaceInfo wkInfo,
  21. IChangesetMenuOperations changesetMenuOperations,
  22. IMenuOperations menuOperations,
  23. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  24. bool isGluonMode)
  25. {
  26. mWkInfo = wkInfo;
  27. mChangesetMenuOperations = changesetMenuOperations;
  28. mMenuOperations = menuOperations;
  29. mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
  30. mIsGluonMode = isGluonMode;
  31. BuildComponents();
  32. }
  33. internal void Popup()
  34. {
  35. mMenu = new GenericMenu();
  36. UpdateMenuItems(mMenu);
  37. mMenu.ShowAsContext();
  38. }
  39. internal bool ProcessKeyActionIfNeeded(Event e)
  40. {
  41. int selectedChangesetsCount = mChangesetMenuOperations.GetSelectedChangesetsCount();
  42. ChangesetMenuOperations operationToExecute = GetMenuOperations(
  43. e, selectedChangesetsCount > 1);
  44. if (operationToExecute == ChangesetMenuOperations.None)
  45. return false;
  46. ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
  47. selectedChangesetsCount,
  48. mIsGluonMode,
  49. mMenuOperations.GetSelectedChangeset().BranchId,
  50. mLoadedBranchId,
  51. false);
  52. if (!operations.HasFlag(operationToExecute))
  53. return false;
  54. ProcessMenuOperation(operationToExecute, mChangesetMenuOperations);
  55. return true;
  56. }
  57. internal void SetLoadedBranchId(long loadedBranchId)
  58. {
  59. mLoadedBranchId = loadedBranchId;
  60. }
  61. void DiffChangesetMenuItem_Click()
  62. {
  63. if (mShowDownloadPlasticExeWindow.Show(
  64. mWkInfo,
  65. mIsGluonMode,
  66. TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffChangeset,
  67. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffChangeset,
  68. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffChangeset))
  69. return;
  70. mChangesetMenuOperations.DiffChangeset();
  71. }
  72. void DiffSelectedChangesetsMenuItem_Click()
  73. {
  74. if (mShowDownloadPlasticExeWindow.Show(
  75. mWkInfo,
  76. mIsGluonMode,
  77. TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffSelectedChangesets,
  78. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffSelectedChangesets,
  79. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffSelectedChangesets))
  80. return;
  81. mChangesetMenuOperations.DiffSelectedChangesets();
  82. }
  83. void RevertToChangesetMenuItem_Click()
  84. {
  85. mChangesetMenuOperations.RevertToChangeset();
  86. }
  87. void DiffBranchMenuItem_Click()
  88. {
  89. mMenuOperations.DiffBranch();
  90. }
  91. void SwitchToChangesetMenuItem_Click()
  92. {
  93. mChangesetMenuOperations.SwitchToChangeset();
  94. }
  95. internal void UpdateMenuItems(GenericMenu menu)
  96. {
  97. ChangesetExtendedInfo singleSelectedChangeset = mMenuOperations.GetSelectedChangeset();
  98. ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
  99. mChangesetMenuOperations.GetSelectedChangesetsCount(),
  100. mIsGluonMode,
  101. singleSelectedChangeset.BranchId,
  102. mLoadedBranchId,
  103. false);
  104. AddDiffChangesetMenuItem(
  105. mDiffChangesetMenuItemContent,
  106. menu,
  107. singleSelectedChangeset,
  108. operations,
  109. DiffChangesetMenuItem_Click);
  110. AddDiffSelectedChangesetsMenuItem(
  111. mDiffSelectedChangesetsMenuItemContent,
  112. menu,
  113. operations,
  114. DiffSelectedChangesetsMenuItem_Click);
  115. if (!IsOnMainBranch(singleSelectedChangeset))
  116. {
  117. menu.AddSeparator(string.Empty);
  118. AddDiffBranchMenuItem(
  119. mDiffBranchMenuItemContent,
  120. menu,
  121. singleSelectedChangeset,
  122. operations,
  123. DiffBranchMenuItem_Click);
  124. }
  125. menu.AddSeparator(string.Empty);
  126. AddSwitchToChangesetMenuItem(
  127. mSwitchToChangesetMenuItemContent,
  128. menu,
  129. operations,
  130. SwitchToChangesetMenuItem_Click);
  131. if (mIsGluonMode)
  132. return;
  133. AddBackToMenuItem(
  134. mRevertToChangesetMenuItemContent,
  135. menu,
  136. operations,
  137. RevertToChangesetMenuItem_Click);
  138. }
  139. void ProcessMenuOperation(
  140. ChangesetMenuOperations operationToExecute,
  141. IChangesetMenuOperations changesetMenuOperations)
  142. {
  143. if (operationToExecute == ChangesetMenuOperations.DiffChangeset)
  144. {
  145. DiffChangesetMenuItem_Click();
  146. return;
  147. }
  148. if (operationToExecute == ChangesetMenuOperations.DiffSelectedChangesets)
  149. {
  150. DiffSelectedChangesetsMenuItem_Click();
  151. return;
  152. }
  153. }
  154. static void AddDiffChangesetMenuItem(
  155. GUIContent menuItemContent,
  156. GenericMenu menu,
  157. ChangesetExtendedInfo changeset,
  158. ChangesetMenuOperations operations,
  159. GenericMenu.MenuFunction menuFunction)
  160. {
  161. string changesetName =
  162. changeset != null ?
  163. changeset.ChangesetId.ToString() :
  164. string.Empty;
  165. menuItemContent.text = string.Format("{0} {1}",
  166. PlasticLocalization.GetString(
  167. PlasticLocalization.Name.AnnotateDiffChangesetMenuItem,
  168. changesetName),
  169. GetPlasticShortcut.ForDiff());
  170. if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
  171. {
  172. menu.AddItem(
  173. menuItemContent,
  174. false,
  175. menuFunction);
  176. return;
  177. }
  178. menu.AddDisabledItem(
  179. menuItemContent);
  180. }
  181. static void AddDiffSelectedChangesetsMenuItem(
  182. GUIContent menuItemContent,
  183. GenericMenu menu,
  184. ChangesetMenuOperations operations,
  185. GenericMenu.MenuFunction menuFunction)
  186. {
  187. if (operations.HasFlag(ChangesetMenuOperations.DiffSelectedChangesets))
  188. {
  189. menu.AddItem(
  190. menuItemContent,
  191. false,
  192. menuFunction);
  193. return;
  194. }
  195. menu.AddDisabledItem(menuItemContent);
  196. }
  197. static void AddBackToMenuItem(
  198. GUIContent menuItemContent,
  199. GenericMenu menu,
  200. ChangesetMenuOperations operations,
  201. GenericMenu.MenuFunction menuFunction)
  202. {
  203. if (operations.HasFlag(ChangesetMenuOperations.RevertToChangeset))
  204. {
  205. menu.AddItem(
  206. menuItemContent,
  207. false,
  208. menuFunction);
  209. return;
  210. }
  211. menu.AddDisabledItem(menuItemContent);
  212. }
  213. static void AddDiffBranchMenuItem(
  214. GUIContent menuItemContent,
  215. GenericMenu menu,
  216. ChangesetExtendedInfo changeset,
  217. ChangesetMenuOperations operations,
  218. GenericMenu.MenuFunction menuFunction)
  219. {
  220. string branchName = GetBranchName(changeset);
  221. menuItemContent.text =
  222. PlasticLocalization.GetString(PlasticLocalization.Name.AnnotateDiffBranchMenuItem,
  223. branchName);
  224. if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
  225. {
  226. menu.AddItem(
  227. menuItemContent,
  228. false,
  229. menuFunction);
  230. return;
  231. }
  232. menu.AddDisabledItem(
  233. menuItemContent);
  234. }
  235. static void AddSwitchToChangesetMenuItem(
  236. GUIContent menuItemContent,
  237. GenericMenu menu,
  238. ChangesetMenuOperations operations,
  239. GenericMenu.MenuFunction menuFunction)
  240. {
  241. if (operations.HasFlag(ChangesetMenuOperations.SwitchToChangeset))
  242. {
  243. menu.AddItem(
  244. menuItemContent,
  245. false,
  246. menuFunction);
  247. return;
  248. }
  249. menu.AddDisabledItem(menuItemContent);
  250. }
  251. static string GetBranchName(ChangesetExtendedInfo changesetInfo)
  252. {
  253. if (changesetInfo == null)
  254. return string.Empty;
  255. string branchName = changesetInfo.BranchName;
  256. int lastIndex = changesetInfo.BranchName.LastIndexOf("/");
  257. if (lastIndex == -1)
  258. return branchName;
  259. return branchName.Substring(lastIndex + 1);
  260. }
  261. static bool IsOnMainBranch(ChangesetExtendedInfo singleSeletedChangeset)
  262. {
  263. if (singleSeletedChangeset == null)
  264. return false;
  265. return singleSeletedChangeset.BranchName == MAIN_BRANCH_NAME;
  266. }
  267. static ChangesetMenuOperations GetMenuOperations(
  268. Event e, bool isMultipleSelection)
  269. {
  270. if (Keyboard.IsControlOrCommandKeyPressed(e) &&
  271. Keyboard.IsKeyPressed(e, KeyCode.D))
  272. return isMultipleSelection ?
  273. ChangesetMenuOperations.DiffSelectedChangesets :
  274. ChangesetMenuOperations.DiffChangeset;
  275. return ChangesetMenuOperations.None;
  276. }
  277. void BuildComponents()
  278. {
  279. mDiffChangesetMenuItemContent = new GUIContent(string.Empty);
  280. mDiffSelectedChangesetsMenuItemContent = new GUIContent(string.Format("{0} {1}",
  281. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemDiffSelected),
  282. GetPlasticShortcut.ForDiff()));
  283. mDiffBranchMenuItemContent = new GUIContent();
  284. mSwitchToChangesetMenuItemContent = new GUIContent(
  285. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemSwitchToChangeset));
  286. mRevertToChangesetMenuItemContent = new GUIContent(
  287. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemRevertToChangeset));
  288. }
  289. GenericMenu mMenu;
  290. GUIContent mDiffChangesetMenuItemContent;
  291. GUIContent mDiffSelectedChangesetsMenuItemContent;
  292. GUIContent mDiffBranchMenuItemContent;
  293. GUIContent mSwitchToChangesetMenuItemContent;
  294. GUIContent mRevertToChangesetMenuItemContent;
  295. readonly WorkspaceInfo mWkInfo;
  296. readonly IChangesetMenuOperations mChangesetMenuOperations;
  297. readonly IMenuOperations mMenuOperations;
  298. readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
  299. readonly bool mIsGluonMode;
  300. long mLoadedBranchId = -1;
  301. const string MAIN_BRANCH_NAME = "/main";
  302. }
  303. }