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

List:       kde-commits
Subject:    KDE/kdelibs/kate
From:       Christoph Cullmann <cullmann () kde ! org>
Date:       2010-11-13 16:49:19
Message-ID: 20101113164919.D2107AC89E () svn ! kde ! org
[Download RAW message or body]

SVN commit 1196613 by cullmann:

merge milians latest performance tweaks
doc.clear() invalidates ranges

BUG: 215200


 M  +60 -62    document/katedocument.cpp  
 M  +43 -6     tests/katedocument_test.cpp  
 M  +72 -2     tests/movingrange_test.cpp  


--- trunk/KDE/kdelibs/kate/document/katedocument.cpp #1196612:1196613
@@ -144,10 +144,10 @@
     KTextEditor::LoadSaveFilterCheckPlugin *getPlugin(const QString & pluginName)
     {
       if (!m_plugins.contains(pluginName)) return 0;
-      if (!m_plugins[pluginName]) {
-        m_plugins[pluginName]=m_plugins2Service[pluginName]->createInstance<KTextEditor::LoadSaveFilterCheckPlugin>();
 +      if (!m_plugins.value(pluginName, 0)) {
+        m_plugins[pluginName]=m_plugins2Service.value(pluginName)->createInstance<KTextEditor::LoadSaveFilterCheckPlugin>();
  }
-      return m_plugins[pluginName];
+      return m_plugins.value(pluginName);
     }
     QHash <QString,KTextEditor::LoadSaveFilterCheckPlugin*> m_plugins;
     QHash <QString, KService::Ptr> m_plugins2Service;
@@ -552,7 +552,12 @@
 
   clearMarks ();
 
-  return removeText (KTextEditor::Range(KTextEditor::Cursor(), \
KTextEditor::Cursor(lastLine()+1, 0))); +  emit \
aboutToInvalidateMovingInterfaceContent(this); +  m_buffer->invalidateRanges();
+
+  emit aboutToRemoveText(documentRange());
+
+  return editRemoveLines(0, lastLine());
 }
 
 bool KateDocument::insertText( const KTextEditor::Cursor& position, const QString& \
text, bool block ) @@ -1145,12 +1150,12 @@
     }
 
     for( int i=0; i < list.size(); ++i )
-      m_marks.take( list[i]->line );
+      m_marks.take( list.at(i)->line );
 
     for( int i=0; i < list.size(); ++i )
     {
-      list[i]->line++;
-      m_marks.insert( list[i]->line, list[i] );
+      list.at(i)->line++;
+      m_marks.insert( list.at(i)->line, list.at(i) );
     }
 
     if( !list.isEmpty() )
@@ -1225,12 +1230,12 @@
   }
 
    for( int i=0; i < list.size(); ++i )
-      m_marks.take( list[i]->line );
+      m_marks.take( list.at(i)->line );
 
    for( int i=0; i < list.size(); ++i )
    {
-      list[i]->line--;
-      m_marks.insert( list[i]->line, list[i] );
+      list.at(i)->line--;
+      m_marks.insert( list.at(i)->line, list.at(i) );
     }
 
   if( !list.isEmpty() )
@@ -1284,12 +1289,12 @@
   }
 
    for( int i=0; i < list.size(); ++i )
-      m_marks.take( list[i]->line );
+      m_marks.take( list.at(i)->line );
 
    for( int i=0; i < list.size(); ++i )
    {
-      list[i]->line++;
-      m_marks.insert( list[i]->line, list[i] );
+      list.at(i)->line++;
+      m_marks.insert( list.at(i)->line, list.at(i) );
     }
 
   if( !list.isEmpty() )
@@ -1507,8 +1512,8 @@
   QStringList m;
 
   const QList<KateFileType *> &modeList = KateGlobal::self()->modeManager()->list();
-  for (int i = 0; i < modeList.size(); ++i)
-    m << modeList[i]->name;
+  foreach(KateFileType* type, modeList)
+    m << type->name;
 
   return m;
 }
@@ -1541,7 +1546,7 @@
 
 QString KateDocument::modeSection( int index ) const
 {
-  return KateGlobal::self()->modeManager()->list()[ index ]->section;
+  return KateGlobal::self()->modeManager()->list().at( index )->section;
 }
 
 void KateDocument::bufferHlChanged ()
@@ -1616,7 +1621,7 @@
   // Restore Bookmarks
   const QList<int> marks = kconfig.readEntry("Bookmarks", QList<int>());
   for( int i = 0; i < marks.count(); i++ )
-    addMark( marks[i], KateDocument::markType01 );
+    addMark( marks.at(i), KateDocument::markType01 );
 }
 
 void KateDocument::writeSessionConfig(KConfigGroup &kconfig)
@@ -1673,10 +1678,11 @@
 
 uint KateDocument::mark( int line )
 {
-  if( !m_marks.value(line) )
+  KTextEditor::Mark* m = m_marks.value(line);
+  if( !m )
     return 0;
 
-  return m_marks[line]->type;
+  return m->type;
 }
 
 void KateDocument::setMark( int line, uint markType )
@@ -1709,9 +1715,7 @@
   if( markType == 0 )
     return;
 
-  if( m_marks.value(line) ) {
-    KTextEditor::Mark* mark = m_marks[line];
-
+  if( KTextEditor::Mark* mark = m_marks.value(line) ) {
     // Remove bits already set
     markType &= ~mark->type;
 
@@ -1743,11 +1747,11 @@
   if( line > lastLine() )
     return;
 
-  if( !m_marks.value(line) )
+  KTextEditor::Mark* mark = m_marks.value(line);
+
+  if( !mark )
     return;
 
-  KTextEditor::Mark* mark = m_marks[line];
-
   // Remove bits not set
   markType &= mark->type;
 
@@ -1778,34 +1782,36 @@
 
 void KateDocument::requestMarkTooltip( int line, QPoint position )
 {
-  if(!mark(line))
+  KTextEditor::Mark* mark = m_marks.value(line);
+  if(!mark)
     return;
 
   bool handled = false;
-  emit markToolTipRequested( this, *marks()[line], position, handled );
+  emit markToolTipRequested( this, *mark, position, handled );
 }
 
 bool KateDocument::handleMarkClick( int line )
 {
-  bool handled = false;
-
-  if(!mark(line))
+  KTextEditor::Mark* mark = m_marks.value(line);
+  if(!mark)
     return false;
 
-  emit markClicked( this, *marks()[line], handled );
+  bool handled = false;
+  emit markClicked( this, *mark, handled );
 
   return handled;
 }
 
 bool KateDocument::handleMarkContextMenu( int line, QPoint position )
 {
-  bool handled = false;
-
-  if(!mark(line))
+  KTextEditor::Mark* mark = m_marks.value(line);
+  if(!mark)
     return false;
 
-  emit markContextMenuRequested( this, *marks()[line], position, handled );
+  bool handled = false;
 
+  emit markContextMenuRequested( this, *mark, position, handled );
+
   return handled;
 }
 
@@ -1840,8 +1846,7 @@
 
 QPixmap KateDocument::markPixmap( MarkInterface::MarkTypes type ) const
 {
-  return m_markPixmaps.contains(type) ?
-         m_markPixmaps[type] : QPixmap();
+  return m_markPixmaps.value(type, QPixmap());
 }
 
 QColor KateDocument::markColor( MarkInterface::MarkTypes type ) const
@@ -1856,8 +1861,7 @@
 
 QString KateDocument::markDescription( MarkInterface::MarkTypes type ) const
 {
-  return m_markDescriptions.contains(type) ?
-         m_markDescriptions[type] : QString();
+  return m_markDescriptions.value(type, QString());
 }
 
 void KateDocument::setEditableMarks( uint markMask )
@@ -2578,10 +2582,8 @@
   bool bracketInserted = false;
   QString buf;
   QChar c;
-  for( int z = 0; z < chars.length(); z++ )
+  foreach(const QChar& ch, chars)
   {
-    QChar ch = c = chars[z];
-
     if (ch.isPrint() || ch == QChar::fromAscii('\t'))
     {
       buf.append (ch);
@@ -2846,7 +2848,7 @@
       int maxi = qMin(pos.line() + pasteLines.count(), this->lines());
 
       for (int i = pos.line(); i < maxi; ++i) {
-        int pasteLength = pasteLines[i-pos.line()].length();
+        int pasteLength = pasteLines.at(i-pos.line()).length();
         removeText(KTextEditor::Range(i, pos.column(),
                                       i, qMin(pasteLength + pos.column(), \
lineLength(i))));  }
@@ -3444,8 +3446,9 @@
                    ( ( range.start().line() == selection.start().line() || \
                v->blockSelectionMode() ) &&
                    ! p && ! highlight()->isInWord( l->at( range.start().column() - 1 \
)) ) ||  ( p && ! highlight()->isInWord( s.at( p-1 ) ) )
-             )
+             ) {
             s[p] = s.at(p).toUpper();
+          }
           p++;
         }
       }
@@ -3707,10 +3710,8 @@
 
   int count = -1;
 
-  for (int z=0; z < KateGlobal::self()->kateDocuments().size(); ++z)
+  foreach(KateDocument* doc, KateGlobal::self()->kateDocuments())
   {
-    KateDocument *doc = (KateGlobal::self()->kateDocuments())[z];
-
     if ( (doc != this) && (doc->url().fileName() == url().fileName()) )
       if ( doc->m_docNameNumber > count )
         count = doc->m_docNameNumber;
@@ -3887,7 +3888,7 @@
     QLinkedList<KateView*>::iterator it = m_views.begin();
     for(int i = 0; i < m_views.size(); ++i, ++it) {
       setActiveView(*it);
-      (*it)->setCursorPositionInternal( cursorPositions[i], m_config->tabWidth(), \
false ); +      (*it)->setCursorPositionInternal( cursorPositions.at(i), \
m_config->tabWidth(), false );  if ((*it)->isVisible()) {
         (*it)->repaintText(false);
       }
@@ -3898,8 +3899,8 @@
     {
       if (z < (int)lines())
       {
-        if (line(tmp[z].mark.line) == tmp[z].line)
-          setMark (tmp[z].mark.line, tmp[z].mark.type);
+        if (line(tmp.at(z).mark.line) == tmp.at(z).line)
+          setMark (tmp.at(z).mark.line, tmp.at(z).mark.type);
       }
     }
 
@@ -4087,9 +4088,9 @@
     const QString nameOfFile = url().fileName();
 
     bool found = false;
-    for (int i = 0; !found && i < wildcards.size(); ++i)
+    foreach(const QString& pattern, wildcards)
     {
-      QRegExp wildcard (wildcards[i], Qt::CaseSensitive, QRegExp::Wildcard);
+      QRegExp wildcard (pattern, Qt::CaseSensitive, QRegExp::Wildcard);
 
       found = wildcard.exactMatch (nameOfFile);
     }
@@ -4356,10 +4357,7 @@
 // KTextEditor::variable
 QString KateDocument::variable( const QString &name ) const
 {
-  if ( m_storedVariables.contains( name ) )
-    return m_storedVariables[ name ];
-
-  return QString();
+  return m_storedVariables.value(name, QString());
 }
 
 //END
@@ -4837,7 +4835,7 @@
 
                 saveAs( url );
             }
-            else
+            else
             {
                 save();
             }
@@ -5145,7 +5143,7 @@
       QString matchingPrefix = prefixStore.findPrefix(textLine, col);
       if(!matchingPrefix.isEmpty()) {
         toReturn += text(KTextEditor::Range(previous, KTextEditor::Cursor(line, \
                col)));
-        const QChar& c = characterEncodingsHash[matchingPrefix];
+        const QChar& c = characterEncodingsHash.value(matchingPrefix);
         const bool isNullChar = c.isNull();
         if(!c.isNull()) {
           toReturn += c;
@@ -5247,9 +5245,9 @@
 
   for ( int i = 0; i < intAttrs.size(); i += 3 ) {
     attribs << KTextEditor::HighlightInterface::AttributeBlock(
-      intAttrs[i],
-      intAttrs[i+1],
-      view->renderer()->attribute(intAttrs[i+2])
+      intAttrs.at(i),
+      intAttrs.at(i+1),
+      view->renderer()->attribute(intAttrs.at(i+2))
     );
   }
 
@@ -5281,7 +5279,7 @@
     if ( ctxcnt == 0 ) {
       return highlightingMode();
     }
-    int ctx = ctxs[ctxcnt-1];
+    int ctx = ctxs.at(ctxcnt-1);
     if ( ctx == 0 ) {
       return highlightingMode();
     }
--- trunk/KDE/kdelibs/kate/tests/katedocument_test.cpp #1196612:1196613
@@ -53,7 +53,35 @@
     }
 }
 
+class MovingRangeInvalidator : public QObject {
+    Q_OBJECT
+public:
+  explicit MovingRangeInvalidator( QObject* parent = 0 )
+    : QObject(parent)
+  {
+  }
 
+  void addRange(MovingRange* range)
+  {
+    m_ranges << range;
+  }
+  QList<MovingRange*> ranges() const
+  {
+    return m_ranges;
+  }
+
+public slots:
+    void aboutToInvalidateMovingInterfaceContent()
+    {
+        qDeleteAll(m_ranges);
+        m_ranges.clear();
+    }
+
+private:
+    QList<MovingRange*> m_ranges;
+};
+
+
 KateDocumentTest::KateDocumentTest()
   : QObject()
 {
@@ -160,6 +188,10 @@
     Q_ASSERT(columns % (rangeLength + rangeGap) == 0);
 
     KateDocument doc(false, false, false);
+    MovingRangeInvalidator invalidator;
+    connect(&doc, SIGNAL(aboutToInvalidateMovingInterfaceContent(KTextEditor::Document*)),
 +            &invalidator, SLOT(aboutToInvalidateMovingInterfaceContent()));
+
     QString text;
     QVector<Range> ranges;
     ranges.reserve(lines * columns / (rangeLength + rangeGap));
@@ -171,24 +203,29 @@
             ranges << Range(l, c, l, c + rangeLength);
         }
     }
+
+    // replace
+    QBENCHMARK {
     // init
     doc.setText(text);
-    QVector<MovingRange*> movingRanges;
-    movingRanges.reserve(ranges.size());
     foreach(const Range& range, ranges) {
-        movingRanges << doc.newMovingRange(range);
+            invalidator.addRange(doc.newMovingRange(range));
     }
+        QCOMPARE(invalidator.ranges().size(), ranges.size());
 
     #ifdef USE_VALGRIND
         CALLGRIND_START_INSTRUMENTATION
     #endif
 
-    // replace
-    QBENCHMARK {
         doc.setText(text);
-    }
 
     #ifdef USE_VALGRIND
         CALLGRIND_STOP_INSTRUMENTATION
     #endif
+
+        QCOMPARE(doc.text(), text);
+        QVERIFY(invalidator.ranges().isEmpty());
 }
+}
+
+#include "katedocument_test.moc"
--- trunk/KDE/kdelibs/kate/tests/movingrange_test.cpp #1196612:1196613
@@ -139,6 +139,8 @@
                                           KTextEditor::MovingRange::AllowEmpty);
   range->setFeedback(&rf);
   rf.verifyReset();
+
+  // remove exact range
   doc.removeText(range->toRange());
   QVERIFY(rf.rangeEmptyCalled());
   QVERIFY(!rf.rangeInvalidCalled());
@@ -147,10 +149,37 @@
   QVERIFY(!rf.caretEnteredRangeCalled());
   QVERIFY(!rf.caretExitedRangeCalled());
 
-  // clear document, should call rangeEmpty again
+  // clear document: should call rangeInvalid
   rf.reset();
   rf.verifyReset();
   doc.clear();
+  QVERIFY(rf.rangeInvalidCalled());
+  QVERIFY(!rf.rangeEmptyCalled());
+  QVERIFY(!rf.mouseEnteredRangeCalled());
+  QVERIFY(!rf.mouseExitedRangeCalled());
+  QVERIFY(!rf.caretEnteredRangeCalled());
+  QVERIFY(!rf.caretExitedRangeCalled());
+
+  // setText: should behave just like clear document: call rangeInvalid again
+  doc.setText(text);
+  range->setRange(Range(Cursor(0, 2), Cursor(1, 4)));
+  rf.reset();
+  rf.verifyReset();
+  doc.setText("--yyyy\nyyyy--");
+  QVERIFY(rf.rangeInvalidCalled());
+  QVERIFY(!rf.rangeEmptyCalled());
+  QVERIFY(!rf.mouseEnteredRangeCalled());
+  QVERIFY(!rf.mouseExitedRangeCalled());
+  QVERIFY(!rf.caretEnteredRangeCalled());
+  QVERIFY(!rf.caretExitedRangeCalled());
+
+  // now remove entire document range. In this case, emptyRange should be called
+  // instead of rangeInvalid
+  doc.setText(text);
+  range->setRange(Range(Cursor(0, 2), Cursor(1, 4)));
+  rf.reset();
+  rf.verifyReset();
+  doc.removeText(doc.documentRange());
   QVERIFY(rf.rangeEmptyCalled());
   QVERIFY(!rf.rangeInvalidCalled());
   QVERIFY(!rf.mouseEnteredRangeCalled());
@@ -178,13 +207,54 @@
                                           \
KTextEditor::MovingRange::InvalidateIfEmpty);  range->setFeedback(&rf);
   rf.verifyReset();
+  
+  // remove exact range
   doc.removeText(range->toRange());
-  QVERIFY(!rf.rangeEmptyCalled()); // FIXME: cullmann? should this also be called?
+  QVERIFY(!rf.rangeEmptyCalled());
   QVERIFY(rf.rangeInvalidCalled());
   QVERIFY(!rf.mouseEnteredRangeCalled());
   QVERIFY(!rf.mouseExitedRangeCalled());
   QVERIFY(!rf.caretEnteredRangeCalled());
   QVERIFY(!rf.caretExitedRangeCalled());
+
+  // clear document: should call rangeInvalid again
+  doc.setText(text);
+  range->setRange(Range(Cursor(0, 2), Cursor(1, 4)));
+  rf.reset();
+  rf.verifyReset();
+  doc.clear();
+  QVERIFY(rf.rangeInvalidCalled());
+  QVERIFY(!rf.rangeEmptyCalled());
+  QVERIFY(!rf.mouseEnteredRangeCalled());
+  QVERIFY(!rf.mouseExitedRangeCalled());
+  QVERIFY(!rf.caretEnteredRangeCalled());
+  QVERIFY(!rf.caretExitedRangeCalled());
+
+  // setText: should behave just like clear document: call rangeInvalid again
+  doc.setText(text);
+  range->setRange(Range(Cursor(0, 2), Cursor(1, 4)));
+  rf.reset();
+  rf.verifyReset();
+  doc.setText("--yyyy\nyyyy--");
+  QVERIFY(rf.rangeInvalidCalled());
+  QVERIFY(!rf.rangeEmptyCalled());
+  QVERIFY(!rf.mouseEnteredRangeCalled());
+  QVERIFY(!rf.mouseExitedRangeCalled());
+  QVERIFY(!rf.caretEnteredRangeCalled());
+  QVERIFY(!rf.caretExitedRangeCalled());
+
+  // now remove entire document range. Call rangeInvalid again
+  doc.setText(text);
+  range->setRange(Range(Cursor(0, 2), Cursor(1, 4)));
+  rf.reset();
+  rf.verifyReset();
+  doc.removeText(doc.documentRange());
+  QVERIFY(rf.rangeInvalidCalled());
+  QVERIFY(!rf.rangeEmptyCalled());
+  QVERIFY(!rf.mouseEnteredRangeCalled());
+  QVERIFY(!rf.mouseExitedRangeCalled());
+  QVERIFY(!rf.caretEnteredRangeCalled());
+  QVERIFY(!rf.caretExitedRangeCalled());
 }
 
 // tests:


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

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