home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
500-599
/
ff597.lzh
/
IconTools
/
source
/
IconTools.f
< prev
next >
Wrap
Text File
|
1992-02-01
|
9KB
|
440 lines
\ $VER: IconTools.f 1.00 (19 Jan 1992 23:05)
\ Includes all the stuff common to the IconTools
\ Written in JForth Professional 2.0
\
\ (c) Copyright 1989, 1990, 1992 by Richard Mazzarisi.
\ All rights reserved.
\
\ address:
\ 891 Post St. #207
\ San Francisco, CA
\ 94109
\
\ email:
\ rich@californium.cchem.berkeley.edu
\ rmazz@hydrogen.cchem.berkeley.edu
\
\
\ v. 1.00 1/7/92
\ 1/13/92 moved the resource management routines to this file
\ v. 1.01 1/19/92 noticed that the icon routines in ju:icon-support which
\ are called by ju:set-icon open icon.library but
\ never close it - so do both here explicitly
\
\ *** includes ***
INCLUDE? CLONE CL:TOPFILE
INCLUDE? LIBRARIES_DOS_H JI:LIBRARIES/DOS.J
INCLUDE? LIBRARIES_DOSEXTENS_H JI:LIBRARIES/DOSEXTENS.J
INCLUDE? GRAPHICS_GFXBASE_H JI:GRAPHICS/GFXBASE.J
INCLUDE? EXEC_MEMORY_H JI:EXEC/MEMORY.J
INCLUDE? TASK-AMIGA_GRAPH JU:AMIGA_GRAPH
INCLUDE? TASK-AMIGA_EVENTS JU:AMIGA_EVENTS
INCLUDE? TASK-CONSOLESUPPORT JU:CONSOLESUPPORT
INCLUDE? TASK-ANSISUPPORT JU:ANSISUPPORT
INCLUDE? TASK-DOS-SUPPORT JU:DOS-SUPPORT
INCLUDE? TASK-SET-ICON JU:SET-ICON
INCLUDE? TASK-LOCALS JU:LOCALS
INCLUDE? TASK-AUTO_REQUEST JU:AUTO_REQUEST
\ *** clone controller ***
.NEED clone-it
VARIABLE clone-it
clone-it OFF
.THEN
ANEW task-icontools
\ *** deferred words to be defined in the actual program files
DEFER open.it-window
DEFER prt.it-instr
\ *** console stuff ***
\ variables to hold the request and reply ports
VARIABLE wreq
VARIABLE rreq
VARIABLE wreply
VARIABLE rreply
: con.cr ( -- )
wreq @ $ 0A ConPutChar()
;
: con.write ( straddr -- )
wreq @ SWAP COUNT ConWrite()
;
: con.write.c3 ( straddr -- )
\ write string in color 3
1 33 2 CRender3 wreq @ >ANSIDEVICE
con.write
0 1 CRender3 wreq @ >ANSIDEVICE
;
: con.write.itl ( straddr -- )
\ write string in bold italics
3 1 2 CRender3 wreq @ >ANSIDEVICE
con.write
0 1 CRender3 wreq @ >ANSIDEVICE
;
: clear.line ( -- )
\ clear current line
0 CDeleteLine wreq @ >ANSIDEVICE
;
: cursor.off ( -- )
\ get rid of cursor
0 CCursOff wreq @ >ANSIDEVICE
;
: prt.close-msg ( -- )
con.cr
" Click CloseBox to exit." con.write
;
\ *** main window stuff ***
NewWindow it-newwindow
CREATE scr-buff Sizeof() Screen ALLOT
: getWBscreendata ( -- )
scr-buff Sizeof() Screen WBENCHSCREEN NULL
CALL>ABS INTUITION_LIB GetScreenData NULL = IF
ABORT" Could not get Workbench screen data."
THEN
;
: set.vert-params ( topedge #lines -- topedge' height )
\ calc window height, adjust topedge if necessary
\ get font height
GRAPHICS_LIB @ >REL ..@ GB_DEFAULTFONT >REL ..@ tf_YSize
\ estimate height from #lines, title bar height and lower border
* scr-buff ..@ sc_BarHeight + 12 +
\ check if too high
2DUP + scr-buff ..@ sc_Height > IF
\ try adjusting topedge
SWAP DROP \ lose old topedge
scr-buff ..@ sc_Height OVER - DUP 0< IF
\ not going to work; set to 0 & screen height
2DROP
0 scr-buff ..@ sc_Height
ELSE
SWAP
THEN
THEN
;
: set.horiz-params ( leftedge #chars -- leftedge' width )
\ calc window width, adjust leftedge if necessary
\ get font width
GRAPHICS_LIB @ >REL ..@ GB_DEFAULTFONT >REL ..@ tf_XSize
\ estimate width from #chars, and borders
* 24 +
\ check if too wide
2DUP + scr-buff ..@ sc_Width > IF
\ try adjusting leftedge
SWAP DROP \ lose old leftedge
scr-buff ..@ sc_Width OVER - DUP 0< IF
\ not going to work; set to 0 & screen width
2DROP
0 scr-buff ..@ sc_Width
ELSE
SWAP
THEN
THEN
;
: wait.close ( -- )
BEGIN
GR-CURWINDOW @ EV.WAIT
GR-CURWINDOW @ EV.GETCLASS
CLOSEWINDOW =
UNTIL
;
\ *** resource management ***
: close.it-things ( -- )
con.cr prt.close-msg
wait.close
wreq @ 0= NOT IF
wreply @ wreq @ rreply @ rreq @ ReleaseConsole()
wreq OFF
THEN
-ICON \ close icon.library
GR.CLOSECURW
GR.TERM \ close graphics
;
: it.abort ( -- )
con.cr
close.it-things
ABORT
;
: open.it-things ( -- t/f )
\ The error messages are for debugging under the interpreter; they won't
\ be able to be seen under the workbench.
GR.INIT \ open graphics
ICON? \ open icon.library
wreq OFF
GR-CURWINDOW OFF
\ open window
open.it-window NULL = IF
ABORT" Could not open a window!"
THEN
\ make it a console
GR-CURWINDOW @ GetConsole() NULL = IF
close.it-things
ABORT" Could not create a console device!"
ELSE
rreq ! rreply ! wreq ! wreply !
cursor.off
THEN
;
\ *** string stuff ***
: init.name ( dest -- )
0 SWAP !
;
: build.name ( addr count dest -- )
\ build string in buffer at dest, must init to null with init.name before
\ using this word for the first time in building a new path name
\ check for a non null in first place
DUP @ 0= IF
\ it was just initialized so just copy
>$
ELSE
$APPEND
THEN
;
\ *** modified words from JU:SET-ICON ***
\ these must not call ?ABORT" but must use it.abort to clean up
\ (probably don't need most of the error messages but leave them for
\ debugging from the interpreter)
: it.icon-open? ( -- , just checks for 0 )
theIcon @ 0= IF
" ERROR: No Icon selected ... use GET-ICON" con.write.itl con.cr
it.abort
THEN
;
: it.abort-icon ( -- , just clear it out )
it.icon-open? theIcon @ FreeDiskObject()
theIcon OFF thestrings @ FREEBLOCK
;
: $it.get-icon ( adr-forth-string -- )
\ NOTE: do NOT include the '.info' suffix in the pathname
\ does not work for DRAWER icons under WB (see ju:set-icon)
\ this does however work with JazzBench
theIcon @ IF
" ERROR: 'theIcon' currently holds another icon."
con.write.itl con.cr
it.abort
THEN
COUNT >DOS DOS0 GetDiskObject() -DUP 0= IF
" ERROR: Can't Get the ICON file!" con.write.itl con.cr
it.abort
THEN
theIcon ! MEMF_PUBLIC 1024 ALLOCBLOCK -DUP 0= IF
" ERROR: No memory for ICON strings!" con.write.itl con.cr
it.abort
ELSE
thestrings !
THEN
;
: $it.save-icon ( adr-forth-string -- )
\ AGAIN...do not append the '.info'
it.icon-open? COUNT >DOS DOS0 theIcon @ PutDiskObject() 0= IF
" ERROR while saving DiskObject!" con.write.itl con.cr
it.abort
THEN
theIcon @ FreeDiskObject() theIcon OFF thestrings @ FREEBLOCK
;
\ *** modified words from JU:AUTO_REQUEST ***
\ want to change the dimensions and position of the requester
: 0it.auto.request ( 0body 0posi 0nega -- flag )
AR.INIT
ACTIVE-WINDOW
BODYTEXT
POSITEXT
NEGATEXT
0 0 320 60 ( these are changed )
CALL>ABS INTUITION_LIB AutoRequest
;
: $it.auto.request ( $body $posi $nega -- flag )
AR-NEGA-CHARS AR.GET.TEXT
AR-POSI-CHARS AR.GET.TEXT
AR-BODY-CHARS AR.GET.TEXT
AR-BODY-CHARS AR-POSI-CHARS AR-NEGA-CHARS
0it.auto.request
;
\ *** support ***
: check.WB ( -- )
\ check if running under WorkBench?
WBMESSAGE @ NOT IF
" Must be run under the WorkBench!" con.write.itl con.cr con.cr
prt.it-instr it.abort
THEN
;
: check.num.args ( nreq -- n t | f )
\ We need at least 'nreq' args to make any sense.
\ Returns the actual number of arguments to act on and true;
\ or false if not enough.
WBMESSAGE @ >REL ..@ sm_NumArgs DUP ROT < IF
\ not enough args; tell'em how
" Too few arguments!" con.write.itl con.cr con.cr
prt.it-instr
DROP FALSE
ELSE
1- ( 1st arg is the prog itself )
TRUE
THEN
;
: alloc.fib ( -- fib-addr )
\ allocate memory for the File Info Block
MEMF_CLEAR SizeOf() FileInfoBlock ALLOCBLOCK
DUP NULL = IF
" ERROR: Could not allocate FileInfoBlock!" con.write.itl
THEN
;
: dealloc.fib ( fib-addr -- )
\ deallocate memory for the File Info Block
DUP IF
FREEBLOCK
THEN
;
: get.parentdir { lock | fib pdirflg dirflg ok --> dirflg ok }
\ return in dirflg t if parent is a directory, f if it is disk (root) and t/f
\ obviously dirflg is useless if all is not OK
TRUE -> ok TRUE -> dirflg
alloc.fib DUP -> fib IF
\ go upward recursively
lock ParentDir() -DUP IF
DUP fib Examine() DROP
RECURSE SWAP -> pdirflg IF
fib .. fib_FileName 0COUNT PAD build.name
pdirflg IF
" /" COUNT PAD build.name
ELSE
" :" COUNT PAD build.name
THEN
ELSE
FALSE -> ok
THEN
ELSE
\ stop! reached the root dir, i.e. 'disk:'
FALSE -> dirflg
THEN
fib dealloc.fib
ELSE
FALSE -> ok
THEN
;
: remove.final.slash ( stradd -- )
\ get rid of final slash or colon on the name if there
DUP C@
OVER + C@ ASCII / = IF
DUP C@ 1- SWAP C!
ELSE
DROP
THEN
;
: ?dev_name ( stradd -- )
\ return true if name ends in a colon
DUP C@
SWAP + C@ ASCII : =
;
: get.full-path { wbarg | fib pdirflg ok --> ok }
\ full path of file is written into PAD
PAD init.name
TRUE -> ok
alloc.fib DUP -> fib IF
\ get the directory path
wbarg ..@ wa_Lock fib Examine() DROP
wbarg ..@ wa_Lock get.parentdir SWAP -> pdirflg IF
\ get directory name
fib .. fib_FileName 0COUNT PAD build.name
pdirflg IF
" /" COUNT PAD build.name
ELSE
" :" COUNT PAD build.name
THEN
\ get name
wbarg ..@ wa_Name >REL 0COUNT PAD build.name
ELSE
FALSE -> ok
THEN
fib dealloc.fib
PAD remove.final.slash
PAD ?dev_name IF
\ possibly a disk; try...
" Disk" COUNT PAD build.name
THEN
ELSE
FALSE -> ok
THEN
;