| // Copyright 2013 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 "ui/message_center/views/notification_button.h" |
| |
| #include "ui/gfx/canvas.h" |
| #include "ui/message_center/message_center_style.h" |
| #include "ui/message_center/views/constants.h" |
| #include "ui/views/background.h" |
| #include "ui/views/border.h" |
| #include "ui/views/controls/image_view.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/painter.h" |
| |
| namespace message_center { |
| |
| NotificationButton::NotificationButton(views::ButtonListener* listener) |
| : views::CustomButton(listener), |
| icon_(NULL), |
| title_(NULL), |
| focus_painter_(views::Painter::CreateSolidFocusPainter( |
| message_center::kFocusBorderColor, |
| gfx::Insets(1, 2, 2, 2))) { |
| SetFocusBehavior(FocusBehavior::ALWAYS); |
| // Create a background so that it does not change when the MessageView |
| // background changes to show touch feedback |
| set_background(views::Background::CreateSolidBackground( |
| kNotificationBackgroundColor)); |
| set_request_focus_on_press(false); |
| set_notify_enter_exit_on_child(true); |
| SetLayoutManager( |
| new views::BoxLayout(views::BoxLayout::kHorizontal, |
| message_center::kButtonHorizontalPadding, |
| kButtonVecticalPadding, |
| message_center::kButtonIconToTitlePadding)); |
| } |
| |
| NotificationButton::~NotificationButton() { |
| } |
| |
| void NotificationButton::SetIcon(const gfx::ImageSkia& image) { |
| if (icon_ != NULL) |
| delete icon_; // This removes the icon from this view's children. |
| if (image.isNull()) { |
| icon_ = NULL; |
| } else { |
| icon_ = new views::ImageView(); |
| icon_->SetImageSize(gfx::Size(message_center::kNotificationButtonIconSize, |
| message_center::kNotificationButtonIconSize)); |
| icon_->SetImage(image); |
| icon_->SetHorizontalAlignment(views::ImageView::LEADING); |
| icon_->SetVerticalAlignment(views::ImageView::LEADING); |
| icon_->SetBorder(views::Border::CreateEmptyBorder( |
| message_center::kButtonIconTopPadding, 0, 0, 0)); |
| AddChildViewAt(icon_, 0); |
| } |
| } |
| |
| void NotificationButton::SetTitle(const base::string16& title) { |
| if (title_ != NULL) |
| delete title_; // This removes the title from this view's children. |
| if (title.empty()) { |
| title_ = NULL; |
| } else { |
| title_ = new views::Label(title); |
| title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| title_->SetEnabledColor(message_center::kRegularTextColor); |
| title_->SetBackgroundColor(kRegularTextBackgroundColor); |
| title_->SetBorder( |
| views::Border::CreateEmptyBorder(kButtonTitleTopPadding, 0, 0, 0)); |
| AddChildView(title_); |
| } |
| SetAccessibleName(title); |
| } |
| |
| gfx::Size NotificationButton::GetPreferredSize() const { |
| return gfx::Size(message_center::kNotificationWidth, |
| message_center::kButtonHeight); |
| } |
| |
| int NotificationButton::GetHeightForWidth(int width) const { |
| return message_center::kButtonHeight; |
| } |
| |
| void NotificationButton::OnPaint(gfx::Canvas* canvas) { |
| CustomButton::OnPaint(canvas); |
| views::Painter::PaintFocusPainter(this, canvas, focus_painter_.get()); |
| } |
| |
| void NotificationButton::OnFocus() { |
| views::CustomButton::OnFocus(); |
| ScrollRectToVisible(GetLocalBounds()); |
| // We render differently when focused. |
| SchedulePaint(); |
| } |
| |
| void NotificationButton::OnBlur() { |
| views::CustomButton::OnBlur(); |
| // We render differently when focused. |
| SchedulePaint(); |
| } |
| |
| void NotificationButton::ViewHierarchyChanged( |
| const ViewHierarchyChangedDetails& details) { |
| // We disable view hierarchy change detection in the parent |
| // because it resets the hoverstate, which we do not want |
| // when we update the view to contain a new label or image. |
| views::View::ViewHierarchyChanged(details); |
| } |
| |
| void NotificationButton::StateChanged() { |
| if (state() == STATE_HOVERED || state() == STATE_PRESSED) { |
| set_background(views::Background::CreateSolidBackground( |
| message_center::kHoveredButtonBackgroundColor)); |
| } else { |
| set_background(views::Background::CreateSolidBackground( |
| kNotificationBackgroundColor)); |
| } |
| } |
| |
| } // namespace message_center |