/*
* Copyright (C) 2010 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 .
*/
// This file implements QuickFindPattern.
// This class implements part of the Quick Find mechanism, it only stores the
// current search pattern, once it has been confirmed (return pressed),
// it can be asked to return the matches in a specific string.
#include "quickfindpattern.h"
#include "persistentinfo.h"
#include "configuration.h"
QuickFindPattern::QuickFindPattern() : QObject(), regexp_()
{
active_ = false;
}
void QuickFindPattern::changeSearchPattern( const QString& pattern )
{
// Determine the type of regexp depending on the config
QRegExp::PatternSyntax syntax;
switch ( Persistent( "settings" )->quickfindRegexpType() ) {
case Wildcard:
syntax = QRegExp::Wildcard;
break;
case FixedString:
syntax = QRegExp::FixedString;
break;
default:
syntax = QRegExp::RegExp2;
break;
}
regexp_.setPattern( pattern );
regexp_.setPatternSyntax( syntax );
if ( regexp_.isValid() && ( ! regexp_.isEmpty() ) )
active_ = true;
else
active_ = false;
emit patternUpdated();
}
void QuickFindPattern::changeSearchPattern( const QString& pattern, bool ignoreCase )
{
regexp_.setCaseSensitivity(
ignoreCase ? Qt::CaseInsensitive : Qt::CaseSensitive );
changeSearchPattern( pattern );
}
bool QuickFindPattern::matchLine( const QString& line,
QList& matches ) const
{
matches.clear();
if ( active_ ) {
int pos = 0;
while ( ( pos = regexp_.indexIn( line, pos ) ) != -1 ) {
int length = regexp_.matchedLength();
matches << QuickFindMatch( pos, length );
pos += length;
}
}
return ( matches.count() > 0 );
}
bool QuickFindPattern::isLineMatching( const QString& line, int column ) const
{
int pos = 0;
if ( ! active_ )
return false;
if ( ( pos = regexp_.indexIn( line, column ) ) != -1 ) {
lastMatchStart_ = pos;
lastMatchEnd_ = pos + regexp_.matchedLength() - 1;
return true;
}
else
return false;
}
bool QuickFindPattern::isLineMatchingBackward(
const QString& line, int column ) const
{
int pos = 0;
if ( ! active_ )
return false;
if ( ( pos = regexp_.lastIndexIn( line, column ) ) != -1 ) {
lastMatchStart_ = pos;
lastMatchEnd_ = pos + regexp_.matchedLength() - 1;
return true;
}
else
return false;
}
void QuickFindPattern::getLastMatch( int* start_col, int* end_col ) const
{
*start_col = lastMatchStart_;
*end_col = lastMatchEnd_;
}