168 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: VlnSpinner.cs $     $Revision: 2 $
 | 
						|
 * $Author: Kathy $   $Date: 7/26/04 1:21p $
 | 
						|
 *
 | 
						|
 * $History: VlnSpinner.cs $
 | 
						|
 * 
 | 
						|
 * *****************  Version 2  *****************
 | 
						|
 * User: Kathy        Date: 7/26/04    Time: 1:21p
 | 
						|
 * Updated in $/LibSource/VlnStatus
 | 
						|
 * add comment
 | 
						|
 * 
 | 
						|
 * *****************  Version 1  *****************
 | 
						|
 * User: Kathy        Date: 5/11/04    Time: 9:56a
 | 
						|
 * Created in $/LibSource/VlnStatus
 | 
						|
 * volian spinner control
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
using System;
 | 
						|
using System.Diagnostics;
 | 
						|
using System.Text;
 | 
						|
 | 
						|
namespace VlnStatus
 | 
						|
{
 | 
						|
	/*
 | 
						|
	**  The following values are taken by the Spinner class constructor:
 | 
						|
	**
 | 
						|
	**  spindelay        - is the number of seconds to wait before putting
 | 
						|
	**                     up the message and spinner.
 | 
						|
	**
 | 
						|
	**  spinfreq         - is the minimum delay time in milliseconds before
 | 
						|
	**                     returning to the caller.
 | 
						|
	**
 | 
						|
	**  spinmsg1         - is a caller message put up with the spinner
 | 
						|
	**  spinmsg2         - is a second caller message concatenated to spinmsg1
 | 
						|
	**						both spinmsg1 and spinmsg2 may be NULL for no messages.
 | 
						|
	**
 | 
						|
	**  AbortFlag        - is a flag.  If non-zero takes a DB_Exit(255)
 | 
						|
	**                     if the user hits the Esc key while spinning.
 | 
						|
	**                     can be defaulted.
 | 
						|
	**
 | 
						|
	**
 | 
						|
	**  SpinnerWait puts up a delayed message with a spinner.
 | 
						|
	**
 | 
						|
	**  AutoTermFlag     - spinner returns 0 if this value is non-zero
 | 
						|
	**                     or Esc was pressed and AbortFlag not set.
 | 
						|
	**                     A 1 is returned if AutoTermFlag is zero.
 | 
						|
	**
 | 
						|
	**  The purpose of this function is to generate interruptable/abortable
 | 
						|
	**  while or do-while loops in code which is waiting for an event to
 | 
						|
	**  occur.  Below is a simple example:
 | 
						|
	**
 | 
						|
	**  { Spinner spin(2,25,"- Waiting for ", filename, 1);
 | 
						|
	**    while( spin.SpinnerWait( stat(filename,&temp) || temp.st_size ) {;}
 | 
						|
	**  }
 | 
						|
	**
 | 
						|
	**  This loop returns zero if filename does not exist, or if it does
 | 
						|
	**  exist and has a non-zero length, otherwise it waits at least
 | 
						|
	**  25 milliseconds, and returns 1 so that the predicate test 
 | 
						|
	**       stat(filename,&temp) || temp.st_size
 | 
						|
	**  is tested again.  If the loop continues for 2 seconds, a message
 | 
						|
	**  and spinner is posted.  If the user presses the Esc key, DB_Exit(255)
 | 
						|
	**  is taken.
 | 
						|
	**
 | 
						|
	**  Note, that the SpinnerWait function will close the message window
 | 
						|
	**  when the Spinner class object goes out of scope, as the desctructor
 | 
						|
	**  handles the window closures.  Note also, that a new instance of the
 | 
						|
	**  object must be generated with each use.
 | 
						|
	*/
 | 
						|
	public class VlnSpinner
 | 
						|
	{
 | 
						|
		SpinnerFrm spinFrm;
 | 
						|
		private int spinstart;
 | 
						|
		private int spindelay;
 | 
						|
		private int spinfreq;
 | 
						|
		private string spinmsg1;
 | 
						|
		private string spinmsg2;
 | 
						|
		private bool abortflag;
 | 
						|
		private bool canCancel;
 | 
						|
		private string msgprefix;
 | 
						|
		private bool firstspin;
 | 
						|
		private bool firstpass;
 | 
						|
 | 
						|
		public VlnSpinner(int sd, int sf, string sm1, string sm2, bool af, bool prefix, bool showCancel)
 | 
						|
		{
 | 
						|
			spindelay=sd; 
 | 
						|
			spinfreq=sf; 
 | 
						|
			spinmsg1=sm1; 
 | 
						|
			spinmsg2=sm2; 
 | 
						|
			abortflag=af;
 | 
						|
			canCancel = showCancel;
 | 
						|
			firstpass=true; 
 | 
						|
			firstspin=true;  
 | 
						|
	
 | 
						|
			spinFrm = null;
 | 
						|
			if(prefix)
 | 
						|
				msgprefix="Database File in Use by another user \n";
 | 
						|
			else
 | 
						|
				msgprefix=" ";
 | 
						|
		}
 | 
						|
		
 | 
						|
		public void Dispose() 
 | 
						|
		{
 | 
						|
			if(spinFrm!=null) spinFrm.Dispose();
 | 
						|
		}
 | 
						|
 | 
						|
		public bool SpinnerWait(bool AutoTermFlag) 
 | 
						|
		{
 | 
						|
			if( !AutoTermFlag ) 
 | 
						|
			{
 | 
						|
				if( firstpass ) 
 | 
						|
				{
 | 
						|
					// Tick is equal to 100 nanoseconds.
 | 
						|
					// nanosecond is 1 billionth of a second.
 | 
						|
					spinstart = (int)(DateTime.Now.Ticks/10000000) + spindelay;
 | 
						|
					firstpass = false;
 | 
						|
				}
 | 
						|
				if( !firstspin ) 
 | 
						|
				{
 | 
						|
					SpinnerTick();
 | 
						|
					TickTock(spinfreq);
 | 
						|
				} 
 | 
						|
				else 
 | 
						|
				{
 | 
						|
					if(spinstart <= (int)(DateTime.Now.Ticks/10000000)) SpinnerTick();
 | 
						|
					TickTock(spinfreq);
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return (!AutoTermFlag);
 | 
						|
		}
 | 
						|
		private void TickTock(int spinfreq) 
 | 
						|
		{
 | 
						|
			long cur = DateTime.Now.Ticks;
 | 
						|
			long getto = cur+(spinfreq*100);
 | 
						|
			while (cur <= getto)
 | 
						|
				cur = DateTime.Now.Ticks;
 | 
						|
		}
 | 
						|
 | 
						|
		private void SpinMessage(string msg1,string msg2,string msg3,int len) 
 | 
						|
		{
 | 
						|
			StringBuilder buff = new StringBuilder(80);
 | 
						|
			buff.Append(msg1);
 | 
						|
			if (msg2!=null)buff.Append(msg2);
 | 
						|
			if (msg3!=null)buff.Append(msg3);
 | 
						|
			spinFrm.UpdateSpinMsg(buff.ToString());
 | 
						|
		}
 | 
						|
 | 
						|
		private void SpinnerTick() 
 | 
						|
		{
 | 
						|
			int windowcol;
 | 
						|
			if(firstspin) 
 | 
						|
			{
 | 
						|
				windowcol=msgprefix.Length+2;
 | 
						|
				if(spinmsg1!=null) windowcol+=spinmsg1.Length;
 | 
						|
				if(spinmsg2!=null) windowcol+=spinmsg2.Length;
 | 
						|
				spinFrm = new SpinnerFrm(abortflag, canCancel);
 | 
						|
				spinFrm.Show();
 | 
						|
				SpinMessage(msgprefix,spinmsg1,spinmsg2,windowcol+1);
 | 
						|
				firstspin = false;
 | 
						|
			}
 | 
						|
			spinFrm.UpdateSpin();
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 |