1 ! Copyright (C) 2005, 2006 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays gadgets gadgets-labels generic kernel math
8 TUPLE: word-break-gadget ;
10 C: word-break-gadget ( gadget -- gadget )
11 [ set-delegate ] keep ;
13 M: word-break-gadget draw-gadget* drop ;
15 ! A gadget that arranges its children in a word-wrap style.
16 TUPLE: paragraph margin ;
18 C: paragraph ( margin -- gadget )
19 [ set-paragraph-margin ] keep dup delegate>gadget ;
21 SYMBOL: x SYMBOL: max-x
23 SYMBOL: y SYMBOL: max-y
29 : overrun? ( width -- ? ) x get + margin get >= ;
33 0 { x line-height } [ set ] each-with ;
35 : wrap-pos ( -- pos ) x get y get 2array ;
39 x get max-x [ max ] change ;
42 dup line-height [ max ] change
43 y get + max-y [ max ] change ;
45 : wrap-step ( quot child -- )
47 over word-break-gadget? [
48 dup first overrun? [ wrap-line ] when
49 ] unless drop wrap-pos rot call
50 ] keep first2 advance-y advance-x ; inline
52 : wrap-dim ( -- dim ) max-x get max-y get 2array ;
54 : init-wrap ( paragraph -- )
55 paragraph-margin margin set
56 0 { x max-x y max-y line-height } [ set ] each-with ;
58 : do-wrap ( paragraph quot -- dim )
61 [ wrap-step ] each-child-with wrap-dim
64 M: paragraph pref-dim*
68 [ swap dup prefer set-rect-loc ] do-wrap drop ;