OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #ifndef CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_ | |
6 #define CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_ | |
7 | |
8 #include <list> | |
9 #include <map> | |
10 #include <memory> | |
11 | |
12 #include "base/macros.h" | |
13 #include "build/build_config.h" | |
14 #include "chrome/browser/ui/panels/native_panel_stack_window.h" | |
15 #include "ui/gfx/animation/animation_delegate.h" | |
16 #include "ui/views/focus/widget_focus_manager.h" | |
17 #include "ui/views/widget/widget_delegate.h" | |
18 #include "ui/views/widget/widget_observer.h" | |
19 | |
20 #if defined(OS_WIN) | |
21 #include "chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.h" | |
22 #include "ui/base/win/hwnd_subclass.h" | |
23 #endif | |
24 | |
25 namespace gfx { | |
26 class LinearAnimation; | |
27 } | |
28 namespace views { | |
29 class Widget; | |
30 } | |
31 | |
32 // A native window that acts as the owner of all panels in the stack, in order | |
33 // to make all panels appear as a single window on the taskbar or launcher. | |
34 class PanelStackView : public NativePanelStackWindow, | |
35 public views::WidgetFocusChangeListener, | |
36 #if defined(OS_WIN) | |
37 public ui::HWNDMessageFilter, | |
38 public TaskbarWindowThumbnailerDelegateWin, | |
39 #endif | |
40 public gfx::AnimationDelegate { | |
41 public: | |
42 explicit PanelStackView(NativePanelStackWindowDelegate* delegate); | |
43 ~PanelStackView() override; | |
44 | |
45 protected: | |
46 // Overridden from NativePanelStackWindow: | |
47 void Close() override; | |
48 void AddPanel(Panel* panel) override; | |
49 void RemovePanel(Panel* panel) override; | |
50 void MergeWith(NativePanelStackWindow* another) override; | |
51 bool IsEmpty() const override; | |
52 bool HasPanel(Panel* panel) const override; | |
53 void MovePanelsBy(const gfx::Vector2d& delta) override; | |
54 void BeginBatchUpdatePanelBounds(bool animate) override; | |
55 void AddPanelBoundsForBatchUpdate(Panel* panel, | |
56 const gfx::Rect& new_bounds) override; | |
57 void EndBatchUpdatePanelBounds() override; | |
58 bool IsAnimatingPanelBounds() const override; | |
59 void Minimize() override; | |
60 bool IsMinimized() const override; | |
61 void DrawSystemAttention(bool draw_attention) override; | |
62 void OnPanelActivated(Panel* panel) override; | |
63 | |
64 private: | |
65 typedef std::list<Panel*> Panels; | |
66 | |
67 // The map value is old bounds of the panel. | |
68 typedef std::map<Panel*, gfx::Rect> BoundsUpdates; | |
69 | |
70 // Overridden from views::WidgetFocusChangeListener: | |
71 void OnNativeFocusChanged(gfx::NativeView focused_now) override; | |
72 | |
73 // Overridden from AnimationDelegate: | |
74 void AnimationEnded(const gfx::Animation* animation) override; | |
75 void AnimationProgressed(const gfx::Animation* animation) override; | |
76 void AnimationCanceled(const gfx::Animation* animation) override; | |
77 | |
78 // Updates the bounds of panels as specified in batch update data. | |
79 void UpdatePanelsBounds(); | |
80 | |
81 // Notifies the delegate that the updates of the panel bounds are completed. | |
82 void NotifyBoundsUpdateCompleted(); | |
83 | |
84 // Computes/updates the minimum bounds that could fit all panels. | |
85 gfx::Rect GetStackWindowBounds() const; | |
86 void UpdateStackWindowBounds(); | |
87 | |
88 views::Widget* CreateWindowWithBounds(const gfx::Rect& bounds); | |
89 void EnsureWindowCreated(); | |
90 | |
91 // Makes the stack window own the panel window such that multiple panels | |
92 // stacked together could appear as a single window on the taskbar or | |
93 // launcher. | |
94 static void MakeStackWindowOwnPanelWindow(Panel* panel, | |
95 PanelStackView* stack_window); | |
96 | |
97 #if defined(OS_WIN) | |
98 // Overridden from ui::HWNDMessageFilter: | |
99 bool FilterMessage(HWND hwnd, | |
100 UINT message, | |
101 WPARAM w_param, | |
102 LPARAM l_param, | |
103 LRESULT* l_result) override; | |
104 | |
105 // Overridden from TaskbarWindowThumbnailerDelegateWin: | |
106 std::vector<HWND> GetSnapshotWindowHandles() const override; | |
107 | |
108 // Updates the live preview snapshot when something changes, like | |
109 // adding/removing/moving/resizing a stacked panel. | |
110 void RefreshLivePreviewThumbnail(); | |
111 | |
112 // Updates the bounds of the widget window in a deferred way. | |
113 void DeferUpdateNativeWindowBounds(HDWP defer_window_pos_info, | |
114 views::Widget* window, | |
115 const gfx::Rect& bounds); | |
116 #endif | |
117 | |
118 NativePanelStackWindowDelegate* delegate_; | |
119 | |
120 views::Widget* window_; // Weak pointer, own us. | |
121 | |
122 // Tracks all panels that are enclosed by this window. | |
123 Panels panels_; | |
124 | |
125 // Is the taskbar icon of the underlying window being flashed in order to | |
126 // draw the user's attention? | |
127 bool is_drawing_attention_; | |
128 | |
129 #if defined(OS_WIN) | |
130 // The custom live preview snapshot is always provided for the stack window. | |
131 // This is because the system might not show the snapshot correctly for | |
132 // a small window, like collapsed panel. | |
133 std::unique_ptr<TaskbarWindowThumbnailerWin> thumbnailer_; | |
134 #endif | |
135 | |
136 // For batch bounds update. | |
137 bool animate_bounds_updates_; | |
138 bool bounds_updates_started_; | |
139 BoundsUpdates bounds_updates_; | |
140 | |
141 // Used to animate the bounds changes at a synchronized pace. | |
142 std::unique_ptr<gfx::LinearAnimation> bounds_animator_; | |
143 | |
144 DISALLOW_COPY_AND_ASSIGN(PanelStackView); | |
145 }; | |
146 | |
147 #endif // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_ | |
OLD | NEW |