summaryrefslogtreecommitdiffstats
path: root/tools/testcon/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/testcon/mainwindow.cpp')
-rw-r--r--tools/testcon/mainwindow.cpp205
1 files changed, 132 insertions, 73 deletions
diff --git a/tools/testcon/mainwindow.cpp b/tools/testcon/mainwindow.cpp
index cc03f5a..98550ab 100644
--- a/tools/testcon/mainwindow.cpp
+++ b/tools/testcon/mainwindow.cpp
@@ -43,6 +43,8 @@
#include <QtWidgets/QFileDialog>
#include <QtWidgets/QInputDialog>
#include <QtWidgets/QMessageBox>
+#include <QtGui/QCloseEvent>
+#include <QtCore/QDebug>
#include <QtCore/qt_windows.h>
#include <ActiveQt/QAxScriptManager>
#include <ActiveQt/QAxSelect>
@@ -51,53 +53,60 @@
QT_BEGIN_NAMESPACE
-QAxObject *ax_mainWindow = 0;
+QT_END_NAMESPACE
-static QTextEdit *debuglog = 0;
+QT_USE_NAMESPACE
-static void redirectDebugOutput(QtMsgType type, const QMessageLogContext &, const QString &msg)
-{
- Q_UNUSED(type);
- debuglog->append(msg);
-}
+struct ScriptLanguage {
+ const char *name;
+ const char *suffix;
+};
-QT_END_NAMESPACE
+static const ScriptLanguage scriptLanguages[] = {
+ {"PerlScript", ".pl"},
+ {"Python", ".py"}
+};
-QT_USE_NAMESPACE
+MainWindow *MainWindow::m_instance = Q_NULLPTR;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
+ , m_dlgInvoke(Q_NULLPTR)
+ , m_dlgProperties(Q_NULLPTR)
+ , m_dlgAmbient(Q_NULLPTR)
+ , m_scripts(Q_NULLPTR)
{
setupUi(this);
+ MainWindow::m_instance = this; // Logging handler needs the UI
+
setObjectName(QLatin1String("MainWindow"));
- QAxScriptManager::registerEngine(QLatin1String("PerlScript"), QLatin1String(".pl"));
- QAxScriptManager::registerEngine(QLatin1String("Python"), QLatin1String(".py"));
+ const int scriptCount = int(sizeof(scriptLanguages) / sizeof(scriptLanguages[0]));
+ for (int s = 0; s < scriptCount; ++s) {
+ const QString name = QLatin1String(scriptLanguages[s].name);
+ const QString suffix = QLatin1String(scriptLanguages[s].suffix);
+ if (!QAxScriptManager::registerEngine(name, suffix))
+ qWarning().noquote().nospace() << "Failed to register \"" << name
+ << "\" (*" << suffix << ") with QAxScriptManager.";
+ }
- dlgInvoke = 0;
- dlgProperties = 0;
- dlgAmbient = 0;
- scripts = 0;
- debuglog = logDebug;
- oldDebugHandler = qInstallMessageHandler(redirectDebugOutput);
QHBoxLayout *layout = new QHBoxLayout(Workbase);
- mdiArea = new QMdiArea(Workbase);
- layout->addWidget(mdiArea);
+ m_mdiArea = new QMdiArea(Workbase);
+ layout->addWidget(m_mdiArea);
layout->setMargin(0);
- connect(mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::updateGUI);
+ connect(m_mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::updateGUI);
connect(actionFileExit, &QAction::triggered, QCoreApplication::quit);
}
MainWindow::~MainWindow()
{
- qInstallMessageHandler(oldDebugHandler);
- debuglog = 0;
+ MainWindow::m_instance = Q_NULLPTR;
}
QAxWidget *MainWindow::activeAxWidget() const
{
- if (const QMdiSubWindow *activeSubWindow = mdiArea->currentSubWindow())
+ if (const QMdiSubWindow *activeSubWindow = m_mdiArea->currentSubWindow())
return qobject_cast<QAxWidget*>(activeSubWindow->widget());
return 0;
}
@@ -105,47 +114,80 @@ QAxWidget *MainWindow::activeAxWidget() const
QList<QAxWidget *> MainWindow::axWidgets() const
{
QList<QAxWidget *> result;
- foreach (const QMdiSubWindow *subWindow, mdiArea->subWindowList())
+ foreach (const QMdiSubWindow *subWindow, m_mdiArea->subWindowList())
if (QAxWidget *axWidget = qobject_cast<QAxWidget *>(subWindow->widget()))
result.push_back(axWidget);
return result;
}
-void MainWindow::on_actionFileNew_triggered()
+bool MainWindow::addControlFromClsid(const QString &clsid)
{
- QAxSelect select(this);
- if (select.exec()) {
- QAxWidget *container = new QAxWidget;
- container->setControl(select.clsid());
+ QAxWidget *container = new QAxWidget;
+ const bool result = container->setControl(clsid);
+ if (result) {
container->setObjectName(container->windowTitle());
- mdiArea->addSubWindow(container);
+ m_mdiArea->addSubWindow(container);
container->show();
+ updateGUI();
+ } else {
+ delete container;
+ QMessageBox::information(this,
+ tr("Error Loading Control"),
+ tr("The control \"%1\" could not be loaded.").arg(clsid));
}
- updateGUI();
+ return result;
+}
+
+void MainWindow::closeEvent(QCloseEvent *e)
+{
+ // Controls using the same version of Qt may set this to false, causing hangs.
+ QGuiApplication::setQuitOnLastWindowClosed(true);
+ m_mdiArea->closeAllSubWindows();
+ e->accept();
+}
+
+void MainWindow::appendLogText(const QString &message)
+{
+ logDebug->append(message);
+}
+
+void MainWindow::on_actionFileNew_triggered()
+{
+ QAxSelect select(this);
+ while (select.exec() && !addControlFromClsid(select.clsid())) { }
}
void MainWindow::on_actionFileLoad_triggered()
{
- QString fname = QFileDialog::getOpenFileName(this, tr("Load"), QString(), QLatin1String("*.qax"));
- if (fname.isEmpty())
- return;
+ while (true) {
+ const QString fname = QFileDialog::getOpenFileName(this, tr("Load"), QString(), QLatin1String("*.qax"));
+ if (fname.isEmpty() || addControlFromFile(fname))
+ break;
+ }
+}
- QFile file(fname);
+bool MainWindow::addControlFromFile(const QString &fileName)
+{
+ QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
- QMessageBox::information(this, tr("Error Loading File"), tr("The file could not be opened for reading.\n%1").arg(fname));
- return;
+ QMessageBox::information(this,
+ tr("Error Loading File"),
+ tr("The file could not be opened for reading.\n%1\n%2")
+ .arg(QDir::toNativeSeparators(fileName), file.errorString()));
+ return false;
}
- QAxWidget *container = new QAxWidget(mdiArea);
+ QAxWidget *container = new QAxWidget(m_mdiArea);
container->setObjectName(container->windowTitle());
QDataStream d(&file);
d >> *container;
- mdiArea->addSubWindow(container);
+ m_mdiArea->addSubWindow(container);
container->show();
updateGUI();
+ return true;
}
void MainWindow::on_actionFileSave_triggered()
@@ -190,11 +232,11 @@ void MainWindow::on_actionContainerClear_triggered()
void MainWindow::on_actionContainerProperties_triggered()
{
- if (!dlgAmbient) {
- dlgAmbient = new AmbientProperties(this);
- dlgAmbient->setControl(mdiArea);
+ if (!m_dlgAmbient) {
+ m_dlgAmbient = new AmbientProperties(this);
+ m_dlgAmbient->setControl(m_mdiArea);
}
- dlgAmbient->show();
+ m_dlgAmbient->show();
}
@@ -215,12 +257,12 @@ void MainWindow::on_actionControlProperties_triggered()
if (!container)
return;
- if (!dlgProperties) {
- dlgProperties = new ChangeProperties(this);
- connect(container, SIGNAL(propertyChanged(QString)), dlgProperties, SLOT(updateProperties()));
+ if (!m_dlgProperties) {
+ m_dlgProperties = new ChangeProperties(this);
+ connect(container, SIGNAL(propertyChanged(QString)), m_dlgProperties, SLOT(updateProperties()));
}
- dlgProperties->setControl(container);
- dlgProperties->show();
+ m_dlgProperties->setControl(container);
+ m_dlgProperties->show();
}
void MainWindow::on_actionControlMethods_triggered()
@@ -229,10 +271,10 @@ void MainWindow::on_actionControlMethods_triggered()
if (!container)
return;
- if (!dlgInvoke)
- dlgInvoke = new InvokeMethod(this);
- dlgInvoke->setControl(container);
- dlgInvoke->show();
+ if (!m_dlgInvoke)
+ m_dlgInvoke = new InvokeMethod(this);
+ m_dlgInvoke->setControl(container);
+ m_dlgInvoke->show();
}
void MainWindow::on_VerbMenu_aboutToShow()
@@ -273,7 +315,7 @@ void MainWindow::on_actionControlDocumentation_triggered()
return;
DocuWindow *docwindow = new DocuWindow(docu);
- QMdiSubWindow *subWindow = mdiArea->addSubWindow(docwindow);
+ QMdiSubWindow *subWindow = m_mdiArea->addSubWindow(docwindow);
subWindow->setWindowTitle(DocuWindow::tr("%1 - Documentation").arg(container->windowTitle()));
docwindow->show();
}
@@ -286,7 +328,7 @@ void MainWindow::on_actionControlPixmap_triggered()
QLabel *label = new QLabel;
label->setPixmap(QPixmap::grabWidget(container));
- QMdiSubWindow *subWindow = mdiArea->addSubWindow(label);
+ QMdiSubWindow *subWindow = m_mdiArea->addSubWindow(label);
subWindow->setWindowTitle(tr("%1 - Pixmap").arg(container->windowTitle()));
label->show();
}
@@ -294,58 +336,75 @@ void MainWindow::on_actionControlPixmap_triggered()
void MainWindow::on_actionScriptingRun_triggered()
{
#ifndef QT_NO_QAXSCRIPT
- if (!scripts)
+ if (!m_scripts)
return;
// If we have only one script loaded we can use the cool dialog
- QStringList scriptList = scripts->scriptNames();
+ QStringList scriptList = m_scripts->scriptNames();
if (scriptList.count() == 1) {
InvokeMethod scriptInvoke(this);
scriptInvoke.setWindowTitle(tr("Execute Script Function"));
- scriptInvoke.setControl(scripts->script(scriptList[0])->scriptEngine());
+ scriptInvoke.setControl(m_scripts->script(scriptList[0])->scriptEngine());
scriptInvoke.exec();
return;
}
bool ok = false;
- QStringList macroList = scripts->functions(QAxScript::FunctionNames);
+ QStringList macroList = m_scripts->functions(QAxScript::FunctionNames);
QString macro = QInputDialog::getItem(this, tr("Select Macro"), tr("Macro:"), macroList, 0, true, &ok);
if (!ok)
return;
- QVariant result = scripts->call(macro);
+ QVariant result = m_scripts->call(macro);
if (result.isValid())
logMacros->append(tr("Return value of %1: %2").arg(macro).arg(result.toString()));
#endif
}
+#ifdef QT_NO_QAXSCRIPT
+static inline void noScriptMessage(QWidget *parent)
+{
+ QMessageBox::information(parent, MainWindow::tr("Function not available"),
+ MainWindow::tr("QAxScript functionality is not available with this compiler."));
+}
+#endif // !QT_NO_QAXSCRIPT
+
void MainWindow::on_actionScriptingLoad_triggered()
{
#ifndef QT_NO_QAXSCRIPT
QString file = QFileDialog::getOpenFileName(this, tr("Open Script"), QString(), QAxScriptManager::scriptFileFilter());
- if (file.isEmpty())
- return;
+ if (!file.isEmpty())
+ loadScript(file);
+#else // !QT_NO_QAXSCRIPT
+ noScriptMessage(this);
+#endif
+}
- if (!scripts) {
- scripts = new QAxScriptManager(this);
- scripts->addObject(this);
+bool MainWindow::loadScript(const QString &file)
+{
+#ifndef QT_NO_QAXSCRIPT
+ if (!m_scripts) {
+ m_scripts = new QAxScriptManager(this);
+ m_scripts->addObject(this);
}
foreach (QAxWidget *axWidget, axWidgets()) {
QAxBase *ax = axWidget;
- scripts->addObject(ax);
+ m_scripts->addObject(ax);
}
- QAxScript *script = scripts->load(file, file);
+ QAxScript *script = m_scripts->load(file, file);
if (script) {
connect(script, &QAxScript::error, this, &MainWindow::logMacro);
actionScriptingRun->setEnabled(true);
}
-#else
- QMessageBox::information(this, tr("Function not available"),
- tr("QAxScript functionality is not available with this compiler."));
+ return script;
+#else // !QT_NO_QAXSCRIPT
+ Q_UNUSED(file)
+ noScriptMessage(this);
+ return false;
#endif
}
@@ -365,10 +424,10 @@ void MainWindow::updateGUI()
actionControlDocumentation->setEnabled(hasControl);
actionControlPixmap->setEnabled(hasControl);
VerbMenu->setEnabled(hasControl);
- if (dlgInvoke)
- dlgInvoke->setControl(hasControl ? container : 0);
- if (dlgProperties)
- dlgProperties->setControl(hasControl ? container : 0);
+ if (m_dlgInvoke)
+ m_dlgInvoke->setControl(hasControl ? container : 0);
+ if (m_dlgProperties)
+ m_dlgProperties->setControl(hasControl ? container : 0);
foreach (QAxWidget *container, axWidgets()) {
container->disconnect(SIGNAL(signal(QString,int,void*)));