QtFallbackWebPopup.cpp [plain text]
#include "config.h"
#include "QtFallbackWebPopup.h"
#ifndef QT_NO_COMBOBOX
#include "ChromeClientQt.h"
#include "QtWebComboBox.h"
#include "QWebPageClient.h"
#include "qgraphicswebview.h"
#include <QGraphicsProxyWidget>
#include <QStandardItemModel>
namespace WebCore {
QtFallbackWebPopup::QtFallbackWebPopup(const ChromeClientQt* chromeClient)
: m_combo(0)
, m_chromeClient(chromeClient)
{
}
QtFallbackWebPopup::~QtFallbackWebPopup()
{
deleteComboBox();
}
void QtFallbackWebPopup::show(const QWebSelectData& data)
{
if (!pageClient())
return;
deleteComboBox();
m_combo = new QtWebComboBox();
connect(m_combo, SIGNAL(activated(int)), SLOT(activeChanged(int)), Qt::QueuedConnection);
connect(m_combo, SIGNAL(didHide()), SLOT(deleteComboBox()));
connect(m_combo, SIGNAL(didHide()), SIGNAL(didHide()));
populate(data);
QRect rect = geometry();
if (QGraphicsWebView *webView = qobject_cast<QGraphicsWebView*>(pageClient()->pluginParent())) {
QGraphicsProxyWidget* proxy = new QGraphicsProxyWidget(webView);
proxy->setWidget(m_combo);
proxy->setGeometry(rect);
} else {
m_combo->setParent(pageClient()->ownerWidget());
m_combo->setGeometry(QRect(rect.left(), rect.top(),
rect.width(), m_combo->sizeHint().height()));
}
m_combo->showPopupAtCursorPosition();
}
void QtFallbackWebPopup::hide()
{
}
void QtFallbackWebPopup::populate(const QWebSelectData& data)
{
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_combo->model());
Q_ASSERT(model);
m_combo->setFont(font());
int currentIndex = -1;
for (int i = 0; i < data.itemCount(); ++i) {
switch (data.itemType(i)) {
case QWebSelectData::Separator:
m_combo->insertSeparator(i);
break;
case QWebSelectData::Group:
m_combo->insertItem(i, data.itemText(i));
model->item(i)->setEnabled(false);
break;
case QWebSelectData::Option:
m_combo->insertItem(i, data.itemText(i));
model->item(i)->setEnabled(data.itemIsEnabled(i));
#ifndef QT_NO_TOOLTIP
model->item(i)->setToolTip(data.itemToolTip(i));
#endif
model->item(i)->setBackground(data.itemBackgroundColor(i));
model->item(i)->setForeground(data.itemForegroundColor(i));
if (data.itemIsSelected(i))
currentIndex = i;
break;
}
}
if (currentIndex >= 0)
m_combo->setCurrentIndex(currentIndex);
}
void QtFallbackWebPopup::activeChanged(int index)
{
if (index < 0)
return;
emit selectItem(index, false, false);
}
void QtFallbackWebPopup::deleteComboBox()
{
if (!m_combo)
return;
m_combo->deleteLater();
m_combo = 0;
}
QWebPageClient* QtFallbackWebPopup::pageClient() const
{
return m_chromeClient->platformPageClient();
}
}
#endif // QT_NO_COMBOBOX