;ScreenInfo 1.8 by Q/BMB & J.Oertli
;==================================
;
;Kleines Beispiel fr Fontabhngige GUI-Programmierung
;
;Durch die benutzung der GUISupportlibrary wird
;das ganze etwas einfacher.
;

.NewTypes
NEWTYPE.font
  Name.l
  YSize.w
  Style.b
  Flags.b
End NEWTYPE

NEWTYPE.screen
  NextScreen.l
  FirstWindow.l
  LeftEdge.w
  TopEdge.w
  Width.w
  Height.w
  YMouse.w
  XMouse.w
  Flags.w
  Title.l
  DefaultTitle.l
  BarHeight.b
  BarVBorder.b
  BarHBorder.b
  MenuVBorder.b
  MenuHBorder.b
  WBorTop.b
  WBorLeft.b
  WBorRight.b
  WBorBottom.b
  Dummy.b
  *ScreenFont.font
End NEWTYPE

.DEFVars
DEFTYPE.screen *Scr

.Routines
Statement PubToScreen {ScrNo.b,Title.s}
;
; Diese Routine fllt ein mit >ScrNo< angegebenes
; Screenobject mit der Adresse eines Public-Screens,
; welcher durch den PublicScreenTitel ( >Title< )
; definiert wird. Wenn >Title< = DEFAULT ist dann wird
; der Standart PublicScreen verwendet.
;
; ACHTUNG! Der Publicscreentitel muss nicht immer
; ACHTUNG! gleich lauten wie der "normale" Screentitel.
; ACHTUNG! Am besten verwenden sie immer den standart
; ACHTUNG! Publicscreen welcher in der Regel der
; ACHTUNG! Workbenchscreen ist...
;
    If UCase$(Title)="DEFAULT" OR Title=""
      T.s=String$ (" ",81)
      GetDefaultPubScreen_ &T
      Title=T
    End If
    Scr.l=LockPubScreen_ (Title)
    Poke.l Addr Screen (ScrNo),Scr
    Use Screen ScrNo
    ExScreenObj ScrNo
    UnlockPubScreen_ Title,Scr
End Statement

Statement GetScrData {ScrNo.b}
;
; Dieses Statement ffnet ein Fenster auf dem mit <ScrNo> angegebenen Screen,
; und gibt einige Informationen ber den betreffenden Screen aus...
; Danach wird der Screen <ScrNo> in den Vordergrund gebracht...
;
; Windowheight:
; - 1 Gadgetreihe (ScreenFont)
; - 20 Textzeilen (Topaz 8)
;
; Windowwidth:
; -Naja viel... vieleicht 310?
;


    Let GadHeight.w=ScrFontHeight+8
    Let GadWidth.w=310


    WinHeight=GadHeight+(10*(ScrFontHeight+1))+WBorTop+WBorBottom ;Fensterhhe festlegen
    WinWidth=GadWidth+WBorLeft+WBorRight ;Fensterbreite festlegen.

    WinX.w=Abs((ScreenWidth-WinWidth)/2)    ;Fenster auf dem Screen zentrieren.
    WinY.w=Abs((ScreenHeight-WinHeight)/2)  ;dito


    If WinX<0 OR WinY<0 Then Goto Fehler2 ;Ist das Fenster grsser als der Screen?

    Use IntuiFont 1
    GTText 1,1,0,0,GadWidth,GadHeight,"",$0,Peek.s (Peek.l(ScreenPtr+$16)) ;Screentitel

    Window 1,WinX,WinY,WinWidth,WinHeight,$100E,"Screen Informations",DetailPen,BlockPen
    AttachGTList 1,1

    WindowFont 1
    Use IntuiFont 1

    *Scr.screen=ScreenPtr
    CX.w=2
    CY.w=GadHeight+2

    WLocate CX,CY
    Print "X,Y: " : Print ScreenX,",",ScreenY


    Let CY+ScrFontHeight+1
    WLocate CX,CY
    Print "Width,Height: " : Print ScreenW,",",ScreenH

    Let CY+ScrFontHeight+1
    WLocate CX,CY
    Print "Bar Height,HBorder,VBorder: " : Print BarHeight,",",BarHBorder,",",BarVBorder

    Let CY+ScrFontHeight+1
    WLocate CX,CY
    Print "Menu HBorder,VBorder: " : Print MenuHBorder,",",MenuVBorder

    Let CY+2*ScrFontHeight+1
    WLocate CX,CY
    Print "Window Top,Left,Right,Bottom: " : Print WBorTop,",",WBorLeft,",",WBorRight,",",WBorBottom

    WColour HilightTextPen,BackgroundPen    ;Wichtige texte mit HilightTextPen
                                            ;hervor heben.
    Let CY+2*ScrFontHeight+1
    WLocate CX,CY
    Print "ScreenFont: " : Print Peek.s (*Scr\ScreenFont\Name)

    WColour TextPen,BackgroundPen
    Let CY+ScrFontHeight+1
    WLocate CX,CY
    Print "ScreenFont height: " : Print *Scr\ScreenFont\YSize

    Let CY+ScrFontHeight+1
    WLocate CX,CY
    Print "ScreenFont style: " : Print *Scr\ScreenFont\Style

    ScreenToFront_ ScreenPtr


    Repeat
      Select WaitEvent
        Case $200
        Free Window 1
        Free GTList 1
;
; Screen Objekt <ScrNo> entleeren
;
        Poke.l Addr Screen (ScrNo),0
        Statement Return
      End Select
    Forever

Fehler2:
    DefaultOutput ;OOOPPS!
    NPrint "Can not open Window -> Screen to samll."
End

End Statement

.CodeStart
NoCli
WBStartup

;
; Default Publicscreen als ScreenObjekt 0 benutzen...
;

PubToScreen {0,"DEFAULT"}

*Scr=ScreenPtr

If *Scr
  ScreenToFront_ ScreenPtr
;
; Es soll nun ein kleines Fenster geoeffnet werden, das nur so gross ist,
; um ein String Gadget zu beinhalten.
; Die Gadget groesse berechne ich aus Fonthoehe+2*4 und die breite
; ist sagen wir mal 250 pixel...
;

  GadHeight.w=*Scr\ScreenFont\YSize+8
  GadWidth.w=250
;
; Das Fenster soll in der Mitte direkt unterhalb der Titelleiste des
; Bildschirmes erscheinen...

  WinHeight=GadHeight+WBorTop+WBorBottom

  WinWidth=GadWidth+WBorLeft+WBorRight

  WinX.w=Abs((ScreenWidth-WinWidth)/2)
  WinY.w=BarHeight

;
; Nun Lade ich noch den Screen font...
;

LoadFont 1,ScrFontName$,ScrFontHeight,ScrFontStyle

;
; Sizelimits werden so gewaehlt, dass wenn man das Zoom Gadget betaetigt
; nur noch der Titelbalken von dem Fenster zu sehen ist...
;



  SizeLimits Winwidth,WBorTop,Winwidth,WinHeight

  GTString 0,1,0,0,GadWidth,GadHeight,"",1,80,"DEFAULT"

  Window 0,WinX,WinY,WinWidth,WinHeight,$2000100E,"Enter Pubscreen Name",DetailPen,BlockPen
  AttachGTList 0,0
  ActivateString 0,1
  Repeat
    Select WaitEvent
      Case $40
        PubToScreen {1,GTGetString (0,1)} : *Scr=ScreenPtr
        If *Scr
          GetScrData {1}
        Else
          GTSetString 0,1,"DEFAULT"
        End If
      Case $200
        Goto Exit

    End Select
  Forever
Else
  Goto Fehler1
End If

Exit:
End


.Datas
Fehler1:
  DefaultOutput
  NPrint "Can not lock Default-Publicscreen."
Goto Exit

.Version
Dc.b "$VER:ScreenInfo v1.8 (13.12.1994) Q & J.Oertli",0
Even



