diff options
Diffstat (limited to 'chromium/ui/message_center/views/message_view.cc')
-rw-r--r-- | chromium/ui/message_center/views/message_view.cc | 209 |
1 files changed, 63 insertions, 146 deletions
diff --git a/chromium/ui/message_center/views/message_view.cc b/chromium/ui/message_center/views/message_view.cc index ccf1074b2e6..11ff5485f86 100644 --- a/chromium/ui/message_center/views/message_view.cc +++ b/chromium/ui/message_center/views/message_view.cc @@ -6,7 +6,7 @@ #include "grit/ui_resources.h" #include "grit/ui_strings.h" -#include "ui/base/accessibility/accessible_view_state.h" +#include "ui/accessibility/ax_view_state.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/simple_menu_model.h" #include "ui/base/resource/resource_bundle.h" @@ -14,15 +14,14 @@ #include "ui/gfx/canvas.h" #include "ui/message_center/message_center.h" #include "ui/message_center/message_center_style.h" -#include "ui/message_center/message_center_util.h" #include "ui/message_center/views/padded_button.h" -#include "ui/views/context_menu_controller.h" +#include "ui/views/background.h" #include "ui/views/controls/button/image_button.h" -#include "ui/views/controls/menu/menu_runner.h" +#include "ui/views/controls/image_view.h" #include "ui/views/controls/scroll_view.h" +#include "ui/views/focus/focus_manager.h" #include "ui/views/painter.h" #include "ui/views/shadow_border.h" -#include "ui/views/widget/widget.h" namespace { @@ -32,161 +31,48 @@ const int kCloseIconRightPadding = 5; const int kShadowOffset = 1; const int kShadowBlur = 4; -// Menu constants -const int kTogglePermissionCommand = 0; -const int kShowSettingsCommand = 1; - -// A dropdown menu for notifications. -class MenuModel : public ui::SimpleMenuModel, - public ui::SimpleMenuModel::Delegate { - public: - MenuModel(message_center::MessageViewController* controller, - message_center::NotifierId notifier_id, - const string16& display_source); - virtual ~MenuModel(); - - // Overridden from ui::SimpleMenuModel::Delegate: - virtual bool IsItemForCommandIdDynamic(int command_id) const OVERRIDE; - virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; - virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; - virtual bool GetAcceleratorForCommandId( - int command_id, - ui::Accelerator* accelerator) OVERRIDE; - virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; - - private: - message_center::MessageViewController* controller_; - message_center::NotifierId notifier_id_; - DISALLOW_COPY_AND_ASSIGN(MenuModel); -}; - -MenuModel::MenuModel(message_center::MessageViewController* controller, - message_center::NotifierId notifier_id, - const string16& display_source) - : ui::SimpleMenuModel(this), - controller_(controller), - notifier_id_(notifier_id) { - // Add 'disable notifications' menu item. - if (!display_source.empty()) { - AddItem(kTogglePermissionCommand, - l10n_util::GetStringFUTF16(IDS_MESSAGE_CENTER_NOTIFIER_DISABLE, - display_source)); - } - // Add settings menu item. - AddItem(kShowSettingsCommand, - l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS)); -} - -MenuModel::~MenuModel() { -} - -bool MenuModel::IsItemForCommandIdDynamic(int command_id) const { - return false; -} - -bool MenuModel::IsCommandIdChecked(int command_id) const { - return false; -} - -bool MenuModel::IsCommandIdEnabled(int command_id) const { - return true; -} - -bool MenuModel::GetAcceleratorForCommandId(int command_id, - ui::Accelerator* accelerator) { - return false; -} - -void MenuModel::ExecuteCommand(int command_id, int event_flags) { - switch (command_id) { - case kTogglePermissionCommand: - controller_->DisableNotificationsFromThisSource(notifier_id_); - break; - case kShowSettingsCommand: - controller_->ShowNotifierSettingsBubble(); - break; - default: - NOTREACHED(); - } -} - } // namespace namespace message_center { -class MessageViewContextMenuController : public views::ContextMenuController { - public: - MessageViewContextMenuController(MessageViewController* controller, - const NotifierId& notifier_id, - const string16& display_source); - virtual ~MessageViewContextMenuController(); - - protected: - // Overridden from views::ContextMenuController: - virtual void ShowContextMenuForView(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) OVERRIDE; - - MessageViewController* controller_; // Weak, owns us. - NotifierId notifier_id_; - string16 display_source_; -}; - -MessageViewContextMenuController::MessageViewContextMenuController( - MessageViewController* controller, - const NotifierId& notifier_id, - const string16& display_source) - : controller_(controller), - notifier_id_(notifier_id), - display_source_(display_source) { -} - -MessageViewContextMenuController::~MessageViewContextMenuController() { -} - -void MessageViewContextMenuController::ShowContextMenuForView( - views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) { - MenuModel menu_model(controller_, notifier_id_, display_source_); - if (menu_model.GetItemCount() == 0) - return; - - views::MenuRunner menu_runner(&menu_model); - - ignore_result(menu_runner.RunMenuAt( - source->GetWidget()->GetTopLevelWidget(), - NULL, - gfx::Rect(point, gfx::Size()), - views::MenuItemView::TOPRIGHT, - source_type, - views::MenuRunner::HAS_MNEMONICS)); -} - MessageView::MessageView(MessageViewController* controller, const std::string& notification_id, const NotifierId& notifier_id, - const string16& display_source) + const gfx::ImageSkia& small_image, + const base::string16& display_source) : controller_(controller), notification_id_(notification_id), notifier_id_(notifier_id), - context_menu_controller_( - new MessageViewContextMenuController(controller, - notifier_id, - display_source)), - scroller_(NULL) { + background_view_(NULL), + scroller_(NULL), + display_source_(display_source) { SetFocusable(true); - set_context_menu_controller(context_menu_controller_.get()); + + // Create the opaque background that's above the view's shadow. + background_view_ = new views::View(); + background_view_->set_background( + views::Background::CreateSolidBackground(kNotificationBackgroundColor)); + AddChildView(background_view_); + + views::ImageView* small_image_view = new views::ImageView(); + small_image_view->SetImage(small_image); + small_image_view->SetImageSize(gfx::Size(kSmallImageSize, kSmallImageSize)); + // The small image view should be added to view hierarchy by the derived + // class. This ensures that it is on top of other views. + small_image_view->set_owned_by_client(); + small_image_view_.reset(small_image_view); PaddedButton *close = new PaddedButton(this); close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding); close->SetNormalImage(IDR_NOTIFICATION_CLOSE); close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER); close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED); - close->set_owned_by_client(); close->set_animate_on_state_change(false); close->SetAccessibleName(l10n_util::GetStringUTF16( IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); + // The close button should be added to view hierarchy by the derived class. + // This ensures that it is on top of other views. + close->set_owned_by_client(); close_button_.reset(close); focus_painter_ = views::Painter::CreateSolidFocusPainter( @@ -197,6 +83,11 @@ MessageView::MessageView(MessageViewController* controller, MessageView::~MessageView() { } +void MessageView::UpdateWithNotification(const Notification& notification) { + small_image_view_->SetImage(notification.small_image().AsImageSkia()); + display_source_ = notification.display_source(); +} + // static gfx::Insets MessageView::GetShadowInsets() { return gfx::Insets(kShadowBlur / 2 - kShadowOffset, @@ -206,10 +97,11 @@ gfx::Insets MessageView::GetShadowInsets() { } void MessageView::CreateShadowBorder() { - set_border(new views::ShadowBorder(kShadowBlur, - message_center::kShadowColor, - kShadowOffset, // Vertical offset. - 0)); // Horizontal offset. + SetBorder(scoped_ptr<views::Border>( + new views::ShadowBorder(kShadowBlur, + message_center::kShadowColor, + kShadowOffset, // Vertical offset. + 0))); // Horizontal offset. } bool MessageView::IsCloseButtonFocused() { @@ -221,8 +113,8 @@ void MessageView::RequestFocusOnCloseButton() { close_button_->RequestFocus(); } -void MessageView::GetAccessibleState(ui::AccessibleViewState* state) { - state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; +void MessageView::GetAccessibleState(ui::AXViewState* state) { + state->role = ui::AX_ROLE_BUTTON; state->name = accessible_name_; } @@ -261,6 +153,8 @@ bool MessageView::OnKeyReleased(const ui::KeyEvent& event) { } void MessageView::OnPaint(gfx::Canvas* canvas) { + DCHECK_EQ(this, close_button_->parent()); + DCHECK_EQ(this, small_image_view_->parent()); SlideOutView::OnPaint(canvas); views::Painter::PaintFocusPainter(this, canvas, focus_painter_.get()); } @@ -277,6 +171,29 @@ void MessageView::OnBlur() { SchedulePaint(); } +void MessageView::Layout() { + gfx::Rect content_bounds = GetContentsBounds(); + + // Background. + background_view_->SetBoundsRect(content_bounds); + + // Close button. + gfx::Size close_size(close_button_->GetPreferredSize()); + gfx::Rect close_rect(content_bounds.right() - close_size.width(), + content_bounds.y(), + close_size.width(), + close_size.height()); + close_button_->SetBoundsRect(close_rect); + + gfx::Size small_image_size(small_image_view_->GetPreferredSize()); + gfx::Rect small_image_rect(small_image_size); + small_image_rect.set_origin(gfx::Point( + content_bounds.right() - small_image_size.width() - kSmallImagePadding, + content_bounds.bottom() - small_image_size.height() - + kSmallImagePadding)); + small_image_view_->SetBoundsRect(small_image_rect); +} + void MessageView::OnGestureEvent(ui::GestureEvent* event) { if (event->type() == ui::ET_GESTURE_TAP) { controller_->ClickOnNotification(notification_id_); |