Changeset View
Changeset View
Standalone View
Standalone View
src/completion/katewordcompletion.cpp
| Show All 21 Lines | |||||
| 22 | //BEGIN includes | 22 | //BEGIN includes | ||
| 23 | #include "katewordcompletion.h" | 23 | #include "katewordcompletion.h" | ||
| 24 | #include "kateview.h" | 24 | #include "kateview.h" | ||
| 25 | #include "kateconfig.h" | 25 | #include "kateconfig.h" | ||
| 26 | #include "katedocument.h" | 26 | #include "katedocument.h" | ||
| 27 | #include "kateglobal.h" | 27 | #include "kateglobal.h" | ||
| 28 | #include "katepartdebug.h" | 28 | #include "katepartdebug.h" | ||
| 29 | #include "katedefaultcolors.h" | 29 | #include "katedefaultcolors.h" | ||
| 30 | #include "katehighlight.h" | ||||
| 30 | 31 | | |||
| 31 | #include <ktexteditor/movingrange.h> | 32 | #include <ktexteditor/movingrange.h> | ||
| 32 | #include <ktexteditor/range.h> | 33 | #include <ktexteditor/range.h> | ||
| 33 | 34 | | |||
| 34 | #include <KLocalizedString> | 35 | #include <KLocalizedString> | ||
| 35 | #include <KPluginFactory> | 36 | #include <KPluginFactory> | ||
| 36 | #include <KActionCollection> | 37 | #include <KActionCollection> | ||
| 37 | #include <KParts/Part> | 38 | #include <KParts/Part> | ||
| ▲ Show 20 Lines • Show All 169 Lines • ▼ Show 20 Line(s) | |||||
| 207 | * ignoring any dublets and words shorter than configured and/or | 208 | * ignoring any dublets and words shorter than configured and/or | ||
| 208 | * reasonable minimum length. | 209 | * reasonable minimum length. | ||
| 209 | */ | 210 | */ | ||
| 210 | QStringList KateWordCompletionModel::allMatches(KTextEditor::View *view, const KTextEditor::Range &range) const | 211 | QStringList KateWordCompletionModel::allMatches(KTextEditor::View *view, const KTextEditor::Range &range) const | ||
| 211 | { | 212 | { | ||
| 212 | QSet<QString> result; | 213 | QSet<QString> result; | ||
| 213 | const int minWordSize = qMax(2, qobject_cast<KTextEditor::ViewPrivate *>(view)->config()->wordCompletionMinimalWordLength()); | 214 | const int minWordSize = qMax(2, qobject_cast<KTextEditor::ViewPrivate *>(view)->config()->wordCompletionMinimalWordLength()); | ||
| 214 | const int lines = view->document()->lines(); | 215 | const int lines = view->document()->lines(); | ||
| 216 | KateHighlighting *h = qobject_cast<KTextEditor::ViewPrivate *>(view)->doc()->highlight(); | ||||
| 215 | for (int line = 0; line < lines; line++) { | 217 | for (int line = 0; line < lines; line++) { | ||
| 216 | const QString &text = view->document()->line(line); | 218 | const QString &text = view->document()->line(line); | ||
| 217 | int wordBegin = 0; | 219 | int wordBegin = 0; | ||
| 218 | int offset = 0; | 220 | int offset = 0; | ||
| 219 | const int end = text.size(); | 221 | const int end = text.size(); | ||
| 220 | const bool cursorLine = view->cursorPosition().line() == line; | 222 | const bool cursorLine = view->cursorPosition().line() == line; | ||
| 221 | while (offset < end) { | 223 | while (offset < end) { | ||
| 222 | const QChar c = text.at(offset); | 224 | const QChar c = text.at(offset); | ||
| 223 | // increment offset when at line end, so we take the last character too | 225 | // increment offset when at line end, so we take the last character too | ||
| 224 | if ((! c.isLetterOrNumber() && c != QLatin1Char('_')) || (offset == end - 1 && offset++)) { | 226 | if (!h->isInWord(c) || (offset == end - 1 && offset++)) { | ||
| 225 | if (offset - wordBegin > minWordSize && (line != range.end().line() || offset != range.end().column())) { | 227 | if (offset - wordBegin > minWordSize && (line != range.end().line() || offset != range.end().column())) { | ||
| 226 | /** | 228 | /** | ||
| 227 | * don't add the word we are inside with cursor! | 229 | * don't add the word we are inside with cursor! | ||
| 228 | */ | 230 | */ | ||
| 229 | if (!cursorLine || (view->cursorPosition().column() < wordBegin || view->cursorPosition().column() > offset)) { | 231 | if (!cursorLine || (view->cursorPosition().column() < wordBegin || view->cursorPosition().column() > offset)) { | ||
| 230 | result.insert(text.mid(wordBegin, offset - wordBegin)); | 232 | result.insert(text.mid(wordBegin, offset - wordBegin)); | ||
| 231 | } | 233 | } | ||
| 232 | } | 234 | } | ||
| Show All 9 Lines | |||||
| 242 | } | 244 | } | ||
| 243 | 245 | | |||
| 244 | void KateWordCompletionModel::executeCompletionItem (KTextEditor::View *view | 246 | void KateWordCompletionModel::executeCompletionItem (KTextEditor::View *view | ||
| 245 | , const KTextEditor::Range &word | 247 | , const KTextEditor::Range &word | ||
| 246 | , const QModelIndex &index | 248 | , const QModelIndex &index | ||
| 247 | ) const | 249 | ) const | ||
| 248 | { | 250 | { | ||
| 249 | KTextEditor::ViewPrivate *v = qobject_cast<KTextEditor::ViewPrivate *> (view); | 251 | KTextEditor::ViewPrivate *v = qobject_cast<KTextEditor::ViewPrivate *> (view); | ||
| 252 | KateHighlighting *h = v->doc()->highlight(); | ||||
| 250 | if (v->config()->wordCompletionRemoveTail()) { | 253 | if (v->config()->wordCompletionRemoveTail()) { | ||
| 251 | int tailStart = word.end().column(); | 254 | int tailStart = word.end().column(); | ||
| 252 | const QString &line = view->document()->line(word.end().line()); | 255 | const QString &line = view->document()->line(word.end().line()); | ||
| 253 | int tailEnd = line.length(); | 256 | int tailEnd = line.length(); | ||
| 254 | for (int i = word.end().column(); i < tailEnd; ++i) { | 257 | for (int i = word.end().column(); i < tailEnd; ++i) { | ||
| 255 | // Letters, numbers and underscore are part of a word! | 258 | if (!h->isInWord(line[i])) { | ||
| 256 | /// \todo Introduce configurable \e word-separators?? | | |||
| 257 | if (!line[i].isLetterOrNumber() && line[i] != QLatin1Char('_')) { | | |||
| 258 | tailEnd = i; | 259 | tailEnd = i; | ||
| 259 | } | 260 | } | ||
| 260 | } | 261 | } | ||
| 261 | 262 | | |||
| 262 | int sizeDiff = m_matches.at(index.row()).size() - (word.end().column() - word.start().column()); | 263 | int sizeDiff = m_matches.at(index.row()).size() - (word.end().column() - word.start().column()); | ||
| 263 | 264 | | |||
| 264 | tailStart += sizeDiff; | 265 | tailStart += sizeDiff; | ||
| 265 | tailEnd += sizeDiff; | 266 | tailEnd += sizeDiff; | ||
| Show All 23 Lines | |||||
| 289 | 290 | | |||
| 290 | // Return the range containing the word left of the cursor | 291 | // Return the range containing the word left of the cursor | ||
| 291 | KTextEditor::Range KateWordCompletionModel::completionRange(KTextEditor::View *view, const KTextEditor::Cursor &position) | 292 | KTextEditor::Range KateWordCompletionModel::completionRange(KTextEditor::View *view, const KTextEditor::Cursor &position) | ||
| 292 | { | 293 | { | ||
| 293 | int line = position.line(); | 294 | int line = position.line(); | ||
| 294 | int col = position.column(); | 295 | int col = position.column(); | ||
| 295 | 296 | | |||
| 296 | KTextEditor::Document *doc = view->document(); | 297 | KTextEditor::Document *doc = view->document(); | ||
| 298 | KateHighlighting *h = qobject_cast<KTextEditor::ViewPrivate *>(view)->doc()->highlight(); | ||||
| 297 | while (col > 0) { | 299 | while (col > 0) { | ||
| 298 | const QChar c = (doc->characterAt(KTextEditor::Cursor(line, col - 1))); | 300 | const QChar c = (doc->characterAt(KTextEditor::Cursor(line, col - 1))); | ||
| 299 | if (c.isLetterOrNumber() || c.isMark() || c == QLatin1Char('_')) { | 301 | if (h->isInWord(c)) { | ||
| 300 | col--; | 302 | col--; | ||
| 301 | continue; | 303 | continue; | ||
| 302 | } | 304 | } | ||
| 303 | 305 | | |||
| 304 | break; | 306 | break; | ||
| 305 | } | 307 | } | ||
| 306 | 308 | | |||
| 307 | return KTextEditor::Range(KTextEditor::Cursor(line, col), position); | 309 | return KTextEditor::Range(KTextEditor::Cursor(line, col), position); | ||
| ▲ Show 20 Lines • Show All 276 Lines • Show Last 20 Lines | |||||