1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/location_bar/script_bubble_icon_view.h"
6
7#include "base/strings/string_number_conversions.h"
8#include "chrome/browser/ui/view_ids.h"
9#include "chrome/browser/ui/views/script_bubble_view.h"
10#include "chrome/common/extensions/api/extension_action/action_info.h"
11#include "chrome/common/icon_with_badge_image_source.h"
12#include "grit/generated_resources.h"
13#include "grit/theme_resources.h"
14#include "ui/base/accessibility/accessible_view_state.h"
15#include "ui/base/l10n/l10n_util.h"
16#include "ui/base/resource/resource_bundle.h"
17#include "ui/views/widget/widget.h"
18
19using content::WebContents;
20
21ScriptBubbleIconView::ScriptBubbleIconView(
22    LocationBarView::Delegate* location_bar_delegate)
23    : location_bar_delegate_(location_bar_delegate),
24      script_count_(0) {
25  set_id(VIEW_ID_SCRIPT_BUBBLE);
26  SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_SCRIPT_BUBBLE));
27  SetAccessibilityFocusable(true);
28  LocationBarView::InitTouchableLocationBarChildView(this);
29}
30
31ScriptBubbleIconView::~ScriptBubbleIconView() {
32}
33
34void ScriptBubbleIconView::SetScriptCount(size_t script_count) {
35  script_count_ = script_count;
36  gfx::ImageSkia* icon =
37      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
38          IDR_EXTENSIONS_SCRIPT_BUBBLE);
39  gfx::Size requested_size(19, 19);  // Icon is only 16x16, too small to badge.
40
41  gfx::ImageSkia image = gfx::ImageSkia(
42      new IconWithBadgeImageSource(
43          *icon,
44          requested_size,
45          gfx::Size(0, 2),
46          base::IntToString(script_count_),
47          SkColor(),
48          SkColorSetRGB(0, 170, 0),
49          extensions::ActionInfo::TYPE_PAGE),
50      requested_size);
51
52  SetImage(image);
53}
54
55void ScriptBubbleIconView::Layout() {
56  SetScriptCount(script_count_);
57}
58
59void ScriptBubbleIconView::GetAccessibleState(ui::AccessibleViewState* state) {
60  ImageView::GetAccessibleState(state);
61  state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON;
62}
63
64bool ScriptBubbleIconView::OnMousePressed(const ui::MouseEvent& event) {
65  // We want to show the bubble on mouse release; that is the standard behavior
66  // for buttons.
67  return true;
68}
69
70void ScriptBubbleIconView::OnMouseReleased(const ui::MouseEvent& event) {
71  if (event.IsOnlyLeftMouseButton() && HitTestPoint(event.location()))
72    ShowScriptBubble(this, location_bar_delegate_->GetWebContents());
73}
74
75bool ScriptBubbleIconView::OnKeyPressed(const ui::KeyEvent& event) {
76  if (event.key_code() == ui::VKEY_SPACE ||
77      event.key_code() == ui::VKEY_RETURN) {
78    ShowScriptBubble(this, location_bar_delegate_->GetWebContents());
79    return true;
80  }
81  return false;
82}
83
84void ScriptBubbleIconView::OnGestureEvent(ui::GestureEvent* event) {
85  if (event->type() == ui::ET_GESTURE_TAP) {
86    ShowScriptBubble(this, location_bar_delegate_->GetWebContents());
87    event->SetHandled();
88  }
89}
90
91void ScriptBubbleIconView::ShowScriptBubble(views::View* anchor_view,
92                                            WebContents* web_contents) {
93  ScriptBubbleView* script_bubble = new ScriptBubbleView(anchor_view,
94                                                         web_contents);
95  views::BubbleDelegateView::CreateBubble(script_bubble)->Show();
96}
97