! Copyright (C) 2005, 2008 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 sorting splitting io.streams.nested assocs ui.gadgets.presentations ui.gadgets.slots ui.gadgets.grids ui.gadgets.grid-lines classes.tuple models continuations destructors accessors math.geometry.rect ; IN: ui.gadgets.panes TUPLE: pane < pack output current prototype scrolls? selection-color caret mark selecting? ; : clear-selection ( pane -- pane ) f >>caret f >>mark ; : add-output ( pane current -- pane ) [ >>output ] [ add-gadget ] bi ; : add-current ( pane current -- pane ) [ >>current ] [ add-gadget ] bi ; : prepare-line ( pane -- pane ) clear-selection dup prototype>> clone add-current ; : pane-caret&mark ( pane -- caret mark ) [ caret>> ] [ mark>> ] bi ; : selected-children ( pane -- seq ) [ pane-caret&mark sort-pair ] keep gadget-subtree ; M: pane gadget-selection? pane-caret&mark and ; M: pane gadget-selection ( pane -- string/f ) selected-children gadget-text ; : pane-clear ( pane -- ) clear-selection [ pane-output clear-incremental ] [ pane-current clear-gadget ] bi ; : new-pane ( class -- pane ) new-gadget { 0 1 } >>orientation >>prototype add-output prepare-line selection-color >>selection-color ; : ( -- pane ) pane new-pane ; 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 set-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 ""