ViewSwitcher.cs 23 KB

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