Initial import of Dillo
This commit is contained in:
84
dw/findtext.hh
Normal file
84
dw/findtext.hh
Normal file
@ -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 pattern 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__
|
||||
Reference in New Issue
Block a user