暫無描述
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.

ChangesetsTab.cs 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEditor.IMGUI.Controls;
  5. using UnityEngine;
  6. using Codice.Client.Commands;
  7. using Codice.Client.Common;
  8. using Codice.Client.Common.EventTracking;
  9. using Codice.Client.Common.Threading;
  10. using Codice.CM.Common;
  11. using Codice.CM.Common.Mount;
  12. using PlasticGui;
  13. using PlasticGui.WorkspaceWindow;
  14. using PlasticGui.WorkspaceWindow.Update;
  15. using PlasticGui.WorkspaceWindow.QueryViews;
  16. using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
  17. using GluonGui;
  18. using Unity.PlasticSCM.Editor.AssetUtils;
  19. using Unity.PlasticSCM.Editor.UI;
  20. using Unity.PlasticSCM.Editor.UI.Progress;
  21. using Unity.PlasticSCM.Editor.UI.Tree;
  22. using Unity.PlasticSCM.Editor.Tool;
  23. using Unity.PlasticSCM.Editor.Views.Diff;
  24. using IGluonUpdateReport = PlasticGui.Gluon.IUpdateReport;
  25. namespace Unity.PlasticSCM.Editor.Views.Changesets
  26. {
  27. internal partial class ChangesetsTab :
  28. IRefreshableView,
  29. IQueryRefreshableView,
  30. IChangesetMenuOperations,
  31. ChangesetsViewMenu.IMenuOperations
  32. {
  33. internal ChangesetsListView Table { get { return mChangesetsListView; } }
  34. internal IChangesetMenuOperations Operations { get { return this; } }
  35. internal interface IRevertToChangesetListener
  36. {
  37. void OnSuccessOperation();
  38. }
  39. internal ChangesetsTab(
  40. WorkspaceInfo wkInfo,
  41. WorkspaceWindow workspaceWindow,
  42. IViewSwitcher viewSwitcher,
  43. IMergeViewLauncher mergeViewLauncher,
  44. IHistoryViewLauncher historyViewLauncher,
  45. ViewHost viewHost,
  46. IUpdateReport updateReport,
  47. IGluonUpdateReport gluonUpdateReport,
  48. NewIncomingChangesUpdater newIncomingChangesUpdater,
  49. IRevertToChangesetListener revertToChangesetListener,
  50. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  51. LaunchTool.IProcessExecutor processExecutor,
  52. EditorWindow parentWindow,
  53. bool isGluonMode)
  54. {
  55. mWkInfo = wkInfo;
  56. mViewHost = viewHost;
  57. mWorkspaceWindow = workspaceWindow;
  58. mViewSwitcher = viewSwitcher;
  59. mRevertToChangesetListener = revertToChangesetListener;
  60. mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
  61. mProcessExecutor = processExecutor;
  62. mParentWindow = parentWindow;
  63. mIsGluonMode = isGluonMode;
  64. mGluonUpdateReport = gluonUpdateReport;
  65. BuildComponents(
  66. wkInfo,
  67. workspaceWindow,
  68. workspaceWindow,
  69. viewSwitcher,
  70. historyViewLauncher,
  71. parentWindow);
  72. mProgressControls = new ProgressControlsForViews();
  73. mSplitterState = PlasticSplitterGUILayout.InitSplitterState(
  74. new float[] { 0.50f, 0.50f },
  75. new int[] { 100, (int)UnityConstants.DIFF_PANEL_MIN_WIDTH },
  76. new int[] { 100000, 100000 }
  77. );
  78. mBorderColor = EditorGUIUtility.isProSkin
  79. ? (Color)new Color32(35, 35, 35, 255)
  80. : (Color)new Color32(153, 153, 153, 255);
  81. mChangesetOperations = new ChangesetOperations(
  82. wkInfo,
  83. workspaceWindow,
  84. viewSwitcher,
  85. mergeViewLauncher,
  86. this,
  87. ViewType.ChangesetsView,
  88. mProgressControls,
  89. updateReport,
  90. new ContinueWithPendingChangesQuestionerBuilder(viewSwitcher, parentWindow),
  91. newIncomingChangesUpdater,
  92. null,
  93. null);
  94. ((IRefreshableView)this).Refresh();
  95. }
  96. internal void OnDisable()
  97. {
  98. mDiffPanel.OnDisable();
  99. mSearchField.downOrUpArrowKeyPressed -=
  100. SearchField_OnDownOrUpArrowKeyPressed;
  101. TreeHeaderSettings.Save(
  102. mChangesetsListView.multiColumnHeader.state,
  103. UnityConstants.CHANGESETS_TABLE_SETTINGS_NAME);
  104. }
  105. internal void Update()
  106. {
  107. mDiffPanel.Update();
  108. mProgressControls.UpdateProgress(mParentWindow);
  109. }
  110. internal void OnGUI()
  111. {
  112. InitializeShowChangesButtonWidth();
  113. DoActionsToolbar(
  114. this,
  115. mProgressControls,
  116. mSearchField,
  117. mChangesetsListView,
  118. mDateFilter);
  119. PlasticSplitterGUILayout.BeginHorizontalSplit(mSplitterState);
  120. DoChangesetsArea(
  121. mChangesetsListView,
  122. mProgressControls.IsOperationRunning());
  123. EditorGUILayout.BeginHorizontal();
  124. Rect border = GUILayoutUtility.GetRect(1, 0, 1, 100000);
  125. EditorGUI.DrawRect(border, mBorderColor);
  126. DoChangesArea(mDiffPanel);
  127. EditorGUILayout.EndHorizontal();
  128. PlasticSplitterGUILayout.EndHorizontalSplit();
  129. }
  130. internal void DrawSearchFieldForChangesetsTab()
  131. {
  132. DrawSearchField.For(
  133. mSearchField,
  134. mChangesetsListView,
  135. UnityConstants.SEARCH_FIELD_WIDTH);
  136. VerifyIfSearchFieldIsRecentlyFocused(mSearchField);
  137. }
  138. internal void SetWorkingObjectInfo(WorkingObjectInfo homeInfo)
  139. {
  140. if (mIsGluonMode)
  141. return;
  142. lock (mLock)
  143. {
  144. mLoadedChangesetId = homeInfo.GetChangesetId();
  145. }
  146. mChangesetsListView.SetLoadedChangesetId(mLoadedChangesetId);
  147. mChangesetsViewMenu.SetLoadedBranchId(homeInfo.BranchInfo.BranchId);
  148. }
  149. internal void SetRevertToChangesetOperationInterfacesForTesting(
  150. RevertToChangesetOperation.IGetStatusForWorkspace getStatusForWorkspace,
  151. RevertToChangesetOperation.IUndoCheckoutOperation undoCheckoutOperation,
  152. RevertToChangesetOperation.IRevertToChangesetMergeController revertToChangesetMergeController)
  153. {
  154. mGetStatusForWorkspace = getStatusForWorkspace;
  155. mUndoCheckoutOperation = undoCheckoutOperation;
  156. mRevertToChangesetMergeController = revertToChangesetMergeController;
  157. }
  158. internal void SetLaunchToolForTesting(
  159. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  160. LaunchTool.IProcessExecutor processExecutor)
  161. {
  162. mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
  163. mProcessExecutor = processExecutor;
  164. }
  165. void IRefreshableView.Refresh()
  166. {
  167. string query = GetChangesetsQuery(mDateFilter);
  168. FillChangesets(
  169. mWkInfo,
  170. query,
  171. ChangesetsSelection.GetSelectedRepObjectInfos(mChangesetsListView));
  172. }
  173. void IQueryRefreshableView.RefreshAndSelect(RepObjectInfo repObj)
  174. {
  175. string query = GetChangesetsQuery(mDateFilter);
  176. FillChangesets(
  177. mWkInfo,
  178. query,
  179. new List<RepObjectInfo> { repObj });
  180. }
  181. int IChangesetMenuOperations.GetSelectedChangesetsCount()
  182. {
  183. return ChangesetsSelection.GetSelectedChangesetsCount(mChangesetsListView);
  184. }
  185. void IChangesetMenuOperations.DiffChangeset()
  186. {
  187. LaunchDiffOperations.DiffChangeset(
  188. mShowDownloadPlasticExeWindow,
  189. mProcessExecutor,
  190. ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
  191. ChangesetsSelection.GetSelectedChangeset(mChangesetsListView),
  192. mIsGluonMode);
  193. }
  194. void IChangesetMenuOperations.DiffSelectedChangesets()
  195. {
  196. List<RepObjectInfo> selectedChangesets = ChangesetsSelection.
  197. GetSelectedRepObjectInfos(mChangesetsListView);
  198. if (selectedChangesets.Count < 2)
  199. return;
  200. LaunchDiffOperations.DiffSelectedChangesets(
  201. mShowDownloadPlasticExeWindow,
  202. mProcessExecutor,
  203. ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
  204. (ChangesetExtendedInfo)selectedChangesets[0],
  205. (ChangesetExtendedInfo)selectedChangesets[1],
  206. mIsGluonMode);
  207. }
  208. void IChangesetMenuOperations.SwitchToChangeset()
  209. {
  210. SwitchToChangesetForMode(mIsGluonMode);
  211. }
  212. void IChangesetMenuOperations.DiffWithAnotherChangeset() { }
  213. void IChangesetMenuOperations.CreateBranch() { }
  214. void IChangesetMenuOperations.LabelChangeset() { }
  215. void IChangesetMenuOperations.MergeChangeset() {}
  216. void IChangesetMenuOperations.CherryPickChangeset() { }
  217. void IChangesetMenuOperations.SubtractiveChangeset() { }
  218. void IChangesetMenuOperations.SubtractiveChangesetInterval() { }
  219. void IChangesetMenuOperations.CherryPickChangesetInterval() { }
  220. void IChangesetMenuOperations.MergeToChangeset() { }
  221. void IChangesetMenuOperations.MoveChangeset() { }
  222. void IChangesetMenuOperations.DeleteChangeset() { }
  223. void IChangesetMenuOperations.BrowseRepositoryOnChangeset() { }
  224. void IChangesetMenuOperations.CreateCodeReview() { }
  225. void IChangesetMenuOperations.RevertToChangeset()
  226. {
  227. if (((IChangesetMenuOperations)this).GetSelectedChangesetsCount() != 1)
  228. return;
  229. ChangesetExtendedInfo targetChangesetInfo = ((ChangesetsViewMenu.IMenuOperations)this).GetSelectedChangeset();
  230. RevertToChangesetOperation.RevertTo(
  231. mWkInfo,
  232. mViewSwitcher,
  233. mWorkspaceWindow,
  234. mProgressControls,
  235. mGetStatusForWorkspace,
  236. mUndoCheckoutOperation,
  237. mRevertToChangesetMergeController,
  238. GuiMessage.Get(),
  239. targetChangesetInfo,
  240. RefreshAsset.BeforeLongAssetOperation,
  241. RefreshAsset.AfterLongAssetOperation,
  242. mRevertToChangesetListener.OnSuccessOperation);
  243. }
  244. void SearchField_OnDownOrUpArrowKeyPressed()
  245. {
  246. mChangesetsListView.SetFocusAndEnsureSelectedItem();
  247. }
  248. void FillChangesets(WorkspaceInfo wkInfo, string query, List<RepObjectInfo> changesetsToSelect)
  249. {
  250. if (mIsRefreshing)
  251. return;
  252. mIsRefreshing = true;
  253. int defaultRow = TableViewOperations.
  254. GetFirstSelectedRow(mChangesetsListView);
  255. ((IProgressControls)mProgressControls).ShowProgress(
  256. PlasticLocalization.GetString(
  257. PlasticLocalization.Name.LoadingChangesets));
  258. ViewQueryResult queryResult = null;
  259. IThreadWaiter waiter = ThreadWaiter.GetWaiter();
  260. waiter.Execute(
  261. /*threadOperationDelegate*/ delegate
  262. {
  263. long loadedChangesetId = GetLoadedChangesetId(
  264. wkInfo, mIsGluonMode);
  265. long loadedBranchId = GetLoadedBranchId(
  266. wkInfo, loadedChangesetId, mIsGluonMode);
  267. lock (mLock)
  268. {
  269. mLoadedChangesetId = loadedChangesetId;
  270. }
  271. mChangesetsViewMenu.SetLoadedBranchId(loadedBranchId);
  272. queryResult = new ViewQueryResult(
  273. PlasticGui.Plastic.API.FindQuery(wkInfo, query));
  274. },
  275. /*afterOperationDelegate*/ delegate
  276. {
  277. try
  278. {
  279. if (waiter.Exception != null)
  280. {
  281. ExceptionsHandler.DisplayException(waiter.Exception);
  282. return;
  283. }
  284. UpdateChangesetsList(
  285. mChangesetsListView,
  286. queryResult,
  287. mLoadedChangesetId);
  288. int changesetsCount = GetChangesetsCount(queryResult);
  289. if (changesetsCount == 0)
  290. {
  291. mDiffPanel.ClearInfo();
  292. return;
  293. }
  294. ChangesetsSelection.SelectChangesets(
  295. mChangesetsListView, changesetsToSelect, defaultRow);
  296. }
  297. finally
  298. {
  299. ((IProgressControls)mProgressControls).HideProgress();
  300. mIsRefreshing = false;
  301. }
  302. });
  303. }
  304. void ChangesetsViewMenu.IMenuOperations.DiffBranch()
  305. {
  306. LaunchDiffOperations.DiffBranch(
  307. mShowDownloadPlasticExeWindow,
  308. mProcessExecutor,
  309. ChangesetsSelection.GetSelectedRepository(mChangesetsListView),
  310. ChangesetsSelection.GetSelectedChangeset(mChangesetsListView),
  311. mIsGluonMode);
  312. }
  313. ChangesetExtendedInfo ChangesetsViewMenu.IMenuOperations.GetSelectedChangeset()
  314. {
  315. return ChangesetsSelection.GetSelectedChangeset(
  316. mChangesetsListView);
  317. }
  318. void OnChangesetsListViewSizeChanged()
  319. {
  320. if (!mShouldScrollToSelection)
  321. return;
  322. mShouldScrollToSelection = false;
  323. TableViewOperations.ScrollToSelection(mChangesetsListView);
  324. }
  325. void OnSelectionChanged()
  326. {
  327. List<RepObjectInfo> selectedChangesets = ChangesetsSelection.
  328. GetSelectedRepObjectInfos(mChangesetsListView);
  329. if (selectedChangesets.Count != 1)
  330. return;
  331. mDiffPanel.UpdateInfo(
  332. MountPointWithPath.BuildWorkspaceRootMountPoint(
  333. ChangesetsSelection.GetSelectedRepository(mChangesetsListView)),
  334. (ChangesetExtendedInfo)selectedChangesets[0]);
  335. }
  336. static void UpdateChangesetsList(
  337. ChangesetsListView changesetsListView,
  338. ViewQueryResult queryResult,
  339. long loadedChangesetId)
  340. {
  341. changesetsListView.BuildModel(
  342. queryResult,
  343. loadedChangesetId);
  344. changesetsListView.Refilter();
  345. changesetsListView.Sort();
  346. changesetsListView.Reload();
  347. }
  348. static long GetLoadedChangesetId(
  349. WorkspaceInfo wkInfo,
  350. bool isGluonMode)
  351. {
  352. if (isGluonMode)
  353. return -1;
  354. return PlasticGui.Plastic.API.GetLoadedChangeset(wkInfo);
  355. }
  356. static long GetLoadedBranchId(
  357. WorkspaceInfo wkInfo,
  358. long loadedChangesetId,
  359. bool isGluonMode)
  360. {
  361. if (isGluonMode)
  362. return -1;
  363. return PlasticGui.Plastic.API.GetChangesetInfoFromId(
  364. wkInfo, loadedChangesetId).BranchId;
  365. }
  366. static string GetChangesetsQuery(DateFilter dateFilter)
  367. {
  368. if (dateFilter.FilterType == DateFilter.Type.AllTime)
  369. return QueryConstants.ChangesetsBeginningQuery;
  370. string whereClause = QueryConstants.GetDateWhereClause(
  371. dateFilter.GetTimeAgo());
  372. return string.Format("{0} {1}",
  373. QueryConstants.ChangesetsBeginningQuery,
  374. whereClause);
  375. }
  376. static int GetChangesetsCount(
  377. ViewQueryResult queryResult)
  378. {
  379. if (queryResult == null)
  380. return 0;
  381. return queryResult.Count();
  382. }
  383. void VerifyIfSearchFieldIsRecentlyFocused(SearchField searchField)
  384. {
  385. if (searchField.HasFocus() != mIsSearchFieldFocused)
  386. {
  387. mIsSearchFieldFocused = !mIsSearchFieldFocused;
  388. if (mIsSearchFieldFocused)
  389. {
  390. TrackFeatureUseEvent.For(
  391. PlasticGui.Plastic.API.GetRepositorySpec(mWkInfo),
  392. TrackFeatureUseEvent.Features.ChangesetsViewChangesetsSearchBox);
  393. }
  394. }
  395. }
  396. void DoActionsToolbar(
  397. IRefreshableView refreshableView,
  398. ProgressControlsForViews progressControls,
  399. SearchField searchField,
  400. ChangesetsListView changesetsListView,
  401. DateFilter dateFilter)
  402. {
  403. EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
  404. if (progressControls.IsOperationRunning())
  405. {
  406. DrawProgressForViews.ForIndeterminateProgress(
  407. progressControls.ProgressData);
  408. }
  409. GUILayout.FlexibleSpace();
  410. GUILayout.Space(2);
  411. EditorGUILayout.EndHorizontal();
  412. }
  413. static void DoChangesetsArea(
  414. ChangesetsListView changesetsListView,
  415. bool isOperationRunning)
  416. {
  417. EditorGUILayout.BeginVertical();
  418. GUI.enabled = !isOperationRunning;
  419. Rect rect = GUILayoutUtility.GetRect(0, 100000, 0, 100000);
  420. changesetsListView.OnGUI(rect);
  421. GUI.enabled = true;
  422. EditorGUILayout.EndVertical();
  423. }
  424. static void DoChangesArea(DiffPanel diffPanel)
  425. {
  426. EditorGUILayout.BeginVertical();
  427. diffPanel.OnGUI();
  428. EditorGUILayout.EndVertical();
  429. }
  430. internal void DrawDateFilter()
  431. {
  432. GUI.enabled = !mProgressControls.IsOperationRunning();
  433. EditorGUI.BeginChangeCheck();
  434. mDateFilter.FilterType = (DateFilter.Type)
  435. EditorGUILayout.EnumPopup(
  436. mDateFilter.FilterType,
  437. EditorStyles.toolbarDropDown,
  438. GUILayout.Width(100));
  439. if (EditorGUI.EndChangeCheck())
  440. {
  441. EnumPopupSetting<DateFilter.Type>.Save(
  442. mDateFilter.FilterType,
  443. UnityConstants.CHANGESETS_DATE_FILTER_SETTING_NAME);
  444. ((IRefreshableView)this).Refresh();
  445. }
  446. GUI.enabled = true;
  447. }
  448. void InitializeShowChangesButtonWidth()
  449. {
  450. if (mShowChangesButtonWidth != -1)
  451. return;
  452. mShowChangesButtonWidth = MeasureMaxWidth.ForTexts(
  453. EditorStyles.toolbarButton,
  454. PlasticLocalization.GetString(PlasticLocalization.Name.HideChanges),
  455. PlasticLocalization.GetString(PlasticLocalization.Name.ShowChanges));
  456. }
  457. void BuildComponents(
  458. WorkspaceInfo wkInfo,
  459. IWorkspaceWindow workspaceWindow,
  460. IRefreshView refreshView,
  461. IViewSwitcher viewSwitcher,
  462. IHistoryViewLauncher historyViewLauncher,
  463. EditorWindow parentWindow)
  464. {
  465. mSearchField = new SearchField();
  466. mSearchField.downOrUpArrowKeyPressed += SearchField_OnDownOrUpArrowKeyPressed;
  467. DateFilter.Type dateFilterType =
  468. EnumPopupSetting<DateFilter.Type>.Load(
  469. UnityConstants.CHANGESETS_DATE_FILTER_SETTING_NAME,
  470. DateFilter.Type.LastMonth);
  471. mDateFilter = new DateFilter(dateFilterType);
  472. ChangesetsListHeaderState headerState =
  473. ChangesetsListHeaderState.GetDefault();
  474. TreeHeaderSettings.Load(headerState,
  475. UnityConstants.CHANGESETS_TABLE_SETTINGS_NAME,
  476. (int)ChangesetsListColumn.CreationDate, false);
  477. mChangesetsViewMenu = new ChangesetsViewMenu(
  478. wkInfo,
  479. this,
  480. this,
  481. mShowDownloadPlasticExeWindow,
  482. mIsGluonMode);
  483. mChangesetsListView = new ChangesetsListView(
  484. headerState,
  485. ChangesetsListHeaderState.GetColumnNames(),
  486. mChangesetsViewMenu,
  487. sizeChangedAction: OnChangesetsListViewSizeChanged,
  488. selectionChangedAction: OnSelectionChanged,
  489. doubleClickAction: ((IChangesetMenuOperations)this).DiffChangeset);
  490. mChangesetsListView.Reload();
  491. mDiffPanel = new DiffPanel(
  492. wkInfo, workspaceWindow, refreshView, viewSwitcher,
  493. historyViewLauncher, mShowDownloadPlasticExeWindow,
  494. parentWindow, mIsGluonMode);
  495. }
  496. bool mIsRefreshing;
  497. bool mShouldScrollToSelection;
  498. float mShowChangesButtonWidth = -1;
  499. object mSplitterState;
  500. Color mBorderColor;
  501. DateFilter mDateFilter;
  502. SearchField mSearchField;
  503. bool mIsSearchFieldFocused = false;
  504. ChangesetsListView mChangesetsListView;
  505. ChangesetOperations mChangesetOperations;
  506. DiffPanel mDiffPanel;
  507. ChangesetsViewMenu mChangesetsViewMenu;
  508. RevertToChangesetOperation.IGetStatusForWorkspace mGetStatusForWorkspace =
  509. new RevertToChangesetOperation.GetStatusFromWorkspace();
  510. RevertToChangesetOperation.IUndoCheckoutOperation mUndoCheckoutOperation =
  511. new RevertToChangesetOperation.UndoCheckout();
  512. RevertToChangesetOperation.IRevertToChangesetMergeController mRevertToChangesetMergeController =
  513. new RevertToChangesetOperation.RevertToChangesetMergeController();
  514. long mLoadedChangesetId = -1;
  515. object mLock = new object();
  516. LaunchTool.IProcessExecutor mProcessExecutor;
  517. LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
  518. readonly bool mIsGluonMode;
  519. readonly ViewHost mViewHost;
  520. readonly IGluonUpdateReport mGluonUpdateReport;
  521. readonly WorkspaceWindow mWorkspaceWindow;
  522. readonly IViewSwitcher mViewSwitcher;
  523. readonly ProgressControlsForViews mProgressControls;
  524. readonly IRevertToChangesetListener mRevertToChangesetListener;
  525. readonly EditorWindow mParentWindow;
  526. readonly WorkspaceInfo mWkInfo;
  527. }
  528. }