1 // Copyright (c) 2013 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_STACK_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "chrome/browser/ui/panels/native_panel_stack_window.h"
13 #include "ui/gfx/animation/animation_delegate.h"
14 #include "ui/views/focus/widget_focus_manager.h"
15 #include "ui/views/widget/widget_delegate.h"
16 #include "ui/views/widget/widget_observer.h"
19 #include "chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.h"
20 #include "ui/base/win/hwnd_subclass.h"
24 class LinearAnimation
;
30 // A native window that acts as the owner of all panels in the stack, in order
31 // to make all panels appear as a single window on the taskbar or launcher.
32 class PanelStackView
: public NativePanelStackWindow
,
33 public views::WidgetFocusChangeListener
,
35 public ui::HWNDMessageFilter
,
36 public TaskbarWindowThumbnailerDelegateWin
,
38 public gfx::AnimationDelegate
{
40 explicit PanelStackView(NativePanelStackWindowDelegate
* delegate
);
41 virtual ~PanelStackView();
44 // Overridden from NativePanelStackWindow:
45 virtual void Close() OVERRIDE
;
46 virtual void AddPanel(Panel
* panel
) OVERRIDE
;
47 virtual void RemovePanel(Panel
* panel
) OVERRIDE
;
48 virtual void MergeWith(NativePanelStackWindow
* another
) OVERRIDE
;
49 virtual bool IsEmpty() const OVERRIDE
;
50 virtual bool HasPanel(Panel
* panel
) const OVERRIDE
;
51 virtual void MovePanelsBy(const gfx::Vector2d
& delta
) OVERRIDE
;
52 virtual void BeginBatchUpdatePanelBounds(bool animate
) OVERRIDE
;
53 virtual void AddPanelBoundsForBatchUpdate(
54 Panel
* panel
, const gfx::Rect
& new_bounds
) OVERRIDE
;
55 virtual void EndBatchUpdatePanelBounds() OVERRIDE
;
56 virtual bool IsAnimatingPanelBounds() const OVERRIDE
;
57 virtual void Minimize() OVERRIDE
;
58 virtual bool IsMinimized() const OVERRIDE
;
59 virtual void DrawSystemAttention(bool draw_attention
) OVERRIDE
;
60 virtual void OnPanelActivated(Panel
* panel
) OVERRIDE
;
63 typedef std::list
<Panel
*> Panels
;
65 // The map value is old bounds of the panel.
66 typedef std::map
<Panel
*, gfx::Rect
> BoundsUpdates
;
68 // Overridden from views::WidgetFocusChangeListener:
69 virtual void OnNativeFocusChange(gfx::NativeView focused_before
,
70 gfx::NativeView focused_now
) OVERRIDE
;
72 // Overridden from AnimationDelegate:
73 virtual void AnimationEnded(const gfx::Animation
* animation
) OVERRIDE
;
74 virtual void AnimationProgressed(const gfx::Animation
* animation
) OVERRIDE
;
75 virtual void AnimationCanceled(const gfx::Animation
* animation
) OVERRIDE
;
77 // Updates the bounds of panels as specified in batch update data.
78 void UpdatePanelsBounds();
80 // Notifies the delegate that the updates of the panel bounds are completed.
81 void NotifyBoundsUpdateCompleted();
83 // Computes/updates the minimum bounds that could fit all panels.
84 gfx::Rect
GetStackWindowBounds() const;
85 void UpdateStackWindowBounds();
87 views::Widget
* CreateWindowWithBounds(const gfx::Rect
& bounds
);
88 void EnsureWindowCreated();
90 // Makes the stack window own the panel window such that multiple panels
91 // stacked together could appear as a single window on the taskbar or
93 static void MakeStackWindowOwnPanelWindow(Panel
* panel
,
94 PanelStackView
* stack_window
);
97 // Overridden from ui::HWNDMessageFilter:
98 virtual bool FilterMessage(HWND hwnd
,
102 LRESULT
* l_result
) OVERRIDE
;
104 // Overridden from TaskbarWindowThumbnailerDelegateWin:
105 virtual std::vector
<HWND
> GetSnapshotWindowHandles() const OVERRIDE
;
107 // Updates the live preview snapshot when something changes, like
108 // adding/removing/moving/resizing a stacked panel.
109 void RefreshLivePreviewThumbnail();
111 // Updates the bounds of the widget window in a deferred way.
112 void DeferUpdateNativeWindowBounds(HDWP defer_window_pos_info
,
113 views::Widget
* window
,
114 const gfx::Rect
& bounds
);
117 NativePanelStackWindowDelegate
* delegate_
;
119 views::Widget
* window_
; // Weak pointer, own us.
121 // Tracks all panels that are enclosed by this window.
124 // Is the taskbar icon of the underlying window being flashed in order to
125 // draw the user's attention?
126 bool is_drawing_attention_
;
129 // The custom live preview snapshot is always provided for the stack window.
130 // This is because the system might not show the snapshot correctly for
131 // a small window, like collapsed panel.
132 scoped_ptr
<TaskbarWindowThumbnailerWin
> thumbnailer_
;
135 // For batch bounds update.
136 bool animate_bounds_updates_
;
137 bool bounds_updates_started_
;
138 BoundsUpdates bounds_updates_
;
140 // Used to animate the bounds changes at a synchronized pace.
141 scoped_ptr
<gfx::LinearAnimation
> bounds_animator_
;
143 DISALLOW_COPY_AND_ASSIGN(PanelStackView
);
146 #endif // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_