Index: chrome/browser/ui/views/speech_recognition_bubble_views.cc |
diff --git a/chrome/browser/ui/views/speech_recognition_bubble_views.cc b/chrome/browser/ui/views/speech_recognition_bubble_views.cc |
deleted file mode 100644 |
index 70ef9721f5d1aad55a794d87758f9efffb135caa..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/speech_recognition_bubble_views.cc |
+++ /dev/null |
@@ -1,438 +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_recognition_bubble.h" |
- |
-#include <algorithm> |
- |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#include "chrome/browser/ui/views/frame/browser_view.h" |
-#include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
-#include "content/public/browser/resource_context.h" |
-#include "content/public/browser/speech_recognition_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/label_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" |
-#include "ui/views/widget/widget_observer.h" |
- |
-using content::WebContents; |
- |
-namespace { |
- |
-const int kBubbleHorizMargin = 6; |
-const int kBubbleVertMargin = 4; |
-const int kBubbleHeadingVertMargin = 6; |
- |
-// This is the SpeechRecognitionBubble content and views bubble delegate. |
-class SpeechRecognitionBubbleView : public views::BubbleDelegateView, |
- public views::ButtonListener, |
- public views::LinkListener { |
- public: |
- SpeechRecognitionBubbleView(SpeechRecognitionBubbleDelegate* delegate, |
- views::View* anchor_view, |
- const gfx::Rect& element_rect, |
- WebContents* web_contents); |
- |
- void UpdateLayout(SpeechRecognitionBubbleBase::DisplayMode mode, |
- const base::string16& message_text, |
- const gfx::ImageSkia& image); |
- void SetImage(const gfx::ImageSkia& 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 ui::Event& event) OVERRIDE; |
- |
- // views::LinkListener methods. |
- virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; |
- |
- // views::View overrides. |
- virtual bool AcceleratorPressed(const ui::Accelerator& accelerator) OVERRIDE; |
- 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: |
- SpeechRecognitionBubbleDelegate* delegate_; |
- gfx::Rect element_rect_; |
- WebContents* web_contents_; |
- bool notify_delegate_on_activation_change_; |
- views::ImageView* icon_; |
- views::Label* heading_; |
- views::Label* message_; |
- views::LabelButton* try_again_; |
- views::LabelButton* cancel_; |
- views::Link* mic_settings_; |
- SpeechRecognitionBubbleBase::DisplayMode display_mode_; |
- const int kIconLayoutMinWidth; |
- |
- DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionBubbleView); |
-}; |
- |
-SpeechRecognitionBubbleView::SpeechRecognitionBubbleView( |
- SpeechRecognitionBubbleDelegate* 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_(SpeechRecognitionBubbleBase::DISPLAY_MODE_WARM_UP), |
- kIconLayoutMinWidth(ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
- IDR_SPEECH_INPUT_MIC_EMPTY)->width()) { |
- // The bubble lifetime is managed by its controller; explicitly closing |
- // on deactivation will cause unexpected behavior. |
- set_close_on_deactivate(false); |
- // Prevent default behavior of bubble closure on escape key and handle |
- // it in the AcceleratorPressed() to avoid an unexpected behavior. |
- set_close_on_esc(false); |
- |
- // Update the bubble's bounds when the window's bounds changes. |
- set_move_with_anchor(true); |
-} |
- |
-void SpeechRecognitionBubbleView::OnWidgetActivationChanged( |
- views::Widget* widget, bool active) { |
- if (widget == GetWidget() && !active && notify_delegate_on_activation_change_) |
- delegate_->InfoBubbleFocusChanged(); |
- BubbleDelegateView::OnWidgetActivationChanged(widget, active); |
-} |
- |
-gfx::Rect SpeechRecognitionBubbleView::GetAnchorRect() { |
- gfx::Rect container_rect; |
- web_contents_->GetView()->GetContainerBounds(&container_rect); |
- gfx::Rect anchor(element_rect_); |
- anchor.Offset(container_rect.OffsetFromOrigin()); |
- if (!container_rect.Intersects(anchor)) |
- return BubbleDelegateView::GetAnchorRect(); |
- return anchor; |
-} |
- |
-void SpeechRecognitionBubbleView::Init() { |
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- const gfx::FontList& font_list = |
- rb.GetFontList(ui::ResourceBundle::MediumFont); |
- |
- heading_ = new views::Label( |
- l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_BUBBLE_HEADING), font_list); |
- heading_->SetBorder(views::Border::CreateEmptyBorder( |
- kBubbleHeadingVertMargin, 0, kBubbleHeadingVertMargin, 0)); |
- heading_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
- AddChildView(heading_); |
- |
- message_ = new views::Label(base::string16(), font_list); |
- message_->SetMultiLine(true); |
- AddChildView(message_); |
- |
- icon_ = new views::ImageView(); |
- icon_->SetHorizontalAlignment(views::ImageView::CENTER); |
- AddChildView(icon_); |
- |
- cancel_ = new views::LabelButton(this, l10n_util::GetStringUTF16(IDS_CANCEL)); |
- cancel_->SetStyle(views::Button::STYLE_BUTTON); |
- AddChildView(cancel_); |
- |
- try_again_ = new views::LabelButton( |
- this, l10n_util::GetStringUTF16(IDS_SPEECH_INPUT_TRY_AGAIN)); |
- try_again_->SetStyle(views::Button::STYLE_BUTTON); |
- 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 SpeechRecognitionBubbleView::UpdateLayout( |
- SpeechRecognitionBubbleBase::DisplayMode mode, |
- const base::string16& message_text, |
- const gfx::ImageSkia& image) { |
- display_mode_ = mode; |
- bool is_message = (mode == SpeechRecognitionBubbleBase::DISPLAY_MODE_MESSAGE); |
- icon_->SetVisible(!is_message); |
- message_->SetVisible(is_message); |
- mic_settings_->SetVisible(is_message); |
- try_again_->SetVisible(is_message); |
- cancel_->SetVisible( |
- mode != SpeechRecognitionBubbleBase::DISPLAY_MODE_WARM_UP); |
- heading_->SetVisible( |
- mode == SpeechRecognitionBubbleBase::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 SpeechRecognitionBubbleView::SetImage(const gfx::ImageSkia& image) { |
- icon_->SetImage(image); |
-} |
- |
-void SpeechRecognitionBubbleView::ButtonPressed(views::Button* source, |
- const ui::Event& event) { |
- if (source == cancel_) { |
- delegate_->InfoBubbleButtonClicked(SpeechRecognitionBubble::BUTTON_CANCEL); |
- } else if (source == try_again_) { |
- delegate_->InfoBubbleButtonClicked( |
- SpeechRecognitionBubble::BUTTON_TRY_AGAIN); |
- } else { |
- NOTREACHED() << "Unknown button"; |
- } |
-} |
- |
-void SpeechRecognitionBubbleView::LinkClicked(views::Link* source, |
- int event_flags) { |
- DCHECK_EQ(mic_settings_, source); |
- content::SpeechRecognitionManager::GetInstance()->ShowAudioInputSettings(); |
-} |
- |
-bool SpeechRecognitionBubbleView::AcceleratorPressed( |
- const ui::Accelerator& accelerator) { |
- // The accelerator is added by BubbleDelegateView. |
- if (accelerator.key_code() == ui::VKEY_ESCAPE) { |
- delegate_->InfoBubbleButtonClicked(SpeechRecognitionBubble::BUTTON_CANCEL); |
- return true; |
- } |
- |
- return BubbleDelegateView::AcceleratorPressed(accelerator); |
-} |
- |
-gfx::Size SpeechRecognitionBubbleView::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 SpeechRecognitionBubbleView::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_ == SpeechRecognitionBubbleBase::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 SpeechRecognitionBubble. |
-class SpeechRecognitionBubbleImpl |
- : public SpeechRecognitionBubbleBase, |
- public views::WidgetObserver { |
- public: |
- SpeechRecognitionBubbleImpl(int render_process_id, int render_view_id, |
- Delegate* delegate, |
- const gfx::Rect& element_rect); |
- virtual ~SpeechRecognitionBubbleImpl(); |
- |
- // SpeechRecognitionBubble methods. |
- virtual void Show() OVERRIDE; |
- virtual void Hide() OVERRIDE; |
- |
- // SpeechRecognitionBubbleBase methods. |
- virtual void UpdateLayout() OVERRIDE; |
- virtual void UpdateImage() OVERRIDE; |
- |
- // views::WidgetObserver methods. |
- virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE; |
- |
- private: |
- Delegate* delegate_; |
- SpeechRecognitionBubbleView* bubble_; |
- gfx::Rect element_rect_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionBubbleImpl); |
-}; |
- |
-SpeechRecognitionBubbleImpl::SpeechRecognitionBubbleImpl( |
- int render_process_id, int render_view_id, Delegate* delegate, |
- const gfx::Rect& element_rect) |
- : SpeechRecognitionBubbleBase(render_process_id, render_view_id), |
- delegate_(delegate), |
- bubble_(NULL), |
- element_rect_(element_rect) { |
-} |
- |
-SpeechRecognitionBubbleImpl::~SpeechRecognitionBubbleImpl() { |
- if (bubble_) { |
- bubble_->GetWidget()->RemoveObserver(this); |
- bubble_->set_notify_delegate_on_activation_change(false); |
- bubble_->GetWidget()->Close(); |
- } |
-} |
- |
-void SpeechRecognitionBubbleImpl::OnWidgetDestroying(views::Widget* widget) { |
- bubble_ = NULL; |
-} |
- |
-void SpeechRecognitionBubbleImpl::Show() { |
- WebContents* web_contents = GetWebContents(); |
- if (!web_contents) |
- return; |
- |
- if (!bubble_) { |
- views::View* icon = NULL; |
- |
- // Anchor to the location bar, in case |element_rect| is offscreen. |
- Browser* browser = chrome::FindBrowserWithWebContents(web_contents); |
- if (browser) { |
- BrowserView* browser_view = |
- BrowserView::GetBrowserViewForBrowser(browser); |
- icon = browser_view->GetLocationBarView() ? |
- browser_view->GetLocationBarView()->GetLocationBarAnchor() : NULL; |
- } |
- |
- bubble_ = new SpeechRecognitionBubbleView(delegate_, icon, element_rect_, |
- web_contents); |
- |
- if (!icon) { |
- // We dont't have an icon to attach to. Manually specify the web contents |
- // window as the parent. |
- bubble_->set_parent_window( |
- web_contents->GetView()->GetTopLevelNativeWindow()); |
- } |
- |
- views::BubbleDelegateView::CreateBubble(bubble_); |
- UpdateLayout(); |
- bubble_->GetWidget()->AddObserver(this); |
- } |
- bubble_->GetWidget()->Show(); |
-} |
- |
-void SpeechRecognitionBubbleImpl::Hide() { |
- if (bubble_) |
- bubble_->GetWidget()->Hide(); |
-} |
- |
-void SpeechRecognitionBubbleImpl::UpdateLayout() { |
- if (bubble_ && GetWebContents()) |
- bubble_->UpdateLayout(display_mode(), message_text(), icon_image()); |
-} |
- |
-void SpeechRecognitionBubbleImpl::UpdateImage() { |
- if (bubble_ && GetWebContents()) |
- bubble_->SetImage(icon_image()); |
-} |
- |
-} // namespace |
- |
-SpeechRecognitionBubble* SpeechRecognitionBubble::CreateNativeBubble( |
- int render_process_id, |
- int render_view_id, |
- SpeechRecognitionBubble::Delegate* delegate, |
- const gfx::Rect& element_rect) { |
- return new SpeechRecognitionBubbleImpl(render_process_id, render_view_id, |
- delegate, element_rect); |
-} |