Home | History | Annotate | Download | only in tabs
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_TABS_DOCK_INFO_H_
      6 #define CHROME_BROWSER_UI_TABS_DOCK_INFO_H_
      7 
      8 #include <set>
      9 
     10 #include "chrome/browser/ui/host_desktop.h"
     11 #include "ui/gfx/native_widget_types.h"
     12 #include "ui/gfx/point.h"
     13 #include "ui/gfx/rect.h"
     14 
     15 // DockInfo is used to do determine possible dock locations for a dragged
     16 // tab. To use DockInfo invoke GetDockInfoAtPoint. This returns a new
     17 // DockInfo whose type indicates the type of dock that should occur based
     18 // on the screen location. As the user drags the mouse around invoke
     19 // IsValidForPoint, this returns true if the DockInfo is still valid for the
     20 // new location. If the DockInfo is not valid, invoke GetDockInfoAtPoint to
     21 // get the new DockInfo. Use GetNewWindowBounds to get the position to place
     22 // the new window at.
     23 //
     24 // DockInfos are cheap and explicitly allow copy and assignment operators.
     25 class DockInfo {
     26  public:
     27   // Possible dock positions.
     28   enum Type {
     29     // Indicates there is no valid dock position for the current location.
     30     NONE,
     31 
     32     // Indicates the new window should be positioned relative to the window
     33     // identified by window().
     34     LEFT_OF_WINDOW,
     35     RIGHT_OF_WINDOW,
     36     BOTTOM_OF_WINDOW,
     37     TOP_OF_WINDOW,
     38 
     39     // Indicates the window should be maximized on the monitor at hot_spot.
     40     MAXIMIZE,
     41 
     42     // Indicates the window should be docked to a specific side of the monitor.
     43     LEFT_HALF,
     44     RIGHT_HALF,
     45     BOTTOM_HALF
     46   };
     47 
     48   DockInfo() : type_(NONE), window_(NULL), in_enable_area_(false) {}
     49 
     50   // Returns true if |screen_loc| is close to the hotspot at |x|, |y|. If the
     51   // point is close enough to the hotspot true is returned and |in_enable_area|
     52   // is set appropriately.
     53   static bool IsCloseToPoint(const gfx::Point& screen_loc,
     54                              int x,
     55                              int y,
     56                              bool* in_enable_area);
     57 
     58   // Variant of IsCloseToPoint used for monitor relative positions.
     59   static bool IsCloseToMonitorPoint(const gfx::Point& screen_loc,
     60                                     int x,
     61                                     int y,
     62                                     DockInfo::Type type,
     63                                     bool* in_enable_area);
     64 
     65   // Size of the popup window shown to indicate a valid dock location.
     66   static int popup_width();
     67   static int popup_height();
     68 
     69   // Returns the DockInfo for the specified point |screen_point|. |ignore|
     70   // contains the set of windows to ignore from consideration. This contains the
     71   // dragged window as well as any windows showing possible dock locations.
     72   //
     73   // If there is no docking position for the specified location the returned
     74   // DockInfo has a type of NONE.
     75   static DockInfo GetDockInfoAtPoint(chrome::HostDesktopType host_desktop_type,
     76                                      const gfx::Point& screen_point,
     77                                      const std::set<gfx::NativeView>& ignore);
     78 
     79   // Returns the top most window from the current process at |screen_point|.
     80   // See GetDockInfoAtPoint for a description of |ignore|. This returns NULL if
     81   // there is no window from the current process at |screen_point|, or another
     82   // window obscures the topmost window from our process at |screen_point|.
     83   static gfx::NativeWindow GetLocalProcessWindowAtPoint(
     84       chrome::HostDesktopType host_desktop_type,
     85       const gfx::Point& screen_point,
     86       const std::set<gfx::NativeView>& ignore);
     87 
     88   static int GetHotSpotDeltaY();
     89 
     90   // Returns true if this DockInfo is valid for the specified point. This
     91   // resets in_enable_area based on the new location.
     92   bool IsValidForPoint(const gfx::Point& screen_point);
     93 
     94   // Returns the bounds for the new window in |new_window_bounds|. If the new
     95   // window is to be maximized, |maximize_new_window| is set to true.
     96   // This returns true if type is other than NONE or the mouse isn't in the
     97   // enable area, false otherwise.
     98   bool GetNewWindowBounds(gfx::Rect* new_window_bounds,
     99                           bool* maximize_new_window) const;
    100 
    101   // Adjust the bounds of the other window during docking. Does nothing if type
    102   // is NONE, in_enable_are is false, or the type is not window relative.
    103   void AdjustOtherWindowBounds() const;
    104 
    105   // Type of docking to occur.
    106   void set_type(Type type) { type_ = type; }
    107   Type type() const { return type_; }
    108 
    109   // The window to dock too. Is null for dock types that are relative to the
    110   // monitor.
    111   void set_window(gfx::NativeWindow window) { window_ = window; }
    112   gfx::NativeWindow window() const { return window_; }
    113 
    114   // The location of the hotspot.
    115   void set_hot_spot(const gfx::Point& hot_spot) { hot_spot_ = hot_spot; }
    116   const gfx::Point& hot_spot() const { return hot_spot_; }
    117 
    118   // Bounds of the monitor.
    119   void set_monitor_bounds(const gfx::Rect& monitor_bounds) {
    120     monitor_bounds_ = monitor_bounds;
    121   }
    122   const gfx::Rect& monitor_bounds() const { return monitor_bounds_; }
    123 
    124   // Returns the bounds of the window to show the indicator for.
    125   gfx::Rect GetPopupRect() const;
    126 
    127   // Returns true if the drop should result in docking. DockInfo maintains two
    128   // states (as indicated by this boolean):
    129   // 1. The mouse is close enough to the hot spot such that a visual indicator
    130   //    should be shown, but if the user releases the mouse docking shouldn't
    131   //    result. This corresponds to a value of false for in_enable_area.
    132   // 2. The mouse is close enough to the hot spot such that releasing the mouse
    133   //    should result in docking. This corresponds to a value of true for
    134   //    in_enable_area.
    135   void set_in_enable_area(bool in_enable_area) {
    136     in_enable_area_ = in_enable_area;
    137   }
    138   bool in_enable_area() const { return in_enable_area_; }
    139 
    140   // Returns true if |other| is considered equal to this. Two DockInfos are
    141   // considered equal if they have the same type and same window.
    142   bool equals(const DockInfo& other) const {
    143     return type_ == other.type_ && window_ == other.window_ &&
    144            monitor_bounds_ == other.monitor_bounds_;
    145   }
    146 
    147   // If screen_loc is close enough to the hot spot given by |x| and |y|, the
    148   // type and hot_spot are set from the supplied parameters. This is used
    149   // internally, there is no need to invoke this otherwise.
    150   bool CheckMonitorPoint(const gfx::Point& screen_loc,
    151                          int x,
    152                          int y,
    153                          Type type);
    154 
    155  private:
    156   // Returns the bounds of the window.
    157   bool GetWindowBounds(gfx::Rect* bounds) const;
    158 
    159   // Sets the bounds of |window_| to |bounds|.
    160   void SizeOtherWindowTo(const gfx::Rect& bounds) const;
    161 
    162   Type type_;
    163   gfx::NativeWindow window_;
    164   gfx::Point hot_spot_;
    165   gfx::Rect monitor_bounds_;
    166   bool in_enable_area_;
    167 };
    168 
    169 #endif  // CHROME_BROWSER_UI_TABS_DOCK_INFO_H_
    170