Core.Object | +--UTServerAdmin.ListItem
String
Data
ListItem
Next
Prev
Tag
bool
bJustMoved
void
AddElement(ListItem NewElement)
AddSortedElement(out ListItem, ListItem NewElement)
DeleteElement(out ListItem, optional String)
FindItem(String SearchData)
MoveElementDown(out ListItem, ListItem MoveItem, out int)
MoveElementUp(out ListItem, ListItem MoveItem, out int)
RunTest()
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 }