/*
   ui/ui.h
   This file is part of the Osirion project and is distributed under
   the terms of the GNU General Public License version 2
*/

#ifndef __INCLUDED_UI_H__
#define __INCLUDED_UI_H__

#include "ui/console.h"
#include "ui/font.h"
#include "ui/palette.h"
#include "ui/tooltip.h"
#include "ui/widget.h"
#include "ui/window.h"

namespace ui
{

class UI : public Window
{
public:
	/// constructor
	UI();

	/// destructor
	~UI();

	/// list widgets
	void list() const;

	/// list visible widgets
	void list_visible() const;

	/// the console
	inline Console *console() {
		return ui_console;
	}

	/// return the widget with global mouse focus
	inline Widget *mouse_focus() const {
		return ui_mouse_focus;
	}

	/// return the widget with global input focus
	inline Widget *input_focus() const {
		return ui_input_focus;
	}

	/// receive global mouse movement
	void input_mouse(const float x, const float y);
	
	/// receive global mouse button events
	bool input_mouse_button(const bool pressed, unsigned int button);
	
	/// receive global mouse wheel events
	bool input_mouse_wheel(const math::Vector2f & direction);

	/// receive global keyboard events
	bool input_key(const bool pressed, const int key, const unsigned int modifier);

	/// run a user interface frame
	void frame();

	/// load settings from ui.ini
	void load_settings();

	/* -- fonts ------------------------------------------------ */
	
	/// default tiny font
	inline const Font *font_tiny() const {
		return ui_font_tiny;
	}
	
	/// default small font
	inline const Font *font_small() const {
		return ui_font_small;
	}

	/// default medium font
	inline const Font *font_large() const {
		return ui_font_large;
	}

	inline const math::Vector2f & global_mouse_coords()
	{
		return mouse_cursor;
	}
	
	/* -- mouse pointer ---------------------------------------- */

	/// set mouse pointer bitmap
	void set_pointer(const char *pointerbitmap = 0, const Palette::Color color = Palette::Highlight, const bool animated = false);

	static bool		ui_debug;
		
	/**
	 * global size of a ui element, used by resize() functions
	 * */
	static math::Vector2f	elementsize;
	/**
	 * global padding between ui elements, used by resize() functions
	 * */
	static float		padding;
	/**
	 * global margin for frames and widgets, used by resize() functions
	 * see @Widget::resize();
	 * */
	static float		margin;
	
	static float		pointer_size;
	

protected:
	/* -- event handlers --------------------------------------- */

	/// handle keypress events
	virtual bool on_keypress(const int key, const unsigned int modifier);

	/// handle key release events
	virtual bool on_keyrelease(const int key, const unsigned int modifier);

private:	
	void draw_pointer();

	Palette			*ui_palette;
	Font			*ui_font_tiny;
	Font			*ui_font_small;
	Font			*ui_font_large;

	Widget			*ui_mouse_focus;
	Widget			*ui_input_focus;

	Console			*ui_console;

	/// TODO move to separate object to handle mouse cursor drawing
	math::Vector2f		mouse_cursor;
	std::string		mouse_pointer_bitmap;
	Palette::Color		mouse_pointer_color;
	bool			mouse_pointer_animated;
	bool			mouse_buttonleft_pressed;
	
	unsigned long		ui_tooltip_timestamp;
};

/// initialize the user interface
void init();

/// shutdown the user interface
void shutdown();

/// the global root window
UI *root();

/// the console
inline Console *console()
{
	return root()->console();
}

/// debug mode
inline bool debug()
{
	return UI::ui_debug;
}

}

#endif //  __INCLUDED_UI_H__