1// Copyright (c) 2012 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 UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_WINDOW_TREE_HOST_WIN_H_
6#define UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_WINDOW_TREE_HOST_WIN_H_
7
8#include "ui/aura/window_tree_host.h"
9#include "ui/views/views_export.h"
10#include "ui/views/widget/desktop_aura/desktop_window_tree_host.h"
11#include "ui/views/win/hwnd_message_handler_delegate.h"
12#include "ui/wm/public/animation_host.h"
13
14namespace aura {
15namespace client {
16class DragDropClient;
17class FocusClient;
18class ScopedTooltipDisabler;
19}
20}
21
22namespace views {
23class DesktopCursorClient;
24class DesktopDragDropClientWin;
25class HWNDMessageHandler;
26
27namespace corewm {
28class TooltipWin;
29}
30
31class VIEWS_EXPORT DesktopWindowTreeHostWin
32    : public DesktopWindowTreeHost,
33      public aura::client::AnimationHost,
34      public aura::WindowTreeHost,
35      public ui::EventSource,
36      public HWNDMessageHandlerDelegate {
37 public:
38  DesktopWindowTreeHostWin(
39      internal::NativeWidgetDelegate* native_widget_delegate,
40      DesktopNativeWidgetAura* desktop_native_widget_aura);
41  virtual ~DesktopWindowTreeHostWin();
42
43  // A way of converting an HWND into a content window.
44  static aura::Window* GetContentWindowForHWND(HWND hwnd);
45
46 protected:
47  // Overridden from DesktopWindowTreeHost:
48  virtual void Init(aura::Window* content_window,
49                    const Widget::InitParams& params) OVERRIDE;
50  virtual void OnNativeWidgetCreated(const Widget::InitParams& params) OVERRIDE;
51  virtual scoped_ptr<corewm::Tooltip> CreateTooltip() OVERRIDE;
52  virtual scoped_ptr<aura::client::DragDropClient>
53      CreateDragDropClient(DesktopNativeCursorManager* cursor_manager) OVERRIDE;
54  virtual void Close() OVERRIDE;
55  virtual void CloseNow() OVERRIDE;
56  virtual aura::WindowTreeHost* AsWindowTreeHost() OVERRIDE;
57  virtual void ShowWindowWithState(ui::WindowShowState show_state) OVERRIDE;
58  virtual void ShowMaximizedWithBounds(
59      const gfx::Rect& restored_bounds) OVERRIDE;
60  virtual bool IsVisible() const OVERRIDE;
61  virtual void SetSize(const gfx::Size& size) OVERRIDE;
62  virtual void StackAtTop() OVERRIDE;
63  virtual void CenterWindow(const gfx::Size& size) OVERRIDE;
64  virtual void GetWindowPlacement(
65      gfx::Rect* bounds,
66      ui::WindowShowState* show_state) const OVERRIDE;
67  virtual gfx::Rect GetWindowBoundsInScreen() const OVERRIDE;
68  virtual gfx::Rect GetClientAreaBoundsInScreen() const OVERRIDE;
69  virtual gfx::Rect GetRestoredBounds() const OVERRIDE;
70  virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE;
71  virtual void SetShape(gfx::NativeRegion native_region) OVERRIDE;
72  virtual void Activate() OVERRIDE;
73  virtual void Deactivate() OVERRIDE;
74  virtual bool IsActive() const OVERRIDE;
75  virtual void Maximize() OVERRIDE;
76  virtual void Minimize() OVERRIDE;
77  virtual void Restore() OVERRIDE;
78  virtual bool IsMaximized() const OVERRIDE;
79  virtual bool IsMinimized() const OVERRIDE;
80  virtual bool HasCapture() const OVERRIDE;
81  virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE;
82  virtual bool IsAlwaysOnTop() const OVERRIDE;
83  virtual void SetVisibleOnAllWorkspaces(bool always_visible) OVERRIDE;
84  virtual bool SetWindowTitle(const base::string16& title) OVERRIDE;
85  virtual void ClearNativeFocus() OVERRIDE;
86  virtual Widget::MoveLoopResult RunMoveLoop(
87      const gfx::Vector2d& drag_offset,
88      Widget::MoveLoopSource source,
89      Widget::MoveLoopEscapeBehavior escape_behavior) OVERRIDE;
90  virtual void EndMoveLoop() OVERRIDE;
91  virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
92  virtual bool ShouldUseNativeFrame() const OVERRIDE;
93  virtual bool ShouldWindowContentsBeTransparent() const OVERRIDE;
94  virtual void FrameTypeChanged() OVERRIDE;
95  virtual void SetFullscreen(bool fullscreen) OVERRIDE;
96  virtual bool IsFullscreen() const OVERRIDE;
97  virtual void SetOpacity(unsigned char opacity) OVERRIDE;
98  virtual void SetWindowIcons(const gfx::ImageSkia& window_icon,
99                              const gfx::ImageSkia& app_icon) OVERRIDE;
100  virtual void InitModalType(ui::ModalType modal_type) OVERRIDE;
101  virtual void FlashFrame(bool flash_frame) OVERRIDE;
102  virtual void OnRootViewLayout() OVERRIDE;
103  virtual void OnNativeWidgetFocus() OVERRIDE;
104  virtual void OnNativeWidgetBlur() OVERRIDE;
105  virtual bool IsAnimatingClosed() const OVERRIDE;
106  virtual bool IsTranslucentWindowOpacitySupported() const OVERRIDE;
107  virtual void SizeConstraintsChanged() OVERRIDE;
108
109  // Overridden from aura::WindowTreeHost:
110  virtual ui::EventSource* GetEventSource() OVERRIDE;
111  virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE;
112  virtual void Show() OVERRIDE;
113  virtual void Hide() OVERRIDE;
114  virtual gfx::Rect GetBounds() const OVERRIDE;
115  virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE;
116  virtual gfx::Point GetLocationOnNativeScreen() const OVERRIDE;
117  virtual void SetCapture() OVERRIDE;
118  virtual void ReleaseCapture() OVERRIDE;
119  virtual void PostNativeEvent(const base::NativeEvent& native_event) OVERRIDE;
120  virtual void SetCursorNative(gfx::NativeCursor cursor) OVERRIDE;
121  virtual void OnCursorVisibilityChangedNative(bool show) OVERRIDE;
122  virtual void MoveCursorToNative(const gfx::Point& location) OVERRIDE;
123
124  // Overridden frm ui::EventSource
125  virtual ui::EventProcessor* GetEventProcessor() OVERRIDE;
126
127  // Overridden from aura::client::AnimationHost
128  virtual void SetHostTransitionOffsets(
129      const gfx::Vector2d& top_left_delta,
130      const gfx::Vector2d& bottom_right_delta) OVERRIDE;
131  virtual void OnWindowHidingAnimationCompleted() OVERRIDE;
132
133  // Overridden from HWNDMessageHandlerDelegate:
134  virtual bool IsWidgetWindow() const OVERRIDE;
135  virtual bool IsUsingCustomFrame() const OVERRIDE;
136  virtual void SchedulePaint() OVERRIDE;
137  virtual void EnableInactiveRendering() OVERRIDE;
138  virtual bool IsInactiveRenderingDisabled() OVERRIDE;
139  virtual bool CanResize() const OVERRIDE;
140  virtual bool CanMaximize() const OVERRIDE;
141  virtual bool CanMinimize() const OVERRIDE;
142  virtual bool CanActivate() const OVERRIDE;
143  virtual bool WidgetSizeIsClientSize() const OVERRIDE;
144  virtual bool IsModal() const OVERRIDE;
145  virtual int GetInitialShowState() const OVERRIDE;
146  virtual bool WillProcessWorkAreaChange() const OVERRIDE;
147  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE;
148  virtual void GetWindowMask(const gfx::Size& size, gfx::Path* path) OVERRIDE;
149  virtual bool GetClientAreaInsets(gfx::Insets* insets) const OVERRIDE;
150  virtual void GetMinMaxSize(gfx::Size* min_size,
151                             gfx::Size* max_size) const OVERRIDE;
152  virtual gfx::Size GetRootViewSize() const OVERRIDE;
153  virtual void ResetWindowControls() OVERRIDE;
154  virtual void PaintLayeredWindow(gfx::Canvas* canvas) OVERRIDE;
155  virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE;
156  virtual bool ShouldHandleSystemCommands() const OVERRIDE;
157  virtual InputMethod* GetInputMethod() OVERRIDE;
158  virtual void HandleAppDeactivated() OVERRIDE;
159  virtual void HandleActivationChanged(bool active) OVERRIDE;
160  virtual bool HandleAppCommand(short command) OVERRIDE;
161  virtual void HandleCancelMode() OVERRIDE;
162  virtual void HandleCaptureLost() OVERRIDE;
163  virtual void HandleClose() OVERRIDE;
164  virtual bool HandleCommand(int command) OVERRIDE;
165  virtual void HandleAccelerator(const ui::Accelerator& accelerator) OVERRIDE;
166  virtual void HandleCreate() OVERRIDE;
167  virtual void HandleDestroying() OVERRIDE;
168  virtual void HandleDestroyed() OVERRIDE;
169  virtual bool HandleInitialFocus(ui::WindowShowState show_state) OVERRIDE;
170  virtual void HandleDisplayChange() OVERRIDE;
171  virtual void HandleBeginWMSizeMove() OVERRIDE;
172  virtual void HandleEndWMSizeMove() OVERRIDE;
173  virtual void HandleMove() OVERRIDE;
174  virtual void HandleWorkAreaChanged() OVERRIDE;
175  virtual void HandleVisibilityChanging(bool visible) OVERRIDE;
176  virtual void HandleVisibilityChanged(bool visible) OVERRIDE;
177  virtual void HandleClientSizeChanged(const gfx::Size& new_size) OVERRIDE;
178  virtual void HandleFrameChanged() OVERRIDE;
179  virtual void HandleNativeFocus(HWND last_focused_window) OVERRIDE;
180  virtual void HandleNativeBlur(HWND focused_window) OVERRIDE;
181  virtual bool HandleMouseEvent(const ui::MouseEvent& event) OVERRIDE;
182  virtual bool HandleKeyEvent(const ui::KeyEvent& event) OVERRIDE;
183  virtual bool HandleUntranslatedKeyEvent(const ui::KeyEvent& event) OVERRIDE;
184  virtual void HandleTouchEvent(const ui::TouchEvent& event) OVERRIDE;
185  virtual bool HandleIMEMessage(UINT message,
186                                WPARAM w_param,
187                                LPARAM l_param,
188                                LRESULT* result) OVERRIDE;
189  virtual void HandleInputLanguageChange(DWORD character_set,
190                                         HKL input_language_id) OVERRIDE;
191  virtual bool HandlePaintAccelerated(const gfx::Rect& invalid_rect) OVERRIDE;
192  virtual void HandlePaint(gfx::Canvas* canvas) OVERRIDE;
193  virtual bool HandleTooltipNotify(int w_param,
194                                   NMHDR* l_param,
195                                   LRESULT* l_result) OVERRIDE;
196  virtual void HandleMenuLoop(bool in_menu_loop) OVERRIDE;
197  virtual bool PreHandleMSG(UINT message,
198                            WPARAM w_param,
199                            LPARAM l_param,
200                            LRESULT* result) OVERRIDE;
201  virtual void PostHandleMSG(UINT message,
202                             WPARAM w_param,
203                             LPARAM l_param) OVERRIDE;
204  virtual bool HandleScrollEvent(const ui::ScrollEvent& event) OVERRIDE;
205  virtual void HandleWindowSizeChanging() OVERRIDE;
206
207  Widget* GetWidget();
208  const Widget* GetWidget() const;
209  HWND GetHWND() const;
210
211 private:
212  void SetWindowTransparency();
213
214  // Returns true if a modal window is active in the current root window chain.
215  bool IsModalWindowActive() const;
216
217  scoped_ptr<HWNDMessageHandler> message_handler_;
218  scoped_ptr<aura::client::FocusClient> focus_client_;
219
220  // TODO(beng): Consider providing an interface to DesktopNativeWidgetAura
221  //             instead of providing this route back to Widget.
222  internal::NativeWidgetDelegate* native_widget_delegate_;
223
224  DesktopNativeWidgetAura* desktop_native_widget_aura_;
225
226  aura::Window* content_window_;
227
228  // Owned by DesktopNativeWidgetAura.
229  DesktopDragDropClientWin* drag_drop_client_;
230
231  // When certain windows are being shown, we augment the window size
232  // temporarily for animation. The following two members contain the top left
233  // and bottom right offsets which are used to enlarge the window.
234  gfx::Vector2d window_expansion_top_left_delta_;
235  gfx::Vector2d window_expansion_bottom_right_delta_;
236
237  // Windows are enlarged to be at least 64x64 pixels, so keep track of the
238  // extra added here.
239  gfx::Vector2d window_enlargement_;
240
241  // Whether the window close should be converted to a hide, and then actually
242  // closed on the completion of the hide animation. This is cached because
243  // the property is set on the contained window which has a shorter lifetime.
244  bool should_animate_window_close_;
245
246  // When Close()d and animations are being applied to this window, the close
247  // of the window needs to be deferred to when the close animation is
248  // completed. This variable indicates that a Close was converted to a Hide,
249  // so that when the Hide is completed the host window should be closed.
250  bool pending_close_;
251
252  // True if the widget is going to have a non_client_view. We cache this value
253  // rather than asking the Widget for the non_client_view so that we know at
254  // Init time, before the Widget has created the NonClientView.
255  bool has_non_client_view_;
256
257  // Owned by TooltipController, but we need to forward events to it so we keep
258  // a reference.
259  corewm::TooltipWin* tooltip_;
260
261  // Visibility of the cursor. On Windows we can have multiple root windows and
262  // the implementation of ::ShowCursor() is based on a counter, so making this
263  // member static ensures that ::ShowCursor() is always called exactly once
264  // whenever the cursor visibility state changes.
265  static bool is_cursor_visible_;
266
267  scoped_ptr<aura::client::ScopedTooltipDisabler> tooltip_disabler_;
268
269  // This flag is set to true in cases where we need to force a synchronous
270  // paint via the compositor. Cases include restoring/resizing/maximizing the
271  // window. Defaults to false.
272  bool need_synchronous_paint_;
273
274  // Set to true if we are about to enter a sizing loop.
275  bool in_sizing_loop_;
276
277  DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostWin);
278};
279
280}  // namespace views
281
282#endif  // UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_WINDOW_TREE_HOST_WIN_H_
283