! Copyright (C) 2005, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays hashtables io kernel namespaces sequences strings quotations math opengl combinators memoize math.vectors sorting splitting assocs classes.tuple models continuations destructors accessors math.rectangles fry fonts ui.pens.solid ui.images ui.gadgets ui.gadgets.private ui.gadgets.borders ui.gadgets.buttons ui.gadgets.labels ui.gadgets.scrollers ui.gadgets.paragraphs ui.gadgets.incremental ui.gadgets.packs ui.gadgets.menus ui.clipboards ui.gestures ui.traverse ui.render ui.text ui.gadgets.presentations ui.gadgets.grids ui.gadgets.tracks ui.gadgets.icons ui.gadgets.grid-lines ui.baseline-alignment colors io.styles ; FROM: io.styles => foreground background ; IN: ui.gadgets.panes TUPLE: pane < track output current input last-line prototype scrolls? selection-color caret mark selecting? ; TUPLE: pane-stream pane ; C: pane-stream M: pane-stream stream-element-type drop +character+ ; >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 -- ) clear-selection [ 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 ( pane -- string/f ) 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 ; : smash-line ( current -- gadget ) dup children>> { { [ dup empty? ] [ 2drop ""