diff --git a/doc/doc.pri b/doc/doc.pri index b15059163f982d1a3ddec3f8eef1bb7f4380cdd9..5c93f3d3a5500b82eaa42ff806c61a73415379ea 100644 --- a/doc/doc.pri +++ b/doc/doc.pri @@ -1,15 +1,14 @@ -unix:QDOC_BIN = $$(QTDIR)/bin/qdoc3 -win32:QDOC_BIN = $$(QTDIR)/bin/qdoc3.exe +QDOC_BIN = $$[QT_INSTALL_BINS]/qdoc3 win32:QDOC_BIN = $$replace(QDOC_BIN, "/", "\\") unix { QDOC = SRCDIR=$$PWD OUTDIR=$$OUT_PWD/doc/html $$QDOC_BIN - HELPGENERATOR = $$(QTDIR)/bin/qhelpgenerator + HELPGENERATOR = $$[QT_INSTALL_BINS]/qhelpgenerator } else { QDOC = set SRCDIR=$$PWD&& set OUTDIR=$$OUT_PWD/doc/html&& $$QDOC_BIN # Always run qhelpgenerator inside its own cmd; this is a workaround for # an unusual bug which causes qhelpgenerator.exe to do nothing - HELPGENERATOR = cmd /C $$(QTDIR)\bin\qhelpgenerator.exe + HELPGENERATOR = cmd /C $$replace($$list($$[QT_INSTALL_BINS]/qhelpgenerator.exe), "/", "\\") } QHP_FILE = $$OUT_PWD/doc/html/qtcreator.qhp diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index d96a3f500872ac08614e32cf4a2cf266c4ea8ac7..e323ff0651a61eaf7f4aa937860c26b5100fb68c 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -762,10 +762,6 @@ void CPPEditor::findUsages() void CPPEditor::renameUsages() { - Core::EditorManager::instance()->showEditorInfoBar(QLatin1String("CppEditor.Rename"), - tr("This change cannot be undone."), - tr("Yes, I know what I am doing."), - this, SLOT(hideRenameNotification())); renameUsagesNow(); } @@ -777,7 +773,14 @@ void CPPEditor::hideRenameNotification() void CPPEditor::renameUsagesNow() { if (Symbol *canonicalSymbol = markSymbols()) { - m_modelManager->renameUsages(canonicalSymbol); + if (canonicalSymbol->identifier() != 0) { + Core::EditorManager::instance()->showEditorInfoBar(QLatin1String("CppEditor.Rename"), + tr("This change cannot be undone."), + tr("Yes, I know what I am doing."), + this, SLOT(hideRenameNotification())); + + m_modelManager->renameUsages(canonicalSymbol); + } } } diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index eb90a18678619030df2ff9cb29da4d6e4b244bf3..06ae9790602dc07c6bc14437d4b00fc5606c29c7 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -656,6 +656,9 @@ void CppFindReferences::renameUsages(Symbol *symbol) void CppFindReferences::findAll_helper(Symbol *symbol) { + if (! (symbol && symbol->identifier())) + return; + _resultWindow->popup(true); const Snapshot snapshot = _modelManager->snapshot(); diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 1d8869205667a2048f8e73c25abd1d7b69342487..75f8f743b38074086eadd2f0670a500c04093776 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -331,9 +331,8 @@ void CppPreprocessor::resetEnvironment() bool CppPreprocessor::includeFile(const QString &absoluteFilePath, QString *result) { - if (absoluteFilePath.isEmpty() || m_included.contains(absoluteFilePath)) { + if (absoluteFilePath.isEmpty() || m_included.contains(absoluteFilePath)) return true; - } if (m_workingCopy.contains(absoluteFilePath)) { m_included.insert(absoluteFilePath); diff --git a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp index 8dcfa4b9042a9a3d0cb5d417943a354d9279ee42..ad2869aac5812ea9a87bcefb197299f47a26e948 100644 --- a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp +++ b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp @@ -30,6 +30,7 @@ #include "s60debuggerbluetoothstarter.h" #include "bluetoothlistener.h" #include "debuggermanager.h" +#include "trkoptions.h" namespace Debugger { namespace Internal { @@ -48,5 +49,24 @@ trk::BluetoothListener *S60DebuggerBluetoothStarter::createListener() return rc; } +trk::PromptStartCommunicationResult +S60DebuggerBluetoothStarter::startCommunication(const TrkDevicePtr &trkDevice, + const QString &device, + int communicationType, + QWidget *msgBoxParent, + QString *errorMessage) +{ + // Bluetooth? + if (communicationType == TrkOptions::BlueTooth) { + S60DebuggerBluetoothStarter bluetoothStarter(trkDevice); + bluetoothStarter.setDevice(device); + return trk::promptStartBluetooth(bluetoothStarter, msgBoxParent, errorMessage); + } + // Serial + BaseCommunicationStarter serialStarter(trkDevice); + serialStarter.setDevice(device); + return trk::promptStartSerial(serialStarter, msgBoxParent, errorMessage); +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h index 226e00072ac4af1403bf411162cf70a28df2d537..234afa2c2c9c731917befdb53737bcc512678d1e 100644 --- a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h +++ b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h @@ -31,6 +31,7 @@ #define S60DEBUGGERBLUETOOTHSTARTER_H #include "communicationstarter.h" +#include "bluetoothlistener_gui.h" namespace Debugger { namespace Internal { @@ -38,15 +39,24 @@ namespace Internal { /* S60DebuggerBluetoothStarter: Creates a listener in 'Listen' mode * parented on the Debugger manager which outputs to the debugger window. * Note: This is a "last resort" starter, normally, the run configuration - * should have already started a listener. */ + * should have already started a listener. + * Provides a static convenience to prompt for both connection types. */ class S60DebuggerBluetoothStarter : public trk::AbstractBluetoothStarter -{ +{ public: - explicit S60DebuggerBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); + static trk::PromptStartCommunicationResult + startCommunication(const TrkDevicePtr &trkDevice, + const QString &device, + int communicationType, + QWidget *msgBoxParent, + QString *errorMessage); -protected: +protected: virtual trk::BluetoothListener *createListener(); + +private: + explicit S60DebuggerBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); }; } // namespace Internal diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index e954396c30aeb00ad7860778c229eecf570e332b..bf23a09eab59024e29b17094bca9a6fcdafbc692 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -1512,30 +1512,22 @@ void TrkGdbAdapter::startAdapter() debugMessage(_("TRYING TO START ADAPTER")); logMessage(QLatin1String("### Starting TrkGdbAdapter")); m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth); - // Prompt the user for a bluetooth connection - const QString device = effectiveTrkDevice(); - QString message; - if (effectiveTrkDeviceType() == TrkOptions::BlueTooth) { - S60DebuggerBluetoothStarter starter(m_trkDevice); - starter.setDevice(device); - const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, 0, &message); - switch (src) { - case trk::BluetoothGuiConnected: - break; - case trk::BluetoothGuiCanceled: - emit adapterStartFailed(message, QString()); - return; - case trk::BluetoothGuiError: - emit adapterStartFailed(message, TrkOptionsPage::settingsId()); - return; - }; - } else { - if (!m_trkDevice->isOpen() && !m_trkDevice->open(device, &message)) { - message = tr("Failed to connect to %1: %2\nCheck whether TRK is running.").arg(device).arg(message); - logMessage(message); - emit adapterStartFailed(message, TrkOptionsPage::settingsId()); - return; - } + // Prompt the user to start communication + QString message; + const trk::PromptStartCommunicationResult src = + S60DebuggerBluetoothStarter::startCommunication(m_trkDevice, + effectiveTrkDevice(), + effectiveTrkDeviceType(), + 0, &message); + switch (src) { + case trk::PromptStartCommunicationConnected: + break; + case trk::PromptStartCommunicationCanceled: + emit adapterStartFailed(message, QString()); + return; + case trk::PromptStartCommunicationError: + emit adapterStartFailed(message, TrkOptionsPage::settingsId()); + return; } QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer); diff --git a/src/plugins/debugger/gdb/trkoptions.h b/src/plugins/debugger/gdb/trkoptions.h index f4a288fe0743d902d641867db7fe4c34d8ebc89e..470b66ab52f8c56d5514879db68b90a4f6fd6bcb 100644 --- a/src/plugins/debugger/gdb/trkoptions.h +++ b/src/plugins/debugger/gdb/trkoptions.h @@ -46,6 +46,7 @@ namespace Internal { struct TrkOptions { + // Matches the communication enumeration from the S60 devices listener. enum Mode { Serial, BlueTooth }; TrkOptions(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index d547c3b6d83d77568d2764459da2766ec9479b3d..0804a9fe258c781192fad92b8158d293befc92f0 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -582,21 +582,24 @@ void S60DeviceRunControlBase::signsisProcessFinished() initLauncher(runFileName, m_launcher); emit addToOutputWindow(this, tr("Package: %1\nDeploying application to '%2'...").arg(lsFile(copySrc), m_serialPortFriendlyName)); QString errorMessage; - // Prompt the user to start up the Blue tooth connection - if (m_communicationType == BlueToothCommunication) { - S60RunConfigBluetoothStarter starter(m_launcher->trkDevice()); - switch (trk::startBluetoothGui(starter, 0, &errorMessage)) { - case trk::BluetoothGuiConnected: - break; - case trk::BluetoothGuiCanceled: - case trk::BluetoothGuiError: - delete m_launcher; - m_launcher = 0; - error(this, errorMessage); - emit finished(); - return; - }; - } + // Prompt the user to start up the Blue tooth connection + const trk::PromptStartCommunicationResult src = + S60RunConfigBluetoothStarter::startCommunication(m_launcher->trkDevice(), + m_serialPortName, + m_communicationType, 0, + &errorMessage); + switch (src) { + case trk::PromptStartCommunicationConnected: + break; + case trk::PromptStartCommunicationCanceled: + case trk::PromptStartCommunicationError: + delete m_launcher; + m_launcher = 0; + error(this, errorMessage); + emit finished(); + return; + }; + if (!m_launcher->startServer(&errorMessage)) { delete m_launcher; m_launcher = 0; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp index 0b1554b1bae58ab3191eb1ee110c454751ae3613..46ebf4f0443c8d4ed549304377b8ead268f2eaae 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp @@ -302,22 +302,22 @@ bool S60DeviceRunConfigurationWidget::getDeviceInfo(QString *message) const CommunicationDevice commDev = currentDevice(); launcher->setSerialFrame(commDev.type == SerialPortCommunication); launcher->setTrkServerName(commDev.portName); - // Prompt the user to start - if (commDev.type == BlueToothCommunication) { - S60RunConfigBluetoothStarter starter(launcher->trkDevice()); - starter.setDevice(launcher->trkServerName()); - const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, this, message); - switch (src) { - case trk::BluetoothGuiConnected: - break; - case trk::BluetoothGuiCanceled: - launcher->deleteLater(); - return true; - case trk::BluetoothGuiError: - launcher->deleteLater(); - return false; - }; - } + // Prompt user + const trk::PromptStartCommunicationResult src = + S60RunConfigBluetoothStarter::startCommunication(launcher->trkDevice(), + commDev.portName, + commDev.type, this, + message); + switch (src) { + case trk::PromptStartCommunicationConnected: + break; + case trk::PromptStartCommunicationCanceled: + launcher->deleteLater(); + return true; + case trk::PromptStartCommunicationError: + launcher->deleteLater(); + return false; + }; if (!launcher->startServer(message)) { launcher->deleteLater(); return false; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp index 1481dcacbc9d755e803a511a0a208a3e4f7c5cec..b12aa0f1d292196e81e9f31e5362ee4877537cb7 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp @@ -29,6 +29,7 @@ #include "s60runconfigbluetoothstarter.h" #include "bluetoothlistener.h" +#include "serialdevicelister.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -49,5 +50,25 @@ trk::BluetoothListener *S60RunConfigBluetoothStarter::createListener() connect(rc, SIGNAL(message(QString)), core->messageManager(), SLOT(printToOutputPane(QString))); return rc; } + +trk::PromptStartCommunicationResult +S60RunConfigBluetoothStarter::startCommunication(const TrkDevicePtr &trkDevice, + const QString &device, + int communicationType, + QWidget *msgBoxParent, + QString *errorMessage) +{ + // Bluetooth? + if (communicationType == BlueToothCommunication) { + S60RunConfigBluetoothStarter bluetoothStarter(trkDevice); + bluetoothStarter.setDevice(device); + return trk::promptStartBluetooth(bluetoothStarter, msgBoxParent, errorMessage); + } + // Serial + BaseCommunicationStarter serialStarter(trkDevice); + serialStarter.setDevice(device); + return trk::promptStartSerial(serialStarter, msgBoxParent, errorMessage); +} + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h index 0da8817b323dc445c18eebdbc1c93adb1a7cd415..70ea0123f5d44ca5772a9e1d42dd03a31663c6c9 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h @@ -31,20 +31,34 @@ #define S60RUNCONFIGBLUETOOTHSTARTER_H #include "communicationstarter.h" +#include "bluetoothlistener_gui.h" namespace Qt4ProjectManager { namespace Internal { /* S60RunConfigBluetoothStarter: Creates a listener in 'Listen' mode - * parented on the Qt Creator core which outputs to the message manager. */ + * parented on the Qt Creator core which outputs to the message manager. + * Provides a static convenience to prompt for both connection types. */ class S60RunConfigBluetoothStarter : public trk::AbstractBluetoothStarter { public: - explicit S60RunConfigBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); + typedef trk::AbstractBluetoothStarter::TrkDevicePtr TrkDevicePtr; + + // Convenience function to start communication depending on type, + // passing on the right messages. + static trk::PromptStartCommunicationResult + startCommunication(const TrkDevicePtr &trkDevice, + const QString &device, + int communicationType, + QWidget *msgBoxParent, + QString *errorMessage); protected: virtual trk::BluetoothListener *createListener(); + +private: + explicit S60RunConfigBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 3cbadddf939216232b3ede9b94d89856381436a0..7e5dec188c5763c0846e72a03ff44eec84e25441 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -687,7 +687,7 @@ void Qt4Project::updateCodeModel() pinfo.includePaths == allIncludePaths && pinfo.frameworkPaths == allFrameworkPaths && pinfo.sourceFiles == files) { - modelmanager->updateProjectInfo(pinfo); + // Nothing to update... } else { if (pinfo.defines != predefinedMacros || pinfo.includePaths != allIncludePaths || diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index f97bae2a84cb2c3cb03535774b187a2a3e0afd11..e0a5c59d9a63dab2883f1ffcc66104e009211be2 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -49,8 +49,7 @@ #ifndef CPLUSPLUS_ASTFWD_H #define CPLUSPLUS_ASTFWD_H -#include <CPlusPlusForwardDeclarations.h> - +#include "CPlusPlusForwardDeclarations.h" namespace CPlusPlus { diff --git a/src/shared/trk/bluetoothlistener_gui.cpp b/src/shared/trk/bluetoothlistener_gui.cpp index ee21c82a7c5c6b2850bef35954b33fac682e969e..edcb40a9a52564706ab5df041f415a0f83fdda32 100644 --- a/src/shared/trk/bluetoothlistener_gui.cpp +++ b/src/shared/trk/bluetoothlistener_gui.cpp @@ -38,38 +38,62 @@ namespace trk { -StartBluetoothGuiResult - startBluetoothGui(AbstractBluetoothStarter &starter, - QWidget *msgBoxParent, - QString *errorMessage) +PromptStartCommunicationResult + promptStartCommunication(BaseCommunicationStarter &starter, + const QString &msgBoxTitle, + const QString &msgBoxText, + QWidget *msgBoxParent, + QString *errorMessage) { errorMessage->clear(); + // Initial connection attempt. switch (starter.start()) { - case AbstractBluetoothStarter::Started: + case BaseCommunicationStarter::Started: break; - case AbstractBluetoothStarter::ConnectionSucceeded: - return BluetoothGuiConnected; - case AbstractBluetoothStarter::StartError: + case BaseCommunicationStarter::ConnectionSucceeded: + return PromptStartCommunicationConnected; + case BaseCommunicationStarter::StartError: *errorMessage = starter.errorString(); - return BluetoothGuiError; + return PromptStartCommunicationError; } - // Run the starter with the event loop of a message box, close it - // with the finished signals. - const QString title = QCoreApplication::translate("trk::startBluetoothGui", "Waiting for Bluetooth Connection"); - const QString message = QCoreApplication::translate("trk::startBluetoothGui", "Connecting to %1...").arg(starter.device()); - QMessageBox messageBox(QMessageBox::Information, title, message, QMessageBox::Cancel, msgBoxParent); + // Run the starter with the event loop of a message box, have the box + // closed by the signals of the starter. + QMessageBox messageBox(QMessageBox::Information, msgBoxTitle, msgBoxText, QMessageBox::Cancel, msgBoxParent); QObject::connect(&starter, SIGNAL(connected()), &messageBox, SLOT(close())); QObject::connect(&starter, SIGNAL(timeout()), &messageBox, SLOT(close())); - messageBox.exec(); - // Only starter.state() is reliable here. - if (starter.state() == AbstractBluetoothStarter::Running) { - *errorMessage = QCoreApplication::translate("trk::startBluetoothGui", "Connection on %1 canceled.").arg(starter.device()); - return BluetoothGuiCanceled; - } - if (starter.state() != AbstractBluetoothStarter::Connected) { + messageBox.exec(); + // Only starter.state() is reliable here to obtain the state. + switch (starter.state()) { + case AbstractBluetoothStarter::Running: + *errorMessage = QCoreApplication::translate("trk::promptStartCommunication", "Connection on %1 canceled.").arg(starter.device()); + return PromptStartCommunicationCanceled; + case AbstractBluetoothStarter::TimedOut: *errorMessage = starter.errorString(); - return BluetoothGuiError; + return PromptStartCommunicationError; + case AbstractBluetoothStarter::Connected: + break; } - return BluetoothGuiConnected; + return PromptStartCommunicationConnected; +} + +PromptStartCommunicationResult + promptStartSerial(BaseCommunicationStarter &starter, + QWidget *msgBoxParent, + QString *errorMessage) +{ + const QString title = QCoreApplication::translate("trk::promptStartCommunication", "Waiting for TRK"); + const QString message = QCoreApplication::translate("trk::promptStartCommunication", "Waiting for TRK to start on %1...").arg(starter.device()); + return promptStartCommunication(starter, title, message, msgBoxParent, errorMessage); } + +PromptStartCommunicationResult + promptStartBluetooth(BaseCommunicationStarter &starter, + QWidget *msgBoxParent, + QString *errorMessage) +{ + const QString title = QCoreApplication::translate("trk::promptStartCommunication", "Waiting for Bluetooth Connection"); + const QString message = QCoreApplication::translate("trk::promptStartCommunication", "Connecting to %1...").arg(starter.device()); + return promptStartCommunication(starter, title, message, msgBoxParent, errorMessage); +} + } // namespace trk diff --git a/src/shared/trk/bluetoothlistener_gui.h b/src/shared/trk/bluetoothlistener_gui.h index 2a7c57e291ae53ec7d3bdf53fcac0e4b4cb60d26..83cce425ea35ce6e4cae1463ef22ce16c78630ca 100644 --- a/src/shared/trk/bluetoothlistener_gui.h +++ b/src/shared/trk/bluetoothlistener_gui.h @@ -37,22 +37,39 @@ class QWidget; QT_END_NAMESPACE namespace trk { - class AbstractBluetoothStarter; +class BaseCommunicationStarter; - /* startBluetoothGui(): Prompt the user to start a Bluetooth - * connection with a message box he can cancel. Pass in - * the starter with device and parameters set up. */ +/* promptStartCommunication(): Convenience functions that + * prompt the user to start a communication (launching or + * connecting TRK) using a modal message box in which they can cancel. + * Pass in the starter with device and parameters set up. */ - enum StartBluetoothGuiResult { - BluetoothGuiConnected, - BluetoothGuiCanceled, - BluetoothGuiError - }; +enum PromptStartCommunicationResult { + PromptStartCommunicationConnected, + PromptStartCommunicationCanceled, + PromptStartCommunicationError +}; - StartBluetoothGuiResult - startBluetoothGui(AbstractBluetoothStarter &starter, +PromptStartCommunicationResult + promptStartCommunication(BaseCommunicationStarter &starter, + const QString &msgBoxTitle, + const QString &msgBoxText, + QWidget *msgBoxParent, + QString *errorMessage); + +// Convenience to start a serial connection (messages prompting +// to launch Trk). +PromptStartCommunicationResult + promptStartSerial(BaseCommunicationStarter &starter, QWidget *msgBoxParent, QString *errorMessage); + +// Convenience to start blue tooth connection (messages +// prompting to connect). +PromptStartCommunicationResult + promptStartBluetooth(BaseCommunicationStarter &starter, + QWidget *msgBoxParent, + QString *errorMessage); } // namespace trk #endif // BLUETOOTHLISTENER_GUI_H diff --git a/src/shared/trk/communicationstarter.cpp b/src/shared/trk/communicationstarter.cpp index 58a954cd26be473bbb535d1654f7e59fcf57efab..b425db2506280b3a22293d2a7e7b04171103d42d 100644 --- a/src/shared/trk/communicationstarter.cpp +++ b/src/shared/trk/communicationstarter.cpp @@ -35,11 +35,12 @@ #include <QtCore/QEventLoop> namespace trk { + // --------------- AbstractBluetoothStarter -struct AbstractBluetoothStarterPrivate { - explicit AbstractBluetoothStarterPrivate(const AbstractBluetoothStarter::TrkDevicePtr &d); +struct BaseCommunicationStarterPrivate { + explicit BaseCommunicationStarterPrivate(const BaseCommunicationStarter::TrkDevicePtr &d); - const AbstractBluetoothStarter::TrkDevicePtr trkDevice; + const BaseCommunicationStarter::TrkDevicePtr trkDevice; BluetoothListener *listener; QTimer *timer; int intervalMS; @@ -47,11 +48,10 @@ struct AbstractBluetoothStarterPrivate { int n; QString device; QString errorString; - AbstractBluetoothStarter::State state; + BaseCommunicationStarter::State state; }; -AbstractBluetoothStarterPrivate::AbstractBluetoothStarterPrivate(const AbstractBluetoothStarter::TrkDevicePtr &d) : - +BaseCommunicationStarterPrivate::BaseCommunicationStarterPrivate(const BaseCommunicationStarter::TrkDevicePtr &d) : trkDevice(d), listener(0), timer(0), @@ -59,32 +59,38 @@ AbstractBluetoothStarterPrivate::AbstractBluetoothStarterPrivate(const AbstractB attempts(-1), n(0), device(QLatin1String("/dev/rfcomm0")), - state(AbstractBluetoothStarter::TimedOut) + state(BaseCommunicationStarter::TimedOut) { } -AbstractBluetoothStarter::AbstractBluetoothStarter(const TrkDevicePtr &trkDevice, QObject *parent) : +BaseCommunicationStarter::BaseCommunicationStarter(const TrkDevicePtr &trkDevice, QObject *parent) : QObject(parent), - d(new AbstractBluetoothStarterPrivate(trkDevice)) + d(new BaseCommunicationStarterPrivate(trkDevice)) { } -AbstractBluetoothStarter::~AbstractBluetoothStarter() +BaseCommunicationStarter::~BaseCommunicationStarter() { stopTimer(); delete d; } -void AbstractBluetoothStarter::stopTimer() +void BaseCommunicationStarter::stopTimer() { if (d->timer && d->timer->isActive()) d->timer->stop(); } -AbstractBluetoothStarter::StartResult AbstractBluetoothStarter::start() +bool BaseCommunicationStarter::initializeStartupResources(QString *errorMessage) +{ + errorMessage->clear(); + return true; +} + +BaseCommunicationStarter::StartResult BaseCommunicationStarter::start() { if (state() == Running) { - d->errorString = QLatin1String("Internal error, attempt to re-start AbstractBluetoothStarter.\n"); + d->errorString = QLatin1String("Internal error, attempt to re-start BaseCommunicationStarter.\n"); return StartError; } // Before we instantiate timers, and such, try to open the device, @@ -92,10 +98,9 @@ AbstractBluetoothStarter::StartResult AbstractBluetoothStarter::start() // 'Watch' mode if (d->trkDevice->open(d->device , &(d->errorString))) return ConnectionSucceeded; - // Fire up the listener + // Pull up resources for next attempt d->n = 0; - d->listener = createListener(); - if (!d->listener->start(d->device, &(d->errorString))) + if (!initializeStartupResources(&(d->errorString))) return StartError; // Start timer if (!d->timer) { @@ -109,49 +114,49 @@ AbstractBluetoothStarter::StartResult AbstractBluetoothStarter::start() return Started; } -AbstractBluetoothStarter::State AbstractBluetoothStarter::state() const +BaseCommunicationStarter::State BaseCommunicationStarter::state() const { return d->state; } -int AbstractBluetoothStarter::intervalMS() const +int BaseCommunicationStarter::intervalMS() const { return d->intervalMS; } -void AbstractBluetoothStarter::setIntervalMS(int i) +void BaseCommunicationStarter::setIntervalMS(int i) { d->intervalMS = i; if (d->timer) d->timer->setInterval(i); } -int AbstractBluetoothStarter::attempts() const +int BaseCommunicationStarter::attempts() const { return d->attempts; } -void AbstractBluetoothStarter::setAttempts(int a) +void BaseCommunicationStarter::setAttempts(int a) { d->attempts = a; } -QString AbstractBluetoothStarter::device() const +QString BaseCommunicationStarter::device() const { return d->device; } -void AbstractBluetoothStarter::setDevice(const QString &dv) +void BaseCommunicationStarter::setDevice(const QString &dv) { d->device = dv; } -QString AbstractBluetoothStarter::errorString() const +QString BaseCommunicationStarter::errorString() const { return d->errorString; } -void AbstractBluetoothStarter::slotTimer() +void BaseCommunicationStarter::slotTimer() { ++d->n; // Check for timeout @@ -166,17 +171,32 @@ void AbstractBluetoothStarter::slotTimer() if (d->trkDevice->open(d->device , &(d->errorString))) { stopTimer(); const QString msg = tr("%1: Connection attempt %2 succeeded.").arg(d->device).arg(d->n); - d->listener->emitMessage(msg); + emit message(msg); d->state = Connected; emit connected(); } else { const QString msg = tr("%1: Connection attempt %2 failed: %3 (retrying)...") .arg(d->device).arg(d->n).arg(d->errorString); - d->listener->emitMessage(msg); + emit message(msg); } } } +// --------------- AbstractBluetoothStarter + +AbstractBluetoothStarter::AbstractBluetoothStarter(const TrkDevicePtr &trkDevice, QObject *parent) : + BaseCommunicationStarter(trkDevice, parent) +{ +} + +bool AbstractBluetoothStarter::initializeStartupResources(QString *errorMessage) +{ + // Create the listener and forward messages to it. + BluetoothListener *listener = createListener(); + connect(this, SIGNAL(message(QString)), listener, SLOT(emitMessage(QString))); + return listener->start(device(), errorMessage); +} + // -------- ConsoleBluetoothStarter ConsoleBluetoothStarter::ConsoleBluetoothStarter(const TrkDevicePtr &trkDevice, QObject *listenerParent, diff --git a/src/shared/trk/communicationstarter.h b/src/shared/trk/communicationstarter.h index e90578dc1717989610e86fcd6e94fef8b3fffa07..7b89e2472ed0a6c0583e7348362821a822075389 100644 --- a/src/shared/trk/communicationstarter.h +++ b/src/shared/trk/communicationstarter.h @@ -36,25 +36,28 @@ namespace trk { class TrkDevice; class BluetoothListener; -struct AbstractBluetoothStarterPrivate; - -/* AbstractBluetoothStarter: Repeatedly tries to open a trk device - * until a connection succeeds, allowing to do something else in the - * foreground (local event loop or asynchronous operation). - * Note that in case a Listener is already running in watch mode, it might - * also happen that connection succeeds immediately. - * Implementations must provide a factory function that creates and sets up the - * listener (mode, message connection, etc). */ - -class AbstractBluetoothStarter : public QObject { +struct BaseCommunicationStarterPrivate; + +/* BaseCommunicationStarter: A QObject that repeatedly tries to open a + * trk device until a connection succeeds or a timeout occurs (emitting + * signals), allowing to do something else in the foreground (local event loop + * [say QMessageBox] or some asynchronous operation). If the initial + * connection attempt in start() fails, the + * virtual initializeStartupResources() is called to initialize resources + * required to pull up the communication (namely Bluetooth listeners). + * The base class can be used as is to prompt the user to launch TRK for a serial + * communication as this requires no further resource setup. */ + +class BaseCommunicationStarter : public QObject { Q_OBJECT - Q_DISABLE_COPY(AbstractBluetoothStarter) + Q_DISABLE_COPY(BaseCommunicationStarter) public: - typedef QSharedPointer<TrkDevice> TrkDevicePtr; + typedef QSharedPointer<TrkDevice> TrkDevicePtr; enum State { Running, Connected, TimedOut }; - virtual ~AbstractBluetoothStarter(); + explicit BaseCommunicationStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); + virtual ~BaseCommunicationStarter(); int intervalMS() const; void setIntervalMS(int i); @@ -80,19 +83,40 @@ public: signals: void connected(); void timeout(); + void message(const QString &); private slots: void slotTimer(); protected: - explicit AbstractBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); - // Overwrite to create and parametrize the listener. - virtual BluetoothListener *createListener() = 0; + virtual bool initializeStartupResources(QString *errorMessage); private: inline void stopTimer(); - AbstractBluetoothStarterPrivate *d; + BaseCommunicationStarterPrivate *d; +}; + +/* AbstractBluetoothStarter: Repeatedly tries to open a trk Bluetooth + * device. Note that in case a Listener is already running mode, the + * connection will succeed immediately. + * initializeStartupResources() is implemented to fire up the listener. + * Introduces a new virtual createListener() that derived classes must + * implement as a factory function that creates and sets up the + * listener (mode, message connection, etc). */ + +class AbstractBluetoothStarter : public BaseCommunicationStarter { + Q_OBJECT + Q_DISABLE_COPY(AbstractBluetoothStarter) +public: + +protected: + explicit AbstractBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0); + + // Implemented to fire up the listener. + virtual bool initializeStartupResources(QString *errorMessage); + // New virtual: Overwrite to create and parametrize the listener. + virtual BluetoothListener *createListener() = 0; }; /* ConsoleBluetoothStarter: Convenience class for console processes. Creates a @@ -102,12 +126,11 @@ class ConsoleBluetoothStarter : public AbstractBluetoothStarter { Q_OBJECT Q_DISABLE_COPY(ConsoleBluetoothStarter) public: - - static bool startBluetooth(const TrkDevicePtr& trkDevice, - QObject *listenerParent, - const QString &device, - int attempts, - QString *errorMessage); + static bool startBluetooth(const TrkDevicePtr& trkDevice, + QObject *listenerParent, + const QString &device, + int attempts, + QString *errorMessage); protected: virtual BluetoothListener *createListener(); diff --git a/src/shared/trk/trk.pri b/src/shared/trk/trk.pri index 5b0e067b15840566822e3e38ac546ae3086e2498..2ce17c0a6c68980811b893171e4c73022a21d603 100644 --- a/src/shared/trk/trk.pri +++ b/src/shared/trk/trk.pri @@ -14,6 +14,7 @@ SOURCES += $$PWD/trkutils.cpp \ $$PWD/bluetoothlistener.cpp \ $$PWD/communicationstarter.cpp +# Tests/trklauncher is a console application contains(QT, gui) { HEADERS += $$PWD/bluetoothlistener_gui.h SOURCES += $$PWD/bluetoothlistener_gui.cpp diff --git a/tests/auto/cplusplus/ast/ast.pro b/tests/auto/cplusplus/ast/ast.pro index 2f5a0a33eae956f43a47ec9758b53513ae8cbce9..05435839c6c96b7acd03efcd4f8c491d6f6d65a3 100644 --- a/tests/auto/cplusplus/ast/ast.pro +++ b/tests/auto/cplusplus/ast/ast.pro @@ -1,6 +1,6 @@ TEMPLATE = app CONFIG += qt warn_on console depend_includepath -QT = core testlib +QT += testlib include(../shared/shared.pri) SOURCES += tst_ast.cpp TARGET=tst_$$TARGET diff --git a/tests/auto/cplusplus/lookup/lookup.pro b/tests/auto/cplusplus/lookup/lookup.pro index b80aa2f2b7bc30a046f5ecb7bbcc89f1f8f983d1..9011a33f612d0a6014c6baaf4fdb720532849333 100644 --- a/tests/auto/cplusplus/lookup/lookup.pro +++ b/tests/auto/cplusplus/lookup/lookup.pro @@ -1,8 +1,6 @@ TEMPLATE = app CONFIG += qt warn_on console depend_includepath -QT = core testlib - -include(../../../../src/libs/cplusplus/cplusplus-lib.pri) - +QT += testlib +include(../shared/shared.pri) SOURCES += tst_lookup.cpp TARGET=tst_$$TARGET diff --git a/tests/auto/cplusplus/preprocessor/preprocessor.pro b/tests/auto/cplusplus/preprocessor/preprocessor.pro index 463de3ccfb34039f9ad8f2bcec275bd556cfa947..bc7c98ea4eaf0f6392b582865335f14a85956161 100644 --- a/tests/auto/cplusplus/preprocessor/preprocessor.pro +++ b/tests/auto/cplusplus/preprocessor/preprocessor.pro @@ -1,8 +1,6 @@ TEMPLATE = app CONFIG += qt warn_on console depend_includepath -QT = core testlib +QT += testlib TARGET = tst_$$TARGET - -include(../../../../src/libs/cplusplus/cplusplus-lib.pri) - +include(../shared/shared.pri) SOURCES += tst_preprocessor.cpp diff --git a/tests/auto/cplusplus/semantic/semantic.pro b/tests/auto/cplusplus/semantic/semantic.pro index 09f80ab27abb71ce1efd01a76ff1ca105b1c5cc1..2198ab78c736fff168af5e92e7a55018f6c8d617 100644 --- a/tests/auto/cplusplus/semantic/semantic.pro +++ b/tests/auto/cplusplus/semantic/semantic.pro @@ -1,6 +1,6 @@ TEMPLATE = app CONFIG += qt warn_on console depend_includepath -QT = core testlib +QT += testlib include(../shared/shared.pri) SOURCES += tst_semantic.cpp diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp index bf113873fe4cf9c48f5d189833196ac6dd9203d6..827a227f053db188aa0c4f2505f4d9ba2a7f193f 100644 --- a/tests/auto/cplusplus/semantic/tst_semantic.cpp +++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp @@ -1,6 +1,8 @@ #include <QtTest> #include <QtDebug> +#include <QTextDocument> +#include <QTextCursor> #include <Control.h> #include <Parser.h> @@ -12,6 +14,9 @@ #include <Names.h> #include <Literals.h> #include <DiagnosticClient.h> +#include <GenTemplateInstance.h> +#include <Overview.h> +#include <ExpressionUnderCursor.h> using namespace CPlusPlus; @@ -101,6 +106,10 @@ private slots: void const_1(); void const_2(); void pointer_to_function_1(); + + void template_instance_1(); + + void expression_under_cursor_1(); }; void tst_Semantic::function_declaration_1() @@ -217,7 +226,6 @@ void tst_Semantic::nested_class_1() Identifier *objectId = classObjectNameId->identifier(); QCOMPARE(QByteArray(objectId->chars(), objectId->size()), QByteArray("Object")); QCOMPARE(classObject->baseClassCount(), 0U); - QEXPECT_FAIL("", "Requires support for forward classes", Continue); QCOMPARE(classObject->members()->symbolCount(), 2U); Class *classObjectData = doc->globals->symbolAt(1)->asClass(); @@ -383,9 +391,52 @@ void tst_Semantic::pointer_to_function_1() Function *funTy = ptrTy->elementType()->asFunctionType(); QVERIFY(funTy); + QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); QVERIFY(funTy->scope()); + + QEXPECT_FAIL("", "Requires initialize enclosing scope of pointer-to-function symbols", Continue); QCOMPARE(funTy->scope(), decl->scope()); } +void tst_Semantic::template_instance_1() +{ + QSharedPointer<Document> doc = document("void append(const _Tp &value);"); + QCOMPARE(doc->errorCount, 0U); + QCOMPARE(doc->globals->symbolCount(), 1U); + + Declaration *decl = doc->globals->symbolAt(0)->asDeclaration(); + QVERIFY(decl); + + GenTemplateInstance::Substitution subst; + Name *nameTp = control.nameId(control.findOrInsertIdentifier("_Tp")); + FullySpecifiedType intTy(control.integerType(IntegerType::Int)); + subst.append(qMakePair(nameTp, intTy)); + + GenTemplateInstance inst(&control, subst); + FullySpecifiedType genTy = inst(decl->type()); + + Overview oo; + oo.setShowReturnTypes(true); + + const QString genDecl = oo.prettyType(genTy); + QCOMPARE(genDecl, QString::fromLatin1("void(const int &)")); +} + +void tst_Semantic::expression_under_cursor_1() +{ + const QString plainText = "void *ptr = foo(10, bar"; + + QTextDocument textDocument; + textDocument.setPlainText(plainText); + + QTextCursor tc(&textDocument); + tc.movePosition(QTextCursor::End); + + ExpressionUnderCursor expressionUnderCursor; + const QString expression = expressionUnderCursor(tc); + + QCOMPARE(expression, QString("bar")); +} + QTEST_APPLESS_MAIN(tst_Semantic) #include "tst_semantic.moc" diff --git a/tests/auto/cplusplus/shared/shared.pri b/tests/auto/cplusplus/shared/shared.pri index d0c398dae80d79089c53ddde43ee03f3e0a3712b..80dab035ba8f6b391b20a2ad86f9146b3ac45772 100644 --- a/tests/auto/cplusplus/shared/shared.pri +++ b/tests/auto/cplusplus/shared/shared.pri @@ -1,4 +1,5 @@ INCLUDEPATH += $$PWD/../../../../src/shared/cplusplus +INCLUDEPATH += $$PWD/../../../../src/libs/cplusplus DEPENDPATH += $$INCLUDEPATH . LIBS += -L$$PWD -lCPlusPlusTestSupport diff --git a/tests/auto/cplusplus/shared/shared.pro b/tests/auto/cplusplus/shared/shared.pro index f8eb83829dae571bf92315e834d6b2e901606019..72f904a9799db52796095fd78547fd86bb710d9c 100644 --- a/tests/auto/cplusplus/shared/shared.pro +++ b/tests/auto/cplusplus/shared/shared.pro @@ -1,8 +1,8 @@ TEMPLATE = lib TARGET = CPlusPlusTestSupport -CONFIG += static -QT = core +CONFIG += static depend_includepath +QT = core gui DESTDIR = $$PWD +include($$PWD/../../../../src/libs/cplusplus/cplusplus-lib.pri) -include($$PWD/../../../../src/shared/cplusplus/cplusplus.pri)