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.

ViewSwitcher.cs 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. using System;
  2. using UnityEditor;
  3. using Codice.Client.Common.EventTracking;
  4. using Codice.Client.Common.Threading;
  5. using Codice.CM.Common;
  6. using GluonGui;
  7. using PlasticGui;
  8. using PlasticGui.Gluon;
  9. using PlasticGui.WorkspaceWindow;
  10. using PlasticGui.WorkspaceWindow.Merge;
  11. using PlasticGui.WorkspaceWindow.QueryViews;
  12. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  13. using Unity.PlasticSCM.Editor.AssetUtils.Processor;
  14. using Unity.PlasticSCM.Editor.Tool;
  15. using Unity.PlasticSCM.Editor.UI;
  16. using Unity.PlasticSCM.Editor.UI.StatusBar;
  17. using Unity.PlasticSCM.Editor.Views.Changesets;
  18. using Unity.PlasticSCM.Editor.Views.History;
  19. using Unity.PlasticSCM.Editor.Views.IncomingChanges;
  20. using Unity.PlasticSCM.Editor.Views.PendingChanges;
  21. using Unity.PlasticSCM.Editor.Views.Branches;
  22. using Unity.PlasticSCM.Editor.Views.Locks;
  23. using GluonNewIncomingChangesUpdater = PlasticGui.Gluon.WorkspaceWindow.NewIncomingChangesUpdater;
  24. using ObjectInfo = Codice.CM.Common.ObjectInfo;
  25. namespace Unity.PlasticSCM.Editor
  26. {
  27. internal class ViewSwitcher :
  28. IViewSwitcher,
  29. IMergeViewLauncher,
  30. IGluonViewSwitcher,
  31. IHistoryViewLauncher
  32. {
  33. internal IIncomingChangesTab IncomingChangesTabForTesting { get { return mIncomingChangesTab; } }
  34. internal PendingChangesTab PendingChangesTab { get; private set; }
  35. internal ChangesetsTab ChangesetsTab { get; private set; }
  36. internal BranchesTab BranchesTab { get; private set; }
  37. internal HistoryTab HistoryTab { get; private set; }
  38. internal LocksTab LocksTab { get; private set; }
  39. internal ViewSwitcher(
  40. RepositorySpec repSpec,
  41. WorkspaceInfo wkInfo,
  42. ViewHost viewHost,
  43. bool isGluonMode,
  44. IAssetStatusCache assetStatusCache,
  45. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  46. LaunchTool.IProcessExecutor processExecutor,
  47. WorkspaceOperationsMonitor workspaceOperationsMonitor,
  48. StatusBar statusBar,
  49. EditorWindow parentWindow)
  50. {
  51. mRepSpec = repSpec;
  52. mWkInfo = wkInfo;
  53. mViewHost = viewHost;
  54. mIsGluonMode = isGluonMode;
  55. mAssetStatusCache = assetStatusCache;
  56. mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
  57. mProcessExecutor = processExecutor;
  58. mWorkspaceOperationsMonitor = workspaceOperationsMonitor;
  59. mStatusBar = statusBar;
  60. mParentWindow = parentWindow;
  61. mPendingChangesTabButton = new TabButton();
  62. mIncomingChangesTabButton = new TabButton();
  63. mChangesetsTabButton = new TabButton();
  64. mBranchesTabButton = new TabButton();
  65. mHistoryTabButton = new TabButton();
  66. mLocksTabButton = new TabButton();
  67. }
  68. internal void SetNewIncomingChanges(
  69. NewIncomingChangesUpdater developerNewIncomingChangesUpdater,
  70. GluonNewIncomingChangesUpdater gluonNewIncomingChangesUpdater,
  71. IIncomingChangesNotifier incomingChangesNotifier)
  72. {
  73. mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater;
  74. mGluonNewIncomingChangesUpdater = gluonNewIncomingChangesUpdater;
  75. mIncomingChangesNotifier = incomingChangesNotifier;
  76. }
  77. internal void SetWorkspaceWindow(WorkspaceWindow workspaceWindow)
  78. {
  79. mWorkspaceWindow = workspaceWindow;
  80. }
  81. internal void ShowInitialView()
  82. {
  83. ShowPendingChangesView();
  84. }
  85. internal void AutoRefreshPendingChangesView()
  86. {
  87. AutoRefresh.PendingChangesView(
  88. PendingChangesTab);
  89. }
  90. internal void AutoRefreshIncomingChangesView()
  91. {
  92. AutoRefresh.IncomingChangesView(
  93. mIncomingChangesTab);
  94. }
  95. internal void RefreshView(ViewType viewType)
  96. {
  97. IRefreshableView view = GetRefreshableView(viewType);
  98. if (view == null)
  99. return;
  100. view.Refresh();
  101. }
  102. internal void RefreshSelectedView()
  103. {
  104. IRefreshableView view = GetRefreshableViewBasedOnSelectedTab(mSelectedTab);
  105. if (view == null)
  106. return;
  107. view.Refresh();
  108. }
  109. internal void RefreshWorkingObjectInfoForSelectedView(
  110. ViewType viewType,
  111. WorkingObjectInfo homeInfo)
  112. {
  113. switch (viewType)
  114. {
  115. case ViewType.BranchesView:
  116. if (BranchesTab != null)
  117. BranchesTab.SetWorkingObjectInfo(homeInfo);
  118. break;
  119. case ViewType.ChangesetsView:
  120. if (ChangesetsTab != null)
  121. ChangesetsTab.SetWorkingObjectInfo(homeInfo);
  122. break;
  123. }
  124. }
  125. internal void OnDisable()
  126. {
  127. mWorkspaceOperationsMonitor.UnRegisterViews();
  128. if (PendingChangesTab != null)
  129. PendingChangesTab.OnDisable();
  130. if (mIncomingChangesTab != null)
  131. mIncomingChangesTab.OnDisable();
  132. if (ChangesetsTab != null)
  133. ChangesetsTab.OnDisable();
  134. if (BranchesTab != null)
  135. BranchesTab.OnDisable();
  136. if (HistoryTab != null)
  137. HistoryTab.OnDisable();
  138. if (LocksTab != null)
  139. LocksTab.OnDisable();
  140. }
  141. internal void Update()
  142. {
  143. if (IsViewSelected(SelectedTab.PendingChanges))
  144. {
  145. PendingChangesTab.Update();
  146. return;
  147. }
  148. if (IsViewSelected(SelectedTab.IncomingChanges))
  149. {
  150. mIncomingChangesTab.Update();
  151. return;
  152. }
  153. if (IsViewSelected(SelectedTab.Changesets))
  154. {
  155. ChangesetsTab.Update();
  156. return;
  157. }
  158. if (IsViewSelected(SelectedTab.Branches))
  159. {
  160. BranchesTab.Update();
  161. return;
  162. }
  163. if (IsViewSelected(SelectedTab.History))
  164. {
  165. HistoryTab.Update();
  166. return;
  167. }
  168. if (IsViewSelected(SelectedTab.Locks))
  169. {
  170. LocksTab.Update();
  171. return;
  172. }
  173. }
  174. internal void TabButtonsGUI()
  175. {
  176. InitializeTabButtonWidth();
  177. PendingChangesTabButtonGUI();
  178. IncomingChangesTabButtonGUI();
  179. ChangesetsTabButtonGUI();
  180. BranchesTabButtonGUI();
  181. HistoryTabButtonGUI();
  182. LocksTabButtonGUI();
  183. }
  184. internal void TabViewGUI()
  185. {
  186. if (IsViewSelected(SelectedTab.PendingChanges))
  187. {
  188. PendingChangesTab.OnGUI();
  189. return;
  190. }
  191. if (IsViewSelected(SelectedTab.IncomingChanges))
  192. {
  193. mIncomingChangesTab.OnGUI();
  194. return;
  195. }
  196. if (IsViewSelected(SelectedTab.Changesets))
  197. {
  198. ChangesetsTab.OnGUI();
  199. return;
  200. }
  201. if (IsViewSelected(SelectedTab.Branches))
  202. {
  203. BranchesTab.OnGUI();
  204. return;
  205. }
  206. if (IsViewSelected(SelectedTab.History))
  207. {
  208. HistoryTab.OnGUI();
  209. return;
  210. }
  211. if (IsViewSelected(SelectedTab.Locks))
  212. {
  213. LocksTab.OnGUI();
  214. return;
  215. }
  216. }
  217. internal void ShowBranchesViewIfNeeded()
  218. {
  219. if (!BoolSetting.Load(UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME, true))
  220. return;
  221. string query = QueryConstants.BranchesBeginningQuery;
  222. ViewQueryResult queryResult = null;
  223. IThreadWaiter waiter = ThreadWaiter.GetWaiter();
  224. waiter.Execute(
  225. /*threadOperationDelegate*/ delegate
  226. {
  227. queryResult = new ViewQueryResult(
  228. PlasticGui.Plastic.API.FindQuery(mWkInfo, query));
  229. },
  230. /*afterOperationDelegate*/ delegate
  231. {
  232. if (waiter.Exception != null)
  233. {
  234. ExceptionsHandler.DisplayException(waiter.Exception);
  235. return;
  236. }
  237. if (queryResult == null)
  238. return;
  239. if (queryResult.Count()>0)
  240. OpenBranchesTab();
  241. });
  242. }
  243. internal void ShowBranchesView()
  244. {
  245. OpenBranchesTab();
  246. bool wasBranchesSelected =
  247. IsViewSelected(SelectedTab.Branches);
  248. if (!wasBranchesSelected)
  249. ((IRefreshableView)BranchesTab).Refresh();
  250. SetSelectedView(SelectedTab.Branches);
  251. }
  252. internal void ShowLocksViewIfNeeded()
  253. {
  254. if (!BoolSetting.Load(UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME, false))
  255. return;
  256. OpenLocksTab();
  257. }
  258. internal void ShowLocksView()
  259. {
  260. OpenLocksTab();
  261. bool wasLocksViewSelected =
  262. IsViewSelected(SelectedTab.Locks);
  263. if (!wasLocksViewSelected)
  264. ((IRefreshableView)LocksTab).Refresh();
  265. SetSelectedView(SelectedTab.Locks);
  266. }
  267. void IViewSwitcher.ShowPendingChanges()
  268. {
  269. ShowPendingChangesView();
  270. mParentWindow.Repaint();
  271. }
  272. void IViewSwitcher.ShowSyncView(string syncViewToSelect)
  273. {
  274. throw new NotImplementedException();
  275. }
  276. void IViewSwitcher.ShowBranchExplorerView()
  277. {
  278. //TODO: Codice
  279. //launch plastic with branch explorer view option
  280. }
  281. void IViewSwitcher.DisableMergeView()
  282. {
  283. }
  284. bool IViewSwitcher.IsIncomingChangesView()
  285. {
  286. return IsViewSelected(SelectedTab.IncomingChanges);
  287. }
  288. void IViewSwitcher.CloseIncomingChangesView()
  289. {
  290. ((IViewSwitcher)this).DisableMergeView();
  291. }
  292. void IMergeViewLauncher.MergeFrom(ObjectInfo objectInfo, EnumMergeType mergeType)
  293. {
  294. ((IMergeViewLauncher)this).MergeFromInterval(objectInfo, null, mergeType);
  295. }
  296. void IMergeViewLauncher.MergeFrom(ObjectInfo objectInfo, EnumMergeType mergeType, ShowIncomingChangesFrom from)
  297. {
  298. ((IMergeViewLauncher)this).MergeFromInterval(objectInfo, null, mergeType);
  299. }
  300. void IMergeViewLauncher.MergeFromInterval(ObjectInfo objectInfo, ObjectInfo ancestorChangesetInfo, EnumMergeType mergeType)
  301. {
  302. if (mergeType == EnumMergeType.IncomingMerge)
  303. {
  304. ShowIncomingChangesView();
  305. mParentWindow.Repaint();
  306. return;
  307. }
  308. LaunchTool.OpenMerge(
  309. mShowDownloadPlasticExeWindow,
  310. mProcessExecutor,
  311. mWkInfo,
  312. mIsGluonMode);
  313. }
  314. void IGluonViewSwitcher.ShowIncomingChangesView()
  315. {
  316. ShowIncomingChangesView();
  317. mParentWindow.Repaint();
  318. }
  319. void IHistoryViewLauncher.ShowHistoryView(
  320. RepositorySpec repSpec,
  321. long itemId,
  322. string path,
  323. bool isDirectory)
  324. {
  325. ShowHistoryView(
  326. repSpec,
  327. itemId,
  328. path,
  329. isDirectory);
  330. mParentWindow.Repaint();
  331. }
  332. void CloseHistoryTab()
  333. {
  334. mViewHost.RemoveRefreshableView(
  335. ViewType.HistoryView, HistoryTab);
  336. HistoryTab.OnDisable();
  337. HistoryTab = null;
  338. ShowPreviousViewFrom(SelectedTab.History);
  339. mParentWindow.Repaint();
  340. }
  341. void OpenBranchesTab()
  342. {
  343. if (BranchesTab == null)
  344. {
  345. BranchesTab = new BranchesTab(
  346. mWkInfo,
  347. mWorkspaceWindow,
  348. this,
  349. this,
  350. mWorkspaceWindow,
  351. mDeveloperNewIncomingChangesUpdater,
  352. mGluonNewIncomingChangesUpdater,
  353. mParentWindow);
  354. mViewHost.AddRefreshableView(
  355. ViewType.BranchesView, BranchesTab);
  356. }
  357. BoolSetting.Save(true, UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME);
  358. }
  359. void CloseBranchesTab()
  360. {
  361. BoolSetting.Save(false, UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME);
  362. mViewHost.RemoveRefreshableView(
  363. ViewType.BranchesView, BranchesTab);
  364. BranchesTab.OnDisable();
  365. BranchesTab = null;
  366. ShowPreviousViewFrom(SelectedTab.Branches);
  367. mParentWindow.Repaint();
  368. }
  369. internal void ShowPendingChangesView()
  370. {
  371. if (PendingChangesTab == null)
  372. {
  373. PendingChangesTab = new PendingChangesTab(
  374. mWkInfo,
  375. mViewHost,
  376. mIsGluonMode,
  377. mWorkspaceWindow,
  378. this,
  379. this,
  380. this,
  381. mShowDownloadPlasticExeWindow,
  382. mWorkspaceOperationsMonitor,
  383. mDeveloperNewIncomingChangesUpdater,
  384. mGluonNewIncomingChangesUpdater,
  385. mAssetStatusCache,
  386. mStatusBar,
  387. mParentWindow);
  388. mViewHost.AddRefreshableView(
  389. ViewType.CheckinView,
  390. PendingChangesTab);
  391. mWorkspaceOperationsMonitor.RegisterPendingChangesView(
  392. PendingChangesTab);
  393. }
  394. bool wasPendingChangesSelected =
  395. IsViewSelected(SelectedTab.PendingChanges);
  396. if (!wasPendingChangesSelected)
  397. {
  398. PendingChangesTab.AutoRefresh();
  399. }
  400. SetSelectedView(SelectedTab.PendingChanges);
  401. }
  402. void ShowIncomingChangesView()
  403. {
  404. if (mIncomingChangesTab == null)
  405. {
  406. mIncomingChangesTab = mIsGluonMode ?
  407. new Views.IncomingChanges.Gluon.IncomingChangesTab(
  408. mWkInfo,
  409. mViewHost,
  410. mWorkspaceWindow,
  411. mShowDownloadPlasticExeWindow,
  412. mGluonNewIncomingChangesUpdater,
  413. (Gluon.IncomingChangesNotifier)mIncomingChangesNotifier,
  414. mStatusBar,
  415. mParentWindow) as IIncomingChangesTab :
  416. new Views.IncomingChanges.Developer.IncomingChangesTab(
  417. mWkInfo,
  418. mWorkspaceWindow,
  419. this,
  420. mShowDownloadPlasticExeWindow,
  421. mDeveloperNewIncomingChangesUpdater,
  422. mParentWindow);
  423. mViewHost.AddRefreshableView(
  424. ViewType.IncomingChangesView,
  425. (IRefreshableView)mIncomingChangesTab);
  426. mWorkspaceOperationsMonitor.RegisterIncomingChangesView(
  427. mIncomingChangesTab);
  428. }
  429. bool wasIncomingChangesSelected =
  430. IsViewSelected(SelectedTab.IncomingChanges);
  431. if (!wasIncomingChangesSelected)
  432. mIncomingChangesTab.AutoRefresh();
  433. SetSelectedView(SelectedTab.IncomingChanges);
  434. }
  435. internal void ShowChangesetsView()
  436. {
  437. if (ChangesetsTab == null)
  438. {
  439. ChangesetsTab = new ChangesetsTab(
  440. mWkInfo,
  441. mWorkspaceWindow,
  442. this,
  443. this,
  444. this,
  445. mViewHost,
  446. mWorkspaceWindow,
  447. mWorkspaceWindow,
  448. mDeveloperNewIncomingChangesUpdater,
  449. PendingChangesTab,
  450. mShowDownloadPlasticExeWindow,
  451. mProcessExecutor,
  452. mParentWindow,
  453. mIsGluonMode);
  454. mViewHost.AddRefreshableView(
  455. ViewType.ChangesetsView,
  456. ChangesetsTab);
  457. }
  458. bool wasChangesetsSelected =
  459. IsViewSelected(SelectedTab.Changesets);
  460. if (!wasChangesetsSelected)
  461. ((IRefreshableView)ChangesetsTab).Refresh();
  462. SetSelectedView(SelectedTab.Changesets);
  463. }
  464. internal void ShowHistoryView(
  465. RepositorySpec repSpec,
  466. long itemId,
  467. string path,
  468. bool isDirectory)
  469. {
  470. if (HistoryTab == null)
  471. {
  472. HistoryTab = new HistoryTab(
  473. mWkInfo,
  474. mWorkspaceWindow,
  475. repSpec,
  476. mShowDownloadPlasticExeWindow,
  477. mProcessExecutor,
  478. mDeveloperNewIncomingChangesUpdater,
  479. mViewHost,
  480. mParentWindow,
  481. mIsGluonMode);
  482. mViewHost.AddRefreshableView(
  483. ViewType.HistoryView, HistoryTab);
  484. }
  485. HistoryTab.RefreshForItem(
  486. itemId,
  487. path,
  488. isDirectory);
  489. SetSelectedView(SelectedTab.History);
  490. }
  491. void ShowHistoryView()
  492. {
  493. if (HistoryTab == null)
  494. return;
  495. ((IRefreshableView)HistoryTab).Refresh();
  496. SetSelectedView(SelectedTab.History);
  497. }
  498. void OpenLocksTab()
  499. {
  500. if (LocksTab == null)
  501. {
  502. LocksTab = new LocksTab(mRepSpec, mWorkspaceWindow, mParentWindow);
  503. mViewHost.AddRefreshableView(ViewType.LocksView, LocksTab);
  504. TrackFeatureUseEvent.For(mRepSpec,
  505. TrackFeatureUseEvent.Features.OpenLocksView);
  506. }
  507. BoolSetting.Save(true, UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME);
  508. }
  509. void CloseLocksTab()
  510. {
  511. BoolSetting.Save(false, UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME);
  512. TrackFeatureUseEvent.For(mRepSpec,
  513. TrackFeatureUseEvent.Features.CloseLocksView);
  514. mViewHost.RemoveRefreshableView(ViewType.LocksView, LocksTab);
  515. LocksTab.OnDisable();
  516. LocksTab = null;
  517. ShowPreviousViewFrom(SelectedTab.Locks);
  518. mParentWindow.Repaint();
  519. }
  520. void LocksTabButtonGUI()
  521. {
  522. if (LocksTab == null)
  523. {
  524. return;
  525. }
  526. var wasLocksTabSelected = IsViewSelected(SelectedTab.Locks);
  527. bool isCloseButtonClicked;
  528. var isLocksTabSelected = mLocksTabButton.DrawClosableTabButton(
  529. PlasticLocalization.Name.LocksViewTitle.GetString(),
  530. wasLocksTabSelected,
  531. true,
  532. mTabButtonWidth,
  533. mParentWindow.Repaint,
  534. out isCloseButtonClicked);
  535. if (isCloseButtonClicked)
  536. {
  537. CloseLocksTab();
  538. return;
  539. }
  540. if (isLocksTabSelected)
  541. {
  542. SetSelectedView(SelectedTab.Locks);
  543. }
  544. }
  545. void InitializeTabButtonWidth()
  546. {
  547. if (mTabButtonWidth != -1)
  548. return;
  549. mTabButtonWidth = MeasureMaxWidth.ForTexts(
  550. UnityStyles.PlasticWindow.TabButton,
  551. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesViewTitle),
  552. PlasticLocalization.GetString(PlasticLocalization.Name.IncomingChangesViewTitle),
  553. PlasticLocalization.GetString(PlasticLocalization.Name.BranchesViewTitle),
  554. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsViewTitle),
  555. PlasticLocalization.GetString(PlasticLocalization.Name.FileHistory),
  556. PlasticLocalization.GetString(PlasticLocalization.Name.LocksViewTitle));
  557. }
  558. void ShowView(SelectedTab viewToShow)
  559. {
  560. switch (viewToShow)
  561. {
  562. case SelectedTab.PendingChanges:
  563. ShowPendingChangesView();
  564. break;
  565. case SelectedTab.IncomingChanges:
  566. ShowIncomingChangesView();
  567. break;
  568. case SelectedTab.Changesets:
  569. ShowChangesetsView();
  570. break;
  571. case SelectedTab.Branches:
  572. ShowBranchesView();
  573. break;
  574. case SelectedTab.History:
  575. ShowHistoryView();
  576. break;
  577. case SelectedTab.Locks:
  578. ShowLocksView();
  579. break;
  580. }
  581. }
  582. void ShowPreviousViewFrom(SelectedTab tabToClose)
  583. {
  584. if (!IsViewSelected(tabToClose))
  585. return;
  586. if (GetRefreshableViewBasedOnSelectedTab(mPreviousSelectedTab) == null)
  587. mPreviousSelectedTab = SelectedTab.PendingChanges;
  588. ShowView(mPreviousSelectedTab);
  589. }
  590. IRefreshableView GetRefreshableViewBasedOnSelectedTab(SelectedTab selectedTab)
  591. {
  592. switch (selectedTab)
  593. {
  594. case SelectedTab.PendingChanges:
  595. return PendingChangesTab;
  596. case SelectedTab.IncomingChanges:
  597. return (IRefreshableView)mIncomingChangesTab;
  598. case SelectedTab.Changesets:
  599. return ChangesetsTab;
  600. case SelectedTab.Branches:
  601. return BranchesTab;
  602. case SelectedTab.History:
  603. return HistoryTab;
  604. case SelectedTab.Locks:
  605. return LocksTab;
  606. default:
  607. return null;
  608. }
  609. }
  610. IRefreshableView GetRefreshableView(ViewType viewType)
  611. {
  612. switch (viewType)
  613. {
  614. case ViewType.PendingChangesView:
  615. return PendingChangesTab;
  616. case ViewType.IncomingChangesView:
  617. return (IRefreshableView)mIncomingChangesTab;
  618. case ViewType.ChangesetsView:
  619. return ChangesetsTab;
  620. case ViewType.BranchesView:
  621. return BranchesTab;
  622. case ViewType.HistoryView:
  623. return HistoryTab;
  624. case ViewType.LocksView:
  625. return LocksTab;
  626. default:
  627. return null;
  628. }
  629. }
  630. internal bool IsViewSelected(SelectedTab tab)
  631. {
  632. return mSelectedTab == tab;
  633. }
  634. void SetSelectedView(SelectedTab tab)
  635. {
  636. if (mSelectedTab != tab)
  637. mPreviousSelectedTab = mSelectedTab;
  638. mSelectedTab = tab;
  639. if (mIncomingChangesTab == null)
  640. return;
  641. mIncomingChangesTab.IsVisible =
  642. tab == SelectedTab.IncomingChanges;
  643. }
  644. void PendingChangesTabButtonGUI()
  645. {
  646. bool wasPendingChangesSelected =
  647. IsViewSelected(SelectedTab.PendingChanges);
  648. bool isPendingChangesSelected = mPendingChangesTabButton.
  649. DrawTabButton(
  650. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesViewTitle),
  651. wasPendingChangesSelected,
  652. mTabButtonWidth);
  653. if (isPendingChangesSelected)
  654. ShowPendingChangesView();
  655. }
  656. void IncomingChangesTabButtonGUI()
  657. {
  658. bool wasIncomingChangesSelected =
  659. IsViewSelected(SelectedTab.IncomingChanges);
  660. bool isIncomingChangesSelected = mIncomingChangesTabButton.
  661. DrawTabButton(
  662. PlasticLocalization.GetString(PlasticLocalization.Name.IncomingChangesViewTitle),
  663. wasIncomingChangesSelected,
  664. mTabButtonWidth);
  665. if (isIncomingChangesSelected)
  666. ShowIncomingChangesView();
  667. }
  668. void ChangesetsTabButtonGUI()
  669. {
  670. bool wasChangesetsSelected =
  671. IsViewSelected(SelectedTab.Changesets);
  672. bool isChangesetsSelected = mChangesetsTabButton.
  673. DrawTabButton(
  674. PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsViewTitle),
  675. wasChangesetsSelected,
  676. mTabButtonWidth);
  677. if (isChangesetsSelected)
  678. ShowChangesetsView();
  679. }
  680. void HistoryTabButtonGUI()
  681. {
  682. if (HistoryTab == null)
  683. return;
  684. bool wasHistorySelected =
  685. IsViewSelected(SelectedTab.History);
  686. bool isCloseButtonClicked;
  687. bool isHistorySelected = mHistoryTabButton.
  688. DrawClosableTabButton(
  689. PlasticLocalization.GetString(PlasticLocalization.Name.FileHistory),
  690. wasHistorySelected,
  691. true,
  692. mTabButtonWidth,
  693. mParentWindow.Repaint,
  694. out isCloseButtonClicked);
  695. if (isCloseButtonClicked)
  696. {
  697. CloseHistoryTab();
  698. return;
  699. }
  700. if (isHistorySelected)
  701. SetSelectedView(SelectedTab.History);
  702. }
  703. void BranchesTabButtonGUI()
  704. {
  705. if (BranchesTab == null)
  706. return;
  707. bool wasBranchesSelected =
  708. IsViewSelected(SelectedTab.Branches);
  709. bool isCloseButtonClicked;
  710. bool isBranchesSelected = mBranchesTabButton.
  711. DrawClosableTabButton(PlasticLocalization.GetString(
  712. PlasticLocalization.Name.BranchesViewTitle),
  713. wasBranchesSelected,
  714. true,
  715. mTabButtonWidth,
  716. mParentWindow.Repaint,
  717. out isCloseButtonClicked);
  718. if (isCloseButtonClicked)
  719. {
  720. CloseBranchesTab();
  721. return;
  722. }
  723. if (isBranchesSelected)
  724. SetSelectedView(SelectedTab.Branches);
  725. }
  726. internal enum SelectedTab
  727. {
  728. None = 0,
  729. PendingChanges = 1,
  730. IncomingChanges = 2,
  731. Changesets = 3,
  732. Branches = 4,
  733. History = 5,
  734. Locks = 6
  735. }
  736. IIncomingChangesTab mIncomingChangesTab;
  737. SelectedTab mSelectedTab;
  738. SelectedTab mPreviousSelectedTab;
  739. float mTabButtonWidth = -1;
  740. TabButton mPendingChangesTabButton;
  741. TabButton mChangesetsTabButton;
  742. TabButton mIncomingChangesTabButton;
  743. TabButton mHistoryTabButton;
  744. TabButton mBranchesTabButton;
  745. TabButton mLocksTabButton;
  746. IIncomingChangesNotifier mIncomingChangesNotifier;
  747. GluonNewIncomingChangesUpdater mGluonNewIncomingChangesUpdater;
  748. NewIncomingChangesUpdater mDeveloperNewIncomingChangesUpdater;
  749. WorkspaceWindow mWorkspaceWindow;
  750. readonly EditorWindow mParentWindow;
  751. readonly StatusBar mStatusBar;
  752. readonly WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
  753. readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
  754. readonly LaunchTool.IProcessExecutor mProcessExecutor;
  755. readonly IAssetStatusCache mAssetStatusCache;
  756. readonly bool mIsGluonMode;
  757. readonly ViewHost mViewHost;
  758. readonly WorkspaceInfo mWkInfo;
  759. readonly RepositorySpec mRepSpec;
  760. }
  761. }