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