Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / panels / panel_stack_view.h
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 "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"
17
18 #if defined(OS_WIN)
19 #include "chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.h"
20 #include "ui/base/win/hwnd_subclass.h"
21 #endif
22
23 namespace gfx {
24 class LinearAnimation;
25 }
26 namespace views {
27 class Widget;
28 }
29
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,
34 #if defined(OS_WIN)
35                        public ui::HWNDMessageFilter,
36                        public TaskbarWindowThumbnailerDelegateWin,
37 #endif
38                        public gfx::AnimationDelegate {
39  public:
40   explicit PanelStackView(NativePanelStackWindowDelegate* delegate);
41   ~PanelStackView() override;
42
43  protected:
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;
61
62  private:
63   typedef std::list<Panel*> Panels;
64
65   // The map value is old bounds of the panel.
66   typedef std::map<Panel*, gfx::Rect> BoundsUpdates;
67
68   // Overridden from views::WidgetFocusChangeListener:
69   void OnNativeFocusChange(gfx::NativeView focused_before,
70                            gfx::NativeView focused_now) override;
71
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;
76
77   // Updates the bounds of panels as specified in batch update data.
78   void UpdatePanelsBounds();
79
80   // Notifies the delegate that the updates of the panel bounds are completed.
81   void NotifyBoundsUpdateCompleted();
82
83   // Computes/updates the minimum bounds that could fit all panels.
84   gfx::Rect GetStackWindowBounds() const;
85   void UpdateStackWindowBounds();
86
87   views::Widget* CreateWindowWithBounds(const gfx::Rect& bounds);
88   void EnsureWindowCreated();
89
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
92   // launcher.
93   static void MakeStackWindowOwnPanelWindow(Panel* panel,
94                                             PanelStackView* stack_window);
95
96 #if defined(OS_WIN)
97   // Overridden from ui::HWNDMessageFilter:
98   virtual bool FilterMessage(HWND hwnd,
99                              UINT message,
100                              WPARAM w_param,
101                              LPARAM l_param,
102                              LRESULT* l_result) override;
103
104   // Overridden from TaskbarWindowThumbnailerDelegateWin:
105   virtual std::vector<HWND> GetSnapshotWindowHandles() const override;
106
107   // Updates the live preview snapshot when something changes, like
108   // adding/removing/moving/resizing a stacked panel.
109   void RefreshLivePreviewThumbnail();
110
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);
115 #endif
116
117   NativePanelStackWindowDelegate* delegate_;
118
119   views::Widget* window_;  // Weak pointer, own us.
120
121   // Tracks all panels that are enclosed by this window.
122   Panels panels_;
123
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_;
127
128 #if defined(OS_WIN)
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_;
133 #endif
134
135   // For batch bounds update.
136   bool animate_bounds_updates_;
137   bool bounds_updates_started_;
138   BoundsUpdates bounds_updates_;
139
140   // Used to animate the bounds changes at a synchronized pace.
141   scoped_ptr<gfx::LinearAnimation> bounds_animator_;
142
143   DISALLOW_COPY_AND_ASSIGN(PanelStackView);
144 };
145
146 #endif  // CHROME_BROWSER_UI_VIEWS_PANELS_PANEL_STACK_VIEW_H_