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}