From 957710f4642ffc6b86378937cd58c8bc62a47847 Mon Sep 17 00:00:00 2001 From: mae Date: Thu, 12 Feb 2009 14:23:25 +0100 Subject: [PATCH 1/6] update history position of the current editor when navigating RevBy: eike --- .../editormanager/editormanager.cpp | 24 +++++++++++++------ .../coreplugin/editormanager/editormanager.h | 2 ++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 97380484c3e..06aa72a3a57 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -478,7 +478,7 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto m_d->m_currentEditor = editor; if (editor) { - bool addToHistory = (!ignoreNavigationHistory && editor != currentEditor()); + bool addToHistory = (!ignoreNavigationHistory); if (addToHistory) addCurrentPositionToNavigationHistory(true); @@ -678,8 +678,6 @@ bool EditorManager::closeEditors(const QList editorsToClose, bool askA QList currentViews; EditorView *currentView = 0; - if (currentEditor()) - addCurrentPositionToNavigationHistory(true); // remove the editors foreach (IEditor *editor, acceptedEditors) { @@ -812,11 +810,7 @@ void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEdit return; } - bool hasCurrent = (view->currentEditor() != 0); - editor = placeEditor(view, editor); - if (!(flags & NoActivate) || !hasCurrent) - view->setCurrentEditor(editor); if (!(flags & NoActivate)) { setCurrentEditor(editor, (flags & IgnoreNavigationHistory)); @@ -1349,6 +1343,9 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) return; if (!editor->file()) return; + + qDebug() << "addCurrentPositionToNavigationHistory" << editor->file()->fileName(); + QString fileName = editor->file()->fileName(); QByteArray state = editor->saveState(); // cut existing @@ -1383,8 +1380,20 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) updateActions(); } +void EditorManager::updateCurrentPositionInNavigationHistory() +{ + if (!m_d->m_currentEditor) + return; + foreach (EditorManagerPrivate::EditLocation *location, m_d->m_navigationHistory) + if (location->editor == m_d->m_currentEditor) { + location->state = location->editor->saveState(); + break; + } +} + void EditorManager::goBackInNavigationHistory() { + updateCurrentPositionInNavigationHistory(); while (m_d->currentNavigationHistoryPosition > 0) { --m_d->currentNavigationHistoryPosition; EditorManagerPrivate::EditLocation *location = m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition); @@ -1408,6 +1417,7 @@ void EditorManager::goBackInNavigationHistory() void EditorManager::goForwardInNavigationHistory() { + updateCurrentPositionInNavigationHistory(); if (m_d->currentNavigationHistoryPosition >= m_d->m_navigationHistory.size()-1) return; ++m_d->currentNavigationHistoryPosition; diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index 2d02512b2df..25a05adc245 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -229,6 +229,8 @@ private: void emptyView(Core::Internal::EditorView *view); IEditor *pickUnusedEditor() const; + void updateCurrentPositionInNavigationHistory(); + static EditorManager *m_instance; EditorManagerPrivate *m_d; From 33e878333874979c157fff57fb5fd073348f0423 Mon Sep 17 00:00:00 2001 From: mae Date: Fri, 13 Feb 2009 15:59:14 +0100 Subject: [PATCH 2/6] update current navigation history position only for the current position --- .../coreplugin/editormanager/editormanager.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 06aa72a3a57..6dce1583f5a 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1344,8 +1344,6 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) if (!editor->file()) return; - qDebug() << "addCurrentPositionToNavigationHistory" << editor->file()->fileName(); - QString fileName = editor->file()->fileName(); QByteArray state = editor->saveState(); // cut existing @@ -1382,13 +1380,11 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) void EditorManager::updateCurrentPositionInNavigationHistory() { - if (!m_d->m_currentEditor) + if (!m_d->m_currentEditor + || m_d->currentNavigationHistoryPosition < 0 + || m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition)->editor != m_d->m_currentEditor) return; - foreach (EditorManagerPrivate::EditLocation *location, m_d->m_navigationHistory) - if (location->editor == m_d->m_currentEditor) { - location->state = location->editor->saveState(); - break; - } + m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition)->state = m_d->m_currentEditor->saveState(); } void EditorManager::goBackInNavigationHistory() From 799686602d37254ecca0dc709231e0e4ad92e097 Mon Sep 17 00:00:00 2001 From: mae Date: Fri, 13 Feb 2009 16:07:59 +0100 Subject: [PATCH 3/6] update current history position also when switching editors --- src/plugins/coreplugin/editormanager/editormanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 6dce1583f5a..dfc52d29d40 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -475,6 +475,8 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto setCurrentView(0); if (m_d->m_currentEditor == editor) return; + if (m_d->m_currentEditor) + updateCurrentPositionInNavigationHistory(); m_d->m_currentEditor = editor; if (editor) { From 2ff2c9c14b3ce0c5962153939466ada357dd0943 Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 16 Feb 2009 11:29:50 +0100 Subject: [PATCH 4/6] keep stack history in each editor view. --- .../coreplugin/editormanager/editorview.cpp | 44 +++++++++++-------- .../coreplugin/editormanager/editorview.h | 1 + 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 98224d9f82d..31d72247d6e 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -329,9 +329,11 @@ EditorView::~EditorView() void EditorView::addEditor(IEditor *editor) { - if (m_container->indexOf(editor->widget()) != -1) + if (m_editors.contains(editor)) return; + m_editors.append(editor); + m_container->addWidget(editor->widget()); m_widgetEditorMap.insert(editor->widget(), editor); @@ -348,7 +350,7 @@ void EditorView::addEditor(IEditor *editor) bool EditorView::hasEditor(IEditor *editor) const { - return (m_container->indexOf(editor->widget()) != -1); + return m_editors.contains(editor); } void EditorView::closeView() @@ -360,26 +362,30 @@ void EditorView::closeView() void EditorView::removeEditor(IEditor *editor) { QTC_ASSERT(editor, return); + if (!m_editors.contains(editor)) + return; + const int index = m_container->indexOf(editor->widget()); + QTC_ASSERT((index != -1), return); bool wasCurrent = (index == m_container->currentIndex()); - if (index != -1) { - m_container->removeWidget(editor->widget()); - m_widgetEditorMap.remove(editor->widget()); - editor->widget()->setParent(0); - disconnect(editor, SIGNAL(changed()), this, SLOT(updateEditorStatus())); - QToolBar *toolBar = editor->toolBar(); - if (toolBar != 0) { - if (m_activeToolBar == toolBar) { - m_activeToolBar = m_defaultToolBar; - m_activeToolBar->setVisible(true); - } - m_toolBar->layout()->removeWidget(toolBar); - toolBar->setVisible(false); - toolBar->setParent(0); + m_editors.removeAll(editor); + + m_container->removeWidget(editor->widget()); + m_widgetEditorMap.remove(editor->widget()); + editor->widget()->setParent(0); + disconnect(editor, SIGNAL(changed()), this, SLOT(updateEditorStatus())); + QToolBar *toolBar = editor->toolBar(); + if (toolBar != 0) { + if (m_activeToolBar == toolBar) { + m_activeToolBar = m_defaultToolBar; + m_activeToolBar->setVisible(true); } + m_toolBar->layout()->removeWidget(toolBar); + toolBar->setVisible(false); + toolBar->setParent(0); } - if (wasCurrent) - setCurrentEditor(currentEditor()); + if (wasCurrent && m_editors.count()) + setCurrentEditor(m_editors.last()); } IEditor *EditorView::currentEditor() const @@ -394,6 +400,8 @@ void EditorView::setCurrentEditor(IEditor *editor) if (!editor || m_container->count() <= 0 || m_container->indexOf(editor->widget()) == -1) return; + m_editors.removeAll(editor); + m_editors.append(editor); const int idx = m_container->indexOf(editor->widget()); QTC_ASSERT(idx >= 0, return); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 7387d1c85f9..589592ab279 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -144,6 +144,7 @@ private: QToolButton *m_infoWidgetButton; IEditor *m_editorForInfoWidget; QSortFilterProxyModel m_proxyModel; + QListm_editors; QMap m_widgetEditorMap; }; From 8598a59b9fa1d98b99eeb03a93087f43aa2c74a5 Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 16 Feb 2009 12:50:15 +0100 Subject: [PATCH 5/6] fix context definitions of the vcs editors (this makes shortcuts work again) --- src/plugins/git/gitconstants.h | 4 + src/plugins/git/gitplugin.cpp | 8 +- .../qtscripteditoractionhandler.cpp | 7 -- .../qtscripteditoractionhandler.h | 1 - src/plugins/subversion/subversionplugin.cpp | 16 ++-- .../texteditor/texteditoractionhandler.cpp | 91 ++++++------------- .../texteditor/texteditoractionhandler.h | 4 +- src/plugins/vcsbase/basevcseditorfactory.cpp | 2 +- 8 files changed, 47 insertions(+), 86 deletions(-) diff --git a/src/plugins/git/gitconstants.h b/src/plugins/git/gitconstants.h index b539046ffb5..438d0f25b9a 100644 --- a/src/plugins/git/gitconstants.h +++ b/src/plugins/git/gitconstants.h @@ -38,9 +38,13 @@ namespace Git { namespace Constants { const char * const GIT_COMMAND_LOG_EDITOR_KIND = "Git Command Log Editor"; +const char * const C_GIT_COMMAND_LOG_EDITOR = "Git Command Log Editor"; const char * const GIT_LOG_EDITOR_KIND = "Git File Log Editor"; +const char * const C_GIT_LOG_EDITOR = "Git File Log Editor"; const char * const GIT_BLAME_EDITOR_KIND = "Git Annotation Editor"; +const char * const C_GIT_BLAME_EDITOR = "Git Annotation Editor"; const char * const GIT_DIFF_EDITOR_KIND = "Git Diff Editor"; +const char * const C_GIT_DIFF_EDITOR = "Git Diff Editor"; const char * const C_GITSUBMITEDITOR = "Git Submit Editor"; const char * const GITSUBMITEDITOR_KIND = "Git Submit Editor"; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 11823909585..72069cef4dd 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -73,22 +73,22 @@ static const VCSBase::VCSBaseEditorParameters editorParameters[] = { { VCSBase::RegularCommandOutput, Git::Constants::GIT_COMMAND_LOG_EDITOR_KIND, - Core::Constants::C_GLOBAL, + Git::Constants::C_GIT_COMMAND_LOG_EDITOR, "application/vnd.nokia.text.scs_git_commandlog", "gitlog"}, { VCSBase::LogOutput, Git::Constants::GIT_LOG_EDITOR_KIND, - Core::Constants::C_GLOBAL, + Git::Constants::C_GIT_LOG_EDITOR, "application/vnd.nokia.text.scs_git_filelog", "gitfilelog"}, { VCSBase::AnnotateOutput, Git::Constants::GIT_BLAME_EDITOR_KIND, - Core::Constants::C_GLOBAL, + Git::Constants::C_GIT_BLAME_EDITOR, "application/vnd.nokia.text.scs_git_annotation", "gitsannotate"}, { VCSBase::DiffOutput, Git::Constants::GIT_DIFF_EDITOR_KIND, - Core::Constants::C_GLOBAL, + Git::Constants::C_GIT_DIFF_EDITOR, "text/x-patch","diff"} }; diff --git a/src/plugins/qtscripteditor/qtscripteditoractionhandler.cpp b/src/plugins/qtscripteditor/qtscripteditoractionhandler.cpp index 18d57a6a7b2..9d5a6b41907 100644 --- a/src/plugins/qtscripteditor/qtscripteditoractionhandler.cpp +++ b/src/plugins/qtscripteditor/qtscripteditoractionhandler.cpp @@ -70,13 +70,6 @@ void QtScriptEditorActionHandler::createActions() } -void QtScriptEditorActionHandler::updateActions(UpdateMode um) -{ - TextEditor::TextEditorActionHandler::updateActions(um); - if (m_runAction) - m_runAction->setEnabled(um != NoEditor); -} - void QtScriptEditorActionHandler::run() { typedef Core::ScriptManager::Stack Stack; diff --git a/src/plugins/qtscripteditor/qtscripteditoractionhandler.h b/src/plugins/qtscripteditor/qtscripteditoractionhandler.h index c4940cfa160..ca1fa27af28 100644 --- a/src/plugins/qtscripteditor/qtscripteditoractionhandler.h +++ b/src/plugins/qtscripteditor/qtscripteditoractionhandler.h @@ -48,7 +48,6 @@ public: private: virtual void createActions(); - virtual void updateActions(UpdateMode um); private slots: void run(); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 3ab8b75f9bb..282c6dddf67 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -103,23 +103,23 @@ const char * const SubversionPlugin::DESCRIBE = "Subversion.Describe"; static const VCSBase::VCSBaseEditorParameters editorParameters[] = { { VCSBase::RegularCommandOutput, - "Subversion Command Log Editor", - Core::Constants::C_GLOBAL, + "Subversion Command Log Editor", // kind + "Subversion Command Log Editor", // context "application/vnd.nokia.text.scs_svn_commandlog", "scslog"}, { VCSBase::LogOutput, - "Subversion File Log Editor", - Core::Constants::C_GLOBAL, + "Subversion File Log Editor", // kind + "Subversion File Log Editor", // context "application/vnd.nokia.text.scs_svn_filelog", "scsfilelog"}, { VCSBase::AnnotateOutput, - "Subversion Annotation Editor", - Core::Constants::C_GLOBAL, + "Subversion Annotation Editor", // kind + "Subversion Annotation Editor", // context "application/vnd.nokia.text.scs_svn_annotation", "scsannotate"}, { VCSBase::DiffOutput, - "Subversion Diff Editor", - Core::Constants::C_GLOBAL, + "Subversion Diff Editor", // kind + "Subversion Diff Editor", // context "text/x-patch","diff"} }; diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp index 5ff46ef1353..ace1aa548c7 100644 --- a/src/plugins/texteditor/texteditoractionhandler.cpp +++ b/src/plugins/texteditor/texteditoractionhandler.cpp @@ -18,7 +18,7 @@ ** ** Alternatively, this file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the packaging +** Foundation and appearing` in the file LICENSE.GPL included in the packaging ** of this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** @@ -91,8 +91,8 @@ TextEditorActionHandler::TextEditorActionHandler(const QString &context, m_contextId << Core::UniqueIDManager::instance()->uniqueIdentifier(context); - connect(Core::ICore::instance(), SIGNAL(contextAboutToChange(Core::IContext *)), - this, SLOT(updateCurrentEditor(Core::IContext *))); + connect(Core::ICore::instance()->editorManager(), SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(updateCurrentEditor(Core::IEditor *))); } void TextEditorActionHandler::setupActions(BaseTextEditor *editor) @@ -282,49 +282,31 @@ QAction *TextEditorActionHandler::registerNewAction(const QString &id, TextEditorActionHandler::UpdateMode TextEditorActionHandler::updateMode() const { - if (!m_currentEditor) - return NoEditor; + Q_ASSERT(m_currentEditor != 0); return m_currentEditor->file()->isReadOnly() ? ReadOnlyMode : WriteMode; } void TextEditorActionHandler::updateActions() { + if (!m_currentEditor || !m_initialized) + return; updateActions(updateMode()); } void TextEditorActionHandler::updateActions(UpdateMode um) { - if (!m_initialized) - return; - m_pasteAction->setEnabled(um != NoEditor); - m_selectAllAction->setEnabled(um != NoEditor); - m_gotoAction->setEnabled(um != NoEditor); - m_selectEncodingAction->setEnabled(um != NoEditor); - m_printAction->setEnabled(um != NoEditor); - m_formatAction->setEnabled((m_optionalActions & Format) && um != NoEditor); - m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection) && um != NoEditor); - m_collapseAction->setEnabled(um != NoEditor); - m_expandAction->setEnabled(um != NoEditor); - m_unCollapseAllAction->setEnabled((m_optionalActions & UnCollapseAll) && um != NoEditor); - m_decreaseFontSizeAction->setEnabled(um != NoEditor); - m_increaseFontSizeAction->setEnabled(um != NoEditor); - m_gotoBlockStartAction->setEnabled(um != NoEditor); - m_gotoBlockStartWithSelectionAction->setEnabled(um != NoEditor); - m_gotoBlockEndAction->setEnabled(um != NoEditor); - m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor); - m_selectBlockUpAction->setEnabled(um != NoEditor); - m_selectBlockDownAction->setEnabled(um != NoEditor); - m_moveLineUpAction->setEnabled(um != NoEditor); - m_moveLineDownAction->setEnabled(um != NoEditor); + m_pasteAction->setEnabled(um != ReadOnlyMode); + m_formatAction->setEnabled((m_optionalActions & Format) && um != ReadOnlyMode); + m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection) && um != ReadOnlyMode); + m_moveLineUpAction->setEnabled(um != ReadOnlyMode); + m_moveLineDownAction->setEnabled(um != ReadOnlyMode); - m_visualizeWhitespaceAction->setEnabled(um != NoEditor); - if (m_currentEditor) - m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace); - m_cleanWhitespaceAction->setEnabled(um != NoEditor); + m_formatAction->setEnabled((m_optionalActions & Format)); + m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection)); + m_unCollapseAllAction->setEnabled((m_optionalActions & UnCollapseAll)); + m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace); if (m_textWrappingAction) { - m_textWrappingAction->setEnabled(um != NoEditor); - if (m_currentEditor) - m_textWrappingAction->setChecked(m_currentEditor->displaySettings().m_textWrapping); + m_textWrappingAction->setChecked(m_currentEditor->displaySettings().m_textWrapping); } updateRedoAction(); @@ -346,11 +328,12 @@ void TextEditorActionHandler::updateUndoAction() void TextEditorActionHandler::updateCopyAction() { - const bool hasCopyableText = m_currentEditor && m_currentEditor->textCursor().hasSelection(); + const bool hasCopyableText = m_currentEditor && m_currentEditor->textCursor().hasSelection(); if (m_cutAction) m_cutAction->setEnabled(hasCopyableText && updateMode() == WriteMode); - if (m_copyAction) + if (m_copyAction) { m_copyAction->setEnabled(hasCopyableText); + } } void TextEditorActionHandler::gotoAction() @@ -422,37 +405,19 @@ FUNCTION(selectBlockDown) FUNCTION(moveLineUp) FUNCTION(moveLineDown) -void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object) +void TextEditorActionHandler::updateCurrentEditor(Core::IEditor *editor) { - do { - if (!object) { - if (!m_currentEditor) - return; + m_currentEditor = 0; - m_currentEditor = 0; - break; - } - BaseTextEditor *editor = qobject_cast(object->widget()); - if (!editor) { - if (!m_currentEditor) - return; + if (!editor) + return; - m_currentEditor = 0; - break; - } + BaseTextEditor *baseEditor = qobject_cast(editor->widget()); - if (editor == m_currentEditor) - return; - - if (editor->actionHack() != this) { - m_currentEditor = 0; - break; - } - - m_currentEditor = editor; - - } while (false); - updateActions(); + if (baseEditor && baseEditor->actionHack() == this) { + m_currentEditor = baseEditor; + updateActions(); + } } diff --git a/src/plugins/texteditor/texteditoractionhandler.h b/src/plugins/texteditor/texteditoractionhandler.h index 172617e9a27..28a97ad5eac 100644 --- a/src/plugins/texteditor/texteditoractionhandler.h +++ b/src/plugins/texteditor/texteditoractionhandler.h @@ -78,7 +78,7 @@ protected: QAction *registerNewAction(const QString &id, QObject *receiver, const char *slot, const QString &title = QString()); - enum UpdateMode { NoEditor , ReadOnlyMode, WriteMode }; + enum UpdateMode { ReadOnlyMode, WriteMode }; UpdateMode updateMode() const; virtual void createActions(); @@ -114,7 +114,7 @@ private slots: void selectBlockDown(); void moveLineUp(); void moveLineDown(); - void updateCurrentEditor(Core::IContext *object); + void updateCurrentEditor(Core::IEditor *editor); private: QAction *m_undoAction; diff --git a/src/plugins/vcsbase/basevcseditorfactory.cpp b/src/plugins/vcsbase/basevcseditorfactory.cpp index d7f85a9449d..d1d01b43a45 100644 --- a/src/plugins/vcsbase/basevcseditorfactory.cpp +++ b/src/plugins/vcsbase/basevcseditorfactory.cpp @@ -56,7 +56,7 @@ BaseVCSEditorFactoryPrivate::BaseVCSEditorFactoryPrivate(const VCSBaseEditorPara m_type(t), m_kind(QLatin1String(t->kind)), m_mimeTypes(QStringList(QLatin1String(t->mimeType))), - m_editorHandler(new TextEditor::TextEditorActionHandler(t->kind)) + m_editorHandler(new TextEditor::TextEditorActionHandler(t->context)) { } From c6a02170b971748ddbe6379445292d4dc5e60df0 Mon Sep 17 00:00:00 2001 From: dt Date: Mon, 16 Feb 2009 13:12:12 +0100 Subject: [PATCH 6/6] Fixes: Move Buildparser to the projectexplorer, use in cmakeplugin Details: This enables us to parse the build errors correctly. The makesteps of the qt4project and cmakeproject have some code dupliaction, which could be refactored. And the code to find out the correct build parser could probably also be done better, but we are now parsing the build output for cmake. --- .../cmakeprojectmanager/cmakeproject.cpp | 18 ++- .../cmakeprojectmanager/cmakeproject.h | 1 + src/plugins/cmakeprojectmanager/makestep.cpp | 112 +++++++++++++++++- src/plugins/cmakeprojectmanager/makestep.h | 9 ++ .../buildparserfactory.cpp | 4 +- .../buildparserfactory.h | 8 +- .../gccparser.cpp | 6 +- .../gccparser.h | 4 +- .../msvcparser.cpp | 6 +- .../msvcparser.h | 4 +- .../projectexplorer/projectexplorer.cpp | 5 + .../projectexplorer/projectexplorer.pro | 10 +- .../projectexplorerconstants.h | 5 + src/plugins/qt4projectmanager/makestep.cpp | 6 +- .../qt4projectmanager/qt4projectmanager.pro | 6 - .../qt4projectmanagerconstants.h | 4 - .../qt4projectmanagerplugin.cpp | 4 - 17 files changed, 176 insertions(+), 36 deletions(-) rename src/plugins/{qt4projectmanager => projectexplorer}/buildparserfactory.cpp (95%) rename src/plugins/{qt4projectmanager => projectexplorer}/buildparserfactory.h (94%) rename src/plugins/{qt4projectmanager => projectexplorer}/gccparser.cpp (96%) rename src/plugins/{qt4projectmanager => projectexplorer}/gccparser.h (95%) rename src/plugins/{qt4projectmanager => projectexplorer}/msvcparser.cpp (95%) rename src/plugins/{qt4projectmanager => projectexplorer}/msvcparser.h (95%) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 6d836388f02..070aec39d62 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -40,6 +40,7 @@ #include "cmakestep.h" #include "makestep.h" +#include #include #include #include @@ -103,7 +104,7 @@ void CMakeProject::parseCMakeLists() } else { // TODO hmm? } - if (newToolChain == m_toolChain) { + if (ProjectExplorer::ToolChain::equals(newToolChain, m_toolChain)) { delete newToolChain; newToolChain = 0; } else { @@ -158,6 +159,21 @@ void CMakeProject::parseCMakeLists() } } +QString CMakeProject::buildParser(const QString &buildConfiguration) const +{ + if (!m_toolChain) + return QString::null; + if (m_toolChain->type() == ProjectExplorer::ToolChain::GCC + || m_toolChain->type() == ProjectExplorer::ToolChain::LinuxICC + || m_toolChain->type() == ProjectExplorer::ToolChain::MinGW) { + return ProjectExplorer::Constants::BUILD_PARSER_GCC; + } else if (m_toolChain->type() == ProjectExplorer::ToolChain::MSVC + || m_toolChain->type() == ProjectExplorer::ToolChain::WINCE) { + return ProjectExplorer::Constants::BUILD_PARSER_MSVC; + } + return QString::null; +} + QStringList CMakeProject::targets() const { QStringList results; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 3494441489e..4c9b2e1d529 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -105,6 +105,7 @@ public: MakeStep *makeStep() const; CMakeStep *cmakeStep() const; QStringList targets() const; + QString buildParser(const QString &buildConfiguration) const; private: void parseCMakeLists(); diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 60f5d04903e..44476f6fbe7 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -34,6 +34,7 @@ #include "makestep.h" #include "cmakeprojectconstants.h" #include "cmakeproject.h" +#include #include #include @@ -42,6 +43,11 @@ #include #include +namespace { +bool debug = false; +} + + using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; @@ -52,10 +58,42 @@ MakeStep::MakeStep(CMakeProject *pro) MakeStep::~MakeStep() { + delete m_buildParser; + m_buildParser = 0; } bool MakeStep::init(const QString &buildConfiguration) { + // TODO figure out the correct build parser + delete m_buildParser; + m_buildParser = 0; + QString buildParser = m_pro->buildParser(buildConfiguration); + QList buildParserFactories = + ExtensionSystem::PluginManager::instance()->getObjects(); + + foreach (ProjectExplorer::IBuildParserFactory * factory, buildParserFactories) + if (factory->canCreate(buildParser)) { + m_buildParser = factory->create(buildParser); + break; + } + if (m_buildParser) { + connect(m_buildParser, SIGNAL(addToOutputWindow(const QString &)), + this, SIGNAL(addToOutputWindow(const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(addToTaskWindow(const QString &, int, int, const QString &)), + this, SLOT(slotAddToTaskWindow(const QString &, int, int, const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(enterDirectory(const QString &)), + this, SLOT(addDirectory(const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(leaveDirectory(const QString &)), + this, SLOT(removeDirectory(const QString &)), + Qt::DirectConnection); + } + + m_openDirectories.clear(); + addDirectory(m_pro->buildDirectory(buildConfiguration)); + setEnabled(buildConfiguration, true); setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration)); setCommand(buildConfiguration, "make"); // TODO give full path here? @@ -89,6 +127,79 @@ bool MakeStep::immutable() const return true; } +void MakeStep::stdOut(const QString &line) +{ + if (m_buildParser) + m_buildParser->stdOutput(line); + AbstractProcessStep::stdOut(line); +} + +void MakeStep::stdError(const QString &line) +{ + if (m_buildParser) + m_buildParser->stdError(line); + AbstractProcessStep::stdError(line); +} + +void MakeStep::slotAddToTaskWindow(const QString & fn, int type, int linenumber, const QString & description) +{ + QString filePath = fn; + if (!filePath.isEmpty() && !QDir::isAbsolutePath(filePath)) { + // We have no save way to decide which file in which subfolder + // is meant. Therefore we apply following heuristics: + // 1. Search for unique file in directories currently indicated as open by GNU make + // (Enter directory xxx, Leave directory xxx...) + current directory + // 3. Check if file is unique in whole project + // 4. Otherwise give up + + filePath = filePath.trimmed(); + + QList possibleFiles; + foreach (const QString &dir, m_openDirectories) { + QFileInfo candidate(dir + QLatin1Char('/') + filePath); + if (debug) + qDebug() << "Checking path " << candidate.filePath(); + if (candidate.exists() + && !possibleFiles.contains(candidate)) { + if (debug) + qDebug() << candidate.filePath() << "exists!"; + possibleFiles << candidate; + } + } + if (possibleFiles.count() == 0) { + if (debug) + qDebug() << "No success. Trying all files in project ..."; + QString fileName = QFileInfo(filePath).fileName(); + foreach (const QString &file, project()->files(ProjectExplorer::Project::AllFiles)) { + QFileInfo candidate(file); + if (candidate.fileName() == fileName) { + if (debug) + qDebug() << "Found " << file; + possibleFiles << candidate; + } + } + } + if (possibleFiles.count() == 1) + filePath = possibleFiles.first().filePath(); + else + qWarning() << "Could not find absolute location of file " << filePath; + } + emit addToTaskWindow(filePath, type, linenumber, description); +} + +void MakeStep::addDirectory(const QString &dir) +{ + if (!m_openDirectories.contains(dir)) + m_openDirectories.insert(dir); +} + +void MakeStep::removeDirectory(const QString &dir) +{ + if (m_openDirectories.contains(dir)) + m_openDirectories.remove(dir); +} + + CMakeProject *MakeStep::project() const { return m_pro; @@ -154,7 +265,6 @@ void MakeBuildStepConfigWidget::init(const QString &buildConfiguration) } // and connect again connect(m_targetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*))); - } // diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index fbfc007dbe4..012fb837bc6 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -64,8 +64,17 @@ public: CMakeProject *project() const; bool buildsTarget(const QString &buildConfiguration, const QString &target) const; void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on); +private slots: + void slotAddToTaskWindow(const QString & fn, int type, int linenumber, const QString & description); + void addDirectory(const QString &dir); + void removeDirectory(const QString &dir); +protected: + virtual void stdOut(const QString &line); + virtual void stdError(const QString &line); private: CMakeProject *m_pro; + ProjectExplorer::BuildParserInterface *m_buildParser; + QSet m_openDirectories; }; class MakeBuildStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/qt4projectmanager/buildparserfactory.cpp b/src/plugins/projectexplorer/buildparserfactory.cpp similarity index 95% rename from src/plugins/qt4projectmanager/buildparserfactory.cpp rename to src/plugins/projectexplorer/buildparserfactory.cpp index 9b52fafb23b..2cad67e2145 100644 --- a/src/plugins/qt4projectmanager/buildparserfactory.cpp +++ b/src/plugins/projectexplorer/buildparserfactory.cpp @@ -33,11 +33,11 @@ #include "buildparserfactory.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include "gccparser.h" #include "msvcparser.h" -using namespace Qt4ProjectManager::Internal; +using namespace ProjectExplorer::Internal; GccParserFactory::~GccParserFactory() { diff --git a/src/plugins/qt4projectmanager/buildparserfactory.h b/src/plugins/projectexplorer/buildparserfactory.h similarity index 94% rename from src/plugins/qt4projectmanager/buildparserfactory.h rename to src/plugins/projectexplorer/buildparserfactory.h index a52c33f7193..98690d25076 100644 --- a/src/plugins/qt4projectmanager/buildparserfactory.h +++ b/src/plugins/projectexplorer/buildparserfactory.h @@ -36,14 +36,14 @@ #include -namespace Qt4ProjectManager { +namespace ProjectExplorer { namespace Internal { class GccParserFactory : public ProjectExplorer::IBuildParserFactory { Q_OBJECT public: - GccParserFactory() {}; + GccParserFactory() {} virtual ~GccParserFactory(); virtual bool canCreate(const QString & name) const; virtual ProjectExplorer::BuildParserInterface * create(const QString & name) const; @@ -53,13 +53,13 @@ class MsvcParserFactory : public ProjectExplorer::IBuildParserFactory { Q_OBJECT public: - MsvcParserFactory() {}; + MsvcParserFactory() {} virtual ~MsvcParserFactory(); virtual bool canCreate(const QString & name) const; virtual ProjectExplorer::BuildParserInterface * create(const QString & name) const; }; } // namespace Internal -} // namespace Qt4ProjectManager +} // namespace ProjectExplorer #endif // BUILDPARSERFACTORY_H diff --git a/src/plugins/qt4projectmanager/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp similarity index 96% rename from src/plugins/qt4projectmanager/gccparser.cpp rename to src/plugins/projectexplorer/gccparser.cpp index b71a3362f55..97a358a0e4c 100644 --- a/src/plugins/qt4projectmanager/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -32,11 +32,11 @@ ***************************************************************************/ #include "gccparser.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; GccParser::GccParser() { @@ -56,7 +56,7 @@ GccParser::GccParser() QString GccParser::name() const { - return QLatin1String(Qt4ProjectManager::Constants::BUILD_PARSER_GCC); + return QLatin1String(ProjectExplorer::Constants::BUILD_PARSER_GCC); } void GccParser::stdOutput(const QString & line) diff --git a/src/plugins/qt4projectmanager/gccparser.h b/src/plugins/projectexplorer/gccparser.h similarity index 95% rename from src/plugins/qt4projectmanager/gccparser.h rename to src/plugins/projectexplorer/gccparser.h index 80796f4be2a..47e4aae4e13 100644 --- a/src/plugins/qt4projectmanager/gccparser.h +++ b/src/plugins/projectexplorer/gccparser.h @@ -34,11 +34,11 @@ #ifndef GCCPARSER_H #define GCCPARSER_H -#include +#include "buildparserinterface.h" #include -namespace Qt4ProjectManager { +namespace ProjectExplorer { class GccParser : public ProjectExplorer::BuildParserInterface { diff --git a/src/plugins/qt4projectmanager/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp similarity index 95% rename from src/plugins/qt4projectmanager/msvcparser.cpp rename to src/plugins/projectexplorer/msvcparser.cpp index d4a23264c79..b089638dd1a 100644 --- a/src/plugins/qt4projectmanager/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -32,11 +32,11 @@ ***************************************************************************/ #include "msvcparser.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; MsvcParser::MsvcParser() { @@ -48,7 +48,7 @@ MsvcParser::MsvcParser() QString MsvcParser::name() const { - return QLatin1String(Qt4ProjectManager::Constants::BUILD_PARSER_MSVC); + return QLatin1String(ProjectExplorer::Constants::BUILD_PARSER_MSVC); } void MsvcParser::stdError(const QString & line) diff --git a/src/plugins/qt4projectmanager/msvcparser.h b/src/plugins/projectexplorer/msvcparser.h similarity index 95% rename from src/plugins/qt4projectmanager/msvcparser.h rename to src/plugins/projectexplorer/msvcparser.h index 06e0c3e6d61..29587cadb67 100644 --- a/src/plugins/qt4projectmanager/msvcparser.h +++ b/src/plugins/projectexplorer/msvcparser.h @@ -34,11 +34,11 @@ #ifndef MSVCPARSER_H #define MSVCPARSER_H -#include +#include "buildparserinterface.h" #include -namespace Qt4ProjectManager { +namespace ProjectExplorer { class MsvcParser : public ProjectExplorer::BuildParserInterface { diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 2380c9b61d6..c4a94042df5 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -59,6 +59,7 @@ #include "scriptwrappers.h" #include "session.h" #include "sessiondialog.h" +#include "buildparserfactory.h" #include #include @@ -233,6 +234,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er addAutoReleasedObject(new ProjectFileWizardExtension); + // Build parsers + addAutoReleasedObject(new GccParserFactory); + addAutoReleasedObject(new MsvcParserFactory); + // context menus Core::ActionContainer *msessionContextMenu = am->createMenu(Constants::M_SESSIONCONTEXT); diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 2cfeecf47cf..1feeea4ebd8 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -54,7 +54,10 @@ HEADERS += projectexplorer.h \ projectmodels.h \ currentprojectfind.h \ toolchain.h \ - cesdkhandler.h + cesdkhandler.h\ + buildparserfactory.h\ + gccparser.h\ + msvcparser.h SOURCES += projectexplorer.cpp \ projectwindow.cpp \ buildmanager.cpp \ @@ -97,7 +100,10 @@ SOURCES += projectexplorer.cpp \ projectmodels.cpp \ currentprojectfind.cpp \ toolchain.cpp \ - cesdkhandler.cpp + cesdkhandler.cpp\ + buildparserfactory.cpp \ + gccparser.cpp\ + msvcparser.cpp FORMS += dependenciespanel.ui \ buildsettingspropertiespage.ui \ processstep.ui \ diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index e65ca54d099..183259be10d 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -176,6 +176,11 @@ const char * const CPP_HEADER_MIMETYPE = "text/x-c++hdr"; const char * const FORM_MIMETYPE = "application/x-designer"; const char * const RESOURCE_MIMETYPE = "application/vnd.nokia.xml.qt.resource"; +// build parsers +const char * const BUILD_PARSER_MSVC = "BuildParser.MSVC"; +const char * const BUILD_PARSER_GCC = "BuildParser.Gcc"; + + } // namespace Constants } // namespace ProjectExplorer diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 8e6eb1542d6..46683252d0b 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -36,6 +36,8 @@ #include "qt4project.h" #include "qt4projectmanagerconstants.h" +#include + #include #include @@ -71,9 +73,9 @@ ProjectExplorer::BuildParserInterface *MakeStep::buildParser(const QtVersion * c QString buildParser; ProjectExplorer::ToolChain::ToolChainType type = version->toolchainType(); if ( type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE) - buildParser = Constants::BUILD_PARSER_MSVC; + buildParser = ProjectExplorer::Constants::BUILD_PARSER_MSVC; else - buildParser = Constants::BUILD_PARSER_GCC; + buildParser = ProjectExplorer::Constants::BUILD_PARSER_GCC; QList buildParserFactories = ExtensionSystem::PluginManager::instance()->getObjects(); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 5e18e1f9d48..04ac5d8067b 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -28,9 +28,6 @@ HEADERS = qt4projectmanagerplugin.h \ makestep.h \ qmakestep.h \ qmakebuildstepfactory.h \ - gccparser.h \ - msvcparser.h \ - buildparserfactory.h \ deployhelper.h \ embeddedpropertiespage.h \ qt4runconfiguration.h \ @@ -63,9 +60,6 @@ SOURCES = qt4projectmanagerplugin.cpp \ makestep.cpp \ qmakestep.cpp \ qmakebuildstepfactory.cpp \ - gccparser.cpp \ - msvcparser.cpp \ - buildparserfactory.cpp \ deployhelper.cpp \ embeddedpropertiespage.cpp \ qt4runconfiguration.cpp \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 1ef68a68f5f..7261310ff5f 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -79,10 +79,6 @@ const char * const GDBMACROSBUILDSTEP = "trolltech.qt4projectmanager.gdbmaros"; const char * const QT4RUNSTEP = "trolltech.qt4projectmanager.qt4runstep"; const char * const DEPLOYHELPERRUNSTEP = "trolltech.qt4projectmanager.deployhelperrunstep"; -// build parsers -const char * const BUILD_PARSER_MSVC = "BuildParser.MSVC"; -const char * const BUILD_PARSER_GCC = "BuildParser.Gcc"; - // views const char * const VIEW_DETAILED = "Qt4.View.Detailed"; const char * const VIEW_PROFILESONLY = "Qt4.View.ProjectHierarchy"; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 0d90983aa88..f1df421b626 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -41,7 +41,6 @@ #include "qt4projectmanagerconstants.h" #include "qt4project.h" #include "qmakebuildstepfactory.h" -#include "buildparserfactory.h" #include "qtversionmanager.h" #include "embeddedpropertiespage.h" #include "qt4runconfiguration.h" @@ -133,9 +132,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new MakeBuildStepFactory); addAutoReleasedObject(new GdbMacrosBuildStepFactory); - addAutoReleasedObject(new GccParserFactory); - addAutoReleasedObject(new MsvcParserFactory); - m_qtVersionManager = new QtVersionManager; addObject(m_qtVersionManager);