+#include <QDebug>
+#include <QEvent>
+#include <QKeyEvent>
+#include <QTreeWidget>
+#include <QLineEdit>
+#include <QHeaderView>
+#include <QTimer>
+
+#include "tagcompletion.h"
+
+TagCompletion::TagCompletion(QLineEdit *parent) :
+ QObject(parent), m_parentLineEdit(parent)
+{
+ m_popup = new QTreeWidget;
+ m_popup->setWindowFlags(Qt::Popup);
+ m_popup->setFocusPolicy(Qt::NoFocus);
+ m_popup->setFocusProxy(parent);
+ m_popup->setColumnCount(2);
+ m_popup->setUniformRowHeights(true);
+ m_popup->setRootIsDecorated(false);
+ m_popup->setEditTriggers(QTreeWidget::NoEditTriggers);
+ m_popup->setSelectionBehavior(QTreeWidget::SelectRows);
+ m_popup->setFrameStyle(QFrame::Box | QFrame::Plain);
+ m_popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ m_popup->header()->hide();
+
+ m_popup->installEventFilter(this);
+
+ connect(m_popup, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
+ this, SLOT(doneCompletion()));
+
+ connect(m_parentLineEdit, SIGNAL(textEdited(QString)),
+ this, SLOT(requestChoices(QString)));
+}
+
+TagCompletion::~TagCompletion()
+{
+ delete m_popup;
+}
+
+void TagCompletion::doneCompletion()
+{
+ m_popup->hide();
+ m_parentLineEdit->setFocus();
+ QTreeWidgetItem *item = m_popup->currentItem();
+ if (item) {
+ m_parentLineEdit->setText(item->text(0));
+ QMetaObject::invokeMethod(m_parentLineEdit, "returnPressed");
+ }
+
+}
+
+bool TagCompletion::eventFilter(QObject *obj, QEvent *ev)
+{
+ if (obj != m_popup)
+ return false;
+
+ if (ev->type() == QEvent::MouseButtonPress) {
+ m_popup->hide();
+ m_parentLineEdit->setFocus();
+ return true;
+ }
+
+ if (ev->type() == QEvent::KeyPress) {
+ bool consumed = false;
+ int key = static_cast<QKeyEvent*>(ev)->key();
+ switch (key) {
+ case Qt::Key_Enter:
+ case Qt::Key_Return:
+ doneCompletion();
+ consumed = true;
+
+ case Qt::Key_Escape:
+ m_parentLineEdit->setFocus();
+ m_popup->hide();
+ consumed = true;
+
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ case Qt::Key_Home:
+ case Qt::Key_End:
+ case Qt::Key_PageUp:
+ case Qt::Key_PageDown:
+ break;
+
+ default:
+ m_parentLineEdit->setFocus();
+ m_parentLineEdit->event(ev);
+ //m_popup->hide();
+ break;
+ }
+
+ return consumed;
+ }
+
+ return false;
+}
+
+void TagCompletion::requestChoices(const QString &text)
+{
+ qWarning() << __PRETTY_FUNCTION__ << text;
+
+ QStringList choices;
+ choices.append("aaa");
+ choices.append("bbb");
+ choices.append("ccc");
+
+ showCompletion(choices);
+}
+
+void TagCompletion::showCompletion(const QStringList &choices)
+{
+ qWarning() << __PRETTY_FUNCTION__;
+
+ m_popup->setUpdatesEnabled(false);
+ m_popup->clear();
+ for (int i = 0; i < choices.count(); ++i) {
+ QTreeWidgetItem * item;
+ item = new QTreeWidgetItem(m_popup);
+ item->setText(0, choices[i]);
+ item->setText(1, "123");
+ item->setTextAlignment(1, Qt::AlignRight);
+ }
+ m_popup->setCurrentItem(m_popup->topLevelItem(0));
+ m_popup->resizeColumnToContents(0);
+ m_popup->resizeColumnToContents(1);
+ m_popup->adjustSize();
+ m_popup->setUpdatesEnabled(true);
+
+ int h = m_popup->sizeHintForRow(0) * qMin(7, choices.count()) + 3;
+ m_popup->resize(m_popup->width(), h);
+
+ m_popup->move(m_parentLineEdit->mapToGlobal(
+ QPoint(0, m_parentLineEdit->height())));
+ m_popup->setFocus();
+ m_popup->show();
+
+}