Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(551)

Side by Side Diff: chrome/browser/infobars/infobar_container.h

Issue 22694006: Infobar system refactor. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/infobars/infobar.cc ('k') | chrome/browser/infobars/infobar_container.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_ 5 #ifndef CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_
6 #define CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_ 6 #define CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "content/public/browser/notification_observer.h" 12 #include "content/public/browser/notification_observer.h"
13 #include "content/public/browser/notification_registrar.h" 13 #include "content/public/browser/notification_registrar.h"
14 #include "third_party/skia/include/core/SkColor.h" 14 #include "third_party/skia/include/core/SkColor.h"
15 15
16 class InfoBar; 16 class InfoBar;
17 class InfoBarDelegate;
18 class InfoBarService; 17 class InfoBarService;
19 18
20 // InfoBarContainer is a cross-platform base class to handle the visibility- 19 // InfoBarContainer is a cross-platform base class to handle the visibility-
21 // related aspects of InfoBars. While InfoBars own themselves, the 20 // related aspects of InfoBars. While InfoBarService owns the InfoBars, the
22 // InfoBarContainer is responsible for telling particular InfoBars that they 21 // InfoBarContainer is responsible for telling particular InfoBars that they
23 // should be hidden or visible. 22 // should be hidden or visible.
24 // 23 //
25 // Platforms need to subclass this to implement a few platform-specific 24 // Platforms need to subclass this to implement a few platform-specific
26 // functions, which are pure virtual here. 25 // functions, which are pure virtual here.
27 class InfoBarContainer : public content::NotificationObserver { 26 class InfoBarContainer : public content::NotificationObserver {
28 public: 27 public:
29 class Delegate { 28 class Delegate {
30 public: 29 public:
31 // The separator color may vary depending on where the container is hosted. 30 // The separator color may vary depending on where the container is hosted.
32 virtual SkColor GetInfoBarSeparatorColor() const = 0; 31 virtual SkColor GetInfoBarSeparatorColor() const = 0;
33 32
34 // The delegate is notified each time the infobar container changes height, 33 // The delegate is notified each time the infobar container changes height,
35 // as well as when it stops animating. 34 // as well as when it stops animating.
36 virtual void InfoBarContainerStateChanged(bool is_animating) = 0; 35 virtual void InfoBarContainerStateChanged(bool is_animating) = 0;
37 36
38 // The delegate needs to tell us whether "unspoofable" arrows should be 37 // The delegate needs to tell us whether "unspoofable" arrows should be
39 // drawn, and if so, at what |x| coordinate. |x| may be NULL. 38 // drawn, and if so, at what |x| coordinate. |x| may be NULL.
40 virtual bool DrawInfoBarArrows(int* x) const = 0; 39 virtual bool DrawInfoBarArrows(int* x) const = 0;
41 40
42 protected: 41 protected:
43 virtual ~Delegate(); 42 virtual ~Delegate();
44 }; 43 };
45 44
46 explicit InfoBarContainer(Delegate* delegate); 45 explicit InfoBarContainer(Delegate* delegate);
47 virtual ~InfoBarContainer(); 46 virtual ~InfoBarContainer();
48 47
49 // Changes the InfoBarService for which this container is showing infobars. 48 // Changes the InfoBarService for which this container is showing infobars.
50 // This will remove all current infobars from the container, add the infobars 49 // This will hide all current infobars, remove them from the container, add
51 // from |infobar_service|, and show them all. |infobar_service| may be NULL. 50 // the infobars from |infobar_service|, and show them all. |infobar_service|
51 // may be NULL.
52 void ChangeInfoBarService(InfoBarService* infobar_service); 52 void ChangeInfoBarService(InfoBarService* infobar_service);
53 53
54 // Returns the amount by which to overlap the toolbar above, and, when 54 // Returns the amount by which to overlap the toolbar above, and, when
55 // |total_height| is non-NULL, set it to the height of the InfoBarContainer 55 // |total_height| is non-NULL, set it to the height of the InfoBarContainer
56 // (including overlap). 56 // (including overlap).
57 int GetVerticalOverlap(int* total_height); 57 int GetVerticalOverlap(int* total_height);
58 58
59 // Called by the delegate when the distance between what the top infobar's 59 // Called by the delegate when the distance between what the top infobar's
60 // "unspoofable" arrow would point to and the top infobar itself changes. 60 // "unspoofable" arrow would point to and the top infobar itself changes.
61 // This enables the top infobar to show a longer arrow (e.g. because of a 61 // This enables the top infobar to show a longer arrow (e.g. because of a
62 // visible bookmark bar) or shorter (e.g. due to being in a popup window) if 62 // visible bookmark bar) or shorter (e.g. due to being in a popup window) if
63 // desired. 63 // desired.
64 // 64 //
65 // IMPORTANT: This MUST NOT result in a call back to 65 // IMPORTANT: This MUST NOT result in a call back to
66 // Delegate::InfoBarContainerStateChanged() unless it causes an actual 66 // Delegate::InfoBarContainerStateChanged() unless it causes an actual
67 // change, lest we infinitely recurse. 67 // change, lest we infinitely recurse.
68 void SetMaxTopArrowHeight(int height); 68 void SetMaxTopArrowHeight(int height);
69 69
70 // Called when a contained infobar has animated or by some other means changed 70 // Called when a contained infobar has animated or by some other means changed
71 // its height, or when it stops animating. The container is expected to do 71 // its height, or when it stops animating. The container is expected to do
72 // anything necessary to respond, e.g. re-layout. 72 // anything necessary to respond, e.g. re-layout.
73 void OnInfoBarStateChanged(bool is_animating); 73 void OnInfoBarStateChanged(bool is_animating);
74 74
75 // Called by |infobar| to request that it be removed from the container. At 75 // Called by |infobar| to request that it be removed from the container. At
76 // this point, |infobar| should already be hidden. Once the infobar is 76 // this point, |infobar| should already be hidden.
77 // removed, it is guaranteed to delete itself and will not be re-added again.
78 void RemoveInfoBar(InfoBar* infobar); 77 void RemoveInfoBar(InfoBar* infobar);
79 78
80 const Delegate* delegate() const { return delegate_; } 79 const Delegate* delegate() const { return delegate_; }
81 80
82 protected: 81 protected:
83 // Subclasses must call this during destruction, so that we can remove 82 // Subclasses must call this during destruction, so that we can remove
84 // infobars (which will call the pure virtual functions below) while the 83 // infobars (which will call the pure virtual functions below) while the
85 // subclass portion of |this| has not yet been destroyed. 84 // subclass portion of |this| has not yet been destroyed.
86 void RemoveAllInfoBarsForDestruction(); 85 void RemoveAllInfoBarsForDestruction();
87 86
(...skipping 12 matching lines...) Expand all
100 virtual void PlatformSpecificInfoBarStateChanged(bool is_animating) {} 99 virtual void PlatformSpecificInfoBarStateChanged(bool is_animating) {}
101 100
102 private: 101 private:
103 typedef std::vector<InfoBar*> InfoBars; 102 typedef std::vector<InfoBar*> InfoBars;
104 103
105 // content::NotificationObserver: 104 // content::NotificationObserver:
106 virtual void Observe(int type, 105 virtual void Observe(int type,
107 const content::NotificationSource& source, 106 const content::NotificationSource& source,
108 const content::NotificationDetails& details) OVERRIDE; 107 const content::NotificationDetails& details) OVERRIDE;
109 108
110 // Hides an InfoBar for the specified delegate, in response to a notification
111 // from the selected InfoBarService. The InfoBar's disappearance will be
112 // animated if |use_animation| is true. The InfoBar will call back to
113 // RemoveInfoBar() to remove itself once it's hidden (which may mean
114 // synchronously). Returns the position within |infobars_| the infobar was
115 // previously at.
116 size_t HideInfoBar(InfoBar* infobar, bool use_animation);
117
118 // Find an existing infobar in the container.
119 InfoBar* FindInfoBar(InfoBarDelegate* delegate);
120
121 // Hides all infobars in this container without animation. 109 // Hides all infobars in this container without animation.
122 void HideAllInfoBars(); 110 void HideAllInfoBars();
123 111
124 // Adds |infobar| to this container before the existing infobar at position 112 // Adds |infobar| to this container before the existing infobar at position
125 // |position| and calls Show() on it. |animate| is passed along to 113 // |position| and calls Show() on it. |animate| is passed along to
126 // infobar->Show(). Depending on the value of |callback_status|, this calls 114 // infobar->Show(). Depending on the value of |callback_status|, this calls
127 // infobar->set_container(this) either before or after the call to Show() so 115 // infobar->set_container(this) either before or after the call to Show() so
128 // that OnInfoBarStateChanged() either will or won't be called as a result. 116 // that OnInfoBarStateChanged() either will or won't be called as a result.
129 //
130 // This should be called only once for an infobar -- once it's added, it can
131 // be repeatedly shown and hidden, but not removed and then re-added (see
132 // comments on RemoveInfoBar()).
133 enum CallbackStatus { NO_CALLBACK, WANT_CALLBACK }; 117 enum CallbackStatus { NO_CALLBACK, WANT_CALLBACK };
134 void AddInfoBar(InfoBar* infobar, 118 void AddInfoBar(InfoBar* infobar,
135 size_t position, 119 size_t position,
136 bool animate, 120 bool animate,
137 CallbackStatus callback_status); 121 CallbackStatus callback_status);
138 122
139 void UpdateInfoBarArrowTargetHeights(); 123 void UpdateInfoBarArrowTargetHeights();
140 int ArrowTargetHeightForInfoBar(size_t infobar_index) const; 124 int ArrowTargetHeightForInfoBar(size_t infobar_index) const;
141 125
142 content::NotificationRegistrar registrar_; 126 content::NotificationRegistrar registrar_;
143 Delegate* delegate_; 127 Delegate* delegate_;
144 InfoBarService* infobar_service_; 128 InfoBarService* infobar_service_;
145 InfoBars infobars_; 129 InfoBars infobars_;
146 130
147 // Calculated in SetMaxTopArrowHeight(). 131 // Calculated in SetMaxTopArrowHeight().
148 int top_arrow_target_height_; 132 int top_arrow_target_height_;
149 133
150 DISALLOW_COPY_AND_ASSIGN(InfoBarContainer); 134 DISALLOW_COPY_AND_ASSIGN(InfoBarContainer);
151 }; 135 };
152 136
153 #endif // CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_ 137 #endif // CHROME_BROWSER_INFOBARS_INFOBAR_CONTAINER_H_
OLDNEW
« no previous file with comments | « chrome/browser/infobars/infobar.cc ('k') | chrome/browser/infobars/infobar_container.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698