diff options
Diffstat (limited to 'examples/regexptester')
-rw-r--r-- | examples/regexptester/main.cpp | 11 | ||||
-rw-r--r-- | examples/regexptester/regexptester.cpp | 179 | ||||
-rw-r--r-- | examples/regexptester/regexptester.doc | 35 | ||||
-rw-r--r-- | examples/regexptester/regexptester.h | 42 | ||||
-rw-r--r-- | examples/regexptester/regexptester.pro | 5 |
5 files changed, 272 insertions, 0 deletions
diff --git a/examples/regexptester/main.cpp b/examples/regexptester/main.cpp new file mode 100644 index 000000000..493c955af --- /dev/null +++ b/examples/regexptester/main.cpp @@ -0,0 +1,11 @@ +#include <qapplication.h> +#include "regexptester.h" + +int main(int argc, char **argv) +{ + TQApplication app(argc, argv); + RegexpTester form; + form.show(); + app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(tquit())); + return app.exec(); +} diff --git a/examples/regexptester/regexptester.cpp b/examples/regexptester/regexptester.cpp new file mode 100644 index 000000000..326c02048 --- /dev/null +++ b/examples/regexptester/regexptester.cpp @@ -0,0 +1,179 @@ +#include <qapplication.h> +#include <qcheckbox.h> +#include <qclipboard.h> +#include <qcombobox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qregexp.h> +#include <qstatusbar.h> +#include <qtable.h> + +#include "regexptester.h" + + +RegexpTester::RegexpTester(TQWidget* parent, const char* name, bool modal, + WFlags f) + : TQDialog(parent, name, modal, f) +{ + regexLabel = new TQLabel(this); + regexComboBox = new TQComboBox(this); + regexComboBox->setEditable(true); + regexComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred); + regexLabel->setBuddy(regexComboBox); + textLabel = new TQLabel(this); + textComboBox = new TQComboBox(this); + textComboBox->setEditable(true); + textComboBox->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred); + textLabel->setBuddy(textComboBox); + caseSensitiveCheckBox = new TQCheckBox(this); + caseSensitiveCheckBox->setChecked(true); + minimalCheckBox = new TQCheckBox(this); + wildcardCheckBox = new TQCheckBox(this); + resultTable = new TQTable(3, 3, this); + resultTable->verticalHeader()->hide(); + resultTable->setLeftMargin(0); + resultTable->horizontalHeader()->hide(); + resultTable->setTopMargin(0); + resultTable->setReadOnly(true); + executePushButton = new TQPushButton(this); + executePushButton->setDefault(true); + copyPushButton = new TQPushButton(this); + tquitPushButton = new TQPushButton(this); + statusBar = new TQStatusBar(this); + + TQGridLayout *gridLayout = new TQGridLayout(2, 2, 6); + gridLayout->addWidget(regexLabel, 0, 0); + gridLayout->addWidget(regexComboBox, 0, 1); + gridLayout->addWidget(textLabel, 1, 0); + gridLayout->addWidget(textComboBox, 1, 1); + TQHBoxLayout *checkboxLayout = new TQHBoxLayout(0, 6, 6); + checkboxLayout->addWidget(caseSensitiveCheckBox); + checkboxLayout->addWidget(minimalCheckBox); + checkboxLayout->addWidget(wildcardCheckBox); + checkboxLayout->addStretch(1); + TQVBoxLayout *buttonLayout = new TQVBoxLayout(0, 6, 6); + buttonLayout->addWidget(executePushButton); + buttonLayout->addWidget(copyPushButton); + buttonLayout->addWidget(tquitPushButton); + buttonLayout->addStretch(1); + TQHBoxLayout *middleLayout = new TQHBoxLayout(0, 6, 6); + middleLayout->addWidget(resultTable); + middleLayout->addLayout(buttonLayout); + TQVBoxLayout *mainLayout = new TQVBoxLayout(this, 6, 6); + mainLayout->addLayout(gridLayout); + mainLayout->addLayout(checkboxLayout); + mainLayout->addLayout(middleLayout); + mainLayout->addWidget(statusBar); + + resize(TQSize(500, 350).expandedTo(minimumSizeHint())); + + languageChange(); + + connect(copyPushButton, SIGNAL(clicked()), this, SLOT(copy())); + connect(executePushButton, SIGNAL(clicked()), this, SLOT(execute())); + connect(tquitPushButton, SIGNAL(clicked()), this, SLOT(accept())); + + execute(); +} + +void RegexpTester::execute() +{ + TQString regex = regexComboBox->currentText(); + TQString text = textComboBox->currentText(); + if (!regex.isEmpty() && !text.isEmpty()) { + TQRegExp re(regex); + re.setCaseSensitive(caseSensitiveCheckBox->isChecked()); + re.setMinimal(minimalCheckBox->isChecked()); + bool wildcard = wildcardCheckBox->isChecked(); + re.setWildcard(wildcard); + if (!re.isValid()) { + statusBar->message(tr("Invalid regular expression: %1") + .arg(re.errorString())); + return; + } + int offset = re.search(text); + int captures = re.numCaptures(); + int row = 0; + const int OFFSET = 5; + resultTable->setNumRows(0); + resultTable->setNumRows(captures + OFFSET); + resultTable->setText(row, 0, tr("Regex")); + TQString escaped = regex; + escaped = escaped.replace("\\", "\\\\"); + resultTable->setText(row, 1, escaped); + resultTable->item(row, 1)->setSpan(1, 2); + if (offset != -1) { + ++row; + resultTable->setText(row, 0, tr("Offset")); + resultTable->setText(row, 1, TQString::number(offset)); + resultTable->item(row, 1)->setSpan(1, 2); + if (!wildcard) { + ++row; + resultTable->setText(row, 0, tr("Captures")); + resultTable->setText(row, 1, TQString::number(captures)); + resultTable->item(row, 1)->setSpan(1, 2); + ++row; + resultTable->setText(row, 1, tr("Text")); + resultTable->setText(row, 2, tr("Characters")); + } + ++row; + resultTable->setText(row, 0, tr("Match")); + resultTable->setText(row, 1, re.cap(0)); + resultTable->setText(row, 2, TQString::number(re.matchedLength())); + if (!wildcard) { + for (int i = 1; i <= captures; ++i) { + resultTable->setText(row + i, 0, tr("Capture #%1").arg(i)); + resultTable->setText(row + i, 1, re.cap(i)); + resultTable->setText(row + i, 2, + TQString::number(re.cap(i).length())); + } + } + else + resultTable->setNumRows(3); + } + else { + resultTable->setNumRows(2); + ++row; + resultTable->setText(row, 0, tr("No matches")); + resultTable->item(row, 0)->setSpan(1, 3); + } + resultTable->adjustColumn(0); + resultTable->adjustColumn(1); + resultTable->adjustColumn(2); + statusBar->message(tr("Executed \"%1\" on \"%2\"") + .arg(escaped).arg(text)); + } + else + statusBar->message(tr("A regular expression and a text must be given")); +} + +void RegexpTester::copy() +{ + TQString escaped = regexComboBox->currentText(); + if (!escaped.isEmpty()) { + escaped = escaped.replace("\\", "\\\\"); + TQClipboard *cb = TQApplication::clipboard(); + cb->setText(escaped, TQClipboard::Clipboard); + if (cb->supportsSelection()) + cb->setText(escaped, TQClipboard::Selection); + statusBar->message(tr("Copied \"%1\" to the clipboard") + .arg(escaped)); + } +} + +void RegexpTester::languageChange() +{ + setCaption(tr("Regex Tester")); + regexLabel->setText(tr("&Regex:")); + regexComboBox->insertItem(tr("[A-Z]+=(\\d+):(\\d*)")); + textLabel->setText(tr("&Text:")); + textComboBox->insertItem(tr("ABC=12:3456")); + caseSensitiveCheckBox->setText(tr("Case &Sensitive")); + minimalCheckBox->setText(tr("&Minimal")); + wildcardCheckBox->setText(tr("&Wildcard")); + copyPushButton->setText(tr("&Copy")); + executePushButton->setText(tr("&Execute")); + tquitPushButton->setText(tr("&Quit")); +} + diff --git a/examples/regexptester/regexptester.doc b/examples/regexptester/regexptester.doc new file mode 100644 index 000000000..81f7cb435 --- /dev/null +++ b/examples/regexptester/regexptester.doc @@ -0,0 +1,35 @@ +/*! + \page regexptester-example.html + + \ingroup examples + + \title A Small Application for Testing Regular Expressions + + Regular expressions can sometimes be tricky to get right, + especially those that use the * quantifier. This application lets + you type in a regexp (without doubling the backslashes) and some + test text, and to execute the regexp and see the results. If you + click the Copy button the regexp will be copied to the clipboard + (with the backslashes doubled, ready for you to paste into your + program). Previous regexps and test texts are remembered + throughout the session and can be accessed by dropping down the + comboboxes. + + <hr> + + Header file: + + \include regexptester/regexptester.h + + <hr> + + Implementation: + + \include regexptester/regexptester.cpp + + <hr> + + Main: + + \include regexptester/main.cpp +*/ diff --git a/examples/regexptester/regexptester.h b/examples/regexptester/regexptester.h new file mode 100644 index 000000000..faff773bf --- /dev/null +++ b/examples/regexptester/regexptester.h @@ -0,0 +1,42 @@ +#ifndef REGEXPTESTER_H +#define REGEXPTESTER_H + +#include <qdialog.h> + +class TQCheckBox; +class TQComboBox; +class TQLabel; +class TQPushButton; +class TQStatusBar; +class TQTable; + +class RegexpTester : public TQDialog +{ + Q_OBJECT + +public: + RegexpTester(TQWidget* parent=0, const char* name=0, bool modal=false, + WFlags f=0); + + TQLabel *regexLabel; + TQComboBox *regexComboBox; + TQLabel *textLabel; + TQComboBox *textComboBox; + TQCheckBox *caseSensitiveCheckBox; + TQCheckBox *minimalCheckBox; + TQCheckBox *wildcardCheckBox; + TQTable *resultTable; + TQPushButton *executePushButton; + TQPushButton *copyPushButton; + TQPushButton *tquitPushButton; + TQStatusBar *statusBar; + +public slots: + void copy(); + void execute(); + +private: + void languageChange(); +}; + +#endif // REGEXPTESTER_H diff --git a/examples/regexptester/regexptester.pro b/examples/regexptester/regexptester.pro new file mode 100644 index 000000000..9aeee9f8f --- /dev/null +++ b/examples/regexptester/regexptester.pro @@ -0,0 +1,5 @@ +SOURCES += main.cpp +HEADERS += regexptester.h +SOURCES += regexptester.cpp + +REQUIRES += table full-config |