MODULE GadDemo; FROM SYSTEM IMPORT ADR,ADDRESS,CAST,TAG,ASSEMBLE; IMPORT A:Arts, ID:IntuitionD, IL:IntuitionL, GD:GadToolsD, GL:GadToolsL, GraphicsD, GrL:GraphicsL, EL:ExecL; FROM UtilityD IMPORT tagEnd; FROM String IMPORT Length; (*====================================================================*) MODULE Strings; (* Dies ergibt ein absolut sicheres RawDoFmt, weil der Puffer immer im * letzten Byte eine 0 hat und dann nicht mehr abgelegt wird! *) IMPORT ADR,ADDRESS,ASSEMBLE,EL; EXPORT sprintf; PROCEDURE PutCh; (*$ EntryExitCode:=FALSE *) BEGIN ASSEMBLE( TST.B (A3) BEQ.S nixMehr MOVE.B D0,(A3)+ nixMehr: RTS END); END PutCh; (*-------------------------------------------------------------------------*) (*$ CopyDyn:=FALSE *) PROCEDURE sprintf(VAR res:ARRAY OF CHAR; s:ARRAY OF CHAR; data:ADDRESS); BEGIN ASSEMBLE( (* string mit was füllen, letzter=0C *) MOVE.L res(A5),A0 MOVE.L res+4(A5),D0 MOVEQ #10,D1 (* irgendwas#0 *) Lp: MOVE.B D1,(A0)+ DBRA D0,Lp CLR.B -(A0) END); EL.RawDoFmt(ADR(s),data,ADR(PutCh),ADR(res)); END sprintf; END Strings; (* internes Modul *) (*====================================================================*) TYPE Gadgets=(caps,rep,shift,alt,ctrl,dnup,typ,str,text,quit, list,pal,scroll,sli,test,cycle); Types=(norm,string,dead,nop,dummy); VAR myWindow: ID.WindowPtr; myScreen: ID.ScreenPtr; myRp: GraphicsD.RastPortPtr; vi:ADDRESS; glist, capsGad, repGad, shiftGad, altGad, ctrlGad, dnupGad, typGad, strGad, textGad, quitGad, listGad, palGad, scrollGad, sliGad, testGad, cycleGad:ID.GadgetPtr; tagBuff:ARRAY[0..20] OF LONGINT; strBuff, textText: ARRAY[0..19] OF CHAR; myAttr:GraphicsD.TextAttr; strs:ARRAY Types OF ADDRESS; actTyp:Types; fstr: ARRAY[0..99] OF CHAR; PROCEDURE OpenScreenWindow; VAR topEdge: INTEGER; tagBuffer:ARRAY [1..13] OF LONGINT; BEGIN (* Screen öffnen: *) myScreen:=IL.OpenScreenTagList(NIL,TAG(tagBuffer, ID.saDepth, 2, ID.saDisplayID, GraphicsD.palMonitorID+GraphicsD.hiresKey, ID.saPens, ADR(CARDINAL{0FFFFH}), (* ergibt "new look"!!! *) ID.saTitle, ADR("GadDemo 1.0"), tagEnd)); A.Assert(myScreen#NIL,ADR("Kann Screen nicht öffnen")); (* type:=ID.customScreen;*) (* Window öffnen *) topEdge:=myScreen^.barHeight+myScreen^.barVBorder; myWindow:=IL.OpenWindowTagList(NIL,TAG(tagBuffer, ID.waTop, topEdge, ID.waHeight, myScreen^.height-topEdge, ID.waWidth, myScreen^.width, ID.waFlags, ID.WindowFlagSet{ID.backDrop,ID.borderless,ID.activate}, ID.waCustomScreen, myScreen, tagEnd )); A.Assert(myWindow#NIL,ADR("Kann Fenster nicht öffnen")); (* RastPort setzen: *) myRp:=myWindow^.rPort; END OpenScreenWindow; PROCEDURE CloseScreenWindow; BEGIN IF myWindow<>NIL THEN IL.CloseWindow(myWindow); myWindow:=NIL; END; IF myScreen<>NIL THEN IL.CloseScreen(myScreen); myScreen:=NIL; END; END CloseScreenWindow; (*$ CopyDyn:=FALSE *) PROCEDURE Say(str:ARRAY OF CHAR; data:ADDRESS); BEGIN GrL.Move(myRp,10,12); sprintf(fstr,str,data); GrL.Text(myRp,ADR(fstr),Length(fstr)); GrL.ClearEOL(myRp); END Say; PROCEDURE MakeGadgets; VAR ng:GD.NewGadget; BEGIN WITH myRp^.font^ DO myAttr.name:=message.node.name; myAttr.ySize:=ySize; myAttr.style:=style; myAttr.flags:=flags; END; ng.textAttr:=ADR(myAttr); ng.visualInfo:=vi; ng.userData:=NIL; (* 6 Buttons *) ng.leftEdge:=100; ng.topEdge:=30; ng.width:=100; ng.height:=myAttr.ySize*2; ng.gadgetID:=ORD(caps); ng.flags:=GD.NewGadgetFlagSet{GD.placetextLeft}; ng.gadgetText:=ADR("Capsable"); capsGad:=GL.CreateGadgetA(GD.checkboxKind,glist^,ng,TAG(tagBuff, GD.gtcbChecked,TRUE, 0)); INC(ng.topEdge,capsGad^.height+GD.interHeight); ng.gadgetID:=ORD(rep); ng.gadgetText:=ADR("Repeatable"); repGad:=GL.CreateGadgetA(GD.checkboxKind,capsGad^,ng,TAG(tagBuff, GD.gtcbChecked,TRUE, 0)); INC(ng.topEdge,repGad^.height+GD.interHeight); ng.gadgetID:=ORD(shift); ng.gadgetText:=ADR("Shift"); shiftGad:=GL.CreateGadgetA(GD.checkboxKind,repGad^,ng,TAG(tagBuff, GD.gtcbChecked,TRUE, 0)); INC(ng.topEdge,shiftGad^.height+GD.interHeight); ng.gadgetID:=ORD(alt); ng.gadgetText:=ADR("Alt"); altGad:=GL.CreateGadgetA(GD.checkboxKind,shiftGad^,ng,TAG(tagBuff, GD.gtcbChecked,TRUE, 0)); INC(ng.topEdge,altGad^.height+GD.interHeight); ng.gadgetID:=ORD(ctrl); ng.gadgetText:=ADR("Control"); ctrlGad:=GL.CreateGadgetA(GD.checkboxKind,altGad^,ng,TAG(tagBuff, GD.gtcbChecked,TRUE, 0)); INC(ng.topEdge,ctrlGad^.height+GD.interHeight); ng.gadgetID:=ORD(dnup); ng.gadgetText:=ADR("DownUp"); dnupGad:=GL.CreateGadgetA(GD.checkboxKind,ctrlGad^,ng,TAG(tagBuff, GD.gtcbChecked,FALSE, 0)); (* 1 mx *) INC(ng.topEdge,dnupGad^.height+GD.interHeight); ng.gadgetID:=ORD(typ); ng.gadgetText:=ADR("Typ:"); strs[norm]:=ADR("Norm"); strs[string]:=ADR("String"); strs[dead]:=ADR("Dead"); strs[nop]:=ADR("NOP"); strs[dummy]:=NIL; actTyp:=MIN(Types); typGad:=GL.CreateGadgetA(GD.mxKind,dnupGad^,ng,TAG(tagBuff, GD.gtmxLabels, ADR(strs), GD.gtmxSpacing, 3, 0)); (* 1 Cycle! *) (* ng.topEdge:= bleibt so *) ng.leftEdge:=190; ng.width:=100; ng.height:=16; ng.gadgetID:=ORD(cycle); ng.gadgetText:=ADR("Cycle:"); strs[norm]:=ADR("Norm"); strs[string]:=ADR("String1"); strs[dead]:=ADR("Dead"); strs[nop]:=ADR("NOP"); strs[dummy]:=NIL; actTyp:=MIN(Types); cycleGad:=GL.CreateGadgetA(GD.cycleKind,typGad^,ng,TAG(tagBuff, GD.gtcyLabels, ADR(strs), 0)); (* 1 String *) INC(ng.topEdge,typGad^.height+GD.interHeight+50); ng.leftEdge:=100; ng.width:=myRp^.txWidth*19; ng.gadgetID:=ORD(str); ng.gadgetText:=ADR("Input"); strBuff:="Hallo"; strGad:=GL.CreateGadgetA(GD.stringKind,cycleGad^,ng,TAG(tagBuff, GD.gtstString, ADR(strBuff), GD.gtstMaxChars,17, 0)); (* 1 Text *) INC(ng.topEdge,strGad^.height+GD.interHeight+4); ng.width:=16; ng.gadgetID:=ORD(text); ng.gadgetText:=ADR("Zeichen:"); textText:="H"; textGad:=GL.CreateGadgetA(GD.textKind,strGad^,ng,TAG(tagBuff, GD.gttxText, ADR(textText), GD.gttxBorder, TRUE, 0)); (* 1 Button *) INC(ng.topEdge,textGad^.height+GD.interHeight); ng.width:=80; ng.flags:=GD.NewGadgetFlagSet{GD.placetextIn,GD.ngHighlabel}; ng.gadgetID:=ORD(quit); ng.gadgetText:=ADR("Quit"); quitGad:=GL.CreateGadgetA(GD.buttonKind,textGad^,ng,TAG(tagBuff, 0)); (* 1 ListView *) (* listView: code=rel Nummer ab 0 in der Liste!*) ng.topEdge:=40; ng.leftEdge:=350; ng.width:=170; ng.height:=150; ng.flags:=GD.NewGadgetFlagSet{GD.placetextAbove,GD.ngHighlabel}; ng.gadgetID:=ORD(list); ng.gadgetText:=ADR("ListView"); listGad:=GL.CreateGadgetA(GD.listviewKind,quitGad^,ng,TAG(tagBuff, GD.gtlvTop, 2, GD.gtlvLabels, ADR(EL.execBase^.libList), GD.gtlvReadOnly,FALSE, GD.gtlvShowSelected,NIL, (* erzeugt autom. Anzeige-Gadget *) GD.gtlvSelected,5, 0)); (* 1 palette: code=Nummer der ausgewählten Farbe! *) ng.leftEdge:=540; ng.topEdge:=40; ng.width:=100; ng.height:=100; ng.gadgetID:=ORD(pal); ng.gadgetText:=ADR("Palette"); palGad:=GL.CreateGadgetA(GD.paletteKind,listGad^,ng,TAG(tagBuff, GD.gtpaDepth, 3, (* = 8 Farben *) GD.gtpaIndicatorWidth, 20, (* Balken daneben! *) 0)); (* 1 scroller: ganz normales Scroll-Gadget, AUCH mouseMove auswerten!*) ng.topEdge:=40; ng.leftEdge:=300; ng.width:=16; ng.height:=150; ng.flags:=GD.NewGadgetFlagSet{GD.placetextAbove,GD.ngHighlabel}; ng.gadgetID:=ORD(scroll); ng.gadgetText:=ADR("Scroller"); scrollGad:=GL.CreateGadgetA(GD.scrollerKind,palGad^,ng,TAG(tagBuff, GD.gtscTop, 0, GD.gtscTotal, 40, (* z.B. 40 Zeilen Text *) GD.gtscVisible, 10, (* z.B. 3 irgendwo sichtbar: (code=1.Zeile, unten=37) *) GD.gtscArrows, 8, ID.pgaFreedom, ID.lorientVert, ID.gaRelVerify, TRUE, (*ID.gaImmediate, TRUE,*) 0)); (* 1 Slider Für slider reicht GadgetUp! *) ng.topEdge:=220; ng.leftEdge:=270; ng.width:=150; ng.height:=15; ng.flags:=GD.NewGadgetFlagSet{GD.placetextAbove,GD.ngHighlabel}; ng.gadgetID:=ORD(sli); ng.gadgetText:=ADR("Slider"); sliGad:=GL.CreateGadgetA(GD.sliderKind,scrollGad^,ng,TAG(tagBuff, GD.gtslMin, 10, GD.gtslMax, 30, GD.gtslLevel, 20, GD.gtslMaxLevelLen, 8, (* Length of Text *) GD.gtslLevelFormat, ADR("Level:%02ld"), GD.gtslLevelPlace, GD.placetextRight, (*GD.gtslDispFunc, ADR(myProc),*) ID.gaRelVerify, TRUE, ID.pgaFreedom, ID.lorientHoriz, 0)); (* 1 Button *) ng.leftEdge:=500; ng.topEdge:=200; ng.width:=80; ng.height:=20; ng.gadgetID:=ORD(test); ng.gadgetText:=ADR("Button"); ng.flags:=GD.NewGadgetFlagSet{GD.placetextLeft,GD.ngHighlabel}; testGad:=GL.CreateGadgetA(GD.buttonKind,sliGad^,ng,TAG(tagBuff, 0)); END MakeGadgets; PROCEDURE GAble(val:BOOLEAN); BEGIN GL.GTSetGadgetAttrsA(capsGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(repGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(shiftGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(altGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(ctrlGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(dnupGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); GL.GTSetGadgetAttrsA(strGad,myWindow,NIL,TAG(tagBuff, ID.gaDisabled, val, 0)); END GAble; PROCEDURE Do; VAR imp:ID.IntuiMessagePtr; class:ID.IDCMPFlagSet; code:CARDINAL; g:ID.GadgetPtr; si:ID.StringInfoPtr; id:INTEGER; BEGIN LOOP EL.WaitPort(myWindow^.userPort); imp:=GL.GTGetIMsg(myWindow^.userPort); IF imp#NIL THEN class:=imp^.class; code:=imp^.code; g:=imp^.iAddress; (* es kommt auch anderer Müll an, also testen, ob Gadget! *) GL.GTReplyIMsg(imp); (* erst jetzt freigeben! *) IF class<=ID.IDCMPFlagSet{ID.gadgetUp,ID.gadgetDown,ID.mouseMove} THEN id:=g^.gadgetID; (* g muß ein GadgetPtr sein! *) CASE id OF | ORD(caps)..ORD(dnup): ; (* nix *) Say("Toggled %d",ADR(id)); | ORD(typ): (* mx *) actTyp:=Types(code); IF actTyp=nop THEN GAble(TRUE); ELSIF ID.gadgDisabled IN shiftGad^.flags THEN GAble(FALSE); END; Say("Mx to: %s",ADR(strs[actTyp])); | ORD(str): (* String *) si:=CAST(ID.StringInfoPtr,g^.specialInfo); Say("String: \"%s\"",ADR(si^.buffer)); (*A.BreakPoint(ADR("STR"));*) | ORD(quit): (* Quit *) EXIT; | ORD(list): (* listView: Code ist die Nummer ab 0 in der Liste! *) Say("List %d",ADR(code)); | ORD(pal): Say("Color %d",ADR(code)); | ORD(scroll): Say("Scroll %d",ADR(code)); | ORD(sli): Say("Slider val %d",ADR(code)); | ORD(test): Say("Button pressed!",NIL); | ORD(cycle): Say("Cycle to %d",ADR(code)); | ELSE A.BreakPoint(ADR("unmöglich!")); END; (* case *) END; (* right IDCMP *) END; (* if #NIL *) END; (* loop *) END Do; BEGIN (* main *) A.Assert(A.kickVersion>=37,ADR("Ich brauche Kickstart >=V37")); OpenScreenWindow; vi:=GL.GetVisualInfoA(myScreen,NIL); glist:=NIL; IF GL.CreateContext(glist)=NIL THEN HALT END; MakeGadgets; IL.ModifyIDCMP(myWindow,GD.checkboxIDCMP+GD.cycleIDCMP+GD.stringIDCMP+GD.mxIDCMP+GD.listviewIDCMP+GD.scrollerIDCMP); IF IL.AddGList(myWindow,glist,-1,-1,NIL)=0 THEN END; IL.RefreshGList(glist,myWindow,NIL,-1); GL.GTRefreshWindow(myWindow,NIL); Do; CLOSE IF glist#NIL THEN GL.FreeGadgets(glist); glist:=NIL END; IF vi#NIL THEN GL.FreeVisualInfo(vi); vi:=NIL; END; CloseScreenWindow; END GadDemo.