/* * 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 . */ #include "log.h" #include "persistentinfo.h" #include "configuration.h" #include "quickfindmux.h" #include "qfnotifications.h" QuickFindMux::QuickFindMux( std::shared_ptr pattern ) : QObject(), pattern_( pattern ), registeredSearchables_() { selector_ = nullptr; // Forward the pattern's signal to our listeners connect( pattern_.get(), SIGNAL( patternUpdated() ), this, SLOT( notifyPatternChanged() ) ); } // // Public member functions // void QuickFindMux::registerSelector( const QuickFindMuxSelectorInterface* selector ) { LOG(logDEBUG) << "QuickFindMux::registerSelector"; // The selector object we will use when forwarding search requests selector_ = selector; unregisterAllSearchables(); if ( selector ) { for ( auto i: selector_->getAllSearchables() ) registerSearchable( i ); } else { // null selector, all is well, we don't do anything. } } void QuickFindMux::setDirection( QFDirection direction ) { LOG(logDEBUG) << "QuickFindMux::setDirection: new direction: " << direction; currentDirection_ = direction; } // // Public slots // void QuickFindMux::searchNext() { LOG(logDEBUG) << "QuickFindMux::searchNext"; if ( currentDirection_ == Forward ) searchForward(); else searchBackward(); } void QuickFindMux::searchPrevious() { LOG(logDEBUG) << "QuickFindMux::searchPrevious"; if ( currentDirection_ == Forward ) searchBackward(); else searchForward(); } void QuickFindMux::searchForward() { LOG(logDEBUG) << "QuickFindMux::searchForward"; if ( auto searchable = getSearchableWidget() ) searchable->searchForward(); } void QuickFindMux::searchBackward() { LOG(logDEBUG) << "QuickFindMux::searchBackward"; if ( auto searchable = getSearchableWidget() ) searchable->searchBackward(); } void QuickFindMux::setNewPattern( const QString& new_pattern, bool ignore_case ) { static std::shared_ptr config = Persistent( "settings" ); LOG(logDEBUG) << "QuickFindMux::setNewPattern"; // If we must do an incremental search, we do it now if ( config->isQuickfindIncremental() ) { pattern_->changeSearchPattern( new_pattern, ignore_case ); if ( auto searchable = getSearchableWidget() ) { if ( currentDirection_ == Forward ) searchable->incrementallySearchForward(); else searchable->incrementallySearchBackward(); } } } void QuickFindMux::confirmPattern( const QString& new_pattern, bool ignore_case ) { static std::shared_ptr config = Persistent( "settings" ); pattern_->changeSearchPattern( new_pattern, ignore_case ); // if non-incremental, we perform the search now if ( ! config->isQuickfindIncremental() ) { searchNext(); } else { if ( auto searchable = getSearchableWidget() ) searchable->incrementalSearchStop(); } } void QuickFindMux::cancelSearch() { static std::shared_ptr config = Persistent( "settings" ); if ( config->isQuickfindIncremental() ) { if ( auto searchable = getSearchableWidget() ) searchable->incrementalSearchAbort(); } } // // Private slots // void QuickFindMux::changeQuickFind( const QString& new_pattern, QFDirection new_direction ) { pattern_->changeSearchPattern( new_pattern ); setDirection( new_direction ); } void QuickFindMux::notifyPatternChanged() { emit patternChanged( pattern_->getPattern() ); } // // Private member functions // // Use the registered 'selector' to determine where to send the search requests. SearchableWidgetInterface* QuickFindMux::getSearchableWidget() const { LOG(logDEBUG) << "QuickFindMux::getSearchableWidget"; SearchableWidgetInterface* searchable = nullptr; if ( selector_ ) searchable = selector_->getActiveSearchable(); else LOG(logWARNING) << "QuickFindMux::getActiveSearchable() no registered selector"; return searchable; } void QuickFindMux::registerSearchable( QObject* searchable ) { LOG(logDEBUG) << "QuickFindMux::registerSearchable"; // The searchable can change our qf pattern connect( searchable, SIGNAL( changeQuickFind( const QString&, QuickFindMux::QFDirection ) ), this, SLOT( changeQuickFind( const QString&, QuickFindMux::QFDirection ) ) ); // Send us notifications connect( searchable, SIGNAL( notifyQuickFind( const QFNotification& ) ), this, SIGNAL( notify( const QFNotification& ) ) ); // And clear them connect( searchable, SIGNAL( clearQuickFindNotification() ), this, SIGNAL( clearNotification() ) ); // Search can be initiated by the view itself connect( searchable, SIGNAL( searchNext() ), this, SLOT( searchNext() ) ); connect( searchable, SIGNAL( searchPrevious() ), this, SLOT( searchPrevious() ) ); registeredSearchables_.push_back( searchable ); } void QuickFindMux::unregisterAllSearchables() { for ( auto searchable: registeredSearchables_ ) disconnect( searchable, 0, this, 0 ); registeredSearchables_.clear(); }