diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp index 351037cc10e23909bbc71c29fe89c2a72c399e3c..a9926f5b92d6d179260848ebc268feac5afb470c 100644 --- a/src/plugins/duieditor/duieditor.cpp +++ b/src/plugins/duieditor/duieditor.cpp @@ -446,20 +446,24 @@ void ScriptEditor::updateDocumentNow() QTextEdit::ExtraSelection sel; - foreach (const JavaScriptParser::DiagnosticMessage &d, parser.diagnosticMessages()) { - if (d.isWarning()) - continue; + m_diagnosticMessages = parser.diagnosticMessages(); - int line = d.line; - int column = d.column; + foreach (const JavaScriptParser::DiagnosticMessage &d, m_diagnosticMessages) { + int line = d.loc.startLine; + int column = d.loc.startColumn; if (column == 0) column = 1; QTextCursor c(document()->findBlockByNumber(line - 1)); sel.cursor = c; + sel.cursor.setPosition(c.position() + column - 1); - sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); + if (sel.cursor.atBlockEnd()) + sel.cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + else + sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); + sel.format = errorFormat; selections.append(sel); diff --git a/src/plugins/duieditor/duieditor.h b/src/plugins/duieditor/duieditor.h index da603249a7faa18099e39e45cfd9f87d81f450f3..6807c3ff4270de5d4a8e977dd867f7301d819ce5 100644 --- a/src/plugins/duieditor/duieditor.h +++ b/src/plugins/duieditor/duieditor.h @@ -32,6 +32,7 @@ #include <texteditor/basetexteditor.h> #include <parser/javascriptast_p.h> +#include <parser/javascriptparser_p.h> QT_BEGIN_NAMESPACE class QComboBox; @@ -51,6 +52,8 @@ class ScriptEditor; class ScriptEditorEditable : public TextEditor::BaseTextEditorEditable { + Q_OBJECT + public: ScriptEditorEditable(ScriptEditor *, const QList<int> &); QList<int> context() const; @@ -94,6 +97,9 @@ public: QList<Declaration> declarations() const; QStringList words() const; + QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const + { return m_diagnosticMessages; } + public slots: virtual void setFontSettings(const TextEditor::FontSettings &); @@ -126,6 +132,7 @@ private: QList<Declaration> m_declarations; QStringList m_words; QMap<QString, QList<JavaScript::AST::SourceLocation> > m_ids; // ### use QMultiMap + QList<JavaScriptParser::DiagnosticMessage> m_diagnosticMessages; }; } // namespace Internal diff --git a/src/plugins/duieditor/duieditor.pro b/src/plugins/duieditor/duieditor.pro index 9149293c5164ecae1e1ae25d6a08521a2f98e8d7..a2633e9d4de94cd40c07d20da55e8d7c67d9788f 100644 --- a/src/plugins/duieditor/duieditor.pro +++ b/src/plugins/duieditor/duieditor.pro @@ -19,13 +19,15 @@ duieditorplugin.h \ duihighlighter.h \ duieditoractionhandler.h \ duicodecompletion.h \ -duieditorconstants.h +duieditorconstants.h \ +duihoverhandler.h SOURCES += duieditor.cpp \ duieditorfactory.cpp \ duieditorplugin.cpp \ duihighlighter.cpp \ duieditoractionhandler.cpp \ -duicodecompletion.cpp +duicodecompletion.cpp \ +duihoverhandler.cpp RESOURCES += duieditor.qrc diff --git a/src/plugins/duieditor/duieditorplugin.cpp b/src/plugins/duieditor/duieditorplugin.cpp index 99668926a28540a29c5cb1d1bae1582e8aa3ecff..faa7d07dba125616029408326b6e0bfdbcfd17eb 100644 --- a/src/plugins/duieditor/duieditorplugin.cpp +++ b/src/plugins/duieditor/duieditorplugin.cpp @@ -34,6 +34,7 @@ #include "duieditorconstants.h" #include "duieditorfactory.h" #include "duicodecompletion.h" +#include "duihoverhandler.h" #include <coreplugin/icore.h> #include <coreplugin/coreconstants.h> @@ -112,6 +113,8 @@ bool DuiEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err m_completion = new DuiCodeCompletion(); addAutoReleasedObject(m_completion); + addAutoReleasedObject(new DuiHoverHandler()); + // Restore settings QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(QLatin1String("CppTools")); // ### FIXME: diff --git a/src/plugins/duieditor/duihoverhandler.cpp b/src/plugins/duieditor/duihoverhandler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d5a8dba030e4b3cb85efdccb158ce22d742e7771 --- /dev/null +++ b/src/plugins/duieditor/duihoverhandler.cpp @@ -0,0 +1,122 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#include "duihoverhandler.h" +#include "duieditor.h" + +#include <coreplugin/icore.h> +#include <coreplugin/uniqueidmanager.h> +#include <coreplugin/editormanager/editormanager.h> +#include <extensionsystem/pluginmanager.h> +#include <texteditor/itexteditor.h> +#include <texteditor/basetexteditor.h> +#include <debugger/debuggerconstants.h> + +#include <QtCore/QDebug> +#include <QtCore/QDir> +#include <QtCore/QFileInfo> +#include <QtCore/QSettings> +#include <QtGui/QToolTip> +#include <QtGui/QTextCursor> +#include <QtGui/QTextBlock> +#include <QtHelp/QHelpEngineCore> + +using namespace DuiEditor::Internal; +using namespace Core; + +DuiHoverHandler::DuiHoverHandler(QObject *parent) + : QObject(parent) +{ + ICore *core = ICore::instance(); + + // Listen for editor opened events in order to connect to tooltip/helpid requests + connect(core->editorManager(), SIGNAL(editorOpened(Core::IEditor *)), + this, SLOT(editorOpened(Core::IEditor *))); +} + +void DuiHoverHandler::editorOpened(IEditor *editor) +{ + ScriptEditorEditable *duiEditor = qobject_cast<ScriptEditorEditable *>(editor); + if (!duiEditor) + return; + + qDebug() << "connected for editor:" << editor->file()->fileName(); + + connect(duiEditor, SIGNAL(tooltipRequested(TextEditor::ITextEditor*, QPoint, int)), + this, SLOT(showToolTip(TextEditor::ITextEditor*, QPoint, int))); + + connect(duiEditor, SIGNAL(contextHelpIdRequested(TextEditor::ITextEditor*, int)), + this, SLOT(updateContextHelpId(TextEditor::ITextEditor*, int))); +} + +void DuiHoverHandler::showToolTip(TextEditor::ITextEditor *editor, const QPoint &point, int pos) +{ + if (! editor) + return; + + ScriptEditor *ed = qobject_cast<ScriptEditor *>(editor->widget()); + + ICore *core = ICore::instance(); + const int dbgcontext = core->uniqueIDManager()->uniqueIdentifier(Debugger::Constants::C_GDBDEBUGGER); + + if (core->hasContext(dbgcontext)) + return; + + m_toolTip.clear(); + + QTextCursor tc = ed->textCursor(); + tc.setPosition(pos); + const unsigned line = tc.block().blockNumber() + 1; + + foreach (const JavaScriptParser::DiagnosticMessage &m, ed->diagnosticMessages()) { + if (m.loc.startLine == line) { + m_toolTip.append(m.message); + break; + } + } + + if (m_toolTip.isEmpty()) + QToolTip::hideText(); + else { + const QPoint pnt = point - QPoint(0, +#ifdef Q_WS_WIN + 24 +#else + 16 +#endif + ); + + QToolTip::showText(pnt, m_toolTip); + } +} + +void DuiHoverHandler::updateContextHelpId(TextEditor::ITextEditor *, int) +{ +} + diff --git a/src/plugins/duieditor/duihoverhandler.h b/src/plugins/duieditor/duihoverhandler.h new file mode 100644 index 0000000000000000000000000000000000000000..9cde98ae2884f907b3756eb3bfe2b8324ee3be4d --- /dev/null +++ b/src/plugins/duieditor/duihoverhandler.h @@ -0,0 +1,71 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#ifndef DUIHOVERHANDLER_H +#define DUIHOVERHANDLER_H + +#include <QtCore/QObject> + +QT_BEGIN_NAMESPACE +class QPoint; +QT_END_NAMESPACE + +namespace Core { +class IEditor; +} + +namespace TextEditor { +class ITextEditor; +} + +namespace DuiEditor { +namespace Internal { + +class DuiHoverHandler : public QObject +{ + Q_OBJECT + +public: + DuiHoverHandler(QObject *parent = 0); + +public slots: + void showToolTip(TextEditor::ITextEditor *editor, const QPoint &point, int pos); + void updateContextHelpId(TextEditor::ITextEditor *editor, int pos); + +private slots: + void editorOpened(Core::IEditor *editor); + +private: + QString m_toolTip; +}; + +} // namespace Internal +} // namespace DuiEditor + +#endif // DUIHOVERHANDLER_H