Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

PendingChangesViewPendingChangeMenu.cs 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Codice.Client.BaseCommands;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using Codice.Client.Commands;
  7. using Codice.CM.Common;
  8. using PlasticGui;
  9. using PlasticGui.WorkspaceWindow.Items;
  10. using PlasticGui.WorkspaceWindow.Open;
  11. using PlasticGui.WorkspaceWindow.PendingChanges;
  12. using PlasticGui.WorkspaceWindow.PendingChanges.Changelists;
  13. using Unity.PlasticSCM.Editor.UI;
  14. using Unity.PlasticSCM.Editor.Views.PendingChanges.Changelists;
  15. namespace Unity.PlasticSCM.Editor.Views.PendingChanges
  16. {
  17. internal class PendingChangesViewPendingChangeMenu
  18. {
  19. internal interface IMetaMenuOperations
  20. {
  21. void DiffMeta();
  22. void OpenMeta();
  23. void OpenMetaWith();
  24. void OpenMetaInExplorer();
  25. void HistoryMeta();
  26. bool SelectionHasMeta();
  27. }
  28. internal interface IAdvancedUndoMenuOperations
  29. {
  30. void UndoUnchanged();
  31. void UndoCheckoutsKeepingChanges();
  32. }
  33. internal PendingChangesViewPendingChangeMenu(
  34. WorkspaceInfo wkInfo,
  35. IPendingChangesMenuOperations pendingChangesMenuOperations,
  36. IChangelistMenuOperations changelistMenuOperations,
  37. IOpenMenuOperations openMenuOperations,
  38. IMetaMenuOperations metaMenuOperations,
  39. IAdvancedUndoMenuOperations advancedUndoMenuOperations,
  40. IFilesFilterPatternsMenuOperations filterMenuOperations,
  41. bool isGluonMode)
  42. {
  43. mPendingChangesMenuOperations = pendingChangesMenuOperations;
  44. mChangelistMenuOperations = changelistMenuOperations;
  45. mOpenMenuOperations = openMenuOperations;
  46. mMetaMenuOperations = metaMenuOperations;
  47. mAdvancedUndoMenuOperations = advancedUndoMenuOperations;
  48. mIsGluonMode = isGluonMode;
  49. mFilterMenuBuilder = new FilesFilterPatternsMenuBuilder(filterMenuOperations);
  50. mMoveToChangelistMenuBuilder = new MoveToChangelistMenuBuilder(
  51. wkInfo,
  52. changelistMenuOperations);
  53. BuildComponents();
  54. }
  55. internal void Popup()
  56. {
  57. GenericMenu menu = new GenericMenu();
  58. UpdateMenuItems(menu);
  59. menu.ShowAsContext();
  60. }
  61. internal bool ProcessKeyActionIfNeeded(Event e)
  62. {
  63. PendingChangesMenuOperations operationToExecute =
  64. GetPendingChangesMenuOperation(e);
  65. OpenMenuOperations openOperationToExecute =
  66. GetOpenMenuOperation(e);
  67. if (operationToExecute == PendingChangesMenuOperations.None &&
  68. openOperationToExecute == OpenMenuOperations.None)
  69. return false;
  70. SelectedChangesGroupInfo info =
  71. mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
  72. if (operationToExecute != PendingChangesMenuOperations.None)
  73. return ProcessKeyActionForPendingChangesMenu(
  74. operationToExecute, mPendingChangesMenuOperations, info);
  75. return ProcessKeyActionForOpenMenu(
  76. openOperationToExecute, mOpenMenuOperations, info);
  77. }
  78. void OpenMenuItem_Click()
  79. {
  80. mOpenMenuOperations.Open();
  81. }
  82. void OpenWithMenuItem_Click()
  83. {
  84. mOpenMenuOperations.OpenWith();
  85. }
  86. void OpenInExplorerMenuItem_Click()
  87. {
  88. mOpenMenuOperations.OpenInExplorer();
  89. }
  90. void OpenMetaMenuItem_Click()
  91. {
  92. mMetaMenuOperations.OpenMeta();
  93. }
  94. void OpenMetaWithMenuItem_Click()
  95. {
  96. mMetaMenuOperations.OpenMetaWith();
  97. }
  98. void OpenMetaInExplorerMenuItem_Click()
  99. {
  100. mMetaMenuOperations.OpenMetaInExplorer();
  101. }
  102. void DiffMenuItem_Click()
  103. {
  104. mPendingChangesMenuOperations.Diff();
  105. }
  106. void DiffMetaMenuItem_Click()
  107. {
  108. mMetaMenuOperations.DiffMeta();
  109. }
  110. void UndoUnchangedMenuItem_Click()
  111. {
  112. mAdvancedUndoMenuOperations.UndoUnchanged();
  113. }
  114. void UndoCheckoutsKeepingChangesMenuItem_Click()
  115. {
  116. mAdvancedUndoMenuOperations.UndoCheckoutsKeepingChanges();
  117. }
  118. void UndoChangesMenuItem_Click()
  119. {
  120. mPendingChangesMenuOperations.UndoChanges();
  121. }
  122. void CheckoutMenuItem_Click()
  123. {
  124. mPendingChangesMenuOperations.ApplyLocalChanges();
  125. }
  126. void DeleteMenuItem_Click()
  127. {
  128. mPendingChangesMenuOperations.Delete();
  129. }
  130. void HistoryMenuItem_Click()
  131. {
  132. mPendingChangesMenuOperations.History();
  133. }
  134. void HistoryMetaMenuItem_Click()
  135. {
  136. mMetaMenuOperations.HistoryMeta();
  137. }
  138. void UpdateMenuItems(GenericMenu menu)
  139. {
  140. SelectedChangesGroupInfo info =
  141. mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
  142. PendingChangesMenuOperations operations =
  143. PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
  144. ChangelistMenuOperations changelistOperations =
  145. ChangelistMenuOperations.None;
  146. OpenMenuOperations openOperations =
  147. GetOpenMenuOperations.ForPendingChangesView(info);
  148. bool useChangelists = PlasticGuiConfig.Get().
  149. Configuration.CommitUseChangeLists;
  150. if (useChangelists)
  151. {
  152. List<ChangeListInfo> selectedChangelists =
  153. mChangelistMenuOperations.GetSelectedChangelistInfos();
  154. changelistOperations = ChangelistMenuUpdater.
  155. GetAvailableMenuOperations(info, selectedChangelists);
  156. }
  157. if (operations == PendingChangesMenuOperations.None &&
  158. changelistOperations == ChangelistMenuOperations.None &&
  159. openOperations == OpenMenuOperations.None)
  160. {
  161. menu.AddDisabledItem(GetNoActionMenuItemContent());
  162. return;
  163. }
  164. UpdateOpenMenuItems(menu, openOperations);
  165. menu.AddSeparator(string.Empty);
  166. if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
  167. menu.AddItem(mDiffMenuItemContent, false, DiffMenuItem_Click);
  168. else
  169. menu.AddDisabledItem(mDiffMenuItemContent);
  170. if (mMetaMenuOperations.SelectionHasMeta())
  171. {
  172. if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
  173. menu.AddItem(mDiffMetaMenuItemContent, false, DiffMetaMenuItem_Click);
  174. else
  175. menu.AddDisabledItem(mDiffMetaMenuItemContent);
  176. }
  177. menu.AddSeparator(string.Empty);
  178. UpdateUndoMenuItems(operations, menu, info.SelectedChanges);
  179. menu.AddSeparator(string.Empty);
  180. if (operations.HasFlag(PendingChangesMenuOperations.ApplyLocalChanges))
  181. menu.AddItem(mCheckoutMenuItemContent, false, CheckoutMenuItem_Click);
  182. else
  183. menu.AddDisabledItem(mCheckoutMenuItemContent);
  184. if (operations.HasFlag(PendingChangesMenuOperations.Delete))
  185. menu.AddItem(mDeleteMenuItemContent, false, DeleteMenuItem_Click);
  186. else
  187. menu.AddDisabledItem(mDeleteMenuItemContent);
  188. if (useChangelists)
  189. {
  190. menu.AddSeparator(string.Empty);
  191. mMoveToChangelistMenuBuilder.UpdateMenuItems(
  192. menu,
  193. changelistOperations,
  194. info.SelectedChanges,
  195. info.ChangelistsWithSelectedChanges);
  196. }
  197. menu.AddSeparator(string.Empty);
  198. mFilterMenuBuilder.UpdateMenuItems(
  199. menu, FilterMenuUpdater.GetMenuActions(info));
  200. menu.AddSeparator(string.Empty);
  201. if (operations.HasFlag(PendingChangesMenuOperations.History))
  202. menu.AddItem(mViewHistoryMenuItemContent, false, HistoryMenuItem_Click);
  203. else
  204. menu.AddDisabledItem(mViewHistoryMenuItemContent, false);
  205. if (mMetaMenuOperations.SelectionHasMeta())
  206. {
  207. if (operations.HasFlag(PendingChangesMenuOperations.History))
  208. menu.AddItem(mViewHistoryMetaMenuItemContent, false, HistoryMetaMenuItem_Click);
  209. else
  210. menu.AddDisabledItem(mViewHistoryMetaMenuItemContent);
  211. }
  212. }
  213. void UpdateOpenMenuItems(GenericMenu menu, OpenMenuOperations operations)
  214. {
  215. if (!operations.HasFlag(OpenMenuOperations.Open) &&
  216. !operations.HasFlag(OpenMenuOperations.OpenWith) &&
  217. !operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  218. {
  219. menu.AddDisabledItem(mOpenSubmenuItemContent);
  220. return;
  221. }
  222. if (operations.HasFlag(OpenMenuOperations.Open))
  223. menu.AddItem(mOpenMenuItemContent, false, OpenMenuItem_Click);
  224. else
  225. menu.AddDisabledItem(mOpenMenuItemContent);
  226. if (operations.HasFlag(OpenMenuOperations.OpenWith))
  227. menu.AddItem(mOpenWithMenuItemContent, false, OpenWithMenuItem_Click);
  228. else
  229. menu.AddDisabledItem(mOpenWithMenuItemContent);
  230. if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  231. menu.AddItem(mOpenInExplorerMenuItemContent, false, OpenInExplorerMenuItem_Click);
  232. else
  233. menu.AddDisabledItem(mOpenInExplorerMenuItemContent);
  234. if (!mMetaMenuOperations.SelectionHasMeta())
  235. return;
  236. menu.AddSeparator(PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen) + "/");
  237. if (operations.HasFlag(OpenMenuOperations.Open))
  238. menu.AddItem(mOpenMetaMenuItemContent, false, OpenMetaMenuItem_Click);
  239. else
  240. menu.AddDisabledItem(mOpenMetaMenuItemContent);
  241. if (operations.HasFlag(OpenMenuOperations.OpenWith))
  242. menu.AddItem(mOpenMetaWithMenuItemContent, false, OpenMetaWithMenuItem_Click);
  243. else
  244. menu.AddDisabledItem(mOpenMetaWithMenuItemContent);
  245. if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  246. menu.AddItem(mOpenMetaInExplorerMenuItemContent, false, OpenMetaInExplorerMenuItem_Click);
  247. else
  248. menu.AddDisabledItem(mOpenMetaInExplorerMenuItemContent);
  249. }
  250. void UpdateUndoMenuItems(PendingChangesMenuOperations operations, GenericMenu menu, List<ChangeInfo> changes)
  251. {
  252. if (!operations.HasFlag(PendingChangesMenuOperations.UndoChanges))
  253. {
  254. menu.AddDisabledItem(mUndoChangesMenuItemContent);
  255. return;
  256. }
  257. if (mIsGluonMode)
  258. {
  259. menu.AddItem(mUndoChangesMenuItemContent, false, UndoChangesMenuItem_Click);
  260. return;
  261. }
  262. if (changes.Any(change => !ChangeTypesOperator.AreEquals(change.ChangeTypes, ChangeTypes.CheckedOut)))
  263. {
  264. menu.AddItem(mUndoChangesMenuItemContent, false, UndoChangesMenuItem_Click);
  265. }
  266. if (changes.Any(change => ChangeTypesOperator.AreEquals(change.ChangeTypes, ChangeTypes.CheckedOut)))
  267. {
  268. menu.AddItem(mUndoUnchangedMenuItemContent, false, UndoUnchangedMenuItem_Click);
  269. }
  270. if (changes.Any(change =>
  271. ChangeTypesOperator.ContainsAny(change.ChangeTypes, ChangeTypes.CheckedOut) &&
  272. ChangeTypesOperator.ContainsOther(change.ChangeTypes, ChangeTypes.CheckedOut)))
  273. {
  274. menu.AddItem(mUndoCheckoutsKeepingChangesMenuItemContent, false, UndoCheckoutsKeepingChangesMenuItem_Click);
  275. }
  276. }
  277. GUIContent GetNoActionMenuItemContent()
  278. {
  279. if (mNoActionMenuItemContent == null)
  280. {
  281. mNoActionMenuItemContent = new GUIContent(PlasticLocalization.GetString(
  282. PlasticLocalization.Name.NoActionMenuItem));
  283. }
  284. return mNoActionMenuItemContent;
  285. }
  286. void BuildComponents()
  287. {
  288. mOpenSubmenuItemContent = new GUIContent(
  289. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen));
  290. mOpenMenuItemContent = new GUIContent(
  291. UnityMenuItem.GetText(
  292. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  293. string.Format("{0} {1}",
  294. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  295. GetPlasticShortcut.ForOpen())));
  296. mOpenWithMenuItemContent = new GUIContent(
  297. UnityMenuItem.GetText(
  298. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  299. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpenWith)));
  300. mOpenInExplorerMenuItemContent = new GUIContent(
  301. UnityMenuItem.GetText(
  302. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  303. PlasticLocalization.GetString(PlasticLocalization.Name.OpenInExplorerMenuItem)));
  304. mOpenMetaMenuItemContent = new GUIContent(
  305. UnityMenuItem.GetText(
  306. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  307. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMeta)));
  308. mOpenMetaWithMenuItemContent = new GUIContent(
  309. UnityMenuItem.GetText(
  310. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  311. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaWith)));
  312. mOpenMetaInExplorerMenuItemContent = new GUIContent(
  313. UnityMenuItem.GetText(
  314. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  315. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaInExplorer)));
  316. mDiffMenuItemContent = new GUIContent(string.Format("{0} {1}",
  317. PlasticLocalization.GetString(PlasticLocalization.Name.DiffMenuItem),
  318. GetPlasticShortcut.ForDiff()));
  319. mDiffMetaMenuItemContent = new GUIContent(
  320. PlasticLocalization.GetString(PlasticLocalization.Name.DiffMetaMenuItem));
  321. mUndoChangesMenuItemContent = new GUIContent(
  322. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemUndoChanges));
  323. mUndoUnchangedMenuItemContent = new GUIContent(
  324. PlasticLocalization.GetString(PlasticLocalization.Name.UndoUnchangedButton));
  325. mUndoCheckoutsKeepingChangesMenuItemContent = new GUIContent(
  326. PlasticLocalization.GetString(PlasticLocalization.Name.UndoCheckoutsKeepingChanges));
  327. mCheckoutMenuItemContent = new GUIContent(
  328. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemCheckout));
  329. mDeleteMenuItemContent = new GUIContent(string.Format("{0} {1}",
  330. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemDelete),
  331. GetPlasticShortcut.ForDelete()));
  332. mViewHistoryMenuItemContent = new GUIContent(string.Format("{0} {1}",
  333. PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMenuItem),
  334. GetPlasticShortcut.ForHistory()));
  335. mViewHistoryMetaMenuItemContent = new GUIContent(
  336. PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMetaMenuItem));
  337. mFilterMenuBuilder.BuildIgnoredSubmenuItem();
  338. mFilterMenuBuilder.BuildHiddenChangesSubmenuItem();
  339. mMoveToChangelistMenuBuilder.BuildComponents();
  340. }
  341. static bool ProcessKeyActionForPendingChangesMenu(
  342. PendingChangesMenuOperations operationToExecute,
  343. IPendingChangesMenuOperations pendingChangesMenuOperations,
  344. SelectedChangesGroupInfo info)
  345. {
  346. PendingChangesMenuOperations operations =
  347. PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
  348. if (!operations.HasFlag(operationToExecute))
  349. return false;
  350. ProcessPendingChangesMenuOperation(
  351. operationToExecute, pendingChangesMenuOperations);
  352. return true;
  353. }
  354. static bool ProcessKeyActionForOpenMenu(
  355. OpenMenuOperations openOperationToExecute,
  356. IOpenMenuOperations openMenuOperations,
  357. SelectedChangesGroupInfo info)
  358. {
  359. OpenMenuOperations openOperations =
  360. GetOpenMenuOperations.ForPendingChangesView(info);
  361. if (!openOperations.HasFlag(openOperationToExecute))
  362. return false;
  363. ProcessOpenMenuOperation(
  364. openOperationToExecute, openMenuOperations);
  365. return true;
  366. }
  367. static void ProcessPendingChangesMenuOperation(
  368. PendingChangesMenuOperations operationToExecute,
  369. IPendingChangesMenuOperations pendingChangesMenuOperations)
  370. {
  371. if (operationToExecute == PendingChangesMenuOperations.DiffWorkspaceContent)
  372. {
  373. pendingChangesMenuOperations.Diff();
  374. return;
  375. }
  376. if (operationToExecute == PendingChangesMenuOperations.Delete)
  377. {
  378. pendingChangesMenuOperations.Delete();
  379. return;
  380. }
  381. if (operationToExecute == PendingChangesMenuOperations.History)
  382. {
  383. pendingChangesMenuOperations.History();
  384. return;
  385. }
  386. }
  387. static void ProcessOpenMenuOperation(
  388. OpenMenuOperations openOperationToExecute,
  389. IOpenMenuOperations openMenuOperations)
  390. {
  391. if (openOperationToExecute == OpenMenuOperations.Open)
  392. {
  393. openMenuOperations.Open();
  394. return;
  395. }
  396. }
  397. static PendingChangesMenuOperations GetPendingChangesMenuOperation(Event e)
  398. {
  399. if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.D))
  400. return PendingChangesMenuOperations.DiffWorkspaceContent;
  401. if (Keyboard.IsKeyPressed(e, KeyCode.Delete))
  402. return PendingChangesMenuOperations.Delete;
  403. if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.H))
  404. return PendingChangesMenuOperations.History;
  405. return PendingChangesMenuOperations.None;
  406. }
  407. static OpenMenuOperations GetOpenMenuOperation(Event e)
  408. {
  409. if (Keyboard.IsShiftPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.O))
  410. return OpenMenuOperations.Open;
  411. return OpenMenuOperations.None;
  412. }
  413. GUIContent mNoActionMenuItemContent;
  414. GUIContent mOpenSubmenuItemContent;
  415. GUIContent mOpenMenuItemContent;
  416. GUIContent mOpenWithMenuItemContent;
  417. GUIContent mOpenInExplorerMenuItemContent;
  418. GUIContent mOpenMetaMenuItemContent;
  419. GUIContent mOpenMetaWithMenuItemContent;
  420. GUIContent mOpenMetaInExplorerMenuItemContent;
  421. GUIContent mDiffMenuItemContent;
  422. GUIContent mDiffMetaMenuItemContent;
  423. GUIContent mUndoChangesMenuItemContent;
  424. GUIContent mUndoUnchangedMenuItemContent;
  425. GUIContent mUndoCheckoutsKeepingChangesMenuItemContent;
  426. GUIContent mCheckoutMenuItemContent;
  427. GUIContent mDeleteMenuItemContent;
  428. GUIContent mViewHistoryMenuItemContent;
  429. GUIContent mViewHistoryMetaMenuItemContent;
  430. readonly WorkspaceInfo mWkInfo;
  431. readonly IMetaMenuOperations mMetaMenuOperations;
  432. readonly IOpenMenuOperations mOpenMenuOperations;
  433. readonly IChangelistMenuOperations mChangelistMenuOperations;
  434. readonly IPendingChangesMenuOperations mPendingChangesMenuOperations;
  435. readonly IAdvancedUndoMenuOperations mAdvancedUndoMenuOperations;
  436. readonly FilesFilterPatternsMenuBuilder mFilterMenuBuilder;
  437. readonly MoveToChangelistMenuBuilder mMoveToChangelistMenuBuilder;
  438. readonly bool mIsGluonMode;
  439. }
  440. }