15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/external_popup_menu.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/menu_item_builder.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebExternalPopupMenuClient.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalPopupMenu::ExternalPopupMenu( 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewImpl* render_view, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebPopupMenuInfo& popup_menu_info, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebExternalPopupMenuClient* popup_menu_client) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : render_view_(render_view), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_info_(popup_menu_info), 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_(popup_menu_client) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::show(const WebKit::WebRect& bounds) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewHostMsg_ShowPopup_Params popup_params; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.bounds = bounds; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.item_height = popup_menu_info_.itemHeight; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.item_font_size = popup_menu_info_.itemFontSize; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.selected_item = popup_menu_info_.selectedIndex; 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < popup_menu_info_.items.size(); ++i) { 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch popup_params.popup_items.push_back( 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MenuItemBuilder::Build(popup_menu_info_.items[i])); 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.right_aligned = popup_menu_info_.rightAligned; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_params.allow_multiple_selection = 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_info_.allowMultipleSelection; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_->Send( 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ViewHostMsg_ShowPopup(render_view_->routing_id(), popup_params)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::close() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_ = NULL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_ = NULL; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItem(int index) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!popup_menu_client_) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == -1) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didCancel(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didAcceptIndex(index); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItems(bool canceled, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<int>& indices) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!popup_menu_client_) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (canceled) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didCancel(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) popup_menu_client_->didAcceptIndices(indices); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 70