' BILL K  12-2002    MultiCaptiveChildWnds.rqb
' Demonstrates Multiple Captive Child Forms
'   Window Cascading And Tiling
'   Dynamic Status Bar Update
'   Window Tracking In A Menu
'   Undo as a menu item
'   and Lot's Of Other Good Stuff
'   Enjoy !  Bill K
$OPTIMIZE ON
$APPTYPE GUI
$TYPECHECK ON
CONST CRLF=CHR$(13) & CHR$(10)
CONST QT =CHR$(34)
CONST GWL_STYLE = (-16)
CONST TVS_NOTOOLTIPS=&H80
CONST WS_CAPTION = &HC00000
CONST WS_CHILD = &H40000000
CONST WS_VISIBLE = &H10000000
CONST WS_SYSMENU = &H80000
CONST WS_THICKFRAME = &H40000
CONST WS_MINIMIZEBOX = &H20000
CONST WS_MAXIMIZEBOX = &H10000
CONST WINDOWSTYLE =WS_CHILD OR WS_VISIBLE _
OR WS_CAPTION OR WS_SYSMENU OR WS_THICKFRAME _
OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
DEFINT GX,FRMCNT,MAXFRMS, NEWTOP, NEWLEFT, ISNEW
DEFINT CURFORMNUM ,TW ,PTW ,FLGCONFIG,FLGDRCTRY
DEFSTR Filename
ISNEW=1
MAXFRMS=20  ' I don't know a limit yet 
' but this would be very crowded if all
' were open at once.
' When a form is closed it's MENUARRAY number
' is reused.
DIM FORMTRACK(MAXFRMS) AS INTEGER
DIM MENUARRAY(MAXFRMS) AS INTEGER
DEFLNG CURFORM(MAXFRMS),PREVFORM
'
DECLARE FUNCTION SetWindowLong LIB "User32" ALIAS _
 "SetWindowLongA" (hwnd AS Long, nIndex AS Long, _
dwNewLong AS Long) AS LONG
DECLARE FUNCTION GetWindowLong LIB "user32" ALIAS _
 "GetWindowLongA" (hwnd AS Long, nIndex AS Long) _
 AS LONG
DECLARE FUNCTION SetParent LIB "user32" ALIAS _
"SetParent" (hWndChild AS Long, hWndNewParent _
 AS Long) AS LONG
DECLARE FUNCTION IsWindowVisible LIB "user32" ALIAS _
 "IsWindowVisible" (ByVal hwnd AS Long) AS LONG
DECLARE FUNCTION SETFOCUS LIB "user32" ALIAS _
"SetFocus"(HWND AS LONG) AS LONG
DECLARE FUNCTION FlashWindow LIB "user32" ALIAS _
"FlashWindow" (ByVal hwnd AS Long, ByVal bInvert _
 AS Long) AS LONG
DECLARE FUNCTION CHECKFOROLD () AS INTEGER
'
Declare Sub Menunew
Declare Sub Menurestore
Declare Sub Menuminall
Declare Sub Menucascade
Declare Sub Menutile
Declare Sub Menuclose
Declare Sub Closeme
Declare Sub Setaccess(Sender As Qcheckbox)
Declare Sub Trackwindows
Declare Sub Getreditformhndle_
  (BUTTON%, X%, Y%, SHIFT%,SENDER AS QRICHEDIT)
DECLARE SUB GETPANELFORMHNDLE(SENDER AS QPANEL)
Declare Sub Docurform
Declare Sub Getform
Declare Sub Showhand
Declare Sub Getnewnum
Declare Sub menuOpen
Declare Sub Menushowwnd(Item As Qmenuitem)
Declare Sub DoPopRedit(Sender As Qmenuitem)
Declare Sub Showconfig
Declare Sub Showpref
Declare Sub Showdrctry
Declare Sub Closeconfig
Declare Sub Dodrctry
Declare Sub Dotoolbtn(Sender As Qcoolbtn)
Declare Sub Doformresize
Declare Sub DoOpen(Sender As Qcoolbtn)
Declare Sub Formonshow
Declare Sub Dotreeview
Declare Sub Chkboxwrap(Sender As Qcheckbox)
'{===========================
Create Font As Qfont
   Name="Arial"
   Size=9
End Create
Create Bfont As Qfont
   Name="Arial"
   Size=9
   Bold=1
End Create
Create Lfont As Qfont
   Name="Arial"
   Size=8
   Bold=1
End Create
Create Timex As Qtimer
   Interval=50
   Ontimer=getform
End Create
' Main Form-------------
Create Form As Qform
   Caption="Main Form"
   Onshow=formonshow
   Width=screen.Width*.65
   Height=screen.Height*.65
   Color = -2147483636 ' Clappworkspace
   Onclose=closeme
   Create Toolpanel As Qpanel
      Align=1
      Height=26
      Borderstyle=2
      Bevelinner=0
      Bevelouter=1
      Create Toolbar1 As Qpanel
         Font=lfont
         Top=0
         Left=0
         Height=toolpanel.Height
         Width=400
      End Create
      Create Toolbar2 As Qpanel
         Font=lfont
         Top=0
         Left=toolbar1.Width + 2
         Height=toolpanel.Height
         Width=300
      End Create
   End Create 'toolpanel
   Create Sidepanel As Qpanel
      Align=3
      Width=175
      Borderstyle=2
      Bevelinner=0 
      FONT=BFONT
      Bevelouter=1
      Create Treeview As Qtreeview
         Align = 5
 	      Showhint=1
         Additems "Forms","Subs","Functions"
         Addchilditems 0, "Config", "Pref", "Directory"
         Addchilditems 4, "Showconfig", _
                  "Showpref", "Others"
         Addchilditems 7, "Sub1", "Sub2", "Sub3"
         Addchilditems 11, "Getfocus", _
             "Getwindowlong", "Setparent"
         Fullexpand
         Ondblclick= Dotreeview
      End Create  '  Treeview
   End Create    ' Sidepanel
   Create Splitv As Qsplitter
      Align = 3
      Left=sidepanel.Width
      Width = 6
      Cursor = -14
   End Create
   Create Zpanel As Qpanel
      Color = 11447982
      Bevelouter=1:bevelinner=1
      Borderstyle=2
      Align=5
   End Create
   Create Zstatus As Qstatusbar
      Addpanels " "," "," "," "
      Panel(0).Width=75:panel(1).Width=75:_
			panel(2).Width=75
   End Create
   Center
   CREATE MNUMAIN AS QMAINMENU
      CREATE MNUNEW AS QMENUITEM
         Caption  ="&File"
         CREATE mixmenu  AS QMENUITEM
            Caption  ="&New"
            OnClick = menuNew
         END CREATE
         CREATE OPENmenu  AS QMENUITEM
            Caption  ="&Open"
            OnClick = menuOpen
         END CREATE
         CREATE Bmenu  AS QMENUITEM
            Caption  ="-"
         END CREATE
         CREATE Exitmenu  AS QMENUITEM
            Caption  ="E&xit"
            OnClick = CloseMe
         END CREATE
      END CREATE 'mnuNew
      CREATE mnuWin AS QMENUITEM
         Caption  ="&Windows"
         CREATE Minmenu  AS QMENUITEM
            Caption  ="&Minimize Edit Windows"
            OnClick = menuMinAll
         END CREATE
         CREATE restoremmenu  AS QMENUITEM
            Caption  ="&Restore Edit Windows"
            OnClick = menuRestore
         END CREATE
         CREATE Cascademenu  AS QMENUITEM
            Caption ="&Cascade Edit Windows"
            OnClick = menuCascade
         END CREATE
         CREATE Tilemenu  AS QMENUITEM
            Caption  ="&Tile Edit Windows"
            OnClick = menuTile
         END CREATE
         CREATE Closemenu  AS QMENUITEM
            Caption  ="Close Edit Windows"
            OnClick = menuClose
         END CREATE
         CREATE amenu  AS QMENUITEM
            Caption  ="-"
         END CREATE
      END CREATE'mnuWin
   END CREATE 'mnuMain
END CREATE  ' FORM
CREATE PrefForm AS QFORM
   CAPTION = "Preferences  (not captive child)"
   WIDTH = 456
   HEIGHT = 143
   BORDERSTYLE=4
   CENTER ' never use center on any
    ' forms that involve any API calls !
    ' In this Form it doesn't use the API
   CREATE CheckBox1 AS QCHECKBOX
      Caption = "CheckBox1"
      Left = 16
      Top = 16
   END CREATE
   CREATE CheckBox2 AS QCHECKBOX
      Caption = "CheckBox2"
      Left = 16
      Top = 48
   END CREATE
   CREATE CheckBox3 AS QCHECKBOX
      Caption = "CheckBox3"
      Left = 16
      Top = 80
   END CREATE
   CREATE ComboBox1 AS QCOMBOBOX
      Text = "ComboBox1"
      Left = 130
      Top = 18
   END CREATE
   CREATE ComboBox2 AS QCOMBOBOX
      Text = "ComboBox2"
      Left = 289
      Top = 17
   END CREATE
   CREATE Button1 AS QBUTTON
      Caption = "Cancel"
      Left = 204
      Top = 67
      cancel=1
   END CREATE
   CREATE Button2 AS QBUTTON
      Caption = "Save"
      Left = 360
      Top = 67
   END CREATE
END CREATE
CREATE DirForm AS QFORM
   Caption = "Directory"
   borderstyle=3
   LEFT=-(sidepanel.width + 20)
   CREATE DirTree AS QDIRTREE
      InitialDir = CURDIR$
      align=5
      ONCHANGE=DODRCTRY
   END CREATE 'DirTree
END CREATE    'DirForm
CREATE CONFIGFORM AS QFORM
   CAPTION="CONFIG FORM (captive child)"
   BORDERSTYLE=4
   Width = 259
   Height = 350
   LEFT=-260  ' Do This Off Screen So that
' Drawing Form Doesn't Interfere
   CREATE GroupBox2 AS QGROUPBOX
      Caption = "GroupBox1"
      Left = 13
      Top = 17
      Width = 225
      CREATE RadioButton21 AS QRADIOBUTTON
         Caption = "RadioButton1"
         Left = 20
         Top = 20
      END CREATE
      CREATE RadioButton22 AS QRADIOBUTTON
         Caption = "RadioButton2"
         Left = 20
         Top = 47
      END CREATE
      CREATE RadioButton23 AS QRADIOBUTTON
         Caption = "RadioButton3"
         Left = 21
         Top = 77
      END CREATE
   END CREATE
   CREATE Edit21 AS QEDIT
      Text = " "
      Left = 15
      Top = 147
      Width = 225
   END CREATE
   CREATE CheckBox21 AS QCHECKBOX
      Caption = "CheckBox1"
      Left = 16
      Top = 191
   END CREATE
   CREATE CheckBox22 AS QCHECKBOX
      Caption = "CheckBox2"
      Left = 15
      Top = 223
   END CREATE
   CREATE CheckBox23 AS QCHECKBOX
      Caption = "CheckBox3"
      Left = 139
      Top = 192
   END CREATE
   CREATE CheckBox24 AS QCHECKBOX
      Caption = "CheckBox4"
      Left = 138
      Top = 221
   END CREATE
   CREATE Button21 AS QBUTTON
      Caption = "Cancel"
      Left = 13
      Top = 276
      cancel=1
      ONCLICK=CLOSECONFIG
   END CREATE
   CREATE Button22 AS QBUTTON
      Caption = "Save"
      Left = 155
      Top = 275
      TabOrder = 15
      default=1
      ONCLICK=CLOSECONFIG
   END CREATE
END CREATE 'CONFIGFORM
'
DIM winitem(maxfrms) AS QMENUITEM
DIM subform(maxfrms) AS QFORM
DIM redit(maxfrms) AS QRICHEDIT
DIM STATUSBAR(maxfrms) AS QSTATUSBAR
DIM crnrimage(maxfrms) AS QIMAGE
DIM PANEL(maxfrms) AS QPANEL
DIM STATS(maxfrms) AS QSTATUSBAR
DIM BTN(maxfrms,5) AS QCOOLBTN  
DIM CHKBOX(maxfrms,2) AS QCHECKBOX
DIM CBO(maxfrms) AS QCOMBOBOX
DIM LABEL(maxfrms) AS QLABEL
DIM RADBTN(maxfrms,3) AS QRADIOBUTTON
DIM REDITPOP(maxfrms) AS QPOPUPMENU
DIM REDITPOPITEM(maxfrms,30) AS QMENUITEM
'{==================SUBROUTINES===
SUB MENUNEW
   IF CHECKFOROLD THEN EXIT SUB
	DEFLNG chhnd,X
   INC(frmcnt):inc(newtop):inc(newLEFT)
   chhnd=subform(frmcnt).handle
   subform(frmcnt).caption="Untitled " & str$(frmcnt)
   subform(frmcnt).top=(newtop-1)*36
   subform(frmcnt).left=(newLEFT-1)*36
   subform(frmcnt).WIDTH=ZPANEL.WIDTH * .80
   subform(frmcnt).HEIGHT=ZPANEL.HEIGHT * .80
   subform(frmcnt).ONSHOW=DOCURFORM
   IF subform(frmcnt).top > form.clientheight * .8 _
   OR subform(frmcnt).LEFT > form.clientWIDTH * .8 THEN
   newtop=1 : newLEFT=1
   subform(frmcnt).top=(newtop-1)*36
   subform(frmcnt).LEFT=(newLEFT-1)*36
END IF
PANEL(frmcnt).parent=subform(frmcnt)
PANEL(frmcnt).HEIGHT=26
PANEL(frmcnt).ALIGN=1
PANEL(frmcnt).TAG=frmcnt
PANEL(frmcnt).FONT=BFONT
panel(frmcnt).BEVELOUTER=0
panel(frmcnt).ONCLICK=getPANELformhndle
STATS(frmcnt).parent=subform(frmcnt)
STATS(frmcnt).ALIGN=2
STATS(frmcnt).HINT=STR$(FRMCNT)
STATS(frmcnt).ADDPANELS "","",""
STATS(frmcnt).panel(1).width=100
FOR X=1 TO 2
   BTN(frmcnt,X).parent=PANEL(frmcnt)
   BTN(frmcnt,X).TOP=3
	BTN(frmcnt,X).flat=1
   BTN(frmcnt,X).WIDTH=50
   BTN(frmcnt,X).HEIGHT=20
   BTN(frmcnt,X).FONT=BFONT
   BTN(frmcnt,X).TAG=FRMCNT
NEXT
BTN(frmcnt,1).CAPTION="OPEN"
'BTN(frmcnt,1).BMPHANDLE=OPENBMP
BTN(frmcnt,1).ONCLICK=DOOPEN
BTN(frmcnt,1).LEFT=2
'BTN(frmcnt,2).BMPHANDLE=SAVEBMP
BTN(frmcnt,2).CAPTION="SAVE"
'BTN(frmcnt,2).ONCLICK=DOSAVE
BTN(frmcnt,2).LEFT=BTN(frmcnt,1).LEFT _
   + BTN(frmcnt,1).WIDTH
CHKBOX(frmcnt,1).PARENT=PANEL(frmcnt)
CHKBOX(frmcnt,1).FONT=LFONT
CHKBOX(frmcnt,1).CAPTION="READ ONLY"
CHKBOX(frmcnt,1).WIDTH=82
CHKBOX(frmcnt,1).LEFT=BTN(frmcnt,2).LEFT _
   + BTN(frmcnt,2).WIDTH + 10
CHKBOX(frmcnt,1).TOP=4
CHKBOX(frmcnt,1).Tag=frmcnt
CHKBOX(frmcnt,1).ONCLICK=SETACCESS
CHKBOX(frmcnt,2).PARENT=PANEL(frmcnt)
CHKBOX(frmcnt,2).FONT=LFONT
CHKBOX(frmcnt,2).CAPTION="WORD WRAP"
CHKBOX(frmcnt,2).WIDTH=100
CHKBOX(frmcnt,2).LEFT=CHKBOX(frmcnt,1).LEFT _
   + CHKBOX(frmcnt,1).WIDTH + 5
CHKBOX(frmcnt,2).TOP=4
CHKBOX(frmcnt,2).Tag=frmcnt
CHKBOX(frmcnt,2).ONCLICK=chkboxwrap
' don't set the checked property until
' after the form shows !! - see below
REDITPOPITEM(frmcnt,0).CAPTION="Cu&t"
REDITPOPITEM(frmcnt,1).CAPTION="&Copy"
REDITPOPITEM(frmcnt,2).CAPTION="&Paste"
REDITPOPITEM(frmcnt,3).CAPTION="&Delete"
REDITPOPITEM(frmcnt,4).CAPTION="Select &All"
REDITPOPITEM(frmcnt,5).CAPTION="&Undo"
REDITPOPITEM(frmcnt,6).CAPTION="-"
REDITPOPITEM(frmcnt,7).CAPTION="Insert"
REDITPOPITEM(frmcnt,8).CAPTION="Empty"
REDITPOPITEM(frmcnt,8).enabled=0
FOR X=0 TO 7
   REDITPOPITEM(frmcnt,X).tag=frmcnt
   REDITPOPITEM(frmcnt,X).ONCLICK=DoPopRedit
   REDITPOP(frmcnt).ADDITEMs REDITPOPITEM(frmcnt,X)
NEXT
REDITPOPITEM(frmcnt,7).ADDITEMs REDITPOPITEM(frmcnt,8)
REDIT(FRMCNT).ALIGN=5
REDIT(FRMCNT).SCROLLBARS=3
REDIT(FRMCNT).ONMOUSEDOWN=GETREDITFORMHNDLE
REDIT(FRMCNT).PARENT=SUBFORM(FRMCNT)
REDIT(FRMCNT).PLAINTEXT=1
REDIT(FRMCNT).FONT= FONT
REDIT(FRMCNT).TAG= FRMCNT
'======================================
'' HERE'S THE WHOLE TRICK !!! :
'======================================
SETWINDOWLONG CHHND, GWL_STYLE,WINDOWSTYLE
SETPARENT CHHND, ZPANEL.HANDLE  
'-------------------------------------
' instead of using the zpanel.handle 
' you can use the form.handle
' but I wanted to keep child forms captive to
' this zpanel area.
' The only other thing to do is to flash the
' caption bar to the active color
' see SUB DoCurForm
'========================================
'========================================
' need to keep track of all these windows!
CURFORMNUM=FRMCNT
CURFORM(FRMCNT)=CHHND
SUBFORM(FRMCNT).SHOW
CHKBOX(FRMCNT,2).CHECKED=1 ' this can only
'be done after form.show !!
END SUB
'
SUB FORMONSHOW
   FORM.ONRESIZE=DOFORMRESIZE
''SHOWDBUG
END SUB
'
SUB DOFORMRESIZE
   DEFINT TPW
   TPW=TOOLBAR1.WIDTH+TOOLBAR2.WIDTH
   IF TPW>FORM.CLIENTWIDTH THEN
      TOOLPANEL.HEIGHT=52
      TOOLBAR2.TOP=TOOLBAR1.HEIGHT
      TOOLBAR2.LEFT=0
   ELSE
      TOOLPANEL.HEIGHT=26
      TOOLBAR2.TOP=0
      TOOLBAR2.LEFT=TOOLBAR1.WIDTH + 3
   END IF
END SUB
'
SUB SHOWPREF
   prefform.showmodal
END SUB
'
SUB SHOWDRCTRY
   DIRFORM.SHOW
   ' don't use showmodal on captive child forms !
   DIRFORM.WINDOWSTATE=0
   IF FLGDRCTRY=0 THEN
 ' don't flash caption again after window is shown once
    FLASHWINDOW DIRFORM.HANDLE, 1'make active caption bar
    DIRFORM.HEIGHT=SIDEPANEL.HEIGHT-90
    DIRFORM.WIDTH=SIDEPANEL.WIDTH
    DIRFORM.TOP=90:DIRFORM.LEFT=0:FLGDRCTRY=1
   END IF
END SUB
'
SUB DODRCTRY
   DIRFORM.CAPTION=DIRTREE.DIRECTORY
END SUB
'
SUB SHOWCONFIG
   IF FLGCONFIG=0 THEN
' don't flash caption again after window is shown once
      FLASHWINDOW CONFIGFORM.HANDLE, 1
      CONFIGFORM.TOP=0:CONFIGFORM.LEFT=0:FLGCONFIG=1
   END IF
   CONFIGFORM.SHOW ' don't use showmodal on captive child forms
END SUB
'
SUB CLOSECONFIG
   CONFIGFORM.CLOSE
END SUB
'
SUB DOTOOLBTN(SENDER AS QCOOLBTN)
   SHOWMESSAGE "TOOL BAR BUTTON " & SENDER.CAPTION
END SUB
'
SUB MENURESTORE
   DEFINT SX
   TRACKWINDOWS
   FOR SX= 1 TO MAXFRMS
      IF FORMTRACK(SX)=1 THEN SUBFORM(SX).WINDOWSTATE=0
      DOEVENTS
   NEXT
END SUB
'
SUB MENUMINALL
   DEFINT SX
   TRACKWINDOWS
   FOR SX= 1 TO FRMCNT
      IF FORMTRACK(SX)=1 THEN SUBFORM(SX).WINDOWSTATE=1
   NEXT
END SUB
'
SUB MENUCASCADE
   DEFINT SX , WN ,DV ,DH   : WN=0
   TRACKWINDOWS
' Bill K's Cascade Algorithm:
   DV=(ZPANEL.HEIGHT*.75)/TW: IF DV>36 THEN DV=36
   DH=(ZPANEL.WIDTH*.75)/TW: IF DH>36 THEN DH=36
   FOR SX= 1 TO FRMCNT
      IF FORMTRACK(SX)=1 THEN
         INC(WN)
         SUBFORM(SX).TOP=(WN-1)*DV
         SUBFORM(SX).LEFT=(WN-1)*DH
         SUBFORM(SX).WIDTH=ZPANEL.WIDTH * .80
         SUBFORM(SX).HEIGHT=ZPANEL.HEIGHT * .80
         SUBFORM(SX).WINDOWSTATE=0
         SUBFORM(SX).SHOW
         DOEVENTS
      END IF
   NEXT
END SUB
'
SUB MENUTILE
   DEFINT SX , ROWS,COLS   : ROWS=0:COLS=0
   TRACKWINDOWS
' Bill K's Tiling Algorithm:
   COLS=INT(TW^.5)
   IF COLS * 160 > ZPANEL.WIDTH THEN
      COLS = INT(ZPANEL.WIDTH/ 160)
   END IF
   ROWS = INT(TW / COLS)
' prefer wider forms so increase no. of rows
   IF TW MOD COLS THEN INC(ROWS)
   DEFINT RN,CN,FORMHT  ,FORMWD
   FORMHT=ZPANEL.HEIGHT/ROWS
   FORMWD=ZPANEL.WIDTH/COLS
   RN=1:SX=0
   DO ' start rows
      CN=1
      DO ' columns for each row
         INC(SX) ' form number
         IF SX>FRMCNT THEN
' take up any extra space by widening last form
            SUBFORM(SX-1).WIDTH=ZPANEL.WIDTH _
              -SUBFORM(SX-1).LEFT
            EXIT SUB
         END IF
         IF FORMTRACK(SX)=1 THEN
            SUBFORM(SX).TOP=(RN-1)*FORMHT
            SUBFORM(SX).WIDTH=FORMWD
            SUBFORM(SX).HEIGHT=FORMHT
            SUBFORM(SX).LEFT=(CN-1)*FORMWD
            SUBFORM(SX).WINDOWSTATE=0
            DOEVENTS
            INC(CN)
            IF CN>COLS THEN EXIT DO
         END IF
      LOOP
      INC(RN):IF RN>ROWS THEN EXIT DO
   LOOP
END SUB
'
SUB MENUCLOSE
   DEFINT SX
   FOR SX= 1 TO FRMCNT
      SUBFORM(SX).CLOSE
   NEXT
END SUB
'
SUB chkboxwrap(sender AS qcheckbox)
   CURFORMNUM=SENDER.TAG
   SUBFORM(CURFORMNUM).SHOW
   CURFORM(CURFORMNUM)=SUBFORM(SENDER.TAG).HANDLE:DOCURFORM
   DEFLNG XY
   XY=REDIT(SENDER.TAG).SELSTART
   IF CHKBOX(CURFORMNUM,2).CHECKED=1 THEN
      REDIT(SENDER.TAG).WORDWRAP=1
   ELSE
      REDIT(SENDER.TAG).WORDWRAP=0
   END IF
   REDIT(SENDER.TAG).SELSTART=XY
END SUB
'
SUB SETACCESS(SENDER AS QCHECKBOX)
   CURFORMNUM=SENDER.TAG
   SUBFORM(CURFORMNUM).SHOW
   CURFORM(CURFORMNUM)=SUBFORM(SENDER.TAG).HANDLE:DOCURFORM
   SETFOCUS(REDIT(SENDER.TAG).HANDLE)
   IF CHKBOX(CURFORMNUM,1).CHECKED=1 THEN
      REDIT(SENDER.TAG).READONLY=1
      REDIT(SENDER.TAG).COLOR=15921906
   ELSE
      REDIT(SENDER.TAG).READONLY=0
      REDIT(SENDER.TAG).COLOR=16777215
   END IF
END SUB
'
SUB MENUSHOWWND(ITEM)
   CURFORMNUM=ITEM.TAG
   SUBFORM(CURFORMNUM).SHOW
   SUBFORM(CURFORMNUM).WINDOWSTATE=0
   CURFORM(CURFORMNUM)=SUBFORM(ITEM.TAG).HANDLE:DOCURFORM
END SUB
'
SUB GETPANELFORMHNDLE(SENDER AS QPANEL)
   CURFORMNUM=SENDER.TAG
   SUBFORM(CURFORMNUM).SHOW
   CURFORM(CURFORMNUM)=SUBFORM(SENDER.TAG).HANDLE:DOCURFORM
END SUB
'
SUB GETREDITFORMHNDLE(BUTTON%, X%, Y%, SHIFT%,_
    SENDER AS QRICHEDIT)
   CURFORMNUM=SENDER.TAG
   SUBFORM(CURFORMNUM).SHOW
   CURFORM(CURFORMNUM)=SUBFORM(SENDER.TAG).HANDLE:DOCURFORM
   IF BUTTON%=1 THEN REDITPOP(SENDER.TAG)._
     POPUP(SCREEN.MOUSEX,SCREEN.MOUSEY)
END SUB
'
SUB DoPopRedit(SENDER AS QMENUITEM)
   SELECT CASE SENDER.CAPTION
      CASE "Cu&t"
         redit(sender.tag).CutToClipboard
      CASE "&Copy"
         redit(sender.tag).CopyToClipboard
      CASE "&Paste"
         redit(sender.tag).PasteFromClipboard
      CASE "&Delete"
         redit(sender.tag).seltext=""
      CASE "Select &All"
         redit(sender.tag).selectall
      CASE "&Undo"
			SENDMESSAGE redit(sender.tag).Handle, &H304, 0, 0
      CASE ELSE
   END SELECT
END SUB
'
SUB DOTREEVIEW
DEFSTR tvtxt
tvtxt=treeview.item(treeview.itemindex).text
SELECT CASE ucase$(tvtxt)
   CASE "CONFIG"
      SHOWCONFIG
   CASE "PREF"
      SHOWPREF
   CASE "DIRECTORY"
      SHOWDRCTRY
   END SELECT
   IF chkbox(curformnum,1).checked THEN EXIT SUB'readonly
   SELECT CASE ucase$(tvtxt)
      CASE "SHOWCONFIG"
         IF curformnum>0 THEN
            subform(curformnum).show
            REDIT(curformnum).SELTEXT= _
            "SUB SHOWCONFIG" + CRLF +_
            "CONFIGFORM.SHOW" + CRLF + "END SUB" + CRLF
         END IF
      CASE "SHOWPREF"
         IF curformnum>0 THEN
            subform(curformnum).show
            REDIT(curformnum).SELTEXT= _
               "SUB SHOWPREF" + CRLF + _
            "PREFFORM.SHOW" + CRLF + "END SUB" + CRLF
         END IF
      CASE "GETFOCUS"
         IF curformnum>0 THEN
            subform(curformnum).show
            REDIT(curformnum).SELTEXT= "DECLARE _
              FUNCTION GetFocus LIB " &_
              QT & "user32" & QT & " ALIAS " _
              & QT & "GetFocus" & QT & " () _
                AS LONG" + CRLF
         END IF
      CASE "GETWINDOWLONG"
         IF curformnum>0 THEN
            subform(curformnum).show
            REDIT(curformnum).SELTEXT= "DECLARE _
                FUNCTION GetWindowLong Lib " & _
            QT & "user32" & QT & " Alias " & _
                     QT & "GetWindowLongA" & QT &_
            " (hwnd As Long, nIndex As Long) As _
                      Long" + CRLF
         END IF
      CASE "SETPARENT"
         IF curformnum>0 THEN
            subform(curformnum).show
            REDIT(curformnum).SELTEXT= _
           "DECLARE FUNCTION SetParent Lib " & QT &_
            "user32" & QT & " Alias " & QT & _
               "SetParent"  & QT &_
            " (hWndChild As Long, hWndNewParent _
             As Long) As Long" + CRLF
         END IF
      CASE ELSE
   END SELECT
END SUB
'
SUB DoOpen(Sender)
CURFORMNUM=sender.tag
subform(curformnum).show
curform(curformnum)=SUBFORM(sender.tag).handle:docurform
setfocus(redit(sender.tag).handle)
ISNEW=0
menuOpen
winitem(curformnum).caption=right$(filename,_
      len(filename)-rinstr(filename,"\"))
ISNEW=1
END SUB
'
SUB menuOpen
   DIM OpenDialog AS QOPENDIALOG
   IF OpenDialog.Execute THEN
      FileName = OpenDialog.FileName
      IF ISNEW THEN menuNew  'will use 
         'old closed forms if available
      Redit(Curformnum).LoadFromFile FileName		
      subform(CURFORMNUM).caption=right$(filename,_
      len(filename)-rinstr(filename,"\"))
      Redit(Curformnum).Selstart=1
      Redit(Curformnum).Modified=0
   end if
END SUB
'
SUB TRACKWINDOWS
   DEFINT sx
   FOR sx= 1 TO maxfrms
      IF IsWindowVisible(subform(sx).handle) THEN
         formtrack(sx)=1
      ELSE
         formtrack(sx)=0
      END IF
   NEXT
   tw=0
   FOR SX=1 TO frmcnt
      IF formtrack(sx)=1 THEN
         INC(tw)
         STATS(SX).PANEL(0).CAPTION=_
         STR$(REdit(SX).WhereY+1)+" : "_
                +STR$(REdit(SX).WhereX+1)
   ' with wordwrap on we have a different line count
   ' when long lines are wrapped during a window resize
         STATS(SX).PANEL(1).CAPTION="Tot.Lines:"_
           & STR$(REDIT(SX).LINECOUNT)
      END IF
   NEXT
END SUB
'
SUB docurform
   DEFINT x
   zstatus.panel(3).caption=" Cur. Form Hnd= "_
   & str$(CurForm(CURFORMNUM)) & "   Cur. Form _
    Num= " & str$(CURFORMNUM)
   setfocus(redit(CURFORMNUM).handle)
   FLASHWINDOW CurForm(CURFORMNUM), 1
   FLASHWINDOW PrevForm, 1
   prevForm=CurForm(CURFORMNUM)
END SUB
'
SUB getform
   DEFINT x ,y ,zz :zz=0
   TRACKWINDOWS
   IF tw=0 THEN
      mnuwin.enabled=0
   ELSE
      mnuwin.enabled=1
   END IF
   treeview.hint=treeview.item_
        (treeview.itemindex).text &_
        "  Index " & str$(treeview.itemindex)
   IF ptw<>tw THEN ' don't do this unless needed
      ptw=tw  ' previous no. of windows is now tw
      zstatus.panel(2).caption=str$(tw) & " Forms"
      zstatus.panel(0).caption=str$(frmcnt)
      zstatus.panel(1).caption=""
      FOR X=1 TO FRMCNT
         IF MENUARRAY(x)=1 THEN
            mnuwin.DelItems(winitem(x))
         END IF
         MENUARRAY(x)=0
      NEXT
      FOR x=1 TO frmcnt
         IF formtrack(x)=1 THEN
            inc(zz)
				winitem(zz).caption=subform(x).caption
            winitem(zz).tag=x
            winitem(zz).ONCLICK=menushowwnd
            mnuwin.AddItems(winitem(zz))
            MENUARRAY(zz)=1
         END IF
      NEXT
   END IF
END SUB
'
SUB closeme
   application.terminate
END SUB
'
'============FUNCTIONS=============
FUNCTION CHECKFOROLD
   TRACKWINDOWS
   DEFINT SX ,CHKFOROLD
   CHKFOROLD=0:SX=0
   IF FRMCNT>0 THEN
      WHILE CHKFOROLD=0
         INC(SX):IF SX >FRMCNT THEN EXIT WHILE
         IF formtrack(sx)=0 THEN
            REDIT(SX).TEXT=""
				CHKBOX(SX,1).CHECKED=0
				CHKBOX(SX,2).CHECKED=1				
            subform(SX).caption="Untitled " & str$(SX)
            SUBFORM(SX).show
            CURFORMNUM=sx
            curform(curformnum)=_
              SUBFORM(sx).handle:docurform
            CHKFOROLD=1
         END IF
      WEND
   END IF
   CHECKFOROLD=CHKFOROLD
END FUNCTION
'
'{===================INITIALIZE CODE===================
DIM TBTN(TOOLBAR1.WIDTH/50 + TOOLBAR2.WIDTH/50) _
    AS QCOOLBTN
FOR GX=0 TO TOOLBAR1.WIDTH/50 - 1
   TBTN(GX).PARENT=TOOLBAR1
   TBTN(GX).TOP=0
   TBTN(GX).LEFT=GX * 50
   TBTN(GX).WIDTH=50
   TBTN(GX).SHOWHINT=1
   TBTN(GX).HINT="TBTN" & STR$(Gx+1)
   TBTN(GX).CAPTION="TBTN" & STR$(Gx+1)
   TBTN(GX).FLAT=1
   TBTN(GX).ONCLICK=DOTOOLBTN
NEXT
FOR GX=0 TO TOOLBAR2.WIDTH/50 - 1
   TBTN(GX + TOOLBAR2.WIDTH/50+2).PARENT=TOOLBAR2
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).TOP=0
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).LEFT=GX * 50
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).WIDTH=50
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).SHOWHINT=1
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).HINT=_
      "TBTN" & STR$(Gx+ TOOLBAR2.WIDTH/50+3)
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).CAPTION=_
      "TBTN" & STR$(Gx+ TOOLBAR2.WIDTH/50+3)
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).FLAT=1
   TBTN(GX+ TOOLBAR2.WIDTH/50+2).ONCLICK=DOTOOLBTN
NEXT
TBTN(0).CAPTION="CONFIG"
TBTN(1).CAPTION="PREF"
TBTN(2).CAPTION="DCTY"
TBTN(0).HINT="Open Configuration"
TBTN(1).HINT="Open Preferences"
TBTN(2).HINT="Open Directory"
TBTN(0).ONCLICK=SHOWCONFIG
TBTN(1).ONCLICK=SHOWPREF
TBTN(2).ONCLICK=SHOWDRCTRY
'
' Make these two QForms Captive Child Windows
SetWindowLong Configform.Handle, Gwl_style,Windowstyle
SetParent Configform.Handle , Form.Handle
SetWindowLong Dirform.Handle, Gwl_style,Windowstyle
SetParent Dirform.Handle , Sidepanel.Handle
' Prevent The Nasty Hanging Default Treeview Hints
' So I Can Use My Own That Don't Hang :
SetWindowLong(TreeView.Handle, Gwl_style, _
   Getwindowlong(Treeview.Handle, Gwl_style) _
   Or Tvs_notooltips)
'For Main Form Minimizing Properly To Taskbar
SetWindowLong FORM.HANDLE, -8, 0
SetWindowLong application.HANDLE, -8, FORM.HANDLE
'----------------
FORM.SHOWMODAL
' that's all-------
