A game about forced loneliness, made by TACStudios
1using System;
2
3using UnityEditor;
4
5using Codice.Client.Common.EventTracking;
6using Codice.Client.Common.Threading;
7using Codice.CM.Common;
8using GluonGui;
9using PlasticGui;
10using PlasticGui.Gluon;
11using PlasticGui.WorkspaceWindow;
12using PlasticGui.WorkspaceWindow.Merge;
13using PlasticGui.WorkspaceWindow.QueryViews;
14using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
15using Unity.PlasticSCM.Editor.AssetUtils;
16using Unity.PlasticSCM.Editor.AssetUtils.Processor;
17using Unity.PlasticSCM.Editor.Tool;
18using Unity.PlasticSCM.Editor.UI;
19using Unity.PlasticSCM.Editor.UI.StatusBar;
20using Unity.PlasticSCM.Editor.Views.Branches;
21using Unity.PlasticSCM.Editor.Views.Changesets;
22using Unity.PlasticSCM.Editor.Views.History;
23using Unity.PlasticSCM.Editor.Views.IncomingChanges.Gluon;
24using Unity.PlasticSCM.Editor.Views.Locks;
25using Unity.PlasticSCM.Editor.Views.Merge.Developer;
26using Unity.PlasticSCM.Editor.Views.Merge;
27using Unity.PlasticSCM.Editor.Views.PendingChanges;
28using Unity.PlasticSCM.Editor.Views.Shelves;
29
30using GluonNewIncomingChangesUpdater = PlasticGui.Gluon.WorkspaceWindow.NewIncomingChangesUpdater;
31using ObjectInfo = Codice.CM.Common.ObjectInfo;
32using Codice.Client.Common;
33
34namespace Unity.PlasticSCM.Editor
35{
36 [Serializable]
37 internal class ViewSwitcherState
38 {
39 internal ViewSwitcher.SelectedTab SelectedTab;
40 internal ViewSwitcher.SelectedTab PreviousSelectedTab;
41
42 internal SerializableMergeTabState MergeTabState;
43 internal SerializableBranchesTabState BranchesTabState;
44 internal SerializableHistoryTabState HistoryTabState;
45 }
46
47 internal interface IShowChangesetInView
48 {
49 void ShowChangesetInView(ChangesetInfo changesetInfo);
50 }
51
52 internal interface IShowShelveInView
53 {
54 void ShowShelveInView(ChangesetInfo shelveInfo);
55 }
56
57 internal class ViewSwitcher :
58 IViewSwitcher,
59 IShowChangesetInView,
60 IShowShelveInView,
61 IMergeViewLauncher,
62 IGluonViewSwitcher,
63 IHistoryViewLauncher,
64 MergeInProgress.IShowMergeView
65 {
66 internal enum SelectedTab
67 {
68 None = 0,
69 PendingChanges = 1,
70 IncomingChanges = 2,
71 Changesets = 3,
72 Shelves = 4,
73 Branches = 5,
74 Locks = 6,
75 Merge = 7,
76 History = 8,
77 }
78
79 internal PendingChangesTab PendingChangesTab { get; private set; }
80 internal IIncomingChangesTab IncomingChangesTab { get; private set; }
81 internal ChangesetsTab ChangesetsTab { get; private set; }
82 internal ShelvesTab ShelvesTab { get; private set; }
83 internal BranchesTab BranchesTab { get; private set; }
84 internal LocksTab LocksTab { get; private set; }
85 internal MergeTab MergeTab { get; private set; }
86 internal HistoryTab HistoryTab { get; private set; }
87 internal ViewSwitcherState State { get { return mState; } }
88
89 internal ViewSwitcher(
90 RepositorySpec repSpec,
91 WorkspaceInfo wkInfo,
92 ViewHost viewHost,
93 bool isGluonMode,
94 IAssetStatusCache assetStatusCache,
95 LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
96 LaunchTool.IProcessExecutor processExecutor,
97 WorkspaceOperationsMonitor workspaceOperationsMonitor,
98 ISaveAssets saveAssets,
99 StatusBar statusBar,
100 EditorWindow parentWindow)
101 {
102 mRepSpec = repSpec;
103 mWkInfo = wkInfo;
104 mViewHost = viewHost;
105 mIsGluonMode = isGluonMode;
106 mAssetStatusCache = assetStatusCache;
107 mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
108 mProcessExecutor = processExecutor;
109 mWorkspaceOperationsMonitor = workspaceOperationsMonitor;
110 mSaveAssets = saveAssets;
111 mStatusBar = statusBar;
112 mParentWindow = parentWindow;
113
114 mPendingChangesTabButton = new TabButton();
115 mIncomingChangesTabButton = new TabButton();
116 mChangesetsTabButton = new TabButton();
117 mShelvesTabButton = new TabButton();
118 mBranchesTabButton = new TabButton();
119 mLocksTabButton = new TabButton();
120 mMergeTabButton = new TabButton();
121 mHistoryTabButton = new TabButton();
122 }
123
124 internal bool IsViewSelected(SelectedTab tab)
125 {
126 return mState.SelectedTab == tab;
127 }
128
129 internal void SetNewIncomingChanges(
130 NewIncomingChangesUpdater developerNewIncomingChangesUpdater,
131 GluonNewIncomingChangesUpdater gluonNewIncomingChangesUpdater,
132 StatusBar.IIncomingChangesNotification incomingChangesNotification)
133 {
134 mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater;
135 mGluonNewIncomingChangesUpdater = gluonNewIncomingChangesUpdater;
136 mIncomingChangesNotification = incomingChangesNotification;
137 }
138
139 internal void SetShelvedChanges(
140 ShelvedChangesUpdater shelvedChangesUpdater,
141 CheckShelvedChanges.IUpdateShelvedChangesNotification updateShelvedChanges)
142 {
143 mShelvedChangesUpdater = shelvedChangesUpdater;
144 mUpdateShelvedChanges = updateShelvedChanges;
145 }
146
147 internal void SetWorkspaceWindow(WorkspaceWindow workspaceWindow)
148 {
149 mWorkspaceWindow = workspaceWindow;
150 }
151
152 internal void InitializeFromState(ViewSwitcherState state)
153 {
154 mState = state;
155
156 if (mState.MergeTabState != null &&
157 mState.MergeTabState.IsInitialized)
158 BuildMergeViewFromState(mState.MergeTabState);
159
160 if (mState.HistoryTabState != null &&
161 mState.HistoryTabState.IsInitialized)
162 BuildHistoryViewFromState(mState.HistoryTabState);
163
164 if (mState.BranchesTabState != null &&
165 mState.BranchesTabState.IsInitialized)
166 BuildBranchesViewFromState(mState.BranchesTabState);
167
168 ShowInitialView(mState.SelectedTab);
169 }
170
171 internal void AutoRefreshPendingChangesView()
172 {
173 AutoRefresh.PendingChangesView(PendingChangesTab);
174 }
175
176 internal void AutoRefreshIncomingChangesView()
177 {
178 AutoRefresh.IncomingChangesView(IncomingChangesTab);
179 }
180
181 internal void AutoRefreshMergeView()
182 {
183 if (mIsGluonMode)
184 return;
185
186 AutoRefresh.IncomingChangesView(MergeTab);
187 }
188
189 internal void RefreshView(ViewType viewType)
190 {
191 IRefreshableView view = GetRefreshableView(viewType);
192
193 if (view == null)
194 {
195 if (viewType.Equals(ViewType.PendingChangesView))
196 PlasticPlugin.AssetStatusCache.Clear();
197
198 if (viewType.Equals(ViewType.LocksView))
199 PlasticPlugin.AssetStatusCache.ClearLocks();
200
201 return;
202 }
203
204 view.Refresh();
205 }
206
207 internal void RefreshSelectedView()
208 {
209 IRefreshableView view = GetRefreshableViewBasedOnSelectedTab(mState.SelectedTab);
210
211 if (view == null)
212 return;
213
214 view.Refresh();
215 }
216
217 internal void RefreshWorkingObjectInfoForSelectedView(
218 ViewType viewType,
219 WorkingObjectInfo homeInfo)
220 {
221 switch (viewType)
222 {
223 case ViewType.BranchesView:
224 if (BranchesTab != null)
225 BranchesTab.SetWorkingObjectInfo(homeInfo);
226 break;
227 case ViewType.ChangesetsView:
228 if (ChangesetsTab != null)
229 ChangesetsTab.SetWorkingObjectInfo(homeInfo);
230 break;
231 }
232 }
233
234 internal void OnEnable()
235 {
236 if (PendingChangesTab != null)
237 PendingChangesTab.OnEnable();
238
239 if (IncomingChangesTab != null)
240 IncomingChangesTab.OnEnable();
241
242 if (ChangesetsTab != null)
243 ChangesetsTab.OnEnable();
244
245 if (ShelvesTab != null)
246 ShelvesTab.OnEnable();
247
248 if (BranchesTab != null)
249 BranchesTab.OnEnable();
250
251 if (LocksTab != null)
252 LocksTab.OnEnable();
253
254 if (MergeTab != null)
255 MergeTab.OnEnable();
256
257 if (HistoryTab != null)
258 HistoryTab.OnEnable();
259 }
260
261 internal void OnDisable()
262 {
263 if (PendingChangesTab != null)
264 {
265 PendingChangesTab.OnDisable();
266 }
267
268 if (IncomingChangesTab != null)
269 {
270 IncomingChangesTab.OnDisable();
271 }
272
273 if (ChangesetsTab != null)
274 {
275 ChangesetsTab.OnDisable();
276 }
277
278 if (ShelvesTab != null)
279 {
280 ShelvesTab.OnDisable();
281 }
282
283 if (BranchesTab != null)
284 {
285 mState.BranchesTabState = BranchesTab.GetSerializableState();
286 BranchesTab.OnDisable();
287 }
288
289 if (LocksTab != null)
290 {
291 LocksTab.OnDisable();
292 }
293
294 if (MergeTab != null)
295 {
296 mState.MergeTabState = MergeTab.GetSerializableState();
297 MergeTab.OnDisable();
298 }
299
300 if (HistoryTab != null)
301 {
302 mState.HistoryTabState = HistoryTab.GetSerializableState();
303 HistoryTab.OnDisable();
304 }
305 }
306
307 internal void Update()
308 {
309 if (IsViewSelected(SelectedTab.PendingChanges))
310 {
311 PendingChangesTab.Update();
312 return;
313 }
314
315 if (IsViewSelected(SelectedTab.IncomingChanges))
316 {
317 IncomingChangesTab.Update();
318 return;
319 }
320
321 if (IsViewSelected(SelectedTab.Changesets))
322 {
323 ChangesetsTab.Update();
324 return;
325 }
326
327 if (IsViewSelected(SelectedTab.Shelves))
328 {
329 ShelvesTab.Update();
330 return;
331 }
332
333 if (IsViewSelected(SelectedTab.Branches))
334 {
335 BranchesTab.Update();
336 return;
337 }
338
339 if (IsViewSelected(SelectedTab.Locks))
340 {
341 LocksTab.Update();
342 return;
343 }
344
345 if (IsViewSelected(SelectedTab.Merge))
346 {
347 MergeTab.Update();
348 return;
349 }
350
351 if (IsViewSelected(SelectedTab.History))
352 {
353 HistoryTab.Update();
354 return;
355 }
356 }
357
358 internal void TabButtonsGUI()
359 {
360 InitializeTabButtonWidth();
361
362 PendingChangesTabButtonGUI();
363
364 IncomingChangesTabButtonGUI();
365
366 ChangesetsTabButtonGUI();
367
368 ShelvesTabButtonGUI();
369
370 BranchesTabButtonGUI();
371
372 LocksTabButtonGUI();
373
374 MergeTabButtonGUI();
375
376 HistoryTabButtonGUI();
377 }
378
379 internal void TabViewGUI(ResolvedUser currentUser)
380 {
381 if (IsViewSelected(SelectedTab.PendingChanges))
382 {
383 PendingChangesTab.OnGUI(
384 currentUser,
385 mParentWindow.Repaint);
386 return;
387 }
388
389 if (IsViewSelected(SelectedTab.IncomingChanges))
390 {
391 IncomingChangesTab.OnGUI();
392 return;
393 }
394
395 if (IsViewSelected(SelectedTab.Changesets))
396 {
397 ChangesetsTab.OnGUI();
398 return;
399 }
400
401 if (IsViewSelected(SelectedTab.Shelves))
402 {
403 ShelvesTab.OnGUI();
404 return;
405 }
406
407 if (IsViewSelected(SelectedTab.Branches))
408 {
409 BranchesTab.OnGUI();
410 return;
411 }
412
413 if (IsViewSelected(SelectedTab.Locks))
414 {
415 LocksTab.OnGUI();
416 return;
417 }
418
419 if (IsViewSelected(SelectedTab.Merge))
420 {
421 MergeTab.OnGUI();
422 return;
423 }
424
425 if (IsViewSelected(SelectedTab.History))
426 {
427 HistoryTab.OnGUI();
428 return;
429 }
430 }
431
432 internal void ShowPendingChangesView()
433 {
434 OpenPendingChangesTab();
435
436 bool wasPendingChangesSelected =
437 IsViewSelected(SelectedTab.PendingChanges);
438
439 if (!wasPendingChangesSelected)
440 {
441 PendingChangesTab.AutoRefresh();
442 }
443
444 SetSelectedView(SelectedTab.PendingChanges);
445 }
446
447 internal void ShowChangesetsView(ChangesetInfo changesetToSelect = null)
448 {
449 bool shouldRefreshView = ShouldRefreshView(
450 ChangesetsTab != null,
451 changesetToSelect != null,
452 IsViewSelected(SelectedTab.Changesets));
453
454 if (ChangesetsTab == null)
455 {
456 OpenPendingChangesTab();
457
458 ChangesetsTab = new ChangesetsTab(
459 mWkInfo,
460 mWorkspaceWindow,
461 changesetToSelect,
462 this,
463 this,
464 this,
465 mViewHost,
466 mWorkspaceWindow,
467 mWorkspaceWindow,
468 mDeveloperNewIncomingChangesUpdater,
469 mGluonNewIncomingChangesUpdater,
470 mShelvedChangesUpdater,
471 PendingChangesTab,
472 mShowDownloadPlasticExeWindow,
473 mProcessExecutor,
474 mWorkspaceOperationsMonitor,
475 mSaveAssets,
476 mParentWindow,
477 mIsGluonMode);
478
479 mViewHost.AddRefreshableView(
480 ViewType.ChangesetsView,
481 ChangesetsTab);
482 }
483
484 if (shouldRefreshView)
485 ChangesetsTab.RefreshAndSelect(changesetToSelect);
486
487 SetSelectedView(SelectedTab.Changesets);
488 }
489
490 internal void ShowShelvesViewIfNeeded()
491 {
492 if (!BoolSetting.Load(UnityConstants.SHOW_SHELVES_VIEW_KEY_NAME, false))
493 return;
494
495 OpenShelvesTab();
496 }
497
498 internal void ShowShelvesView(ChangesetInfo shelveToSelect = null)
499 {
500 bool shouldRefreshView = ShouldRefreshView(
501 ShelvesTab != null,
502 shelveToSelect != null,
503 IsViewSelected(SelectedTab.Shelves));
504
505 OpenShelvesTab(shelveToSelect);
506
507 if (shouldRefreshView)
508 ShelvesTab.RefreshAndSelect(shelveToSelect);
509
510 SetSelectedView(SelectedTab.Shelves);
511 }
512
513 internal void ShowLocksViewIfNeeded()
514 {
515 if (!BoolSetting.Load(UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME, false))
516 return;
517
518 OpenLocksTab();
519 }
520
521 internal void ShowLocksView()
522 {
523 OpenLocksTab();
524
525 bool wasLocksViewSelected =
526 IsViewSelected(SelectedTab.Locks);
527
528 if (!wasLocksViewSelected)
529 ((IRefreshableView)LocksTab).Refresh();
530
531 SetSelectedView(SelectedTab.Locks);
532 }
533
534 internal void ShowBranchesViewIfNeeded()
535 {
536 if (!BoolSetting.Load(UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME, true))
537 return;
538
539 string query = QueryConstants.BranchesBeginningQuery;
540
541 ViewQueryResult queryResult = null;
542
543 IThreadWaiter waiter = ThreadWaiter.GetWaiter();
544 waiter.Execute(
545 /*threadOperationDelegate*/ delegate
546 {
547 queryResult = new ViewQueryResult(
548 PlasticGui.Plastic.API.FindQuery(mWkInfo, query));
549 },
550 /*afterOperationDelegate*/ delegate
551 {
552 if (waiter.Exception != null)
553 {
554 ExceptionsHandler.DisplayException(waiter.Exception);
555 return;
556 }
557
558 if (queryResult == null)
559 return;
560
561 if (queryResult.Count()>0)
562 OpenBranchesTab();
563 });
564 }
565
566 internal void ShowBranchesView()
567 {
568 OpenBranchesTab();
569
570 bool wasBranchesSelected =
571 IsViewSelected(SelectedTab.Branches);
572
573 if (!wasBranchesSelected)
574 ((IRefreshableView)BranchesTab).Refresh();
575
576 SetSelectedView(SelectedTab.Branches);
577 }
578
579 internal void ShowHistoryView(
580 RepositorySpec repSpec,
581 long itemId,
582 string path,
583 bool isDirectory)
584 {
585 if (HistoryTab == null)
586 {
587 HistoryTab = BuildHistoryTab(
588 repSpec, itemId, path, isDirectory);
589
590 mViewHost.AddRefreshableView(
591 ViewType.HistoryView, HistoryTab);
592 }
593 else
594 {
595 HistoryTab.RefreshForItem(repSpec, itemId, path, isDirectory);
596 }
597
598 SetSelectedView(SelectedTab.History);
599 }
600
601 internal void ShowBranchesViewForTesting(BranchesTab branchesTab)
602 {
603 BranchesTab = branchesTab;
604
605 ShowBranchesView();
606 }
607
608 internal void ShowMergeViewForTesting(MergeTab mergeTab)
609 {
610 MergeTab = mergeTab;
611
612 ShowMergeView();
613 }
614
615 internal void ShowShelvesViewForTesting(ShelvesTab shelvesTab)
616 {
617 ShelvesTab = shelvesTab;
618
619 ShowShelvesView();
620 }
621
622 void IViewSwitcher.ShowView(ViewType viewType)
623 {
624 }
625
626 void IViewSwitcher.ShowPendingChanges()
627 {
628 ShowPendingChangesView();
629 mParentWindow.Repaint();
630 }
631
632 void IViewSwitcher.ShowShelvesView()
633 {
634 ShowShelvesView();
635 }
636
637 void IViewSwitcher.ShowSyncView(string syncViewToSelect)
638 {
639 throw new NotImplementedException();
640 }
641
642 void IViewSwitcher.ShowBranchExplorerView()
643 {
644 //TODO: Codice
645 //launch plastic with branch explorer view option
646 }
647
648 void IViewSwitcher.DisableMergeView()
649 {
650 DisableMergeTab();
651 }
652
653 IMergeView IViewSwitcher.GetMergeView()
654 {
655 return MergeTab;
656 }
657
658 bool IViewSwitcher.IsIncomingChangesView()
659 {
660 return IsViewSelected(SelectedTab.IncomingChanges);
661 }
662
663 void IViewSwitcher.CloseMergeView()
664 {
665 CloseMergeTab();
666 }
667
668 void IShowChangesetInView.ShowChangesetInView(ChangesetInfo changesetInfo)
669 {
670 ShowChangesetsView(changesetInfo);
671 }
672
673 void IShowShelveInView.ShowShelveInView(ChangesetInfo shelveInfo)
674 {
675 ShowShelvesView(shelveInfo);
676 }
677
678 IMergeView IMergeViewLauncher.MergeFrom(
679 RepositorySpec repSpec,
680 ObjectInfo objectInfo,
681 EnumMergeType mergeType,
682 bool showDiscardChangesButton)
683 {
684 return ((IMergeViewLauncher)this).MergeFromInterval(
685 repSpec, objectInfo, null, mergeType, showDiscardChangesButton);
686 }
687
688 IMergeView IMergeViewLauncher.MergeFrom(
689 RepositorySpec repSpec,
690 ObjectInfo objectInfo,
691 EnumMergeType mergeType,
692 ShowIncomingChangesFrom from,
693 bool showDiscardChangesButton)
694 {
695 return MergeFromInterval(repSpec, objectInfo, null, mergeType, from, showDiscardChangesButton);
696 }
697
698 IMergeView IMergeViewLauncher.MergeFromInterval(
699 RepositorySpec repSpec,
700 ObjectInfo objectInfo,
701 ObjectInfo ancestorChangesetInfo,
702 EnumMergeType mergeType,
703 bool showDiscardChangesButton)
704 {
705 return MergeFromInterval(
706 repSpec, objectInfo, null, mergeType, ShowIncomingChangesFrom.NotificationBar, showDiscardChangesButton);
707 }
708
709 IMergeView IMergeViewLauncher.FromCalculatedMerge(
710 RepositorySpec repSpec,
711 ObjectInfo objectInfo,
712 EnumMergeType mergeType,
713 CalculatedMergeResult calculatedMergeResult,
714 bool showDiscardChangesButton)
715 {
716 return ShowMergeViewFromCalculatedMerge(
717 repSpec, objectInfo, mergeType, calculatedMergeResult, showDiscardChangesButton);
718 }
719
720 void IGluonViewSwitcher.ShowIncomingChangesView()
721 {
722 ShowIncomingChangesView();
723 mParentWindow.Repaint();
724 }
725
726 void IHistoryViewLauncher.ShowHistoryView(
727 RepositorySpec repSpec,
728 long itemId,
729 string path,
730 bool isDirectory)
731 {
732 ShowHistoryView(
733 repSpec,
734 itemId,
735 path,
736 isDirectory);
737
738 mParentWindow.Repaint();
739 }
740
741 void MergeInProgress.IShowMergeView.MergeLinkNotFound()
742 {
743 // Nothing to do on the plugin when there is no pending merge link
744 }
745
746 void MergeInProgress.IShowMergeView.ForPendingMergeLink(
747 RepositorySpec repSpec,
748 MergeType pendingLinkMergeType,
749 ChangesetInfo srcChangeset,
750 ChangesetInfo baseChangeset)
751 {
752 EnumMergeType mergeType = MergeTypeConverter.TranslateMergeType(pendingLinkMergeType);
753
754 MergeTab = BuildMergeTab(
755 repSpec,
756 srcChangeset,
757 baseChangeset,
758 mergeType,
759 ShowIncomingChangesFrom.None,
760 MergeTypeClassifier.IsIncomingMerge(mergeType),
761 false,
762 false);
763
764 mViewHost.AddRefreshableView(ViewType.MergeView, MergeTab);
765
766 ShowMergeView();
767 }
768
769 void ShowInitialView(SelectedTab viewToShow)
770 {
771 mState.SelectedTab = SelectedTab.None;
772
773 ShowView(viewToShow);
774
775 if (mState.SelectedTab != SelectedTab.None)
776 return;
777
778 ShowPendingChangesView();
779 }
780
781 void BuildHistoryViewFromState(SerializableHistoryTabState state)
782 {
783 HistoryTab = BuildHistoryTab(
784 state.RepSpec,
785 state.ItemId,
786 state.Path,
787 state.IsDirectory);
788
789 mViewHost.AddRefreshableView(ViewType.HistoryView, HistoryTab);
790 }
791
792 void BuildMergeViewFromState(SerializableMergeTabState state)
793 {
794 MergeTab = BuildMergeTab(
795 state.RepSpec,
796 state.GetObjectInfo(),
797 state.GetAncestorObjectInfo(),
798 state.MergeType,
799 state.From,
800 state.IsIncomingMerge,
801 state.IsMergeFinished,
802 false);
803
804 mViewHost.AddRefreshableView(ViewType.MergeView, MergeTab);
805 }
806
807 void BuildBranchesViewFromState(SerializableBranchesTabState state)
808 {
809 BranchesTab = BuildBranchesTab(
810 state.ShowHiddenBranches);
811
812 mViewHost.AddRefreshableView(ViewType.BranchesView, BranchesTab);
813 }
814
815 void OpenPendingChangesTab()
816 {
817 if (PendingChangesTab != null)
818 return;
819
820 PendingChangesTab = new PendingChangesTab(
821 mWkInfo,
822 mRepSpec,
823 mViewHost,
824 mIsGluonMode,
825 mWorkspaceWindow,
826 this,
827 this,
828 this,
829 this,
830 this,
831 mShowDownloadPlasticExeWindow,
832 mWorkspaceOperationsMonitor,
833 mSaveAssets,
834 mDeveloperNewIncomingChangesUpdater,
835 mGluonNewIncomingChangesUpdater,
836 mAssetStatusCache,
837 mStatusBar,
838 mParentWindow);
839
840 mViewHost.AddRefreshableView(
841 ViewType.CheckinView,
842 PendingChangesTab);
843 }
844
845 IMergeView MergeFromInterval(
846 RepositorySpec repSpec,
847 ObjectInfo objectInfo,
848 ObjectInfo ancestorChangesetInfo,
849 EnumMergeType mergeType,
850 ShowIncomingChangesFrom from,
851 bool showDiscardChangesButton)
852 {
853 if (MergeTypeClassifier.IsIncomingMerge(mergeType))
854 {
855 ShowIncomingChangesView();
856 mParentWindow.Repaint();
857 return IncomingChangesTab as IMergeView;
858 }
859
860 ShowMergeViewFromInterval(
861 repSpec, objectInfo, ancestorChangesetInfo, mergeType, from, showDiscardChangesButton);
862 mParentWindow.Repaint();
863 return MergeTab;
864 }
865
866 void OpenShelvesTab(ChangesetInfo shelveToSelect = null)
867 {
868 if (ShelvesTab == null)
869 {
870 OpenPendingChangesTab();
871
872 ShelvesTab = new ShelvesTab(
873 mWkInfo,
874 mRepSpec,
875 mWorkspaceWindow,
876 shelveToSelect,
877 this,
878 this,
879 PendingChangesTab,
880 mIsGluonMode ?
881 mWorkspaceWindow.GluonProgressOperationHandler :
882 mWorkspaceWindow.DeveloperProgressOperationHandler,
883 mWorkspaceWindow.GluonProgressOperationHandler,
884 this,
885 mShelvedChangesUpdater,
886 mShowDownloadPlasticExeWindow,
887 mProcessExecutor,
888 mWorkspaceOperationsMonitor,
889 mSaveAssets,
890 mParentWindow,
891 mIsGluonMode);
892
893 mViewHost.AddRefreshableView(ViewType.ShelvesView, ShelvesTab);
894
895 TrackFeatureUseEvent.For(
896 mRepSpec, TrackFeatureUseEvent.Features.OpenShelvesView);
897 }
898
899 BoolSetting.Save(true, UnityConstants.SHOW_SHELVES_VIEW_KEY_NAME);
900 }
901
902 void OpenBranchesTab()
903 {
904 if (BranchesTab == null)
905 {
906 BranchesTab = BuildBranchesTab(false);
907
908 mViewHost.AddRefreshableView(ViewType.BranchesView, BranchesTab);
909
910 TrackFeatureUseEvent.For(
911 mRepSpec, TrackFeatureUseEvent.Features.OpenBranchesView);
912 }
913
914 BoolSetting.Save(true, UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME);
915 }
916
917 void OpenLocksTab()
918 {
919 if (LocksTab == null)
920 {
921 LocksTab = new LocksTab(
922 mRepSpec,
923 mWorkspaceWindow,
924 mAssetStatusCache,
925 mParentWindow);
926
927 mViewHost.AddRefreshableView(ViewType.LocksView, LocksTab);
928
929 TrackFeatureUseEvent.For(mRepSpec,
930 TrackFeatureUseEvent.Features.OpenLocksView);
931 }
932
933 BoolSetting.Save(true, UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME);
934 }
935
936 void ShowHistoryView()
937 {
938 if (HistoryTab == null)
939 return;
940
941 ((IRefreshableView)HistoryTab).Refresh();
942
943 SetSelectedView(SelectedTab.History);
944 }
945
946 void ShowIncomingChangesView()
947 {
948 if (IncomingChangesTab == null)
949 {
950 IncomingChangesTab = BuildIncomingChangesTab(mIsGluonMode);
951
952 mViewHost.AddRefreshableView(
953 ViewType.IncomingChangesView,
954 (IRefreshableView)IncomingChangesTab);
955 }
956
957 bool wasIncomingChangesSelected =
958 IsViewSelected(SelectedTab.IncomingChanges);
959
960 if (!wasIncomingChangesSelected)
961 IncomingChangesTab.AutoRefresh();
962
963 SetSelectedView(SelectedTab.IncomingChanges);
964 }
965
966 void ShowMergeViewFromInterval(
967 RepositorySpec repSpec,
968 ObjectInfo objectInfo,
969 ObjectInfo ancestorChangesetInfo,
970 EnumMergeType mergeType,
971 ShowIncomingChangesFrom from,
972 bool showDiscardChangesButton)
973 {
974 if (MergeTab != null && MergeTab.IsProcessingMerge)
975 {
976 ShowMergeView();
977 return;
978 }
979
980 if (MergeTab != null)
981 {
982 mViewHost.RemoveRefreshableView(ViewType.MergeView, MergeTab);
983 MergeTab.OnDisable();
984 }
985
986 MergeTab = BuildMergeTab(
987 repSpec,
988 objectInfo,
989 ancestorChangesetInfo,
990 mergeType,
991 from,
992 false,
993 false,
994 showDiscardChangesButton);
995
996 mViewHost.AddRefreshableView(ViewType.MergeView, MergeTab);
997
998 ShowMergeView();
999 }
1000
1001 IMergeView ShowMergeViewFromCalculatedMerge(
1002 RepositorySpec repSpec,
1003 ObjectInfo objectInfo,
1004 EnumMergeType mergeType,
1005 CalculatedMergeResult calculatedMergeResult,
1006 bool showDiscardChangesButton)
1007 {
1008 if (MergeTab != null && MergeTab.IsProcessingMerge)
1009 {
1010 ShowMergeView();
1011 mParentWindow.Repaint();
1012 return MergeTab;
1013 }
1014
1015 if (MergeTab != null)
1016 {
1017 mViewHost.RemoveRefreshableView(ViewType.MergeView, MergeTab);
1018 MergeTab.OnDisable();
1019 }
1020
1021 MergeTab = BuildMergeTabFromCalculatedMerge(
1022 repSpec, objectInfo, mergeType, calculatedMergeResult, showDiscardChangesButton);
1023
1024 mViewHost.AddRefreshableView(ViewType.MergeView, MergeTab);
1025
1026 ShowMergeView();
1027 mParentWindow.Repaint();
1028 return MergeTab;
1029 }
1030
1031 void ShowMergeView()
1032 {
1033 if (MergeTab == null)
1034 return;
1035
1036 bool wasMergeTabSelected =
1037 IsViewSelected(SelectedTab.Merge);
1038
1039 if (!wasMergeTabSelected)
1040 MergeTab.AutoRefresh();
1041
1042 SetSelectedView(SelectedTab.Merge);
1043 }
1044
1045 void DisableMergeTab()
1046 {
1047 if (MergeTab == null)
1048 return;
1049
1050 mViewHost.RemoveRefreshableView(
1051 ViewType.MergeView, MergeTab);
1052
1053 MergeTab.OnDisable();
1054 MergeTab = null;
1055
1056 mState.MergeTabState = null;
1057 }
1058
1059 void CloseShelvesTab()
1060 {
1061 BoolSetting.Save(false, UnityConstants.SHOW_SHELVES_VIEW_KEY_NAME);
1062
1063 TrackFeatureUseEvent.For(
1064 mRepSpec, TrackFeatureUseEvent.Features.CloseShelvesView);
1065
1066 mViewHost.RemoveRefreshableView(
1067 ViewType.ShelvesView, ShelvesTab);
1068
1069 ShelvesTab.OnDisable();
1070 ShelvesTab = null;
1071
1072 ShowPreviousViewFrom(SelectedTab.Shelves);
1073
1074 mParentWindow.Repaint();
1075 }
1076
1077 void CloseBranchesTab()
1078 {
1079 BoolSetting.Save(false, UnityConstants.SHOW_BRANCHES_VIEW_KEY_NAME);
1080
1081 mViewHost.RemoveRefreshableView(
1082 ViewType.BranchesView, BranchesTab);
1083
1084 BranchesTab.OnDisable();
1085 BranchesTab = null;
1086
1087 mState.BranchesTabState = null;
1088
1089 ShowPreviousViewFrom(SelectedTab.Branches);
1090
1091 mParentWindow.Repaint();
1092 }
1093
1094 void CloseLocksTab()
1095 {
1096 BoolSetting.Save(false, UnityConstants.SHOW_LOCKS_VIEW_KEY_NAME);
1097
1098 TrackFeatureUseEvent.For(
1099 mRepSpec, TrackFeatureUseEvent.Features.CloseLocksView);
1100
1101 mViewHost.RemoveRefreshableView(ViewType.LocksView, LocksTab);
1102
1103 LocksTab.OnDisable();
1104 LocksTab = null;
1105
1106 ShowPreviousViewFrom(SelectedTab.Locks);
1107
1108 mParentWindow.Repaint();
1109 }
1110
1111 void CloseMergeTab()
1112 {
1113 DisableMergeTab();
1114
1115 ShowPreviousViewFrom(SelectedTab.Merge);
1116
1117 mParentWindow.Repaint();
1118 }
1119
1120 void CloseHistoryTab()
1121 {
1122 mViewHost.RemoveRefreshableView(
1123 ViewType.HistoryView, HistoryTab);
1124
1125 HistoryTab.OnDisable();
1126 HistoryTab = null;
1127
1128 mState.HistoryTabState = null;
1129
1130 ShowPreviousViewFrom(SelectedTab.History);
1131
1132 mParentWindow.Repaint();
1133 }
1134
1135 void InitializeTabButtonWidth()
1136 {
1137 if (mTabButtonWidth != -1)
1138 return;
1139
1140 mTabButtonWidth = MeasureMaxWidth.ForTexts(
1141 UnityStyles.PlasticWindow.TabButton,
1142 PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesViewTitle),
1143 PlasticLocalization.GetString(PlasticLocalization.Name.IncomingChangesViewTitle),
1144 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsViewTitle),
1145 PlasticLocalization.GetString(PlasticLocalization.Name.BranchesViewTitle),
1146 PlasticLocalization.GetString(PlasticLocalization.Name.ShelvesViewTitle),
1147 PlasticLocalization.GetString(PlasticLocalization.Name.LocksViewTitle),
1148 PlasticLocalization.GetString(PlasticLocalization.Name.History));
1149 }
1150
1151 IIncomingChangesTab BuildIncomingChangesTab(bool isGluonMode)
1152 {
1153 if (isGluonMode)
1154 {
1155 return new IncomingChangesTab(
1156 mWkInfo,
1157 mViewHost,
1158 mWorkspaceWindow,
1159 mShowDownloadPlasticExeWindow,
1160 mGluonNewIncomingChangesUpdater,
1161 (Gluon.IncomingChangesNotification)mIncomingChangesNotification,
1162 mStatusBar,
1163 mParentWindow);
1164 }
1165
1166 PlasticNotifier plasticNotifier = new PlasticNotifier();
1167
1168 MergeViewLogic.IMergeController mergeController = new MergeController(
1169 mWkInfo,
1170 mRepSpec,
1171 null,
1172 null,
1173 EnumMergeType.IncomingMerge,
1174 true,
1175 plasticNotifier);
1176
1177 return MergeTab.Build(
1178 mWkInfo,
1179 mRepSpec,
1180 mWorkspaceWindow,
1181 this,
1182 mShowDownloadPlasticExeWindow,
1183 this,
1184 mDeveloperNewIncomingChangesUpdater,
1185 mStatusBar,
1186 mParentWindow,
1187 null,
1188 null,
1189 EnumMergeType.IncomingMerge,
1190 ShowIncomingChangesFrom.NotificationBar,
1191 plasticNotifier,
1192 mergeController,
1193 new MergeViewLogic.GetWorkingBranch(),
1194 mUpdateShelvedChanges,
1195 mShelvedChangesUpdater,
1196 mWorkspaceWindow,
1197 true,
1198 false,
1199 false);
1200 }
1201
1202 HistoryTab BuildHistoryTab(
1203 RepositorySpec repSpec,
1204 long itemId,
1205 string path,
1206 bool isDirectory)
1207 {
1208 HistoryTab result = new HistoryTab(
1209 mWkInfo,
1210 mWorkspaceWindow,
1211 mShowDownloadPlasticExeWindow,
1212 mProcessExecutor,
1213 mDeveloperNewIncomingChangesUpdater,
1214 mViewHost,
1215 mParentWindow,
1216 mIsGluonMode);
1217
1218 result.RefreshForItem(repSpec, itemId, path, isDirectory);
1219
1220 return result;
1221 }
1222
1223 BranchesTab BuildBranchesTab(bool showHiddenBranches)
1224 {
1225 BranchesTab result = new BranchesTab(
1226 mWkInfo,
1227 mWorkspaceWindow,
1228 this,
1229 this,
1230 mViewHost,
1231 mWorkspaceWindow,
1232 mWorkspaceWindow,
1233 mDeveloperNewIncomingChangesUpdater,
1234 mGluonNewIncomingChangesUpdater,
1235 mShelvedChangesUpdater,
1236 mShowDownloadPlasticExeWindow,
1237 mProcessExecutor,
1238 mWorkspaceOperationsMonitor,
1239 mSaveAssets,
1240 mParentWindow,
1241 mIsGluonMode,
1242 showHiddenBranches);
1243
1244 return result;
1245 }
1246
1247 MergeTab BuildMergeTabFromCalculatedMerge(
1248 RepositorySpec repSpec,
1249 ObjectInfo objectInfo,
1250 EnumMergeType mergeType,
1251 CalculatedMergeResult calculatedMergeResult,
1252 bool showDiscardChangesButton)
1253 {
1254 return BuildMergeTab(
1255 repSpec,
1256 objectInfo,
1257 null,
1258 mergeType,
1259 ShowIncomingChangesFrom.None,
1260 false,
1261 false,
1262 showDiscardChangesButton,
1263 calculatedMergeResult);
1264 }
1265
1266 MergeTab BuildMergeTab(
1267 RepositorySpec repSpec,
1268 ObjectInfo objectInfo,
1269 ObjectInfo ancestorObjectInfo,
1270 EnumMergeType mergeType,
1271 ShowIncomingChangesFrom from,
1272 bool isIncomingMerge,
1273 bool isMergeFinished,
1274 bool showDiscardChangesButton,
1275 CalculatedMergeResult calculatedMergeResult = null)
1276 {
1277 PlasticNotifier plasticNotifier = new PlasticNotifier();
1278
1279 MergeViewLogic.IMergeController mergeController = new MergeController(
1280 mWkInfo,
1281 repSpec,
1282 objectInfo,
1283 ancestorObjectInfo,
1284 mergeType,
1285 false,
1286 plasticNotifier);
1287
1288 if (calculatedMergeResult != null)
1289 {
1290 return MergeTab.BuildFromCalculatedMerge(
1291 mWkInfo,
1292 repSpec,
1293 mWorkspaceWindow,
1294 this,
1295 mShowDownloadPlasticExeWindow,
1296 this,
1297 mDeveloperNewIncomingChangesUpdater,
1298 mStatusBar,
1299 mParentWindow,
1300 objectInfo,
1301 ancestorObjectInfo,
1302 mergeType,
1303 from,
1304 plasticNotifier,
1305 mergeController,
1306 new MergeViewLogic.GetWorkingBranch(),
1307 mUpdateShelvedChanges,
1308 mShelvedChangesUpdater,
1309 mWorkspaceWindow,
1310 isIncomingMerge,
1311 isMergeFinished,
1312 calculatedMergeResult,
1313 showDiscardChangesButton);
1314 }
1315
1316 return MergeTab.Build(
1317 mWkInfo,
1318 repSpec,
1319 mWorkspaceWindow,
1320 this,
1321 mShowDownloadPlasticExeWindow,
1322 this,
1323 mDeveloperNewIncomingChangesUpdater,
1324 mStatusBar,
1325 mParentWindow,
1326 objectInfo,
1327 ancestorObjectInfo,
1328 mergeType,
1329 from,
1330 plasticNotifier,
1331 mergeController,
1332 new MergeViewLogic.GetWorkingBranch(),
1333 mUpdateShelvedChanges,
1334 mShelvedChangesUpdater,
1335 mWorkspaceWindow,
1336 isIncomingMerge,
1337 isMergeFinished,
1338 showDiscardChangesButton);
1339 }
1340
1341 void ShowView(SelectedTab viewToShow)
1342 {
1343 switch (viewToShow)
1344 {
1345 case SelectedTab.PendingChanges:
1346 ShowPendingChangesView();
1347 break;
1348
1349 case SelectedTab.IncomingChanges:
1350 ShowIncomingChangesView();
1351 break;
1352
1353 case SelectedTab.Changesets:
1354 ShowChangesetsView();
1355 break;
1356
1357 case SelectedTab.Branches:
1358 ShowBranchesView();
1359 break;
1360
1361 case SelectedTab.Shelves:
1362 ShowShelvesView();
1363 break;
1364
1365 case SelectedTab.Locks:
1366 ShowLocksView();
1367 break;
1368
1369 case SelectedTab.Merge:
1370 ShowMergeView();
1371 break;
1372
1373 case SelectedTab.History:
1374 ShowHistoryView();
1375 break;
1376 }
1377 }
1378
1379 void ShowPreviousViewFrom(SelectedTab tabToClose)
1380 {
1381 if (!IsViewSelected(tabToClose))
1382 return;
1383
1384 if (GetRefreshableViewBasedOnSelectedTab(mState.PreviousSelectedTab) == null)
1385 mState.PreviousSelectedTab = SelectedTab.PendingChanges;
1386
1387 ShowView(mState.PreviousSelectedTab);
1388 }
1389
1390 IRefreshableView GetRefreshableViewBasedOnSelectedTab(SelectedTab selectedTab)
1391 {
1392 switch (selectedTab)
1393 {
1394 case SelectedTab.PendingChanges:
1395 return PendingChangesTab;
1396
1397 case SelectedTab.IncomingChanges:
1398 return (IRefreshableView)IncomingChangesTab;
1399
1400 case SelectedTab.Changesets:
1401 return ChangesetsTab;
1402
1403 case SelectedTab.Shelves:
1404 return ShelvesTab;
1405
1406 case SelectedTab.Branches:
1407 return BranchesTab;
1408
1409 case SelectedTab.Locks:
1410 return LocksTab;
1411
1412 case SelectedTab.Merge:
1413 return MergeTab;
1414
1415 case SelectedTab.History:
1416 return HistoryTab;
1417
1418 default:
1419 return null;
1420 }
1421 }
1422
1423 IRefreshableView GetRefreshableView(ViewType viewType)
1424 {
1425 switch (viewType)
1426 {
1427 case ViewType.PendingChangesView:
1428 return PendingChangesTab;
1429
1430 case ViewType.IncomingChangesView:
1431 return (IRefreshableView)IncomingChangesTab;
1432
1433 case ViewType.ChangesetsView:
1434 return ChangesetsTab;
1435
1436 case ViewType.ShelvesView:
1437 return ShelvesTab;
1438
1439 case ViewType.BranchesView:
1440 return BranchesTab;
1441
1442 case ViewType.LocksView:
1443 return LocksTab;
1444
1445 case ViewType.MergeView:
1446 return MergeTab;
1447
1448 case ViewType.HistoryView:
1449 return HistoryTab;
1450
1451 default:
1452 return null;
1453 }
1454 }
1455
1456 void SetSelectedView(SelectedTab tab)
1457 {
1458 if (mState.SelectedTab != tab && mState.SelectedTab != SelectedTab.None)
1459 mState.PreviousSelectedTab = mState.SelectedTab;
1460
1461 mState.SelectedTab = tab;
1462
1463 if (IncomingChangesTab == null)
1464 return;
1465
1466 IncomingChangesTab.IsVisible =
1467 tab == SelectedTab.IncomingChanges;
1468 }
1469
1470 void PendingChangesTabButtonGUI()
1471 {
1472 bool wasPendingChangesSelected =
1473 IsViewSelected(SelectedTab.PendingChanges);
1474
1475 bool isPendingChangesSelected = mPendingChangesTabButton.
1476 DrawTabButton(
1477 PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesViewTitle),
1478 wasPendingChangesSelected,
1479 mTabButtonWidth);
1480
1481 if (isPendingChangesSelected)
1482 ShowPendingChangesView();
1483 }
1484
1485 void IncomingChangesTabButtonGUI()
1486 {
1487 bool wasIncomingChangesSelected =
1488 IsViewSelected(SelectedTab.IncomingChanges);
1489
1490 bool isIncomingChangesSelected = mIncomingChangesTabButton.
1491 DrawTabButton(
1492 PlasticLocalization.GetString(PlasticLocalization.Name.IncomingChangesViewTitle),
1493 wasIncomingChangesSelected,
1494 mTabButtonWidth);
1495
1496 if (isIncomingChangesSelected)
1497 ShowIncomingChangesView();
1498 }
1499
1500 void ChangesetsTabButtonGUI()
1501 {
1502 bool wasChangesetsSelected =
1503 IsViewSelected(SelectedTab.Changesets);
1504
1505 bool isChangesetsSelected = mChangesetsTabButton.
1506 DrawTabButton(
1507 PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetsViewTitle),
1508 wasChangesetsSelected,
1509 mTabButtonWidth);
1510
1511 if (isChangesetsSelected)
1512 ShowChangesetsView();
1513 }
1514
1515 void ShelvesTabButtonGUI()
1516 {
1517 if (ShelvesTab == null)
1518 {
1519 DrawStaticElement.Empty();
1520 return;
1521 }
1522
1523 bool wasShelvesSelected =
1524 IsViewSelected(SelectedTab.Shelves);
1525
1526 bool isCloseButtonClicked;
1527
1528 bool isShelvesSelected = mShelvesTabButton.
1529 DrawClosableTabButton(PlasticLocalization.GetString(
1530 PlasticLocalization.Name.ShelvesViewTitle),
1531 wasShelvesSelected,
1532 true,
1533 mTabButtonWidth,
1534 mParentWindow.Repaint,
1535 out isCloseButtonClicked);
1536
1537 if (isCloseButtonClicked)
1538 {
1539 CloseShelvesTab();
1540 return;
1541 }
1542
1543 if (isShelvesSelected)
1544 SetSelectedView(SelectedTab.Shelves);
1545 }
1546
1547 void BranchesTabButtonGUI()
1548 {
1549 if (BranchesTab == null)
1550 {
1551 DrawStaticElement.Empty();
1552 return;
1553 }
1554
1555 bool wasBranchesSelected =
1556 IsViewSelected(SelectedTab.Branches);
1557
1558 bool isCloseButtonClicked;
1559
1560 bool isBranchesSelected = mBranchesTabButton.
1561 DrawClosableTabButton(PlasticLocalization.GetString(
1562 PlasticLocalization.Name.BranchesViewTitle),
1563 wasBranchesSelected,
1564 true,
1565 mTabButtonWidth,
1566 mParentWindow.Repaint,
1567 out isCloseButtonClicked);
1568
1569 if (isCloseButtonClicked)
1570 {
1571 CloseBranchesTab();
1572 return;
1573 }
1574
1575 if (isBranchesSelected)
1576 SetSelectedView(SelectedTab.Branches);
1577 }
1578
1579 void LocksTabButtonGUI()
1580 {
1581 if (LocksTab == null)
1582 {
1583 DrawStaticElement.Empty();
1584 return;
1585 }
1586
1587 var wasLocksTabSelected = IsViewSelected(SelectedTab.Locks);
1588
1589 bool isCloseButtonClicked;
1590
1591 var isLocksTabSelected = mLocksTabButton.DrawClosableTabButton(
1592 PlasticLocalization.Name.LocksViewTitle.GetString(),
1593 wasLocksTabSelected,
1594 true,
1595 mTabButtonWidth,
1596 mParentWindow.Repaint,
1597 out isCloseButtonClicked);
1598
1599 if (isCloseButtonClicked)
1600 {
1601 CloseLocksTab();
1602 return;
1603 }
1604
1605 if (isLocksTabSelected)
1606 {
1607 SetSelectedView(SelectedTab.Locks);
1608 }
1609 }
1610
1611 void MergeTabButtonGUI()
1612 {
1613 if (MergeTab == null)
1614 {
1615 DrawStaticElement.Empty();
1616 return;
1617 }
1618
1619 bool wasMergeSelected =
1620 IsViewSelected(SelectedTab.Merge);
1621
1622 bool isCloseButtonClicked;
1623
1624 bool isMergeSelected = mMergeTabButton.
1625 DrawClosableTabButton(
1626 PlasticLocalization.Name.MainSidebarMergeItem.GetString(),
1627 wasMergeSelected,
1628 true,
1629 mTabButtonWidth,
1630 mParentWindow.Repaint,
1631 out isCloseButtonClicked);
1632
1633 if (isCloseButtonClicked)
1634 {
1635 CloseMergeTab();
1636 ShowPendingChangesView();
1637 return;
1638 }
1639
1640 if (isMergeSelected)
1641 ShowMergeView();
1642 }
1643
1644 void HistoryTabButtonGUI()
1645 {
1646 if (HistoryTab == null)
1647 {
1648 DrawStaticElement.Empty();
1649 return;
1650 }
1651
1652 bool wasHistorySelected =
1653 IsViewSelected(SelectedTab.History);
1654
1655 bool isCloseButtonClicked;
1656
1657 bool isHistorySelected = mHistoryTabButton.
1658 DrawClosableTabButton(
1659 PlasticLocalization.GetString(PlasticLocalization.Name.History),
1660 wasHistorySelected,
1661 true,
1662 mTabButtonWidth,
1663 mParentWindow.Repaint,
1664 out isCloseButtonClicked);
1665
1666 if (isCloseButtonClicked)
1667 {
1668 CloseHistoryTab();
1669 return;
1670 }
1671
1672 if (isHistorySelected)
1673 SetSelectedView(SelectedTab.History);
1674 }
1675
1676 static bool ShouldRefreshView(
1677 bool isViewInitialized,
1678 bool hasObjectToSelect,
1679 bool isViewSelected)
1680 {
1681 // If the view is not initialized, it will be refreshed
1682 // during the initialization. So we don't need to refresh.
1683 if (!isViewInitialized)
1684 return false;
1685
1686 // If there is an object to select, we should refresh the view.
1687 if (hasObjectToSelect)
1688 return true;
1689
1690 // If the view is selected, no need to refresh.
1691 if (isViewSelected)
1692 return false;
1693
1694 // Otherwise, refresh the view.
1695 return true;
1696 }
1697
1698 float mTabButtonWidth = -1;
1699
1700 ViewSwitcherState mState;
1701
1702 TabButton mPendingChangesTabButton;
1703 TabButton mIncomingChangesTabButton;
1704 TabButton mChangesetsTabButton;
1705 TabButton mShelvesTabButton;
1706 TabButton mBranchesTabButton;
1707 TabButton mLocksTabButton;
1708 TabButton mMergeTabButton;
1709 TabButton mHistoryTabButton;
1710
1711 StatusBar.IIncomingChangesNotification mIncomingChangesNotification;
1712 GluonNewIncomingChangesUpdater mGluonNewIncomingChangesUpdater;
1713 NewIncomingChangesUpdater mDeveloperNewIncomingChangesUpdater;
1714
1715 CheckShelvedChanges.IUpdateShelvedChangesNotification mUpdateShelvedChanges;
1716 ShelvedChangesUpdater mShelvedChangesUpdater;
1717
1718 WorkspaceWindow mWorkspaceWindow;
1719
1720 readonly EditorWindow mParentWindow;
1721 readonly StatusBar mStatusBar;
1722 readonly ISaveAssets mSaveAssets;
1723 readonly WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
1724 readonly LaunchTool.IProcessExecutor mProcessExecutor;
1725 readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
1726 readonly IAssetStatusCache mAssetStatusCache;
1727 readonly bool mIsGluonMode;
1728 readonly ViewHost mViewHost;
1729 readonly WorkspaceInfo mWkInfo;
1730 readonly RepositorySpec mRepSpec;
1731 }
1732}