Index: chrome/browser/ui/views/bubble/bubble.cc |
diff --git a/chrome/browser/ui/views/bubble/bubble.cc b/chrome/browser/ui/views/bubble/bubble.cc |
deleted file mode 100644 |
index 6cf7d2248257262d27eff49a69bb4829bd20cbf9..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/bubble/bubble.cc |
+++ /dev/null |
@@ -1,442 +0,0 @@ |
-// Copyright (c) 2011 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/ui/views/bubble/bubble.h" |
- |
-#include <vector> |
- |
-#include "chrome/browser/ui/views/bubble/border_contents.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "ui/base/animation/slide_animation.h" |
-#include "ui/base/keycodes/keyboard_codes.h" |
-#include "ui/gfx/color_utils.h" |
-#include "ui/views/layout/fill_layout.h" |
-#include "ui/views/widget/widget.h" |
-#include "ui/views/window/client_view.h" |
- |
-#if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK) |
-#include "chrome/browser/chromeos/legacy_window_manager/wm_ipc.h" |
-#include "third_party/cros_system_api/window_manager/chromeos_wm_ipc_enums.h" |
-#endif |
- |
-#if defined(OS_WIN) && !defined(USE_AURA) |
-#include "chrome/browser/ui/views/bubble/border_widget_win.h" |
-#endif |
- |
-using std::vector; |
- |
-// How long the fade should last for. |
-static const int kHideFadeDurationMS = 200; |
- |
-// Background color of the bubble. |
-#if defined(OS_WIN) && !defined(USE_AURA) |
-const SkColor Bubble::kBackgroundColor = |
- color_utils::GetSysSkColor(COLOR_WINDOW); |
-#else |
-// TODO(beng): source from theme provider. |
-const SkColor Bubble::kBackgroundColor = SK_ColorWHITE; |
-#endif |
- |
-// BubbleDelegate --------------------------------------------------------- |
- |
-string16 BubbleDelegate::GetAccessibleName() { |
- return string16(); |
-} |
- |
-// Bubble ----------------------------------------------------------------- |
- |
-// static |
-Bubble* Bubble::Show(views::Widget* parent, |
- const gfx::Rect& position_relative_to, |
- views::BubbleBorder::ArrowLocation arrow_location, |
- views::BubbleBorder::BubbleAlignment alignment, |
- views::View* contents, |
- BubbleDelegate* delegate) { |
- Bubble* bubble = new Bubble; |
- bubble->InitBubble(parent, position_relative_to, arrow_location, alignment, |
- contents, delegate); |
- |
- // Register the Escape accelerator for closing. |
- bubble->RegisterEscapeAccelerator(); |
- |
- if (delegate) |
- delegate->BubbleShown(); |
- |
- return bubble; |
-} |
- |
-#if defined(OS_CHROMEOS) |
-// static |
-Bubble* Bubble::ShowFocusless( |
- views::Widget* parent, |
- const gfx::Rect& position_relative_to, |
- views::BubbleBorder::ArrowLocation arrow_location, |
- views::BubbleBorder::BubbleAlignment alignment, |
- views::View* contents, |
- BubbleDelegate* delegate, |
- bool show_while_screen_is_locked) { |
- Bubble* bubble = new Bubble(views::Widget::InitParams::TYPE_POPUP, |
- show_while_screen_is_locked); |
- bubble->InitBubble(parent, position_relative_to, arrow_location, alignment, |
- contents, delegate); |
- return bubble; |
-} |
-#endif |
- |
-void Bubble::Close() { |
- if (show_status_ != kOpen) |
- return; |
- |
- show_status_ = kClosing; |
- |
- if (fade_away_on_close_) |
- FadeOut(); |
- else |
- DoClose(false); |
-} |
- |
-void Bubble::AnimationEnded(const ui::Animation* animation) { |
- if (static_cast<int>(animation_->GetCurrentValue()) == 0) { |
- // When fading out we just need to close the bubble at the end |
- DoClose(false); |
- } else { |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- // When fading in we need to remove the layered window style flag, since |
- // that style prevents some bubble content from working properly. |
- SetWindowLong(GWL_EXSTYLE, GetWindowLong(GWL_EXSTYLE) & ~WS_EX_LAYERED); |
-#endif |
- } |
-} |
- |
-void Bubble::AnimationProgressed(const ui::Animation* animation) { |
- // Set the opacity for the main contents window. |
- unsigned char opacity = static_cast<unsigned char>( |
- animation_->GetCurrentValue() * 255); |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- SetLayeredWindowAttributes(GetNativeView(), 0, |
- static_cast<byte>(opacity), LWA_ALPHA); |
- contents_->SchedulePaint(); |
- |
- // Also fade in/out the bubble border window. |
- border_->SetOpacity(opacity); |
- border_->border_contents()->SchedulePaint(); |
-#else |
- SetOpacity(opacity); |
- border_contents_->SchedulePaint(); |
-#endif |
-} |
- |
-Bubble::Bubble() |
- : |
-#if defined(USE_AURA) |
- views::NativeWidgetAura(new views::Widget), |
-#elif defined(OS_WIN) |
- views::NativeWidgetWin(new views::Widget), |
-#elif defined(TOOLKIT_USES_GTK) |
- views::NativeWidgetGtk(new views::Widget), |
-#endif |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- border_(NULL), |
-#else |
- border_contents_(NULL), |
-#endif |
- delegate_(NULL), |
- show_status_(kOpen), |
- fade_away_on_close_(false), |
- close_on_deactivate_(true), |
-#if defined(TOOLKIT_USES_GTK) |
- type_(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS), |
-#endif |
-#if defined(OS_CHROMEOS) |
- show_while_screen_is_locked_(false), |
-#endif |
- arrow_location_(views::BubbleBorder::NONE), |
- contents_(NULL), |
- accelerator_registered_(false) { |
-} |
- |
-#if defined(OS_CHROMEOS) |
-Bubble::Bubble(views::Widget::InitParams::Type type, |
- bool show_while_screen_is_locked) |
-#if defined(USE_AURA) |
- : views::NativeWidgetAura(new views::Widget), |
-#else |
- : views::NativeWidgetGtk(new views::Widget), |
-#endif |
- border_contents_(NULL), |
- delegate_(NULL), |
- show_status_(kOpen), |
- fade_away_on_close_(false), |
-#if defined(TOOLKIT_USES_GTK) |
- type_(type), |
-#endif |
- show_while_screen_is_locked_(show_while_screen_is_locked), |
- arrow_location_(views::BubbleBorder::NONE), |
- contents_(NULL), |
- accelerator_registered_(false) { |
-} |
-#endif |
- |
-Bubble::~Bubble() { |
-} |
- |
-void Bubble::InitBubble(views::Widget* parent, |
- const gfx::Rect& position_relative_to, |
- views::BubbleBorder::ArrowLocation arrow_location, |
- views::BubbleBorder::BubbleAlignment alignment, |
- views::View* contents, |
- BubbleDelegate* delegate) { |
- delegate_ = delegate; |
- position_relative_to_ = position_relative_to; |
- arrow_location_ = arrow_location; |
- contents_ = contents; |
- const bool fade_in = delegate_ && delegate_->FadeInOnShow(); |
- |
- // Create the main window. |
-#if defined(USE_AURA) |
- views::Widget* parent_window = parent->GetTopLevelWidget(); |
- if (parent_window) |
- parent_window->DisableInactiveRendering(); |
- views::Widget::InitParams params; |
- params.transparent = true; |
- params.parent_widget = parent; |
- params.native_widget = this; |
- GetWidget()->Init(params); |
- if (fade_in) |
- SetOpacity(0); |
-#elif defined(OS_WIN) |
- views::Widget* parent_window = parent->GetTopLevelWidget(); |
- if (parent_window) |
- parent_window->DisableInactiveRendering(); |
- set_window_style(WS_POPUP | WS_CLIPCHILDREN); |
- int extended_style = WS_EX_TOOLWINDOW; |
- // During FadeIn we need to turn on the layered window style to deal with |
- // transparency. This flag needs to be reset after fading in is complete. |
- if (fade_in) |
- extended_style |= WS_EX_LAYERED; |
- set_window_ex_style(extended_style); |
- |
- DCHECK(!border_); |
- border_ = new BorderWidgetWin(); |
- |
- border_->InitBorderWidgetWin(CreateBorderContents(), parent->GetNativeView()); |
- border_->border_contents()->SetBackgroundColor(kBackgroundColor); |
- border_->border_contents()->SetAlignment(alignment); |
- |
- // We make the BorderWidgetWin the owner of the Bubble HWND, so that the |
- // latter is displayed on top of the former. |
- views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); |
- params.parent = border_->GetNativeView(); |
- params.native_widget = this; |
- GetWidget()->Init(params); |
- |
- if (fade_in) { |
- border_->SetOpacity(0); |
- GetWidget()->SetOpacity(0); |
- } |
- SetWindowText(GetNativeView(), delegate_->GetAccessibleName().c_str()); |
-#elif defined(TOOLKIT_USES_GTK) |
- views::Widget::InitParams params(type_); |
- params.transparent = true; |
- params.parent_widget = parent; |
- params.native_widget = this; |
- GetWidget()->Init(params); |
- if (fade_in) |
- SetOpacity(0); |
-#if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK) |
- { |
- vector<int> params; |
- params.push_back(show_while_screen_is_locked_ ? 1 : 0); |
- chromeos::WmIpc::instance()->SetWindowType( |
- GetNativeView(), |
- chromeos::WM_IPC_WINDOW_CHROME_INFO_BUBBLE, |
- ¶ms); |
- } |
-#endif |
-#endif |
- |
- // Create a View to hold the contents of the main window. |
- views::View* contents_view = new views::View; |
- // We add |contents_view| to ourselves before the AddChildView() call below so |
- // that when |contents| gets added, it will already have a widget, and thus |
- // any NativeButtons it creates in ViewHierarchyChanged() will be functional |
- // (e.g. calling SetChecked() on checkboxes is safe). |
- GetWidget()->SetContentsView(contents_view); |
- // Adding |contents| as a child has to be done before we call |
- // contents->GetPreferredSize() below, since some supplied views don't |
- // actually initialize themselves until they're added to a hierarchy. |
- contents_view->AddChildView(contents); |
- |
- // Calculate and set the bounds for all windows and views. |
- gfx::Rect window_bounds; |
- |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- // Initialize and position the border window. |
- window_bounds = border_->SizeAndGetBounds(position_relative_to, |
- arrow_location, |
- contents->GetPreferredSize()); |
- |
- // Make |contents| take up the entire contents view. |
- contents_view->SetLayoutManager(new views::FillLayout); |
- |
- // Paint the background color behind the contents. |
- contents_view->set_background( |
- views::Background::CreateSolidBackground(kBackgroundColor)); |
-#else |
- // Create a view to paint the border and background. |
- border_contents_ = CreateBorderContents(); |
- border_contents_->Init(); |
- border_contents_->SetBackgroundColor(kBackgroundColor); |
- border_contents_->SetAlignment(alignment); |
- gfx::Rect contents_bounds; |
- border_contents_->SizeAndGetBounds(position_relative_to, |
- arrow_location, false, contents->GetPreferredSize(), |
- &contents_bounds, &window_bounds); |
- // This new view must be added before |contents| so it will paint under it. |
- contents_view->AddChildViewAt(border_contents_, 0); |
- |
- // |contents_view| has no layout manager, so we have to explicitly position |
- // its children. |
- border_contents_->SetBoundsRect( |
- gfx::Rect(gfx::Point(), window_bounds.size())); |
- contents->SetBoundsRect(contents_bounds); |
-#endif |
- GetWidget()->SetBounds(window_bounds); |
- |
- // Show the window. |
-#if defined(USE_AURA) |
- GetWidget()->Show(); |
-#elif defined(OS_WIN) |
- border_->ShowWindow(SW_SHOW); |
- ShowWindow(SW_SHOW); |
-#elif defined(TOOLKIT_USES_GTK) |
- GetWidget()->Show(); |
-#endif |
- |
- if (fade_in) |
- FadeIn(); |
-} |
- |
-void Bubble::RegisterEscapeAccelerator() { |
- GetWidget()->GetFocusManager()->RegisterAccelerator( |
- ui::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); |
- accelerator_registered_ = true; |
-} |
- |
-void Bubble::UnregisterEscapeAccelerator() { |
- DCHECK(accelerator_registered_); |
- GetWidget()->GetFocusManager()->UnregisterAccelerator( |
- ui::Accelerator(ui::VKEY_ESCAPE, false, false, false), this); |
- accelerator_registered_ = false; |
-} |
- |
-BorderContents* Bubble::CreateBorderContents() { |
- return new BorderContents(); |
-} |
- |
-void Bubble::SizeToContents() { |
- gfx::Rect window_bounds; |
- |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- // Initialize and position the border window. |
- window_bounds = border_->SizeAndGetBounds(position_relative_to_, |
- arrow_location_, |
- contents_->GetPreferredSize()); |
-#else |
- gfx::Rect contents_bounds; |
- border_contents_->SizeAndGetBounds(position_relative_to_, |
- arrow_location_, false, contents_->GetPreferredSize(), |
- &contents_bounds, &window_bounds); |
- // |contents_view| has no layout manager, so we have to explicitly position |
- // its children. |
- border_contents_->SetBoundsRect( |
- gfx::Rect(gfx::Point(), window_bounds.size())); |
- contents_->SetBoundsRect(contents_bounds); |
-#endif |
- GetWidget()->SetBounds(window_bounds); |
-} |
- |
-#if defined(USE_AURA) |
-void Bubble::OnLostActive() { |
- GetWidget()->Close(); |
-} |
-#elif defined(OS_WIN) |
-void Bubble::OnActivate(UINT action, BOOL minimized, HWND window) { |
- // The popup should close when it is deactivated. |
- if (action == WA_INACTIVE) { |
- if (close_on_deactivate_) |
- GetWidget()->Close(); |
- } else if (action == WA_ACTIVE) { |
- DCHECK(GetWidget()->GetRootView()->has_children()); |
- GetWidget()->GetRootView()->child_at(0)->RequestFocus(); |
- } |
-} |
-#elif defined(TOOLKIT_USES_GTK) |
-void Bubble::OnActiveChanged() { |
- if (!GetWidget()->IsActive()) |
- GetWidget()->Close(); |
-} |
-#endif |
- |
-void Bubble::DoClose(bool closed_by_escape) { |
- if (show_status_ == kClosed) |
- return; |
- |
- if (accelerator_registered_) |
- UnregisterEscapeAccelerator(); |
- if (delegate_) |
- delegate_->BubbleClosing(this, closed_by_escape); |
- FOR_EACH_OBSERVER(Observer, observer_list_, OnBubbleClosing()); |
- show_status_ = kClosed; |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- border_->Close(); |
-#endif |
-#if defined(USE_AURA) |
- NativeWidgetAura::Close(); |
-#elif defined(OS_WIN) |
- NativeWidgetWin::Close(); |
-#elif defined(TOOLKIT_USES_GTK) |
- NativeWidgetGtk::Close(); |
-#endif |
-} |
- |
-void Bubble::FadeIn() { |
- Fade(true); // |fade_in|. |
-} |
- |
-void Bubble::FadeOut() { |
-#if defined(OS_WIN) && !defined(USE_AURA) |
- // The contents window cannot have the layered flag on by default, since its |
- // content doesn't always work inside a layered window, but when animating it |
- // is ok to set that style on the window for the purpose of fading it out. |
- SetWindowLong(GWL_EXSTYLE, GetWindowLong(GWL_EXSTYLE) | WS_EX_LAYERED); |
- // This must be the very next call, otherwise we can get flicker on close. |
- SetLayeredWindowAttributes(GetNativeView(), 0, |
- static_cast<byte>(255), LWA_ALPHA); |
-#elif defined(USE_AURA) |
- NOTIMPLEMENTED(); |
-#endif |
- |
- Fade(false); // |fade_in|. |
-} |
- |
-void Bubble::Fade(bool fade_in) { |
- animation_.reset(new ui::SlideAnimation(this)); |
- animation_->SetSlideDuration(kHideFadeDurationMS); |
- animation_->SetTweenType(ui::Tween::LINEAR); |
- |
- animation_->Reset(fade_in ? 0.0 : 1.0); |
- if (fade_in) |
- animation_->Show(); |
- else |
- animation_->Hide(); |
-} |
- |
-bool Bubble::AcceleratorPressed(const ui::Accelerator& accelerator) { |
- if (!delegate_ || delegate_->CloseOnEscape()) { |
- DoClose(true); |
- return true; |
- } |
- return false; |
-} |