209 lines
5.6 KiB
Ucode
209 lines
5.6 KiB
Ucode
class ListItem extends Object;
|
|
|
|
var ListItem Next;
|
|
var ListItem Prev;
|
|
|
|
var String Tag; // sorted element
|
|
var String Data; // saved data
|
|
var bool bJustMoved; // if the map was just moved, keep it selected
|
|
|
|
function AddElement(ListItem NewElement)
|
|
{
|
|
local ListItem TempItem;
|
|
|
|
for (TempItem = self; TempItem.Next != None; TempItem = TempItem.Next);
|
|
|
|
TempItem.Next = NewElement;
|
|
NewElement.Prev = TempItem;
|
|
NewElement.Next = None;
|
|
}
|
|
|
|
function AddSortedElement(out ListItem FirstElement, ListItem NewElement)
|
|
{
|
|
local ListItem TempItem;
|
|
|
|
// find item which new should be inserted after
|
|
TempItem = FirstElement;
|
|
while (TempItem != None)
|
|
{
|
|
// if current is less or equal than new, but is at the end
|
|
if (Caps(TempItem.Tag) <= Caps(NewElement.Tag) && TempItem.Next == None)
|
|
{
|
|
TempItem.Next = NewElement;
|
|
NewElement.Prev = TempItem;
|
|
NewElement.Next = None;
|
|
break;
|
|
} // else if current is greater than new
|
|
else if (Caps(TempItem.Tag) > Caps(NewElement.Tag))
|
|
{ // if current.prev == none, then make it the new first element
|
|
if (TempItem.Prev == None)
|
|
FirstElement = NewElement;
|
|
else
|
|
TempItem.Prev.Next = NewElement;
|
|
|
|
NewElement.Prev = TempItem.Prev;
|
|
NewElement.Next = TempItem;
|
|
TempItem.Prev = NewElement;
|
|
break;
|
|
}
|
|
TempItem = TempItem.Next;
|
|
}
|
|
}
|
|
|
|
function ListItem FindItem(String SearchData)
|
|
{
|
|
local ListItem TempItem;
|
|
|
|
for (TempItem = self; TempItem != None; TempItem = TempItem.Next)
|
|
{
|
|
if (TempItem.Data ~= SearchData)
|
|
return TempItem;
|
|
}
|
|
return None;
|
|
}
|
|
|
|
|
|
function ListItem DeleteElement(out ListItem First, optional String SearchData)
|
|
{
|
|
local ListItem TempItem;
|
|
for (TempItem = self; TempItem != None; TempItem = TempItem.Next)
|
|
{
|
|
if (TempItem.Data ~= SearchData || SearchData == "") {
|
|
// if no prev, assume this is the first element
|
|
if (TempItem == First || TempItem.Prev == None) {
|
|
First = TempItem.Next;
|
|
if (First != None)
|
|
First.Prev = None;
|
|
}
|
|
else { // close the links around TempItem
|
|
if (TempItem.Prev != None)
|
|
TempItem.Prev.Next = TempItem.Next;
|
|
if (TempItem.Next != None)
|
|
TempItem.Next.Prev = TempItem.Prev;
|
|
}
|
|
|
|
TempItem.Prev = None;
|
|
TempItem.Next = None;
|
|
break;
|
|
}
|
|
}
|
|
return TempItem;
|
|
}
|
|
|
|
function MoveElementUp(out ListItem First, ListItem MoveItem, out int Count)
|
|
{
|
|
local ListItem TempItem;
|
|
local int TempCount;
|
|
|
|
if (MoveItem != None) {
|
|
for (TempCount = Count; TempCount > 0 && MoveItem.Prev != None; TempCount--) {
|
|
TempItem = MoveItem.Prev;
|
|
MoveItem.Prev = TempItem.Prev;
|
|
if (MoveItem.Prev != None)
|
|
MoveItem.Prev.Next = MoveItem;
|
|
TempItem.Next = MoveItem.Next;
|
|
if (TempItem.Next != None)
|
|
TempItem.Next.Prev = TempItem;
|
|
MoveItem.Next = TempItem;
|
|
TempItem.Prev = MoveItem;
|
|
|
|
if (TempItem == First)
|
|
First = MoveItem;
|
|
}
|
|
Count = Count - TempCount;
|
|
}
|
|
}
|
|
|
|
function MoveElementDown(out ListItem First, ListItem MoveItem, out int Count)
|
|
{
|
|
local ListItem TempItem;
|
|
local int TempCount;
|
|
|
|
if (MoveItem != None) {
|
|
for (TempCount = Count; TempCount > 0 && MoveItem.Next != None; TempCount--) {
|
|
TempItem = MoveItem.Next;
|
|
MoveItem.Next = TempItem.Next;
|
|
if (MoveItem.Next != None)
|
|
MoveItem.Next.Prev = MoveItem;
|
|
TempItem.Prev = MoveItem.Prev;
|
|
if (TempItem.Prev != None)
|
|
TempItem.Prev.Next = TempItem;
|
|
MoveItem.Prev = TempItem;
|
|
TempItem.Next = MoveItem;
|
|
|
|
if (MoveItem == First)
|
|
First = TempItem;
|
|
}
|
|
Count = Count - TempCount;
|
|
}
|
|
}
|
|
|
|
|
|
function RunTest()
|
|
{
|
|
local ListItem Test, TempItem;
|
|
|
|
Log("Test: Init 'B'");
|
|
Test = new(None) class'ListItem';
|
|
Test.Tag = "B";
|
|
Test.Data = "B";
|
|
Log(" => Test="$Test);
|
|
|
|
TempItem = new(None) class'ListItem';
|
|
TempItem.Tag = "A";
|
|
TempItem.Data = "A";
|
|
Log("Test: AddSort 'A'");
|
|
Test.AddSortedElement(Test, TempItem);
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
TempItem = new(None) class'ListItem';
|
|
TempItem.Tag = "D";
|
|
TempItem.Data = "D";
|
|
Log("Test: AddSort 'D'");
|
|
Test.AddSortedElement(Test, TempItem);
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
TempItem = new(None) class'ListItem';
|
|
TempItem.Tag = "C";
|
|
TempItem.Data = "C";
|
|
Log("Test: AddSort 'C'");
|
|
Test.AddSortedElement(Test, TempItem);
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
Log("");
|
|
|
|
Log("Test: Delete 'C'");
|
|
Test.DeleteElement(Test, "C");
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
Log("Test: Delete 'D'");
|
|
Test.DeleteElement(Test, "D");
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
Log("Test: Delete 'A'");
|
|
Test.DeleteElement(Test, "A");
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
|
|
Log("Test: Delete 'B'");
|
|
Test.DeleteElement(Test, "B");
|
|
Log(" => Test="$Test);
|
|
for (TempItem = Test; TempItem != None; TempItem = TempItem.Next)
|
|
Log(" => Tag="$TempItem.Tag$" Prev="$TempItem.Prev$" Next="$TempItem.Next);
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
}
|