123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568 |
- {
- This file is part of the Free Pascal Integrated Development Environment
- Copyright (c) 1998 by Berczi Gabor
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$I globdir.inc}
- unit WViews;
- interface
- uses Objects,Drivers,Views,Menus,Dialogs;
- const
- evIdle = $8000;
- cmCopyWin = 240;
- cmPasteWin = 241;
- cmSelectAll = 246;
- cmUnselect = 247;
- cmLocalMenu = 54100;
- cmUpdate = 54101;
- cmListFocusChanged = 54102;
- mfUserBtn1 = $00010000;
- mfUserBtn2 = $00020000;
- mfUserBtn3 = $00040000;
- mfUserBtn4 = $00080000;
- mfCantCancel = $00100000;
- cmUserBtn1 = $fee0;
- cmUserBtn2 = $fee1;
- cmUserBtn3 = $fee2;
- cmUserBtn4 = $fee3;
- CPlainCluster = #7#8#9#9;
- type
- longstring = ansistring;
- PCenterDialog = ^TCenterDialog;
- TCenterDialog = object(TDialog)
- constructor Init(var Bounds: TRect; ATitle: TTitleStr);
- end;
- PAdvancedMenuBox = ^TAdvancedMenuBox;
- TAdvancedMenuBox = object(TMenuBox)
- function NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView; virtual;
- function Execute: Word; virtual;
- end;
- PAdvancedMenuPopUp = ^TAdvancedMenuPopup;
- TAdvancedMenuPopUp = object(TMenuPopup)
- function NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView; virtual;
- function Execute: Word; virtual;
- end;
- PAdvancedMenuBar = ^TAdvancedMenuBar;
- TAdvancedMenuBar = object(TMenuBar)
- constructor Init(var Bounds: TRect; AMenu: PMenu);
- function NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView; virtual;
- procedure Update; virtual;
- function GetMenuItem(cm : word) : PMenuItem;
- procedure HandleEvent(var Event: TEvent); virtual;
- function Execute: Word; virtual;
- end;
- PAdvancedStaticText = ^TAdvancedStaticText;
- TAdvancedStaticText = object(TStaticText)
- procedure SetText(S: string); virtual;
- end;
- PAdvancedListBox = ^TAdvancedListBox;
- TAdvancedListBox = object(TListBox)
- Default: boolean;
- procedure FocusItem(Item: sw_integer); virtual;
- procedure HandleEvent(var Event: TEvent); virtual;
- constructor Load(var S: TStream);
- procedure Store(var S: TStream);
- end;
- PNoUpdateButton = ^TNoUpdateButton;
- TNoUpdateButton = object(TButton)
- procedure HandleEvent(var Event: TEvent); virtual;
- end;
- TLocalMenuListBox = object(TAdvancedListBox)
- procedure HandleEvent(var Event: TEvent); virtual;
- procedure LocalMenu(P: TPoint); virtual;
- function GetLocalMenu: PMenu; virtual;
- function GetCommandTarget: PView; virtual;
- private
- LastLocalCmd: word;
- end;
- PColorStaticText = ^TColorStaticText;
- TColorStaticText = object(TAdvancedStaticText)
- Color: word;
- DontWrap: boolean;
- Delta: TPoint;
- constructor Init(var Bounds: TRect; AText: String; AColor: word; AWrap: boolean);
- function GetPalette: PPalette; virtual;
- procedure Draw; virtual;
- constructor Load(var S: TStream);
- procedure Store(var S: TStream);
- end;
- PHSListBox = ^THSListBox;
- THSListBox = object(TLocalMenuListBox)
- constructor Init(var Bounds: TRect; ANumCols: Word; AHScrollBar, AVScrollBar: PScrollBar);
- function SaveToFile(const AFileName: string): boolean; virtual;
- function SaveAs: Boolean; virtual;
- end;
- PDlgWindow = ^TDlgWindow;
- TDlgWindow = object(TDialog)
- constructor Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer);
- procedure HandleEvent(var Event: TEvent); virtual;
- procedure Update; virtual;
- end;
- PAdvancedStatusLine = ^TAdvancedStatusLine;
- TAdvancedStatusLine = object(TStatusLine)
- StatusText: PString;
- function GetStatusText: string; virtual;
- procedure SetStatusText(const S: string); virtual;
- procedure ClearStatusText; virtual;
- procedure Draw; virtual;
- end;
- PDropDownListBox = ^TDropDownListBox;
- PDDHelperLB = ^TDDHelperLB;
- TDDHelperLB = object(TLocalMenuListBox)
- constructor Init(ALink: PDropDownListBox; var Bounds: TRect; ANumCols: Word; AScrollBar: PScrollBar);
- procedure HandleEvent(var Event: TEvent); virtual;
- procedure SetState(AState: Word; Enable: Boolean); virtual;
- procedure SelectItem(Item: Sw_Integer); virtual;
- function GetText(Item,MaxLen: Sw_Integer): String; virtual;
- function GetLocalMenu: PMenu; virtual;
- function GetCommandTarget: PView; virtual;
- private
- Link : PDropDownListBox;
- LastTT: longint;
- InClose: boolean;
- end;
- TDropDownListBox = object(TView)
- Text: string;
- Focused: sw_integer;
- List: PCollection;
- constructor Init(var Bounds: TRect; ADropLineCount: Sw_integer; AList: PCollection);
- procedure HandleEvent(var Event: TEvent); virtual;
- function GetText(Item: pointer; MaxLen: sw_integer): string; virtual;
- procedure NewList(AList: PCollection); virtual;
- procedure CreateListBox(var R: TRect);
- procedure DropList(Drop: boolean); virtual;
- function GetItemCount: sw_integer; virtual;
- procedure FocusItem(Item: sw_integer); virtual;
- function LBGetLocalMenu: PMenu; virtual;
- function LBGetCommandTarget: PView; virtual;
- procedure SetState(AState: Word; Enable: Boolean); virtual;
- procedure Draw; virtual;
- function GetPalette: PPalette; virtual;
- destructor Done; virtual;
- private
- DropLineCount: Sw_integer;
- ListDropped : boolean;
- ListBox : PDDHelperLB;
- SB : PScrollBar;
- end;
- PGroupView = ^TGroupView;
- TGroupView = object(TLabel)
- constructor Init(var Bounds: TRect; AText: String; ALink: PView);
- procedure Draw; virtual;
- end;
- PPlainCheckBoxes = ^TPlainCheckBoxes;
- TPlainCheckBoxes = object(TCheckBoxes)
- function GetPalette: PPalette; virtual;
- end;
- PPlainRadioButtons = ^TPlainRadioButtons;
- TPlainRadioButtons = object(TRadioButtons)
- function GetPalette: PPalette; virtual;
- end;
- PPanel = ^TPanel;
- TPanel = object(TGroup)
- constructor Init(var Bounds: TRect);
- end;
- PAdvMessageBox = ^TAdvMessageBox;
- TAdvMessageBox = object(TDialog)
- CanCancel: boolean;
- procedure HandleEvent(var Event: TEvent); virtual;
- end;
- procedure InsertOK(ADialog: PDialog);
- procedure InsertButtons(ADialog: PDialog);
- procedure Bug(const S: string; Params: pointer);
- procedure ErrorBox(const S: string; Params: pointer);
- procedure WarningBox(const S: string; Params: pointer);
- procedure InformationBox(const S: string; Params: pointer);
- function OKCancelBox(const S: string; Params: pointer): word;
- function ConfirmBox(const S: string; Params: pointer; CanCancel: boolean): word;
- function ChoiceBox(const S: string; Params: pointer; Buttons: array of string; CanCancel: boolean): word;
- procedure ShowMessage(Msg: string);
- procedure HideMessage;
- function SearchMenuItem(Menu: PMenu; Cmd: word): PMenuItem;
- procedure SetMenuItemParam(Menu: PMenuItem; Param: string);
- function IsSubMenu(P: PMenuItem): boolean;
- function IsSeparator(P: PMenuItem): boolean;
- function UpdateMenu(M: PMenu): boolean;
- function SearchSubMenu(M: PMenu; Index: Sw_integer): PMenuItem;
- procedure AppendMenuItem(M: PMenu; I: PMenuItem);
- procedure RemoveMenuItem(Menu: PMenu; I: PMenuItem);
- function GetMenuItemBefore(Menu:PMenu; BeforeOf: PMenuItem): PMenuItem;
- procedure NotImplemented;
- function ColorIndex(Color: byte): word;
- var FormatParams : array[1..20] of ptrint;
- FormatParamCount : integer;
- FormatParamStrs : array[1..10] of string;
- FormatParamStrCount: integer;
- procedure ClearFormatParams;
- procedure AddFormatParam(P: pointer);
- procedure AddFormatParamInt(L: longint);
- procedure AddFormatParamChar(C: char);
- procedure AddFormatParamStr(const S: string);
- function FormatStrF(const Format: string; var Params): string;
- function FormatStrStr(const Format, Param: string): string;
- function FormatStrStr2(const Format, Param1,Param2: string): string;
- function FormatStrStr3(const Format, Param1,Param2,Param3: string): string;
- function FormatStrInt(const Format: string; L: PtrInt): string;
- const UserButtonName : array[1..4] of string[40] = ('User~1~','User~2~','User~3~','User~4~');
- procedure InitAdvMsgBox;
- function AdvMessageBox(const Msg: String; Params: Pointer; AOptions: longint): Word;
- function AdvMessageBoxRect(var R: TRect; const Msg: String; Params: Pointer; AOptions: longint): Word;
- procedure DoneAdvMsgBox;
- procedure RegisterWViews;
- implementation
- uses Mouse,
- { Resource,}
- {$ifdef WinClipSupported}
- WinClip,
- FpConst,
- {$endif WinClipSupported}
- FVConsts,
- App,MsgBox,StdDlg,
- WConsts,WUtils;
- {$ifndef NOOBJREG}
- const
- RAdvancedListBox: TStreamRec = (
- ObjType: 1120;
- VmtLink: Ofs(TypeOf(TAdvancedListBox)^);
- Load: @TAdvancedListBox.Load;
- Store: @TAdvancedListBox.Store
- );
- RColorStaticText: TStreamRec = (
- ObjType: 1121;
- VmtLink: Ofs(TypeOf(TColorStaticText)^);
- Load: @TColorStaticText.Load;
- Store: @TColorStaticText.Store
- );
- RHSListBox: TStreamRec = (
- ObjType: 1122;
- VmtLink: Ofs(TypeOf(THSListBox)^);
- Load: @THSListBox.Load;
- Store: @THSListBox.Store
- );
- RDlgWindow: TStreamRec = (
- ObjType: 1123;
- VmtLink: Ofs(TypeOf(TDlgWindow)^);
- Load: @TDlgWindow.Load;
- Store: @TDlgWindow.Store
- );
- {$endif}
- {$ifdef USERESSTRINGS}
- resourcestring
- {$else}
- const
- {$endif}
- sConfirm='Confirm';
- sError='Error';
- sInformation='Information';
- sWarning='Warning';
- const
- MessageDialog : PCenterDialog = nil;
- UserButtonCmd : array[Low(UserButtonName)..High(UserButtonName)] of word = (cmUserBtn1,cmUserBtn2,cmUserBtn3,cmUserBtn4);
- {$ifdef WinClipSupported}
- FromWinClipCmds : TCommandSet = ([cmPasteWin]);
- {$endif WinClipSupported}
- function ColorIndex(Color: byte): word;
- begin
- ColorIndex:=(Color and $0f)+(Color and $0f) shl 4;
- end;
- {*****************************************************************************
- TCenterDialog
- *****************************************************************************}
- constructor TCenterDialog.Init(var Bounds: TRect; ATitle: TTitleStr);
- begin
- inherited Init(Bounds,ATitle);
- Options:=Options or ofCentered;
- end;
- function TAdvancedMenuBox.NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView;
- begin
- NewSubView := New(PAdvancedMenuBox, Init(Bounds, AMenu, AParentMenu));
- end;
- function TAdvancedMenuBox.Execute: word;
- type
- MenuAction = (DoNothing, DoSelect, DoReturn);
- var
- AutoSelect: Boolean;
- Action: MenuAction;
- Ch: Char;
- Res: Word;
- ItemShown, P: PMenuItem;
- {$ifdef WinClipSupported}
- PPW: PMenuItem;
- WinClipEmpty: boolean;
- {$endif WinClipSupported}
- Target: PMenuView;
- R: TRect;
- E: TEvent;
- MouseActive: Boolean;
- function IsDisabled(Item: PMenuItem): boolean;
- var Found: boolean;
- begin
- Found:=Item^.Disabled or IsSeparator(Item);
- if (Found=false) and (IsSubMenu(Item)=false) then
- Found:=CommandEnabled(Item^.Command)=false;
- IsDisabled:=Found;
- end;
- procedure TrackMouse;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MakeLocal(E.Where, Mouse);
- Current := Menu^.Items;
- while Current <> nil do
- begin
- GetItemRect(Current, R);
- if R.Contains(Mouse) then
- begin
- MouseActive := True;
- Break;
- end;
- Current := Current^.Next;
- end;
- if (Current<>nil) and IsDisabled(Current) then
- begin
- Current:=nil;
- MouseActive:=false;
- end;
- end;
- procedure TrackKey(FindNext: Boolean);
- procedure NextItem;
- begin
- Current := Current^.Next;
- if Current = nil then Current := Menu^.Items;
- end;
- procedure PrevItem;
- var
- P: PMenuItem;
- begin
- P := Current;
- if P = Menu^.Items then P := nil;
- repeat NextItem until Current^.Next = P;
- end;
- begin
- if Current <> nil then
- repeat
- if FindNext then NextItem else PrevItem;
- until (Current^.Name <> nil) and (IsDisabled(Current)=false);
- end;
- function MouseInOwner: Boolean;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MouseInOwner := False;
- if (ParentMenu <> nil) and (ParentMenu^.Size.Y = 1) then
- begin
- ParentMenu^.MakeLocal(E.Where, Mouse);
- ParentMenu^.GetItemRect(ParentMenu^.Current, R);
- MouseInOwner := R.Contains(Mouse);
- end;
- end;
- function MouseInMenus: Boolean;
- var
- P: PMenuView;
- begin
- P := ParentMenu;
- while (P <> nil) and (P^.MouseInView(E.Where)=false) do
- P := P^.ParentMenu;
- MouseInMenus := P <> nil;
- end;
- function TopMenu: PMenuView;
- var
- P: PMenuView;
- begin
- P := @Self;
- while P^.ParentMenu <> nil do P := P^.ParentMenu;
- TopMenu := P;
- end;
- begin
- AutoSelect := False; E.What:=evNothing;
- Res := 0;
- ItemShown := nil;
- {$ifdef WinClipSupported}
- PPW:=SearchMenuItem(Menu,cmPasteWin);
- if Assigned(PPW) then
- begin
- WinClipEmpty:=GetTextWinClipboardSize=0;
- SetCmdState(FromWinClipCmds,Not WinClipEmpty);
- PPW^.disabled:=WinClipEmpty;
- end;
- {$endif WinClipSupported}
- Current := Menu^.Default;
- MouseActive := False;
- if UpdateMenu(Menu) then
- begin
- if Current<>nil then
- if Current^.Disabled then
- TrackKey(true);
- repeat
- Action := DoNothing;
- {$ifdef WinClipSupported}
- If Assigned(PPW) then
- begin
- If WinClipEmpty and (GetTextWinClipboardSize>0) then
- begin
- WinClipEmpty:=false;
- SetCmdState(FromWinClipCmds,true);
- PPW^.disabled:=WinClipEmpty;
- DrawView;
- end
- else if Not WinClipEmpty and (GetTextWinClipboardSize=0) then
- begin
- WinClipEmpty:=true;
- SetCmdState(FromWinClipCmds,false);
- PPW^.disabled:=WinClipEmpty;
- DrawView;
- end;
- end;
- {$endif WinClipSupported}
- GetEvent(E);
- case E.What of
- evMouseDown:
- if MouseInView(E.Where) or MouseInOwner then
- begin
- TrackMouse;
- if Size.Y = 1 then AutoSelect := True;
- end else Action := DoReturn;
- evMouseUp:
- begin
- TrackMouse;
- if MouseInOwner then
- Current := Menu^.Default
- else
- if (Current <> nil) and (Current^.Name <> nil) then
- Action := DoSelect
- else
- if MouseActive or MouseInView(E.Where) then Action := DoReturn
- else
- begin
- Current := Menu^.Default;
- if Current = nil then Current := Menu^.Items;
- Action := DoNothing;
- end;
- end;
- evMouseMove:
- if E.Buttons <> 0 then
- begin
- TrackMouse;
- if not (MouseInView(E.Where) or MouseInOwner) and
- MouseInMenus then Action := DoReturn;
- end;
- evKeyDown:
- case CtrlToArrow(E.KeyCode) of
- kbUp, kbDown:
- if Size.Y <> 1 then
- TrackKey(CtrlToArrow(E.KeyCode) = kbDown) else
- if E.KeyCode = kbDown then AutoSelect := True;
- kbLeft, kbRight:
- if ParentMenu = nil then
- TrackKey(CtrlToArrow(E.KeyCode) = kbRight) else
- Action := DoReturn;
- kbHome, kbEnd:
- if Size.Y <> 1 then
- begin
- Current := Menu^.Items;
- if E.KeyCode = kbEnd then TrackKey(False);
- end;
- kbEnter:
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- end;
- kbEsc:
- begin
- Action := DoReturn;
- if (ParentMenu = nil) or (ParentMenu^.Size.Y <> 1) then
- ClearEvent(E);
- end;
- else
- Target := @Self;
- Ch := GetAltChar(E.KeyCode);
- if Ch = #0 then Ch := E.CharCode else Target := TopMenu;
- P := Target^.FindItem(Ch);
- if P = nil then
- begin
- P := TopMenu^.HotKey(E.KeyCode);
- if (P <> nil) and CommandEnabled(P^.Command) then
- begin
- Res := P^.Command;
- Action := DoReturn;
- end
- end else
- if Target = @Self then
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- Current := P;
- end else
- if (ParentMenu <> Target) or (ParentMenu^.Current <> P) then
- Action := DoReturn;
- end;
- evCommand:
- if E.Command = cmMenu then
- begin
- AutoSelect := False;
- if ParentMenu <> nil then Action := DoReturn;
- end else Action := DoReturn;
- end;
- if ItemShown <> Current then
- begin
- ItemShown := Current;
- DrawView;
- end;
- if (Action = DoSelect) or ((Action = DoNothing) and AutoSelect) then
- if Current <> nil then with Current^ do if Name <> nil then
- if Command = 0 then
- begin
- if E.What and (evMouseDown + evMouseMove) <> 0 then PutEvent(E);
- GetItemRect(Current, R);
- R.A.X := R.A.X + Origin.X;
- R.A.Y := R.B.Y + Origin.Y;
- R.B := Owner^.Size;
- if Size.Y = 1 then Dec(R.A.X);
- Target := TopMenu^.NewSubView(R, SubMenu, @Self);
- Res := Owner^.ExecView(Target);
- Dispose(Target, Done);
- end else if Action = DoSelect then Res := Command;
- if (Res <> 0) and CommandEnabled(Res) then
- begin
- Action := DoReturn;
- ClearEvent(E);
- end
- else
- Res := 0;
- until Action = DoReturn;
- end;
- if E.What <> evNothing then
- if (ParentMenu <> nil) or (E.What = evCommand) then PutEvent(E);
- if Current <> nil then
- begin
- Menu^.Default := Current;
- Current := nil;
- DrawView;
- end;
- Execute := Res;
- end;
- function TAdvancedMenuPopup.NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView;
- begin
- NewSubView := New(PAdvancedMenuBox, Init(Bounds, AMenu, AParentMenu));
- end;
- function TAdvancedMenuPopup.Execute: word;
- type
- MenuAction = (DoNothing, DoSelect, DoReturn);
- var
- AutoSelect: Boolean;
- Action: MenuAction;
- Ch: Char;
- Res: Word;
- ItemShown, P: PMenuItem;
- Target: PMenuView;
- R: TRect;
- E: TEvent;
- MouseActive: Boolean;
- function IsDisabled(Item: PMenuItem): boolean;
- var Found: boolean;
- begin
- Found:=Item^.Disabled or IsSeparator(Item);
- if (Found=false) and (IsSubMenu(Item)=false) then
- Found:=CommandEnabled(Item^.Command)=false;
- IsDisabled:=Found;
- end;
- procedure TrackMouse;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MakeLocal(E.Where, Mouse);
- Current := Menu^.Items;
- while Current <> nil do
- begin
- GetItemRect(Current, R);
- if R.Contains(Mouse) then
- begin
- MouseActive := True;
- Break;
- end;
- Current := Current^.Next;
- end;
- if (Current<>nil) and IsDisabled(Current) then
- begin
- Current:=nil;
- MouseActive:=false;
- end;
- end;
- procedure TrackKey(FindNext: Boolean);
- procedure NextItem;
- begin
- Current := Current^.Next;
- if Current = nil then Current := Menu^.Items;
- end;
- procedure PrevItem;
- var
- P: PMenuItem;
- begin
- P := Current;
- if P = Menu^.Items then P := nil;
- repeat NextItem until Current^.Next = P;
- end;
- begin
- if Current <> nil then
- repeat
- if FindNext then NextItem else PrevItem;
- until (Current^.Name <> nil) and (IsDisabled(Current)=false);
- end;
- function MouseInOwner: Boolean;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MouseInOwner := False;
- if (ParentMenu <> nil) and (ParentMenu^.Size.Y = 1) then
- begin
- ParentMenu^.MakeLocal(E.Where, Mouse);
- ParentMenu^.GetItemRect(ParentMenu^.Current, R);
- MouseInOwner := R.Contains(Mouse);
- end;
- end;
- function MouseInMenus: Boolean;
- var
- P: PMenuView;
- begin
- P := ParentMenu;
- while (P <> nil) and (P^.MouseInView(E.Where)=false) do
- P := P^.ParentMenu;
- MouseInMenus := P <> nil;
- end;
- function TopMenu: PMenuView;
- var
- P: PMenuView;
- begin
- P := @Self;
- while P^.ParentMenu <> nil do P := P^.ParentMenu;
- TopMenu := P;
- end;
- begin
- AutoSelect := False; E.What:=evNothing;
- Res := 0;
- ItemShown := nil;
- Current := Menu^.Default;
- MouseActive := False;
- if UpdateMenu(Menu) then
- begin
- if Current<>nil then
- if Current^.Disabled then
- TrackKey(true);
- repeat
- Action := DoNothing;
- GetEvent(E);
- case E.What of
- evMouseDown:
- if MouseInView(E.Where) or MouseInOwner then
- begin
- TrackMouse;
- if Size.Y = 1 then AutoSelect := True;
- end else Action := DoReturn;
- evMouseUp:
- begin
- TrackMouse;
- if MouseInOwner then
- Current := Menu^.Default
- else
- if (Current <> nil) and (Current^.Name <> nil) then
- Action := DoSelect
- else
- if MouseActive or MouseInView(E.Where) then Action := DoReturn
- else
- begin
- Current := Menu^.Default;
- if Current = nil then Current := Menu^.Items;
- Action := DoNothing;
- end;
- end;
- evMouseMove:
- if E.Buttons <> 0 then
- begin
- TrackMouse;
- if not (MouseInView(E.Where) or MouseInOwner) and
- MouseInMenus then Action := DoReturn;
- end;
- evKeyDown:
- case CtrlToArrow(E.KeyCode) of
- kbUp, kbDown:
- if Size.Y <> 1 then
- TrackKey(CtrlToArrow(E.KeyCode) = kbDown) else
- if E.KeyCode = kbDown then AutoSelect := True;
- kbLeft, kbRight:
- if ParentMenu = nil then
- TrackKey(CtrlToArrow(E.KeyCode) = kbRight) else
- Action := DoReturn;
- kbHome, kbEnd:
- if Size.Y <> 1 then
- begin
- Current := Menu^.Items;
- if E.KeyCode = kbEnd then TrackKey(False);
- end;
- kbEnter:
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- end;
- kbEsc:
- begin
- Action := DoReturn;
- if (ParentMenu = nil) or (ParentMenu^.Size.Y <> 1) then
- ClearEvent(E);
- end;
- else
- Target := @Self;
- Ch := GetAltChar(E.KeyCode);
- if Ch = #0 then Ch := E.CharCode else Target := TopMenu;
- P := Target^.FindItem(Ch);
- if P = nil then
- begin
- P := TopMenu^.HotKey(E.KeyCode);
- if (P <> nil) and CommandEnabled(P^.Command) then
- begin
- Res := P^.Command;
- Action := DoReturn;
- end
- end else
- if Target = @Self then
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- Current := P;
- end else
- if (ParentMenu <> Target) or (ParentMenu^.Current <> P) then
- Action := DoReturn;
- end;
- evCommand:
- if E.Command = cmMenu then
- begin
- AutoSelect := False;
- if ParentMenu <> nil then Action := DoReturn;
- end else Action := DoReturn;
- end;
- if ItemShown <> Current then
- begin
- ItemShown := Current;
- DrawView;
- end;
- if (Action = DoSelect) or ((Action = DoNothing) and AutoSelect) then
- if Current <> nil then with Current^ do if Name <> nil then
- if Command = 0 then
- begin
- if E.What and (evMouseDown + evMouseMove) <> 0 then PutEvent(E);
- GetItemRect(Current, R);
- R.A.X := R.A.X + Origin.X;
- R.A.Y := R.B.Y + Origin.Y;
- R.B := Owner^.Size;
- if Size.Y = 1 then Dec(R.A.X);
- Target := TopMenu^.NewSubView(R, SubMenu, @Self);
- Res := Owner^.ExecView(Target);
- Dispose(Target, Done);
- end else if Action = DoSelect then Res := Command;
- if (Res <> 0) and CommandEnabled(Res) then
- begin
- Action := DoReturn;
- ClearEvent(E);
- end
- else
- Res := 0;
- until Action = DoReturn;
- end;
- if E.What <> evNothing then
- if (ParentMenu <> nil) or (E.What = evCommand) then PutEvent(E);
- if Current <> nil then
- begin
- Menu^.Default := Current;
- Current := nil;
- DrawView;
- end;
- Execute := Res;
- end;
- constructor TAdvancedMenuBar.Init(var Bounds: TRect; AMenu: PMenu);
- begin
- inherited Init(Bounds, AMenu);
- EventMask:=EventMask or evBroadcast;
- GrowMode:=gfGrowHiX;
- end;
- function TAdvancedMenuBar.NewSubView(var Bounds: TRect; AMenu: PMenu;
- AParentMenu: PMenuView): PMenuView;
- begin
- NewSubView := New(PAdvancedMenuBox, Init(Bounds, AMenu, AParentMenu));
- end;
- procedure TAdvancedMenuBar.Update;
- begin
- UpdateMenu(Menu);
- DrawView;
- end;
- function TAdvancedMenuBar.GetMenuItem(cm : word) : PMenuItem;
- type
- PItemChain = ^TItemChain;
- TItemChain = record
- Next : PMenuItem;
- Up : PItemChain;
- end;
- var Cur : PMenuItem;
- Up,NUp : PItemChain;
- begin
- Cur:=Menu^.Items;
- Up:=nil;
- if cm=0 then
- begin
- GetMenuItem:=nil;
- exit;
- end;
- while assigned(Cur) and (Cur^.Command<>cm) do
- begin
- if (Cur^.Command=0) and assigned(Cur^.SubMenu) and
- assigned(Cur^.Name) and
- assigned(Cur^.SubMenu^.Items) then
- {subMenu}
- begin
- If assigned(Cur^.Next) then
- begin
- New(Nup);
- Nup^.Up:=Up;
- Nup^.next:=Cur^.Next;
- Up:=Nup;
- end;
- Cur:=Cur^.SubMenu^.Items;
- end
- else
- { normal item }
- begin
- if assigned(Cur^.Next) then
- Cur:=Cur^.Next
- else if assigned(Up) then
- begin
- Cur:=Up^.next;
- NUp:=Up;
- Up:=Up^.Up;
- Dispose(NUp);
- end
- else
- Cur:=Nil;
- end;
- end;
- GetMenuItem:=Cur;
- While assigned(Up) do
- begin
- NUp:=Up;
- Up:=Up^.up;
- Dispose(NUp);
- end;
- end;
- procedure TAdvancedMenuBar.HandleEvent(var Event: TEvent);
- begin
- case Event.What of
- evBroadcast :
- case Event.Command of
- cmCommandSetChanged : Update;
- cmUpdate : Update;
- end;
- end;
- inherited HandleEvent(Event);
- end;
- function TAdvancedMenuBar.Execute: word;
- type
- MenuAction = (DoNothing, DoSelect, DoReturn);
- var
- AutoSelect: Boolean;
- Action: MenuAction;
- Ch: Char;
- Res: Word;
- ItemShown, P: PMenuItem;
- Target: PMenuView;
- R: TRect;
- E: TEvent;
- MouseActive: Boolean;
- function IsDisabled(Item: PMenuItem): boolean;
- var Dis : boolean;
- begin
- Dis:=Item^.Disabled or IsSeparator(Item);
- if (Dis=false) and (IsSubMenu(Item)=false) then
- Dis:=CommandEnabled(Item^.Command)=false;
- IsDisabled:=Dis;
- end;
- procedure TrackMouse;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MakeLocal(E.Where, Mouse);
- Current := Menu^.Items;
- while Current <> nil do
- begin
- GetItemRect(Current, R);
- if R.Contains(Mouse) then
- begin
- MouseActive := True;
- Break;
- end;
- Current := Current^.Next;
- end;
- if (Current<>nil) and IsDisabled(Current) then
- Current:=nil;
- end;
- procedure TrackKey(FindNext: Boolean);
- procedure NextItem;
- begin
- Current := Current^.Next;
- if Current = nil then Current := Menu^.Items;
- end;
- procedure PrevItem;
- var
- P: PMenuItem;
- begin
- P := Current;
- if P = Menu^.Items then P := nil;
- repeat NextItem until Current^.Next = P;
- end;
- begin
- if Current <> nil then
- repeat
- if FindNext then NextItem else PrevItem;
- until (Current^.Name <> nil) and (IsDisabled(Current)=false);
- end;
- function MouseInOwner: Boolean;
- var
- Mouse: TPoint;
- R: TRect;
- begin
- MouseInOwner := False;
- if (ParentMenu <> nil) and (ParentMenu^.Size.Y = 1) then
- begin
- ParentMenu^.MakeLocal(E.Where, Mouse);
- ParentMenu^.GetItemRect(ParentMenu^.Current, R);
- MouseInOwner := R.Contains(Mouse);
- end;
- end;
- function MouseInMenus: Boolean;
- var
- P: PMenuView;
- begin
- P := ParentMenu;
- while (P <> nil) and not P^.MouseInView(E.Where) do P := P^.ParentMenu;
- MouseInMenus := P <> nil;
- end;
- function TopMenu: PMenuView;
- var
- P: PMenuView;
- begin
- P := @Self;
- while P^.ParentMenu <> nil do P := P^.ParentMenu;
- TopMenu := P;
- end;
- begin
- AutoSelect := False; E.What:=evNothing;
- Res := 0;
- ItemShown := nil;
- Current := Menu^.Default;
- MouseActive := False;
- if UpdateMenu(Menu) then
- begin
- if Current<>nil then
- if Current^.Disabled then
- TrackKey(true);
- repeat
- Action := DoNothing;
- GetEvent(E);
- case E.What of
- evMouseDown:
- if MouseInView(E.Where) or MouseInOwner then
- begin
- TrackMouse;
- if Size.Y = 1 then AutoSelect := True;
- end else Action := DoReturn;
- evMouseUp:
- begin
- TrackMouse;
- if MouseInOwner then
- Current := Menu^.Default
- else
- if (Current <> nil) and (Current^.Name <> nil) then
- Action := DoSelect
- else
- if MouseActive or MouseInView(E.Where) then Action := DoReturn
- else
- begin
- Current := Menu^.Default;
- if Current = nil then Current := Menu^.Items;
- Action := DoNothing;
- end;
- end;
- evMouseMove:
- if E.Buttons <> 0 then
- begin
- TrackMouse;
- if not (MouseInView(E.Where) or MouseInOwner) and
- MouseInMenus then Action := DoReturn;
- end;
- evKeyDown:
- case CtrlToArrow(E.KeyCode) of
- kbUp, kbDown:
- if Size.Y <> 1 then
- TrackKey(CtrlToArrow(E.KeyCode) = kbDown) else
- if E.KeyCode = kbDown then AutoSelect := True;
- kbLeft, kbRight:
- if ParentMenu = nil then
- TrackKey(CtrlToArrow(E.KeyCode) = kbRight) else
- Action := DoReturn;
- kbHome, kbEnd:
- if Size.Y <> 1 then
- begin
- Current := Menu^.Items;
- if E.KeyCode = kbEnd then TrackKey(False);
- end;
- kbEnter:
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- end;
- kbEsc:
- begin
- Action := DoReturn;
- if (ParentMenu = nil) or (ParentMenu^.Size.Y <> 1) then
- ClearEvent(E);
- end;
- else
- Target := @Self;
- Ch := GetAltChar(E.KeyCode);
- if Ch = #0 then Ch := E.CharCode else Target := TopMenu;
- P := Target^.FindItem(Ch);
- if P = nil then
- begin
- P := TopMenu^.HotKey(E.KeyCode);
- if (P <> nil) and CommandEnabled(P^.Command) then
- begin
- Res := P^.Command;
- Action := DoReturn;
- end
- end else
- if Target = @Self then
- begin
- if Size.Y = 1 then AutoSelect := True;
- Action := DoSelect;
- Current := P;
- end else
- if (ParentMenu <> Target) or (ParentMenu^.Current <> P) then
- Action := DoReturn;
- end;
- evCommand:
- if E.Command = cmMenu then
- begin
- AutoSelect := False;
- if ParentMenu <> nil then Action := DoReturn;
- end else Action := DoReturn;
- end;
- if ItemShown <> Current then
- begin
- ItemShown := Current;
- DrawView;
- end;
- if (Action = DoSelect) or ((Action = DoNothing) and AutoSelect) then
- if Current <> nil then with Current^ do if Name <> nil then
- if Command = 0 then
- begin
- if E.What and (evMouseDown + evMouseMove) <> 0 then PutEvent(E);
- GetItemRect(Current, R);
- R.A.X := R.A.X + Origin.X;
- R.A.Y := R.B.Y + Origin.Y;
- R.B := Owner^.Size;
- if Size.Y = 1 then Dec(R.A.X);
- Target := TopMenu^.NewSubView(R, SubMenu, @Self);
- Res := Owner^.ExecView(Target);
- Dispose(Target, Done);
- end else if Action = DoSelect then Res := Command;
- if (Res <> 0) and CommandEnabled(Res) then
- begin
- Action := DoReturn;
- ClearEvent(E);
- end
- else
- Res := 0;
- until Action = DoReturn;
- end;
- if E.What <> evNothing then
- if (ParentMenu <> nil) or (E.What = evCommand) then PutEvent(E);
- if Current <> nil then
- begin
- Menu^.Default := Current;
- Current := nil;
- DrawView;
- end;
- Execute := Res;
- end;
- procedure TAdvancedStaticText.SetText(S: string);
- begin
- if Text<>nil then DisposeStr(Text);
- Text:=NewStr(S);
- DrawView;
- end;
- procedure TAdvancedListBox.FocusItem(Item: sw_integer);
- var OFocused: sw_integer;
- begin
- OFocused:=Focused;
- inherited FocusItem(Item);
- if Focused<>OFocused then
- Message(Owner,evBroadcast,cmListFocusChanged,@Self);
- end;
- procedure TAdvancedListBox.HandleEvent(var Event: TEvent);
- begin
- case Event.What of
- evMouseDown :
- if MouseInView(Event.Where) {and (Event.Double)} then
- begin
- inherited HandleEvent(Event);
- if Event.Double then
- if Range>Focused then
- SelectItem(Focused);
- end;
- evBroadcast :
- case Event.Command of
- cmListItemSelected :
- Message(Owner,evBroadcast,cmDefault,nil);
- end;
- end;
- if assigned(VScrollBar) then
- VScrollBar^.HandleEvent(Event);
- if assigned(HScrollBar) then
- HScrollBar^.HandleEvent(Event);
- inherited HandleEvent(Event);
- end;
- constructor TColorStaticText.Init(var Bounds: TRect; AText: String; AColor: word; AWrap: boolean);
- begin
- inherited Init(Bounds,AText);
- DontWrap:=not AWrap;
- Color:=AColor;
- end;
- function TColorStaticText.GetPalette: PPalette;
- begin
- GetPalette:=nil;
- end;
- procedure TColorStaticText.Draw;
- procedure MoveColorTxt(var b;const curs:string;c:word);
- var
- p : ^word;
- i : sw_integer;
- col : byte;
- tilde : boolean;
- begin
- tilde:=false;
- col:=lo(c);
- p:=@b;
- i:=0;
- while (i<length(Curs)) do
- begin
- Inc(i);
- case CurS[i] of
- #1 :
- begin
- Inc(i);
- Col:=ord(curS[i]);
- end;
- #2 :
- begin
- if tilde then
- col:=hi(Color)
- else
- col:=lo(Color)
- end;
- '~' :
- begin
- tilde:=not tilde;
- if tilde then
- col:=hi(Color)
- else
- col:=lo(Color)
- end;
- else
- begin
- p^:=(col shl 8) or ord(curs[i]);
- inc(p);
- end;
- end;
- end;
- end;
- var
- C: word;
- Center: Boolean;
- I, J, L, P, Y: Sw_Integer;
- B: TDrawBuffer;
- S: String;
- T: string;
- CurS: string;
- TildeCount,Po: Sw_integer;
- TempS: string;
- begin
- if Size.X=0 then Exit;
- C:=Color;
- if (C and $0f)=((C and $f0) shr 4) then
- C:=GetColor(C and $0f);
- if DontWrap=false then
- begin
- GetText(S);
- L := Length(S);
- P := 1;
- Y := 0;
- Center := False;
- while Y < Size.Y do
- begin
- MoveChar(B, ' ', Lo(C), Size.X);
- if P <= L then
- begin
- if S[P] = #3 then
- begin
- Center := True;
- Inc(P);
- end;
- I := P;
- repeat
- J := P;
- while (P <= L) and (S[P] = ' ') do Inc(P);
- while (P <= L) and (S[P] <> ' ') and (S[P] <> #13) do Inc(P);
- until (P > L) or (P >= I + Size.X) or (S[P] = #13);
- TildeCount:=0; TempS:=copy(S,I,P-I);
- repeat
- Po:=Pos('~',TempS);
- if Po>0 then begin Inc(TildeCount); Delete(TempS,1,Po); end;
- until Po=0;
- if P > I + Size.X + TildeCount then
- if J > I then P := J else P := I + Size.X;
- T:=copy(S,I,P-I);
- if Center then J := (Size.X - {P + I}CStrLen(T)) div 2 else J := 0;
- MoveColorTxt(B[J],T,C);
- while (P <= L) and (S[P] = ' ') do Inc(P);
- if (P <= L) and (S[P] = #13) then
- begin
- Center := False;
- Inc(P);
- if (P <= L) and (S[P] = #10) then Inc(P);
- end;
- end;
- WriteLine(0, Y, Size.X, 1, B);
- Inc(Y);
- end;
- end { Wrap=false } else
- begin
- GetText(S);
- I:=1;
- for Y:=0 to Size.Y-1 do
- begin
- MoveChar(B, ' ', Lo(C), Size.X);
- CurS:='';
- if S<>'' then
- begin
- P:=Pos(#13,S);
- if P=0 then P:=length(S)+1;
- CurS:=copy(S,1,P-1);
- CurS:=copy(CurS,Delta.X+1,High(CurS));
- CurS:=copy(CurS,1,MaxViewWidth);
- Delete(S,1,P);
- end;
- if CurS<>'' then
- MoveColorTxt(B,CurS,C);
- WriteLine(0,Y,Size.X,1,B);
- end;
- end;
- end;
- constructor TColorStaticText.Load(var S: TStream);
- begin
- inherited Load(S);
- S.Read(Color,SizeOf(Color));
- S.Read(DontWrap,SizeOf(DontWrap));
- S.Read(Delta,SizeOf(Delta));
- end;
- procedure TColorStaticText.Store(var S: TStream);
- begin
- inherited Store(S);
- S.Write(Color,SizeOf(Color));
- S.Write(DontWrap,SizeOf(DontWrap));
- S.Write(Delta,SizeOf(Delta));
- end;
- constructor THSListBox.Init(var Bounds: TRect; ANumCols: Word; AHScrollBar, AVScrollBar: PScrollBar);
- begin
- inherited Init(Bounds,ANumCols,AVScrollBar);
- HScrollBar:=AHScrollBar;
- if assigned(VScrollBar) then
- VScrollBar^.SetStep(Bounds.B.Y-Bounds.A.Y-2,1);
- if assigned(HScrollBar) then
- HScrollBar^.SetStep(Bounds.B.X-Bounds.A.X-2,1);
- end;
- function THSListBox.SaveToFile(const AFileName: string): boolean;
- var OK: boolean;
- S: PBufStream;
- i, count : sw_integer;
- st : string;
- begin
- New(S, Init(AFileName,stCreate,4096));
- OK:=Assigned(S) and (S^.Status=stOK);
- if OK then
- begin
- if assigned(List) then
- Count:=List^.Count
- else
- Count:=0;
- for i:=0 to Count-1 do
- begin
- st:=GetText(i,High(st));
- S^.Write(St[1],length(St));
- if i<Count then
- S^.Write(EOL[1],length(EOL));
- OK:=(S^.Status=stOK);
- if not OK then
- break;
- end;
- end;
- if Assigned(S) then Dispose(S, Done);
- SaveToFile:=OK;
- end;
- function THSListBox.SaveAs: Boolean;
- var
- DefExt,Title,Filename : string;
- Re : word;
- begin
- SaveAs := False;
- Filename:='listbox.txt';
- DefExt:='*.txt';
- Title:='Save list box content';
- Re:=Application^.ExecuteDialog(New(PFileDialog, Init(DefExt,
- Title, label_name, fdOkButton, FileId)), @FileName);
- if Re <> cmCancel then
- SaveAs := SaveToFile(FileName);
- end;
- constructor TDlgWindow.Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer);
- begin
- inherited Init(Bounds,ATitle);
- Number:=ANumber;
- Flags:=Flags or (wfMove + wfGrow + wfClose + wfZoom);
- end;
- procedure TDlgWindow.Update;
- begin
- DrawView;
- end;
- procedure TDlgWindow.HandleEvent(var Event: TEvent);
- begin
- case Event.What of
- evBroadcast :
- case Event.Command of
- cmUpdate : Update;
- end;
- end;
- inherited HandleEvent(Event);
- end;
- procedure TLocalMenuListBox.LocalMenu(P: TPoint);
- var M: PMenu;
- MV: PAdvancedMenuPopUp;
- R: TRect;
- Re: word;
- begin
- M:=GetLocalMenu;
- if M=nil then Exit;
- if LastLocalCmd<>0 then
- M^.Default:=SearchMenuItem(M,LastLocalCmd);
- Desktop^.GetExtent(R);
- MakeGlobal(P,R.A); {Desktop^.MakeLocal(R.A,R.A);}
- New(MV, Init(R, M));
- Re:=Application^.ExecView(MV);
- if M^.Default=nil then LastLocalCmd:=0
- else LastLocalCmd:=M^.Default^.Command;
- Dispose(MV, Done);
- if Re<>0 then
- Message(GetCommandTarget,evCommand,Re,@Self);
- end;
- function TLocalMenuListBox.GetLocalMenu: PMenu;
- begin
- GetLocalMenu:=nil;
- { Abstract;}
- end;
- function TLocalMenuListBox.GetCommandTarget: PView;
- begin
- GetCommandTarget:=@Self;
- end;
- procedure TLocalMenuListBox.HandleEvent(var Event: TEvent);
- var DontClear: boolean;
- P: TPoint;
- begin
- case Event.What of
- evMouseDown :
- if MouseInView(Event.Where) and (Event.Buttons=mbRightButton) then
- begin
- MakeLocal(Event.Where,P); Inc(P.X); Inc(P.Y);
- LocalMenu(P);
- ClearEvent(Event);
- end;
- evKeyDown :
- begin
- DontClear:=false;
- case Event.KeyCode of
- kbAltF10 : Message(@Self,evCommand,cmLocalMenu,@Self);
- else DontClear:=true;
- end;
- if DontClear=false then ClearEvent(Event);
- end;
- evCommand :
- begin
- DontClear:=false;
- case Event.Command of
- cmLocalMenu :
- begin
- P:=Cursor; Inc(P.X); Inc(P.Y);
- LocalMenu(P);
- end;
- else DontClear:=true;
- end;
- if not DontClear then ClearEvent(Event);
- end;
- end;
- inherited HandleEvent(Event);
- end;
- function TAdvancedStatusLine.GetStatusText: string;
- var S: string;
- begin
- if StatusText=nil then S:='' else S:=StatusText^;
- GetStatusText:=S;
- end;
- procedure TAdvancedStatusLine.SetStatusText(const S: string);
- begin
- if StatusText<>nil then DisposeStr(StatusText);
- StatusText:=NewStr(S);
- DrawView;
- end;
- procedure TAdvancedStatusLine.ClearStatusText;
- begin
- SetStatusText('');
- end;
- procedure TAdvancedStatusLine.Draw;
- var B: TDrawBuffer;
- C: word;
- S: string;
- begin
- S:=GetStatusText;
- if S='' then inherited Draw else
- begin
- C:=GetColor(1);
- MoveChar(B,' ',C,Size.X);
- MoveStr(B[1],S,C);
- WriteLine(0,0,Size.X,Size.Y,B);
- end;
- end;
- procedure Bug(const S: string; Params: pointer);
- begin
- ErrorBox(FormatStrStr(msg_bugcheckfailed,S),Params);
- end;
- procedure ErrorBox(const S: string; Params: pointer);
- begin
- AdvMessageBox(S,Params,mfError+mfInsertInApp+mfOKButton);
- end;
- procedure WarningBox(const S: string; Params: pointer);
- begin
- AdvMessageBox(S,Params,mfWarning+mfInsertInApp+mfOKButton);
- end;
- procedure InformationBox(const S: string; Params: pointer);
- begin
- AdvMessageBox(S,Params,mfInformation+mfInsertInApp+mfOKButton);
- end;
- function OKCancelBox(const S: string; Params: pointer): word;
- begin
- OKCancelBox:=AdvMessageBox(S,Params,mfInformation+mfInsertInApp+mfOKButton+mfCancelButton);
- end;
- function b2i(B: boolean): longint;
- begin
- if b then b2i:=1 else b2i:=0;
- end;
- function ConfirmBox(const S: string; Params: pointer; CanCancel: boolean): word;
- begin
- ConfirmBox:=AdvMessageBox(S,Params,mfConfirmation+mfInsertInApp+mfYesButton+mfNoButton+
- b2i(CanCancel)*mfCancelButton+b2i(not CanCancel)*mfCantCancel);
- end;
- function ChoiceBox(const S: string; Params: pointer; Buttons: array of string; CanCancel: boolean): word;
- var BtnMask,M: longint;
- I,BtnCount: integer;
- begin
- BtnCount:=Min(High(Buttons)-Low(Buttons)+1,High(UserButtonName)-Low(UserButtonName)+1);
- BtnMask:=0; M:=mfUserBtn1;
- for I:=Low(Buttons) to Low(Buttons)+BtnCount-1 do
- begin
- UserButtonName[Low(UserButtonName)+I-Low(Buttons)]:=Buttons[I];
- BtnMask:=BtnMask or M; M:=M shl 1;
- end;
- ChoiceBox:=AdvMessageBox(S,Params,mfConfirmation+BtnMask+
- b2i(CanCancel)*mfCancelButton+b2i(not CanCancel)*mfCantCancel);
- end;
- function IsSeparator(P: PMenuItem): boolean;
- begin
- IsSeparator:=(P<>nil) and (P^.Name=nil) and (P^.HelpCtx=hcNoContext);
- end;
- function IsSubMenu(P: PMenuItem): boolean;
- begin
- IsSubMenu:=(P<>nil) and (P^.Name<>nil) and (P^.Command=0) and (P^.SubMenu<>nil);
- end;
- function SearchMenuItem(Menu: PMenu; Cmd: word): PMenuItem;
- var P,I: PMenuItem;
- begin
- I:=nil;
- if Menu=nil then P:=nil else P:=Menu^.Items;
- while (P<>nil) and (I=nil) do
- begin
- if IsSubMenu(P) then
- I:=SearchMenuItem(P^.SubMenu,Cmd);
- if I=nil then
- if P^.Command=Cmd then I:=P else
- P:=P^.Next;
- end;
- SearchMenuItem:=I;
- end;
- procedure SetMenuItemParam(Menu: PMenuItem; Param: string);
- begin
- if Menu=nil then Exit;
- if Menu^.Param<>nil then DisposeStr(Menu^.Param);
- Menu^.Param:=NewStr(Param);
- end;
- function UpdateMenu(M: PMenu): boolean;
- var P: PMenuItem;
- IsEnabled: boolean;
- begin
- if M=nil then begin UpdateMenu:=false; Exit; end;
- P:=M^.Items; IsEnabled:=false;
- while (P<>nil) do
- begin
- if IsSubMenu(P) then
- begin
- P^.Disabled:=not UpdateMenu(P^.SubMenu);
- if not P^.Disabled then
- IsEnabled:=true;
- end
- else
- begin
- if not IsSeparator(P) and
- Application^.CommandEnabled(P^.Command) then
- begin
- p^.disabled:=false;
- IsEnabled:=true;
- end;
- end;
- P:=P^.Next;
- end;
- UpdateMenu:=IsEnabled;
- end;
- function SearchSubMenu(M: PMenu; Index: Sw_integer): PMenuItem;
- var P,C: PMenuItem;
- Count: Sw_integer;
- begin
- P:=nil; Count:=-1;
- if M<>nil then C:=M^.Items else C:=nil;
- while (C<>nil) and (P=nil) do
- begin
- if IsSubMenu(C) then
- begin
- Inc(Count);
- if Count=Index then P:=C;
- end;
- C:=C^.Next;
- end;
- SearchSubMenu:=P;
- end;
- procedure AppendMenuItem(M: PMenu; I: PMenuItem);
- var P: PMenuItem;
- begin
- if (M=nil) or (I=nil) then Exit;
- I^.Next:=nil;
- if M^.Items=nil then M^.Items:=I else
- begin
- P:=M^.Items;
- while (P^.Next<>nil) do P:=P^.Next;
- P^.Next:=I;
- end;
- end;
- procedure DisposeMenuItem(P: PMenuItem);
- begin
- if P<>nil then
- begin
- if IsSubMenu(P) then DisposeMenu(P^.SubMenu) else
- if IsSeparator(P)=false then
- if P^.Param<>nil then DisposeStr(P^.Param);
- if P^.Name<>nil then DisposeStr(P^.Name);
- Dispose(P);
- end;
- end;
- procedure RemoveMenuItem(Menu: PMenu; I: PMenuItem);
- var P,PrevP: PMenuItem;
- begin
- if (Menu=nil) or (I=nil) then Exit;
- P:=Menu^.Items; PrevP:=nil;
- while (P<>nil) do
- begin
- if P=I then
- begin
- if Menu^.Items<>I then PrevP^.Next:=P^.Next
- else Menu^.Items:=P^.Next;
- DisposeMenuItem(P);
- Break;
- end;
- PrevP:=P; P:=P^.Next;
- end;
- end;
- function GetMenuItemBefore(Menu: PMenu; BeforeOf: PMenuItem): PMenuItem;
- var P,C: PMenuItem;
- begin
- P:=nil;
- if Menu<>nil then C:=Menu^.Items else C:=nil;
- while (C<>nil) do
- begin
- if C^.Next=BeforeOf then begin P:=C; Break; end;
- C:=C^.Next;
- end;
- GetMenuItemBefore:=P;
- end;
- procedure NotImplemented;
- begin
- InformationBox(msg_functionnotimplemented,nil);
- end;
- procedure InsertButtons(ADialog: PDialog);
- var R : TRect;
- W,H : Sw_integer;
- X : Sw_integer;
- X1,X2: Sw_integer;
- begin
- with ADialog^ do
- begin
- GetExtent(R);
- W:=R.B.X-R.A.X; H:=(R.B.Y-R.A.Y);
- R.Assign(0,0,W,H+3); ChangeBounds(R);
- X:=W div 2; X1:=X div 2+1; X2:=X+X1-1;
- R.Assign(X1-3,H,X1+7,H+2);
- Insert(New(PButton, Init(R, btn_OK, cmOK, bfDefault)));
- R.Assign(X2-7,H,X2+3,H+2);
- Insert(New(PButton, Init(R, btn_Cancel, cmCancel, bfNormal)));
- SelectNext(true);
- end;
- end;
- procedure InsertOK(ADialog: PDialog);
- var BW: Sw_integer;
- R: TRect;
- begin
- with ADialog^ do
- begin
- GetBounds(R); R.Grow(0,1); Inc(R.B.Y);
- ChangeBounds(R);
- BW:=10;
- R.A.Y:=R.B.Y-2; R.B.Y:=R.A.Y+2;
- R.A.X:=R.A.X+(R.B.X-R.A.X-BW) div 2; R.B.X:=R.A.X+BW;
- Insert(New(PButton, Init(R, btn_OK, cmOK, bfDefault)));
- SelectNext(true);
- end;
- end;
- procedure ShowMessage(Msg: string);
- var R: TRect;
- Width: Sw_integer;
- begin
- Width:=length(Msg)+4*2;
- if Width<(Desktop^.Size.X div 2) then Width:=(Desktop^.Size.X div 2);
- R.Assign(0,0,Width,5);
- New(MessageDialog, Init(R, ''));
- with MessageDialog^ do
- begin
- Flags:=0;
- GetExtent(R); R.Grow(-4,-2);
- if copy(Msg,1,1)<>^C then Msg:=^C+Msg;
- Insert(New(PStaticText, Init(R, Msg)));
- end;
- Application^.Insert(MessageDialog);
- end;
- procedure HideMessage;
- begin
- if MessageDialog<>nil then
- begin
- Application^.Delete(MessageDialog);
- Dispose(MessageDialog, Done);
- MessageDialog:=nil;
- end;
- end;
- constructor TDDHelperLB.Init(ALink: PDropDownListBox; var Bounds: TRect; ANumCols: Word; AScrollBar: PScrollBar);
- begin
- inherited Init(Bounds,ANumCols,AScrollBar);
- EventMask:=EventMask or (evMouseMove+evIdle);
- { Options:=Options or ofPreProcess;}
- Link:=ALink;
- end;
- procedure TDDHelperLB.SetState(AState: Word; Enable: Boolean);
- {var OState: longint;}
- begin
- { OState:=State;}
- inherited SetState(AState,Enable);
- { if (((State xor OState) and sfFocused)<>0) and (GetState(sfFocused)=false) then
- Link^.DropList(false);}
- end;
- function TDDHelperLB.GetText(Item,MaxLen: Sw_Integer): String;
- var P: pointer;
- S: string;
- begin
- P:=List^.At(Item);
- if Link=nil then S:='' else
- S:=Link^.GetText(P,MaxLen);
- GetText:=S;
- end;
- function TDDHelperLB.GetLocalMenu: PMenu;
- begin
- GetLocalMenu:=Link^.LBGetLocalMenu;
- end;
- function TDDHelperLB.GetCommandTarget: PView;
- begin
- GetCommandTarget:=Link^.LBGetCommandTarget;
- end;
- procedure TDDHelperLB.HandleEvent(var Event: TEvent);
- const
- MouseAutosToSkip = 4;
- var
- Mouse : TPoint;
- OldItem, NewItem : Sw_Integer;
- ColWidth : sw_integer;
- Count : Sw_Word;
- GoSelectItem: sw_integer;
- MouseWhere: TPoint;
- begin
- GoSelectItem:=-1;
- TView.HandleEvent(Event);
- case Event.What of
- evMouseDown :
- if MouseInView(Event.Where)=false then
- GoSelectItem:=-2
- else
- begin
- ColWidth := Size.X div NumCols + 1;
- OldItem := Focused;
- MakeLocal(Event.Where, Mouse);
- if MouseInView(Event.Where) then
- NewItem := Mouse.Y + (Size.Y * (Mouse.X div ColWidth)) + TopItem
- else
- NewItem := OldItem;
- Count := 0;
- repeat
- if NewItem <> OldItem then
- begin
- FocusItemNum(NewItem);
- DrawView;
- end;
- OldItem := NewItem;
- MakeLocal(Event.Where, Mouse);
- if MouseInView(Event.Where) then
- NewItem := Mouse.Y + (Size.Y * (Mouse.X div ColWidth)) + TopItem
- else
- begin
- if NumCols = 1 then
- begin
- if Event.What = evMouseAuto then Inc(Count);
- if Count = MouseAutosToSkip then
- begin
- Count := 0;
- if Mouse.Y < 0 then NewItem := Focused-1
- else if Mouse.Y >= Size.Y then NewItem := Focused+1;
- end;
- end
- else
- begin
- if Event.What = evMouseAuto then Inc(Count);
- if Count = MouseAutosToSkip then
- begin
- Count := 0;
- if Mouse.X < 0 then NewItem := Focused-Size.Y
- else if Mouse.X >= Size.X then NewItem := Focused+Size.Y
- else if Mouse.Y < 0 then
- NewItem := Focused - Focused mod Size.Y
- else if Mouse.Y > Size.Y then
- NewItem := Focused - Focused mod Size.Y + Size.Y - 1;
- end
- end;
- end;
- until not MouseEvent(Event, evMouseMove + evMouseAuto);
- FocusItemNum(NewItem);
- DrawView;
- if Event.Double and (Range > Focused) then SelectItem(Focused);
- ClearEvent(Event);
- GoSelectItem:=Focused;
- end;
- evMouseMove,evMouseAuto:
- if GetState(sfFocused) then
- if MouseInView(Event.Where) then
- begin
- MakeLocal(Event.Where,Mouse);
- FocusItemNum(TopItem+Mouse.Y);
- ClearEvent(Event);
- end;
- evKeyDown :
- begin
- if (Event.KeyCode=kbEsc) then
- begin
- GoSelectItem:=-2;
- ClearEvent(Event);
- end else
- if ((Event.KeyCode=kbEnter) or (Event.CharCode = ' ')) and
- (Focused < Range) then
- begin
- GoSelectItem:=Focused;
- NewItem := Focused;
- end
- else
- case CtrlToArrow(Event.KeyCode) of
- kbUp : NewItem := Focused - 1;
- kbDown : NewItem := Focused + 1;
- kbRight: if NumCols > 1 then NewItem := Focused + Size.Y else Exit;
- kbLeft : if NumCols > 1 then NewItem := Focused - Size.Y else Exit;
- kbPgDn : NewItem := Focused + Size.Y * NumCols;
- kbPgUp : NewItem := Focused - Size.Y * NumCols;
- kbHome : NewItem := TopItem;
- kbEnd : NewItem := TopItem + (Size.Y * NumCols) - 1;
- kbCtrlPgDn: NewItem := Range - 1;
- kbCtrlPgUp: NewItem := 0;
- else
- Exit;
- end;
- FocusItemNum(NewItem);
- DrawView;
- ClearEvent(Event);
- end;
- evBroadcast :
- case Event.Command of
- cmReceivedFocus :
- if (Event.InfoPtr<>@Self) and (InClose=false) then
- begin
- GoSelectItem:=-2;
- end;
- else
- if Options and ofSelectable <> 0 then
- if (Event.Command = cmScrollBarClicked) and
- ((Event.InfoPtr = HScrollBar) or (Event.InfoPtr = VScrollBar)) then
- Select
- else
- if (Event.Command = cmScrollBarChanged) then
- begin
- if (VScrollBar = Event.InfoPtr) then
- begin
- FocusItemNum(VScrollBar^.Value);
- DrawView;
- end
- else
- if (HScrollBar = Event.InfoPtr) then
- DrawView;
- end;
- end;
- evIdle :
- begin
- MouseWhere.X:=MouseWhereX shr 3; MouseWhere.Y:=MouseWhereY shr 3;
- if MouseInView(MouseWhere)=false then
- if abs(GetDosTicks-LastTT)>=1 then
- begin
- LastTT:=GetDosTicks;
- MakeLocal(MouseWhere,Mouse);
- if ((Mouse.Y<-1) or (Mouse.Y>=Size.Y)) and
- ((0<=Mouse.X) and (Mouse.X<Size.X)) then
- if Range>0 then
- if Mouse.Y<0 then
- FocusItemNum(Focused-(0-Mouse.Y))
- else
- FocusItemNum(Focused+(Mouse.Y-(Size.Y-1)));
- end;
- end;
- end;
- if (Range>0) and (GoSelectItem<>-1) then
- begin
- InClose:=true;
- if GoSelectItem=-2 then
- Link^.DropList(false)
- else
- SelectItem(GoSelectItem);
- end;
- end;
- procedure TDDHelperLB.SelectItem(Item: Sw_Integer);
- begin
- inherited SelectItem(Item);
- Link^.FocusItem(Focused);
- Link^.DropList(false);
- end;
- constructor TDropDownListBox.Init(var Bounds: TRect; ADropLineCount: Sw_integer; AList: PCollection);
- begin
- inherited Init(Bounds);
- Options:=Options or (ofSelectable);
- EventMask:=EventMask or (evBroadcast);
- DropLineCount:=ADropLineCount;
- NewList(AList);
- end;
- procedure TDropDownListBox.HandleEvent(var Event: TEvent);
- var DontClear: boolean;
- Count: sw_integer;
- begin
- case Event.What of
- evKeyDown :
- if GetState(sfFocused) then
- begin
- DontClear:=false;
- Count:=GetItemCount;
- if Count>0 then
- case Event.KeyCode of
- kbUp :
- if Focused>0 then
- FocusItem(Focused-1);
- kbDown :
- if Focused<Count-1 then
- FocusItem(Focused+1);
- kbHome :
- FocusItem(0);
- kbEnd :
- FocusItem(Count-1);
- kbEnter,
- kbPgDn :
- DropList(true);
- else DontClear:=true;
- end;
- if DontClear=false then ClearEvent(Event);
- end;
- evBroadcast :
- case Event.Command of
- cmReleasedFocus :
- if (ListBox<>nil) and (Event.InfoPtr=ListBox) then
- DropList(false);
- cmListItemSelected :
- if (ListBox<>nil) and (Event.InfoPtr=ListBox) then
- begin
- FocusItem(ListBox^.Focused);
- Text:=GetText(List^.At(Focused),High(Text));
- DrawView;
- DropList(false);
- end;
- end;
- evMouseDown :
- if MouseInView(Event.Where) then
- begin
- DropList(not ListDropped);
- ClearEvent(Event);
- end;
- end;
- inherited HandleEvent(Event);
- end;
- function TDropDownListBox.GetText(Item: pointer; MaxLen: Sw_integer): string;
- var S: string;
- begin
- S:=GetStr(Item);
- GetText:=copy(S,1,MaxLen);
- end;
- procedure TDropDownListBox.NewList(AList: PCollection);
- begin
- if List<>nil then Dispose(List, Done); List:=nil;
- List:=AList; FocusItem(0);
- end;
- procedure TDropDownListBox.CreateListBox(var R: TRect);
- var R2: TRect;
- begin
- R2.Copy(R); R2.A.X:=R2.B.X-1;
- New(SB, Init(R2));
- Dec(R.B.X);
- New(ListBox, Init(@Self,R,1,SB));
- end;
- procedure TDropDownListBox.DropList(Drop: boolean);
- var R: TRect;
- LB: PListBox;
- begin
- if (ListDropped=Drop) then Exit;
- if Drop then
- begin
- R.Assign(Origin.X+1,Origin.Y+Size.Y,Origin.X+Size.X,Origin.Y+Size.Y+DropLineCount);
- if Owner<>nil then Owner^.Lock;
- CreateListBox(R);
- if SB<>nil then
- Owner^.Insert(SB);
- if ListBox<>nil then
- begin
- ListBox^.NewList(List);
- ListBox^.FocusItem(Focused);
- Owner^.Insert(ListBox);
- end;
- if Owner<>nil then Owner^.UnLock;
- end
- else
- begin
- if Owner<>nil then Owner^.Lock;
- if ListBox<>nil then
- begin
- { ListBox^.List:=nil;}
- LB:=ListBox; ListBox:=nil; { this prevents GPFs while deleting }
- Dispose(LB, Done);
- end;
- if SB<>nil then
- begin
- Dispose(SB, Done);
- SB:=nil;
- end;
- Select;
- if Owner<>nil then Owner^.UnLock;
- end;
- ListDropped:=Drop;
- DrawView;
- end;
- function TDropDownListBox.GetItemCount: sw_integer;
- var Count: sw_integer;
- begin
- if assigned(List)=false then Count:=0 else
- Count:=List^.Count;
- GetItemCount:=Count;
- end;
- procedure TDropDownListBox.FocusItem(Item: sw_integer);
- var P: pointer;
- begin
- Focused:=Item;
- if assigned(ListBox) and (Item>=0) then
- ListBox^.FocusItem(Item);
- if (GetItemCount>0) and (Focused>=0) then
- begin
- P:=List^.At(Focused);
- Text:=GetText(P,Size.X-4);
- end;
- DrawView;
- end;
- function TDropDownListBox.LBGetLocalMenu: PMenu;
- begin
- LBGetLocalMenu:=nil;
- end;
- function TDropDownListBox.LBGetCommandTarget: PView;
- begin
- LBGetCommandTarget:=@Self;
- end;
- procedure TDropDownListBox.SetState(AState: Word; Enable: Boolean);
- begin
- inherited SetState(AState,Enable);
- if (AState and (sfSelected + sfActive + sfFocused)) <> 0 then DrawView;
- end;
- procedure TDropDownListBox.Draw;
- var B: TDrawBuffer;
- C,TextC: word;
- LC: char;
- begin
- if GetState(sfFocused)=false then
- begin
- C:=GetColor(2);
- TextC:=GetColor(2);
- end
- else
- begin
- C:=GetColor(3);
- TextC:=GetColor(3);
- end;
- MoveChar(B,' ',C,Size.X);
- MoveStr(B[1],copy(Text,1,Size.X-2),TextC);
- if ListDropped then LC:='^' else LC:='v';
- MoveChar(B[Size.X-2],LC,C,1);
- WriteLine(0,0,Size.X,Size.Y,B);
- end;
- function TDropDownListBox.GetPalette: PPalette;
- const P: string[length(CListViewer)] = CListViewer;
- begin
- GetPalette:=@P;
- end;
- destructor TDropDownListBox.Done;
- begin
- if ListDropped then DropList(false);
- inherited Done;
- end;
- constructor TGroupView.Init(var Bounds: TRect; AText: String; ALink: PView);
- begin
- inherited Init(Bounds,AText,ALink);
- end;
- procedure TGroupView.Draw;
- var B: TDrawBuffer;
- FrameC,LabelC: word;
- begin
- FrameC:=GetColor(1);
- if Light then
- LabelC:=GetColor(2)+GetColor(4) shl 8
- else
- LabelC:=GetColor(1)+GetColor(3) shl 8;
- { First Line }
- MoveChar(B[0],'Ú',FrameC,1);
- MoveChar(B[1],'Ä',FrameC,Size.X-2);
- MoveChar(B[Size.X-1],'¿',FrameC,1);
- if Text<>nil then
- begin
- MoveCStr(B[1],' '+Text^+' ',LabelC);
- end;
- WriteLine(0,0,Size.X,1,B);
- { Mid Lines }
- MoveChar(B[0],'³',FrameC,1);
- MoveChar(B[1],' ',FrameC,Size.X-2);
- MoveChar(B[Size.X-1],'³',FrameC,1);
- WriteLine(0,1,Size.X,Size.Y-2,B);
- { Last Line }
- MoveChar(B[0],'À',FrameC,1);
- MoveChar(B[1],'Ä',FrameC,Size.X-2);
- MoveChar(B[Size.X-1],'Ù',FrameC,1);
- WriteLine(0,Size.Y-1,Size.X,1,B);
- end;
- function TPlainCheckBoxes.GetPalette: PPalette;
- const P: string[length(CPlainCluster)] = CPlainCluster;
- begin
- GetPalette:=@P;
- end;
- function TPlainRadioButtons.GetPalette: PPalette;
- const P: string[length(CPlainCluster)] = CPlainCluster;
- begin
- GetPalette:=@P;
- end;
- constructor TAdvancedListBox.Load(var S: TStream);
- begin
- inherited Load(S);
- S.Read(Default,SizeOf(Default));
- end;
- procedure TAdvancedListBox.Store(var S: TStream);
- begin
- inherited Store(S);
- S.Write(Default,SizeOf(Default));
- end;
- procedure TNoUpdateButton.HandleEvent(var Event: TEvent);
- begin
- if (Event.What<>evBroadcast) or (Event.Command<>cmCommandSetChanged) then
- inherited HandleEvent(Event);
- end;
- constructor TPanel.Init(var Bounds: TRect);
- begin
- inherited Init(Bounds);
- Options:=Options or (ofSelectable+ofTopSelect);
- GrowMode:=gfGrowHiX+gfGrowHiY;
- end;
- procedure TAdvMessageBox.HandleEvent(var Event: TEvent);
- var I: integer;
- begin
- if (not CanCancel) and (Event.What=evCommand) and (Event.Command=cmCancel) then
- ClearEvent(Event);
- inherited HandleEvent(Event);
- case Event.What of
- evCommand:
- begin
- for I:=Low(UserButtonCmd) to High(UserButtonCmd) do
- if Event.Command=UserButtonCmd[I] then
- if State and sfModal <> 0 then
- begin
- EndModal(Event.Command);
- ClearEvent(Event);
- end;
- end;
- end;
- end;
- procedure ClearFormatParams;
- begin
- FormatParamCount:=0; FillChar(FormatParams,sizeof(FormatParams),0);
- FormatParamStrCount:=0;
- end;
- procedure AddFormatParam(P: pointer);
- begin
- Inc(FormatParamCount);
- FormatParams[FormatParamCount]:=ptrint(P);
- end;
- procedure AddFormatParamInt(L: longint);
- begin
- Inc(FormatParamCount);
- FormatParams[FormatParamCount]:=L;
- end;
- procedure AddFormatParamChar(C: char);
- begin
- AddFormatParamInt(ord(C));
- end;
- procedure AddFormatParamStr(const S: string);
- begin
- Inc(FormatParamStrCount);
- FormatParamStrs[FormatParamStrCount]:=S;
- AddFormatParam(@FormatParamStrs[FormatParamStrCount]);
- end;
- function FormatStrF(const Format: string; var Params): string;
- var S: string;
- begin
- S:='';
- FormatStr(S,Format,Params);
- FormatStrF:=S;
- end;
- function FormatStrStr(const Format, Param: string): string;
- var S: string;
- P: pointer;
- begin
- P:=@Param;
- FormatStr(S,Format,P);
- FormatStrStr:=S;
- end;
- function FormatStrStr2(const Format, Param1,Param2: string): string;
- var S: string;
- P: array[1..2] of pointer;
- begin
- P[1]:=@Param1; P[2]:=@Param2;
- FormatStr(S,Format,P);
- FormatStrStr2:=S;
- end;
- function FormatStrStr3(const Format, Param1,Param2,Param3: string): string;
- var S: string;
- P: array[1..3] of pointer;
- begin
- P[1]:=@Param1;
- P[2]:=@Param2;
- P[3]:=@Param3;
- FormatStr(S,Format,P);
- FormatStrStr3:=S;
- end;
- function FormatStrInt(const Format: string; L: PtrInt): string;
- var S: string;
- begin
- FormatStr(S,Format,L);
- FormatStrInt:=S;
- end;
- const
- Cmds: array[0..3] of word =
- (cmYes, cmNo, cmOK, cmCancel);
- var
- ButtonName: array[0..3] of string;
- Titles: array[0..3] of string;
- function AdvMessageBox(const Msg: String; Params: Pointer; AOptions: longint): Word;
- var
- R: TRect;
- begin
- R.Assign(0, 0, 0, 0);
- AdvMessageBox := AdvMessageBoxRect(R, Msg, Params, AOptions);
- end;
- procedure GetStaticTextDimensions(const S: string; ViewWidth: integer; var MaxCols, Rows: integer);
- var
- Center: Boolean;
- I, J, L, P, Y: Sw_Integer;
- CurLine: string;
- begin
- MaxCols:=0;
- L := Length(S);
- P := 1;
- Y := 0;
- Center := False;
- while (Y < 32767) and (P<=length(S)) do
- begin
- CurLine:='';
- if P <= L then
- begin
- if S[P] = #3 then
- begin
- Center := True;
- Inc(P);
- end;
- I := P;
- repeat
- J := P;
- while (P <= L) and (S[P] = ' ') do Inc(P);
- while (P <= L) and (S[P] <> ' ') and (S[P] <> #13) do Inc(P);
- until (P > L) or (P >= I + ViewWidth) or (S[P] = #13);
- if P > I + ViewWidth then
- if J > I then P := J else P := I + ViewWidth;
- if Center then J := (ViewWidth - P + I) div 2 else J := 0;
- CurLine:=CurLine+copy(S,I,P-I);
- { MoveBuf(B[J], S[I], Color, P - I);}
- while (P <= L) and (S[P] = ' ') do Inc(P);
- if (P <= L) and (S[P] = #13) then
- begin
- Center := False;
- Inc(P);
- if (P <= L) and (S[P] = #10) then Inc(P);
- end;
- end;
- if length(CurLine)>MaxCols then
- MaxCols:=length(CurLine);
- { WriteLine(0, Y, Size.X, 1, B);}
- Inc(Y);
- end;
- Rows:=Y;
- end;
- function AdvMessageBoxRect(var R: TRect; const Msg: String; Params: Pointer; AOptions: longint): Word;
- var
- I, X, ButtonCount: Sw_Integer;
- Dialog: PAdvMessageBox;
- Control: PView;
- ButtonList: array[0..4] of PView;
- S,BtnName: String;
- Cols,Rows: integer;
- begin
- FormatStr(S, Msg, Params^);
- if R.Empty then
- begin
- GetStaticTextDimensions(S,40,Cols,Rows);
- if Cols<32 then Cols:=32; if Rows=0 then Rows:=1;
- R.Assign(0,0,3+Cols+3,Rows+6);
- if (AOptions and mfInsertInApp)= 0 then
- R.Move((Desktop^.Size.X-(R.B.X-R.A.X)) div 2,(Desktop^.Size.Y-(R.B.Y-R.A.Y)) div 2)
- else
- R.Move((Application^.Size.X-(R.B.X-R.A.X)) div 2,(Application^.Size.Y-(R.B.Y-R.A.Y)) div 2);
- end;
- New(Dialog,Init(R, Titles[AOptions and $3]));
- with Dialog^ do
- begin
- CanCancel:=(Options and mfCantCancel)=0;
- R.Assign(3,2, Size.X-2,Size.Y-3);
- Control := New(PStaticText, Init(R, S));
- Insert(Control);
- X := -2;
- ButtonCount := 0;
- for I := 0 to 3 do
- if AOptions and ($10000 shl I) <> 0 then
- begin
- BtnName:=UserButtonName[I+1];
- R.Assign(0, 0, Max(10,length(BtnName)+2), 2);
- Control := New(PButton, Init(R, BtnName, UserButtonCmd[I+1], bfNormal));
- Inc(X, Control^.Size.X + 2);
- ButtonList[ButtonCount] := Control;
- Inc(ButtonCount);
- end;
- for I := 0 to 3 do
- if AOptions and ($0100 shl I) <> 0 then
- begin
- R.Assign(0, 0, 10, 2);
- Control := New(PButton, Init(R, ButtonName[I], Cmds[i], bfNormal));
- Inc(X, Control^.Size.X + 2);
- ButtonList[ButtonCount] := Control;
- Inc(ButtonCount);
- end;
- X := (Size.X - X) div 2;
- for I := 0 to ButtonCount - 1 do
- begin
- Control := ButtonList[I];
- Insert(Control);
- Control^.MoveTo(X, Size.Y - 3);
- Inc(X, Control^.Size.X + 2);
- end;
- SelectNext(False);
- end;
- if AOptions and mfInsertInApp = 0 then
- AdvMessageBoxRect := DeskTop^.ExecView(Dialog)
- else
- AdvMessageBoxRect := Application^.ExecView(Dialog);
- Dispose(Dialog, Done);
- end;
- procedure InitAdvMsgBox;
- begin
- ButtonName[0] := slYes;
- ButtonName[1] := slNo;
- ButtonName[2] := slOk;
- ButtonName[3] := slCancel;
- Titles[0] := sWarning;
- Titles[1] := sError;
- Titles[2] := sInformation;
- Titles[3] := sConfirm;
- end;
- procedure DoneAdvMsgBox;
- begin
- end;
- procedure RegisterWViews;
- begin
- {$ifndef NOOBJREG}
- RegisterType(RAdvancedListBox);
- RegisterType(RColorStaticText);
- RegisterType(RHSListBox);
- RegisterType(RDlgWindow);
- {$endif}
- end;
- END.
|