143 lines
3.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|