! Copyright (C) 2005, 2010 Slava Pestov. ! See https://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs classes combinators destructors documents.private fonts io io.styles kernel math math.rectangles math.vectors models models.range namespaces sequences sets sorting splitting strings ui.baseline-alignment ui.clipboards ui.gadgets ui.gadgets.borders ui.gadgets.grid-lines ui.gadgets.grids ui.gadgets.icons ui.gadgets.incremental ui.gadgets.labels ui.gadgets.menus ui.gadgets.packs ui.gadgets.paragraphs ui.gadgets.presentations ui.gadgets.private ui.gadgets.scrollers ui.gadgets.tracks ui.gestures ui.images ui.pens.solid ui.render ui.theme ui.traverse unicode ; FROM: io.styles => foreground background ; FROM: ui.gadgets.wrappers => ; IN: ui.gadgets.panes TUPLE: pane < track output current input last-line prototype scrolls? selection-color caret mark selecting? ; TUPLE: pane-stream pane parent ; INSTANCE: pane-stream output-stream : ( pane -- pane-stream ) f pane-stream boa ; M: pane-stream stream-element-type drop +character+ ; DEFER: write-gadget >caret f >>mark ; inline : prepare-last-line ( pane -- ) [ last-line>> ] keep [ current>> f track-add ] [ input>> [ 1 track-add ] when* ] bi drop ; inline : init-current ( pane -- pane ) dup prototype>> clone >>current ; inline : focus-input ( pane -- ) input>> [ request-focus ] when* ; : next-line ( pane -- ) [ input>> unparent ] [ init-current prepare-last-line ] [ focus-input ] tri ; : pane-caret&mark ( pane -- caret mark ) [ caret>> ] [ mark>> ] bi ; inline : selected-subtree ( pane -- seq ) [ pane-caret&mark sort-pair ] keep gadget-subtree ; M: pane gadget-selection? pane-caret&mark and ; M: pane gadget-selection selected-subtree gadget-text ; : init-prototype ( pane -- pane ) +baseline+ >>align >>prototype ; inline : init-output ( pane -- pane ) [ >>output ] [ f track-add ] bi ; inline : pane-theme ( pane -- pane ) 1 >>fill selection-color >>selection-color ; inline : init-last-line ( pane -- pane ) horizontal 0 >>fill +baseline+ >>align [ >>last-line ] [ 1 track-add ] bi dup prepare-last-line ; inline M: pane selected-children dup gadget-selection? [ [ selected-subtree leaves ] [ selection-color>> ] bi ] [ drop f f ] if ; : scroll-pane ( pane -- ) dup scrolls?>> [ scroll>bottom ] [ drop ] if ; GENERIC: pane-label ( pane -- label ) M: pane pane-label drop ""