CMake/Source/QtDialog/RegexExplorer.cxx

147 lines
3.4 KiB
C++

/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2015 Kitware, Inc., Gregor Jasny
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "RegexExplorer.h"
RegexExplorer::RegexExplorer(QWidget* p)
: QDialog(p)
, m_matched(false)
{
this->setupUi(this);
for (int i = 1; i < cmsys::RegularExpression::NSUBEXP; ++i) {
matchNumber->addItem(QString("Match %1").arg(QString::number(i)),
QVariant(i));
}
matchNumber->setCurrentIndex(0);
}
void RegexExplorer::setStatusColor(QWidget* widget, bool successful)
{
QColor color = successful ? QColor(0, 127, 0) : Qt::red;
QPalette palette = widget->palette();
palette.setColor(QPalette::Foreground, color);
widget->setPalette(palette);
}
void RegexExplorer::on_regularExpression_textChanged(const QString& text)
{
#ifdef QT_NO_STL
m_regex = text.toAscii().constData();
#else
m_regex = text.toStdString();
#endif
bool validExpression =
stripEscapes(m_regex) && m_regexParser.compile(m_regex);
if (!validExpression) {
m_regexParser.set_invalid();
}
setStatusColor(labelRegexValid, validExpression);
on_inputText_textChanged();
}
void RegexExplorer::on_inputText_textChanged()
{
if (m_regexParser.is_valid()) {
QString plainText = inputText->toPlainText();
#ifdef QT_NO_STL
m_text = plainText.toAscii().constData();
#else
m_text = plainText.toStdString();
#endif
m_matched = m_regexParser.find(m_text);
} else {
m_matched = false;
}
setStatusColor(labelRegexMatch, m_matched);
if (!m_matched) {
clearMatch();
return;
}
#ifdef QT_NO_STL
QString matchText = m_regexParser.match(0).c_str();
#else
QString matchText = QString::fromStdString(m_regexParser.match(0));
#endif
match0->setPlainText(matchText);
on_matchNumber_currentIndexChanged(matchNumber->currentIndex());
}
void RegexExplorer::on_matchNumber_currentIndexChanged(int index)
{
if (!m_matched) {
return;
}
QVariant itemData = matchNumber->itemData(index);
int idx = itemData.toInt();
if (idx < 1 || idx >= cmsys::RegularExpression::NSUBEXP) {
return;
}
#ifdef QT_NO_STL
QString match = m_regexParser.match(idx).c_str();
#else
QString match = QString::fromStdString(m_regexParser.match(idx));
#endif
matchN->setPlainText(match);
}
void RegexExplorer::clearMatch()
{
match0->clear();
matchN->clear();
}
bool RegexExplorer::stripEscapes(std::string& source)
{
const char* in = source.c_str();
std::string result;
result.reserve(source.size());
for (char inc = *in; inc != '\0'; inc = *++in) {
if (inc == '\\') {
char nextc = in[1];
if (nextc == 't') {
result.append(1, '\t');
in++;
} else if (nextc == 'n') {
result.append(1, '\n');
in++;
} else if (nextc == 't') {
result.append(1, '\t');
in++;
} else if (isalnum(nextc) || nextc == '\0') {
return false;
} else {
result.append(1, nextc);
in++;
}
} else {
result.append(1, inc);
}
}
source = result;
return true;
}