// 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 UI_GFX_SCREEN_H_
#define UI_GFX_SCREEN_H_

#include <vector>

#include "base/basictypes.h"
#include "ui/gfx/display.h"
#include "ui/gfx/gfx_export.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/point.h"
#include "ui/gfx/screen_type_delegate.h"

namespace gfx {
class DisplayObserver;
class Rect;

// A utility class for getting various info about screen size, displays,
// cursor position, etc.
//
// Note that this class does not represent an individual display connected to a
// computer -- see the Display class for that. A single Screen object exists on
// most operating systems regardless of the number of connected displays. On
// Windows 8, two Screens exist: one for Metro UI and another for the desktop.
class GFX_EXPORT Screen {
 public:
  // Retrieves the Screen that the specified NativeView belongs to. A value of
  // NULL is treated as |SCREEN_TYPE_NATIVE|.
  static Screen* GetScreenFor(NativeView view);

  // Returns the SCREEN_TYPE_NATIVE Screen. This should be used with caution,
  // as it is likely to be incorrect for code that runs on Windows.
  static Screen* GetNativeScreen();

  // Sets the global screen for a particular screen type. Only the _NATIVE
  // ScreenType must be provided.
  static void SetScreenInstance(ScreenType type, Screen* instance);

  // Returns the global screen for a particular type. Types other than _NATIVE
  // may be NULL.
  static Screen* GetScreenByType(ScreenType type);

  // Sets the global ScreenTypeDelegate. May be left unset if the platform
  // uses only the _NATIVE ScreenType.
  static void SetScreenTypeDelegate(ScreenTypeDelegate* delegate);

  Screen();
  virtual ~Screen();

  // Returns the current absolute position of the mouse pointer.
  virtual gfx::Point GetCursorScreenPoint() = 0;

  // Returns the window under the cursor.
  virtual gfx::NativeWindow GetWindowUnderCursor() = 0;

  // Returns the window at the given screen coordinate |point|.
  virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) = 0;

  // Returns the number of displays.
  // Mirrored displays are excluded; this method is intended to return the
  // number of distinct, usable displays.
  virtual int GetNumDisplays() const = 0;

  // Returns the list of displays that are currently available.
  virtual std::vector<gfx::Display> GetAllDisplays() const = 0;

  // Returns the display nearest the specified window.
  // If the window is NULL or the window is not rooted to a display this will
  // return the primary display.
  virtual gfx::Display GetDisplayNearestWindow(NativeView view) const = 0;

  // Returns the display nearest the specified point.
  virtual gfx::Display GetDisplayNearestPoint(
      const gfx::Point& point) const = 0;

  // Returns the display that most closely intersects the provided bounds.
  virtual gfx::Display GetDisplayMatching(
      const gfx::Rect& match_rect) const = 0;

  // Returns the primary display.
  virtual gfx::Display GetPrimaryDisplay() const = 0;

  // Adds/Removes display observers.
  virtual void AddObserver(DisplayObserver* observer) = 0;
  virtual void RemoveObserver(DisplayObserver* observer) = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(Screen);
};

Screen* CreateNativeScreen();

}  // namespace gfx

#endif  // UI_GFX_SCREEN_H_
