15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/ExternalPopupMenu.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h" 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/PopupMenuClient.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatQuad.h" 381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntPoint.h" 391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextDirection.h" 405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h" 41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebExternalPopupMenu.h" 429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "public/web/WebFrameClient.h" 43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebMenuItemInfo.h" 44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPopupMenuInfo.h" 459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "web/WebLocalFrameImpl.h" 46f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h" 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)ExternalPopupMenu::ExternalPopupMenu(LocalFrame& frame, PopupMenuClient* popupMenuClient, WebViewImpl& webView) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_popupMenuClient(popupMenuClient) 529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) , m_localFrame(frame) 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_webView(webView) 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_dispatchEventTimer(this, &ExternalPopupMenu::dispatchEvent) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_webExternalPopupMenu(0) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ExternalPopupMenu::~ExternalPopupMenu() 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ExternalPopupMenu::trace(Visitor* visitor) 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_localFrame); 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci PopupMenu::trace(visitor); 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void ExternalPopupMenu::show(const FloatQuad& controlPosition, const IntSize&, int index) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) IntRect rect(controlPosition.enclosingBoundingBox()); 7207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch // WebCore reuses the PopupMenu of an element. 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For simplicity, we do recreate the actual external popup everytime. 7407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (m_webExternalPopupMenu) { 7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_webExternalPopupMenu->close(); 7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_webExternalPopupMenu = 0; 7707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebPopupMenuInfo info; 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci getPopupMenuInfo(info, *m_popupMenuClient); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (info.items.isEmpty()) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) WebLocalFrameImpl* webframe = WebLocalFrameImpl::fromFrame(m_localFrame.get()); 849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) m_webExternalPopupMenu = webframe->client()->createExternalPopupMenu(info, this); 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_webExternalPopupMenu) { 869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) m_webExternalPopupMenu->show(m_localFrame->view()->contentsToWindow(rect)); 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#if OS(MACOSX) 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const WebInputEvent* currentEvent = WebViewImpl::currentInputEvent(); 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (currentEvent && currentEvent->type == WebInputEvent::MouseDown) { 9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_syntheticEvent = adoptPtr(new WebMouseEvent); 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *m_syntheticEvent = *static_cast<const WebMouseEvent*>(currentEvent); 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_syntheticEvent->type = WebInputEvent::MouseUp; 93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_dispatchEventTimer.startOneShot(0, FROM_HERE); 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: show() is asynchronous. If preparing a popup is slow and 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // a user released the mouse button before showing the popup, 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // mouseup and click events are correctly dispatched. Dispatching 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // the synthetic mouseup event is redundant in this case. 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif 10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The client might refuse to create a popup (when there is already one pending to be shown for example). 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) didCancel(); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void ExternalPopupMenu::dispatchEvent(Timer<ExternalPopupMenu>*) 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_webView.handleInputEvent(*m_syntheticEvent); 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_syntheticEvent.clear(); 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::hide() 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_popupMenuClient) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popupMenuClient->popupDidHide(); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_webExternalPopupMenu) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu->close(); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu = 0; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::updateFromElement() 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::disconnectClient() 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hide(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popupMenuClient = 0; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::didChangeSelection(int index) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_popupMenuClient) 1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_popupMenuClient->selectionChanged(toPopupMenuItemIndex(index, *m_popupMenuClient)); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::didAcceptIndex(int index) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calling methods on the PopupMenuClient might lead to this object being 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // derefed. This ensures it does not get deleted while we are running this 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method. 1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int popupMenuItemIndex = toPopupMenuItemIndex(index, *m_popupMenuClient); 1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<ExternalPopupMenu> guard(this); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_popupMenuClient) { 14710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_popupMenuClient->popupDidHide(); 148e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_popupMenuClient->valueChanged(popupMenuItemIndex); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu = 0; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::didAcceptIndices(const WebVector<int>& indices) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_popupMenuClient) { 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu = 0; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calling methods on the PopupMenuClient might lead to this object being 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // derefed. This ensures it does not get deleted while we are running this 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // method. 1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<ExternalPopupMenu> protect(this); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch m_popupMenuClient->popupDidHide(); 166fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!indices.size()) 168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_popupMenuClient->valueChanged(static_cast<unsigned>(-1), true); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < indices.size(); ++i) 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_popupMenuClient->listBoxSelectItem(toPopupMenuItemIndex(indices[i], *m_popupMenuClient), (i > 0), false, (i == indices.size() - 1)); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu = 0; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ExternalPopupMenu::didCancel() 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See comment in didAcceptIndex on why we need this. 1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<ExternalPopupMenu> guard(this); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_popupMenuClient) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_popupMenuClient->popupDidHide(); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_webExternalPopupMenu = 0; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo& info, PopupMenuClient& popupMenuClient) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int itemCount = popupMenuClient.listSize(); 190e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int count = 0; 191e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Vector<WebMenuItemInfo> items(static_cast<size_t>(itemCount)); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < itemCount; ++i) { 1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci PopupMenuStyle style = popupMenuClient.itemStyle(i); 194e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (style.isDisplayNone()) 195e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) continue; 196e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 197e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebMenuItemInfo& popupItem = items[count++]; 1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci popupItem.label = popupMenuClient.itemText(i); 1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci popupItem.toolTip = popupMenuClient.itemToolTip(i); 2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (popupMenuClient.itemIsSeparator(i)) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popupItem.type = WebMenuItemInfo::Separator; 2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci else if (popupMenuClient.itemIsLabel(i)) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popupItem.type = WebMenuItemInfo::Group; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popupItem.type = WebMenuItemInfo::Option; 2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci popupItem.enabled = popupMenuClient.itemIsEnabled(i); 2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci popupItem.checked = popupMenuClient.itemIsSelected(i); 208e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) popupItem.textDirection = toWebTextDirection(style.textDirection()); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popupItem.hasTextDirectionOverride = style.hasTextDirectionOverride(); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.itemHeight = popupMenuClient.menuStyle().font().fontMetrics().height(); 2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.itemFontSize = static_cast<int>(popupMenuClient.menuStyle().font().fontDescription().computedSize()); 2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.selectedIndex = toExternalPopupMenuItemIndex(popupMenuClient.selectedIndex(), popupMenuClient); 2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.rightAligned = popupMenuClient.menuStyle().textDirection() == RTL; 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.allowMultipleSelection = popupMenuClient.multiple(); 2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (count < itemCount) 2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci items.shrink(count); 2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci info.items = items; 2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint ExternalPopupMenu::toPopupMenuItemIndex(int externalPopupMenuItemIndex, PopupMenuClient& popupMenuClient) 224e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 225e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (externalPopupMenuItemIndex < 0) 226e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return externalPopupMenuItemIndex; 227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int itemCount = popupMenuClient.listSize(); 229e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int indexTracker = 0; 230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) for (int i = 0; i < itemCount ; ++i) { 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (popupMenuClient.itemStyle(i).isDisplayNone()) 232e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) continue; 233e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (indexTracker++ == externalPopupMenuItemIndex) 234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return i; 235e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 236e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return -1; 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint ExternalPopupMenu::toExternalPopupMenuItemIndex(int popupMenuItemIndex, PopupMenuClient& popupMenuClient) 240e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (popupMenuItemIndex < 0) 242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return popupMenuItemIndex; 243e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int itemCount = popupMenuClient.listSize(); 245e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int indexTracker = 0; 246e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) for (int i = 0; i < itemCount; ++i) { 2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (popupMenuClient.itemStyle(i).isDisplayNone()) 248e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) continue; 249e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (popupMenuItemIndex == i) 250e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return indexTracker; 251e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ++indexTracker; 252e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 253e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return -1; 254e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 255e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace blink 257