/* * Copyright (C) 2013, 2014 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #ifndef QUICKFINDMUX_H #define QUICKFINDMUX_H #include #include #include #include #include "quickfindpattern.h" // Interface representing a widget searchable in both direction. class SearchableWidgetInterface { public: virtual void searchForward() = 0; virtual void searchBackward() = 0; virtual void incrementallySearchForward() = 0; virtual void incrementallySearchBackward() = 0; virtual void incrementalSearchStop() = 0; virtual void incrementalSearchAbort() = 0; }; // Interface representing the selector. It will be called and asked // who the search have to be forwarded to. class QuickFindMuxSelectorInterface { public: // Return the searchable widget to use. SearchableWidgetInterface* getActiveSearchable() const { return doGetActiveSearchable(); } // Return the list of all possible searchables, this // is done on registration in order to establish // listeners on all searchables. std::vector getAllSearchables() const { return doGetAllSearchables(); } protected: virtual SearchableWidgetInterface* doGetActiveSearchable() const = 0; virtual std::vector doGetAllSearchables() const = 0; }; class QFNotification; // Represents a multiplexer (unique application wise) dispatching the // Quick Find search from the UI to the relevant view. // It is also its responsability to determine if an incremental search // must be performed and to react accordingly. class QuickFindMux : public QObject { Q_OBJECT public: enum QFDirection { Forward, Backward, }; // Construct the multiplexer, taking a reference to the pattern QuickFindMux( std::shared_ptr pattern ); // Register a new selector, which will be called and asked // who the search have to be forwarded to. // The selector is called immediately when registering to get the list of // searchables. // The previous selector and its associated views are automatically // deregistered. // A null selector is accepted, in this case QFM functionalities are // disabled until a valid selector is registered. void registerSelector( const QuickFindMuxSelectorInterface* selector ); // Set the direction that will be used by the search when searching // forward. void setDirection( QFDirection direction ); signals: void patternChanged( const QString& ); void notify( const QFNotification& ); void clearNotification(); public slots: // Signal the current pattern must be altered (will start an incremental // search if the options are configured in such a way). void setNewPattern( const QString& new_pattern, bool ignore_case ); // Signal the current pattern must be altered and is confirmed // (will stop an incremental search if needed) void confirmPattern( const QString& new_pattern, bool ignore_case ); // Signal the user cancelled the search // (used for incremental only) void cancelSearch(); // Starts a search in the specified direction void searchNext(); void searchPrevious(); // Idem but ignore the direction and always search in the // specified direction void searchForward(); void searchBackward(); private slots: void changeQuickFind( const QString& new_pattern, QuickFindMux::QFDirection new_direction ); void notifyPatternChanged(); private: const QuickFindMuxSelectorInterface* selector_; // The (application wide) quick find pattern std::shared_ptr pattern_; QFDirection currentDirection_; std::vector registeredSearchables_; SearchableWidgetInterface* getSearchableWidget() const; void registerSearchable( QObject* searchable ); void unregisterAllSearchables(); }; #endif