ChangesetsViewMenu.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. using UnityEditor;
  2. using UnityEngine;
  3. using Codice.Client.BaseCommands.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.Progress;
  9. namespace Unity.PlasticSCM.Editor.Views.Changesets
  10. {
  11. internal class ChangesetsViewMenu
  12. {
  13. internal interface IMenuOperations
  14. {
  15. void DiffBranch();
  16. ChangesetExtendedInfo GetSelectedChangeset();
  17. }
  18. internal ChangesetsViewMenu(
  19. WorkspaceInfo wkInfo,
  20. IChangesetMenuOperations changesetMenuOperations,
  21. IMenuOperations menuOperations,
  22. bool isGluonMode)
  23. {
  24. mWkInfo = wkInfo;
  25. mChangesetMenuOperations = changesetMenuOperations;
  26. mMenuOperations = menuOperations;
  27. mIsGluonMode = isGluonMode;
  28. BuildComponents();
  29. }
  30. internal void Popup()
  31. {
  32. GenericMenu menu = new GenericMenu();
  33. UpdateMenuItems(menu);
  34. menu.ShowAsContext();
  35. }
  36. internal void SetLoadedBranchId(long loadedBranchId)
  37. {
  38. mLoadedBranchId = loadedBranchId;
  39. }
  40. void DiffChangesetMenuItem_Click()
  41. {
  42. if (LaunchTool.ShowDownloadPlasticExeWindow(
  43. mWkInfo,
  44. mIsGluonMode,
  45. TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffChangeset,
  46. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffChangeset,
  47. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffChangeset))
  48. return;
  49. mChangesetMenuOperations.DiffChangeset();
  50. }
  51. void DiffSelectedChangesetsMenuItem_Click()
  52. {
  53. if (LaunchTool.ShowDownloadPlasticExeWindow(
  54. mWkInfo,
  55. mIsGluonMode,
  56. TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffSelectedChangesets,
  57. TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffSelectedChangesets,
  58. TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffSelectedChangesets))
  59. return;
  60. mChangesetMenuOperations.DiffSelectedChangesets();
  61. }
  62. void BackToMenuItem_Click()
  63. {
  64. mChangesetMenuOperations.GoBackToChangeset();
  65. }
  66. void DiffBranchMenuItem_Click()
  67. {
  68. mMenuOperations.DiffBranch();
  69. }
  70. void SwitchToChangesetMenuItem_Click()
  71. {
  72. mChangesetMenuOperations.SwitchToChangeset();
  73. }
  74. void UpdateMenuItems(GenericMenu menu)
  75. {
  76. ChangesetExtendedInfo singleSelectedChangeset = mMenuOperations.GetSelectedChangeset();
  77. ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
  78. mChangesetMenuOperations.GetSelectedChangesetsCount(),
  79. mIsGluonMode,
  80. singleSelectedChangeset.BranchId,
  81. mLoadedBranchId);
  82. AddDiffChangesetMenuItem(
  83. mDiffChangesetMenuItemContent,
  84. menu,
  85. singleSelectedChangeset,
  86. operations,
  87. DiffChangesetMenuItem_Click);
  88. AddDiffSelectedChangesetsMenuItem(
  89. mDiffSelectedChangesetsMenuItemContent,
  90. menu,
  91. operations,
  92. DiffSelectedChangesetsMenuItem_Click);
  93. if (!IsOnMainBranch(singleSelectedChangeset))
  94. {
  95. menu.AddSeparator(string.Empty);
  96. AddDiffBranchMenuItem(
  97. mDiffBranchMenuItemContent,
  98. menu,
  99. singleSelectedChangeset,
  100. operations,
  101. DiffBranchMenuItem_Click);
  102. }
  103. menu.AddSeparator(string.Empty);
  104. AddSwitchToChangesetMenuItem(
  105. mSwitchToChangesetMenuItemContent,
  106. menu,
  107. operations,
  108. SwitchToChangesetMenuItem_Click);
  109. if (mIsGluonMode)
  110. return;
  111. AddBackToMenuItem(
  112. mGoBackToMenuItemContent,
  113. menu,
  114. operations,
  115. BackToMenuItem_Click);
  116. }
  117. static void AddDiffChangesetMenuItem(
  118. GUIContent menuItemContent,
  119. GenericMenu menu,
  120. ChangesetExtendedInfo changeset,
  121. ChangesetMenuOperations operations,
  122. GenericMenu.MenuFunction menuFunction)
  123. {
  124. string changesetName =
  125. changeset != null ?
  126. changeset.ChangesetId.ToString() :
  127. string.Empty;
  128. menuItemContent.text =
  129. PlasticLocalization.GetString(PlasticLocalization.Name.AnnotateDiffChangesetMenuItem,
  130. changesetName);
  131. if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
  132. {
  133. menu.AddItem(
  134. menuItemContent,
  135. false,
  136. menuFunction);
  137. return;
  138. }
  139. menu.AddDisabledItem(
  140. menuItemContent);
  141. }
  142. static void AddDiffSelectedChangesetsMenuItem(
  143. GUIContent menuItemContent,
  144. GenericMenu menu,
  145. ChangesetMenuOperations operations,
  146. GenericMenu.MenuFunction menuFunction)
  147. {
  148. if (operations.HasFlag(ChangesetMenuOperations.DiffSelectedChangesets))
  149. {
  150. menu.AddItem(
  151. menuItemContent,
  152. false,
  153. menuFunction);
  154. return;
  155. }
  156. menu.AddDisabledItem(menuItemContent);
  157. }
  158. static void AddBackToMenuItem(
  159. GUIContent menuItemContent,
  160. GenericMenu menu,
  161. ChangesetMenuOperations operations,
  162. GenericMenu.MenuFunction menuFunction)
  163. {
  164. if (operations.HasFlag(ChangesetMenuOperations.GoBackToChangeset))
  165. {
  166. menu.AddItem(
  167. menuItemContent,
  168. false,
  169. menuFunction);
  170. return;
  171. }
  172. menu.AddDisabledItem(menuItemContent);
  173. }
  174. static void AddDiffBranchMenuItem(
  175. GUIContent menuItemContent,
  176. GenericMenu menu,
  177. ChangesetExtendedInfo changeset,
  178. ChangesetMenuOperations operations,
  179. GenericMenu.MenuFunction menuFunction)
  180. {
  181. string branchName = GetBranchName(changeset);
  182. menuItemContent.text =
  183. PlasticLocalization.GetString(PlasticLocalization.Name.AnnotateDiffBranchMenuItem,
  184. branchName);
  185. if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
  186. {
  187. menu.AddItem(
  188. menuItemContent,
  189. false,
  190. menuFunction);
  191. return;
  192. }
  193. menu.AddDisabledItem(
  194. menuItemContent);
  195. }
  196. static void AddSwitchToChangesetMenuItem(
  197. GUIContent menuItemContent,
  198. GenericMenu menu,
  199. ChangesetMenuOperations operations,
  200. GenericMenu.MenuFunction menuFunction)
  201. {
  202. if (operations.HasFlag(ChangesetMenuOperations.SwitchToChangeset))
  203. {
  204. menu.AddItem(
  205. menuItemContent,
  206. false,
  207. menuFunction);
  208. return;
  209. }
  210. menu.AddDisabledItem(menuItemContent);
  211. }
  212. void BuildComponents()
  213. {
  214. mDiffChangesetMenuItemContent = new GUIContent();
  215. mDiffSelectedChangesetsMenuItemContent = new GUIContent(
  216. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemDiffSelected));
  217. mDiffBranchMenuItemContent = new GUIContent();
  218. mSwitchToChangesetMenuItemContent = new GUIContent(
  219. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemSwitchToChangeset));
  220. mGoBackToMenuItemContent = new GUIContent(
  221. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemGoBackTo));
  222. }
  223. static string GetBranchName(ChangesetExtendedInfo changesetInfo)
  224. {
  225. if (changesetInfo == null)
  226. return string.Empty;
  227. string branchName = changesetInfo.BranchName;
  228. int lastIndex = changesetInfo.BranchName.LastIndexOf("/");
  229. if (lastIndex == -1)
  230. return branchName;
  231. return branchName.Substring(lastIndex + 1);
  232. }
  233. static bool IsOnMainBranch(ChangesetExtendedInfo singleSeletedChangeset)
  234. {
  235. if (singleSeletedChangeset == null)
  236. return false;
  237. return singleSeletedChangeset.BranchName == MAIN_BRANCH_NAME;
  238. }
  239. GUIContent mDiffChangesetMenuItemContent;
  240. GUIContent mDiffSelectedChangesetsMenuItemContent;
  241. GUIContent mDiffBranchMenuItemContent;
  242. GUIContent mSwitchToChangesetMenuItemContent;
  243. GUIContent mGoBackToMenuItemContent;
  244. readonly WorkspaceInfo mWkInfo;
  245. readonly IChangesetMenuOperations mChangesetMenuOperations;
  246. readonly IMenuOperations mMenuOperations;
  247. readonly bool mIsGluonMode;
  248. long mLoadedBranchId = -1;
  249. const string MAIN_BRANCH_NAME = "/main";
  250. }
  251. }