HTBasic Help
×
Menu
Index

Example: String Editor

 
10     ! *********************************************************************
20     ! Example: STRING Editor
30     !
40     ! This program demonstrates the use of the STRING widget as a text
50     ! editor when in MULTILINE mode.
60     !
70     ! This program does not do much error-checking. A practical program
80     ! should include more error-checking.
90     !
100   ! ******************************************************************
110   !
120   ! Variables Definitions:
130   !
140   !   S$:                                                General-purpose string
150   !   Search:                                                Text search string
160   !   F$:                                                File string
170   !   N:                                                General-purpose variable
180   !   Btn:                                                Returns button value from dialogs
190   !
200   DIM S$[256],Search$[256],F$[128]
210   INTEGER N,Btn
220   INTEGER Cursor,D(1:4)
230   !
240   ! Widget dimensions
250   !
260   INTEGER Pw,Ph,Px,Py,Iw,Ih,Sw,Sh,Sx,Sy
270   !
280   ! Variables for display scaling
290   !
300   INTEGER Dw,Dh
310   !
320   ! Get display size
330   !
340   GESCAPE CRT,3;D(*)
350   Dw=D(3)-D(1)
360   Dh=D(4)-D(2)
370   CLEAR SCREEN
380   !
390   Pw=Dw*.7                                                                ! PANEL width
400   Ph=Dh*.7                                                                ! PANEL height
410   Px=(Dw-Pw)/2                                                ! Center PANEL
420   Py=(Dh-Ph)/2
430   !
440   ! Create PANEL for STRING widget
450   !
460   ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
470   CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
480   CONTROL @Main;SET ("TITLE":" Example: String Editor")
490   CONTROL @Main;SET ("RESIZABLE":0,"SIZE CONTROL":"RESIZE CHILDREN")
500   CONTROL @Main;SET ("SYSTEM MENU":"Quit")
510   !
520   ! Build "File" menu
530   !
540   ASSIGN @File TO WIDGET "PULLDOWN MENU";PARENT @Main
550   CONTROL @File;SET ("LABEL":"File ")
560   !
570   ASSIGN @New TO WIDGET "MENU BUTTON";PARENT @File
580   CONTROL @New;SET ("LABEL":"New")
590   ASSIGN @Openfile TO WIDGET "MENU BUTTON";PARENT @File
600   CONTROL @Openfile;SET ("LABEL":"Open...")
610   ASSIGN @Savefile TO WIDGET "MENU BUTTON";PARENT @File
620   CONTROL @Savefile;SET ("LABEL":"Save")
630   ASSIGN @Merge TO WIDGET "MENU BUTTON";PARENT @File
640   CONTROL @Merge;SET ("LABEL":"Merge...")
650   !
660   ASSIGN @S1 TO WIDGET "MENU SEPARATOR";PARENT @File
670   !
680   ASSIGN @Quit TO WIDGET "MENU BUTTON";PARENT @File
690   CONTROL @Quit;SET ("LABEL":"Quit")
700   !
710   ! Build "Edit" menu
720   !
730   ASSIGN @Edit TO WIDGET "PULLDOWN MENU";PARENT @Main
740   CONTROL @Edit;SET ("LABEL":"Edit")
750   !
760   ASSIGN @Cut TO WIDGET "MENU BUTTON";PARENT @Edit
770   CONTROL @Cut;SET ("LABEL":"Cut")
780   ASSIGN @Copytext TO WIDGET "MENU BUTTON";PARENT @Edit
790   CONTROL @Copytext;SET ("LABEL":"Copy")
800   ASSIGN @Paste TO WIDGET "MENU BUTTON";PARENT @Edit
810   CONTROL @Paste;SET ("LABEL":"Paste")
820   ASSIGN @Replace TO WIDGET "MENU BUTTON";PARENT @Edit
830   CONTROL @Replace;SET ("LABEL":"Replace")
840   !
850   ASSIGN @S2 TO WIDGET "MENU SEPARATOR";PARENT @Edit
860   !
870   ASSIGN @Findline TO WIDGET "MENU BUTTON";PARENT @Edit
880   CONTROL @Findline;SET ("LABEL":"Line Number...")
890   ASSIGN @Findstr TO WIDGET "MENU BUTTON";PARENT @Edit
900   CONTROL @Findstr;SET ("LABEL":"String...")
910   !
920   ! Create and size STRING widget, set MULTILINE operation
930   !
940   ASSIGN @S TO WIDGET "STRING";PARENT @Main
950   STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
960   CONTROL @S;SET ("X":0,"Y":0,"WIDTH":Iw,"HEIGHT":Ih)
970   CONTROL @S;SET ("MULTILINE":1,"SCROLLBARS":1)
980   !
990   ! Set events
1000  !
1010  ON ERROR GOSUB Errtrap
1020  !
1030  ON EVENT @New,"ACTIVATED" GOSUB Newtext
1040  ON EVENT @Openfile,"ACTIVATED" GOSUB Getfile
1050  ON EVENT @Savefile,"ACTIVATED" GOSUB Savefile
1060  ON EVENT @Merge,"ACTIVATED" GOSUB Mergetext
1070  ON EVENT @Cut,"ACTIVATED" GOSUB Cut
1080  ON EVENT @Copytext,"ACTIVATED" GOSUB Copytext
1090  ON EVENT @Paste,"ACTIVATED" GOSUB Paste
1100  ON EVENT @Replace,"ACTIVATED" GOSUB Replace
1110  ON EVENT @Findline,"ACTIVATED" GOSUB Findline
1120  ON EVENT @Findstr,"ACTIVATED" GOSUB Findstr
1130  !
1140  ON EVENT @Quit,"ACTIVATED" GOTO Finis
1150  ON EVENT @Main,"SYSTEM MENU" GOTO Finis
1160  !
1170  CONTROL @Main;SET ("VISIBLE":1)
1180  !
1190  ! Loop and wait for input
1200  !
1210  LOOP
1220    WAIT FOR EVENT
1230  END LOOP
1240  STOP
1250  !
1260  ! ******** End of Main Program **********************
1270  !
1280  ! Error handler -- it flag errors and then bypasses the
1290  ! incorrect statement.
1300  !
1310 Errtrap: !
1320  DIALOG "ERROR",ERRM$
1330  ERROR RETURN
1340  !
1350  ! ******** Edit Routines ***************************
1360  !
1370 Newtext: !
1380  STATUS @S;RETURN ("TEXT LENGTH":N)
1390  IF N>0 THEN
1400    DIALOG "QUESTION","Do you want to clear the text?",Btn
1410    IF Btn=0 THEN CONTROL @S;SET ("VALUE":"")
1420  END IF
1430  RETURN
1440  !
1450 Getfile: !
1460  DIALOG "FILE","File to edit?",Btn;RETURN ("SELECTION":F$)
1470  IF Btn=0 THEN CONTROL @S;SET ("VALUE":"","READ FILE":FNValid_name$(F$))
1480  RETURN
1490  !
1500 Savefile: !
1510  DIALOG "FILE","Write to file?",Btn;RETURN ("SELECTION":F$)
1520  IF Btn=0 THEN CONTROL @S;SET ("WRITE FILE":FNValid_name$(F$))
1530  RETURN
1540  !
1550 Mergetext: !
1560  DIALOG "FILE","File to merge?",Btn;RETURN ("SELECTION":F$)
1570  IF Btn=0 THEN CONTROL @S;SET ("READ FILE":FNValid_name$(F$))
1580  RETURN
1590  !
1600 Cut: !
1610  CONTROL @S;SET ("CUT SELECTION":1)
1620  RETURN
1630  !
1640 Copytext: !
1650  CONTROL @S;SET ("COPY SELECTION":1)
1660  RETURN
1670  !
1680 Paste: !
1690  CONTROL @S;SET ("PASTE":1)
1700  RETURN
1710  !
1720 Replace: !
1730  CONTROL @S;SET ("DELETE SELECTION":1,"PASTE":1)
1740  RETURN
1750  !
1760 Findline: !
1770  S$="Go to what line?"
1780  T$="SHORT INTEGER"
1790  DIALOG "NUMBER",S$,Btn;SET ("FORMAT":T$),RETURN ("VALUE":N)
1800  IF Btn=0 THEN CONTROL @S;SET ("LINE NUMBER":N)
1810  RETURN
1820  !
1830 Findstr: !
1840  S$="Search for what text?"
1850  DIALOG "STRING",S$,Btn;RETURN ("VALUE":Search$)
1860  IF Btn=0 AND Search$<>"" THEN CONTROL @S;SET ("SEARCH":Search$)
1870  RETURN
1880  !
1890 Finis: !
1900  ASSIGN @Main TO *                                                ! Deletes PANEL widget
1910  CLEAR SCREEN
1920  END
1930  !
1940  DEF FNValid_name$(F$)
1950    INTEGER Colon_pos
1960    IF POS(SYSTEM$("VERSION:OS"),"HP-UX") THEN Colon_pos=POS(F$,":")
1970    IF NOT Colon_pos THEN Colon_pos=LEN(F$)+1
1980    RETURN F$[1,Colon_pos-1]
1990  FNEND