Geen omschrijving
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

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