// 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_PANELS_PANEL_WINDOW_RESIZER_H_ #define ASH_WM_PANELS_PANEL_WINDOW_RESIZER_H_ #include "ash/wm/window_resizer.h" #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" namespace gfx { class Rect; class Point; } namespace ash { // PanelWindowResizer is used by ToplevelWindowEventFilter to handle dragging, // moving or resizing panel window. These can be attached and detached from the // launcher. class ASH_EXPORT PanelWindowResizer : public WindowResizer { public: virtual ~PanelWindowResizer(); // Creates a new PanelWindowResizer. The caller takes ownership of the // returned object. The ownership of |next_window_resizer| is taken by the // returned object. Returns NULL if not resizable. static PanelWindowResizer* Create(WindowResizer* next_window_resizer, aura::Window* window, const gfx::Point& location, int window_component, aura::client::WindowMoveSource source); // WindowResizer: virtual void Drag(const gfx::Point& location, int event_flags) OVERRIDE; virtual void CompleteDrag() OVERRIDE; virtual void RevertDrag() OVERRIDE; virtual aura::Window* GetTarget() OVERRIDE; virtual const gfx::Point& GetInitialLocation() const OVERRIDE; private: // Creates PanelWindowResizer that adds the ability to attach / detach panel // windows as well as reparenting them to the panel layer while dragging to // |next_window_resizer|. This object takes ownership of // |next_window_resizer|. PanelWindowResizer(WindowResizer* next_window_resizer, const Details& details); // Checks if the provided window bounds should attach to the launcher. If true // the offset gives the necessary adjustment to snap to the launcher. bool AttachToLauncher(const gfx::Rect& bounds, gfx::Point* offset); // Tracks the panel's initial position and attachment at the start of a drag // and informs the PanelLayoutManager that a drag has started if necessary. void StartedDragging(); // Informs the PanelLayoutManager that the drag is complete if it was informed // of the drag start. void FinishDragging(); // Updates the dragged panel's index in the launcher. void UpdateLauncherPosition(); const Details details_; // Last pointer location in screen coordinates. gfx::Point last_location_; // Wraps a window resizer and adds panel detaching / reattaching and snapping // to launcher behavior during drags. scoped_ptr next_window_resizer_; // Panel container window. aura::Window* panel_container_; aura::Window* initial_panel_container_; // Set to true once Drag() is invoked and the bounds of the window change. bool did_move_or_resize_; // True if the window started attached to the launcher. const bool was_attached_; // True if the window should attach to the launcher after releasing. bool should_attach_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(PanelWindowResizer); }; } // namespace ash #endif // ASH_WM_PANELS_PANEL_WINDOW_RESIZER_H_