From 929cc27ffe7b35177e34ac8728bdbeeb5464cd6b Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Mon, 16 Mar 2015 00:37:16 +0100 Subject: [PATCH] Add QRegularExpression based regexp tool Currently only the QRegExp based regexp tool is available to help build regular expression. This patch aims to add the equivalent that use the new QRegularExpression class. Change-Id: Ie5f711640b32a6d10ce44d2c7795062c1aacce3f Reviewed-by: Friedemann Kleint --- .../doc/images/regularexpression-example.png | Bin 0 -> 78860 bytes .../widgets/doc/src/regularexpression.qdoc | 48 +++ .../tools/regularexpression/images/copy.png | Bin 0 -> 1338 bytes .../widgets/tools/regularexpression/main.cpp | 51 +++ .../regularexpression/regularexpression.pro | 11 + .../regularexpression/regularexpression.qrc | 5 + .../regularexpressiondialog.cpp | 349 ++++++++++++++++++ .../regularexpressiondialog.h | 100 +++++ examples/widgets/tools/tools.pro | 1 + 9 files changed, 565 insertions(+) create mode 100644 examples/widgets/doc/images/regularexpression-example.png create mode 100644 examples/widgets/doc/src/regularexpression.qdoc create mode 100644 examples/widgets/tools/regularexpression/images/copy.png create mode 100644 examples/widgets/tools/regularexpression/main.cpp create mode 100644 examples/widgets/tools/regularexpression/regularexpression.pro create mode 100644 examples/widgets/tools/regularexpression/regularexpression.qrc create mode 100644 examples/widgets/tools/regularexpression/regularexpressiondialog.cpp create mode 100644 examples/widgets/tools/regularexpression/regularexpressiondialog.h diff --git a/examples/widgets/doc/images/regularexpression-example.png b/examples/widgets/doc/images/regularexpression-example.png new file mode 100644 index 0000000000000000000000000000000000000000..d426d8514a50db4ad01a9fd3bcf2a2d59d8b39e4 GIT binary patch literal 78860 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 KmoI*58t`Ael>93I literal 0 HcmV?d00001 diff --git a/examples/widgets/doc/src/regularexpression.qdoc b/examples/widgets/doc/src/regularexpression.qdoc new file mode 100644 index 00000000000..804867fb58a --- /dev/null +++ b/examples/widgets/doc/src/regularexpression.qdoc @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example tools/regularexpression + \title QRegularExpression Example + \ingroup examples-widgets-tools + + \brief The QRegularExpression example shows how regular expressions in Qt are + applied to text by providing an environment in which new regular expressions can be + created and tested on custom text strings. + + The example makes usage of the QRegularExpression class, which has been + introduced in Qt 5.0. QRegularExpression implements Perl-compatible regular + expressions, supporting a number of advanced matching features, such as + case insensitive matching, multiline matching, Unicode properties selectors + and partial/incremental matching. + + QRegularExpression is a big improvement over QRegExp in terms of features + and performance and should be used in all new code. + + \image regularexpression-example.png +*/ + diff --git a/examples/widgets/tools/regularexpression/images/copy.png b/examples/widgets/tools/regularexpression/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..2aeb28288f58ddffdd1d75115f170c5bf2773814 GIT binary patch literal 1338 zcmV-A1;zS_P)3P|jKV4ArrNQZsr&q&3Fam_48Lh`MiYI|sB6GiaYuZZ? zasnKC=d9Ws*vOa?K!llv;~9}LDH=;*C6q)snnH7j#=aB8{{oN_lX)cZ$XJrkAB0_u z!sQ7f5=*1>!|zQrby)$h>)1Bcke)jH%(>@ZE)hRgo<&7f4Jw)5udTzKv5Ch3thOcm zx#)*$6jZ zxjE=2CQwjNfFaFqeBMc>`320FTpYmRPeJsB@I$Z8%>Zil0#HL{*yW1HLMx&9BQ>hew>g`42C!b-4K{%G& zPNKpdi`TSeSQ5jt zz}D6l-wA<00HP?u@AqSEZ4IXsmC*dI=c&nj!3&r@K%3kE+d(!rH~Ds?RumQ0==)XR zsU3kw0Ovao0D#OTfFv_dBoZhqui^lIxB!co0iZTo)dw&I|ClF}JUvZG$*D>XptrLF zi9N;m7cj8^d~x*v0Ho^4m=ue}P^PGYdPu;S8Mtc&=A4=P=T~F|kkV6X0*FSV+&mNt zp}4dH*9HaLW{2dU0UTt+1SmUX21q@ea}t@;xj-PrWmUM?EueooW3GLWY2c%FnE?J> zJ*6hCuC8*3w@NB-xmUnF8@PU+0q)ELXD;m%K&qWYi;j}haZKLWGrnrG9>`fBl6@D%o`^aXzvlAyk=W}Pc`B^ahku5Y4`j}CIOJCBx$u% zLNX5qgK)WA+>l;M=(ES;f!poI@e{8lpM9a6Ogos0nT|fmct-%0O2q-B6)w#;8B$U@ z_bIi*;ou_U#l=Mq_2TiDT=X8flj*JiEiEl>>0qJM(w7a5mzS5}^Z8)2+4y~FX^BG+ z0F4U^3(c|s(4vx3lM#*SPTzP`J2hanT6y)<3jNMtFeLKw^6s-|9N8B@Q&W>$nrBK+ zA`_~b#ukg2H$b09M@J)VZEfEC{CpGp+d-zXy_)|gKy!05p8`rp5L7=^KR-Xu>(*#A zk-EA%=fkvJOdl{E&Bk~~0Hsptb~>HBVoFMHK9sb+zTTOWlOvfHXH#`n0F8}}Zi~f& wfq{WYZEdYHH#b*S)7=30e@0BgL78sX-$OZ87=>`i1ONa407*qoM6N<$g6NH5LI3~& literal 0 HcmV?d00001 diff --git a/examples/widgets/tools/regularexpression/main.cpp b/examples/widgets/tools/regularexpression/main.cpp new file mode 100644 index 00000000000..a5ef4106889 --- /dev/null +++ b/examples/widgets/tools/regularexpression/main.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "regularexpressiondialog.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + RegularExpressionDialog dialog; + dialog.show(); + return app.exec(); +} diff --git a/examples/widgets/tools/regularexpression/regularexpression.pro b/examples/widgets/tools/regularexpression/regularexpression.pro new file mode 100644 index 00000000000..8e72e171b8b --- /dev/null +++ b/examples/widgets/tools/regularexpression/regularexpression.pro @@ -0,0 +1,11 @@ +QT += widgets + +HEADERS = regularexpressiondialog.h +SOURCES = regularexpressiondialog.cpp \ + main.cpp + +RESOURCES += regularexpression.qrc + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/regularexpression +INSTALLS += target diff --git a/examples/widgets/tools/regularexpression/regularexpression.qrc b/examples/widgets/tools/regularexpression/regularexpression.qrc new file mode 100644 index 00000000000..ce7e104af3d --- /dev/null +++ b/examples/widgets/tools/regularexpression/regularexpression.qrc @@ -0,0 +1,5 @@ + + + images/copy.png + + diff --git a/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp b/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp new file mode 100644 index 00000000000..d40b4b325dd --- /dev/null +++ b/examples/widgets/tools/regularexpression/regularexpressiondialog.cpp @@ -0,0 +1,349 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo +** Copyright (C) 2015 Samuel Gaist +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "regularexpressiondialog.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +Q_DECLARE_METATYPE(QRegularExpression::MatchType) + +RegularExpressionDialog::RegularExpressionDialog(QWidget *parent) + : QDialog(parent) +{ + setupUi(); + setWindowTitle(tr("QRegularExpression Example")); + + connect(patternLineEdit, &QLineEdit::textChanged, this, &RegularExpressionDialog::refresh); + connect(subjectTextEdit, &QPlainTextEdit::textChanged, this, &RegularExpressionDialog::refresh); + + connect(caseInsensitiveOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(dotMatchesEverythingOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(multilineOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(extendedPatternSyntaxOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(invertedGreedinessOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(dontCaptureOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(useUnicodePropertiesOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(optimizeOnFirstUsageOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(dontAutomaticallyOptimizeOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + + connect(offsetSpinBox, static_cast(&QSpinBox::valueChanged), + this, &RegularExpressionDialog::refresh); + + connect(matchTypeComboBox, static_cast(&QComboBox::currentIndexChanged), + this, &RegularExpressionDialog::refresh); + + connect(anchoredMatchOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + connect(dontCheckSubjectStringMatchOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh); + + patternLineEdit->setText(tr("(\\+?\\d+)-(?\\d+)-(?\\w+)")); + subjectTextEdit->setPlainText(tr("My office number is +43-152-0123456, my mobile is 001-41-255512 instead.")); + + refresh(); +} + +void RegularExpressionDialog::refresh() +{ + setUpdatesEnabled(false); + + const QString pattern = patternLineEdit->text(); + const QString text = subjectTextEdit->toPlainText(); + + offsetSpinBox->setMaximum(qMax(0, text.length() - 1)); + + QString escaped = pattern; + escaped.replace(QLatin1String("\\"), QLatin1String("\\\\")); + escaped.replace(QLatin1String("\""), QLatin1String("\\\"")); + escaped.prepend(QLatin1String("\"")); + escaped.append(QLatin1String("\"")); + escapedPatternLineEdit->setText(escaped); + + QRegularExpression rx(pattern); + QRegularExpression::MatchType matchType = matchTypeComboBox->currentData().value(); + QRegularExpression::PatternOptions patternOptions = QRegularExpression::NoPatternOption; + QRegularExpression::MatchOptions matchOptions = QRegularExpression::NoMatchOption; + + if (anchoredMatchOptionCheckBox->isChecked()) + matchOptions |= QRegularExpression::AnchoredMatchOption; + if (dontCheckSubjectStringMatchOptionCheckBox->isChecked()) + matchOptions |= QRegularExpression::DontCheckSubjectStringMatchOption; + + if (caseInsensitiveOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::CaseInsensitiveOption; + if (dotMatchesEverythingOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::DotMatchesEverythingOption; + if (multilineOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::MultilineOption; + if (extendedPatternSyntaxOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::ExtendedPatternSyntaxOption; + if (invertedGreedinessOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::InvertedGreedinessOption; + if (dontCaptureOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::DontCaptureOption; + if (useUnicodePropertiesOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::UseUnicodePropertiesOption; + if (optimizeOnFirstUsageOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::OptimizeOnFirstUsageOption; + if (dontAutomaticallyOptimizeOptionCheckBox->isChecked()) + patternOptions |= QRegularExpression::DontAutomaticallyOptimizeOption; + + 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()); + + if (rx.isValid()) { + const int capturingGroupsCount = rx.captureCount() + 1; + + QRegularExpressionMatchIterator iterator = rx.globalMatch(text, offsetSpinBox->value(), matchType, matchOptions); + int i = 0; + + while (iterator.hasNext()) { + QRegularExpressionMatch match = iterator.next(); + + 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; + } + } + + matchDetailsTreeWidget->expandAll(); + + namedGroupsTreeWidget->clear(); + namedGroupsTreeWidget->setEnabled(rx.isValid()); + + if (rx.isValid()) { + regexpStatusLabel->setText(tr("Valid")); + + 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())); + } + + setUpdatesEnabled(true); +} + +void RegularExpressionDialog::copyEscapedPatternToClipboard() +{ +#ifndef QT_NO_CLIPBOARD + QClipboard *clipboard = QGuiApplication::clipboard(); + if (clipboard) + clipboard->setText(escapedPatternLineEdit->text()); +#endif +} + +void RegularExpressionDialog::setupUi() +{ + QWidget *leftHalfContainer = setupLeftUi(); + + QFrame *verticalSeparator = new QFrame; + verticalSeparator->setFrameStyle(QFrame::VLine | QFrame::Sunken); + + QWidget *rightHalfContainer = setupRightUi(); + + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addWidget(leftHalfContainer); + mainLayout->addWidget(verticalSeparator); + mainLayout->addWidget(rightHalfContainer); + + setLayout(mainLayout); +} + +QWidget *RegularExpressionDialog::setupLeftUi() +{ + QWidget *container = new QWidget; + + QFormLayout *layout = new QFormLayout(container); + layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + layout->setMargin(0); + + QLabel *regexpAndSubjectLabel = new QLabel(tr("

Regular expression and text input

")); + layout->addRow(regexpAndSubjectLabel); + + patternLineEdit = new QLineEdit; + patternLineEdit->setClearButtonEnabled(true); + layout->addRow(tr("&Pattern:"), patternLineEdit); + + escapedPatternLineEdit = new QLineEdit; + escapedPatternLineEdit->setReadOnly(true); + QPalette palette = escapedPatternLineEdit->palette(); + palette.setBrush(QPalette::Base, palette.brush(QPalette::Disabled, QPalette::Base)); + escapedPatternLineEdit->setPalette(palette); + +#ifndef QT_NO_CLIPBOARD + QAction *copyEscapedPatternAction = new QAction(this); + copyEscapedPatternAction->setText(tr("Copy to clipboard")); + copyEscapedPatternAction->setIcon(QIcon(QStringLiteral(":/images/copy.png"))); + connect(copyEscapedPatternAction, &QAction::triggered, this, &RegularExpressionDialog::copyEscapedPatternToClipboard); + escapedPatternLineEdit->addAction(copyEscapedPatternAction, QLineEdit::TrailingPosition); +#endif + + layout->addRow(tr("&Escaped pattern:"), escapedPatternLineEdit); + + subjectTextEdit = new QPlainTextEdit; + layout->addRow(tr("&Subject text:"), subjectTextEdit); + + caseInsensitiveOptionCheckBox = new QCheckBox(tr("Case insensitive (/i)")); + dotMatchesEverythingOptionCheckBox = new QCheckBox(tr("Dot matches everything (/s)")); + multilineOptionCheckBox = new QCheckBox(tr("Multiline (/m)")); + extendedPatternSyntaxOptionCheckBox = new QCheckBox(tr("Extended pattern (/x)")); + invertedGreedinessOptionCheckBox = new QCheckBox(tr("Inverted greediness")); + dontCaptureOptionCheckBox = new QCheckBox(tr("Don't capture")); + useUnicodePropertiesOptionCheckBox = new QCheckBox(tr("Use unicode properties (/u)")); + optimizeOnFirstUsageOptionCheckBox = new QCheckBox(tr("Optimize on first usage")); + dontAutomaticallyOptimizeOptionCheckBox = new QCheckBox(tr("Don't automatically optimize")); + + QGridLayout *patternOptionsCheckBoxLayout = new QGridLayout; + int gridRow = 0; + patternOptionsCheckBoxLayout->addWidget(caseInsensitiveOptionCheckBox, gridRow, 1); + patternOptionsCheckBoxLayout->addWidget(dotMatchesEverythingOptionCheckBox, gridRow, 2); + ++gridRow; + patternOptionsCheckBoxLayout->addWidget(multilineOptionCheckBox, gridRow, 1); + patternOptionsCheckBoxLayout->addWidget(extendedPatternSyntaxOptionCheckBox, gridRow, 2); + ++gridRow; + patternOptionsCheckBoxLayout->addWidget(invertedGreedinessOptionCheckBox, gridRow, 1); + patternOptionsCheckBoxLayout->addWidget(dontCaptureOptionCheckBox, gridRow, 2); + ++gridRow; + patternOptionsCheckBoxLayout->addWidget(useUnicodePropertiesOptionCheckBox, gridRow, 1); + patternOptionsCheckBoxLayout->addWidget(optimizeOnFirstUsageOptionCheckBox, gridRow, 2); + ++gridRow; + patternOptionsCheckBoxLayout->addWidget(dontAutomaticallyOptimizeOptionCheckBox, gridRow, 1); + + layout->addRow(tr("Pattern options:"), patternOptionsCheckBoxLayout); + + offsetSpinBox = new QSpinBox; + layout->addRow(tr("Match &offset:"), offsetSpinBox); + + matchTypeComboBox = new QComboBox; + matchTypeComboBox->addItem(tr("Normal"), QVariant::fromValue(QRegularExpression::NormalMatch)); + matchTypeComboBox->addItem(tr("Partial prefer complete"), QVariant::fromValue(QRegularExpression::PartialPreferCompleteMatch)); + matchTypeComboBox->addItem(tr("Partial prefer first"), QVariant::fromValue(QRegularExpression::PartialPreferFirstMatch)); + matchTypeComboBox->addItem(tr("No match"), QVariant::fromValue(QRegularExpression::NoMatch)); + layout->addRow(tr("Match &type:"), matchTypeComboBox); + + dontCheckSubjectStringMatchOptionCheckBox = new QCheckBox(tr("Don't check subject string")); + anchoredMatchOptionCheckBox = new QCheckBox(tr("Anchored match")); + + QGridLayout *matchOptionsCheckBoxLayout = new QGridLayout; + matchOptionsCheckBoxLayout->addWidget(dontCheckSubjectStringMatchOptionCheckBox, 0, 0); + matchOptionsCheckBoxLayout->addWidget(anchoredMatchOptionCheckBox, 0, 1); + layout->addRow(tr("Match options:"), matchOptionsCheckBoxLayout); + + return container; +} + +QWidget *RegularExpressionDialog::setupRightUi() +{ + QWidget *container = new QWidget; + + QFormLayout *layout = new QFormLayout(container); + layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + layout->setMargin(0); + + QLabel *matchInfoLabel = new QLabel(tr("

Match information

")); + layout->addRow(matchInfoLabel); + + matchDetailsTreeWidget = new QTreeWidget; + matchDetailsTreeWidget->setHeaderLabels(QStringList() << tr("Match index") << tr("Group index") << tr("Captured string")); + matchDetailsTreeWidget->setSizeAdjustPolicy(QTreeWidget::AdjustToContents); + layout->addRow(tr("Match details:"), matchDetailsTreeWidget); + + QFrame *horizontalSeparator = new QFrame; + horizontalSeparator->setFrameStyle(QFrame::HLine | QFrame::Sunken); + layout->addRow(horizontalSeparator); + + QLabel *regexpInfoLabel = new QLabel(tr("

Regular expression information

")); + layout->addRow(regexpInfoLabel); + + regexpStatusLabel = new QLabel(tr("Valid")); + regexpStatusLabel->setWordWrap(true); + layout->addRow(tr("Pattern status:"), regexpStatusLabel); + + namedGroupsTreeWidget = new QTreeWidget; + namedGroupsTreeWidget->setHeaderLabels(QStringList() << tr("Index") << tr("Named group")); + namedGroupsTreeWidget->setSizeAdjustPolicy(QTreeWidget::AdjustToContents); + namedGroupsTreeWidget->setRootIsDecorated(false); + layout->addRow(tr("Named groups:"), namedGroupsTreeWidget); + + return container; +} diff --git a/examples/widgets/tools/regularexpression/regularexpressiondialog.h b/examples/widgets/tools/regularexpression/regularexpressiondialog.h new file mode 100644 index 00000000000..1b3b147c143 --- /dev/null +++ b/examples/widgets/tools/regularexpression/regularexpressiondialog.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo +** Copyright (C) 2015 Samuel Gaist +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef REGULAREXPRESSIONDIALOG_H +#define REGULAREXPRESSIONDIALOG_H + +#include + +QT_BEGIN_NAMESPACE +class QCheckBox; +class QComboBox; +class QLabel; +class QLineEdit; +class QSpinBox; +class QPlainTextEdit; +class QTreeWidget; +QT_END_NAMESPACE + +class RegularExpressionDialog : public QDialog +{ + Q_OBJECT + +public: + RegularExpressionDialog(QWidget *parent = 0); + +private: + void refresh(); + void copyEscapedPatternToClipboard(); + void setupUi(); + QWidget *setupLeftUi(); + QWidget *setupRightUi(); + + QLineEdit *patternLineEdit; + QLineEdit *escapedPatternLineEdit; + + QPlainTextEdit *subjectTextEdit; + + QCheckBox *caseInsensitiveOptionCheckBox; + QCheckBox *dotMatchesEverythingOptionCheckBox; + QCheckBox *multilineOptionCheckBox; + QCheckBox *extendedPatternSyntaxOptionCheckBox; + QCheckBox *invertedGreedinessOptionCheckBox; + QCheckBox *dontCaptureOptionCheckBox; + QCheckBox *useUnicodePropertiesOptionCheckBox; + QCheckBox *optimizeOnFirstUsageOptionCheckBox; + QCheckBox *dontAutomaticallyOptimizeOptionCheckBox; + + QSpinBox *offsetSpinBox; + + QComboBox *matchTypeComboBox; + + QCheckBox *anchoredMatchOptionCheckBox; + QCheckBox *dontCheckSubjectStringMatchOptionCheckBox; + + QTreeWidget *matchDetailsTreeWidget; + + QLabel *regexpStatusLabel; + QTreeWidget *namedGroupsTreeWidget; +}; + +#endif diff --git a/examples/widgets/tools/tools.pro b/examples/widgets/tools/tools.pro index 71784111105..282f8dedeaf 100644 --- a/examples/widgets/tools/tools.pro +++ b/examples/widgets/tools/tools.pro @@ -8,6 +8,7 @@ SUBDIRS = \ plugandpaintplugins \ plugandpaint \ regexp \ + regularexpression \ settingseditor \ styleplugin \ treemodelcompleter \