2006-06-07 23:51:28 -04:00
|
|
|
! Copyright (C) 2005, 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-08-31 21:06:13 -04:00
|
|
|
IN: gadgets-panes
|
2006-10-03 18:17:21 -04:00
|
|
|
USING: gadgets gadgets-buttons gadgets-labels
|
2006-07-19 20:23:08 -04:00
|
|
|
gadgets-scrolling gadgets-theme generic hashtables io kernel
|
|
|
|
namespaces sequences ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2006-07-19 20:23:08 -04:00
|
|
|
TUPLE: pane output current prototype 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
|
|
|
|
2006-07-19 20:23:08 -04:00
|
|
|
: add-current 2dup set-pane-current add-gadget ;
|
2005-12-16 21:12:35 -05:00
|
|
|
|
|
|
|
: prepare-line ( pane -- )
|
2006-07-19 20:23:08 -04:00
|
|
|
dup pane-prototype clone swap add-current ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-08-31 21:06:13 -04:00
|
|
|
: pane-clear ( pane -- )
|
2006-07-19 20:23:08 -04:00
|
|
|
dup
|
|
|
|
pane-output clear-incremental
|
|
|
|
pane-current clear-gadget ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-12-17 00:12:32 -05:00
|
|
|
C: pane ( -- pane )
|
2005-08-31 21:06:13 -04:00
|
|
|
<pile> over set-delegate
|
2005-12-17 00:12:32 -05:00
|
|
|
<shelf> over set-pane-prototype
|
2005-08-31 21:06:13 -04:00
|
|
|
<pile> <incremental> over add-output
|
2005-12-28 20:25:17 -05:00
|
|
|
dup prepare-line ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2006-10-04 23:30:17 -04:00
|
|
|
! Panes are streams.
|
|
|
|
|
|
|
|
: scroll-pane ( pane -- )
|
|
|
|
dup pane-scrolls? [ scroll>bottom ] [ drop ] if ;
|
|
|
|
|
|
|
|
TUPLE: pane-stream pane ;
|
|
|
|
|
2005-08-24 21:52:10 -04:00
|
|
|
: prepare-print ( current -- gadget )
|
|
|
|
#! Optimization: if line has 1 child, add the child.
|
2005-10-29 23:25:38 -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
|
|
|
|
2006-10-04 23:30:17 -04:00
|
|
|
: pane-terpri ( pane -- )
|
|
|
|
dup pane-current dup unparent prepare-print
|
|
|
|
over pane-output add-incremental
|
|
|
|
prepare-line ;
|
|
|
|
|
2005-12-28 20:25:17 -05:00
|
|
|
: pane-write ( pane seq -- )
|
|
|
|
[ over pane-current stream-write ]
|
2006-10-04 23:30:17 -04:00
|
|
|
[ dup pane-terpri ] interleave drop ;
|
2005-06-27 00:54:49 -04:00
|
|
|
|
2005-12-28 20:25:17 -05:00
|
|
|
: pane-format ( style pane seq -- )
|
|
|
|
[ pick pick pane-current stream-format ]
|
2006-10-04 23:30:17 -04:00
|
|
|
[ dup pane-terpri ] interleave 2drop ;
|
2006-10-04 17:33:02 -04:00
|
|
|
|
|
|
|
: do-pane-stream ( pane-stream quot -- )
|
|
|
|
>r pane-stream-pane r> over slip scroll-pane ; inline
|
|
|
|
|
|
|
|
M: pane-stream stream-terpri
|
2006-10-04 23:30:17 -04:00
|
|
|
[ pane-terpri ] do-pane-stream ;
|
2006-10-04 17:33:02 -04:00
|
|
|
|
|
|
|
M: pane-stream stream-write1
|
|
|
|
[ pane-current stream-write1 ] do-pane-stream ;
|
|
|
|
|
|
|
|
M: pane-stream stream-write
|
|
|
|
[ swap "\n" split pane-write ] do-pane-stream ;
|
|
|
|
|
|
|
|
M: pane-stream stream-format
|
|
|
|
[ rot "\n" split pane-format ] do-pane-stream ;
|
|
|
|
|
|
|
|
M: pane-stream stream-close drop ;
|
|
|
|
|
2006-10-04 21:33:09 -04:00
|
|
|
M: pane-stream stream-flush drop ;
|
2006-10-04 17:33:02 -04:00
|
|
|
|
|
|
|
M: pane-stream with-stream-style (with-stream-style) ;
|
|
|
|
|
2006-07-22 05:11:19 -04:00
|
|
|
GENERIC: write-gadget ( gadget stream -- )
|
|
|
|
|
2006-10-04 17:33:02 -04:00
|
|
|
M: pane-stream write-gadget
|
2005-12-17 20:03:41 -05:00
|
|
|
#! Print a gadget to the given pane.
|
2006-10-04 21:33:09 -04:00
|
|
|
pane-stream-pane pane-current add-gadget ;
|
2005-12-17 20:03:41 -05:00
|
|
|
|
2006-08-15 03:01:24 -04:00
|
|
|
M: duplex-stream write-gadget
|
2006-07-22 05:11:19 -04:00
|
|
|
duplex-stream-out write-gadget ;
|
|
|
|
|
2006-06-09 22:17:12 -04:00
|
|
|
: print-gadget ( gadget pane -- )
|
|
|
|
tuck write-gadget stream-terpri ;
|
|
|
|
|
2005-12-17 20:03:41 -05:00
|
|
|
: gadget. ( gadget -- )
|
|
|
|
#! Print a gadget to the current pane.
|
2006-06-09 22:17:12 -04:00
|
|
|
stdio get print-gadget ;
|
2005-12-17 20:03:41 -05:00
|
|
|
|
2006-01-21 02:37:39 -05:00
|
|
|
: ?terpri
|
2006-10-04 17:33:02 -04:00
|
|
|
dup pane-stream-pane pane-current gadget-children empty?
|
2006-01-21 02:37:39 -05:00
|
|
|
[ dup stream-terpri ] unless drop ;
|
|
|
|
|
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.
|
2006-10-04 17:33:02 -04:00
|
|
|
over pane-clear >r <pane-stream> r>
|
|
|
|
over >r with-stream r> ?terpri ; inline
|
2005-12-17 20:03:41 -05:00
|
|
|
|
|
|
|
: make-pane ( quot -- pane )
|
|
|
|
#! Execute the quotation with output to an output-only pane.
|
2005-12-19 02:12:40 -05:00
|
|
|
<pane> [ swap with-pane ] keep ; inline
|
2006-06-27 03:26:52 -04:00
|
|
|
|
2006-07-19 19:30:02 -04:00
|
|
|
: <scrolling-pane> ( -- pane )
|
|
|
|
<pane> t over set-pane-scrolls? ;
|
|
|
|
|
2006-06-27 03:26:52 -04:00
|
|
|
: <pane-control> ( model quot -- pane )
|
|
|
|
[ with-pane ] curry <pane> swap <control> ;
|