1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: compiler arrays gadgets gadgets-frames gadgets-labels
5 gadgets-panes gadgets-scrolling gadgets-text gadgets-lists
6 gadgets-search gadgets-theme gadgets-tracks gadgets-workspace
7 generic hashtables tools io kernel listener math models
8 namespaces parser prettyprint sequences shells strings styles
9 threads words definitions help ;
11 TUPLE: listener-gadget input output stack minibuffer ;
13 : ui-listener-hook ( listener -- )
14 >r datastack r> listener-gadget-stack set-model ;
16 : listener-stream ( listener -- stream )
17 dup listener-gadget-input
18 swap listener-gadget-output <pane-stream>
21 : <listener-input> ( -- gadget )
22 gadget get listener-gadget-output
23 <pane-stream> <interactor> ;
25 : <stack-display> ( -- gadget )
26 gadget get listener-gadget-stack
27 [ stack. ] "Stack" <labelled-pane> ;
29 : init-listener ( listener -- )
30 f <model> swap set-listener-gadget-stack ;
33 "If this is your first time with Factor, please read " print
34 "ui-tools" ($link) ", and especially " write
35 "ui-listener" ($link) "." print terpri ;
37 : listener-thread ( listener -- )
39 [ ui-listener-hook ] curry listener-hook set
40 find-messages batch-errors set
45 : start-listener ( listener -- )
46 [ >r clear r> init-namespaces listener-thread ] in-thread
49 C: listener-gadget ( -- gadget )
53 set-listener-gadget-output
57 { [ <stack-display> ] f f 1/6 }
60 set-listener-gadget-input
61 [ <scroller> "Input" <labelled-gadget> ]
64 } { 0 1 } make-track* ;
66 M: listener-gadget focusable-child*
67 listener-gadget-input ;
69 M: listener-gadget call-tool* ( input listener -- )
70 >r input-string r> listener-gadget-input set-editor-text ;
72 M: listener-gadget tool-scroller
73 listener-gadget-output find-scroller ;
75 M: listener-gadget tool-help
78 : find-listener ( -- listener )
79 listener-gadget find-workspace show-tool tool-gadget ;
81 : (call-listener) ( quot listener -- )
82 listener-gadget-input interactor-call ;
84 : call-listener ( quot -- )
85 find-listener (call-listener) ;
87 : listener-run-files ( seq -- )
91 [ [ run-file ] each ] curry call-listener
94 : listener-eof ( listener -- )
95 listener-gadget-input f swap interactor-eval ;
97 : clear-listener-output ( listener -- )
98 [ listener-gadget-output [ pane-clear ] curry ] keep
101 : clear-listener-stack ( listener -- )
102 [ clear ] swap (call-listener) ;
104 : hide-minibuffer ( listener -- )
105 dup listener-gadget-minibuffer dup
106 [ over track-remove ] [ drop ] if
107 dup listener-gadget-input request-focus
108 f swap set-listener-gadget-minibuffer ;
110 : show-minibuffer ( gadget listener -- )
111 [ hide-minibuffer ] keep
112 [ set-listener-gadget-minibuffer ] 2keep
113 dupd track-add request-focus ;
115 : minibuffer-action ( quot -- quot )
116 [ find-listener hide-minibuffer ] swap append ;
118 : show-word-search ( listener action -- )
120 >r dup listener-gadget-input selected-word r>
121 <word-search> "Word search" <labelled-gadget>
122 swap show-minibuffer ;
124 : show-source-files-search ( listener action -- )
126 "" swap <source-files-search>
127 "Source file search" <labelled-gadget>
128 swap show-minibuffer ;
130 : show-vocabs-search ( listener action -- )
132 >r dup listener-gadget-input selected-word r>
133 <vocabs-search> "Vocabulary search" <labelled-gadget>
134 swap show-minibuffer ;
136 : show-list ( seq presenter action listener -- )
137 >r minibuffer-action <list> <scroller> r> show-minibuffer ;
139 : listener-history ( listener -- seq )
140 listener-gadget-input interactor-history <reversed> ;
142 : show-history ( listener -- )
144 listener-gadget-input <model>
145 [ [ dup print-input ] make-pane ]
146 [ listener-gadget-input set-editor-text ]
149 : insert-completion ( completion -- )
150 word-name find-listener listener-gadget-input user-input ;
152 listener-gadget "Toolbar" {
153 { "Restart" T{ key-down f { C+ } "r" } [ start-listener ] }
156 T{ key-down f { C+ } "h" }
161 T{ key-down f f "CLEAR" }
162 [ clear-listener-output ]
166 T{ key-down f { C+ } "CLEAR" }
167 [ clear-listener-stack ]
169 { "Send EOF" T{ key-down f { C+ } "d" } [ listener-eof ] }
172 listener-gadget "Completion commands" {
175 T{ key-down f f "TAB" }
176 [ [ insert-completion ] show-word-search ]
180 T{ key-down f { C+ } "e" }
181 [ [ edit-file ] show-source-files-search ]
185 T{ key-down f { C+ } "u" }
186 [ [ [ use+ ] curry call-listener ] show-vocabs-search ]
190 T{ key-down f f "ESCAPE" }