[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevplatform/plugins/contextbrowser
From:       David Nolden <david.nolden.kde () art-master ! de>
Date:       2008-10-31 23:09:49
Message-ID: 1225494589.217303.16014.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 878339 by zwabel:

Better tracking of the context-history. Whenever any kind of jump is performed, be it \
from navigation, from quickopen, or whathever, then a history-entry is inserted for \
the start- and for the end-position of the jump. This makes the history actually \
useful and reliable, because it always brings you to your last position in the other \
document. This is especially useful in the "browsing" mode, since it brings the \
convenience of web-browsing.



 M  +1 -0      browsemanager.cpp  
 M  +2 -7      contextbrowser.cpp  
 M  +2 -0      contextbrowser.h  
 M  +32 -3     contextbrowserview.cpp  
 M  +9 -2      contextbrowserview.h  


--- trunk/KDE/kdevplatform/plugins/contextbrowser/browsemanager.cpp #878338:878339
@@ -180,6 +180,7 @@
             }
             if(jumpTo.first.isValid() && jumpTo.second.isValid()) {
                 if(mouseEvent->button() == Qt::LeftButton && mouseEvent->type() == \
QEvent::MouseButtonPress) { +                    view->setCursorPosition(textCursor);
                     ICore::self()->documentController()->openDocument(jumpTo.first, \
jumpTo.second.textCursor());  event->accept();
                     return true;
--- trunk/KDE/kdevplatform/plugins/contextbrowser/contextbrowser.cpp #878338:878339
@@ -111,12 +111,12 @@
   connect( m_updateTimer, SIGNAL( timeout() ), this, SLOT( updateViews() ) );
 
   KAction* previousContext = actions->addAction("previous_context");
-  previousContext->setText( i18n("&Previous Context") );
+  previousContext->setText( i18n("&Previous Visited Context") );
   previousContext->setShortcut( Qt::META | Qt::Key_Left );
   connect(previousContext, SIGNAL(triggered(bool)), this, \
SIGNAL(previousContextShortcut()));  
   KAction* nextContext = actions->addAction("next_context");
-  nextContext->setText( i18n("&Next Context") );
+  nextContext->setText( i18n("&Next Visited Context") );
   nextContext->setShortcut( Qt::META | Qt::Key_Right );
   connect(nextContext, SIGNAL(triggered(bool)), this, \
SIGNAL(nextContextShortcut()));  
@@ -395,9 +395,6 @@
     }
 }
 
-namespace
-{
-
 DUContext* contextAt(const SimpleCursor& position, TopDUContext* topContext)
 {
       DUContext* ctx = topContext->findContextAt(position);
@@ -406,8 +403,6 @@
       return ctx;
 }
 
-} // end anonymous namespace
-
 void ContextBrowserPlugin::updateBrowserWidgetFor(View* view)
 {
     bool mouseHighlight =
--- trunk/KDE/kdevplatform/plugins/contextbrowser/contextbrowser.h #878338:878339
@@ -134,6 +134,8 @@
     ContextBrowserViewFactory* m_viewFactory;
 };
 
+DUContext* contextAt(const SimpleCursor& position, TopDUContext* topContext);
+
 #endif // CONTEXTBROWSERPLUGIN_H
 
 // kate: space-indent on; indent-width 2; tab-width 4; replace-tabs on; \
                auto-insert-doxygen on
--- trunk/KDE/kdevplatform/plugins/contextbrowser/contextbrowserview.cpp \
#878338:878339 @@ -47,6 +47,7 @@
 #include <language/duchain/specializationstore.h>
 #include "browsemanager.h"
 #include <language/duchain/navigation/abstractnavigationwidget.h>
+#include <kparts/part.h>
 
 const int maxHistoryLength = 30;
 
@@ -67,6 +68,8 @@
 ContextController::ContextController(ContextBrowserView* view) : \
m_nextHistoryIndex(0), m_view(view) {  m_browseManager = new BrowseManager(this);
     
+    connect(ICore::self()->documentController(), \
SIGNAL(documentJumpPerformed(KDevelop::IDocument*, KTextEditor::Cursor, \
KDevelop::IDocument*, KTextEditor::Cursor)), this, \
SLOT(documentJumpPerformed(KDevelop::IDocument*, KTextEditor::Cursor, \
KDevelop::IDocument*, KTextEditor::Cursor))); +    
     m_previousButton = new QToolButton();
     m_previousButton->setPopupMode(QToolButton::MenuButtonPopup);
     m_previousButton->setIcon(KIcon("go-previous"));
@@ -97,6 +100,31 @@
     connect(m_currentContextBox, SIGNAL(activated(int)), this, \
SLOT(comboItemActivated(int)));  }
 
+///Duchain must be locked
+DUContext* getContextAt(KUrl url, KTextEditor::Cursor cursor) {
+    TopDUContext* topContext = DUChainUtils::standardContextForUrl(url);
+    if (!topContext) return 0;
+    return contextAt(SimpleCursor(cursor), topContext);
+}
+
+void ContextController::documentJumpPerformed( KDevelop::IDocument* newDocument, \
KTextEditor::Cursor newCursor, KDevelop::IDocument* previousDocument, \
KTextEditor::Cursor previousCursor) { +    if(newCursor.isValid() && \
previousCursor.isValid()) { +        
+        KUrl oldIgnore = m_ignoreJump;
+        m_ignoreJump = KUrl();
+        if(newDocument->url() == oldIgnore)
+            return;
+        
+        DUChainReadLocker lock(DUChain::lock());
+        
+        if(previousDocument && previousCursor.isValid())
+            updateHistory(getContextAt(previousDocument->url(), previousCursor), \
SimpleCursor(previousCursor), true); +        
+        if(newDocument && newCursor.isValid())
+            updateHistory(getContextAt(newDocument->url(), newCursor), \
SimpleCursor(newCursor), true); +    }
+}
+
 ContextBrowserView* ContextController::view() const {
     return m_view;
 }
@@ -155,7 +183,8 @@
     Q_ASSERT_X(historyIndex < m_history.size(), "openDocument", "history index out \
of range");  DocumentCursor c = m_history[historyIndex].computePosition();
     if (c.isValid() && !c.document().str().isEmpty()) {
-        ICore::self()->documentController()->openDocument(KUrl(c.document().str()), \
c); +        m_ignoreJump = KUrl(c.document().str());
+        ICore::self()->documentController()->openDocument(m_ignoreJump, c);
 
         KDevelop::DUChainReadLocker lock( KDevelop::DUChain::lock() );
         updateDeclarationListBox(m_history[historyIndex].context.data());
@@ -320,10 +349,10 @@
     currentContextBox()->setCurrentIndex(m_listDeclarations.indexOf(context->owner()));
  }
 
-void ContextController::updateHistory(KDevelop::DUContext* context, const \
KDevelop::SimpleCursor& position) +void \
ContextController::updateHistory(KDevelop::DUContext* context, const \
KDevelop::SimpleCursor& position, bool force)  {
     if (context == 0) return;
-    if(!context->owner())
+    if(!context->owner() && !force)
         return; //Only add history-entries for contexts that have owners, which in \
practice should be functions and classes  //This keeps the history cleaner
 
--- trunk/KDE/kdevplatform/plugins/contextbrowser/contextbrowserview.h #878338:878339
@@ -39,6 +39,10 @@
 class ContextController;     // declared below
 class DeclarationController; // declared below
 
+namespace KDevelop {
+class IDocument;
+}
+
 class ContextBrowserView : public QWidget {
     Q_OBJECT
     public:
@@ -84,9 +88,10 @@
         ContextController(ContextBrowserView*);
         virtual ~ContextController();
 
-        //duchain must be locked
+        ///duchain must be locked
+        ///@param force When this is true, the history-entry is added, no matter \
whether the context is "interesting" or not  void updateHistory(KDevelop::DUContext* \
                context, const
-        KDevelop::SimpleCursor& cursorPosition);
+        KDevelop::SimpleCursor& cursorPosition, bool force = false);
         QWidget* createWidget(KDevelop::DUContext* context);
 
         QToolButton* previousButton() const;
@@ -119,6 +124,7 @@
         void actionTriggered();
     private Q_SLOTS:
         void comboItemActivated(int index);
+        void documentJumpPerformed( KDevelop::IDocument* newDocument, \
KTextEditor::Cursor newCursor, KDevelop::IDocument* previousDocument, \
KTextEditor::Cursor previousCursor);  private:
         void updateDeclarationListBox(KDevelop::DUContext* context);
         bool isPreviousEntry(KDevelop::DUContext*, const KDevelop::SimpleCursor& \
cursor); @@ -141,6 +147,7 @@
         QList<KDevelop::IndexedDeclaration> m_listDeclarations;
         KDevelop::IndexedString m_listUrl;
         BrowseManager* m_browseManager;
+        KUrl m_ignoreJump;
 };
 
 // Handles Declaration related operations for ContextBrowserView


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic