#ifndef SEARCHER_H #define SEARCHER_H #include #include #include #include #include "searchdata.h" #include "searchtoken.h" #include "isearchengine.h" namespace vnotex { class Buffer; class File; struct SearchResultItem; class Node; class Notebook; class Searcher : public QObject { Q_OBJECT public: explicit Searcher(QObject *p_parent = nullptr); void clear(); void stop(); SearchState search(const QSharedPointer &p_option, const QList &p_buffers); SearchState search(const QSharedPointer &p_option, Node *p_folder); SearchState search(const QSharedPointer &p_option, const QVector &p_notebooks); const SearchToken &getToken() const; signals: void progressUpdated(int p_val, int p_maximum); void logRequested(const QString &p_log); void resultItemAdded(const QSharedPointer &p_item); void resultItemsAdded(const QVector> &p_items); void finished(SearchState p_state); private: bool isAskedToStop() const; bool prepare(const QSharedPointer &p_option); // Return false if there is failure. // Always search content at first phase. bool firstPhaseSearch(const File *p_file); // Return false if there is failure. bool firstPhaseSearchFolder(Node *p_node, QVector &p_secondPhaseItems); // Return false if there is failure. bool firstPhaseSearch(Node *p_node, QVector &p_secondPhaseItems); // Return false if there is failure. bool firstPhaseSearch(Notebook *p_notebook, QVector &p_secondPhaseItems); // Return false if there is failure. bool secondPhaseSearch(const QVector &p_secondPhaseItems); bool isFilePatternMatched(const QString &p_name) const; bool testTarget(SearchTarget p_target) const; bool testObject(SearchObject p_object) const; bool isTokenMatched(const QString &p_text) const; bool searchContent(const File *p_file); // Return true if matched. bool searchTag(const Node *p_node) const; void createSearchEngine(); QSharedPointer m_option; SearchToken m_token; QRegularExpression m_filePattern; bool m_askedToStop = false; QScopedPointer m_engine; }; } #endif // SEARCHER_H