📄 plxmms_view.c
字号:
/***************************************************************************
*
* Pollex Mobile Platform
*
* Copyright (c) 2004 by Pollex Mobile Software Co., Ltd.
* All Rights Reserved
*
* Module :
*
* Purpose :
*
\**************************************************************************/
#include "PlxMms_View.h"
#include "PlxMms_Util.h"
#include "AudioInc.h"
#include "Aud_defs.h"
#include "..\public\PlxPublic.h"
#include "Wgui_categories_multimedia.h"
#include "PlxMms_Obj.h"
#include "GUI_SETTING.h"
//for time zone
#include "..\..\organizer\organizerinc\Worldclock.h"
#ifdef MMS_SCROLLVIEW
#ifdef __MMI_TOUCH_SCREEN__
#include "wgui_touch_screen.h"
#endif
#endif
//macro
#define MMS_VIEW_STR_PREV STR_ID_PLX_MMS_VIEW_PREV//(U8*)(L"Prev Page")
#define MMS_VIEW_STR_NEXT STR_ID_PLX_MMS_VIEW_NEXT//(U8*)(L"Next Page")
#define MMS_VIEW_STR_PLAY STR_ID_PLX_MMS_VIEW_PLAY//(U8*)(L"Play")
#define MMS_VIEW_STR_STOP STR_ID_PLX_MMS_VIEW_STOP//(U8*)(L"Stop")
#define MMS_VIEW_STR_OBJ STR_ID_PLX_MMS_VIEW_OBJ//(U8*)(L"Object")
//for arrow draw
#define WGUI_COLOR_TO_GDI_FORMAT(c) (gdi_color)GDI_RGB_TO_BUFFER_FORMAT(c.r, c.g, c.b)
typedef enum
{
MMS_VIEW_PREV = 0,
MMS_VIEW_NEXT,
MMS_VIEW_PLAY,
MMS_VIEW_STOP,
MMS_VIEW_OBJ,
MMS_VIEW_MAX
}MMS_VIEW_MENU_ITEM;
typedef enum
{
MMS_TEXT_UNKNOWN = 0,
MMS_TEXT_UTF8,
MMS_TEXT_UNICODE,
MMS_TEXT_MAX
}MMS_TEXT_TYPE;
typedef enum
{
MMS_IMG_UNKNOWN = 0,
MMS_IMG_BMP,
MMS_IMG_WBMP,
MMS_IMG_JPG,
MMS_IMG_GIF,
MMS_IMG_PNG,
MMS_IMG_MAX
}MMS_IMAGE_TYPE;
typedef enum
{
MMS_SND_UNKNOWN = 0,
MMS_SND_WAV,
MMS_SND_MID,
MMS_SND_AMR,
MMS_SND_MMF,
MMS_SND_MAX
}MMS_SOUND_TYPE;
//struct
typedef struct tagMmsViewTableItem
{
int id;
U16 string;
U16 icon;
PlxMmsEntryPtr entry;
}MmsViewTableItem;
typedef struct tagSlideInfo
{
U8* text; //a slide's text
int line_count; //number of lines
int* line_pos; //record start pos of each line
}SlideInfo;
#ifdef MMS_SCROLLVIEW
typedef struct tagMmsRect
{
int left;
int top;
int right;
int bottom;
}MmsRect;
#endif
typedef struct tagMmsViewData
{
void* mmse;
long id;
char* folder;
MmsMessage* message;
U16 back_screen;
HDMENU hMenu;
int org_slide;
int cur_slide;
//for content show
BOOL bSlideShifting;
// BOOL bGifInactive;
BOOL bInactived;
BOOL bClosing;
BOOL bPlaying;
//no smil
BOOL bNoSmil;
int obj_count;
PMMSECONTENT no_smil_content;
//time
int cur_dur;
int time_left;
int time_top;
int time_width;
int time_height;
//text
// SlideInfo* slide_info[MAX_MMS_SLIDE_COUNT];
SlideInfo* slide_info;
// U8* text;
// long text_len;
int text_left;
int text_top;
int text_width;
int text_height;
int start_line;
BOOL bHasText;
//image
U8* image;
U8 image_type;
long image_len;
int image_left;
int image_top;
int image_width;
int image_height;
int image_width_show;
int image_height_show;
BOOL bHasImage;
//sound
U8* sound;
U8 sound_type;
long sound_len;
BOOL bHasSound;
//for v-scroll
#ifdef MMS_SCROLLVIEW
MmsRect rcVScroll; //the rect of the vertical scrollbar
vertical_scrollbar vScroll;
#endif
int scr_total;
int scr_page;
int scr_cur;
int line_height;
int timer_id;
}MmsViewData;
//global
static MmsViewData g_view_data;
static U8* g_report_content = NULL;
static int g_report_len;
extern FuncPtr g_mms_main_endKeyDownFuncPtr;
extern char g_msg_info_buf[];
static void EnterPrev(void);
static void EnterNext(void);
static void EnterPlay(void);
static void EnterStop(void);
static void EnterObj(void);
/*
static const U8* g_view_string_table[MMS_VIEW_MAX] =
{
// MMS_VIEW_STR_SAVEIMG,
// MMS_VIEW_STR_SAVESND,
MMS_VIEW_STR_PREV,
MMS_VIEW_STR_NEXT,
MMS_VIEW_STR_PLAY,
MMS_VIEW_STR_STOP
};
*/
static const MmsViewTableItem g_view_entry_table[MMS_VIEW_MAX] =
{
{MMS_VIEW_PREV, MMS_VIEW_STR_PREV, IMG_GLOBAL_L1, EnterPrev},
{MMS_VIEW_NEXT, MMS_VIEW_STR_NEXT, IMG_GLOBAL_L2, EnterNext},
{MMS_VIEW_PLAY, MMS_VIEW_STR_PLAY, IMG_GLOBAL_L3, EnterPlay},
{MMS_VIEW_STOP, MMS_VIEW_STR_STOP, IMG_GLOBAL_L3, EnterStop},
{MMS_VIEW_OBJ, MMS_VIEW_STR_OBJ, IMG_GLOBAL_L4, EnterObj }
};
//private functions
////////////////////////////////////////////////////////////////////////////
//mms view screen
static void EnterMmsView(void);
static void ExitMmsView(void);
static void RedrawMmsView(void);
static BOOL InitMmsContent(void);
static BOOL DealSlide(void);
static BOOL UpdateText(void);
static BOOL UpdateImage(void);
static BOOL UpdateSound(void);
static void StartPlaySound(void);
static void StopPlaySound(void);
static U8 GetImageType(unsigned char* data);
static U8 GetSoundType(void);
static void RedrawViewTitle(void);
static void DrawOneTextLine(U8* string, int n, int x, int y);
static int FormatWString(U8* wsrc, long src_len, int* line_pos);
static void InitSlidePlay(void);
//static void Exit2Idle(void);
static void LeaveMmsView(void);
static void ExitViewReport(void);
static BOOL UpdateObject(int index);
static BOOL InitNoSmil(void);
static int GetObjCount(void* mmse, void* msg);
#ifdef MMS_SCROLLVIEW
static void RedrawVScroll(void);
#endif
////////////////////////////////////////////////////////////////////////////
//mms view menu
static BOOL CreateMmsViewMenu(void);
////////////////////////////////////////////////////////////////////////////
//mms view softkey handlers
static void OnLeftKey(void);
static void OnRightKey(void);
static void OnDownKey(void);
static void OnUpKey(void);
static void OnPrevKey(void);
static void OnNextKey(void);
static void DrawArrows(void);
static void OnVolDown(void);
static void OnVolUp(void);
#ifdef MMS_SCROLLVIEW
#ifdef __MMI_TOUCH_SCREEN__
static void OnTouchPenDown(mmi_pen_point_struct pos);
static void OnTouchPenMove(mmi_pen_point_struct pos);
static void OnTouchPenUp(mmi_pen_point_struct pos);
static void OnTouchPenRepeat(mmi_pen_point_struct pos);
static BOOL ProcessPenOnScrollbar(mmi_pen_point_struct pos, mmi_pen_event_type_enum pen_event);
#endif //__MMI_TOUCH_SCREEN__
static void ScrollTo(int pos);
#endif
////////////////////////////////////////////////////////////////////////////
//mms view callbacks
static void MmsViewPlayTimerCallback(void* param);
static int MmsViewMenuCallback(HDMENU hDmenu, unsigned long id, unsigned long event);
static void EnterViewDiliveryReport(void);
static void EmptyMenuEntry(void);
//extern int PlxMmsWideCharToUTF8(const char* lpWideCharStr, int cWideCharLen,
// char* lpUtf8Str, int cUtf8Len);
//extern int PlxMmsUTF8ToWideChar(const char* lpUtf8Str, int cUtf8Len,
// char* lpWideCharStr, int cWideCharLen);
extern void SetNewMsgViewIntoInbox(void);
extern U8 PlxMmsDelHistoryHdlr(void* in_param);
static void AdjustDateAndTime(PMMSETIME pTime);
extern U8 PhnsetGetHomeCity(void);
typedef void (*snd_callback)(S32 result);
extern S32 mdi_audio_play_string(void* audio_data,
U32 len, U8 format, U8 play_style,
S32* handle_p, snd_callback handler);
/* 11-23 Modified for 06A */
#include "PlxConfig.h"
#if defined(PROJECT_BRANCH_06A)
extern int PlxStartTimer(dword dwMilliseconds, void (*pTimerProc)(void* pParam), void* pParam);
#else
extern int PlxStartTimer(DWORD dwMilliseconds, void (*pTimerProc)(void* pParam), void* pParam);
#endif
/* 11-23 Modified for 06A end */
extern int PlxStopTimer(int id);
////////////////////////////////////////////////////////////////////////////
//public functions
/***************************************************************************
* Function MmsViewGoBackToIdle
* Purpose
* Params
* Return
* Remarks
\**************************************************************************/
void MmsViewGoBackToIdle(void)
{
int i;
int count;
SlideInfo* info;
#ifdef MMS_DEBUG
PlxTrace("MmsViewGoBackToIdle, will stop sound\r\n");
#endif
//stop all
gdi_image_stop_animation_all();
StopPlaySound();
if(g_view_data.timer_id)
{
PlxStopTimer(g_view_data.timer_id);
g_view_data.timer_id = 0;
}
//release menu
if(g_view_data.hMenu)
PlxDestroyDMenu(g_view_data.hMenu);
//release text info
if(g_view_data.slide_info)
{
if(g_view_data.bNoSmil)
count = g_view_data.obj_count;
else
count = mmsmsg_GetSlideCount(g_view_data.message);
for(i = 0; i < count; i++)
{
if((info = g_view_data.slide_info+i))
{
if(info->text)
MMS_Free((void*)info->text);
if(info->line_pos)
MMS_Free((void*)info->line_pos);
// MMS_Free((void*)info);
}
}
MMS_Free((void*)g_view_data.slide_info);
}
//release content data
if(g_view_data.image)
MMS_Free((void*)g_view_data.image);
if(g_view_data.sound)
MMS_Free((void*)g_view_data.sound);
//release message
if(g_view_data.id == -1)
{
if(g_view_data.message)
mmsmsg_SetCurSlide(g_view_data.message, g_view_data.org_slide);
}
else //by id, will close message
{
if(g_view_data.message)
mmsmsg_ReleaseMmsMessage(g_view_data.message);
}
if(g_report_content)
{
MMS_Free((void*)g_report_content);
g_report_content = NULL;
}
MMS_Memset((void*)&g_view_data, 0, sizeof(MmsViewData));
}
/***************************************************************************
* Function CreateMmsViewWithID
* Purpose Entry of mms view
* Params
* Return
* Remarks
\**************************************************************************/
BOOL CreateMmsViewWithID(void* mmse, long id, const char* folder, U16 screen)
{
int count;
if(!mmse || id < 0)
return FALSE;
#ifdef MMS_DEBUG
PlxTrace("CreateMmsViewWithID, id = %ld\r\n", id);
#endif
MMS_Memset((void*)&g_view_data, 0, sizeof(MmsViewData));
{
pixtel_UI_move_text_cursor(0,-100);
pixtel_UI_print_text_n((UI_string_type)L"xxx", 3);
g_view_data.line_height = LINE_HEIGHT+2;
}
//create message
g_view_data.message = mmsmsg_CreateMmsMessage();
if(!g_view_data.message)
{
#ifdef MMS_DEBUG
PlxTrace("!g_view_data.message\r\n");
#endif
MMS_Memset((void*)&g_view_data, 0, sizeof(MmsViewData));
return FALSE;
}
#ifdef MMS_DEBUG
PlxTrace("g_view_data.message = %p\r\n", g_view_data.message);
#endif
//init message
if(!mmsmsg_Init(g_view_data.message, mmse, id))
{
#ifdef MMS_DEBUG
PlxTrace("!mmsmsg_Init(g_view_data.message, mmse, id)\r\n");
#endif
mmsmsg_ReleaseMmsMessage(g_view_data.message);
MMS_Memset((void*)&g_view_data, 0, sizeof(MmsViewData));
return FALSE;
}
if((count = mmsmsg_GetSlideCount(g_view_data.message)) == 0)
{
//no slide message
#ifdef MMS_DEBUG
PlxTrace("mmsmsg_GetSlideCount(g_view_data.message) == 0\r\n");
#endif
g_view_data.mmse = mmse;
g_view_data.id = id;
g_view_data.back_screen = screen;
g_view_data.bNoSmil = TRUE;
InitNoSmil();
goto goto_view;
}
//
g_view_data.slide_info = (SlideInfo*)MMS_Malloc(sizeof(SlideInfo) * count);
if(!g_view_data.slide_info)
{
mmsmsg_ReleaseMmsMessage(g_view_data.message);
MMS_Memset((void*)&g_view_data, 0, sizeof(MmsViewData));
return FALSE;
}
MMS_Memset((void*)g_view_data.slide_info, 0, sizeof(SlideInfo) * count);
g_view_data.mmse = mmse;
g_view_data.id = id;
g_view_data.org_slide = 0;
g_view_data.cur_slide = 1;
g_view_data.back_screen = screen;
#ifdef MMS_DEBUG
PlxTrace("will InitMmsContent\r\n");
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -