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