diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 4954cad38e55e76d811207c76f9cf96fd7961e22..6e079a23e727c09053f341c349f361fb9134da38 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -501,7 +501,7 @@ void BookmarkManager::documentPrevNext(bool next) } Core::EditorManager *em = Core::EditorManager::instance(); - em->addCurrentPositionToNavigationHistory(true); + em->addCurrentPositionToNavigationHistory(); if (next) { if (nextLine == -1) editor->gotoLine(firstLine); @@ -513,7 +513,6 @@ void BookmarkManager::documentPrevNext(bool next) else editor->gotoLine(prevLine); } - em->addCurrentPositionToNavigationHistory(); } void BookmarkManager::next() diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 6cfec71e0f619521a3b8cd62dd7877965cd4c12d..eded47cf5c389ad2c0a87cf70e3e3cbf97ddb4a1 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -190,7 +190,7 @@ EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) : m_goBackAction(new QAction(EditorManager::tr("Go back"), parent)), m_goForwardAction(new QAction(EditorManager::tr("Go forward"), parent)), m_openInExternalEditorAction(new QAction(EditorManager::tr("Open in External Editor"), parent)), - currentNavigationHistoryPosition(-1), + currentNavigationHistoryPosition(0), m_windowPopup(0), m_coreListener(0) { @@ -473,15 +473,11 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto setCurrentView(0); if (m_d->m_currentEditor == editor) return; - if (m_d->m_currentEditor) - updateCurrentPositionInNavigationHistory(); + if (m_d->m_currentEditor && !ignoreNavigationHistory) + addCurrentPositionToNavigationHistory(); m_d->m_currentEditor = editor; if (editor) { - bool addToHistory = (!ignoreNavigationHistory); - if (addToHistory) - addCurrentPositionToNavigationHistory(true); - if (SplitterOrView *splitterOrView = m_d->m_splitter->findView(editor)) splitterOrView->view()->setCurrentEditor(editor); } @@ -1374,17 +1370,17 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) QByteArray state = editor->saveState(); // cut existing int firstIndexToRemove; - if (compress && m_d->currentNavigationHistoryPosition >= 0) { + if (compress && m_d->currentNavigationHistoryPosition > 0) { EditorManagerPrivate::EditLocation *previousLocation = - m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition); + m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition-1); if ((previousLocation->editor && editor == previousLocation->editor) || (!fileName.isEmpty() && previousLocation->fileName == fileName)) { - firstIndexToRemove = m_d->currentNavigationHistoryPosition; + firstIndexToRemove = m_d->currentNavigationHistoryPosition-1; } else { - firstIndexToRemove = m_d->currentNavigationHistoryPosition+1; + firstIndexToRemove = m_d->currentNavigationHistoryPosition; } } else { - firstIndexToRemove = m_d->currentNavigationHistoryPosition+1; + firstIndexToRemove = m_d->currentNavigationHistoryPosition; } if (firstIndexToRemove >= 0) { for (int i = m_d->m_navigationHistory.size()-1; i >= firstIndexToRemove; --i) { @@ -1400,17 +1396,26 @@ void EditorManager::addCurrentPositionToNavigationHistory(bool compress) location->kind = editor->kind(); location->state = QVariant(state); m_d->m_navigationHistory.append(location); - m_d->currentNavigationHistoryPosition = m_d->m_navigationHistory.size()-1; + m_d->currentNavigationHistoryPosition = m_d->m_navigationHistory.size(); updateActions(); } void EditorManager::updateCurrentPositionInNavigationHistory() { - if (!m_d->m_currentEditor - || m_d->currentNavigationHistoryPosition < 0 - || m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition)->editor != m_d->m_currentEditor) + if (!m_d->m_currentEditor || !m_d->m_currentEditor->file()) return; - m_d->m_navigationHistory.at(m_d->currentNavigationHistoryPosition)->state = m_d->m_currentEditor->saveState(); + + EditorManagerPrivate::EditLocation *location; + if (m_d->currentNavigationHistoryPosition < m_d->m_navigationHistory.size()) { + location = m_d->m_navigationHistory[m_d->currentNavigationHistoryPosition]; + } else { + location = new EditorManagerPrivate::EditLocation; + m_d->m_navigationHistory.append(location); + } + location->editor = m_d->m_currentEditor; + location->fileName = m_d->m_currentEditor->file()->fileName(); + location->kind = m_d->m_currentEditor->kind(); + location->state = QVariant(m_d->m_currentEditor->saveState()); } void EditorManager::goBackInNavigationHistory() diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index e356e378cf0ff217cd6b083ca6f9bdc70dc5e3b2..5b363e291dbe598b7c47b07a81c2225449672dc7 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -979,9 +979,8 @@ bool CPPEditor::openEditorAt(Symbol *s) if (baseTextDocument()->fileName() == fileName) { Core::EditorManager *editorManager = Core::EditorManager::instance(); - editorManager->addCurrentPositionToNavigationHistory(true); - gotoLine(line, column); editorManager->addCurrentPositionToNavigationHistory(); + gotoLine(line, column); setFocus(); return true; } diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index e5fb77e259a03623b26ae4e6f6838430d39e081b..52c0ad7101bb86cf3062819dac7514f0b8d9dd0e 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -128,12 +128,11 @@ ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName, const QString &editorKind) { Core::EditorManager *editorManager = Core::EditorManager::instance(); - editorManager->addCurrentPositionToNavigationHistory(true); + editorManager->addCurrentPositionToNavigationHistory(); Core::IEditor *editor = editorManager->openEditor(fileName, editorKind, Core::EditorManager::IgnoreNavigationHistory); TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor); if (texteditor) { texteditor->gotoLine(line, column); - editorManager->addCurrentPositionToNavigationHistory(); return texteditor; } return 0; @@ -565,6 +564,8 @@ Core::IFile *BaseTextEditor::file() void BaseTextEditor::editorContentsChange(int position, int charsRemoved, int charsAdded) { d->m_contentsChanged = true; + // add last edit position to history + Core::EditorManager::instance()->addCurrentPositionToNavigationHistory(true); // Keep the line numbers and the block information for the text marks updated if (charsRemoved != 0) { diff --git a/src/plugins/texteditor/linenumberfilter.cpp b/src/plugins/texteditor/linenumberfilter.cpp index f7cb55cbc6d91c49ed7a50958705064018a05c23..711f8eb9dad586a4b8427de22c2278e2390052be 100644 --- a/src/plugins/texteditor/linenumberfilter.cpp +++ b/src/plugins/texteditor/linenumberfilter.cpp @@ -62,9 +62,8 @@ void LineNumberFilter::accept(FilterEntry selection) const if (editor) { Core::EditorManager *editorManager = Core::EditorManager::instance(); editorManager->ensureEditorManagerVisible(); - editorManager->addCurrentPositionToNavigationHistory(true); - editor->gotoLine(selection.internalData.toInt()); editorManager->addCurrentPositionToNavigationHistory(); + editor->gotoLine(selection.internalData.toInt()); editor->widget()->setFocus(); } } diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 2376f3b83e3dae74bc18841ef6b652317a3750e9..d185efa9b0a5eb495ba4161d92922263b5b63a94 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -265,9 +265,8 @@ void VCSBaseEditor::slotDiffBrowse(int index) return; const int lineNumber = d->m_diffSections.at(index); Core::EditorManager *editorManager = Core::EditorManager::instance(); - editorManager->addCurrentPositionToNavigationHistory(true); - gotoLine(lineNumber + 1, 0); // TextEdit uses 1..n convention editorManager->addCurrentPositionToNavigationHistory(); + gotoLine(lineNumber + 1, 0); // TextEdit uses 1..n convention } // Locate a line number in the list of diff sections.