root/chrome/browser/ui/panels/panel_drag_controller.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */