From f84c651428861be462d10f224cd7e333151f9645 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Wed, 18 Mar 2009 17:17:53 +0100
Subject: [PATCH] Refactor navigation history again, put last edit position in
 history

Task:     240811
---
 src/plugins/bookmarks/bookmarkmanager.cpp     |  3 +-
 .../editormanager/editormanager.cpp           | 39 +++++++++++--------
 src/plugins/cppeditor/cppeditor.cpp           |  3 +-
 src/plugins/texteditor/basetexteditor.cpp     |  5 ++-
 src/plugins/texteditor/linenumberfilter.cpp   |  3 +-
 src/plugins/vcsbase/vcsbaseeditor.cpp         |  3 +-
 6 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index 4954cad38e5..6e079a23e72 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 6cfec71e0f6..eded47cf5c3 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 e356e378cf0..5b363e291db 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 e5fb77e259a..52c0ad7101b 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 f7cb55cbc6d..711f8eb9dad 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 2376f3b83e3..d185efa9b0a 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.
-- 
GitLab