2005-02-27 16:00:55 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
|
|
|
IN: gadgets
|
2005-03-08 22:54:59 -05:00
|
|
|
USING: generic kernel line-editor listener lists namespaces
|
|
|
|
stdio streams strings threads ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
! A pane is an area that can display text.
|
|
|
|
|
|
|
|
! output: pile
|
|
|
|
! current: label
|
|
|
|
! input: editor
|
2005-03-08 22:54:59 -05:00
|
|
|
TUPLE: pane output current input continuation ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
: add-output 2dup set-pane-output add-gadget ;
|
|
|
|
: add-input 2dup set-pane-input add-gadget ;
|
|
|
|
|
|
|
|
: <active-line> ( current input -- line )
|
|
|
|
<line-shelf> [ tuck add-gadget add-gadget ] keep ;
|
|
|
|
|
|
|
|
: pane-paint ( pane -- )
|
2005-03-06 19:46:29 -05:00
|
|
|
[[ "Monospaced" 12 ]] font set-paint-prop ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
: pane-return ( pane -- )
|
|
|
|
[
|
|
|
|
pane-input [
|
|
|
|
commit-history line-text get line-clear
|
|
|
|
] with-editor
|
|
|
|
] keep
|
|
|
|
2dup stream-write "\n" over stream-write
|
|
|
|
pane-continuation call ;
|
|
|
|
|
|
|
|
: pane-actions ( line -- )
|
2005-03-01 22:11:08 -05:00
|
|
|
[
|
2005-02-27 16:51:12 -05:00
|
|
|
[[ [ button-down 1 ] [ pane-input click-editor ] ]]
|
|
|
|
[[ [ "RETURN" ] [ pane-return ] ]]
|
|
|
|
[[ [ "UP" ] [ pane-input [ history-prev ] with-editor ] ]]
|
|
|
|
[[ [ "DOWN" ] [ pane-input [ history-next ] with-editor ] ]]
|
2005-03-01 22:11:08 -05:00
|
|
|
] swap add-actions ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
C: pane ( -- pane )
|
2005-03-08 22:54:59 -05:00
|
|
|
<line-pile> over set-delegate
|
2005-02-27 16:00:55 -05:00
|
|
|
<line-pile> over add-output
|
|
|
|
"" <label> dup pick set-pane-current >r
|
|
|
|
"" <editor> dup pick set-pane-input r>
|
|
|
|
<active-line> over add-gadget
|
|
|
|
dup pane-paint
|
|
|
|
dup pane-actions ;
|
|
|
|
|
|
|
|
: add-line ( text pane -- )
|
|
|
|
>r <label> r> pane-output add-gadget ;
|
|
|
|
|
|
|
|
: pane-write-1 ( text pane -- )
|
|
|
|
pane-current [ label-text swap cat2 ] keep set-label-text ;
|
|
|
|
|
|
|
|
: pane-terpri ( pane -- )
|
|
|
|
dup pane-current dup label-text rot add-line
|
|
|
|
"" over set-label-text relayout ;
|
|
|
|
|
|
|
|
: pane-write ( pane list -- )
|
|
|
|
2dup car swap pane-write-1
|
|
|
|
cdr dup [
|
|
|
|
over pane-terpri pane-write
|
|
|
|
] [
|
|
|
|
2drop
|
|
|
|
] ifte ;
|
|
|
|
|
|
|
|
! Panes are streams.
|
|
|
|
M: pane stream-flush ( stream -- ) relayout ;
|
|
|
|
M: pane stream-auto-flush ( stream -- ) relayout ;
|
|
|
|
|
|
|
|
M: pane stream-readln ( stream -- line )
|
2005-04-22 00:22:36 -04:00
|
|
|
[ swap set-pane-continuation stop ] callcc1 nip ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
M: pane stream-write-attr ( string style stream -- )
|
2005-03-11 21:41:46 -05:00
|
|
|
[ nip swap "\n" split pane-write ] keep scroll>bottom ;
|
2005-02-27 16:00:55 -05:00
|
|
|
|
|
|
|
M: pane stream-close ( stream -- ) drop ;
|
2005-02-27 16:51:12 -05:00
|
|
|
|
|
|
|
: <console-pane> ( -- pane )
|
|
|
|
<pane> dup [
|
2005-03-02 21:26:11 -05:00
|
|
|
[
|
|
|
|
clear print-banner listener
|
|
|
|
] in-thread
|
2005-02-27 16:51:12 -05:00
|
|
|
] with-stream ;
|