home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ISO Collection
/
AmigaUtilCD2.iso
/
Misc
/
cx22.lha
/
CX2.2
/
Quelltext
/
CXWindow.mod
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS/Acorn
UTF-8
Wrap
Modula Implementation
|
1995-05-29
|
38.4 KB
|
1,132 lines
IMPLEMENTATION MODULE CXWindow;
(* CXWindow.mod - Modul für Layout-Tütelkram
* Version : $VER: CXWindow.mod 2.1 (© 1995 Fin Schuppenhauer)
* Autor : Fin Schuppenhauer
* Braußpark 10
* 20537 Hamburg
* (Germany)
* E-Mail : 1schuppe@informatik.uni-hamburg.de
* Erstellt am : 24 Jan 1995
* Letzte Änd. : 29 Mai 1995
*)
(*$ DEFINE DEBUG:=FALSE *)
IMPORT
id:IntuitionD, il:IntuitionL, im:IntuiMacros,
gtd:GadToolsD, gtl:GadToolsL,
gd:GraphicsD, gl:GraphicsL,
ed:ExecD, el:ExecL, es:ExecSupport,
ld:LocaleD, ll:LocaleL,
iv:InputEvent,
String,
ASCII,
cd:CommoditiesD, cs:CommoditiesSupport, cp:CommoditiesPrivate,
cxl:CXLokal,
cxc:CXCommodity,
cxf:CXFileIO;
FROM UtilityD IMPORT
tagEnd;
FROM SYSTEM IMPORT
ADR, ADDRESS, TAG, CAST, LONGSET;
CONST
(* Gadget-IDs *)
LISTVIEW = 0;
SHOWWINDOW = 1;
HIDEWINDOW = 2;
INACTIVE = 3;
REMOVE = 4;
DE_ACTIVEALL = 5;
REMOVEALL =6;
BROKERTITLE = 7;
BROKERDESCRIPTION = 8;
(* Menu-IDs *)
PROJECT = 0;
ABOUT = 0;
HIDE = 2;
QUIT = 3;
CONTROL = 1;
DISABLEALL = 0;
ENABLEALL = 1;
KILLALL = 3;
OPTIONS = 2;
MAUTOSIZE = 0;
MSIZEABLE = 1;
MREQUESTER = 2;
MREMOVEONLY = 3;
SAVEOPTIONS = 5;
LOADOPTIONS = 6;
MENUCOUNT = 18;
CONST
(* KEY_xxx *)
KEY_UP = 1; (* vorigen Eintrag im Listview *)
KEY_DOWN = 0; (* nächsten Eintrag im Listview *)
KEY_show = 2; (* Interface entfernen *)
KEY_SHOW = 3;
KEY_hide = 4; (* Interface öffnen *)
KEY_HIDE = 5; (* dto., aber als SHIFT-Code *)
KEY_disenable = 6; (* Broker de-/aktivieren *)
KEY_DISENABLE = 7;
KEY_remove = 8; (* Broker entfernen *)
KEY_REMOVE = 9;
KEY_disenableall = 10;
KEY_DISENABLEALL = 11;
KEYCOUNT = 12;
CONST
DEF_REMOVELISTNAME = "S:CX.remlist";
TYPE
BevelInfo = RECORD
left, top: INTEGER; (* Position der Bevelbox *)
width, height: INTEGER; (* Größe der Bevelbox *)
END;
CycleList = ARRAY [0..2] OF ADDRESS;
FontInfo = RECORD
userfont: gd.TextAttrPtr;
ysize,
xsize: INTEGER;
END;
LVItem = ARRAY [0..39] OF CHAR;
StrPtr = POINTER TO ARRAY [0..1023] OF CHAR;
Time = RECORD
secs, micros: LONGCARD;
END;
WindowInfo = RECORD
xoffset: INTEGER; (* Abstand vom rechten linken Fensterrand (inkl. Rand) *)
yoffset: INTEGER; (* dto. von oben (inkl. Rand) *)
leftEdge, topEdge: INTEGER; (* Position des Fensters *)
width, height: INTEGER; (* Größe des Fensters *)
maxWidth, maxHeight: INTEGER; (* maximale Größe des Fensters *)
minWidth, minHeight: INTEGER; (* minimale Größe *)
rBorder, bBorder: INTEGER; (* rechter und unterer Rand *)
lBorder, tBorder: INTEGER; (* linker und oberer Rand *)
END;
VAR
(* main window *)
window: id.WindowPtr;
WINDOW: WindowInfo;
BEVELBOX: BevelInfo;
PUBSCREEN: id.ScreenPtr;
pubscreenstr: StrPtr;
visualinfo: ADDRESS;
glist: id.GadgetPtr;
lvglist: id.GadgetPtr;
keyshortcut: StrPtr;
disenableAllState: BOOLEAN;
removeListName: ARRAY [0..127] OF CHAR;
lvItems: POINTER TO ARRAY [1..64] OF LVItem;
lvList: ed.ListPtr;
(* fontsensitive *)
FONT: FontInfo;
usertextfont: gd.TextFontPtr;
(* broker *)
brokercount: INTEGER;
lvitem: INTEGER; (* aktueller angezeigter Broker i.d. Liste *)
(* gadgets *)
gadgets: ARRAY [0..8] OF id.GadgetPtr;
inActiveCycleList: CycleList;
deActiveAllCycleList: CycleList;
(* Menü *)
menu: POINTER TO ARRAY [0..MENUCOUNT] OF gtd.NewMenu;
menustrip: id.MenuPtr;
(* Katalog: *)
PROCEDURE UpdateBroker (num: INTEGER); FORWARD;
PROCEDURE RescaleListview; FORWARD;
PROCEDURE CreateLVList; FORWARD;
PROCEDURE GetKeyShortcuts;
BEGIN
keyshortcut := ll.GetCatalogStr(catalog, cxl.KEYSHORTCUTS, ADR(cxl.KEYSHORTCUTSSTR));
END GetKeyShortcuts;
(* --------------------------------------------------------------- *)
PROCEDURE Init;
BEGIN
pubscreenstr := cs.ArgString(ADR("PUBSCREEN"), ADR("Workbench"));
WITH options DO
REQUESTER := String.Compare(CAST(StrPtr, cs.ArgString(ADR("REQUESTER"),ADR("YES")))^,"YES") = 0;
AUTOSIZE := String.Compare(CAST(StrPtr, cs.ArgString(ADR("AUTOSIZE"), ADR("NO")))^,"YES") = 0;
REMOVEONLY := String.Compare(CAST(StrPtr, cs.ArgString(ADR("REMOVEONLY"), ADR("YES")))^,"YES") = 0;
SIZEABLE := String.Compare(CAST(StrPtr, cs.ArgString(ADR("SIZEABLE"), ADR("YES")))^,"YES") = 0;
END;
removeListName := DEF_REMOVELISTNAME;
String.Copy (removeListName, CAST(StrPtr, cs.ArgString(ADR("REMOVELIST"), ADR(DEF_REMOVELISTNAME)))^);
cxf.LoadRemoveList (ADR(removeListName));
END Init;
PROCEDURE Initialisieren;
BEGIN
PUBSCREEN := il.LockPubScreen(pubscreenstr);
IF PUBSCREEN = NIL THEN
PUBSCREEN := il.LockPubScreen(NIL);
END;
IF PUBSCREEN # NIL THEN
visualinfo := gtl.GetVisualInfoA(PUBSCREEN, NIL);
WITH FONT DO
userfont := PUBSCREEN^.font;
ysize := PUBSCREEN^.rastPort.txHeight;
xsize := PUBSCREEN^.rastPort.txWidth;
END;
usertextfont := gl.OpenFont(FONT.userfont);
WITH WINDOW DO
yoffset := 0; (*PUBSCREEN^.wBorTop + FONT.ysize + 1;*)
xoffset := 0; (*PUBSCREEN^.wBorLeft;*)
tBorder := PUBSCREEN^.wBorTop + FONT.ysize + 1;
lBorder := PUBSCREEN^.wBorLeft;
IF gd.hires IN PUBSCREEN^.viewPort.modes THEN
rBorder := 18;
ELSE
rBorder := 13;
END;
bBorder := PUBSCREEN^.wBorBottom;
maxWidth := lBorder+rBorder + (* Fensterrahmen *)
3*(20*FONT.xsize+16) + (* drei Gadgets *)
8; (* Abstände dazwischen *)
maxHeight := tBorder+bBorder + (* Fensterrahmen *)
2*FONT.ysize + (* Abstand zur BBox *)
2*FONT.ysize + 6 + (* Höhe der Bevelbox *)
3*(FONT.ysize + 4) + (* Schalterhöhen *)
8; (* Abstände *)
minWidth := lBorder+rBorder +
20*FONT.ysize+16 +
4;
minHeight := tBorder+bBorder +
2*FONT.ysize +
4*FONT.ysize +
2;
leftEdge := cs.ArgInt(ADR("WINLEFT"),50);
topEdge := cs.ArgInt(ADR("WINTOP"),50);
width := cs.ArgInt(ADR("WINWIDTH"),maxWidth);
IF width < minWidth THEN
width := minWidth;
ELSIF width > maxWidth THEN
width := maxWidth;
END;
height := cs.ArgInt(ADR("WINHEIGHT"),maxHeight);
IF height < minHeight THEN
height := minHeight;
ELSIF height > maxHeight THEN
height := maxHeight;
END;
END;
WITH BEVELBOX DO
left := WINDOW.xoffset + 20*FONT.xsize+16 + 4;
top := WINDOW.yoffset + 2*FONT.ysize;
height := 2*FONT.ysize + 6;
width := 2*(20*FONT.xsize+16);
END;
IF NOT(options.SIZEABLE) THEN
DEC (WINDOW.width, WINDOW.rBorder-2);
END;
END;
END Initialisieren;
PROCEDURE DeInitialisieren;
BEGIN
IF visualinfo # NIL THEN
gtl.FreeVisualInfo (visualinfo);
visualinfo := NIL;
END;
IF usertextfont # NIL THEN
gl.CloseFont(usertextfont);
usertextfont := NIL;
END;
END DeInitialisieren;
(* --------------------------------------------------------------- *)
PROCEDURE DefiniereGadgets;
VAR
ng: gtd.NewGadget;
g: id.GadgetPtr;
tl: ARRAY [0..15] OF LONGINT;
a,b,c: INTEGER;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.DefiniereGadgets()\n");
(*$ ENDIF *)
IF visualinfo # NIL THEN
lvglist := NIL;
g := gtl.CreateContext(lvglist);
(** "Listview-Gadget" *)
IF options.AUTOSIZE THEN
a := brokercount*FONT.ysize + 4; (* 4 = Rahmen des LV *)
b := 3*(FONT.ysize+4+2);
c := a-b;
IF c < BEVELBOX.height+2 THEN
(* Nicht genügend Platz für die BevelBox *)
a := a + BEVELBOX.height-c + 2;
END;
WITH WINDOW DO
maxHeight := tBorder + bBorder + yoffset + 2*FONT.ysize + a;
height := maxHeight;
END;
ELSE
a := WINDOW.height - WINDOW.tBorder - WINDOW.bBorder - 2 -
2*FONT.ysize;
END;
CreateLVList;
WITH ng DO
leftEdge := WINDOW.xoffset + 2;
topEdge := WINDOW.yoffset + 2*FONT.ysize;
width := 20*FONT.xsize + 16;
height := a;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_LISTVIEW, ADR(cxl.GAD_LISTVIEWSTR));
textAttr := FONT.userfont;
gadgetID := LISTVIEW;
flags := gtd.NewGadgetFlagSet{gtd.placetextAbove};
visualInfo := visualinfo;
userData := NIL;
END;
g := gtl.CreateGadgetA(gtd.listviewKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gtlvLabels, lvList, (*cxc.brokerlist,*)
gtd.gtlvShowSelected, NIL,
gtd.gtlvSelected, lvitem,
gtd.gtlvMakeVisible, lvitem,
tagEnd));
gadgets[LISTVIEW] := g;
(**)
glist := NIL;
g := gtl.CreateContext (glist);
(** "Show-Window-Gadget" *)
WITH ng DO
topEdge := BEVELBOX.top + BEVELBOX.height + 2;
leftEdge := BEVELBOX.left;
height := FONT.ysize + 4;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_SHOWWINDOW, ADR(cxl.GAD_SHOWWINDOWSTR));
gadgetID := SHOWWINDOW;
flags := gtd.NewGadgetFlagSet{gtd.placetextIn,gtd.ngHighlabel};
END;
g := gtl.CreateGadgetA(gtd.buttonKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
tagEnd));
gadgets[SHOWWINDOW] := g;
(**)
(** "De-/Aktiv Cycle-Gadget" *)
inActiveCycleList[0] := ll.GetCatalogStr(catalog, cxl.GAD_ACTIVE, ADR(cxl.GAD_ACTIVESTR));
inActiveCycleList[1] := ll.GetCatalogStr(catalog, cxl.GAD_INACTIVE, ADR(cxl.GAD_INACTIVESTR));
inActiveCycleList[2] := NIL;
WITH ng DO
topEdge := topEdge + height + 2;
gadgetText := NIL;
gadgetID := INACTIVE;
END;
g := gtl.CreateGadgetA(gtd.cycleKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gtcyLabels, ADR(inActiveCycleList[0]),
gtd.gtcyActive, 0,
tagEnd));
gadgets[INACTIVE] := g;
(**)
(** "De-/Aktivate all Cycle-Gadget" *)
disenableAllState := TRUE; (* Alle deaktivieren *)
deActiveAllCycleList[1] := ll.GetCatalogStr(catalog, cxl.GAD_ACTIVATEALL, ADR(cxl.GAD_ACTIVATEALLSTR));
deActiveAllCycleList[0] := ll.GetCatalogStr(catalog, cxl.GAD_DEACTIVATEALL, ADR(cxl.GAD_DEACTIVATEALLSTR));
deActiveAllCycleList[2] := NIL;
WITH ng DO
topEdge := topEdge + height + 2;
gadgetID := DE_ACTIVEALL;
END;
g := gtl.CreateGadgetA(gtd.cycleKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gtcyLabels, ADR(deActiveAllCycleList[0]),
gtd.gtcyActive, 0,
tagEnd));
gadgets[DE_ACTIVEALL] := g;
(**)
(** "Remove-All-Gadget" *)
WITH ng DO
leftEdge := leftEdge + width + 2;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_REMOVEALL, ADR(cxl.GAD_REMOVEALLSTR));
flags := gtd.NewGadgetFlagSet{gtd.placetextIn};
gadgetID := REMOVEALL;
END;
g := gtl.CreateGadgetA(gtd.buttonKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
tagEnd));
gadgets[REMOVEALL] := g;
(**)
(** "Entfernen-Gadget" *)
WITH ng DO
topEdge := topEdge - height - 2;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_REMOVE, ADR(cxl.GAD_REMOVESTR));
gadgetID := REMOVE;
END;
g := gtl.CreateGadgetA(gtd.buttonKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
tagEnd));
gadgets[REMOVE] := g;
(**)
(** "Hide-Window-Gadget" *)
WITH ng DO
topEdge := topEdge - height - 2;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_HIDEWINDOW, ADR(cxl.GAD_HIDEWINDOWSTR));
gadgetID := HIDEWINDOW;
END;
g := gtl.CreateGadgetA(gtd.buttonKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
tagEnd));
gadgets[HIDEWINDOW] := g;
(**)
(** "Text-Gadget für Broker-Titel u. -Beschreibung" *)
WITH ng DO
topEdge := BEVELBOX.top;
leftEdge := BEVELBOX.left+3;
gadgetID := BROKERTITLE;
gadgetText := NIL;
END;
g := gtl.CreateGadgetA(gtd.textKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gttxText, ADR('"Then came the sad day. Her test was'),
tagEnd));
gadgets[BROKERTITLE] := g;
WITH ng DO
topEdge := BEVELBOX.top + FONT.ysize + 2;
gadgetText := NIL;
gadgetID := BROKERDESCRIPTION;
END;
g := gtl.CreateGadgetA(gtd.textKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gttxText, ADR('positive." Fight AIDS - save love!'),
tagEnd));
gadgets[BROKERDESCRIPTION] := g;
(**)
END;
END DefiniereGadgets;
PROCEDURE DefiniereMenues;
(* Generiert die Menüs: *)
PROCEDURE SetMenuItem (VAR nm: gtd.NewMenu; text: StrPtr);
BEGIN
WITH nm DO
type := gtd.nmItem;
IF (text^[1] = "o") OR (text^[1] = 0C) THEN
commKey := text;
INC(text,2);
END;
label := text;
END;
END SetMenuItem;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.DefiniereMenues()\n");
(*$ ENDIF *)
menu := el.AllocMem((MENUCOUNT+1)*SIZE(gtd.NewMenu), ed.MemReqSet{ed.memClear});
IF menu # NIL THEN
WITH menu^[0] DO
type := gtd.nmTitle;
label := ll.GetCatalogStr(catalog, cxl.MENU_PROJECT, ADR(cxl.MENU_PROJECTSTR));
END;
SetMenuItem (menu^[1], ll.GetCatalogStr(catalog, cxl.MENU_ABOUT, ADR(cxl.MENU_ABOUTSTR)));
WITH menu^[2] DO
type := gtd.nmItem;
label := gtd.nmBarlabel;
END;
SetMenuItem (menu^[3], ll.GetCatalogStr(catalog, cxl.MENU_HIDE, ADR(cxl.MENU_HIDESTR)));
SetMenuItem (menu^[4], ll.GetCatalogStr(catalog, cxl.MENU_QUIT, ADR(cxl.MENU_QUITSTR)));
WITH menu^[5] DO
type := gtd.nmTitle;
label := ll.GetCatalogStr(catalog, cxl.MENU_CONTROL, ADR(cxl.MENU_CONTROLSTR));
END;
SetMenuItem (menu^[6], ll.GetCatalogStr(catalog, cxl.MENU_DISABLEALL, ADR(cxl.MENU_DISABLEALLSTR)));
SetMenuItem (menu^[7], ll.GetCatalogStr(catalog, cxl.MENU_ENABLEALL, ADR(cxl.MENU_ENABLEALLSTR)));
WITH menu^[8] DO
type := gtd.nmItem;
label := gtd.nmBarlabel;
END;
SetMenuItem (menu^[9], ll.GetCatalogStr(catalog, cxl.MENU_KILLALL, ADR(cxl.MENU_KILLALLSTR)));
WITH menu^[10] DO
type := gtd.nmTitle;
label := ll.GetCatalogStr(catalog, cxl.MENU_OPTIONS, ADR(cxl.MENU_OPTIONSSTR));
END;
SetMenuItem (menu^[11], ll.GetCatalogStr(catalog, cxl.MENU_AUTOSIZE, ADR(cxl.MENU_AUTOSIZESTR)));
menu^[11].itemFlags := id.MenuItemFlagSet{id.checkIt,id.menuToggle};
IF options.AUTOSIZE THEN
INCL (menu^[11].itemFlags, id.checked);
END;
SetMenuItem (menu^[12], ll.GetCatalogStr(catalog, cxl.MENU_SIZEABLE, ADR(cxl.MENU_SIZEABLESTR)));
menu^[12].itemFlags := id.MenuItemFlagSet{id.checkIt,id.menuToggle};
IF options.SIZEABLE THEN
INCL (menu^[12].itemFlags, id.checked);
END;
SetMenuItem (menu^[13], ll.GetCatalogStr(catalog, cxl.MENU_REQUESTER, ADR(cxl.MENU_REQUESTERSTR)));
menu^[13].itemFlags := id.MenuItemFlagSet{id.checkIt,id.menuToggle};
IF options.REQUESTER THEN
INCL (menu^[13].itemFlags, id.checked);
END;
SetMenuItem (menu^[14], ll.GetCatalogStr(catalog, cxl.MENU_REMOVEONLY, ADR(cxl.MENU_REMOVEONLYSTR)));
menu^[14].itemFlags := id.MenuItemFlagSet{id.checkIt,id.menuToggle};
IF options.REMOVEONLY THEN
INCL (menu^[14].itemFlags, id.checked);
END;
WITH menu^[15] DO
type := gtd.nmItem;
label := gtd.nmBarlabel;
END;
SetMenuItem (menu^[16], ll.GetCatalogStr(catalog, cxl.MENU_SAVEOPT, ADR(cxl.MENU_SAVEOPTSTR)));
WITH menu^[17] DO
type := gtd.nmItem;
label := ll.GetCatalogStr(catalog, cxl.MENU_LOADOPT, ADR(cxl.MENU_LOADOPTSTR));
END;
WITH menu^[18] DO
type := gtd.nmEnd;
END;
END;
END DefiniereMenues;
PROCEDURE OeffneFenster;
VAR
tl: ARRAY [0..39] OF LONGINT;
a: INTEGER;
bool: BOOLEAN;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.OeffneFenster()\n");
(*$ ENDIF *)
window := il.OpenWindowTagList(NIL, TAG(tl,
id.waLeft, WINDOW.leftEdge,
id.waTop, WINDOW.topEdge,
id.waWidth, WINDOW.width,
id.waHeight, WINDOW.height,
id.waMaxWidth, WINDOW.maxWidth,
id.waMaxHeight, WINDOW.maxHeight,
id.waMinWidth, WINDOW.minWidth,
id.waMinHeight, WINDOW.minHeight,
id.waGimmeZeroZero, TRUE,
id.waIDCMP, id.IDCMPFlagSet{id.closeWindow, id.menuPick,
id.refreshWindow, id.rawKey, id.vanillaKey,
id.newSize} +
gtd.listviewIDCMP +
gtd.buttonIDCMP +
gtd.textIDCMP,
id.waGadgets, glist,
id.waTitle, ADR(wintitle),
id.waPubScreen, PUBSCREEN,
id.waSizeGadget,options.SIZEABLE,
id.waDragBar, TRUE,
id.waDepthGadget,TRUE,
id.waCloseGadget,TRUE,
id.waActivate, TRUE,
id.waNewLookMenus,TRUE,
tagEnd));
IF window # NIL THEN
(* Fenster ist offen, der PubScreen kann wieder freigegeben
* werden.
*)
il.UnlockPubScreen(NIL, PUBSCREEN);
PUBSCREEN := NIL;
(* Menüs erzeugen, layouten und ans Fenster hängen: *)
menustrip := gtl.CreateMenusA(CAST(gtd.NewMenuPtr,menu), TAG(tl,
gtd.gtmnFrontPen, 1,
tagEnd));
IF menustrip # NIL THEN
IF gtl.LayoutMenusA(menustrip, visualinfo, NIL) THEN
bool := il.SetMenuStrip(window, menustrip);
END;
END;
(* Das ListView-Gadget darstellen: *)
a := il.AddGList(window, lvglist, -1, -1, NIL);
il.RefreshGList (lvglist, window, NIL, -1);
gtl.GTRefreshWindow(window, NIL);
windowsignal := window^.userPort^.sigBit;
(*$ IF DEBUG *)
io.WriteString ("- windowsignal = ");
io.WriteCard (windowsignal,0); io.WriteLn;
(*$ ENDIF *)
(* Rahmen um die Commodity-Informationen zeichnen: *)
gtl.DrawBevelBoxA (window^.rPort, BEVELBOX.left, BEVELBOX.top,
BEVELBOX.width, BEVELBOX.height, TAG(tl,
gtd.gtVisualInfo, visualinfo,
gtd.gtbbRecessed, TRUE,
tagEnd));
a := String.Length(CAST(StrPtr, ll.GetCatalogStr(catalog, cxl.GAD_INFORMATION, ADR(cxl.GAD_INFORMATIONSTR)))^);
gl.Move (window^.rPort, BEVELBOX.left + (BEVELBOX.width-(a*FONT.xsize)) DIV 2,
BEVELBOX.top-(FONT.ysize DIV 2)-2);
gl.SetAPen (window^.rPort, 1);
gl.SetFont (window^.rPort, usertextfont);
gl.Text (window^.rPort, ll.GetCatalogStr(catalog, cxl.GAD_INFORMATION, ADR(cxl.GAD_INFORMATIONSTR)), a);
RefreshListview;
RescaleListview;
UpdateBroker (lvitem);
END;
END OeffneFenster;
PROCEDURE ShowWindow;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.ShowWindow()\n");
(*$ ENDIF *)
IF window # NIL THEN
il.WindowToFront(window);
il.ActivateWindow(window);
ELSE
Initialisieren;
IF PUBSCREEN # NIL THEN
DefiniereGadgets;
DefiniereMenues;
OeffneFenster;
END;
END;
END ShowWindow;
PROCEDURE CloseWindow;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.CloseWindow()\n");
(*$ ENDIF *)
IF window # NIL THEN
(* Position und Ausdehnung des Fensters merken *)
WITH WINDOW DO
WINDOW.leftEdge := window^.leftEdge;
WINDOW.topEdge := window^.topEdge;
WINDOW.width := window^.width;
WINDOW.height := window^.height;
END;
IF menustrip # NIL THEN
il.ClearMenuStrip(window);
gtl.FreeMenus(menustrip);
menustrip := NIL;
END;
IF menu # NIL THEN
el.FreeMem(menu, (MENUCOUNT+1)*SIZE(gtd.NewMenu));
menu := NIL;
END;
il.CloseWindow (window);
window := NIL;
gtl.FreeGadgets(glist);
(*gtl.FreeGadgets(lvglist);*)
END;
END CloseWindow;
(* --------------------------------------------------------------- *)
PROCEDURE UpdateBroker (num: INTEGER);
(* Die Informationen und Gadgets zu dem num-ten Broker in der
* Liste werden aktualisiert.
*)
VAR
brokercopy: cp.BrokerCopyPtr;
interface: BOOLEAN;
active: BOOLEAN;
tl: ARRAY [0..7] OF LONGINT;
adr: ADDRESS;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.UpdateBroker (");
io.WriteInt (num,0); io.WriteString (")\n");
(*$ ENDIF *)
brokercopy := cxc.GetBrokerCopy (num);
interface := NOT(cp.showhide IN brokercopy^.flags);
gtl.GTSetGadgetAttrsA (gadgets[SHOWWINDOW], window, NIL, TAG(tl,
id.gaDisabled, interface,
tagEnd));
gtl.GTSetGadgetAttrsA (gadgets[HIDEWINDOW], window, NIL, TAG(tl,
id.gaDisabled, interface,
tagEnd));
IF cp.active IN brokercopy^.flags THEN
gtl.GTSetGadgetAttrsA (gadgets[INACTIVE], window, NIL, TAG(tl,
gtd.gtcyActive, 0,
tagEnd));
ELSE
gtl.GTSetGadgetAttrsA (gadgets[INACTIVE], window, NIL, TAG(tl,
gtd.gtcyActive, 1,
tagEnd));
END;
adr := ADR(brokercopy^.title);
gtl.GTSetGadgetAttrsA (gadgets[BROKERTITLE], window, NIL, TAG(tl,
gtd.gttxText, adr,
tagEnd));
adr := ADR(brokercopy^.descr);
gtl.GTSetGadgetAttrsA (gadgets[BROKERDESCRIPTION], window, NIL, TAG(tl,
gtd.gttxText, adr,
tagEnd));
END UpdateBroker;
(* --------------------------------------------------------------- *)
PROCEDURE UpdateListview (lvitem: INTEGER);
VAR
tl: ARRAY [0..7] OF LONGINT;
BEGIN
gtl.GTSetGadgetAttrsA (gadgets[LISTVIEW], window, NIL, TAG(tl,
gtd.gtlvSelected, lvitem,
gtd.gtlvMakeVisible, lvitem,
tagEnd));
UpdateBroker (lvitem);
END UpdateListview;
PROCEDURE RescaleListview;
(* Wird aufgerufen, nachdem der User die Fenstergröße verändert
* hat. Das Listview-Gadget wird den neuen Verhältnissen ange-
* paßt.
*)
VAR
ng: gtd.NewGadget;
g: id.GadgetPtr;
tl: ARRAY [0..15] OF LONGINT;
li: LONGINT;
i: INTEGER;
BEGIN
gl.SetAPen (window^.rPort, 0);
gl.RectFill (window^.rPort, WINDOW.xoffset + 2, 0,
WINDOW.xoffset+18+20*FONT.xsize, window^.height);
li := il.RemoveGList(window, lvglist, -1);
gtl.FreeGadgets (lvglist);
lvglist := NIL;
g := gtl.CreateContext(lvglist);
WITH ng DO
leftEdge := WINDOW.xoffset + 2;
topEdge := WINDOW.yoffset + 2*FONT.ysize;
width := 20*FONT.xsize+16;
height := window^.height - window^.borderTop - window^.borderBottom - 2*FONT.ysize;
gadgetText := ll.GetCatalogStr(catalog, cxl.GAD_LISTVIEW, ADR(cxl.GAD_LISTVIEWSTR));
textAttr := FONT.userfont;
gadgetID := LISTVIEW;
flags := gtd.NewGadgetFlagSet{gtd.placetextAbove};
visualInfo := visualinfo;
userData := NIL;
END;
g := gtl.CreateGadgetA(gtd.listviewKind, g^, ng, TAG(tl,
gtd.gtUnderscore, "_",
gtd.gtlvLabels, lvList, (*cxc.brokerlist,*)
gtd.gtlvShowSelected, NIL,
gtd.gtlvSelected, lvitem,
gtd.gtlvMakeVisible, lvitem,
tagEnd));
gadgets[LISTVIEW] := g;
i := il.AddGList (window, lvglist, -1, -1, NIL);
il.RefreshGList (lvglist, window, NIL, -1);
gtl.GTRefreshWindow (window, NIL);
END RescaleListview;
PROCEDURE FreeLVList;
VAR
node, nnode: ed.NodePtr;
BEGIN
IF lvList # NIL THEN
IF lvItems # NIL THEN
node := lvList^.head;
WHILE node^.succ # NIL DO
nnode := node^.succ;
el.FreeMem(node, SIZE(ed.Node)); (*el.Remove (node);*)
node := nnode;
END;
el.FreeMem(lvItems, SIZE(LVItem)*brokercount);
lvItems := NIL;
END;
el.FreeMem(lvList, SIZE(ed.List));
lvList := NIL;
END;
END FreeLVList;
PROCEDURE CreateLVList;
VAR
nnode, bnode: ed.NodePtr;
n: INTEGER;
BEGIN
lvList := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.memClear});
IF lvList # NIL THEN
es.NewList (lvList);
lvItems := el.AllocMem(SIZE(LVItem)*brokercount, ed.MemReqSet{ed.memClear});
IF lvItems # NIL THEN
bnode := cxc.brokerlist^.head;
FOR n := 1 TO brokercount DO
nnode := el.AllocMem(SIZE(ed.Node), ed.MemReqSet{ed.memClear});
IF nnode # NIL THEN
String.Copy (lvItems^[n], CAST(StrPtr, bnode^.name)^);
IF options.REMOVEONLY THEN
IF cxf.IsInRemoveList(bnode^.name) THEN
String.Insert(lvItems^[n], 0, "* ");
ELSE
String.Insert(lvItems^[n], 0, " ");
END;
END;
nnode^.name := ADR(lvItems^[n]);
el.AddTail (lvList, nnode);
END;
bnode := bnode^.succ;
END;
END;
END;
END CreateLVList;
PROCEDURE RefreshListview;
(* Wird von CXCommodity.mod aufgerufen, falls sich etwas an
* der Brokerliste verändert haben sollte.
*)
VAR
tl: ARRAY [0..7] OF LONGINT;
dummylist: LONGINT;
dummylistadr: ADDRESS;
BEGIN
IF window # NIL THEN
(*dummylist := 0FFFFH;
dummylistadr := ADR(dummylist);*)
(*gtl.GTSetGadgetAttrsA (gadgets[LISTVIEW], window, NIL, TAG(tl,
gtd.gtlvLabels, dummylist,
tagEnd));*)
FreeLVList;
cxc.FreeBrokerList();
cxc.InitBrokerList (brokercount);
CreateLVList;
lvitem := lvitem MOD brokercount;
gtl.GTSetGadgetAttrsA (gadgets[LISTVIEW], window, NIL, TAG(tl,
gtd.gtlvLabels, lvList, (*cxc.brokerlist,*)
gtd.gtlvSelected, lvitem,
gtd.gtlvMakeVisible, lvitem,
tagEnd));
(* el.Permit(); *)
UpdateBroker (lvitem);
END;
END RefreshListview;
(* --------------------------------------------------------------- *)
PROCEDURE DisEnableAll (VAR state: BOOLEAN);
BEGIN
IF state THEN
cxc.SendAllBrokerCommand (cd.cxcmdDisable);
ELSE
cxc.SendAllBrokerCommand (cd.cxcmdEnable);
END;
state := NOT(state);
END DisEnableAll;
PROCEDURE KillAll;
(* User möchte, das alle Commodities entfernt werden. Wir fragen
* aber sicherheitshalber nochmal nach:
*)
VAR
easyreq : id.EasyStruct;
idcmp : id.IDCMPFlagSet;
num : LONGINT;
bnode : ed.NodePtr;
BEGIN
num := 1;
IF options.REQUESTER THEN
idcmp := id.IDCMPFlagSet{};
WITH easyreq DO
structSize := SIZE(id.EasyStruct);
flags := LONGSET{};
title := ll.GetCatalogStr(catalog, cxl.REQ_REMOVEALL_TITLE, ADR(cxl.REQ_REMOVEALL_TITLESTR));
textFormat := ll.GetCatalogStr(catalog, cxl.REQ_REMOVEALL_BODY, ADR(cxl.REQ_REMOVEALL_BODYSTR));
gadgetFormat:= ll.GetCatalogStr(catalog, cxl.REQ_REMOVEALL_FORMAT, ADR(cxl.REQ_REMOVEALL_FORMATSTR));
END;
num := il.EasyRequestArgs(window, easyreq, idcmp, NIL);
END;
IF num = 1 THEN
IF options.REMOVEONLY THEN
bnode := cxc.brokerlist^.head;
WHILE bnode^.succ # NIL DO
IF cxf.IsInRemoveList(bnode^.name) THEN
num := cp.BrokerCommand (bnode^.name, cd.cxcmdKill);
END;
bnode := bnode^.succ;
END;
ELSE
cxc.SendAllBrokerCommand (cd.cxcmdKill);
END;
END;
END KillAll;
PROCEDURE About;
VAR
easyreq : id.EasyStruct;
idcmp : id.IDCMPFlagSet;
num: LONGINT;
BEGIN
idcmp := id.IDCMPFlagSet{};
WITH easyreq DO
structSize := SIZE(id.EasyStruct);
flags := LONGSET{};
title := ll.GetCatalogStr(catalog, cxl.REQ_ABOUT_TITLE, ADR(cxl.REQ_ABOUT_TITLESTR));
textFormat := ll.GetCatalogStr(catalog, cxl.REQ_ABOUT_BODY, ADR(cxl.REQ_ABOUT_BODYSTR));
gadgetFormat:= ll.GetCatalogStr(catalog, cxl.REQ_ABOUT_FORMAT, ADR(cxl.REQ_ABOUT_FORMATSTR));
END;
num := il.EasyRequestArgs(window, easyreq, idcmp, NIL);
END About;
(* --------------------------------------------------------------- *)
PROCEDURE LoadOptions;
(* Optionen laden und Menüleiste auffrischen. *)
VAR
menuNum: CARDINAL;
menuItem: id.MenuItemPtr;
b: BOOLEAN;
BEGIN
cxf.LoadOptions (options);
il.ClearMenuStrip (window);
WITH options DO
menuNum := im.ShiftMenu(OPTIONS)+im.ShiftItem(MAUTOSIZE);
menuItem := il.ItemAddress(menustrip, menuNum);
IF AUTOSIZE THEN
INCL (menuItem^.flags, id.checked);
ELSE
EXCL (menuItem^.flags, id.checked);
END;
menuNum := im.ShiftMenu(OPTIONS)+im.ShiftItem(MSIZEABLE);
menuItem := il.ItemAddress(menustrip, menuNum);
IF SIZEABLE THEN
INCL (menuItem^.flags, id.checked);
ELSE
EXCL (menuItem^.flags, id.checked);
END;
menuNum := im.ShiftMenu(OPTIONS)+im.ShiftItem(MREQUESTER);
menuItem := il.ItemAddress(menustrip, menuNum);
IF REQUESTER THEN
INCL (menuItem^.flags, id.checked);
ELSE
EXCL (menuItem^.flags, id.checked);
END;
menuNum := im.ShiftMenu(OPTIONS)+im.ShiftItem(MREMOVEONLY);
menuItem := il.ItemAddress(menustrip, menuNum);
IF REMOVEONLY THEN
INCL (menuItem^.flags, id.checked);
ELSE
EXCL (menuItem^.flags, id.checked);
END;
END;
b := il.ResetMenuStrip (window, menustrip);
END LoadOptions;
(* --------------------------------------------------------------- *)
VAR
time, ttime : Time;
lastitem : INTEGER; (* zuletzt selektierter Eintrag für korrekten Doppelklick *)
PROCEDURE HandleWindowMsg (VAR done: BOOLEAN);
VAR
imsg: id.IntuiMessagePtr;
class: id.IDCMPFlagSet;
gadget: id.GadgetPtr;
code: CARDINAL;
qualifier: iv.QualifierSet;
char: CHAR;
a: INTEGER;
li: LONGINT;
tl: ARRAY [0..7] OF LONGINT;
BEGIN
(*$ IF DEBUG *)
io.WriteString ("cxw.HandleWindowMsg()\n");
(*$ ENDIF *)
LOOP
imsg := gtl.GTGetIMsg(window^.userPort);
IF imsg # NIL THEN
class := imsg^.class;
gadget := CAST(id.GadgetPtr, imsg^.iAddress);
code := imsg^.code;
qualifier := imsg^.qualifier;
ttime.secs := imsg^.seconds;
ttime.micros := imsg^.micros;
gtl.GTReplyIMsg (imsg);
IF id.closeWindow IN class THEN
CloseWindow;
ELSIF id.newSize IN class THEN
RescaleListview;
ELSIF id.gadgetUp IN class THEN
(* In diesem Teil werden die Gadgets ausgewertet: *)
CASE gadget^.gadgetID OF
SHOWWINDOW: cxc.SendBrokerCommand (lvitem, cd.cxcmdAppear);
| HIDEWINDOW: cxc.SendBrokerCommand (lvitem, cd.cxcmdDisappear);
| INACTIVE: cxc.SendBrokerCommand (lvitem, cxc.activeToggle);
| REMOVE: cxc.SendBrokerCommand (lvitem, cd.cxcmdKill);
| DE_ACTIVEALL:
DisEnableAll (disenableAllState);
| REMOVEALL: KillAll;
| LISTVIEW:
lvitem := code;
UpdateBroker (code);
IF (il.DoubleClick(time.secs, time.micros, ttime.secs, ttime.micros))
AND (lvitem = lastitem) THEN
cxc.SendBrokerCommand (lvitem, cd.cxcmdAppear);
ELSE
(*time := ttime;*)
time.secs := ttime.secs;
time.micros := ttime.micros;
END;
lastitem := lvitem;
ELSE
END;
ELSIF id.menuPick IN class THEN
(* Menüs auswerten: *)
CASE im.MenuNum(code) OF
PROJECT:
CASE im.ItemNum(code) OF
ABOUT: About;
| HIDE: CloseWindow;
| QUIT: done := TRUE;
ELSE
END;
| CONTROL:
CASE im.ItemNum(code) OF
ENABLEALL: cxc.SendAllBrokerCommand(cd.cxcmdEnable);
| DISABLEALL: cxc.SendAllBrokerCommand(cd.cxcmdDisable);
| KILLALL: KillAll;
ELSE
END;
| OPTIONS:
WITH options DO
CASE im.ItemNum(code) OF
MAUTOSIZE: AUTOSIZE := NOT(AUTOSIZE);
| MSIZEABLE:
CloseWindow;
SIZEABLE := ~SIZEABLE;
ShowWindow;
| MREQUESTER: REQUESTER := ~REQUESTER;
| MREMOVEONLY: REMOVEONLY := ~REMOVEONLY;
RefreshListview;
| LOADOPTIONS: LoadOptions;
| SAVEOPTIONS: cxf.SaveOptions (options);
ELSE
END;
END;
ELSE
END;
ELSIF id.refreshWindow IN class THEN
gtl.GTBeginRefresh(window);
gtl.DrawBevelBoxA (window^.rPort, BEVELBOX.left,
BEVELBOX.top, BEVELBOX.width, BEVELBOX.height,
TAG(tl, gtd.gtVisualInfo, visualinfo,
gtd.gtbbRecessed, TRUE,
tagEnd));
a := String.Length(CAST(StrPtr, ll.GetCatalogStr(catalog, cxl.GAD_INFORMATION, ADR(cxl.GAD_INFORMATIONSTR)))^);
gl.Move (window^.rPort, BEVELBOX.left + (BEVELBOX.width-(a*FONT.xsize)) DIV 2,
BEVELBOX.top-(FONT.ysize DIV 2)-2);
gl.SetAPen (window^.rPort, 1);
gl.Text (window^.rPort, ll.GetCatalogStr(catalog, cxl.GAD_INFORMATION, ADR(cxl.GAD_INFORMATIONSTR)), a);
gtl.GTEndRefresh(window, TRUE);
(*il.RefreshWindowFrame (window);*)
ELSIF id.vanillaKey IN class THEN
char := CHAR(code);
IF char = ASCII.esc THEN CloseWindow;
ELSIF char = keyshortcut^[KEY_UP] THEN
lvitem := (lvitem-1) MOD brokercount;
UpdateListview (lvitem);
ELSIF char = keyshortcut^[KEY_DOWN] THEN
lvitem := (lvitem+1) MOD brokercount;
UpdateListview (lvitem);
ELSIF (char = ASCII.cr) OR (CAP(char) = keyshortcut^[KEY_SHOW]) THEN
cxc.SendBrokerCommand (lvitem, cd.cxcmdAppear);
ELSIF CAP(char) = keyshortcut^[KEY_HIDE] THEN
cxc.SendBrokerCommand (lvitem, cd.cxcmdDisappear);
ELSIF CAP(char) = keyshortcut^[KEY_DISENABLE] THEN
cxc.SendBrokerCommand (lvitem, cxc.activeToggle);
ELSIF CAP(char) = keyshortcut^[KEY_DISENABLEALL] THEN
DisEnableAll (disenableAllState);
ELSIF (char = ASCII.del) OR (CAP(char) = keyshortcut^[KEY_REMOVE]) THEN
cxc.SendBrokerCommand (lvitem, cd.cxcmdKill);
ELSE
END;
ELSIF id.rawKey IN class THEN
CASE code OF
id.cursorUp:
IF (iv.lShift IN qualifier) OR
(iv.rShift IN qualifier) THEN
lvitem := 0;
ELSE
lvitem := (lvitem-1) MOD brokercount;
END;
UpdateListview (lvitem);
| id.cursorDown:
IF (iv.lShift IN qualifier) OR
(iv.rShift IN qualifier) THEN
lvitem := brokercount-1;
ELSE
lvitem := (lvitem+1) MOD brokercount;
END;
UpdateListview (lvitem);
ELSE
END;
ELSE
END;
ELSE
EXIT;
END;
END;
END HandleWindowMsg;
(* --------------------------------------------------------------- *)
VAR
taglist: ARRAY [0..7] OF LONGINT;
dummy: StrPtr;
BEGIN (* main *)
Init;
lvitem := 0;
(* Katalog *)
catalog := ll.OpenCatalogA (NIL, ADR("CX.catalog"), NIL);
dummy := ll.GetCatalogStr(catalog, cxl.WINDOWTITLE, ADR(cxl.WINDOWTITLESTR));
String.Copy (wintitle, dummy^);
GetKeyShortcuts;
cxc.InitBrokerList (brokercount);
INC (brokercount); (* Wir zählen schon mal jetzt Exchange noch
* dazu, damit das beim AUTOSIZE-Layouten auch
* richtig gut aussieht. *)
CLOSE
CloseWindow;
cxc.FreeBrokerList;
IF catalog # NIL THEN
ll.CloseCatalog(catalog);
catalog := NIL;
END;
DeInitialisieren;
END CXWindow.