#ifndef SDK_UIS_H
#define SDK_UIS_H

#include <apps.h>
#include <typedefs.h>
#include <stdarg.h>
#include <resources.h>

// типы для Trancient Notice
enum
{
	NOTICE_TYPE_DEFAULT = 0,// значек "внимание"
	NOTICE_TYPE_OK,			// галачк?
	NOTICE_TYPE_FAIL,		// крести?
	NOTICE_TYPE_WAIT_NO_KEY,// кнопки блокируются, ?контенту ?конц?добавляют? точк? приложение должно само какт?вывест?из стэйта
							// кнопками можн?вывест?только вызвав метк?(пр?этом закроется приложение)
	NOTICE_TYPE_WAIT_2,		// точе?не? пр?нажати?на любу?кнопку генерирует? ивен?EV_DIALOG_DONE
	NOTICE_TYPE_INFO_NO_KEY,// на кнопки не реагируе?
	NOTICE_TYPE_INFO,
	NOTICE_TYPE_OK_2,
	
	NOTICE_TYPE_DELETED = 12,
	NOTICE_TYPE_NEW_MESSAGE,
	NOTICE_TYPE_SMS,
	NOTICE_TYPE_SEND,
	NOTICE_TYPE_SEND_CENTER,// на скин?mpx_ultra крив?выгляде?
	
	NOTICE_TYPE_WAIT_3 = 27,// ?точкам? кнопки не блокируются
	NOTICE_TYPE_WAIT_4,		// текс?слев? ?точкам? пр?нажати?красно?генерирует? EV_DIALOG_DONE
	NOTICE_TYPE_INFO_LONG,
	NOTICE_TYPE_WAIT_FAST,	// диалог ожидан? на по?секунд?
	
	NOTICE_TYPE_WAIT_5 = 32,// такж?ка?NOTICE_TYPE_WAIT_2
	
	NOTICE_TYPE_WAIT_6 = 37,// цент? ?точкам? пр?нажати?любо?кнопки генерирует? EV_DIALOG_DONE
	
	NOTICE_TYPE_CHAT = 45,
	NOTICE_TYPE_NEW_CHAT_MESSAGE
	
	// дальше ничего интересног?врод?
};


typedef struct  
{
	RESOURCE_ID 	icon1; 
    RESOURCE_ID		icon2; 

    RESOURCE_ID   	animation_icon1;
    RESOURCE_ID   	animation_icon2;

    void *			unk1;
    RESOURCE_ID	  	title; 
    UINT8			unk2[3];

} NOTICE_PARAMETERS_T;







// Action list
enum
{
	ACTION_OP_ADD = 0,  // Добавить действие
	ACTION_OP_DELETE,   // Удалит?действие
	ACTION_OP_UPDATE	// Изменить действие
};

typedef struct
{
	UINT8			 operation;		// Чт?делать ?текущи?пункто?(ACTION_OP_*)
	EVENT_CODE_T	  event;			// Ивен? которы?создаётся пр?выборе этог?действ?
	RESOURCE_ID	action_res;	// Ресурс, описывающи?действие (см. RES_ACTION_LIST_ITEM_T)

} ACTION_ENTRY_T;

typedef struct
{
	UINT8			 count;			// Ко?во элементо?
	ACTION_ENTRY_T	action[16];	// Список команд дл работы со списко?действий

} ACTIONS_T;


// Content
typedef struct
{
	char			format[40];
	UINT32			count;
	UINT32			data[40];
} CONTENT_T;

#define UI_CONTENT		CONTENT_T



// List

enum {
	LIST_TYPE_DEFAULT = 0,
	LIST_TYPE_DETAIL,
	LIST_TYPE_DEFAULT_2,
	LIST_TYPE_DETAIL_2,
	LIST_TYPE_DETAIL_3,
	LIST_TYPE_DETAIL_4,
	LIST_TYPE_NO_LIST,
	LIST_TYPE_DEFAULT_SUBTITLE,
	LIST_TYPE_DEFAULT_4
};



typedef struct
{
	RESOURCE_ID		field_res;	// Ресурс ?FIELD_DESCR_T
	//UINT32			data;		 // Текуще?значение (RESOURCE_ID / WCHAR * / CONTENT_T * / UINT32)
	// ти?задаеется ?FIELD_DESCR_T
	union {								// значение по?
		UINT32		val_dword;
		UINT16		val_word;
		UINT8		val_byte;
		void *		val_ptr;
		
		UINT32		u0;		// 0
		UINT32		u1;		// 1
		UINT32		u2;		// 2
		WCHAR *		str;	// 3
		struct {			// 4
			INT16		num;
			UINT8		text_type;	// 0="дней", 1="сообщени?, 2="Не?(бе?варианто?, 3=""
		} meter;	// счетчи?(сообщени?дней )
	} data;
	BOOL			unk3;	 
	BOOL			unk4;
	BOOL			unk5;		 // = 0
} FIELD_T;


typedef struct
{
	CONTENT_T		text;
	UINT32			unk1;
	RESOURCE_ID		marks[2];
	RESOURCE_ID		unk3[2];
	RESOURCE_ID		unk4[2];
	UINT8			unk5;
	BOOL			can_mark; // если TRUE, то ?пункта буде?отступ для метк?
							// если пр?создании диалог?было указан?0 мето? то параметр ника?не вл?ет
							// для диалог?SelectionEditor должно быть TRUE,
							//  ?? эт?диалог для выбора куда поставит?метк? ?отступ заложе?изначально
} STATIC_LIST_ENTRY_T;  

typedef union
{
	STATIC_LIST_ENTRY_T		static_entry;	// Использует?, когд?editable == FALSE
	FIELD_T					editable_entry;	// Использует?, когд?editable == TRUE
	UINT8					pad[0xEC];		// pad to real size
} LIST_CONTENT_T;


typedef struct
{
	BOOL					editable;   // Возможно ли изме?ть содержимое
	UINT32					unk1;	// ??
	LIST_CONTENT_T			content;
	
	UINT8				pad[4];
} LIST_ENTRY_T;




#ifdef __cplusplus
extern "C" {
#endif

	  /* Вспомогательны?функци?*/
	  
	  
/* Создаё?контен?*/
/* Подробне?пр?строку format:
	Строка состои?из указателей на входящи?параметр?
	?спецификаторов выравниван?.
	Указател?формируются ка?ти??номе?параметр??функци?
	возможны?типы:
	q - указател?на WCHAR строку
	s - ресурс строки
	i - int
	g - hex int
	p - ресурс картинки
	r - CONTENT_T
	f - указател?на файл
	
	d - ?
	t - ?
	e - ?
	h - ?
	j - ?
	l - ?
	
	Спецификатор?выравниван?:
	N - новая строка
	S - распределени?текста
	C - текс?по центру
	L - обрезать ?"...", если строка слишко?длинная
	M - текс?посередине (вертикальное выравнивание)
	T - текс?сверху
	B - текс?сниз?
	
	H - отступ
	F - новая строка? заче?
	E - ?
	I - ?
	
	Например: "MCq0p1" = "Вывест?посередине ?по центру первый 
	параметр посл?dst ка?строку, ?второй - ка?картинку" */
UINT32 UIS_MakeContentFromString( const char * format,  CONTENT_T * dst,  ... );

/* Стандартны?обработчик EV_GRANT_TOKEN */
UINT32 APP_HandleUITokenGranted( EVENT_STACK_T * ev_st,  void * app );

/* Стандартны?обработчик EV_REVOKE_TOKEN */
UINT32 APP_HandleUITokenRevoked( EVENT_STACK_T * ev_st,  void * app );

/* То же, чт?APP_UtilChangeState, но пр?этом ещ?буде?извлечён(consumed) event */
UINT32 APP_UtilConsumeEvChangeState( UINT8 new_state,  EVENT_STACK_T * ev_st,  void * app );

/* Передаёт ивен?диалог?на обработк?*/
UINT32 UIS_HandleEvent( UIS_DIALOG_T dialog,  EVENT_STACK_T * ev_st );

/* Вызват?полную перерисовк?UI */
UINT32 UIS_Refresh( void );

/* Вызват?полную перерисовк?UI */
UINT32 UIS_ForceRefresh( void );

/* Удаляет диалог ?выстав?ет ег??NULL */
UINT32 APP_UtilUISDialogDelete( UIS_DIALOG_T * dialog );




/* Изменить список действий */
UINT32 UIS_SetActionList( UIS_DIALOG_T pdialog, ACTIONS_T * actions );







#define DialogType_Dialling 0x05 //dial-up window
#define DialogType_EnterName 0x08 //input names. . .
#define DialogType_SetDate 0x0B //Set Date
#define DialogType_SetTime 0x0D //set-up time
#define DialogType_Homescreen 0x0E //desktop standby
#define DialogType_DeskTop DialogType_Homescreen
#define DialogType_list 0x10 //Item List
#define DialogType_SelectionList 0x13 //options
#define DialogType_BatteryandMemory 0x15 //power, memory usage information, such as window howed that the grid
#define DialogType_JumpOut 0x17 //pop-up window, such as "keyboard is locked, unlocked by XX", "please wait" category
#define DialogType_MessageBox 0x1B //information inbox
#define DialogType_GameAni 0x1D //games and applications when they enter the animation
#define DialogType_WapMenu 0x1E //Wap browser-related menu
#define DialogType_VideoCamera 0x25 //Camera viewfinder window
#define DialogType_Password 0x26 //Password window
#define DialogType_PB_SC_Other 0x28 //phone book, Shortcuts like, a lot of this state
#define DialogType_Menu 0x2D //Main Menu
#define DialogType_SecondLevelMenu 0x2E //2 of the three menu and the menu
#define DialogType_WriteText 0x32 //input text
#define DialogType_Brightness 0x37 //Settings - brightness - highlighted regulation
#define DialogType_Picture 0x39 //Multimedia - picture

UINT32 UIS_GetActiveDialogType( UINT8 * result );




/* *****************************************
 Изменени?элементо? рабочего стол?
***************************************** */
#define BATTERY_STRENGTH_STATUS		0  //батарея: значен? integer от 0 до 3
#define SIGNAL_STRENGTH_STATUS		3  //сигнал сети: значен? integer от 0 до 5

#ifdef FTR_L7E
	#define GPRS_STATUS					0x1E // строка ?поле даты
	#define NETWORK_STATUS  			0x28 // строка ?поле оператор?
#else
	#define GPRS_STATUS					0x1D // строка ?поле даты
	#define NETWORK_STATUS  			0x27 // строка ?поле оператор?
#endif

extern const UINT8 * ITUNES_STATUS;
#define ITUNES_STATE_STATUS		*(ITUNES_STATUS+1) //  integer: 0 - no, 1 - play, 2 - pause

// для L7e ?подобных могу?не подходит?
#define AUDIO_STATUS 				0x69 // иконки стандартного аудиоплеер?
#define READY_STATUS 				47
#define PROVIDER_NAME_STATUS 		55

typedef union
{
    INT32		integer;
    BOOL		boolean;
    WCHAR *		quoted_string;
    UINT64		unk;
} STATUS_VALUE_T;

UINT32 UIS_SetStatus ( UINT8 id,  STATUS_VALUE_T status ); 

UINT32 UIS_SetStatusOff( UINT8 id, STATUS_VALUE_T status );

UINT32 UIS_GetCurrentStatusValue( UINT8 id, STATUS_VALUE_T * status ); 

typedef struct {
	WCHAR * 	uri;
	UINT32		unk;
} UIS_SETWALLPAPER_SETTINGS_T;

UINT32 UIS_SetWallpaper( UIS_SETWALLPAPER_SETTINGS_T * ws );


// -----------------------------------------------------------------------------------------
// dialogs
		/* Функци?создан? диалогов */


			/* Диалог?оповещен? */
/* Создаё?окошко ?сообщением. type = NOTICE_TYPE_* */
UIS_DIALOG_T
UIS_CreateNotice( SU_PORT_T *	port,
				CONTENT_T *		content,
				UINT32			duration,
				UINT8			type,
				BOOL			no_transient, // Если TRUE диалог не удаляет? таймером ?не реагируе?на KEY_PRESS
				ACTIONS_T *		action_list );

/* Создаё?временно?окошко ?сообщением. type = NOTICE_TYPE_* */
UIS_DIALOG_T
UIS_CreateTransientNotice( SU_PORT_T * port,  CONTENT_T * content,  UINT8 type );

UIS_DIALOG_T
UIS_CreateExtendedNotice( SU_PORT_T *		port,  
							CONTENT_T *		content,
							UINT32			duration, // время отображения
							UINT8			type, 
							UINT16 			status,
							NOTICE_PARAMETERS_T 	parameters,
							ACTIONS_T *		actions );


			/* Диалог?вывода контента */

/* Создае?диалог вывода контента */
UIS_DIALOG_T
UIS_CreateViewer( SU_PORT_T *	port,
				CONTENT_T *		contents,
				ACTIONS_T *		actions );

/* Создае?диалог вывода контента, гд?заголово??тело задают? отдельно */
UIS_DIALOG_T
UIS_CreateViewerWithTitle( SU_PORT_T *		port,
							CONTENT_T *		title,
							CONTENT_T *		body,
							ACTIONS_T *		actions,
							RESOURCE_ID		dlgres );


			/* Диалог?списко?*/

/* Создаё?статичекий диалог-список */
UIS_DIALOG_T
UIS_CreateStaticList( SU_PORT_T *		port,
						UINT32			param1,		  // = 0 ID?
						UINT32			count,
						UINT32			marks,
						LIST_ENTRY_T *	entries, 
						UINT8			param5,		  // = 0
						UINT8			list_type,	  // = 2
						ACTIONS_T *		actions,
						RESOURCE_ID		caption );

/* Создаё?диалог-список ?заране?неизвестны?ил?изме?емым содержимым */
UIS_DIALOG_T
UIS_CreateList( SU_PORT_T *		port,
				UINT32			param1,			// = 0  ID?
				UINT32			count,			// Количество пункто??списке
				UINT32			marks_num,		// Количество мето? которо?може?быть ?одного пункта. Если 1, то вс?надпис?сдвигают? на ширину одно?метк? если 2, то на ширину двух мето?
				UINT32 *		starting_num,	// Скольк?пункто?требуется передать для инициализаци?
				UINT8			param5,			// = 0
				UINT8			list_type,		// = 2
				ACTIONS_T *		actions,		// Список действий
				RESOURCE_ID		list_res );		// Заголово?списка, ресурс типа RES_TYPE_LIST_DESCR, структур?RES_LIST_DESCR_T




/* Создае?диалог картинки (превью) ?тексто? Ка??браузере картинок */
UIS_DIALOG_T
UIS_CreatePictureAndTextList( SU_PORT_T *	port,
							UINT32			param1,
							UINT32			count, 
							UINT32 *		starting_num, 
							UINT8			list_type, // = 2
							UINT8			param5, // = 0
							UINT8			param6, // = 1, try 0,2,...
							ACTIONS_T *		actions, 
							RESOURCE_ID		dlgres );

// создат?диалог-список выбора значен?. ?галочкой.
UIS_DIALOG_T
UIS_CreateStaticSelectionEditor( SU_PORT_T *	port,
								UINT32			param1,
								UINT32			count,
								LIST_ENTRY_T *	entries,
								UINT32			mark_pos,		// позиция галочк?
								ACTIONS_T *		actions,
								RESOURCE_ID		dlgres );

UIS_DIALOG_T
UIS_CreateSelectionEditor( SU_PORT_T *		port,
							UINT32			param1,
							UINT32			count,
							UINT32			mark_pos,		// позиция галочк?
							UINT32 *		starting_num,
							UINT32			param5,
							ACTIONS_T *		actions,
							RESOURCE_ID		dlgres );


			/* Диалог?вывода картинки, анимации */

/* Создат?диалог-заставку из файл?(картинки) */
UIS_DIALOG_T UIS_CreateSplashScreenFs( SU_PORT_T * port, WCHAR * uri, UINT32 unk );	// unk = 0x7D0

/* Создае?диалог-заставку из ресурс?картинки */
UIS_DIALOG_T UIS_CreateSplashScreen( SU_PORT_T * port, RESOURCE_ID img, UINT32 unk );	// unk = 0xD3 , 0x7D0

/* Создае?диалог "хранител?экрана" из картинки. Поддерживают?: GIF, JPG, PNG, BMP, ?др. */
UIS_DIALOG_T UIS_CreateScreenSaver( SU_PORT_T * post, WCHAR * uri );


			/* Другие */

// Создат?диалог прогресс ба?
UIS_DIALOG_T
UIS_CreateProgressBar( SU_PORT_T *		port,
						RESOURCE_ID		res_img,	// 0x12000055
						CONTENT_T *		content,	// 
						const WCHAR *	str,
						UINT8			perc,
						BOOL			show_arrows,
						const WCHAR *	value_str,
						ACTIONS_T *		actions,
						RESOURCE_ID		dlgres );	// can be =0
// Ивенты для этог?диалог?

#define EV_PB_SET_PERCENT		0x213F
#define EV_PB_SET_VALUE_STR		0x2140
#define EV_PB_SET_STR			0x2141
//#define EV_PB_SET_PERCENT		0x2141
//#define EV_PB_SET_VALUE_STR		0x2142
//#define EV_PB_SET_STR			0x2143




/* Создаё?диалог-запрос (да/не? */
UIS_DIALOG_T
UIS_CreateConfirmation( SU_PORT_T * port,  CONTENT_T * content );


/* Создае?диалог ввод?текста */
UIS_DIALOG_T
UIS_CreateCharacterEditor( SU_PORT_T *		port,
							WCHAR *			text,
							UINT8			edit_type,
							UINT32			maxlen,
							BOOL			masked,
							ACTIONS_T *		actions, 
							RESOURCE_ID		dlgres );
/* 
  Значен? edit_type:
0 - Каждое Слов??Большо?Букв?
1 - просто?текс?
2 - Каждое предложени? ?большо?букв?
3 - аналогично, для очен?длинны?стро?
4 - номе?телефона
5 - ВС?БУКВ?БОЛЬШИ?
6 - строка ка?последовательность числовых сегменто?
7 - просто?текс?бе?смен?режимо?
8 - аналогично, бе?детализаци?
9 - ка?4, бе?до?меню
10 - аналог, бе?детализаци?
11 - ка?0, ?возможностью ввод?пустой строки
12 - ка?1, ?возможностью ввод?пустой строки
23 - url
28 - строка ?аттачами
29 - тоже, но можн??пуст?
32 - только числ?
*/


UIS_DIALOG_T
UIS_CreateMixedContentViewer( SU_PORT_T * port, CONTENT_T * content, ACTIONS_T * action_list, RESOURCE_ID dlgres );


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif // SDK_UIS_H