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 ~PanelStackView() override
;
44 // Overridden from NativePanelStackWindow:
45 void Close() override
;
46 void AddPanel(Panel
* panel
) override
;
47 void RemovePanel(Panel
* panel
) override
;
48 void MergeWith(NativePanelStackWindow
* another
) override
;
49 bool IsEmpty() const override
;
50 bool HasPanel(Panel
* panel
) const override
;
51 void MovePanelsBy(const gfx::Vector2d
& delta
) override
;
52 void BeginBatchUpdatePanelBounds(bool animate
) override
;
53 void AddPanelBoundsForBatchUpdate(Panel
* panel
,
54 const gfx::Rect
& new_bounds
) override
;
55 void EndBatchUpdatePanelBounds() override
;
56 bool IsAnimatingPanelBounds() const override
;
57 void Minimize() override
;
58 bool IsMinimized() const override
;
59 void DrawSystemAttention(bool draw_attention
) override
;
60 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 void OnNativeFocusChanged(gfx::NativeView focused_now
) override
;
71 // Overridden from AnimationDelegate:
72 void AnimationEnded(const gfx::Animation
* animation
) override
;
73 void AnimationProgressed(const gfx::Animation
* animation
) override
;
74 void AnimationCanceled(const gfx::Animation
* animation
) override
;
76 // Updates the bounds of panels as specified in batch update data.
77 void UpdatePanelsBounds();
79 // Notifies the delegate that the updates of the panel bounds are completed.
80 void NotifyBoundsUpdateCompleted();
82 // Computes/updates the minimum bounds that could fit all panels.
83 gfx::Rect
GetStackWindowBounds() const;
84 void UpdateStackWindowBounds();
86 views::Widget
* CreateWindowWithBounds(const gfx::Rect
& bounds
);
87 void EnsureWindowCreated();
89 // Makes the stack window own the panel window such that multiple panels
90 // stacked together could appear as a single window on the taskbar or
92 static void MakeStackWindowOwnPanelWindow(Panel
* panel
,
93 PanelStackView
* stack_window
);
96 // Overridden from ui::HWNDMessageFilter:
97 bool FilterMessage(HWND hwnd
,
101 LRESULT
* l_result
) override
;
103 // Overridden from TaskbarWindowThumbnailerDelegateWin:
104 std::vector
<HWND
> GetSnapshotWindowHandles() const override
;
106 // Updates the live preview snapshot when something changes, like
107 // adding/removing/moving/resizing a stacked panel.
108 void RefreshLivePreviewThumbnail();
110 // Updates the bounds of the widget window in a deferred way.
111 void DeferUpdateNativeWindowBounds(HDWP defer_window_pos_info
,
112 views::Widget
* window
,
113 const gfx::Rect
& bounds
);
116 NativePanelStackWindowDelegate
* delegate_
;
118 views::Widget
* window_
; // Weak pointer, own us.
120 // Tracks all panels that are enclosed by this window.
123 // Is the taskbar icon of the underlying window being flashed in order to
124 // draw the user's attention?
125 bool is_drawing_attention_
;
128 // The custom live preview snapshot is always provided for the stack window.
129 // This is because the system might not show the snapshot correctly for
130 // a small window, like collapsed panel.
131 scoped_ptr
<TaskbarWindowThumbnailerWin
> thumbnailer_
;
134 // For batch bounds update.
135 bool animate_bounds_updates_
;
136 bool bounds_updates_started_
;
137 BoundsUpdates bounds_updates_
;
139 // Used to animate the bounds changes at a synchronized pace.
140 scoped_ptr
<gfx::LinearAnimation
> bounds_animator_
;
142 DISALLOW_COPY_AND_ASSIGN(PanelStackView
);
145 #endif // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_