Using Curses::UI::Searchable, you can add 'less'-like search capabilities to your widget.
To make your widget searchable using this class, your widget should meet the following requirements:
• makeitadescendantofCurses::UI::Searchable
All methods for searching are in Curses::UI::Searchable. By making your class a descendant of this
class, these methods are automatically inherited.
• -yposdatamember
The current vertical position in the widget should be identified by $this->{-ypos}. This y-position
is the index of the line of content. Here's an example for a Listbox widget.
-ypos
|
v
+------+
0 |One |
1 |Two |
2 |Three |
+------+
• method:number_of_lines()
Your widget class should have a method number_of_lines, which returns the total number of lines in
the widget's content. So in the example above, this method would return the value 3.
• method:getline_at_ypos(YPOS)
Your widget class should have a method getline_at_ypos, which returns the line of content at -ypos
YPOS. So in the example above, this method would return the value "Two" for YPOS = 1.
• method:layout_content()
The search routines will set the -ypos of your widget if a match is found for the given search
string. Your layout_content routine should make sure that the line of content at -ypos will be made
visible if the draw method is called.
• method:draw()
If the search routines find a match, $this->{-search_highlight} will be set to the -ypos for the line
on which the match was found. If no match was found $this->{-search_highlight} will be undefined. If
you want a matching line to be highlighted, in your widget, you can use this data member to do so (an
example of a widget that uses this option is the Curses::UI::TextViewer widget).
• bindingsforsearchroutines
There are two search routines. These are search_forward and search_backward. These have to be called
in order to display the search prompt. The best way to do this is by creating bindings for them.
Here's an example which will make '/' a forward search and '?' a backward search:
$this->set_routine('search-forward' , \&search_forward);
$this->set_binding('search-forward' , '/');
$this->set_routine('search-backward' , \&search_backward);
$this->set_binding('search-backward' , '?');