#ifndef __Menu__H
#define __Menu__H

#include "std.h"
#include <stdbool.h>
#include "WimpLib:Coords.h"
#include "WimpLib:EventSender.h"
#include "WimpLib:Event.h"

#ifdef __cplusplus
extern "C" {
#endif

const int32_t* Menu_GetContext(void);
void Menu_SetContext(const int32_t* hits, int32_t x, int32_t y);

typedef EListenerAction (*menu_handler)(void* pHandle, const int* hit, const Event* e);

HMenu throw_New_Menu_Empty(const char* title);
HMenu throw_New_Menu(const char* title, const char* items);
void Delete_Menu(HMenu, bool bTree);
void Menu_Open(HMenu menu, menu_handler pHandler, void* pHandle);
void Menu_Popup(HWind w, HIcon icon, HMenu menu, menu_handler pHandler, void* pHandle);
void Menu_OpenWindow(HWind w);
void Menu_PopupWindow(HWind w, HIcon icon, HWind w2);

int  throw_Menu_InsertItem(HMenu menu, const char* item,int i);
int  throw_Menu_InsertRightItem(HMenu menu, const char* item,int i);
const char* Menu_ItemGetText(HMenu menu, int i);
void throw_Menu_ItemSetText(HMenu menu, int i, const char* pText);
int  Menu_FindItem(HMenu menu, const char* pstring);
int  Menu_CountItems(HMenu menu);

typedef enum
{
	  EMenu_Item_Tick
	, EMenu_Item_Fade
	, EMenu_Item_BgColor
	, EMenu_Item_FgColor
	, EMenu_Item_SubMenu
	, EMenu_Item_Separator
} EMenu_Item_Property;

int  Menu_ItemGetProperty(HMenu menu, int index, EMenu_Item_Property prop);
void Menu_ItemSetProperty(HMenu menu, int index, EMenu_Item_Property prop, int value);
void Menu_ItemTick(HMenu menu, int i, bool tick);
void Menu_ItemFade(HMenu menu, int i, bool fade);
void Menu_ItemSetSubMenu(HMenu menu, int i, HMenu submenu);
HMenu Menu_ItemGetSubMenu(HMenu menu, int i);
bool Menu_HelpReply(HMenu menu, const Msg_HelpRequest* msg);

// Requires on open menu
void Menu_Close(void);
void Menu_OpenDefaultSubMenu(void);
void Menu_OpenSubMenu(HMenu submenu);
void Menu_OpenSubWindow(HWind w);
void Menu_GetState(int* hit);
void Menu_Decode(char* string, const int* hit);
void Menu_Refresh(HWind w, const int* hit);

// Menu handling, for Task.c only
EListenerAction Menu_ProcessEvent(const Event* e);
EListenerAction Menu_PostProcessEvent(const Event* e);

#ifdef __cplusplus
}
#endif

#endif
