143 lines
3.7 KiB
C#

using System;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace DevComponents.DotNetBar
{
internal class PopupDelayedClose
{
#region Private Variables
private Timer m_Timer = null;
private ArrayList m_Popups = new ArrayList();
private System.Threading.ReaderWriterLock m_PopupsLock = new System.Threading.ReaderWriterLock();
#endregion
public PopupDelayedClose()
{
m_Timer = new Timer();
m_Timer.Enabled = false;
m_Timer.Interval = 800;
m_Timer.Tick += new EventHandler(TimerDelayedClose);
}
void TimerDelayedClose(object sender, EventArgs e)
{
m_Timer.Stop();
CloseAllPopups();
}
public void Dispose()
{
if (m_Timer != null)
{
m_Timer.Stop();
CloseAllPopups();
m_Timer.Dispose();
m_Timer = null;
}
}
private void CloseAllPopups()
{
if (m_Popups.Count > 0)
{
bool readerLockHeld = m_PopupsLock.IsReaderLockHeld;
System.Threading.LockCookie cookie1 = new System.Threading.LockCookie();
if (readerLockHeld)
{
cookie1 = m_PopupsLock.UpgradeToWriterLock(-1);
}
else
{
m_PopupsLock.AcquireWriterLock(-1);
}
try
{
foreach (PopupItem item in m_Popups)
item.ClosePopup();
m_Popups.Clear();
}
finally
{
if (readerLockHeld)
{
m_PopupsLock.DowngradeFromWriterLock(ref cookie1);
}
else
{
m_PopupsLock.ReleaseWriterLock();
}
}
}
}
public void DelayClose(PopupItem item)
{
if (m_Timer == null)
return;
bool readerLockHeld = m_PopupsLock.IsReaderLockHeld;
System.Threading.LockCookie cookie1 = new System.Threading.LockCookie();
if (readerLockHeld)
{
cookie1 = m_PopupsLock.UpgradeToWriterLock(-1);
}
else
{
m_PopupsLock.AcquireWriterLock(-1);
}
try
{
m_Popups.Add(item);
m_Timer.Start();
}
finally
{
if (readerLockHeld)
{
m_PopupsLock.DowngradeFromWriterLock(ref cookie1);
}
else
{
m_PopupsLock.ReleaseWriterLock();
}
}
}
public void EraseDelayClose()
{
bool readerLockHeld = m_PopupsLock.IsReaderLockHeld;
System.Threading.LockCookie cookie1 = new System.Threading.LockCookie();
if (readerLockHeld)
{
cookie1 = m_PopupsLock.UpgradeToWriterLock(-1);
}
else
{
m_PopupsLock.AcquireWriterLock(-1);
}
try
{
m_Popups.Clear();
}
finally
{
if (readerLockHeld)
{
m_PopupsLock.DowngradeFromWriterLock(ref cookie1);
}
else
{
m_PopupsLock.ReleaseWriterLock();
}
}
}
}
}