;GUISupportlibrary Demo 1 by Q/BMB

.Constantes
#Ptr=Off      ;Ptr=On|Off ist Ptr=On wird ein screen mit ExScreen
              ;anstatt ExScreenObj untersucht d.h. der Screen muss
              ;nicht ein Blitzbasic Object sein.
#W1=0
#G1=1
#G2=2
#G3=3
#G4=4

NEWTYPE.lvitem
  Dummy.w
  Text.s
End NEWTYPE



.DefVars
DEFTYPE.s ScrName
DEFTYPE.l Scr,I
DEFTYPE.w X,Y,W,H,GadX,GadY,GadW,GadH

.DimArrays
Dim List Elements.lvitem(99)

.InitVars
ScrName="Workbench"   ;Publicscreen-Name

I=1
While AddItem (Elements())
  Elements()\Text="Element ("+Str$(I)+")"
  Let I+1
Wend
ResetList Elements()

.Routines
Function.w Quit {}
  ;Anfrage beim beenden des Programms.
  ;
  Function Return {EasyRequest(#W1,"Anfrage...","Wolles sie das Programm verlassen?","Ja|AAARRGGH!!")}
End Function

Function.w CalcLVHeight {FontH,Elements}
  ;Rechnet die Hhe eines Listviewgadgets,
  ;anhand der Daten Font Hhe und Anzahl
  ;sichrbarer Elemente, aus.
  ;
  ;Bei Kickstart 2.0 ist die kleinst Anzahl Sichtbarer Elemente 2,
  ;da zu dem Listviewgadget automatisch noch ein Textgadget
  ;erzeugt wird.
  ;
  DEFTYPE.w GadH
  If ExecVersion<39
    Let GadH+8
    If Elemenst<2
      Let Elements=2
    End If
  Else
    Let GadH+4
    If Elements<1
      Let Elements=1
    End If
  End If
  Let GadH+Elements*FontH
  Function Return {GadH}
End Function

.CodeStart
NoCli
CloseEd
WbToScreen #W1    ;Workbench hohlen

CNIF #Ptr=On
  Scr=LockPubScreen_(&ScrName)
  If Scr
    ExScreen Scr ;Screen untersuchen (Scr enthlt die Adresse der Screenstruktur).
    UnlockPubScreen_ &ScrName,Scr ;Screen wieder freigeben.
                                  ;Ueblicherweise ffnet man erst noch ein
                                  ;Fenster da man sonst nicht sicher sein
                                  ;kann, dass der Screen noch geffnet ist!!!
  Else
    End ;Fehler!
  End If
CELSE
  ExScreenObj #W1           ;ScreenObject #W1 untersuchen.
CEND

LoadFont #W1,ScrFontName$,ScrFontHeight ;Beliebiger Font laden.

H=WBorTop+WBorBottom  ;FensterHhe ist sicherlich so gross wie
                      ;der obere und der untere Fensterrand.

W=WBorLeft+WBorRight  ;Das Fenster ist auch mindesten so breit
                      ;wie der linke und der Rechte Fensterrand.

Let GadH=CalcLVHeight {ScrFontHeight,20}  ;Gadgethhe eines ListView mit
                                  ;20 sichtbaren Elementen berechnen.

Let GadW=160    ;ACHTUNG! Die Breite des Gadget wird nicht
                ;ACHTUNG! der FOntgrsse angepasst.

Let H+GadH      ;Die Fensterhhe wird um die Gadgethhe vergrssert.
Let W+GadW      ;Die Breite des Fensters wird um die Breite das
                ;Listviewgadgets erweitert.

GTListView  #W1,#G1,GadX,GadY,GadW,GadH,"",$2,Elements(),-1,0 ;Listview erzeugen.

Let GadX+GadW+3   ;Neue X Koordinate fr ein weiteres Gadget berechnen.
Let GadH=ScrFontHeight+8  ;Die Hhe des Gadgets der Fonthhe anpassen.
Let GadW=140      ;Die Breite des Gadgets festlegen.
Let GadY=Int((H-(WBorTop+WBorBottom+GadH))/2) ;und das Gadget im Y wert
                                              ;im Fenster zentrieren.
Let W+GadW+6 ;Die Fenster Breite wird angepasst.

GTText #W1,#G2,GadX,GadY,GadW,GadH,"Selected",$4,"" ;Textgadget erzeugen.

Let X=Int((ScreenWidth-W)/2)  ;Fenster auf dem Screen zentrieren.
Let Y=Int((ScreenHeight-H)/2) ;dito

Window #W1,X,Y,W,H,$100E,"Fontsensitiv!",DetailPen,BlockPen:AttachGTList #W1,#W1

Let X=WBorLeft+160                ;Koordinaten fr Bevelboxen berechnen.
Let Y=WBorTop
Let W=W-(160+WBorLeft+WBorRight)
Let H=H-(WBorTop+WBorBottom)

GTBevelBox #W1,X,Y,W,H,0          ;ACHTUNG! Bevelboxen immer nach
GTBevelBox #W1,X+1,Y+1,W-2,H-2,1  ;ACHTUNG! AttchGTList verwenden.


Repeat
  Select WaitEvent
    Case$40
      If GadgetHit=#G1
        GTSetString #W1,#G2,"Element ("+Str$(EventCode+1)+")"
        Redraw #W1,#G2
      End If
    Case $200
      If Quit{}
        End     ;Ende, Schluss, Aus... CU
      End If
  End Select
Forever
