Index: chrome/browser/speech/speech_input_bubble_views.cc |
diff --git a/chrome/browser/speech/speech_input_bubble_views.cc b/chrome/browser/speech/speech_input_bubble_views.cc |
deleted file mode 100644 |
index aa2a109d009930f2713af0162d95c2b6e14aa883..0000000000000000000000000000000000000000 |
--- a/chrome/browser/speech/speech_input_bubble_views.cc |
+++ /dev/null |
@@ -1,393 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/speech/speech_input_bubble.h" |
- |
-#include <algorithm> |
- |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/views/frame/browser_view.h" |
-#include "chrome/browser/ui/views/location_bar/location_icon_view.h" |
-#include "chrome/browser/ui/views/toolbar_view.h" |
-#include "chrome/browser/ui/views/window.h" |
-#include "content/public/browser/resource_context.h" |
-#include "content/public/browser/speech_input_manager.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_view.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/views/bubble/bubble_delegate.h" |
-#include "ui/views/controls/button/text_button.h" |
-#include "ui/views/controls/image_view.h" |
-#include "ui/views/controls/label.h" |
-#include "ui/views/controls/link.h" |
-#include "ui/views/controls/link_listener.h" |
-#include "ui/views/layout/layout_constants.h" |
- |
-using content::WebContents; |
- |
-namespace { |
- |
-const int kBubbleHorizMargin = 6; |
-const int kBubbleVertMargin = 4; |
-const int kBubbleHeadingVertMargin = 6; |
-const int kIconHorizontalOffset = 27; |
-const int kIconVerticalOffset = -7; |
- |
-// This is the SpeechInputBubble content and views bubble delegate. |
-class SpeechInputBubbleView |
- : public views::BubbleDelegateView, |
- public views::ButtonListener, |
- public views::LinkListener { |
- public: |
- SpeechInputBubbleView(SpeechInputBubbleDelegate* delegate, |
- views::View* anchor_view, |
- const gfx::Rect& element_rect, |
- WebContents* web_contents); |
- |
- void UpdateLayout(SpeechInputBubbleBase::DisplayMode mode, |
- const string16& message_text, |
- const SkBitmap& image); |
- void SetImage(const SkBitmap& image); |
- |
- // views::BubbleDelegateView methods. |
- virtual void OnWidgetActivationChanged(views::Widget* widget, |
- bool active) OVERRIDE; |
- virtual gfx::Rect GetAnchorRect() OVERRIDE; |
- virtual void Init() OVERRIDE; |
- |
- // views::ButtonListener methods. |
- virtual void ButtonPressed(views::Button* source, |
- const views::Event& event) OVERRIDE; |
- |
- // views::LinkListener methods. |
- virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; |
- |
- // views::View overrides. |
- virtual gfx::Size GetPreferredSize() OVERRIDE; |
- virtual void Layout() OVERRIDE; |
- |
- void set_notify_delegate_on_activation_change(bool notify) { |
- notify_delegate_on_activation_change_ = notify; |
- } |
- |
- private: |
- SpeechInputBubbleDelegate* delegate_; |
- gfx::Rect element_rect_; |
- WebContents* web_contents_; |
- bool notify_delegate_on_activation_change_; |
- views::ImageView* icon_; |
- views::Label* heading_; |
- views::Label* message_; |
- views::TextButton* try_again_; |
- views::TextButton* cancel_; |
- views::Link* mic_settings_; |
- SpeechInputBubbleBase::DisplayMode display_mode_; |
- const int kIconLayoutMinWidth; |
- |
- DISALLOW_COPY_AND_ASSIGN(SpeechInputBubbleView); |
-}; |
- |
-SpeechInputBubbleView::SpeechInputBubbleView( |
- SpeechInputBubbleDelegate* delegate, |
- views::View* anchor_view, |
- const gfx::Rect& element_rect, |
- WebContents* web_contents) |
- : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT), |
- delegate_(delegate), |
- element_rect_(element_rect), |
- web_contents_(web_contents), |
- notify_delegate_on_activation_change_(true), |
- icon_(NULL), |
- heading_(NULL), |
- message_(NULL), |
- try_again_(NULL), |
- cancel_(NULL), |
- mic_settings_(NULL), |
- display_mode_(SpeechInputBubbleBase::DISPLAY_MODE_WARM_UP), |
- kIconLayoutMinWidth(ResourceBundle::GetSharedInstance().GetBitmapNamed( |
- IDR_SPEECH_INPUT_MIC_EMPTY)->width()) { |
- // The bubble lifetime is managed by its controller; closing on escape or |
- // explicitly closing on deactivation will cause unexpected behavior. |
- set_close_on_esc(false); |
- set_close_on_deactivate(false); |
-} |
- |
-void SpeechInputBubbleView::OnWidgetActivationChanged(views::Widget* widget, |
- bool active) { |
- if (widget == GetWidget() && !active && notify_delegate_on_activation_change_) |
- delegate_->InfoBubbleFocusChanged(); |
- BubbleDelegateView::OnWidgetActivationChanged(widget, active); |
-} |
- |
-gfx::Rect SpeechInputBubbleView::GetAnchorRect() { |
- gfx::Rect container_rect; |
- web_contents_->GetContainerBounds(&container_rect); |
- gfx::Rect anchor(element_rect_); |
- anchor.Offset(container_rect.origin()); |
- if (!container_rect.Intersects(anchor)) |
- return BubbleDelegateView::GetAnchorRect(); |
- return anchor; |
-} |
- |
-void SpeechInputBubbleView::Init() { |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- const gfx::Font& font = rb.GetFont(ResourceBundle::MediumFont); |
- |
- heading_ = new views::Label( |
- l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_BUBBLE_HEADING)); |
- heading_->set_border(views::Border::CreateEmptyBorder( |
- kBubbleHeadingVertMargin, 0, kBubbleHeadingVertMargin, 0)); |
- heading_->SetFont(font); |
- heading_->SetHorizontalAlignment(views::Label::ALIGN_CENTER); |
- heading_->SetText( |
- l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_BUBBLE_HEADING)); |
- AddChildView(heading_); |
- |
- message_ = new views::Label(); |
- message_->SetFont(font); |
- message_->SetHorizontalAlignment(views::Label::ALIGN_CENTER); |
- message_->SetMultiLine(true); |
- AddChildView(message_); |
- |
- icon_ = new views::ImageView(); |
- icon_->SetHorizontalAlignment(views::ImageView::CENTER); |
- AddChildView(icon_); |
- |
- cancel_ = new views::NativeTextButton( |
- this, l10n_util::GetStringUTF16(IDS_CANCEL)); |
- AddChildView(cancel_); |
- |
- try_again_ = new views::NativeTextButton( |
- this, l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_TRY_AGAIN)); |
- AddChildView(try_again_); |
- |
- mic_settings_ = new views::Link( |
- l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_MIC_SETTINGS)); |
- mic_settings_->set_listener(this); |
- AddChildView(mic_settings_); |
-} |
- |
-void SpeechInputBubbleView::UpdateLayout( |
- SpeechInputBubbleBase::DisplayMode mode, |
- const string16& message_text, |
- const SkBitmap& image) { |
- display_mode_ = mode; |
- bool is_message = (mode == SpeechInputBubbleBase::DISPLAY_MODE_MESSAGE); |
- icon_->SetVisible(!is_message); |
- message_->SetVisible(is_message); |
- mic_settings_->SetVisible(is_message); |
- try_again_->SetVisible(is_message); |
- cancel_->SetVisible(mode != SpeechInputBubbleBase::DISPLAY_MODE_WARM_UP); |
- heading_->SetVisible(mode == SpeechInputBubbleBase::DISPLAY_MODE_RECORDING); |
- |
- // Clickable elements should be enabled if and only if they are visible. |
- mic_settings_->SetEnabled(mic_settings_->visible()); |
- try_again_->SetEnabled(try_again_->visible()); |
- cancel_->SetEnabled(cancel_->visible()); |
- |
- if (is_message) { |
- message_->SetText(message_text); |
- } else { |
- SetImage(image); |
- } |
- |
- if (icon_->visible()) |
- icon_->ResetImageSize(); |
- |
- // When moving from warming up to recording state, the size of the content |
- // stays the same. So we wouldn't get a resize/layout call from the view |
- // system and we do it ourselves. |
- if (GetPreferredSize() == size()) // |size()| here is the current size. |
- Layout(); |
- |
- SizeToContents(); |
-} |
- |
-void SpeechInputBubbleView::SetImage(const SkBitmap& image) { |
- icon_->SetImage(image); |
-} |
- |
-void SpeechInputBubbleView::ButtonPressed(views::Button* source, |
- const views::Event& event) { |
- if (source == cancel_) { |
- delegate_->InfoBubbleButtonClicked(SpeechInputBubble::BUTTON_CANCEL); |
- } else if (source == try_again_) { |
- delegate_->InfoBubbleButtonClicked(SpeechInputBubble::BUTTON_TRY_AGAIN); |
- } else { |
- NOTREACHED() << "Unknown button"; |
- } |
-} |
- |
-void SpeechInputBubbleView::LinkClicked(views::Link* source, int event_flags) { |
- DCHECK_EQ(source, mic_settings_); |
- content::SpeechInputManager::GetInstance()->ShowAudioInputSettings(); |
-} |
- |
-gfx::Size SpeechInputBubbleView::GetPreferredSize() { |
- int width = heading_->GetPreferredSize().width(); |
- int control_width = cancel_->GetPreferredSize().width(); |
- if (try_again_->visible()) { |
- control_width += try_again_->GetPreferredSize().width() + |
- views::kRelatedButtonHSpacing; |
- } |
- width = std::max(width, control_width); |
- control_width = std::max(icon_->GetPreferredSize().width(), |
- kIconLayoutMinWidth); |
- width = std::max(width, control_width); |
- if (mic_settings_->visible()) { |
- control_width = mic_settings_->GetPreferredSize().width(); |
- width = std::max(width, control_width); |
- } |
- |
- int height = cancel_->GetPreferredSize().height(); |
- if (message_->visible()) { |
- height += message_->GetHeightForWidth(width) + |
- views::kLabelToControlVerticalSpacing; |
- } |
- if (heading_->visible()) |
- height += heading_->GetPreferredSize().height(); |
- if (icon_->visible()) |
- height += icon_->GetImage().height(); |
- if (mic_settings_->visible()) |
- height += mic_settings_->GetPreferredSize().height(); |
- width += kBubbleHorizMargin * 2; |
- height += kBubbleVertMargin * 2; |
- |
- return gfx::Size(width, height); |
-} |
- |
-void SpeechInputBubbleView::Layout() { |
- int x = kBubbleHorizMargin; |
- int y = kBubbleVertMargin; |
- int available_width = width() - kBubbleHorizMargin * 2; |
- int available_height = height() - kBubbleVertMargin * 2; |
- |
- if (message_->visible()) { |
- DCHECK(try_again_->visible()); |
- |
- int control_height = try_again_->GetPreferredSize().height(); |
- int try_again_width = try_again_->GetPreferredSize().width(); |
- int cancel_width = cancel_->GetPreferredSize().width(); |
- y += available_height - control_height; |
- x += (available_width - cancel_width - try_again_width - |
- views::kRelatedButtonHSpacing) / 2; |
- try_again_->SetBounds(x, y, try_again_width, control_height); |
- cancel_->SetBounds(x + try_again_width + views::kRelatedButtonHSpacing, y, |
- cancel_width, control_height); |
- |
- control_height = message_->GetHeightForWidth(available_width); |
- message_->SetBounds(kBubbleHorizMargin, kBubbleVertMargin, |
- available_width, control_height); |
- y = kBubbleVertMargin + control_height; |
- |
- control_height = mic_settings_->GetPreferredSize().height(); |
- mic_settings_->SetBounds(kBubbleHorizMargin, y, available_width, |
- control_height); |
- } else { |
- DCHECK(icon_->visible()); |
- |
- int control_height = icon_->GetImage().height(); |
- if (display_mode_ == SpeechInputBubbleBase::DISPLAY_MODE_WARM_UP) |
- y = (available_height - control_height) / 2; |
- icon_->SetBounds(x, y, available_width, control_height); |
- y += control_height; |
- |
- if (heading_->visible()) { |
- control_height = heading_->GetPreferredSize().height(); |
- heading_->SetBounds(x, y, available_width, control_height); |
- y += control_height; |
- } |
- |
- if (cancel_->visible()) { |
- control_height = cancel_->GetPreferredSize().height(); |
- int width = cancel_->GetPreferredSize().width(); |
- cancel_->SetBounds(x + (available_width - width) / 2, y, width, |
- control_height); |
- } |
- } |
-} |
- |
-// Implementation of SpeechInputBubble. |
-class SpeechInputBubbleImpl : public SpeechInputBubbleBase { |
- public: |
- SpeechInputBubbleImpl(WebContents* web_contents, |
- Delegate* delegate, |
- const gfx::Rect& element_rect); |
- virtual ~SpeechInputBubbleImpl(); |
- |
- // SpeechInputBubble methods. |
- virtual void Show() OVERRIDE; |
- virtual void Hide() OVERRIDE; |
- |
- // SpeechInputBubbleBase methods. |
- virtual void UpdateLayout() OVERRIDE; |
- virtual void UpdateImage() OVERRIDE; |
- |
- private: |
- Delegate* delegate_; |
- SpeechInputBubbleView* bubble_; |
- gfx::Rect element_rect_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SpeechInputBubbleImpl); |
-}; |
- |
-SpeechInputBubbleImpl::SpeechInputBubbleImpl(WebContents* web_contents, |
- Delegate* delegate, |
- const gfx::Rect& element_rect) |
- : SpeechInputBubbleBase(web_contents), |
- delegate_(delegate), |
- bubble_(NULL), |
- element_rect_(element_rect) { |
-} |
- |
-SpeechInputBubbleImpl::~SpeechInputBubbleImpl() { |
- if (bubble_) { |
- bubble_->set_notify_delegate_on_activation_change(false); |
- bubble_->GetWidget()->Close(); |
- } |
-} |
- |
-void SpeechInputBubbleImpl::Show() { |
- if (!bubble_) { |
- // Anchor to the location icon view, in case |element_rect| is offscreen. |
- Browser* browser = Browser::GetOrCreateTabbedBrowser( |
- Profile::FromBrowserContext(web_contents()->GetBrowserContext())); |
- BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); |
- views::View* icon = browser_view->GetLocationBarView() ? |
- browser_view->GetLocationBarView()->location_icon_view() : NULL; |
- bubble_ = new SpeechInputBubbleView(delegate_, icon, element_rect_, |
- web_contents()); |
- browser::CreateViewsBubble(bubble_); |
- UpdateLayout(); |
- } |
- bubble_->Show(); |
-} |
- |
-void SpeechInputBubbleImpl::Hide() { |
- if (bubble_) |
- bubble_->GetWidget()->Hide(); |
-} |
- |
-void SpeechInputBubbleImpl::UpdateLayout() { |
- if (bubble_) |
- bubble_->UpdateLayout(display_mode(), message_text(), icon_image()); |
-} |
- |
-void SpeechInputBubbleImpl::UpdateImage() { |
- if (bubble_) |
- bubble_->SetImage(icon_image()); |
-} |
- |
-} // namespace |
- |
-SpeechInputBubble* SpeechInputBubble::CreateNativeBubble( |
- WebContents* web_contents, |
- SpeechInputBubble::Delegate* delegate, |
- const gfx::Rect& element_rect) { |
- return new SpeechInputBubbleImpl(web_contents, delegate, element_rect); |
-} |