477 lines
9.4 KiB
Ucode
477 lines
9.4 KiB
Ucode
// ====================================================================
|
|
// Class: UT2K4UI.GUIComboBox
|
|
//
|
|
// A Combination of an EditBox, a Down Arrow Button and a ListBox
|
|
//
|
|
// Written by Michel Comeau
|
|
// Updated by Ron Prestenback
|
|
// (c) 2002, 2003 Epic Games, Inc. All Rights Reserved
|
|
// ====================================================================
|
|
|
|
class GUIComboBox extends GUIMultiComponent
|
|
Native;
|
|
|
|
cpptext
|
|
{
|
|
void PreDraw(UCanvas* Canvas);
|
|
|
|
}
|
|
|
|
var() bool bReadOnly;
|
|
var() bool bValueReadOnly;
|
|
var() bool bIgnoreChangeWhenTyping; // If not read-only, only accept OnChange when Enter is pressed
|
|
var() bool bShowListOnFocus;
|
|
var() int MaxVisibleItems;
|
|
|
|
var() editconst int Index;
|
|
var() editconst string TextStr;
|
|
var() editconst GUIList List;
|
|
|
|
var Automated GUIEditBox Edit;
|
|
var Automated GUIScrollButtonBase MyShowListBtn;
|
|
var Automated GUIListBox MyListBox;
|
|
|
|
delegate OnShowList(); // Called when the list is shown
|
|
delegate OnHideList(); // Called when the list is hidden
|
|
|
|
function InitComponent(GUIController MyController, GUIComponent MyOwner)
|
|
{
|
|
Super.Initcomponent(MyController, MyOwner);
|
|
|
|
List = MyListBox.List;
|
|
List.OnChange = ItemChanged;
|
|
List.bHotTrack = true;
|
|
List.bHotTrackSound = false;
|
|
List.OnClickSound = CS_Click;
|
|
List.OnClick = InternalListClick;
|
|
List.OnInvalidate = InternalOnInvalidate;
|
|
List.TextAlign = TXTA_Left;
|
|
MyListBox.Hide();
|
|
|
|
Edit.OnChange = TextChanged;
|
|
Edit.OnMousePressed = InternalEditPressed;
|
|
Edit.INIOption = INIOption;
|
|
Edit.INIDefault = INIDefault;
|
|
Edit.bReadOnly = bReadOnly;
|
|
|
|
List.OnDeActivate = InternalListDeActivate;
|
|
|
|
MyShowListBtn.OnClick = ShowListBox;
|
|
MyShowListBtn.FocusInstead = List;
|
|
SetHint(Hint);
|
|
|
|
}
|
|
|
|
function SetHint(string NewHint)
|
|
{
|
|
Super.SetHint(NewHint);
|
|
|
|
MyShowListBtn.SetHint(NewHint);
|
|
Edit.SetHint(NewHint);
|
|
}
|
|
|
|
function bool InternalOnKeyEvent(out byte Key, out byte State, float Delta)
|
|
{
|
|
local Interactions.EInputKey iKey;
|
|
|
|
if ( State == 3 )
|
|
{
|
|
iKey = EInputKey(Key);
|
|
if (iKey == IK_Down && Controller.ShiftPressed)
|
|
{
|
|
ShowListBox(Self);
|
|
return true;
|
|
}
|
|
|
|
if ( iKey == IK_Enter && !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping && TextStr != Edit.GetText() )
|
|
{
|
|
TextStr = Edit.TextStr;
|
|
OnChange(self);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
function InternalListDeActivate()
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"ListDeactivate Edit.bPendingFocus: "$Edit.bPendingFocus);
|
|
|
|
if (!Edit.bPendingFocus)
|
|
HideListBox();
|
|
}
|
|
|
|
function InternalOnInvalidate(GUIComponent Who)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"Invalidate Who:"$Who);
|
|
|
|
if ( Who != Controller.ActivePage )
|
|
return;
|
|
|
|
Edit.SetFocus(None);
|
|
HideListBox();
|
|
}
|
|
|
|
function InternalEditPressed(GUIComponent Sender, bool bRepeat)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"EditPressed MyListBox.bVisible:"@MyListBox.bVisible);
|
|
|
|
if ( Edit.bReadOnly && !bRepeat )
|
|
{
|
|
if ( !MyListBox.bVisible )
|
|
{
|
|
Controller.bIgnoreNextRelease = true;
|
|
ShowListBox(Self);
|
|
}
|
|
else
|
|
HideListBox();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
function bool InternalListClick(GUIComponent Sender)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"ListClick");
|
|
|
|
if ( !bValueReadOnly )
|
|
List.InternalOnClick(Sender);
|
|
|
|
Edit.SetFocus(none);
|
|
HideListBox();
|
|
return true;
|
|
}
|
|
|
|
function string InternalOnSaveIni(GUIComponent Sender)
|
|
{
|
|
return OnSaveIni(Sender);
|
|
}
|
|
|
|
function InternalOnLoadIni(GUIComponent Sender, string S)
|
|
{
|
|
OnLoadIni(Sender, S);
|
|
}
|
|
|
|
function HideListBox()
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"HideListBox");
|
|
|
|
OnHideList();
|
|
|
|
if ( Controller != None )
|
|
MyShowListBtn.Graphic = Controller.ImageList[7];
|
|
|
|
MyListBox.Hide();
|
|
List.SilentSetIndex( List.FindIndex(TextStr) );
|
|
}
|
|
|
|
event SetVisibility(bool bIsVisible)
|
|
{
|
|
local bool bTemp;
|
|
|
|
Super(GUIComponent).SetVisibility(bIsVisible);
|
|
|
|
bTemp = bDebugging;
|
|
bDebugging = False;
|
|
|
|
HideListBox();
|
|
MyShowListBtn.SetVisibility(bIsVisible);
|
|
Edit.SetVisibility(bIsVisible);
|
|
|
|
bDebugging = bTemp;
|
|
}
|
|
|
|
|
|
function bool ShowListBox(GUIComponent Sender)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"ShowListBox MyListBox.bVisible:"$MyListBox.bVisible);
|
|
|
|
OnShowList();
|
|
|
|
MyListBox.SetVisibility(!MyListBox.bVisible);
|
|
if (MyListBox.bVisible)
|
|
MyShowListBtn.Graphic = Controller.ImageList[2];
|
|
else
|
|
MyShowListBtn.Graphic = Controller.ImageList[7];
|
|
|
|
if (MyListBox.bVisible)
|
|
{
|
|
List.SetFocus(none);
|
|
List.SetTopItem(List.Index);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function ItemChanged(GUIComponent Sender)
|
|
{
|
|
Index = List.Index;
|
|
SetText(List.Get());
|
|
if ( !bReadOnly && !bValueReadOnly && bIgnoreChangeWhenTyping )
|
|
{
|
|
TextStr = Edit.TextStr;
|
|
OnChange(Self);
|
|
}
|
|
}
|
|
|
|
function TextChanged(GUIComponent Sender)
|
|
{
|
|
if ( bValueReadOnly )
|
|
Edit.TextStr = TextStr;
|
|
else if ( bReadOnly || !bIgnoreChangeWhenTyping )
|
|
{
|
|
TextStr = Edit.TextStr;
|
|
OnChange(self);
|
|
}
|
|
}
|
|
|
|
function SetText(string NewText, optional bool bListItemsOnly)
|
|
{
|
|
local int i;
|
|
|
|
i = List.FindIndex(NewText);
|
|
if ( (bReadOnly || bListItemsOnly) && i < 0 )
|
|
return;
|
|
|
|
Edit.SetText(NewText);
|
|
TextStr = Edit.TextStr;
|
|
}
|
|
|
|
function SetExtra(string NewExtra, optional bool bListItemsOnly)
|
|
{
|
|
local int i;
|
|
|
|
i = FindExtra(NewExtra);
|
|
if (( bReadOnly || bListItemsOnly ) && i < 0 )
|
|
return;
|
|
|
|
Edit.SetText( List.GetItemAtIndex(i) );
|
|
}
|
|
|
|
function string Get()
|
|
{
|
|
return Edit.GetText();
|
|
}
|
|
|
|
function string GetText()
|
|
{
|
|
return Get();
|
|
}
|
|
|
|
function object GetObject()
|
|
{
|
|
local string temp;
|
|
|
|
temp = List.Get();
|
|
|
|
if ( temp~=Edit.GetText() )
|
|
return List.GetObject();
|
|
|
|
return none;
|
|
}
|
|
|
|
function string GetExtra()
|
|
{
|
|
local string temp;
|
|
|
|
temp = List.Get();
|
|
|
|
if ( temp~=Edit.GetText() )
|
|
return List.GetExtra();
|
|
|
|
return "";
|
|
}
|
|
|
|
function SetIndex(int I)
|
|
{
|
|
List.SetIndex(i);
|
|
}
|
|
|
|
function int GetIndex()
|
|
{
|
|
return List.Index;
|
|
}
|
|
|
|
function AddItem(string Item, Optional object Extra, Optional string Str)
|
|
{
|
|
List.Add(Item,Extra,Str);
|
|
}
|
|
|
|
function RemoveItem(int Item, optional int Count)
|
|
{
|
|
List.Remove(Item, Count);
|
|
}
|
|
|
|
function string GetItem(int index)
|
|
{
|
|
return List.GetItemAtIndex(index);
|
|
}
|
|
|
|
function object GetItemObject(int index)
|
|
{
|
|
return List.GetObjectAtIndex(index);
|
|
}
|
|
|
|
function string find(string Text, optional bool bExact, optional bool bExtra)
|
|
{
|
|
return List.Find(Text,bExact, bExtra);
|
|
}
|
|
|
|
function int FindExtra(string Text, optional bool bExact)
|
|
{
|
|
return List.FindExtra(Text, bExact);
|
|
}
|
|
|
|
function int FindIndex(string Test, optional bool bExact, optional bool bExtra, optional Object Obj)
|
|
{
|
|
return List.FindIndex(Test, bExact, bExtra, Obj);
|
|
}
|
|
|
|
function int ItemCount()
|
|
{
|
|
return List.ItemCount;
|
|
}
|
|
|
|
function ReadOnly(bool b)
|
|
{
|
|
Edit.bReadOnly = b;
|
|
}
|
|
|
|
function InternalOnMousePressed(GUIComponent Sender, bool bRepeat)
|
|
{
|
|
if (!bRepeat)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"MousePressed");
|
|
|
|
ShowListBox(Sender);
|
|
}
|
|
}
|
|
|
|
function Clear()
|
|
{
|
|
List.Clear();
|
|
if ( bReadOnly )
|
|
Edit.SetText("");
|
|
|
|
// Set my values directly, in case component's state prevented OnChange() events from being passed upwards
|
|
TextStr = "";
|
|
Index = -1;
|
|
}
|
|
|
|
function CenterMouse()
|
|
{
|
|
if ( MyShowListBtn != None )
|
|
MyShowListBtn.CenterMouse();
|
|
|
|
else Super.CenterMouse();
|
|
}
|
|
|
|
function SetFriendlyLabel( GUILabel NewLabel )
|
|
{
|
|
Super.SetFriendlyLabel(NewLabel);
|
|
|
|
if ( Edit != None )
|
|
Edit.SetFriendlyLabel(NewLabel);
|
|
|
|
if ( MyShowListBtn != None )
|
|
MyShowListBtn.SetFriendlyLabel(NewLabel);
|
|
|
|
if ( MyListBox != None )
|
|
MyListBox.SetFriendlyLabel(NewLabel);
|
|
}
|
|
|
|
function LoseFocus(GUIComponent Sender)
|
|
{
|
|
if ( bDebugging )
|
|
log(Name@"LoseFocus Sender:"$Sender);
|
|
|
|
Super.LoseFocus(Sender);
|
|
}
|
|
|
|
function bool FocusFirst( GUIComponent Sender )
|
|
{
|
|
if ( Edit != None )
|
|
{
|
|
HideListBox();
|
|
Edit.SetFocus(None);
|
|
return true;
|
|
}
|
|
|
|
if ( bAcceptsInput )
|
|
{
|
|
Super(GUIComponent).SetFocus(None);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function bool FocusLast( GUIComponent Sender )
|
|
{
|
|
if ( Edit != None )
|
|
{
|
|
HideListBox();
|
|
Edit.SetFocus(None);
|
|
return true;
|
|
}
|
|
|
|
if ( bAcceptsInput )
|
|
{
|
|
Super(GUIComponent).SetFocus(None);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
defaultproperties
|
|
{
|
|
OnKeyEvent=InternalOnKeyEvent
|
|
Begin Object Class=GUIToolTip Name=GUIComboBoxToolTip
|
|
End Object
|
|
ToolTip=GUIComboBoxToolTip
|
|
|
|
Begin Object Class=GUIEditBox Name=EditBox1
|
|
bNeverScale=True
|
|
TextStr=""
|
|
RenderWeight=0.5
|
|
End Object
|
|
|
|
Begin Object Class=GUIComboButton Name=ShowList
|
|
bNeverScale=True
|
|
bRepeatClick=false
|
|
bTabStop=False
|
|
RenderWeight=0.6
|
|
End Object
|
|
|
|
Begin Object Class=GUIListBox Name=ListBox1
|
|
bNeverScale=True
|
|
StyleName="ComboListBox"
|
|
bVisible=false
|
|
FontScale=FNT_Medium
|
|
bTabStop=False
|
|
RenderWeight=0.7
|
|
End Object
|
|
|
|
Edit=EditBox1
|
|
MyShowListBtn=ShowList
|
|
MyListBox=ListBox1
|
|
|
|
|
|
MaxVisibleItems=8
|
|
WinHeight=0.06
|
|
|
|
bAcceptsInput=True
|
|
PropagateVisibility=true
|
|
Index = -1
|
|
}
|