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