RedPanda-CPP/RedPandaIDE/qsynedit/Search.cpp

84 lines
2.1 KiB
C++
Raw Normal View History

2021-12-26 23:18:28 +08:00
/*
* Copyright (C) 2020-2022 Roy Qu (royqh1979@gmail.com)
*
* This program 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.
*
* This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
*/
2021-08-02 17:24:11 +08:00
#include "Search.h"
SynSearch::SynSearch(QObject *parent):SynSearchBase(parent)
{
}
int SynSearch::length(int aIndex)
{
if (aIndex<0 || aIndex >= mResults.length())
return 0;
return pattern().length();
}
int SynSearch::result(int aIndex)
{
if (aIndex<0 || aIndex >= mResults.length())
return -1;
return mResults[aIndex];
}
int SynSearch::resultCount()
{
return mResults.count();
}
int SynSearch::findAll(const QString &text)
2021-08-02 17:24:11 +08:00
{
mResults.clear();
if (pattern().isEmpty())
return 0;
int start=0;
int next=-1;
while (true) {
2021-08-02 21:58:39 +08:00
if (options().testFlag(ssoMatchCase)) {
next = text.indexOf(pattern(),start,Qt::CaseSensitive);
2021-08-02 17:24:11 +08:00
} else {
next = text.indexOf(pattern(),start,Qt::CaseInsensitive);
2021-08-02 17:24:11 +08:00
}
if (next<0) {
break;
}
start = next + pattern().length();
2021-08-04 09:13:41 +08:00
if (options().testFlag(ssoWholeWord)) {
if (((next<=0) || isDelimitChar(text[next-1]))
2021-08-04 09:13:41 +08:00
&&
( (start>=text.length()) || isDelimitChar(text[start]) )
2021-08-04 09:13:41 +08:00
) {
mResults.append(next);
}
} else {
mResults.append(next);
}
2021-08-02 17:24:11 +08:00
}
return mResults.size();
}
QString SynSearch::replace(const QString &, const QString &aReplacement)
2021-08-02 17:24:11 +08:00
{
return aReplacement;
}
2021-08-04 09:13:41 +08:00
bool SynSearch::isDelimitChar(QChar ch)
{
return !(ch == '_' || ch.isLetterOrNumber());
}