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.
396 lines
13 KiB
396 lines
13 KiB
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
|
|
using UnityEditor; |
|
|
|
using Codice.Client.BaseCommands; |
|
using Codice.Client.Commands.CheckIn; |
|
using Codice.Client.Common; |
|
using Codice.Client.Common.Threading; |
|
using Codice.CM.Common; |
|
using Codice.CM.Common.Replication; |
|
using GluonGui.WorkspaceWindow.Views; |
|
using GluonGui; |
|
using GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer; |
|
using PlasticGui; |
|
using PlasticGui.WorkspaceWindow; |
|
using PlasticGui.WorkspaceWindow.Topbar; |
|
using PlasticGui.WorkspaceWindow.Replication; |
|
using PlasticGui.WorkspaceWindow.Update; |
|
using Unity.PlasticSCM.Editor.AssetUtils; |
|
using Unity.PlasticSCM.Editor.Configuration; |
|
using Unity.PlasticSCM.Editor.Developer.UpdateReport; |
|
using Unity.PlasticSCM.Editor.UI; |
|
using Unity.PlasticSCM.Editor.UI.Progress; |
|
|
|
using IGluonUpdateReport = PlasticGui.Gluon.IUpdateReport; |
|
using IGluonWorkspaceStatusChangeListener = PlasticGui.Gluon.IWorkspaceStatusChangeListener; |
|
using GluonUpdateReportDialog = Unity.PlasticSCM.Editor.Gluon.UpdateReport.UpdateReportDialog; |
|
|
|
namespace Unity.PlasticSCM.Editor |
|
{ |
|
internal class WorkspaceWindow : |
|
IWorkspaceWindow, |
|
IRefreshView, |
|
IUpdateReport, |
|
IGluonUpdateReport, |
|
IGluonWorkspaceStatusChangeListener |
|
{ |
|
internal void SetUpdateNotifierForTesting(UpdateNotifier updateNotifier) |
|
{ |
|
mUpdateNotifierForTesting = updateNotifier; |
|
} |
|
internal WorkspaceStatusString.Data WorkspaceStatus { get; private set; } |
|
internal OperationProgressData Progress { get { return mOperationProgressData; } } |
|
|
|
internal Gluon.ProgressOperationHandler GluonProgressOperationHandler |
|
{ |
|
get { return mGluonProgressOperationHandler; } |
|
} |
|
|
|
internal WorkspaceWindow( |
|
WorkspaceInfo wkInfo, |
|
ViewHost viewHost, |
|
ViewSwitcher switcher, |
|
IMergeViewLauncher mergeViewLauncher, |
|
NewIncomingChangesUpdater developerNewIncomingChangesUpdater, |
|
EditorWindow parentWindow) |
|
{ |
|
mWkInfo = wkInfo; |
|
mViewHost = viewHost; |
|
mSwitcher = switcher; |
|
mMergeViewLauncher = mergeViewLauncher; |
|
mDeveloperNewIncomingChangesUpdater = developerNewIncomingChangesUpdater; |
|
mPlasticWindow = parentWindow; |
|
mGuiMessage = new UnityPlasticGuiMessage(); |
|
|
|
mDeveloperProgressOperationHandler = new Developer.ProgressOperationHandler(mWkInfo, this); |
|
mGluonProgressOperationHandler = new Gluon.ProgressOperationHandler(this); |
|
mOperationProgressData = new OperationProgressData(); |
|
|
|
((IWorkspaceWindow)this).UpdateTitle(); |
|
} |
|
|
|
internal bool IsOperationInProgress() |
|
{ |
|
return mDeveloperProgressOperationHandler.IsOperationInProgress() |
|
|| mGluonProgressOperationHandler.IsOperationInProgress(); |
|
} |
|
|
|
internal void CancelCurrentOperation() |
|
{ |
|
if (mDeveloperProgressOperationHandler.IsOperationInProgress()) |
|
{ |
|
mDeveloperProgressOperationHandler.CancelCheckinProgress(); |
|
return; |
|
} |
|
|
|
if (mGluonProgressOperationHandler.IsOperationInProgress()) |
|
{ |
|
mGluonProgressOperationHandler.CancelUpdateProgress(); |
|
return; |
|
} |
|
} |
|
|
|
internal void OnParentUpdated(double elapsedSeconds) |
|
{ |
|
if (IsOperationInProgress() || mRequestedRepaint) |
|
{ |
|
if (mDeveloperProgressOperationHandler.IsOperationInProgress()) |
|
mDeveloperProgressOperationHandler.Update(elapsedSeconds); |
|
|
|
mPlasticWindow.Repaint(); |
|
|
|
mRequestedRepaint = false; |
|
} |
|
} |
|
|
|
internal void RequestRepaint() |
|
{ |
|
mRequestedRepaint = true; |
|
} |
|
|
|
internal void UpdateWorkspace() |
|
{ |
|
UpdateWorkspaceOperation update = new UpdateWorkspaceOperation( |
|
mWkInfo, this, mSwitcher, mMergeViewLauncher, this, |
|
mDeveloperNewIncomingChangesUpdater, |
|
null); |
|
|
|
update.Run( |
|
UpdateWorkspaceOperation.UpdateType.UpdateToLatest, |
|
RefreshAsset.UnityAssetDatabase, |
|
null); |
|
} |
|
|
|
void IWorkspaceWindow.RefreshView(ViewType viewType) |
|
{ |
|
mSwitcher.RefreshView(viewType); |
|
} |
|
|
|
void IWorkspaceWindow.RefreshWorkingObjectViews( |
|
ViewType viewType, |
|
WorkingObjectInfo workingObjectInfo) |
|
{ |
|
mSwitcher.RefreshWorkingObjectInfoForSelectedView( |
|
viewType, |
|
workingObjectInfo); |
|
} |
|
|
|
void IWorkspaceWindow.UpdateTitle() |
|
{ |
|
UpdateWorkspaceTitle(); |
|
} |
|
|
|
bool IWorkspaceWindow.CheckOperationInProgress() |
|
{ |
|
return mDeveloperProgressOperationHandler.CheckOperationInProgress(); |
|
} |
|
|
|
void IWorkspaceWindow.ShowUpdateProgress(string title, UpdateNotifier notifier) |
|
{ |
|
mDeveloperProgressOperationHandler.ShowUpdateProgress(title, mUpdateNotifierForTesting ?? notifier); |
|
} |
|
|
|
void IWorkspaceWindow.EndUpdateProgress() |
|
{ |
|
mDeveloperProgressOperationHandler.EndUpdateProgress(); |
|
} |
|
|
|
void IWorkspaceWindow.ShowCheckinProgress() |
|
{ |
|
mDeveloperProgressOperationHandler.ShowCheckinProgress(); |
|
} |
|
|
|
void IWorkspaceWindow.EndCheckinProgress() |
|
{ |
|
mDeveloperProgressOperationHandler.EndCheckinProgress(); |
|
} |
|
|
|
void IWorkspaceWindow.RefreshCheckinProgress( |
|
CheckinStatus checkinStatus, |
|
BuildProgressSpeedAndRemainingTime.ProgressData progressData) |
|
{ |
|
mDeveloperProgressOperationHandler. |
|
RefreshCheckinProgress(checkinStatus, progressData); |
|
} |
|
|
|
bool IWorkspaceWindow.HasCheckinCancelled() |
|
{ |
|
return mDeveloperProgressOperationHandler.HasCheckinCancelled(); |
|
} |
|
|
|
void IWorkspaceWindow.ShowReplicationProgress(IReplicationOperation replicationOperation) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IWorkspaceWindow.RefreshReplicationProgress(BranchReplicationData replicationData, ReplicationStatus replicationStatus, int current, int total) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IWorkspaceWindow.EndReplicationProgress(ReplicationStatus replicationStatus) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IWorkspaceWindow.ShowProgress() |
|
{ |
|
mDeveloperProgressOperationHandler.ShowProgress(); |
|
} |
|
|
|
void IWorkspaceWindow.ShowProgress(IProgressOperation progressOperation) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IWorkspaceWindow.RefreshProgress(ProgressData progressData) |
|
{ |
|
mDeveloperProgressOperationHandler.RefreshProgress(progressData); |
|
} |
|
|
|
void IWorkspaceWindow.EndProgress() |
|
{ |
|
mDeveloperProgressOperationHandler.EndProgress(); |
|
} |
|
|
|
EncryptionConfigurationDialogData IWorkspaceWindow.RequestEncryptionPassword(string server) |
|
{ |
|
return EncryptionConfigurationDialog.RequestEncryptionPassword(server, mPlasticWindow); |
|
} |
|
|
|
void IRefreshView.ForType(ViewType viewType) |
|
{ |
|
mSwitcher.RefreshView(viewType); |
|
} |
|
|
|
void IUpdateReport.Show(WorkspaceInfo wkInfo, IList reportLines) |
|
{ |
|
UpdateReportDialog.ShowReportDialog( |
|
wkInfo, |
|
reportLines, |
|
mPlasticWindow); |
|
} |
|
|
|
void IGluonUpdateReport.AppendReport(string updateReport) |
|
{ |
|
throw new NotImplementedException(); |
|
} |
|
|
|
void IGluonWorkspaceStatusChangeListener.OnWorkspaceStatusChanged() |
|
{ |
|
UpdateWorkspaceTitle(); |
|
} |
|
|
|
void UpdateWorkspaceTitle() |
|
{ |
|
WorkspaceStatusString.Data status = null; |
|
|
|
IThreadWaiter waiter = ThreadWaiter.GetWaiter(); |
|
waiter.Execute( |
|
/*threadOperationDelegate*/ delegate |
|
{ |
|
status = WorkspaceStatusString.GetSelectorData(mWkInfo); |
|
}, |
|
/*afterOperationDelegate*/ delegate |
|
{ |
|
if (waiter.Exception != null) |
|
return; |
|
|
|
WorkspaceStatus = status; |
|
|
|
RequestRepaint(); |
|
}); |
|
} |
|
|
|
bool mRequestedRepaint; |
|
|
|
UpdateNotifier mUpdateNotifierForTesting; |
|
IProgressControls mProgressControls; |
|
|
|
readonly OperationProgressData mOperationProgressData; |
|
readonly Developer.ProgressOperationHandler mDeveloperProgressOperationHandler; |
|
readonly Gluon.ProgressOperationHandler mGluonProgressOperationHandler; |
|
readonly GuiMessage.IGuiMessage mGuiMessage; |
|
readonly EditorWindow mPlasticWindow; |
|
readonly NewIncomingChangesUpdater mDeveloperNewIncomingChangesUpdater; |
|
readonly IMergeViewLauncher mMergeViewLauncher; |
|
readonly ViewSwitcher mSwitcher; |
|
readonly ViewHost mViewHost; |
|
readonly WorkspaceInfo mWkInfo; |
|
|
|
internal void RegisterPendingChangesProgressControls( |
|
ProgressControlsForViews progressControls) |
|
{ |
|
mProgressControls = progressControls; |
|
} |
|
|
|
internal void UpdateWorkspaceForMode( |
|
bool isGluonMode, |
|
WorkspaceWindow workspaceWindow) |
|
{ |
|
if (isGluonMode) |
|
{ |
|
PartialUpdateWorkspace(); |
|
return; |
|
} |
|
|
|
UpdateWorkspace(); |
|
} |
|
|
|
UpdateReportResult IGluonUpdateReport.ShowUpdateReport( |
|
WorkspaceInfo wkInfo, List<ErrorMessage> errors) |
|
{ |
|
return GluonUpdateReportDialog.ShowUpdateReport( |
|
wkInfo, errors, mPlasticWindow); |
|
} |
|
|
|
void PartialUpdateWorkspace() |
|
{ |
|
mProgressControls.ShowProgress(PlasticLocalization.GetString( |
|
PlasticLocalization.Name.UpdatingWorkspace)); |
|
|
|
((IUpdateProgress)mGluonProgressOperationHandler).ShowCancelableProgress(); |
|
|
|
OutOfDateUpdater outOfDateUpdater = new OutOfDateUpdater(mWkInfo, null); |
|
|
|
BuildProgressSpeedAndRemainingTime.ProgressData progressData = |
|
new BuildProgressSpeedAndRemainingTime.ProgressData(DateTime.Now); |
|
|
|
IThreadWaiter waiter = ThreadWaiter.GetWaiter(); |
|
waiter.Execute( |
|
/*threadOperationDelegate*/ delegate |
|
{ |
|
outOfDateUpdater.Execute(); |
|
}, |
|
/*afterOperationDelegate*/ delegate |
|
{ |
|
mProgressControls.HideProgress(); |
|
|
|
((IUpdateProgress)mGluonProgressOperationHandler).EndProgress(); |
|
|
|
mViewHost.RefreshView(ViewType.CheckinView); |
|
mViewHost.RefreshView(ViewType.IncomingChangesView); |
|
|
|
RefreshAsset.UnityAssetDatabase(); |
|
|
|
if (waiter.Exception != null) |
|
{ |
|
ExceptionsHandler.DisplayException(waiter.Exception); |
|
return; |
|
} |
|
|
|
ShowUpdateReportDialog( |
|
mWkInfo, mViewHost, outOfDateUpdater.Progress, mProgressControls, |
|
mGuiMessage, mGluonProgressOperationHandler, this); |
|
}, |
|
/*timerTickDelegate*/ delegate |
|
{ |
|
UpdateProgress progress = outOfDateUpdater.Progress; |
|
|
|
if (progress == null) |
|
return; |
|
|
|
if (progress.IsCanceled) |
|
{ |
|
mProgressControls.ShowNotification( |
|
PlasticLocalization.GetString(PlasticLocalization.Name.Canceling)); |
|
} |
|
|
|
((IUpdateProgress)mGluonProgressOperationHandler).RefreshProgress( |
|
progress, |
|
UpdateProgressDataCalculator.CalculateProgressForWorkspaceUpdate( |
|
mWkInfo.ClientPath, progress, progressData)); |
|
}); |
|
} |
|
|
|
static void ShowUpdateReportDialog( |
|
WorkspaceInfo wkInfo, |
|
ViewHost viewHost, |
|
UpdateProgress progress, |
|
IProgressControls progressControls, |
|
GuiMessage.IGuiMessage guiMessage, |
|
IUpdateProgress updateProgress, |
|
IGluonUpdateReport updateReport) |
|
{ |
|
if (progress.ErrorMessages.Count == 0) |
|
return; |
|
|
|
UpdateReportResult updateReportResult = |
|
updateReport.ShowUpdateReport(wkInfo, progress.ErrorMessages); |
|
|
|
if (!updateReportResult.IsUpdateForcedRequested()) |
|
return; |
|
|
|
UpdateForcedOperation updateForced = new UpdateForcedOperation( |
|
wkInfo, viewHost, progress, progressControls, |
|
guiMessage, updateProgress, updateReport); |
|
|
|
updateForced.UpdateForced( |
|
updateReportResult.UpdateForcedPaths, |
|
updateReportResult.UnaffectedErrors); |
|
} |
|
} |
|
}
|
|
|