! Copyright (C) 2005, 2007 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays ui.gadgets ui.gadgets.borders ui.gadgets.buttons ui.gadgets.labels ui.gadgets.scrollers ui.gadgets.paragraphs ui.gadgets.incremental ui.gadgets.packs ui.gadgets.theme ui.clipboards ui.gestures ui.traverse ui.render hashtables io kernel namespaces sequences io.styles strings quotations math opengl combinators math.vectors io.streams.duplex sorting splitting io.streams.nested assocs ui.gadgets.presentations ui.gadgets.slots ui.gadgets.grids ui.gadgets.grid-lines tuples models continuations ; IN: ui.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 sort-pair ] keep gadget-subtree ; M: pane gadget-selection? pane-caret&mark and ; M: pane gadget-selection selected-children gadget-text ; : pane-clear ( pane -- ) dup clear-selection dup pane-output clear-incremental pane-current clear-gadget ; : pane-theme ( editor -- ) selection-color swap set-pane-selection-color ; : ( -- pane ) pane construct-empty 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 ] with each ] 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 ] with each ] [ drop ] if ; : scroll-pane ( pane -- ) dup pane-scrolls? [ scroll>bottom ] [ drop ] if ; TUPLE: pane-stream pane ; C: pane-stream : smash-line ( current -- gadget ) dup gadget-children { { [ dup empty? ] [ 2drop ""