| // 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 CHROME_BROWSER_UI_PANELS_PANEL_DRAG_CONTROLLER_H_ |
| #define CHROME_BROWSER_UI_PANELS_PANEL_DRAG_CONTROLLER_H_ |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/browser/ui/panels/panel_collection.h" |
| #include "ui/gfx/vector2d.h" |
| |
| class Panel; |
| class PanelCollection; |
| class PanelManager; |
| namespace gfx { |
| class Point; |
| class Rect; |
| } |
| |
| // Controls all the drags initiated for all panels, including detaching, |
| // docking, stacking, snapping and intra-collection dragging. |
| class PanelDragController { |
| public: |
| explicit PanelDragController(PanelManager* panel_manager); |
| ~PanelDragController(); |
| |
| // Drags the given panel. |
| // |mouse_location| is in screen coordinate system. |
| void StartDragging(Panel* panel, const gfx::Point& mouse_location); |
| void Drag(const gfx::Point& mouse_location); |
| void EndDragging(bool cancelled); |
| |
| // Asynchronous confirmation of panel having been closed. |
| void OnPanelClosed(Panel* panel); |
| |
| bool is_dragging() const { return dragging_panel_ != NULL; } |
| Panel* dragging_panel() const { return dragging_panel_; } |
| |
| // For testing. |
| static int GetDetachDockedPanelThresholdForTesting(); |
| static int GetDockDetachedPanelThresholdForTesting(); |
| static int GetGluePanelDistanceThresholdForTesting(); |
| static int GetGluePanelOverlapThresholdForTesting(); |
| static int GetSnapPanelToScreenEdgeThresholdForTesting(); |
| |
| private: |
| enum GlueAction { |
| STACK, |
| SNAP |
| }; |
| |
| enum GlueEdge { |
| TOP_EDGE, |
| BOTTOM_EDGE, |
| LEFT_EDGE, |
| RIGHT_EDGE |
| }; |
| |
| gfx::Point GetPanelPositionForMouseLocation( |
| const gfx::Point& mouse_location) const; |
| |
| // |target_position| is in screen coordinate systems. It contains the proposed |
| // panel origin to move to. Returns true if the request has been performed. |
| void TryDetach(const gfx::Point& target_position); |
| void TryDock(const gfx::Point& target_position); |
| void TryStack(const gfx::Point& target_position); |
| bool TryUnstackFromTop(const gfx::Point& target_position); |
| bool TryUnstackFromBottom(const gfx::Point& target_position); |
| void TrySnap(gfx::Point* target_position); |
| |
| // Finds the panel that the dragging panel with |potential_position| could |
| // snap to or stack with. If such panel is found, |target_bounds| contains the |
| // new bounds for the dragging panel and |target_edge| contains the matched |
| // edge. |
| Panel* FindPanelToGlue(const gfx::Point& potential_position, |
| GlueAction action, |
| gfx::Rect* target_bounds, |
| GlueEdge* target_edge) const; |
| |
| // Moves the |panel| (and all panels below if it is in a stack) to a different |
| // collection. |
| void MovePanelAndBelowToCollection( |
| Panel* panel, |
| PanelCollection* target_collection, |
| PanelCollection::PositioningMask positioning_mask) const; |
| |
| PanelManager* panel_manager_; // Weak, owns us. |
| bool panel_stacking_enabled_; |
| |
| // Panel currently being dragged. |
| Panel* dragging_panel_; |
| |
| // The original panel collection when the drag is started. |
| PanelCollection* dragging_panel_original_collection_; |
| |
| // The offset from mouse location to the panel position when the drag |
| // starts. |
| gfx::Vector2d offset_from_mouse_location_on_drag_start_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PanelDragController); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_PANELS_PANEL_DRAG_CONTROLLER_H_ |