18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file is part of the popup menu implementation for <select> elements in WebCore. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Apple Computer, Inc. 5db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 25db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "PopupMenuWx.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PopupMenuClient.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if __WXMSW__ 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/msw/winundef.h> 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/event.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/menu.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int s_menuStartId = wxNewId(); 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsennamespace WebCore { 42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenclass PopupMenuEventHandler : public wxEvtHandler 44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenpublic: 46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen PopupMenuEventHandler(PopupMenuClient* client) : 47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_client(client) 48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen {} 49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen void OnMenuItemSelected(wxCommandEvent& event) 51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen { 52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (m_client) { 53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_client->valueChanged(event.GetId() - s_menuStartId); 54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen m_client->popupDidHide(); 55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // TODO: Do we need to call Disconnect here? Do we have a ref to the native window still? 57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenprivate: 60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen PopupMenuClient* m_client; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 64db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPopupMenuWx::PopupMenuWx(PopupMenuClient* client) 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_popupClient(client) 66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_menu(0) 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen PopupMenuEventHandler m_popupHandler(client); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 71db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPopupMenuWx::~PopupMenuWx() 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_menu; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 76db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuWx::disconnectClient() 77db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 78db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block m_popupClient = 0; 79db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 80db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 81db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuWx::show(const IntRect& r, FrameView* v, int index) 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just delete and recreate 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_menu; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(client()); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxWindow* nativeWin = v->platformWidget(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (nativeWin) { 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // construct the menu 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_menu = new wxMenu(); 92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int size = client()->listSize(); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 0; i < size; i++) { 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int id = s_menuStartId + i; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (client()->itemIsSeparator(i)) { 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_menu->AppendSeparator(); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: appending a menu item with an empty label asserts in 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // wx. This needs to be fixed at wx level so that we can have 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the concept of "no selection" in choice boxes, etc. 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!client()->itemText(i).isEmpty()) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_menu->Append(s_menuStartId + i, client()->itemText(i)); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen nativeWin->Connect(s_menuStartId, s_menuStartId + (size-1), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(PopupMenuEventHandler::OnMenuItemSelected), 0, m_popupHandler); 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nativeWin->PopupMenu(m_menu, r.x() - v->scrollX(), r.y() - v->scrollY()); 110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen nativeWin->Disconnect(s_menuStartId, s_menuStartId + (size-1), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(PopupMenuEventHandler::OnMenuItemSelected), 0, m_popupHandler); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 114db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuWx::hide() 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we don't need to do anything here, the native control only exists during the time 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // show is called 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 120db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid PopupMenuWx::updateFromElement() 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project client()->setTextFromItem(m_popupClient->selectedIndex()); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 126