( fld )

api: FldGetTextLength
api: FldDelete
api: FldInsert

: FldDeleteAll ( fldP -- )
0 over FldGetTextLength
FldDelete ;

api: FldSetInsPtPosition
api: FldGetMaxChars

: FldCanAppend ( fldP -- n )
dup FldGetMaxChars
swap FldGetTextLength - ;

api: FldSetScrollPosition
: FldGoToEnd ( fldP -- )
dup FldGetTextLength
2dup FldSetScrollPosition FldSetInsPtPosition
;

1 value FldAppendPreallot

: MemAddrDelBegin ( n addr u -- )
>r 2dup + rot rot swap r> swap -
move ;

: MemHandleDelBegin ( n h -- )
dup MemHandleSize >r ( n h r: sz )
2dup MemHandleLock >rel r@
  MemAddrDelBegin ( n h r: sz )
dup rot r> swap -
  MemHandleResize throw ( h )
MemHandleUnlock throw ;

api: FldGetTextHandle
api: FldSetTextHandle
: FldDelBegin ( fldP n -- )
swap
dup >r FldGetTextHandle
r@ 0 FldSetTextHandle
( n h )
tuck MemHandleDelBegin
( h )
r> swap FldSetTextHandle
;

: FldAppend ( fldP addr u -- )
rot
dup>r
fldGetMaxChars over < if
r@ fldDeleteAll
+ r@ fldGetMaxChars tuck - swap
r@ rot >abs rot fldInsert drop
else
r@ fldCanAppend over < if
dup r@ fldCanAppend -
fldAppendPreallot max
r@ swap FldDelBegin
r@ fldGotoEnd
r@ rot >abs rot fldInsert drop 
else
r@ fldGoToEnd
r@ rot >abs rot fldInsert drop
then then rdrop ;

create fldSclValues 6 allot
api: FldGetScrollValues
: FldGetScrollBar ( fldP -- val min max page )
fldSclValues >abs dup 2+ dup 2+
  FldGetScrollValues
fldSclValues dup
2+ w@ swap 4 + w@ > if
  fldSclValues dup
  2+ w@ swap 4 + w@ -
else
  fldSclValues w@ if
  fldSclValues w@ else 0 then
then
fldSclValues w@ swap 0 swap
  fldSclValues 4 + w@ 1- ;
api: FldSetSelection
: FldSelectAll ( fldP -- )
	0 over FldGetTextLength
	FldSetSelection ;
: FldPutText ( fldP addr u -- f )
	rot dup FldSelectAll
	-rot s>abs FldInsert ;