OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ | 5 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ |
6 #define CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ | 6 #define CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
12 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" | 12 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" |
13 #include "chrome/browser/ui/views/tab_icon_view.h" | 13 #include "chrome/browser/ui/views/tab_icon_view.h" |
14 #include "ui/base/animation/animation_delegate.h" | |
15 #include "ui/views/controls/button/button.h" | 14 #include "ui/views/controls/button/button.h" |
16 #include "ui/views/controls/button/menu_button_listener.h" | |
17 | 15 |
18 class Extension; | 16 class Extension; |
19 class PanelBrowserView; | 17 class PanelBrowserView; |
20 class PanelSettingsMenuModel; | |
21 class SkPaint; | 18 class SkPaint; |
22 namespace gfx { | 19 namespace gfx { |
23 class Font; | 20 class Font; |
24 } | 21 } |
25 namespace ui { | 22 namespace ui { |
26 class LinearAnimation; | 23 class LinearAnimation; |
27 } | 24 } |
28 namespace views { | 25 namespace views { |
29 class ImageButton; | 26 class ImageButton; |
30 class Label; | 27 class Label; |
31 class MenuButton; | |
32 class MenuItemView; | |
33 class MenuModelAdapter; | |
34 class MenuRunner; | |
35 } | 28 } |
36 | 29 |
37 class PanelBrowserFrameView : public BrowserNonClientFrameView, | 30 class PanelBrowserFrameView : public BrowserNonClientFrameView, |
38 public views::ButtonListener, | 31 public views::ButtonListener, |
39 public views::MenuButtonListener, | 32 public TabIconView::TabIconViewModel { |
40 public TabIconView::TabIconViewModel, | |
41 public ui::AnimationDelegate { | |
42 public: | 33 public: |
43 PanelBrowserFrameView(BrowserFrame* frame, PanelBrowserView* browser_view); | 34 PanelBrowserFrameView(BrowserFrame* frame, PanelBrowserView* browser_view); |
44 virtual ~PanelBrowserFrameView(); | 35 virtual ~PanelBrowserFrameView(); |
45 | 36 |
46 void UpdateTitleBar(); | 37 void UpdateTitleBar(); |
47 void OnFocusChanged(bool focused); | |
48 | 38 |
49 // Returns the height of the entire nonclient top border, including the window | 39 // Returns the height of the entire nonclient top border, including the window |
50 // frame, any title area, and any connected client edge. | 40 // frame, any title area, and any connected client edge. |
51 int NonClientTopBorderHeight() const; | 41 int NonClientTopBorderHeight() const; |
52 | 42 |
53 // Returns the size of the non-client area, that is, the window size minus | 43 // Returns the size of the non-client area, that is, the window size minus |
54 // the size of the client area. | 44 // the size of the client area. |
55 gfx::Size NonClientAreaSize() const; | 45 gfx::Size NonClientAreaSize() const; |
56 | 46 |
57 // Returns the size of the non-client area upon which only the title icon | 47 // Returns the size of the non-client area upon which only the title icon |
(...skipping 25 matching lines...) Expand all Loading... |
83 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; | 73 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; |
84 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; | 74 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE; |
85 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; | 75 virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE; |
86 virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; | 76 virtual void OnMouseReleased(const views::MouseEvent& event) OVERRIDE; |
87 virtual void OnMouseCaptureLost() OVERRIDE; | 77 virtual void OnMouseCaptureLost() OVERRIDE; |
88 | 78 |
89 // Overridden from views::ButtonListener: | 79 // Overridden from views::ButtonListener: |
90 virtual void ButtonPressed(views::Button* sender, const views::Event& event) | 80 virtual void ButtonPressed(views::Button* sender, const views::Event& event) |
91 OVERRIDE; | 81 OVERRIDE; |
92 | 82 |
93 // Overridden from views::MenuButtonListener: | |
94 virtual void OnMenuButtonClicked(views::View* source, | |
95 const gfx::Point& point) OVERRIDE; | |
96 | |
97 // Overridden from TabIconView::TabIconViewModel: | 83 // Overridden from TabIconView::TabIconViewModel: |
98 virtual bool ShouldTabIconViewAnimate() const OVERRIDE; | 84 virtual bool ShouldTabIconViewAnimate() const OVERRIDE; |
99 virtual SkBitmap GetFaviconForTabIconView() OVERRIDE; | 85 virtual SkBitmap GetFaviconForTabIconView() OVERRIDE; |
100 | 86 |
101 // Overridden from AnimationDelegate: | |
102 virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE; | |
103 virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE; | |
104 virtual void AnimationCanceled(const ui::Animation* animation) OVERRIDE; | |
105 | |
106 private: | 87 private: |
107 friend class PanelBrowserViewTest; | 88 friend class PanelBrowserViewTest; |
108 friend class NativePanelTestingWin; | 89 friend class NativePanelTestingWin; |
109 | 90 |
110 enum PaintState { | 91 enum PaintState { |
111 NOT_PAINTED, | 92 NOT_PAINTED, |
112 PAINT_AS_INACTIVE, | 93 PAINT_AS_INACTIVE, |
113 PAINT_AS_ACTIVE, | 94 PAINT_AS_ACTIVE, |
114 PAINT_FOR_ATTENTION | 95 PAINT_FOR_ATTENTION |
115 }; | 96 }; |
116 | 97 |
117 class MouseWatcher : public MessageLoopForUI::Observer { | |
118 public: | |
119 explicit MouseWatcher(PanelBrowserFrameView* view); | |
120 virtual ~MouseWatcher(); | |
121 | |
122 virtual bool IsCursorInViewBounds() const; | |
123 | |
124 #if defined(OS_WIN) || defined(USE_AURA) | |
125 virtual base::EventStatus WillProcessEvent( | |
126 const base::NativeEvent& event) OVERRIDE; | |
127 virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; | |
128 #elif defined(TOOLKIT_GTK) | |
129 virtual void WillProcessEvent(GdkEvent* event) OVERRIDE; | |
130 virtual void DidProcessEvent(GdkEvent* event) OVERRIDE; | |
131 #endif | |
132 | |
133 private: | |
134 void HandleGlobalMouseMoveEvent(); | |
135 | |
136 PanelBrowserFrameView* view_; | |
137 bool is_mouse_within_; | |
138 | |
139 DISALLOW_COPY_AND_ASSIGN(MouseWatcher); | |
140 }; | |
141 | |
142 // Returns the thickness of the entire nonclient left, right, and bottom | 98 // Returns the thickness of the entire nonclient left, right, and bottom |
143 // borders, including both the window frame and any client edge. | 99 // borders, including both the window frame and any client edge. |
144 int NonClientBorderThickness() const; | 100 int NonClientBorderThickness() const; |
145 | 101 |
146 // Returns the width of the panel that is showing only an icon. | 102 // Returns the width of the panel that is showing only an icon. |
147 int IconOnlyWidth() const; | 103 int IconOnlyWidth() const; |
148 | 104 |
149 // Update control styles to indicate if the titlebar is active or not. | 105 // Update control styles to indicate if the titlebar is active or not. |
150 void UpdateControlStyles(PaintState paint_state); | 106 void UpdateControlStyles(PaintState paint_state); |
151 | 107 |
152 // Custom draw the frame. | 108 // Custom draw the frame. |
153 void PaintFrameBackground(gfx::Canvas* canvas); | 109 void PaintFrameBackground(gfx::Canvas* canvas); |
154 void PaintFrameEdge(gfx::Canvas* canvas); | 110 void PaintFrameEdge(gfx::Canvas* canvas); |
155 void PaintClientEdge(gfx::Canvas* canvas); | 111 void PaintClientEdge(gfx::Canvas* canvas); |
156 | 112 |
157 // Called by MouseWatcher to notify if the mouse enters or leaves the window. | |
158 void OnMouseEnterOrLeaveWindow(bool mouse_entered); | |
159 | |
160 // Retrieves the drawing metrics based on the current painting state. | 113 // Retrieves the drawing metrics based on the current painting state. |
161 SkColor GetTitleColor(PaintState paint_state) const; | 114 SkColor GetTitleColor(PaintState paint_state) const; |
162 SkBitmap* GetFrameTheme(PaintState paint_state) const; | 115 SkBitmap* GetFrameTheme(PaintState paint_state) const; |
163 | 116 |
164 // Make settings button visible if either of the conditions is met: | |
165 // 1) The panel is active, i.e. having focus. | |
166 // 2) The mouse is over the panel. | |
167 void UpdateSettingsButtonVisibility(bool active, bool cursor_in_view); | |
168 | |
169 bool UsingDefaultTheme(PaintState paint_state) const; | 117 bool UsingDefaultTheme(PaintState paint_state) const; |
170 | 118 |
171 const Extension* GetExtension() const; | |
172 | |
173 bool EnsureSettingsMenuCreated(); | |
174 | |
175 string16 GetTitleText() const; | 119 string16 GetTitleText() const; |
176 | 120 |
177 bool CanResize() const; | 121 bool CanResize() const; |
178 | 122 |
179 #ifdef UNIT_TEST | |
180 PanelSettingsMenuModel* settings_menu_model() const { | |
181 return settings_menu_model_.get(); | |
182 } | |
183 | |
184 void set_mouse_watcher(MouseWatcher* mouse_watcher) { | |
185 mouse_watcher_.reset(mouse_watcher); | |
186 } | |
187 #endif | |
188 | |
189 // The client view hosted within this non-client frame view that is | 123 // The client view hosted within this non-client frame view that is |
190 // guaranteed to be freed before the client view. | 124 // guaranteed to be freed before the client view. |
191 // (see comments about view hierarchies in non_client_view.h) | 125 // (see comments about view hierarchies in non_client_view.h) |
192 PanelBrowserView* panel_browser_view_; | 126 PanelBrowserView* panel_browser_view_; |
193 | 127 |
194 PaintState paint_state_; | 128 PaintState paint_state_; |
195 views::MenuButton* settings_button_; | |
196 views::ImageButton* close_button_; | 129 views::ImageButton* close_button_; |
197 TabIconView* title_icon_; | 130 TabIconView* title_icon_; |
198 views::Label* title_label_; | 131 views::Label* title_label_; |
199 gfx::Rect client_view_bounds_; | 132 gfx::Rect client_view_bounds_; |
200 scoped_ptr<MouseWatcher> mouse_watcher_; | |
201 scoped_ptr<PanelSettingsMenuModel> settings_menu_model_; | |
202 scoped_ptr<views::MenuModelAdapter> settings_menu_adapter_; | |
203 views::MenuItemView* settings_menu_; // Owned by |settings_menu_runner_|. | |
204 scoped_ptr<views::MenuRunner> settings_menu_runner_; | |
205 | |
206 // Used to animate the visibility change of settings button. | |
207 scoped_ptr<ui::LinearAnimation> settings_button_animator_; | |
208 gfx::Rect settings_button_full_bounds_; | |
209 gfx::Rect settings_button_zero_bounds_; | |
210 bool is_settings_button_visible_; | |
211 | |
212 // On Aura popups are displayed in panels. If this panel is not opened by an | |
213 // app, it won't have a settings button. | |
214 const bool has_settings_button_; | |
215 | 133 |
216 DISALLOW_COPY_AND_ASSIGN(PanelBrowserFrameView); | 134 DISALLOW_COPY_AND_ASSIGN(PanelBrowserFrameView); |
217 }; | 135 }; |
218 | 136 |
219 #endif // CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ | 137 #endif // CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_FRAME_VIEW_H_ |
OLD | NEW |