#ifndef START_MENU_H
#define START_MENU_H
#include <apps.h> 	// Первым! Приложение!
#include <loader.h>
#include <u.h>
#include <mem.h>
#include <utilities.h>
#include <func.h>
#include <charset_conv.h>
#include <file.h>
#include <list_ctrl.h>

#include "../../libuix/include/api.h"
#include "../../libuix/include/cs.h"

#define  ELF_NAME				"toolbar"
#define  ELF_VER				"v0.1.2"
#define  DEBUG_APP_NAME			ELF_NAME
#define  LOG_FILE  				L"file://b/"ELF_NAME".log"

#include <tadbg.h> 	// Отладчик

// ----------------------------------------------------------------------------------------- //

/* Эта структура идентифицирует приложение. Передаётся в любой обработчик событий */
typedef struct
{ 
    APPLICATION_T       apt; /* Должно обязательно присутствовать, причём первым */
	UINT8				last_state;
	
} APP_ELF_T;

/* Состояния приложения */
typedef enum
{
    APP_STATE_ANY, /* ANY-state всегда первым */
	APP_STATE_BG, 	// Свернутое состояние.
	APP_STATE_MAIN, // Контакт лист.
	APP_STATE_EDIT, // Диалог-Редактора
    APP_STATE_MAX /* Для удобства */
} APP_STATES_T;

typedef enum
{
	MAIN,
	EDIT_ITEM,
	
	EDIT_ITEM_X,
	EDIT_ITEM_Y,
	EDIT_ITEM_NAME,	 		// имя.
	EDIT_ITEM_ELF_PATH,
	EDIT_ITEM_EVENT,
	
	ABOUT, 				// О программе...
	EXIT 				// Выход
}STATES_T;

enum {
	DE_DATA_ELF = 0,
	DE_DATA_EVENT,
};

typedef struct
{
	UINT8		x;			// 
	UINT8		y;			// Положение 
	char		name[16];
	UINT8		dtype;
	char 		elf_path[128];
	UINT32		event;
	AHIBITMAP_T	bitmap;
	AHIBITMAP_T	bg;		//	Фон пункта
		
} DESKTOP_ITEM;

extern LIST 		ditems;
extern UINT32		state;
extern WCHAR		icons_dir[];
extern AHIBITMAP_T	cusor_bitmap;

ldrElf * _start( WCHAR * uri, WCHAR * params );

static UINT32 startApp( EVENT_STACK_T *ev_st,  REG_ID_T reg_id,  UINT32 param2 ); 
static UINT32 destroyApp( EVENT_STACK_T *ev_st,  APPLICATION_T *app ); // Выход
	   UINT32 AppChangeState( APPLICATION_T * app, UINT8 new_state, BOOL force_show );
static UINT32 HandleChangeState( EVENT_STACK_T * ev_st, APPLICATION_T * app );

static UINT32 MainStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );
static UINT32 EditStateEnter( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  ENTER_STATE_TYPE_T type );

static UINT32 StateExit( EVENT_STACK_T *ev_st,  APPLICATION_T *app,  EXIT_STATE_TYPE_T type );

static UINT32 HandleReqExit( EVENT_STACK_T *ev_st,  APPLICATION_T *app );
static UINT32 HandleNavigate( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 idx );
static UINT32 HandleSelect( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 idx );
static UINT32 HandleBack( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleNew( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleDelete( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 param );
static UINT32 HandleHide( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 HandleExit( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 mode );
static UINT32 EditDone( EVENT_STACK_T * ev_st, APPLICATION_T * app, UINT32 l );

static void * MainEntryReq( APPLICATION_T * app, UINT32 idx );

static UINT32 ReadSetting( void ); 	// Читаем конфиг
static UINT32 SaveSetting( void ); 	// Сохраняем конфиг

DESKTOP_ITEM * ElfGetDItem( int i );
static UIX_ICON_T ElfGetIcon( int i );

UINT32 InitResources( void );
UINT32 FreeResources( void );

#ifdef	DEBUG
static void	ReportPhoneInfo( void );
#endif	

#endif
