diff options
Diffstat (limited to 'dw/findtext.hh')
-rw-r--r-- | dw/findtext.hh | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/dw/findtext.hh b/dw/findtext.hh new file mode 100644 index 0000000..c680348 --- /dev/null +++ b/dw/findtext.hh @@ -0,0 +1,84 @@ +#ifndef __DW_FINDTEXT_STATE_H__ +#define __DW_FINDTEXT_STATE_H__ + +#ifndef __INCLUDED_FROM_DW_CORE_HH__ +# error Do not include this file directly, use "core.hh" instead. +#endif + +#include <ctype.h> + +namespace dw { +namespace core { + +class FindtextState +{ +public: + typedef enum { + /** \brief The next occurrence of the pattern has been found. */ + SUCCESS, + + /** + * \brief There is no further occurrence of the pattern, instead, the + * first occurrence has been selected. + */ + RESTART, + + /** \brief The patten does not at all occur in the text. */ + NOT_FOUND + } Result; + +private: + /** + * \brief The key used for the last search. + * + * If dw::core::Findtext::search is called with the same key, the search + * is continued, otherwise it is restarted. + */ + char *key; + + /** \brief Whether the last search was case sensitive. */ + bool caseSens; + + /** \brief The table used for KMP search. */ + int *nexttab; + + /** \brief The top of the widget tree, in which the search is done. + * + * From this, the iterator will be constructed. Set by + * dw::core::Findtext::widget + */ + Widget *widget; + + /** \brief The position from where the next search will start. */ + CharIterator *iterator; + + /** + * \brief The position from where the characters are highlighted. + * + * NULL, when no text is highlighted. + */ + CharIterator *hlIterator; + + static const char* rev(const char* _str); /* reverse a C string */ + + static int *createNexttab (const char *needle,bool caseSens,bool backwards); + bool unhighlight (); + bool search0 (bool backwards, bool firstTrial); + + inline static bool charsEqual (char c1, char c2, bool caseSens) + { return caseSens ? c1 == c2 : tolower (c1) == tolower (c2) || + (isspace (c1) && isspace (c2)); } + +public: + FindtextState (); + ~FindtextState (); + + void setWidget (Widget *widget); + Result search (const char *key, bool caseSens, bool backwards); + void resetSearch (); +}; + +} // namespace core +} // namespace dw + +#endif // __DW_FINDTEXT_STATE_H__ |