108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| 
 | |
| using Codice.Client.Common.Threading;
 | |
| 
 | |
| namespace Unity.PlasticSCM.Editor.UI
 | |
| {
 | |
|     internal class UnityThreadWaiterBuilder : IThreadWaiterBuilder
 | |
|     {
 | |
|         IThreadWaiter IThreadWaiterBuilder.GetWaiter()
 | |
|         {
 | |
|             return new UnityThreadWaiter(mPlasticTimerBuilder, false);
 | |
|         }
 | |
| 
 | |
|         IThreadWaiter IThreadWaiterBuilder.GetWaiter(int timerIntervalMilliseconds)
 | |
|         {
 | |
|             return new UnityThreadWaiter(mPlasticTimerBuilder, false, timerIntervalMilliseconds);
 | |
|         }
 | |
| 
 | |
|         IThreadWaiter IThreadWaiterBuilder.GetModalWaiter()
 | |
|         {
 | |
|             return new UnityThreadWaiter(mPlasticTimerBuilder, true);
 | |
|         }
 | |
| 
 | |
|         IThreadWaiter IThreadWaiterBuilder.GetModalWaiter(int timerIntervalMilliseconds)
 | |
|         {
 | |
|             return new UnityThreadWaiter(mPlasticTimerBuilder, true, timerIntervalMilliseconds);
 | |
|         }
 | |
| 
 | |
|         IPlasticTimer IThreadWaiterBuilder.GetTimer(
 | |
|             int timerIntervalMilliseconds, ThreadWaiter.TimerTick timerTickDelegate)
 | |
|         {
 | |
|             return mPlasticTimerBuilder.Get(false, timerIntervalMilliseconds, timerTickDelegate);
 | |
|         }
 | |
| 
 | |
|         static IPlasticTimerBuilder mPlasticTimerBuilder = new UnityPlasticTimerBuilder();
 | |
|     }
 | |
| 
 | |
|     internal class UnityThreadWaiter : IThreadWaiter
 | |
|     {
 | |
|         Exception IThreadWaiter.Exception { get { return mThreadOperation.Exception; } }
 | |
| 
 | |
|         internal UnityThreadWaiter(
 | |
|             IPlasticTimerBuilder timerBuilder, bool bModalMode)
 | |
|         {
 | |
|             mPlasticTimer = timerBuilder.Get(bModalMode, OnTimerTick);
 | |
|         }
 | |
| 
 | |
|         internal UnityThreadWaiter(
 | |
|             IPlasticTimerBuilder timerBuilder,
 | |
|             bool bModalMode,
 | |
|             int timerIntervalMilliseconds)
 | |
|         {
 | |
|             mPlasticTimer = timerBuilder.Get(bModalMode, timerIntervalMilliseconds, OnTimerTick);
 | |
|         }
 | |
| 
 | |
|         void IThreadWaiter.Execute(
 | |
|             PlasticThread.Operation threadOperationDelegate,
 | |
|             PlasticThread.Operation afterOperationDelegate)
 | |
|         {
 | |
|             ((IThreadWaiter)(this)).Execute(threadOperationDelegate, afterOperationDelegate, null);
 | |
|         }
 | |
| 
 | |
|         void IThreadWaiter.Execute(
 | |
|             PlasticThread.Operation threadOperationDelegate,
 | |
|             PlasticThread.Operation afterOperationDelegate,
 | |
|             PlasticThread.Operation timerTickDelegate)
 | |
|         {
 | |
|             mThreadOperation = new PlasticThread(threadOperationDelegate);
 | |
|             mAfterOperationDelegate = afterOperationDelegate;
 | |
|             mTimerTickDelegate = timerTickDelegate;
 | |
| 
 | |
|             mPlasticTimer.Start();
 | |
| 
 | |
|             mThreadOperation.Execute();
 | |
|         }
 | |
| 
 | |
|         void IThreadWaiter.Cancel()
 | |
|         {
 | |
|             mbCancelled = true;
 | |
|         }
 | |
| 
 | |
|         void OnTimerTick()
 | |
|         {
 | |
|             if (mThreadOperation.IsRunning)
 | |
|             {
 | |
|                 if (mTimerTickDelegate != null)
 | |
|                     EditorDispatcher.Dispatch(() => mTimerTickDelegate());
 | |
| 
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             mPlasticTimer.Stop();
 | |
| 
 | |
|             if (mbCancelled)
 | |
|                 return;
 | |
| 
 | |
|             EditorDispatcher.Dispatch(() => mAfterOperationDelegate());
 | |
|         }
 | |
| 
 | |
|         bool mbCancelled = false;
 | |
| 
 | |
|         IPlasticTimer mPlasticTimer;
 | |
|         PlasticThread mThreadOperation;
 | |
|         PlasticThread.Operation mTimerTickDelegate;
 | |
|         PlasticThread.Operation mAfterOperationDelegate;
 | |
|     }
 | |
| }
 |