1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2010 Girish Ramakrishnan <girish@forwardbias.in>
3d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
4d0825bca7fe65beaee391d30da42e937db621564Steve Block *
5d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is free software; you can redistribute it and/or
6d0825bca7fe65beaee391d30da42e937db621564Steve Block * modify it under the terms of the GNU Library General Public
7d0825bca7fe65beaee391d30da42e937db621564Steve Block * License as published by the Free Software Foundation; either
8d0825bca7fe65beaee391d30da42e937db621564Steve Block * version 2 of the License, or (at your option) any later version.
9d0825bca7fe65beaee391d30da42e937db621564Steve Block *
10d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is distributed in the hope that it will be useful,
11d0825bca7fe65beaee391d30da42e937db621564Steve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of
12d0825bca7fe65beaee391d30da42e937db621564Steve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13d0825bca7fe65beaee391d30da42e937db621564Steve Block * Library General Public License for more details.
14d0825bca7fe65beaee391d30da42e937db621564Steve Block *
15d0825bca7fe65beaee391d30da42e937db621564Steve Block * You should have received a copy of the GNU Library General Public License
16d0825bca7fe65beaee391d30da42e937db621564Steve Block * along with this library; see the file COPYING.LIB.  If not, write to
17d0825bca7fe65beaee391d30da42e937db621564Steve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18d0825bca7fe65beaee391d30da42e937db621564Steve Block * Boston, MA 02110-1301, USA.
19d0825bca7fe65beaee391d30da42e937db621564Steve Block *
20d0825bca7fe65beaee391d30da42e937db621564Steve Block */
21d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h"
22d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "QtFallbackWebPopup.h"
23d0825bca7fe65beaee391d30da42e937db621564Steve Block
246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#ifndef QT_NO_COMBOBOX
256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "ChromeClientQt.h"
27d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "QWebPageClient.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qgraphicswebview.h"
29d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QAbstractItemView>
30d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QApplication>
31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QGraphicsProxyWidget>
32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QGraphicsScene>
33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QGraphicsView>
34d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QInputContext>
35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QMouseEvent>
36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QStandardItemModel>
37d0825bca7fe65beaee391d30da42e937db621564Steve Block
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(SYMBIAN_DIALOG_PROVIDERS)
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <BrCtlDialogsProvider.h>
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <BrowserDialogsProvider.h> // S60 platform private header file
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <e32base.h>
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
44d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace WebCore {
45d0825bca7fe65beaee391d30da42e937db621564Steve Block
46d0825bca7fe65beaee391d30da42e937db621564Steve BlockQtFallbackWebPopupCombo::QtFallbackWebPopupCombo(QtFallbackWebPopup& ownerPopup)
47d0825bca7fe65beaee391d30da42e937db621564Steve Block    : m_ownerPopup(ownerPopup)
48d0825bca7fe65beaee391d30da42e937db621564Steve Block{
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Install an event filter on the view inside the combo box popup to make sure we know
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // when the popup got closed. E.g. QComboBox::hidePopup() won't be called when the popup
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // is closed by a mouse wheel event outside its window.
52ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    view()->installEventFilter(this);
53d0825bca7fe65beaee391d30da42e937db621564Steve Block}
54d0825bca7fe65beaee391d30da42e937db621564Steve Block
55d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QtFallbackWebPopupCombo::showPopup()
56d0825bca7fe65beaee391d30da42e937db621564Steve Block{
57d0825bca7fe65beaee391d30da42e937db621564Steve Block    QComboBox::showPopup();
58d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_ownerPopup.m_popupVisible = true;
59d0825bca7fe65beaee391d30da42e937db621564Steve Block}
60d0825bca7fe65beaee391d30da42e937db621564Steve Block
61d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QtFallbackWebPopupCombo::hidePopup()
62d0825bca7fe65beaee391d30da42e937db621564Steve Block{
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_IM
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWidget* activeFocus = QApplication::focusWidget();
65d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (activeFocus && activeFocus == QComboBox::view()
66d0825bca7fe65beaee391d30da42e937db621564Steve Block        && activeFocus->testAttribute(Qt::WA_InputMethodEnabled)) {
67d0825bca7fe65beaee391d30da42e937db621564Steve Block        QInputContext* qic = activeFocus->inputContext();
68d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (qic) {
69d0825bca7fe65beaee391d30da42e937db621564Steve Block            qic->reset();
70d0825bca7fe65beaee391d30da42e937db621564Steve Block            qic->setFocusWidget(0);
71d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
72d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // QT_NO_IM
74d0825bca7fe65beaee391d30da42e937db621564Steve Block
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    QComboBox::hidePopup();
76d0825bca7fe65beaee391d30da42e937db621564Steve Block
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_ownerPopup.m_popupVisible)
78d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
79d0825bca7fe65beaee391d30da42e937db621564Steve Block
80d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_ownerPopup.m_popupVisible = false;
81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    emit m_ownerPopup.didHide();
82ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_ownerPopup.destroyPopup();
83ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
84ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
85ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool QtFallbackWebPopupCombo::eventFilter(QObject* watched, QEvent* event)
86ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
87ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    Q_ASSERT(watched == view());
88ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
89ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (event->type() == QEvent::Show && !m_ownerPopup.m_popupVisible)
90ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        showPopup();
91ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    else if (event->type() == QEvent::Hide && m_ownerPopup.m_popupVisible)
92ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        hidePopup();
93ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
94ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return false;
95d0825bca7fe65beaee391d30da42e937db621564Steve Block}
96d0825bca7fe65beaee391d30da42e937db621564Steve Block
97d0825bca7fe65beaee391d30da42e937db621564Steve Block// QtFallbackWebPopup
98d0825bca7fe65beaee391d30da42e937db621564Steve Block
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochQtFallbackWebPopup::QtFallbackWebPopup(const ChromeClientQt* chromeClient)
100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    : m_popupVisible(false)
101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    , m_combo(0)
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_chromeClient(chromeClient)
103d0825bca7fe65beaee391d30da42e937db621564Steve Block{
104d0825bca7fe65beaee391d30da42e937db621564Steve Block}
105d0825bca7fe65beaee391d30da42e937db621564Steve Block
106d0825bca7fe65beaee391d30da42e937db621564Steve BlockQtFallbackWebPopup::~QtFallbackWebPopup()
107d0825bca7fe65beaee391d30da42e937db621564Steve Block{
108ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    destroyPopup();
109d0825bca7fe65beaee391d30da42e937db621564Steve Block}
110d0825bca7fe65beaee391d30da42e937db621564Steve Block
111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid QtFallbackWebPopup::show(const QWebSelectData& data)
112d0825bca7fe65beaee391d30da42e937db621564Steve Block{
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!pageClient())
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(SYMBIAN_DIALOG_PROVIDERS)
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    TRAP_IGNORE(showS60BrowserDialog());
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
119ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
120ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    destroyPopup();
121ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_combo = new QtFallbackWebPopupCombo(*this);
122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    connect(m_combo, SIGNAL(activated(int)),
123ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            SLOT(activeChanged(int)), Qt::QueuedConnection);
124ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
125dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    populate(data);
1265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1272bde8e466a4451c7319e3a072d118917957d6554Steve Block    QColor backgroundColor = data.backgroundColor();
1282bde8e466a4451c7319e3a072d118917957d6554Steve Block    QColor foregroundColor = data.foregroundColor();
1292bde8e466a4451c7319e3a072d118917957d6554Steve Block
1302bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPalette palette = m_combo->palette();
1312bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (backgroundColor.isValid())
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block        palette.setColor(QPalette::Background, backgroundColor);
1332bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (foregroundColor.isValid())
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block        palette.setColor(QPalette::Foreground, foregroundColor);
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_combo->setPalette(palette);
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block
138d0825bca7fe65beaee391d30da42e937db621564Steve Block    QRect rect = geometry();
139d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (QGraphicsWebView *webView = qobject_cast<QGraphicsWebView*>(pageClient()->pluginParent())) {
140ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        QGraphicsProxyWidget* proxy = new QGraphicsProxyWidget(webView);
141ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        proxy->setWidget(m_combo);
142ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        proxy->setGeometry(rect);
143d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else {
144d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_combo->setParent(pageClient()->ownerWidget());
145d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_combo->setGeometry(QRect(rect.left(), rect.top(),
146d0825bca7fe65beaee391d30da42e937db621564Steve Block                               rect.width(), m_combo->sizeHint().height()));
147d0825bca7fe65beaee391d30da42e937db621564Steve Block
148d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
149d0825bca7fe65beaee391d30da42e937db621564Steve Block
150d0825bca7fe65beaee391d30da42e937db621564Steve Block    QMouseEvent event(QEvent::MouseButtonPress, QCursor::pos(), Qt::LeftButton,
151d0825bca7fe65beaee391d30da42e937db621564Steve Block                      Qt::LeftButton, Qt::NoModifier);
152d0825bca7fe65beaee391d30da42e937db621564Steve Block    QCoreApplication::sendEvent(m_combo, &event);
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(SYMBIAN_DIALOG_PROVIDERS)
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void ResetAndDestroy(TAny* aPtr)
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RPointerArray<HBufC>* items = reinterpret_cast<RPointerArray<HBufC>* >(aPtr);
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    items->ResetAndDestroy();
162d0825bca7fe65beaee391d30da42e937db621564Steve Block}
163d0825bca7fe65beaee391d30da42e937db621564Steve Block
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid QtFallbackWebPopup::showS60BrowserDialog()
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static MBrCtlDialogsProvider* dialogs = CBrowserDialogsProvider::NewL(0);
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!dialogs)
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int size = itemCount();
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CArrayFix<TBrCtlSelectOptionData>* options = new CArrayFixFlat<TBrCtlSelectOptionData>(qMax(1, size));
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RPointerArray<HBufC> items(qMax(1, size));
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CleanupStack::PushL(TCleanupItem(&ResetAndDestroy, &items));
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (int i = 0; i < size; i++) {
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (itemType(i) == Separator) {
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            TBrCtlSelectOptionData data(_L("----------"), false, false, false);
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            options->AppendL(data);
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            HBufC16* itemStr = HBufC16::NewL(itemText(i).length());
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            itemStr->Des().Copy((const TUint16*)itemText(i).utf16(), itemText(i).length());
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            CleanupStack::PushL(itemStr);
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            TBrCtlSelectOptionData data(*itemStr, i == currentIndex(), false, itemIsEnabled(i));
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            options->AppendL(data);
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            items.AppendL(itemStr);
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            CleanupStack::Pop();
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dialogs->DialogSelectOptionL(KNullDesC(), (TBrCtlSelectOptionType)(ESelectTypeSingle | ESelectTypeWithFindPane), *options);
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CleanupStack::PopAndDestroy(&items);
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int newIndex;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (newIndex = 0; newIndex < options->Count() && !options->At(newIndex).IsSelected(); newIndex++) {}
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (newIndex == options->Count())
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newIndex = currentIndex();
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_popupVisible = false;
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    popupDidHide();
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (currentIndex() != newIndex && newIndex >= 0)
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        valueChanged(newIndex);
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete options;
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
209d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QtFallbackWebPopup::hide()
210d0825bca7fe65beaee391d30da42e937db621564Steve Block{
211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Destroying the QComboBox here cause problems if the popup is in the
212ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // middle of its show animation. Instead we rely on the fact that the
213ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Qt::Popup window will hide itself on mouse events outside its window.
214d0825bca7fe65beaee391d30da42e937db621564Steve Block}
215d0825bca7fe65beaee391d30da42e937db621564Steve Block
216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid QtFallbackWebPopup::destroyPopup()
217d0825bca7fe65beaee391d30da42e937db621564Steve Block{
218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_combo) {
219ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_combo->deleteLater();
220ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        m_combo = 0;
221ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
222ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
223d0825bca7fe65beaee391d30da42e937db621564Steve Block
224dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid QtFallbackWebPopup::populate(const QWebSelectData& data)
225ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
226d0825bca7fe65beaee391d30da42e937db621564Steve Block    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_combo->model());
227d0825bca7fe65beaee391d30da42e937db621564Steve Block    Q_ASSERT(model);
228d0825bca7fe65beaee391d30da42e937db621564Steve Block
229f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#if !defined(Q_OS_SYMBIAN)
230d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_combo->setFont(font());
231d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
232dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
233dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int currentIndex = -1;
234dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    for (int i = 0; i < data.itemCount(); ++i) {
235dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        switch (data.itemType(i)) {
236dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        case QWebSelectData::Separator:
237d0825bca7fe65beaee391d30da42e937db621564Steve Block            m_combo->insertSeparator(i);
238d0825bca7fe65beaee391d30da42e937db621564Steve Block            break;
239dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        case QWebSelectData::Group:
240dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_combo->insertItem(i, data.itemText(i));
241d0825bca7fe65beaee391d30da42e937db621564Steve Block            model->item(i)->setEnabled(false);
242d0825bca7fe65beaee391d30da42e937db621564Steve Block            break;
243dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        case QWebSelectData::Option:
244dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_combo->insertItem(i, data.itemText(i));
245dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            model->item(i)->setEnabled(data.itemIsEnabled(i));
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_TOOLTIP
24768513a70bcd92384395513322f1b801e7bf9c729Steve Block            model->item(i)->setToolTip(data.itemToolTip(i));
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block            model->item(i)->setBackground(data.itemBackgroundColor(i));
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block            model->item(i)->setForeground(data.itemForegroundColor(i));
251dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (data.itemIsSelected(i))
252dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                currentIndex = i;
253d0825bca7fe65beaee391d30da42e937db621564Steve Block            break;
254d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
255d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
256dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
257dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (currentIndex >= 0)
258dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_combo->setCurrentIndex(currentIndex);
259d0825bca7fe65beaee391d30da42e937db621564Steve Block}
260d0825bca7fe65beaee391d30da42e937db621564Steve Block
261d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QtFallbackWebPopup::activeChanged(int index)
262d0825bca7fe65beaee391d30da42e937db621564Steve Block{
263d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (index < 0)
264d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
265d0825bca7fe65beaee391d30da42e937db621564Steve Block
266dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    emit selectItem(index, false, false);
267dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
268dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
269dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochQWebPageClient* QtFallbackWebPopup::pageClient() const
270dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
271dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return m_chromeClient->platformPageClient();
272d0825bca7fe65beaee391d30da42e937db621564Steve Block}
273d0825bca7fe65beaee391d30da42e937db621564Steve Block
274d0825bca7fe65beaee391d30da42e937db621564Steve Block}
2756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif // QT_NO_COMBOBOX
277