From ee8b61bcf56e03aae0f8e346e70330276e221843 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 3 Feb 2017 10:06:09 +0100 Subject: QRegularExpression example: Handle empty patterns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, when clearing the pattern by clicking the clear button, the result match list would display a list of empty matches since apparently an empty pattern matches as many times as the subject is long. This is confusing when using the tool. Restructure RegularExpressionDialog::refresh() so that it bails out if the pattern is empty or invalid. Change-Id: I8119a75db50cead3f64394016e3390a9bf7d0bf7 Reviewed-by: Topi Reiniƶ --- .../regularexpression/regularexpressiondialog.cpp | 98 +++++++++++++--------- .../regularexpression/regularexpressiondialog.h | 1 + 2 files changed, 58 insertions(+), 41 deletions(-) (limited to 'examples/widgets/tools') diff --git a/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp b/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp index 7a67c763d8..371e2bda4b 100644 --- a/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp +++ b/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp @@ -109,6 +109,19 @@ RegularExpressionDialog::RegularExpressionDialog(QWidget *parent) refresh(); } +void RegularExpressionDialog::setResultUiEnabled(bool enabled) +{ + matchDetailsTreeWidget->setEnabled(enabled); + namedGroupsTreeWidget->setEnabled(enabled); +} + +static void setTextColor(QWidget *widget, const QColor &color) +{ + QPalette palette = widget->palette(); + palette.setColor(QPalette::Text, color); + widget->setPalette(palette); +} + void RegularExpressionDialog::refresh() { setUpdatesEnabled(false); @@ -125,7 +138,30 @@ void RegularExpressionDialog::refresh() escaped.append(QLatin1Char('"')); escapedPatternLineEdit->setText(escaped); + setTextColor(patternLineEdit, subjectTextEdit->palette().color(QPalette::Text)); + matchDetailsTreeWidget->clear(); + namedGroupsTreeWidget->clear(); + regexpStatusLabel->setText(QString()); + + if (pattern.isEmpty()) { + setResultUiEnabled(false); + setUpdatesEnabled(true); + return; + } + QRegularExpression rx(pattern); + if (!rx.isValid()) { + setTextColor(patternLineEdit, Qt::red); + regexpStatusLabel->setText(tr("Invalid: syntax error at position %1 (%2)") + .arg(rx.patternErrorOffset()) + .arg(rx.errorString())); + setResultUiEnabled(false); + setUpdatesEnabled(true); + return; + } + + setResultUiEnabled(true); + QRegularExpression::MatchType matchType = matchTypeComboBox->currentData().value(); QRegularExpression::PatternOptions patternOptions = QRegularExpression::NoPatternOption; QRegularExpression::MatchOptions matchOptions = QRegularExpression::NoMatchOption; @@ -156,60 +192,40 @@ void RegularExpressionDialog::refresh() rx.setPatternOptions(patternOptions); - QPalette palette = patternLineEdit->palette(); - if (rx.isValid()) - palette.setColor(QPalette::Text, subjectTextEdit->palette().color(QPalette::Text)); - else - palette.setColor(QPalette::Text, Qt::red); - patternLineEdit->setPalette(palette); - - matchDetailsTreeWidget->clear(); - matchDetailsTreeWidget->setEnabled(rx.isValid()); + const int capturingGroupsCount = rx.captureCount() + 1; - if (rx.isValid()) { - const int capturingGroupsCount = rx.captureCount() + 1; + QRegularExpressionMatchIterator iterator = rx.globalMatch(text, offsetSpinBox->value(), matchType, matchOptions); + int i = 0; - QRegularExpressionMatchIterator iterator = rx.globalMatch(text, offsetSpinBox->value(), matchType, matchOptions); - int i = 0; + while (iterator.hasNext()) { + QRegularExpressionMatch match = iterator.next(); - while (iterator.hasNext()) { - QRegularExpressionMatch match = iterator.next(); + QTreeWidgetItem *matchDetailTopItem = new QTreeWidgetItem(matchDetailsTreeWidget); + matchDetailTopItem->setText(0, QString::number(i)); - QTreeWidgetItem *matchDetailTopItem = new QTreeWidgetItem(matchDetailsTreeWidget); - matchDetailTopItem->setText(0, QString::number(i)); - - for (int captureGroupIndex = 0; captureGroupIndex < capturingGroupsCount; ++captureGroupIndex) { - QTreeWidgetItem *matchDetailItem = new QTreeWidgetItem(matchDetailTopItem); - matchDetailItem->setText(1, QString::number(captureGroupIndex)); - matchDetailItem->setText(2, match.captured(captureGroupIndex)); - } - - ++i; + for (int captureGroupIndex = 0; captureGroupIndex < capturingGroupsCount; ++captureGroupIndex) { + QTreeWidgetItem *matchDetailItem = new QTreeWidgetItem(matchDetailTopItem); + matchDetailItem->setText(1, QString::number(captureGroupIndex)); + matchDetailItem->setText(2, match.captured(captureGroupIndex)); } + + ++i; } matchDetailsTreeWidget->expandAll(); - namedGroupsTreeWidget->clear(); - namedGroupsTreeWidget->setEnabled(rx.isValid()); - - if (rx.isValid()) { - regexpStatusLabel->setText(tr("Valid")); + regexpStatusLabel->setText(tr("Valid")); - const QStringList namedCaptureGroups = rx.namedCaptureGroups(); - for (int i = 0; i < namedCaptureGroups.size(); ++i) { - const QString currentNamedCaptureGroup = namedCaptureGroups.at(i); + const QStringList namedCaptureGroups = rx.namedCaptureGroups(); + for (int i = 0; i < namedCaptureGroups.size(); ++i) { + const QString currentNamedCaptureGroup = namedCaptureGroups.at(i); - QTreeWidgetItem *namedGroupItem = new QTreeWidgetItem(namedGroupsTreeWidget); - namedGroupItem->setText(0, QString::number(i)); - namedGroupItem->setText(1, currentNamedCaptureGroup.isNull() ? tr("") : currentNamedCaptureGroup); - } - } else { - regexpStatusLabel->setText(tr("Invalid: syntax error at position %1 (%2)") - .arg(rx.patternErrorOffset()) - .arg(rx.errorString())); + QTreeWidgetItem *namedGroupItem = new QTreeWidgetItem(namedGroupsTreeWidget); + namedGroupItem->setText(0, QString::number(i)); + namedGroupItem->setText(1, currentNamedCaptureGroup.isNull() ? tr("") : currentNamedCaptureGroup); } + setUpdatesEnabled(true); } diff --git a/examples/widgets/tools/regularexpression/regularexpressiondialog.h b/examples/widgets/tools/regularexpression/regularexpressiondialog.h index e75abc83e8..f7d64085fc 100644 --- a/examples/widgets/tools/regularexpression/regularexpressiondialog.h +++ b/examples/widgets/tools/regularexpression/regularexpressiondialog.h @@ -78,6 +78,7 @@ private: void setupUi(); QWidget *setupLeftUi(); QWidget *setupRightUi(); + void setResultUiEnabled(bool enabled); QLineEdit *patternLineEdit; QLineEdit *escapedPatternLineEdit; -- cgit v1.2.3