1dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This file is part of the popup menu implementation for <select> elements in WebCore.
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2008, 2009, 2010 Nokia Corporation and/or its subsidiary(-ies)
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2006 Apple Computer, Inc.
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Coypright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
21dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
23dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "config.h"
27dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "PopupMenuQt.h"
28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "ChromeClientQt.h"
30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "FrameView.h"
31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "PopupMenuClient.h"
32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "QtFallbackWebPopup.h"
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "qwebkitplatformplugin.h"
35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass SelectData : public QWebSelectData {
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochpublic:
38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SelectData(WebCore::PopupMenuClient*& data) : d(data) {}
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual ItemType itemType(int) const;
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual QString itemText(int idx) const { return QString(d ? d->itemText(idx) : ""); }
42dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual QString itemToolTip(int idx) const { return QString(d ? d->itemToolTip(idx) : ""); }
43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual bool itemIsEnabled(int idx) const { return d ? d->itemIsEnabled(idx) : false; }
44dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual int itemCount() const { return d ? d->listSize() : 0; }
45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual bool itemIsSelected(int idx) const { return d ? d->itemIsSelected(idx) : false; }
46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual bool multiple() const;
472bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual QColor backgroundColor() const { return d ? QColor(d->menuStyle().backgroundColor()) : QColor(); }
482bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual QColor foregroundColor() const { return d ? QColor(d->menuStyle().foregroundColor()) : QColor(); }
492bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual QColor itemBackgroundColor(int idx) const { return d ? QColor(d->itemStyle(idx).backgroundColor()) : QColor(); }
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    virtual QColor itemForegroundColor(int idx) const { return d ? QColor(d->itemStyle(idx).foregroundColor()) : QColor(); }
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprivate:
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebCore::PopupMenuClient*& d;
54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
56dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SelectData::multiple() const
57dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!d)
59dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return false;
60dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(NO_LISTBOX_RENDERING)
62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebCore::ListPopupMenuClient* client = static_cast<WebCore::ListPopupMenuClient*>(d);
63dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return client && client->multiple();
64dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#else
65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return false;
66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochSelectData::ItemType SelectData::itemType(int idx) const
70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
71dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!d)
72dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return SelectData::Option;
73dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
74dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (d->itemIsSeparator(idx))
75dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return SelectData::Separator;
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (d->itemIsLabel(idx))
77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return SelectData::Group;
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return SelectData::Option;
79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochnamespace WebCore {
82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
83dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPopupMenuQt::PopupMenuQt(PopupMenuClient* client, const ChromeClientQt* chromeClient)
84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    : m_popupClient(client)
85dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_popup(0)
86dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_selectData(0)
87dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    , m_chromeClient(chromeClient)
88dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
89dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPopupMenuQt::~PopupMenuQt()
92dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    delete m_selectData;
94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    delete m_popup;
95dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::disconnectClient()
98dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_popupClient = 0;
100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
101dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::show(const IntRect& rect, FrameView* view, int index)
103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef QT_NO_COMBOBOX
105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!m_popupClient)
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!m_popup) {
109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_popup = m_chromeClient->createSelectPopup();
110dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        connect(m_popup, SIGNAL(didHide()), this, SLOT(didHide()));
111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        connect(m_popup, SIGNAL(selectItem(int, bool, bool)), this, SLOT(selectItem(int, bool, bool)));
112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
114dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (QtFallbackWebPopup* fallback = qobject_cast<QtFallbackWebPopup*>(m_popup)) {
115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        QRect geometry(rect);
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        geometry.moveTopLeft(view->contentsToWindow(rect.location()));
117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        fallback->setGeometry(geometry);
118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        fallback->setFont(m_popupClient->menuStyle().font().font());
119dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
120dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
121dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_selectData)
122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        delete m_selectData;
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_selectData = new SelectData(m_popupClient);
124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_popup->show(*m_selectData);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
126dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
127dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
128dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::didHide()
129dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_popupClient)
131dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_popupClient->popupDidHide();
132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
133dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::hide()
135dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_popup)
137dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_popup->hide();
138dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
139dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
140dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::updateFromElement()
141dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (m_popupClient)
143dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        m_popupClient->setTextFromItem(m_popupClient->selectedIndex());
144dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
145dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochvoid PopupMenuQt::selectItem(int index, bool ctrl, bool shift)
147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
148dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (!m_popupClient)
149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
151dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(NO_LISTBOX_RENDERING)
152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ListPopupMenuClient* client = static_cast<ListPopupMenuClient*>(m_popupClient);
153dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    if (client) {
154dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        client->listBoxSelectItem(index, ctrl, shift);
155dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
156dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
157dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
158dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
159dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_popupClient->valueChanged(index);
160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
161dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
162dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
1642bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "moc_PopupMenuQt.cpp"
1652bde8e466a4451c7319e3a072d118917957d6554Steve Block
166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch// vim: ts=4 sw=4 et
167