224 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Collections;
 | |
| using System.Threading;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
|     internal class FadeAnimator
 | |
|     {
 | |
|         // Fields
 | |
|         private static Thread fadeThread;
 | |
|         private static ArrayList fadeInfoList;
 | |
|         private static ReaderWriterLock rwImgListLock;
 | |
|         [ThreadStatic]
 | |
|         private static int threadWriterLockWaitCount;
 | |
| 
 | |
|         // Methods
 | |
|         static FadeAnimator()
 | |
|         {
 | |
|             FadeAnimator.rwImgListLock = new ReaderWriterLock();
 | |
|         }
 | |
| 
 | |
|         private FadeAnimator() {}
 | |
| 
 | |
|         public static void Fade(object caller, EventHandler onFadeChangedHandler)
 | |
|         {
 | |
|             if (!BarUtilities.FadeAnimatorEnabled) return;
 | |
|             if (caller != null)
 | |
|             {
 | |
|                 FadeAnimator.FadeInfo fadeInfo = null;
 | |
|                 lock (caller)
 | |
|                 {
 | |
|                     fadeInfo = new FadeAnimator.FadeInfo(caller);
 | |
|                 }
 | |
|                 FadeAnimator.StopFade(caller, onFadeChangedHandler);
 | |
|                 bool flag1 = FadeAnimator.rwImgListLock.IsReaderLockHeld;
 | |
|                 LockCookie cookie1 = new LockCookie();
 | |
|                 FadeAnimator.threadWriterLockWaitCount++;
 | |
|                 try
 | |
|                 {
 | |
|                     if (flag1)
 | |
|                     {
 | |
|                         cookie1 = FadeAnimator.rwImgListLock.UpgradeToWriterLock(-1);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.AcquireWriterLock(-1);
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     FadeAnimator.threadWriterLockWaitCount--;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     if (FadeAnimator.fadeInfoList == null)
 | |
|                     {
 | |
|                         FadeAnimator.fadeInfoList = new ArrayList();
 | |
|                     }
 | |
|                     fadeInfo.FadeChangedHandler = onFadeChangedHandler;
 | |
|                     FadeAnimator.fadeInfoList.Add((FadeAnimator.FadeInfo)fadeInfo);
 | |
|                     if (FadeAnimator.fadeThread == null)
 | |
|                     {
 | |
|                         FadeAnimator.fadeThread = new Thread(new ThreadStart(FadeAnimator.AnimateFade50ms));
 | |
|                         FadeAnimator.fadeThread.Name = typeof(FadeAnimator).Name;
 | |
|                         FadeAnimator.fadeThread.IsBackground = true;
 | |
|                         FadeAnimator.fadeThread.Start();
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     if (flag1)
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.DowngradeFromWriterLock(ref cookie1);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.ReleaseWriterLock();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static void AnimateFade50ms()
 | |
|         {
 | |
|             while (true)
 | |
|             {
 | |
|                 FadeAnimator.rwImgListLock.AcquireReaderLock(-1);
 | |
|                 try
 | |
|                 {
 | |
|                     for (int num1 = 0; num1 < FadeAnimator.fadeInfoList.Count; num1++)
 | |
|                     {
 | |
|                         FadeAnimator.FadeInfo info1 = FadeAnimator.fadeInfoList[num1] as FadeAnimator.FadeInfo;
 | |
|                         info1.Fade();
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     
 | |
|                     FadeAnimator.rwImgListLock.ReleaseReaderLock();
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     using (
 | |
|                                         System.Threading.ManualResetEvent wait =
 | |
|                                             new System.Threading.ManualResetEvent(false))
 | |
|                         wait.WaitOne(40);
 | |
|                     //Thread.Sleep(40);
 | |
|                 }
 | |
|                 catch
 | |
|                 {
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static void StopFade(object caller, EventHandler onFrameChangedHandler)
 | |
|         {
 | |
|             if (!BarUtilities.FadeAnimatorEnabled) return;
 | |
| 
 | |
|             if ((caller != null) && (FadeAnimator.fadeInfoList != null))
 | |
|             {
 | |
|                 bool readerLockHeld = FadeAnimator.rwImgListLock.IsReaderLockHeld;
 | |
|                 LockCookie cookie1 = new LockCookie();
 | |
|                 FadeAnimator.threadWriterLockWaitCount++;
 | |
|                 try
 | |
|                 {
 | |
|                     if (readerLockHeld)
 | |
|                     {
 | |
|                         cookie1 = FadeAnimator.rwImgListLock.UpgradeToWriterLock(-1);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.AcquireWriterLock(-1);
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     FadeAnimator.threadWriterLockWaitCount--;
 | |
|                 }
 | |
|                 try
 | |
|                 {
 | |
|                     for (int num1 = 0; num1 < FadeAnimator.fadeInfoList.Count; num1++)
 | |
|                     {
 | |
|                         FadeAnimator.FadeInfo info1 = FadeAnimator.fadeInfoList[num1] as FadeAnimator.FadeInfo;
 | |
|                         if (caller == info1.Caller)
 | |
|                         {
 | |
|                             if ((onFrameChangedHandler == info1.FadeChangedHandler) || ((onFrameChangedHandler != null) && onFrameChangedHandler.Equals(info1.FadeChangedHandler)))
 | |
|                             {
 | |
|                                 FadeAnimator.fadeInfoList.Remove((FadeAnimator.FadeInfo)info1);
 | |
|                                 info1.FadeChangedHandler = null;
 | |
|                                 info1.Caller = null;
 | |
|                             }
 | |
|                             return;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 finally
 | |
|                 {
 | |
|                     if (readerLockHeld)
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.DowngradeFromWriterLock(ref cookie1);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         FadeAnimator.rwImgListLock.ReleaseWriterLock();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Nested Types
 | |
|         private class FadeInfo
 | |
|         {
 | |
|             private object m_Caller;
 | |
|             private EventHandler m_OnFadeChangedHandler;
 | |
| 
 | |
|             // Methods
 | |
|             public FadeInfo(object caller)
 | |
|             {
 | |
|                 this.m_Caller = caller;
 | |
|             }
 | |
| 
 | |
|             protected void OnFadeChanged(EventArgs e)
 | |
|             {
 | |
|                 if (m_OnFadeChangedHandler != null)
 | |
|                 {
 | |
|                     m_OnFadeChangedHandler(m_Caller, e);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public void Fade()
 | |
|             {
 | |
|                 this.OnFadeChanged(EventArgs.Empty);
 | |
|             }
 | |
| 
 | |
|             public EventHandler FadeChangedHandler
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return this.m_OnFadeChangedHandler;
 | |
|                 }
 | |
|                 set
 | |
|                 {
 | |
|                     this.m_OnFadeChangedHandler = value;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             internal object Caller
 | |
|             {
 | |
|                 get
 | |
|                 {
 | |
|                     return m_Caller;
 | |
|                 }
 | |
|                 set
 | |
|                 {
 | |
|                     m_Caller = value;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |