/*  $Id: input_device_win32mouse.cpp,v 1.15 2004/04/14 20:46:56 sphair Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  Lesser General Public License for more details.
**
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

#include "Display/display_precomp.h"
#include "API/Display/input_event.h"
#include "API/Core/System/clanstring.h"
#include "input_device_win32mouse.h"
#include "display_window_win32.h"
#include <stdio.h>

/////////////////////////////////////////////////////////////////////////////
// CL_InputDevice_Win32Mouse construction:

CL_InputDevice_Win32Mouse::CL_InputDevice_Win32Mouse(CL_DisplayWindow_Win32 *window) : window(window)
{
	type = CL_InputDevice::mouse;
	for (int i=0; i<32; i++) key_states[i] = false;
	slots.connect(sig_key_down, this, &CL_InputDevice_Win32Mouse::on_key_down);
	slots.connect(sig_key_up, this, &CL_InputDevice_Win32Mouse::on_key_up);
}

CL_InputDevice_Win32Mouse::~CL_InputDevice_Win32Mouse()
{
}

/////////////////////////////////////////////////////////////////////////////
// CL_InputDevice_Win32Mouse attributes:

int CL_InputDevice_Win32Mouse::get_x() const
{
	POINT cursor_pos;
	GetCursorPos(&cursor_pos);

	BOOL res = ScreenToClient(window->get_hwnd(), &cursor_pos);
	if (res == FALSE) return 0;

	return cursor_pos.x;
}

int CL_InputDevice_Win32Mouse::get_y() const
{
	POINT cursor_pos;
	GetCursorPos(&cursor_pos);

	BOOL res = ScreenToClient(window->get_hwnd(), &cursor_pos);
	if (res == FALSE) return 0;

	return cursor_pos.y;
}

bool CL_InputDevice_Win32Mouse::get_keycode(int keycode) const
{
	if (keycode < 0 || keycode >= 32) return false;
	return key_states[keycode];
}

std::string CL_InputDevice_Win32Mouse::get_key_name(int id) const
{
	switch (id)
	{
	case 0: return "Mouse left";
	case 1: return "Mouse right";
	case 2: return "Mouse middle";
	case 3: return "Mouse wheel up";
	case 4: return "Mouse wheel down";
	}

	return CL_String::format("Mouse button %1", id);
}

float CL_InputDevice_Win32Mouse::get_axis(int index) const
{
	return 0.0f;
}

std::string CL_InputDevice_Win32Mouse::get_name() const
{
	return "System Mouse";
}

int CL_InputDevice_Win32Mouse::get_axis_count() const
{
	return 0;
}

int CL_InputDevice_Win32Mouse::get_button_count() const
{
	return -1;
}

/////////////////////////////////////////////////////////////////////////////
// CL_InputDevice_Win32Mouse operations:

void CL_InputDevice_Win32Mouse::set_position(int x, int y)
{
	POINT pt;
	pt.x = x;
	pt.y = y;
	
	ClientToScreen(window->get_hwnd(), &pt);
	SetCursorPos(pt.x, pt.y);
}

/////////////////////////////////////////////////////////////////////////////
// CL_InputDevice_Win32Mouse implementation:

void CL_InputDevice_Win32Mouse::on_key_down(const CL_InputEvent &event)
{
	key_states[event.id] = true;
}

void CL_InputDevice_Win32Mouse::on_key_up(const CL_InputEvent &event)
{
	key_states[event.id] = false;
}
