S" SAMPLES\PROCESS.TXT" INCLUDED

WINAPI: SetClassLongA           USER32.DLL
WINAPI: MessageBoxA             USER32.DLL
WINAPI: DialogBoxIndirectParamA USER32.DLL
WINAPI: EndDialog               USER32.DLL
WINAPI: SetDlgItemTextA         USER32.DLL
WINAPI: GetDlgItem              USER32.DLL
WINAPI: GetDlgCtrlID            USER32.DLL
WINAPI: SendMessageA            USER32.DLL
WINAPI: SetWindowTextA          USER32.DLL
WINAPI: InitCommonControls      COMCTL32.DLL
WINAPI: LoadImageA              USER32.DLL
WINAPI: ImageList_Create        COMCTL32.DLL
WINAPI: ImageList_AddIcon       COMCTL32.DLL
WINAPI: CreateToolbarEx         COMCTL32.DLL
WINAPI: FreeConsole             KERNEL32.DLL
WINAPI: CheckDlgButton          USER32.DLL
WINAPI: IsDlgButtonChecked      USER32.DLL
WINAPI: SetCurrentDirectoryA    KERNEL32.DLL
WINAPI: GetCurrentDirectoryA    KERNEL32.DLL
WINAPI: CreateDirectoryA        KERNEL32.DLL

: #define
  CREATE 0 0 BL WORD COUNT
  >NUMBER DUP IF 1- SWAP 1+ SWAP >NUMBER THEN 2DROP D>S ,
  DOES> @
;
HEX
IMAGE-BASE CONSTANT HINST  \ Instance  
       0 CONSTANT HCON     \ hwnd   

\  
  CF0000 CONSTANT WS_OVERLAPPEDWINDOW
10000000 CONSTANT WS_VISIBLE
80000000 CONSTANT WS_POPUP
  800000 CONSTANT WS_BORDER
40000000 CONSTANT WS_CHILD
00C00000 CONSTANT WS_CAPTION
00080000 CONSTANT WS_SYSMENU
00010000 CONSTANT WS_TABSTOP
00020000 CONSTANT WS_GROUP
00040000 CONSTANT WS_SIZEBOX
00100000 CONSTANT WS_HSCROLL
00200000 CONSTANT WS_VSCROLL
      80 CONSTANT DS_MODALFRAME
      40 CONSTANT DS_SETFONT
      80 CONSTANT ES_AUTOHSCROLL
      40 CONSTANT ES_AUTOVSCROLL
    0001 CONSTANT ES_CENTER
    0000 CONSTANT ES_LEFT
    0004 CONSTANT ES_MULTILINE
    0800 CONSTANT ES_READONLY
    0002 CONSTANT ES_RIGHT
    1000 CONSTANT ES_WANTRETURN

\ messages
     111 CONSTANT WM_COMMAND
     110 CONSTANT WM_INITDIALOG
    004E CONSTANT WM_NOTIFY
      0F CONSTANT WM_PAINT
#define WM_CONTEXTMENU                  0x007B
#define WM_GETTEXT                      0x000D


0 CONSTANT NM_FIRST
-1 CONSTANT NM_OUTOFMEMORY          ( NM_FIRST-1)
-2 CONSTANT NM_CLICK                ( NM_FIRST-2)
-3 CONSTANT NM_DBLCLK               ( NM_FIRST-3)
-4 CONSTANT NM_RETURN               ( NM_FIRST-4)
-5 CONSTANT NM_RCLICK               ( NM_FIRST-5)
-6 CONSTANT NM_RDBLCLK              ( NM_FIRST-6)
-7 CONSTANT NM_SETFOCUS             ( NM_FIRST-7)
-8 CONSTANT NM_KILLFOCUS            ( NM_FIRST-8)

\ -----------
#define MB_ICONEXCLAMATION          0x00000030
       1 CONSTANT IDOK
       2 CONSTANT IDCANCEL
0080 CONSTANT DI_Button 
0081 CONSTANT DI_Edit 
0082 CONSTANT DI_Static 
0083 CONSTANT DI_Listbox 
0084 CONSTANT DI_Scrollbar 
0085 CONSTANT DI_Combobox

        0010 CONSTANT LR_LOADFROMFILE
#define LR_LOADTRANSPARENT  0x0020
        0080 CONSTANT LR_LOADREALSIZE

           0 CONSTANT IMAGE_BITMAP
           1 CONSTANT IMAGE_ICON
           1 CONSTANT ILC_MASK

#define DS_3DLOOK           0x0004
#define DS_FIXEDSYS         0x0008
#define DS_NOFAILCREATE     0x0010
#define DS_CONTROL          0x0400
#define DS_CENTER           0x0800
#define DS_CENTERMOUSE      0x1000
#define DS_CONTEXTHELP      0x2000
#define WS_MINIMIZEBOX      0x00020000
#define WS_MAXIMIZEBOX      0x00010000

1000 CONSTANT LVM_FIRST
1100 CONSTANT TV_FIRST

        0001 CONSTANT TVS_HASBUTTONS
        0004 CONSTANT TVS_LINESATROOT
        0002 CONSTANT TVS_HASLINES
#define LVS_ICON                0x0000
#define LVS_REPORT              0x0001
#define LVS_SMALLICON           0x0002
#define LVS_LIST                0x0003
#define LVS_TYPEMASK            0x0003
#define LVS_SINGLESEL           0x0004
#define LVS_SHOWSELALWAYS       0x0008
#define LVS_SORTASCENDING       0x0010
#define LVS_SORTDESCENDING      0x0020
#define LVS_SHAREIMAGELISTS     0x0040
#define LVS_NOLABELWRAP         0x0080
#define LVS_AUTOARRANGE         0x0100
#define LVS_EDITLABELS          0x0200
#define LVS_NOSCROLL            0x2000

#define LVCF_FMT                0x0001
#define LVCF_WIDTH              0x0002
#define LVCF_TEXT               0x0004
#define LVCF_SUBITEM            0x0008

#define LVCFMT_LEFT             0x0000
#define LVCFMT_RIGHT            0x0001
#define LVCFMT_CENTER           0x0002
#define LVCFMT_JUSTIFYMASK      0x0003

#define LVIF_TEXT               0x0001
#define LVIF_IMAGE              0x0002
#define LVIF_PARAM              0x0004
#define LVIF_STATE              0x0008

#define LVSIL_NORMAL            0
#define LVSIL_SMALL             1
#define LVSIL_STATE             2

#define TVIS_EXPANDEDONCE       0x0040

#define EM_GETSEL               0x00B0
#define EM_SETSEL               0x00B1
#define EM_GETRECT              0x00B2
#define EM_SETRECT              0x00B3
#define EM_SETRECTNP            0x00B4
#define EM_SCROLL               0x00B5
#define EM_LINESCROLL           0x00B6
#define EM_SCROLLCARET          0x00B7
#define EM_GETMODIFY            0x00B8
#define EM_SETMODIFY            0x00B9
#define EM_GETLINECOUNT         0x00BA
#define EM_LINEINDEX            0x00BB
#define EM_SETHANDLE            0x00BC
#define EM_GETHANDLE            0x00BD
#define EM_GETTHUMB             0x00BE
#define EM_LINELENGTH           0x00C1
#define EM_REPLACESEL           0x00C2
#define EM_GETLINE              0x00C4
#define EM_LIMITTEXT            0x00C5
#define EM_CANUNDO              0x00C6
#define EM_UNDO                 0x00C7
#define EM_FMTLINES             0x00C8
#define EM_LINEFROMCHAR         0x00C9
#define EM_SETTABSTOPS          0x00CB
#define EM_SETPASSWORDCHAR      0x00CC
#define EM_EMPTYUNDOBUFFER      0x00CD
#define EM_GETFIRSTVISIBLELINE  0x00CE
#define EM_SETREADONLY          0x00CF
#define EM_SETWORDBREAKPROC     0x00D0
#define EM_GETWORDBREAKPROC     0x00D1
#define EM_GETPASSWORDCHAR      0x00D2
#define EM_SETMARGINS           0x00D3
#define EM_GETMARGINS           0x00D4
#define EM_SETLIMITTEXT         0x00C5
#define EM_GETLIMITTEXT         0x00D5
#define EM_POSFROMCHAR          0x00D6
#define EM_CHARFROMPOS          0x00D7

#define TBSTATE_CHECKED         0x01
#define TBSTATE_PRESSED         0x02
#define TBSTATE_ENABLED         0x04
#define TBSTATE_HIDDEN          0x08
#define TBSTATE_INDETERMINATE   0x10
#define TBSTATE_WRAP            0x20

#define TBSTYLE_BUTTON          0x00
#define TBSTYLE_SEP             0x01
#define TBSTYLE_CHECK           0x02
#define TBSTYLE_GROUP           0x04

#define TBSTYLE_TOOLTIPS        0x0100
#define TBSTYLE_WRAPABLE        0x0200
#define TBSTYLE_ALTDRAG         0x0400

#define TVGN_CARET              0x0009

#define TVE_COLLAPSE            0x0001
#define TVE_EXPAND              0x0002
#define TVE_TOGGLE              0x0003
#define TVE_COLLAPSERESET       0x8000

#define BS_AUTOCHECKBOX     0x00000003L

FFFF0000 CONSTANT TVI_ROOT
FFFF0001 CONSTANT TVI_FIRST
FFFF0002 CONSTANT TVI_LAST
FFFF0003 CONSTANT TVI_SORT
        0001 CONSTANT TVIF_TEXT
        0002 CONSTANT TVIF_IMAGE
        0004 CONSTANT TVIF_PARAM
        0008 CONSTANT TVIF_STATE
        0010 CONSTANT TVIF_HANDLE
        0020 CONSTANT TVIF_SELECTEDIMAGE
        0040 CONSTANT TVIF_CHILDREN

\ --------------------------------------------------------
\ *******       
0
4 -- DLGTEMPLATE.style
4 -- DLGTEMPLATE.dwExtendedStyle
2 -- DLGTEMPLATE.cdit
2 -- DLGTEMPLATE.x
2 -- DLGTEMPLATE.y
2 -- DLGTEMPLATE.cx
2 -- DLGTEMPLATE.cy
CONSTANT /DLGTEMPLATE

0
4 -- DLGITEMTEMPLATE.style
4 -- DLGITEMTEMPLATE.dwExtendedStyle
2 -- DLGITEMTEMPLATE.x
2 -- DLGITEMTEMPLATE.y
2 -- DLGITEMTEMPLATE.cx
2 -- DLGITEMTEMPLATE.cy
2 -- DLGITEMTEMPLATE.id
CONSTANT /DLGITEMTEMPLATE

: DIALOG: ( x y cx cy cdit style "name" -- )
  CREATE HERE 0 ,
  HERE 7 + 8 / 8 * HERE - ALLOT
  HERE SWAP !
  HERE DUP >R /DLGTEMPLATE DUP ALLOT ERASE
  R@ DLGTEMPLATE.style !
  R@ DLGTEMPLATE.cdit W!
  R@ DLGTEMPLATE.cy W!
  R@ DLGTEMPLATE.cx W!
  R@ DLGTEMPLATE.y W!
  R> DLGTEMPLATE.x W!
  0 W, \ menu  (no menu)
  0 W, \ class (def)
  0 W, \ title (no title)
  8 W,
;

: L" ( "ccc" -- ) \ *******    UNICODE
  [CHAR] " PARSE
  0 ?DO DUP I + C@ W, LOOP DROP 0 W,
;
: DIALOGITEM ( x y cx cy id style class -- ) \ *******  
  >R
  HERE DUP >R /DLGITEMTEMPLATE DUP ALLOT ERASE
  R@ DLGITEMTEMPLATE.style !
  R@ DLGITEMTEMPLATE.id W!
  R@ DLGITEMTEMPLATE.cy W!
  R@ DLGITEMTEMPLATE.cx W!
  R@ DLGITEMTEMPLATE.y W!
  R> DLGITEMTEMPLATE.x W!
  -1 W, R> W, \ class
  0 W,             \ title (initial text)
  0 ,             \ creation data
;
\ -----------------    ------------------------------
DECIMAL
0
1 + DUP CONSTANT 
1 + DUP CONSTANT 
1 + DUP CONSTANT 
1 + DUP CONSTANT 
1 + DUP CONSTANT 
CONSTANT 

0 0 155 90 
DS_MODALFRAME  WS_POPUP OR  WS_VISIBLE OR  WS_CAPTION OR  WS_SYSMENU OR
DS_SETFONT OR DS_CENTER OR
WS_MINIMIZEBOX OR
DIALOG: DLG
L" MS Sans Serif" 0 W,  (  204 W,)

5 5 145 40 
WS_VISIBLE WS_CHILD OR ES_CENTER OR
DI_Static DIALOGITEM

5 50 125 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR WS_BORDER OR
ES_MULTILINE OR ES_AUTOHSCROLL OR
DI_Edit DIALOGITEM

5 70 50 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR
DI_Button DIALOGITEM

100 70 50 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR
DI_Button DIALOGITEM

135 50 15 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR
DI_Button DIALOGITEM

\ ---------------------------  
0 VALUE 
0 VALUE 

:  ( id -- hwnd )
   GetDlgItem 
;
: ID ( hwnd -- id )
  GetDlgCtrlID
;
:  ( lparam wparam msg id -- lresult )
   SendMessageA
;
\ ----------  Notification Messages ------
0
4 -- NMHDR.hwndFrom
4 -- NMHDR.idFrom
4 -- NMHDR.code
CONSTANT /NMHDR

0
4 -- POINT.x
4 -- POINT.y
CONSTANT /POINT

0
/NMHDR -- LV_KEYDOWN.hdr
     2 -- LV_KEYDOWN.wVKey
     4 -- LV_KEYDOWN.flags
CONSTANT /LV_KEYDOWN

\ ---------------------------------------------------------------------------

HEX
#define OFN_NOCHANGEDIR              0x00000008
#define OFN_CREATEPROMPT             0x00002000
#define OFN_EXPLORER                 0x00080000
DECIMAL

0
4 -- OF.lStructSize
4 -- OF.hwndOwner
4 -- OF.hInstance
4 -- OF.lpstrFilter
4 -- OF.lpstrCustomFilter
4 -- OF.nMaxCustFilter
4 -- OF.nFilterIndex
4 -- OF.lpstrFile
4 -- OF.nMaxFile
4 -- OF.lpstrFileTitle
4 -- OF.nMaxFileTitle
4 -- OF.lpstrInitialDir
4 -- OF.lpstrTitle
4 -- OF.Flags
2 -- OF.nFileOffset
2 -- OF.nFileExtension
4 -- OF.lpstrDefExt
4 -- OF.lCustData
4 -- OF.lpfnHook
4 -- OF.lpTemplateName
CONSTANT /OPENFILENAME
 
: S, ( addr u -- )
  HERE SWAP DUP ALLOT MOVE
;
CREATE O.F HERE /OPENFILENAME DUP ALLOT ERASE
/OPENFILENAME O.F OF.lStructSize !
HERE O.F OF.lpstrFilter !
S" Previous E-serv data" S, 0 C, S" *.ini" S, 0 W,
1 O.F OF.nFilterIndex !
( OFN_CREATEPROMPT) OFN_EXPLORER ( OR) OFN_NOCHANGEDIR OR O.F OF.Flags !

WINAPI: GetOpenFileNameA COMDLG32.DLL
:  ( -- flag )
  HERE 500 ERASE
  HERE O.F OF.lpstrFile ! S" E-serv.ini" HERE SWAP MOVE
  500 O.F OF.nMaxFile ! O.F GetOpenFileNameA
;
\ ---------------------------------------------------------------------------
:  ( addr u id -- )
  \           
  >R
  DROP 1 EM_REPLACESEL R>  DROP
;
:  ( id -- )
  >R 0 1 EM_SETREADONLY R>  DROP
;
:  ( id -- )
  >R 0 0 EM_SETREADONLY R>  DROP
;
\ ---------------------------------------------------------------------------

:  ( c-addr u id -- )
  NIP  SetDlgItemTextA DROP
;
:  ( c-addr u id -- )
  >R
  R/O OPEN-FILE THROW >R
  HERE 10000 R@ READ-FILE THROW HERE + 0!
  R> CLOSE-FILE THROW
  HERE 10000 R> 
;
: 
  DROP  SetWindowTextA DROP
;
: GetText ( id -- )
  >R TIB C/L WM_GETTEXT R>  #TIB ! >IN 0!
  0 SOURCE + C!
;

\ ---------------------------------------------------------------------------------
\    Windows    CASE-
VARIABLE FILE
VARIABLE INI
VOCABULARY Windows

: M: ( "WM_..." -- )
  \   
  BASE @ >R HEX
  ' EXECUTE 0 <# [CHAR] m HOLD # # # #  # # # # BL HOLD [CHAR] : HOLD #>
  EVALUATE
  R> BASE !
;
: C:
  BASE @ >R HEX
  ' EXECUTE 0 <# #S [CHAR] c HOLD BL HOLD [CHAR] : HOLD #>
  EVALUATE
  R> BASE !
;
:  ( lparam wparam uint=msg hwnd wid -- TRUE | -"- FALSE )
  \     
  >R
  BASE @ >R HEX
  OVER 0 <# [CHAR] m HOLD # # # #  # # # # #>
  R> BASE !
  R> SEARCH-WORDLIST
  IF EXECUTE  ELSE FALSE THEN
;
VARIABLE 
: 
  DROP
  MB_ICONEXCLAMATION S" " DROP
  ROT  MessageBoxA DROP
;
:  ( ERRNO -- )
  >R S"         "
  OVER 24 + DUP 4 BL FILL
  R> 0
  BASE @ >R HEX <# # # # # #> R> BASE !
  ROT SWAP MOVE
  
;
CREATE TEXT  S" E-serv Mail and News Server v1.1s1" S, 13 C, 10 C,
S" for Windows NT4 and Windows 95" S, 13 C, 10 C, 13 C, 10 C, 
S" To setup E-serv select the destination folder and click Install" S, 0 C,

: CreateFolder ( "TIB=PATH" -- flag )
  BEGIN
    [CHAR] \ WORD COUNT
    ?DUP IF OVER + [CHAR] \ SWAP ! DUP SetCurrentDirectoryA 0=
            IF 0 OVER CreateDirectoryA
               IF SetCurrentDirectoryA
                  IF FALSE ELSE FALSE EXIT THEN
               ELSE DROP FALSE EXIT THEN
            ELSE DROP FALSE THEN
         ELSE DROP TRUE EXIT THEN
  UNTIL FALSE
;
\ ----------------------------------------------------------------------------------
\   
VARIABLE INSTALL
: INSTALL-PREP
     S" E-SERV.INI" R/O OPEN-FILE
     IF DROP
       S" E-SERV.INI" R/W CREATE-FILE THROW >R
       INI @ FILE @ OVER - R@ WRITE-FILE THROW
       R> CLOSE-FILE THROW
     ELSE CLOSE-FILE THROW THEN
     S" $E-SERV$.TMP" R/W CREATE-FILE THROW >R
     FILE @ HERE OVER - R@ WRITE-FILE THROW
     R> CLOSE-FILE THROW
     TRUE INSTALL !
;
ALSO Windows DEFINITIONS

C: IDCANCEL
    EndDialog ( true ) DROP
;
C: 
    GetText TIB SetCurrentDirectoryA
   IF INSTALL-PREP
   ELSE  GetText CreateFolder
        IF  GetText TIB SetCurrentDirectoryA
           IF INSTALL-PREP
           ELSE S" Can't install to this folder!"  THEN
        ELSE S" Can't create folder!"  THEN
   THEN
    EndDialog DROP
;
C: 
   
   IF HERE ASCIIZ> +
      BEGIN
        1- DUP C@ [CHAR] \ = OVER HERE = OR
        IF 0 SWAP C! TRUE ELSE FALSE THEN
      UNTIL
      HERE ASCIIZ>  
   THEN
;

M: WM_COMMAND ( lparam wparam uint=msg hwnd -- TRUE )
   BASE @ >R HEX 2>R
   DUP 0 <# #S [CHAR] c HOLD #> ALSO Windows CONTEXT @ PREVIOUS
   SEARCH-WORDLIST
   IF >R 2DROP R> 2R> 2DROP R> BASE ! EXECUTE TRUE
   ELSE 2R> R> BASE ! FALSE THEN
;

M: WM_INITDIALOG ( lparam wparam uint=msg hwnd -- TRUE )
   TO  DROP 2DROP

   S" Install"          
   S" Cancel"       
   S" ..."      
   HERE 500 GetCurrentDirectoryA HERE SWAP  
   TEXT ASCIIZ>  
\   S" ICO\BOOKS04.ICO" LOAD-ICON16 -14  SetClassLongA DROP
   S" Install"   
   TRUE
;

PREVIOUS DEFINITIONS
\ ---------------------------------------------------------------------

: (DlgWndProc)     ( lparam wparam uint hwnd -- flag )
  \   

  DUP TO 
  S0 @ >R SP@ 4 CELLS + S0 !

  ALSO Windows CONTEXT @ PREVIOUS
  [']  CATCH ?DUP

  IF 
     DROP 2DROP 2DROP 0
  ELSE IF 1 ELSE 2DROP 2DROP 0 THEN THEN
  R> S0 !
;

' (DlgWndProc) WNDPROC: DlgWndProc

VARIABLE 

\ ---------------------------------------------------------------------
: T
  1000 ALLOCATE THROW TO TIB
  InitCommonControls DROP
  0 ['] DlgWndProc 0 DLG @ HINST DialogBoxIndirectParamA DROP
  INSTALL @ IF
  S" $E-SERV$.TMP" start2 DROP
  S" $E-SERV$.TMP" DELETE-FILE DROP
  THEN
  BYE
;
: R
  HERE INI !
  S" ..\E-SERV1\E-SERV.INI" R/O OPEN-FILE THROW
  DUP HERE 300000 ROT READ-FILE THROW ALLOT CLOSE-FILE THROW
  HERE FILE !
  S" ..\E-SERV1\E-SERV11.EXE" R/O OPEN-FILE THROW
  DUP HERE 300000 ROT READ-FILE THROW ALLOT CLOSE-FILE THROW
;
R TRUE TO ?GUI FALSE TO ?CONSOLE ' T DUP MAINX ! TO <MAIN> S" E-serv11s1E.exe" SAVE
