summaryrefslogtreecommitdiffstats
path: root/examples/tools/customcompleter/textedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tools/customcompleter/textedit.cpp')
-rw-r--r--examples/tools/customcompleter/textedit.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/examples/tools/customcompleter/textedit.cpp b/examples/tools/customcompleter/textedit.cpp
new file mode 100644
index 0000000..ecafa8f
--- /dev/null
+++ b/examples/tools/customcompleter/textedit.cpp
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "textedit.h"
+#include <QCompleter>
+#include <QKeyEvent>
+#include <QAbstractItemView>
+#include <QtDebug>
+#include <QApplication>
+#include <QModelIndex>
+#include <QAbstractItemModel>
+#include <QScrollBar>
+
+//! [0]
+TextEdit::TextEdit(QWidget *parent)
+: QTextEdit(parent), c(0)
+{
+ setPlainText(tr("This TextEdit provides autocompletions for words that have more than"
+ " 3 characters. You can trigger autocompletion using ") +
+ QKeySequence("Ctrl+E").toString(QKeySequence::NativeText));
+}
+//! [0]
+
+//! [1]
+TextEdit::~TextEdit()
+{
+}
+//! [1]
+
+//! [2]
+void TextEdit::setCompleter(QCompleter *completer)
+{
+ if (c)
+ QObject::disconnect(c, 0, this, 0);
+
+ c = completer;
+
+ if (!c)
+ return;
+
+ c->setWidget(this);
+ c->setCompletionMode(QCompleter::PopupCompletion);
+ c->setCaseSensitivity(Qt::CaseInsensitive);
+ QObject::connect(c, SIGNAL(activated(const QString&)),
+ this, SLOT(insertCompletion(const QString&)));
+}
+//! [2]
+
+//! [3]
+QCompleter *TextEdit::completer() const
+{
+ return c;
+}
+//! [3]
+
+//! [4]
+void TextEdit::insertCompletion(const QString& completion)
+{
+ if (c->widget() != this)
+ return;
+ QTextCursor tc = textCursor();
+ int extra = completion.length() - c->completionPrefix().length();
+ tc.movePosition(QTextCursor::Left);
+ tc.movePosition(QTextCursor::EndOfWord);
+ tc.insertText(completion.right(extra));
+ setTextCursor(tc);
+}
+//! [4]
+
+//! [5]
+QString TextEdit::textUnderCursor() const
+{
+ QTextCursor tc = textCursor();
+ tc.select(QTextCursor::WordUnderCursor);
+ return tc.selectedText();
+}
+//! [5]
+
+//! [6]
+void TextEdit::focusInEvent(QFocusEvent *e)
+{
+ if (c)
+ c->setWidget(this);
+ QTextEdit::focusInEvent(e);
+}
+//! [6]
+
+//! [7]
+void TextEdit::keyPressEvent(QKeyEvent *e)
+{
+ if (c && c->popup()->isVisible()) {
+ // The following keys are forwarded by the completer to the widget
+ switch (e->key()) {
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ case Qt::Key_Escape:
+ case Qt::Key_Tab:
+ case Qt::Key_Backtab:
+ e->ignore();
+ return; // let the completer do default behavior
+ default:
+ break;
+ }
+ }
+
+ bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E
+ if (!c || !isShortcut) // dont process the shortcut when we have a completer
+ QTextEdit::keyPressEvent(e);
+//! [7]
+
+//! [8]
+ const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier);
+ if (!c || (ctrlOrShift && e->text().isEmpty()))
+ return;
+
+ static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
+ bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift;
+ QString completionPrefix = textUnderCursor();
+
+ if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3
+ || eow.contains(e->text().right(1)))) {
+ c->popup()->hide();
+ return;
+ }
+
+ if (completionPrefix != c->completionPrefix()) {
+ c->setCompletionPrefix(completionPrefix);
+ c->popup()->setCurrentIndex(c->completionModel()->index(0, 0));
+ }
+ QRect cr = cursorRect();
+ cr.setWidth(c->popup()->sizeHintForColumn(0)
+ + c->popup()->verticalScrollBar()->sizeHint().width());
+ c->complete(cr); // popup it up!
+}
+//! [8]
+