Index: chrome/browser/chromeos/notifications/balloon_view.cc |
diff --git a/chrome/browser/chromeos/notifications/balloon_view.cc b/chrome/browser/chromeos/notifications/balloon_view.cc |
deleted file mode 100644 |
index 85f4f706c37971bee4e6a4602b539505e7a62e87..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/notifications/balloon_view.cc |
+++ /dev/null |
@@ -1,375 +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/chromeos/notifications/balloon_view.h" |
- |
-#include <algorithm> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/message_loop.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/chromeos/notifications/balloon_view_host.h" |
-#include "chrome/browser/chromeos/notifications/notification_panel.h" |
-#include "chrome/browser/notifications/balloon.h" |
-#include "chrome/browser/notifications/desktop_notification_service.h" |
-#include "chrome/browser/notifications/desktop_notification_service_factory.h" |
-#include "chrome/browser/notifications/notification.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/views/notifications/balloon_view_host.h" |
-#include "chrome/common/chrome_notification_types.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/render_widget_host_view.h" |
-#include "content/public/browser/web_contents.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "grit/theme_resources_standard.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/models/simple_menu_model.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/views/background.h" |
-#include "ui/views/controls/button/button.h" |
-#include "ui/views/controls/button/image_button.h" |
-#include "ui/views/controls/button/menu_button.h" |
-#include "ui/views/controls/button/menu_button_listener.h" |
-#include "ui/views/controls/label.h" |
-#include "ui/views/controls/menu/menu_item_view.h" |
-#include "ui/views/controls/menu/menu_model_adapter.h" |
-#include "ui/views/controls/menu/menu_runner.h" |
-#include "ui/views/widget/widget.h" |
- |
-using content::RenderWidgetHostView; |
- |
-namespace { |
-// Menu commands |
-const int kNoopCommand = 0; |
-const int kRevokePermissionCommand = 1; |
- |
-// Vertical margin between close button and menu button. |
-const int kControlButtonsMargin = 6; |
- |
-// Top, Right margin for notification control view. |
-const int kControlViewTopMargin = 4; |
-const int kControlViewRightMargin = 6; |
-} // namespace |
- |
-namespace chromeos { |
- |
-// NotificationControlView has close and menu buttons and |
-// overlays on top of renderer view. |
-class NotificationControlView : public views::View, |
- public views::MenuButtonListener, |
- public ui::SimpleMenuModel::Delegate, |
- public views::ButtonListener { |
- public: |
- explicit NotificationControlView(BalloonViewImpl* view) |
- : balloon_view_(view), |
- close_button_(NULL), |
- options_menu_contents_(NULL), |
- options_menu_button_(NULL) { |
- // TODO(oshima): make background transparent. |
- set_background(views::Background::CreateSolidBackground(SK_ColorWHITE)); |
- |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- |
- SkBitmap* close_button_n = rb.GetBitmapNamed(IDR_TAB_CLOSE); |
- SkBitmap* close_button_m = rb.GetBitmapNamed(IDR_TAB_CLOSE_MASK); |
- SkBitmap* close_button_h = rb.GetBitmapNamed(IDR_TAB_CLOSE_H); |
- SkBitmap* close_button_p = rb.GetBitmapNamed(IDR_TAB_CLOSE_P); |
- |
- close_button_ = new views::ImageButton(this); |
- close_button_->SetImage(views::CustomButton::BS_NORMAL, close_button_n); |
- close_button_->SetImage(views::CustomButton::BS_HOT, close_button_h); |
- close_button_->SetImage(views::CustomButton::BS_PUSHED, close_button_p); |
- close_button_->SetBackground( |
- SK_ColorBLACK, close_button_n, close_button_m); |
- |
- AddChildView(close_button_); |
- |
- options_menu_button_ = new views::MenuButton( |
- NULL, string16(), this, false); |
- options_menu_button_->SetFont(rb.GetFont(ResourceBundle::SmallFont)); |
- options_menu_button_->SetIcon(*rb.GetBitmapNamed(IDR_NOTIFICATION_MENU)); |
- options_menu_button_->set_border(NULL); |
- |
- options_menu_button_->set_icon_placement(views::TextButton::ICON_ON_RIGHT); |
- AddChildView(options_menu_button_); |
- |
- // The control view will never be resized, so just layout once. |
- gfx::Size options_size = options_menu_button_->GetPreferredSize(); |
- gfx::Size button_size = close_button_->GetPreferredSize(); |
- |
- int height = std::max(options_size.height(), button_size.height()); |
- options_menu_button_->SetBounds( |
- 0, (height - options_size.height()) / 2, |
- options_size.width(), options_size.height()); |
- |
- close_button_->SetBounds( |
- options_size.width() + kControlButtonsMargin, |
- (height - button_size.height()) / 2, |
- button_size.width(), button_size.height()); |
- |
- SizeToPreferredSize(); |
- } |
- |
- virtual gfx::Size GetPreferredSize() { |
- gfx::Rect total_bounds = |
- close_button_->bounds().Union(options_menu_button_->bounds()); |
- return total_bounds.size(); |
- } |
- |
- // Overridden from views::MenuButtonListener: |
- virtual void OnMenuButtonClicked(views::View* source, |
- const gfx::Point& point) OVERRIDE { |
- CreateOptionsMenu(); |
- |
- views::MenuModelAdapter menu_model_adapter(options_menu_contents_.get()); |
- menu_runner_.reset(new views::MenuRunner(menu_model_adapter.CreateMenu())); |
- |
- gfx::Point screen_location; |
- views::View::ConvertPointToScreen(options_menu_button_, &screen_location); |
- if (menu_runner_->RunMenuAt( |
- source->GetWidget()->GetTopLevelWidget(), options_menu_button_, |
- gfx::Rect(screen_location, options_menu_button_->size()), |
- views::MenuItemView::TOPRIGHT, views::MenuRunner::HAS_MNEMONICS) == |
- views::MenuRunner::MENU_DELETED) |
- return; |
- } |
- |
- // views::ButtonListener implements. |
- virtual void ButtonPressed(views::Button* sender, const views::Event&) { |
- balloon_view_->Close(true); |
- } |
- |
- // ui::SimpleMenuModel::Delegate impglements. |
- virtual bool IsCommandIdChecked(int /* command_id */) const { |
- // Nothing in the menu is checked. |
- return false; |
- } |
- |
- virtual bool IsCommandIdEnabled(int /* command_id */) const { |
- // All the menu options are always enabled. |
- return true; |
- } |
- |
- virtual bool GetAcceleratorForCommandId( |
- int /* command_id */, ui::Accelerator* /* accelerator */) { |
- // Currently no accelerators. |
- return false; |
- } |
- |
- virtual void ExecuteCommand(int command_id) { |
- switch (command_id) { |
- case kRevokePermissionCommand: |
- balloon_view_->DenyPermission(); |
- default: |
- NOTIMPLEMENTED(); |
- } |
- } |
- |
- private: |
- void CreateOptionsMenu() { |
- if (options_menu_contents_.get()) |
- return; |
- const string16 source_label_text = l10n_util::GetStringFUTF16( |
- IDS_NOTIFICATION_BALLOON_SOURCE_LABEL, |
- balloon_view_->balloon_->notification().display_source()); |
- const string16 label_text = l10n_util::GetStringFUTF16( |
- IDS_NOTIFICATION_BALLOON_REVOKE_MESSAGE, |
- balloon_view_->balloon_->notification().display_source()); |
- |
- options_menu_contents_.reset(new ui::SimpleMenuModel(this)); |
- // TODO(oshima): Showing the source info in the menu for now. |
- // Figure out where to show the source info. |
- options_menu_contents_->AddItem(kNoopCommand, source_label_text); |
- options_menu_contents_->AddItem(kRevokePermissionCommand, label_text); |
- } |
- |
- BalloonViewImpl* balloon_view_; |
- |
- views::ImageButton* close_button_; |
- |
- // The options menu. |
- scoped_ptr<ui::SimpleMenuModel> options_menu_contents_; |
- scoped_ptr<views::MenuRunner> menu_runner_; |
- views::MenuButton* options_menu_button_; |
- |
- DISALLOW_COPY_AND_ASSIGN(NotificationControlView); |
-}; |
- |
-BalloonViewImpl::BalloonViewImpl(bool sticky, bool controls, bool web_ui) |
- : balloon_(NULL), |
- html_contents_(NULL), |
- stale_(false), |
- sticky_(sticky), |
- controls_(controls), |
- closed_(false), |
- web_ui_(web_ui) { |
- // This object is not to be deleted by the views hierarchy, |
- // as it is owned by the balloon. |
- set_parent_owned(false); |
-} |
- |
-BalloonViewImpl::~BalloonViewImpl() { |
- if (control_view_host_.get()) { |
- control_view_host_->CloseNow(); |
- } |
- if (html_contents_.get()) { |
- html_contents_->Shutdown(); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BallonViewImpl, BalloonView implementation. |
- |
-void BalloonViewImpl::Show(Balloon* balloon) { |
- balloon_ = balloon; |
- html_contents_.reset(new BalloonViewHost(balloon)); |
- if (web_ui_) |
- html_contents_->EnableWebUI(); |
- AddChildView(html_contents_->view()); |
- notification_registrar_.Add(this, |
- chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED, |
- content::Source<Balloon>(balloon)); |
-} |
- |
-void BalloonViewImpl::Update() { |
- stale_ = false; |
- if (!html_contents_->web_contents()) |
- return; |
- html_contents_->web_contents()->GetController().LoadURL( |
- balloon_->notification().content_url(), content::Referrer(), |
- content::PAGE_TRANSITION_LINK, std::string()); |
-} |
- |
-void BalloonViewImpl::Close(bool by_user) { |
- closed_ = true; |
- MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&BalloonViewImpl::DelayedClose, AsWeakPtr(), by_user)); |
-} |
- |
-gfx::Size BalloonViewImpl::GetSize() const { |
- // Not used. The layout is managed by the Panel. |
- return gfx::Size(0, 0); |
-} |
- |
-BalloonHost* BalloonViewImpl::GetHost() const { |
- return html_contents_.get(); |
-} |
- |
-void BalloonViewImpl::RepositionToBalloon() { |
- // Not used. The layout is managed by the Panel. |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// views::View interface overrides. |
- |
-void BalloonViewImpl::Layout() { |
- gfx::Size size = balloon_->content_size(); |
- |
- SetBounds(x(), y(), size.width(), size.height()); |
- |
- html_contents_->view()->SetBounds(0, 0, size.width(), size.height()); |
- if (html_contents_->web_contents()) { |
- RenderWidgetHostView* view = |
- html_contents_->web_contents()->GetRenderViewHost()->GetView(); |
- if (view) |
- view->SetSize(size); |
- } |
-} |
- |
-void BalloonViewImpl::ViewHierarchyChanged( |
- bool is_add, View* parent, View* child) { |
- if (is_add && GetWidget() && !control_view_host_.get() && controls_) { |
- control_view_host_.reset(new views::Widget); |
- views::Widget::InitParams params( |
- views::Widget::InitParams::TYPE_CONTROL); |
- params.double_buffer = true; |
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
- params.parent = GetParentNativeView(); |
- control_view_host_->Init(params); |
- NotificationControlView* control = new NotificationControlView(this); |
- control_view_host_->SetContentsView(control); |
- } |
- if (!is_add && this == child && control_view_host_.get() && controls_) |
- control_view_host_.release()->CloseNow(); |
-} |
- |
-gfx::Size BalloonViewImpl::GetPreferredSize() { |
- return gfx::Size(1000, 1000); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// content::NotificationObserver overrides. |
- |
-void BalloonViewImpl::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (type != chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED) { |
- NOTREACHED(); |
- return; |
- } |
- |
- // If the renderer process attached to this balloon is disconnected |
- // (e.g., because of a crash), we want to close the balloon. |
- notification_registrar_.Remove(this, |
- chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED, |
- content::Source<Balloon>(balloon_)); |
- Close(false); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BalloonViewImpl public. |
- |
-bool BalloonViewImpl::IsFor(const Notification& notification) const { |
- return balloon_->notification().notification_id() == |
- notification.notification_id(); |
-} |
- |
-void BalloonViewImpl::Activated() { |
- if (!control_view_host_.get()) |
- return; |
- |
- // Get the size of Control View. |
- gfx::Size size = |
- control_view_host_->GetRootView()->child_at(0)->GetPreferredSize(); |
- control_view_host_->Show(); |
- control_view_host_->SetBounds( |
- gfx::Rect(width() - size.width() - kControlViewRightMargin, |
- kControlViewTopMargin, |
- size.width(), size.height())); |
-} |
- |
-void BalloonViewImpl::Deactivated() { |
- if (control_view_host_.get()) { |
- control_view_host_->Hide(); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// BalloonViewImpl private. |
- |
-void BalloonViewImpl::DelayedClose(bool by_user) { |
- html_contents_->Shutdown(); |
- html_contents_.reset(); |
- balloon_->OnClose(by_user); |
-} |
- |
-void BalloonViewImpl::DenyPermission() { |
- DesktopNotificationService* service = |
- DesktopNotificationServiceFactory::GetForProfile(balloon_->profile()); |
- service->DenyPermission(balloon_->notification().origin_url()); |
-} |
- |
-gfx::NativeView BalloonViewImpl::GetParentNativeView() { |
- RenderWidgetHostView* view = |
- html_contents_->web_contents()->GetRenderViewHost()->GetView(); |
- DCHECK(view); |
- return view->GetNativeView(); |
-} |
- |
-} // namespace chromeos |