From 3c2804797a0547f317e2b44f1da9895d9f6bf1e0 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Fri, 13 Nov 2015 13:09:22 +0100 Subject: [PATCH] logic: improvements for IDE communication * fixed Sublime Text plugin to correctly send messages * activate and focus Coati window when receiving a message * extended lookup range for activate token message from plugin --- .../CoatiCommunicator/CoatiCommunicator.py | 5 +++-- src/app/qt/view/QtMainView.cpp | 14 +++++++++++++ src/app/qt/view/QtMainView.h | 3 +++ src/lib/Application.cpp | 5 +++++ src/lib/Application.h | 5 ++++- src/lib/CMakeLists.txt | 1 + .../controller/IDECommunicationController.cpp | 19 +++++++++--------- src/lib/component/view/MainView.h | 4 +++- .../messaging/type/MessageActivateWindow.h | 20 +++++++++++++++++++ 9 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 src/lib/utility/messaging/type/MessageActivateWindow.h diff --git a/ide_plugins/sublime_text/CoatiCommunicator/CoatiCommunicator.py b/ide_plugins/sublime_text/CoatiCommunicator/CoatiCommunicator.py index c0481b78..481519db 100644 --- a/ide_plugins/sublime_text/CoatiCommunicator/CoatiCommunicator.py +++ b/ide_plugins/sublime_text/CoatiCommunicator/CoatiCommunicator.py @@ -71,7 +71,8 @@ class SetActiveTokenCommand(sublime_plugin.TextCommand): col += 1 # cols returned by rowcol() are 0-based. row += 1 # rows returned by rowcol() are 0-based. - message = "setActiveToken" + MESSAGE_SPLIT_STRING + filePath + MESSAGE_SPLIT_STRING + str(row) + MESSAGE_SPLIT_STRING + str(col) + "" + text = "setActiveToken" + MESSAGE_SPLIT_STRING + filePath + MESSAGE_SPLIT_STRING + str(row) + MESSAGE_SPLIT_STRING + str(col) + "" + data = text.encode() settings = sublime.load_settings('CoatiCommunicator.sublime-settings') host_ip = settings.get('host_ip') @@ -79,5 +80,5 @@ class SetActiveTokenCommand(sublime_plugin.TextCommand): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host_ip, plugin_to_coati_port)) - s.send(message) + s.send(data) s.close() diff --git a/src/app/qt/view/QtMainView.cpp b/src/app/qt/view/QtMainView.cpp index 93500fdc..2f4146c3 100644 --- a/src/app/qt/view/QtMainView.cpp +++ b/src/app/qt/view/QtMainView.cpp @@ -6,6 +6,7 @@ QtMainView::QtMainView() : m_setTitleFunctor(std::bind(&QtMainView::doSetTitle, this, std::placeholders::_1)) + , m_activateWindowFunctor(std::bind(&QtMainView::doActivateWindow, this)) { m_window = std::make_shared(); m_window->show(); @@ -74,7 +75,20 @@ void QtMainView::setTitle(const std::string& title) m_setTitleFunctor(title); } +void QtMainView::activateWindow() +{ + m_activateWindowFunctor(); +} + void QtMainView::doSetTitle(const std::string& title) { m_window->setWindowTitle(QString::fromStdString(title)); } + +void QtMainView::doActivateWindow() +{ + // It's platform dependent which of these commands does the right thing, for now we just use them all at once. + m_window->activateWindow(); + m_window->raise(); + m_window->setFocus(Qt::ActiveWindowFocusReason); +} diff --git a/src/app/qt/view/QtMainView.h b/src/app/qt/view/QtMainView.h index 83b2bb44..e68ba844 100644 --- a/src/app/qt/view/QtMainView.h +++ b/src/app/qt/view/QtMainView.h @@ -35,14 +35,17 @@ public: // MainView implementation virtual void hideStartScreen(); virtual void setTitle(const std::string& title); + virtual void activateWindow(); private: void doSetTitle(const std::string& title); + void doActivateWindow(); std::shared_ptr m_window; std::vector m_views; QtThreadedFunctor m_setTitleFunctor; + QtThreadedFunctor<> m_activateWindowFunctor; }; #endif // QT_MAIN_VIEW_H diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index bca540f3..ba00b2ea 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -108,6 +108,11 @@ void Application::saveProject(const FilePath& projectSettingsFilePath) } } +void Application::handleMessage(MessageActivateWindow* message) +{ + m_mainView->activateWindow(); +} + void Application::handleMessage(MessageFinishedParsing* message) { m_project->logStats(); diff --git a/src/lib/Application.h b/src/lib/Application.h index 6f9a5ad0..7526f285 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -6,6 +6,7 @@ #include "component/ComponentManager.h" #include "Project.h" #include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageActivateWindow.h" #include "utility/messaging/type/MessageFinishedParsing.h" #include "utility/messaging/type/MessageLoadProject.h" #include "utility/messaging/type/MessageRefresh.h" @@ -19,7 +20,8 @@ class StorageCache; class Version; class Application - : public MessageListener + : public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -37,6 +39,7 @@ public: private: Application(); + virtual void handleMessage(MessageActivateWindow* message); virtual void handleMessage(MessageFinishedParsing* message); virtual void handleMessage(MessageLoadProject* message); virtual void handleMessage(MessageRefresh* message); diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 3cedb57d..4bc5273e 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -249,6 +249,7 @@ add_files( utility/messaging/type/MessageActivateNodes.h utility/messaging/type/MessageActivateTokenLocations.h utility/messaging/type/MessageActivateTokens.h + utility/messaging/type/MessageActivateWindow.h utility/messaging/type/MessageAutoRefreshChanged.h utility/messaging/type/MessageDeactivateEdge.h utility/messaging/type/MessageFind.h diff --git a/src/lib/component/controller/IDECommunicationController.cpp b/src/lib/component/controller/IDECommunicationController.cpp index a68d4a00..28ea687a 100644 --- a/src/lib/component/controller/IDECommunicationController.cpp +++ b/src/lib/component/controller/IDECommunicationController.cpp @@ -6,6 +6,7 @@ #include "data/location/TokenLocation.h" #include "utility/messaging/type/MessageActivateTokenLocations.h" +#include "utility/messaging/type/MessageActivateWindow.h" #include "utility/messaging/type/MessageStatus.h" #include "utility/logging/logging.h" @@ -23,7 +24,7 @@ void IDECommunicationController::handleIncomingMessage(const std::string& messag LOG_WARNING_STREAM(<< message); NetworkProtocolHelper::NetworkMessage parsedMessage = NetworkProtocolHelper::parseMessage(message); - + if (parsedMessage.valid) { const unsigned int cursorColumn = parsedMessage.column; @@ -36,13 +37,12 @@ void IDECommunicationController::handleIncomingMessage(const std::string& messag tokenLocationFile->forEachStartTokenLocation( [&](TokenLocation* startLocation) { - if (startLocation->getColumnNumber() < cursorColumn) + TokenLocation* endLocation = startLocation->getEndTokenLocation(); + + if (!startLocation->isScopeTokenLocation() && + startLocation->getColumnNumber() <= cursorColumn && endLocation->getColumnNumber() + 1 >= cursorColumn) { - TokenLocation* endLocation = startLocation->getOtherTokenLocation(); - if (endLocation && endLocation->getColumnNumber() > cursorColumn) - { - selectedLocationIds.push_back(startLocation->getId()); - } + selectedLocationIds.push_back(startLocation->getId()); } } ); @@ -51,6 +51,7 @@ void IDECommunicationController::handleIncomingMessage(const std::string& messag { MessageStatus("Activating a source location from external succeeded.").dispatch(); MessageActivateTokenLocations(selectedLocationIds).dispatch(); + MessageActivateWindow().dispatch(); } else { @@ -66,9 +67,9 @@ void IDECommunicationController::handleMessage(MessageMoveIDECursor* message) std::string networkMessage = NetworkProtocolHelper::buildMessage( message->FilePosition, message->Row, message->Column ); - + MessageStatus( - "Jumping the external tool to the following location: " + message->FilePosition + ", row: " + + "Jumping the external tool to the following location: " + message->FilePosition + ", row: " + std::to_string(message->Row) + ", col: " + std::to_string(message->Column) ).dispatch(); diff --git a/src/lib/component/view/MainView.h b/src/lib/component/view/MainView.h index 6f5374ab..ab1326e9 100644 --- a/src/lib/component/view/MainView.h +++ b/src/lib/component/view/MainView.h @@ -5,7 +5,8 @@ #include "component/view/ViewLayout.h" -class MainView: public ViewLayout +class MainView + : public ViewLayout { public: MainView(); @@ -13,6 +14,7 @@ public: virtual void hideStartScreen() = 0; virtual void setTitle(const std::string& title) = 0; + virtual void activateWindow() = 0; }; #endif // MAIN_VIEW_H diff --git a/src/lib/utility/messaging/type/MessageActivateWindow.h b/src/lib/utility/messaging/type/MessageActivateWindow.h new file mode 100644 index 00000000..de5f7136 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageActivateWindow.h @@ -0,0 +1,20 @@ +#ifndef MESSAGE_ACTIVATE_WINDOW_H +#define MESSAGE_ACTIVATE_WINDOW_H + +#include "utility/messaging/Message.h" + +class MessageActivateWindow + : public Message +{ +public: + MessageActivateWindow() + { + } + + static const std::string getStaticType() + { + return "MessageActivateWindow"; + } +}; + +#endif // MESSAGE_ACTIVATE_WINDOW_H