From 3697fa1aa3308b62f0e8b080e38543ec0c98f272 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Fri, 16 Jan 2009 15:54:40 -0600
Subject: [PATCH] Word completion now adds the word's vocab to the USE: list

---
 .../listener/completion/completion.factor     | 31 +++++++++++++++----
 basis/ui/tools/listener/listener.factor       | 24 ++++----------
 2 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/basis/ui/tools/listener/completion/completion.factor b/basis/ui/tools/listener/completion/completion.factor
index a4f7b107e8..85d2e0d8b7 100644
--- a/basis/ui/tools/listener/completion/completion.factor
+++ b/basis/ui/tools/listener/completion/completion.factor
@@ -1,11 +1,12 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs calendar colors documents fry kernel
-sets splitting math math.vectors models.delay models.filter
+words sets splitting math math.vectors models.delay models.filter
 combinators.short-circuit parser present sequences tools.completion
+generic generic.standard.engines.tuple
 ui.commands ui.gadgets ui.gadgets.editors ui.gadgets.glass
-ui.gadgets.scrollers ui.gadgets.tables
-ui.gadgets.theme ui.gadgets.worlds ui.gadgets.wrappers ui.gestures
+ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.theme
+ui.gadgets.worlds ui.gadgets.wrappers ui.gestures
 ui.render ui.tools.listener.history ;
 IN: ui.tools.listener.completion
 
@@ -53,11 +54,29 @@ M: completion-popup hide-glass-hook
 : completion-loc/doc ( popup -- loc doc )
     interactor>> [ editor-caret ] [ model>> ] bi ;
 
+GENERIC: completion-string ( object -- string )
+
+M: object completion-string present ;
+
+: method-completion-string ( word -- string )
+    "method-generic" word-prop present ;
+
+M: method-body completion-string method-completion-string ;
+
+M: engine-word completion-string method-completion-string ;
+
+GENERIC# accept-completion-hook 1 ( item popup -- )
+
+: insert-completion ( item popup -- )
+    [ completion-string ] [ completion-loc/doc ] bi*
+    one-word-elt set-elt-string ;
+
 : accept-completion ( item table -- )
     find-completion-popup
-    [ [ present ] [ completion-loc/doc ] bi* one-word-elt set-elt-string ]
-    [ hide-completion-popup ]
-    bi ;
+    [ insert-completion ]
+    [ accept-completion-hook ]
+    [ nip hide-completion-popup ]
+    2tri ;
 
 : <completion-table> ( interactor quot -- table )
     <completion-model> <table>
diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor
index c57ef4b3d7..1e32fac0ce 100644
--- a/basis/ui/tools/listener/listener.factor
+++ b/basis/ui/tools/listener/listener.factor
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs calendar combinators
 combinators.short-circuit compiler.units concurrency.flags
-concurrency.mailboxes continuations destructors documents fry generic
-generic.standard.engines.tuple hashtables help help.markup io
+concurrency.mailboxes continuations destructors documents
+fry hashtables help help.markup io
 io.styles kernel lexer listener math models models.delay models.filter
 namespaces parser prettyprint quotations sequences strings threads
 tools.vocabs ui ui.commands ui.gadgets ui.gadgets.buttons
@@ -255,17 +255,6 @@ M: listener-operation invoke-command ( target command -- )
 : clear-stack ( listener -- )
     [ clear ] swap (call-listener) ;
 
-GENERIC: word-completion-string ( word -- string )
-
-M: word word-completion-string name>> ;
-
-: method-completion-string ( word -- string )
-    "method-generic" word-prop word-completion-string ;
-
-M: method-body word-completion-string method-completion-string ;
-
-M: engine-word word-completion-string method-completion-string ;
-
 : use-if-necessary ( word seq -- )
     2dup [ vocabulary>> ] dip and [
         2dup [ assoc-stack ] keep = [ 2drop ] [
@@ -273,11 +262,10 @@ M: engine-word word-completion-string method-completion-string ;
         ] if
     ] [ 2drop ] if ;
 
-: insert-word ( word -- )
-    get-listener input>>
-    [ [ word-completion-string ] dip user-input* drop ]
-    [ interactor-use use-if-necessary ]
-    2bi ;
+M: word accept-completion-hook
+    interactor>> interactor-use use-if-necessary ;
+
+M: object accept-completion-hook 2drop ;
 
 : quot-action ( interactor -- lines )
     [ history>> history-add drop ] [ control-value ] [ select-all ] tri