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_WINDOW_GTK_H_ | 5 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_WINDOW_GTK_H_ |
6 #define CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_WINDOW_GTK_H_ | 6 #define CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_WINDOW_GTK_H_ |
7 | 7 |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | 10 #include "chrome/browser/ui/gtk/browser_window_gtk.h" |
11 #include "chrome/browser/ui/gtk/menu_gtk.h" | |
12 #include "chrome/browser/ui/panels/native_panel.h" | 11 #include "chrome/browser/ui/panels/native_panel.h" |
13 #include "ui/base/animation/animation_delegate.h" | 12 #include "ui/base/animation/animation_delegate.h" |
14 | 13 |
15 class Panel; | 14 class Panel; |
16 class PanelBoundsAnimation; | 15 class PanelBoundsAnimation; |
17 class PanelDragGtk; | 16 class PanelDragGtk; |
18 class PanelSettingsMenuModel; | |
19 class NativePanelTestingGtk; | 17 class NativePanelTestingGtk; |
20 | 18 |
21 class PanelBrowserWindowGtk : public BrowserWindowGtk, | 19 class PanelBrowserWindowGtk : public BrowserWindowGtk, |
22 public MenuGtk::Delegate, | |
23 public MessageLoopForUI::Observer, | 20 public MessageLoopForUI::Observer, |
24 public NativePanel, | 21 public NativePanel, |
25 public ui::AnimationDelegate { | 22 public ui::AnimationDelegate { |
26 public: | 23 public: |
27 PanelBrowserWindowGtk(Browser* browser, Panel* panel, | 24 PanelBrowserWindowGtk(Browser* browser, Panel* panel, |
28 const gfx::Rect& bounds); | 25 const gfx::Rect& bounds); |
29 virtual ~PanelBrowserWindowGtk(); | 26 virtual ~PanelBrowserWindowGtk(); |
30 | 27 |
31 // BrowserWindowGtk override | 28 // BrowserWindowGtk override |
32 virtual void Init() OVERRIDE; | 29 virtual void Init() OVERRIDE; |
33 | 30 |
34 // BrowserWindow overrides | 31 // BrowserWindow overrides |
35 virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; | 32 virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; |
36 virtual void ShowSettingsMenu(GtkWidget* widget, | |
37 GdkEventButton* event) OVERRIDE; | |
38 virtual TitleDecoration GetWindowTitle(std::string* title) const OVERRIDE; | 33 virtual TitleDecoration GetWindowTitle(std::string* title) const OVERRIDE; |
39 | 34 |
40 virtual bool ShouldShowCloseButton() const OVERRIDE; | 35 virtual bool ShouldShowCloseButton() const OVERRIDE; |
41 | 36 |
42 // Overrides BrowserWindowGtk::NotificationObserver::Observe | 37 // Overrides BrowserWindowGtk::NotificationObserver::Observe |
43 virtual void Observe(int type, | 38 virtual void Observe(int type, |
44 const content::NotificationSource& source, | 39 const content::NotificationSource& source, |
45 const content::NotificationDetails& details) OVERRIDE; | 40 const content::NotificationDetails& details) OVERRIDE; |
46 | 41 |
47 protected: | 42 protected: |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 CHROMEGTK_CALLBACK_2(PanelBrowserWindowGtk, gboolean, OnDragFailed, | 151 CHROMEGTK_CALLBACK_2(PanelBrowserWindowGtk, gboolean, OnDragFailed, |
157 GdkDragContext*, GtkDragResult); | 152 GdkDragContext*, GtkDragResult); |
158 | 153 |
159 // When a drag is ending, a fake button release event is passed to the drag | 154 // When a drag is ending, a fake button release event is passed to the drag |
160 // widget to fake letting go of the mouse button. We need a callback for | 155 // widget to fake letting go of the mouse button. We need a callback for |
161 // this event because it is the only way to catch drag end events when the | 156 // this event because it is the only way to catch drag end events when the |
162 // user presses space or return. | 157 // user presses space or return. |
163 CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnDragButtonReleased, | 158 CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnDragButtonReleased, |
164 GdkEventButton*); | 159 GdkEventButton*); |
165 | 160 |
166 // Callbacks for mouse enter leave events. | |
167 CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnEnterNotify, | |
168 GdkEventCrossing*); | |
169 CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnLeaveNotify, | |
170 GdkEventCrossing*); | |
171 | |
172 // Tests will set this to false to prevent actual GTK drags from being | 161 // Tests will set this to false to prevent actual GTK drags from being |
173 // triggered as that generates extra unwanted signals and focus grabs. | 162 // triggered as that generates extra unwanted signals and focus grabs. |
174 bool system_drag_disabled_for_testing_; | 163 bool system_drag_disabled_for_testing_; |
175 | 164 |
176 // A copy of the last button press event, used to initiate a drag. | 165 // A copy of the last button press event, used to initiate a drag. |
177 GdkEvent* last_mouse_down_; | 166 GdkEvent* last_mouse_down_; |
178 | 167 |
179 // A GtkInivisible used to track the drag event. GtkInvisibles are of the | 168 // A GtkInivisible used to track the drag event. GtkInvisibles are of the |
180 // type GInitiallyUnowned, but the widget initialization code sinks the | 169 // type GInitiallyUnowned, but the widget initialization code sinks the |
181 // reference, so we can't use an OwnedWidgetGtk here. | 170 // reference, so we can't use an OwnedWidgetGtk here. |
182 GtkWidget* drag_widget_; | 171 GtkWidget* drag_widget_; |
183 | 172 |
184 // Due to a bug in GTK+, we need to force the end of a drag when we get a | 173 // Due to a bug in GTK+, we need to force the end of a drag when we get a |
185 // mouse release event on the the dragged widget, otherwise, we don't know | 174 // mouse release event on the the dragged widget, otherwise, we don't know |
186 // when the drag has ended when the user presses space or enter. We queue | 175 // when the drag has ended when the user presses space or enter. We queue |
187 // a task to end the drag and only run it if GTK+ didn't send us the | 176 // a task to end the drag and only run it if GTK+ didn't send us the |
188 // drag-failed event. | 177 // drag-failed event. |
189 base::WeakPtrFactory<PanelBrowserWindowGtk> drag_end_factory_; | 178 base::WeakPtrFactory<PanelBrowserWindowGtk> drag_end_factory_; |
190 | 179 |
191 scoped_ptr<Panel> panel_; | 180 scoped_ptr<Panel> panel_; |
192 gfx::Rect bounds_; | 181 gfx::Rect bounds_; |
193 | 182 |
194 scoped_ptr<PanelSettingsMenuModel> settings_menu_model_; | |
195 scoped_ptr<MenuGtk> settings_menu_; | |
196 | |
197 scoped_ptr<PanelDragGtk> drag_helper_; | 183 scoped_ptr<PanelDragGtk> drag_helper_; |
198 | 184 |
199 // Size of window frame. Empty until the window has been allocated and sized. | 185 // Size of window frame. Empty until the window has been allocated and sized. |
200 gfx::Size frame_size_; | 186 gfx::Size frame_size_; |
201 | 187 |
202 // Indicates that the panel is currently drawing attention. | 188 // Indicates that the panel is currently drawing attention. |
203 bool is_drawing_attention_; | 189 bool is_drawing_attention_; |
204 | 190 |
205 // Disable ExpansionState changes on mouse click for a short duration. | 191 // Disable ExpansionState changes on mouse click for a short duration. |
206 // This is needed in case the window gains focus as result of mouseDown while | 192 // This is needed in case the window gains focus as result of mouseDown while |
207 // being already expanded and drawing attention - in this case, we don't | 193 // being already expanded and drawing attention - in this case, we don't |
208 // want to minimize it on subsequent mouseUp. | 194 // want to minimize it on subsequent mouseUp. |
209 // We use time interval because the window may gain focus in various ways | 195 // We use time interval because the window may gain focus in various ways |
210 // (via keyboard for example) which are not distinguishable at this point. | 196 // (via keyboard for example) which are not distinguishable at this point. |
211 // Apparently this disable interval is not affecting the user in other cases. | 197 // Apparently this disable interval is not affecting the user in other cases. |
212 base::Time disableMinimizeUntilTime_; | 198 base::Time disableMinimizeUntilTime_; |
213 | 199 |
214 // Used to animate the bounds change. | 200 // Used to animate the bounds change. |
215 scoped_ptr<PanelBoundsAnimation> bounds_animator_; | 201 scoped_ptr<PanelBoundsAnimation> bounds_animator_; |
216 gfx::Rect animation_start_bounds_; | 202 gfx::Rect animation_start_bounds_; |
217 | 203 |
218 // This records the bounds set on the last animation progress notification. | 204 // This records the bounds set on the last animation progress notification. |
219 // We need this for the case where a new bounds animation starts before the | 205 // We need this for the case where a new bounds animation starts before the |
220 // current one completes. In this case, we want to start the new animation | 206 // current one completes. In this case, we want to start the new animation |
221 // from where the last one left. | 207 // from where the last one left. |
222 gfx::Rect last_animation_progressed_bounds_; | 208 gfx::Rect last_animation_progressed_bounds_; |
223 | 209 |
224 // Whether mouse is in the window. We show the wrench icon when a panel | |
225 // window has focus or mouse is in a panel window. | |
226 bool window_has_mouse_; | |
227 | |
228 // The close button is not shown when panel is in icon only mode in overflow. | 210 // The close button is not shown when panel is in icon only mode in overflow. |
229 bool show_close_button_; | 211 bool show_close_button_; |
230 | 212 |
231 content::NotificationRegistrar registrar_; | 213 content::NotificationRegistrar registrar_; |
232 | 214 |
233 DISALLOW_COPY_AND_ASSIGN(PanelBrowserWindowGtk); | 215 DISALLOW_COPY_AND_ASSIGN(PanelBrowserWindowGtk); |
234 }; | 216 }; |
235 | 217 |
236 #endif // CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_WINDOW_GTK_H_ | 218 #endif // CHROME_BROWSER_UI_PANELS_PANEL_BROWSER_WINDOW_GTK_H_ |
OLD | NEW |