From 0bbe79d3864e54c47e2c6576acf6f996cdcce383 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Tue, 17 Feb 2009 08:24:11 -0600
Subject: [PATCH] Search tables: do case folding automatically, better keyboard
 behavior

---
 basis/models/search/search.factor             | 10 ++++--
 .../search-tables/search-tables.factor        | 31 ++++++++++++++-----
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/basis/models/search/search.factor b/basis/models/search/search.factor
index 62e4db38ac..d1ef6b5ead 100644
--- a/basis/models/search/search.factor
+++ b/basis/models/search/search.factor
@@ -1,8 +1,12 @@
-! Copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2009 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays fry kernel models.compose models.filter sequences ;
+USING: arrays fry kernel models.compose models.filter
+sequences unicode.case ;
 IN: models.search
 
 : <search> ( values search quot -- model )
     [ 2array <compose> ] dip
-    '[ first2 _ curry filter ] <filter> ;
\ No newline at end of file
+    '[ first2 _ curry filter ] <filter> ;
+
+: <string-search> ( values search quot -- model )
+    '[ swap @ [ >case-fold ] bi@ subseq? ] <search> ;
diff --git a/basis/ui/gadgets/search-tables/search-tables.factor b/basis/ui/gadgets/search-tables/search-tables.factor
index e278f3bc75..4a2983bfe0 100644
--- a/basis/ui/gadgets/search-tables/search-tables.factor
+++ b/basis/ui/gadgets/search-tables/search-tables.factor
@@ -1,12 +1,17 @@
 ! Copyright (C) 2008, 2009 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel delegate fry sequences models
-models.search models.delay calendar locals ui.pens ui.pens.image
-ui.gadgets.editors ui.gadgets.labels ui.gadgets.scrollers
-ui.gadgets.tables ui.gadgets.tracks ui.gadgets.borders
-ui.gadgets.buttons ui.baseline-alignment ui.gadgets ;
+combinators.short-circuit models.search models.delay calendar locals
+ui.gestures ui.pens ui.pens.image ui.gadgets.editors ui.gadgets.labels
+ui.gadgets.scrollers ui.gadgets.tables ui.gadgets.tracks
+ui.gadgets.borders ui.gadgets.buttons ui.baseline-alignment ui.gadgets ;
 IN: ui.gadgets.search-tables
 
+TUPLE: search-table < track table field ;
+
+: find-search-table ( gadget -- search-table/f )
+    [ search-table? ] find-parent ;
+
 TUPLE: search-field < track field ;
 
 : clear-search-field ( search-field -- )
@@ -29,7 +34,15 @@ TUPLE: search-field < track field ;
         dup field>> "Search:" label-on-left 1 track-add
         dup <clear-button> f track-add ;
 
-TUPLE: search-table < track table field ;
+M: search-field focusable-child* field>> ;
+
+: pass-to-table ( gesture gadget -- ? )
+    find-search-table table>> handle-gesture ;
+
+M: search-field handle-gesture
+    over key-gesture? [
+        { [ pass-to-table ] [ call-next-method ] } 2&&
+    ] [ call-next-method ] if ;
 
 ! A protocol with customizable slots
 SLOT-PROTOCOL: table-protocol
@@ -58,9 +71,11 @@ CONSULT: table-protocol search-table table>> ;
         values >>model
         search <search-field> >>field
         dup field>> { 2 2 } <filled-border> f track-add
-        values search 500 milliseconds <delay> quot <search>
-        renderer <table> >>table
+        values search 500 milliseconds <delay> quot <string-search>
+        renderer <table> f >>takes-focus? >>table
         dup table>> <scroller> 1 track-add ;
 
 M: search-table model-changed
-    nip field>> clear-search-field ;
\ No newline at end of file
+    nip field>> clear-search-field ;
+
+M: search-table focusable-child* field>> ;
\ No newline at end of file