• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

Kate

  • kde-4.14
  • applications
  • kate
  • part
  • completion
katecompletionwidget.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries and the Kate part.
2  *
3  * Copyright (C) 2005-2006 Hamish Rodda <rodda@kde.org>
4  * Copyright (C) 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB. If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21 
22 #include "katecompletionwidget.h"
23 
24 #include <QtGui/QBoxLayout>
25 #include <QtGui/QApplication>
26 #include <QtGui/QDesktopWidget>
27 #include <QtGui/QHeaderView>
28 #include <QtCore/QTimer>
29 #include <QtGui/QLabel>
30 #include <QtGui/QToolButton>
31 #include <QtGui/QSizeGrip>
32 #include <QtGui/QPushButton>
33 #include <QtGui/QAbstractScrollArea>
34 #include <QtGui/QScrollBar>
35 #include <QtCore/QScopedPointer>
36 
37 #include <kicon.h>
38 #include <kdialog.h>
39 
40 #include <ktexteditor/codecompletionmodelcontrollerinterface.h>
41 
42 #include "kateview.h"
43 #include "katerenderer.h"
44 #include "kateconfig.h"
45 #include "katedocument.h"
46 #include "katebuffer.h"
47 
48 #include "katecompletionmodel.h"
49 #include "katecompletiontree.h"
50 #include "katecompletionconfig.h"
51 #include "kateargumenthinttree.h"
52 #include "kateargumenthintmodel.h"
53 
54 //#include "modeltest.h"
55 
56 const bool hideAutomaticCompletionOnExactMatch = true;
57 
58 //If this is true, the completion-list is navigated up/down when 'tab' is pressed, instead of doing partial completion
59 const bool shellLikeTabCompletion = false;
60 
61 #define CALLCI(WHAT,WHATELSE,WHAT2,model,FUNC) \
62 {\
63  static KTextEditor::CodeCompletionModelControllerInterface3 defaultIf;\
64  KTextEditor::CodeCompletionModelControllerInterface3* ret =\
65  dynamic_cast<KTextEditor::CodeCompletionModelControllerInterface3*>(model);\
66  if (!ret) {\
67  WHAT2 defaultIf.FUNC;\
68  }else \
69  WHAT2 ret->FUNC;\
70 }
71 
72 
73 static KTextEditor::Range _completionRange(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, const KTextEditor::Cursor& cursor){
74  CALLCI(return,,return, model,completionRange(view, cursor));
75 }
76 
77 static KTextEditor::Range _updateRange(KTextEditor::CodeCompletionModel *model,KTextEditor::View *view, KTextEditor::Range& range) {
78  CALLCI(, return range,return, model,updateCompletionRange(view, range));
79 }
80 
81 static QString _filterString(KTextEditor::CodeCompletionModel *model,KTextEditor::View *view, const KTextEditor::Range& range, const KTextEditor::Cursor& cursor) {
82  CALLCI(return,,return, model,filterString(view, range, cursor));
83 }
84 
85 static bool _shouldAbortCompletion(KTextEditor::CodeCompletionModel *model,KTextEditor::View *view, const KTextEditor::Range& range, const QString& currentCompletion) {
86  CALLCI(return,,return, model,shouldAbortCompletion(view, range, currentCompletion));
87 }
88 
89 static void _aborted(KTextEditor::CodeCompletionModel *model,KTextEditor::View *view) {
90  CALLCI(return,,return, model,aborted(view));
91 }
92 
93 static bool _shouldStartCompletion(KTextEditor::CodeCompletionModel *model,KTextEditor::View *view, QString m_automaticInvocationLine,bool m_lastInsertionByUser, const KTextEditor::Cursor& cursor) {
94  CALLCI(return,,return,model,shouldStartCompletion(view, m_automaticInvocationLine, m_lastInsertionByUser, cursor));
95 }
96 
97 KateCompletionWidget::KateCompletionWidget(KateView* parent)
98  : QFrame(parent, Qt::ToolTip)
99  , m_presentationModel(new KateCompletionModel(this))
100  , m_entryList(new KateCompletionTree(this))
101  , m_argumentHintModel(new KateArgumentHintModel(this))
102  , m_argumentHintTree(new KateArgumentHintTree(this))
103  , m_automaticInvocationDelay(100)
104  , m_filterInstalled(false)
105  , m_configWidget(new KateCompletionConfig(m_presentationModel, view()))
106  , m_lastInsertionByUser(false)
107  , m_inCompletionList(false)
108  , m_isSuspended(false)
109  , m_dontShowArgumentHints(false)
110  , m_needShow(false)
111  , m_hadCompletionNavigation(false)
112  , m_noAutoHide(false)
113  , m_completionEditRunning (false)
114  , m_expandedAddedHeightBase(0)
115  , m_lastInvocationType(KTextEditor::CodeCompletionModel::AutomaticInvocation)
116 {
117  connect(parent, SIGNAL(navigateAccept()), SLOT(navigateAccept()));
118  connect(parent, SIGNAL(navigateBack()), SLOT(navigateBack()));
119  connect(parent, SIGNAL(navigateDown()), SLOT(navigateDown()));
120  connect(parent, SIGNAL(navigateLeft()), SLOT(navigateLeft()));
121  connect(parent, SIGNAL(navigateRight()), SLOT(navigateRight()));
122  connect(parent, SIGNAL(navigateUp()), SLOT(navigateUp()));
123 
124  qRegisterMetaType<KTextEditor::Cursor>("KTextEditor::Cursor");
125 
126  setFrameStyle( QFrame::Box | QFrame::Plain );
127  setLineWidth( 1 );
128  //setWindowOpacity(0.8);
129 
130  m_entryList->setModel(m_presentationModel);
131  m_entryList->setColumnWidth(0, 0); //These will be determined automatically in KateCompletionTree::resizeColumns
132  m_entryList->setColumnWidth(1, 0);
133  m_entryList->setColumnWidth(2, 0);
134 
135  m_entryList->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
136 
137  m_argumentHintTree->setParent(0, Qt::ToolTip);
138  m_argumentHintTree->setModel(m_argumentHintModel);
139 
140  // trigger completion on double click on completion list
141  connect(m_entryList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(execute()));
142 
143  connect(m_entryList->verticalScrollBar(), SIGNAL(valueChanged(int)), m_presentationModel, SLOT(placeExpandingWidgets()));
144  connect(m_argumentHintTree->verticalScrollBar(), SIGNAL(valueChanged(int)), m_argumentHintModel, SLOT(placeExpandingWidgets()));
145  connect(view(), SIGNAL(focusOut(KTextEditor::View*)), this, SLOT(viewFocusOut()));
146 
147  m_automaticInvocationTimer = new QTimer(this);
148  m_automaticInvocationTimer->setSingleShot(true);
149  connect(m_automaticInvocationTimer, SIGNAL(timeout()), this, SLOT(automaticInvocation()));
150 
151  // Keep branches expanded
152  connect(m_presentationModel, SIGNAL(modelReset()), this, SLOT(modelReset()));
153  connect(m_presentationModel, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(rowsInserted(QModelIndex,int,int)));
154  connect(m_argumentHintModel, SIGNAL(contentStateChanged(bool)), this, SLOT(argumentHintsChanged(bool)));
155 
156  // No smart lock, no queued connects
157  connect(view(), SIGNAL(cursorPositionChanged(KTextEditor::View*,KTextEditor::Cursor)), this, SLOT(cursorPositionChanged()));
158  connect(view(), SIGNAL(verticalScrollPositionChanged(KTextEditor::View*,KTextEditor::Cursor)), this, SLOT(updatePositionSlot()));
159 
163  connect(&view()->doc()->buffer(), SIGNAL(lineWrapped(KTextEditor::Cursor)), this, SLOT(wrapLine(KTextEditor::Cursor)));
164  connect(&view()->doc()->buffer(), SIGNAL(lineUnwrapped(int)), this, SLOT(unwrapLine(int)));
165  connect(&view()->doc()->buffer(), SIGNAL(textInserted(KTextEditor::Cursor,QString)), this, SLOT(insertText(KTextEditor::Cursor,QString)));
166  connect(&view()->doc()->buffer(), SIGNAL(textRemoved(KTextEditor::Range,QString)), this, SLOT(removeText(KTextEditor::Range)));
167 
168  // This is a non-focus widget, it is passed keyboard input from the view
169 
170  //We need to do this, because else the focus goes to nirvana without any control when the completion-widget is clicked.
171  setFocusPolicy(Qt::ClickFocus);
172  m_argumentHintTree->setFocusPolicy(Qt::ClickFocus);
173 
174  foreach (QWidget* childWidget, findChildren<QWidget*>())
175  childWidget->setFocusPolicy(Qt::NoFocus);
176 
177  //Position the entry-list so a frame can be drawn around it
178  m_entryList->move(frameWidth(), frameWidth());
179 }
180 
181 KateCompletionWidget::~KateCompletionWidget() {
182 }
183 
184 void KateCompletionWidget::viewFocusOut() {
185  abortCompletion();
186 }
187 
188 void KateCompletionWidget::modelContentChanged() {
190  if(m_completionRanges.isEmpty()) {
191  //kDebug( 13035 ) << "content changed, but no completion active";
192  abortCompletion();
193  return;
194  }
195 
196  if(!view()->hasFocus()) {
197  //kDebug( 13035 ) << "view does not have focus";
198  return;
199  }
200 
201  if(!m_waitingForReset.isEmpty()) {
202  //kDebug( 13035 ) << "waiting for" << m_waitingForReset.size() << "completion-models to reset";
203  return;
204  }
205 
206  int realItemCount = 0;
207  foreach (KTextEditor::CodeCompletionModel* model, m_presentationModel->completionModels())
208  realItemCount += model->rowCount();
209  if( !m_isSuspended && ((isHidden() && m_argumentHintTree->isHidden()) || m_needShow) && realItemCount != 0 ) {
210  m_needShow = false;
211  updateAndShow();
212  }
213 
214  if(m_argumentHintModel->rowCount(QModelIndex()) == 0)
215  m_argumentHintTree->hide();
216 
217  if(m_presentationModel->rowCount(QModelIndex()) == 0)
218  hide();
219 
220 
221  //With each filtering items can be added or removed, so we have to reset the current index here so we always have a selected item
222  m_entryList->setCurrentIndex(model()->index(0,0));
223  if(!model()->indexIsItem(m_entryList->currentIndex())) {
224  QModelIndex firstIndex = model()->index(0,0, m_entryList->currentIndex());
225  m_entryList->setCurrentIndex(firstIndex);
226  //m_entryList->scrollTo(firstIndex, QAbstractItemView::PositionAtTop);
227  }
228 
229  updateHeight();
230 
231  //New items for the argument-hint tree may have arrived, so check whether it needs to be shown
232  if( m_argumentHintTree->isHidden() && !m_dontShowArgumentHints && m_argumentHintModel->rowCount(QModelIndex()) != 0 )
233  m_argumentHintTree->show();
234 
235  if(!m_noAutoHide && hideAutomaticCompletionOnExactMatch && !isHidden() &&
236  m_lastInvocationType == KTextEditor::CodeCompletionModel::AutomaticInvocation &&
237  m_presentationModel->shouldMatchHideCompletionList())
238  hide();
239  else if(isHidden() && !m_presentationModel->shouldMatchHideCompletionList() &&
240  m_presentationModel->rowCount(QModelIndex()))
241  show();
242 }
243 
244 KateArgumentHintTree* KateCompletionWidget::argumentHintTree() const {
245  return m_argumentHintTree;
246 }
247 
248 KateArgumentHintModel* KateCompletionWidget::argumentHintModel() const {
249  return m_argumentHintModel;
250 }
251 
252 const KateCompletionModel* KateCompletionWidget::model() const {
253  return m_presentationModel;
254 }
255 
256 KateCompletionModel* KateCompletionWidget::model() {
257  return m_presentationModel;
258 }
259 
260 void KateCompletionWidget::rowsInserted(const QModelIndex& parent, int rowFrom, int rowEnd)
261 {
262  m_entryList->setAnimated(false);
263  if(!model()->isGroupingEnabled())
264  return;
265 
266  if (!parent.isValid())
267  for (int i = rowFrom; i <= rowEnd; ++i)
268  m_entryList->expand(m_presentationModel->index(i, 0, parent));
269 }
270 
271 KateView * KateCompletionWidget::view( ) const
272 {
273  return static_cast<KateView*>(const_cast<QObject*>(parent()));
274 }
275 
276 void KateCompletionWidget::argumentHintsChanged(bool hasContent)
277 {
278  m_dontShowArgumentHints = !hasContent;
279 
280  if( m_dontShowArgumentHints )
281  m_argumentHintTree->hide();
282  else
283  updateArgumentHintGeometry();
284 }
285 
286 void KateCompletionWidget::startCompletion(KTextEditor::CodeCompletionModel::InvocationType invocationType, const QList<KTextEditor::CodeCompletionModel*>& models)
287 {
288  if(invocationType == KTextEditor::CodeCompletionModel::UserInvocation)
289  {
290  abortCompletion();
291  }
292  startCompletion(KTextEditor::Range(KTextEditor::Cursor(-1, -1), KTextEditor::Cursor(-1, -1)), models, invocationType);
293 }
294 
295 void KateCompletionWidget::deleteCompletionRanges()
296 {
298  foreach(const CompletionRange &r, m_completionRanges)
299  delete r.range;
300  m_completionRanges.clear();
301 }
302 
303 void KateCompletionWidget::startCompletion(const KTextEditor::Range& word, KTextEditor::CodeCompletionModel* model, KTextEditor::CodeCompletionModel::InvocationType invocationType)
304 {
305  QList<KTextEditor::CodeCompletionModel*> models;
306  if (model) {
307  models << model;
308  } else {
309  models = m_sourceModels;
310  }
311  startCompletion(word, models, invocationType);
312 }
313 
314 void KateCompletionWidget::startCompletion(const KTextEditor::Range& word, const QList<KTextEditor::CodeCompletionModel*>& modelsToStart, KTextEditor::CodeCompletionModel::InvocationType invocationType)
315 {
316 
318 
319  m_isSuspended = false;
320  m_inCompletionList = true; //Always start at the top of the completion-list
321  m_needShow = true;
322 
323  if(m_completionRanges.isEmpty())
324  m_noAutoHide = false; //Re-enable auto-hide on every clean restart of the completion
325 
326  m_lastInvocationType = invocationType;
327 
328  disconnect(this->model(), SIGNAL(layoutChanged()), this, SLOT(modelContentChanged()));
329  disconnect(this->model(), SIGNAL(modelReset()), this, SLOT(modelContentChanged()));
330 
331  m_dontShowArgumentHints = true;
332 
333  QList<KTextEditor::CodeCompletionModel*> models = (modelsToStart.isEmpty() ? m_sourceModels : modelsToStart);
334 
335  foreach(KTextEditor::CodeCompletionModel* model, m_completionRanges.keys())
336  if(!models.contains(model))
337  models << model;
338 
339  if (!m_filterInstalled) {
340  if (!QApplication::activeWindow()) {
341  kWarning(13035) << "No active window to install event filter on!!";
342  return;
343  }
344  // Enable the cc box to move when the editor window is moved
345  QApplication::activeWindow()->installEventFilter(this);
346  m_filterInstalled = true;
347  }
348 
349  m_presentationModel->clearCompletionModels();
350 
351  if(invocationType == KTextEditor::CodeCompletionModel::UserInvocation) {
352  deleteCompletionRanges();
353  }
354 
355  foreach (KTextEditor::CodeCompletionModel* model, models) {
356  KTextEditor::Range range;
357  if (word.isValid()) {
358  range = word;
359  //kDebug()<<"word is used";
360  } else {
361  range=_completionRange(model,view(), view()->cursorPosition());
362  //kDebug()<<"completionRange has been called, cursor pos is"<<view()->cursorPosition();
363  }
364  //kDebug()<<"range is"<<range;
365  if(!range.isValid()) {
366  if(m_completionRanges.contains(model)) {
367  KTextEditor::MovingRange *oldRange = m_completionRanges[model].range;
368  //kDebug()<<"removing completion range 1";
369  m_completionRanges.remove(model);
370  delete oldRange;
371  }
372  models.removeAll(model);
373  continue;
374  }
375  if(m_completionRanges.contains(model)) {
376  if(*m_completionRanges[model].range == range) {
377  continue; //Leave it running as it is
378  }
379  else { // delete the range that was used previously
380  KTextEditor::MovingRange *oldRange = m_completionRanges[model].range;
381  //kDebug()<<"removing completion range 2";
382  m_completionRanges.remove(model);
383  delete oldRange;
384  }
385  }
386 
387  connect(model, SIGNAL(waitForReset()), this, SLOT(waitForModelReset()));
388 
389  //kDebug()<<"Before completin invoke: range:"<<range;
390  model->completionInvoked(view(), range, invocationType);
391 
392  disconnect(model, SIGNAL(waitForReset()), this, SLOT(waitForModelReset()));
393 
394  m_completionRanges[model] = view()->doc()->newMovingRange(range, KTextEditor::MovingRange::ExpandRight | KTextEditor::MovingRange::ExpandLeft);
395 
396  //In automatic invocation mode, hide the completion widget as soon as the position where the completion was started is passed to the left
397  m_completionRanges[model].leftBoundary = view()->cursorPosition();
398 
399  //In manual invocation mode, bound the activity either the point from where completion was invoked, or to the start of the range
400  if(invocationType != KTextEditor::CodeCompletionModel::AutomaticInvocation)
401  if(range.start() < m_completionRanges[model].leftBoundary)
402  m_completionRanges[model].leftBoundary = range.start();
403 
404  if(!m_completionRanges[model].range->toRange().isValid()) {
405  kWarning(13035) << "Could not construct valid smart-range from" << range << "instead got" << *m_completionRanges[model].range;
406  abortCompletion();
407  return;
408  }
409  }
410 
411  m_presentationModel->setCompletionModels(models);
412 
413  cursorPositionChanged();
414 
415  if (!m_completionRanges.isEmpty()) {
416  connect(this->model(), SIGNAL(layoutChanged()), this, SLOT(modelContentChanged()));
417  connect(this->model(), SIGNAL(modelReset()), this, SLOT(modelContentChanged()));
418  //Now that all models have been notified, check whether the widget should be displayed instantly
419  modelContentChanged();
420  }
421  else {
422  abortCompletion();
423  }
424 }
425 
426 void KateCompletionWidget::waitForModelReset()
427 {
428  KTextEditor::CodeCompletionModel* senderModel = qobject_cast<KTextEditor::CodeCompletionModel*>(sender());
429  if(!senderModel) {
430  kWarning() << "waitForReset signal from bad model";
431  return;
432  }
433  m_waitingForReset.insert(senderModel);
434 }
435 
436 void KateCompletionWidget::updateAndShow()
437 {
438  //kDebug()<<"*******************************************";
439  if(!view()->hasFocus()) {
440  kDebug( 13035 ) << "view does not have focus";
441  return;
442  }
443 
444  setUpdatesEnabled(false);
445 
446  modelReset();
447 
448  m_argumentHintModel->buildRows();
449  if( m_argumentHintModel->rowCount(QModelIndex()) != 0 )
450  argumentHintsChanged(true);
451 // }
452 
453  //We do both actions twice here so they are stable, because they influence each other:
454  //updatePosition updates the height, resizeColumns needs the correct height to decide over
455  //how many rows it computs the column-width
456  updatePosition(true);
457  m_entryList->resizeColumns(true, true);
458  updatePosition(true);
459  m_entryList->resizeColumns(true, true);
460 
461  setUpdatesEnabled(true);
462 
463  if(m_argumentHintModel->rowCount(QModelIndex())) {
464  updateArgumentHintGeometry();
465  m_argumentHintTree->show();
466  } else
467  m_argumentHintTree->hide();
468 
469  if (m_presentationModel->rowCount() && (!m_presentationModel->shouldMatchHideCompletionList() ||
470  !hideAutomaticCompletionOnExactMatch ||
471  m_lastInvocationType != KTextEditor::CodeCompletionModel::AutomaticInvocation) )
472  show();
473  else
474  hide();
475 }
476 
477 void KateCompletionWidget::updatePositionSlot()
478 {
479  updatePosition();
480 }
481 
482 bool KateCompletionWidget::updatePosition(bool force)
483 {
484  if (!force && !isCompletionActive())
485  return false;
486 
487  if (!completionRange()) {
488  return false;
489  }
490  QPoint cursorPosition = view()->cursorToCoordinate(completionRange()->start());
491  if (cursorPosition == QPoint(-1,-1)) {
492  // Start of completion range is now off-screen -> abort
493  abortCompletion();
494  return false;
495  }
496 
497  QPoint p = view()->mapToGlobal( cursorPosition );
498  int x = p.x() - m_entryList->columnTextViewportPosition(m_presentationModel->translateColumn(KTextEditor::CodeCompletionModel::Name)) - 4 - (m_entryList->viewport()->pos().x());
499  int y = p.y();
500 
501  y += view()->renderer()->config()->fontMetrics().height() + 4;
502 
503  bool borderHit = false;
504 
505  if (x + width() > QApplication::desktop()->screenGeometry(view()).right()) {
506  x = QApplication::desktop()->screenGeometry(view()).right() - width();
507  borderHit = true;
508  }
509 
510  if( x < QApplication::desktop()->screenGeometry(view()).left() ) {
511  x = QApplication::desktop()->screenGeometry(view()).left();
512  borderHit = true;
513  }
514 
515  move( QPoint(x,y) );
516 
517  updateHeight();
518 
519  updateArgumentHintGeometry();
520 
521 // //kDebug() << "updated to" << geometry() << m_entryList->geometry() << borderHit;
522 
523  return borderHit;
524 }
525 
526 void KateCompletionWidget::updateArgumentHintGeometry()
527 {
528  if( !m_dontShowArgumentHints ) {
529  //Now place the argument-hint widget
530  QRect geom = m_argumentHintTree->geometry();
531  geom.moveTo(pos());
532  geom.setWidth(width());
533  geom.moveBottom(pos().y() - view()->renderer()->config()->fontMetrics().height()*2);
534  m_argumentHintTree->updateGeometry(geom);
535  }
536 }
537 
538 //Checks whether the given model has at least "rows" rows, also searching the second level of the tree.
539 bool hasAtLeastNRows(int rows, QAbstractItemModel* model) {
540  int count = 0;
541  for(int row = 0; row < model->rowCount(); ++row) {
542  ++count;
543 
544  QModelIndex index(model->index(row, 0));
545  if(index.isValid())
546  count += model->rowCount(index);
547 
548  if(count > rows)
549  return true;
550  }
551  return false;
552 }
553 
554 void KateCompletionWidget::updateHeight()
555 {
556  QRect geom = geometry();
557 
558  int minBaseHeight = 10;
559  int maxBaseHeight = 300;
560 
561  int baseHeight = 0;
562  int calculatedCustomHeight = 0;
563 
564  if(hasAtLeastNRows(15, m_presentationModel)) {
565  //If we know there is enough rows, always use max-height, we don't need to calculate size-hints
566  baseHeight = maxBaseHeight;
567  }else{
568  //Calculate size-hints to determine the best height
569  for(int row = 0; row < m_presentationModel->rowCount(); ++row) {
570  baseHeight += treeView()->sizeHintForRow(row);
571 
572  QModelIndex index(m_presentationModel->index(row, 0));
573  if(index.isValid()) {
574  for(int row2 = 0; row2 < m_presentationModel->rowCount(index); ++row2) {
575  int h = 0;
576  for(int a = 0; a < m_presentationModel->columnCount(index); ++a) {
577  int localHeight = treeView()->sizeHintForIndex(index.child(row2, a)).height();
578  if(localHeight > h)
579  h = localHeight;
580  }
581  baseHeight += h;
582  if(baseHeight > maxBaseHeight)
583  break;
584  }
585 
586  if(baseHeight > maxBaseHeight)
587  break;
588  }
589  }
590 
591  calculatedCustomHeight = baseHeight;
592  }
593 
594  baseHeight += 2*frameWidth();
595 
596  if(m_entryList->horizontalScrollBar()->isVisible())
597  baseHeight += m_entryList->horizontalScrollBar()->height();
598 
599 
600  if(baseHeight < minBaseHeight)
601  baseHeight = minBaseHeight;
602  if(baseHeight > maxBaseHeight) {
603  baseHeight = maxBaseHeight;
604  m_entryList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
605  }else{
606  //Somewhere there seems to be a bug that makes QTreeView add a scroll-bar
607  //even if the content exactly fits in. So forcefully disable the scroll-bar in that case
608  m_entryList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
609 }
610 
611  int newExpandingAddedHeight = 0;
612 
613  if(baseHeight == maxBaseHeight && model()->expandingWidgetsHeight()) {
614  //Eventually add some more height
615  if(calculatedCustomHeight && calculatedCustomHeight > baseHeight && calculatedCustomHeight < (maxBaseHeight + model()->expandingWidgetsHeight()))
616  newExpandingAddedHeight = calculatedCustomHeight - baseHeight;
617  else
618  newExpandingAddedHeight = model()->expandingWidgetsHeight();
619  }
620 
621  if( m_expandedAddedHeightBase != baseHeight && m_expandedAddedHeightBase - baseHeight > -2 && m_expandedAddedHeightBase - baseHeight < 2 )
622  {
623  //Re-use the stored base-height if it only slightly differs from the current one.
624  //Reason: Qt seems to apply slightly wrong sizes when the completion-widget is moved out of the screen at the bottom,
625  // which completely breaks this algorithm. Solution: re-use the old base-size if it only slightly differs from the computed one.
626  baseHeight = m_expandedAddedHeightBase;
627  }
628 
629  int screenBottom = QApplication::desktop()->screenGeometry(view()).bottom();
630 
631  //Limit the height to the bottom of the screen
632  int bottomPosition = baseHeight + newExpandingAddedHeight + geometry().top();
633 
634  if( bottomPosition > screenBottom ) {
635  newExpandingAddedHeight -= bottomPosition - (screenBottom);
636  }
637 
638  int finalHeight = baseHeight+newExpandingAddedHeight;
639 
640  if( finalHeight < 10 ) {
641  m_entryList->resize(m_entryList->width(), height() - 2*frameWidth());
642  return;
643  }
644 
645  m_expandedAddedHeightBase = geometry().height();
646 
647  geom.setHeight(finalHeight);
648 
649  //Work around a crash deep within the Qt 4.5 raster engine
650  m_entryList->setScrollingEnabled(false);
651 
652  if(geometry() != geom)
653  setGeometry(geom);
654 
655  QSize entryListSize = QSize(m_entryList->width(), finalHeight - 2*frameWidth());
656  if(m_entryList->size() != entryListSize)
657  m_entryList->resize(entryListSize);
658 
659 
660  m_entryList->setScrollingEnabled(true);
661 }
662 
663 void KateCompletionWidget::cursorPositionChanged( )
664 {
666  if (m_completionRanges.isEmpty())
667  return;
668 
669  QModelIndex oldCurrentSourceIndex;
670  if(m_inCompletionList && m_entryList->currentIndex().isValid())
671  oldCurrentSourceIndex = m_presentationModel->mapToSource(m_entryList->currentIndex());
672 
673  KTextEditor::Cursor cursor = view()->cursorPosition();
674 
675  QList<KTextEditor::CodeCompletionModel*> checkCompletionRanges = m_completionRanges.keys();
676 
677  //Check the models and eventuall abort some
678  for(QList<KTextEditor::CodeCompletionModel*>::iterator it = checkCompletionRanges.begin(); it != checkCompletionRanges.end(); ++it) {
679  KTextEditor::CodeCompletionModel *model = *it;
680  if(!m_completionRanges.contains(model))
681  continue;
682 
683  //kDebug()<<"range before _updateRange:"<< *range;
684 
685  // this might invalidate the range, therefore re-check afterwards
686  KTextEditor::Range rangeTE = m_completionRanges[model].range->toRange();
687  KTextEditor::Range newRange = _updateRange(model, view(), rangeTE);
688  if(!m_completionRanges.contains(model))
689  continue;
690 
691  // update value
692  m_completionRanges[model].range->setRange (newRange);
693 
694  //kDebug()<<"range after _updateRange:"<< *range;
695  QString currentCompletion = _filterString(model,view(), *m_completionRanges[model].range, view()->cursorPosition());
696  if(!m_completionRanges.contains(model))
697  continue;
698 
699  //kDebug()<<"after _filterString, currentCompletion="<< currentCompletion;
700  bool abort = _shouldAbortCompletion(model,view(), *m_completionRanges[model].range, currentCompletion);
701  if(!m_completionRanges.contains(model))
702  continue;
703 
704  //kDebug()<<"after _shouldAbortCompletion:abort="<<abort;
705  if(view()->cursorPosition() < m_completionRanges[model].leftBoundary) {
706  //kDebug() << "aborting because of boundary: cursor:"<<view()->cursorPosition()<<"completion_Range_left_boundary:"<<m_completionRanges[*it].leftBoundary;
707  abort = true;
708  }
709 
710  if(!m_completionRanges.contains(model))
711  continue;
712 
713  if (abort) {
714  if (m_completionRanges.count() == 1) {
715  //last model - abort whole completion
716  abortCompletion();
717  return;
718  } else {
719  {
720  delete m_completionRanges[model].range;
721  //kDebug()<<"removing completion range 3";
722  m_completionRanges.remove(model);
723  }
724 
725  _aborted(model,view());
726  m_presentationModel->removeCompletionModel(model);
727  }
728  } else {
729  m_presentationModel->setCurrentCompletion(model, currentCompletion);
730  }
731  }
732 
733  if(oldCurrentSourceIndex.isValid()) {
734  QModelIndex idx = m_presentationModel->mapFromSource(oldCurrentSourceIndex);
735  if(idx.isValid()) {
736  //kDebug() << "setting" << idx;
737  m_entryList->setCurrentIndex(idx.sibling(idx.row(), 0));
738 // m_entryList->nextCompletion();
739 // m_entryList->previousCompletion();
740  }else{
741  //kDebug() << "failed to map from source";
742  }
743  }
744 
745  m_entryList->scheduleUpdate();
746 }
747 
748 bool KateCompletionWidget::isCompletionActive( ) const
749 {
750  return !m_completionRanges.isEmpty() && ((!isHidden() && isVisible()) || (!m_argumentHintTree->isHidden() && m_argumentHintTree->isVisible()));
751 }
752 
753 void KateCompletionWidget::abortCompletion( )
754 {
755  //kDebug(13035) ;
756 
757  m_isSuspended = false;
758 
759  bool wasActive = isCompletionActive();
760 
761  clear();
762 
763  if(!isHidden())
764  hide();
765  if(!m_argumentHintTree->isHidden())
766  m_argumentHintTree->hide();
767 
768  if (wasActive)
769  view()->sendCompletionAborted();
770 }
771 
772 void KateCompletionWidget::clear() {
773  m_presentationModel->clearCompletionModels();
774  m_argumentHintTree->clearCompletion();
775  m_argumentHintModel->clear();
776 
777  foreach(KTextEditor::CodeCompletionModel* model, m_completionRanges.keys())
778  _aborted(model,view());
779 
780  deleteCompletionRanges();
781 }
782 
783 bool KateCompletionWidget::navigateAccept() {
784  m_hadCompletionNavigation = true;
785 
786  if(currentEmbeddedWidget())
787  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetAccept");
788 
789  QModelIndex index = selectedIndex();
790  if( index.isValid() ) {
791  index.data(KTextEditor::CodeCompletionModel::AccessibilityAccept);
792  return true;
793  }
794  return false;
795 }
796 
797 void KateCompletionWidget::execute()
798 {
799  //kDebug(13035) ;
800 
801  if (!isCompletionActive())
802  return;
803 
804  QModelIndex index = selectedIndex();
805 
806  if (!index.isValid())
807  return abortCompletion();
808 
809  QModelIndex toExecute;
810 
811  if(index.model() == m_presentationModel)
812  toExecute = m_presentationModel->mapToSource(index);
813  else
814  toExecute = m_argumentHintModel->mapToSource(index);
815 
816  if (!toExecute.isValid()) {
817  kWarning() << k_funcinfo << "Could not map index" << m_entryList->selectionModel()->currentIndex() << "to source index.";
818  return abortCompletion();
819  }
820 
821  // encapsulate all editing as being from the code completion, and undo-able in one step.
822  view()->doc()->editStart();
823  m_completionEditRunning = true;
824 
825  // create scoped pointer, to ensure deletion of cursor
826  QScopedPointer<KTextEditor::MovingCursor> oldPos (view()->doc()->newMovingCursor(view()->cursorPosition(), KTextEditor::MovingCursor::StayOnInsert));
827 
828  KTextEditor::CodeCompletionModel* model = static_cast<KTextEditor::CodeCompletionModel*>(const_cast<QAbstractItemModel*>(toExecute.model()));
829  Q_ASSERT(model);
830 
831  KTextEditor::CodeCompletionModel2* model2 = qobject_cast<KTextEditor::CodeCompletionModel2*>(model);
832 
833  Q_ASSERT(m_completionRanges.contains(model));
834  KTextEditor::Cursor start = m_completionRanges[model].range->start();
835 
836  if(model2)
837  model2->executeCompletionItem2(view()->document(), *m_completionRanges[model].range, toExecute);
838  else if(toExecute.parent().isValid())
839  //The normale CodeCompletionInterface cannot handle feedback for hierarchical models, so just do the replacement
840  view()->document()->replaceText(*m_completionRanges[model].range, model->data(toExecute.sibling(toExecute.row(), KTextEditor::CodeCompletionModel::Name)).toString());
841  else
842  model->executeCompletionItem(view()->document(), *m_completionRanges[model].range, toExecute.row());
843 
844  view()->doc()->editEnd();
845  m_completionEditRunning = false;
846 
847  abortCompletion();
848 
849  view()->sendCompletionExecuted(start, model, toExecute);
850 
851  KTextEditor::Cursor newPos = view()->cursorPosition();
852 
853  if(newPos > *oldPos) {
854  m_automaticInvocationAt = newPos;
855  m_automaticInvocationLine = view()->doc()->text(KTextEditor::Range(*oldPos, newPos));
856  //kDebug() << "executed, starting automatic invocation with line" << m_automaticInvocationLine;
857  m_lastInsertionByUser = false;
858  m_automaticInvocationTimer->start();
859  }
860 }
861 
862 void KateCompletionWidget::resizeEvent( QResizeEvent * event )
863 {
864  QFrame::resizeEvent(event);
865 }
866 
867 void KateCompletionWidget::showEvent ( QShowEvent * event )
868 {
869  m_isSuspended = false;
870 
871  QFrame::showEvent(event);
872 
873  if( !m_dontShowArgumentHints && m_argumentHintModel->rowCount(QModelIndex()) != 0 )
874  m_argumentHintTree->show();
875 }
876 
877 KTextEditor::MovingRange * KateCompletionWidget::completionRange(KTextEditor::CodeCompletionModel* model) const
878 {
879  if (!model) {
880  if (m_completionRanges.isEmpty()) return 0;
881 
882  KTextEditor::MovingRange* ret = m_completionRanges.begin()->range;
883 
884  foreach(const CompletionRange &range, m_completionRanges)
885  if(range.range->start() > ret->start())
886  ret = range.range;
887  return ret;
888  }
889  if(m_completionRanges.contains(model))
890  return m_completionRanges[model].range;
891  else
892  return 0;
893 }
894 
895 QMap<KTextEditor::CodeCompletionModel*, KateCompletionWidget::CompletionRange> KateCompletionWidget::completionRanges( ) const
896 {
897  return m_completionRanges;
898 }
899 
900 void KateCompletionWidget::modelReset( )
901 {
902  setUpdatesEnabled(false);
903  m_entryList->setAnimated(false);
904  m_argumentHintTree->setAnimated(false);
907  for(int row = 0; row < m_argumentHintModel->rowCount(QModelIndex()); ++row) {
908  QModelIndex index(m_argumentHintModel->index(row, 0, QModelIndex()));
909  if(!m_argumentHintTree->isExpanded(index)) {
910  m_argumentHintTree->expand(index);
911  }
912  }
913 
914  for(int row = 0; row < m_entryList->model()->rowCount(QModelIndex()); ++row) {
915  QModelIndex index(m_entryList->model()->index(row, 0, QModelIndex()));
916  if(!m_entryList->isExpanded(index)) {
917  m_entryList->expand(index);
918  }
919  }
920  setUpdatesEnabled(true);
921 }
922 
923 KateCompletionTree* KateCompletionWidget::treeView() const {
924  return m_entryList;
925 }
926 
927 QModelIndex KateCompletionWidget::selectedIndex() const {
928  if(!isCompletionActive())
929  return QModelIndex();
930 
931  if( m_inCompletionList )
932  return m_entryList->currentIndex();
933  else
934  return m_argumentHintTree->currentIndex();
935 }
936 
937 bool KateCompletionWidget::navigateLeft() {
938  m_hadCompletionNavigation = true;
939  if(currentEmbeddedWidget())
940  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetLeft");
941 
942  QModelIndex index = selectedIndex();
943 
944  if( index.isValid() ) {
945  index.data(KTextEditor::CodeCompletionModel::AccessibilityPrevious);
946 
947  return true;
948  }
949  return false;
950 }
951 
952 bool KateCompletionWidget::navigateRight() {
953  m_hadCompletionNavigation = true;
954  if(currentEmbeddedWidget())
955  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetRight");
956 
957  QModelIndex index = selectedIndex();
958 
959  if( index.isValid() ) {
960  index.data(KTextEditor::CodeCompletionModel::AccessibilityNext);
961  return true;
962  }
963 
964  return false;
965 }
966 
967 bool KateCompletionWidget::hadNavigation() const {
968  return m_hadCompletionNavigation;
969 }
970 
971 void KateCompletionWidget::resetHadNavigation() {
972  m_hadCompletionNavigation = false;
973 }
974 
975 
976 bool KateCompletionWidget::navigateBack() {
977  m_hadCompletionNavigation = true;
978  if(currentEmbeddedWidget())
979  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetBack");
980  return false;
981 }
982 
983 bool KateCompletionWidget::toggleExpanded(bool forceExpand, bool forceUnExpand) {
984  if ( (canExpandCurrentItem() || forceExpand ) && !forceUnExpand) {
985  bool ret = canExpandCurrentItem();
986  setCurrentItemExpanded(true);
987  return ret;
988  } else if (canCollapseCurrentItem() || forceUnExpand) {
989  bool ret = canCollapseCurrentItem();
990  setCurrentItemExpanded(false);
991  return ret;
992  }
993  return false;
994 }
995 
996 bool KateCompletionWidget::canExpandCurrentItem() const {
997  if( m_inCompletionList ) {
998  if( !m_entryList->currentIndex().isValid() ) return false;
999  return model()->isExpandable( m_entryList->currentIndex() ) && !model()->isExpanded( m_entryList->currentIndex() );
1000  } else {
1001  if( !m_argumentHintTree->currentIndex().isValid() ) return false;
1002  return argumentHintModel()->isExpandable( m_argumentHintTree->currentIndex() ) && !argumentHintModel()->isExpanded( m_argumentHintTree->currentIndex() );
1003  }
1004 }
1005 
1006 bool KateCompletionWidget::canCollapseCurrentItem() const {
1007  if( m_inCompletionList ) {
1008  if( !m_entryList->currentIndex().isValid() ) return false;
1009  return model()->isExpandable( m_entryList->currentIndex() ) && model()->isExpanded( m_entryList->currentIndex() );
1010  }else{
1011  if( !m_argumentHintTree->currentIndex().isValid() ) return false;
1012  return m_argumentHintModel->isExpandable( m_argumentHintTree->currentIndex() ) && m_argumentHintModel->isExpanded( m_argumentHintTree->currentIndex() );
1013  }
1014 }
1015 
1016 void KateCompletionWidget::setCurrentItemExpanded( bool expanded ) {
1017  if( m_inCompletionList ) {
1018  if( !m_entryList->currentIndex().isValid() ) return;
1019  model()->setExpanded(m_entryList->currentIndex(), expanded);
1020  updateHeight();
1021  }else{
1022  if( !m_argumentHintTree->currentIndex().isValid() ) return;
1023  m_argumentHintModel->setExpanded(m_argumentHintTree->currentIndex(), expanded);
1024  }
1025 }
1026 
1027 bool KateCompletionWidget::eventFilter( QObject * watched, QEvent * event )
1028 {
1029  bool ret = QFrame::eventFilter(watched, event);
1030 
1031  if (watched != this)
1032  if (event->type() == QEvent::Move)
1033  updatePosition();
1034 
1035  return ret;
1036 }
1037 
1038 bool KateCompletionWidget::navigateDown() {
1039  m_hadCompletionNavigation = true;
1040  if(currentEmbeddedWidget()) {
1041  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetDown");
1042  }
1043  return false;
1044 }
1045 
1046 bool KateCompletionWidget::navigateUp() {
1047  m_hadCompletionNavigation = true;
1048  if(currentEmbeddedWidget())
1049  QMetaObject::invokeMethod(currentEmbeddedWidget(), "embeddedWidgetUp");
1050  return false;
1051 }
1052 
1053 QWidget* KateCompletionWidget::currentEmbeddedWidget() {
1054  QModelIndex index = selectedIndex();
1055  if(!index.isValid())
1056  return 0;
1057  if( qobject_cast<const ExpandingWidgetModel*>(index.model()) ) {
1058  const ExpandingWidgetModel* model = static_cast<const ExpandingWidgetModel*>(index.model());
1059  if( model->isExpanded(index) )
1060  return model->expandingWidget(index);
1061  }
1062  return 0;
1063 }
1064 
1065 void KateCompletionWidget::cursorDown()
1066 {
1067  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1068 
1069  if( m_inCompletionList )
1070  m_entryList->nextCompletion();
1071  else {
1072  if( !m_argumentHintTree->nextCompletion() )
1073  switchList();
1074  }
1075 
1076  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1077  updateHeight();
1078 }
1079 
1080 void KateCompletionWidget::cursorUp()
1081 {
1082  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1083 
1084  if( m_inCompletionList ) {
1085  if( !m_entryList->previousCompletion() )
1086  switchList();
1087  }else{
1088  m_argumentHintTree->previousCompletion();
1089  }
1090 
1091  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1092  updateHeight();
1093 }
1094 
1095 void KateCompletionWidget::pageDown( )
1096 {
1097  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1098 
1099  if( m_inCompletionList )
1100  m_entryList->pageDown();
1101  else {
1102  if( !m_argumentHintTree->pageDown() )
1103  switchList();
1104  }
1105 
1106  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1107  updateHeight();
1108 }
1109 
1110 void KateCompletionWidget::pageUp( )
1111 {
1112  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1113 
1114  if( m_inCompletionList ) {
1115  if( !m_entryList->pageUp() )
1116  switchList();
1117  }else{
1118  m_argumentHintTree->pageUp();
1119  }
1120 
1121  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1122  updateHeight();
1123 }
1124 
1125 void KateCompletionWidget::top( )
1126 {
1127  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1128 
1129  if( m_inCompletionList )
1130  m_entryList->top();
1131  else
1132  m_argumentHintTree->top();
1133 
1134  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1135  updateHeight();
1136 }
1137 
1138 void KateCompletionWidget::bottom( )
1139 {
1140  bool wasPartiallyExpanded = model()->partiallyExpandedRow().isValid();
1141 
1142  if( m_inCompletionList )
1143  m_entryList->bottom();
1144  else
1145  m_argumentHintTree->bottom();
1146 
1147  if(wasPartiallyExpanded != model()->partiallyExpandedRow().isValid())
1148  updateHeight();
1149 }
1150 
1151 void KateCompletionWidget::switchList() {
1152  if( m_inCompletionList ) {
1153  if( m_argumentHintModel->rowCount(QModelIndex()) != 0 ) {
1154  m_entryList->setCurrentIndex(QModelIndex());
1155  m_argumentHintTree->setCurrentIndex(m_argumentHintModel->index(m_argumentHintModel->rowCount(QModelIndex())-1, 0));
1156  m_inCompletionList = false;
1157  }
1158  } else {
1159  if( m_presentationModel->rowCount(QModelIndex()) != 0 ) {
1160  m_argumentHintTree->setCurrentIndex(QModelIndex());
1161  m_entryList->setCurrentIndex(m_presentationModel->index(0, 0));
1162  if(model()->hasGroups()) //If we have groups we have to move on, because the first item is a label
1163  m_entryList->nextCompletion();
1164  m_inCompletionList = true;
1165  }
1166  }
1167 }
1168 
1169 void KateCompletionWidget::showConfig( )
1170 {
1171  abortCompletion();
1172 
1173  m_configWidget->exec();
1174 }
1175 
1176 void KateCompletionWidget::completionModelReset()
1177 {
1178  KTextEditor::CodeCompletionModel* model = qobject_cast<KTextEditor::CodeCompletionModel*>(sender());
1179  if(!model) {
1180  kWarning() << "bad sender";
1181  return;
1182  }
1183 
1184  if(!m_waitingForReset.contains(model))
1185  return;
1186 
1187  m_waitingForReset.remove(model);
1188 
1189  if(m_waitingForReset.isEmpty()) {
1190  if(!isCompletionActive()) {
1191  //kDebug() << "all completion-models we waited for are ready. Last one: " << model->objectName();
1192  //Eventually show the completion-list if this was the last model we were waiting for
1193  //Use a queued connection once again to make sure that KateCompletionModel is notified before we are
1194  QMetaObject::invokeMethod(this, "modelContentChanged", Qt::QueuedConnection);
1195  }
1196  }
1197 }
1198 
1199 void KateCompletionWidget::modelDestroyed(QObject* model) {
1200  unregisterCompletionModel(static_cast<KTextEditor::CodeCompletionModel*>(model));
1201 }
1202 
1203 void KateCompletionWidget::registerCompletionModel(KTextEditor::CodeCompletionModel* model)
1204 {
1205  if (m_sourceModels.contains(model)) {
1206  return;
1207  }
1208 
1209  connect(model, SIGNAL(destroyed(QObject*)), SLOT(modelDestroyed(QObject*)));
1210  //This connection must not be queued
1211  connect(model, SIGNAL(modelReset()), SLOT(completionModelReset()));
1212 
1213  m_sourceModels.append(model);
1214 
1215  if (isCompletionActive()) {
1216  m_presentationModel->addCompletionModel(model);
1217  }
1218 }
1219 
1220 void KateCompletionWidget::unregisterCompletionModel(KTextEditor::CodeCompletionModel* model)
1221 {
1222  disconnect(model, SIGNAL(destroyed(QObject*)), this, SLOT(modelDestroyed(QObject*)));
1223  disconnect(model, SIGNAL(modelReset()), this, SLOT(completionModelReset()));
1224 
1225  m_sourceModels.removeAll(model);
1226  abortCompletion();
1227 }
1228 
1229 int KateCompletionWidget::automaticInvocationDelay() const {
1230  return m_automaticInvocationDelay;
1231 }
1232 
1233 void KateCompletionWidget::setAutomaticInvocationDelay(int delay) {
1234  m_automaticInvocationDelay = delay;
1235 }
1236 
1237 void KateCompletionWidget::wrapLine (const KTextEditor::Cursor &)
1238 {
1239  m_lastInsertionByUser = !m_completionEditRunning;
1240 
1241  // wrap line, be done
1242  m_automaticInvocationLine.clear();
1243  m_automaticInvocationTimer->stop();
1244 }
1245 
1246 void KateCompletionWidget::unwrapLine (int)
1247 {
1248  m_lastInsertionByUser = !m_completionEditRunning;
1249 
1250  // just removal
1251  m_automaticInvocationLine.clear();
1252  m_automaticInvocationTimer->stop();
1253 }
1254 
1255 void KateCompletionWidget::insertText (const KTextEditor::Cursor &position, const QString &text)
1256 {
1257  m_lastInsertionByUser = !m_completionEditRunning;
1258 
1259  // no invoke?
1260  if (!view()->config()->automaticCompletionInvocation()) {
1261  m_automaticInvocationLine.clear();
1262  m_automaticInvocationTimer->stop();
1263  return;
1264  }
1265 
1266  if(m_automaticInvocationAt != position) {
1267  m_automaticInvocationLine.clear();
1268  m_lastInsertionByUser = !m_completionEditRunning;
1269  }
1270 
1271  m_automaticInvocationLine += text;
1272  m_automaticInvocationAt = position;
1273  m_automaticInvocationAt.setColumn (position.column() + text.length());
1274 
1275  if (m_automaticInvocationLine.isEmpty()) {
1276  m_automaticInvocationTimer->stop();
1277  return;
1278  }
1279 
1280  m_automaticInvocationTimer->start(m_automaticInvocationDelay);
1281 }
1282 
1283 void KateCompletionWidget::removeText (const KTextEditor::Range &)
1284 {
1285  m_lastInsertionByUser = !m_completionEditRunning;
1286 
1287  // just removal
1288  m_automaticInvocationLine.clear();
1289  m_automaticInvocationTimer->stop();
1290 }
1291 
1292 void KateCompletionWidget::automaticInvocation()
1293 {
1294  //kDebug()<<"m_automaticInvocationAt:"<<m_automaticInvocationAt;
1295  //kDebug()<<view()->cursorPosition();
1296  if(m_automaticInvocationAt != view()->cursorPosition())
1297  return;
1298 
1299  bool start = false;
1300  QList<KTextEditor::CodeCompletionModel*> models;
1301 
1302  //kDebug()<<"checking models";
1303  foreach (KTextEditor::CodeCompletionModel *model, m_sourceModels) {
1304  //kDebug()<<"m_completionRanges contains model?:"<<m_completionRanges.contains(model);
1305  if(m_completionRanges.contains(model))
1306  continue;
1307 
1308  start=_shouldStartCompletion(model,view(), m_automaticInvocationLine, m_lastInsertionByUser, view()->cursorPosition());
1309  //kDebug()<<"start="<<start;
1310  if (start)
1311  {
1312  models << model;
1313  }
1314  }
1315  //kDebug()<<"models found:"<<!models.isEmpty();
1316  if (!models.isEmpty()) {
1317  // Start automatic code completion
1318  startCompletion(KTextEditor::CodeCompletionModel::AutomaticInvocation, models);
1319  }
1320 }
1321 
1322 void KateCompletionWidget::userInvokedCompletion()
1323 {
1324  startCompletion(KTextEditor::CodeCompletionModel::UserInvocation);
1325 }
1326 
1327 void KateCompletionWidget::tab(bool shift)
1328 {
1329  m_noAutoHide = true;
1330  if(!shift) {
1331  QString prefix = m_presentationModel->commonPrefix((m_inCompletionList && !shellLikeTabCompletion) ? m_entryList->currentIndex() : QModelIndex());
1332  if(!prefix.isEmpty()) {
1333  view()->insertText(prefix);
1334  }else if(shellLikeTabCompletion) {
1335  cursorDown();
1336  return;
1337  }
1338  }else{
1339  if(shellLikeTabCompletion) {
1340  cursorUp();
1341  return;
1342  }
1343 
1344  //Reset left boundaries, so completion isn't stopped
1345  typedef QMap<KTextEditor::CodeCompletionModel*, CompletionRange> CompletionRangeMap;
1346  for(CompletionRangeMap::iterator it = m_completionRanges.begin(); it != m_completionRanges.end(); ++it)
1347  (*it).leftBoundary = (*it).range->start();
1348 
1349  //Remove suffix until the completion-list filter is widened again
1350  uint itemCount = m_presentationModel->filteredItemCount();
1351 
1352  while(view()->cursorPosition().column() > 0 && m_presentationModel->filteredItemCount() == itemCount) {
1353  KTextEditor::Range lastcharRange = KTextEditor::Range(view()->cursorPosition()-KTextEditor::Cursor(0,1), view()->cursorPosition());
1354  QString cursorText = view()->document()->text(lastcharRange);
1355  if(!cursorText[0].isSpace())
1356  {
1357  view()->document()->removeText(lastcharRange);
1358  QApplication::sendPostedEvents();
1359  }else{
1360  break;
1361  }
1362  }
1363  }
1364 }
1365 
1366 #include "katecompletionwidget.moc"
1367 
1368 // kate: space-indent on; indent-width 2; replace-tabs on;
KateCompletionModel::clearCompletionModels
void clearCompletionModels()
Definition: katecompletionmodel.cpp:2259
QRect::moveBottom
void moveBottom(int y)
_shouldAbortCompletion
static bool _shouldAbortCompletion(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, const KTextEditor::Range &range, const QString &currentCompletion)
Definition: katecompletionwidget.cpp:85
KateCompletionWidget::currentEmbeddedWidget
QWidget * currentEmbeddedWidget()
Definition: katecompletionwidget.cpp:1053
QModelIndex
KateCompletionModel::mapFromSource
virtual QModelIndex mapFromSource(const QModelIndex &sourceIndex) const
Maps from an index in a source-model to the index of the item in this display-model.
Definition: katecompletionmodel.cpp:883
QEvent
QResizeEvent
QWidget
CALLCI
#define CALLCI(WHAT, WHATELSE, WHAT2, model, FUNC)
Definition: katecompletionwidget.cpp:61
QAbstractItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const =0
kateview.h
KateCompletionModel::completionModels
QList< KTextEditor::CodeCompletionModel * > completionModels() const
Definition: katecompletionmodel.cpp:2048
QDesktopWidget::screenGeometry
const QRect screenGeometry(int screen) const
QEvent::type
Type type() const
QWidget::isHidden
bool isHidden() const
QAbstractItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const =0
KateArgumentHintTree::pageDown
bool pageDown()
Definition: kateargumenthinttree.cpp:242
KateDocument::newMovingRange
virtual KTextEditor::MovingRange * newMovingRange(const KTextEditor::Range &range, KTextEditor::MovingRange::InsertBehaviors insertBehaviors=KTextEditor::MovingRange::DoNotExpand, KTextEditor::MovingRange::EmptyBehavior emptyBehavior=KTextEditor::MovingRange::AllowEmpty)
Create a new moving range for this document.
Definition: katedocument.cpp:4741
KateCompletionModel::setCompletionModels
void setCompletionModels(const QList< KTextEditor::CodeCompletionModel * > &models)
Definition: katecompletionmodel.cpp:2029
KateCompletionTree::setScrollingEnabled
void setScrollingEnabled(bool)
Definition: katecompletiontree.cpp:73
KateView::sendCompletionExecuted
void sendCompletionExecuted(const KTextEditor::Cursor &position, KTextEditor::CodeCompletionModel *model, const QModelIndex &index)
Definition: kateview.cpp:2389
QWidget::cursor
QCursor cursor() const
KateCompletionModel::commonPrefix
QString commonPrefix(QModelIndex selectedIndex) const
Returns a common prefix for all current visible completion entries If there is no common prefix...
Definition: katecompletionmodel.cpp:1000
ExpandingWidgetModel::partiallyExpandedRow
QModelIndex partiallyExpandedRow() const
Returns the first row that is currently partially expanded.
Definition: expandingwidgetmodel.cpp:116
KateArgumentHintModel
Definition: kateargumenthintmodel.h:30
QAbstractItemView::setCurrentIndex
void setCurrentIndex(const QModelIndex &index)
KateView::renderer
KateRenderer * renderer()
Definition: kateview.cpp:1664
KateView::document
KTextEditor::Document * document() const
Definition: kateview.cpp:2824
katerenderer.h
KateArgumentHintModel::mapToSource
QModelIndex mapToSource(const QModelIndex &proxyIndex) const
Definition: kateargumenthintmodel.cpp:39
QItemSelectionModel::currentIndex
QModelIndex currentIndex() const
KateCompletionWidget::pageDown
void pageDown()
Definition: katecompletionwidget.cpp:1095
QRect::right
int right() const
QAbstractItemView::selectionModel
QItemSelectionModel * selectionModel() const
QAbstractTableModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
KateCompletionWidget::showEvent
virtual void showEvent(QShowEvent *event)
Definition: katecompletionwidget.cpp:867
KateCompletionModel::mapToSource
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const
Maps from this display-model into the appropriate source code-completion model.
Definition: katecompletionmodel.cpp:866
QWidget::setFocusPolicy
void setFocusPolicy(Qt::FocusPolicy policy)
QObject::sender
QObject * sender() const
katecompletiontree.h
KateCompletionWidget::cursorDown
void cursorDown()
Definition: katecompletionwidget.cpp:1065
KateCompletionWidget::waitForModelReset
void waitForModelReset()
Definition: katecompletionwidget.cpp:426
QMap< KTextEditor::CodeCompletionModel *, KateCompletionWidget::CompletionRange >
KateCompletionWidget::navigateRight
bool navigateRight()
Definition: katecompletionwidget.cpp:952
katedocument.h
QWidget::y
int y() const
KateCompletionWidget::navigateBack
bool navigateBack()
Definition: katecompletionwidget.cpp:976
QWidget::isVisible
bool isVisible() const
KateCompletionModel::filteredItemCount
uint filteredItemCount() const
Definition: katecompletionmodel.cpp:1719
KateCompletionWidget::KateCompletionWidget
KateCompletionWidget(KateView *parent)
Definition: katecompletionwidget.cpp:97
KateCompletionWidget::argumentHintsChanged
void argumentHintsChanged(bool hasContent)
Definition: katecompletionwidget.cpp:276
KateArgumentHintTree::pageUp
bool pageUp()
Definition: kateargumenthinttree.cpp:257
kateargumenthintmodel.h
QAbstractScrollArea::viewport
QWidget * viewport() const
KateCompletionWidget::automaticInvocation
void automaticInvocation()
Definition: katecompletionwidget.cpp:1292
QRect::height
int height() const
QTreeView::setAnimated
void setAnimated(bool enable)
KateCompletionModel
This class has the responsibility for filtering, sorting, and manipulating code completion data provi...
Definition: katecompletionmodel.h:48
KateArgumentHintTree::clearCompletion
void clearCompletion()
Definition: kateargumenthinttree.cpp:56
QWidget::hasFocus
bool hasFocus() const
QPoint
QAbstractItemView::setVerticalScrollMode
void setVerticalScrollMode(ScrollMode mode)
KateCompletionWidget::resetHadNavigation
void resetHadNavigation()
Definition: katecompletionwidget.cpp:971
QSet::insert
const_iterator insert(const T &value)
QFrame::setFrameStyle
void setFrameStyle(int style)
QFrame::setLineWidth
void setLineWidth(int)
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
KateCompletionModel::setCurrentCompletion
void setCurrentCompletion(KTextEditor::CodeCompletionModel *model, const QString &completion)
Definition: katecompletionmodel.cpp:907
KateCompletionWidget::model
const KateCompletionModel * model() const
Definition: katecompletionwidget.cpp:252
ExpandingWidgetModel::isExpandable
bool isExpandable(const QModelIndex &index) const
Definition: expandingwidgetmodel.cpp:290
QWidget::setParent
void setParent(QWidget *parent)
KateCompletionWidget::~KateCompletionWidget
~KateCompletionWidget()
Definition: katecompletionwidget.cpp:181
_aborted
static void _aborted(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view)
Definition: katecompletionwidget.cpp:89
KateCompletionWidget::setCurrentItemExpanded
void setCurrentItemExpanded(bool)
Definition: katecompletionwidget.cpp:1016
KateCompletionTree::top
void top()
Definition: katecompletiontree.cpp:374
QPoint::x
int x() const
QPoint::y
int y() const
KateArgumentHintTree
Definition: kateargumenthinttree.h:30
QWidget::geometry
geometry
katebuffer.h
KateCompletionWidget::setAutomaticInvocationDelay
void setAutomaticInvocationDelay(int delay)
Definition: katecompletionwidget.cpp:1233
KateCompletionWidget::unregisterCompletionModel
void unregisterCompletionModel(KTextEditor::CodeCompletionModel *model)
Definition: katecompletionwidget.cpp:1220
QString::clear
void clear()
QRect::moveTo
void moveTo(int x, int y)
KateCompletionWidget::completionRanges
QMap< KTextEditor::CodeCompletionModel *, CompletionRange > completionRanges() const
Definition: katecompletionwidget.cpp:895
KateCompletionModel::removeCompletionModel
void removeCompletionModel(KTextEditor::CodeCompletionModel *model)
Definition: katecompletionmodel.cpp:2053
QWidget::width
int width() const
_shouldStartCompletion
static bool _shouldStartCompletion(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, QString m_automaticInvocationLine, bool m_lastInsertionByUser, const KTextEditor::Cursor &cursor)
Definition: katecompletionwidget.cpp:93
QWidget::resize
void resize(int w, int h)
_completionRange
static KTextEditor::Range _completionRange(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, const KTextEditor::Cursor &cursor)
Definition: katecompletionwidget.cpp:73
QRect
QModelIndex::isValid
bool isValid() const
shellLikeTabCompletion
const bool shellLikeTabCompletion
Definition: katecompletionwidget.cpp:59
KateCompletionWidget::toggleExpanded
bool toggleExpanded(bool forceExpand=false, bool forceUnExpand=false)
Returns whether the current item was expanded/unexpanded.
Definition: katecompletionwidget.cpp:983
QApplication::activeWindow
QWidget * activeWindow()
QTreeView::setColumnWidth
void setColumnWidth(int column, int width)
QWidget::showEvent
virtual void showEvent(QShowEvent *event)
QList::append
void append(const T &value)
KateCompletionWidget::argumentHintTree
KateArgumentHintTree * argumentHintTree() const
Definition: katecompletionwidget.cpp:244
QObject::installEventFilter
void installEventFilter(QObject *filterObj)
QTimer
kateargumenthinttree.h
QWidget::x
int x() const
KateArgumentHintModel::buildRows
void buildRows()
Definition: kateargumenthintmodel.cpp:62
KateRenderer::config
KateRendererConfig * config() const
Configuration.
Definition: katerenderer.h:362
QRect::top
int top() const
KateArgumentHintModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
Definition: kateargumenthintmodel.cpp:226
KateArgumentHintTree::updateGeometry
void updateGeometry()
Definition: kateargumenthinttree.cpp:190
KateArgumentHintTree::bottom
void bottom()
Definition: kateargumenthinttree.cpp:283
QShowEvent
QWidget::setUpdatesEnabled
void setUpdatesEnabled(bool enable)
QObject
KateCompletionWidget::view
KateView * view() const
Definition: katecompletionwidget.cpp:271
QRect::left
int left() const
KateCompletionWidget::navigateUp
bool navigateUp()
Definition: katecompletionwidget.cpp:1046
KateCompletionWidget::bottom
void bottom()
Definition: katecompletionwidget.cpp:1138
QScopedPointer
KateView::cursorToCoordinate
QPoint cursorToCoordinate(const KTextEditor::Cursor &cursor) const
Definition: kateview.cpp:2433
hasAtLeastNRows
bool hasAtLeastNRows(int rows, QAbstractItemModel *model)
Definition: katecompletionwidget.cpp:539
ExpandingWidgetModel::expandingWidget
QWidget * expandingWidget(const QModelIndex &row) const
Definition: expandingwidgetmodel.cpp:431
QList::isEmpty
bool isEmpty() const
KateCompletionModel::rowCount
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: katecompletionmodel.cpp:838
QRect::setWidth
void setWidth(int width)
QString::isEmpty
bool isEmpty() const
KateCompletionModel::columnCount
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: katecompletionmodel.cpp:373
QList::removeAll
int removeAll(const T &value)
katecompletionmodel.h
QModelIndex::row
int row() const
KateCompletionWidget::top
void top()
Definition: katecompletionwidget.cpp:1125
KateCompletionWidget::cursorUp
void cursorUp()
Definition: katecompletionwidget.cpp:1080
KateArgumentHintTree::previousCompletion
bool previousCompletion()
Definition: kateargumenthinttree.cpp:218
QWidget::move
void move(int x, int y)
katecompletionwidget.h
KateCompletionWidget::registerCompletionModel
void registerCompletionModel(KTextEditor::CodeCompletionModel *model)
Definition: katecompletionwidget.cpp:1203
QObject::eventFilter
virtual bool eventFilter(QObject *watched, QEvent *event)
KateArgumentHintModel::clear
void clear()
Definition: kateargumenthintmodel.cpp:34
QString
QList< KTextEditor::CodeCompletionModel * >
QWidget::hide
void hide()
QModelIndex::parent
QModelIndex parent() const
QAbstractItemView::sizeHintForIndex
QSize sizeHintForIndex(const QModelIndex &index) const
QAbstractScrollArea::verticalScrollBar
QScrollBar * verticalScrollBar() const
QTreeView::isExpanded
bool isExpanded(const QModelIndex &index) const
KateCompletionWidget::updatePosition
bool updatePosition(bool force=false)
Definition: katecompletionwidget.cpp:482
KateCompletionTree::bottom
void bottom()
Definition: katecompletiontree.cpp:391
KateCompletionWidget::canCollapseCurrentItem
bool canCollapseCurrentItem() const
Definition: katecompletionwidget.cpp:1006
ExpandingWidgetModel::isExpanded
bool isExpanded(const QModelIndex &row) const
Definition: expandingwidgetmodel.cpp:305
KateView
Definition: kateview.h:77
KateCompletionTree::pageUp
bool pageUp()
Definition: katecompletiontree.cpp:360
hideAutomaticCompletionOnExactMatch
const bool hideAutomaticCompletionOnExactMatch
Definition: katecompletionwidget.cpp:56
QList::end
iterator end()
KateCompletionWidget::updateHeight
void updateHeight()
Called by KateViewInternal, because we need the specific information from the event.
Definition: katecompletionwidget.cpp:554
KateCompletionModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: katecompletionmodel.cpp:407
QSize
KateCompletionWidget::navigateAccept
bool navigateAccept()
Definition: katecompletionwidget.cpp:783
KateCompletionWidget::userInvokedCompletion
void userInvokedCompletion()
Definition: katecompletionwidget.cpp:1322
QFrame
QList::contains
bool contains(const T &value) const
QTimer::stop
void stop()
QMetaObject::invokeMethod
bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3, QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7, QGenericArgument val8, QGenericArgument val9)
KateCompletionModel::translateColumn
int translateColumn(int sourceColumn) const
Definition: katecompletionmodel.cpp:1258
QSet::contains
bool contains(const T &value) const
KateCompletionTree::resizeColumns
void resizeColumns(bool firstShow=false, bool forceResize=false)
Definition: katecompletiontree.cpp:114
KateArgumentHintTree::top
void top()
Definition: kateargumenthinttree.cpp:271
katecompletionconfig.h
_filterString
static QString _filterString(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, const KTextEditor::Range &range, const KTextEditor::Cursor &cursor)
Definition: katecompletionwidget.cpp:81
KateCompletionModel::addCompletionModel
void addCompletionModel(KTextEditor::CodeCompletionModel *model)
Definition: katecompletionmodel.cpp:2008
KateView::cursorPosition
KTextEditor::Cursor cursorPosition() const
Definition: kateview.cpp:2423
KateCompletionWidget::argumentHintModel
KateArgumentHintModel * argumentHintModel() const
Definition: katecompletionwidget.cpp:248
KateCompletionWidget::isCompletionActive
bool isCompletionActive() const
Definition: katecompletionwidget.cpp:748
KateCompletionWidget::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
Definition: katecompletionwidget.cpp:862
QModelIndex::model
const QAbstractItemModel * model() const
ExpandingWidgetModel::setExpanded
void setExpanded(QModelIndex index, bool expanded)
Change the expand-state of the row given through index. The display will be updated.
Definition: expandingwidgetmodel.cpp:311
QWidget::fontMetrics
QFontMetrics fontMetrics() const
KateCompletionModel::shouldMatchHideCompletionList
bool shouldMatchHideCompletionList() const
Returns whether one of the filtered items exactly matches its completion string.
Definition: katecompletionmodel.cpp:1728
QSet::remove
bool remove(const T &value)
QFrame::frameWidth
int frameWidth() const
QModelIndex::data
QVariant data(int role) const
QAbstractItemView::sizeHintForRow
virtual int sizeHintForRow(int row) const
KateCompletionWidget::updatePositionSlot
void updatePositionSlot()
Definition: katecompletionwidget.cpp:477
QApplication::desktop
QDesktopWidget * desktop()
QCoreApplication::sendPostedEvents
void sendPostedEvents()
QModelIndex::sibling
QModelIndex sibling(int row, int column) const
KateCompletionWidget::eventFilter
virtual bool eventFilter(QObject *watched, QEvent *event)
Definition: katecompletionwidget.cpp:1027
QRect::setHeight
void setHeight(int height)
KateDocument::editEnd
void editEnd()
End a editor operation.
Definition: katedocument.cpp:796
QTreeView::setModel
virtual void setModel(QAbstractItemModel *model)
KateCompletionWidget::navigateDown
bool navigateDown()
Definition: katecompletionwidget.cpp:1038
KateCompletionWidget::navigateLeft
bool navigateLeft()
Definition: katecompletionwidget.cpp:937
KateCompletionWidget::tab
void tab(bool shift)
Definition: katecompletionwidget.cpp:1327
KateCompletionTree::scheduleUpdate
void scheduleUpdate()
Definition: katecompletiontree.cpp:386
KateCompletionTree::nextCompletion
bool nextCompletion()
Definition: katecompletiontree.cpp:297
KateCompletionWidget::hadNavigation
bool hadNavigation() const
Definition: katecompletionwidget.cpp:967
KateCompletionWidget::startCompletion
void startCompletion(KTextEditor::CodeCompletionModel::InvocationType invocationType, const QList< KTextEditor::CodeCompletionModel * > &models=QList< KTextEditor::CodeCompletionModel * >())
Definition: katecompletionwidget.cpp:286
KateCompletionWidget::CompletionRange::range
KTextEditor::MovingRange * range
Definition: katecompletionwidget.h:103
KateCompletionModel::hasGroups
bool hasGroups() const
Definition: katecompletionmodel.cpp:774
KateView::sendCompletionAborted
void sendCompletionAborted()
Definition: kateview.cpp:2394
KateCompletionWidget::pageUp
void pageUp()
Definition: katecompletionwidget.cpp:1110
_updateRange
static KTextEditor::Range _updateRange(KTextEditor::CodeCompletionModel *model, KTextEditor::View *view, KTextEditor::Range &range)
Definition: katecompletionwidget.cpp:77
QRect::bottom
int bottom() const
QString::length
int length() const
KateDocument::text
virtual QString text(const KTextEditor::Range &range, bool blockwise=false) const
Definition: katedocument.cpp:337
QSet::isEmpty
bool isEmpty() const
QAbstractItemModel
QAbstractScrollArea::horizontalScrollBar
QScrollBar * horizontalScrollBar() const
QTimer::start
void start(int msec)
KateCompletionTree::columnTextViewportPosition
int columnTextViewportPosition(int column) const
Returns the approximated viewport position of the text in the given column, skipping an eventual icon...
Definition: katecompletiontree.cpp:86
KateView::doc
KateDocument * doc()
accessor to katedocument pointer
Definition: kateview.h:553
KateCompletionTree::previousCompletion
bool previousCompletion()
Definition: katecompletiontree.cpp:320
KateCompletionConfig
Definition: katecompletionconfig.h:36
QWidget::show
void show()
KateRendererConfig::fontMetrics
const QFontMetricsF & fontMetrics() const
Definition: kateconfig.cpp:2284
QWidget::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
QTreeView::expand
void expand(const QModelIndex &index)
QAbstractItemView::model
QAbstractItemModel * model() const
KateDocument::editStart
void editStart()
Enclose editor actions with editStart() and editEnd() to group them.
Definition: katedocument.cpp:776
QAbstractItemView::currentIndex
QModelIndex currentIndex() const
KateArgumentHintTree::nextCompletion
bool nextCompletion()
Definition: kateargumenthinttree.cpp:194
KateCompletionWidget::canExpandCurrentItem
bool canExpandCurrentItem() const
Definition: katecompletionwidget.cpp:996
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KateCompletionTree
Definition: katecompletiontree.h:32
QObject::parent
QObject * parent() const
KateCompletionWidget::abortCompletion
void abortCompletion()
Definition: katecompletionwidget.cpp:753
KateCompletionWidget::treeView
KateCompletionTree * treeView() const
Definition: katecompletionwidget.cpp:923
KateCompletionTree::pageDown
bool pageDown()
Definition: katecompletiontree.cpp:344
kateconfig.h
QAbstractScrollArea::setVerticalScrollBarPolicy
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
QList::begin
iterator begin()
KateCompletionWidget::automaticInvocationDelay
int automaticInvocationDelay() const
Definition: katecompletionwidget.cpp:1229
ExpandingWidgetModel::expandingWidgetsHeight
int expandingWidgetsHeight() const
Returns the total height added through all open expanding-widgets.
Definition: expandingwidgetmodel.cpp:420
QObject::destroyed
void destroyed(QObject *obj)
KateCompletionWidget::execute
void execute()
Definition: katecompletionwidget.cpp:797
QWidget::height
int height() const
QFontMetricsF::height
qreal height() const
KateCompletionWidget::completionRange
KTextEditor::MovingRange * completionRange(KTextEditor::CodeCompletionModel *model=0) const
Definition: katecompletionwidget.cpp:877
KateCompletionWidget::CompletionRange
Definition: katecompletionwidget.h:93
QTimer::setSingleShot
void setSingleShot(bool singleShot)
ExpandingWidgetModel
Cares about expanding/un-expanding items in a tree-view together with ExpandingDelegate.
Definition: expandingwidgetmodel.h:36
KateCompletionWidget::showConfig
void showConfig()
Definition: katecompletionwidget.cpp:1169
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Sat May 9 2020 03:56:58 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Kate

Skip menu "Kate"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal