xref: /glogg/src/quickfindpattern.cpp (revision 11582726a85c08832d009bfe179074b8d1152d21)
1bb02e0acSNicolas Bonnefon /*
2bb02e0acSNicolas Bonnefon  * Copyright (C) 2010 Nicolas Bonnefon and other contributors
3bb02e0acSNicolas Bonnefon  *
4bb02e0acSNicolas Bonnefon  * This file is part of glogg.
5bb02e0acSNicolas Bonnefon  *
6bb02e0acSNicolas Bonnefon  * glogg is free software: you can redistribute it and/or modify
7bb02e0acSNicolas Bonnefon  * it under the terms of the GNU General Public License as published by
8bb02e0acSNicolas Bonnefon  * the Free Software Foundation, either version 3 of the License, or
9bb02e0acSNicolas Bonnefon  * (at your option) any later version.
10bb02e0acSNicolas Bonnefon  *
11bb02e0acSNicolas Bonnefon  * glogg is distributed in the hope that it will be useful,
12bb02e0acSNicolas Bonnefon  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13bb02e0acSNicolas Bonnefon  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14bb02e0acSNicolas Bonnefon  * GNU General Public License for more details.
15bb02e0acSNicolas Bonnefon  *
16bb02e0acSNicolas Bonnefon  * You should have received a copy of the GNU General Public License
17bb02e0acSNicolas Bonnefon  * along with glogg.  If not, see <http://www.gnu.org/licenses/>.
18bb02e0acSNicolas Bonnefon  */
19bb02e0acSNicolas Bonnefon 
20bb02e0acSNicolas Bonnefon // This file implements QuickFindPattern.
21bb02e0acSNicolas Bonnefon // This class implements part of the Quick Find mechanism, it only stores the
22bb02e0acSNicolas Bonnefon // current search pattern, once it has been confirmed (return pressed),
23bb02e0acSNicolas Bonnefon // it can be asked to return the matches in a specific string.
24bb02e0acSNicolas Bonnefon 
25bb02e0acSNicolas Bonnefon #include "quickfindpattern.h"
26bb02e0acSNicolas Bonnefon 
27bb02e0acSNicolas Bonnefon #include "persistentinfo.h"
28bb02e0acSNicolas Bonnefon #include "configuration.h"
29bb02e0acSNicolas Bonnefon 
30bb02e0acSNicolas Bonnefon QuickFindPattern::QuickFindPattern() : QObject(), regexp_()
31bb02e0acSNicolas Bonnefon {
32bb02e0acSNicolas Bonnefon     active_ = false;
33bb02e0acSNicolas Bonnefon }
34bb02e0acSNicolas Bonnefon 
35bb02e0acSNicolas Bonnefon void QuickFindPattern::changeSearchPattern( const QString& pattern )
36bb02e0acSNicolas Bonnefon {
37bb02e0acSNicolas Bonnefon     // Determine the type of regexp depending on the config
38bb02e0acSNicolas Bonnefon     QRegExp::PatternSyntax syntax;
39*11582726SNicolas Bonnefon     switch ( Persistent<Configuration>( "settings" )->quickfindRegexpType() ) {
40bb02e0acSNicolas Bonnefon         case Wildcard:
41bb02e0acSNicolas Bonnefon             syntax = QRegExp::Wildcard;
42bb02e0acSNicolas Bonnefon             break;
43bb02e0acSNicolas Bonnefon         case FixedString:
44bb02e0acSNicolas Bonnefon             syntax = QRegExp::FixedString;
45bb02e0acSNicolas Bonnefon             break;
46bb02e0acSNicolas Bonnefon         default:
47bb02e0acSNicolas Bonnefon             syntax = QRegExp::RegExp2;
48bb02e0acSNicolas Bonnefon             break;
49bb02e0acSNicolas Bonnefon     }
50bb02e0acSNicolas Bonnefon 
51bb02e0acSNicolas Bonnefon     regexp_.setPattern( pattern );
52bb02e0acSNicolas Bonnefon     regexp_.setPatternSyntax( syntax );
53bb02e0acSNicolas Bonnefon 
54bb02e0acSNicolas Bonnefon     if ( regexp_.isValid() && ( ! regexp_.isEmpty() ) )
55bb02e0acSNicolas Bonnefon         active_ = true;
56bb02e0acSNicolas Bonnefon     else
57bb02e0acSNicolas Bonnefon         active_ = false;
58bb02e0acSNicolas Bonnefon 
59bb02e0acSNicolas Bonnefon     emit patternUpdated();
60bb02e0acSNicolas Bonnefon }
61bb02e0acSNicolas Bonnefon 
62bb02e0acSNicolas Bonnefon void QuickFindPattern::changeSearchPattern( const QString& pattern, bool ignoreCase )
63bb02e0acSNicolas Bonnefon {
64bb02e0acSNicolas Bonnefon     regexp_.setCaseSensitivity(
65bb02e0acSNicolas Bonnefon             ignoreCase ? Qt::CaseInsensitive : Qt::CaseSensitive );
66bb02e0acSNicolas Bonnefon     changeSearchPattern( pattern );
67bb02e0acSNicolas Bonnefon }
68bb02e0acSNicolas Bonnefon 
69bb02e0acSNicolas Bonnefon bool QuickFindPattern::matchLine( const QString& line,
70bb02e0acSNicolas Bonnefon         QList<QuickFindMatch>& matches ) const
71bb02e0acSNicolas Bonnefon {
72bb02e0acSNicolas Bonnefon     matches.clear();
73bb02e0acSNicolas Bonnefon 
74bb02e0acSNicolas Bonnefon     if ( active_ ) {
75bb02e0acSNicolas Bonnefon         int pos = 0;
76bb02e0acSNicolas Bonnefon         while ( ( pos = regexp_.indexIn( line, pos ) ) != -1 ) {
77bb02e0acSNicolas Bonnefon             int length = regexp_.matchedLength();
78bb02e0acSNicolas Bonnefon             matches << QuickFindMatch( pos, length );
79bb02e0acSNicolas Bonnefon             pos += length;
80bb02e0acSNicolas Bonnefon         }
81bb02e0acSNicolas Bonnefon     }
82bb02e0acSNicolas Bonnefon 
83bb02e0acSNicolas Bonnefon     return ( matches.count() > 0 );
84bb02e0acSNicolas Bonnefon }
85bb02e0acSNicolas Bonnefon 
86bb02e0acSNicolas Bonnefon bool QuickFindPattern::isLineMatching( const QString& line, int column ) const
87bb02e0acSNicolas Bonnefon {
88bb02e0acSNicolas Bonnefon     int pos = 0;
89bb02e0acSNicolas Bonnefon 
90bb02e0acSNicolas Bonnefon     if ( ! active_ )
91bb02e0acSNicolas Bonnefon         return false;
92bb02e0acSNicolas Bonnefon     if ( ( pos = regexp_.indexIn( line, column ) ) != -1 ) {
93bb02e0acSNicolas Bonnefon         lastMatchStart_ = pos;
94bb02e0acSNicolas Bonnefon         lastMatchEnd_   = pos + regexp_.matchedLength() - 1;
95bb02e0acSNicolas Bonnefon 
96bb02e0acSNicolas Bonnefon         return true;
97bb02e0acSNicolas Bonnefon     }
98bb02e0acSNicolas Bonnefon     else
99bb02e0acSNicolas Bonnefon         return false;
100bb02e0acSNicolas Bonnefon }
101bb02e0acSNicolas Bonnefon 
102bb02e0acSNicolas Bonnefon bool QuickFindPattern::isLineMatchingBackward(
103bb02e0acSNicolas Bonnefon         const QString& line, int column ) const
104bb02e0acSNicolas Bonnefon {
105bb02e0acSNicolas Bonnefon     int pos = 0;
106bb02e0acSNicolas Bonnefon 
107bb02e0acSNicolas Bonnefon     if ( ! active_ )
108bb02e0acSNicolas Bonnefon         return false;
109bb02e0acSNicolas Bonnefon     if ( ( pos = regexp_.lastIndexIn( line, column ) ) != -1 ) {
110bb02e0acSNicolas Bonnefon         lastMatchStart_ = pos;
111bb02e0acSNicolas Bonnefon         lastMatchEnd_   = pos + regexp_.matchedLength() - 1;
112bb02e0acSNicolas Bonnefon 
113bb02e0acSNicolas Bonnefon         return true;
114bb02e0acSNicolas Bonnefon     }
115bb02e0acSNicolas Bonnefon     else
116bb02e0acSNicolas Bonnefon         return false;
117bb02e0acSNicolas Bonnefon }
118bb02e0acSNicolas Bonnefon 
119bb02e0acSNicolas Bonnefon void QuickFindPattern::getLastMatch( int* start_col, int* end_col ) const
120bb02e0acSNicolas Bonnefon {
121bb02e0acSNicolas Bonnefon     *start_col = lastMatchStart_;
122bb02e0acSNicolas Bonnefon     *end_col   = lastMatchEnd_;
123bb02e0acSNicolas Bonnefon }
124