Merge topic 'regex-explorer'
fc656fa4
cmake-gui: Add regex explorer window
This commit is contained in:
commit
e069aa05c6
|
@ -0,0 +1,6 @@
|
||||||
|
regex-explorer
|
||||||
|
--------------
|
||||||
|
|
||||||
|
* The Qt base CMake GUI got a Regular Expression Explorer which could be used to
|
||||||
|
create and evaluate regular expressions in real-time. The explorer window
|
||||||
|
is available via the ``Tools`` menu.
|
|
@ -113,12 +113,15 @@ set(SRCS
|
||||||
QCMakeCacheView.h
|
QCMakeCacheView.h
|
||||||
QCMakeWidgets.cxx
|
QCMakeWidgets.cxx
|
||||||
QCMakeWidgets.h
|
QCMakeWidgets.h
|
||||||
|
RegexExplorer.cxx
|
||||||
|
RegexExplorer.h
|
||||||
)
|
)
|
||||||
QT4_WRAP_UI(UI_SRCS
|
QT4_WRAP_UI(UI_SRCS
|
||||||
CMakeSetupDialog.ui
|
CMakeSetupDialog.ui
|
||||||
Compilers.ui
|
Compilers.ui
|
||||||
CrossCompiler.ui
|
CrossCompiler.ui
|
||||||
AddCacheEntry.ui
|
AddCacheEntry.ui
|
||||||
|
RegexExplorer.ui
|
||||||
)
|
)
|
||||||
QT4_WRAP_CPP(MOC_SRCS
|
QT4_WRAP_CPP(MOC_SRCS
|
||||||
AddCacheEntry.h
|
AddCacheEntry.h
|
||||||
|
@ -128,6 +131,7 @@ QT4_WRAP_CPP(MOC_SRCS
|
||||||
QCMake.h
|
QCMake.h
|
||||||
QCMakeCacheView.h
|
QCMakeCacheView.h
|
||||||
QCMakeWidgets.h
|
QCMakeWidgets.h
|
||||||
|
RegexExplorer.h
|
||||||
)
|
)
|
||||||
QT4_ADD_RESOURCES(RC_SRCS CMakeSetup.qrc)
|
QT4_ADD_RESOURCES(RC_SRCS CMakeSetup.qrc)
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "QCMakeCacheView.h"
|
#include "QCMakeCacheView.h"
|
||||||
#include "AddCacheEntry.h"
|
#include "AddCacheEntry.h"
|
||||||
#include "FirstConfigure.h"
|
#include "FirstConfigure.h"
|
||||||
|
#include "RegexExplorer.h"
|
||||||
#include "cmSystemTools.h"
|
#include "cmSystemTools.h"
|
||||||
#include "cmVersion.h"
|
#include "cmVersion.h"
|
||||||
|
|
||||||
|
@ -125,6 +126,9 @@ CMakeSetupDialog::CMakeSetupDialog()
|
||||||
this, SLOT(doInstallForCommandLine()));
|
this, SLOT(doInstallForCommandLine()));
|
||||||
#endif
|
#endif
|
||||||
ToolsMenu->addSeparator();
|
ToolsMenu->addSeparator();
|
||||||
|
ToolsMenu->addAction(tr("Regular Expression Explorer..."),
|
||||||
|
this, SLOT(doRegexExplorerDialog()));
|
||||||
|
ToolsMenu->addSeparator();
|
||||||
ToolsMenu->addAction(tr("&Find in Output..."),
|
ToolsMenu->addAction(tr("&Find in Output..."),
|
||||||
this, SLOT(doOutputFindDialog()),
|
this, SLOT(doOutputFindDialog()),
|
||||||
QKeySequence::Find);
|
QKeySequence::Find);
|
||||||
|
@ -1272,6 +1276,12 @@ void CMakeSetupDialog::doOutputFindDialog()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMakeSetupDialog::doRegexExplorerDialog()
|
||||||
|
{
|
||||||
|
RegexExplorer dialog(this);
|
||||||
|
dialog.exec();
|
||||||
|
}
|
||||||
|
|
||||||
void CMakeSetupDialog::doOutputFindPrev()
|
void CMakeSetupDialog::doOutputFindPrev()
|
||||||
{
|
{
|
||||||
doOutputFindNext(false);
|
doOutputFindNext(false);
|
||||||
|
|
|
@ -82,6 +82,7 @@ protected slots:
|
||||||
void doOutputFindNext(bool directionForward = true);
|
void doOutputFindNext(bool directionForward = true);
|
||||||
void doOutputFindPrev();
|
void doOutputFindPrev();
|
||||||
void doOutputErrorNext();
|
void doOutputErrorNext();
|
||||||
|
void doRegexExplorerDialog();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,166 @@
|
||||||
|
/*============================================================================
|
||||||
|
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;
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*============================================================================
|
||||||
|
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.
|
||||||
|
============================================================================*/
|
||||||
|
|
||||||
|
#ifndef RegexExplorer_h
|
||||||
|
#define RegexExplorer_h
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <cmsys/RegularExpression.hxx>
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_RegexExplorer.h"
|
||||||
|
|
||||||
|
class QString;
|
||||||
|
class QWidget;
|
||||||
|
|
||||||
|
class RegexExplorer : public QDialog, public Ui::RegexExplorer
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
RegexExplorer(QWidget* p);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_regularExpression_textChanged(const QString& text);
|
||||||
|
void on_inputText_textChanged();
|
||||||
|
void on_matchNumber_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void setStatusColor(QWidget* widget, bool successful);
|
||||||
|
static bool stripEscapes(std::string& regex);
|
||||||
|
|
||||||
|
void clearMatch();
|
||||||
|
|
||||||
|
cmsys::RegularExpression m_regexParser;
|
||||||
|
std::string m_text;
|
||||||
|
std::string m_regex;
|
||||||
|
bool m_matched;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,155 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>RegexExplorer</class>
|
||||||
|
<widget class="QDialog" name="RegexExplorer">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>639</width>
|
||||||
|
<height>555</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Regular Expression Explorer</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Input Text</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPlainTextEdit" name="inputText"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Regular Expression</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Fixed</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelRegexValid">
|
||||||
|
<property name="text">
|
||||||
|
<string>Valid</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Fixed</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelRegexMatch">
|
||||||
|
<property name="text">
|
||||||
|
<string>Match</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="regularExpression"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Complete Match</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPlainTextEdit" name="match0">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="matchNumber">
|
||||||
|
<property name="editable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPlainTextEdit" name="matchN">
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue