// 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_
