// 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 "ui/message_center/base_format_view.h" #include "base/i18n/time_formatting.h" #include "grit/ui_resources.h" #include "ui/base/resource/resource_bundle.h" #include "ui/views/controls/button/image_button.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/layout/grid_layout.h" namespace message_center { const SkColor kNotificationColor = SkColorSetRGB(0xfe, 0xfe, 0xfe); const SkColor kNotificationReadColor = SkColorSetRGB(0xfa, 0xfa, 0xfa); const int kBaseFormatPrimaryIconWidth = 64; const int kBaseFormatSecondaryIconWidth = 16; const int kBaseFormatTimestampWidth = 60; const int kBaseFormatButtonWidth = 60; const int kBaseFormatPaddingBetweenItems = 10; const int kBaseFormatOuterHorizontalPadding = 18; BaseFormatView::BaseFormatView( NotificationList::Delegate* list_delegate, const NotificationList::Notification& notification) : MessageView(list_delegate, notification), button_one_(NULL), button_two_(NULL) { } BaseFormatView::~BaseFormatView() { } void BaseFormatView::SetUpView() { DCHECK(close_button_); SkColor bg_color = notification_.is_read ? kNotificationReadColor : kNotificationColor; set_background(views::Background::CreateSolidBackground(bg_color)); views::ImageView* icon = new views::ImageView; icon->SetImageSize( gfx::Size(kBaseFormatPrimaryIconWidth, kBaseFormatPrimaryIconWidth)); icon->SetImage(notification_.image); views::ImageView* second_icon = new views::ImageView; second_icon->SetImageSize( gfx::Size(kBaseFormatSecondaryIconWidth, kBaseFormatSecondaryIconWidth)); // TODO: set up second image second_icon->SetImage(notification_.image); views::Label* title = new views::Label(notification_.title); title->SetHorizontalAlignment(gfx::ALIGN_LEFT); title->SetFont(title->font().DeriveFont(0, gfx::Font::BOLD)); views::Label* message = new views::Label(notification_.message); message->SetHorizontalAlignment(gfx::ALIGN_LEFT); message->SetMultiLine(true); message->SetElideBehavior(views::Label::ELIDE_AT_END); message->SizeToFit( kBaseFormatButtonWidth * 2 + kBaseFormatPaddingBetweenItems * 3 + kBaseFormatTimestampWidth); views::Label* timestamp = NULL; if (notification_.timestamp != base::Time()) { timestamp = new views::Label( base::TimeFormatTimeOfDay(notification_.timestamp)); timestamp->SetHorizontalAlignment(gfx::ALIGN_RIGHT); } // TODO(miket): unreadCount if (notification_.button_one_title.length() != 0) { button_one_ = new views::LabelButton( this, notification_.button_one_title); button_one_->SetHorizontalAlignment(gfx::ALIGN_CENTER); button_one_->SetNativeTheme(true); } if (button_one_ && notification_.button_two_title.length() != 0) { button_two_ = new views::LabelButton( this, notification_.button_two_title); button_two_->SetHorizontalAlignment(gfx::ALIGN_CENTER); button_two_->SetNativeTheme(true); } views::Label* expanded_message = new views::Label( notification_.expanded_message); expanded_message->SetHorizontalAlignment(gfx::ALIGN_LEFT); expanded_message->SetMultiLine(true); expanded_message->SizeToFit( kBaseFormatButtonWidth * 2 + kBaseFormatPaddingBetweenItems); // TODO(miket): Image thumbnail for image-type notifications (imageUrl) views::GridLayout* layout = new views::GridLayout(this); SetLayoutManager(layout); views::ColumnSet* columns = layout->AddColumnSet(0); const int padding_width = kBaseFormatOuterHorizontalPadding / 2; columns->AddPaddingColumn(0, padding_width); // Column 0: Notification Icon. columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING, 0, /* resize percent */ views::GridLayout::FIXED, kBaseFormatPrimaryIconWidth, kBaseFormatPrimaryIconWidth); columns->AddPaddingColumn(0, kBaseFormatPaddingBetweenItems); // Column 1: Notification message text and first button. columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 100, /* resize percent */ views::GridLayout::USE_PREF, kBaseFormatButtonWidth, kBaseFormatButtonWidth); columns->AddPaddingColumn(0, kBaseFormatPaddingBetweenItems); // Column 2: Notification message text and second button. columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 100, /* resize percent */ views::GridLayout::USE_PREF, kBaseFormatButtonWidth, kBaseFormatButtonWidth); columns->AddPaddingColumn(0, kBaseFormatPaddingBetweenItems); // Column 3: Notification message text and timestamp. columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0, /* resize percent */ views::GridLayout::FIXED, kBaseFormatTimestampWidth, kBaseFormatTimestampWidth); columns->AddPaddingColumn(0, kBaseFormatPaddingBetweenItems); // Column 4: Close button and secondary icon. columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::BASELINE, 0, /* resize percent */ views::GridLayout::FIXED, kBaseFormatSecondaryIconWidth, kBaseFormatSecondaryIconWidth); columns->AddPaddingColumn(0, kBaseFormatPaddingBetweenItems); // Lay out rows. // Row 0: Just timestamp and close box. layout->StartRow(0, 0); layout->SkipColumns(5); if (timestamp) layout->AddView(timestamp, 1, 1); else layout->SkipColumns(2); layout->AddView(close_button_, 1, 1); // Row 1: Big icon, title. layout->StartRow(0, 0); layout->AddView(icon, 1, 3); layout->AddView(title, 6, 1); // Row 2: Continuation of big icon, message. layout->StartRow(0, 0); layout->SkipColumns(1); layout->AddView(message, 6, 1); layout->AddPaddingRow(0, kBaseFormatPaddingBetweenItems); // Row 3: Continuation of big icon, two buttons, secondary icon. layout->StartRow(0,0); layout->SkipColumns(1); if (button_one_) { layout->AddView(button_one_, 1, 1); layout->AddView(button_two_, 1, 1); } else { layout->SkipColumns(3); // two buttons plus padding } layout->SkipColumns(1); layout->AddView(second_icon, 1, 1); layout->AddPaddingRow(0, kBaseFormatPaddingBetweenItems); // Row 4: Secondary message. layout->StartRow(0,0); layout->SkipColumns(1); layout->AddView(expanded_message, 3, 1); // A final bit of padding to make it look nice. layout->AddPaddingRow(0, kBaseFormatPaddingBetweenItems); } void BaseFormatView::ButtonPressed(views::Button* sender, const ui::Event& event) { // TODO(miket): consider changing the _one, _two etc. widgets to an array or // map so that we can move this behavior to the superclass. It seems like // something we wouldn't want to keep recoding for each subclass. if (sender == button_one_) { list_delegate_->OnButtonClicked(notification_.id, 0); } else if (sender == button_two_) { list_delegate_->OnButtonClicked(notification_.id, 1); } else { MessageView::ButtonPressed(sender, event); } } } // namespace message_center