/*
* Copyright (c) 2007-2010 SlimDX Group
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once

namespace SlimDX
{
	namespace Windows
	{
		public enum class MonitorSearchFlags : System::Int32
		{
			DefaultToNull = MONITOR_DEFAULTTONULL,
			DefaultToNearest = MONITOR_DEFAULTTONEAREST,
			DefaultToPrimary = MONITOR_DEFAULTTOPRIMARY
		};

		public ref class DisplayMonitor : System::IEquatable<DisplayMonitor^>
		{
		private:
			HMONITOR handle;
			System::Drawing::Rectangle bounds;
			System::Drawing::Rectangle workingArea;
			bool isPrimary;
			System::String^ deviceName;
			int bitDepth;
			int refreshRate;

		public:
			DisplayMonitor(System::IntPtr handle);

			static DisplayMonitor^ FromWindow(System::IntPtr windowHandle);
			static DisplayMonitor^ FromWindow(System::IntPtr windowHandle, MonitorSearchFlags flags);

			static DisplayMonitor^ FromRectangle(System::Drawing::Rectangle rectangle);
			static DisplayMonitor^ FromRectangle(System::Drawing::Rectangle rectangle, MonitorSearchFlags flags);

			static DisplayMonitor^ FromPoint(System::Drawing::Point point);
			static DisplayMonitor^ FromPoint(System::Drawing::Point point, MonitorSearchFlags flags);

			static array<DisplayMonitor^>^ EnumerateMonitors();

			property System::Drawing::Rectangle Bounds
			{
				System::Drawing::Rectangle get() { return bounds; }
			}

			property System::Drawing::Rectangle WorkingArea
			{
				System::Drawing::Rectangle get() { return workingArea; }
			}

			property bool IsPrimary
			{
				bool get() { return isPrimary; }
			}

			property System::String^ DeviceName
			{
				System::String^ get() { return deviceName; }
			}

			property int BitDepth
			{
				int get() { return bitDepth; }
			}

			property int RefreshRate
			{
				int get() { return refreshRate; }
			}

			property System::IntPtr Handle
			{
				System::IntPtr get() { return System::IntPtr(handle); }
			}

			/// <summary>
			/// Tests for equality between two objects.
			/// </summary>
			/// <param name="left">The first value to compare.</param>
			/// <param name="right">The second value to compare.</param>
			/// <returns><c>true</c> if <paramref name="left"/> has the same value as <paramref name="right"/>; otherwise, <c>false</c>.</returns>
			static bool operator == ( DisplayMonitor^ left, DisplayMonitor^ right );

			/// <summary>
			/// Tests for inequality between two objects.
			/// </summary>
			/// <param name="left">The first value to compare.</param>
			/// <param name="right">The second value to compare.</param>
			/// <returns><c>true</c> if <paramref name="left"/> has a different value than <paramref name="right"/>; otherwise, <c>false</c>.</returns>
			static bool operator != ( DisplayMonitor^ left, DisplayMonitor^ right );

			/// <summary>
			/// Returns the hash code for this instance.
			/// </summary>
			/// <returns>A 32-bit signed integer hash code.</returns>
			virtual int GetHashCode() override;

			/// <summary>
			/// Returns a value that indicates whether the current instance is equal to a specified object. 
			/// </summary>
			/// <param name="obj">Object to make the comparison with.</param>
			/// <returns><c>true</c> if the current instance is equal to the specified object; <c>false</c> otherwise.</returns>
			virtual bool Equals( System::Object^ obj ) override;

			/// <summary>
			/// Returns a value that indicates whether the current instance is equal to the specified object. 
			/// </summary>
			/// <param name="other">Object to make the comparison with.</param>
			/// <returns><c>true</c> if the current instance is equal to the specified object; <c>false</c> otherwise.</returns>
			virtual bool Equals( DisplayMonitor^ other );
		};
	}
}