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