// 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. #ifndef UI_MESSAGE_CENTER_VIEWS_NOTIFICATION_VIEW_H_ #define UI_MESSAGE_CENTER_VIEWS_NOTIFICATION_VIEW_H_ #include #include "base/gtest_prod_util.h" #include "base/macros.h" #include "ui/message_center/message_center_export.h" #include "ui/message_center/views/message_view.h" #include "ui/views/view_targeter_delegate.h" class GURL; namespace views { class ProgressBar; } namespace message_center { class BoundedLabel; class MessageCenter; class MessageCenterController; class NotificationButton; class NotificationProgressBarBase; class NotificationView; class PaddedButton; class ProportionalImageView; // View that displays all current types of notification (web, basic, image, and // list). Future notification types may be handled by other classes, in which // case instances of those classes would be returned by the Create() factory // method below. class MESSAGE_CENTER_EXPORT NotificationView : public MessageView, public views::ViewTargeterDelegate, public MessageViewController { public: // Creates appropriate MessageViews for notifications. Those currently are // always NotificationView instances but in the future // may be instances of other classes, with the class depending on the // notification type. A notification is top level if it needs to be rendered // outside the browser window. No custom shadows are created for top level // notifications on Linux with Aura. // |controller| may be NULL, but has to be set before the view is shown. static NotificationView* Create(MessageCenterController* controller, const Notification& notification, bool top_level); ~NotificationView() override; // Overridden from views::View: gfx::Size GetPreferredSize() const override; int GetHeightForWidth(int width) const override; void Layout() override; void OnFocus() override; void ScrollRectToVisible(const gfx::Rect& rect) override; gfx::NativeCursor GetCursor(const ui::MouseEvent& event) override; // Overridden from MessageView: void UpdateWithNotification(const Notification& notification) override; void ButtonPressed(views::Button* sender, const ui::Event& event) override; bool IsCloseButtonFocused() override; void RequestFocusOnCloseButton() override; bool IsPinned() override; // Overridden from MessageViewController: void ClickOnNotification(const std::string& notification_id) override; void RemoveNotification(const std::string& notification_id, bool by_user) override; void set_controller(MessageCenterController* controller) { controller_ = controller; } protected: NotificationView(MessageCenterController* controller, const Notification& notification); private: FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, CreateOrUpdateTest); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, CreateOrUpdateTestSettingsButton); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, FormatContextMessageTest); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, SettingsButtonTest); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, TestLineLimits); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, TestIconSizing); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, TestImageSizing); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, UpdateButtonsStateTest); FRIEND_TEST_ALL_PREFIXES(NotificationViewTest, UpdateButtonCountTest); friend class NotificationViewTest; // views::ViewTargeterDelegate: views::View* TargetForRect(views::View* root, const gfx::Rect& rect) override; void CreateOrUpdateViews(const Notification& notification); void SetAccessibleName(const Notification& notification); void CreateOrUpdateTitleView(const Notification& notification); void CreateOrUpdateMessageView(const Notification& notification); void CreateOrUpdateContextMessageView(const Notification& notification); void CreateOrUpdateSettingsButtonView(const Notification& notification); void CreateOrUpdateProgressBarView(const Notification& notification); void CreateOrUpdateListItemViews(const Notification& notification); void CreateOrUpdateIconView(const Notification& notification); void CreateOrUpdateImageView(const Notification& notification); void CreateOrUpdateActionButtonViews(const Notification& notification); void CreateOrUpdateCloseButtonView(const Notification& notification); int GetMessageLineLimit(int title_lines, int width) const; int GetMessageHeight(int width, int limit) const; // Formats the context message to be displayed based on |context| // so it shows as much information as possible // given the space available in the ContextMessage section of the // notification. base::string16 FormatContextMessage(const Notification& notification) const; MessageCenterController* controller_; // Weak, lives longer then views. // Describes whether the view should display a hand pointer or not. bool clickable_; // Weak references to NotificationView descendants owned by their parents. views::View* top_view_; BoundedLabel* title_view_; BoundedLabel* message_view_; BoundedLabel* context_message_view_; views::ImageButton* settings_button_view_; std::vector item_views_; ProportionalImageView* icon_view_; views::View* bottom_view_; views::View* image_container_; ProportionalImageView* image_view_; NotificationProgressBarBase* progress_bar_view_; std::vector action_buttons_; scoped_ptr close_button_; std::vector separators_; DISALLOW_COPY_AND_ASSIGN(NotificationView); }; } // namespace message_center #endif // UI_MESSAGE_CENTER_VIEWS_NOTIFICATION_VIEW_H_