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
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_VIEW_H_
8 #include "base/memory/scoped_ptr.h"
9 #include "chrome/browser/ui/panels/native_panel.h"
10 #include "ui/gfx/animation/animation_delegate.h"
11 #include "ui/views/widget/widget_delegate.h"
12 #include "ui/views/widget/widget_observer.h"
15 #include "ui/base/win/hwnd_subclass.h"
20 class PanelBoundsAnimation
;
22 class TaskbarWindowThumbnailerWin
;
28 class PanelView
: public NativePanel
,
29 public views::WidgetObserver
,
30 public views::WidgetDelegateView
,
32 public ui::HWNDMessageFilter
,
34 public gfx::AnimationDelegate
{
36 // The size of inside area used for mouse resizing.
37 static const int kResizeInsideBoundsSize
= 5;
39 PanelView(Panel
* panel
, const gfx::Rect
& bounds
, bool always_on_top
);
42 // Overridden from NativePanel:
43 virtual void ShowPanel() OVERRIDE
;
44 virtual void ShowPanelInactive() OVERRIDE
;
45 virtual gfx::Rect
GetPanelBounds() const OVERRIDE
;
46 virtual void SetPanelBounds(const gfx::Rect
& bounds
) OVERRIDE
;
47 virtual void SetPanelBoundsInstantly(const gfx::Rect
& bounds
) OVERRIDE
;
48 virtual void ClosePanel() OVERRIDE
;
49 virtual void ActivatePanel() OVERRIDE
;
50 virtual void DeactivatePanel() OVERRIDE
;
51 virtual bool IsPanelActive() const OVERRIDE
;
52 virtual void PreventActivationByOS(bool prevent_activation
) OVERRIDE
;
53 virtual gfx::NativeWindow
GetNativePanelWindow() OVERRIDE
;
54 virtual void UpdatePanelTitleBar() OVERRIDE
;
55 virtual void UpdatePanelLoadingAnimations(bool should_animate
) OVERRIDE
;
56 virtual void PanelWebContentsFocused(content::WebContents
* contents
) OVERRIDE
;
57 virtual void PanelCut() OVERRIDE
;
58 virtual void PanelCopy() OVERRIDE
;
59 virtual void PanelPaste() OVERRIDE
;
60 virtual void DrawAttention(bool draw_attention
) OVERRIDE
;
61 virtual bool IsDrawingAttention() const OVERRIDE
;
62 virtual void HandlePanelKeyboardEvent(
63 const content::NativeWebKeyboardEvent
& event
) OVERRIDE
;
64 virtual void FullScreenModeChanged(bool is_full_screen
) OVERRIDE
;
65 virtual bool IsPanelAlwaysOnTop() const OVERRIDE
;
66 virtual void SetPanelAlwaysOnTop(bool on_top
) OVERRIDE
;
67 virtual void UpdatePanelMinimizeRestoreButtonVisibility() OVERRIDE
;
68 virtual void SetWindowCornerStyle(panel::CornerStyle corner_style
) OVERRIDE
;
69 virtual void PanelExpansionStateChanging(
70 Panel::ExpansionState old_state
,
71 Panel::ExpansionState new_state
) OVERRIDE
;
72 virtual void AttachWebContents(content::WebContents
* contents
) OVERRIDE
;
73 virtual void DetachWebContents(content::WebContents
* contents
) OVERRIDE
;
74 virtual gfx::Size
WindowSizeFromContentSize(
75 const gfx::Size
& content_size
) const OVERRIDE
;
76 virtual gfx::Size
ContentSizeFromWindowSize(
77 const gfx::Size
& window_size
) const OVERRIDE
;
78 virtual int TitleOnlyHeight() const OVERRIDE
;
79 virtual void MinimizePanelBySystem() OVERRIDE
;
80 virtual bool IsPanelMinimizedBySystem() const OVERRIDE
;
81 virtual bool IsPanelShownOnActiveDesktop() const OVERRIDE
;
82 virtual void ShowShadow(bool show
) OVERRIDE
;
83 virtual NativePanelTesting
* CreateNativePanelTesting() OVERRIDE
;
85 // Overridden from views::View:
86 virtual gfx::Size
GetMinimumSize() const OVERRIDE
;
87 virtual gfx::Size
GetMaximumSize() OVERRIDE
;
89 // Return true if the mouse event is handled.
90 // |mouse_location| is in screen coordinate system.
91 bool OnTitlebarMousePressed(const gfx::Point
& mouse_location
);
92 bool OnTitlebarMouseDragged(const gfx::Point
& mouse_location
);
93 bool OnTitlebarMouseReleased(panel::ClickModifier modifier
);
94 bool OnTitlebarMouseCaptureLost();
96 PanelFrameView
* GetFrameView() const;
97 bool IsAnimatingBounds() const;
99 // The panel does not show a resizing border. Instead, the inner content area
100 // can be used to trigger the mouse resizing. Return true if |mouse_location|
101 // falls within this area.
102 // |mouse_location| is in screen coordinate system.
103 bool IsWithinResizingArea(const gfx::Point
& mouse_location
) const;
105 Panel
* panel() const { return panel_
.get(); }
106 views::Widget
* window() const { return window_
; }
107 bool force_to_paint_as_inactive() const {
108 return force_to_paint_as_inactive_
;
111 // PanelStackView might want to update the stored bounds directly since it
112 // has already taken care of updating the window bounds directly.
113 void set_cached_bounds_directly(const gfx::Rect
& bounds
) { bounds_
= bounds
; }
116 enum MouseDraggingState
{
122 // Overridden from views::WidgetDelegate:
123 virtual void OnDisplayChanged() OVERRIDE
;
124 virtual void OnWorkAreaChanged() OVERRIDE
;
125 virtual bool WillProcessWorkAreaChange() const OVERRIDE
;
126 virtual views::View
* GetContentsView() OVERRIDE
;
127 virtual views::NonClientFrameView
* CreateNonClientFrameView(
128 views::Widget
* widget
) OVERRIDE
;
129 virtual bool CanResize() const OVERRIDE
;
130 virtual bool CanMaximize() const OVERRIDE
;
131 virtual views::Widget
* GetWidget() OVERRIDE
;
132 virtual const views::Widget
* GetWidget() const OVERRIDE
;
133 virtual base::string16
GetWindowTitle() const OVERRIDE
;
134 virtual gfx::ImageSkia
GetWindowAppIcon() OVERRIDE
;
135 virtual gfx::ImageSkia
GetWindowIcon() OVERRIDE
;
136 virtual void WindowClosing() OVERRIDE
;
137 virtual void DeleteDelegate() OVERRIDE
;
138 virtual void OnWindowBeginUserBoundsChange() OVERRIDE
;
139 virtual void OnWindowEndUserBoundsChange() OVERRIDE
;
141 // Overridden from views::View:
142 virtual void Layout() OVERRIDE
;
143 virtual bool AcceleratorPressed(const ui::Accelerator
& accelerator
) OVERRIDE
;
145 // Overridden from views::WidgetObserver:
146 virtual void OnWidgetDestroying(views::Widget
* widget
) OVERRIDE
;
147 virtual void OnWidgetActivationChanged(views::Widget
* widget
,
148 bool active
) OVERRIDE
;
149 virtual void OnWidgetBoundsChanged(views::Widget
* widget
,
150 const gfx::Rect
& new_bounds
) OVERRIDE
;
152 // Overridden from ui::HWNDMessageFilter:
154 virtual bool FilterMessage(HWND hwnd
,
158 LRESULT
* l_result
) OVERRIDE
;
161 // Overridden from AnimationDelegate:
162 virtual void AnimationEnded(const gfx::Animation
* animation
) OVERRIDE
;
163 virtual void AnimationProgressed(const gfx::Animation
* animation
) OVERRIDE
;
165 void UpdateLoadingAnimations(bool should_animate
);
166 void UpdateWindowTitle();
167 void UpdateWindowIcon();
168 void SetBoundsInternal(const gfx::Rect
& bounds
, bool animate
);
169 bool EndDragging(bool cancelled
);
171 // Sets the bounds of the underlying window to |new_bounds|. Note that this
172 // might update the window style to work around the minimum overlapped
173 // window height limitation.
174 void SetWidgetBounds(const gfx::Rect
& new_bounds
);
177 // Sets |attribute_value_to_set| and/or clears |attribute_value_to_reset| for
178 // the attibute denoted by |attribute_index|. This is used to update the style
179 // or extended style for the native window.
180 void UpdateWindowAttribute(int attribute_index
,
181 int attribute_value_to_set
,
182 int attribute_value_to_reset
,
186 scoped_ptr
<Panel
> panel_
;
189 // The window that holds all panel views. Lifetime managed by native widget.
191 views::Widget
* window_
;
193 // Close gets called more than once, so use this to do one-time clean up once.
196 // The view hosting the web contents. Will be destroyed when child views
197 // of this class are destroyed.
198 views::WebView
* web_view_
;
200 // True if the panel should always stay on top of other windows.
203 // Is the panel receiving the focus?
206 // True if the user is resizing the panel.
210 // True if the user is resizing the interior edge of a stack.
211 bool user_resizing_interior_stacked_panel_edge_
;
213 // The original full size of the resizing panel before the resizing states.
214 gfx::Size original_full_size_of_resizing_panel_
;
216 // The original full size of the panel below the resizing panel before the
218 gfx::Size original_full_size_of_panel_below_resizing_panel_
;
222 // Is the mouse button currently down?
225 // Location the mouse was pressed at or dragged to last time when we process
226 // the mouse event. Used in drag-and-drop.
227 // This point is represented in the screen coordinate system.
228 gfx::Point last_mouse_location_
;
230 // Is the titlebar currently being dragged? That is, has the cursor
231 // moved more than kDragThreshold away from its starting position?
232 MouseDraggingState mouse_dragging_state_
;
234 // Used to animate the bounds change.
235 scoped_ptr
<PanelBoundsAnimation
> bounds_animator_
;
236 gfx::Rect animation_start_bounds_
;
238 // Is the panel in highlighted state to draw people's attention?
239 bool is_drawing_attention_
;
241 // Should we force to paint the panel as inactive? This is needed when we need
242 // to capture the screenshot before an active panel goes minimized.
243 bool force_to_paint_as_inactive_
;
245 // The last view that had focus in the panel. This is saved so that focus can
246 // be restored properly when a drag ends.
247 views::View
* old_focused_view_
;
249 scoped_ptr
<AutoKeepAlive
> keep_alive_
;
252 // Used to provide custom taskbar thumbnail for Windows 7 and later.
253 scoped_ptr
<TaskbarWindowThumbnailerWin
> thumbnailer_
;
256 DISALLOW_COPY_AND_ASSIGN(PanelView
);
259 #endif // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_VIEW_H_