UTServerAdmin
Class ListItem

source: e:\games\UnrealTournament\UTServerAdmin\Classes\ListItem.uc
Core.Object
   |
   +--UTServerAdmin.ListItem
Direct Known Subclasses:None

class ListItem
extends Core.Object


Variables
 String Data
           saved data
 ListItem Next
 ListItem Prev
 String Tag
           sorted element
 bool bJustMoved
           if the map was just moved, keep it selected


Function Summary
 void AddElement(ListItem NewElement)
 void AddSortedElement(out ListItem, ListItem NewElement)
 ListItem DeleteElement(out ListItem, optional String)
 ListItem FindItem(String SearchData)
 void MoveElementDown(out ListItem, ListItem MoveItem, out int)
 void MoveElementUp(out ListItem, ListItem MoveItem, out int)
 void RunTest()



Source Code


00001	class ListItem expands Object;
00002	
00003	var ListItem 	Next;
00004	var ListItem	Prev;
00005	
00006	var String	Tag;			// sorted element
00007	var String	Data;			// saved data
00008	var bool	bJustMoved; 	// if the map was just moved, keep it selected
00009	
00010	function AddElement(ListItem NewElement)
00011	{
00012		local ListItem TempItem;
00013		
00014		for (TempItem = self; TempItem.Next != None; TempItem = TempItem.Next);
00015		
00016		TempItem.Next = NewElement;
00017		NewElement.Prev = TempItem;
00018		NewElement.Next = None;
00019	}
00020	
00021	function AddSortedElement(out ListItem FirstElement, ListItem NewElement)
00022	{
00023		local ListItem TempItem;
00024		
00025		// find item which new should be inserted after
00026		TempItem = FirstElement;
00027		while (TempItem != None)
00028		{
00029			// if current is less or equal than new, but is at the end
00030			if (Caps(TempItem.Tag) <= Caps(NewElement.Tag) && TempItem.Next == None)
00031			{
00032				TempItem.Next = NewElement;
00033				NewElement.Prev = TempItem;
00034				NewElement.Next = None;
00035				break;
00036			} // else if current is greater than new
00037			else if (Caps(TempItem.Tag) > Caps(NewElement.Tag))
00038			{	// if current.prev == none, then make it the new first element
00039				if (TempItem.Prev == None)
00040					FirstElement = NewElement;
00041				else
00042					TempItem.Prev.Next = NewElement;
00043			
00044				NewElement.Prev = TempItem.Prev;
00045				NewElement.Next = TempItem;
00046				TempItem.Prev = NewElement;
00047				break;
00048			}
00049			TempItem = TempItem.Next;
00050		}
00051	}
00052	
00053	function ListItem FindItem(String SearchData)
00054	{
00055		local ListItem	TempItem;
00056		
00057		for (TempItem = self; TempItem != None; TempItem = TempItem.Next)
00058		{
00059			if (TempItem.Data ~= SearchData)
00060				return TempItem;
00061		}
00062		return None;
00063	}
00064	
00065	
00066	function ListItem DeleteElement(out ListItem First, optional String SearchData)
00067	{
00068		local ListItem TempItem;
00069		for (TempItem = self; TempItem != None; TempItem = TempItem.Next)
00070		{
00071			if (TempItem.Data ~= SearchData || SearchData == "") {
00072				// if no prev, assume this is the first element
00073				if (TempItem == First || TempItem.Prev == None) {
00074					First = TempItem.Next;
00075					if (First != None)
00076						First.Prev = None;
00077				}
00078				else {		// close the links around TempItem
00079					if (TempItem.Prev != None)
00080						TempItem.Prev.Next = TempItem.Next;	
00081					if (TempItem.Next != None)
00082						TempItem.Next.Prev = TempItem.Prev;
00083				}
00084				
00085				TempItem.Prev = None;
00086				TempItem.Next = None;
00087				break;
00088			}
00089		}
00090		return TempItem;
00091	}
00092	
00093	function MoveElementUp(out ListItem First, ListItem MoveItem, out int Count)
00094	{
00095		local ListItem TempItem;
00096		local int TempCount;
00097	
00098		if (MoveItem != None) {
00099			for (TempCount = Count; TempCount > 0 && MoveItem.Prev != None; TempCount--) {
00100				TempItem = MoveItem.Prev;
00101				MoveItem.Prev = TempItem.Prev;
00102				if (MoveItem.Prev != None)
00103					MoveItem.Prev.Next = MoveItem;
00104				TempItem.Next = MoveItem.Next;
00105				if (TempItem.Next != None)
00106					TempItem.Next.Prev = TempItem;
00107				MoveItem.Next = TempItem;
00108				TempItem.Prev = MoveItem;
00109				
00110				if (TempItem == First)
00111					First = MoveItem;
00112			}
00113			Count = Count - TempCount;
00114		}
00115	}
00116	
00117	function MoveElementDown(out ListItem First, ListItem MoveItem, out int Count)
00118	{
00119		local ListItem TempItem;
00120		local int TempCount;
00121	
00122		if (MoveItem != None) {
00123			for (TempCount = Count; TempCount > 0 && MoveItem.Next != None; TempCount--) {
00124				TempItem = MoveItem.Next;
00125				MoveItem.Next = TempItem.Next;
00126				if (MoveItem.Next != None)
00127					MoveItem.Next.Prev = MoveItem;
00128				TempItem.Prev = MoveItem.Prev;
00129				if (TempItem.Prev != None)
00130					TempItem.Prev.Next = TempItem;
00131				MoveItem.Prev = TempItem;
00132				TempItem.Next = MoveItem;
00133	
00134				if (MoveItem == First)
00135					First = TempItem;
00136			}
00137			Count = Count - TempCount;
00138		}
00139	}
00140			
00141			
00142	function RunTest()
00143	{
00144		local ListItem Test, TempItem;
00145		
00146		Log("Test: Init 'B'");
00147		Test = new(None) class'ListItem';
00148		Test.Tag = "B";
00149		Test.Data = "B";
00150		Log("  => Test="$Test);
00151		
00152		TempItem = new(None) class'ListItem';
00153		TempItem.Tag = "A";
00154		TempItem.Data = "A";
00155		Log("Test: AddSort 'A'");
00156		Test.AddSortedElement(Test, TempItem);
00157		Log("  => Test="$Test);
00158		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00159			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00160	
00161		TempItem = new(None) class'ListItem';
00162		TempItem.Tag = "D";
00163		TempItem.Data = "D";
00164		Log("Test: AddSort 'D'");
00165		Test.AddSortedElement(Test, TempItem);
00166		Log("  => Test="$Test);
00167		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00168			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00169	
00170		TempItem = new(None) class'ListItem';
00171		TempItem.Tag = "C";
00172		TempItem.Data = "C";
00173		Log("Test: AddSort 'C'");
00174		Test.AddSortedElement(Test, TempItem);
00175		Log("  => Test="$Test);
00176		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00177			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00178	
00179		Log("");
00180	
00181		Log("Test: Delete 'C'");
00182		Test.DeleteElement(Test, "C");
00183		Log("  => Test="$Test);
00184		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00185			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00186			
00187		Log("Test: Delete 'D'");
00188		Test.DeleteElement(Test, "D");
00189		Log("  => Test="$Test);
00190		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00191			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00192			
00193		Log("Test: Delete 'A'");
00194		Test.DeleteElement(Test, "A");
00195		Log("  => Test="$Test);
00196		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00197			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00198	
00199		Log("Test: Delete 'B'");
00200		Test.DeleteElement(Test, "B");
00201		Log("  => Test="$Test);
00202		for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
00203			Log("  => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
00204	}
00205	
00206	defaultproperties
00207	{
00208	}

End Source Code