! Copyright (C) 2005, 2007 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays gadgets gadgets-borders gadgets-buttons gadgets-labels gadgets-scrolling gadgets-paragraphs gadgets-traverse gadgets-theme generic hashtables io kernel namespaces sequences styles strings quotations math opengl ; IN: gadgets-panes TUPLE: pane output current prototype scrolls? selection-color caret mark selecting? ; : clear-selection ( pane -- ) f over set-pane-caret f swap set-pane-mark ; : add-output 2dup set-pane-output add-gadget ; : add-current 2dup set-pane-current add-gadget ; : prepare-line ( pane -- ) dup clear-selection dup pane-prototype clone swap add-current ; : pane-caret&mark ( pane -- caret mark ) dup pane-caret swap pane-mark ; : selected-children ( pane -- seq ) [ pane-caret&mark 2dup <=> 0 > [ swap ] when ] keep gadget-subtree ; M: pane gadget-selection? pane-caret&mark = not ; M: pane gadget-selection selected-children gadget-text ; : pane-clear ( pane -- ) dup clear-selection dup pane-output clear-incremental pane-current clear-gadget ; C: pane ( -- pane ) over set-delegate over set-pane-prototype over add-output dup prepare-line dup pane-theme ; GENERIC: draw-selection ( loc obj -- ) : if-fits ( rect quot -- ) >r clip get over intersects? r> [ drop ] if ; inline M: gadget draw-selection ( loc gadget -- ) swap offset-rect [ rect-extent gl-fill-rect ] if-fits ; M: node draw-selection ( loc node -- ) 2dup node-value swap offset-rect [ drop 2dup [ node-value rect-loc v+ ] keep node-children [ draw-selection ] each-with ] if-fits 2drop ; M: pane draw-gadget* dup gadget-selection? [ dup pane-selection-color gl-color origin get over rect-loc v- swap selected-children [ draw-selection ] each-with ] [ drop ] if ; : scroll-pane ( pane -- ) dup pane-scrolls? [ scroll>bottom ] [ drop ] if ; TUPLE: pane-stream pane ; : smash-line ( current -- gadget ) dup gadget-children { { [ dup empty? ] [ 2drop ""