FreeCalypso > hg > fc-magnetite
view src/aci2/mfw/mfw_mnu.c @ 265:0aa748b6413a
src/cs/system/Main/init.c: initial import from LoCosto source
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 05 Aug 2017 02:02:16 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +--------------------------------------------------------------------+ | 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 $ Shashi Shekar B.S., a0876501, 16 Mar, 2006, OMAPS00061462 Icon support for SetupMenu & Select item. * * ************************************************ * User: xreddymn Date: Sep-30-2005 * Updated in $/GSM/Condat/MS/SRC/MFW * Added header display for menus on monochrome * screens for MMI-SPR-33781 * * ************************************************ * User: xreddymn Date: Dec-16-2004 * Updated in $/GSM/Condat/MS/SRC/MFW * Added double line display for MFW list menu items * * ***************** 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; // RAVI 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; // RAVI 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; // RAVI 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]; // int iloop; // RAVI U16 retVal; if (ma->items[index].flagFunc) retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index])); else retVal = 0; while (retVal & MNU_ITEM_HIDE) { index++; if (index>=ma->nItems) index =0; if (ma->items[index].flagFunc) retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index])); else retVal = 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); /* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */ else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_2_LINE) 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; // RAVI 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) { mnu->lCursor[mnu->level] = 0; mnu->flags |= E_MNU_BOTTOMED; if (mnu->handler) if (mnu->mask & E_MNU_BOTTOMED) mnu->handler(E_MNU_BOTTOMED,mnu); } else { mnu->lCursor[mnu->level] += (U8) 1; mnu->flags &= ~E_MNU_BOTTOMED; } 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<nLines) shift++; mnu->lShift[mnu->level] = shift; } mnuUpdate(mnu); return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuSelect | +--------------------------------------------------------------------+ PURPOSE : select a menu item; if there is a submenu, go one level down */ MfwRes mnuSelect (MfwHnd m) { MfwMnu *mnu; MfwMnuAttr *submenu, *ca; MenuFunc func; // U8 dsplOld; // RAVI if ((mnu = mfwControl(m)) == 0) return MfwResIllHnd; ca = mnu->curAttr; submenu = ca->items[mnu->lCursor[mnu->level]].menu; func = ca->items[mnu->lCursor[mnu->level]].func; if (func) /* perform submenu */ { func(mnu,&ca->items[mnu->lCursor[mnu->level]]); } if (submenu) /* call menu function */ { if (menuIsEmpty(mnu,submenu)) { mnu->flags |= E_MNU_EMPTY; if (mnu->handler && mnu->mask & E_MNU_EMPTY) mnu->handler(E_MNU_EMPTY,mnu); mnu->flags &= ~E_MNU_EMPTY; } else { dspl_Clear(ca->area->px, ca->area->py, (U16) (ca->area->sx+ca->area->px-1), (U16) (ca->area->sy+ca->area->py-1)); mnu->level++; mnu->lCursor[mnu->level] = 0; ca = mnu->curAttr = submenu; if (ca->items->flagFunc(mnu,ca,ca->items) & MNU_ITEM_HIDE) mnuDown(m); else mnuUpdate(mnu); } return MfwResOk; /* we do not have to check for !submenu */ } if (!func && !submenu) /* inform mmi */ { mnu->flags |= E_MNU_SELECT; if (mnu->handler && mnu->mask & E_MNU_SELECT) mnu->handler(E_MNU_SELECT,mnu); } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuEscape | +--------------------------------------------------------------------+ PURPOSE : go back one level or leave the menu */ MfwRes mnuEscape (MfwHnd m) { MfwMnu *mnu; MfwMnuAttr *attr; U8 lvl; // U8 dsplOld; // RAVI if ((mnu = mfwControl(m)) == 0) return MfwResIllHnd; if (mnu->level != 0) { mnu->lCursor[mnu->level] = UNUSED; mnu->lShift[mnu->level] = 1; mnu->level--; lvl = 0; /* set level 0 */ attr = mnu->attr; /* set start point */ while (lvl != mnu->level) { attr = attr->items[mnu->lCursor[lvl]].menu; lvl++; } mnu->curAttr = attr; mnuUpdate(mnu); } else { mnu->flags |= E_MNU_ESCAPE; if (mnu->handler) if (mnu->mask & E_MNU_ESCAPE) mnu->handler(E_MNU_ESCAPE,mnu); } return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuDone | +--------------------------------------------------------------------+ PURPOSE : reset menu */ MfwRes mnuDone (MfwHnd m) { MfwMnu *mnu; if ((mnu = mfwControl(m)) == 0) return MfwResIllHnd; mnu->curAttr = mnu->attr; mnu->level = 0; memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor)); memset(mnu->lShift,1,sizeof(mnu->lShift)); mnu->lCursor[0] = 0; return MfwResOk; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuKeyAction | +--------------------------------------------------------------------+ PURPOSE : perform direct jumping if there was pressed KCD_1 through KCD_9; in this case function returns 1; otherwise function returns 0 */ MfwRes mnuKeyAction (MfwHnd m, U8 keycode) { MfwMnu *mnu; U8 directAccess; if ((mnu = mfwControl(m)) == 0) return MfwResIllHnd; switch (keycode) { case KCD_1: directAccess = 0; break; case KCD_2: directAccess = 1; break; case KCD_3: directAccess = 2; break; case KCD_4: directAccess = 3; break; case KCD_5: directAccess = 4; break; case KCD_6: directAccess = 5; break; case KCD_7: directAccess = 6; break; case KCD_8: directAccess = 7; break; case KCD_9: directAccess = 8; break; default: return 0; } if (directAccess >= mnu->curAttr->nItems) return 0; mnu->lCursor[mnu->level] = directAccess; mnuShow(m); mnuSelect(m); return 1; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuChooseItem | +--------------------------------------------------------------------+ PURPOSE : Chooses the nItemst Item. */ MfwRes mnuChooseVisibleItem(MfwHnd m,U8 nItem) { MfwMnu *mnu; int i; if ((mnu = mfwControl(m)) == 0) return MfwResIllHnd; if (nItem<0) return MfwResIllHnd; for (i = 0; i < mnu->curAttr->nItems; i++) { if (!(mnu->curAttr->items[i].flagFunc(mnu, mnu->curAttr, &(mnu->curAttr->items[i])) & MNU_ITEM_HIDE)) { if (!nItem) { mnu->lCursor[mnu->level] = i; mnuUpdate(mnu); return MfwResOk; } else nItem--; } } return MfwResIllHnd; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : menuIsEmpty | +--------------------------------------------------------------------+ PURPOSE : check for empty submenu */ static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma) { int i; for (i = 0; i < ma->nItems; i++) if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i])) & MNU_ITEM_HIDE)) return 0; return 1; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : countVisible | +--------------------------------------------------------------------+ PURPOSE : count visible items up to current item */ static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start) { int i, count; for (i = 0, count = 0; i < start; i++) if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i])) & MNU_ITEM_HIDE)) count++; return count; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : countVisibleItems | +--------------------------------------------------------------------+ PURPOSE : count visible items in the current branch */ U8 mnuCountVisibleItems (MfwHnd m) { MfwMnu *mnu; if ((mnu = mfwControl(m)) == 0) return 0; return (U8)countVisible(mnu, mnu->curAttr,mnu->curAttr->nItems); } /* +--------------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : countCurrentVisibleItem | +--------------------------------------------------------------------------+ PURPOSE : returns the position of the current Item */ U8 mnuCountCurrentVisibleItem(MfwHnd m) { MfwMnu *mnu; U8 i; U8 pos=0; if ((mnu = mfwControl(m)) == 0) return 0; for (i = 0; i < mnu->curAttr->nItems; i++) { if ((mnu->lCursor[mnu->level]) == i) return pos; if (!(mnu->curAttr->items[i].flagFunc(mnu, mnu->curAttr, &(mnu->curAttr->items[i])) & MNU_ITEM_HIDE)) pos++; } return pos; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : checkPredraw | +--------------------------------------------------------------------+ PURPOSE : check / generate predraw event */ static int checkPredraw (MfwMnu *mnu, MfwMnuItem *mi, char **t, MfwIcnAttr **icn) { int res = 0; if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY) { mnu->flags |= E_MNU_PREDRAW; if (mnu->handler) if (mnu->mask & E_MNU_PREDRAW) { if (mi->exta) { ((MfwItmExtPredraw*)(mi->exta))->str = *t; ((MfwItmExtPredraw*)(mi->exta))->icon = *icn; } res = mnu->handler(E_MNU_PREDRAW,mi); if (mi->exta) { *t = ((MfwItmExtPredraw*)(mi->exta))->str; *icn = ((MfwItmExtPredraw*)(mi->exta))->icon; } } mnu->flags &= ~E_MNU_PREDRAW; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : checkPostdraw | +--------------------------------------------------------------------+ PURPOSE : check / generate postdraw event */ static int checkPostdraw (MfwMnu *mnu, MfwMnuItem *mi) { int res = 0; if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY) { mnu->flags |= E_MNU_POSTDRAW; if (mnu->handler) if (mnu->mask & E_MNU_POSTDRAW) res = mnu->handler(E_MNU_POSTDRAW,mi); mnu->flags &= ~E_MNU_POSTDRAW; } return res; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : checkStatus | +--------------------------------------------------------------------+ PURPOSE : check / insert item status (string MUST be in RAM) SPR998 - SH - Changed to allow checkbox menu items. */ static int checkStatus (MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi, char *menuString) { char *e; /* ES!! UNICODE */ int index = 0; // RAVI #if (BOARD != 61) BOOL unicode; #endif U16 flagResult; #if(BOARD != 61) if (menuString[0] == 0x80) unicode = TRUE; else unicode = FALSE; #endif flagResult = mi->flagFunc(m,ma,mi); switch (flagResult) { case MNU_ITEM_STATED: e = mi->exta; if (!e) return 0; while (menuString[index]) { if (menuString[index] == '%') /* ES!! : UNICODE */ { switch (menuString[index+1]) { case 'c': /* single char */ strcpy(&menuString[index+1],&menuString[index+2]); menuString[index] = *e; e++; break; } } index++; } break; /* SPR998 - SH - Checked or unchecked option. * Don't need to do anything here. */ case MNU_ITEM_UNCHECKED: case MNU_ITEM_CHECKED: break; default: break; } return flagResult; /* SPR#998 - SH - Now returns item type */ } static void mnuDrawHeader(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString) { int mode = mnuAttr->mode; MfwRect* mnuArea = mnuAttr->area; int mnuColour = mnuAttr->mnuColour; char* txt=hdrString; int nPixels; int xPos,yPos,sy,txtXpos; // RAVI - Removed txtLen, sx // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON USHORT titleIconWidth = 0; USHORT iconX, iconY; #endif xPos = mnuArea->px; yPos = mnuArea->py; sy = res_getTitleHeight(); resources_setTitleColour(mnuColour); dspl_Clear(xPos,yPos,(U16)(mnuArea->sx+xPos-1),(U16)(mnuArea->sy+yPos-1)); if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT) { //Position is correct txtXpos = xPos; } else { nPixels = dspl_GetTextExtent( txt, 0); if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT) { txtXpos = xPos + mnuArea->sx - nPixels; } else { //Display in middle txtXpos = xPos + (mnuArea->sx - nPixels)/2; } } // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (mnuAttr->icon != NULL) { if (mnuAttr->icon->area.sx > TITLE_ICON_WIDTH) { titleIconWidth = TITLE_ICON_WIDTH; } else { titleIconWidth = mnuAttr->icon->area.sx; } } else { titleIconWidth = 0; } if(titleIconWidth) txtXpos = txtXpos + titleIconWidth + 1; if (mnuAttr->icon != NULL) { if(mnuAttr->icon->selfExplanatory == FALSE) { if (txt[0] != 0x80) dspl_ScrText (txtXpos, yPos, txt, 0); else dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt ); } } else { if (txt[0] != 0x80) dspl_ScrText (txtXpos, yPos, txt, 0); else dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt ); } #else if (txt[0] != 0x80) dspl_ScrText (txtXpos, yPos, txt, 0); else dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt ); #endif // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (mnuAttr->icon != NULL) { if (mnuAttr->icon->icons != NULL) { if ((mnuAttr->icon->area.sx > TITLE_ICON_WIDTH) || (mnuAttr->icon->area.sy > TITLE_ICON_HEIGHT)) { /* iconY calculates place holder to place the icon at the center of the screen. */ iconX = 1; iconY = 1+ ((sy-2) / 2) - (10 / 2); dspl_BitBlt2(iconX, iconY, 8, 10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR); } else { dspl_BitBlt2(mnuAttr->icon->area.px, mnuAttr->icon->area.py, mnuAttr->icon->area.sx, mnuAttr->icon->area.sy, mnuAttr->icon->icons, 0, mnuAttr->icon->icnType); } } } #endif areaLeft->px = xPos; areaLeft->sx = mnuArea->sx; areaLeft->py = yPos+sy; areaLeft->sy = mnuArea->sy-sy; #ifdef MFW_DEBUG_DISPLAY_SIZE dspl_DrawRect(xPos,yPos,(xPos+mnuArea->sx-1),(yPos+sy-1)); #endif resources_restoreMnuColour(); } // Sep 30, 2005 REF: CRR MMI-SPR-33781 xreddymn // Description: Menu header not displayed for Golite // Solution: Added functionality to display menu header /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuDrawHeaderBW | +--------------------------------------------------------------------+ PURPOSE : Displays menu header (title) on monochrome displays. Code is based on mnuDrawHeader. See also mnuDrawHeader. */ static void mnuDrawHeaderBW(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString) { int mode = mnuAttr->mode; MfwRect *mnuArea = mnuAttr->area; int mnuColour = mnuAttr->mnuColour; char *txt = hdrString; int nPixels; int xPos, yPos, sx, sy, txtLen, txtXpos; xPos = mnuArea->px; yPos = mnuArea->py; sy = res_getTitleHeight(); resources_setTitleColour(mnuColour); dspl_Clear(xPos, yPos, (U16)(mnuArea->sx + xPos - 1), (U16)(mnuArea->sy + yPos - 1)); dspl_DrawLine(xPos, (U16)(sy + yPos - 2), (U16)(mnuArea->sx + xPos - 1), (U16)(sy + yPos - 2)); if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT) { //Position is correct txtXpos = xPos; } else { nPixels = dspl_GetTextExtent( txt, 0); if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT) { txtXpos = xPos + mnuArea->sx - nPixels; } else { //Display in middle txtXpos = xPos + (mnuArea->sx - nPixels)/2; } } if (txt[0] != 0x80) dspl_ScrText (txtXpos, yPos, txt, 0); else dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt); // Remaining area is calculated so that it does not touch // or overlap with the menu header areaLeft->px = xPos; areaLeft->sx = mnuArea->sx; areaLeft->py = yPos+sy + 1; areaLeft->sy = mnuArea->sy - sy - 1; resources_restoreMnuColour(); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : drawPageMenu | +--------------------------------------------------------------------+ PURPOSE : draws menu in page mode 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). */ void fastCopyBitmap(int startX, int startY, // start position of bitmap int bmpSx, int bmpSy, //size of bitmap char* srcBitmap, int posX, int posY, // start of area to be copied into int sx, int sy, // size of area to be copied into U32 bgd_col, int bmptype); static void drawPageMenu (MfwMnu *mnu) { MfwMnuAttr *ma; /* menu attributes */ //U16 th, tw, tl; /* text height, width, len */ // RAVI - Removed U16 ax, ay, aw, ah; // RAVI - , x; /* menu area dimensions */ // int tLines; /* lines in item text */ // RAVI // int nLines; /* lines in menu area */ // RAVI char *txt; // RAVI - Removed *t2, save; /* item text & clip saver */ MfwIcnAttr * icn; /* item icon */ U8 oldFont = -1; /* save previous font */ MfwMnuItem *mi; /* current item */ // char *t; // RAVI - Removed tt [64] /* temp item string */ ma = mnu->curAttr; if (ma->font != (U8) -1) oldFont = dspl_SelectFontbyID(ma->font); /* setup font */ ax = ma->area->px; ay = ma->area->py; aw = ma->area->sx; ah = ma->area->sy; mi = ma->items + mnu->lCursor[mnu->level]; icn = mi->icon; txt = mi->str; resources_setColour(ma->mnuColour); if ((ma->mode & MNU_HDRFORMAT_STR)==0) /* header is a text ID */ txt = (char*)MmiRsrcGetText((int)txt); checkPredraw(mnu,mi,&txt,&icn); /* ES!! */ { MfwRect areaLeft; mnuDrawHeader(ma,&areaLeft,txt); ax = areaLeft.px; ay = areaLeft.py; aw = areaLeft.sx; ah = areaLeft.sy; } if ((dspl_getDisplayType()==DSPL_COLOUR) && (ma->bgdBitmap != NULL)) { MfwRect *bmpArea = &ma->bgdBitmap->area; if ((ma->bgdBitmap->icons != NULL) && (bmpArea->sx >0) && (bmpArea->sy >0)) { fastCopyBitmap( (int)bmpArea->px, (int)bmpArea->py, (int)bmpArea->sx, (int)bmpArea->sy, ma->bgdBitmap->icons, (int)ax,(int)ay, (int)aw, (int)ah, dspl_GetBgdColour(), ma->bgdBitmap->icnType); } else { dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1)); } } else { dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1)); } if (icn != NULL) { /* show associated icon */ dspl_BitBlt2(icn->area.px,icn->area.py, icn->area.sx,icn->area.sy, icn->icons,0,icn->icnType); } if (oldFont != (U8) -1) dspl_SelectFontbyID(oldFont); /* restore previous font */ checkPostdraw(mnu,mi); /* ES!! */ #ifdef MFW_DEBUG_DISPLAY_SIZE dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1)); #endif resources_restoreColour(); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : drawListMenu | +--------------------------------------------------------------------+ PURPOSE : draws menu in list mode 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). */ #define MAX_STR_CHAR 64 static void drawListMenu (MfwMnu *mnu) { MfwMnuAttr *ma; /* menu attributes */ U16 fh, fw; /* font height & width */ U16 ax, ay, aw, ah; /* menu area dimensions */ U16 x, x2=0, EOL_position=0, hfh=0; int nLines; int i; int nIdx; int nTextLen; MfwIcnAttr * icn; // int fit; // RAVI char *txtStr; /* item text */ char txt[MAX_STR_CHAR]; U8 oldFont = -1; /* save previous font */ // UBYTE temp; // RAVI // int UniHeight = 12; // RAVI int simpleScrolling; int status; /* SPR#998 - SH - Status for each menu item */ const USHORT checkbox_width = 7; /* SPR#998 - SH - Checkbox width in pixels */ const USHORT checkbox_height = 7; /* SPR#998 - SH - Checkbox height in pixels */ const USHORT checkbox_spacing_left = 1; /* SPR#998 - SH - Gap between left edge of menu and checkbox */ const USHORT checkbox_spacing_right = 2; /* SPR#998 - SH - Gap between right edge of checkbox and menu text */ USHORT checkbox_x; /* SPR#998 - SH - X position of checkbox */ USHORT checkbox_y; /* SPR#998 - SH - Y position of checkbox */ // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON USHORT titleIconWidth = 0; USHORT iconX, iconY; #endif TIME_TRACE_EVENT("drawListMenu() start"); ma = mnu->curAttr; /* SPR#1983 - SH - Ignore language type now */ if (ma->font != (U8) -1) oldFont = dspl_SelectFontbyID(ma->font); /* setup font */ /* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */ if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE) { hfh = dspl_GetFontHeight(); /* height of one line */ fh = hfh<<1; /* height of two lines */ } else fh = dspl_GetFontHeight(); fw = dspl_GetTextExtent("X",1); // ES!! only for normal fonts ! //Display header info (if required) if ((ma->hdrId != 0) && (dspl_getDisplayType()==DSPL_COLOUR)) { MfwRect areaLeft; char *hdrStr; if ((ma->mode & MNU_HDRFORMAT_STR)==0) /* header is a text ID */ hdrStr = MmiRsrcGetText(ma->hdrId); else hdrStr = (char*)(ma->hdrId); mnuDrawHeader(ma,&areaLeft,hdrStr); ax = areaLeft.px; ay = areaLeft.py; aw = areaLeft.sx; ah = areaLeft.sy; } // Sep 30, 2005 REF: CRR MMI-SPR-33781 xreddymn // Description: Menu header not displayed for Golite // Solution: Added functionality to display menu header // Display a different header in case of monochrome screens else if((ma->hdrId != 0) && (DSPL_BW == dspl_getDisplayType())) { MfwRect areaLeft; char *hdrStr; if ((ma->mode & MNU_HDRFORMAT_STR) == 0) /* header is a text ID */ hdrStr = MmiRsrcGetText(ma->hdrId); else hdrStr = (char*)(ma->hdrId); mnuDrawHeaderBW(ma, &areaLeft, hdrStr); ax = areaLeft.px; ay = areaLeft.py; aw = areaLeft.sx; ah = areaLeft.sy; } else { ax = ma->area->px; ay = ma->area->py; aw = ma->area->sx; ah = ma->area->sy; } resources_setColour(ma->mnuColour); dspl_Clear(ax,ay,(U16)(aw+ax-1),(U16)(ah+ay-1)); nLines = ah / fh; mnu->nLines = nLines; //Store the number of lines we are drawing for scrolling up/down { // TRACE_EVENT_P5(" ax:%d ay:%d aw:%d ah:%d lines:%d",ax,ay,aw,ah, nLines); } if ((!mnu->scrollMode)||(countVisible(mnu,ma,ma->nItems)<=nLines)) /* Simple scrolling */ simpleScrolling = TRUE; else simpleScrolling = FALSE; if (simpleScrolling) { nIdx = (countVisible(mnu,ma,mnu->lCursor[mnu->level])/nLines)*nLines; } else { int count=mnu->lShift[mnu->level]; int index= mnu->lCursor[mnu->level]+1; int nVisibles = countVisible(mnu,ma,ma->nItems); while (ma->items[index-1].flagFunc(mnu,ma,&(ma->items[index-1])) & MNU_ITEM_HIDE) { index++; } while (count>0){ if (index<=0) index = ma->nItems-1; else index--; if (!(ma->items[index].flagFunc(mnu,ma,&(ma->items[index]))& MNU_ITEM_HIDE)) count--; } if (nVisibles<nLines) nLines = nVisibles; nIdx = index; } for (i = 0; i < nLines; nIdx++) /* ES!! not so nice... */ { if (nIdx >= ma->nItems) { if (simpleScrolling) break; else nIdx=0; } if (ma->items[nIdx].flagFunc(mnu,ma,&(ma->items[nIdx])) & MNU_ITEM_HIDE) continue; if (mnu->useStrID) /* use language handler */ txtStr = (char*)MmiRsrcGetText((int)ma->items[nIdx].str); //JVJE else txtStr = ma->items[nIdx].str; icn = ma->items[nIdx].icon; // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (icn != NULL) { if (icn->area.sx > TITLE_ICON_WIDTH) { titleIconWidth = TITLE_ICON_WIDTH; } else { titleIconWidth = icn->area.sx; } } else { titleIconWidth = 0; } #endif checkPredraw(mnu,ma->items+nIdx,&txtStr,&icn); /* ES!! */ memcpy(txt,txtStr,MAX_STR_CHAR); status = checkStatus(mnu,ma,ma->items+nIdx,txt); /* SPR#998 - SH - Store the resulting status */ if ((mnu->useStrID) && ((ma->mode & MNU_DISPLAY) == MNU_LIST_COLOUR)) { resources_setColourMnuItem( (int)ma->items[nIdx].str ); } /* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */ if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE) { EOL_position=0; #ifdef NO_ASCIIZ if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE) { while((((U16*)txt)[EOL_position]!='\n') && (((U16*)txt)[EOL_position]!='\0')) EOL_position++; if(((U16*)txt)[EOL_position]=='\0') /* Less than two lines to display */ EOL_position=0; else /* Two lines to display, break each line with a '\0' */ { ((U16*)txt)[EOL_position]='\0'; EOL_position++; } } else #endif { while((txt[EOL_position]!='\n') && (txt[EOL_position]!='\0')) EOL_position++; if(txt[EOL_position]=='\0') /* Less than two lines to display */ EOL_position=0; else /* Two lines to display, break each line with a '\0' */ { txt[EOL_position]='\0'; EOL_position++; } } if(EOL_position>0) { #ifdef NO_ASCIIZ if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE) nTextLen = dspl_GetTextExtent((char*)(txt+(EOL_position<<1)),(U16)dspl_str_length(txt)); else #endif nTextLen = dspl_GetTextExtent((char*)(txt+EOL_position),(U16)dspl_str_length(txt)); /* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */ if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED) { nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); } /* end of SPR#998 */ if ((ma->mode & MNU_ALIGN) == MNU_CENTER) x2 = (U16) (ax + (aw - nTextLen) / 2); else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT) x2 = (U16) (ax + aw - nTextLen); else x2 = (U16) (ax + fw); /* MNU_LEFT (default) */ if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE) x2 =ax; } } nTextLen = dspl_GetTextExtent(txt,(U16)dspl_str_length(txt)); /* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */ if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED) { nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); } /* end of SPR#998 */ if ((ma->mode & MNU_ALIGN) == MNU_CENTER) x = (U16) (ax + (aw - nTextLen) / 2); else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT) x = (U16) (ax + aw - nTextLen); else x = (U16) (ax + fw); /* MNU_LEFT (default) */ if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE) x =ax; /* SPR#998 - SH - Draw checkboxes if required */ if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED) { checkbox_x = x+checkbox_spacing_left; checkbox_y = ay+i*fh+(fh-checkbox_height)/2; if (status==MNU_ITEM_CHECKED) { /* NOTE: for some reason, a filled rect must have x2, y2 +1 of the same size * of unfilled rect...compare parameters here and below */ dspl_DrawFilledRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width+1, checkbox_y+checkbox_height+1); } else { dspl_DrawRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width, checkbox_y+checkbox_height); } x+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); /* Text box now starts just to the right of checkbox */ /* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */ x2+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); } /* end of SPR#998 */ { #ifdef NO_ASCIIZ /*MC, use universal height rather than smaller chinese font height*/ /*MC, SPR1526, send whole string to dspl_TextOut, rather than missing out unicode tag*/ /* SPR#1983 - SH - If unicode is set, send text as unicode */ if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE) { // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (icn != NULL) { if(icn->selfExplanatory == FALSE) dspl_TextOut(titleIconWidth + 1 + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); } else dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); #else dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); #endif if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1))); } } else #endif { // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (icn != NULL) { if(icn->selfExplanatory == FALSE) dspl_TextOut(titleIconWidth + 1 + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); } else dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); #else dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); #endif if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position)); } } } if (nIdx == mnu->lCursor[mnu->level]) { if ((ma->mode & MNU_ITEMSEL) == MNU_FRAMED) dspl_DrawRect(ax,(U16)(ay+i*fh),(U16)(aw-2+ax), (U16)(fh-1+ay+i*fh)); else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_ARROW) dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,">"); else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_STAR) dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,"*"); else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_BLOCK) dspl_TextOut(ax,(U16)(ay+i*fh), DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS," "); else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE) { if (dspl_getDisplayType()==DSPL_BW) { dspl_DrawFilledColRect(x,ay+i*fh,aw,ay+(i+1)*fh,0x00FFFFFF); #ifdef NO_ASCIIZ /* SPR#1983 - SH - If unicode is set, send text as unicode */ if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE) { dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,txt); if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)(txt+(EOL_position<<1))); } } else #endif { dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,txt); if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,(char*)(txt+EOL_position)); } } } else { resources_setHLColour(ma->mnuColour); dspl_DrawFilledBgdRect(x,ay+i*fh,aw,ay+(i+1)*fh); #ifdef NO_ASCIIZ /* SPR#1983 - SH - If unicode is set, send text as unicode */ if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE) { // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (icn != NULL) { if(icn->selfExplanatory == FALSE) dspl_TextOut(titleIconWidth + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); } else dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); #else dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt); #endif if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1))); } } else #endif { // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON if (icn != NULL) { if(icn->selfExplanatory == FALSE) dspl_TextOut(titleIconWidth + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); } else dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); #else dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt); #endif if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */ { dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position)); } } resources_restoreMnuColour(); } } if (icn != NULL)// && icn->nIcons > nIdx) { // Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462 #ifdef FF_MMI_SAT_ICON /* There is a problem when this icon is displayed. The last parameter was not taken into consideration & a default '0' was been set. This is corrected now.*/ /* dspl_BitBlt2(icn->area.px, icn->area.py, icn->area.sx, icn->area.sy, icn->icons, 0, icn->icnType);*/ if ((icn->area.sx > LINE_ICON_WIDTH) || (icn->area.sy > fh)) { dspl_BitBlt2(icn->area.px, icn->area.py, icn->area.sx, icn->area.sy, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR); } else { dspl_BitBlt2(icn->area.px, icn->area.py, icn->area.sx, icn->area.sy, icn->icons, 0, icn->icnType); } #else dspl_BitBlt2(icn->area.px,icn->area.py, icn->area.sx,icn->area.sy, icn->icons,(U16)nIdx,0); #endif } } i++; checkPostdraw(mnu,ma->items+nIdx); /* ES!! */ } if (oldFont != (U8) -1) dspl_SelectFontbyID(oldFont); /* restore previous font */ /* SPR#1983 - SH - No longer have to change text type back */ resources_restoreColour(); #ifdef MFW_DEBUG_DISPLAY_SIZE dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1)); #endif TIME_TRACE_EVENT("drawListMenu() end"); } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : drawFreeMenu | +--------------------------------------------------------------------+ PURPOSE : draws menu in overlapped mode */ static void drawFreeMenu (MfwMnu *mnu) { // ES!! to be revised //kk needs font entry int nFontHeight; int i, x; int nIdx; int nTextLen; MfwIcnAttr * icn; MfwMnuAttr *wa; /* working attribute */ wa = mnu->curAttr; dspl_Clear(wa->area->px,wa->area->py, (U16)(wa->area->sx+wa->area->px-1), (U16)(wa->area->sy+wa->area->py-1)); nFontHeight = dspl_GetFontHeight(); nTextLen = dspl_GetTextExtent(wa->items[mnu->lCursor[mnu->level]].str, (U16)dspl_str_length(wa->items[mnu->lCursor[mnu->level]].str)); if ((wa->mode & MNU_ALIGN) == MNU_CENTER) x = wa->area->px + (wa->area->sx - nTextLen) / 2; else if ((wa->mode & MNU_ALIGN) == MNU_RIGHT) x = wa->area->px + wa->area->sx - nTextLen; else x = wa->area->px; dspl_TextOut((U16)x,(U16)(wa->area->py+wa->area->sy-nFontHeight),DSPL_TXTATTR_CURRENT_MODE, wa->items[mnu->lCursor[mnu->level]].str); for (i = 0; i < wa->nItems; i++) { nIdx = (mnu->lCursor[mnu->level] + i + 1) % wa->nItems; icn = wa->items[nIdx].icon; if (icn != NULL) dspl_BitBlt(icn->area.px,icn->area.py, icn->area.sx,icn->area.sy, 0/*icn->usIndex*/,icn->icons,0); } } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuCommand | +--------------------------------------------------------------------+ PURPOSE : handle mfw windows command */ static int mnuCommand (U32 cmd, void *h) { switch (cmd) { case MfwCmdDelete: /* delete me */ if (!h) return 0; mnuDelete(h); return 1; case MfwCmdUpdate: /* repaint */ if (!h || ((MfwHdr *) h)->type != MfwTypMnu) return 0; mnuUpdate(((MfwHdr *) h)->data); return 1; default: break; } return 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuScrollMode | +--------------------------------------------------------------------+ PURPOSE : handle mfw windows command */ void mnuScrollMode (MfwHnd menu,U8 mode) { MfwMnu *mnu; if ((mnu = mfwControl(menu)) == 0) return; mnu->scrollMode = mode; } void mnuInitDataItem(MfwMnuItem* mnuItem) { mnuItem->icon = 0; mnuItem->exta = 0; mnuItem->menu = 0; mnuItem->func = 0; mnuItem->str = NULL; mnuItem->flagFunc = 0; } /* +--------------------------------------------------------------------+ | PROJECT : MMI-Framework (8417) MODULE : MFW_MNU | | STATE : code ROUTINE : mnuIdentify | +--------------------------------------------------------------------+ PURPOSE : SPR998 - SH - Identify menu option. Returns the index of the option, or -1 if option is not found. */ int mnuIdentify(struct MfwMnuAttrTag *attr, struct MfwMnuItemTag *item) { int index; int currentOption; /* Identify current menu option */ currentOption = -1; for (index=0; index < attr->nItems; index++) { if (&attr->items[index]==item) currentOption = index; } return currentOption; } MMI_TRACE_P1(char* str, int err) { TRACE_EVENT_P2("%s:%d",str,err); }