// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ASH_WM_DRAG_WINDOW_CONTROLLER_H_ #define ASH_WM_DRAG_WINDOW_CONTROLLER_H_ #include "ash/ash_export.h" #include "base/basictypes.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/display.h" #include "ui/gfx/rect.h" namespace aura { class Window; } namespace ui { class Layer; class LayerTreeOwner; } namespace views { class Widget; } namespace ash { // DragWindowController is responsible for showing a semi-transparent window // while dragging a window across displays. class ASH_EXPORT DragWindowController { public: explicit DragWindowController(aura::Window* window); virtual ~DragWindowController(); // Sets the display where the window is placed after the window is dropped. void SetDestinationDisplay(const gfx::Display& dst_display); // Shows the drag window at the specified location (coordinates of the // parent). If |layer| is non-NULL, it is shown on top of the drag window. // |layer| is owned by the caller. // This does not immediately show the window. void Show(); // Hides the drag window. void Hide(); // This is used to set bounds for the drag window immediately. This should // be called only when the drag window is already visible. void SetBounds(const gfx::Rect& bounds); // Sets the opacity of the drag window. void SetOpacity(float opacity); private: FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest, DragWindowController); // Creates and shows the |drag_widget_| at |bounds|. // |layer| is shown on top of the drag window if it is non-NULL. // |layer| is not owned by this object. void CreateDragWidget(const gfx::Rect& bounds); // Sets bounds of the drag window. The window is shown on |dst_display_| // if its id() is valid. Otherwise, a display nearest to |bounds| is chosen. void SetBoundsInternal(const gfx::Rect& bounds); // Recreates a fresh layer for |window_| and all its child windows. void RecreateWindowLayers(); // Window the drag window is placed beneath. aura::Window* window_; // The display where the drag is placed. When dst_display_.id() is // kInvalidDisplayID (i.e. the default), a display nearest to the current // |bounds_| is automatically used. gfx::Display dst_display_; // Initially the bounds of |window_|. Each time Show() is invoked // |start_bounds_| is then reset to the bounds of |drag_widget_| and // |bounds_| is set to the value passed into Show(). The animation animates // between these two values. gfx::Rect bounds_; views::Widget* drag_widget_; // The copy of window_->layer() and its descendants. scoped_ptr<ui::LayerTreeOwner> layer_owner_; DISALLOW_COPY_AND_ASSIGN(DragWindowController); }; } // namespace ash #endif // ASH_WM_DRAG_WINDOW_CONTROLLER_H_