📄 mfw_mnu.c
字号:
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) $Workfile:: mfw_mnu.c $|
| $Author:: Kk $ CONDAT GmbH $Revision:: 18 $|
| CREATED: 24.11.98 $Modtime:: 24.02.00 8:07 $|
| STATE : code |
+--------------------------------------------------------------------+
MODULE : MFW_MNU
PURPOSE : menu handling functions
EXPORT :
TO DO :
$History:: mfw_mnu.c $
*
* ***************** Version 18 *****************
* User: Kk Date: 28.02.00 Time: 10:33
* Updated in $/GSM/Condat/MS/SRC/MFW
* font usage corrected for page and list menus. free menus still
* need rework.
*
* ***************** Version 17 *****************
* User: Es Date: 17.01.00 Time: 17:37
* Updated in $/GSM/Condat/MS/SRC/MFW
* menu mode handling bug (uses only first level settings)
|
| ***************** Version 16 *****************
| User: Le Date: 6.01.00 Time: 9:23
| Updated in $/GSM/Condat/MS/SRC/MFW
| Alignment of MFW versions
*
* ***************** Version 2 *****************
* User: Es Date: 22.11.99 Time: 10:29
* Updated in $/GSM/Condat/SND-MMI/MFW
*
* ***************** Version 1 *****************
* User: Es Date: 18.11.99 Time: 16:35
* Created in $/GSM/Condat/SND-MMI/MFW
* Initial
*/
#include <stdio.h>
#include <string.h>
#define ENTITY_MFW
#if defined (NEW_FRAME)
#include "typedefs.h"
#include "vsi.h"
#include "custom.h"
#include "gsm.h"
#else
#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#endif
#include "mfw_sys.h"
#include "mfw_mfw.h"
#include "mfw_kbd.h"
#include "gdi.h"
#include "dspl.h"
#include "mfw_lng.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "message.h"
#include "prim.h"
#include "aci_cmh.h"
#include "Mfw_mmi.h"
static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma);
static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start);
static void drawPageMenu (MfwMnu *mnu);
static void drawListMenu (MfwMnu *m);
static void drawFreeMenu (MfwMnu *m);
static int mnuCommand (U32 cmd, void *h);
#define TIME_TRACE_EVENT
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuInit |
+--------------------------------------------------------------------+
PURPOSE : initialize menu handler
*/
MfwRes mnuInit (void)
{
mfwCommand[MfwTypMnu] = (MfwCb) mnuCommand;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuExit |
+--------------------------------------------------------------------+
PURPOSE : finalize menu handler
*/
MfwRes mnuExit (void)
{
mfwCommand[MfwTypMnu] = 0;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuCreate |
+--------------------------------------------------------------------+
PURPOSE : create menu control
GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
used (useStrID) and if the strings are ascii or unicode (uesDefLang).
*/
MfwHnd mnuCreate (MfwHnd w, MfwMnuAttr *a, MfwEvt e, MfwCb f)
{
MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
MfwMnu *mnu = (MfwMnu *) mfwAlloc(sizeof(MfwMnu));
MfwHdr *insert_status =0;
if (!hdr || !mnu)
{
TRACE_ERROR("ERROR: mnuCreate() Mem Alloc Failed.");
if(hdr)
mfwFree((U8*)hdr,sizeof(MfwHdr));
if(mnu)
mfwFree((U8*)mnu,sizeof(MfwMnu));
return 0;
}
mnu->mask = e;
mnu->flags = 0;
mnu->handler = f;
mnu->attr = a;
mnu->curAttr = a;
mnu->useStrID = 0;
mnu->useDefLang = 0;
/* SPR#1983 - SH - Stores character type, ASCII/UNICODE */
mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
mnu->level = 0;
memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
memset(mnu->lShift,1,sizeof(mnu->lShift));
mnu->lCursor[0] = 0;
mnu->scrollMode = 1;
hdr->data = mnu;
hdr->type = MfwTypMnu;
insert_status = mfwInsert(w,hdr);
if(!insert_status)
{
TRACE_ERROR("ERROR: mnuCreate() Failed to Install Handler. ");
mfwFree((U8*)hdr,sizeof(MfwHdr));
mfwFree((U8*)mnu ,sizeof(MfwMnu));
return 0;
}
return insert_status;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuDelete |
+--------------------------------------------------------------------+
PURPOSE : delete menu control
*/
MfwRes mnuDelete (MfwHnd m)
{
MfwRes res;
if (!m)
return MfwResIllHnd;
mnuHide(m);
res = (mfwRemove(m)) ? MfwResOk : MfwResIllHnd;
mfwFree(((MfwHdr *) m)->data,sizeof(MfwMnu));
mfwFree(m,sizeof(MfwHdr));
return res;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuLang |
+--------------------------------------------------------------------+
PURPOSE : set / get whether the string is associated with an ID or if it is null-terminated
GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
used (useStrID) and if the strings are ascii or unicode (uesDefLang).
*/
MfwHnd mnuLang (MfwHnd m, MfwHnd l)
{
MfwHnd ol;
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0)
return (MfwHnd) MfwResIllHnd;
ol = mnu->useStrID;
mnu->useStrID = l;
mnu->useDefLang = l;
/* SPR#1983 - SH - Set character type appropriately */
if (l)
{
mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
}
else
{
mnu->textDCS = MNU_LIST_LANGUAGE_ASCII;
}
return ol;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuStrType |
+--------------------------------------------------------------------+
PURPOSE : set / get language in use (1=use default ascii/unicode, 0=assume ascii)
GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
used (useStrID) and if the strings are ascii or unicode (uesDefLang).
*/
MfwHnd mnuStrType (MfwHnd m, MfwHnd l)
{
MfwHnd ol;
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0)
return (MfwHnd) MfwResIllHnd;
ol = mnu->useDefLang;
mnu->useDefLang = l;
/* SPR#1983 - SH - Set character type appropriately*/
if (l)
{
mnu->textDCS = MNU_LIST_LANGUAGE_UNICODE;
}
else
{
mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
}
return ol;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuDCSType |
+--------------------------------------------------------------------+
PURPOSE : SPR#1983 - SH - Added.
Set the character type of the menu text
*/
UBYTE mnuDCSType (MfwHnd m, UBYTE listLanguageType)
{
UBYTE ol;
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0)
return NULL;
ol = mnu->textDCS;
mnu->textDCS = listLanguageType;
return ol;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuShow |
+--------------------------------------------------------------------+
PURPOSE : show menu
*/
MfwRes mnuShow (MfwHnd m)
{
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0)
return MfwResIllHnd;
mnu->flags |= E_MNU_VISIBLE;
mnuUpdate(mnu);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuHide |
+--------------------------------------------------------------------+
PURPOSE : hide menu
*/
MfwRes mnuHide (MfwHnd m)
{
MfwMnu *mnu;
U8 dsplOld;
if ((mnu = mfwControl(m)) == 0)
return MfwResIllHnd;
mnu->flags &= ~E_MNU_VISIBLE;
if (mnu->handler)
if (mnu->mask & E_MNU_VISIBLE)
mnu->handler(E_MNU_VISIBLE,mnu);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuUnhide |
+--------------------------------------------------------------------+
PURPOSE : unhide menu (without drawing)
*/
MfwRes mnuUnhide (MfwHnd m)
{
MfwMnu *mnu;
U8 dsplOld;
if ((mnu = mfwControl(m)) == 0)
return MfwResIllHnd;
mnu->flags |= E_MNU_VISIBLE;
if (mnu->handler)
if (mnu->mask & E_MNU_VISIBLE)
mnu->handler(E_MNU_VISIBLE,mnu);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuUpdate |
+--------------------------------------------------------------------+
PURPOSE : draw menu
*/
MfwRes mnuUpdate (MfwMnu *m)
{
U8 dsplOld;
if (!m)
return MfwResIllHnd;
if (!(m->flags & E_MNU_VISIBLE))
return MfwResOk;
if (m->handler)
if (m->mask & E_MNU_VISIBLE)
m->handler(E_MNU_VISIBLE,m);
/*JVJE Update to fit the menu to a visible item */
{
MfwMnuAttr *ma = m->curAttr;
int index= m->lCursor[m->level];
while (ma->items[index].flagFunc(m,ma,&(ma->items[index])) & MNU_ITEM_HIDE)
{
index++;
if (index>=ma->nItems)
index =0;
}
m->lCursor[m->level]=index;
}
if ((m->curAttr->mode & MNU_DISPLAY) == MNU_OVERLAPPED)
drawFreeMenu(m);
else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_PAGED)
drawPageMenu(m);
else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST)
drawListMenu(m);
else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_COLOUR)
drawListMenu(m);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuUp |
+--------------------------------------------------------------------+
PURPOSE : one step up
*/
MfwRes mnuUp (MfwHnd m)
{
MfwMnu *mnu;
MfwMnuAttr *ca;
MfwMnuItem *ci;
U8 uMode;
if ((mnu = mfwControl(m)) == 0)
return MfwResIllHnd;
ca = mnu->curAttr;
do
{
if (mnu->lCursor[mnu->level] == 0)
{
mnu->lCursor[mnu->level] = ca->nItems - 1;
mnu->flags |= E_MNU_TOPPED;
if (mnu->handler)
if (mnu->mask & E_MNU_TOPPED)
mnu->handler(E_MNU_TOPPED,mnu);
}
else
{
mnu->lCursor[mnu->level] -= (U8) 1;
mnu->flags &= ~E_MNU_TOPPED;
}
ci = ca->items + mnu->lCursor[mnu->level];
} while (ci->flagFunc(mnu,ca,ci) & MNU_ITEM_HIDE);
if (mnu->scrollMode) /* Simple scrolling */
{
U8 shift = mnu->lShift[mnu->level];
U8 index = countVisible(mnu,ca,mnu->lCursor[mnu->level]);
U8 visibleItems = countVisible(mnu,ca,ca->nItems);
int nLines = mnu->nLines;
if (visibleItems<nLines)
nLines = visibleItems;
if (shift>1)
shift--;
mnu->lShift[mnu->level] = shift;
}
mnuUpdate(mnu);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuDown |
+--------------------------------------------------------------------+
PURPOSE : one step down
*/
MfwRes mnuDown (MfwHnd m)
{
MfwMnu *mnu;
MfwMnuAttr *ca;
MfwMnuItem *ci;
if ((mnu = mfwControl(m)) == 0)
return MfwResIllHnd;
ca = mnu->curAttr;
do
{
if (mnu->lCursor[mnu->level] >= mnu->curAttr->nItems - 1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -