int KateLayoutCache::displayViewLine(const KTextEditor::Cursor& virtualCursor, bool limitToVisible) { KTextEditor::Cursor work = viewCacheStart(); // only try this with valid lines! if (work.isValid()) work.setLine(m_renderer->folding().lineToVisibleLine(work.line())); if (!work.isValid()) return virtualCursor.line(); int limit = m_textLayouts.count(); // Efficient non-word-wrapped path if (!m_renderer->view()->dynWordWrap()) { int ret = virtualCursor.line() - work.line(); if (limitToVisible && (ret < 0 || ret > limit)) return -1; else return ret; } if (work == virtualCursor) { return 0; } int ret = -(int)viewLine(viewCacheStart()); bool forwards = (work < virtualCursor); // FIXME switch to using ranges? faster? if (forwards) { while (work.line() != virtualCursor.line()) { ret += viewLineCount(m_renderer->folding().visibleLineToLine(work.line())); work.setLine(work.line() + 1); if (limitToVisible && ret > limit) return -1; } } else { while (work.line() != virtualCursor.line()) { work.setLine(work.line() - 1); ret -= viewLineCount(m_renderer->folding().visibleLineToLine(work.line())); if (limitToVisible && ret < 0) return -1; } } // final difference KTextEditor::Cursor realCursor = virtualCursor; realCursor.setLine(m_renderer->folding().visibleLineToLine(realCursor.line())); if (realCursor.column() == -1) realCursor.setColumn(m_renderer->doc()->lineLength(realCursor.line())); ret += viewLine(realCursor); if (limitToVisible && (ret < 0 || ret > limit)) return -1; return ret; }
void ModelTest::completionItems() { KTextEditor::Document* doc = KTextEditor::Editor::instance()->createDocument(0); QFETCH(QString, text); QFETCH(QString, type); KTextEditor::Cursor position; QString textBeforeCursor = text.left(text.indexOf('|')); position.setLine(textBeforeCursor.count('\n')); position.setColumn(textBeforeCursor.mid(textBeforeCursor.lastIndexOf('\n')).length()); text.replace('|', ""); QTemporaryFile file("XXXXXXXXX."+type); file.open(); file.write(text.toUtf8()); file.close(); doc->openUrl(KUrl("file://"+QDir::current().absoluteFilePath(file.fileName()))); QCOMPARE(doc->mimeType(), QString("text/")+type); KTextEditor::View* view = doc->createView(0); CodeCompletionModel* model = new CodeCompletionModel(doc); QCOMPARE(model->rowCount(), 0); model->completionInvoked(view, model->completionRange(view, position), KTextEditor::CodeCompletionModel::ManualInvocation); QStringList completions; for (int i=0; i < model->rowCount(); ++i) { completions << model->data(model->index(i, CodeCompletionModel::Name), Qt::DisplayRole).toString(); } kDebug() << "completions" << completions; QFETCH(QStringList, result); foreach (const QString &i, result) { QVERIFY(completions.contains(i)); }