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