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 OnNativeFocusChange(gfx::NativeView focused_before,
70 gfx::NativeView focused_now) override;
72 // Overridden from AnimationDelegate:
73 void AnimationEnded(const gfx::Animation* animation) override;
74 void AnimationProgressed(const gfx::Animation* animation) override;
75 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_