factor/library/ui/tools/search.factor

126 lines
3.1 KiB
Factor
Raw Normal View History

! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-search
2006-10-22 18:46:02 -04:00
USING: arrays gadgets gadgets-labels gadgets-panes
gadgets-scrolling gadgets-text gadgets-theme
generic help tools kernel models sequences words
gadgets-borders gadgets-lists namespaces parser hashtables io
completion styles strings modules ;
TUPLE: live-search field list ;
2006-10-05 02:10:49 -04:00
2006-11-17 04:37:28 -05:00
: find-live-search [ [ live-search? ] is? ] find-parent ;
2006-10-05 02:10:49 -04:00
: find-search-list find-live-search live-search-list ;
TUPLE: search-field ;
C: search-field ( -- gadget )
2006-10-05 02:10:49 -04:00
<editor> over set-gadget-delegate
dup dup set-control-self
2006-10-07 14:36:32 -04:00
[ editor-doc-end ] keep ;
2006-10-05 02:10:49 -04:00
search-field H{
{ T{ key-down f f "UP" } [ find-search-list select-prev ] }
{ T{ key-down f f "DOWN" } [ find-search-list select-next ] }
2006-11-17 04:37:28 -05:00
{ T{ key-down f f "RETURN" } [ find-search-list list-action ] }
2006-10-05 02:10:49 -04:00
} set-gestures
: <search-model> ( producer -- model )
gadget get live-search-field control-model 200 <delay>
[ "\n" join ] <filter>
swap <filter> ;
2006-11-17 04:37:28 -05:00
: <search-list> ( hook seq producer presenter -- gadget )
-rot curry <search-model> <list> ;
2006-11-17 04:37:28 -05:00
C: live-search ( string hook seq producer presenter -- gadget )
2006-10-05 02:10:49 -04:00
{
{
[ <search-field> ]
set-live-search-field
f
@top
}
{
[ <search-list> ]
set-live-search-list
[ <scroller> ]
@center
}
} make-frame*
[ live-search-field set-editor-text ] keep ;
2006-10-05 02:10:49 -04:00
M: live-search focusable-child* live-search-field ;
2006-11-17 04:37:28 -05:00
: delegate>live-search ( string hook seq producer presenter gadget -- )
>r <live-search> r> set-gadget-delegate ;
TUPLE: word-search ;
C: word-search ( string action words -- gadget )
>r
[ word-completions ]
[ word-name ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
2006-10-05 17:15:41 -04:00
: help-completions ( str pairs -- seq )
>r >lower r>
[ second >lower ] swap completions
[ first <link> ] map ;
2006-11-17 04:37:28 -05:00
TUPLE: help-search ;
C: help-search ( string action -- gadget )
>r
all-articles [ dup article-title 2array ] map
2006-11-17 04:37:28 -05:00
[ [ second ] 2apply <=> ] sort
[ help-completions ]
[ article-title ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
TUPLE: source-file-search ;
2006-11-17 04:37:28 -05:00
C: source-file-search ( string action -- gadget )
>r
source-files get hash-keys natural-sort
[ string-completions [ <pathname> ] map ]
[ pathname-string ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
: module-completions ( str modules -- seq )
[ module-name ] swap completions ;
2006-11-17 04:37:28 -05:00
TUPLE: module-search ;
: module-search ( string action -- gadget )
>r
available-modules [ module-completions ]
[ module-name ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
TUPLE: vocab-search ;
2006-10-06 17:07:13 -04:00
2006-11-17 04:37:28 -05:00
C: vocab-search ( string action -- gadget )
>r
vocabs [ string-completions [ <vocab-link> ] map ]
[ vocab-link-name ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
2006-11-12 23:38:44 -05:00
2006-11-17 04:37:28 -05:00
TUPLE: history-search ;
C: history-search ( string action seq -- gadget )
>r
[ string-completions [ <input> ] map ]
[ input-string ]
2006-11-17 04:37:28 -05:00
r>
[ delegate>live-search ] keep ;
: search-action ( search -- obj )
live-search-list list-value ;