2005-06-27 00:54:49 -04:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-09-01 01:20:43 -04:00
|
|
|
IN: gadgets-presentations
|
|
|
|
DEFER: <presentation>
|
|
|
|
|
2005-08-31 21:06:13 -04:00
|
|
|
IN: gadgets-panes
|
2005-09-11 20:46:55 -04:00
|
|
|
USING: arrays gadgets gadgets-editors gadgets-labels
|
2005-09-28 23:29:00 -04:00
|
|
|
gadgets-layouts gadgets-scrolling gadgets-theme generic
|
|
|
|
hashtables io kernel line-editor lists math namespaces
|
|
|
|
prettyprint sequences strings styles threads ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
! A pane is an area that can display text.
|
|
|
|
|
|
|
|
! output: pile
|
|
|
|
! current: shelf
|
|
|
|
! input: editor
|
2005-09-25 00:18:12 -04:00
|
|
|
TUPLE: pane output active current input continuation scrolls? ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
: add-output 2dup set-pane-output add-gadget ;
|
2005-06-27 16:50:21 -04:00
|
|
|
|
2005-09-25 00:18:12 -04:00
|
|
|
: <active-line> ( current input -- line )
|
2005-09-27 00:24:42 -04:00
|
|
|
[ 2array ] [ 1array ] if* make-shelf ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
: init-active-line ( pane -- )
|
2005-06-27 16:50:21 -04:00
|
|
|
dup pane-active unparent
|
2005-08-26 21:42:43 -04:00
|
|
|
[ dup pane-current swap pane-input <active-line> ] keep
|
2005-06-27 00:54:49 -04:00
|
|
|
2dup set-pane-active add-gadget ;
|
|
|
|
|
|
|
|
: pop-continuation ( pane -- quot )
|
|
|
|
dup pane-continuation f rot set-pane-continuation ;
|
|
|
|
|
2005-07-06 03:29:42 -04:00
|
|
|
: pane-eval ( string pane -- )
|
2005-09-25 01:10:02 -04:00
|
|
|
pop-continuation dup
|
|
|
|
[ [ continue-with ] in-thread ] when 2drop ;
|
2005-08-26 00:55:56 -04:00
|
|
|
|
|
|
|
SYMBOL: structured-input
|
|
|
|
|
|
|
|
: elements. ( quot -- )
|
|
|
|
[
|
2005-08-26 18:18:07 -04:00
|
|
|
2 nesting-limit set
|
2005-08-26 00:55:56 -04:00
|
|
|
5 length-limit set
|
2005-08-29 18:18:10 -04:00
|
|
|
<block pprint-elements block> newline
|
2005-08-26 00:55:56 -04:00
|
|
|
] with-pprint ;
|
2005-07-06 03:29:42 -04:00
|
|
|
|
|
|
|
: pane-call ( quot pane -- )
|
2005-08-26 00:55:56 -04:00
|
|
|
2dup [ elements. ] with-stream*
|
|
|
|
>r structured-input global set-hash
|
2005-09-03 18:44:45 -04:00
|
|
|
"\"structured-input\" \"gadgets-panes\" lookup global hash call"
|
|
|
|
r> pane-eval ;
|
2005-08-26 00:55:56 -04:00
|
|
|
|
|
|
|
: editor-commit ( editor -- line )
|
|
|
|
#! Add current line to the history, and clear the editor.
|
|
|
|
[ commit-history line-text get line-clear ] with-editor ;
|
2005-06-29 00:33:07 -04:00
|
|
|
|
2005-09-28 23:29:00 -04:00
|
|
|
: print-input ( string pane -- )
|
|
|
|
[ [[ font-style bold ]] ] swap
|
|
|
|
[ stream-format ] keep stream-terpri ;
|
|
|
|
|
2005-06-29 00:33:07 -04:00
|
|
|
: pane-return ( pane -- )
|
2005-09-25 00:18:12 -04:00
|
|
|
dup pane-input dup [
|
2005-09-28 23:29:00 -04:00
|
|
|
editor-commit swap 2dup print-input 2dup pane-eval
|
2005-09-25 00:18:12 -04:00
|
|
|
] when 2drop ;
|
2005-08-31 21:06:13 -04:00
|
|
|
|
|
|
|
: pane-clear ( pane -- )
|
|
|
|
dup pane-output clear-incremental pane-current clear-gadget ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
: pane-actions ( line -- )
|
|
|
|
[
|
2005-09-25 00:18:12 -04:00
|
|
|
[[ [ button-down 1 ] [ pane-input [ click-editor ] when* ] ]]
|
2005-06-27 00:54:49 -04:00
|
|
|
[[ [ "RETURN" ] [ pane-return ] ]]
|
2005-09-25 00:18:12 -04:00
|
|
|
[[ [ "UP" ] [ pane-input [ [ history-prev ] with-editor ] when* ] ]]
|
|
|
|
[[ [ "DOWN" ] [ pane-input [ [ history-next ] with-editor ] when* ] ]]
|
2005-08-31 21:06:13 -04:00
|
|
|
[[ [ "CTRL" "l" ] [ pane get pane-clear ] ]]
|
2005-06-27 00:54:49 -04:00
|
|
|
] swap add-actions ;
|
|
|
|
|
2005-09-25 00:18:12 -04:00
|
|
|
C: pane ( input? scrolls? -- pane )
|
|
|
|
#! You can create output-only panes. If the scrolls flag is
|
|
|
|
#! set, the pane will scroll to the bottom when input is
|
|
|
|
#! added.
|
|
|
|
[ set-pane-scrolls? ] keep
|
2005-08-31 21:06:13 -04:00
|
|
|
<pile> over set-delegate
|
|
|
|
<pile> <incremental> over add-output
|
|
|
|
<shelf> over set-pane-current
|
2005-09-25 00:18:12 -04:00
|
|
|
swap [ "" <editor> over set-pane-input ] when
|
2005-06-27 00:54:49 -04:00
|
|
|
dup init-active-line
|
|
|
|
dup pane-actions ;
|
|
|
|
|
2005-07-04 18:36:07 -04:00
|
|
|
M: pane focusable-child* ( pane -- editor )
|
2005-09-25 00:18:12 -04:00
|
|
|
pane-input [ t ] unless* ;
|
2005-07-04 18:36:07 -04:00
|
|
|
|
2005-06-29 00:33:07 -04:00
|
|
|
: pane-write-1 ( style text pane -- )
|
2005-08-24 21:52:10 -04:00
|
|
|
pick not pick empty? and [
|
2005-07-19 17:51:59 -04:00
|
|
|
3drop
|
|
|
|
] [
|
|
|
|
>r <presentation> r> pane-current add-gadget
|
2005-09-24 15:21:17 -04:00
|
|
|
] if ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-08-24 21:52:10 -04:00
|
|
|
: prepare-print ( current -- gadget )
|
|
|
|
#! Optimization: if line has 1 child, add the child.
|
2005-09-12 18:14:29 -04:00
|
|
|
dup gadget-children @{
|
|
|
|
@{ [ dup empty? ] [ 2drop "" <label> ] }@
|
|
|
|
@{ [ dup length 1 = ] [ nip first ] }@
|
|
|
|
@{ [ t ] [ drop ] }@
|
|
|
|
}@ cond ;
|
2005-08-24 21:52:10 -04:00
|
|
|
|
|
|
|
: pane-print-1 ( current pane -- )
|
|
|
|
>r prepare-print r> pane-output add-incremental ;
|
|
|
|
|
2005-06-27 00:54:49 -04:00
|
|
|
: pane-terpri ( pane -- )
|
2005-08-24 21:52:10 -04:00
|
|
|
dup pane-current over pane-print-1
|
2005-08-31 21:06:13 -04:00
|
|
|
<shelf> over set-pane-current init-active-line ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
: pane-write ( style pane list -- )
|
2005-06-29 00:33:07 -04:00
|
|
|
3dup car swap pane-write-1 cdr dup
|
2005-09-24 15:21:17 -04:00
|
|
|
[ over pane-terpri pane-write ] [ 3drop ] if ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
|
|
|
! Panes are streams.
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-flush ( pane -- ) drop ;
|
2005-06-27 16:50:21 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-finish ( pane -- ) drop ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-readln ( pane -- line )
|
2005-09-18 01:37:28 -04:00
|
|
|
[ over set-pane-continuation stop ] callcc1 nip ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-09-25 00:18:12 -04:00
|
|
|
: ?scroll>bottom ( pane -- )
|
|
|
|
dup pane-scrolls? [ dup scroll>bottom ] when drop ;
|
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-write1 ( char pane -- )
|
|
|
|
[ >r ch>string <label> r> pane-current add-gadget ] keep
|
2005-09-25 00:18:12 -04:00
|
|
|
?scroll>bottom ;
|
2005-07-17 14:48:55 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-format ( string style pane -- )
|
2005-09-25 00:18:12 -04:00
|
|
|
[ rot "\n" split pane-write ] keep ?scroll>bottom ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-07-27 20:13:11 -04:00
|
|
|
M: pane stream-close ( pane -- ) drop ;
|
2005-09-25 00:18:12 -04:00
|
|
|
|
|
|
|
: make-pane ( quot -- pane )
|
|
|
|
#! Execute the quotation with output to an output-only pane.
|
2005-09-28 23:29:00 -04:00
|
|
|
f f <pane> dup world-theme [ swap with-stream ] keep ; inline
|
2005-09-25 01:10:02 -04:00
|
|
|
|
|
|
|
: with-pane ( pane quot -- )
|
|
|
|
#! Clear the pane and run the quotation in a scope with
|
|
|
|
#! stdio set to the pane.
|
|
|
|
>r dup pane-clear r> with-stream* ; inline
|