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