*E_ G b pG>gZ H aH bH cH dH eR oR p_ }_ ~_ NoneUWindow InternalTimeRegionSystemCoreUWindowLookAndFeelColorCreated BeforePaintNotifyPaletteVSizeUClampUSizeVClampMipZeroPaintVBitsScrollUBits HideWindow LMouseDownGetLookAndFeelTextureCloseSetFontbMasked ShowWindowClear CaptureMouseCloseUp SetValueUWindowWin95LookAndFeelSelect WindowEventKeyDown MouseMove DeSelectConsoleCommand SetRangeSetTextTickResized DrawItemClick GetOptionRemovePerformSelect LMouseUpCreateControlTextAreaTextSizeResolutionChanged MaxColorInsert ParseColorAddTextAppend GetValueFocusOtherWindow GetMenuBar AppendItemInsertItemBefore ShowThisItem CheckRangeCompare IsActive GetHexDigitPlayMenuSoundSort bNoKeyboard SetCaption ExecuteItem FocusWindow TexRegion SetSelectedInsertItemAfter GetItemAtGetDesiredDimensions DoubleClick GraftRightCountSetupSentinel MouseLeaveToolTipTextAreaClipText ParseHTML RMouseDownBeforeExecuteItem CloseUWindow InsertItemAddItemNotifyQuitUnrealGotoTab HotKeyUpRightClickTab SetEditable HotKeyDownNotifyAfterLevelChangeSetCanvasStyle CreateItemNotifyBeforeLevelChange GraftLeft FW_HitTestFW_GetClientArea Tab_DrawTabTab_GetTabSize BeginPlay DrawTextLine ContinueSortKeyType MouseEnterKeyUpKeyFocusEnterDrawMenuBackground KeyFocusExit RMouseUp HideConsole WaitModal WindowHidden WindowShownCheckMousePassThrough SetTextColorFindItemIndex RemoveWrapSetEditTextColorLaunchUnrealURLSetDimensions SelectRowSetup ClientClassSetSelectedItem GetHeight GetWrapPosRemoveNextWordMoveEnd SetHistoryProcessInlineHTMLCalcHTMLTextWidth SelectAllShow CountShown SetupFontsDestroyListItemAddHotkeyWindowRemoveHotkeyWindowMenu_DrawMenuBarItem MiscBevelTRSB_SetupDownButton AfterPaint MiscBevelTMessageWrapRowRClick DoAppendItemMClick WordWrap FindEntry CheckValue Menu_DrawPulldownMenuBackground MiscBevelBL MiscBevelBTab_DrawTabPageArea MiscBevelR EditCopyMiscBevelArea ShowConsole MiscBevelBRTab_SetTabPageSizeTab_SetupRightButtonMenuCmdFW_DrawWindowFrameLaunchUWindowDrawClientAreaCombo_SetupSizesFW_SetupFrameButtons KeyEventCombo_GetButtonBitmaps Combo_Draw SetMaxLength GetValue2 DropDownSetSelectedIndexTab_SetupLeftButtonCheckbox_SetupSizesAddCell SB_HDraw SB_VDrawFirstMatchingCalcMinHeightMenu_DrawPulldownMenuItemGetTag MiscBevelTL SplitRowAtSB_SetupRightButtonSB_SetupLeftButton ShowModal MiscBevelLbIgnoreLDoubleClickFindItemIndex2GetSelectedIndexSetNumericOnlySB_SetupUpButton Editbox_DrawComboList_DrawItemEditbox_SetupSizes RemoveItemExternalDragOver ListClassComboList_DrawBackgroundCopyToClipboardHTMLUpdateStyleWriteStyleTextSetHelp DeActivated bSizable InsertAfter SaveConfigsMouseLeaveColumnReadStyleText ProcessText FindWindowDoubleClickRow InsertText WordLeft BackspaceDelete WordRight MoveLeft MoveRight Activated MoveHome MoveMouse EditPaste SetPause ProcessURLRightClickRowDownEditCutOverURLSetupMessageBoxClientGetLookAndFeel PaintColumnRightClickRowSetupMessageBoxGetTab MDoubleClick RDoubleClickButton_DrawSmallButton AfterCreateDisconnectList BeforeCreateControlFrame_Draw InsertBeforeMenu_DrawMenuBar DestroyListConsole MMouseDown MMouseUp RightMostCopyExistingListItem ValidateSizeTabsMultiLine SetParent LayoutTabsSizeTabsSingleLine Register SetHelpTextCheckExternalDragOKTextSetNumericFloatCloseActiveWindowReceiveDoubleClickItemCombo_SetupRightButtonCombo_SetupLeftButtonCancelCaptureDoubleClickItem TextColorRenderUWindowAddTabControlFrame_SetupSizesCheckCaptureMouseUp GetTexture EscCloseCreateRootWindowMessageBoxDoneWindowConsole CancelText DoQuitGame SetCursor CheckMaxRows InStrAfter DrawMouse ResetUWindow GetItemValueSetAbsoluteFont RowClassbScrollOnResizeCheckbox_Draw InsertTab ClientTravelAddPage DeleteTab SortColumnGetItemValue2 DrawMenuBarCheckCaptureMouseDownSetAcceptsHotKeysUWindowGridColumn ConsoleKeyUWindowHScrollbar LocalizeUWindowFrameCloseBox ConsoleClassUWindowURLTextAreaUWindowVScrollbarUWindowEditBoxUpdateHistory UWindowGrid HistoryDownUWindowDynamicTextRowUWindowGridClientUWindowHotkeyWindowList RootWindowUWindowSmallOKButtonUWindowEditControlUWindowHSliderControl TA_Right TA_CenterUWindowHSplitterUWindowScrollingDialogClientGetEntryLevelUWindowEditBoxHistoryUWindowSBRightButtonHT_EToggleUWindowUWindowVSplitterUWindowPulldownMenuItemUWindowTabControlItemUWindowPageWindowUWindowWrappedTextArea TextSizeUWindowTextAreaControlUWindowPageControlUWindowPageControlPageMS_WindowOpenMS_WindowClose MS_ChangeTabUWindowTabControlTabAreaUWindowMessageBoxAreaUWindowMessageBoxCW HistoryUpUWindowLayoutBaseUWindowDynamicTextAreaMR_NoneMR_YesMR_NoMR_OK MR_CancelUWindowTabControlRightButtonPC_None PC_LessThan PC_EqualPC_GreaterThan PC_NotEqual PC_ContainsPC_NotContains HTMLStyleUWindowTabControlLeftButtonUWindowSmallCloseButtonUWindowSmallCancelButtonUWindowConsoleTextAreaControlUWindowSmallButtonUWindowDialogClientWindowUWindowConsoleClientWindowUWindowControlFrameTA_LeftUWindowComboRightButton NewRegion NewTexRegion GetRegionUWindowSBUpButton UWindowListBuildObjectWithPropertiesUWindowComboListItemUWindowListControlUWindowComboListHT_NWUWindowFramedWindowHT_NUWindowComboLeftButtonUWindowComboControlUWindowComboButtonUWindowSBLeftButtonUWindowClientWindowUWindowSBDownButtonUWindowRightClickMenuUWindowRootWindowUWindowCheckboxHT_NEHT_WNotifyLevelChangeHT_SWUWindowDialogControlUWindowButtonUWindowProgressBarUWindowWindowUWindowBitmapUWindowPulldownMenu bAlwaysOnTopHT_SHT_SEHT_DragHandle UWindowBasebIgnoreMDoubleClickbIgnoreRDoubleClick HT_TitleBarHT_NoneBeginPasteFromClipboardDrawClippedActorUWindowConsoleWindowMS_MenuPullDown PostRenderUWindowTabControlSayTeamSay MouseCursorTimeDemoRenderMS_MenuCloseUp MS_MenuItemUWindowHTMLTextArea TimeDemoCalcWM_LMouseDown WM_LMouseUpWM_MMouseDown WM_MMouseUpWM_RMouseDown WM_RMouseUp WM_KeyUp WM_KeyDown WM_KeyType WM_Paint MB_YesNoUWindowMessageBox AddString MaxLinesUWindowHTMLTextRowUWindowListBoxUWindowListBoxItemActiveUWindowLayoutCellUWindowLabelControlMB_OK MB_OKCancelMB_YesNoCancelProcessMenuKey MouseScaleUWindowMenuBarUWindowMenuBarItemGetPlayerOwner GetLevelUWindowLayoutControlUWindowLayoutRow ItemHeight CloseBoxDown CloseBoxUpCloseBoxOffsetXFrameSB FrameSBL FrameSBRSBRightDisabled SBRightDownEngine SBBackground SBRightUpSBLeftDisabled SBLeftDown SBLeftUpSBDownDisabled SBDownDown SBDownUp SBUpDisabled SBUpDownSBUpUpPulldown_HBorderPulldown_VBorderPulldown_TextBorderSize_TabXOffsetSize_TabSpacingPulldown_ItemHeightSize_TabAreaHeightSize_MinScrollbarHeightSize_TabAreaOverhangHeightSize_ScrollbarWidthSetSizeDoTick PaintClientsFindWindowUnder PropagateKeyCheckKeyFocusWindowMessageClientsActivateWindowTabUnselectedM BringToFront SendToBackHideChildWindowSetAcceptsFocusCancelAcceptsFocus GetMouseXYGlobalToWindow TabSelectedR TabSelectedM TabSelectedL EditBoxBevelWindowToGlobalShowChildWindowColumnHeadingHeightComboBtnDisabledHLine CreateWindow ComboBtnDown ComboBtnUpTabUnselectedLTileDrawHorizTiledPiecesTabUnselectedRSetDelayedNotify BevelUpB BevelUpBL BevelUpBR BevelUpL BevelUpTR BevelUpR BevelUpTLDrawVertTiledPiecesDrawClippedTextureDrawStretchedTextureDrawStretchedTextureSegment FrameTitleY BevelUpTFrameInactiveTitleColorFrameActiveTitleColor ClipText WrapClipText FrameTitleXFrameBFrameBLFrameRFrameLFrameTRFrameTFrameTLMisc InactiveSActiveSFrameBRClipTextWidthCreateSubMenuTabBackgroundSize_ScrollbarButtonHeight DrawUpBevelDrawMiscBevel HA_RightRemoveAmpersandHA_LeftParseAmpersand HA_Center VA_BottomVA_Top MouseIsOver RowHeight QuitGameSetMouseWindowSetHTMLbAllowConsoleGetPage DeletePage GetParent FirstPageFindChildWindow SetMultiLineSetScrollableMakeSelectedVisibleAddRow SetMousePosChangeLookAndFeel MaxVisible ALinkColor LinkColor GUIScalebAutoScrollbarWindowIsVisiblebVariableRowHeight AddColumn MessageBox SetFrame Inactive NextPage AddHelpItem CreateMenuCreate BevelUpArea WindowTitle InsertPage ReplaceTextNoTextYesText StripCRLF OKPressed SetPrompt SetButtonsBufSize VA_MiddleAppendListCopyPerformLayout ClearValue SetPercent CloseText AutoWidth LeftMostCloseBoxOffsetY bTopCentricMoveItemSorted SetScale AddMenuItem MinHeightbWindowVisibleNewText ModalWindow NewHelpTextObjectPropertyTabPrev HelpText MinWidthTabNextNewFont OwnerWindow NewColorbHasKeyboardFocus ActiveWindowTextXTextYFloatPropertyPrevSiblingWindow UpRegionNextSiblingWindowDisabledRegion OverRegion bUseRegionExternalControlRootXImageXImageY OverSoundRootYNextClickTimeExtXExtYLastChildWindowFirstChildWindowbAcceptExternalDragDropEditAreaDrawXEditAreaDrawYbNoClip bDisabled bStretchedAlign ParentWindow bListVisible bCanEdit NotifyWindow bStretchWithReplace bIgnoreCase bMouseDown DownTextureWinLeft UpTextureDisabledTexturebNumericFloat WhiteTextureNone OverTexture BlackTexture DownRegion ESCResultMatch RegionScale BoolPropertybBlink MaxLengthbBoldS2 SortWeight bHeadingToolTipStringbNoBR bUnderline DownSoundItemsbLink ClickTime bTransientBGColorVBorderHBorder EditBoxWidth MClickTimeLinkDestinationValue2 BulletLevelPropertyConditionMessageBoxResult NewSelected MaxWidthListXListY ExtraWidthEditBox MenuSound bCanDragbCanDragExternalDefaultHelpTextButtonDragYbAlwaysBehind OverItemCurItem bRMouseDown bMMouseDown EnterResultbAcceptsFocusTimeOut LeftButton RightButtonSpacing bButtonsCaptionF_Bold F_NormalOutTextTabArea SelectedTab bInButtonsbSelectNearestTabOnRemoveFoundClickY WinHeightConsoleWindow BeforeTab WinWidthbByUser OldLevel bLevelChangeWinTop bNumericOnlyPrevTab OldWinHeightbLocked PageClassNone BeforePage bNewCanEditbNewAccpetsHotKeys bExactClass ChildClassNone MenuDividerNone MenuSubArrowButtonsbQuickKeyEnablebUWindowActive bUWindowType bByOwner NewParentbLeaveOnscreen bBlackout bVCenterPropertyValue PropertyName IntProperty WrapWidthOldWOldHbDirty VisibleRows AbsoluteFont bShowConsole ShowDesktopMouseYDrawXDrawYMouseX SkipCount DrawCountJunk bWrapped bCreatedRootNewLine OldClipYbAcceptsHotKeysbForceRoot CurrentRowWrapPosRotatork LineWidthNextWordWidth NextWord WordsThisRowPad SplitPosState DrawIconVertSB SelectedClickX bShowBlink bReleasedMClickYMClickXSetClip SetOriginSetPos CurrentStyle RClickTime RightText TextBorderMessageBoxButtons StylePos DisplayPos bInsideTagChOutput StartStyleWidth bCheckHotKey WireFrameClipXOrgYOrgXSpaceYSpaceXHLineAction CharCount FrameCount StyleString NextBlock bOverLink bDragging CaretOffset LastDrawTime bShowCaretOffset NotifyOwner bAllSelectedbSelectOnFocusbDelayedNotifybChangePendingDoubleClickList bShiftDown bHistory bKeyDown HistoryList FrameHitTest bNoDrawWorld bInHistory bEditable ConsoleLinesMaxHRClickXMsgTextTopLineMaxW TextAlign F_LargeBold HistoryBotF_LargeMeshLoc BevelTypeOver bAltDown LocOffset bMultiLinepHbUnique SliderWidth SliderDrawX SliderDrawY TrackStart TrackWidth bSlidingbNoSlidingNotifyTestNewStep bNoNotify OldValuev2TempF TextAreaPrompt InMultiLineHeadTailLinesbCursor bScrollableNewFocusWindownewScrollable TempHead TempTail UWindowKey NewPromptDE_LMouseDown WinMessageCursorDesiredHeightTabLastTabClipY ControlClass EditControl YesButton NoButton OKButton CancelButtonNextTabIcons MessageAreabCenter DrawColor InMessage InButtonsInEnterResult OwnerTabValue bShowHorizSB bShowVertSB ClientArea FixedAreaKeyFixedAreaClassHorizSB BRBitmap ClientWidth ClientHeight FixedHeightDefaultTextHeightStatusBarTextMoveXMoveY MinWinWidth MinWinHeight bTLSizing bTSizing bTRSizing bLSizing bRSizing bBLSizing bBSizing bBRSizingbMovingNetMode bStatusBar CloseBoxOldParentWidthOldParentHeight TimeSeconds TimeOutTime bSetupSize Function InESCResult InTimeOutFramed bHCenter FirstColumn LastColumnTopRowbSizingColumn colColumn TotalWidth OldClipXColumnHeading DefaultWidth NewColumnOldLastColumn PlayerNameColumnLOldPosRowtempnodePrevFOV NextColumn PrevColumnbSizing ColumnNumFCMinPosMaxPos ThumbStart ThumbWidthDragX ScrollAmountIndex ByteProperty NewMinPos NewMaxPosNewMaxVisibleNewScrollAmountNbLeftbRightLeftClientWindowRightClientWindow OldWinWidth MaxSplitPos bRightGrowNewWNewHPercent BlockWidthLastBlinkTime NewPercentBlockXBlockW Palette93 Palette95 MouseDiag1 MouseDiag2NoneMouseNSMouseWE MouseHandNone MouseHSplit MouseVSplit MouseWaitNone MouseWindowbMouseCapture OldMouseX OldMouseYFocusedWindowKeyFocusWindow NormalCursor MoveCursor DiagCursor1 HandCursor HSplitCursor VSplitCursor DiagCursor2 NSCursor WECursor WaitCursorHotkeyWindowsHTML RealWidth RealHeightFontsLooksAndFeelsLookAndFeelClass bRequestQuit QuitTime LeftTextF LFClassNameLFClassResultNewMouseWindowOption NewValueURLdepthT2T1MstrTip NewScaleItem NamePropertyNewLookAndFeel OldColor bTimeDemoPRI TabOffsetbShowSelected FirstShownDragTabTabRowsbArrangeRowsLikeTimHates UnFlashTime bFlashShownNext LastHidden TabCountItemX bHaveMore FovAngleMinRow RowWidths TabCountsbTryAnotherRow SelectedItem bShowText UpButton DownButton ThumbHeightbUpbDownTopClientWindowBottomClientWindow bBottomGrowLast SentinelInternalCountbItemOrderChangedbSuspendableSort CompareCountbSortSuspendedCurrentSortItem bTreeSort BranchLeft BranchRight ParentNodepos NewElementPNewLeftMsg NewRightDelta bControlDown EInputKey EInputActionStyle bSelectedEnumbCheckShowItemOwner CurrentItem PreviousBest BestPrevTextTexYLXLJunk2 ItemClass SourceItem bNoSmoothCurrentHistoryObject bInTreeSort TextBufferConstOutOldNodeInputPackageHotKeyItemTopTIBITSBS WrapParent bRowDirty EndStyleDisplayString HistoryTextSelectedCursorEVerticalAlignNewPosbCalcUnderline Underline EHorizAlignMsgType MsgPlayerHistoryRowSpanColSpanHAlignVAlign MinimumWidthMinimumHeightRowList TypedStr HistoryCur TotalHeight numLinesWindowsMouseY CellListWindowsMouseX ItemLeft ItemWidthbHelpbSuspendPrecachingbShowWindowsMouse RotOffset MenuClassTabTopTabLeft TabWidth TabHeight RowNumberbFlash NewCaptionPagetHGraphicSubMenupWInOwnerWindowbSentrybCRPadding TotalPosWordPosCRPos SpacePosbNoDrawPaddingLengthLengthOwnerWtWtYtXHeadingActiveTitleColorHeadingInActiveTitleColorStructPropertyT5 PieceCountPiecesDestHT4T3DestXDestWDestY WndClassbWindowsMouseAvailable ObjectClass ObjectNameDynamicLoadObjectESetPropertyText ParentClassKeyNamejClassPropertybAtBackWinYWinXStepEditBoxTextColorGlobalYGlobalX MinValue MaxValue MenuTickbTransientNoDeactivateoRClickYChild bByParentHotX LookAndFeelClippingRegionWindowsCursor StrPropertyHotY HistoryTop bChecked DE_CreateditSV ReturnValueMaxMinGRScaleWZYXDComboCBA ScriptText LevelInfoMenuPlayerReplicationInfo ViewportClass bActiveTab bLeftmostTabCanvasFontLevelActorPawn PlayerPawnBitmapPlayerWindowListTitleSoundTexture ActiveFrame Palette113InactiveFrameNone ActiveFrameSInactiveFrameSNone Palette121 ChkChecked Palette123 ChkUncheckedChkCheckedDisabledChkUncheckedDisabledMenuBarNoneMenuHighlightLNoneMenuHighlightMMenuHighlightR MenuAreaNoneMenuTL Palette141MenuTMenuTRMenuLMenuRMenuBLNoneMenuBNoneMenuBRMenuHighlight DE_Change DE_Click DE_EnterDE_Exit DE_MClick DE_RClickDE_EnterPressed DE_MouseMoveDE_MouseLeave DesiredWidthDE_HelpChangedDE_DoubleClickDE_MouseEnterVectorDE_WheelUpPressedDE_WheelDownPressed BackgroundStructNone NewValue2 SIZEBORDER BRSIZEBORDERNoneNoneNoneNoneNoneNoneNoneNoneNoneNone Palette89None Palette101 Palette107NoneNone Palette159 Palette99 Palette103 Palette139 Palette147 Palette91 Palette129 Palette119 Palette131 Palette127 Palette149 Palette161NoneNone\W+}+TT.'l\3:.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lo rSMo .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lxxo o .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lo o .'l.'lo .'lo ԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌԌ> YԝXԝXxo o xo xo xxxxxxo o xo o xo o xxxxxxxxo o xo o xo o xo o xxZ!Z!Z!Z!Z!Z!Z!Z!o .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lo .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lo o .'l.'l.'l.'l.'l.'l.'l.'l.'l.'lo .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lxxxx.'lxx> Yxxxxx.'l.'l.'l.'l.'lxx.'lo xx.'lo .'lx.'l.'lo x.'l.'lo .'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'l.'lxx.'lxx.'l.'l.'l.'l.'l.'l.'lo o o .'lo o S/T2> Yo S/T2> Yo S/T2o o ~\n/E-|@K4\3:K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4K4~~~~ ~\a/B2Ԍ\3:MMM~~'~W-H)KLo .'lS/T2S/T2> YS/T2> YS/T2S/T2S/T2.'lS/T2DroDroDro.'lDroDroDroDro.'lDroDroDroDroDroԌ.'l.'l.'l.'lS/T2S/T2.'lxxxxx.'l.'lx.'l.'l.'l.'l.'lS/T2S/T2S/T2S/T2S/T2S/T2S/T2S/T2S/T2S/T2DroDroDroԌԌL $?}~~P~~ ~`+x*y .'lo Ԍ~4~4~4Ԍ~4ԌB[@ԌB[@B[@ԌB[@ԌB[@~4ԌԌԌԌԌԌԌ~~j~~n~O,NPM]K4~`..O;aGK4նmնmնmնmնmնmնmնmնmնmնmնmնm.'lնmնm~y3j~`˛K4~&a4Q-E+_4&).'l.'l(jb,U K/,U K/(jb,U K/(jb,U K/,U K/(jbԌ(jb(jb(jbԌ,U K/,U K/,U K/,U K/(jb(jb(jb,U K/,U K/,U K/,U K/,U K/(jb(jb(jbo ,U K/,U K/k[1o (jb(jb(jb(jbԌO(E~^/Z.IEf$K4W_PW_PW_PԌնmնmW_PնmնmնmW_PԌնmնmW_P.'lնmնmW_P~o.j.V?{M]A~~V~~~h3i)B2%M.'lԌԌo o o o o o o o o o o o o Ԍ.'l.'l.'l.'l.'lԌo o o o o o o o o ԌԌ.'lԌAN~~~~f%sa.S%Vdնmsѩ`K4;aG;aG;aG;aGK4;aG;aG;aG;aG;aGK4K4;aGK4;aG;aGK4;aGK4;aGK4;aG;aGK4;aG;aGնm;aGնmEf$W_P;aG;aGնm;aGնmK4;aGնm;aGնmEf$W_P;aG;aG;aG;aG;aG;aGEf$;aGEf$K4;aG;aG;aGնm;aGԌԌԌK4;aG;aGxo xK4;aG;aG;aGEf$.'l.'l.'l;aGնm;aGնm;aG;aGK4;aG;aG;aGԌ;aG;aGK4ԌԌԌԌK4;aG;aG;aGW~~~2[}p$`˛~T4J-~e?;K4e?;e?;e?;e?;e?;e?;~~~ ~~ ~~~\},v2r!7X\x<Ԍxo xo ~~~&p3z%C#t&),U K/ԌԌ,U K/,U K/,U K/,U K/,U K/,U K/,U K/,U K/,U K/,U K/,U K/Ԍ~~n~T3Y1t %K.'lo Ԍ{{{Ԍ{Ԍ}i}iԌ}iԌ}iԌ{}iԌԌԌԌԌԌԌ~}3X Q&).'lo > Y&)&)&)o &).'l&)H~xo ~~G~sY4a)@U(jbsѩ`.'l.'l.'l.'l_4_4e?;e?;Ԍe?;ԌK4e?; e?;xo x_4K4Ԍ K4e?;e?;e?;_4_4_4k[1_4k[1 Ԍ Ԍ _4o  K4e?;e?; K4K4e?;e?;e?;K4e?;e?;e?;K4e?;e?;K4e?;e?;K4e?;e?;K4e?;e?;e?;K4e?;e?;e?;ԌK4K4I " ~~~~XzXDA\ezcz`zmzzJe?6' @c?6' @z<?6 ' @?6 ' @zJP ?6' @R?6' @zFaZ^  @_  @UVWYz`mzec ~o@~]&v3X&z9,U K/&)&)xo xxxxxxxxxx> Y> Y> Y> YvAxvAx> Y> Y> Y> Y> YvAxvAxvAx> YvAxvAxvAx> Y> Y> Y> Y> Y> Y&)> Y> Y> Y> Y> Y&)vAx~~S~h@~~@~E,I*Zi05.'lԌ91SԌM]ԌM]91SK4M]M]M]M]M]M]M]M]M]91SK4M]M]M]M]M]M]M]91So 91SM]91SK4M]M]M]M]M]M]M]M]91S91SK4M]ԌM]M]M]M]M]91S91SK4M]M]M]M]M]91SK4M]M]M]M]M]M]M]M]M]M]M]M]M]Ԍ91SK4M]ԌM]M]M]M]M]M]91SԌ91SK4M]M]M]M]M]M]M]M]M]M]91SdezP91Sc 7D~~| ~~D ~~T~~{~~v.N+t{%(-2' ~Et-K, R `3b-|A7{.'l BԺBԺԌԌԌԌԌ]I BԺ]I BԺBԺBԺBԺBԺBԺBԺBԺBԺBԺ%KԌ%K%K%K%K]I ]I ]I Ԍ]I Ԍ]I %KԌ%K%KԌ%KԌ Ԍ Ԍ Ԍ %KBԺBԺBԺBԺBԺ %K%Ky$ A~~f~sP,l$f)91Ssѩ`M]M]M]K4K4M]M]M]Ԍ05M]M]M]K4M]M]ԌԌ05dezPc 7DdezPc 7D05050505ԌԌ05Ԍ05Ԍ05ԌԌԌԌ05O~~{ QFOS-Ta YQ'Swa*aaq axR!~a*R Qa* QajaRam!aSaUa  a ajVBraj*ajaGGa-~ (aaya aawa ~m~~z~~~~F ~~N ~~f @~Hl.W"QAH~~\3v%r>BԺ.'l.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l7{.'l.'l7{.'l7{.'l7{.'l7{.'l7{ԌԌԌԌxxxԌxxxx.'lo o .'l.'l.'l7{.'l7{.'l.'l7{o ~~V~Y3[-@DroK4DroDro~~_%x-JM# R ~G@~~~~N~3^!sH~NA4yԌ&)&)&)&)&)&)&)&)&)&)&)~~~A\~4A(LJ|.X\x<ԌԌ~~3~~~~~H~#~|g"~ ~k ~ ~K~~H~~i ~SV*Q'\>HS/T2I&/o fI5tǸtbQ{#UfI5tǸtbQxxxxxxo o o o o xxxxo o o xo o xo o xo xo o o o o o o o o o o o o o .'lo o .'lo o o xxo o o o xo o xo o xo xo o o o o o o o o o o o o o fI5tǸtbQfI5tǸtbQ> Yo > Y> Yo o o o o o o o o o o o o o o > Y> Y> Y> Yo fI5fI5o WA]UWindow.UWindowRootWindowwfG$?s~~i~,~J~~Q ~s`/}/HCW_Psѩ`K4Ef$Ef$Ef$Ef$Ef$նmEf$Ef$K4Ef$Ef$Ef$K4Ef$Ef$K4Ef$Ef$Ef$Ef$Ef$o S/T2Ef$xxxEf$Ef$ԌK4Ef$Ef$Ef$Ef$Ef$Ef$Ef$Ef$K4Ef$Ef$Ef$Ef$Ef$Ef$Ef$K4Ef$xo Ef$Ef$Ef$K4Ef$Ef$Ef$նmEf$K4Ef$Ef$Ef$~~iuW< [N*uzJ M E?z?zz ~ ~~O~J~R~&4_R\x<&)o > Y> Y> Yxo xxxxxo E\]~~sMm"><M EME* ~k~ ~l~(~X~~~~+~\L,z/ec 7D\x<91S05ԌE~\M,R2ndezP\x<91S05ԌE~~p"@~~u*~~/@~~~@~~n4 ~W~@\v4v)Fk[1\x<_4.'l.'l_4.'l.'l_4_4_4_4_4o _4Ԍ_4E~~j~~{~~P~~PaS laaaZ TZTT @ZZ @ ~Z ~~T~]/O+z2 rSM.'lԌy X$o o y X$Ay ~~~~v~(~_~~M~~q~~\@~~^~~p~0\U-\4G {\x<%K%K%K%KԌ~~A~\S-E4K }i\x<%K%K%K%KԌ~\R-a3{ ~4\x< ˏ ˏԌ~~*y]W^My\yHyJyyJM?6' @\?6' @y<?6 ' @?6 ' @yJq ?6' @c?6' @yaf-i yHJyM\ c/N@y&.K4~~p~\V-F5IB[@\x<o > Y o > Y o > YԌ~~x~~t ~~X~~E~~I~~ ~~s~~C~~~~^~~~~IJ$  ~Z ~~r ~~N~~Q~~s ~q @~~NZ3M 4:NM|Mh (? ~L~~E~~M @~]~G~ ~Q~~C~~g @~~h@~~|'~~H ~c~R @~~@~~a ~~a I~A~~R~~~~q~~G ~d~^-uV7VZb*u@ ?h ?h ?h ?h h  ~F@~~~#~~,~io-mC ~[~~@~]~H~~`@~~`~~F~xq/C.MtAqNdxV/sV/V/V/V/~~@~t3PJvAxK4~~p&~~t~\m3H-vyY\x<.'l~~W~~|~~v~0~s~~n ~~~&~\~~T@~]~~v~B ~~w~~P~~k ~~t~~^~~O~~G~~J~~Ga [ z$Ea a p ~EXp a ppa Ep BEEp }Xp ~EX%a pa E ~g~~V @~]~Q~~d ~~T~~K~~~~R~sf/@(~6Usѩ`UU@y&.@y&.UK4UUUUo o @y&.@y&.@y&.U@y&.K4UUo @y&.@y&. K4K4K4K4K4 K4 K4K4K4K4K4 K4 K4K4K4K4K4K4 K4@y&.@y&.N$ A~~mOK?mpHnPh? ~E3~~\-@~]~q~A5v$UZ>Cr.'l~~_@~]~~~f" m~`~ ~a@~]~x~%~Z~~q~%~~y~b~ ~~~J ~B~D~~@~~w~~C ~~l~!~n~!~I~o~!~B~!~~~}~W~P@~~r#o!ao [Hwo *uo Qo 'o u X_-o ~h~~UVV %Vh (? ~x9r.v'UZw7`91SK4K4?{?{A?{?{AK4?{?{?{A?{?{A?{A?{05ԌԌ05ԌԌ?{A?{A?{A?{A?{05ԌԌ05ԌԌ?{A?{A?{A?{AԌ?{K4?{Ԍ?{?{K4?{?{?{A?{05K4?{?{?{A?{K4?{?{?{A?{K4?{?{?{A?{K4?{?{?{A?{?{AO~~~Z~p~~_ ~~y~~A~~z~~Zi~~~~~<~~~~~S'~~~~k~e~~~h!@~~O3~~H~~r~~M~~~k~~~~f~[~H~U~~mV_m FP*K*3 ~`~~h ~~~L~xw/\AV/xV/s~~~~o~B~|~~Q~~}~~~~]3K%]I .'l~~G~~[~#~o ~k~_Wf$( _fY $ yK4qbQyzZ|"~~A"q#:d! ~W~~~ ~~H4r)c2fI5M.'lo S/T2.'l.'l.'l.'l.'l.'l.'l.'l.'lAtY MSystem Console~~_ ~j~~B~k~S~~@ ~B~M ~~^~~Y~~I~~~B ~{~5y 0zD-2-Ay s?&] g?&6z?Ny ] zz6sy g] ,y ] -2( ~q~&b/Rsѩ`&)K4K4K4K4~~J~~A ~}~t~~p~~v~~q ~~P ~~~~~~~~@~D~g@~~v~d~~{~e~~A~~E @~~Q~~O!~~e~~`~~Y~c ~d~~q~~c ~~g@~~q.@~~X~~g~~U~B~\~~G~~G~~L~~V~~e~~C~~V~~~~z~c~W~U~~~D^,$  ~x ~~j~ ~a~~b~~Y~~i'goj"B*gij?6 "?6 "?6"?6"?6 "?6 "m"{*gi?6 BjI ?6 B?6 g?6 "?6"?6"?6 "?6 "m"g*giI ?6 "j?6 "?6 "?6"?6"?6 "?6 "m"z*gij?6 B?6 "K ?6 B?6 H?6"?6"?6 "?6 "m"y*giI ?6 "j?6 B?6 "K ?6 B?6 H?6"?6"?6 "?6 "m"H*gijK ?6 "?6 "?6 "?6"?6"?6 "?6 "m"Z*gi?6 HjK ?6 "I ?6 H?6 X?6 "?6"?6"?6 "?6 "m"X*giI ?6 "jK ?6 "?6 "?6 "?6"?6"?6 "?6 "m"l!*gi?6 Bj?6 BI ?6 H?6 XK ?6 B?6 H?6"?6"?6 "?6 "m ~I~~i~~e ~~j~~I ~~b C 7-d '] ~C \nS] ^ C ] ,C C ] [^ C`wC*L <CC.L 8xCjC CF*C-Q'{^ 7^ C ~~~"~~q~~L ~c~~r~Z~~\ ~^~HN4I"ttǸtH~#t#t#t#t#tbQ#t#t#to S/T2#to S/T2o S/T2bQ bQ #t#t#t#t~~~~~~X#~~N*~~~~~~P ~~y~~|~~a~~i~~c~~o~~{~~^ ~~~~~~r ~~~~~~m *q ~H~&~p~~L~~u~&|4S"HNA4y.'l.'l~~A~~k~b~W ~~~~U~E ~~G ~]~~~R b&u#qf Eu :f$ wM*~Myw~~-Q~~MA~{%( R usq ~U~%~Y~~Y~~d~~w ~~L~~~~D~ \Q4C+w`R<\x<_4_4(jbK4_4ԌE~~K~]x%)E# ~]~~~~j `abcd~@~~p~~B3~~~~g~~V~~X ~~l@~~K ~\^4U*Do٦p\x<_4_4(jbK4_4ԌE~~d~~K ~~X~~S~~~~|~~N_", ~~&~B~v~| ~e~mI~W ~~d~~o~~]~~}~~O~~k~Y/z2[ B| .'lxo xxxxxxxo ~~V ~~b$~~@~~{~~zI~Z~z ~R~~~w @~~[~~{ @~~M~~~w@~~O@~~irrRoz_rja(j ~o~~~J~y ~~A~A/@~~~~\@~~~~c@~~Y~~\ ~~~~~~M~~~~g @~~~~~~~P~H~M~~T@~~[~W~~~t~b ~~S~d~~p~~h~~}~~Hr{9Dr?D V q?D T IwI rrIqqIII 3 ~G @~~zz s6M[wM*M-q-qF-wM-w's-qM-wsEM&EMMP M&P MM<M0xEMP MM?"z LEMP M'MMQ ( ~~c~_Z$N ~)@~ Y5" " " " *"A%~o@ @@~D~m2]^xV/sK4~&z3d_LyzZ&)`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛ `˛ `˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛`˛xxxo `˛ `˛`˛`˛ `˛`˛`˛ Ԍ Ԍ`˛`˛`˛ gS*fE~~\ ~~rx t'9r x %H )u T-~  H   -T-Bw H*w H HU H {x &(e {x &'x %H ~Y ~~@~~~&~I-~~z~~P~~D~o~H y$zB/ -v  -v '-w  C ~v~`~~~~~]~~~~~~\ ~~o~c~~~B ~~~{~~~~@~~H ~~Y ~~n~~@~~~~g~~m ~~~~@4~~a~~~C5i"[\3:ׇxWxW~~w~~~~~~l~~q~~~~S ~~D~~~~D~d~~j~}~~~~~h~{~~~~~~~r~~A~~{~~].@~~w~~~~Z~t~~~~~\~c~~~l ~~^~~~~~~~D~~~~~\~~N ~~~w2@~~r@~~@~~~~l ~~Q ~~K ~~S(~~m~~@ ~~@~~H~~@$~~Q ~~N~~~~C~~S ~~J ~~x~~{~~`'~~Z ~~~u~B~L@~~l~~q"~~} ~~n ~~~~X@~~B~~U~~j ~~y~~~t~~~~~_~~~~~~~~L~~~ ~~~~B~~{v;V r  E-~  u H    q  ~}~~~~g ~~X~~t~~~m~HF/R"\29y X$H~rSrSrSrSrSrSrSrSB| !7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7XB| B| B| !7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7X!7XÓ> YrSrS] ]Yes\ -NoK-OK]]Cancel~xt/w-L z Y3xV/stAqNdtAqNdtAqNdtAqNdtAqNdtAqNdtAqNdz Y3z Y3tAqNd~~@~~~n~~~~LUBiIGvU-THU3U-Q U-Q'jU-y  OU-Jrn*UR*UQ*[UnUnQUURnUQ*nUtF[t']U-i rF*F-irF*r[*UR*UQ*[UnUURnUQ*nQUnUZURFRUQF;wFR*FRQUF[UFRUtFFQ ~~~~~~~[!~~l~~N~~K~~~~~~[#~~~~@~~~~~~J~~~~~~~N ~~T~~R@~~G~~~~T ~~O~~~~~~~~Y@~~]~~m~~] ~~~&~~~~X@~~n~a~~ opqrstuvwx~}~~A~~s~~b~~~~[ ~~L~~~~~~6_-I- R ~n~~~~E~~C@~~~~o~~} ~~f~~i~~~~~~A~~~~c~~ ~~j~~v ~~~~L~r~~~X~~F+@~~J~~u@~~N#~~E @~~~~r~~p~~~B~~~~~{~~~~T ~~~~~~v~~~@~H3~~p ~~~~~~r~~`~~U{; h{ ~e2~~~~_ ~~b~~~~u I~~~~~~[~~d"~~s ~~N~~N~~~R ~~x yDCE~~~N}!J0,NJ\!]! lJ ~H%~c~G~&~~r~r ~~d~~~~a ACMNLPXY^Z_~q ~~GI~~~v ~~B~~] ~~`~~~~~~x~~F~~@~~V~~~~~~Q~~H ~~~~x~~I ~~~ ~~d~~~~r~~~~E!~B~~ ~~W~~R)~~Z ~~D~~~~h ~~V~~~~~~N ~~l ~~\ ~~@~]~a ~~j~~V ~~~~] ~~C ~~R~~P ~~m~~~~o~~f~~F@~~p ~~e ~~~~[ ~~A@~~oY 3HM [FwM *M 3Y V M M Q  ~.@~~I~~@~~q ~~?~~@~]~~~H~~i@~~|~~@~]~y ~~|~~c ~~z'j L" wo*o  j ~~~~~n ~~B@~~A @~~C@~]~C ~~F ~d~z~c~W1J"e J 9$ Y|AkY|A $ prJY|Ap|A $ WrJY|Ap0|A $rJY|ApV|A Q$NrJY|Aps|A $rJY|Ap|A $rJY|Ap@|A $`JY|Ap#p|A K$H`JY|Apop|A $`JY|Apmp|A  ~D5jxe=j-Q j-Q(Mj-y  Pjr[j[jQw[*[R*n*ernjnjRwn*nQ*[*eSnewS*NrSRjSRjRSRQSeSSRH*S[wS*S-iHSSSQwrH*H[ ~y4~~@~~G~w~_ ~~w~~~~K~~~~~~xk/#] ~[ ~~wR%V; {%(-D ' ~H~w~i~~A~~DPR D $  ~y~~I~~S~~~~~~] @~~~~k ~~K~~Nc x^Axf6wz*xzYxe (?k l[x'kl-F'-d [x(-F'-F2xA~CDYLP^'?Y?Cr-iU-m^<r^<^d-S -}YC^^-ma D^<b.LA %5A a  wb*b.bA s-m YC\?D?Y?,~\?K%\Kwb*\kxb\b.b\-}CK&/^@~~L~~~V~~@~A ~~J~~b ~~a~~c ~~@~~~~@~~R@~~Y ~~` ~~FG-+ ~Y~~~~F~~~~O~~D~~D!~~~~~~_~~p ~~u~~F ~~H~~~~s~~I~~H ~~~~B~~~~~~~~q)~~^ ~~~~~~p ~~e~~C~~y@~~~~@~~~~~~f~~P!~~~~~~~~R ~~U~~~~u~~~~b ~~j~~@~~@~~~s ~~~@*~~~~~~F~~T~~e ~~v@~~~~f~&c+h"T S j&) ˆxxo xxx ˏ Ԍ Ԍ ˏb "g~~U3~~v ~~X @@\~\@~~~~n ~~X~~Z~~q@~~c~c~[~~^~~m~~i ~~~~r~c~| ~~~~z~~{)~~t~c~~~k~~A~~| ~~~~~~~~~~b~~O ~c!i,u2o2sВ!7XMh ]Close~~y~c~@~~c,bQiOP*K*G*I*s*3T%-G'-U-b ~^~~_k,o ~p ~c~`u/rm'4@[HwH* w@H@-T@Hw@*@-q-q-w@-w'-q@-w@-v @z@@QH ~]~c~e~~~~{ ~~V)@~~~~@~~A~~D~~{~c~u ~D @~~O~J~~~U~~~{~~~~~~Q@~~h~c~~~q~9~@~~t~~@~~u~~O~c~~~v ~c ~~~_.~~~~~~^~~[(~~\~~~~t4n ~~~~~F@~~C~c~~z~~~~~c~~@~h~~e~~v ~D ~~q~~~~o~~J~U~u~X~~@~~~K~Z~~~~y@@~~w~G~'~~{@~~}~~M~~~q~i~~[Dk hDEGd! ~R~~F~~R x/`( ~B!~U~_ ~~ U5" " ""*"7+~<@~~~Q~~e~~v/~~~~l~~~~~ U5" " ""*pp")~>@~V~~m ~V ~X~~] ~g ~[~~` ~E ~@cx@(c ~j~~s&~~~~~~g~~~~o~~w~~~~y~~l~~c ~h~~~~F~~)~~d&~~Y~~q~~t~~u~~i0~~~~I~~~~g~~`0~~B~~^~~E(~~VK2-m'Ve (%A ~~~~ ~~c~~E ~~~~~~u~~Z~~4~C4N$uJe.'lԌԌ.'l~~U~~@IAYBFoPIK} UmwU PUKUUU  ~E~~O ~~~~W~K~~@ ~~Uk%S zzH-Z zz--?, z FSa?z~KzUSPg ~P~~W~~F ~~~~O~~NX/VB]\ B!*Va?z~?6\ ?6\ ?6 \ ?6 \ ] ~~~V~~I ~~{4~~~~H~~^*~~~~`~~~~b~n#)~^nw^*^-q-qQ-w^-w'-q^-w^ c~^^R ~L~~A@~~~~P%h\g J,wph-T C$phz-F' ~T~~~~a@~~l~~d ~~~~m,~~~B~q~~~~[,~~t~~b~~o ~~S~~U$~~p~~~~~~~~F~~d~~x@~~@~~Q~~D @~~@~~m@~~e~~e1@~]~G@~~I@~~L ~~m@~~h~c ~S~~G~~~~~s ~Nmp<N-d ' ~k@~~Q/@~~h~~~~K~~V~~W@~~x~A~m@~~jQI* tQ ~c!~~NG#Z 3O2NZc!i!* nZ ~K~~iPbicHB~HBY:P@A?,?,jc.y: y?,?,0A A ~L ~~\~~b~~_~~S~~E@~~nj {L.j wL*rLFj j jpj jLjL.L.j  ~^~~~~~E~~J%~~V&~~b~~j~~c~~l~~t~~n@~~p@~~^~H~g~~F%~~VX"A A ~o~~Nr6 ~~~~~R}$(GmF CRQ DqN Do{Dl^Dn ~s~~|$}@ ؁~t zwt D-g!Art}tccat}ttt  * ~g!~~K @~~~@~~HC$]!( ~@~~A@~~\n@n l .n WxJrnF*l Fngl FnFl jnjhnjnjhl  ~~~`~~Q~~j~~I~~~~\!~~$wW 2Ud?%G^-Q-Ss ^Rs `s d|-Q(y.|ry*wyF|Dw|s  {|Y |0'oDwY s o0Y @Y o ~l~~|~~Q+p1 ~x~~aanx a $  ~W~~i~~\#gTD"ghij-k ~~~l~~~~~~]~~|NB `s[ws*@-| =rsNs__asNs^s YNw^*^ssQ * ~Q#~~s ~~V ~~l~~V~~~~@~~Z ~~~~@~~@~~z~~x~~h~~f~~f~~wOr$w-d ( ~@~~H"BQS-B/w.V*.VSw.V*.V@ .w@ *w@ u*@ u'@ .@ l ~m~~G ~~A ~~~~~A$O vs>O [<wO *O vO O Q  ~D ~~u ~~qQ w#>Q [<wQ *Q wQ Q Q  ~s~~w ~~~|~~B ~~A ~~8~~{ @~~NK*T( ~E@~~}@~~k ~~W~~_@~~@ ~~F~~` ~~C~~va"Z ~~~~~~~|~~~~H(@~~~~d~~i ~~g~~]~~w~~I~~~~~~W/~~X~~U~~{*~~c~~I+~~~~`~~N~~_ ~~X ~~~~~~~~b~~~~m(~~h~~i~~j~~k@~~~~Sm2I_omnop ~n~~o@~~p~~~~U+~~s~~t~~~~@T*m' ~k+~~x~~H~~~~~~z~~~~|@~~F~~}@~~y~~I~~~~B@~~C@~~~~E~~~~D~~K~~W~~@~~N~~k~~P~~~~L@~~V"~~~~KFk2Z-v2FQji[j^-QV ?D^i?,V ?Di?,V @TFV WQj ~R@~~Z%~~G%~~~~~~~~~~TvDJa2vojkj8kt_oj\%b[%X{_ {XzXE_X2vXaj\%bat[[}XbaX\m ~b~&~~~FJ#Xf ~~~^~~~~~I/~~c@~~~~Y~~M/~~g@~~H~~_'@~~e3@~~o~~w~~CZEGzE~Z 5EcZZxTzZE& E5cZEZZE ~~~~/j ~f~~R~~q~~v~~|~~_~(~k~~R#~~m1~~T~~W0~~~~~~I0~~@~~A~~~~|~~~~E~~~~x(~~H~~~~~~F~A~C~~J@~~a~~@~~@~~S ~~R/~~S~~~~@~~V~~W~~[ ~~Q~~~~^~~H~~[~~\~~[~~Wd%{#lkg E{ N:g$ gh0ghi W{ghi ~~~O%@~~w ~~@~~b~~~~} [2NTo( ~~~A@~~m~~~~~~k~~v~~~H~y,@~~g~~~~~~r~~~~t~~h4~~~~~~[ xy@. jx ~w~~~~~~~~X%@~~|~~a ~~~~~~~~~s~~D~~E@~~i4~~Cs z/2CFs [<ws *s Hs s Q -v ( ~C~~~M@~~J~~F@~~~~@~~]~~^~~@~~ ~f! ~R~~r ~U  L" " ""*4*"QO~e@ S5" " ""*0004*"|xM~e~Z  ^5" " ""*PPP4*"gH~Zf S5" " ""*```4*"uF~f _5" " ""*@@@4*"8J~f S5" " ""*```4*";kB~Ig S5" " ""*"?~g S5" " ""*"=MD~g~~ \5" " ""*4*",t;~/h~Q0~~hn1^ ~E@~~dq1}u ~f ~~~~j\1g ~jZ1hF ~cloY%vlultlql)nw)*)-q-qllE$6l=,6l=,6l=,ll)5 lj)k)u-w)-w'-q)-wll) @ll) @)-Nl)) @l)) @6)'D?6')6)'D?6')6 )'6 '6 )'6 '6)'%6 )'6)'6)'%6)'%6 )'6)'6)'%f?6 )')?6)'6 )'D)?6)'?6 )')?6)'6 )'D)?6)'6 )'%6 )'%)8"$ lj)k)%)5Tlj)k)lvlu))R[ltlq ~n~w~~~l~t~~o~L%@~~|~s~v@~]~P@~~}~Z~~H~y~g~B~|~}~~~~C/~~f~B~Y~~@~~E@~~A~~~~p.@~~w.~~J~~Z~~O~~e.^ ~~~@~~P@~~V.~~A.~~y-~~S~~~~-~~z-~~~~Y~~c-~~[~~^usq~c wv~M-~~_~~@~~~~d~~e~~~~r@~~h~~i~~~~P@~~z~~~~~~a$@~~u~~q~~S ~~~~C~~t~~z~~x~~k~~~~y~~J ~~@~~{~~~~~~~J~e~T~~w~~p @~~D~~z~~z~~|~~{#x aq9>x [<wx *x ax x Q  ~Q~~`~~~~S@~~MA d_>A [<wA *A dA A Q  ~O*z [W >z [<wz *z [z z Q  ~2~~P~j ~~e~h~~^ ~~O@~ X5" " " " *4*"P!~w@ x@Ky@jy}yy~V~~W~~Y~~W~f~Z~~e~~s#~~u@~~[~e~_~~~~~~n)~~~~f~~e@~~@~~i @~~L~~i~~^~~_D)x~r [ ~O)l o/Bl | x$B >$.-q'-L(k' rQ-q'-L'kp-ue' { ( ~f~~G~~~~y(~~]~e~o~~r(~~q~~R(~~s(~~u~~v~~e(~~r~~jaS~%#w   Sa ~G(@~~~'~~~~~~B5~~pA|I1EoTAWCOmwO TOWOOO  ~C~~_4F)_F-b w* {VuuVw-b(a ~T~~E~~G~~~~d!~~H!~~} ~~F~~p~j ~E~~|3~~~~M'~~Y~~~~S~~U~~K@~~V~~T~~X~~~ S5" " ""*"3Z=~z~[~~g~~]~~~~@~Y  [5" " ""*"֔92~~@~~T@~~e~~~~N ~~~~e~~A!f1Q ~i_1a ~mX1v ~l~~~~qR1i ~~~c~~l~~rG1h_ ~tD1y ~@1~~CA1z ~~~x}0B} ~~~y{0S|  ~zy0I{  ~|v0Jz  ~~~@s0LyK  ~~~y~~~~~Aj0Kx  ~c0g0Pw  ~@~~v0A~U ~~~^0a0wu  ~I[0pr`  ~H~~~~JX0qq(  ~MU0mp  ~L~~~~SR0lo  ~~~TJ0fm8  ~B0D0jk  ~i@~~Q@~~OO0nny  ~PG0gl  ~C~^~~tl%x*( ~@~s~~X~r~H~]~~^~~~~o~~@~~cvEF~c~~T~~~~~~M%~~h~~e~~~~k~&~p~~m~~l~~p@~~@-~~X!~j ~y~~n,~~q~~s,~~~~m~~x~~~~\,~~]~~~~~+~~z+~~~~@ ~~h ~~B ~~X ~~r+u+@ % ~P$~~f+~~_+~~H ~~s~~Q$~~M ~~v~~~~E~~t~~G+~~R~~F ~~N ~~~#~~S ~~T ~~M ~~U ~~G ~~V ~~T@~~O~~W ~~v~~_ ~~U~~m*~~~~c ~~d ~~~~}~~~~Na#wC"wf*wfEwi (?6w=,6w=,6w=,owTESTp d lDd \SV \@\@Kw zw @@%@s-G OdO<?%@DOdO<V DOdO<@%@sV %V s-X -l (116k >6k k 6-l -l F %F l&w@d ?F &@K@S-l ow@K[s w[d ?F &|V @@@%@sF 8 ~R ~c ~M~~D~~@~~|~~^ ~~M@~~m ~~d ~~c~~n~~~~@~~L#@~~t~~~~s dklWXY~@~~L~c ~GkNv H  ~Y#~~P~~K~~~~q&~~ic1| ~-~i~~~~~~B~X~~T"~~~~J!~~W~~]-~~b"~~~~L*~~d~~L~~j!~~S!~&~T!~~U!~~V!~~W!~~t!~~~e~L!~~z,~~r~~]!~~~~Pl _!M7$_!O`!x ~`!~~~~Y!~~a!~~i!~~m'@~~{"~~R ~n!~~U~~~~M!~~@~~@~R~~t~~iPP.b: bk.#1 #?,Ak%kH(k rkG' ~Nu!Q! ;CNQ!j!M!k]AkkkkU P ]k ~~~[~~aU"H$m (aHIJHIH ~~&~no!n mjnn GG $n k{k9jk9 RV*p> j!~k R &j R&V*uErrorsExecCore!~ h +$n %kP^ ( h e$n _kP^ ?b h  ~Ny!ZqZh%H .wH *+ZH ?{?N Q h?,{?Q hH .H + ~O_  ~e ~~UG"} Q i B\%}% (?}D.wD*\o}QDG[O[i i [D.Dci ?{^,?Q \?N ,vw.V*.V-v  w.V*D.V Dr?Dr{ ~@"y"!B* ~ih GBiCK .B: B A A?,?,, ~R {!e!#;lo .r je!:E$  :E:$o .r o yEo  ~nR!1.&:R!S!T!U!V!W!H $rw*wMuMwMuwwMuwMw ~qs!A0t aOwC*{CG-C-oWCGCqAI ~o ~~_$%9#!wC*C%C* ~qH UCw i *w i  i : i  ~~~K#y ` w y  ~h~~B"~&~g u 7 SKu SD?S&?sPS\\D?\&?s\ S\y\ %\ s-G O'?\ ?lO<Od ~5~!J"~  ~h#v#G ~l p!G!G{&XG! T ~O"~~Un#b ,CUb c d wO*OOO-O- ~mKmk 6 ~~~X$nnXiK {nhpEX!h $o.!1 !?,4?,@BAo (~:E:$o&o%l.!1 !?,h?,@BAl (A:E:$l&(l%k.!1 !?,?,@BAk (B:E:$k&k% $l.!1 !?,4?,@BAl (A:E:$l&"l%k.!1 !?,h?,@BAk (B:E:$k&k% $o.!1 !?,4?,@BAo (~ :E:$o&o%n.!1 !?,h?,@BAn (:E:$n&n% $n.!1 !?,4?,@BAn (:E:$n&n%  ~~~o"~~nN"j p.r :k,j Okpy$p zlpy$p npy$p opy$p  ~sE . -E -Es-E ~Y"~~Gu"q!f G/*H ~L ~~x^ ~~~~~]b!xhL6W Db!6W Da!6 W DY!6 W DL!W  ~UQ%U P+UUlmoU]lCC?&b j$kAn $knl $kA?,nl?, V?,?,PC?,T kAS {QW Q ~~~[%b)BT{{]b@{T -c $ ~r!~~\"~~^%\'4Q\W ]|^{]{ ~b'~~W ~~~~r~~zT-T'z ~efghijkl~N&~~C") %KS%\% ~t%e}g~e,5gqee\qegeeg&yq A  y{eg~e=gpppMissing value for property q.eG eE  G egeeg&ze&"gae"&gpppMissing quote for q.G A E e&g&ueg&&{u {u,pppMissing comma after close quote for q.G eeg,zg~e,SgE eezE egeeg&A G E A   ~\~~Nt&w wh (?owA\w v w ?,owF>\w 6w=,6w=,6w=,\t?%t\!\t?,t?,\!t?%twj-CXwt?&v \w v6w=,:6w6w=,:6w6w=,:6wwt?&v F.-d  -J-v(6x>6xx6-v-v-vwt\?&v | ~l x&~&( ~g ]  ] i (?6] =,6] =,6] =,o] TESTD!~lD~-G O'?\ ?lXS]\rXrKw k-G kOdO<?%rDOdO<]DOdO<e %e l[] @~?le &r&Kr]rr%rs&e r ~P'~~~)~~g~~x!~~~~I~ L" " ""*"ҍ~~w"s"J^[<D.\DI?N Q /D ~d'}%ND??,DD??,L ~z!}/Fp+wC* w}CC%@r}*C*wC}{}G-}-o C$C}wC*C!!C ~xz"Oo0AT-} (CEO 5:C$-}(R O:C$-o(R  ~~~ue'X m-J-} -}.-C-C(h-HeX ,0 X ,95=X X ,  X ,5=X  ~!~~l'hL0.-J-C^Ea ~~~gF(q \gq -mw.xww*\wwq wIw.w*w.q *.q I ~~~T#}'_0 />%zF>&& >^>%{F>&& >/x6-v'' ~@#u'cL 5 >%(>x6-v'' ~V#{E$WD??,0U,,& ~I#}>}I'}Il} ~N|!t "BNt @a K ]?,?,,h $o?,4o?,l?,hl?,k?,k?, I$l?,4l?,k?,hk?, $o?,4o?,n?,hn?, $n?,4n?,  ~V]F#)X ~~~uE#H#A.r H ~~~w(L~.sL ~v(~~IF"*O QO-G O'?\ ?lO-[ O<Od ~~~N[x: jx ~@~~mXjNm^. : ?, @A^-i' ~~~D"~~Y~~O#&)X-d '8wL*)rL* L}L xLQ ~p(N(a_ M>}F(dpF>F>&Fd $' ~Ig(^*{ -rY*pClient Area is None for V ^gY?6^Y?6^?6 ^Y?6 ^YY]?6 ^?6 ^ ~q+v{e#OvM{vMwO*.tOYP 7v ~_U#B$A NfB{m-` -2?DBn?D{lu-` (G T-- -` N $ $G N- $ $G J- $ $G o- $ *$G R- -]-2G NP Q ]?DcDB?D~D{?DP ?DQ -](P-T-2G RQ ]?D~D{?DQ X-T(-R-2G JQ ]?DcDB?D~D{?DQ -R(N-Q-2G oP ]?DcDB?DP V-Q(-J-2G o]?DcDB-J(-I-2G JP ]?DcDB?D~D{?DP '-I(l-F-2G R]?D~D{t-F(-U-2G N]?DcDB?D~D{-U( ~]#~~s~~[ q(c:# ec ~~~yZ#ey?W fe ~F ~~Z"\ yrJ\6a sD\ 6u sDW 6GsDU 6zsDT 6msS s ~ID#*E+IK ]?,?,, ~Xm)KN?XKSIaK.pI ~K"f e9W ff  ~d#E)sf}G ~[)JX.,-J {F>}F-C' ~c#U)9aHF ~`)b_=#-J-b ~e#dB>FdGe4>}F>}F $ ~~~w#g#Wa C$ ~Gp)yhGf a [~a [  ~n i#k#3"~ ~l#~~~~j#~', ?]HCC<]CC ?,?, ?,?, ~L"_D |-G -_Y-_O. : ?, @AO-i'zzwO*OO* ~~~Pc)nm KP{e Se I-O w^*E a^$ ~~~cY! ~@ ~r~v!\q  ^\ ~mFOm-J'-}(-o(F ,>%tx6 ~~~Vt#Z+A6}.cZ@WXUrCc ~b~~p*~~^#m z~\6M 6a m 6M 6u m 6 M 6Gm 6 M 6zm M  ~Lv_g{NGvw [Lww *w _vw w Q ~~~n SCc+C SSSq  ~s~c~NI$O $A{]O jO h (?O nP]6O =,6O =,6O =, ~|#~~}#L$u,!wC *C -Q'C *( ~_#I CK0BK CI  ~P"~~h${}ZEj{$( ~vD$},_ v}~-` ' ~mSnP ~Gn+na%nn.lwn*PwnI*nIan.n ~zyR yzyyE ~UF$n UnG H on]see?&Pe?,b d$ $ns?, $ns  ~t*~~lR$;L%w.V*.V;Jw.V*.V; ~~~~~N\+D R zD  ~WS$o#| X Eo U:X $%C|%{?|R{?& :X $'|%{?|{?& :X $$Q :X $#W  WoA B  ~e+~~~~~W~aY$p$] lap~b-C-2pkAS W QQ-bj-C( ~u$~~M~~qm$w0 #qwx!-b $ ~Mg,l[nl.lwl*PwlI*lI[l.l ~l B${QLl {sqye{?,Ay ~5V$F 5F{NFT FT S -C' FT  Fk|%{?|{?&FT S FkA|%{?|{?& ~j$~~kd$` *|X%LPX&wL* .L{  .  ~iP_U.]: ]?, d. : ?, @Ad-i'b.%: %?, @Ab-i'b-q(-rCi ~N\$] &N] vm* ~cK$K:pcK0wC*0rKCu _w.V*_r.VrK n-Q ~z3kC* ~W^$f #)9=Cf ,&Xr=*r==.Pq=.=Kr=*=.Pz=G-=.=Kr=*=.P r=u*/=C=7 ,(Gr=*=.`=.=r=*=.z=G-=.=r=*=.r=u*/=C=7 ,%dw.V*.Vr/*.VrC.Vw.V*.Vq#f OM7 ,'w=*w=u*C*/==uC.=uuw.V*.Vr/*.Vr#f OMw.V*.Vq#f OM7 4, w=u*C*/=11wC*{CG-C-oWCGC7  ~p~~M"~~~~ ~~D,fP z 2oRgrR*X.BU: BrPXXA%X.BU8: BRRrRM XXARA&RXXM *XE!oXefX ~b Y,g b ghi-` ( ~x`$ioR_i,A i,`N.wN*i:NU/NwN*{NG-N-oWNGNN.N3 ~Sf$zT Cnp_ qn {C[zC`S R :R %6z$6z$6z=,6z=,6z=,6z=,p@B-D:R % _ @_ S @ n Bn Bw-DG M-D-2-` =-` ppClicked URL: >>`<<|`,http://E&pstart `,|`,ftp://E&pstart `e|`, telnet://E&pstart `|`, gopher://E&pstart `|`,www.E&pstart http://`|`,ftp.E&pstart ftp://`::|`, unreal://}`6z=,6z$6z$-` -` (:R %Xz_ n ?&S ? vz_ n `_ S ! ~C0X$-Li(-(-L(-m (-(iw*-Q(q!~-( ~~~Ne$nFRRBenFF?|B-q*n----?6L ?6L ?6 L ?6 L B ~q$Kl} p.Kq.KKK.rpK-`KpzrK*Kq\K\. ~N["Dq_ {]DjDnP]6D=,6D=,6D=,R w*DkVA?6 R ?6R ?6R ?6 R ?6 R eDT V?,S  A ~F~~_A+N%X  $ ~N~~gosp bj.^wj*Bzjrojj.j* ~k$s$p/ ~t$~~K-~B~@~~NU l F\-L*l?6V?6V?6 V?6 VU D-l*l?6 V?,?6 V?,?6 V?6 V?6V?6V?6 V?6 VU D*l?6 V?6 V?6V?6V?6 V?6 VU  ~r$x$m ~~B~w$z$ ~~~p$~~uRqdq1-R -y -Q Ob-R-y -Q P-y -R ~CUo x_L . 8 L rL FUL h!RL  ~M@~~[$J[W.LwW*grWF*W-Q-KWJWW.W-d ( ~A%~~B%~~~~`-D%] ~~~C%s-Y ~k~~V ~~M ~~O.qZaMBMJq`,`,|Jq`,`,6Xq`|`|66gX=Jq`,`,66gX=Jq`,`,66gX=Jq`,`,66DX=Jq`,`,66DX=Jq`,`,66DX=Jq`,`,-6wXzq`&T-6DXzq`&T-6AXzq`&T-6oXzq`&T-6}Xzq`&T-6|Xzq`&T-6yXzq`&TM ~l ~~i ~j@~~R~~W%~~J ~~g.MiZaJ .M {FJ QJ FaYrp*pJ J  ~]"f]:ifD|%Ri?|i?DR?|^iQiQxiW iW i ~W'~~g$Qii+ l.wl*]Q/l{lG-l-oWlGl ]l.l ~~~~~5S.a`5a`a?D?,D ?, `?, -~'.7  -K '  ~~~Z ~~qV%M0%i1qMO.7  -K ( ~r"~~`"U%9"N{ ~_Y%^$,Y^?D?,D ?, H?, G B mG T-~-2^?&? ?& ?&-~(.7  -K ( ~z{g [ ~mQW#mA?,S @ ~G X ~a%H{KE<HP-PH:HP ~b%IBCI 0% 1& "2, +3, 44, =5, F6, O7, X8, a9, jA, sB, |C, D, E, F, % ~K/O6NBzO&#OO&6_ =:$BO%&BO&&6_ =:$BO,&BO,&6_ =:$BO,&BO,&_  ~c m. ?A+c @AG T ~Fo$g/Z   $ ~\ ~~g% 3~f& 2~v|.G,MnvGH-r ' ~it iTwr*P.H:rBBjP-i'[P*d.H:[j^. : ?, @A^-i'^`.%: %?, @A`-i'`x.Z: Z?, ?, @A@Ax-i'xx-L' ~Ni%o 1m"wP*eP-eN dOHdxoN N HeHed]N H-q He-t N l-t HdxBH-eH-e-q H-e-q ^^^-^--t xx-x-x-ex-xU ^-ex^e^#'H^ AHx^^</-t ```-e`--q `-``#'N ` AR``Wd`Wd^<wP*PPePP]PNoce ~RE  IRp*z.0: 0--?, aKz-i'E .d: d?, A@AF .c: c?,  A@A ~s%~~l\/P2sf oLS   LS >>LS <<LS &&oPS RS ~@~~tp%t  ~|/~~~~T e"OV OP ~c"~~z#Raq=}~RiQ5}}i  ~yP/V{%(-H ' ~Dj/R&D.7  Y ~yr%as0a^ ~~~lw%}0l-} ~}%NMSl-B -N ~D~~[~~UA&T MB,UTKL LT ~~~kJ'do# DdC $D S$Pw*"$*FE:D $w*"$*FE:D $w*"$*FE:D w*"$*FE:D }$D $x8odCcz F-utC-LXa-Ae"$*FE:Dz $w*Mz $w*"$*FE:Dz $w*"$*FE:Dz G$Dw*"$*FE:Dz ww*"$*FE:Dz $d $FFWc $EEWc ' ~C&DrAtlF D ~N@&LF, JLNLGH ~T0~~H&B<'l B ~kW K}W ?% &W pd KW WHK&{W Wd?&x?{K ~@~~K{/rW KrD C.D wC*'rCD rCFD CaCg C C[B Cjl{B UB A B>{A zCaCapCaA Cg pCg SC }A HBC brC B C.C  ~@Z&{]%{,-x (( ~J&E&97l9 ~i~~K&2l ~L&}|-kl y} ~P&{G(l G-{ ~I&~~~%~~f0?9&WgWg77WpWp-jpgk-O-jh-O-j-jWEWg?,SpdgPd?,Spdg8Ps Ps PE?,SE?,SPEES ~[ Q&f"![ fl f ~R&wLbl-L-w ~U&uHl-H-u ~~~~~mU T& wml.,: ,lJl-x'U ?,|} ~}~~adE9 d ~j[&r6'-C(j ~5~0Sy 5Sn-j YSEd?&X6? SEPd?&X6? SESEPeSE-T '   ~H_&w`Iw,-x '-x i.wi*w:iMtw1*1%1i1!!1-x ('i.i6( ~t^&kN0&tklJ ~bY&]&) e -T  -` (-] (a-2pjh-` jE-] jEP-2 X?%X6-` d?&X6=3-2 X?%X6-] d?&X6=c-2-`  -] X ~` ~~Oc&p(A&$-x -d JO ~[1F1;  ~~~sk"f$/--( $-} (s-f ~fXJ^;LXQxvL  pxv_ .&L wL  w_ *_ -pL @xve^_ Ne^_ * ~ca&i:l%H--( $;wJ*J :iFci ~~~W&bQ C8@ .r : rBBBB@ $rbTKp][L.| wL*L C@  C@ @  ~l& 1~@~~i&~~Q1~~&~~V{&h + 6h =,6h =,6h =,.Dsi.Dwk*Q.Diwkyh  ~ 0~y2~~i^ *6i-~ 'x?,tAg  ~Nn&@!2de@!x@d ~j"~~r&~~d~~}~~5|&\ 5\] $  ~~~w&~~R~~^!j%WMPWX ~u&~~5p1xJY5x`W-e xxxx?,-m'  ~5k2ct }.w}*c}s&c}s}ww1*1%r1}1*| }1}1!!1 }.}w1*1%1*!1 ~vI'y&,  $ ~`2DIQ7wh e{h Uh FGIbDE2DFmmwmHGEh Iw ~n"~~M~~_2 4~c2 6~X x2Rh`X | * ~P~~~~F' 8~A' 7~udT @, wTuTlo ~T~~Wx"Q#AN\-} 'fEQ 5:f$-}'Z O:f$-o'Z a:f$Z :f$ -J-^ {FB.vx 5 vBPFBx $Z :f$-J $Z :f$-J $Z X:f$'M-JG-}bMd-C(Z :f$%-J-}_c-C(Z :f$&-J-^ -C(wB*wB*B.vBBPFZ :f$(-J-^ -C(wB*wBK*B.vBKBPFZ :f$$-Jf-C(Z :f$#-JF-C(Z $:f$-J-C`-C(Z _:f$.T-JN-CTa-C(Z n:f$ :f$n-L5=.Z -}Qc QCcQv QVhQx QXlWBwJ*J#QghWWQghZ ~d3cm] 1-w*"$*FE:c' ~D'~~C~~L'~~U7~N'Qg  UQ ~~~v"O&*-b'(w*d ~NV'U 9+oU R.)wR*U % (?oU QR{Y rR-v+U RY ?b?Y ?b`A +U RT?Y ?b`ATTY ?bR.R$ ~T'~~W ~ c3" " ""*@@":A~@~n i3P3,e.vwe*Zwe}*e}3PQe.en PQ ~~~E' 9 c3" " ""*TT"}t~@~kx'C 7o!4 rLPL6 +%6+6g+` 6D+~-6w+-v-6D+(-6A+(-6o+(-6}+(-6|+(-6y+(+.LP_o+g ~C \nAg C ppC g 
C g ,g ~C \no C .{o Uo hx~~x @P{p.hbkp.h..b[o.b_+o+bk.b[o.b_+ BRbkp.h..b[o.b_+o+ BODY\-xBGCOLOR={\~6\6D+~6Do~\-xLINK=={\a6\\-xALINK=s{\_6\\-xTEXT={\` 6\6g+` .p.h XCENTER={p.hbkp.h..b[o.b_+-6w+'o+ /CENTERbkp.h..b[o.b_+-6w+(o+ XH1={p.hbkp.h..b[o.b_+-6}+'o+ /H1bkp.h..b[o.b_+-6}+(o+ jFONT.pp.hx\-xCOLOR=*{\6g+6\\-xBGCOLOR=g{\6D+6\ /FONT.pp.hx6g+` 6D+~ B.pp.hx-6|+' /B.pp.hx-6|+( >U.pp.hx-6A+' n/U.pp.hx-6A+( A.pp.hx-6D+'6+-xHREF= /A.pp.hx-6D+(6+ )NOBR.pp.hx-6o+' \/NOBR.pp.hx-6o+( BLINK.pp.hx-6y+' /BLINK.pp.hx-6y+( .p.ho ~Tbk..b[o.b_+b  T5" " " " *J"[d~H @ ~~ T5" " " " *A"p}hg~@  P5" " " " *"%i~@                  ~N~~\'~ P5" " " " *"9on~Y@                  ~~~B#] %CAD??,D??, ~|"l@8-J5-CE QF-C(>c  V5" " " " *H"w~E@ ~R3~~Ewbh2oEI@?,6f @o?,6f 6f na+[na f gwan-ZD?6 ' @D?6 ' @Dw?6' @Dw?6' @' ~A4jU I)NZjNT'N ~~~p'c-+-C -JE QF ~~~~~B% `~~r'n'FW.>}Fx6-v'' ~~~t'q'f(>%x6-v'' ~~~w's'b2>}F{F>& >d>}FzF>& >2x6-v'' ~~~~"k'A . ~A#}"d ;>}F(>x6-v'' ~nD([ EV-r (F%F}[ q [ F&Hzq >-r (]zq <-r 'zzq   -r Fz[ F& FL[ F[ [ F ~X' 10~ynHFon $ ~c$~~"~~~~o4~~]~~fB(]N8].U]4w]*w]j*WLb~]j.wW*W=]j<]jB]j]j*] $ $2-W-Y Q-D '-2' J~'( ~qO4@0+4"-O-d-d $q@y ~aI(Y$taYP -D -2T LYP -W wT j wT * wj*j.P JT =jT Kj' $JP -YwJYP *-D (-D ( ~~~\m4sD,Ft .u [GIsu jt Ju jT%U%ft .u [>{J {fzfEJfIIsft T%IU;U}fIfT ~C(~~sC#t{v.mwv*QwvI*vI'v.vs-t ~K~~~~L(vR/-wI* wv*I Nv ~iE5I Bo{M6ZT f36QT%6UT%6LTR$6Zh ['6Qh ,6Uh ,6Lh R$6ZN ]'6QN,6UN,6LNR$6ZM w36QM, 6UM&6LMR$6ZB {36QB , 6UB , 6LB R$6ZN 36QN , 6UN , 6LN R$6ZJ ^'6QJ,6UJ,6LJR$6ZR n36QR,6UR,6LRR$6Zo a'6Qo,6Uo,6LoR$6ZI f'6Qo,6Uo, 6LoR$~ D~P~~*~3~GT ~J(rgV rT o:-CD proED [}wD [[RD n[D V G T FGV FT [plh[$lh ~M(sN YJ. <JBJsj*s $ $ ~tO(pNK7tpq5rLpqjRj ~d~~5P(m X5meJmeV-W-Y-D ' Je ~W(MJ #kLMNBk ~K(J bIR-R6L[G6J =,6J =,6J =,J -'J JV @?6Q[GT @?6U[GJ 6Z[G? ~Q ~~T(~~~~Q(V(WIE-C[pfc[0fc-C('( ~f~~X(kB igwk* wjk8wj*j-N(jk_wj*j-N' $ ~\(`E R a)'?L?DZ?rj* l%`w`*wr`j`>l``Za K?l ~U(Z(pvIE-C[p_\[_\-C('( ~_~~]~@~_(]La-(]?% ]*wp%ww*?pa<yw>pww:]$] ww* w>^]^]Z.@w]]Zww* ~Y(Q0 -C( ~]([ -C'w[*[[ ~In(*T7NIa?, aa]@A ~V^(a(!y  ~~~u`(c(A`' ~~~b(w O*.D~ 5 Dw  ~P#~~d(yP6r~ \y4wr*r. ~5M#s@MrHfsn5snm:H:$nsln-` '  p-H $-]'  $-R'  $-I'  $-U'  $-T'  1$-F'  O$-Q'  m$-J'   ~ae ~G f(X"9oX )$&`itu N K$H]itu N G Xv tui ~{'~~`~~I ~~l(~~Nz(f>rq%qwr*?qa<Zr>qrrI I  wr*r>+frI ?, ZI I Zrr| ~Hi(w`)cd.D~wd*fwd(d`wvu'd.Dd( ~t(k(`6 b >%(`pF>&F>>F`V-B -'^ $' ~S#ae5 za ~w~~d~~A)r5owppF>:rF>=}wF (>Fwc-B -'k $' ~@o(s]7f.D~wf*fwf(f]sqo'f.Df( ~~~L)UZ k rU*kVWY.iUVYI.A:Wz?6 U6 Sz?6 U6 S xYIxY'wYpYI||w.p*a.pI.pIq Y ~h~~f~~~(D5$D ~u(MC .wH*HY,RX ~I{(*K 3 ~|(An PQ!wf As A@A6'%6'%6 'D6 'DM* ~YQ)RI/YRFR ~}(Mj#@?,%?.UWindowFonts.Tahoma20 &?.UWindowFonts.TahomaB20 ,?.UWindowFonts.Tahoma30 ,?.UWindowFonts.TahomaB30 %?.UWindowFonts.Tahoma10 &?.UWindowFonts.TahomaB10 ,?.UWindowFonts.Tahoma20 ,?.UWindowFonts.TahomaB20  ~(k!H |'{k!bRc ~J){^wE:{ %8{ }{5={{ &{  ~{ @)' ~B)r G '*RFr REn ~~~@~~C)z%(-y'Z[ ~F)^(]bRbRbR &exit ~bG)P)0)7*-yZ>^ZPbP ~uWK) (p-2W-l ~} b#W k/"wJ*J  W-} W ~X)~~`#LkUch.ULhI.A:Jz?6 U6 Sz?6 U6 S FhIxhwhphI[[w.p*a.pI.pIq h ~w~~zW#k Sk pk  ~c#@w**-~ (O*-u(X ~G N)J"<::J:$  uG Jhi^_ ~UW)M) Aa)'?L?DZIFwj*HLwxrHj{HTIHT{IttI $  ~K~~isRs%i ~S)j G.Rp Ca%D..9 wD**ij QDrBADyBDpA?&DqDA%aD.DBt .9 p'p CN%g *@*D..9 3wD*NsD{g Dr@*@DD{p D{Dy?,-@'p DyND.D`{s% wg *"g y?,p s-Fsa& wt * wt @+t {t y?,s -F(.9 E -Os%.9 F -O-@~& ~@~~O@~~RZB7Ra. : ?, @A ~Y)~~~~h(U$ ~f#L=>%FG-C(3-B -'; $ ~5I)]) ][-O/W-lW[Wt W_ ~^)~~~~T)gDds%@*~&-k '-k  ~, -k (F%zF~FMFc%FCL..9 wL**igQLr{ |Ly{ Lp|e%F&TF~JFMeMeFFeM{ ~-k 'eM{ ecLAeL.L~.9 p~&L..9 wL*LyLAM?LAcL.L"F%F~FMFL..9 wL*L{LAMm-n Lq?LA~&~A?~LpLq?LALpLAMLyL.L ~u#`G+s-^ -`K-^  rx*x* vxQB*qq-^  wx*x*B* ~cb)B:EkcBi-QwB  wB wB n ~d)@n ~X o Rg X {e S ~e)}G:3n"}E}E  ~Vf)R+5J?KR^Ndb.wErGw ~s)Kq0T PK ~O\)h), ~u)~~qP)vIq C$ ~_)pF2%.9 -Z Dp0Gp ~B ~~Nj)aor m cMr -b -b Q-b Mr ?cMr >p %mp ~r%J..9 cwJ*rsrGGJAp +aJJ{JqJyJpJ-d-b J.Jp j ~Rv*] DnHR]\[HL .wL *gL IL .L D ~o)~~J~~]aT]-'-@'-w'a [ ~C ~k)~~sm#o#3*Y' Rt ~NB*nY-qnB %X.+wX*Y-Q?B Y<+nX?[?L?]?B Y<?,[Y?]+nX?[?L]B ?,[?]B X.X+ ~5l)EAh5Ej~%B..9 fwB*b~s~JJEB{&EB{ByM~&@jBq&jBqBp0.9 -Z -O'c B .9 \B'B.B> ~~~cg)} : c} W-lw}  Ww}  W_(w}   W_W ~m ~~uz) mP ~_t)g$|r-O-23gc {sogc {c y s%sz-O( ~G*~~~~T y){V5{P!L%L..9 wL*bLsL{L{&{L{LyL^L.L> ~t~~~~w)~~})~~|)a+-ori .9 pFha'r@i _^[Z.i r-XFha(r@i _^[Z.i r-X ~UE*J zJ% (?JFnfA?[d?,t Pt HA-?]H?L,Y<?]t ?L,} .w} *oJQ} EtCgtAFFtA} .}  Fjn@nfkninit HYY'?t ?HY-?[Y?[Y-Y?,LYnLjk ~~~C*~~5F*D*  ~qH*J0G5|?% | wG*GGqJ| ~P*~~a]*Y$MkaYn 3n Y ?Sn ?%Y JYn H ~WA*J*x5 N!a?~ ~N!~~K'~~~~S*~~x#~~e&Q*[QƎ ~~~Y*~r~yKr cXqK.y YnSOyP|  JQ% ~~~y#~~5x)G 5G-Ok .jGk vk %k .j_P&.j uk  ~w//============================================================================= // WindowConsole - console replacer to implement UWindow UI System //============================================================================= class WindowConsole extends Console; var UWindowRootWindow Root; var() config string RootWindow; var float OldClipX; var float OldClipY; var bool bCreatedRoot; var float MouseX; var float MouseY; var class ConsoleClass; var config float MouseScale; var config bool ShowDesktop; var config bool bShowConsole; var bool bBlackout; var bool bUWindowType; var bool bUWindowActive; var bool bQuickKeyEnable; var bool bLocked; var bool bLevelChange; var string OldLevel; var globalconfig byte ConsoleKey; var config EInputKey UWindowKey; var UWindowConsoleWindow ConsoleWindow; function ResetUWindow() { if(Root != None) Root.Close(); Root = None; bCreatedRoot = False; ConsoleWindow = None; bShowConsole = False; CloseUWindow(); } event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local byte k; k = Key; switch(Action) { case IST_Press: switch(k) { case EInputKey.IK_Escape: if (bLocked) return true; bQuickKeyEnable = False; LaunchUWindow(); return true; case ConsoleKey: if (bLocked) return true; bQuickKeyEnable = True; LaunchUWindow(); if(!bShowConsole) ShowConsole(); return true; } break; } return False; //!! because of ConsoleKey //!! return Super.KeyEvent(Key, Action, Delta); } function ShowConsole() { bShowConsole = true; if(bCreatedRoot) ConsoleWindow.ShowWindow(); } function HideConsole() { ConsoleLines = 0; bShowConsole = false; if (ConsoleWindow != None) ConsoleWindow.HideWindow(); } event Tick( float Delta ) { Super.Tick(Delta); if(bLevelChange && Root != None && string(Viewport.Actor.Level) != OldLevel) { OldLevel = string(Viewport.Actor.Level); // if this is Entry, we could be falling through to another level... if(Viewport.Actor.Level != Viewport.Actor.GetEntryLevel()) bLevelChange = False; Root.NotifyAfterLevelChange(); } } state UWindow { event Tick( float Delta ) { Global.Tick(Delta); if(Root != None) Root.DoTick(Delta); } event PostRender( canvas Canvas ) { if( bTimeDemo ) { TimeDemoCalc(); TimeDemoRender( Canvas ); } if(Root != None) Root.bUWindowActive = True; RenderUWindow( Canvas ); } event bool KeyType( EInputKey Key ) { if (Root != None) Root.WindowEvent(WM_KeyType, None, MouseX, MouseY, Key); return True; } event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { local byte k; k = Key; switch (Action) { case IST_Release: switch (k) { case EInputKey.IK_LeftMouse: if(Root != None) Root.WindowEvent(WM_LMouseUp, None, MouseX, MouseY, k); break; case EInputKey.IK_RightMouse: if(Root != None) Root.WindowEvent(WM_RMouseUp, None, MouseX, MouseY, k); break; case EInputKey.IK_MiddleMouse: if(Root != None) Root.WindowEvent(WM_MMouseUp, None, MouseX, MouseY, k); break; default: if(Root != None) Root.WindowEvent(WM_KeyUp, None, MouseX, MouseY, k); break; } break; case IST_Press: switch (k) { case EInputKey.IK_F9: // Screenshot return Global.KeyEvent(Key, Action, Delta); break; case ConsoleKey: if (bShowConsole) { HideConsole(); if(bQuickKeyEnable) CloseUWindow(); } else { if(Root.bAllowConsole) ShowConsole(); else Root.WindowEvent(WM_KeyDown, None, MouseX, MouseY, k); } break; case EInputKey.IK_Escape: if(Root != None) Root.CloseActiveWindow(); break; case EInputKey.IK_LeftMouse: if(Root != None) Root.WindowEvent(WM_LMouseDown, None, MouseX, MouseY, k); break; case EInputKey.IK_RightMouse: if(Root != None) Root.WindowEvent(WM_RMouseDown, None, MouseX, MouseY, k); break; case EInputKey.IK_MiddleMouse: if(Root != None) Root.WindowEvent(WM_MMouseDown, None, MouseX, MouseY, k); break; default: if(Root != None) Root.WindowEvent(WM_KeyDown, None, MouseX, MouseY, k); break; } break; case IST_Axis: switch (Key) { case IK_MouseX: MouseX = MouseX + (MouseScale * Delta); break; case IK_MouseY: MouseY = MouseY - (MouseScale * Delta); break; } default: break; } return true; } Begin: } function ToggleUWindow() { } function LaunchUWindow() { local int i; Viewport.bSuspendPrecaching = True; bUWindowActive = !bQuickKeyEnable; Viewport.bShowWindowsMouse = True; if(bQuickKeyEnable) bNoDrawWorld = False; else { if(Viewport.Actor.Level.NetMode == NM_Standalone) Viewport.Actor.SetPause( True ); bNoDrawWorld = ShowDesktop; } if(Root != None) Root.bWindowVisible = True; GotoState('UWindow'); } function CloseUWindow() { if(!bQuickKeyEnable) Viewport.Actor.SetPause( False ); bNoDrawWorld = False; bQuickKeyEnable = False; bUWindowActive = False; Viewport.bShowWindowsMouse = False; if(Root != None) Root.bWindowVisible = False; GotoState(''); Viewport.bSuspendPrecaching = False; } function CreateRootWindow(Canvas Canvas) { local int i; if(Canvas != None) { OldClipX = Canvas.ClipX; OldClipY = Canvas.ClipY; } else { OldClipX = 0; OldClipY = 0; } Log("Creating root window: "$RootWindow); Root = New(None) class(DynamicLoadObject(RootWindow, class'Class')); Root.BeginPlay(); Root.WinTop = 0; Root.WinLeft = 0; if(Canvas != None) { Root.WinWidth = Canvas.ClipX / Root.GUIScale; Root.WinHeight = Canvas.ClipY / Root.GUIScale; Root.RealWidth = Canvas.ClipX; Root.RealHeight = Canvas.ClipY; } else { Root.WinWidth = 0; Root.WinHeight = 0; Root.RealWidth = 0; Root.RealHeight = 0; } Root.ClippingRegion.X = 0; Root.ClippingRegion.Y = 0; Root.ClippingRegion.W = Root.WinWidth; Root.ClippingRegion.H = Root.WinHeight; Root.Console = Self; Root.bUWindowActive = bUWindowActive; Root.Created(); bCreatedRoot = True; // Create the console window. ConsoleWindow = UWindowConsoleWindow(Root.CreateWindow(ConsoleClass, 100, 100, 200, 200)); if(!bShowConsole) HideConsole(); UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(" "); for (I=0; I<4; I++) UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(MsgText[I]); } function RenderUWindow( canvas Canvas ) { local UWindowWindow NewFocusWindow; Canvas.bNoSmooth = True; Canvas.Z = 1; Canvas.Style = 1; Canvas.DrawColor.r = 255; Canvas.DrawColor.g = 255; Canvas.DrawColor.b = 255; if(Viewport.bWindowsMouseAvailable && Root != None) { MouseX = Viewport.WindowsMouseX/Root.GUIScale; MouseY = Viewport.WindowsMouseY/Root.GUIScale; } if(!bCreatedRoot) CreateRootWindow(Canvas); Root.bWindowVisible = True; Root.bUWindowActive = bUWindowActive; Root.bQuickKeyEnable = bQuickKeyEnable; if(Canvas.ClipX != OldClipX || Canvas.ClipY != OldClipY) { OldClipX = Canvas.ClipX; OldClipY = Canvas.ClipY; Root.WinTop = 0; Root.WinLeft = 0; Root.WinWidth = Canvas.ClipX / Root.GUIScale; Root.WinHeight = Canvas.ClipY / Root.GUIScale; Root.RealWidth = Canvas.ClipX; Root.RealHeight = Canvas.ClipY; Root.ClippingRegion.X = 0; Root.ClippingRegion.Y = 0; Root.ClippingRegion.W = Root.WinWidth; Root.ClippingRegion.H = Root.WinHeight; Root.Resized(); } if(MouseX > Root.WinWidth) MouseX = Root.WinWidth; if(MouseY > Root.WinHeight) MouseY = Root.WinHeight; if(MouseX < 0) MouseX = 0; if(MouseY < 0) MouseY = 0; // Check for keyboard focus NewFocusWindow = Root.CheckKeyFocusWindow(); if(NewFocusWindow != Root.KeyFocusWindow) { Root.KeyFocusWindow.KeyFocusExit(); Root.KeyFocusWindow = NewFocusWindow; Root.KeyFocusWindow.KeyFocusEnter(); } Root.MoveMouse(MouseX, MouseY); Root.WindowEvent(WM_Paint, Canvas, MouseX, MouseY, 0); if(bUWindowActive || bQuickKeyEnable) Root.DrawMouse(Canvas); } event Message( PlayerReplicationInfo PRI, coerce string Msg, name N ) { local string OutText; Super.Message( PRI, Msg, N ); if ( Viewport.Actor == None ) return; if( Msg!="" ) { if (( MsgType[TopLine] == 'Say' ) || ( MsgType[TopLine] == 'TeamSay' )) OutText = MsgPlayer[TopLine].PlayerName$": "$MsgText[TopLine]; else OutText = MsgText[TopLine]; if (ConsoleWindow != None) UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(OutText); } } event AddString( coerce string Msg ) { Super.AddString( Msg ); if( Msg!="" ) { if (ConsoleWindow != None) UWindowConsoleClientWindow(ConsoleWindow.ClientArea).TextArea.AddText(Msg); } } function UpdateHistory() { // Update history buffer. History[HistoryCur++ % MaxHistory] = TypedStr; if( HistoryCur > HistoryBot ) HistoryBot++; if( HistoryCur - HistoryTop >= MaxHistory ) HistoryTop = HistoryCur - MaxHistory + 1; } function HistoryUp() { if( HistoryCur > HistoryTop ) { History[HistoryCur % MaxHistory] = TypedStr; TypedStr = History[--HistoryCur % MaxHistory]; } } function HistoryDown() { History[HistoryCur % MaxHistory] = TypedStr; if( HistoryCur < HistoryBot ) TypedStr = History[++HistoryCur % MaxHistory]; else TypedStr=""; } function NotifyLevelChange() { Super.NotifyLevelChange(); bLevelChange = True; if(Root != None) Root.NotifyBeforeLevelChange(); } ~D~~~e~Y  K} ?% & dA K <HK&{ <A?&x?{K ~Z*_$t9b<<<_?<b_ ~c*W*J< -m %k .Nwk *m k .k  WD?DD?L]Y<W%W%?WY 0) { Line -= VertSB.MaxPos - VertSB.Pos; TempTail -= VertSB.MaxPos - VertSB.Pos; } } for (i=0; ie b yb b ]e yb u?,b v  ~L+~~M+~~e ~~q*~~sB+L <Y#s-L j [y ~5J+yFY5yyW-Q yuyu?,-B'  ~uT$F,T ~]+[daqd .}%lwd *I}[d E}d .d   ~_P+T+$RTG-Q vuvu?,G N [G T}-B-2uv-B( ~v~~T~S~*m"RV+ES jxo xxx ~~]//============================================================================= // UWindowWindow - the parent class for all Window objects //============================================================================= class UWindowWindow extends UWindowBase; #exec TEXTURE IMPORT NAME=BlackTexture FILE=TEXTURES\Black.PCX #exec TEXTURE IMPORT NAME=WhiteTexture FILE=TEXTURES\White.PCX // Dimensions, offset relative to parent. var float WinLeft; var float WinTop; var float WinWidth; var float WinHeight; // Relationships to other windows var UWindowWindow ParentWindow; // Parent window var UWindowWindow FirstChildWindow; // First child window - bottom window first var UWindowWindow LastChildWindow; // Last child window - WinTop window first var UWindowWindow NextSiblingWindow; // sibling window - next window above us var UWindowWindow PrevSiblingWindow; // previous sibling window - next window below us var UWindowWindow ActiveWindow; // The child of ours which is currently active var UWindowRootWindow Root; // The root window var UWindowWindow OwnerWindow; // Some arbitary owner window var UWindowWindow ModalWindow; // Some window we've opened modally. var bool bWindowVisible; var bool bNoClip; // Clipping disabled for this window? var bool bMouseDown; // Pressed down in this window? var bool bRMouseDown; // Pressed down in this window? var bool bMMouseDown; // Pressed down in this window? var bool bAlwaysBehind; // Window doesn't bring to front on click. var bool bAcceptsFocus; // Accepts key messages var bool bAlwaysOnTop; // Always on top var bool bLeaveOnscreen; // Window is left onscreen when UWindow isn't active. var bool bUWindowActive; // Is UWindow active? var bool bTransient; // Never the active window. Used for combo dropdowns7 var bool bAcceptsHotKeys; // Does this window accept hotkeys? var bool bIgnoreLDoubleClick; var bool bIgnoreMDoubleClick; var bool bIgnoreRDoubleClick; var float ClickTime; var float MClickTime; var float RClickTime; var float ClickX; var float ClickY; var float MClickX; var float MClickY; var float RClickX; var float RClickY; var UWindowLookAndFeel LookAndFeel; var Region ClippingRegion; struct MouseCursor { var Texture tex; var int HotX; var int HotY; var byte WindowsCursor; }; var MouseCursor Cursor; enum WinMessage { WM_LMouseDown, WM_LMouseUp, WM_MMouseDown, WM_MMouseUp, WM_RMouseDown, WM_RMouseUp, WM_KeyUp, WM_KeyDown, WM_KeyType, WM_Paint // Window needs painting }; // Dialog messages const DE_Created = 0; const DE_Change = 1; const DE_Click = 2; const DE_Enter = 3; const DE_Exit = 4; const DE_MClick = 5; const DE_RClick = 6; const DE_EnterPressed = 7; const DE_MouseMove = 8; const DE_MouseLeave = 9; const DE_LMouseDown = 10; const DE_DoubleClick = 11; const DE_MouseEnter = 12; const DE_HelpChanged = 13; const DE_WheelUpPressed = 14; const DE_WheelDownPressed = 15; // Ideally Key would be a EInputKey but I can't see that class here. function WindowEvent(WinMessage Msg, Canvas C, float X, float Y, int Key) { switch(Msg) { case WM_Paint: Paint(C, X, Y); PaintClients(C, X, Y); break; case WM_LMouseDown: if(!Root.CheckCaptureMouseDown()) { if(!MessageClients(Msg, C, X, Y, Key)) LMouseDown(X, Y); } break; case WM_LMouseUp: if(!Root.CheckCaptureMouseUp()) { if(!MessageClients(Msg, C, X, Y, Key)) LMouseUp(X, Y); } break; case WM_RMouseDown: if(!MessageClients(Msg, C, X, Y, Key)) RMouseDown(X, Y); break; case WM_RMouseUp: if(!MessageClients(Msg, C, X, Y, Key)) RMouseUp(X, Y); break; case WM_MMouseDown: if(!MessageClients(Msg, C, X, Y, Key)) MMouseDown(X, Y); break; case WM_MMouseUp: if(!MessageClients(Msg, C, X, Y, Key)) MMouseUp(X, Y); break; case WM_KeyDown: if(!PropagateKey(Msg, C, X, Y, Key)) KeyDown(Key, X, Y); break; case WM_KeyUp: if(!PropagateKey(Msg, C, X, Y, Key)) KeyUp(Key, X, Y); break; case WM_KeyType: if(!PropagateKey(Msg, C, X, Y, Key)) KeyType(Key, X, Y); break; default: break; } } function SaveConfigs() { // Implemented in a child class } final function PlayerPawn GetPlayerOwner() { return Root.Console.ViewPort.Actor; } final function LevelInfo GetLevel() { return Root.Console.ViewPort.Actor.Level; } final function LevelInfo GetEntryLevel() { return Root.Console.ViewPort.Actor.GetEntryLevel(); } function Resized() { // Implemented in a child class } function BeforePaint(Canvas C, float X, float Y) { // Implemented in a child class } function AfterPaint(Canvas C, float X, float Y) { // Implemented in a child class } function Paint(Canvas C, float X, float Y) { // Implemented in a child class } function Click(float X, float Y) { // Implemented in a child class } function MClick(float X, float Y) { // Implemented in a child class } function RClick(float X, float Y) { // Implemented in a child class } function DoubleClick(float X, float Y) { // Implemented in a child class } function MDoubleClick(float X, float Y) { // Implemented in a child class } function RDoubleClick(float X, float Y) { // Implemented in a child class } function BeginPlay() { // Implemented in a child class } function BeforeCreate() { // Implemented in a child class } function Created() { // Implemented in a child class } function AfterCreate() { // Implemented in a child class } function MouseEnter() { // Implemented in a child class } function Activated() { // Implemented in a child class } function Deactivated() { // Implemented in a child class } function MouseLeave() { bMouseDown = False; bMMouseDown = False; bRMouseDown = False; } function MouseMove(float X, float Y) { } function KeyUp(int Key, float X, float Y) { // Implemented in child class } function KeyDown(int Key, float X, float Y) { // Implemented in child class } function bool HotKeyDown(int Key, float X, float Y) { // Implemented in child class //Log("UWindowWindow: Checking HotKeyDown for "$Self); return False; } function bool HotKeyUp(int Key, float X, float Y) { // Implemented in child class //Log("UWindowWindow: Checking HotKeyUp for "$Self); return False; } function KeyType(int Key, float X, float Y) { // Implemented in child class } function ProcessMenuKey(int Key, string KeyName) { // Implemented in child class } function KeyFocusEnter() { // Implemented in child class } function KeyFocusExit() { // Implemented in child class } function RMouseDown(float X, float Y) { ActivateWindow(0, False); bRMouseDown = True; } function RMouseUp(float X, float Y) { if(bRMouseDown) { if(!bIgnoreRDoubleClick && Abs(X-RClickX) <= 1 && Abs(Y-RClickY) <= 1 && GetLevel().TimeSeconds < RClickTime + 0.600) { RDoubleClick(X, Y); RClickTime = 0; } else { RClickTime = GetLevel().TimeSeconds; RClickX = X; RClickY = Y; RClick(X, Y); } } bRMouseDown = False; } function MMouseDown(float X, float Y) { ActivateWindow(0, False); /* DEBUG HideWindow(); */ bMMouseDown = True; } function MMouseUp(float X, float Y) { if(bMMouseDown) { if(!bIgnoreMDoubleClick && Abs(X-MClickX) <= 1 && (Y-MClickY)<=1 && GetLevel().TimeSeconds < MClickTime + 0.600) { MDoubleClick(X, Y); MClickTime = 0; } else { MClickTime = GetLevel().TimeSeconds; MClickX = X; MClickY = Y; MClick(X, Y); } } bMMouseDown = False; } function LMouseDown(float X, float Y) { ActivateWindow(0, False); bMouseDown = True; } function LMouseUp(float X, float Y) { if(bMouseDown) { if(!bIgnoreLDoubleClick && Abs(X-ClickX) <= 1 && (Y-ClickY) <= 1 && GetLevel().TimeSeconds < ClickTime + 0.600) { DoubleClick(X, Y); ClickTime = 0; } else { ClickTime = GetLevel().TimeSeconds; ClickX = X; ClickY = Y; Click(X, Y); } } bMouseDown = False; } function FocusWindow() { if(Root.FocusedWindow != None && Root.FocusedWindow != Self) Root.FocusedWindow.FocusOtherWindow(Self); Root.FocusedWindow = Self; } function FocusOtherWindow(UWindowWindow W) { } function EscClose() { Close(); } function Close(optional bool bByParent) { local UWindowWindow Prev, Child; for(Child = LastChildWindow;Child != None;Child = Prev) { Prev = Child.PrevSiblingWindow; Child.Close(True); } SaveConfigs(); if(!bByParent) HideWindow(); } final function SetSize(float W, float H) { if(WinWidth != W || WinHeight != H) { WinWidth = W; WinHeight = H; Resized(); } } function Tick(float Delta) { } final function DoTick(float Delta) { local UWindowWindow Child; Tick(Delta); Child = FirstChildWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if(bUWindowActive || Child.bLeaveOnscreen) { Child.DoTick(Delta); } Child = Child.NextSiblingWindow; } } final function PaintClients(Canvas C, float X, float Y) { local float OrgX, OrgY; local float ClipX, ClipY; local UWindowWindow Child; OrgX = C.OrgX; OrgY = C.OrgY; ClipX = C.ClipX; ClipY = C.ClipY; Child = FirstChildWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; C.SetPos(0,0); C.Style = GetPlayerOwner().ERenderStyle.STY_Normal; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; C.SpaceX = 0; C.SpaceY = 0; Child.BeforePaint(C, X - Child.WinLeft, Y - Child.WinTop); if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if(bUWindowActive || Child.bLeaveOnscreen) { C.OrgX = C.OrgX + Child.WinLeft*Root.GUIScale; C.OrgY = C.OrgY + Child.WinTop*Root.GUIScale; if(!Child.bNoClip) { C.ClipX = FMin(WinWidth - Child.WinLeft, Child.WinWidth)*Root.GUIScale; C.ClipY = FMin(WinHeight - Child.WinTop, Child.WinHeight)*Root.GUIScale; // Translate to child's co-ordinate system Child.ClippingRegion.X = ClippingRegion.X - Child.WinLeft; Child.ClippingRegion.Y = ClippingRegion.Y - Child.WinTop; Child.ClippingRegion.W = ClippingRegion.W; Child.ClippingRegion.H = ClippingRegion.H; if(Child.ClippingRegion.X < 0) { Child.ClippingRegion.W += Child.ClippingRegion.X; Child.ClippingRegion.X = 0; } if(Child.ClippingRegion.Y < 0) { Child.ClippingRegion.H += Child.ClippingRegion.Y; Child.ClippingRegion.Y = 0; } if(Child.ClippingRegion.W > Child.WinWidth - Child.ClippingRegion.X) { Child.ClippingRegion.W = Child.WinWidth - Child.ClippingRegion.X; } if(Child.ClippingRegion.H > Child.WinHeight - Child.ClippingRegion.Y) { Child.ClippingRegion.H = Child.WinHeight - Child.ClippingRegion.Y; } } if(Child.ClippingRegion.W > 0 && Child.ClippingRegion.H > 0) { Child.WindowEvent(WM_Paint, C, X - Child.WinLeft, Y - Child.WinTop, 0); Child.AfterPaint(C, X - Child.WinLeft, Y - Child.WinTop); } C.OrgX = OrgX; C.OrgY = OrgY; } Child = Child.NextSiblingWindow; } C.ClipX = ClipX; C.ClipY = ClipY; } final function UWindowWindow FindWindowUnder(float X, float Y) { local UWindowWindow Child; // go from Topmost downwards Child = LastChildWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if(bUWindowActive || Child.bLeaveOnscreen) { if((X >= Child.WinLeft) && (X <= Child.WinLeft+Child.WinWidth) && (Y >= Child.WinTop) && (Y <= Child.WinTop+Child.WinHeight) && (!Child.CheckMousePassThrough(X-Child.WinLeft, Y-Child.WinTop))) { return Child.FindWindowUnder(X - Child.WinLeft, Y - Child.WinTop); } } Child = Child.PrevSiblingWindow; } // Doesn't correspond to any children - it's us. return Self; } final function bool PropagateKey(WinMessage Msg, Canvas C, float X, float Y, int Key) { local UWindowWindow Child; // Check from WinTopmost for windows which accept focus Child = LastChildWindow; // HACK for always on top windows...need a better solution if(ActiveWindow != None && Child != ActiveWindow && !Child.bTransient) Child = ActiveWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if((bUWindowActive || Child.bLeaveOnscreen) && Child.bAcceptsFocus) { //Log("Sending keystrokes to: "$Child); Child.WindowEvent(Msg, C, X - Child.WinLeft, Y - Child.WinTop, Key); return True; } //else //Log("Ignoring child: "$Child); Child = Child.PrevSiblingWindow; } return False; } final function UWindowWindow CheckKeyFocusWindow() { local UWindowWindow Child; // Check from WinTopmost for windows which accept key focus Child = LastChildWindow; if(ActiveWindow != None && Child != ActiveWindow && !Child.bTransient) Child = ActiveWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if(bUWindowActive || Child.bLeaveOnscreen) { if(Child.bAcceptsFocus) { return Child.CheckKeyFocusWindow(); } } Child = Child.PrevSiblingWindow; } return Self; } final function bool MessageClients(WinMessage Msg, Canvas C, float X, float Y, int Key) { local UWindowWindow Child; // go from topmost downwards Child = LastChildWindow; while(Child != None) { Child.bUWindowActive = bUWindowActive; if(bLeaveOnScreen) Child.bLeaveOnscreen = True; if(bUWindowActive || Child.bLeaveOnscreen) { if((X >= Child.WinLeft) && (X <= Child.WinLeft+Child.WinWidth) && (Y >= Child.WinTop) && (Y <= Child.WinTop+Child.WinHeight) && (!Child.CheckMousePassThrough(X-Child.WinLeft, Y-Child.WinTop))) { Child.WindowEvent(Msg, C, X - Child.WinLeft, Y - Child.WinTop, Key); return True; } } Child = Child.PrevSiblingWindow; } return False; } final function ActivateWindow(int Depth, bool bTransientNoDeactivate) { if(Self == Root) { if(Depth == 0) FocusWindow(); return; } if(WaitModal()) return; if(!bAlwaysBehind) { ParentWindow.HideChildWindow(Self); ParentWindow.ShowChildWindow(Self); } //Log("Activating Window "$Self); if(!(bTransient || bTransientNoDeactivate)) { if(ParentWindow.ActiveWindow != None && ParentWindow.ActiveWindow != Self) { ParentWindow.ActiveWindow.Deactivated(); } ParentWindow.ActiveWindow = Self; ParentWindow.ActivateWindow(Depth + 1, False); Activated(); } else { ParentWindow.ActivateWindow(Depth + 1, True); } if(Depth == 0) FocusWindow(); } final function BringToFront() { if(Self == Root) return; if(!bAlwaysBehind && !WaitModal()) { ParentWindow.HideChildWindow(Self); ParentWindow.ShowChildWindow(Self); } ParentWindow.BringToFront(); } final function SendToBack() { ParentWindow.HideChildWindow(Self); ParentWindow.ShowChildWindow(Self, True); } final function HideChildWindow(UWindowWindow Child) { local UWindowWindow Window; if(!Child.bWindowVisible) return; Child.bWindowVisible = False; if(Child.bAcceptsHotKeys) Root.RemoveHotkeyWindow(Child); // Check WinTopmost if(LastChildWindow == Child) { LastChildWindow = Child.PrevSiblingWindow; if(LastChildWindow != None) { LastChildWindow.NextSiblingWindow = None; } else { FirstChildWindow = None; } } else if(FirstChildWindow == Child) // Check bottommost { FirstChildWindow = Child.NextSiblingWindow; if(FirstChildWindow != None) { FirstChildWindow.PrevSiblingWindow = None; } else { LastChildWindow = None; } } else { // you mean I have to go looking for it??? Window = FirstChildWindow; while(Window != None) { if(Window.NextSiblingWindow == Child) { Window.NextSiblingWindow = Child.NextSiblingWindow; Window.NextSiblingWindow.PrevSiblingWindow = Window; break; } Window = Window.NextSiblingWindow; } } // Set the active window ActiveWindow = None; Window = LastChildWindow; while(Window != None) { if(!Window.bAlwaysOnTop) { ActiveWindow = Window; break; } Window = Window.PrevSiblingWindow; } if(ActiveWindow == None) ActiveWindow = LastChildWindow; } final function SetAcceptsFocus() { if(bAcceptsFocus) return; bAcceptsFocus = True; if(Self != Root) ParentWindow.SetAcceptsFocus(); } final function CancelAcceptsFocus() { local UWindowWindow Child; for(Child = LastChildWindow; Child != None; Child = Child.PrevSiblingWindow) Child.CancelAcceptsFocus(); bAcceptsFocus = False; } final function GetMouseXY(out float X, out float Y) { local UWindowWindow P; X = Int(Root.MouseX); Y = Int(Root.MouseY); P = Self; while(P != Root) { X = X - P.WinLeft; Y = Y - P.WinTop; P = P.ParentWindow; } } final function GlobalToWindow(float GlobalX, float GlobalY, out float WinX, out float WinY) { local UWindowWindow P; WinX = GlobalX; WinY = GlobalY; P = Self; while(P != Root) { WinX -= P.WinLeft; WinY -= P.WinTop; P = P.ParentWindow; } } final function WindowToGlobal(float WinX, float WinY, out float GlobalX, out float GlobalY) { local UWindowWindow P; GlobalX = WinX; GlobalY = WinY; P = Self; while(P != Root) { GlobalX += P.WinLeft; GlobalY += P.WinTop; P = P.ParentWindow; } } final function ShowChildWindow(UWindowWindow Child, optional bool bAtBack) { local UWindowWindow W; if(!Child.bTransient) ActiveWindow = Child; if(Child.bWindowVisible) return; Child.bWindowVisible = True; if(Child.bAcceptsHotKeys) Root.AddHotkeyWindow(Child); if(bAtBack) { if(FirstChildWindow == None) { Child.NextSiblingWindow = None; Child.PrevSiblingWindow = None; LastChildWindow = Child; FirstChildWindow = Child; } else { FirstChildWindow.PrevSiblingWindow = Child; Child.NextSiblingWindow = FirstChildWindow; Child.PrevSiblingWindow = None; FirstChildWindow = Child; } } else { W = LastChildWindow; while(True) { if((Child.bAlwaysOnTop) || (W == None) || (!W.bAlwaysOnTop)) { if(W == None) { if(LastChildWindow == None) { // We're the only window Child.NextSiblingWindow = None; Child.PrevSiblingWindow = None; LastChildWindow = Child; FirstChildWindow = Child; } else { // We feel off the end of the list, we're the bottom (first) child window. Child.NextSiblingWindow = FirstChildWindow; Child.PrevSiblingWindow = None; FirstChildWindow.PrevSiblingWindow = Child; FirstChildWindow = Child; } } else { // We're either the new topmost (last) or we need to be inserted in the list. Child.NextSiblingWindow = W.NextSiblingWindow; Child.PrevSiblingWindow = W; if(W.NextSiblingWindow != None) { W.NextSiblingWindow.PrevSiblingWindow = Child; } else { LastChildWindow = Child; } W.NextSiblingWindow = Child; } // We're done. break; } W = W.PrevSiblingWindow; } } } function ShowWindow() { ParentWindow.ShowChildWindow(Self); WindowShown(); } function HideWindow() { WindowHidden(); ParentWindow.HideChildWindow(Self); } final function UWindowWindow CreateWindow(class WndClass, float X, float Y, float W, float H, optional UWindowWindow OwnerW, optional bool bUnique, optional name ObjectName) { local UWindowWindow Child; if(bUnique) { Child = Root.FindChildWindow(WndClass, True); if(Child != None) { Child.ShowWindow(); Child.BringToFront(); return Child; } } if(ObjectName != '') Child = New(None, ObjectName) WndClass; else Child = New(None) WndClass; Child.BeginPlay(); Child.WinTop = Y; Child.WinLeft = X; Child.WinWidth = W; Child.WinHeight = H; Child.Root = Root; Child.ParentWindow = Self; Child.OwnerWindow = OwnerW; if(Child.OwnerWindow == None) Child.OwnerWindow = Self; Child.Cursor = Cursor; Child.bAlwaysBehind = False; Child.LookAndFeel = LookAndFeel; Child.BeforeCreate(); Child.Created(); // Now add it at the WinTop of the Z-Order and then adjust child list. ShowChildWindow(Child); Child.AfterCreate(); return Child; } final function Tile(Canvas C, Texture T) { local int X, Y; X = 0; Y = 0; While(X < WinWidth) { While(Y < WinHeight) { DrawClippedTexture( C, X, Y, T ); Y += T.VSize; } X += T.USize; Y = 0; } } final function DrawHorizTiledPieces( Canvas C, float DestX, float DestY, float DestW, float DestH, TexRegion T1, TexRegion T2, TexRegion T3, TexRegion T4, TexRegion T5, float Scale ) { local TexRegion Pieces[5], R; local int PieceCount; local int j; local float X, L; Pieces[0] = T1; if(T1.T != None) PieceCount = 1; Pieces[1] = T2; if(T2.T != None) PieceCount = 2; Pieces[2] = T3; if(T3.T != None) PieceCount = 3; Pieces[3] = T4; if(T4.T != None) PieceCount = 4; Pieces[4] = T5; if(T5.T != None) PieceCount = 5; j = 0; X = DestX; while( X < DestX + DestW ) { L = DestW - (X - DestX); R = Pieces[j]; DrawStretchedTextureSegment( C, X, DestY, FMin(R.W*Scale, L), R.H*Scale, R.X, R.Y, FMin(R.W, L/Scale), R.H, R.T ); X += FMin(R.W*Scale, L); j = (j+1)%PieceCount; } } final function DrawVertTiledPieces( Canvas C, float DestX, float DestY, float DestW, float DestH, TexRegion T1, TexRegion T2, TexRegion T3, TexRegion T4, TexRegion T5, float Scale ) { local TexRegion Pieces[5], R; local int PieceCount; local int j; local float Y, L; Pieces[0] = T1; if(T1.T != None) PieceCount = 1; Pieces[1] = T2; if(T2.T != None) PieceCount = 2; Pieces[2] = T3; if(T3.T != None) PieceCount = 3; Pieces[3] = T4; if(T4.T != None) PieceCount = 4; Pieces[4] = T5; if(T5.T != None) PieceCount = 5; j = 0; Y = DestY; while( Y < DestY + DestH ) { L = DestH - (Y - DestY); R = Pieces[j]; DrawStretchedTextureSegment( C, DestX, Y, R.W*Scale, FMin(R.H*Scale, L), R.X, R.Y, R.W, FMin(R.H, L/Scale), R.T ); Y += FMin(R.H*Scale, L); j = (j+1)%PieceCount; } } final function DrawClippedTexture( Canvas C, float X, float Y, texture Tex ) { DrawStretchedTextureSegment( C, X, Y, Tex.USize, Tex.VSize, 0, 0, Tex.USize, Tex.VSize, Tex); } final function DrawStretchedTexture( Canvas C, float X, float Y, float W, float H, texture Tex ) { DrawStretchedTextureSegment( C, X, Y, W, H, 0, 0, Tex.USize, Tex.VSize, Tex); } final function DrawStretchedTextureSegment( Canvas C, float X, float Y, float W, float H, float tX, float tY, float tW, float tH, texture Tex ) { local float OrgX, OrgY, ClipX, ClipY; OrgX = C.OrgX; OrgY = C.OrgY; ClipX = C.ClipX; ClipY = C.ClipY; C.SetOrigin(OrgX + ClippingRegion.X*Root.GUIScale, OrgY + ClippingRegion.Y*Root.GUIScale); C.SetClip(ClippingRegion.W*Root.GUIScale, ClippingRegion.H*Root.GUIScale); C.SetPos((X - ClippingRegion.X)*Root.GUIScale, (Y - ClippingRegion.Y)*Root.GUIScale); C.DrawTileClipped( Tex, W*Root.GUIScale, H*Root.GUIScale, tX, tY, tW, tH); C.SetClip(ClipX, ClipY); C.SetOrigin(OrgX, OrgY); } final function ClipText(Canvas C, float X, float Y, coerce string S, optional bool bCheckHotkey) { local float OrgX, OrgY, ClipX, ClipY; OrgX = C.OrgX; OrgY = C.OrgY; ClipX = C.ClipX; ClipY = C.ClipY; C.SetOrigin(OrgX + ClippingRegion.X*Root.GUIScale, OrgY + ClippingRegion.Y*Root.GUIScale); C.SetClip(ClippingRegion.W*Root.GUIScale, ClippingRegion.H*Root.GUIScale); C.SetPos((X - ClippingRegion.X)*Root.GUIScale, (Y - ClippingRegion.Y)*Root.GUIScale); C.DrawTextClipped(S, bCheckHotKey); C.SetClip(ClipX, ClipY); C.SetOrigin(OrgX, OrgY); } final function int WrapClipText(Canvas C, float X, float Y, coerce string S, optional bool bCheckHotkey, optional int Length, optional int PaddingLength, optional bool bNoDraw) { local float W, H; local int SpacePos, CRPos, WordPos, TotalPos; local string Out, Temp, Padding; local bool bCR, bSentry; local int i; local int NumLines; local float pW, pH; // replace \\n's with Chr(13)'s i = InStr(S, "\\n"); while(i != -1) { S = Left(S, i) $ Chr(13) $ Mid(S, i + 2); i = InStr(S, "\\n"); } i = 0; bSentry = True; Out = ""; NumLines = 1; while( bSentry && Y < WinHeight ) { // Get the line to be drawn. if(Out == "") { i++; if (Length > 0) Out = Left(S, Length); else Out = S; } // Find the word boundary. SpacePos = InStr(Out, " "); CRPos = InStr(Out, Chr(13)); bCR = False; if(CRPos != -1 && (CRPos < SpacePos || SpacePos == -1)) { WordPos = CRPos; bCR = True; } else { WordPos = SpacePos; } // Get the current word. C.SetPos(0, 0); if(WordPos == -1) Temp = Out; else Temp = Left(Out, WordPos)$" "; TotalPos += WordPos; TextSize(C, Temp, W, H); // Calculate draw offset. if ( (Mid(Out, Len(Temp)) == "") && (PaddingLength > 0) ) { Padding = Mid(S, Length, PaddingLength); TextSize(C, Padding, pW, pH); if(W + X + pW > WinWidth && X > 0) { X = 0; Y += H; NumLines++; } } else { if(W + X > WinWidth && X > 0) { X = 0; Y += H; NumLines++; } } // Draw the line. if(!bNoDraw) ClipText(C, X, Y, Temp, bCheckHotKey); // Increment the draw offset. X += W; if(bCR) { X =0; Y += H; NumLines++; } Out = Mid(Out, Len(Temp)); if ((Out == "") && (i > 0)) bSentry = False; } return NumLines; } final function ClipTextWidth(Canvas C, float X, float Y, coerce string S, float W) { ClipText(C, X, Y, S); } final function DrawClippedActor( Canvas C, float X, float Y, Actor A, bool WireFrame, rotator RotOffset, vector LocOffset ) { local vector MeshLoc; local float FOV; FOV = GetPlayerOwner().FOVAngle * Pi / 180; MeshLoc.X = 4 / tan(FOV/2); MeshLoc.Y = 0; MeshLoc.Z = 0; A.SetRotation(RotOffset); A.SetLocation(MeshLoc + LocOffset); C.DrawClippedActor(A, WireFrame, ClippingRegion.W * Root.GUIScale, ClippingRegion.H * Root.GUIScale, C.OrgX + ClippingRegion.X * Root.GUIScale, C.OrgY + ClippingRegion.Y * Root.GUIScale, True); } final function DrawUpBevel( Canvas C, float X, float Y, float W, float H, Texture T) { local Region R; R = LookAndFeel.BevelUpTL; DrawStretchedTextureSegment( C, X, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpT; DrawStretchedTextureSegment( C, X+LookAndFeel.BevelUpTL.W, Y, W - LookAndFeel.BevelUpTL.W - LookAndFeel.BevelUpTR.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpTR; DrawStretchedTextureSegment( C, X + W - R.W, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpL; DrawStretchedTextureSegment( C, X, Y + LookAndFeel.BevelUpTL.H, R.W, H - LookAndFeel.BevelUpTL.H - LookAndFeel.BevelUpBL.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpR; DrawStretchedTextureSegment( C, X + W - R.W, Y + LookAndFeel.BevelUpTL.H, R.W, H - LookAndFeel.BevelUpTL.H - LookAndFeel.BevelUpBL.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpBL; DrawStretchedTextureSegment( C, X, Y + H - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpB; DrawStretchedTextureSegment( C, X + LookAndFeel.BevelUpBL.W, Y + H - R.H, W - LookAndFeel.BevelUpBL.W - LookAndFeel.BevelUpBR.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpBR; DrawStretchedTextureSegment( C, X + W - R.W, Y + H - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.BevelUpArea; DrawStretchedTextureSegment( C, X + LookAndFeel.BevelUpTL.W, Y + LookAndFeel.BevelUpTL.H, W - LookAndFeel.BevelUpBL.W - LookAndFeel.BevelUpBR.W, H - LookAndFeel.BevelUpTL.H - LookAndFeel.BevelUpBL.H, R.X, R.Y, R.W, R.H, T ); } final function DrawMiscBevel( Canvas C, float X, float Y, float W, float H, Texture T, int BevelType) { local Region R; R = LookAndFeel.MiscBevelTL[BevelType]; DrawStretchedTextureSegment( C, X, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelT[BevelType]; DrawStretchedTextureSegment( C, X+LookAndFeel.MiscBevelTL[BevelType].W, Y, W - LookAndFeel.MiscBevelTL[BevelType].W - LookAndFeel.MiscBevelTR[BevelType].W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelTR[BevelType]; DrawStretchedTextureSegment( C, X + W - R.W, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelL[BevelType]; DrawStretchedTextureSegment( C, X, Y + LookAndFeel.MiscBevelTL[BevelType].H, R.W, H - LookAndFeel.MiscBevelTL[BevelType].H - LookAndFeel.MiscBevelBL[BevelType].H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelR[BevelType]; DrawStretchedTextureSegment( C, X + W - R.W, Y + LookAndFeel.MiscBevelTL[BevelType].H, R.W, H - LookAndFeel.MiscBevelTL[BevelType].H - LookAndFeel.MiscBevelBL[BevelType].H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelBL[BevelType]; DrawStretchedTextureSegment( C, X, Y + H - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelB[BevelType]; DrawStretchedTextureSegment( C, X + LookAndFeel.MiscBevelBL[BevelType].W, Y + H - R.H, W - LookAndFeel.MiscBevelBL[BevelType].W - LookAndFeel.MiscBevelBR[BevelType].W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelBR[BevelType]; DrawStretchedTextureSegment( C, X + W - R.W, Y + H - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = LookAndFeel.MiscBevelArea[BevelType]; DrawStretchedTextureSegment( C, X + LookAndFeel.MiscBevelTL[BevelType].W, Y + LookAndFeel.MiscBevelTL[BevelType].H, W - LookAndFeel.MiscBevelBL[BevelType].W - LookAndFeel.MiscBevelBR[BevelType].W, H - LookAndFeel.MiscBevelTL[BevelType].H - LookAndFeel.MiscBevelBL[BevelType].H, R.X, R.Y, R.W, R.H, T ); } final function string RemoveAmpersand(string S) { local string Result; local string Underline; ParseAmpersand(S, Result, Underline, False); return Result; } final function byte ParseAmpersand(string S, out string Result, out string Underline, bool bCalcUnderline) { local string Temp; local int Pos, NewPos; local int i; local byte HotKey; HotKey = 0; Pos = 0; Result = ""; Underline = ""; while(True) { Temp = Mid(S, Pos); NewPos = InStr(Temp, "&"); if(NewPos == -1) break; Pos += NewPos; if(Mid(Temp, NewPos + 1, 1) == "&") { // It's a double &, lets add one to the output. Result = Result $ Left(Temp, NewPos) $ "&"; if(bCalcUnderline) Underline = Underline $ " "; Pos++; } else { if(HotKey == 0) HotKey = Asc(Caps(Mid(Temp, NewPos + 1, 1))); Result = Result $ Left(Temp, NewPos); if(bCalcUnderline) { for(i=0;i ParentClass, optional bool bExactClass) { local UWindowWindow P; P = ParentWindow; while(P != Root) { if(bExactClass) { if(P.Class == ParentClass) return P; } else { if(ClassIsChildOf(P.Class, ParentClass)) return P; } P = P.ParentWindow; } return None; } final function UWindowWindow FindChildWindow(class ChildClass, optional bool bExactClass) { local UWindowWindow Child, Found; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) { if(bExactClass) { if(Child.Class == ChildClass) return Child; } else { if(ClassIsChildOf(Child.Class, ChildClass)) return Child; } Found = Child.FindChildWindow(ChildClass); if(Found != None) return Found; } return None; } function GetDesiredDimensions(out float W, out float H) { local float MaxW, MaxH, TW, TH; local UWindowWindow Child, Found; MaxW = 0; MaxH = 0; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) { Child.GetDesiredDimensions(TW, TH); //Log("Calling: "$GetPlayerOwner().GetItemName(string(Child))); if(TW > MaxW) MaxW = TW; if(TH > MaxH) MaxH = TH; } W = MaxW; H = MaxH; //Log(GetPlayerOwner().GetItemName(string(Self))$": DesiredHeight: "$H); } final function TextSize(Canvas C, string Text, out float W, out float H) { C.SetPos(0, 0); C.TextSize(Text, W, H); W = W / Root.GUIScale; H = H / Root.GUIScale; } function ResolutionChanged(float W, float H) { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) { Child.ResolutionChanged(W, H); } } function ShowModal(UWindowWindow W) { ModalWindow = W; W.ShowWindow(); W.BringToFront(); } function bool WaitModal() { if(ModalWindow != None && ModalWindow.bWindowVisible) return True; ModalWindow = None; return False; } function WindowHidden() { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.WindowHidden(); } function WindowShown() { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.WindowShown(); } // Should mouse events at these co-ordinates be passed through to underlying windows? function bool CheckMousePassThrough(float X, float Y) { return False; } final function bool WindowIsVisible() { if(Self == Root) return True; if(!bWindowVisible) return False; return ParentWindow.WindowIsVisible(); } function SetParent(UWindowWindow NewParent) { HideWindow(); ParentWindow = NewParent; ShowWindow(); } function UWindowMessageBox MessageBox(string Title, string Message, MessageBoxButtons Buttons, MessageBoxResult ESCResult, optional MessageBoxResult EnterResult, optional int TimeOut) { local UWindowMessageBox W; local UWindowFramedWindow F; W = UWindowMessageBox(Root.CreateWindow(class'UWindowMessageBox', 100, 100, 100, 100, Self)); W.SetupMessageBox(Title, Message, Buttons, ESCResult, EnterResult, TimeOut); F = UWindowFramedWindow(GetParent(class'UWindowFramedWindow')); if(F!= None) F.ShowModal(W); else Root.ShowModal(W); return W; } function MessageBoxDone(UWindowMessageBox W, MessageBoxResult Result) { } function NotifyQuitUnreal() { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.NotifyQuitUnreal(); } function NotifyBeforeLevelChange() { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.NotifyBeforeLevelChange(); } function SetCursor(MouseCursor C) { local UWindowWindow Child; Cursor = C; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.SetCursor(C); } function NotifyAfterLevelChange() { local UWindowWindow Child; for(Child = LastChildWindow;Child != None;Child = Child.PrevSiblingWindow) Child.NotifyAfterLevelChange(); } final function ReplaceText(out string Text, string Replace, string With) { local int i; local string Input; Input = Text; Text = ""; i = InStr(Input, Replace); while(i != -1) { Text = Text $ Left(Input, i) $ With; Input = Mid(Input, i + Len(Replace)); i = InStr(Input, Replace); } Text = Text $ Input; } function StripCRLF(out string Text) { ReplaceText(Text, Chr(13)$Chr(10), ""); ReplaceText(Text, Chr(13), ""); ReplaceText(Text, Chr(10), ""); } ~^class UWindowWin95LookAndFeel expands UWindowLookAndFeel; #exec TEXTURE IMPORT NAME=ActiveFrame FILE=Textures\ActiveFrame.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=InactiveFrame FILE=Textures\InactiveFrame.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=ActiveFrameS FILE=Textures\ActiveFrameS.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=InactiveFrameS FILE=Textures\InactiveFrameS.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=Misc FILE=Textures\Misc.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=ChkChecked FILE=Textures\ChkChecked.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=ChkUnchecked FILE=Textures\ChkUnchecked.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=ChkCheckedDisabled FILE=Textures\ChkCheckedDisabled.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=ChkUncheckedDisabled FILE=Textures\ChkUncheckedDisabled.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MenuBar FILE=Textures\MenuBar.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuHighlightL FILE=Textures\MenuHighlightL.bmp FLAGS=2 GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuHighlightM FILE=Textures\MenuHighlightM.bmp FLAGS=2 GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuHighlightR FILE=Textures\MenuHighlightR.bmp FLAGS=2 GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuArea FILE=Textures\MenuArea.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuTL FILE=Textures\MenuTL.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuT FILE=Textures\MenuT.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuTR FILE=Textures\MenuTR.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuL FILE=Textures\MenuL.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuR FILE=Textures\MenuR.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuBL FILE=Textures\MenuBL.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuB FILE=Textures\MenuB.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuBR FILE=Textures\MenuBR.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuHighlight FILE=Textures\MenuHighlight.bmp GROUP="Icons" MIPS=OFF var() Region SBUpUp; var() Region SBUpDown; var() Region SBUpDisabled; var() Region SBDownUp; var() Region SBDownDown; var() Region SBDownDisabled; var() Region SBLeftUp; var() Region SBLeftDown; var() Region SBLeftDisabled; var() Region SBRightUp; var() Region SBRightDown; var() Region SBRightDisabled; var() Region SBBackground; var() Region FrameSBL; var() Region FrameSB; var() Region FrameSBR; var() Region CloseBoxUp; var() Region CloseBoxDown; var() int CloseBoxOffsetX; var() int CloseBoxOffsetY; const SIZEBORDER = 3; const BRSIZEBORDER = 15; /* Framed Window Drawing Functions */ function FW_DrawWindowFrame(UWindowFramedWindow W, Canvas C) { local Texture T; local Region R, Temp; C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; T = W.GetLookAndFeelTexture(); R = FrameTL; W.DrawStretchedTextureSegment( C, 0, 0, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = FrameT; W.DrawStretchedTextureSegment( C, FrameTL.W, 0, W.WinWidth - FrameTL.W - FrameTR.W, R.H, R.X, R.Y, R.W, R.H, T ); R = FrameTR; W.DrawStretchedTextureSegment( C, W.WinWidth - R.W, 0, R.W, R.H, R.X, R.Y, R.W, R.H, T ); if(W.bStatusBar) Temp = FrameSBL; else Temp = FrameBL; R = FrameL; W.DrawStretchedTextureSegment( C, 0, FrameTL.H, R.W, W.WinHeight - FrameTL.H - Temp.H, R.X, R.Y, R.W, R.H, T ); R = FrameR; W.DrawStretchedTextureSegment( C, W.WinWidth - R.W, FrameTL.H, R.W, W.WinHeight - FrameTL.H - Temp.H, R.X, R.Y, R.W, R.H, T ); if(W.bStatusBar) R = FrameSBL; else R = FrameBL; W.DrawStretchedTextureSegment( C, 0, W.WinHeight - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); if(W.bStatusBar) { R = FrameSB; W.DrawStretchedTextureSegment( C, FrameBL.W, W.WinHeight - R.H, W.WinWidth - FrameSBL.W - FrameSBR.W, R.H, R.X, R.Y, R.W, R.H, T ); } else { R = FrameB; W.DrawStretchedTextureSegment( C, FrameBL.W, W.WinHeight - R.H, W.WinWidth - FrameBL.W - FrameBR.W, R.H, R.X, R.Y, R.W, R.H, T ); } if(W.bStatusBar) R = FrameSBR; else R = FrameBR; W.DrawStretchedTextureSegment( C, W.WinWidth - R.W, W.WinHeight - R.H, R.W, R.H, R.X, R.Y, R.W, R.H, T ); C.Font = W.Root.Fonts[W.F_Normal]; if(W.ParentWindow.ActiveWindow == W) C.DrawColor = FrameActiveTitleColor; else C.DrawColor = FrameInactiveTitleColor; W.ClipTextWidth(C, FrameTitleX, FrameTitleY, W.WindowTitle, W.WinWidth - 22); if(W.bStatusBar) { C.DrawColor.r = 0; C.DrawColor.g = 0; C.DrawColor.b = 0; W.ClipTextWidth(C, 6, W.WinHeight - 13, W.StatusBarText, W.WinWidth - 22); C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; } } function FW_SetupFrameButtons(UWindowFramedWindow W, Canvas C) { local Texture T; T = W.GetLookAndFeelTexture(); W.CloseBox.WinLeft = W.WinWidth - CloseBoxOffsetX - CloseBoxUp.W; W.CloseBox.WinTop = CloseBoxOffsetY; W.CloseBox.SetSize(CloseBoxUp.W, CloseBoxUp.H); W.CloseBox.bUseRegion = True; W.CloseBox.UpTexture = T; W.CloseBox.DownTexture = T; W.CloseBox.OverTexture = T; W.CloseBox.DisabledTexture = T; W.CloseBox.UpRegion = CloseBoxUp; W.CloseBox.DownRegion = CloseBoxDown; W.CloseBox.OverRegion = CloseBoxUp; W.CloseBox.DisabledRegion = CloseBoxUp; } function Region FW_GetClientArea(UWindowFramedWindow W) { local Region R; R.X = FrameL.W; R.Y = FrameT.H; R.W = W.WinWidth - (FrameL.W + FrameR.W); if(W.bStatusBar) R.H = W.WinHeight - (FrameT.H + FrameSB.H); else R.H = W.WinHeight - (FrameT.H + FrameB.H); return R; } function FrameHitTest FW_HitTest(UWindowFramedWindow W, float X, float Y) { if((X >= 3) && (X <= W.WinWidth-3) && (Y >= 3) && (Y <= 14)) return HT_TitleBar; if((X < BRSIZEBORDER && Y < SIZEBORDER) || (X < SIZEBORDER && Y < BRSIZEBORDER)) return HT_NW; if((X > W.WinWidth - SIZEBORDER && Y < BRSIZEBORDER) || (X > W.WinWidth - BRSIZEBORDER && Y < SIZEBORDER)) return HT_NE; if((X < BRSIZEBORDER && Y > W.WinHeight - SIZEBORDER)|| (X < SIZEBORDER && Y > W.WinHeight - BRSIZEBORDER)) return HT_SW; if((X > W.WinWidth - BRSIZEBORDER) && (Y > W.WinHeight - BRSIZEBORDER)) return HT_SE; if(Y < SIZEBORDER) return HT_N; if(Y > W.WinHeight - SIZEBORDER) return HT_S; if(X < SIZEBORDER) return HT_W; if(X > W.WinWidth - SIZEBORDER) return HT_E; return HT_None; } /* Client Area Drawing Functions */ function DrawClientArea(UWindowClientWindow W, Canvas C) { W.DrawStretchedTexture(C, 0, 0, W.WinWidth, W.WinHeight, Texture'BlackTexture'); } /* Combo Drawing Functions */ function Combo_SetupSizes(UWindowComboControl W, Canvas C) { local float TW, TH; C.Font = W.Root.Fonts[W.Font]; W.TextSize(C, W.Text, TW, TH); W.WinHeight = 12 + MiscBevelT[2].H + MiscBevelB[2].H; switch(W.Align) { case TA_Left: W.EditAreaDrawX = W.WinWidth - W.EditBoxWidth; W.TextX = 0; break; case TA_Right: W.EditAreaDrawX = 0; W.TextX = W.WinWidth - TW; break; case TA_Center: W.EditAreaDrawX = (W.WinWidth - W.EditBoxWidth) / 2; W.TextX = (W.WinWidth - TW) / 2; break; } W.EditAreaDrawY = (W.WinHeight - 2) / 2; W.TextY = (W.WinHeight - TH) / 2; W.EditBox.WinLeft = W.EditAreaDrawX + MiscBevelL[2].W; W.EditBox.WinTop = MiscBevelT[2].H; W.Button.WinWidth = ComboBtnUp.W; if(W.bButtons) { W.EditBox.WinWidth = W.EditBoxWidth - MiscBevelL[2].W - MiscBevelR[2].W - ComboBtnUp.W - SBLeftUp.W - SBRightUp.W; W.EditBox.WinHeight = W.WinHeight - MiscBevelT[2].H - MiscBevelB[2].H; W.Button.WinLeft = W.WinWidth - ComboBtnUp.W - MiscBevelR[2].W - SBLeftUp.W - SBRightUp.W; W.Button.WinTop = W.EditBox.WinTop; W.LeftButton.WinLeft = W.WinWidth - MiscBevelR[2].W - SBLeftUp.W - SBRightUp.W; W.LeftButton.WinTop = W.EditBox.WinTop; W.RightButton.WinLeft = W.WinWidth - MiscBevelR[2].W - SBRightUp.W; W.RightButton.WinTop = W.EditBox.WinTop; W.LeftButton.WinWidth = SBLeftUp.W; W.LeftButton.WinHeight = SBLeftUp.H; W.RightButton.WinWidth = SBRightUp.W; W.RightButton.WinHeight = SBRightUp.H; } else { W.EditBox.WinWidth = W.EditBoxWidth - MiscBevelL[2].W - MiscBevelR[2].W - ComboBtnUp.W; W.EditBox.WinHeight = W.WinHeight - MiscBevelT[2].H - MiscBevelB[2].H; W.Button.WinLeft = W.WinWidth - ComboBtnUp.W - MiscBevelR[2].W; W.Button.WinTop = W.EditBox.WinTop; } W.Button.WinHeight = W.EditBox.WinHeight; } function Combo_Draw(UWindowComboControl W, Canvas C) { W.DrawMiscBevel(C, W.EditAreaDrawX, 0, W.EditBoxWidth, W.WinHeight, Misc, 2); if(W.Text != "") { C.DrawColor = W.TextColor; W.ClipText(C, W.TextX, W.TextY, W.Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } } function ComboList_DrawBackground(UWindowComboList W, Canvas C) { W.DrawClippedTexture(C, 0, 0, Texture'UWindow.MenuTL'); W.DrawStretchedTexture(C, 4, 0, W.WinWidth-8, 4, Texture'UWindow.MenuT'); W.DrawClippedTexture(C, W.WinWidth-4, 0, Texture'UWindow.MenuTR'); W.DrawClippedTexture(C, 0, W.WinHeight-4, Texture'UWindow.MenuBL'); W.DrawStretchedTexture(C, 4, W.WinHeight-4, W.WinWidth-8, 4, Texture'UWindow.MenuB'); W.DrawClippedTexture(C, W.WinWidth-4, W.WinHeight-4, Texture'UWindow.MenuBR'); W.DrawStretchedTexture(C, 0, 4, 4, W.WinHeight-8, Texture'UWindow.MenuL'); W.DrawStretchedTexture(C, W.WinWidth-4, 4, 4, W.WinHeight-8, Texture'UWindow.MenuR'); W.DrawStretchedTexture(C, 4, 4, W.WinWidth-8, W.WinHeight-8, Texture'UWindow.MenuArea'); } function ComboList_DrawItem(UWindowComboList Combo, Canvas C, float X, float Y, float W, float H, string Text, bool bSelected) { C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; if(bSelected) { Combo.DrawStretchedTexture(C, X, Y, W, H, Texture'UWindow.MenuHighlight'); C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; } else { C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; } Combo.ClipText(C, X + Combo.TextBorder + 2, Y + 3, Text); } function Checkbox_SetupSizes(UWindowCheckbox W, Canvas C) { local float TW, TH; W.TextSize(C, W.Text, TW, TH); W.WinHeight = Max(TH+1, 16); switch(W.Align) { case TA_Left: W.ImageX = W.WinWidth - 16; W.TextX = 0; break; case TA_Right: W.ImageX = 0; W.TextX = W.WinWidth - TW; break; case TA_Center: W.ImageX = (W.WinWidth - 16) / 2; W.TextX = (W.WinWidth - TW) / 2; break; } W.ImageY = (W.WinHeight - 16) / 2; W.TextY = (W.WinHeight - TH) / 2; if(W.bChecked) { W.UpTexture = Texture'ChkChecked'; W.DownTexture = Texture'ChkChecked'; W.OverTexture = Texture'ChkChecked'; W.DisabledTexture = Texture'ChkCheckedDisabled'; } else { W.UpTexture = Texture'ChkUnchecked'; W.DownTexture = Texture'ChkUnchecked'; W.OverTexture = Texture'ChkUnchecked'; W.DisabledTexture = Texture'ChkUncheckedDisabled'; } } function Combo_GetButtonBitmaps(UWindowComboButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = ComboBtnUp; W.DownRegion = ComboBtnDown; W.OverRegion = ComboBtnUp; W.DisabledRegion = ComboBtnDisabled; } function Editbox_SetupSizes(UWindowEditControl W, Canvas C) { local float TW, TH; local int B; B = EditBoxBevel; C.Font = W.Root.Fonts[W.Font]; W.TextSize(C, W.Text, TW, TH); W.WinHeight = 12 + MiscBevelT[B].H + MiscBevelB[B].H; switch(W.Align) { case TA_Left: W.EditAreaDrawX = W.WinWidth - W.EditBoxWidth; W.TextX = 0; break; case TA_Right: W.EditAreaDrawX = 0; W.TextX = W.WinWidth - TW; break; case TA_Center: W.EditAreaDrawX = (W.WinWidth - W.EditBoxWidth) / 2; W.TextX = (W.WinWidth - TW) / 2; break; } W.EditAreaDrawY = (W.WinHeight - 2) / 2; W.TextY = (W.WinHeight - TH) / 2; W.EditBox.WinLeft = W.EditAreaDrawX + MiscBevelL[B].W; W.EditBox.WinTop = MiscBevelT[B].H; W.EditBox.WinWidth = W.EditBoxWidth - MiscBevelL[B].W - MiscBevelR[B].W; W.EditBox.WinHeight = W.WinHeight - MiscBevelT[B].H - MiscBevelB[B].H; } function Editbox_Draw(UWindowEditControl W, Canvas C) { W.DrawMiscBevel(C, W.EditAreaDrawX, 0, W.EditBoxWidth, W.WinHeight, Misc, EditBoxBevel); if(W.Text != "") { C.DrawColor = W.TextColor; W.ClipText(C, W.TextX, W.TextY, W.Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } } function Tab_DrawTab(UWindowTabControlTabArea Tab, Canvas C, bool bActiveTab, bool bLeftmostTab, float X, float Y, float W, float H, string Text, bool bShowText) { local Region R; local Texture T; local float TW, TH; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; T = Tab.GetLookAndFeelTexture(); if(bActiveTab) { R = TabSelectedL; Tab.DrawStretchedTextureSegment( C, X, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = TabSelectedM; Tab.DrawStretchedTextureSegment( C, X+TabSelectedL.W, Y, W - TabSelectedL.W - TabSelectedR.W, R.H, R.X, R.Y, R.W, R.H, T ); R = TabSelectedR; Tab.DrawStretchedTextureSegment( C, X + W - R.W, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); C.Font = Tab.Root.Fonts[Tab.F_Bold]; C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; if(bShowText) { Tab.TextSize(C, Text, TW, TH); Tab.ClipText(C, X + (W-TW)/2, Y + 3, Text, True); } } else { R = TabUnselectedL; Tab.DrawStretchedTextureSegment( C, X, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); R = TabUnselectedM; Tab.DrawStretchedTextureSegment( C, X+TabUnselectedL.W, Y, W - TabUnselectedL.W - TabUnselectedR.W, R.H, R.X, R.Y, R.W, R.H, T ); R = TabUnselectedR; Tab.DrawStretchedTextureSegment( C, X + W - R.W, Y, R.W, R.H, R.X, R.Y, R.W, R.H, T ); C.Font = Tab.Root.Fonts[Tab.F_Normal]; C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; if(bShowText) { Tab.TextSize(C, Text, TW, TH); Tab.ClipText(C, X + (W-TW)/2, Y + 4, Text, True); } } } function SB_SetupUpButton(UWindowSBUpButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBUpUp; W.DownRegion = SBUpDown; W.OverRegion = SBUpUp; W.DisabledRegion = SBUpDisabled; } function SB_SetupDownButton(UWindowSBDownButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBDownUp; W.DownRegion = SBDownDown; W.OverRegion = SBDownUp; W.DisabledRegion = SBDownDisabled; } function SB_SetupLeftButton(UWindowSBLeftButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBLeftUp; W.DownRegion = SBLeftDown; W.OverRegion = SBLeftUp; W.DisabledRegion = SBLeftDisabled; } function SB_SetupRightButton(UWindowSBRightButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBRightUp; W.DownRegion = SBRightDown; W.OverRegion = SBRightUp; W.DisabledRegion = SBRightDisabled; } function SB_VDraw(UWindowVScrollbar W, Canvas C) { local Region R; local Texture T; T = W.GetLookAndFeelTexture(); R = SBBackground; W.DrawStretchedTextureSegment( C, 0, 0, W.WinWidth, W.WinHeight, R.X, R.Y, R.W, R.H, T); if(!W.bDisabled) { W.DrawUpBevel( C, 0, W.ThumbStart, Size_ScrollbarWidth, W.ThumbHeight, T); } } function SB_HDraw(UWindowHScrollbar W, Canvas C) { local Region R; local Texture T; T = W.GetLookAndFeelTexture(); R = SBBackground; W.DrawStretchedTextureSegment( C, 0, 0, W.WinWidth, W.WinHeight, R.X, R.Y, R.W, R.H, T); if(!W.bDisabled) { W.DrawUpBevel( C, W.ThumbStart, 0, W.ThumbWidth, Size_ScrollbarWidth, T); } } function Tab_SetupLeftButton(UWindowTabControlLeftButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.WinWidth = Size_ScrollbarButtonHeight; W.WinHeight = Size_ScrollbarWidth; W.WinTop = Size_TabAreaHeight - W.WinHeight; W.WinLeft = W.ParentWindow.WinWidth - 2*W.WinWidth; W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBLeftUp; W.DownRegion = SBLeftDown; W.OverRegion = SBLeftUp; W.DisabledRegion = SBLeftDisabled; } function Tab_SetupRightButton(UWindowTabControlRightButton W) { local Texture T; T = W.GetLookAndFeelTexture(); W.WinWidth = Size_ScrollbarButtonHeight; W.WinHeight = Size_ScrollbarWidth; W.WinTop = Size_TabAreaHeight - W.WinHeight; W.WinLeft = W.ParentWindow.WinWidth - W.WinWidth; W.bUseRegion = True; W.UpTexture = T; W.DownTexture = T; W.OverTexture = T; W.DisabledTexture = T; W.UpRegion = SBRightUp; W.DownRegion = SBRightDown; W.OverRegion = SBRightUp; W.DisabledRegion = SBRightDisabled; } function Tab_SetTabPageSize(UWindowPageControl W, UWindowPageWindow P) { P.WinLeft = 2; P.WinTop = W.TabArea.WinHeight-(TabSelectedM.H-TabUnselectedM.H) + 3; P.SetSize(W.WinWidth - 4, W.WinHeight-(W.TabArea.WinHeight-(TabSelectedM.H-TabUnselectedM.H)) - 6); } function Tab_DrawTabPageArea(UWindowPageControl W, Canvas C, UWindowPageWindow P) { W.DrawUpBevel( C, 0, Size_TabAreaHeight, W.WinWidth, W.WinHeight-Size_TabAreaHeight, W.GetLookAndFeelTexture()); } function Tab_GetTabSize(UWindowTabControlTabArea Tab, Canvas C, string Text, out float W, out float H) { local float TW, TH; C.Font = Tab.Root.Fonts[Tab.F_Normal]; Tab.TextSize( C, Text, TW, TH ); W = TW + Size_TabSpacing; H = TH; } function Menu_DrawMenuBar(UWindowMenuBar W, Canvas C) { W.DrawStretchedTexture( C, 16, 0, W.WinWidth - 32, 16, Texture'UWindow.MenuBar'); } function Menu_DrawMenuBarItem(UWindowMenuBar B, UWindowMenuBarItem I, float X, float Y, float W, float H, Canvas C) { if(B.Selected == I) { B.DrawClippedTexture(C, X, 1, Texture'MenuHighlightL'); B.DrawClippedTexture(C, X+W-1, 1, Texture'MenuHighlightR'); B.DrawStretchedTexture(C, X+1, 1, W-2, 16, Texture'MenuHighlightM'); } C.Font = B.Root.Fonts[F_Normal]; C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; B.ClipText(C, X + B.Spacing / 2, 2, I.Caption, True); } function Menu_DrawPulldownMenuBackground(UWindowPulldownMenu W, Canvas C) { W.DrawClippedTexture(C, 0, 0, Texture'UWindow.MenuTL'); W.DrawStretchedTexture(C, 2, 0, W.WinWidth-4, 2, Texture'UWindow.MenuT'); W.DrawClippedTexture(C, W.WinWidth-2, 0, Texture'UWindow.MenuTR'); W.DrawClippedTexture(C, 0, W.WinHeight-2, Texture'UWindow.MenuBL'); W.DrawStretchedTexture(C, 2, W.WinHeight-2, W.WinWidth-4, 2, Texture'UWindow.MenuB'); W.DrawClippedTexture(C, W.WinWidth-2, W.WinHeight-2, Texture'UWindow.MenuBR'); W.DrawStretchedTexture(C, 0, 2, 2, W.WinHeight-4, Texture'UWindow.MenuL'); W.DrawStretchedTexture(C, W.WinWidth-2, 2, 2, W.WinHeight-4, Texture'UWindow.MenuR'); W.DrawStretchedTexture(C, 2, 2, W.WinWidth-4, W.WinHeight-4, Texture'UWindow.MenuArea'); } function Menu_DrawPulldownMenuItem(UWindowPulldownMenu M, UWindowPulldownMenuItem Item, Canvas C, float X, float Y, float W, float H, bool bSelected) { C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; Item.ItemTop = Y + M.WinTop; if(Item.Caption == "-") { C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; M.DrawStretchedTexture(C, X, Y+5, W, 2, Texture'UWindow.MenuDivider'); return; } C.Font = M.Root.Fonts[F_Normal]; if(bSelected) M.DrawStretchedTexture(C, X, Y, W, H, Texture'UWindow.MenuHighlight'); if(Item.bDisabled) { // Black Shadow C.DrawColor.R = 96; C.DrawColor.G = 96; C.DrawColor.B = 96; } else { C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; } // DrawColor will render the tick black white or gray. if(Item.bChecked) M.DrawClippedTexture(C, X + 1, Y + 3, Texture'MenuTick'); if(Item.SubMenu != None) M.DrawClippedTexture(C, X + W - 9, Y + 3, Texture'MenuSubArrow'); M.ClipText(C, X + M.TextBorder + 2, Y + 3, Item.Caption, True); } X+@5 BY+Ԍxxx;aGնm;aGxxxնmxնmo նm;aGxxxxxx;aGնm;aGնmնmնm;aGնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmնmW_PW_PW_PW_PxW_Po xxxW_PW_PEf$W_PW_Px05o 0505w7`w7`w7`w7`AAw7`05Aw7`w7`w7`05c 7Dc 7Dc 7Dc 7Dc 7Dc 7Dc 7D.'lc 7Dc 7Dc 7Dc 7Dc 7Dc 7Dc 7Dc 7Dc 7Dc 7DdezPdezPdezPdezPdezPdezPdezP.'ldezPdezPdezPdezPdezPdezPdezPdezPdezPdezP%K%K%K%K%K%K%K%K }i}i}i}i}i}i}i}i}i}i{{{{{{{{{{B[@B[@B[@B[@B[@B[@B[@B[@B[@B[@~4~4~4~4~4~4~4~4~4~4xxx05050505x05o 05xxx0505050505x05o 05xxx0505#t#t#t#t#tx#t#t#t#t#txxxx#to #t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t,U K/#t#t,U K/#t,U K/#t#t,U K/#tk[1k[1k[1k[1k[1k[1k[1k[1k[1k[1J|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.XJ|.Xچxxx(jbxxxxxx(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb(jb_4_4_4_4_4x_4_4_4_4_4xxxx_4o _4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4,U K/_4_4,U K/_4k[1_4_4,U K/_4_4,U K/_4_4k[1_4_4k[1_4,U K/_4o٦p_4_4o٦p_4,U K/_4`R<_4_4`R<_4,U K/_4o٦p_4o٦p_4`R<_4`R<_4,U K/_4_4,U K/_4_4k[1_4_4k[1_4,U K/_4k[1_4,U K/NA4yNA4yNA4yMMMMMMMMMMMMMMMyYMMyYMyYMyYMyYMyYMyYMyYMyYMyYMyYMyYxxxMMMMMMMMMMMMMMMMMMMMMMMMMMxMo MM.'lxxMMMMxxxMMMMxxxbJ aJ  `J, _J ^J  ]J, \J0 [J0 ZJ(0 YJ$ VJ$ UJ($ XJOSJpRJ pTJppPJ OJ+ Q"k "@G2S I2iK2hL2gN2fJeJ dJ~cJ bJ~ aJ}`J }jJ~}\*[*_"Y"TJZJ RJQJSJOJNJ PJX JJ!UJtUtU!RJwRwR !DJ D D$bJw bw b $_J__,`Jt`t`,fJwfwf ,dJt dt d# HJ< GJ < DJ,< C" EJN@"JP~JP}J7PIJ9PuJ<PLJmPmJOl$@An$ Aj$@i$pAk$@g$Af$?h$pAd$@@c$@@e$A~~e //============================================================================= // UWindowVSplitter - a vertical splitter component //============================================================================= class UWindowVSplitter extends UWindowWindow; var UWindowWindow TopClientWindow; var UWindowWindow BottomClientWindow; var bool bSizing; var float SplitPos; var float MinWinHeight; var float MaxSplitPos; var float OldWinHeight; var bool bBottomGrow; var bool bSizable; function Created() { Super.Created(); bAlwaysBehind = True; SplitPos = WinHeight / 2; MinWinHeight = 24; OldWinHeight = WinHeight; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel(C, 0, SplitPos, WinWidth, 7, T); } function BeforePaint(Canvas C, float X, float Y) { local float NewW, NewH; // Make Top panel resize if(OldWinHeight != WinHeight && !bBottomGrow) { SplitPos = SplitPos + WinHeight - OldWinHeight; } SplitPos = FClamp(SplitPos, MinWinHeight, WinHeight - 7 - MinWinHeight); if(MaxSplitPos != 0) SplitPos = FClamp(SplitPos, 0, MaxSplitPos); NewW = WinWidth; NewH = SplitPos; if(NewW != TopClientWindow.WinWidth || NewH != TopClientWindow.WinHeight) { TopClientWindow.SetSize(NewW, NewH); } NewH = WinHeight - SplitPos - 7; if(NewW != BottomClientWindow.WinWidth || NewH != BottomClientWindow.WinHeight) { BottomClientWindow.SetSize(NewW, NewH); } BottomClientWindow.WinTop = SplitPos + 7; BottomClientWindow.WinLeft = 0; OldWinHeight = WinHeight; } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bSizable && (Y >= SplitPos) && (Y <= SplitPos + 7)) { bSizing = True; Root.CaptureMouse(); } } function MouseMove(float X, float Y) { if(bSizable && (Y >= SplitPos) && (Y <= SplitPos + 7)) Cursor = Root.VSplitCursor; else Cursor = Root.NormalCursor; if(bSizing && bMouseDown) { SplitPos = Y; } else bSizing = False; } Z+S+N [+c1Q`.'lo o o .'l.'l.'l.'l.'l.'l.'l.'lV~~NH$F " wz* VF  ~s+\FM=T.@%wT*T-q|TE \@rzTE \@@T.T  ~t+~~M$~~@E//============================================================================= // UWindowVScrollBar - A vertical scrollbar //============================================================================= class UWindowVScrollBar extends UWindowWindow; var UWindowSBUpButton UpButton; var UWindowSBDownButton DownButton; var bool bDisabled; var float MinPos; var float MaxPos; var float MaxVisible; var float Pos; // offset to WinTop var float ThumbStart, ThumbHeight; var float NextClickTime; var float DragY; var bool bDragging; var float ScrollAmount; function Show(float P) { if(P < 0) return; if(P > MaxPos + MaxVisible) return; while(P < Pos) if(!Scroll(-1)) break; while(P - Pos > MaxVisible - 1) if(!Scroll(1)) break; } function bool Scroll(float Delta) { local float OldPos; OldPos = Pos; Pos = Pos + Delta; CheckRange(); return Pos == OldPos + Delta; } function SetRange(float NewMinPos, float NewMaxPos, float NewMaxVisible, optional float NewScrollAmount) { if(NewScrollAmount == 0) NewScrollAmount = 1; ScrollAmount = NewScrollAmount; MaxPos = NewMaxPos - NewMaxVisible; MaxVisible = NewMaxVisible; CheckRange(); } function CheckRange() { if(Pos < MinPos) { Pos = MinPos; } else { if(Pos > MaxPos) Pos = MaxPos; } bDisabled = (MaxPos <= MinPos); DownButton.bDisabled = bDisabled; UpButton.bDisabled = bDisabled; if(bDisabled) { Pos = 0; } else { ThumbStart = ((Pos - MinPos) * (WinHeight - (2*LookAndFeel.Size_ScrollbarButtonHeight))) / (MaxPos + MaxVisible - MinPos); ThumbHeight = (MaxVisible * (WinHeight - (2*LookAndFeel.Size_ScrollbarButtonHeight))) / (MaxPos + MaxVisible - MinPos); if(ThumbHeight < LookAndFeel.Size_MinScrollbarHeight) ThumbHeight = LookAndFeel.Size_MinScrollbarHeight; if(ThumbHeight + ThumbStart > WinHeight - (2*LookAndFeel.Size_ScrollbarButtonHeight)) { ThumbStart = WinHeight - (2*LookAndFeel.Size_ScrollbarButtonHeight) - ThumbHeight; } ThumbStart = ThumbStart + LookAndFeel.Size_ScrollbarButtonHeight; } } function Created() { Super.Created(); UpButton = UWindowSBUpButton(CreateWindow(class'UWindowSBUpButton', 0, 0, 12, 10)); DownButton = UWindowSBDownButton(CreateWindow(class'UWindowSBDownButton', 0, WinHeight-10, 12, 10)); } function BeforePaint(Canvas C, float X, float Y) { UpButton.WinTop = 0; UpButton.WinLeft = 0; UpButton.WinWidth = LookAndFeel.Size_ScrollbarWidth; UpButton.WinHeight = LookAndFeel.Size_ScrollbarButtonHeight; DownButton.WinTop = WinHeight - LookAndFeel.Size_ScrollbarButtonHeight; DownButton.WinLeft = 0; DownButton.WinWidth = LookAndFeel.Size_ScrollbarWidth; DownButton.WinHeight = LookAndFeel.Size_ScrollbarButtonHeight; CheckRange(); } function Paint(Canvas C, float X, float Y) { LookAndFeel.SB_VDraw(Self, C); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; if(Y < ThumbStart) { Scroll(-(MaxVisible-1)); NextClickTime = GetLevel().TimeSeconds + 0.5; return; } if(Y > ThumbStart + ThumbHeight) { Scroll(MaxVisible-1); NextClickTime = GetLevel().TimeSeconds + 0.5; return; } if((Y >= ThumbStart) && (Y <= ThumbStart + ThumbHeight)) { DragY = Y - ThumbStart; bDragging = True; Root.CaptureMouse(); return; } } function Tick(float Delta) { local bool bUp, bDown; local float X, Y; if(bDragging) return; bUp = False; bDown = False; if(bMouseDown) { GetMouseXY(X, Y); bUp = (Y < ThumbStart); bDown = (Y > ThumbStart + ThumbHeight); } if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds) && bUp) { Scroll(-(MaxVisible-1)); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds) && bDown) { Scroll(MaxVisible-1); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(!bMouseDown || (!bUp && !bDown)) { NextClickTime = 0; } } function MouseMove(float X, float Y) { if(bDragging && bMouseDown && !bDisabled) { while(Y < (ThumbStart+DragY) && Pos > MinPos) { Scroll(-1); } while(Y > (ThumbStart+DragY) && Pos < MaxPos) { Scroll(1); } } else bDragging = False; } ~c7class UWindowURLTextArea expands UWindowDynamicTextArea; var bool bReleased; function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Cursor = Root.NormalCursor; } function Paint(Canvas C, float X, float Y) { Super.Paint(C, X, Y); bReleased = False; } function TextAreaClipText(Canvas C, float DrawX, float DrawY, coerce string S, optional bool bCheckHotkey) { local float X, Y, W, H; local float ClickX, ClickY; local string Text, NextBlock; local byte bLink; local bool bOverLink; Text = S; X = DrawX; Y = DrawY; while(Text != "") { ProcessText(C, Text, NextBlock, W, H, bLink); if(bLink != 0) { C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 255; } else { C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } GetMouseXY(ClickX, ClickY); bOverLink = bLink != 0 && DrawX < ClickX && DrawX + W > ClickX && DrawY < ClickY && DrawY + H > ClickY; if(bOverLink) Cursor = Root.HandCursor; if(bOverLink && (bMouseDown || bReleased)) { if(bReleased) { Log("Clicked URL: >>"$NextBlock$"<<"); if( Left(NextBlock, 7) ~= "http://" ) GetPlayerOwner().ConsoleCommand("start "$NextBlock); if( Left(NextBlock, 6) ~= "ftp://" ) GetPlayerOwner().ConsoleCommand("start "$NextBlock); if( Left(NextBlock, 9) ~= "telnet://" ) GetPlayerOwner().ConsoleCommand("start "$NextBlock); if( Left(NextBlock, 9) ~= "gopher://" ) GetPlayerOwner().ConsoleCommand("start "$NextBlock); if( Left(NextBlock, 4) ~= "www." ) GetPlayerOwner().ConsoleCommand("start http://"$NextBlock); if( Left(NextBlock, 4) ~= "ftp." ) GetPlayerOwner().ConsoleCommand("start ftp://"$NextBlock); else if( Left(NextBlock, 9) ~= "unreal://" ) LaunchUnrealURL(NextBlock); } else { C.DrawColor.R = 255; C.DrawColor.G = 0; C.DrawColor.B = 0; } if(bReleased) bReleased = False; } if(bLink != 0) DrawStretchedTexture(C, DrawX, DrawY+H-1, W, 1, Texture'WhiteTexture'); ClipText(C, DrawX, DrawY, NextBlock); DrawX += W; } } function LaunchUnrealURL(string URL) { GetPlayerOwner().ClientTravel(URL, TRAVEL_Absolute, false); } function Click(float X, float Y) { Super.Click(X, Y); bReleased = True; } function ProcessText(Canvas C, out string Text, out string NextBlock, out float W, out float H, out byte bLink) { local int i, j; local string Temp; i = InStr(Text, "http://"); j = InStr(Text, "www."); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); j = InStr(Text, "unreal://"); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); j = InStr(Text, "ftp://"); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); j = InStr(Text, "ftp."); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); j = InStr(Text, "telnet://"); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); j = InStr(Text, "gopher://"); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); bLink = 0; if(i == -1) { NextBlock = Text; Text = ""; } else if(i == 0) { bLink = 1; i = InStr(Text, " "); if(i == -1) { NextBlock = Text; Text = ""; } else { NextBlock = Left(Text, i); Text = Mid(Text, i); } } else { NextBlock = Left(Text, i); Text = Mid(Text, i); } TextAreaTextSize(C, NextBlock, W, H); } ya+|*xb+JyzZ> Yxxxxxxo > Y> Y> Y> Y> Y> Yxxxo E~~Z1class UWindowTextAreaControl extends UWindowDialogControl; var string TextArea[750]; var string Prompt; var int Font; var Font AbsoluteFont; var int BufSize; var int Head, Tail, Lines, VisibleRows; var bool bCursor; var bool bScrollable; var bool bShowCaret; var bool bScrollOnResize; var UWindowVScrollBar VertSB; var float LastDrawTime; function Created() { Super.Created(); LastDrawTime = GetLevel().TimeSeconds; } function SetScrollable(bool newScrollable) { bScrollable = newScrollable; if(newScrollable) { VertSB = UWindowVScrollbar(CreateWindow(class'UWindowVScrollbar', WinWidth-12, 0, 12, WinHeight)); VertSB.bAlwaysOnTop = True; } else { if (VertSB != None) { VertSB.Close(); VertSB = None; } } } function BeforePaint( Canvas C, float X, float Y ) { Super.BeforePaint(C, X, Y); if(VertSB != None) { VertSB.WinTop = 0; VertSB.WinHeight = WinHeight; VertSB.WinWidth = LookAndFeel.Size_ScrollbarWidth; VertSB.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarWidth; } } function SetAbsoluteFont(Font F) { AbsoluteFont = F; } function Paint( Canvas C, float X, float Y ) { local int i, j, Line; local int TempHead, TempTail; local float XL, YL; local float W, H; if(AbsoluteFont != None) C.Font = AbsoluteFont; else C.Font = Root.Fonts[Font]; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; TextSize(C, "TEST", XL, YL); VisibleRows = WinHeight / YL; TempHead = Head; TempTail = Tail; Line = TempHead; TextArea[Line] = Prompt; if(Prompt == "") { Line--; if(Line < 0) Line += BufSize; } if(bScrollable) { if (VertSB.MaxPos - VertSB.Pos >= 0) { Line -= VertSB.MaxPos - VertSB.Pos; TempTail -= VertSB.MaxPos - VertSB.Pos; if(Line < 0) Line += BufSize; if(TempTail < 0) TempTail += BufSize; } } if(!bCursor) { bShowCaret = False; } else { if((GetLevel().TimeSeconds > LastDrawTime + 0.3) || (GetLevel().TimeSeconds < LastDrawTime)) { LastDrawTime = GetLevel().TimeSeconds; bShowCaret = !bShowCaret; } } for(i=0; iwK*Kw3*_3-U ws*wG*rsGs eGrsIs OGmGAwm*m OIJ"rsGs eIJrsIs OIs*G*I*3T3-G'r3P3PKK**3* ~{+Pz9J.\ %wJ*T-v|JEP\ rzJEP\ \ J.J  ~~~v+~~w+~~~~C }{3 $lc}=ll ~S,eTN%e-'e?e$6e=,6e=,6e=,- w*F@E@-~ Ze-Q'-q-m -C-LeX eN X eN ee@e@f es e6'%6'%6 'D6 'D*FF"EE9F?%FPE?%ERzwRR R rR RR pgFE"$ eFE%#-m -L be ~l~~R+(IF -i'-T'R],L,[,d, R ~x+|W $kc|Kkk ~Lm^ ,;Lmp, , Lm, Lm,  ~k~~C,@#1Y. : ?,A ~|+=  w3G*I*s*33G*I*s*KKKKr333T3-G' ~~~@,fK]L-zLw]*]>]]nw]*] =f3 Yf3-G' ~VG,A,y  ~I]$u *1MJ fPSwf*J J fffM -K b*'J - Ab-jb-q'b-q(bWUUU-f-qU-zU-qb-bb-b-dd-d--qd-d-qu ?bWu ?fPKwf*fu ffu u fffM  ~Aiclass UWindowTabControlTabArea extends UWindowWindow; var int TabOffset; var bool bShowSelected; var UWindowTabControlItem FirstShown; var bool bDragging; var UWindowTabControlItem DragTab; var int TabRows; var globalconfig bool bArrangeRowsLikeTimHates; var float UnFlashTime; var bool bFlashShown; function Created() { TabOffset = 0; Super.Created(); } function SizeTabsSingleLine(Canvas C) { local UWindowTabControlItem I, Selected, LastHidden; local int Count, TabCount; local float ItemX, W, H; local bool bHaveMore; ItemX = LookAndFeel.Size_TabXOffset; TabCount=0; for( I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next); I != None; I = UWindowTabControlItem(I.Next) ) { LookAndFeel.Tab_GetTabSize(Self, C, RemoveAmpersand(I.Caption), W, H); I.TabWidth = W; I.TabHeight = H + 1; I.TabTop = 0; I.RowNumber = 0; TabCount++; } Selected = UWindowTabControl(ParentWindow).SelectedTab; while(True) { ItemX = LookAndFeel.Size_TabXOffset; Count = 0; LastHidden = None; FirstShown = None; for( I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next); I != None; I = UWindowTabControlItem(I.Next) ) { if( Count < TabOffset) { I.TabLeft = -1; LastHidden = I; } else { if(FirstShown == None) FirstShown = I; I.TabLeft = ItemX; if(I.TabLeft + I.TabWidth >= WinWidth + 5) bHaveMore = True; ItemX += I.TabWidth; } Count++; } if( TabOffset > 0 && LastHidden != None && LastHidden.TabWidth + 5 < WinWidth - ItemX) TabOffset--; else if( bShowSelected && TabOffset < TabCount - 1 && Selected != None && Selected != FirstShown && Selected.TabLeft + Selected.TabWidth > WinWidth - 5 ) TabOffset++; else break; } bShowSelected = False; UWindowTabControl(ParentWindow).LeftButton.bDisabled = TabOffset <= 0; UWindowTabControl(ParentWindow).RightButton.bDisabled = !bHaveMore; TabRows = 1; } function SizeTabsMultiLine(Canvas C) { local UWindowTabControlItem I, Selected; local float W, H; local int MinRow; local float RowWidths[10]; local int TabCounts[10]; local int j; local bool bTryAnotherRow; TabOffset = 0; FirstShown = None; TabRows = 1; bTryAnotherRow = True; while(bTryAnotherRow && TabRows <= 10) { bTryAnotherRow = False; for(j=0;j WinWidth) { TabRows ++; bTryAnotherRow = True; break; } else { RowWidths[MinRow] += W; TabCounts[MinRow]++; I.RowNumber = MinRow; } } } Selected = UWindowTabControl(ParentWindow).SelectedTab; if(TabRows > 1) { for( I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next); I != None; I = UWindowTabControlItem(I.Next) ) { I.TabWidth += (WinWidth - RowWidths[I.RowNumber]) / TabCounts[I.RowNumber]; } } for(j=0;j= I.TabLeft && X <= I.TabLeft + I.TabWidth && (TabRows==1 || (Y >= I.TabTop && Y <= I.TabTop + I.TabHeight)) ) { if(!UWindowTabControl(ParentWindow).bMultiLine) { bDragging = True; DragTab = I; Root.CaptureMouse(); } UWindowTabControl(ParentWindow).GotoTab(I, True); } } } function MouseMove(float X, float Y) { if(bDragging && bMouseDown) { if(X < DragTab.TabLeft) TabOffset++; if(X > DragTab.TabLeft + DragTab.TabWidth && TabOffset > 0) TabOffset--; } else bDragging = False; } function RMouseDown(float X, float Y) { local UWindowTabControlItem I; local int Count; Super.LMouseDown(X, Y); Count = 0; for( I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next); I != None; I = UWindowTabControlItem(I.Next) ) { if( Count < TabOffset) { Count++; continue; } if( X >= I.TabLeft && X <= I.TabLeft + I.TabWidth ) { I.RightClickTab(); } } } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H, bool bShowText) { if(Item == UWindowTabControl(ParentWindow).SelectedTab) LookAndFeel.Tab_DrawTab(Self, C, True, FirstShown==Item, X, Y, W, H, UWindowTabControlItem(Item).Caption, bShowText); else LookAndFeel.Tab_DrawTab(Self, C, False, FirstShown==Item, X, Y, W, H, UWindowTabControlItem(Item).Caption, bShowText); } function bool CheckMousePassThrough(float X, float Y) { return Y >= LookAndFeel.Size_TabAreaHeight*TabRows; } ~B,ol0md%-| (kwc *oc <c c ohd'-O!-| '  ~N, ~F,I,)-| l ~~~H,K,Dx3-U-| lc xlMwM*_MIMgM`Mw_*M@_I%I_`gg___wIM`IKw`*`K`IKMIMMKIMIr3PI3P`r3P*3P3MM: ~_~~tclass UWindowTabControlRightButton extends UWindowButton; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Tab_SetupRightButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(!bDisabled) UWindowTabControl(ParentWindow).TabArea.TabOffset++; } ~rclass UWindowTabControlLeftButton extends UWindowButton; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Tab_SetupLeftButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(!bDisabled) UWindowTabControl(ParentWindow).TabArea.TabOffset--; } ~tT,wEtH ~Dclass UWindowTabControlItem extends UWindowList; var string Caption; var string HelpText; var UWindowTabControl Owner; var float TabTop; var float TabLeft; var float TabWidth; var float TabHeight; var int RowNumber; var bool bFlash; function SetCaption(string NewCaption) { Caption=NewCaption; } function RightClickTab() { } ~^5class UWindowTabControl extends UWindowListControl; var UWindowTabControlLeftButton LeftButton; var UWindowTabControlRightButton RightButton; var UWindowTabControlTabArea TabArea; var UWindowTabControlItem SelectedTab; var bool bMultiLine; var bool bSelectNearestTabOnRemove; function Created() { Super.Created(); SelectedTab = None; TabArea = UWindowTabControlTabArea(CreateWindow(class'UWindowTabControlTabArea', 0, 0, WinWidth - LookAndFeel.Size_ScrollbarWidth - LookAndFeel.Size_ScrollbarWidth - 10, LookAndFeel.Size_TabAreaHeight+LookAndFeel.Size_TabAreaOverhangHeight)); TabArea.bAlwaysOnTop = True; LeftButton = UWindowTabControlLeftButton(CreateWindow(class'UWindowTabControlLeftButton', WinWidth-20, 0, 10, 12)); RightButton = UWindowTabControlRightButton(CreateWindow(class'UWindowTabControlRightButton', WinWidth-10, 0, 10, 12)); } function BeforePaint(Canvas C, float X, float Y) { TabArea.WinTop = 0; TabArea.WinLeft = 0; if(bMultiLine) TabArea.WinWidth = WinWidth; else TabArea.WinWidth = WinWidth - LookAndFeel.Size_ScrollbarWidth - LookAndFeel.Size_ScrollbarWidth - 10; TabArea.LayoutTabs(C); WinHeight = (LookAndFeel.Size_TabAreaHeight * TabArea.TabRows) + LookAndFeel.Size_TabAreaOverhangHeight; TabArea.WinHeight = WinHeight; Super.BeforePaint(C, X, Y); } function SetMultiLine(bool InMultiLine) { bMultiLine = InMultiLine; if(bMultiLine) { LeftButton.HideWindow(); RightButton.HideWindow(); } else { LeftButton.ShowWindow(); RightButton.ShowWindow(); } } function Paint(Canvas C, float X, float Y) { local Region R; local Texture T; T = GetLookAndFeelTexture(); R = LookAndFeel.TabBackground; DrawStretchedTextureSegment( C, 0, 0, WinWidth, LookAndFeel.Size_TabAreaHeight * TabArea.TabRows, R.X, R.Y, R.W, R.H, T ); } function UWindowTabControlItem AddTab(string Caption) { local UWindowTabControlItem I; I = UWindowTabControlItem(Items.Append(ListClass)); I.Owner = Self; I.SetCaption(Caption); if(SelectedTab == None) SelectedTab = I; return I; } function UWindowTabControlItem InsertTab(UWindowTabControlItem BeforeTab, string Caption) { local UWindowTabControlItem I; I = UWindowTabControlItem(BeforeTab.InsertBefore(ListClass)); I.Owner = Self; I.SetCaption(Caption); if(SelectedTab == None) SelectedTab = I; return I; } function GotoTab( UWindowTabControlItem NewSelected, optional bool bByUser ) { if(SelectedTab != NewSelected && bByUser) LookAndFeel.PlayMenuSound(Self, MS_ChangeTab); SelectedTab = NewSelected; TabArea.bShowSelected = True; } function UWindowTabControlItem GetTab( string Caption ) { local UWindowTabControlItem I; for(I = UWindowTabControlItem(Items.Next); I != None; I = UWindowTabControlItem(I.Next)) { if(I.Caption == Caption) return I; } return None; } function DeleteTab( UWindowTabControlItem Tab ) { local UWindowTabControlItem NextTab; local UWindowTabControlItem PrevTab; NextTab = UWindowTabControlItem(Tab.Next); PrevTab = UWindowTabControlItem(Tab.Prev); Tab.Remove(); if(SelectedTab == Tab) { if(bSelectNearestTabOnRemove) { Tab = NextTab; if(Tab == None) Tab = PrevTab; GotoTab(Tab); } else GotoTab(UWindowTabControlItem(Items.Next)); } } ~J,xDGD*PK*G*I*s*T%3-G' ~Q,} }Q&r} T%.w3*3-G'jw} *n} } N} n.N ~i$TZ6wT*X TN TLX N pCreating root window: V* V jewT*T@T@f Ts Tf s 6'%6'%6 'D6 'DR-q-m -~ 'O.f:XBBHCHC-ut.tOYP 7 E %E ,.tOYP7E E  ~nDD ~R,Nb3*P3*K*G*I*s* ~U,W,LpN| Fw| */| >l| |  l ~l~~j,~~c ` c +c cdeG T ~V,yB{*i8y3-G'i ~X~B~],~~i~~f,~~Z,`,>:' ~~~_,b,PT ~~~a,lm &-Ul.<ldlwd*U@ld%ldd1wdll.rd*<ld =l ~bclass UWindowSmallOKButton extends UWindowSmallCloseButton; var localized string OKText; function Created() { Super.Created(); SetText(OKText); } sd,r2B2e,Cp}sВK-OK~~~~n s3b.wb*kwbI* wbpbI3stb.bwp*.pI3st ~vSC Ew3pCalling Sentinel.Validate() from V3C pBEGIN Validate(): V_%`SwS*pChecking item: S_wS3 I.Sentinel reference is brokenwSK` I.Prev reference is brokenmrPSwS* Item is Sentinel.Last but Item has valid NextrS* wPS Item is Item.Next is none, but Item is not Sentinel.Last`S_SS|pEND Validate(): V ~Vclass UWindowSmallCloseButton extends UWindowSmallButton; var localized string CloseText; function Created() { Super.Created(); SetText(CloseText); } function Click(float X, float Y) { UWindowFramedWindow(GetParent(class'UWindowFramedWindow')).Close(); } ~~~o,~~h,r8#$^cr<^^ ~n$~~^~~q,~~l,a<o$2%-Uw* wPm@aP%ZPZ Ka(Z Oa @a%ZZ =aZ ea Z"'rZQ &Q @aZQ %Z Ka( Q %QZZZIrZ*H QwH *rH s*H H SH Ka(Q Oa QZZZGrZ*Q =aQ ea 0Ya ~~~dclass UWindowSmallCancelButton extends UWindowButton; var localized string CancelText; function Created() { Super.Created(); SetText(CancelText); } ~\~~~~t,~~p,HY8 *H*PHHKPH3HG*HI*Hs*PH3T3-G' \r,q2p2w, \x<]]Cancel~~v,Z!5J+$ZcZ!YZZ ~j~~Z~~u,~~x,GYR),G3w*KGGTrPPGKG3GG*GI*Gs*3T3-G' ~F class UWindowSmallButton extends UWindowButton; function Created() { bNoKeyboard = True; Super.Created(); ToolTipString = ""; SetText(""); SetFont(F_Normal); WinHeight = 16; } function AutoWidth(Canvas C) { local float W, H; C.Font = Root.Fonts[Font]; TextSize(C, RemoveAmpersand(Text), W, H); if(WinWidth < W + 10) WinWidth = W + 10; } function BeforePaint(Canvas C, float X, float Y) { local float W, H; C.Font = Root.Fonts[Font]; TextSize(C, RemoveAmpersand(Text), W, H); TextX = (WinWidth-W)/2; TextY = (WinHeight-H)/2; if(bMouseDown) { TextX += 1; TextY += 1; } } function Paint(Canvas C, float X, float Y) { LookAndFeel.Button_DrawSmallButton(Self, C); Super.Paint(C, X, Y); } ~|,o\g-Tu X%LXou u Bru **Xu  ~~~u ~~{,~~A-~~~,Ed r.^ rE* EE\wE*BEEEE! ~n@class UWindowScrollingDialogClient extends UWindowPageWindow; var bool bShowHorizSB; var bool bShowVertSB; var UWindowDialogClientWindow ClientArea; var UWindowDialogClientWindow FixedArea; var class ClientClass; var class FixedAreaClass; var UWindowVScrollBar VertSB; var UWindowHScrollBar HorizSB; var UWindowBitmap BRBitmap; function Created() { Super.Created(); if(FixedAreaClass != None) { FixedArea = UWindowDialogClientWindow(CreateWindow(FixedAreaClass, 0, 0, 100, 100, OwnerWindow)); FixedArea.bAlwaysOnTop = True; } else FixedArea = None; ClientArea = UWindowDialogClientWindow(CreateWindow(ClientClass, 0, 0, WinWidth, WinHeight, OwnerWindow)); VertSB = UWindowVScrollbar(CreateWindow(class'UWindowVScrollbar', WinWidth-12, 0, 12, WinHeight)); VertSB.bAlwaysOnTop = True; VertSB.HideWindow(); HorizSB = UWindowHScrollbar(CreateWindow(class'UWindowHScrollbar', 0, WinHeight-12, WinWidth, 12)); HorizSB.bAlwaysOnTop = True; HorizSB.HideWindow(); BRBitmap = UWindowBitmap(CreateWindow(class'UWindowBitmap', WinWidth-12, WinHeight-12, 12, 12)); BRBitmap.bAlwaysOnTop = True; BRBitmap.HideWindow(); BRBitmap.bStretch = True; } function BeforePaint(Canvas C, float X, float Y) { local float ClientWidth, ClientHeight; local float FixedHeight; if(FixedArea != None) FixedHeight = FixedArea.WinHeight; else FixedHeight = 0; ClientWidth = ClientArea.DesiredWidth; ClientHeight = ClientArea.DesiredHeight; if(ClientWidth <= WinWidth) ClientWidth = WinWidth; if(ClientHeight <= WinHeight - FixedHeight) ClientHeight = WinHeight - FixedHeight; ClientArea.SetSize(ClientWidth, ClientHeight); bShowVertSB = (ClientHeight > WinHeight - FixedHeight); bShowHorizSB = (ClientWidth > WinWidth); if(bShowHorizSB) { // re-examine need for vertical SB now we've got smaller client area. ClientHeight = ClientArea.DesiredHeight; if(ClientHeight <= WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight) ClientHeight = WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight; bShowVertSB = (ClientHeight > WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight); } if(bShowVertSB) { VertSB.ShowWindow(); VertSB.WinTop = 0; VertSB.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarWidth; VertSB.WinWidth = LookAndFeel.Size_ScrollbarWidth; if(bShowHorizSB) { BRBitmap.ShowWindow(); BRBitmap.WinWidth = LookAndFeel.Size_ScrollbarWidth; BRBitmap.WinHeight = LookAndFeel.Size_ScrollbarWidth; BRBitmap.WinTop = WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight; BRBitmap.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarWidth; BRBitmap.T = GetLookAndFeelTexture(); //BRBitmap.R = LookAndFeel.SBBackground; VertSB.WinHeight = WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight; } else { BRBitmap.HideWindow(); VertSB.WinHeight = WinHeight - FixedHeight; } VertSB.SetRange(0, ClientHeight, VertSB.WinHeight, 10); } else { BRBitmap.HideWindow(); VertSB.HideWindow(); VertSB.Pos = 0; } if(bShowHorizSB) { HorizSB.ShowWindow(); HorizSB.WinLeft = 0; HorizSB.WinTop = WinHeight - LookAndFeel.Size_ScrollbarWidth - FixedHeight; HorizSB.WinHeight = LookAndFeel.Size_ScrollbarWidth; if(bShowVertSB) HorizSB.WinWidth = WinWidth - LookAndFeel.Size_ScrollbarWidth; else HorizSB.WinWidth = WinWidth; HorizSB.SetRange(0, ClientWidth, HorizSB.WinWidth, 10); } else { HorizSB.HideWindow(); HorizSB.Pos = 0; } ClientArea.WinLeft = -HorizSB.Pos; ClientArea.WinTop = -VertSB.Pos; if(FixedArea != None) { FixedArea.WinLeft = 0; FixedArea.WinTop = WinHeight - FixedHeight; if(FixedArea.WinWidth != WinWidth) FixedArea.SetSize(WinWidth, FixedArea.WinHeight); } Super.BeforePaint(C, X, Y); } function GetDesiredDimensions(out float W, out float H) { Super(UWindowWindow).GetDesiredDimensions(W, H); } function Paint(Canvas C, float X, float Y) { } ~C-{ /4T%s*G*I*-G'*P AD-l"HAF-$AH~H~H~H~H~ԌԌԌ Ԍ ԌZ>CrZ>CrԌZ>CrԌZ>CrԌZ>CrԌZ>Cr ԌZ>Cr Z>Cr %K%K%KԌ%KԌ%KԌ%K%K%K%K%KH~%KH~ H~H~H~H~H~H~ %K%KZ>CrZ>CrZ>CrAH~~B-~~_i+N-# ~~~C E`@0S .`[ ._S [ SS ER[ E~zSR%sSR&S [  ~,~~y$X-q ~S ~~P-~~C~~i/~~cT-N :]cN [-lwN   wN _wN  _ ~j//============================================================================= // UWindowSBUpButton - Scrollbar up button //============================================================================= class UWindowSBUpButton extends UWindowButton; var float NextClickTime; function Created() { bNoKeyboard = True; Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.SB_SetupUpButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; UWindowVScrollBar(ParentWindow).Scroll(-UWindowVScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.5; } function Tick(float Delta) { if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds)) { UWindowVScrollBar(ParentWindow).Scroll(-UWindowVScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(!bMouseDown) { NextClickTime = 0; } } ~t//============================================================================= // UWindowSBRightButton - Scrollbar right button //============================================================================= class UWindowSBRightButton extends UWindowButton; var float NextClickTime; function Created() { bNoKeyboard = True; Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.SB_SetupRightButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; UWindowHScrollBar(ParentWindow).Scroll(UWindowHScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.5; } function Tick(float Delta) { if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds)) { UWindowHScrollBar(ParentWindow).Scroll(UWindowHScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(!bMouseDown) { NextClickTime = 0; } } ~Y-O _T ~r//============================================================================= // UWindowSBLeftButton - Scrollbar left button //============================================================================= class UWindowSBLeftButton extends UWindowButton; var float NextClickTime; function Created() { bNoKeyboard = True; Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.SB_SetupLeftButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; UWindowHScrollBar(ParentWindow).Scroll(-UWindowHScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.5; } function Tick(float Delta) { if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds)) { UWindowHScrollBar(ParentWindow).Scroll(-UWindowHScrollBar(ParentWindow).ScrollAmount); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(!bMouseDown) { NextClickTime = 0; } } ~a//============================================================================= // UWindowSBDownButton - Scrollbar up button //============================================================================= class UWindowSBDownButton extends UWindowButton; var float NextClickTime; function Created() { bNoKeyboard = True; Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.SB_SetupDownButton(Self); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; UWindowVScrollBar(ParentWindow).Scroll(UWindowVScrollBar(ParentWindow).ScrollAmount); NextClickTime = Root.GetPlayerOwner().Level.TimeSeconds + 0.5; } function Tick(float Delta) { if(bMouseDown && (NextClickTime > 0) && (NextClickTime < Root.GetPlayerOwner().Level.TimeSeconds)) { UWindowVScrollBar(ParentWindow).Scroll(UWindowVScrollBar(ParentWindow).ScrollAmount); NextClickTime = Root.GetPlayerOwner().Level.TimeSeconds + 0.1; } if(!bMouseDown) { NextClickTime = 0; } } ~d//============================================================================= // UWindowRootWindow - the root window. //============================================================================= class UWindowRootWindow extends UWindowWindow; #exec TEXTURE IMPORT NAME=MouseCursor FILE=Textures\MouseCursor.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseMove FILE=Textures\MouseMove.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseDiag1 FILE=Textures\MouseDiag1.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseDiag2 FILE=Textures\MouseDiag2.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseNS FILE=Textures\MouseNS.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseWE FILE=Textures\MouseWE.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseHand FILE=Textures\MouseHand.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseHSplit FILE=Textures\MouseHSplit.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseVSplit FILE=Textures\MouseVSplit.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MouseWait FILE=Textures\MouseWait.bmp GROUP="Icons" FLAGS=2 MIPS=OFF //!! Japanese text (experimental). //#exec OBJ LOAD FILE=..\Textures\Japanese.utx var UWindowWindow MouseWindow; // The window the mouse is over var bool bMouseCapture; var float MouseX, MouseY; var float OldMouseX, OldMouseY; var WindowConsole Console; var UWindowWindow FocusedWindow; var UWindowWindow KeyFocusWindow; // window with keyboard focus var MouseCursor NormalCursor, MoveCursor, DiagCursor1, HandCursor, HSplitCursor, VSplitCursor, DiagCursor2, NSCursor, WECursor, WaitCursor; var bool bQuickKeyEnable; var UWindowHotkeyWindowList HotkeyWindows; var config float GUIScale; var float RealWidth, RealHeight; var Font Fonts[10]; var UWindowLookAndFeel LooksAndFeels[20]; var config string LookAndFeelClass; var bool bRequestQuit; var float QuitTime; var bool bAllowConsole; function BeginPlay() { Root = Self; MouseWindow = Self; KeyFocusWindow = Self; } function UWindowLookAndFeel GetLookAndFeel(String LFClassName) { local int i; local class LFClass; LFClass = class(DynamicLoadObject(LFClassName, class'Class')); for(i=0;i<20;i++) { if(LooksAndFeels[i] == None) { LooksAndFeels[i] = new LFClass; LooksAndFeels[i].Setup(); return LooksAndFeels[i]; } if(LooksAndFeels[i].Class == LFClass) return LooksAndFeels[i]; } Log("Out of LookAndFeel array space!!"); return None; } function Created() { LookAndFeel = GetLookAndFeel(LookAndFeelClass); SetupFonts(); NormalCursor.tex = Texture'MouseCursor'; NormalCursor.HotX = 0; NormalCursor.HotY = 0; NormalCursor.WindowsCursor = Console.Viewport.IDC_ARROW; MoveCursor.tex = Texture'MouseMove'; MoveCursor.HotX = 8; MoveCursor.HotY = 8; MoveCursor.WindowsCursor = Console.Viewport.IDC_SIZEALL; DiagCursor1.tex = Texture'MouseDiag1'; DiagCursor1.HotX = 8; DiagCursor1.HotY = 8; DiagCursor1.WindowsCursor = Console.Viewport.IDC_SIZENWSE; HandCursor.tex = Texture'MouseHand'; HandCursor.HotX = 11; HandCursor.HotY = 1; HandCursor.WindowsCursor = Console.Viewport.IDC_ARROW; HSplitCursor.tex = Texture'MouseHSplit'; HSplitCursor.HotX = 9; HSplitCursor.HotY = 9; HSplitCursor.WindowsCursor = Console.Viewport.IDC_SIZEWE; VSplitCursor.tex = Texture'MouseVSplit'; VSplitCursor.HotX = 9; VSplitCursor.HotY = 9; VSplitCursor.WindowsCursor = Console.Viewport.IDC_SIZENS; DiagCursor2.tex = Texture'MouseDiag2'; DiagCursor2.HotX = 7; DiagCursor2.HotY = 7; DiagCursor2.WindowsCursor = Console.Viewport.IDC_SIZENESW; NSCursor.tex = Texture'MouseNS'; NSCursor.HotX = 3; NSCursor.HotY = 7; NSCursor.WindowsCursor = Console.Viewport.IDC_SIZENS; WECursor.tex = Texture'MouseWE'; WECursor.HotX = 7; WECursor.HotY = 3; WECursor.WindowsCursor = Console.Viewport.IDC_SIZEWE; WaitCursor.tex = Texture'MouseWait'; WECursor.HotX = 6; WECursor.HotY = 9; WECursor.WindowsCursor = Console.Viewport.IDC_WAIT; HotkeyWindows = New class'UWindowHotkeyWindowList'; HotkeyWindows.Last = HotkeyWindows; HotkeyWindows.Next = None; HotkeyWindows.Sentinel = HotkeyWindows; Cursor = NormalCursor; } function MoveMouse(float X, float Y) { local UWindowWindow NewMouseWindow; local float tx, ty; MouseX = X; MouseY = Y; if(!bMouseCapture) NewMouseWindow = FindWindowUnder(X, Y); else NewMouseWindow = MouseWindow; if(NewMouseWindow != MouseWindow) { MouseWindow.MouseLeave(); NewMouseWindow.MouseEnter(); MouseWindow = NewMouseWindow; } if(MouseX != OldMouseX || MouseY != OldMouseY) { OldMouseX = MouseX; OldMouseY = MouseY; MouseWindow.GetMouseXY(tx, ty); MouseWindow.MouseMove(tx, ty); } } function DrawMouse(Canvas C) { local float X, Y; if(Console.Viewport.bWindowsMouseAvailable) { // Set the windows cursor... Console.Viewport.SelectedCursor = MouseWindow.Cursor.WindowsCursor; } else { C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; C.bNoSmooth = True; C.SetPos(MouseX * GUIScale - MouseWindow.Cursor.HotX, MouseY * GUIScale - MouseWindow.Cursor.HotY); C.DrawIcon(MouseWindow.Cursor.tex, 1.0); } /* DEBUG - show which window mouse is over MouseWindow.GetMouseXY(X, Y); C.Font = Fonts[F_Normal]; C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; C.SetPos(MouseX * GUIScale - MouseWindow.Cursor.HotX, MouseY * GUIScale - MouseWindow.Cursor.HotY); C.DrawText( GetPlayerOwner().GetItemName(string(MouseWindow))$" "$int(MouseX * GUIScale)$", "$int(MouseY * GUIScale)$" ("$int(X)$", "$int(Y)$")"); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 0; C.SetPos(-1 + MouseX * GUIScale - MouseWindow.Cursor.HotX, -1 + MouseY * GUIScale - MouseWindow.Cursor.HotY); C.DrawText( GetPlayerOwner().GetItemName(string(MouseWindow))$" "$int(MouseX * GUIScale)$", "$int(MouseY * GUIScale)$" ("$int(X)$", "$int(Y)$")"); */ } function bool CheckCaptureMouseUp() { local float X, Y; if(bMouseCapture) { MouseWindow.GetMouseXY(X, Y); MouseWindow.LMouseUp(X, Y); bMouseCapture = False; return True; } return False; } function bool CheckCaptureMouseDown() { local float X, Y; if(bMouseCapture) { MouseWindow.GetMouseXY(X, Y); MouseWindow.LMouseDown(X, Y); bMouseCapture = False; return True; } return False; } function CancelCapture() { bMouseCapture = False; } function CaptureMouse(optional UWindowWindow W) { bMouseCapture = True; if(W != None) MouseWindow = W; //Log(MouseWindow.Class$": Captured Mouse"); } function Texture GetLookAndFeelTexture() { Return LookAndFeel.Active; } function bool IsActive() { Return True; } function AddHotkeyWindow(UWindowWindow W) { // Log("Adding hotkeys for "$W); UWindowHotkeyWindowList(HotkeyWindows.Insert(class'UWindowHotkeyWindowList')).Window = W; } function RemoveHotkeyWindow(UWindowWindow W) { local UWindowHotkeyWindowList L; // Log("Removing hotkeys for "$W); L = HotkeyWindows.FindWindow(W); if(L != None) L.Remove(); } function WindowEvent(WinMessage Msg, Canvas C, float X, float Y, int Key) { switch(Msg) { case WM_KeyDown: if(HotKeyDown(Key, X, Y)) return; break; case WM_KeyUp: if(HotKeyUp(Key, X, Y)) return; break; } Super.WindowEvent(Msg, C, X, Y, Key); } function bool HotKeyDown(int Key, float X, float Y) { local UWindowHotkeyWindowList l; l = UWindowHotkeyWindowList(HotkeyWindows.Next); while(l != None) { if(l.Window != Self && l.Window.HotKeyDown(Key, X, Y)) return True; l = UWindowHotkeyWindowList(l.Next); } return False; } function bool HotKeyUp(int Key, float X, float Y) { local UWindowHotkeyWindowList l; l = UWindowHotkeyWindowList(HotkeyWindows.Next); while(l != None) { if(l.Window != Self && l.Window.HotKeyUp(Key, X, Y)) return True; l = UWindowHotkeyWindowList(l.Next); } return False; } function CloseActiveWindow() { if(ActiveWindow != None) ActiveWindow.EscClose(); else Console.CloseUWindow(); } function Resized() { ResolutionChanged(WinWidth, WinHeight); } function SetScale(float NewScale) { WinWidth = RealWidth / NewScale; WinHeight = RealHeight / NewScale; GUIScale = NewScale; ClippingRegion.X = 0; ClippingRegion.Y = 0; ClippingRegion.W = WinWidth; ClippingRegion.H = WinHeight; SetupFonts(); Resized(); } function SetupFonts() { //!! Japanese text (experimental). /*if( true ) { Fonts[F_Normal] = Font(DynamicLoadObject("Japanese.Japanese", class'Font')); Fonts[F_Bold] = Font(DynamicLoadObject("Japanese.Japanese", class'Font')); Fonts[F_Large] = Font(DynamicLoadObject("Japanese.Japanese", class'Font')); Fonts[F_LargeBold] = Font(DynamicLoadObject("Japanese.Japanese", class'Font')); return; }*/ if(GUIScale == 2) { Fonts[F_Normal] = Font(DynamicLoadObject("UWindowFonts.Tahoma20", class'Font')); Fonts[F_Bold] = Font(DynamicLoadObject("UWindowFonts.TahomaB20", class'Font')); Fonts[F_Large] = Font(DynamicLoadObject("UWindowFonts.Tahoma30", class'Font')); Fonts[F_LargeBold] = Font(DynamicLoadObject("UWindowFonts.TahomaB30", class'Font')); } else { Fonts[F_Normal] = Font(DynamicLoadObject("UWindowFonts.Tahoma10", class'Font')); Fonts[F_Bold] = Font(DynamicLoadObject("UWindowFonts.TahomaB10", class'Font')); Fonts[F_Large] = Font(DynamicLoadObject("UWindowFonts.Tahoma20", class'Font')); Fonts[F_LargeBold] = Font(DynamicLoadObject("UWindowFonts.TahomaB20", class'Font')); } } function ChangeLookAndFeel(string NewLookAndFeel) { LookAndFeelClass = NewLookAndFeel; SaveConfig(); // Completely restart UWindow system on the next paint Console.ResetUWindow(); } function HideWindow() { } function SetMousePos(float X, float Y) { Console.MouseX = X; Console.MouseY = Y; } function QuitGame() { bRequestQuit = True; QuitTime = 0; NotifyQuitUnreal(); } function DoQuitGame() { SaveConfig(); Console.SaveConfig(); Console.ViewPort.Actor.SaveConfig(); Close(); Console.Viewport.Actor.ConsoleCommand("exit"); } function Tick(float Delta) { if(bRequestQuit) { // Give everything time to close itself down (ie sockets). if(QuitTime > 0.25) DoQuitGame(); QuitTime += Delta; } Super.Tick(Delta); } ~Z-~~m-f "T ~a-~~K!\ Y~.DUw~*9r~K!~~.D~* ~~$~~~~D~G/I!U"W%KD$w6mD*L &&K{Iw6m{*L ,,K]ow6m]*L ,,Kcw6mc*L ,,Krw6mr*L ,@ %n Wn WC~ Cn Wo@ K*I!J!n ?6GoO ?6zoO ~ ?6a o?6u o?6Go?6zo~ O 6mon ?6zoO ~ @ D?@ &?L  ~~~L-@%ki ~~~R E%W#8W ,& (,d  -,( I,d ? t,!ddA?& ,"ddA?&  ~d-~]~e-~^~~&~g-~H~h-~~i-~~j-~~k-~~l-~~f ~~p-D_D ~f-o-W Gr  z r f  tr f Qr   ~r ~z ~r-t)-l'T_(_ ~n-ue 4nu.tf Vwu*Yu|u.tuZu| ~{-=-l(T _-M TJ_ ~~B~~~q-v-F ?.tf 8 t ~~t~u-F!xDof xF!X ~~~N@~~~V~UB.K t MUK{z mK_-w-l-w ~vIVQ,v-VI VIQ ~~~|-UxsOt .VI 8 Vt [Ut \St  ~}-~~d.~~t ~V~E.Y _Y}| ~~-D.| ~~~F.DZ _ZDCB ~NG.M , qMNMFE ~J.Hr TF H ~^class UWindowRightClickMenu expands UWindowPulldownMenu; function Created() { bTransient = True; Super.Created(); } function RMouseDown(float X, float Y) { LMouseDown(X, Y); } function RMouseUp(float X, float Y) { LMouseUp(X, Y); } function CloseUp(optional bool bByOwner) { Super.CloseUp(bByOwner); HideWindow(); } H.y%JI.J!նm~~L.Qe TQL ~@~~Q.K.s Ts ~@~~{iT-v-i ~f.ASGCN0000gST/pN,}gggS}6A/ppp/N,}gg6AgR66gA/pp/N,}gggR66gA/pp/N,}gggR66gA/pp/N,}gggR66DA/pp/N,}gggR66DA/pp/N,}gggR66DA/pp/N,}gg-6wA/p/T/p/F6-6DA/p/TF/p/Fg-6AA/p/Tw/p/F-6oA/p/T/p/F-6}A/p/T/p/F-6|A/p/T /p/F+-6yA/p/T;/p/F/ ~N.NF52{NMq_NQP( ~\.M.9 T9 ~iM  i ~NR.g .Nghe,?&? ~P.RV c}.q :RBB}}V} ~~~~~T.%'?q Cq$}%} ~W.!.q Cq$}}sq}`A}B}B ~X.8q ~Y.[.;=q; ~~W~b.WuY 0_ dW_ nW ~Q@~~~~V~~x//============================================================================= // UWindowPulldownMenuItem //============================================================================= class UWindowPulldownMenuItem extends UWindowList; var string Caption; var Texture Graphic; var byte HotKey; var UWindowPulldownMenu SubMenu; var bool bChecked; var bool bDisabled; var UWindowPulldownMenu Owner; var float ItemTop; function UWindowPulldownMenu CreateSubMenu(class MenuClass, optional UWindowWindow InOwnerWindow) { SubMenu = UWindowPulldownMenu(Owner.ParentWindow.CreateWindow(MenuClass, 0, 0, 100, 100, InOwnerWindow)); SubMenu.HideWindow(); SubMenu.Owner = Self; return SubMenu; } function Select() { if(SubMenu != None) { SubMenu.WinLeft = Owner.WinLeft + Owner.WinWidth - Owner.HBORDER; SubMenu.WinTop = ItemTop - Owner.VBORDER; SubMenu.ShowWindow(); } } function SetCaption(string C) { local string Junk, Junk2; Caption = C; HotKey = Owner.ParseAmpersand(C, Junk, Junk2, False); } function DeSelect() { if(SubMenu != None) { SubMenu.DeSelect(); SubMenu.HideWindow(); } } function CloseUp() { Owner.CloseUp(); } function UWindowMenuBar GetMenuBar() { return Owner.GetMenuBar(); } ~D//============================================================================= // UWindowPulldownMenu //============================================================================= class UWindowPulldownMenu extends UWindowListControl; #exec TEXTURE IMPORT NAME=MenuTick FILE=Textures\MenuTick.bmp GROUP="Icons" FLAGS=2 MIPS=OFF #exec TEXTURE IMPORT NAME=MenuDivider FILE=Textures\MenuDivider.bmp GROUP="Icons" MIPS=OFF #exec TEXTURE IMPORT NAME=MenuSubArrow FILE=Textures\MenuSubArrow.bmp GROUP="Icons" FLAGS=2 MIPS=OFF var UWindowPulldownMenuItem Selected; // Owner is either a UWindowMenuBarItem or UWindowPulldownMenuItem var UWindowList Owner; var int ItemHeight; var int VBorder; var int HBorder; var int TextBorder; // External functions function UWindowPulldownMenuItem AddMenuItem(string C, Texture G) { local UWindowPulldownMenuItem I; I = UWindowPulldownMenuItem(Items.Append(class'UWindowPulldownMenuItem')); I.Owner = Self; I.SetCaption(C); I.Graphic = G; return I; } // Mostly-private funcitons function Created() { ListClass = class'UWindowPulldownMenuItem'; SetAcceptsFocus(); Super.Created(); ItemHeight = LookAndFeel.Pulldown_ItemHeight; VBorder = LookAndFeel.Pulldown_VBorder; HBorder = LookAndFeel.Pulldown_HBorder; TextBorder = LookAndFeel.Pulldown_TextBorder; } function Clear() { Items.Clear(); Selected = None; } function DeSelect() { if(Selected != None) { Selected.DeSelect(); Selected = None; } } function Select(UWindowPulldownMenuItem I) { } function PerformSelect(UWindowPulldownMenuItem NewSelected) { if(Selected != None && NewSelected != Selected) Selected.DeSelect(); if(NewSelected == None) { Selected = None; } else { if(Selected != NewSelected && NewSelected.Caption != "-" && !NewSelected.bDisabled) LookAndFeel.PlayMenuSound(Self, MS_MenuItem); Selected = NewSelected; if(Selected != None) { Selected.Select(); Select(Selected); } } } function SetSelected(float X, float Y) { local UWindowPulldownMenuItem NewSelected; NewSelected = UWindowPulldownMenuItem(Items.FindEntry((Y - VBorder) / ItemHeight)); PerformSelect(NewSelected); } function ShowWindow() { local UWindowPulldownMenuItem I; Super.ShowWindow(); PerformSelect(None); FocusWindow(); } function MouseMove(float X, float Y) { Super.MouseMove(X, Y); SetSelected(X, Y); FocusWindow(); } function LMouseUp(float X, float Y) { If(Selected != None && Selected.Caption != "-" && !Selected.bDisabled) { BeforeExecuteItem(Selected); ExecuteItem(Selected); } Super.LMouseUp(X, Y); } function LMouseDown(float X, float Y) { } function BeforePaint(Canvas C, float X, float Y) { local float W, H, MaxWidth; local int Count; local UWindowPulldownMenuItem I; MaxWidth = 100; Count = 0; C.Font = Root.Fonts[F_Normal]; C.SetPos(0, 0); for( I = UWindowPulldownMenuItem(Items.Next);I != None; I = UWindowPulldownMenuItem(I.Next) ) { Count++; TextSize(C, RemoveAmpersand(I.Caption), W, H); if(W > MaxWidth) MaxWidth = W; } WinWidth = MaxWidth + ((HBorder + TextBorder) * 2); WinHeight = (ItemHeight * Count) + (VBorder * 2); // Take care of bHelp items if( ((UWindowMenuBarItem(Owner) != None) && (UWindowMenuBarItem(Owner).bHelp)) || WinLeft+WinWidth > ParentWindow.WinWidth ) { WinLeft = ParentWindow.WinWidth - WinWidth; } if(UWindowPulldownMenuItem(Owner) != None) { I = UWindowPulldownMenuItem(Owner); if(WinWidth + WinLeft > ParentWindow.WinWidth) WinLeft = I.Owner.WinLeft + I.Owner.HBORDER - WinWidth; } } function Paint(Canvas C, float X, float Y) { local int Count; local UWindowPulldownMenuItem I; DrawMenuBackground(C); Count = 0; for( I = UWindowPulldownMenuItem(Items.Next);I != None; I = UWindowPulldownMenuItem(I.Next) ) { DrawItem(C, I, HBorder, VBorder + (ItemHeight * Count), WinWidth - (2 * HBorder), ItemHeight); Count++; } } function DrawMenuBackground(Canvas C) { LookAndFeel.Menu_DrawPulldownMenuBackground(Self, C); } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { LookAndFeel.Menu_DrawPulldownMenuItem(Self, UWindowPulldownMenuItem(Item), C, X, Y, W, H, Selected == Item); } function BeforeExecuteItem(UWindowPulldownMenuItem I) { LookAndFeel.PlayMenuSound(Self, MS_WindowOpen); } function ExecuteItem(UWindowPulldownMenuItem I) { CloseUp(); } function CloseUp(optional bool bByOwner) { local UWindowPulldownMenuItem I; // tell our owners to close up if(!bByOwner) { if(UWindowPulldownMenuItem(Owner) != None) UWindowPulldownMenuItem(Owner).CloseUp(); if(UWindowMenuBarItem(Owner) != None) UWindowMenuBarItem(Owner).CloseUp(); } // tell our children to close up for( I = UWindowPulldownMenuItem(Items.Next);I != None; I = UWindowPulldownMenuItem(I.Next) ) if(I.SubMenu != None) I.SubMenu.CloseUp(True); } function UWindowMenuBar GetMenuBar() { if(UWindowPulldownMenuItem(Owner) != None) return UWindowPulldownMenuItem(Owner).GetMenuBar(); if(UWindowMenuBarItem(Owner) != None) return UWindowMenuBarItem(Owner).GetMenuBar(); } function FocusOtherWindow(UWindowWindow W) { Super.FocusOtherWindow(W); if(Selected != None) if(W == Selected.SubMenu) return; if(UWindowPulldownMenuItem(Owner) != None) if(UWindowPulldownMenuItem(Owner).Owner == W) return; if(bWindowVisible) CloseUp(); } function KeyDown(int Key, float X, float Y) { local UWindowPulldownMenuItem I; I = Selected; switch(Key) { case 0x26: // Up if(I == None || I == Items.Next) I = UWindowPulldownMenuItem(Items.Last); else I = UWindowPulldownMenuItem(I.Prev); if(I == None) I = UWindowPulldownMenuItem(Items.Last); else if(I.Caption == "-") I = UWindowPulldownMenuItem(I.Prev); if(I == None) I = UWindowPulldownMenuItem(Items.Last); if(I.SubMenu == None) PerformSelect(I); else Selected = I; break; case 0x28: // Down if(I == None) I = UWindowPulldownMenuItem(Items.Next); else I = UWindowPulldownMenuItem(I.Next); if(I == None) I = UWindowPulldownMenuItem(Items.Next); else if(I.Caption == "-") I = UWindowPulldownMenuItem(I.Next); if(I == None) I = UWindowPulldownMenuItem(Items.Next); if(I.SubMenu == None) PerformSelect(I); else Selected = I; break; case 0x25: // Left if(UWindowPulldownMenuItem(Owner) != None) { UWindowPulldownMenuItem(Owner).Owner.PerformSelect(None); UWindowPulldownMenuItem(Owner).Owner.Selected = UWindowPulldownMenuItem(Owner); } if(UWindowMenuBarItem(Owner) != None) UWindowMenuBarItem(Owner).Owner.KeyDown(Key, X, Y); break; case 0x27: // Right if(I != None && I.SubMenu != None) { Selected = None; PerformSelect(I); I.SubMenu.Selected = UWindowPulldownMenuItem(I.SubMenu.Items.Next); } else { if(UWindowPulldownMenuItem(Owner) != None) { UWindowPulldownMenuItem(Owner).Owner.PerformSelect(None); UWindowPulldownMenuItem(Owner).Owner.KeyDown(Key, X, Y); } if(UWindowMenuBarItem(Owner) != None) UWindowMenuBarItem(Owner).Owner.KeyDown(Key, X, Y); } break; case 0x0D: // Enter if(I.SubMenu != None) { Selected = None; PerformSelect(I); } else if(Selected != None && Selected.Caption != "-" && !Selected.bDisabled) { BeforeExecuteItem(Selected); ExecuteItem(Selected); } break; default: } } function KeyUp(int Key, float X, float Y) { local UWindowPulldownMenuItem I; if(Key >= 0x41 && Key <= 0x60) { // Check for hotkeys in each menu item for( I = UWindowPulldownMenuItem(Items.Next);I != None; I = UWindowPulldownMenuItem(I.Next) ) { if(Key == I.HotKey) { PerformSelect(I); if(I != None && I.Caption != "-" && !I.bDisabled) { BeforeExecuteItem(I); ExecuteItem(I); } } } } } function MenuCmd(int Item) { local int j; local UWindowPulldownMenuItem I; for( I = UWindowPulldownMenuItem(Items.Next);I != None; I = UWindowPulldownMenuItem(I.Next) ) { if(j == Item) { PerformSelect(I); if( I.Caption != "-" && !I.bDisabled ) { BeforeExecuteItem(I); ExecuteItem(I); } return; } j++; } } ~n.^.G _ z9 ~kclass UWindowProgressBar extends UWindowWindow; var float Percent; const BlockWidth=7; function SetPercent(float NewPercent) { Percent = NewPercent; } function Paint(Canvas C, float X, float Y) { local float BlockX, BlockW; DrawMiscBevel( C, 0, 0, WinWidth, WinHeight, LookAndFeel.Misc, 2 ); C.DrawColor.R = 192; C.DrawColor.G = 192; C.DrawColor.B = 192; DrawStretchedTextureSegment( C, LookAndFeel.MiscBevelL[2].W, LookAndFeel.MiscBevelT[2].H, WinWidth - LookAndFeel.MiscBevelL[2].W - LookAndFeel.MiscBevelR[2].W, WinHeight - LookAndFeel.MiscBevelT[2].H - LookAndFeel.MiscBevelB[2].H, 0, 0, 1, 1, Texture'WhiteTexture' ); C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 255; BlockX = LookAndFeel.MiscBevelL[2].W + 1; while( BlockX < 1 + LookAndFeel.MiscBevelL[2].W + Percent * (WinWidth - LookAndFeel.MiscBevelL[2].W - LookAndFeel.MiscBevelR[2].W - 2) / 100) { BlockW = Min(BlockWidth, WinWidth - LookAndFeel.MiscBevelR[2].W - BlockX - 1); DrawStretchedTextureSegment( C, BlockX, LookAndFeel.MiscBevelT[2].H + 1, BlockW, WinHeight - LookAndFeel.MiscBevelT[2].H - LookAndFeel.MiscBevelB[2].H - 1, 0, 0, 1, 1, Texture'WhiteTexture' ); BlockX += BlockWidth + 1; } C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } ~~~r`FI r` ~`%i b E%-6D[ i a>i 6g[ o-6}[ i , (?-6|[ i & (?i % (? ~X~UKaZ . 8FZ QZ F~Yrp*pZ Z  c.J3Sh.5.'lԌxxxԌԌԌԌԌԌxxxԌԌԌԌԌԌԌԌxxx~~NI^|I^ ~i.k.T . ~~~Gclass UWindowPageWindow extends UWindowDialogClientWindow; var UWindowPageControlPage OwnerTab; function RightClickTab() { } ~` J |6zOLJ p, ,  LJ ,  LJ ,  7J  ~s.S_y $-M -ST _-M  ~rclass UWindowPageControlPage extends UWindowTabControlItem; var UWindowPageWindow Page; function RightClickTab() { Page.RightClickTab(); } function UWindowPageControlPage NextPage() { return UWindowPageControlPage(Next); } ~~~_ ~~KIclass UWindowPageControl extends UWindowTabControl; function ResolutionChanged(float W, float H) { local UWindowPageControlPage I; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) if(I.Page != None && I != SelectedTab ) I.Page.ResolutionChanged(W, H); if(SelectedTab != None) UWindowPageControlPage(SelectedTab).Page.ResolutionChanged(W, H); } function NotifyQuitUnreal() { local UWindowPageControlPage I; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) if(I.Page != None) I.Page.NotifyQuitUnreal(); } function NotifyBeforeLevelChange() { local UWindowPageControlPage I; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) if(I.Page != None) I.Page.NotifyBeforeLevelChange(); } function NotifyAfterLevelChange() { local UWindowPageControlPage I; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) if(I.Page != None) I.Page.NotifyAfterLevelChange(); } function GetDesiredDimensions(out float W, out float H) { local float MaxW, MaxH, TW, TH; local UWindowPageControlPage I; MaxW = 0; MaxH = 0; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) { if(I.Page != None) I.Page.GetDesiredDimensions(TW, TH); if(TW > MaxW) MaxW = TW; if(TH > MaxH) MaxH = TH; } W = MaxW; H = MaxH + TabArea.WinHeight; } function BeforePaint(Canvas C, float X, float Y) { local float OldWinHeight; local UWindowPageControlPage I; OldWinHeight = WinHeight; Super.BeforePaint(C, X, Y); WinHeight = OldWinHeight; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) LookAndFeel.Tab_SetTabPageSize(Self, I.Page); } function Paint(Canvas C, float X, float Y) { Super.Paint(C, X, Y); LookAndFeel.Tab_DrawTabPageArea(Self, C, UWindowPageControlPage(SelectedTab).Page); } function UWindowPageControlPage AddPage(string Caption, class PageClass, optional name ObjectName) { local UWindowPageControlPage P; P = UWindowPageControlPage(AddTab(Caption)); P.Page = UWindowPageWindow(CreateWindow(PageClass, 0, TabArea.WinHeight-(LookAndFeel.TabSelectedM.H-LookAndFeel.TabUnselectedM.H), WinWidth, WinHeight-(TabArea.WinHeight-(LookAndFeel.TabSelectedM.H-LookAndFeel.TabUnselectedM.H)),,,ObjectName)); P.Page.OwnerTab = P; if(P != SelectedTab) P.Page.HideWindow(); else if(UWindowPageControlPage(SelectedTab) != None && WindowIsVisible()) { UWindowPageControlPage(SelectedTab).Page.ShowWindow(); UWindowPageControlPage(SelectedTab).Page.BringToFront(); } return P; } function UWindowPageControlPage InsertPage(UWindowPageControlPage BeforePage, string Caption, class PageClass, optional name ObjectName) { local UWindowPageControlPage P; if(BeforePage == None) return AddPage(Caption, PageClass); P = UWindowPageControlPage(InsertTab(BeforePage, Caption)); P.Page = UWindowPageWindow(CreateWindow(PageClass, 0, TabArea.WinHeight-(LookAndFeel.TabSelectedM.H-LookAndFeel.TabUnselectedM.H), WinWidth, WinHeight-(TabArea.WinHeight-(LookAndFeel.TabSelectedM.H-LookAndFeel.TabUnselectedM.H)),,,ObjectName)); P.Page.OwnerTab = P; if(P != SelectedTab) P.Page.HideWindow(); else if(UWindowPageControlPage(SelectedTab) != None && WindowIsVisible()) { UWindowPageControlPage(SelectedTab).Page.ShowWindow(); UWindowPageControlPage(SelectedTab).Page.BringToFront(); } return P; } function UWindowPageControlPage GetPage(string Caption) { return UWindowPageControlPage(GetTab(Caption)); } function DeletePage(UWindowPageControlPage P) { P.Page.Close(True); P.Page.HideWindow(); DeleteTab(P); } function Close(optional bool bByParent) { local UWindowPageControlPage I; for(I = UWindowPageControlPage(Items.Next); I != None; I = UWindowPageControlPage(I.Next)) if(I.Page != None) I.Page.Close(True); Super.Close(bByParent); } function GotoTab(UWindowTabControlItem NewSelected, optional bool bByUser) { local UWindowPageControlPage I; Super.GotoTab(NewSelected, bByUser); for(I = UWindowPageControlPage(Items.Next);I != None;I = UWindowPageControlPage(I.Next)) { if(I != NewSelected) I.Page.HideWindow(); } if(UWindowPageControlPage(NewSelected) != None) UWindowPageControlPage(NewSelected).Page.ShowWindow(); } function UWindowPageControlPage FirstPage() { return UWindowPageControlPage(Items.Next); } ~z.X|tL T yX ~GKlNhu.r $:KBBJuuVu ~N\%^H!q.7  p^GAaADy EDeE~6^=,6^=,6^=,e^?|D^E^@?e6^=,6^=,6^=, ~u%^ @_k-H -w^ E?&V `?&6m?t^ V mm6E^ `V Z^ V -H ( ~~~t.!}wu*urr?r{u`?rN u ~x.dF)2GdUr_dFE( ~[ B/bn![ bT b ~~~b c%AEWA~XA vb ADE-r ( ~y.%/m+)wu*u%u ~}.8r ~~.@/;=r; ~~W~G@~~E/ZLiT-L-Z ~D~~vu.x,huaZ?, ^x?D?,D ?,.7  mVD?DZ?, .7  I .7  G .7  V ~H/`Hd6T-H-` ~BLclass UWindowMessageBoxCW expands UWindowDialogClientWindow; var MessageBoxButtons Buttons; var MessageBoxResult EnterResult; var UWindowSmallButton YesButton, NoButton, OKButton, CancelButton; var localized string YesText, NoText, OKText, CancelText; var UWindowMessageBoxArea MessageArea; function Created() { Super.Created(); SetAcceptsFocus(); MessageArea = UWindowMessageBoxArea(CreateWindow(class'UWindowMessageBoxArea', 10, 10, WinWidth-20, WinHeight-44)); } function KeyDown(int Key, float X, float Y) { local UWindowMessageBox P; P = UWindowMessageBox(ParentWindow); if(Key == GetPlayerOwner().EInputKey.IK_Enter && EnterResult != MR_None) { P = UWindowMessageBox(ParentWindow); P.Result = EnterResult; P.Close(); } } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); MessageArea.SetSize(WinWidth-20, WinHeight-44); switch(Buttons) { case MB_YesNoCancel: CancelButton.WinLeft = WinWidth - 52; CancelButton.WinTop = WinHeight - 20; NoButton.WinLeft = WinWidth - 104; NoButton.WinTop = WinHeight - 20; YesButton.WinLeft = WinWidth - 156; YesButton.WinTop = WinHeight - 20; break; case MB_YesNo: NoButton.WinLeft = WinWidth - 52; NoButton.WinTop = WinHeight - 20; YesButton.WinLeft = WinWidth - 104; YesButton.WinTop = WinHeight - 20; break; case MB_OKCancel: CancelButton.WinLeft = WinWidth - 52; CancelButton.WinTop = WinHeight - 20; OKButton.WinLeft = WinWidth - 104; OKButton.WinTop = WinHeight - 20; break; case MB_OK: OKButton.WinLeft = WinWidth - 52; OKButton.WinTop = WinHeight - 20; break; } } function Resized() { Super.Resized(); MessageArea.SetSize(WinWidth-20, WinHeight-44); } function float GetHeight(Canvas C) { return 44 + MessageArea.GetHeight(C); } function Paint(Canvas C, float X, float Y) { local Texture T; Super.Paint(C, X, Y); T = GetLookAndFeelTexture(); DrawUpBevel( C, 0, WinHeight-24, WinWidth, 24, T); } function SetupMessageBoxClient(string InMessage, MessageBoxButtons InButtons, MessageBoxResult InEnterResult) { MessageArea.Message = InMessage; Buttons = InButtons; EnterResult = InEnterResult; // Create buttons switch(Buttons) { case MB_YesNoCancel: CancelButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 52, WinHeight - 20, 48, 16)); CancelButton.SetText(CancelText); if(EnterResult == MR_Cancel) CancelButton.SetFont(F_Bold); else CancelButton.SetFont(F_Normal); NoButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 104, WinHeight - 20, 48, 16)); NoButton.SetText(NoText); if(EnterResult == MR_No) NoButton.SetFont(F_Bold); else NoButton.SetFont(F_Normal); YesButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 156, WinHeight - 20, 48, 16)); YesButton.SetText(YesText); if(EnterResult == MR_Yes) YesButton.SetFont(F_Bold); else YesButton.SetFont(F_Normal); break; case MB_YesNo: NoButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 52, WinHeight - 20, 48, 16)); NoButton.SetText(NoText); if(EnterResult == MR_No) NoButton.SetFont(F_Bold); else NoButton.SetFont(F_Normal); YesButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 104, WinHeight - 20, 48, 16)); YesButton.SetText(YesText); if(EnterResult == MR_Yes) YesButton.SetFont(F_Bold); else YesButton.SetFont(F_Normal); break; case MB_OKCancel: CancelButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 52, WinHeight - 20, 48, 16)); CancelButton.SetText(CancelText); if(EnterResult == MR_Cancel) CancelButton.SetFont(F_Bold); else CancelButton.SetFont(F_Normal); OKButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 104, WinHeight - 20, 48, 16)); OKButton.SetText(OKText); if(EnterResult == MR_OK) OKButton.SetFont(F_Bold); else OKButton.SetFont(F_Normal); break; case MB_OK: OKButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', WinWidth - 52, WinHeight - 20, 48, 16)); OKButton.SetText(OKText); if(EnterResult == MR_OK) OKButton.SetFont(F_Bold); else OKButton.SetFont(F_Normal); break; } } function Notify(UWindowDialogControl C, byte E) { local UWindowMessageBox P; P = UWindowMessageBox(ParentWindow); if(E == DE_Click) { switch(C) { case YesButton: P.Result = MR_Yes; P.Close(); break; case NoButton: P.Result = MR_No; P.Close(); break; case OKButton: P.Result = MR_OK; P.Close(); break; case CancelButton: P.Result = MR_Cancel; P.Close(); break; } } } ~T/DK T%xV$w6mV*z&&xOIw6mO*z,,xhow6mh*z,,xtw6mt*z,,xyw6my*z,l %d Yd YZj Zd Y\l x*Dd L?6G\p j ?6z\p ?6a \?6u \?6G\j p ?6z\6m\d ?6G\p j l D?l &?z ~sJ/i\(-i-ls-i ~~~L/dFWX_Fd-c ~U/V~GAhzVVV&G{~V>~V WGVfVG ~V/eMR_ Me ~~~~~h%ajSppClicked Link: >>a<<X|a,mailto:E&pstart a|a,http://E&pstart a|a,ftp://E&pstart a|a, telnet://E&pstart a7|a, gopher://E&pstart ar|a,www.E&pstart http://a|a,ftp.E&pstart ftp://a|a, unreal://}a ~N/~~b @~~x~&~O/n%mj ~:YJR{ %g %?{ b?g iY?{ ?g sg s{ sg % ~e/@-?b ~@Qb &z@b && h@b }QR{~h>~h hhRzh&"hh&zh&"hh}h&h ~[/hzM_zh-g ~e%~~ReC /W-Z -e7-Z E F UE F  ~K class UWindowMessageBoxArea expands UWindowWindow; var string Message; function float GetHeight(Canvas C) { local float TW, TH, H; local int L; local float OldWinHeight; OldWinHeight = WinHeight; WinHeight = 1000; C.Font = Root.Fonts[F_Normal]; TextSize(C, "A", TW, TH); L = WrapClipText(C, 0, 0, Message,,,, True); H = TH * L; WinHeight = OldWinHeight; return H; } function Paint(Canvas C, float X, float Y) { C.Font = Root.Fonts[F_Normal]; C.DrawColor.R = 0; C.DrawColor.G = 0; C.DrawColor.B = 0; WrapClipText(C, 0, 0, Message); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } ~T D/QVy T Q@ @ ?, VD?D@ ?, .7  I .7  G .7  V.7  #kVQ@  ~} _/L :S} LQ:L, K-lH-M t _Q ~S/N}nEjN$( ~dclass UWindowMessageBox expands UWindowFramedWindow; var MessageBoxResult Result; var float TimeOutTime; var int TimeOut; var bool bSetupSize; var int FrameCount; function SetupMessageBox(string Title, string Message, MessageBoxButtons Buttons, MessageBoxResult InESCResult, optional MessageBoxResult InEnterResult, optional int InTimeOut) { WindowTitle = Title; UWindowMessageBoxCW(ClientArea).SetupMessageBoxClient(Message, Buttons, InEnterResult); Result = InESCResult; TimeOutTime = 0; TimeOut = InTimeOut; FrameCount = 0; } function BeforePaint(Canvas C, float X, float Y) { local Region R; if(!bSetupSize) { SetSize(200, WinHeight); R = LookAndFeel.FW_GetClientArea(Self); SetSize(200, (WinHeight - R.H) + UWindowMessageBoxCW(ClientArea).GetHeight(C)); WinLeft = int((Root.WinWidth - WinWidth) / 2); WinTop = int((Root.WinHeight - WinHeight) / 2); bSetupSize = True; } Super.BeforePaint(C, X, Y); } function AfterPaint(Canvas C, float X, float Y) { Super.AfterPaint(C, X, Y); if(TimeOut != 0) { FrameCount++; if(FrameCount >= 5) { TimeOutTime = GetEntryLevel().TimeSeconds + TimeOut; TimeOut = 0; } } if(TimeOutTime != 0 && GetEntryLevel().TimeSeconds > TimeOutTime) { TimeOutTime = 0; Close(); } } function Close(optional bool bByParent) { Super.Close(bByParent); OwnerWindow.MessageBoxDone(Self, Result); } ~}//============================================================================= // UWindowMenuBarItem - An Unreal menu bar item //============================================================================= class UWindowMenuBarItem extends UWindowList config; var string Caption; var UWindowMenuBar Owner; var UWindowPulldownMenu Menu; var float ItemLeft; var float ItemWidth; var bool bHelp; var byte HotKey; function SetHelp(bool b) { bHelp = b; } function SetCaption(string C) { local string Junk, Junk2; Caption = C; HotKey = Owner.ParseAmpersand(C, Junk, Junk2, False); } function UWindowPulldownMenu CreateMenu(Class MenuClass) { Menu = UWindowPulldownMenu(Owner.ParentWindow.CreateWindow(MenuClass, 0, 0, 100, 100)); Menu.HideWindow(); Menu.Owner = Self; return Menu; } function DeSelect() { Owner.LookAndFeel.PlayMenuSound(Owner, MS_MenuCloseUp); Menu.DeSelect(); Menu.HideWindow(); } function Select() { Owner.LookAndFeel.PlayMenuSound(Owner, MS_MenuPullDown); Menu.ShowWindow(); Menu.WinLeft = ItemLeft + Owner.WinLeft; Menu.WinTop = 14; Menu.WinWidth = 100; Menu.WinHeight = 100; } function CloseUp() { Owner.CloseUp(); } function UWindowMenuBar GetMenuBar() { return Owner.GetMenuBar(); } ~d/za +0-w-zw-zB.o: o?, @A AD.`: `?, @A AB*D* ~[Q//============================================================================= // UWindowMenuBar - A menu bar //============================================================================= class UWindowMenuBar extends UWindowListControl; var UWindowMenuBarItem Selected; var UWindowMenuBarItem Over; var bool bAltDown; var int Spacing; function Created() { ListClass = class'UWindowMenuBarItem'; SetAcceptsHotKeys(True); Super.Created(); Spacing = 10; } function UWindowMenuBarItem AddHelpItem(string Caption) { Local UWindowMenuBarItem I; I = AddItem(Caption); I.SetHelp(True); return I; } function UWindowMenuBarItem AddItem(string Caption) { local UWindowMenuBarItem I; I = UWindowMenuBarItem(Items.Append(class'UWindowMenuBarItem')); I.Owner = Self; I.SetCaption(Caption); return I; } function ResolutionChanged(float W, float H) { local UWindowMenuBarItem I; for( I = UWindowMenuBarItem(Items.Next);I != None; I = UWindowMenuBarItem(I.Next) ) if(I.Menu != None) I.Menu.ResolutionChanged(W, H); Super.ResolutionChanged(W, H); } function Paint(Canvas C, float MouseX, float MouseY) { local float X; local float W, H; local UWindowMenuBarItem I; DrawMenuBar(C); for( I = UWindowMenuBarItem(Items.Next);I != None; I = UWindowMenuBarItem(I.Next) ) { C.Font = Root.Fonts[F_Normal]; TextSize( C, RemoveAmpersand(I.Caption), W, H ); if(I.bHelp) { DrawItem(C, I, (WinWidth - (W + Spacing)), 1, W + Spacing, 14); } else { DrawItem(C, I, X, 1, W + Spacing, 14); X = X + W + Spacing; } } } function MouseMove(float X, float Y) { local UWindowMenuBarItem I; Super.MouseMove(X, Y); Over = None; for( I = UWindowMenuBarItem(Items.Next);I != None; I = UWindowMenuBarItem(I.Next) ) { if(X >= I.ItemLeft && X <= I.ItemLeft + I.ItemWidth) { if(Selected != None) { if(Selected != I) { Selected.DeSelect(); Selected = I; Selected.Select(); Select(Selected); } } else { Over = I; } } } } function MouseLeave() { Super.MouseLeave(); Over=None; } function Select(UWindowMenuBarItem I) { } function LMouseDown(float X, float Y) { local UWindowMenuBarItem I; for( I = UWindowMenuBarItem(Items.Next);I != None; I = UWindowMenuBarItem(I.Next) ) { if(X >= I.ItemLeft && X <= I.ItemLeft + I.ItemWidth) { //Log("Click "$I.Caption); if(Selected != None) { Selected.DeSelect(); } if(Selected == I) { Selected = None; Over = I; } else { Selected = I; Selected.Select(); } Select(Selected); return; } } if(Selected != None) { Selected.DeSelect(); } Selected = None; Select(Selected); } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { local string Text; local string Underline; C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; UWindowMenuBarItem(Item).ItemLeft = X; UWindowMenuBarItem(Item).ItemWidth = W; LookAndFeel.Menu_DrawMenuBarItem(Self, UWindowMenuBarItem(Item), X, Y, W, H, C); } function DrawMenuBar(Canvas C) { DrawStretchedTexture( C, 0, 0, WinWidth, 16, Texture'MenuBar' ); } function CloseUp() { if(Selected != None) { Selected.DeSelect(); Selected = None; } } function Close(optional bool bByParent) { Root.Console.CloseUWindow(); } function UWindowMenuBar GetMenuBar() { return Self; } function bool HotKeyDown(int Key, float X, float Y) { local UWindowMenuBarItem I; if(Key == 0x12) bAltDown = True; if(bAltDown) { // Check for hotkeys in each menu item for( I = UWindowMenuBarItem(Items.Next);I != None; I = UWindowMenuBarItem(I.Next) ) { if(Key == I.HotKey) { if(Selected != None) Selected.DeSelect(); Selected = I; Selected.Select(); Select(Selected); bAltDown = False; return True; } } } return False; } function bool HotKeyUp(int Key, float X, float Y) { if(Key == 0x12) bAltDown = False; return False; } function KeyDown(int Key, float X, float Y) { local UWindowMenuBarItem I; switch(Key) { case 0x25: // Left I = UWindowMenuBarItem(Selected.Prev); if(I==None || I==Items) I = UWindowMenuBarItem(Items.Last); if(Selected != None) Selected.DeSelect(); Selected = I; Selected.Select(); Select(Selected); break; case 0x27: // Right I = UWindowMenuBarItem(Selected.Next); if(I==None) I = UWindowMenuBarItem(Items.Next); if(Selected != None) Selected.DeSelect(); Selected = I; Selected.Select(); Select(Selected); break; } } function MenuCmd(int Menu, int Item) { local UWindowMenuBarItem I; local int j; j=0; for(I = UWindowMenuBarItem(Items.Next); I != None; I = UWindowMenuBarItem(I.Next)) { if(j == Menu && I.Menu != None) { if(Selected != None) Selected.DeSelect(); Selected = I; Selected.Select(); Select(Selected); I.Menu.MenuCmd(Item); return; } j++; } } ~tMclass UWindowLookAndFeel extends UWindowBase; var() Texture Active; // Active widgets, window frames, etc. var() Texture Inactive; // Inactive Widgets, window frames, etc. var() Texture ActiveS; var() Texture InactiveS; var() Texture Misc; // Miscellaneous: backgrounds, bevels, etc. var() Region FrameTL; var() Region FrameT; var() Region FrameTR; var() Region FrameL; var() Region FrameR; var() Region FrameBL; var() Region FrameB; var() Region FrameBR; var() Color FrameActiveTitleColor; var() Color FrameInactiveTitleColor; var() Color HeadingActiveTitleColor; var() Color HeadingInActiveTitleColor; var() int FrameTitleX; var() int FrameTitleY; var() Region BevelUpTL; var() Region BevelUpT; var() Region BevelUpTR; var() Region BevelUpL; var() Region BevelUpR; var() Region BevelUpBL; var() Region BevelUpB; var() Region BevelUpBR; var() Region BevelUpArea; var() Region MiscBevelTL[4]; var() Region MiscBevelT[4]; var() Region MiscBevelTR[4]; var() Region MiscBevelL[4]; var() Region MiscBevelR[4]; var() Region MiscBevelBL[4]; var() Region MiscBevelB[4]; var() Region MiscBevelBR[4]; var() Region MiscBevelArea[4]; var() Region ComboBtnUp; var() Region ComboBtnDown; var() Region ComboBtnDisabled; var() int ColumnHeadingHeight; var() Region HLine; var() Color EditBoxTextColor; var() int EditBoxBevel; var() Region TabSelectedL; var() Region TabSelectedM; var() Region TabSelectedR; var() Region TabUnselectedL; var() Region TabUnselectedM; var() Region TabUnselectedR; var() Region TabBackground; var() float Size_ScrollbarWidth; var() float Size_ScrollbarButtonHeight; // Interchange W and H for horizontal SB's var() float Size_MinScrollbarHeight; var() float Size_TabAreaHeight; // The height of the clickable tab area var() float Size_TabAreaOverhangHeight; // The height of the tab area overhang var() float Size_TabSpacing; var() float Size_TabXOffset; var() float Pulldown_ItemHeight; var() float Pulldown_VBorder; var() float Pulldown_HBorder; var() float Pulldown_TextBorder; function Texture GetTexture(UWindowFramedWindow W) { if(W.bStatusBar) { if(W.IsActive()) return ActiveS; else return InactiveS; } else { if(W.IsActive()) return Active; else return Inactive; } } /* Setup Functions */ function Setup(); function FW_DrawWindowFrame(UWindowFramedWindow W, Canvas C); function Region FW_GetClientArea(UWindowFramedWindow W); function FrameHitTest FW_HitTest(UWindowFramedWindow W, float X, float Y); function FW_SetupFrameButtons(UWindowFramedWindow W, Canvas C); function DrawClientArea(UWindowClientWindow W, Canvas C); function Combo_SetupSizes(UWindowComboControl W, Canvas C); function Combo_Draw(UWindowComboControl W, Canvas C); function Combo_GetButtonBitmaps(UWindowComboButton W); function Combo_SetupLeftButton(UWindowComboLeftButton W); function Combo_SetupRightButton(UWindowComboRightButton W); function Checkbox_SetupSizes(UWindowCheckbox W, Canvas C); function Checkbox_Draw(UWindowCheckbox W, Canvas C); function ComboList_DrawBackground(UWindowComboList W, Canvas C); function ComboList_DrawItem(UWindowComboList Combo, Canvas C, float X, float Y, float W, float H, string Text, bool bSelected); function Editbox_SetupSizes(UWindowEditControl W, Canvas C); function Editbox_Draw(UWindowEditControl W, Canvas C); function SB_SetupUpButton(UWindowSBUpButton W); function SB_SetupDownButton(UWindowSBDownButton W); function SB_SetupLeftButton(UWindowSBLeftButton W); function SB_SetupRightButton(UWindowSBRightButton W); function SB_VDraw(UWindowVScrollbar W, Canvas C); function SB_HDraw(UWindowHScrollbar W, Canvas C); function Tab_DrawTab(UWindowTabControlTabArea Tab, Canvas C, bool bActiveTab, bool bLeftmostTab, float X, float Y, float W, float H, string Text, bool bShowText); function Tab_GetTabSize(UWindowTabControlTabArea Tab, Canvas C, string Text, out float W, out float H); function Tab_SetupLeftButton(UWindowTabControlLeftButton W); function Tab_SetupRightButton(UWindowTabControlRightButton W); function Tab_SetTabPageSize(UWindowPageControl W, UWindowPageWindow P); function Tab_DrawTabPageArea(UWindowPageControl W, Canvas C, UWindowPageWindow P); function Menu_DrawMenuBar(UWindowMenuBar W, Canvas C); function Menu_DrawMenuBarItem(UWindowMenuBar B, UWindowMenuBarItem I, float X, float Y, float W, float H, Canvas C); function Menu_DrawPulldownMenuBackground(UWindowPulldownMenu W, Canvas C); function Menu_DrawPulldownMenuItem(UWindowPulldownMenu M, UWindowPulldownMenuItem Item, Canvas C, float X, float Y, float W, float H, bool bSelected); function Button_DrawSmallButton(UWindowSmallButton B, Canvas C); function PlayMenuSound(UWindowWindow W, MenuSound S); function ControlFrame_SetupSizes(UWindowControlFrame W, Canvas C); function ControlFrame_Draw(UWindowControlFrame W, Canvas C); ~k //============================================================================= // UWindowListControl - Abstract class for list controls // - List boxes // - Dropdown Menus // - Combo Boxes, etc //============================================================================= class UWindowListControl extends UWindowDialogControl; var class ListClass; var UWindowList Items; function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { // Declared in Subclass } function Created() { Super.Created(); Items = New ListClass; Items.Last = Items; Items.Next = None; Items.Prev = None; Items.Sentinel = Items; } ~]class UWindowListBoxItem expands UWindowList; var bool bSelected; var string HelpText; ~mf8mT.,: ,?, TJf?,T-T'i.k: k?, @A AiW_.( :vBB__n_@_-l(|} ~y/yR>FD{yUyvPkHPuyk ~NW//============================================================================= // UWindowListBox - a listbox //============================================================================= class UWindowListBox extends UWindowListControl; var float ItemHeight; var UWindowVScrollbar VertSB; var UWindowListBoxItem SelectedItem; var bool bCanDrag; var bool bCanDragExternal; var string DefaultHelpText; var bool bDragging; var float DragY; var UWindowListBox DoubleClickList; // list to send items to on double-click function Created() { Super.Created(); VertSB = UWindowVScrollbar(CreateWindow(class'UWindowVScrollbar', WinWidth-12, 0, 12, WinHeight)); } function BeforePaint(Canvas C, float MouseX, float MouseY) { local UWindowListBoxItem OverItem; local string NewHelpText; VertSB.SetRange(0, Items.CountShown(), int(WinHeight/ItemHeight)); NewHelpText = DefaultHelpText; if(SelectedItem != None) { OverItem = GetItemAt(MouseX, MouseY); if(OverItem == SelectedItem && OverItem.HelpText != "") NewHelpText = OverItem.HelpText; } if(NewHelpText != HelpText) { HelpText = NewHelpText; Notify(DE_HelpChanged); } } function SetHelpText(string T) { Super.SetHelpText(T); DefaultHelpText = T; } function Sort() { Items.Sort(); } function Paint(Canvas C, float MouseX, float MouseY) { local float y; local UWindowList CurItem; local int i; CurItem = Items.Next; i = 0; while((CurItem != None) && (i < VertSB.Pos)) { if(CurItem.ShowThisItem()) i++; CurItem = CurItem.Next; } for(y=0;(y < WinHeight) && (CurItem != None);CurItem = CurItem.Next) { if(CurItem.ShowThisItem()) { DrawItem(C, CurItem, 0, y, WinWidth - 12, ItemHeight); y = y + ItemHeight; } } } function Resized() { Super.Resized(); VertSB.WinLeft = WinWidth-12; VertSB.WinTop = 0; VertSB.SetSize(12, WinHeight); } function UWindowListBoxItem GetItemAt(float MouseX, float MouseY) { local float y; local UWindowList CurItem; local int i; if(MouseX < 0 || MouseX > WinWidth) return None; CurItem = Items.Next; i = 0; while((CurItem != None) && (i < VertSB.Pos)) { if(CurItem.ShowThisItem()) i++; CurItem = CurItem.Next; } for(y=0;(y < WinHeight) && (CurItem != None);CurItem = CurItem.Next) { if(CurItem.ShowThisItem()) { if(MouseY >= y && MouseY <= y+ItemHeight) return UWindowListBoxItem(CurItem); y = y + ItemHeight; } } return None; } function MakeSelectedVisible() { local UWindowList CurItem; local int i; VertSB.SetRange(0, Items.CountShown(), int(WinHeight/ItemHeight)); if(SelectedItem == None) return; i = 0; for(CurItem=Items.Next; CurItem != None; CurItem = CurItem.Next) { if(CurItem == SelectedItem) break; if(CurItem.ShowThisItem()) i++; } VertSB.Show(i); } function SetSelectedItem(UWindowListBoxItem NewSelected) { if(NewSelected != None && SelectedItem != NewSelected) { if(SelectedItem != None) SelectedItem.bSelected = False; SelectedItem = NewSelected; if(SelectedItem != None) SelectedItem.bSelected = True; Notify(DE_Click); } } function SetSelected(float X, float Y) { local UWindowListBoxItem NewSelected; NewSelected = GetItemAt(X, Y); SetSelectedItem(NewSelected); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); SetSelected(X, Y); if(bCanDrag || bCanDragExternal) { bDragging = True; Root.CaptureMouse(); DragY = Y; } } function DoubleClick(float X, float Y) { Super.DoubleClick(X, Y); if(GetItemAt(X, Y) == SelectedItem) { DoubleClickItem(SelectedItem); } } function ReceiveDoubleClickItem(UWindowListBox L, UWindowListBoxItem I) { I.Remove(); Items.AppendItem(I); SetSelectedItem(I); L.SelectedItem = None; L.Notify(DE_Change); Notify(DE_Change); } function DoubleClickItem(UWindowListBoxItem I) { if(DoubleClickList != None && I != None) DoubleClickList.ReceiveDoubleClickItem(Self, I); } function MouseMove(float X, float Y) { local UWindowListBoxItem OverItem; Super.MouseMove(X, Y); if(bDragging && bMouseDown) { OverItem = GetItemAt(X, Y); if(bCanDrag && OverItem != SelectedItem && OverItem != None && SelectedItem != None) { SelectedItem.Remove(); if(Y < DragY) OverItem.InsertItemBefore(SelectedItem); else OverItem.InsertItemAfter(SelectedItem, True); Notify(DE_Change); DragY = Y; } else { if(bCanDragExternal && CheckExternalDrag(X, Y) != None) bDragging = False; } } else bDragging = False; } function bool ExternalDragOver(UWindowDialogControl ExternalControl, float X, float Y) { local UWindowListBox B; local UWindowListBoxItem OverItem; // Subclass should return false and not call this version if this external // drag should be denied. B = UWindowListBox(ExternalControl); if(B != None && B.SelectedItem != None) { OverItem = GetItemAt(X, Y); B.SelectedItem.Remove(); if(OverItem != None) OverItem.InsertItemBefore(B.SelectedItem); else Items.AppendItem(B.SelectedItem); SetSelectedItem(B.SelectedItem); B.SelectedItem = None; B.Notify(DE_Change); Notify(DE_Change); if(bCanDrag || bCanDragExternal) { Root.CancelCapture(); bDragging = True; bMouseDown = True; Root.CaptureMouse(Self); DragY = Y; } return True; } return False; } ~q%~~yZ/Ns yNO O ?, WD?DO ?, .7  I .7  G .7  W.7  #qWNO  ~~~th/VN  ^?, ,V^FD?D^?, .7  I .7  G .7  ]F ~l/~~p/~~VU  8-m'V ~_//============================================================================= // UWindowList - a generic linked list class //============================================================================= class UWindowList extends UWindowBase; var UWindowList Next; var UWindowList Last; // Only valid for sentinel var UWindowList Prev; var UWindowList Sentinel; var int InternalCount; var bool bItemOrderChanged; var bool bSuspendableSort; var int CompareCount; var bool bSortSuspended; var UWindowList CurrentSortItem; // Binary tree variables for sentinel var bool bTreeSort; // Binary tree variables for each element var UWindowList BranchLeft; var UWindowList BranchRight; var UWindowList ParentNode; /* Tree Sorting: - Items must be added with AppendItem() - Items which require resorting must call MoveItemSorted() - Should call Tick and set bSuspendableSort - for large sorts! */ /********** These things can be called on any element **********/ function UWindowList CreateItem(Class C) { local UWindowList NewElement; NewElement = New C; return NewElement; } function GraftLeft(UWindowList NewLeft) { assert(Sentinel.bTreeSort); BranchLeft = NewLeft; if(NewLeft != None) NewLeft.ParentNode = Self; } function GraftRight(UWindowList NewRight) { assert(Sentinel.bTreeSort); BranchRight = NewRight; if(NewRight != None) NewRight.ParentNode = Self; } // Return rightmost child of subtree function UWindowList RightMost() { local UWindowList L; assert(Sentinel.bTreeSort); if(BranchRight == None) return None; L = Self; while(L.BranchRight != None) L = L.BranchRight; return L; } // Return leftmost child of subtree function UWindowList LeftMost() { local UWindowList L; assert(Sentinel.bTreeSort); if(BranchLeft == None) return None; L = Self; while(L.BranchLeft != None) L = L.BranchLeft; return L; } function Remove() { local UWindowList T; if(Next != None) Next.Prev = Prev; if(Prev != None) Prev.Next = Next; if(Sentinel != None) { if(Sentinel.bTreeSort && ParentNode!=None) { if(BranchLeft != None) { if(ParentNode.BranchLeft == Self) ParentNode.GraftLeft(BranchLeft); if(ParentNode.BranchRight == Self) ParentNode.GraftRight(BranchLeft); // If we had a right branch we better move it // into the far right of the left branch. T = BranchLeft.Rightmost(); if(T != None) T.GraftRight(BranchRight); } else { if(ParentNode.BranchLeft == Self) ParentNode.GraftLeft(BranchRight); if(ParentNode.BranchRight == Self) ParentNode.GraftRight(BranchRight); // no left branch to worry about. } ParentNode = None; BranchLeft = None; BranchRight = None; } Sentinel.InternalCount--; Sentinel.bItemOrderChanged = True; if(Sentinel.Last == Self) Sentinel.Last = Prev; Prev=None; Next=None; /* Sentinel.Validate(); */ Sentinel = None; } } function int Compare(UWindowList T, UWindowList B) { // declare actual sort method in subclass return 0; } // Inserts a new element before us. DO NOT CALL on the sentinel. function UWindowList InsertBefore(Class C) { local UWindowList NewElement; NewElement = CreateItem(C); InsertItemBefore(NewElement); return NewElement; } function UWindowList InsertAfter(Class C) { local UWindowList NewElement; NewElement = CreateItem(C); InsertItemAfter(NewElement); return NewElement; } // Inserts an element before us. DO NOT CALL on the sentinel. function InsertItemBefore(UWindowList NewElement) { assert(Sentinel != Self); NewElement.BranchLeft = None; NewElement.BranchRight = None; NewElement.ParentNode = None; NewElement.Sentinel = Sentinel; NewElement.BranchLeft = None; NewElement.BranchRight = None; NewElement.ParentNode = None; NewElement.Prev = Prev; Prev.Next = NewElement; Prev = NewElement; NewElement.Next = Self; if(Sentinel.Next == Self) Sentinel.Next = NewElement; Sentinel.InternalCount++; Sentinel.bItemOrderChanged = True; } function InsertItemAfter(UWindowList NewElement, optional bool bCheckShowItem) { local UWindowList N; N = Next; if(bCheckShowItem) while(N != None && !N.ShowThisItem()) N = N.Next; if(N != None) N.InsertItemBefore(NewElement); else Sentinel.DoAppendItem(NewElement); Sentinel.bItemOrderChanged = True; } function ContinueSort() { local UWindowList N; CompareCount = 0; bSortSuspended = False; while(CurrentSortItem != None) { N = CurrentSortItem.Next; AppendItem(CurrentSortItem); CurrentSortItem = N; // split sort over multiple frames, if it's BIG if(CompareCount >= 10000 && bSuspendableSort) { bSortSuspended = True; return; } } } function Tick(float Delta) { if(bSortSuspended) ContinueSort(); } function UWindowList Sort() { local UWindowList S; local UWindowList CurrentItem; local UWindowList Previous; local UWindowList Best; local UWindowList BestPrev; if(bTreeSort) { if(bSortSuspended) { ContinueSort(); return Self; } CurrentSortItem = Next; DisconnectList(); ContinueSort(); return Self; } CurrentItem = Self; while(CurrentItem != None) { S = CurrentItem.Next; Best = CurrentItem.Next; Previous = CurrentItem; BestPrev = CurrentItem; // Find the best server while(S != None) { if(CurrentItem.Compare(S, Best) <= 0) { Best = S; BestPrev = Previous; } Previous = S; S = S.Next; } // If we're not already in the right order, move the best one next. if(Best != CurrentItem.Next) { // Delete Best's old position BestPrev.Next = Best.Next; if(BestPrev.Next != None) BestPrev.Next.Prev = BestPrev; // Fix Self and Best Best.Prev = CurrentItem; Best.Next = CurrentItem.Next; CurrentItem.Next.Prev = Best; CurrentItem.Next = Best; // Fix up Sentinel if Best was also Last if(Sentinel.Last == Best) { Sentinel.Last = BestPrev; if(Sentinel.Last == None) Sentinel.Last = Sentinel; } } CurrentItem = CurrentItem.Next; } //Validate(); return Self; } function DisconnectList() { Next=None; Last=Self; Prev=None; BranchLeft = None; BranchRight = None; ParentNode = None; InternalCount = 0; Sentinel.bItemOrderChanged = True; } function DestroyList() { local UWindowList L, Temp; L = Next; InternalCount = 0; if(Sentinel != None) Sentinel.bItemOrderChanged = True; while(L != None) { Temp = L.Next; L.DestroyListItem(); L = Temp; } DestroyListItem(); } function DestroyListItem() { Next=None; Last=Self; Sentinel=None; Prev=None; BranchLeft=None; BranchRight=None; ParentNode=None; } function int CountShown() { local int C; local UWindowList I; for(I = Next;I != None; I = I.Next) if(I.ShowThisItem()) C++; return C; } function UWindowList CopyExistingListItem(Class ItemClass, UWindowList SourceItem) { local UWindowList I; I = Append(ItemClass); Sentinel.bItemOrderChanged = True; return I; } // for Listboxes only (so far) function bool ShowThisItem() { return True; } /********** These things can only be called on the sentinel **********/ function int Count() { return InternalCount; } function MoveItemSorted(UWindowList Item) { local UWindowList L; if(bTreeSort) { Item.Remove(); AppendItem(Item); } else { for(L=Next;L != None; L = L.Next) if(Compare(Item, L) <= 0) break; if(L != Item) { Item.Remove(); if(L == None) AppendItem(Item); else L.InsertItemBefore(Item); } } } function SetupSentinel(optional bool bInTreeSort) { Last = Self; Next = None; Prev = None; BranchLeft = None; BranchRight = None; ParentNode = None; Sentinel = Self; InternalCount = 0; bItemOrderChanged = True; bTreeSort = bInTreeSort; } function Validate() { local UWindowList I, Previous; local int Count; if(Sentinel != Self) { Log("Calling Sentinel.Validate() from "$Self); Sentinel.Validate(); return; } Log("BEGIN Validate(): "$Class); Count = 0; Previous = Self; for(I = Next; I != None; I = I.Next) { Log("Checking item: "$Count); if(I.Sentinel != Self) Log(" I.Sentinel reference is broken"); if(I.Prev != Previous) Log(" I.Prev reference is broken"); if(Last == I && I.Next != None) Log(" Item is Sentinel.Last but Item has valid Next"); if(I.Next == None && Last != I) Log(" Item is Item.Next is none, but Item is not Sentinel.Last"); Previous = I; Count++; } Log("END Validate(): "$Class); } // For sentinel only function UWindowList Append(Class C) { local UWindowList NewElement; NewElement = CreateItem(C); AppendItem(NewElement); return NewElement; } function AppendItem(UWindowList NewElement) { local UWindowList Node, OldNode, Temp; local int Test; if(bTreeSort) { // Check for worst cases! if(Next != None && Last != Self) { if(Compare(NewElement, Last) >= 0) { // put at end of list Node = Last; Node.InsertItemAfter(NewElement, False); Node.GraftRight(NewElement); return; } if(Compare(NewElement, Next) <= 0) { // put at front of list Node = Next; Node.InsertItemBefore(NewElement); Node.GraftLeft(NewElement); return; } } Node = Self; while(True) { if(Node == Self) Test = 1; else Test = Compare(NewElement, Node); // special case for equality if(Test == 0) { Node.InsertItemAfter(NewElement, False); return; } else if(Test > 0) { // Traverse right OldNode = Node; Node = Node.BranchRight; if(Node == None) { // Move past equal values Temp = OldNode; while(Temp.Next != None && Temp.Next.ParentNode == None) Temp = Temp.Next; Temp.InsertItemAfter(NewElement, False); OldNode.GraftRight(NewElement); return; } } else { // Traverse left OldNode = Node; Node = Node.BranchLeft; if(Node == None) { OldNode.InsertItemBefore(NewElement); OldNode.GraftLeft(NewElement); return; } } } } else DoAppendItem(NewElement); } function DoAppendItem(UWindowList NewElement) { NewElement.Next = None; Last.Next = NewElement; NewElement.Prev = Last; NewElement.Sentinel = Self; NewElement.BranchLeft = None; NewElement.BranchRight = None; NewElement.ParentNode = None; Last = NewElement; Sentinel.InternalCount++; Sentinel.bItemOrderChanged = True; } // For sentinel only function UWindowList Insert(Class C) { local UWindowList NewElement; NewElement = CreateItem(C); InsertItem(NewElement); return NewElement; } function InsertItem(UWindowList NewElement) { NewElement.Next = Next; if(Next != None) Next.Prev = NewElement; Next = NewElement; if(Last == Self) Last = Next; NewElement.Prev = Self; NewElement.Sentinel = Self; NewElement.BranchLeft = None; NewElement.BranchRight = None; NewElement.ParentNode = None; Sentinel.InternalCount++; Sentinel.bItemOrderChanged = True; } // For sentinel only function UWindowList FindEntry(int Index) { local UWindowList l; local int i; l = Next; for(i=0;iU-6AX' U/U-6AX( A-6DX'6X-a HREF= /A-6DX(6X NOBR-6oX' /NOBR-6oX( BLINK-6yX' /BLINK-6yX(  ~5Q2B ;5B|9-O.9 zs ~Sm%UT} uL[   L[ >>L[ <<L[ &&UVW[ -Y ~~~N0Zi$Y%[.w[*YZw[}*jw1*1%1[1!!1[} i^ Y[.[  ~o%m&u^ ~y EXYY6E-@-EAC3BWQEAy We ~~~~~/@js  ~F0{.k-'-m -L-'E-L-(::$i'--\w*-Q'q! ~E0~~~~o'M ~H0~~~~|%~~K0~~L0~~M0~~~s ~WG&~#%~ ,%[.1KZr[* r[[.Ptw1*1%1[1!!1# ,'[.1r[*[.w1*1%1[1!!1#  ~P0~~~~~~S0~N~~~~~V0~~~~B&~~Y0~~~~D&|$|9zWWW|?Wz| ~~k~F]0Ps  ~~o~\0_0Ot  ~~`~z~~b0~J~~~Ed0hvJ  ~e0~J~~~Z0',CRI?%I?h Igp~ydy? ~h0~(~~~M&~~k0~(~l0~~m0~~n0~~o0~~p0~~q0@~~~~iO&]aik.{: { A@Ah.}: }?,  A@A ~t0~#~~~Nr0x0 e kkkSk-hhShSh-? ~w0~#~~~z0~~~~~|0~~~B~~~~{~Nu0st  ys ~~}~C1~~B1~ ~~~~~E1~%~~~~W~H1~0~I1~~J1~~K1~~L1~~M1~~N1~~O1~~P1@~~~~~~S1~0~T1~~U1@~~V1~~~~]2 15~~d~_\&r$-T -2 -jVrEe Wg!rEe Wp?V-T ( ~~c~s^1`&  RX ~]1~w~~A~b1 #!w1*1%1* ~`1~w~a1~~~A~k&Mo &XMA ` ~d1~W~~~h ~~g1~W~h1~~i1~~j1~~k1~~l1~~~~g&@~~o1~~~~No&F2 '5g  -gxxg xxt?,t{f?%xxfRxY Y ^ R^ ^ ]RY ^ ^ Rx?,fY ] R] ] ]RY ] ] x?,g  ~r1~~s1~~t1~~u1~~v1~~w1~~x1~~~~fz1v ~{1~!~~~y1}1C ~~1~~~x ~|1@2V2 ~A2~J~~~1C2zp ~D2~J~~~@0~~v&~ O2" " ""*[\g"7~@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ~TF&}k_V N.z[-6wNbI}zjN^-Qc?D^b?,c?Db?,c@m \?-K-K\m ,z.zab}Ng}.za`Z.zg pN_.zag`g`b}N2}_baaV V a-6DNpqpcqcbq \ p\ apG Mm6N-2-r -r j6N-r (}_C36DN~x}}6DNX}c\ ba v}xx-6yN-KT}c\ _-6DN -6ANX}c\ a?&b? vcb,V ?%2}AbV V   B" " ""*ghg"B0~L@                                                                                                                                                                                                                                                                                                                                                                                                                                                                          O2" " ""*lmx"a~9@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Z5" " ""*xyx"#C"~y@                                                                                                                                                                                                                                                                                                                                                                                                                                                               ]5" " ""*"C#&~0@6jj%%%%%%%%%%%66======GGGGGGGG7777777777^^^^^^^^^^^jj"!  *))(''//<<<;: 8 &...>>@@22B44EEEHHHJJLMMMOOOQQRRSS[[[___aaaccddjj,!+  *))(''//<<;;: 8 &...>>@@22BB4EEEHHHJJLLMMOOOQQRRSS[[[___aaaccdjj"!!  *)(''//<<;;: 88 &...>>@@2BBB4EEEHHHJJLLMMOOOQQRRSS[[[___aaaccddjj", *))(''//<<;;:: 8 &...>>@@22B44EEEHHHJJLLMMMOOQQRRRS[[[___aaaccddjj"+  *))(''//<<;;: 88 &...>>@@2BBB4EEEHHHJJLLMMOOOQQRRSS[[[___aaaccddjj",+ *))((('//<<;;: 8 &...>>@@22BB44EEHHHJJLLMMOOOQQRRSS[[[___aaaccddjj"!  *))(''//<<;;: 8 &...>>@@22B44EEEHHHJLLLMMOOOQQRRSS[[[___aaacddjj",!  *))((''//<<;;: 88 &...>>@@22B44EEEHHHJLLLMMOOOQQRRSS[[[___aaacddjj",! *))(''///<<;;: 8 &...>>@@2BBB4EEEHHHJJLLMMOOOQQRRSS[[[___aaaccddjj"+  *))(''///<<;;: 8 &...>>@@22BB4EEEHHHJJLMMMOOOQQRRSS[[[___aaaccddjj,!  *)(''//<<;;: 8 &..>>>@@22B44EEEHHHJJLLMMOOOQQRRSS[[[___aaaccdjj====$$$$$$#######-------999",!! 00001113335FFFFKKKKKPPPPPPPTTTTTTTT]]]]]]Tj===$$$$$######------999",!+  ***???DDDDDDIIIIIINNNNNNNN]]]]\\\\\\bbbbb====$$$$$#####------999",!+  *)))AAAACCCCIIIINNNNNZZZZZZZ\\\\\```````T~ļŽê{{{{{YYY|||||HHHHEEE44BBB2XXXXVVVWWxx|ŽŽ}}}}}zzzzzzzzz{{{yyyyyyyyyyyUUUUffeeiihhhmoorrqpssuuuwvúڵffffeiiihhmmoonrppsssuwvv©úʽٵffffeiiihhmmoonrppsssuwvv©úʽٵeeeeihhhhmonrrqqpssswwv©úٵeeeeihhhhmonrrqqpssswwv©úٵiihhhhmmonrlqpppssuuttvv©úٵiihhhhmmonrlqpppssuuttvv©úٵhhmmmnnlrrpppsssuttvv©úٵhhmmmnnlrrpppsssuttvv©úٵgglllkkkppsssstttvvٵ¹Ǘϛ{Z7~@   ~E2~~uP2 sh ~5o2K ;5KC9-O.9 zs  U5" " ""*rr".~@ U5" " ""*qq"?0~I@~s/ 1 { " " ""*hh"AH4~~_z&z$VG-e zxzx?,G B [G T}-m-2xz-m(  { " " ""*"k\6~ c3" " ""*"8~~h&~&~h2 14~~~a2 3~Z'm U55z~m <<zAm D r Am zD m zz~D >zr rD z&D D z& ~U2 2~~~@' 5~c~~~~l2 13~{|C VzD|% (?o|AP^X[|{ '[^?XV[ ~^2~~B'b2!n ~d4 12~pclass UWindowLayoutBase expands UWindowList; enum EVerticalAlign { VA_Middle, VA_Top, VA_Bottom, }; enum EHorizAlign { HA_Center, HA_Left, HA_Right, }; ~j2~~un2 rv ~C class UWindowLabelControl extends UWindowDialogControl; function Created() { TextX = 0; TextY = 0; } function BeforePaint(Canvas C, float X, float Y) { local float W, H; // Implemented in a child class Super.BeforePaint(C, X, Y); TextSize(C, Text, W, H); WinHeight = H+1; //WinWidth = W+1; TextY = (WinHeight - H) / 2; switch (Align) { case TA_Left: break; case TA_Center: TextX = (WinWidth - W)/2; break; case TA_Right: TextX = WinWidth - W; break; } } function Paint(Canvas C, float X, float Y) { if(Text != "") { C.DrawColor = TextColor; C.Font = Root.Fonts[Font]; ClipText(C, TextX, TextY, Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } } ~VOuV(O ~aTwa(T ~~~s2~~Oat2, .|  ~o V3l., vlo llk ~o ~~aR'~$Oa~u| *|.w|*~|s&~|s|ww1*w1|1%1|1!!1| ||.|0 ~~~Ni2hh% (?6h$6h$6h$[h{6h=,6h=,6h=, ~L 3~{2 15~P|2;jD 6m=,6m=,6m=,{;I;\*m?6 ?6 ?6?6?6 ?6 {z ;*m?6 I;?6 I?6 j?6 ?6?6?6 ?6 {j;r*m;?6 ?6 ?6 ?6?6?6 ?6 {;-@~ u~ v c;*m?6 I?6 ;?6 I?6 ~ ?6?6?6 ?6 {n;*m;?6 ?6 I?6 ;?6 I?6 ~ ?6?6?6 ?6 {j;-@uuv ;r*m;?6 ?6 ?6 ?6?6?6 ?6 {;-@Y;*m?6 v ;?6 ;?6 u?6 m?6 ?6?6?6 ?6 {Wt;*m?6 v ;?6 ;?6 v ?6 u?6 ?6?6?6 ?6 {w;-@mu;*m;?6 ;?6 ?6 ?6 ?6?6?6 ?6 {m;%; (?|r; H;mXm@;8Em?}?|;q;?,;-@6m$6m$6m$;DEm@;?, ;p;?,6m=,6m=,6m=, &p2#B~2&)xxo xxx~~Zclass UWindowHTMLTextRow expands UWindowDynamicTextRow; var HTMLStyle StartStyle; // style at start of line var HTMLStyle EndStyle; // style at end of line var string DisplayString; var string StyleString; ~dclass UWindowHTMLTextArea expands UWindowDynamicTextArea; /* HTML Currently Supported ======================== Parsed on add ------------- ... ...
....

...

Parsed on add and display ------------------------- ... ... ... ... ... Parsed only on display ---------------------- > < &   Planned improvements --------------------
  • item 1
  • item 2...
...
Bugs ---- The parsing is pretty slack! */ // default styles var Color TextColor; var Color BGColor; var Color LinkColor; var Color ALinkColor; var float LastBlinkTime; var bool bShowBlink; var bool bReleased; function SetHTML(string HTML) { Clear(); ReplaceText(HTML, Chr(13)$Chr(10), " "); ReplaceText(HTML, Chr(13), " "); ReplaceText(HTML, Chr(10), " "); AddText(HTML); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Cursor = Root.NormalCursor; } function Paint(Canvas C, float X, float Y) { C.DrawColor = BGColor; DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'WhiteTexture'); Super.Paint(C, X, Y); bReleased = False; } function Click(float X, float Y) { Super.Click(X, Y); bReleased = True; } function ProcessURL(string URL) { Log("Clicked Link: >>"$URL$"<<"); if( Left(URL, 7) ~= "mailto:" ) GetPlayerOwner().ConsoleCommand("start "$URL); if( Left(URL, 7) ~= "http://" ) GetPlayerOwner().ConsoleCommand("start "$URL); if( Left(URL, 6) ~= "ftp://" ) GetPlayerOwner().ConsoleCommand("start "$URL); if( Left(URL, 9) ~= "telnet://" ) GetPlayerOwner().ConsoleCommand("start "$URL); if( Left(URL, 9) ~= "gopher://" ) GetPlayerOwner().ConsoleCommand("start "$URL); if( Left(URL, 4) ~= "www." ) GetPlayerOwner().ConsoleCommand("start http://"$URL); if( Left(URL, 4) ~= "ftp." ) GetPlayerOwner().ConsoleCommand("start ftp://"$URL); else if( Left(URL, 9) ~= "unreal://" ) LaunchUnrealURL(URL); } function OverURL(string URL) { } function LaunchUnrealURL(string URL) { GetPlayerOwner().ClientTravel(URL, TRAVEL_Absolute, false); } function TextAreaTextSize(Canvas C, string Text, out float W, out float H) { ReplaceText(Text, " ", " "); ReplaceText(Text, ">", ">"); ReplaceText(Text, "<", "<"); ReplaceText(Text, "&", "&"); TextSize(C, Text, W, H); } function TextAreaClipText(Canvas C, float DrawX, float DrawY, coerce string Text, optional bool bCheckHotkey) { ReplaceText(Text, " ", " "); ReplaceText(Text, ">", ">"); ReplaceText(Text, "<", "<"); ReplaceText(Text, "&", "&"); ClipText(C, DrawX, DrawY, Text, bCheckHotKey); } /////////////////////////////////////////////////////// // Overloaded functions from UWindowDynamicTextArea /////////////////////////////////////////////////////// function WrapRow(Canvas C, UWindowDynamicTextRow L) { local HTMLStyle CurrentStyle; local UWindowHTMLTextRow R; local string Input, LeftText, HTML, RightText; Super.WrapRow(C, L); // Generate the DisplayString and StyleString lines for each row R = UWindowHTMLTextRow(L); while(R != None && (R == L || R.WrapParent == L)) { R.DisplayString = ""; R.StyleString = ""; CurrentStyle = R.StartStyle; Input = R.Text; while(Input != "") { ParseHTML(Input, LeftText, HTML, RightText); if(LeftText != "" || R.DisplayString == "") { R.DisplayString = R.DisplayString $ LeftText; R.StyleString = R.StyleString $ WriteStyleText(CurrentStyle, Len(LeftText)); } ProcessInlineHTML(HTML, CurrentStyle); SetCanvasStyle(C, CurrentStyle); Input = RightText; } R = UWindowHTMLTextRow(R.Next); } } function float DrawTextLine(Canvas C, UWindowDynamicTextRow L, float Y) { local float X, W, H, MouseX, MouseY; local HTMLStyle CurrentStyle; local float RowHeight; local Color OldColor; local int StylePos, DisplayPos, i; local string S; RowHeight = 0; CurrentStyle = UWindowHTMLTextRow(L).StartStyle; if(CurrentStyle.bCenter) { W = CalcHTMLTextWidth(C, L.Text, CurrentStyle); if(VertSB.bWindowVisible) X = int(((WinWidth - VertSB.WinWidth) - W) / 2); else X = int((WinWidth - W) / 2); } else X = 2; if(GetEntryLevel().TimeSeconds > LastBlinkTime + 0.5) { bShowBlink = !bShowBlink; LastBlinkTime = GetEntryLevel().TimeSeconds; } if(UWindowHTMLTextRow(L).DisplayString == "") SetCanvasStyle(C, CurrentStyle); else { while(DisplayPos < Len(UWindowHTMLTextRow(L).DisplayString)) { i = ReadStyleText(UWindowHTMLTextRow(L).StyleString, StylePos, CurrentStyle); S = Mid(UWindowHTMLTextRow(L).DisplayString, DisplayPos, i); DisplayPos += i; SetCanvasStyle(C, CurrentStyle); TextAreaTextSize(C, S, W, H); if(H > RowHeight) RowHeight = H; if(CurrentStyle.bLink) { GetMouseXY(MouseX, MouseY); if(X < MouseX && X + W > MouseX && Y < MouseY && Y + H > MouseY) { Cursor = Root.HandCursor; OverURL(CurrentStyle.LinkDestination); if(bMouseDown || bReleased) { if(bReleased) { ProcessURL(CurrentStyle.LinkDestination); bReleased = False; } else C.DrawColor = ALinkColor; } } } if(CurrentStyle.BGColor != BGColor) { OldColor = C.DrawColor; C.DrawColor = CurrentStyle.BGColor; DrawStretchedTexture(C, X, Y, W, H, Texture'WhiteTexture'); C.DrawColor = OldColor; } if(!CurrentStyle.bBlink || bShowBlink) TextAreaClipText(C, X, Y, S); if(CurrentStyle.bLink || CurrentStyle.bUnderline) DrawStretchedTexture(C, X, Y+H-1, W, 1, Texture'WhiteTexture'); X += W; } } if(RowHeight == 0) TextAreaTextSize(C, "A", W, RowHeight); return RowHeight; } function UWindowDynamicTextRow SplitRowAt(UWindowDynamicTextRow L, int SplitPos) { local UWindowDynamicTextRow N; local HTMLStyle CurrentStyle; N = Super.SplitRowAt(L, SplitPos); // update the style by processing from the start of L to the split position. UWindowHTMLTextRow(N).EndStyle = UWindowHTMLTextRow(L).EndStyle; CurrentStyle = UWindowHTMLTextRow(L).StartStyle; HTMLUpdateStyle(L.Text, CurrentStyle); UWindowHTMLTextRow(L).EndStyle = CurrentStyle; UWindowHTMLTextRow(N).StartStyle = CurrentStyle; return N; } function RemoveWrap(UWindowDynamicTextRow L) { local UWindowDynamicTextRow N; // copy final endstyle to current row N = UWindowDynamicTextRow(L.Next); while(N != None && N.WrapParent == L) { UWindowHTMLTextRow(L).EndStyle = UWindowHTMLTextRow(N).EndStyle; N = UWindowDynamicTextRow(N.Next); } Super.RemoveWrap(L); } function int GetWrapPos(Canvas C, UWindowDynamicTextRow L, float MaxWidth) { local float W, LineWidth, NextWordWidth; local string Input, NextWord; local int WordsThisRow, WrapPos; local HTMLStyle CurrentStyle; CurrentStyle = UWindowHTMLTextRow(L).StartStyle; // quick check if(CalcHTMLTextWidth(C, L.Text, CurrentStyle) <= MaxWidth) return -1; Input = L.Text; WordsThisRow = 0; LineWidth = 0; WrapPos = 0; NextWord = ""; CurrentStyle = UWindowHTMLTextRow(L).StartStyle; while(Input != "" || NextWord != "") { if(NextWord == "") { RemoveNextWord(Input, NextWord); NextWordWidth = CalcHTMLTextWidth(C, NextWord, CurrentStyle); } if(WordsThisRow > 0 && LineWidth + NextWordWidth > MaxWidth) { return WrapPos; } else { WrapPos += Len(NextWord); LineWidth += NextWordWidth; NextWord = ""; WordsThisRow++; } } return -1; } // Find the next word - but don't split up HTML tags. function RemoveNextWord(out string Text, out string NextWord) { local int i; local bool bInsideTag; local string Ch; bInsideTag = False; for(i=0;i") bInsideTag = False; if(Ch == "<") bInsideTag = True; if(Ch == " " && !bInsideTag) break; } while(Mid(Text, i, 1) == " ") i++; NextWord = Left(Text, i); Text = Mid(Text, i); } function UWindowDynamicTextRow AddText(string NewLine) { local string Input, Output, LeftText, RightText, HTML, Temp; local int i; local UWindowDynamicTextRow L; local HTMLStyle CurrentStyle, StartStyle; if(List.Last == List) { CurrentStyle.BulletLevel = 0; CurrentStyle.LinkDestination = ""; CurrentStyle.TextColor = TextColor; CurrentStyle.BGColor = BGColor; CurrentStyle.bCenter = bHCenter; CurrentStyle.bLink = False; CurrentStyle.bUnderline = False; CurrentStyle.bNoBR = False; CurrentStyle.bHeading = False; CurrentStyle.bBold = False; CurrentStyle.bBlink = False; } else CurrentStyle = UWindowHTMLTextRow(List.Last).EndStyle; StartStyle = CurrentStyle; // convert \\n's ->
's i = InStr(NewLine, "\\n"); while(i != -1) { NewLine = Left(NewLine, i) $ "
" $ Mid(NewLine, i + 2); i = InStr(NewLine, "\\n"); } Input = NewLine; Output = ""; while(Input != "") { ParseHTML(Input, LeftText, HTML, RightText); switch(GetTag(HTML)) { // multiline HTML tags case "P": if((Output $ LeftText) != "") { L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; } StartStyle = CurrentStyle; L = Super.AddText(""); UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; break; case "BR": L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; StartStyle = CurrentStyle; break; case "BODY": Temp = GetOption(HTML, "BGCOLOR="); if(Temp != "") { BGColor = ParseColor(Temp); CurrentStyle.BGColor = BGColor; StartStyle.BGColor = BGColor; } Temp = GetOption(HTML, "LINK="); if(Temp != "") LinkColor = ParseColor(Temp); Temp = GetOption(HTML, "ALINK="); if(Temp != "") ALinkColor = ParseColor(Temp); Temp = GetOption(HTML, "TEXT="); if(Temp != "") { TextColor = ParseColor(Temp); CurrentStyle.TextColor = TextColor; } Output = Output $ LeftText; break; case "CENTER": if((Output $ LeftText) != "") { L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; } CurrentStyle.bCenter = True; StartStyle = CurrentStyle; break; case "/CENTER": L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; CurrentStyle.bCenter = False; StartStyle = CurrentStyle; break; // Inline HTML tags case "H1": if((Output $ LeftText) != "") { L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; } CurrentStyle.bHeading = True; StartStyle = CurrentStyle; break; case "/H1": L = Super.AddText(Output $ LeftText); Output = ""; UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; CurrentStyle.bHeading = False; StartStyle = CurrentStyle; break; case "FONT": Output = Output $ LeftText $ HTML; Temp = GetOption(HTML, "COLOR="); if(Temp != "") CurrentStyle.TextColor = ParseColor(Temp); Temp = GetOption(HTML, "BGCOLOR="); if(Temp != "") CurrentStyle.BGColor = ParseColor(Temp); break; case "/FONT": Output = Output $ LeftText $ HTML; CurrentStyle.TextColor = TextColor; CurrentStyle.BGColor = BGColor; break; case "B": Output = Output $ LeftText $ HTML; CurrentStyle.bBold = True; break; case "/B": Output = Output $ LeftText $ HTML; CurrentStyle.bBold = False; break; case "U": Output = Output $ LeftText $ HTML; CurrentStyle.bUnderline = True; break; case "/U": Output = Output $ LeftText $ HTML; CurrentStyle.bUnderline = False; break; case "A": Output = Output $ LeftText $ HTML; CurrentStyle.bLink = True; CurrentStyle.LinkDestination = GetOption(HTML, "HREF="); break; case "/A": Output = Output $ LeftText $ HTML; CurrentStyle.bLink = False; CurrentStyle.LinkDestination = ""; break; case "NOBR": Output = Output $ LeftText $ HTML; CurrentStyle.bNoBR = True; break; case "/NOBR": Output = Output $ LeftText $ HTML; CurrentStyle.bNoBR = False; break; case "BLINK": Output = Output $ LeftText $ HTML; CurrentStyle.bBlink = True; break; case "/BLINK": Output = Output $ LeftText $ HTML; CurrentStyle.bBlink = False; break; default: Output = Output $ LeftText; break; } Input = RightText; } L = Super.AddText(Output); UWindowHTMLTextRow(L).StartStyle = StartStyle; UWindowHTMLTextRow(L).EndStyle = CurrentStyle; return L; } /////////////////////////////////////////////////// // HTML Text Processing /////////////////////////////////////////////////// // Get the next HTML tag, the text before it and everthing after it. function ParseHTML(string Input, out string LeftText, out string HTML, out string RightText) { local int i; i = InStr(Input, "<"); if(i == -1) { LeftText = Input; HTML = ""; RightText = ""; return; } LeftText = Left(Input, i); HTML = Mid(Input, i); i = InStr(HTML, ">"); if(i == -1) { RightText = ""; return; } RightText = Mid(HTML, i+1); HTML = Left(HTML, i+1); } function float CalcHTMLTextWidth(Canvas C, string Text, out HTMLStyle CurrentStyle) { local string Input, LeftText, HTML, RightText; local float W, H, Width; Width = 0; Input = Text; while(Input != "") { ParseHTML(Input, LeftText, HTML, RightText); SetCanvasStyle(C, CurrentStyle); TextAreaTextSize(C, LeftText, W, H); Width += W; ProcessInlineHTML(HTML, CurrentStyle); Input = RightText; } return Width; } // Update CurrentStyle based on the contents of the HTML tag provided function ProcessInlineHTML(string HTML, out HTMLStyle CurrentStyle) { local string Temp; if(HTML == "") return; switch(GetTag(HTML)) { case "H1": CurrentStyle.bHeading = True; break; case "/H1": CurrentStyle.bHeading = False; break; case "FONT": Temp = GetOption(HTML, "COLOR="); if(Temp != "") CurrentStyle.TextColor = ParseColor(Temp); Temp = GetOption(HTML, "BGCOLOR="); if(Temp != "") CurrentStyle.BGColor = ParseColor(Temp); break; case "/FONT": CurrentStyle.TextColor = TextColor; CurrentStyle.BGColor = BGColor; break; case "B": CurrentStyle.bBold = True; break; case "/B": CurrentStyle.bBold = False; break; case "U": CurrentStyle.bUnderline = True; break; case "/U": CurrentStyle.bUnderline = False; break; case "A": CurrentStyle.bLink = True; CurrentStyle.LinkDestination = GetOption(HTML, "HREF="); break; case "/A": CurrentStyle.bLink = False; CurrentStyle.LinkDestination = ""; break; case "NOBR": CurrentStyle.bNoBR = True; break; case "/NOBR": CurrentStyle.bNoBR = False; break; case "BLINK": CurrentStyle.bBlink = True; break; case "/BLINK": CurrentStyle.bBlink = False; break; } } // update the current style based on some text input function HTMLUpdateStyle(string Input, out HTMLStyle CurrentStyle) { local string LeftText, HTML, RightText; while(Input != "") { ParseHTML(Input, LeftText, HTML, RightText); ProcessInlineHTML(HTML, CurrentStyle); Input = RightText; } } function string GetOption(string HTML, string Option) { local int i, j; local string s; i = InStr(Caps(HTML), Caps(Option)); if(i == 1 || Mid(HTML, i-1, 1) == " ") { s = Mid(HTML, i+Len(Option)); j = FirstMatching(InStr(s, ">"), InStr(s, " ")); s = Left(s, j); if(Left(s, 1) == "\"") s = Mid(s, 1); if(Right(s, 1) == "\"") s = Left(s, Len(s) - 1); return s; } return ""; } function string GetTag(string HTML) { local int i; if(HTML == "") return ""; HTML = Mid(HTML, 1); // lose < i = FirstMatching(InStr(HTML, ">"), InStr(HTML, " ")); if(i == -1) return Caps(HTML); else return Caps(Left(HTML, i)); } function Color ParseColor(string S) { local Color C; if(Left(S, 1) == "#") S = Mid(S, 1); C.R = 16 * GetHexDigit(Mid(S, 0, 1)) + GetHexDigit(Mid(S, 1, 1)); C.G = 16 * GetHexDigit(Mid(S, 2, 1)) + GetHexDigit(Mid(S, 3, 1)); C.B = 16 * GetHexDigit(Mid(S, 4, 1)) + GetHexDigit(Mid(S, 5, 1)); return C; } function int GetHexDigit(string D) { switch(caps(D)) { case "0": return 0; case "1": return 1; case "2": return 2; case "3": return 3; case "4": return 4; case "5": return 5; case "6": return 6; case "7": return 7; case "8": return 8; case "9": return 9; case "A": return 10; case "B": return 11; case "C": return 12; case "D": return 13; case "E": return 14; case "F": return 15; } return 0; } function int FirstMatching(int i, int j) { if(i == -1) return j; if(j == -1) return i; else return Min(i, j); } function SetCanvasStyle(Canvas C, HTMLStyle CurrentStyle) { if(CurrentStyle.bLink) C.DrawColor = LinkColor; else C.DrawColor = CurrentStyle.TextColor; if(CurrentStyle.bHeading) C.Font = Root.Fonts[F_LargeBold]; else if(CurrentStyle.bBold) C.Font = Root.Fonts[F_Bold]; else C.Font = Root.Fonts[F_Normal]; } function string WriteStyleText(HTMLStyle CurrentStyle, int CharCount) { local string Pad; local string Temp; local string Output; Pad = "0000"; Temp = string(CharCount); Output = Left(Pad, 4 - Len(Temp)) $ Temp; Temp = string(Len(CurrentStyle.LinkDestination)); Output = Output $ Left(Pad, 4 - Len(Temp)) $ Temp $ CurrentStyle.LinkDestination; Temp = string(CurrentStyle.TextColor.R); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; Temp = string(CurrentStyle.TextColor.G); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; Temp = string(CurrentStyle.TextColor.B); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; Temp = string(CurrentStyle.BGColor.R); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; Temp = string(CurrentStyle.BGColor.G); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; Temp = string(CurrentStyle.BGColor.B); Output = Output $ Left(Pad, 3 - Len(Temp)) $ Temp; if(CurrentStyle.bCenter) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bLink) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bUnderline) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bNoBR) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bHeading) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bBold) Output = Output $ "T"; else Output = Output $ "F"; if(CurrentStyle.bBlink) Output = Output $ "T"; else Output = Output $ "F"; return Output; } function int ReadStyleText(string StyleString, out int StylePos, out HTMLStyle CurrentStyle) { local string Temp; local int CharCount; local int i; CharCount = Int(Mid(StyleString, StylePos, 4)); StylePos += 4; i = Int(Mid(StyleString, StylePos, 4)); StylePos += 4; CurrentStyle.LinkDestination = Mid(StyleString, StylePos, i); StylePos += i; CurrentStyle.TextColor.R = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.TextColor.G = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.TextColor.B = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.BGColor.R = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.BGColor.G = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.BGColor.B = Int(Mid(StyleString, StylePos, 3)); StylePos += 3; CurrentStyle.bCenter = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bLink = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bUnderline = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bNoBR = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bHeading = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bBold = Mid(StyleString, StylePos++, 1) == "T"; CurrentStyle.bBlink = Mid(StyleString, StylePos++, 1) == "T"; return CharCount; } y@3I%mPA3HmayzZxxxo xo xo `˛`˛p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$p$`˛`˛p$`˛`˛p$p$`˛p$p$p$`˛p$p$p$`˛ ˏp$p$p$p$o xxxxp$p$p$p$p$p$p$p$p$p$p$> Y> Y> Y> Y> Y> Y> Y> Yxo S*K *J *l M O fE~~F3~~S}2Wnbk WWcW?f!?6 cWc?RWc]?6 c?6 cWc-t'WcIk WcOk WcTk WcQk WcRcWcKSWcGcWcJc ~[!//============================================================================= // UWindowHSplitter - a horizontal splitter component //============================================================================= class UWindowHSplitter extends UWindowWindow; var UWindowWindow LeftClientWindow; var UWindowWindow RightClientWindow; var bool bSizing; var float SplitPos; var float MinWinWidth; var float OldWinWidth; var float MaxSplitPos; var bool bRightGrow; var bool bSizable; function Created() { Super.Created(); bAlwaysBehind = True; SplitPos = WinWidth / 2; MinWinWidth = 24; OldWinWidth = WinWidth; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel(C, SplitPos, 0, 7, WinHeight, T); } function BeforePaint(Canvas C, float X, float Y) { local float NewW, NewH; // Make Left panel resize if(OldWinWidth != WinWidth && !bRightGrow) { SplitPos = SplitPos + WinWidth - OldWinWidth; } SplitPos = FClamp(SplitPos, MinWinWidth, WinWidth - 7 - MinWinWidth); if(MaxSplitPos != 0) SplitPos = FClamp(SplitPos, 0, MaxSplitPos); NewW = SplitPos; NewH = WinHeight; if(NewH != LeftClientWindow.WinHeight || NewW != LeftClientWindow.WinWidth) { LeftClientWindow.SetSize(NewW, NewH); } LeftClientWindow.WinTop = 0; LeftClientWindow.WinLeft = 0; NewW = WinWidth - SplitPos - 7; if(NewH != RightClientWindow.WinHeight || NewW != RightClientWindow.WinWidth) { RightClientWindow.SetSize(NewW, NewH); } RightClientWindow.WinTop = 0; RightClientWindow.WinLeft = SplitPos + 7; OldWinWidth = WinWidth; } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bSizable && (X >= SplitPos) && (X <= SplitPos + 7)) { bSizing = True; Root.CaptureMouse(); } } function MouseMove(float X, float Y) { if(bSizable && (X >= SplitPos) && (X <= SplitPos + 7)) Cursor = Root.HSplitCursor; else Cursor = Root.NormalCursor; if(bSizing && bMouseDown) { SplitPos = X; } else bSizing = False; } ~k ~~~~TC3Kg6_6 c6_6 z 6 _DK?6 c6 nK-@6 _DK?6 z 6 Y6 _DK?6 z 6 t_ ~H'~~_~~NO'CiCf,6C$6C$6C$*C?6 ,@K?6 ,@v?6 ,@K?6 ,@M?6 ,@v?6 ,@S?? v6C$6C$6C=,W ?6 ,@K&W ?&6 ,@KU?6 ,@K?6 ,@M?,?,dO?,D?6 ,@MW ?&*CW ?6 ,@v&O?6 ,@v?6 ,@S?&?? vW ?,&6C=,6C=,6C=, ~OG3ffMI?,If?, H?, H?,$I?, H?,I?, H?,$If?, H?,*If?, H?,$DI?,Hf?,*I?,Hf?,$If?,Hf?,$H?,$Hf?,$I?,$If?,$$  D3X2GL3`.'lo o o .'l.'l.'l.'l.'l.'l.'l.'l.'l.'lV~~H9class UWindowHSliderControl extends UWindowDialogControl; var float MinValue; var float MaxValue; var float Value; var int Step; // 0 = continuous var float SliderWidth; var float SliderDrawX, SliderDrawY; var float TrackStart; var float TrackWidth; var bool bSliding; var bool bNoSlidingNotify; function Created() { Super.Created(); SliderWidth = WinWidth / 2; TrackWidth = 4; } function SetRange(float Min, float Max, int NewStep) { MinValue = Min; MaxValue = Max; Step = NewStep; Value = CheckValue(Value); } function float GetValue() { return Value; } function SetValue(float NewValue, optional bool bNoNotify) { local float OldValue; OldValue = Value; Value = CheckValue(NewValue); if(Value != OldValue && !bNoNotify) { // Notify Notify(DE_Change); } } function float CheckValue(float Test) { local float TempF; local float NewValue; NewValue = Test; if(Step != 0) { TempF = NewValue / Step; NewValue = Int(TempF + 0.5) * Step; } if(NewValue < MinValue) NewValue = MinValue; if(NewValue > MaxValue) NewValue = MaxValue; return NewValue; } function BeforePaint(Canvas C, float X, float Y) { local float W, H; Super.BeforePaint(C, X, Y); TextSize(C, Text, W, H); WinHeight = H+1; switch(Align) { case TA_Left: SliderDrawX = WinWidth - SliderWidth; TextX = 0; break; case TA_Right: SliderDrawX = 0; TextX = WinWidth - W; break; case TA_Center: SliderDrawX = (WinWidth - SliderWidth) / 2; TextX = (WinWidth - W) / 2; break; } SliderDrawY = (WinHeight - 2) / 2; TextY = (WinHeight - H) / 2; TrackStart = SliderDrawX + (SliderWidth - TrackWidth) * ((Value - MinValue)/(MaxValue - MinValue)); } function Paint(Canvas C, float X, float Y) { local Texture T; local Region R; T = GetLookAndFeelTexture(); if(Text != "") { C.DrawColor = TextColor; ClipText(C, TextX, TextY, Text); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; } R = LookAndFeel.HLine; DrawStretchedTextureSegment( C, SliderDrawX, SliderDrawY, SliderWidth, R.H, R.X, R.Y, R.W, R.H, T); DrawUpBevel(C, TrackStart, SliderDrawY-4, TrackWidth, 10, T); } function LMouseUp(float X, float Y) { Super.LMouseUp(X, Y); if(bNoSlidingNotify) Notify(DE_Change); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if((X >= TrackStart) && (X <= TrackStart + TrackWidth)) { bSliding = True; Root.CaptureMouse(); } if(X < TrackStart && X > SliderDrawX) { if(Step != 0) SetValue(Value - Step); else SetValue(Value - 1); } if(X > TrackStart + TrackWidth && X < SliderDrawX + SliderWidth) { if(Step != 0) SetValue(Value + Step); else SetValue(Value + 1); } } function MouseMove(float X, float Y) { Super.MouseMove(X, Y); if(bSliding && bMouseDown) { SetValue((((X - SliderDrawX) / (SliderWidth - TrackWidth)) * (MaxValue - MinValue)) + MinValue, bNoSlidingNotify); } else bSliding = False; } function KeyDown(int Key, float X, float Y) { local PlayerPawn P; P = GetPlayerOwner(); switch (Key) { case P.EInputKey.IK_Left: if(Step != 0) SetValue(Value - Step); else SetValue(Value - 1); break; case P.EInputKey.IK_Right: if(Step != 0) SetValue(Value + Step); else SetValue(Value + 1); break; case P.EInputKey.IK_Home: SetValue(MinValue); break; case P.EInputKey.IK_End: SetValue(MaxValue); break; default: Super.KeyDown(Key, X, Y); break; } } &M3O$D N3|[$&)> Y> Y> Y> Yo xxxxԌ~~~s ~MK3klAk6XNkk T ~b~~n~~JP3$mpn$h$ (?$#on$]hx$@A?6 ,v?6 ,S$b $$@$$f$n .$$@$n$h $$@$$f?,$n$h?, $z$?,?,$P$x?,$T$@?6 ,K$T?6 ,v$i?6 i4$-w$T$f?6 ,K?6 ,M?6 i?6 r?6 g$T$?6 ,v?6 ,S$i$?6 i?6 ,M?6 r?6 g$i$T$B$?6 ,M?6 r?6 g$B$T$D$?6 ,M?6 g$D$T$B?6 r$B?6 r$D?6 g$D?6 g?$T$f?6 ,K?6 ,M?6 i$T$?6 ,v?6 ,S$i$?6 i?6 ,M$i$T$i$T ~|E//============================================================================= // UWindowHScrollBar - A horizontal scrollbar //============================================================================= class UWindowHScrollBar extends UWindowWindow; var UWindowSBLeftButton LeftButton; var UWindowSBRightButton RightButton; var bool bDisabled; var float MinPos; var float MaxPos; var float MaxVisible; var float Pos; // offset to WinTop var float ThumbStart, ThumbWidth; var float NextClickTime; var float DragX; var bool bDragging; var float ScrollAmount; function Show(float P) { if(P < 0) return; if(P > MaxPos + MaxVisible) return; while(P < Pos) if(!Scroll(-1)) break; while(P - Pos > MaxVisible - 1) if(!Scroll(1)) break; } function bool Scroll(float Delta) { local float OldPos; OldPos = Pos; Pos = Pos + Delta; CheckRange(); return Pos == OldPos + Delta; } function SetRange(float NewMinPos, float NewMaxPos, float NewMaxVisible, optional float NewScrollAmount) { if(NewScrollAmount == 0) NewScrollAmount = 1; ScrollAmount = NewScrollAmount; MinPos = NewMinPos; MaxPos = NewMaxPos - NewMaxVisible; MaxVisible = NewMaxVisible; CheckRange(); } function CheckRange() { if(Pos < MinPos) { Pos = MinPos; } else { if(Pos > MaxPos) Pos = MaxPos; } bDisabled = (MaxPos <= MinPos); LeftButton.bDisabled = bDisabled; RightButton.bDisabled = bDisabled; if(bDisabled) { Pos = 0; } else { ThumbStart = ((Pos - MinPos) * (WinWidth - (2*LookAndFeel.Size_ScrollbarButtonHeight))) / (MaxPos + MaxVisible - MinPos); ThumbWidth = (MaxVisible * (WinWidth - (2*LookAndFeel.Size_ScrollbarButtonHeight))) / (MaxPos + MaxVisible - MinPos); if(ThumbWidth < LookAndFeel.Size_MinScrollbarHeight) ThumbWidth = LookAndFeel.Size_MinScrollbarHeight; if(ThumbWidth + ThumbStart > WinWidth - 2*LookAndFeel.Size_ScrollbarButtonHeight) { ThumbStart = WinWidth - 2*LookAndFeel.Size_ScrollbarButtonHeight - ThumbWidth; } ThumbStart = ThumbStart + LookAndFeel.Size_ScrollbarButtonHeight; } } function Created() { Super.Created(); LeftButton = UWindowSBLeftButton(CreateWindow(class'UWindowSBLeftButton', 0, 0, 10, 12)); RightButton = UWindowSBRightButton(CreateWindow(class'UWindowSBRightButton', WinWidth-10, 0, 10, 12)); } function BeforePaint(Canvas C, float X, float Y) { LeftButton.WinTop = 0; LeftButton.WinLeft = 0; LeftButton.WinWidth = LookAndFeel.Size_ScrollbarButtonHeight; LeftButton.WinHeight = LookAndFeel.Size_ScrollbarWidth; RightButton.WinTop = 0; RightButton.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarButtonHeight; RightButton.WinWidth = LookAndFeel.Size_ScrollbarButtonHeight; RightButton.WinHeight = LookAndFeel.Size_ScrollbarWidth; CheckRange(); } function Paint(Canvas C, float X, float Y) { LookAndFeel.SB_HDraw(Self, C); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(bDisabled) return; if(X < ThumbStart) { Scroll(-(MaxVisible-1)); NextClickTime = GetLevel().TimeSeconds + 0.5; return; } if(X > ThumbStart + ThumbWidth) { Scroll(MaxVisible-1); NextClickTime = GetLevel().TimeSeconds + 0.5; return; } if((X >= ThumbStart) && (X <= ThumbStart + ThumbWidth)) { DragX = X - ThumbStart; bDragging = True; Root.CaptureMouse(); return; } } function Tick(float Delta) { local bool bLeft, bRight; local float X, Y; if(bDragging) return; bLeft = False; bRight = False; if(bMouseDown) { GetMouseXY(X, Y); bLeft = (X < ThumbStart); bRight = (X > ThumbStart + ThumbWidth); } if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds) && bLeft) { Scroll(-(MaxVisible-1)); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(bMouseDown && (NextClickTime > 0) && (NextClickTime < GetLevel().TimeSeconds) && bRight) { Scroll(MaxVisible-1); NextClickTime = GetLevel().TimeSeconds + 0.1; } if(!bMouseDown || (!bLeft && !bRight)) { NextClickTime = 0; } } function MouseMove(float X, float Y) { if(bDragging && bMouseDown && !bDisabled) { while(X < (ThumbStart+DragX) && Pos > MinPos) { Scroll(-1); } while(X > (ThumbStart+DragX) && Pos < MaxPos) { Scroll(1); } } else bDragging = False; } ~Q3~~uW3T Th (?oTQ]bjnb?,Pj?,-2n?&P?& ~@Ri iRh (?oRQ]fqgf?, f?,  ~IS3mq%#mAi^m@mfmf,{m]^mjm5^mnmPm]6^=,6^=,6^=, ~]class UWindowHotkeyWindowList extends UWindowList; var UWindowWindow Window; function UWindowHotkeyWindowList FindWindow(UWindowWindow W) { local UWindowHotkeyWindowList l; l = UWindowHotkeyWindowList(Next); while(l != None) { if(l.Window == W) return l; l = UWindowHotkeyWindowList(l.Next); } return None; } ~YN(/= ]N ~AX3tP3K$tiv Yt2Xv@t?,@ ^t(ivt?, ]t(ivt?, Zt@Xv@t?,t?,@ \t6ivt?,t?, Xt2Xv@@t?, _t@Xvt?,@@t?, [t@Xv@@t?,t?, b ~h9//============================================================================= // UWindowGridColumn - a grid column //============================================================================= class UWindowGridColumn extends UWindowWindow; var UWindowGridColumn NextColumn; var UWindowGridColumn PrevColumn; var bool bSizing; var string ColumnHeading; var int ColumnNum; function Created() { Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(WinWidth < 1) WinWidth = 1; } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); if(X > Min(WinWidth - 5, ParentWindow.WinWidth - WinLeft - 5) && Y < 12) { bSizing = True; UWindowGrid(ParentWindow.ParentWindow).bSizingColumn = True; Root.CaptureMouse(); } } function LMouseUp(float X, float Y) { Super.LMouseUp(X, Y); UWindowGrid(ParentWindow.ParentWindow).bSizingColumn = False; } function MouseMove(float X, float Y) { if(X > Min(WinWidth - 5, ParentWindow.WinWidth - WinLeft - 5) && Y < 12) { Cursor = Root.HSplitCursor; } else { Cursor = Root.NormalCursor; } if(bSizing && bMouseDown) { WinWidth = X; if(WinWidth < 1) WinWidth = 1; if(WinWidth > ParentWindow.WinWidth - WinLeft - 1) WinWidth = ParentWindow.WinWidth - WinLeft - 1; } else { bSizing = False; UWindowGrid(ParentWindow.ParentWindow).bSizingColumn = False; } } function Paint(Canvas C, float X, float Y) { local Region R; local Texture T; local Color FC; UWindowGrid(ParentWindow.ParentWindow).PaintColumn(C, Self, X, Y); if(IsActive()) { T = LookAndFeel.Active; FC = LookAndFeel.HeadingActiveTitleColor; } else { T = LookAndFeel.InActive; FC = LookAndFeel.HeadingInactiveTitleColor; } C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; DrawUpBevel( C, 0, 0, WinWidth, LookAndFeel.ColumnHeadingHeight, T); C.DrawColor = FC; ClipText( C, 2, 1, ColumnHeading); C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; } function Click(float X, float Y) { local int Row; if(Y < 12) { if(X <= Min(WinWidth - 5, ParentWindow.WinWidth - WinLeft - 5)) { UWindowGrid(ParentWindow.ParentWindow).SortColumn(Self); } } else { Row = ((Y - 12) / UWindowGrid(ParentWindow.ParentWindow).RowHeight) + UWindowGrid(ParentWindow.ParentWindow).TopRow; UWindowGrid(ParentWindow.ParentWindow).SelectRow(Row); } } function RMouseDown(float X, float Y) { local int Row; Super.RMouseDown(X, Y); if(Y > 12) { Row = ((Y - 12) / UWindowGrid(ParentWindow.ParentWindow).RowHeight) + UWindowGrid(ParentWindow.ParentWindow).TopRow; UWindowGrid(ParentWindow.ParentWindow).SelectRow(Row); UWindowGrid(ParentWindow.ParentWindow).RightClickRowDown(Row, X+WinLeft, Y+WinTop); } } function RMouseUp(float X, float Y) { local int Row; Super.RMouseUp(X, Y); if(Y > 12) { Row = ((Y - 12) / UWindowGrid(ParentWindow.ParentWindow).RowHeight) + UWindowGrid(ParentWindow.ParentWindow).TopRow; UWindowGrid(ParentWindow.ParentWindow).SelectRow(Row); UWindowGrid(ParentWindow.ParentWindow).RightClickRow(Row, X+WinLeft, Y+WinTop); } } function DoubleClick(float X, float Y) { local int Row; if(Y < 12) { Click(X, Y); } else { Row = ((Y - 12) / UWindowGrid(ParentWindow.ParentWindow).RowHeight) + UWindowGrid(ParentWindow.ParentWindow).TopRow; UWindowGrid(ParentWindow.ParentWindow).DoubleClickRow(Row); } } function MouseLeave() { Super.MouseLeave(); UWindowGrid(ParentWindow.ParentWindow).MouseLeaveColumn(Self); } ~a//============================================================================= // UWindowGridClient - The client area on a grid. //============================================================================= class UWindowGridClient extends UWindowWindow; function Created() { } ~@[3bKC'B6[=,6[=,6[=,-Mb$X[}B~ K W6[$6[$6[$6[$6[$6[$b5[}?bd?,B?,J ~~~[R//============================================================================= // UWindowGrid - a grid with sizable columns and clickable column headings. //============================================================================= class UWindowGrid extends UWindowWindow; var UWindowGridColumn FirstColumn; var UWindowGridColumn LastColumn; var UWindowGridClient ClientArea; var int TopRow; var float RowHeight; var UWindowVScrollbar VertSB; var UWindowHScrollbar HorizSB; var bool bShowHorizSB; var bool bSizingColumn; var bool bNoKeyboard; function Created() { ClientArea = UWindowGridClient(CreateWindow(class'UWindowGridClient', 0, 0, WinWidth - 12, WinHeight)); VertSB = UWindowVScrollbar(CreateWindow(class'UWindowVScrollbar', WinWidth-12, 0, 12, WinHeight)); VertSB.bAlwaysOnTop = True; HorizSB = UWindowHScrollbar(CreateWindow(class'UWindowHScrollbar', 0, WinHeight-12, WinWidth, 12)); HorizSB.bAlwaysOnTop = True; HorizSB.HideWindow(); bShowHorizSB = False; if(!bNoKeyboard) SetAcceptsFocus(); Super.Created(); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Resized(); } function Resized() { local float Offset; local UWindowGridColumn colColumn; local float TotalWidth; TotalWidth = 0; colColumn = FirstColumn; while(colColumn != None) { TotalWidth = TotalWidth + colColumn.WinWidth; colColumn = colColumn.NextColumn; } if(!bSizingColumn) HorizSB.SetRange(0, TotalWidth, WinWidth - LookAndFeel.Size_ScrollbarWidth, 10); if(!HorizSB.bDisabled) { // Need a horizontal scrollbar HorizSB.ShowWindow(); bShowHorizSB = True; } else { HorizSB.HideWindow(); bShowHorizSB = False; HorizSB.Pos = 0; } ClientArea.WinTop = 0; ClientArea.WinLeft = 0; ClientArea.WinWidth = WinWidth - LookAndFeel.Size_ScrollbarWidth; if(bShowHorizSB) ClientArea.WinHeight = WinHeight - LookAndFeel.Size_ScrollbarWidth; else ClientArea.WinHeight = WinHeight; if(bShowHorizSB) { HorizSB.WinTop = WinHeight-LookAndFeel.Size_ScrollbarWidth; HorizSB.WinLeft = 0; HorizSB.WinWidth = WinWidth - LookAndFeel.Size_ScrollbarWidth; HorizSB.WinHeight = LookAndFeel.Size_ScrollbarWidth; } VertSB.WinTop = 0; VertSB.WinLeft = WinWidth-LookAndFeel.Size_ScrollbarWidth; VertSB.WinWidth = LookAndFeel.Size_ScrollbarWidth; if(bShowHorizSB) VertSB.WinHeight = WinHeight - LookAndFeel.Size_ScrollbarWidth; else VertSB.WinHeight = WinHeight; if(bShowHorizSB) Offset = 1 - HorizSB.Pos; else Offset = 1; colColumn = FirstColumn; while(colColumn != None) { colColumn.WinLeft = Offset ; colColumn.WinTop = 0; colColumn.WinHeight = WinHeight; Offset = Offset + colColumn.WinWidth; colColumn = colColumn.NextColumn; } } function UWindowGridColumn AddColumn(string ColumnHeading, float DefaultWidth) { local UWindowGridColumn NewColumn; local UWindowGridColumn OldLastColumn; OldLastColumn = LastColumn; if(LastColumn == None) { NewColumn = UWindowGridColumn(ClientArea.CreateWindow(class'UWindowGridColumn', 0, 0, DefaultWidth, WinHeight)); FirstColumn = NewColumn; NewColumn.ColumnNum = 0; } else { NewColumn = UWindowGridColumn(ClientArea.CreateWindow(class'UWindowGridColumn', LastColumn.WinLeft + LastColumn.WinWidth, 0, DefaultWidth, WinHeight)); LastColumn.NextColumn = NewColumn; NewColumn.ColumnNum = LastColumn.ColumnNum + 1; } LastColumn = NewColumn; NewColumn.NextColumn = None; NewColumn.PrevColumn = OldLastColumn; NewColumn.ColumnHeading = ColumnHeading; return NewColumn; } function Paint(Canvas C, float MouseX, float MouseY) { local float X; local Texture T; local Region R; X = LastColumn.WinWidth + LastColumn.WinLeft; T = GetLookAndFeelTexture(); DrawUpBevel( C, X, 0, WinWidth-X, LookAndFeel.ColumnHeadingHeight, T); if(bShowHorizSB) { // R = LookAndFeel.SBBackground; DrawStretchedTextureSegment( C, WinWidth-LookAndFeel.Size_ScrollbarWidth, WinHeight-LookAndFeel.Size_ScrollbarWidth, LookAndFeel.Size_ScrollbarWidth, LookAndFeel.Size_ScrollbarWidth, R.X, R.Y, R.W, R.H, T); } } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { // defined in subclass } function SortColumn(UWindowGridColumn Column) { // defined in subclass } function SelectRow(int Row) { // defined in subclass } function RightClickRow(int Row, float X, float Y) { // defined in subclass } function RightClickRowDown(int Row, float X, float Y) { // defined in subclass } function DoubleClickRow(int Row) { // defined in subclass } function MouseLeaveColumn(UWindowGridColumn Column) { // defined in subclass } function KeyDown(int Key, float X, float Y) { switch(Key) { case 0x26: // IK_Up case 0xEC: // IK_MouseWheelUp VertSB.Scroll(-1); break; case 0x28: // IK_Down case 0xED: // IK_MouseWheelDown VertSB.Scroll(1); break; case 0x21: // IK_PageUp VertSB.Scroll(-(VertSB.MaxVisible-1)); break; case 0x22: // IK_PageDown VertSB.Scroll(VertSB.MaxVisible-1); break; } } ~bb3_3)w-2 P ?%P 6.  .  l P 6=-2P  ~5r3sb5sr-O .  .  l P 6? ~@~L4Sev C-njS6w*-q'TS ~u ~ L5" " " " *"`~@ ~E^3Zw\l):Z#oOZ]]\Z?D\?&,Zb $ZpZ?,Zn3 $ZpZnZ]3 0$ZpZ?,?,ZnZ]?,3 ZHZ?,?,ZPZ\?,Z-dZI WZO WZT WZQ S28ZI NZO NZT NZQ T2 ~YV//============================================================================= // UWindowFramedWindow - a Windows95 style framed window //============================================================================= class UWindowFramedWindow extends UWindowWindow; var class ClientClass; var UWindowWindow ClientArea; var localized string WindowTitle; var string StatusBarText; var float MoveX, MoveY; // co-ordinates where the move was requested var float MinWinWidth, MinWinHeight; var bool bTLSizing; var bool bTSizing; var bool bTRSizing; var bool bLSizing; var bool bRSizing; var bool bBLSizing; var bool bBSizing; var bool bBRSizing; var bool bMoving; var bool bSizable; var bool bStatusBar; var UWindowFrameCloseBox CloseBox; function Created() { Super.Created(); MinWinWidth = 50; MinWinHeight = 50; ClientArea = CreateWindow(ClientClass, 4, 16, WinWidth - 8, WinHeight - 20, OwnerWindow); CloseBox = UWindowFrameCloseBox(CreateWindow(Class'UWindowFrameCloseBox', WinWidth-20, WinHeight-20, 11, 10)); } function Texture GetLookAndFeelTexture() { return LookAndFeel.GetTexture(Self); } function bool IsActive() { return ParentWindow.ActiveWindow == Self; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Resized(); LookAndFeel.FW_SetupFrameButtons(Self, C); } function Paint(Canvas C, float X, float Y) { LookAndFeel.FW_DrawWindowFrame(Self, C); } function LMouseDown(float X, float Y) { local FrameHitTest H; H = LookAndFeel.FW_HitTest(Self, X, Y); Super.LMouseDown(X, Y); if(H == HT_TitleBar) { MoveX = X; MoveY = Y; bMoving = True; Root.CaptureMouse(); return; } if(bSizable) { switch(H) { case HT_NW: bTLSizing = True; Root.CaptureMouse(); return; case HT_NE: bTRSizing = True; Root.CaptureMouse(); return; case HT_SW: bBLSizing = True; Root.CaptureMouse(); return; case HT_SE: bBRSizing = True; Root.CaptureMouse(); return; case HT_N: bTSizing = True; Root.CaptureMouse(); return; case HT_S: bBSizing = True; Root.CaptureMouse(); return; case HT_W: bLSizing = True; Root.CaptureMouse(); return; case HT_E: bRSizing = True; Root.CaptureMouse(); return; } } } function Resized() { local Region R; if(ClientArea == None) { Log("Client Area is None for "$Self); return; } R = LookAndFeel.FW_GetClientArea(Self); ClientArea.WinLeft = R.X; ClientArea.WinTop = R.Y; if((R.W != ClientArea.WinWidth) || (R.H != ClientArea.WinHeight)) { ClientArea.SetSize(R.W, R.H); } } function MouseMove(float X, float Y) { local float OldW, OldH; local FrameHitTest H; H = LookAndFeel.FW_HitTest(Self, X, Y); if(bMoving && bMouseDown) { WinLeft = Int(WinLeft + X - MoveX); WinTop = Int(WinTop + Y - MoveY); } else bMoving = False; Cursor = Root.NormalCursor; if(bSizable && !bMoving) { switch(H) { case HT_NW: case HT_SE: Cursor = Root.DiagCursor1; break; case HT_NE: case HT_SW: Cursor = Root.DiagCursor2; break; case HT_W: case HT_E: Cursor = Root.WECursor; break; case HT_N: case HT_S: Cursor = Root.NSCursor; break; } } // Top Left if(bTLSizing && bMouseDown) { Cursor = Root.DiagCursor1; OldW = WinWidth; OldH = WinHeight; SetSize(Max(MinWinWidth, WinWidth - X), Max(MinWinHeight, WinHeight - Y)); WinLeft = Int(WinLeft + OldW - WinWidth); WinTop = Int(WinTop + OldH - WinHeight); } else bTLSizing = False; // Top if(bTSizing && bMouseDown) { Cursor = Root.NSCursor; OldH = WinHeight; SetSize(WinWidth, Max(MinWinHeight, WinHeight - Y)); WinTop = Int(WinTop + OldH - WinHeight); } else bTSizing = False; // Top Right if(bTRSizing && bMouseDown) { Cursor = Root.DiagCursor2; OldH = WinHeight; SetSize(Max(MinWinWidth, X), Max(MinWinHeight, WinHeight - Y)); WinTop = Int(WinTop + OldH - WinHeight); } else bTRSizing = False; // Left if(bLSizing && bMouseDown) { Cursor = Root.WECursor; OldW = WinWidth; SetSize(Max(MinWinWidth, WinWidth - X), WinHeight); WinLeft = Int(WinLeft + OldW - WinWidth); } else bLSizing = False; // Right if(bRSizing && bMouseDown) { Cursor = Root.WECursor; SetSize(Max(MinWinWidth, X), WinHeight); } else bRSizing = False; // Bottom Left if(bBLSizing && bMouseDown) { Cursor = Root.DiagCursor2; OldW = WinWidth; SetSize(Max(MinWinWidth, WinWidth - X), Max(MinWinHeight, Y)); WinLeft = Int(WinLeft + OldW - WinWidth); } else bBLSizing = False; // Bottom if(bBSizing && bMouseDown) { Cursor = Root.NSCursor; SetSize(WinWidth, Max(MinWinHeight, Y)); } else bBSizing = False; // Bottom Right if(bBRSizing && bMouseDown) { Cursor = Root.DiagCursor1; SetSize(Max(MinWinWidth, X), Max(MinWinHeight, Y)); } else bBRSizing = False; } function ToolTip(string strTip) { StatusBarText = strTip; } function WindowEvent(WinMessage Msg, Canvas C, float X, float Y, int Key) { if(Msg == WM_Paint || !WaitModal()) Super.WindowEvent(Msg, C, X, Y, Key); } function WindowHidden() { Super.WindowHidden(); LookAndFeel.PlayMenuSound(Self, MS_WindowClose); } ~j'kZ!Ku . 8 u qu Fku  ~~~j3~~Fg3`p,o ``-t'`Io `Oo `To `Qo `Ri`Kt`Gi`Js ~Hclass UWindowFrameCloseBox extends UWindowButton; function Created() { bNoKeyboard = True; Super.Created(); } function Click(float X, float Y) { ParentWindow.Close(); } // No keyboard support function KeyDown(int Key, float X, float Y) { }  P5" " " " *"=l~a@                 ~|l3MLh.uGHMhM (?M#oHM]ZGM@A?6 uv?6 uSMb $MJ MMU Mn ?$MJ MnMZ $MJ MMU ?,MnMZ?, MpM?,?,MPMG?,MlMJ ?6 uKMl?6 uvMlMU ?6 uK?6 uMMlM?6 uv?6 uS ~qclass UWindowEditControl extends UWindowDialogControl; var float EditBoxWidth; var float EditAreaDrawX, EditAreaDrawY; var UWindowEditBox EditBox; function Created() { local Color C; Super.Created(); EditBox = UWindowEditBox(CreateWindow(class'UWindowEditBox', 0, 0, WinWidth, WinHeight)); EditBox.NotifyOwner = Self; EditBox.bSelectOnFocus = True; EditBoxWidth = WinWidth / 2; SetEditTextColor(LookAndFeel.EditBoxTextColor); } function SetNumericOnly(bool bNumericOnly) { EditBox.bNumericOnly = bNumericOnly; } function SetNumericFloat(bool bNumericFloat) { EditBox.bNumericFloat = bNumericFloat; } function SetFont(int NewFont) { Super.SetFont(NewFont); EditBox.SetFont(NewFont); } function SetHistory(bool bInHistory) { EditBox.SetHistory(bInHistory); } function SetEditTextColor(Color NewColor) { EditBox.SetTextColor(NewColor); } function Clear() { EditBox.Clear(); } function string GetValue() { return EditBox.GetValue(); } function SetValue(string NewValue) { EditBox.SetValue(NewValue); } function SetMaxLength(int MaxLength) { EditBox.MaxLength = MaxLength; } function Paint(Canvas C, float X, float Y) { LookAndFeel.Editbox_Draw(Self, C); Super.Paint(C, X, Y); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); LookAndFeel.Editbox_SetupSizes(Self, C); } function SetDelayedNotify(bool bDelayedNotify) { Editbox.bDelayedNotify = bDelayedNotify; } ~k3~~us3q3 I ~VP  4-m'V ~Nclass UWindowEditBoxHistory expands UWindowList; var string HistoryText; ~zo3_J1_Di[_J _U _fG{_][_j_5[_n_P_]6[=,6[=,6[=, ~H// UWindowEditBox - simple edit box, for use in other controls such as // UWindowComboxBoxControl, UWindowEditBoxControl etc. class UWindowEditBox extends UWindowDialogControl; var string Value; var string Value2; var int CaretOffset; var int MaxLength; var float LastDrawTime; var bool bShowCaret; var float Offset; var UWindowDialogControl NotifyOwner; var bool bNumericOnly; var bool bNumericFloat; var bool bCanEdit; var bool bAllSelected; var bool bSelectOnFocus; var bool bDelayedNotify; var bool bChangePending; var bool bControlDown; var bool bShiftDown; var bool bHistory; var bool bKeyDown; var UWindowEditBoxHistory HistoryList; var UWindowEditBoxHistory CurrentHistory; function Created() { Super.Created(); bCanEdit = True; bControlDown = False; bShiftDown = False; MaxLength = 255; CaretOffset = 0; Offset = 0; LastDrawTime = GetLevel().TimeSeconds; } function SetHistory(bool bInHistory) { bHistory = bInHistory; if(bHistory && HistoryList==None) { HistoryList = new(None) class'UWindowEditBoxHistory'; HistoryList.SetupSentinel(); CurrentHistory = None; } else if(!bHistory && HistoryList!=None) { HistoryList = None; CurrentHistory = None; } } function SetEditable(bool bEditable) { bCanEdit = bEditable; } function SetValue(string NewValue, optional string NewValue2) { Value = NewValue; Value2 = NewValue2; if(CaretOffset > Len(Value)) CaretOffset = Len(Value); Notify(DE_Change); } function Clear() { CaretOffset = 0; Value=""; Value2=""; bAllSelected = False; if(bDelayedNotify) bChangePending = True; else Notify(DE_Change); } function SelectAll() { if(bCanEdit && Value != "") { CaretOffset = Len(Value); bAllSelected = True; } } function string GetValue() { return Value; } function string GetValue2() { return Value2; } function Notify(byte E) { if(NotifyOwner != None) { NotifyOwner.Notify(E); } else { Super.Notify(E); } } function InsertText(string Text) { local int i; for(i=0;i MaxLength) return False; CaretOffset++; Value = NewValue; if(bDelayedNotify) bChangePending = True; else Notify(DE_Change); return True; } function bool Backspace() { local string NewValue; if(CaretOffset == 0) return False; NewValue = Left(Value, CaretOffset - 1) $ Mid(Value, CaretOffset); CaretOffset--; Value = NewValue; if(bDelayedNotify) bChangePending = True; else Notify(DE_Change); return True; } function bool Delete() { local string NewValue; if(CaretOffset == Len(Value)) return False; NewValue = Left(Value, CaretOffset) $ Mid(Value, CaretOffset + 1); Value = NewValue; Notify(DE_Change); return True; } function bool WordLeft() { while(CaretOffset > 0 && Mid(Value, CaretOffset - 1, 1) == " ") CaretOffset--; while(CaretOffset > 0 && Mid(Value, CaretOffset - 1, 1) != " ") CaretOffset--; LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function bool MoveLeft() { if(CaretOffset == 0) return False; CaretOffset--; LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function bool MoveRight() { if(CaretOffset == Len(Value)) return False; CaretOffset++; LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function bool WordRight() { while(CaretOffset < Len(Value) && Mid(Value, CaretOffset, 1) != " ") CaretOffset++; while(CaretOffset < Len(Value) && Mid(Value, CaretOffset, 1) == " ") CaretOffset++; LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function bool MoveHome() { CaretOffset = 0; LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function bool MoveEnd() { CaretOffset = Len(Value); LastDrawTime = GetLevel().TimeSeconds; bShowCaret = True; return True; } function EditCopy() { if(bAllSelected || !bCanEdit) GetPlayerOwner().CopyToClipboard(Value); } function EditPaste() { if(bCanEdit) { if(bAllSelected) Clear(); InsertText(GetPlayerOwner().PasteFromClipboard()); } } function EditCut() { if(bCanEdit) { if(bAllSelected) { GetPlayerOwner().CopyToClipboard(Value); bAllSelected = False; Clear(); } } else EditCopy(); } function KeyType( int Key, float MouseX, float MouseY ) { if(bCanEdit && bKeyDown) { if( !bControlDown ) { if(bAllSelected) Clear(); bAllSelected = False; if(bNumericOnly) { if( Key>=0x30 && Key<=0x39 ) { Insert(Key); } } else { if( Key>=0x20 && Key<0x80 ) { Insert(Key); } } } } } function KeyUp(int Key, float X, float Y) { local PlayerPawn P; bKeyDown = False; P = GetPlayerOwner(); switch (Key) { case P.EInputKey.IK_Ctrl: bControlDown = False; break; case P.EInputKey.IK_Shift: bShiftDown = False; break; } } function KeyDown(int Key, float X, float Y) { local PlayerPawn P; bKeyDown = True; P = GetPlayerOwner(); switch (Key) { case P.EInputKey.IK_Ctrl: bControlDown = True; break; case P.EInputKey.IK_Shift: bShiftDown = True; break; case P.EInputKey.IK_Escape: break; case P.EInputKey.IK_Enter: if(bCanEdit) { if(bHistory) { if(Value != "") { CurrentHistory = UWindowEditBoxHistory(HistoryList.Insert(class'UWindowEditBoxHistory')); CurrentHistory.HistoryText = Value; } CurrentHistory = HistoryList; } Notify(DE_EnterPressed); } break; case P.EInputKey.IK_MouseWheelUp: if(bCanEdit) Notify(DE_WheelUpPressed); break; case P.EInputKey.IK_MouseWheelDown: if(bCanEdit) Notify(DE_WheelDownPressed); break; case P.EInputKey.IK_Right: if(bCanEdit) { if(bControlDown) WordRight(); else MoveRight(); } bAllSelected = False; break; case P.EInputKey.IK_Left: if(bCanEdit) { if(bControlDown) WordLeft(); else MoveLeft(); } bAllSelected = False; break; case P.EInputKey.IK_Up: if(bCanEdit && bHistory) { bAllSelected = False; if(CurrentHistory != None && CurrentHistory.Next != None) { CurrentHistory = UWindowEditBoxHistory(CurrentHistory.Next); SetValue(CurrentHistory.HistoryText); MoveEnd(); } } break; case P.EInputKey.IK_Down: if(bCanEdit && bHistory) { bAllSelected = False; if(CurrentHistory != None && CurrentHistory.Prev != None) { CurrentHistory = UWindowEditBoxHistory(CurrentHistory.Prev); SetValue(CurrentHistory.HistoryText); MoveEnd(); } } break; case P.EInputKey.IK_Home: if(bCanEdit) MoveHome(); bAllSelected = False; break; case P.EInputKey.IK_End: if(bCanEdit) MoveEnd(); bAllSelected = False; break; case P.EInputKey.IK_Backspace: if(bCanEdit) { if(bAllSelected) Clear(); else Backspace(); } bAllSelected = False; break; case P.EInputKey.IK_Delete: if(bCanEdit) { if(bAllSelected) Clear(); else Delete(); } bAllSelected = False; break; case P.EInputKey.IK_Period: case P.EInputKey.IK_NumPadPeriod: if (bNumericFloat) Insert(Asc(".")); break; default: if( bControlDown ) { if( Key == Asc("c") || Key == Asc("C")) EditCopy(); if( Key == Asc("v") || Key == Asc("V")) EditPaste(); if( Key == Asc("x") || Key == Asc("X")) EditCut(); } else { if(NotifyOwner != None) NotifyOwner.KeyDown(Key, X, Y); else Super.KeyDown(Key, X, Y); } break; } } function Click(float X, float Y) { Notify(DE_Click); } function LMouseDown(float X, float Y) { Super.LMouseDown(X, Y); Notify(DE_LMouseDown); } function Paint(Canvas C, float X, float Y) { local float W, H; local float TextY; C.Font = Root.Fonts[Font]; TextSize(C, "A", W, H); TextY = (WinHeight - H) / 2; TextSize(C, Left(Value, CaretOffset), W, H); C.DrawColor.R = 255; C.DrawColor.G = 255; C.DrawColor.B = 255; if(W + Offset < 0) Offset = -W; if(W + Offset > (WinWidth - 2)) { Offset = (WinWidth - 2) - W; if(Offset > 0) Offset = 0; } C.DrawColor = TextColor; if(bAllSelected) { DrawStretchedTexture(C, Offset + 1, TextY, W, H, Texture'UWindow.WhiteTexture'); // Invert Colors C.DrawColor.R = 255 ^ C.DrawColor.R; C.DrawColor.G = 255 ^ C.DrawColor.G; C.DrawColor.B = 255 ^ C.DrawColor.B; } ClipText(C, Offset + 1, TextY, Value); if((!bHasKeyboardFocus) || (!bCanEdit)) bShowCaret = False; else { if((GetLevel().TimeSeconds > LastDrawTime + 0.3) || (GetLevel().TimeSeconds < LastDrawTime)) { LastDrawTime = GetLevel().TimeSeconds; bShowCaret = !bShowCaret; } } if(bShowCaret) ClipText(C, Offset + W - 1, TextY, "|"); } function Close(optional bool bByParent) { if(bChangePending) { bChangePending = False; Notify(DE_Change); } bKeyDown = False; Super.Close(bByParent); } function FocusOtherWindow(UWindowWindow W) { if(bChangePending) { bChangePending = False; Notify(DE_Change); } if(NotifyOwner != None) NotifyOwner.FocusOtherWindow(W); else Super.FocusOtherWindow(W); } function KeyFocusEnter() { if(bSelectOnFocus && !bHasKeyboardFocus) SelectAll(); Super.KeyFocusEnter(); } function DoubleClick(float X, float Y) { Super.DoubleClick(X, Y); SelectAll(); } function KeyFocusExit() { bAllSelected = False; Super.KeyFocusExit(); }  ^" " " " *0"۫p~@ ~qu3|h3(6v=,6v=,6v=,{|-M4O|\*vZY?6 4?6 4?64?64?6 4?6 4{4U|}*vZ?6 OYY?6 O?6 A?6 4?64?64?6 4?6 4{4A|p*vZY?6 4Y?6 4?6 4?64?64?6 4?6 4{v|&| (?6v$6v$6v$-I|ov W A|3vZYW ?,Y?, '&4M|\*vZY?6 4?6 4?64?64?6 4?6 4{4S|}*vZ?6 MYY?6 M?6 J?6 4?64?64?6 4?6 4{4J|p*vZY?6 4Y?6 4?6 4?64?64?6 4?6 4{v|%| (?6v$6v$6v$&-I|ov W A|3vZYW ?,Y?, ' ~Cclass UWindowDynamicTextRow expands UWindowList; var string Text; var UWindowDynamicTextRow WrapParent; var bool bRowDirty; ~o|class UWindowDynamicTextArea expands UWindowDialogControl; var config int MaxLines; var bool bTopCentric; var float DefaultTextHeight; var bool bScrollOnResize; var bool bVCenter; var bool bHCenter; var bool bAutoScrollbar; var bool bVariableRowHeight; // Assumes !bTopCentric, !bScrollOnResize var float WrapWidth; // private var UWindowDynamicTextRow List; var UWindowVScrollBar VertSB; var float OldW, OldH; var bool bDirty; var int Count; var int VisibleRows; var int Font; var Font AbsoluteFont; var color TextColor; var class RowClass; function Created() { Super.Created(); VertSB = UWindowVScrollbar(CreateWindow(class'UWindowVScrollbar', WinWidth-12, 0, 12, WinHeight)); VertSB.bAlwaysOnTop = True; Clear(); } function Clear() { bDirty = True; if(List != None) { if(List.Next == None) return; List.DestroyList(); } List = new RowClass; List.SetupSentinel(); } function SetAbsoluteFont(Font F) { AbsoluteFont = F; } function SetFont(int F) { Font = F; } function SetTextColor(Color C) { TextColor = C; } function TextAreaClipText(Canvas C, float DrawX, float DrawY, coerce string S, optional bool bCheckHotkey) { ClipText(C, DrawX, DrawY, S, bCheckHotkey); } function TextAreaTextSize(Canvas C, string Text, out float W, out float H) { TextSize(C, Text, W, H); } function BeforePaint( Canvas C, float X, float Y ) { Super.BeforePaint(C, X, Y); VertSB.WinTop = 0; VertSB.WinHeight = WinHeight; VertSB.WinWidth = LookAndFeel.Size_ScrollbarWidth; VertSB.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarWidth; } function Paint( Canvas C, float MouseX, float MouseY ) { local UWindowDynamicTextRow L; local int SkipCount, DrawCount; local int i; local float Y, Junk; local bool bWrapped; C.DrawColor = TextColor; if(AbsoluteFont != None) C.Font = AbsoluteFont; else C.Font = Root.Fonts[Font]; if(OldW != WinWidth || OldH != WinHeight) { WordWrap(C, True); OldW = WinWidth; OldH = WinHeight; bWrapped = True; } else if(bDirty) { WordWrap(C, False); bWrapped = True; } if(bWrapped) { TextAreaTextSize(C, "A", Junk, DefaultTextHeight); VisibleRows = WinHeight / DefaultTextHeight; Count = List.Count(); VertSB.SetRange(0, Count, VisibleRows); if(bScrollOnResize) { if(bTopCentric) VertSB.Pos = 0; else VertSB.Pos = VertSB.MaxPos; } if(bAutoScrollbar && !bVariableRowHeight) { if(Count <= VisibleRows) VertSB.HideWindow(); else VertSB.ShowWindow(); } } if(bTopCentric) { SkipCount = VertSB.Pos; L = UWindowDynamicTextRow(List.Next); for(i=0; i < SkipCount && (L != None) ; i++) L = UWindowDynamicTextRow(L.Next); if(bVCenter && Count <= VisibleRows) Y = int((WinHeight - (Count * DefaultTextHeight)) / 2); else Y = 1; DrawCount = 0; while(Y < WinHeight) { DrawCount++; if(L != None) { Y += DrawTextLine(C, L, Y); L = UWindowDynamicTextRow(L.Next); } else Y += DefaultTextHeight; } if(bVariableRowHeight) { VisibleRows = DrawCount - 1; while(VertSB.Pos + VisibleRows > Count) VisibleRows--; VertSB.SetRange(0, Count, VisibleRows); if(bAutoScrollbar) { if(Count <= VisibleRows) VertSB.HideWindow(); else VertSB.ShowWindow(); } } } else { SkipCount = Max(0, Count - (VisibleRows + VertSB.Pos)); L = UWindowDynamicTextRow(List.Last); for(i=0; i < SkipCount && (L != List) ; i++) L = UWindowDynamicTextRow(L.Prev); Y = WinHeight - DefaultTextHeight; while(L != List && L != None && Y > -DefaultTextHeight) { DrawTextLine(C, L, Y); Y = Y - DefaultTextHeight; L = UWindowDynamicTextRow(L.Prev); } } } function UWindowDynamicTextRow AddText(string NewLine) { local UWindowDynamicTextRow L; local string Temp; local int i; bDirty = True; i = InStr(NewLine, "\\n"); if(i != -1) { Temp = Mid(NewLine, i+2); NewLine = Left(NewLine, i); } else Temp = ""; // reuse a row if possible L = CheckMaxRows(); if(L != None) List.AppendItem(L); else L = UWindowDynamicTextRow(List.Append(RowClass)); L.Text = NewLine; L.WrapParent = None; L.bRowDirty = True; if(Temp != "") AddText(Temp); return L; } function UWindowDynamicTextRow CheckMaxRows() { local UWindowDynamicTextRow L; L = None; while(MaxLines > 0 && List.Count() > MaxLines - 1 && List.Next != None) { L = UWindowDynamicTextRow(List.Next); RemoveWrap(L); L.Remove(); } return L; } function WordWrap(Canvas C, bool bForce) { local UWindowDynamicTextRow L; for(L = UWindowDynamicTextRow(List.Next); L != None; L = UWindowDynamicTextRow(L.Next)) if(L.WrapParent == None && (L.bRowDirty || bForce)) WrapRow(C, L); bDirty = False; } function WrapRow(Canvas C, UWindowDynamicTextRow L) { local UWindowDynamicTextRow CurrentRow, N; local float MaxWidth; local int WrapPos; if(WrapWidth == 0) { if(VertSB.bWindowVisible || bAutoScrollbar) MaxWidth = WinWidth - VertSB.WinWidth; else MaxWidth = WinWidth; } else MaxWidth = WrapWidth; L.bRowDirty = False; // fast check - single line? N = UWindowDynamicTextRow(L.Next); if(N == None || N.WrapParent != L) { if(GetWrapPos(C, L, MaxWidth) == -1) return; } RemoveWrap(L); CurrentRow = L; while(True) { WrapPos = GetWrapPos(C, CurrentRow, MaxWidth); if(WrapPos == -1) break; CurrentRow = SplitRowAt(CurrentRow, WrapPos); } } /////////////////////////////////////////////////////// // Functions to override to change format/layout /////////////////////////////////////////////////////// function float DrawTextLine(Canvas C, UWindowDynamicTextRow L, float Y) { local float X, W, H; if(bHCenter) { TextAreaTextSize(C, L.Text, W, H); if(VertSB.bWindowVisible) X = int(((WinWidth - VertSB.WinWidth) - W) / 2); else X = int((WinWidth - W) / 2); } else X = 2; TextAreaClipText(C, X, Y, L.Text); return DefaultTextHeight; } // find where to break the line function int GetWrapPos(Canvas C, UWindowDynamicTextRow L, float MaxWidth) { local float W, H, LineWidth, NextWordWidth; local string Input, NextWord; local int WordsThisRow, WrapPos; // quick check TextAreaTextSize(C, L.Text, W, H); if(W <= MaxWidth) return -1; Input = L.Text; WordsThisRow = 0; LineWidth = 0; WrapPos = 0; NextWord = ""; while(Input != "" || NextWord != "") { if(NextWord == "") { RemoveNextWord(Input, NextWord); TextAreaTextSize(C, NextWord, NextWordWidth, H); } if(WordsThisRow > 0 && LineWidth + NextWordWidth > MaxWidth) { return WrapPos; } else { WrapPos += Len(NextWord); LineWidth += NextWordWidth; NextWord = ""; WordsThisRow++; } } return -1; } function UWindowDynamicTextRow SplitRowAt(UWindowDynamicTextRow L, int SplitPos) { local UWindowDynamicTextRow N; N = UWindowDynamicTextRow(L.InsertAfter(RowClass)); if(L.WrapParent == None) N.WrapParent = L; else N.WrapParent = L.WrapParent; N.Text = Mid(L.Text, SplitPos); L.Text = Left(L.Text, SplitPos); return N; } function RemoveNextWord(out string Text, out string NextWord) { local int i; i = InStr(Text, " "); if(i == -1) { NextWord = Text; Text = ""; } else { while(Mid(Text, i, 1) == " ") i++; NextWord = Left(Text, i); Text = Mid(Text, i); } } function RemoveWrap(UWindowDynamicTextRow L) { local UWindowDynamicTextRow N; // Remove previous word-wrapping N = UWindowDynamicTextRow(L.Next); while(N != None && N.WrapParent == L) { L.Text = L.Text $ N.Text; N.Remove(); N = UWindowDynamicTextRow(L.Next); } }  T5" " " " *D"'As~ @ ~Z~~x+//============================================================================= // UWindowDialogControl - a control which notifies a dialog control group //============================================================================= class UWindowDialogControl extends UWindowWindow; var UWindowDialogClientWindow NotifyWindow; var string Text; var int Font; var color TextColor; var TextAlign Align; var float TextX, TextY; // changed by BeforePaint functions var bool bHasKeyboardFocus; var bool bNoKeyboard; var bool bAcceptExternalDragDrop; var string HelpText; var float MinWidth, MinHeight; // minimum heights for layout control var UWindowDialogControl TabNext; var UWindowDialogControl TabPrev; function Created() { if(!bNoKeyboard) SetAcceptsFocus(); } function KeyFocusEnter() { Super.KeyFocusEnter(); bHasKeyboardFocus = True; } function KeyFocusExit() { Super.KeyFocusExit(); bHasKeyboardFocus = False; } function SetHelpText(string NewHelpText) { HelpText = NewHelpText; } function SetText(string NewText) { Text = NewText; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); C.Font = Root.Fonts[Font]; } function SetFont(int NewFont) { Font = NewFont; } function SetTextColor(color NewColor) { TextColor = NewColor; } function Register(UWindowDialogClientWindow W) { NotifyWindow = W; Notify(DE_Created); } function Notify(byte E) { if(NotifyWindow != None) { NotifyWindow.Notify(Self, E); } } function bool ExternalDragOver(UWindowDialogControl ExternalControl, float X, float Y) { return False; } function UWindowDialogControl CheckExternalDrag(float X, float Y) { local float RootX, RootY; local float ExtX, ExtY; local UWindowWindow W; local UWindowDialogControl C; WindowToGlobal(X, Y, RootX, RootY); W = Root.FindWindowUnder(RootX, RootY); C = UWindowDialogControl(W); if(W != Self && C != None && C.bAcceptExternalDragDrop) { W.GlobalToWindow(RootX, RootY, ExtX, ExtY); if(C.ExternalDragOver(Self, ExtX, ExtY)) return C; } return None; } function KeyDown(int Key, float X, float Y) { local PlayerPawn P; local UWindowDialogControl N; P = Root.GetPlayerOwner(); switch (Key) { case P.EInputKey.IK_Tab: if(TabNext != None) { N = TabNext; while(N != Self && !N.bWindowVisible) N = N.TabNext; N.ActivateWindow(0, False); } break; default: Super.KeyDown(Key, X, Y); break; } } function MouseMove(float X, float Y) { Super.MouseMove(X, Y); Notify(DE_MouseMove); } function MouseEnter() { Super.MouseEnter(); Notify(DE_MouseEnter); } function MouseLeave() { Super.MouseLeave(); Notify(DE_MouseLeave); } ~Pclass UWindowDialogClientWindow extends UWindowClientWindow; // Used for scrolling var float DesiredWidth; var float DesiredHeight; var UWindowDialogControl TabLast; function OKPressed() { } function Notify(UWindowDialogControl C, byte E) { // Handle this notification in a subclass. } function UWindowDialogControl CreateControl(class ControlClass, float X, float Y, float W, float H, optional UWindowWindow OwnerWindow) { local UWindowDialogControl C; C = UWindowDialogControl(CreateWindow(ControlClass, X, Y, W, H, OwnerWindow)); C.Register(Self); C.Notify(C.DE_Created); if(TabLast == None) { TabLast = C; C.TabNext = C; C.TabPrev = C; } else { C.TabNext = TabLast.TabNext; C.TabPrev = TabLast; TabLast.TabNext.TabPrev = C; TabLast.TabNext = C; TabLast = C; } return C; } function Paint(Canvas C, float X, float Y) { Super.Paint(C, X, Y); LookAndFeel.DrawClientArea(Self, C); } function GetDesiredDimensions(out float W, out float H) { W = DesiredWidth; H = DesiredHeight; }  T5" " " " *D"tu~@ ~ ~~R1 "F q'Rb,  ~Z4~~class UWindowControlFrame expands UWindowWindow; var UWindowWindow Framed; function SetFrame(UWindowWindow W) { Framed = W; W.SetParent(Self); } function BeforePaint(Canvas C, float X, float Y) { if(Framed != None) LookAndFeel.ControlFrame_SetupSizes(Self, C); } function Paint(Canvas C, float X, float Y) { LookAndFeel.ControlFrame_Draw(Self, C); } ~~~bF4D4)u-2 O ?%O 6.% .% h O 6=-2O  ~5V4u`5ut-O .% .% h O 6? ~yx3eI 9~ ee-t'eI~ eO~ eT~ eQ~ eRLeK_eGLeJY ~@class UWindowConsoleWindow extends UWindowFramedWindow; var float OldParentWidth, OldParentHeight; function Created() { Super.Created(); bSizable = True; bStatusBar = True; bLeaveOnScreen = True; OldParentWidth = ParentWindow.WinWidth; OldParentHeight = ParentWindow.WinHeight; SetDimensions(); SetAcceptsFocus(); } function ShowWindow() { Super.ShowWindow(); if(ParentWindow.WinWidth != OldParentWidth || ParentWindow.WinHeight != OldParentHeight) { SetDimensions(); OldParentWidth = ParentWindow.WinWidth; OldParentHeight = ParentWindow.WinHeight; } } function ResolutionChanged(float W, float H) { SetDimensions(); } function SetDimensions() { if (ParentWindow.WinWidth < 500) { SetSize(200, 150); } else { SetSize(410, 310); } WinLeft = ParentWindow.WinWidth/2 - WinWidth/2; WinTop = ParentWindow.WinHeight/2 - WinHeight/2; } function Close(optional bool bByParent) { ClientArea.Close(True); Root.Console.HideConsole(); } ~~~xG4kS:@ kk-t'kI@ kO@ kT@ kQ@ kRZkKVkGZkJU ~Hclass UWindowConsoleTextAreaControl extends UWindowDynamicTextArea; ~BM)o ,8)M*w* cM ~vJ4pB49<B pp-t'pIB pOB pTB pQB pRrpK\pGrpJ] ~Kclass UWindowConsoleClientWindow extends UWindowDialogClientWindow; var UWindowConsoleTextAreaControl TextArea; var UWindowEditControl EditControl; function Created() { TextArea = UWindowConsoleTextAreaControl(CreateWindow(class'UWindowConsoleTextAreaControl', 0, 0, WinWidth, WinHeight)); EditControl = UWindowEditControl(CreateControl(class'UWindowEditControl', 0, WinHeight-16, WinWidth, 16)); EditControl.SetFont(F_Normal); EditControl.SetNumericOnly(False); EditControl.SetMaxLength(400); EditControl.SetHistory(True); } function Notify(UWindowDialogControl C, byte E) { local string s; Super.Notify(C, E); switch(E) { case DE_EnterPressed: switch(C) { case EditControl: if(EditControl.GetValue() != "") { s = EditControl.GetValue(); Root.Console.Message( None, "> "$s, 'Console' ); EditControl.Clear(); if( !Root.Console.ConsoleCommand( s ) ) Root.Console.Message( None, Localize("Errors","Exec","Core"), 'Console' ); } break; } break; case DE_WheelUpPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(-1); break; } break; case DE_WheelDownPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(1); break; } break; } } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); EditControl.SetSize(WinWidth, 17); EditControl.WinLeft = 0; EditControl.WinTop = WinHeight - EditControl.WinHeight; EditControl.EditBoxWidth = WinWidth; TextArea.SetSize(WinWidth, WinHeight - EditControl.WinHeight); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } ~o G'D, hDo DiH ~CM4uAG=A uu-t'uIA uOA uTA uQA uRguK_uGguJ` ~Zclass UWindowComboRightButton extends UWindowButton; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Combo_SetupRightButton(Self); } function LMouseDown(float X, float Y) { local int i; Super.LMouseDown(X, Y); if(!bDisabled) { i = UWindowComboControl(OwnerWindow).GetSelectedIndex(); i++; if(i >= UWindowComboControl(OwnerWindow).List.Items.Count()) i = 0; UWindowComboControl(OwnerWindow).SetSelectedIndex(i); } } ~I4~~tP4_z[?N_E E_b*D__?6E ?6E ?6 E ?6 E N_-u_6eD_z-_WN ~S class UWindowComboListItem extends UWindowList; var string Value; var string Value2; // A second, non-displayed value var int SortWeight; var float ItemTop; function int Compare(UWindowList T, UWindowList B) { local UWindowComboListItem TI, BI; local string TS, BS; TI = UWindowComboListItem(T); BI = UWindowComboListItem(B); if(TI.SortWeight == BI.SortWeight) { TS = caps(TI.Value); BS = caps(BI.Value); if(TS == BS) return 0; if(TS < BS) return -1; return 1; } else return TI.SortWeight - BI.SortWeight; } ~R4~~uW4U4 A ~VO  =-m'V ~rS4Xykd@KXF EXb*UXX?6F ?6F ?6 F ?6 F KX-jX6eUXEXP-K ~zfclass UWindowComboList extends UWindowListControl; var UWindowComboControl Owner; var UWindowVScrollBar VertSB; var UWindowComboListItem Selected; var int ItemHeight; var int VBorder; var int HBorder; var int TextBorder; var int MaxVisible; function Sort() { Items.Sort(); } function WindowShown() { Super.WindowShown(); FocusWindow(); } function Clear() { Items.Clear(); } function Texture GetLookAndFeelTexture() { return LookAndFeel.Active; } function Setup() { VertSB = UWindowVScrollBar(CreateWindow(class'UWindowVScrollBar', 0, WinWidth - 16, 16, WinHeight)); } function Created() { ListClass = class'UWindowComboListItem'; bAlwaysOnTop = True; bTransient = True; Super.Created(); ItemHeight = 15; VBorder = 3; HBorder = 3; TextBorder = 9; Super.Created(); } function int FindItemIndex(string Value, optional bool bIgnoreCase) { local UWindowComboListItem I; local int Count; I = UWindowComboListItem(Items.Next); Count = 0; while(I != None) { if(bIgnoreCase && I.Value ~= Value) return Count; if(I.Value == Value) return Count; Count++; I = UWindowComboListItem(I.Next); } return -1; } function int FindItemIndex2(string Value2, optional bool bIgnoreCase) { local UWindowComboListItem I; local int Count; I = UWindowComboListItem(Items.Next); Count = 0; while(I != None) { if(bIgnoreCase && I.Value2 ~= Value2) return Count; if(I.Value2 == Value2) return Count; Count++; I = UWindowComboListItem(I.Next); } return -1; } function string GetItemValue(int Index) { local UWindowComboListItem I; local int Count; I = UWindowComboListItem(Items.Next); Count = 0; while(I != None) { if(Count == Index) return I.Value; Count++; I = UWindowComboListItem(I.Next); } return ""; } function RemoveItem(int Index) { local UWindowComboListItem I; local int Count; if(Index == -1) return; I = UWindowComboListItem(Items.Next); Count = 0; while(I != None) { if(Count == Index) { I.Remove(); return; } Count++; I = UWindowComboListItem(I.Next); } } function string GetItemValue2(int Index) { local UWindowComboListItem I; local int Count; I = UWindowComboListItem(Items.Next); Count = 0; while(I != None) { if(Count == Index) return I.Value2; Count++; I = UWindowComboListItem(I.Next); } return ""; } function AddItem(string Value, optional string Value2, optional int SortWeight) { local UWindowComboListItem I; I = UWindowComboListItem(Items.Append(class'UWindowComboListItem')); I.Value = Value; I.Value2 = Value2; I.SortWeight = SortWeight; } function InsertItem(string Value, optional string Value2, optional int SortWeight) { local UWindowComboListItem I; I = UWindowComboListItem(Items.Insert(class'UWindowComboListItem')); I.Value = Value; I.Value2 = Value2; I.SortWeight = SortWeight; } function SetSelected(float X, float Y) { local UWindowComboListItem NewSelected, Item; local int i, Count; Count = 0; for( Item = UWindowComboListItem(Items.Next);Item != None; Item = UWindowComboListItem(Item.Next) ) Count++; i = (Y - VBorder) / ItemHeight + VertSB.Pos; if(i < 0) i = 0; if(i >= VertSB.Pos + Min(Count, MaxVisible)) i = VertSB.Pos + Min(Count, MaxVisible) - 1; NewSelected = UWindowComboListItem(Items.FindEntry(i)); if(NewSelected != Selected) { if(NewSelected == None) Selected = None; else Selected = NewSelected; } } function MouseMove(float X, float Y) { Super.MouseMove(X, Y); if(Y > WinHeight) VertSB.Scroll(1); if(Y < 0) VertSB.Scroll(-1); SetSelected(X, Y); FocusWindow(); } function LMouseUp(float X, float Y) { If(Y >= 0 && Y <= WinHeight && Selected != None) { ExecuteItem(Selected); } Super.LMouseUp(X, Y); } function LMouseDown(float X, float Y) { Root.CaptureMouse(); } function BeforePaint(Canvas C, float X, float Y) { local float W, H, MaxWidth; local int Count; local UWindowComboListItem I; local float ListX, ListY; local float ExtraWidth; C.Font = Root.Fonts[F_Normal]; C.SetPos(0, 0); MaxWidth = Owner.EditBoxWidth; ExtraWidth = ((HBorder + TextBorder) * 2); Count = Items.Count(); if(Count > MaxVisible) { ExtraWidth += LookAndFeel.Size_ScrollbarWidth; WinHeight = (ItemHeight * MaxVisible) + (VBorder * 2); } else { VertSB.Pos = 0; WinHeight = (ItemHeight * Count) + (VBorder * 2); } for( I = UWindowComboListItem(Items.Next);I != None; I = UWindowComboListItem(I.Next) ) { TextSize(C, RemoveAmpersand(I.Value), W, H); if(W + ExtraWidth > MaxWidth) MaxWidth = W + ExtraWidth; } WinWidth = MaxWidth; ListX = Owner.EditAreaDrawX + Owner.EditBoxWidth - WinWidth; ListY = Owner.Button.WinTop + Owner.Button.WinHeight; if(Count > MaxVisible) { VertSB.ShowWindow(); VertSB.SetRange(0, Count, MaxVisible); VertSB.WinLeft = WinWidth - LookAndFeel.Size_ScrollbarWidth - HBorder; VertSB.WinTop = HBorder; VertSB.WinWidth = LookAndFeel.Size_ScrollbarWidth; VertSB.WinHeight = WinHeight - 2*VBorder; } else { VertSB.HideWindow(); } Owner.WindowToGlobal(ListX, ListY, WinLeft, WinTop); } function Paint(Canvas C, float X, float Y) { local int Count; local UWindowComboListItem I; DrawMenuBackground(C); Count = 0; for( I = UWindowComboListItem(Items.Next);I != None; I = UWindowComboListItem(I.Next) ) { if(VertSB.bWindowVisible) { if(Count >= VertSB.Pos) DrawItem(C, I, HBorder, VBorder + (ItemHeight * (Count - VertSB.Pos)), WinWidth - (2 * HBorder) - VertSB.WinWidth, ItemHeight); } else DrawItem(C, I, HBorder, VBorder + (ItemHeight * Count), WinWidth - (2 * HBorder), ItemHeight); Count++; } } function DrawMenuBackground(Canvas C) { LookAndFeel.ComboList_DrawBackground(Self, C); } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { LookAndFeel.ComboList_DrawItem(Self, C, X, Y, W, H, UWindowComboListItem(Item).Value, Selected == Item); } function ExecuteItem(UWindowComboListItem I) { Owner.SetValue(I.Value, I.Value2); CloseUp(); } function CloseUp() { Owner.CloseUp(); } function FocusOtherWindow(UWindowWindow W) { Super.FocusOtherWindow(W); if(bWindowVisible && W.ParentWindow.ParentWindow != Self && W.ParentWindow != Self && W.ParentWindow != Owner) CloseUp(); } ~~~~~be4[4)w-2 R ?%R 6.% .% h R 6=-2R  ~jX4hvzAOG hhSh-hahhh ?,hh-t'hIG hOG hTG hQG hRrhK\hGrhJ] ~[class UWindowComboLeftButton extends UWindowButton; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Combo_SetupLeftButton(Self); } function LMouseDown(float X, float Y) { local int i; Super.LMouseDown(X, Y); if(!bDisabled) { i = UWindowComboControl(OwnerWindow).GetSelectedIndex(); i--; if(i < 0) i = UWindowComboControl(OwnerWindow).List.Items.Count() - 1; UWindowComboControl(OwnerWindow).SetSelectedIndex(i); } } ~g4tW+%-u()wO*O ~j]4_hCJH __S_-_a___ __-t'_IH _OH _TH _QH _Rg_K__Gg_J` ~l@class UWindowComboControl extends UWindowDialogControl; var float EditBoxWidth; var float EditAreaDrawX, EditAreaDrawY; var UWindowEditBox EditBox; var UWindowComboButton Button; var UWindowComboLeftButton LeftButton; var UWindowComboRightButton RightButton; var class ListClass; var UWindowComboList List; var bool bListVisible; var bool bCanEdit; var bool bButtons; function Created() { Super.Created(); EditBox = UWindowEditBox(CreateWindow(class'UWindowEditBox', 0, 0, WinWidth-12, WinHeight)); EditBox.NotifyOwner = Self; EditBoxWidth = WinWidth / 2; EditBox.bTransient = True; Button = UWindowComboButton(CreateWindow(class'UWindowComboButton', WinWidth-12, 0, 12, 10)); Button.Owner = Self; List = UWindowComboList(Root.CreateWindow(ListClass, 0, 0, 100, 100)); List.LookAndFeel = LookAndFeel; List.Owner = Self; List.Setup(); List.HideWindow(); bListVisible = False; SetEditTextColor(LookAndFeel.EditBoxTextColor); } function SetButtons(bool bInButtons) { bButtons = bInButtons; if(bInButtons) { LeftButton = UWindowComboLeftButton(CreateWindow(class'UWindowComboLeftButton', WinWidth-12, 0, 12, 10)); RightButton = UWindowComboRightButton(CreateWindow(class'UWindowComboRightButton', WinWidth-12, 0, 12, 10)); } else { LeftButton = None; RightButton = None; } } function Notify(byte E) { Super.Notify(E); if(E == DE_LMouseDown) { if(!bListVisible) { if(!bCanEdit) { DropDown(); Root.CaptureMouse(List); } } else CloseUp(); } } function int FindItemIndex(string V, optional bool bIgnoreCase) { return List.FindItemIndex(V, bIgnoreCase); } function RemoveItem(int Index) { List.RemoveItem(Index); } function int FindItemIndex2(string V2, optional bool bIgnoreCase) { return List.FindItemIndex2(V2, bIgnoreCase); } function Close(optional bool bByParent) { if(bByParent && bListVisible) CloseUp(); Super.Close(bByParent); } function SetNumericOnly(bool bNumericOnly) { EditBox.bNumericOnly = bNumericOnly; } function SetNumericFloat(bool bNumericFloat) { EditBox.bNumericFloat = bNumericFloat; } function SetFont(int NewFont) { Super.SetFont(NewFont); EditBox.SetFont(NewFont); } function SetEditTextColor(Color NewColor) { EditBox.SetTextColor(NewColor); } function SetEditable(bool bNewCanEdit) { bCanEdit = bNewCanEdit; EditBox.SetEditable(bCanEdit); } function int GetSelectedIndex() { return List.FindItemIndex(GetValue()); } function SetSelectedIndex(int Index) { SetValue(List.GetItemValue(Index), List.GetItemValue2(Index)); } function string GetValue() { return EditBox.GetValue(); } function string GetValue2() { return EditBox.GetValue2(); } function SetValue(string NewValue, optional string NewValue2) { EditBox.SetValue(NewValue, NewValue2); } function SetMaxLength(int MaxLength) { EditBox.MaxLength = MaxLength; } function Paint(Canvas C, float X, float Y) { LookAndFeel.Combo_Draw(Self, C); Super.Paint(C, X, Y); } function AddItem(string S, optional string S2, optional int SortWeight) { List.AddItem(S, S2, SortWeight); } function InsertItem(string S, optional string S2, optional int SortWeight) { List.InsertItem(S, S2, SortWeight); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); LookAndFeel.Combo_SetupSizes(Self, C); List.bLeaveOnscreen = bListVisible && bLeaveOnscreen; } function CloseUp() { bListVisible = False; EditBox.SetEditable(bCanEdit); EditBox.SelectAll(); List.HideWindow(); } function DropDown() { bListVisible = True; EditBox.SetEditable(False); List.ShowWindow(); } function Sort() { List.Sort(); } function ClearValue() { EditBox.Clear(); } function Clear() { List.Clear(); EditBox.Clear(); } function FocusOtherWindow(UWindowWindow W) { Super.FocusOtherWindow(W); if(bListVisible && W.ParentWindow != Self && W != List && W.ParentWindow != List) CloseUp(); } ~CH2S @ Kz CS v.z _.S _y .S [RS jy .S _y .z [y z  ~i`4U gEH@HU z?6 U6 S?,H^]U ?,U U z?6 U6 S?, ~y' 11~5q4zb5zw-O .% .% h R 6? ~ic4K aGRK GeGaK K aK  ~keP"-u' -~ O ~z ~~~A~mf4GiHspG%G (?GopFsYEsUDY ~~~k4~~db4x {S|.x w|*r|Fx .x _.|_|.|dx  ~py ~B~~l4~~us4p4 B ~A!j4O|H=O2X~AO?, A ` ~VR  :-m'V ~iwa ~hr4gQIMrg1[giVI ? W2g%iVI \?&? Z2g-XVI ?&?\?,A Y2V%g (?6V$6V$6V$g9VI ?gb,@[{' ~u class UWindowComboButton extends UWindowButton; var UWindowComboControl Owner; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Combo_GetButtonBitmaps(Self); bMouseDown = Owner.bListVisible; } function LMouseDown(float X, float Y) { if(!bDisabled) { if(Owner.bListVisible) Owner.CloseUp(); else { Owner.DropDown(); Root.CaptureMouse(Owner.List); } } } function Click(float X, float Y) { } function FocusOtherWindow(UWindowWindow W) { Super.FocusOtherWindow(W); if(Owner.bListVisible && W.ParentWindow != Owner && W.ParentWindow != Owner.List && W.ParentWindow.ParentWindow != Owner.List) Owner.CloseUp(); } ~5o/e r5e }-O .  .  l U  E? ~p[j*2 [R  ~\~~~~V~~k//============================================================================= // UWindowClientWindow - a blanked client-area window. //============================================================================= class UWindowClientWindow extends UWindowWindow; #exec TEXTURE IMPORT NAME=Background FILE=Textures\Background.pcx GROUP="Icons" MIPS=OFF function Close(optional bool bByParent) { if(!bByParent) ParentWindow.Close(bByParent); Super.Close(bByParent); } ~du4y^XKyi^ Yy2X^@y?,@ ^y(i^y?, ]y(i^y?, Zy@X^@y?,y?,@ \y6i^y?,y?, Xy2X^@@y?, _y@X^y?,@@y?, [y@X^@@y?,y?, b ~R //============================================================================= // UWindowCheckbox - a checkbox //============================================================================= class UWindowCheckbox extends UWindowButton; var bool bChecked; function BeforePaint(Canvas C, float X, float Y) { LookAndFeel.Checkbox_SetupSizes(Self, C); Super.BeforePaint(C, X, Y); } function Paint(Canvas C, float X, float Y) { LookAndFeel.Checkbox_Draw(Self, C); Super.Paint(C, X, Y); } function LMouseUp(float X, float Y) { if(!bDisabled) { bChecked = !bChecked; Notify(DE_Change); } Super.LMouseUp(X, Y); } ~h C; local Object O; i = InStr(Text, ","); if(i == -1) { ObjectClass=Text; Text=""; } else { ObjectClass=Left(Text, i); Text=Mid(Text, i+1); } //Log("Class: "$ObjectClass); C = class(DynamicLoadObject(ObjectClass, class'Class')); O = new C; while(Text != "") { i = InStr(Text, "="); if(i == -1) { Log("Missing value for property "$ObjectClass$"."$Text); PropertyName=Text; PropertyValue=""; } else { PropertyName=Left(Text, i); Text=Mid(Text, i+1); } if(Left(Text, 1) == "\"") { i = InStrAfter(Text, "\"", 1); if(i == -1) { Log("Missing quote for "$ObjectClass$"."$PropertyName); return O; } PropertyValue = Mid(Text, 1, i-1); Temp = Mid(Text, i+1, 1); if(Temp != "" && Temp != ",") Log("Missing comma after close quote for "$ObjectClass$"."$PropertyName); Text = Mid(Text, i+2); } else { i = InStr(Text, ","); if(i == -1) { PropertyValue=Text; Text=""; } else { PropertyValue=Left(Text, i); Text=Mid(Text, i+1); } } //Log("Property: "$PropertyName$" => "$PropertyValue); O.SetPropertyText(PropertyName, PropertyValue); } return O; } ~q w<# H   ' ~x4{o4d{ K%K,urKN*KN dKN@KNrKNdKNK"Out of LookAndFeel array space!!* ~bw4z4)-2 U ?%)U  E.  .  l U  E=-2U   W5" " ""*%:4*;Es"7a0~@doOJQ%J+2dOdExJ7_JOvnvP68YYI'VKttiYLR^LGIF0*tQ'JG'C'Doxx2577E__donJ=VXfd>'$1+   nv|@uIqiUaupukSr_JCY^<''n2'*E  !r.1Lo;=8+H]NyaD1qip}')8y/vnhq+9xd?b(.r_B/##M.  AOxX=Ix1WYuIuYa^iD5X8p%  ' 1['=?C n=Xq? +1J!GI6^^uNg IaUItJvrxHK $92  H_#VMxx{Rgk1$U_vnxF}i 'N1umGLGr=Jv_dx=BM*(B=)JJXvnjHGlG#;1pWm)0BXv\Xdq"6f&\.XXvR4YlXd MxOU0''"4GRkrrgqE J& '+ID]qvpL3**J*-*&((=/ H*J3QlZ.1Di'||x6oI.1''Y#xHA1hnyubM)''D@'%9L1 $1M6lG=U)) 'a|qipIfw9l[xE(vqZxrdE=r0>v*i'StD'+ oL'yzq66Inq:.c.  1Gy!ux.n., C 3kpQCnCxI5C^uunGRDYo|rO_ }n Q  I' ZiA'I.NLW6Sn<1"1+ny|'"' -n*Ltq:1ioD:Aqq^=zI__(/OXnDqxlD ( LA'4Qmj33E&1nB7JfZnJ(nxO)IA1 $%aD<1Yp$Sq' I'18CBXJ77!t)jZBE-?nxnOZx5/? d4qR1ip]=oN1#:(&/-ndnZdX=#r3_31p6"]kiDaIY9'adq%UN ,3?JxdX6\?>3X=BdjJOZx_=**#'`6YA4`V'O 4"1.8exX7M=.d "$  ID^D^pIk^iuuk99qo|F?! /XnXXjn*J*=n=X=jXxO= Dx4'4?@ F;D9/=77( ( *CE ] Y 'pY/Xd  *# G#  1D'E*=/=- =*(/d'_'9 ')+ )xh_vr =/    G<$ ) kD91'Y_a=9nxX//=C>Z3 -/J7XXKd EH#7nB *2*##Jxn`J.4  WcQxZ-S$ #x*   'DpA9YhpV :Xvx_*J0+?3*?BJn5  (E7n#7# #' .dndZ>7''q"ZJJrnKn '.A@a1DdxxSl: + K'n_/=X O9<"R6d_3 (.2J3 7BX=*C6)LS?*x(@dOl3 <I6QDSl||SD''D14 @6nX7nB   '+I''^S11$'B*X_7XB"-*ZrH#(J27 /_x/"QC1UyaXX::._>r "61a6Z*drxrr7##_  !6qS@P--X=dXn''IWLAp'1^Jvxd_rSYD4"N#0V D<'R6xb_ZxxOM# *=*' Ph2 C Od x?  E^uZ0PB*! sZ7_ "f3==#n=*0  _n0 14   3RKC1 8Y_ci1dZ'vdr').&)CQh6tIjw<)U^ L?#/=J('1V9M==: 1 $: (VM@R69xg|d_xC0 61  7 3n1M#yvWz*X]ZKIhJF/-=-&9  '$11NO%1E 1ID'4 >((!A+4 ^WuifSZZ_|jh]z611)1 '-0xJ&0q6I9+^`OjnaJ7F@ )B7J"    % *HGN$E'$ S4'9D<]r!a9 'kairN3XJdJdCn'6IAA6"0U(_d*2nvL+1+Q:9"hxnv=#hIMF.6,n!"''  KJZ'5KOl$# |lDri@1813vapukxxSx_nn?W6e)s;6G8re8v<D 2`':oHxnV63&0=/#  JnnV9:##-+D9'Ijqadqu^Ia~|Jrj#nep4 n1']j1@7/- "_n< ;8 *O..  4SDIoI`r`ucqRuY1:Nr^J=nx3Gv"')G)mMxGNJnJ-+O>O?X=XJdB_.dVj#B no*\0&n  *? )J O C 1.'6CcatacI4S4kz9gx2|.I4i9:VJP x*  $|xd)#Z@-d=/3d?JJxJ#J&:L< J8G'0n7 no )a=pqYiYS[%(v8"q.I99b-/*(  vSyK3dv?B TnJjZE3 K@=e,1"A1*  XF77d+ 6mOy~"YD' .jG #/nE3Zn_ "OnAX\vnvkkqx!GV5.1:A""oe86"$  ! F nvJ# ,A!Ltqk4 '%( d-'*/__Jdr++ dxxsLlxXoAKVdq/'9Df;%%'$ _On!7X=Lzqk9L^  =  snv/F$ *xdvJA1WUnvU vF^j1cD1a i:_7B).d*&8"+ |$N/_uqIauIu4+$V3#/E/wZ# 7B_#XmIAa|CLP;IwDa+)1eBJJ==!**.GO<'1'hx)pA~kck}?.EJJ[7v3(*8 G1)1IIca^LGvXX]9G9$ni'1+' /H   35d1'"'n=vaIo#7*J+ 6n0LaaIK_:* '' 1N:$'4/daa=vJ X^$d' VO_vvBJ\9`r "IA6a')A:bX#=jXnB7C'K|U=2*J.&(v|jOApLppuRDIxBM^1ZJ4'9`-JCh)=nBr??r_XscQeh1  aAGvI1 SExroZG[3*d(/X'86QzqBdr~vnXnxSRi99$ T@or '''|+< A1IqeSD' QW6mI=JQp'UIupk!F'&`%dnrO31.dr41+ "A CkUc1 1$' C Tcm',_nNv'h ''1meqaaqS  W, Z 0 x Y0kDukZF4.?LI$XdH?:o_1"  I' 1kaID $  'qlVq^lZnI'61Ya8rquqd 'AFeS 'XY' Ya ')nRxinxJH`_V)1$' / 7u 1''6"  ) 'yCxAI]OV'UD AR'aa6aj7 h<6D<.avY~)kLT<'ndxn 2SS YO1+*/ X-n 'Y 1)PyxGl@SG'''<6"8WYAak_( Qno@(&ynoDDuYI}kYUvvvy>OrwxIrD411' 3Z 7 0e FaEZ  7Q@nv}'|IqmR"4A)pLW6~Cf3F#F_'V1''I61Ak4166ea0xx|nZE'R}}#wqy1) d:#-W1FBJ# Be '*7#Fc6I9[|<''aWAWLYmCu_*qI *MX-=_vr\'69''9II<@I<"Cny_'rqDD1 # W70-J#d#--nLbLL'D4$ ApILY^qY6JJY+R  JnX3enI4''1':v0_xth"6ZrqRD=s#nB7PP-=7P=-Xx6bnyA'6'nL]q'YLrtqip9: @0-v-v>X'6 %;O'yD!X8r_xxuwx+.zIDR s=\sXsv#\Xx\hCI$m\ylZ0A0ru%+SO&-v' _ 141zvdBFFSn'q+D<.8>8On=n\yW;vvX==\|]\h^4!'>!(="(=!(>!)="'? *="(>!)>"'@"(?!*>"*@#)A")B"*A"+@#)B#*A$)B#*B#+A$+A$*C$+B#,B$*D$+C%*D#-B%+C$,C%+D%+E%+F$-E%,F&+G&,F%-F&,G&-F&,H&-G&-H'-H&.H'-I'.I'/I(/J(/K'0K(.N)/L).N)/M(0M*0M)1N*1N+1Q,1Q,5R-4V.:W07[3;a6>g8Ak;Es~@~@~@   ~@~@~@-99nHINO%&I5[^Z]Y\TWSV?A{:;q8:m89m67i'(L#$D^aXZWYRTEGDFCDAC~>?x=>v<=t<>t;@uACwhkCEyloEGy"#<34PUY57gQTPSNQ)+ObfFIeiJMimMPJMnrGIz.0OrvPSuyJM{x|z~VY~OQ|UW}eoah`gel{[_ad\_8:Rgjfihtgro|mykv sro|r~r}vuty^ft}|t|:>dRUnnrbetx@BUu~|wkoei`dhlwvto|wcq~@~@NNWZA ZNZu Z]ZGZM Zp Z}\ZUUfZZZVZ~ZiZIZbA KZssSsJsIZYu Yu ^ZJZiZdZ^Z u `A H A [Z`NcM kZwiZZcu _Ny A J A I }jM l }b\XZ\Z~Nx wsM M Nw }k p e ZXM M p p `p uZhNIp tNON)wt~`N{NVp Esuu a}^sZM h A PA np ANmsFA pA L A K Ne\f A MA NA MNoA ONeZaZn ZNNo \TA:s\|Itn }k K\tYzMK` \K|L LM  Yypfc VZ fPXvOhN~Xv&ERNIJ`VbjSc Ld \BXjr BPsVSd3{ w}XF~N^ JlN |O IJV\rGeeJl&C_{ LZtpjQEZ{_s@O ow~XzM z G&zP Xlh C v C EZzSWq Mb ]`l J|)LK;u|p p B`sfAoFRp LB kR Ba,V piL OHQ[^ru yq n@m~J5k,k`WoNsGF\LmVeC_ BR Lbrp P_`B p~@\OQN `wpy@sHf PWRvs H LVQ g&RQwmDHp Lf\I  l:w{ `J\ezY\nzS~M h\ ck nyHUe\FfvR\ Rl& |SjK9f uD EzhTj| LKB[ RkH { fJ= LY9e i\GcyGO\\Kck\{cN]UqYFGN_\IYn,[ GT BVSV fSY uhD~ Tic,\ swBfQwa p\W N@ R]q mD |nL ~ZN& BiJk%k{ z J(p [0 dkU{ cK&~ZoRi Ly( S J vYb`gIw mL ][ mkBz LIV`Z~zt]I#N Xi&+gR R D b\J rI R AyP0C`xMCo m rJYARZ m j\vdy n] kl Z{WK0G[}Rj'N y z H,FY Ji y%nI_ hX\F g\K w\e F\E V\l f[ Iv z z O\c `&@ p\f \C OHe_\j ns~J ~m\OH LWI z gnxUYHD awrmAF p WWgF rx0 lH7rXHh7p xj vH WVSg DwWE{ Ty^dy_tCDy`SyacGpsyAKRaa\G BU\ 5QUF9UIUF s^zn( R}yM m\ Rki{ lPw_ I nt B| RL g \yZ kL|a K NZ Oil BxDH|Wbf' BuSl DF oTyem3Xt( BL[\~mxA[|kyW% \fGRwG RWbNgYv RO L_ Lo_&$.@yqan:O%I m L|c^M Yk&^zS IHwZ Lj[ { LJ(yZcj L{0iL. W u&}E,Y B LQ,X b W q,W ARP*R` Cp B BNe]D n}|LT[R j| ykHUWbgj uv |EGoUE BfSC u_ RD l Sb Db%oq p@7TOJ`aog~ N M Y\%N kPzNI BX Jg Sx= RI$XOvp E LU OdCsoX C L[eRk\o {eOJeNY7RhS BzeCIRX^ JhmyOI \XwgHtyw Sp R~'RMbR]q m B{NIs Xv g  vwFGUy dOsk`ByBRC `a Bp< l6 lN*],Z z, ZJ| BZ&y jHbz@ z\tGl q} BL`[ ]j7nz5 RKR &#^Z Lx NH OW(A fLu(NDcwS Lb\wUriG)U\s# `BH QB a%lp RQ uO%W ] { lR {DJBY\DUh%m}7lLN [b jmy W H,WHYu,c DrrUM f Cu lE,rT|c,^ r0EA z Q[s`VS- RbMr O@LOO^fma|GM(@ \ck]z^KrZr1ibZuk~ z~I fX? `g\j v7 mEn~T BcKs xBJQ D` }pX' BN{]F nl_ Q} j L5 S[L mlH{&SJ_Z# }i&Ey`Hx X{@gags|vJrNBST ah kpe[^Yj&_H C `Ktb[`}@ NMx\u kT z@ }I] Yy?j^ inBz3OH(q X(I hmv BE^ XUxf^ujFmVce0 Ltp @D OS BbLmrLA BPs B_ LnN} RL[b[ N} RL J[ W j M zW_ I PW/ `f Bv5 `EM U%^ d Bu1 BD%] S Bd Bs BBW Q{`xoa ~qM B\q Jk B|BK XZ Ak WyA H- xWI f[ `uDeEBTbBc_r _ C fRE a NpN~0 cMeL] RleM |^ WK cZj thRwO GP V- Je ~ t } C#B R ya rpp WN X_ ~pLRN,a ^( W m t |~J ]Yfi Oy @HziW Ngu }D `T Cc qrSD @^ NO C^T Nmv\|@ OXwgT q v> `FaV `eNtH\{ CxL~H @D} BA `P C`Bpo C_ Cn C}IL s[ Jk J{ CK CZwiP BymHm BW.wf`u}N F~N TNbZqm ~AV PN _Y m F| BKp AY Bg ~vXJE |U {e Ru SD fT&Y cVt BN B^ Bn B~%qM R[`k B{xII BY Q g 8 lv yLE yPT Rc , lr ( PA ( {O T M_ Sq n _ S} (} L M [ S i {y vPI ) pX t Nf lu lD CS s Rb ,` r pA nP l P_ Ln L} cL N[ 4 ui fw NG S U | Oe Nt PB t PP - C^ |n P} iK mZ \i t Oy 0DH d W ' M e & wu RC  LS | Pb Rp v@ rO k^ Vm R{ &TrK R} ~M SA\ SGk Vz OH M W Lf E u ^ [D NU Od *H s RB CR ^ Za dr lA  lP y O` [o  B@ K O L ^  Rm *[|  cJ  xY j Rh Sv w ^ VF !omW ZD Sp U QTd e }x oH Vg rFx ^ x~ _ M O d B^ _ q m Ss} T OM T M [ T Lj ^ Yy ^ yH XY R h @w H E _ T [d { Rr dB OQ R` xo H q@ yN > C^ Ml w { OI yY rj ) ox NI ]W  Lf  Nu  Y C  V R  Oa Pp n~ z \  Nj Rx S G  OV Re Qt xB dP  I _ Ro  O~ bM N\ Ok Nz OH `W `h jw BF ` V Rd ls g B kP C_ nm N| GK CZ }i kg x fG  RU k/e XT Wc `!r ~LS kb bp q H tLM GY Lg M v :bE ]T Rc Bs u A H rLO `[ Rj _y M H [W Zf @u VD US @(b LJ OY Ch Vw ~E mT vc Or M A LO R^ Tn R} fM * R[ [k Y Oy * PH H W I f J u pD @S & va  ap p~  qM O\ cqk  J z V!>I @G NU  O d  Ru ]M E bS @a Rp V@ utN LoB AhQ ]Ly OH 2 LW Lph Ow U9 CF RRI lY  Rh bx kF N9vU * @K NY 5 Bh 5 Lx XCG \ OV qe V Nt V OB aQ nO_ N n BZ} z L 9\TZ gI n L~ rM O \ P k l z + RI % ]Y , bi , t y % [H ' LW ' M f eu RE ]T @c  Ls JQB JQ R` O p |  | N rM\ nk fz oI RX z h ny fH m u W | f P ou RF RV Rf M v N&p)F fo t~ hM v\ } Rj 7 y z 7 a J 7 w Y |k &I&z R` N =p Dm i~| P z J I u Y K h j x nj G {HV O ^ mm j } m L t k[ \M j \Ly zH ~yW \`f xv Y E F qT r f \J u A*D \Rn r~ Aj\  Ck Rdz  R^ @ vn fd y]u yKD ]!S y\ t y] C @aR I s v B TRQ uda sOq sN@ RN Wz^ ^ X I P g pv HTT a&n(c T`K Q F[ T3j D] Rk \z { J dK QZ B Vi vR 'LO 'Q^ S hm \L | PM 0 u[ oRi @y }G uW ^e St OD NS ^b w&r)q | Z `h LH RW  pg  Ov vKE RP  R` wKp p{ RJ R[ ,\ k Rz | K A ~Z Ti E H kW Nf Ou E D F S M b Nq u @ ZO On  N} ~NK OY f Rh a w b RF e NU yM d ROs S }B e RQ Oa go p M ~ XRL N\ Lk rz RI rY Rh Ow e OF u U Nd 1 os e M B oP e L^ Rm . R| RL W \ X k Dz F I 2.W ,RE ,~U ,Ld ,M s a A cRP cO` cNo m} a \ Q Y k Q V z  NI { NW { Oe u t t B b\ Q D`  Oo ~O~ u M t [ Dj Ny OG ~ r V Nd ? Rs ? b C ^R  O`  No r O~ r NM u[ = Ij z z kcH = Rk Rz TNJ | Y !Nh g v TM D DnR H @ w NP X^ s } w OK OZ a i Ex rG !OU a d Es  OB a Q a ` Oo o ~ EyM NF jT Nr M A OP  x_ Nn O} NN 7 b] M l U { pJ NY y F g  pu c RD c OT c Nc Oq N@ ON N] L bk h Oz h NI NW L w e Ow L a F P m U ve 7 ]s m RA NQ m L` m M o % K} RK W [ X j Oy F H WV m Ne m Ot m RC }S W\#gb 9h I P a W M f h u LC IR &N!` RNA kO g^ =dm N| OJ J Y Lh 1 a x  G M V Nd Or  NA  OO " m ^ % Nm | { &y&J % Op z  NM 7 N[ a i Ox OG }V td C r * M A * LP * ~_ & Rn zQ~ dO ~` M o j ~ vM r [ Ri Py t H k  V Oc :y r ]A ^P H JP_ H ISo `B H ESQ H DNd H GNr H BS@ H AGS H CGZ Na ~H }Jo py ^I ~h }w v V Nf gt hS ocr cU M c e r d &S M h\ Dj Dy GH z W nh Ew OF SU Qd Zs YB _P T^ Sm [| NK hZ ii Rx BH \ V Oe \ Nt a PB DQ wa ^r Y OA ^P Y Nn B| \ J wY ~ cj P y ~ dH | HW b pe w ct q lC q XQ d` co _ ~ [ J J SU J Ce ^u HC  RQ  Oa  Np % Z~ & RM & O] & Nl Dz ]I eX  Nf ( Dt xC ( OR ( Na 7Ep B~ NN XR] Om \| NK OY XOh  vw NE  OT  Nc iq RB ER _ a Lp M  XM N O] aKl ^w OF PU gc dKr [K} V H B V Og ux *NG VV k re *RW *Qf *Pu SwD *@V *e \ u SU D Z S P Nd P ps ` f A l RO g _ Nm u| ^K DY _ Rh P Rx P OH x,W SoCC F F xU C Nd 5 Nr m A 5 OR 4 Ra 5 pq L@ / NO / O^ / pm R| & LL S5\ E pQ kO ` x q 2 R pN |h] pE S)VT oj Ry OI qX Nf @ M u LlD jS B b Rs [C RR pa Ap EA :NO :L^ Vm :M | :OK L[ M j H Lx G D vS Od Ns H kDA aE H wUT z{i gw j OF G U j Nd xs A QP ao vN Om N| iJ Ni j Rw #U G hV yu > RT zd s C BQ g p S~ I] J| f [ Li | H & uW & tf Ku PT us AA r ` wn pM Ol N{ qI mh } OG } NV ld z ] C fQ jp t n O t ~^ nm gL gk Oy x!H \i Rx NH F AW Hi Gx BG @U ~d n  r u~ CM }\ Nj Q Ax RG OW Sf Rt dD OT Nc gr > rA hP  Na , Rp  OA pP R_  Oo  O~  NM  C[  xl  N{ RI RZ  Nk Oy NH  OW  Nf @!u  RV Rf Rw OG NV  Re XNu RD xT XLb Oq R@ *OP O_ Rn C~ M N L] .M l N{ MJ .LY o~h gw OF  RU *Le *M t RC NS Ra Oq N@ 7 ON o] NQ l o} F N T R] N {m kp{ M K 0HZ Li 'Ax OG C OV 'M e Rs _ C ) RR $ Lb O q TC oQ ,b | N Lk] Ll F { RJ |Z my dG AV Bhe w dv RE @ vU ^ Rc ^ \s [ LB M R pNa No c~ | NM pR\ }\l }O} }NL }L[ }M j }{ y iI LY 8 Rh Hy OH NW PHM.e ^LS ^M b Np O ON D] |pl Q{ | I AX Nh pOv @ E X S :Ob Fq itJA Nt KK BV yNe a$7t }Fk nt t{ NDo H_ s NQ U n` !N iyKl R y#jw H1Xa q0fy |N_ %5n HZc .d} ` &L vNr .RA 7gQ 5x G"V l t7x Oo U x~ m/v - Ne ynK t N OM ~ny {\ sL OJ FY Fi hw z 'F G m NRA /Q }h@ Nh N,~w l F u g |T OP N_ Fn O~ NM O[ H  Gj JDq S}Ou /mD x,obq zBS u,mMb |Oo ,h?~ F} g\NK oNY ,_|g ,cBc S{Ue Iz Ny }C V+@ Fk uA-z Fg ~)u _O^ I*Wm BD N-R 'h mPN N^ vOl 7 F{ ^K ,aRi I*z{ S{Xu _$m M 'Oz FI [ &Y i  yy'N 'Nu yYD Iy*;] XFX e&^ ,s#D ,J?g ,9"f ,_(H ,Ep Bu W,D G&`p n &3#P Ls M B &~BP D uR r xG P\nXU #Lm Y!| F] q-n m,T[ Bo V+F~ bV D 5OS zSb _Uu NJ C;X FS N Id OmuA|yC5}pr }1Av ,/rm /aGakPJR 2{U QmR~;NN F\ NjNJ-xW #Oe Ot FC FQa $ia pJFYq 05iM[k^l yPI5 QYOj`}yi7uvN7 /kc:nZ+HW#m s( F `- OoF~ FL7P s\b 2OxouAS T_ vSXyUNNN7q\9lIMN TV+ V j_\X%y' N^9s`m7pM2 Rl2 _| gMNd[7m7 _^7n9 bM' O[qtjo \^I cz[BI` bK` OZ` Ni7]wC bV7Yd\FCTFRFa ZyqFjizFWQ Ff/ OuP FD9iaT ]yuTOniR}FO[ F^5B|l/ Nh FvqB0=FOC 9"R_B$[t{)Om 6xXn {ML ByY 6jRc 9|F\Z%uXNZo  iq  rv ,/{iF ujNF K_R9~jOhl 2rw vitwo OVd NeT V)sN\aLk+wDBR6by s)XqAl *O#M/y Fh NwU# :FNN@k ouN#r-CN#:p Nj#+y%KBd FfK Wwt@W]2k#9)] FF#'U#|-|#G.i NWNOf%?Gu[ #3|#L/o#H/^FM R[m#mjt FWE+fj,r)Q5%GzHW`bAt,N.cb%)dQ quO,p9DW; }[ x]s,?k&Jbjc,:QLY N]Q [kb  F ^OO]Nl&x {VW+KJc U O]i BlN ?nOm O| NK NZ5,,i NUp Ocp Nr^!F M*A Ok5 \z5WRVv,,$h IBLRN&p ^N mP vX WR( FgNvR DQ MuJ :V V PW,#E_ m@dOdNsOB CQ g &YNSO;MNWiH Oq N@H A LOn W3y[TNTS bH sLkk 7OwH $LFV RH JL`H KLl FxY HH NLWNc~S]Gq,lKxH SLC~ OObu^WU :S FM,c?\L[ FiS;w,Fn(Jpl F\u )k 'NT tbNq(YZ RY ?Aii fjN pP R@ OP N_N -m[r gZ OA NP5 G^5Ne5Nsb )dA qeOt cCPM@Q(ZZQ_ $Pk O{ OJ FY [\ h(nkD U4o o N^(Mxlt\N%d|rTHI5}Qi BNN ?PkFO O_ Nn F}N eL Rq OA NP5O_sr6n5 \dF@(dk__ $AJ OK FZSRGiU4jp U4kZ _eE U4q dN@UNJ 6U(FMK OX Og U4LEv U4o7ByxAqU4f1rc-X NE FSV'ceHJO,(ROHz FBAaQ FrLdkBj am FNSVv^.aT(zMu NBCPS`Fp{4~STg r FYR(PiW5y^ Ln Fz(@ e  FE P#S ! Fv m _D % U4nc sBbQ _Ns n 3]A Cp^ U4bN Np p~ 83M + Y @ , FO O_ <tn Nb 7 U4pp F` VM o VL} YRL \pg^ 54E 1 Fy 8 FI VNY Ygh !U4R O \Ya 2 V z > FH VOX V}g d `w F U4z@W @Q!AHp Q!VRA!_#Q!Pp!C @e~!2 Y c!7qr!J FQ!H p`!^ ]o!H O~!c:aM!~U4vn!}U4@d!1d!{U4~U!U4mS!U4q@!L bq#f (@#L Oh#D\\w#I FS#[ Fb#U`s#FS#7kb#L NA#R 7#aO#ep#fA#RR#z{ a#zr r#zd A#zn P#zk _#zgn#zh}#D)L#zW Ru#n FG#t:X#ze kR#G}#E _D#6FT#zF 0c#u FS#zx1c#EFT# Fc#w Fr#U SB#vQ>U#b NS#xSa#b Ot#6 OC#~ FR#Y3c#|V# Fu#Z3C#N:v#r-p# U4j]#JYG#.`# FN#s+\# FG#T(U# SJ }#F?G#9)F#iB"o#NB =Q#V fN#` Ft# FB#%GQ#!BX#'Z#;)A# Fj#u>z#w x# FG# YU#U4Dd#U4Qh#G.y$ U4wg$6 N^%F&l% b`R%9U_r%SqQ%N^*B%T $l% FP%AU4S_% |Xr%_7J%U4~A%a F%b FM%U4WI]%|-t%lia%NBTJ%@n^% FL%!u[%F?P%[ 3O% BB%b WP%%:g%'a%;)H% Fq% FA%L/P% J%vB,oO%H/~%yU4NLm%K`{&s:[& FU&F2c& ~oU&M-D& Fq&u N& jkM&u Ox& FG& FV& mf&JwE& -B|&z2~&XOp&9C Z&U4W Y&T BVbp&}  YR& }1k&rU4p\&U4IL'a BU'WU4gQW'U4@N~'3U4w ~(U4iu(my^( RMW(U4ZWd(d O~)yBsbM)H No)tBNA})Rp~)ROM)V(\)U4lD)u *p*RNZ*U4lh* RT*A d*zU4lm*FY+:Fi+U4gy+p`+ HCo+5cDr+S Twv+o Nm+Wik{+uf+XbE+ Ng+ Fu+@D+Sk_b+LA+RQ+SM`+L~+FN+ O]+Ll+O|+NK+FZ+WW#Yj+LC+RS+ Fb+Lp+RA+ FP+L^+Rn+ O}+LL+R\+%Bk+Lm+P}+ L\+Ol+ LK+ F[+Lj+R{+hJ+# Li+# Rz+%'UI+L^+Rn+ O}+QL+R\+Ol+N{+LJ+M Y+~h+vw+i%fE+Lk+R{+N% pJ+Lz+RJ+5 RY+Li+5 Oy+LH+5 NX+Lf+N%-v+Lc+> Os+LB+RR+> Na+Lo+R+ FN+Z^+Rn+[~+\M+O\+Nk+Lz+M I+~X+Vg+Fu+ZC+RS+~c+Lr+M A+Z O+LY+_%$Ri+L{+sW0K+L{+mL+W2\+LN+R_+mo+Wo:+ALy+ARJ+ FY+Sh+By+OI+NX+Lg+M v+RE+ ~T+Lc+Rs+N CB+zE+}U+Re+Ou+ND+LS+M b+vq+v+y S^+y Rn+C}+| L\+| Dl+V|+ L[+ Rl+z{+ LZ+ Rk+ Oz+p RI+H jMY+T kc f-H lMI-~H nMV/H oMc1~H gJp3H qDz5 R~5uc )N55dDw5H uL{5H vLG6K S6~H yX\6_ $At6H {Xu6H |XM6H e6~Y u6 N6M M6 UdV6L z6 BC6O R6~ F[6~ Nj6U x6CDB6 OF6W!U6W s6U4|}6 Ry6ud )I6 U4O r6V7 (A6a% (i6 NQ6 O_6O,.n6o !:\6 FV6aW$Bf6 Nh6N^v6 _ T6 ` ]6P jYg6&BO@6U4fO6 U4qu6ymF f9 Ol9S nE{9 U4g!@9 Rg9 Nw9T ghE9 Y m9 F|9N zL9O fmF9GRs9 U4T9E9&DsY: FL:M lM\: Ni: Nx:J mcG:%U4HFj: Or:u! }A:!i c~:I qSa:DU4it:&(%]:A PqB:BU4t9s;U4mg;@ KvT; qJ;7U4gRX;b~)A<5~\@<H HD\< eM`< Fm<H iL}q hq O?U4O@?U4{|O?H QLJ@ \V@&U4D,e@HU4\i@H RLE@ M Q@RW2`@ OR@JU4Ka@ ql@b})z@5}ZyAy IkSA&U4L~A NJAx SkXA"U4TCAB )9WAv BkPAtU4W{Ao J:RAC AkLAU4fwA O]At zulAU4_ aA R@Au} *PAV}(zAr yubA(U4FgWA N]B qkBb{)AyBj vEzBU4gBSt