You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

397 lines
13 KiB
C#

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);
}
}
}