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)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/frame_messages.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/menu_item_builder.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/render_frame_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(
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RenderFrameImpl* render_frame,
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebPopupMenuInfo& popup_menu_info,
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebExternalPopupMenuClient* popup_menu_client)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : render_frame_(render_frame),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_menu_info_(popup_menu_info),
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      popup_menu_client_(popup_menu_client),
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      origin_scale_for_emulation_(0) {
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ExternalPopupMenu::SetOriginScaleAndOffsetForEmulation(
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    float scale, const gfx::Point& offset) {
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  origin_scale_for_emulation_ = scale;
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  origin_offset_for_emulation_ = offset;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ExternalPopupMenu::show(const blink::WebRect& bounds) {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebRect rect = bounds;
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (origin_scale_for_emulation_) {
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.x *= origin_scale_for_emulation_;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rect.y *= origin_scale_for_emulation_;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  rect.x += origin_offset_for_emulation_.x();
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  rect.y += origin_offset_for_emulation_.y();
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FrameHostMsg_ShowPopup_Params popup_params;
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  popup_params.bounds = rect;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.item_height = popup_menu_info_.itemHeight;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.item_font_size = popup_menu_info_.itemFontSize;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.selected_item = popup_menu_info_.selectedIndex;
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (size_t i = 0; i < popup_menu_info_.items.size(); ++i) {
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    popup_params.popup_items.push_back(
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        MenuItemBuilder::Build(popup_menu_info_.items[i]));
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.right_aligned = popup_menu_info_.rightAligned;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_params.allow_multiple_selection =
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_menu_info_.allowMultipleSelection;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  render_frame_->Send(
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new FrameHostMsg_ShowPopup(render_frame_->GetRoutingID(), popup_params));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::close()  {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  render_frame_->Send(
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new FrameHostMsg_HidePopup(render_frame_->GetRoutingID()));
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  render_frame_->DidHideExternalPopupMenu();
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |this| was deleted.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItem(int index) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!popup_menu_client_)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index == -1)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_menu_client_->didCancel();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_menu_client_->didAcceptIndex(index);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalPopupMenu::DidSelectItems(bool canceled,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::vector<int>& indices) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!popup_menu_client_)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (canceled)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_menu_client_->didCancel();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    popup_menu_client_->didAcceptIndices(indices);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
87