12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef UI_MESSAGE_CENTER_VIEWS_NOTIFIER_SETTINGS_VIEW_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_MESSAGE_CENTER_VIEWS_NOTIFIER_SETTINGS_VIEW_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include <set>
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/scoped_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center_export.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/notifier_settings.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/message_center/views/message_bubble_base.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/controls/button/image_button.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ui/views/controls/button/menu_button_listener.h"
170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/views/controls/image_view.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/view.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace views {
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass Label;
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass MenuButton;
23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass MenuRunner;
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace message_center {
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass NotifierGroupMenuModel;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A class to show the list of notifier extensions / URL patterns and allow
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// users to customize the settings.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MESSAGE_CENTER_EXPORT NotifierSettingsView
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : public NotifierSettingsObserver,
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      public views::View,
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      public views::ButtonListener,
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      public views::MenuButtonListener {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit NotifierSettingsView(NotifierSettingsProvider* provider);
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~NotifierSettingsView();
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsScrollable();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from NotifierSettingsDelegate:
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void UpdateIconImage(const NotifierId& notifier_id,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const gfx::Image& icon) OVERRIDE;
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual void NotifierGroupChanged() OVERRIDE;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void NotifierEnabledChanged(const NotifierId& notifier_id,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      bool enabled) OVERRIDE;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_provider(NotifierSettingsProvider* new_provider) {
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    provider_ = new_provider;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(NotifierSettingsViewTest, TestLearnMoreButton);
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  class MESSAGE_CENTER_EXPORT NotifierButton : public views::CustomButton,
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         public views::ButtonListener {
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   public:
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    NotifierButton(NotifierSettingsProvider* provider,
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   Notifier* notifier,
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   views::ButtonListener* listener);
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    virtual ~NotifierButton();
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    void UpdateIconImage(const gfx::Image& icon);
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    void SetChecked(bool checked);
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool checked() const;
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool has_learn_more() const;
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const Notifier& notifier() const;
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    void SendLearnMorePressedForTest();
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   private:
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Overridden from views::ButtonListener:
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    virtual void ButtonPressed(views::Button* button,
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                               const ui::Event& event) OVERRIDE;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool ShouldHaveLearnMoreButton() const;
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Helper function to reset the layout when the view has substantially
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // changed.
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    void GridChanged(bool has_learn_more, bool has_icon_view);
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    NotifierSettingsProvider* provider_;  // Weak.
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const scoped_ptr<Notifier> notifier_;
850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // |icon_view_| is owned by us because sometimes we don't leave it
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // in the view hierarchy.
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<views::ImageView> icon_view_;
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    views::Label* name_view_;
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    views::Checkbox* checkbox_;
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    views::ImageButton* learn_more_;
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(NotifierButton);
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  };
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Given a new list of notifiers, updates the view to reflect it.
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  void UpdateContentsView(const std::vector<Notifier*>& notifiers);
97bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::View:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool OnMouseWheel(const ui::MouseWheelEvent& event) OVERRIDE;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::ButtonListener:
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ButtonPressed(views::Button* sender,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const ui::Event& event) OVERRIDE;
1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Overridden from views::MenuButtonListener:
110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual void OnMenuButtonClicked(views::View* source,
111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                   const gfx::Point& point) OVERRIDE;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  views::ImageButton* title_arrow_;
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  views::Label* title_label_;
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  views::MenuButton* notifier_group_selector_;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ScrollView* scroller_;
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NotifierSettingsProvider* provider_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<NotifierButton*> buttons_;
119bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<NotifierGroupMenuModel> notifier_group_menu_model_;
120bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<views::MenuRunner> notifier_group_menu_runner_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NotifierSettingsView);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace message_center
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // UI_MESSAGE_CENTER_VIEWS_NOTIFIER_SETTINGS_VIEW_H_
128