1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays compiler gadgets gadgets-labels
5 gadgets-panes gadgets-scrolling gadgets-text
6 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 errors ;
11 TUPLE: listener-gadget input output stack ;
13 : ui-listener-hook ( listener -- )
14 >r datastack r> listener-gadget-stack set-model ;
16 : ui-error-hook ( error listener -- )
17 find-workspace dup workspace-error-hook call ;
19 : listener-stream ( listener -- stream )
20 dup listener-gadget-input
21 swap listener-gadget-output <pane-stream>
24 : <listener-input> ( -- gadget )
25 gadget get listener-gadget-output
26 <pane-stream> <interactor> ;
28 : <stack-display> ( -- gadget )
29 gadget get listener-gadget-stack
30 [ stack. ] "Stack" <labelled-pane> ;
32 : init-listener ( listener -- )
33 f <model> swap set-listener-gadget-stack ;
36 "If this is your first time with Factor, please read " print
37 "ui-tools" ($link) ", and especially " write
38 "ui-listener" ($link) "." print terpri ;
40 : listener-thread ( listener -- )
43 [ ui-listener-hook ] curry listener-hook set
44 [ ui-error-hook ] curry error-hook set
45 find-messages batch-errors set
50 : start-listener ( listener -- )
51 [ >r clear r> init-namespaces listener-thread ] in-thread
54 C: listener-gadget ( -- gadget )
58 set-listener-gadget-output
62 { [ <stack-display> ] f f 1/6 }
65 set-listener-gadget-input
66 [ <scroller> "Input" <labelled-gadget> ]
69 } { 0 1 } make-track* ;
71 M: listener-gadget focusable-child*
72 listener-gadget-input ;
74 M: listener-gadget call-tool* ( input listener -- )
75 >r input-string r> listener-gadget-input set-editor-string ;
77 M: listener-gadget tool-scroller
78 listener-gadget-output find-scroller ;
80 M: listener-gadget tool-help
83 : workspace-busy? ( workspace -- ? )
84 listener-gadget swap find-tool nip tool-gadget
85 listener-gadget-input interactor-busy? ;
87 : get-listener ( -- listener )
89 [ workspace-busy? not ] get-workspace*
90 show-tool tool-gadget ;
92 : (call-listener) ( quot listener -- )
93 listener-gadget-input interactor-call ;
95 : call-listener ( quot -- )
96 get-listener (call-listener) ;
98 : eval-listener ( string -- )
100 listener-gadget-input [ set-editor-string ] keep
103 : listener-run-files ( seq -- )
107 [ run-files recompile ] curry call-listener
110 : listener-eof ( listener -- )
111 listener-gadget-input interactor-eof ;
113 : clear-listener-output ( listener -- )
114 [ listener-gadget-output [ pane-clear ] curry ] keep
117 : clear-listener-stack ( listener -- )
118 [ clear ] swap (call-listener) ;
120 listener-gadget "toolbar" {
121 { "Restart" f [ start-listener ] }
124 T{ key-down f f "CLEAR" }
125 [ clear-listener-output ]
129 T{ key-down f { C+ } "CLEAR" }
130 [ clear-listener-stack ]
132 { "Send EOF" f [ listener-eof ] }
136 { "Data stack" T{ key-down f f "s" } [ :s ] }
137 { "Retain stack" T{ key-down f f "r" } [ :r ] }
138 { "Call stack" T{ key-down f f "c" } [ :c ] }
139 { "Help" T{ key-down f f "h" } [ :help ] }
140 { "Edit" T{ key-down f f "e" } [ :edit ] }
142 first3 [ call-listener drop ] curry 3array
143 ] map define-commands