view src/ui/bmi/mmiResources.c @ 160:2d19a232f9eb

mmiResources.c: bogotab fixes
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 18 Nov 2020 05:55:32 +0000
parents c0052fe355d3
children
line wrap: on
line source

/*******************************************************************************

                    CONDAT (UK)

********************************************************************************

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.

********************************************************************************

 $Project name: Basic MMI
 $Project code: BMI (6349)
 $Module:       Resource Manager
 $File:         MmiResources.c
 $Revision:     1.0

 $Author:       Condat(UK)
 $Date:         25/10/00

********************************************************************************

 Description:

   Simple wrapper for the MMI Block Resources

   This module provides a simple interface to the block
   resources module, giving access to a single language,
   which can be used to get strings by Id.

   This module is a hack to provide an interface to the
   resource manager which can be easily used by a single
   process. If an application needs to use the resource
   manager it should call it directly, initialising it's
   own context safe handlers.

   This module is designed to wrap the resource API
   functions in a manner that gives the easiest and
   fastest implementation. It is therefore not a
   reentrant module, however given it only performs
   read only actions this should not be a problem.

********************************************************************************
 $History: MmiResources.c

    Sep 14, 2007    REF: OMAPS00145860  Adrian Salido
    Description:    FT - MMI: Wrong trace class of new_getDataColour
    Solution:       changed event traces to function traces because the information content of
                this is low for non-MMI people and against TI coding convention.

    Nov 07, 2006 ER:OMAPS00070661 R.Prabakar(a0393213)
    R99 network compliancy : Implemented Language Notification and Provide Local Information (Language setting)
    SAT proactive commands and Language Selection SAT event

    May 30, 2006  DR: OMAPS00070657 x0pleela
    Description: CPHS feature on Locosto-Lite
    Solution: For ALS feature,
            a) Modified "MmiRsrcGetText" function to return the string from FFS for the current active line

    March 01, 2005    REF: ENH 29313    Deepa M.D
    Isolating colour build related changes from MMI LITE flag.
    The proper  Feature flag  COLORDISPLAY was used for all color
    related changes.

    Oct 19, 2004 REF: CRR MMI-SPR-26002 xkundadu.
    Issue description:  Golite booting problem.
    Solution: If the FFS is not formatted, prevent writing into the FFS.


    Aug 25, 2004    REF: CRR 24904   Deepa M.D
    Bug:cleanup compile switches used for Go-lite
    Fix:COLOURDISPLAY compiler switch has been added to the functions which are
    used only for the normal color build.


    Aug 25, 2004    REF: CRR 24297  Deepa M.D
    Bug:Reduction of the size of the variable ColArray
    Fix:The size of the structure T_COLDATA has been reduced for the Go-lite version.
    For Go-lite only two colors are being used(Black&White), hence the members of the
    T_COLDATA structure can be reduced to U8.


    25/10/00            Original Condat(UK) BMI version.
    03/10/02        Replaced most of the file with version on branch for issue 1150 (MC, SPR 1242)
 $End

*******************************************************************************/


/*******************************************************************************

                                Include Files

*******************************************************************************/
#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.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 "prim.h"


#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_lng.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_tim.h"
#include "mfw_sim.h"
#include "mfw_nm.h"
#include "mfw_cm.h"
#include "mfw_sat.h"
#include "mfw_phb.h"
#include "mfw_sms.h"
#include "mfw_ffs.h" /*MC, SPR 1111*/
//Include the following  ensure that the function definitions within it match the
//definitions in this file.
#include "mfw_mmi.h"
#include "dspl.h"

#include "ksd.h"
#include "psa.h"

/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#endif

#include "MmiResources.h"
#include "MmiBlkLangDB.h"
#include "MmiBlkManager.h"
#include "MmiBlkResources.h"
#include "MmiBookShared.h"

#include "MmiDummy.h"
#include "MmiMmi.h"
#include "MmiMain.h"
#include "MmiStart.h"
#include "MmiPins.h"


#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiDialogs.h"
#include "Mmiicons.h"   //GW
#include "mfw_ffs.h"
// this is for traces
#include "cus_aci.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "MmiLists.h"
#include "mmiColours.h"

//#define COLOURDISPLAY
//#define TRACE_EVENT_COL TRACE_EVENT

#ifndef TRACE_EVENT_COL
#define TRACE_EVENT_COL
#endif

#ifndef LSCREEN
#define FIRST_LINE 6
#define SECOND_LINE 14
#define THIRD_LINE 24
#define FOURTH_LINE 32
#define FIFTH_LINE 40
#define SIXTH_LINE 48
#define LINE_HEIGHT 8
#define FIRST_LINE_CHINESE 12
#define SECOND_LINE_CHINESE 24
#define THIRD_LINE_CHINESE 36
#define FOURTH_LINE_CHINESE 48
#define LINE_HEIGHT_CHINESE 12

#define FIRST_LINE_ICON 6
#define SECOND_LINE_ICON 14
#define THIRD_LINE_ICON 20


#else
//#define LINE_HEIGHT 12
//Colour display - all lines are the same height
//move to header for the moment #define LINE_HEIGHT 12
#endif
//x33x-end*/

#ifndef LSCREEN
#define SK_HEIGHT_LATIN             (LINE_HEIGHT_LATIN)
#define SK_HEIGHT_CHINESE           (LINE_HEIGHT_CHINESE)
#define TITLE_HEIGHT_LATIN          (LINE_HEIGHT_LATIN)
#define TITLE_HEIGHT_CHINESE        (LINE_HEIGHT_CHINESE)

#define NLINES_LATIN                (SCREEN_SIZE_Y/LINE_HEIGHT_LATIN)   //6
#define NLINES_CHINESE              (SCREEN_SIZE_Y/LINE_HEIGHT_CHINESE) //4
#define CHINESE_MENU_VERTICAL_SIZE  ((NLINES_CHINESE-1)*LINE_HEIGHT_CHINESE)
#define STANDARD_MENU_VERTICAL_SIZE ((NLINES_LATIN-1)*LINE_HEIGHT_LATIN)

#define ICON_HEIGHT                 (6)
#else
#define SK_HEIGHT_LATIN             (LINE_HEIGHT+8)
#define SK_HEIGHT_CHINESE           (LINE_HEIGHT+8)
#define TITLE_HEIGHT_LATIN          (LINE_HEIGHT_LATIN+4)
#define TITLE_HEIGHT_CHINESE        (LINE_HEIGHT_CHINESE+4)
#define ALLOFFSET                   (LINE_HEIGHT*2)
#define MNUOFFSET                   (LINE_HEIGHT)

#define NLINES_LATIN                (SCREEN_SIZE_Y/LINE_HEIGHT_LATIN)
#define NLINES_CHINESE              (SCREEN_SIZE_Y/LINE_HEIGHT_CHINESE)
#define CHINESE_MENU_VERTICAL_SIZE  ((NLINES_CHINESE*LINE_HEIGHT_CHINESE)-SK_HEIGHT_CHINESE)
#define STANDARD_MENU_VERTICAL_SIZE ((NLINES_LATIN*LINE_HEIGHT_LATIN)-SK_HEIGHT_LATIN)

#define ICON_HEIGHT                 (22)
#endif


/*******************************************************************************

                                Static data elements

*******************************************************************************/

/* Define static data elements to give the global
   handles. These are not re-entrant, but what the
   hell, there will only be one of these in the
   system
*/
static tBlkHandle BlkManager = NULL;
UBYTE currentLanguage        = NULL;
static tBlkHandle Language   = NULL;
static long int   ModuleKey  = -1;


/* Define a unique key value to determine if the constructor
   has been called. This is slightly dangerous as there is
   a chance that the key value powers up in this state, however
   this is unlikely in a cold boot situation. (In a warm boot,
   if the RAM contents are preserved then the block resource
   manager will also be preserved, so there should be no
   problem there).
*/
#define KEYVALUE 0x00FADE00


/* We know that the resource manager deals with two languages
   at present, English and German, The first element in the
   lists will indicate which is which in a later version, however
   for now, we will just define constant settings for these.

   Note that the current MMI doesn't fully support German
   characters, but the resource manager does.
*/

#define SHOW_CONFIRM     3
int Easy_Text_Available = TRUE;

 char* SIMToolKitString=NULL;


/*SPR 1111, country code and langauge tables*/
/*MC, if English and Chinese Available*/
#ifdef CHINESE_MMI
static const CountryLangEntry LanguageTableEntries[7]=
{
    {"001", ENGLISH_LANGUAGE}, /*USA*/
    {"044", ENGLISH_LANGUAGE},  /*UK*/
    {"061", ENGLISH_LANGUAGE},  /*Australia*/
    {"353", ENGLISH_LANGUAGE},  /*Ireland*/
    {"064", ENGLISH_LANGUAGE},  /*New Zealand*/
    {"086", CHINESE_LANGUAGE}, /*PRChina*/
    {"065", CHINESE_LANGUAGE} /*Singapore*/
};

static const CountryLanguageTable LanguageTable =
{ 7, (CountryLangEntry*)LanguageTableEntries};
#else   /*MC, if English and German Available*/
static const CountryLangEntry LanguageTableEntries[7]=
{
    {"001", ENGLISH_LANGUAGE}, /*USA*/
    {"044", ENGLISH_LANGUAGE},  /*UK*/
    {"061", ENGLISH_LANGUAGE},  /*Australia*/
    {"353", ENGLISH_LANGUAGE},  /*Ireland*/
    {"064", ENGLISH_LANGUAGE},  /*New Zealand*/
    {"043", GERMAN_LANGUAGE}, /*Austria*/
    {"049", GERMAN_LANGUAGE} /*Germany*/
};

static const CountryLanguageTable LanguageTable =
{ 7, (CountryLangEntry*)LanguageTableEntries};


#endif

typedef struct
{
    // cp_resource_file_t rf;
    RESOURCE_DIRECTORY_HEADER language_table;
    RESOURCE_DIRECTORY_HEADER melody_table;
    RESOURCE_DIRECTORY_HEADER glyph_table;
    RESOURCE_DIRECTORY_HEADER zone_table;

    UBYTE langid;       // current language_table
    UBYTE fontid;       // current font
    ST_DIMENSION    fontHeight; // current font height

}  res_ResMgr_type;


typedef struct
{
  T_MMI_CONTROL    mmi_control;
  T_MFW_HND        resources_win;        /* MFW win handler      */
} T_resources;

T_resources resources_data;

enum {
    COL_TYPE_SCREEN=0,
    COL_TYPE_SK,
    COL_TYPE_HL,
    COL_TYPE_TITLE,
    COL_TYPE_MAX
};
/***************************Go-lite Optimization changes Start***********************/
//Aug 25, 2004    REF: CRR 24297  Deepa M.D
//T_COLDATA structure for the Go-lite has been reduced in size.
//March 01, 2005    REF: ENH 29313    Deepa M.D
// Isolating colour build related changes from MMI LITE flag.
// The proper  Feature flag  COLORDISPLAY was used for all color
//related changes.
#ifdef COLOURDISPLAY
typedef struct {
    U32 fgd;
    U32 bgd;
} T_COLDATA;
#else
typedef struct {
    U8 fgd;
    U8 bgd;
} T_COLDATA;
#endif
/***************************Go-lite Optimization changes end***********************/
const char * colourFileDir = "/mmi";
const char * colourFileName = "MmiColour";

static T_COLDATA colArray[LAST_COLOUR_DEF][COL_TYPE_MAX];

#define FGD_COL 1
#define BGD_COL 2
#define NO_COL 3

#ifndef LSCREEN
#define NLINES 4
#define NLINES_MAX 5
#else
#define NLINES ((SCREEN_SIZE_Y-SK_HEIGHT_LATIN)/LINE_HEIGHT)
#define NLINES_MAX ((SCREEN_SIZE_Y-SK_HEIGHT_LATIN)/LINE_HEIGHT)
#endif

/*Data should be reset */
MfwRect menuArea                            = {0,0,10,10};
MfwRect menuNamesArea                       = {0,0,10,10};
MfwRect menuListArea                        = {0,0,10,10};
MfwRect editor_menuArea                     = {0,0,10,10};      /* menus display area      */
MfwRect network_menuArea                    = {0,0,10,10};          /* menus display area      */
MfwRect sat_setup_menuArea                  = {0,0,10,10};          /* menus display area      */
MfwRect sat_select_menuArea                 = {0,0,10,10};          /* menus display area      */
MfwRect smscb_M_CBArea                      = {0,0,10,10}; /* menus display area      */
MfwRect smscb_M_CB_ACTArea                  = {0,0,10,10}; /* menus display area      */
MfwRect smscb_M_CB_TOPArea                  = {0,0,10,10};/* menus display area      */
MfwRect smscb_M_CB_TOP_CONSArea             = {0,0,10,10}; /* menus display area      */
MfwRect smscb_M_CB_TOP_CONS_SELArea         = {0,0,10,10}; /* menus display area      */
MfwRect smscb_CBArea                        = {0,0,10,10}; /* menus display area      */
MfwRect smscb_CB_OPTArea                    = {0,0,10,10}; /* menus display area      */
MfwRect readSMS_menuArea                    = {0,0,10,10}; /* menus display area      */
#ifdef FF_MMI_FILEMANAGER
MfwRect FileType_menuArea                   = {0,0,10,10}; /* menus display area      */  // RAVI - 19-05-2005
#endif
MfwRect SmsRead_R_OPTArea                   = {0,0,10,10};/* menus display area      */
MfwRect SmsSend_R_OPTArea                   = {0,0,10,10}; /* menus display area      */
MfwRect melody_menuArea                     = {0,0,10,10}; /* menus display area      */
MfwRect MAINICONarea                        = {0,0,10,10};
MfwRect MAINICONareaColour                  = {0,0,10,10};  //For the larger colour main icons

static int resources_win_cb (T_MFW_EVENT event, T_MFW_WIN * win);
static void resources_language_confirm(void);
void resources_dialog_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason);
void resources (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
T_MFW_HND resources_Init (T_MFW_HND parent_window);
void resources_Exit (T_MFW_HND own_window);
T_MFW_HND resources_create (T_MFW_HND parent_window);
void initDefaultDataColour (void);

// Extern Function ADDED - RAVI - 25-11-2005
EXTERN int flash_formatted(void);
EXTERN void idle_setBgdBitmap(int bmpId);
// END - RAVI


/*******************************************************************************

                                Private Routines

*******************************************************************************/

static void LanguageEnable( int newLanguage )
{
    /* Initialise if required
    */
    currentLanguage = newLanguage;
    if ( ModuleKey != KEYVALUE )
    {
        /* Nope, then go do it, If the mmibm_* routines fail to initialise
           they will return NULL, and they both deal with bad input values
           cleanly, so we don't need error checking here.
        */
        BlkManager = mmibm_Initialise( Mmir_BaseAddress(), Mmir_NumberOfEntries() );
        ModuleKey  = KEYVALUE;
    }

    /* Set up the new language based on the incoming value
    */
    /*MC, SPR 1150, simplified for easier addition of new languages*/
    if (newLanguage> 0 && newLanguage <= NO_OF_LANGUAGES)
        Language   = mmibm_SupplyResourceHandler( BlkManager, newLanguage );
}


/*******************************************************************************

                                Public Routines

*******************************************************************************/

/*******************************************************************************
 $Function:     MmiRsrcGetText

 $Description:  Define access routine for the actual get text
                routine. In order to make sure the routine can
                be invoked and will automatically start, we will
                use the key value above to ensure we detect the
                startup conditions.

                The calling routine for this function should check
                for NULL values which will be returned if the

 $Returns:      Pointer to resource indicated by Id (Or NULL)

 $Arguments:    Id of requested resource

*******************************************************************************/

char *MmiRsrcGetText( int Id )
{
    /* Check if we have already initialised
    */
    if ( ModuleKey != KEYVALUE )
        LanguageEnable( ENGLISH_LANGUAGE );

    /* JVJ #1576 SAT is an exception, since the Menu string is variable depending on the SIM*/
    /* but the Languages table is constant. Therefore we need this workaround for the Mainmenu*/
    /* to display the SAT header */
    if ((Id == TxtSimToolkit)&&(SIMToolKitString))
        return (char*)SIMToolKitString;

//x0pleela 23 May, 2006  DR: OMAPS00070657
#ifdef FF_CPHS
    if( (Id==TxtLine1) && strlen(FFS_flashData.line1))
    return (char*)FFS_flashData.line1;

    else if( (Id==TxtLine2) && strlen(FFS_flashData.line2))
    return (char*)FFS_flashData.line2;
#endif
    /* use the currently set up resource handler for the English
       language to get the text associaed with the Id, again if
       there has been a problem with the initialisation of the
       English handler, then the fetch routine will deal with it
       cleanly and return NULL.
    */
    return (char *) mmibr_Fetch( Language, Id );
}

/*MC, SPR 1150 new function, don't need to write a new function for each new langauge now*/
void MmiRsrcSetLang( int lang )
{   if (lang == CHINESE_LANGUAGE)
        dspl_set_char_type(DSPL_TYPE_UNICODE);
    else
        dspl_set_char_type(DSPL_TYPE_ASCII);
    LanguageEnable( lang );
    Mmi_layout_areas();
    FFS_flashData.language = lang;

//  Oct 19, 2004 REF: CRR MMI-SPR-26002 xkundadu
//  Issue description:  Golite booting problem.
//  Solution: If the FFS is not formatted, prevent writing into the FFS.
    if(flash_formatted() == TRUE)
    {
        flash_write();
    }
}

/*MC SPR 1150, Simplified menu interface functions.
It should be simpler to add new functions for new languages
We still need to write individual functions for each language to interface with the menus as
the menu architecture does not allow passing parmeters*/
/*OMAPS00070661 (SAT-Lang selection) a0393213(R.Prabakar) language selection sent to mfw*/
void Mmi_Set2English( void )
{
  TRACE_EVENT("English Language Selected");
  Mmi_Set2Language(ENGLISH_LANGUAGE);
  #ifdef FF_MMI_R99_SAT_LANG
  satLanguageSelected (ENGLISH_LANGUAGE);
  #endif
}

void Mmi_Set2German( void )
{
   TRACE_EVENT("German Language Selected");
   Mmi_Set2Language(GERMAN_LANGUAGE);
   #ifdef FF_MMI_R99_SAT_LANG
   satLanguageSelected (GERMAN_LANGUAGE);
   #endif
}

void Mmi_Set2Chinese( void )
{
  TRACE_EVENT("Chinese Language Selected");
  Mmi_Set2Language(CHINESE_LANGUAGE);
  #ifdef FF_MMI_R99_SAT_LANG
  satLanguageSelected (CHINESE_LANGUAGE);
  #endif
}

#ifdef LANG_CHANGE_TEST
void Mmi_Set2Martian( void )
{
 TRACE_EVENT("Martian Language Selected");
  Mmi_Set2Language(MARTIAN_LANGUAGE);
 #ifdef FF_MMI_R99_SAT_LANG
 satLanguageSelected (MARTIAN_LANGUAGE);
 #endif
}
#endif

/*MC SPR 1150,new generic langauge change function*/
void Mmi_Set2Language(int lang)
{
    T_MFW_HND win = mfw_parent(mfw_header());
    #ifndef FF_MMI_R99_SAT_LANG /*OMAPS00070661(SAT-lang notify) a0393213(R.Prabakar)*/
        resources_Init(win);
        MmiRsrcSetLang(lang);
        SEND_EVENT (resources_data.resources_win, SHOW_CONFIRM, 0, 0);
    #else
          /*OMAPS00070661 The sequence is changed to prevent the crash when the language is changed in quick succession*/
        MmiRsrcSetLang(lang);
        if(!resources_data.resources_win)
        {
        resources_Init(win);
        SEND_EVENT (resources_data.resources_win, SHOW_CONFIRM, 0, 0);
        }
    #endif
}

UBYTE Mmi_getCurrentLanguage(void)
{
    return currentLanguage;
}

//GW Created to return height of a line with just numbers on it
UBYTE numberLineHeight(void)
{
#ifndef LSCREEN
    //All numbers are 8 bits high (whether chinese or latin chars)
    return (8);
#else
    //all text is 12 bits high
    return (12);
#endif
}

//GW Created
UBYTE Mmi_layout_line(int lineNo)
{
#ifndef LSCREEN
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
    {
        switch (lineNo)
        {
        case 1:     return FIRST_LINE_CHINESE;

        case SECOND_LAST_LINE_TOP:
        case 2:     return SECOND_LINE_CHINESE;

        case LAST_LINE_TOP:
        case 3:     return THIRD_LINE_CHINESE;

        case LAST_LINE:
        case 4:     return FOURTH_LINE_CHINESE;
        //We are now asking for an invalid line
        default:    return FOURTH_LINE_CHINESE;

        }
    }
    else
    {
        switch (lineNo)
        {
        case 1:     return FIRST_LINE;
        case 2:     return SECOND_LINE;
        case 3:     return THIRD_LINE;

        case SECOND_LAST_LINE_TOP:
        case 4:     return FOURTH_LINE;

        case LAST_LINE_TOP:     //y-coord of the top of last line
        case 5:     return FIFTH_LINE;

        case LAST_LINE:
        case 6:     return SIXTH_LINE;
        //We are now asking for an invalid line
        default:    return SIXTH_LINE;
        }
    }
#else
    //assume both fonts are now the same height.
    switch (lineNo)
    {
        case SECOND_LAST_LINE_TOP:  return ( (UBYTE)(SCREEN_SIZE_Y-Mmi_layout_softkeyHeight()-LINE_HEIGHT));
        case LAST_LINE_TOP:         return ( (UBYTE)(SCREEN_SIZE_Y-Mmi_layout_softkeyHeight()));
        case LAST_LINE:             return ( (UBYTE) SCREEN_SIZE_Y);

        default:    return (lineNo*LINE_HEIGHT);
    }
#endif
}

UBYTE Mmi_layout_line_icons(int lineNo)
{
#ifndef LSCREEN
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
    {
        switch (lineNo)
        {
        case 1:     return FIRST_LINE_CHINESE;

        case SECOND_LAST_LINE_TOP:
        case 2:     return SECOND_LINE_CHINESE;

        case LAST_LINE_TOP:
        case 3:     return THIRD_LINE_CHINESE;

        case LAST_LINE:
        case 4:     return FOURTH_LINE_CHINESE;
        //We are now asking for an invalid line
        default:    return FOURTH_LINE_CHINESE;

        }
    }
    else
    {
        switch (lineNo)
        {
        case 1:     //nobreak;
        case 2:     //nobreak;
        case 3:     //nobreak;
        default:    return (FIRST_LINE_ICON+(lineNo-1)*LINE_HEIGHT);

        case SECOND_LAST_LINE_TOP:
        case 4:     return FOURTH_LINE;

        case LAST_LINE_TOP:     //y-coord of the top of last line
        case 5:     return FIFTH_LINE;

        case LAST_LINE:
        case 6:     return SIXTH_LINE;
        }

    }
#else
        switch (lineNo)
        {
        case SECOND_LAST_LINE_TOP:      return((UBYTE)(SCREEN_SIZE_Y-(Mmi_layout_softkeyHeight()+Mmi_layout_line_height())));
        case LAST_LINE_TOP:             return((UBYTE)(SCREEN_SIZE_Y-(Mmi_layout_softkeyHeight())));
        case LAST_LINE:                 return((UBYTE)(SCREEN_SIZE_Y));
        default:                        return(Mmi_layout_IconHeight()+Mmi_layout_line_height()*lineNo);

        }
#endif
}

UBYTE Mmi_layout_line_height(void)
{
#ifndef LSCREEN
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        return LINE_HEIGHT_CHINESE;
    else
        return LINE_HEIGHT;
#else
    return (LINE_HEIGHT);
#endif
}

UBYTE Mmi_layout_softkeyHeight( void )
{
#ifndef LSCREEN
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        return SK_HEIGHT_CHINESE;
    else
        return SK_HEIGHT_LATIN;
#else
    return (SK_HEIGHT_LATIN);
#endif
}

UBYTE Mmi_layout_softkeyArea( MfwRect* rect )
{
    if (!rect)
        return (0);
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        rect->sy = SK_HEIGHT_CHINESE;
    else
        rect->sy = SK_HEIGHT_LATIN;
    rect->px = 0;
    rect->sx = SCREEN_SIZE_X;
    rect->py = SCREEN_SIZE_Y-rect->sy;
    return(1);
}

UBYTE Mmi_layout_TitleHeight( void )
{
#ifndef LSCREEN
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        return TITLE_HEIGHT_CHINESE;
    else
        return TITLE_HEIGHT_LATIN;
#else
    return (TITLE_HEIGHT_LATIN);
#endif
}

UBYTE Mmi_layout_IconHeight( void )
{
    return (ICON_HEIGHT);
}

UBYTE Mmi_number_of_lines_with_icons_on_top(void)
{
#ifndef LSCREEN
{
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        return 2;
    else
        return 4;
}
#else
    return NLINES_MAX-1;
#endif
}


UBYTE Mmi_number_of_lines_without_icons_on_top(void)
{
#ifndef LSCREEN
{
    if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
        return 3;
    else
        return 5;
}
#else //assume a single font of 12 pixels high 10 lines x 12 pixels
    return NLINES_MAX;
#endif
}

//GW 10/02/03   Modified code - icon position is now sorted out by 'iconsMainIconsAreaSet' - the code
//              here only supplies the available screen size
void Mmi_layout_areas(void)
{
    MAINICONarea.px = 0;
    MAINICONarea.py =Mmi_layout_line_height();

    MAINICONarea.sx = SCREEN_SIZE_X;
    MAINICONarea.sy =SCREEN_SIZE_Y-Mmi_layout_line_height()*2-1;

    Mmi_set_area_attr(&menuArea,                        0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&menuNamesArea,                   0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-LINE_HEIGHT-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&menuListArea,                    0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&editor_menuArea,Mmi_layout_line(1),0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&network_menuArea,                0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-/*Mmi_layout_IconHeight()-*/Mmi_layout_softkeyHeight()); /* SPR#2354 - SH - icons aren't shown */
    Mmi_set_area_attr(&sat_setup_menuArea,              0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&sat_select_menuArea,             0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_M_CBArea,                  0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_M_CB_ACTArea,              0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_M_CB_TOPArea,              0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_M_CB_TOP_CONSArea,         0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_M_CB_TOP_CONS_SELArea,     0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_CBArea,                    0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&smscb_CB_OPTArea,                0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&readSMS_menuArea,                0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
#ifdef FF_MMI_FILEMANAGER
    Mmi_set_area_attr(&FileType_menuArea,               0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());     // RAVI - 27-05-2005
#endif
    Mmi_set_area_attr(&SmsRead_R_OPTArea,               0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&SmsSend_R_OPTArea,               0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    Mmi_set_area_attr(&melody_menuArea,                 0,0,SCREEN_SIZE_X,SCREEN_SIZE_Y-Mmi_layout_softkeyHeight());
    iconsMainIconsAreaSet (MAINICONarea);
}

void Mmi_set_area_attr(MfwRect* area,U16 px,U16 py,U16 sx,U16 sy)
{
    /* pass in top-left/bottom-right coordinates*/
    area->px = px;
    area->py = py;
    area->sx = sx-px;
    area->sy = sy-py;
}

/*******************************************************************************

 $Function:     resources_Init

 $Description:

 $Returns:      window

 $Arguments:    parent window

*******************************************************************************/
T_MFW_HND  resources_Init(T_MFW_HND parent_window)
{
  return (resources_create (parent_window));
}

// API - 1550 - 13-01-03 - Add this function to reset the backgrounds of Idle and Main Menus.
void resetFactoryBackground ( void )
{
    idle_setBgdBitmap(BGD_TI_LOGO);
    FFS_flashData.IdleScreenBgd = BGD_TI_LOGO;

    icon_setMainBgdBitmap(BGD_SQUARE);
    FFS_flashData.MainMenuBgd = BGD_SQUARE;

    FFS_flashData.ProviderNetworkShow = TRUE;
}

void resetFactoryColour ( void )
{
    initDefaultDataColour();
    if(flash_data_write(colourFileDir, colourFileName, colArray, sizeof(colArray)) >= EFFS_OK)
    {
        TRACE_EVENT("File Created in FFS");
    }
    else
    {
        TRACE_EVENT("File Not Created in FFS");
    }
}

void colour_initial_colours (void)
{
/* API/GW - Added to read the flash structure to see if the file structure to save the colour data in has been created
             and if so save the initialised data to flash or load the saved values out of flash
*/
  if (flash_data_read(colourFileDir, colourFileName, colArray, sizeof(colArray)) == sizeof(colArray))
    /* Marcus: Issue 1719: 11/02/2003: Altered comparison in condition */
  {
    TRACE_EVENT("Correctly Read in!");
  }
  else
  {
    resetFactoryColour();
  }
}

/*******************************************************************************

 $Function:     resources_Exit

 $Description:  exit network handling (Backward Compatibility interface)

 $Returns:      none

 $Arguments:    window

*******************************************************************************/
void resources_Exit (T_MFW_HND own_window)
{

    T_MFW_WIN   * win_data = ((T_MFW_HDR *)own_window)->data;
    T_resources * data     = (T_resources *)win_data->user;

  resources_destroy (data->resources_win);
}


/*******************************************************************************

 $Function:     resources_create

 $Description:  create network top window

 $Returns:      window

 $Arguments:    parent_window

*******************************************************************************/
T_MFW_HND resources_create (T_MFW_HND parent_window)
{
  T_resources * data = &resources_data;
  T_MFW_WIN   * win;

  TRACE_FUNCTION ("resources_create()");

  data->resources_win = win_create (parent_window, 0, 0, (T_MFW_CB)resources_win_cb);

  if (data->resources_win EQ 0)
    return 0;

  /*
   * Create window handler
   */
  data->mmi_control.dialog = (T_DIALOG_FUNC)resources;
  data->mmi_control.data   = data;
  win                      = ((T_MFW_HDR *)data->resources_win)->data;
  win->user                = (void *) data;

  winShow(data->resources_win);
  /*
   * return window handle
   */
  return data->resources_win;
}


/*******************************************************************************

 $Function:     resources_destroy

 $Description:

 $Returns:      none

 $Arguments:    window

*******************************************************************************/
void resources_destroy (T_MFW_HND own_window)
{
  T_MFW_WIN   * win;
  T_resources * data;

  TRACE_FUNCTION ("resources_destroy()");

  if (own_window)
  {
    win  = ((T_MFW_HDR *)own_window)->data;
    data = (T_resources *)win->user;

    if (data)
    {

      /*
       * Delete WIN handler
       */
      win_delete (data->resources_win);
      data->resources_win = 0;
    }
  }
}


/*******************************************************************************

 $Function:     resources_win_cb

 $Description:  network top window

 $Returns:      status int

 $Arguments:    event, window

*******************************************************************************/
static int resources_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
{
  /*
   * Top Window has no output
   */
  return 1;
}


/*******************************************************************************

 $Function:     resources_language_confirm

 $Description:

 $Returns:      void

 $Arguments:    void

*******************************************************************************/
static void resources_language_confirm(void)
{
  T_DISPLAY_DATA display_info;

  TRACE_FUNCTION ("resources_language_confirm()");

    dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtDone, TxtNull , COLOUR_STATUS_PINS);
    dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)resources_dialog_cb, THREE_SECS, KEY_CLEAR | KEY_RIGHT );

  /*
   * Call Info Screen
   */
  info_dialog (resources_data.resources_win, &display_info);
}

/*******************************************************************************

 $Function:     resources_dialog_cb

 $Description:

 $Returns:      void

 $Arguments:    window, identifier, reason

*******************************************************************************/
void resources_dialog_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
{
    TRACE_FUNCTION ("resources_dialog_cb()");

      switch (reason)
      {
        case INFO_TIMEOUT:
          /* no break; */
        case INFO_KCD_HUP:
          /* no break; */
        case INFO_KCD_LEFT:
          /* no break; */
        case INFO_KCD_RIGHT:
            resources_Exit(win);
          break;
      }
}


/*******************************************************************************

 $Function:     resources

 $Description:

 $Returns:      void

 $Arguments:    window, event, value, parameter

*******************************************************************************/
void resources (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
 // T_MFW_WIN         * win_data = ((T_MFW_HDR *) win)->data;  // RAVI
 // T_resources       * data     = (T_resources *)win_data->user;  // RAVI

 TRACE_FUNCTION("resources()");

 switch (event)
  {
    case SHOW_CONFIRM:
        resources_language_confirm();
    break;
  }
}

/*MC added for SPR 1111*/
/*******************************************************************************

 $Function:     resources_reset_language

 $Description:  Reset language using Pseudo-SS string

 $Returns:      TRUE if reset successful, FALSE otherwise

 $Arguments:    Pseudo-SS string

*******************************************************************************/
BOOL resources_reset_language(char* string)
{
    char country_code[4];
    int i;
    /*extract country code from input string*/
    memcpy(country_code, &string[3], 3);
    country_code[3] = NULL;

    /*for each entry in Language table*/
    for(i=0; i<LanguageTable.no_of_entries; i++)
    {       /*if country matches that of entry*/

        if (!strcmp(country_code, LanguageTable.entries[i].country_dialling_code))
        {   /*MC SPR 1150, check language fits in allowed range, rather than checking for each
            and every language (easier to add more languages this way)*/
            if (LanguageTable.entries[i].language>0 && LanguageTable.entries[i].language <= NO_OF_LANGUAGES)
            {   MmiRsrcSetLang(LanguageTable.entries[i].language);
                return TRUE;
            }
        }
    }
    /*if no matches found*/
    return FALSE;
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
#define NO_COLOUR_DEFINED (0x01010101)
/***************************Go-lite Optimization changes Start***********************/
//Aug 25, 2004    REF: CRR 24297  Deepa M.D
//This function is called only for Color build.
#ifdef COLOURDISPLAY
void init_getDataColour(int screenType, int colType, U32 *fgd, U32 *bgd)
{
    U32 fgColor;
    U32 bgColor;
    U32 fgHLColor = NO_COLOUR_DEFINED;
    U32 bgHLColor = NO_COLOUR_DEFINED;
    U32 fgSKColor = NO_COLOUR_DEFINED;
    U32 bgSKColor = NO_COLOUR_DEFINED;
    U32 fgTColor = NO_COLOUR_DEFINED;
    U32 bgTColor = NO_COLOUR_DEFINED;

    TRACE_EVENT("init_getDataColour");

    switch (screenType)
    {
    case COLOUR_STATUS_WELCOME: //start screen
    case COLOUR_STATUS_GOODBYE: //end screen
        fgColor =       COL_Black;
        bgColor =       COL_White;
        fgSKColor =     COL_Blue;
        bgSKColor =     COL_Yellow;
        break;

    /* GW#2294 Use a more legible colour as default background colour.*/
    case COLOUR_POPUP:
    case COLOUR_STATUS: //generic status window
        fgColor =       COL_Red; //0x0000FF00;
        bgColor =       COL_Yellow;//0x00FFFFFF;
        fgSKColor =     COL_Red;
        bgSKColor =     COL_TRANSPARENT;
        break;

    case COLOUR_EDITOR:
        fgTColor  =     COL_White;
        bgTColor  =     COL_Blue;
        fgColor =       COL_Blue; // 0x00FFFF00;
        bgColor =       COL_Yellow;//COL_White;//0x00FFFFFF;
        fgSKColor =     COL_Blue;
        bgSKColor =     COL_PaleYellow; //0x00FFFF00;
        break;

    case COLOUR_LIST_MAIN:
        fgTColor  =     COL_White;
        bgTColor  =     COL_BLK;
        fgColor =       COL_Yellow ;
        bgColor =       COL_Blue;
        fgColor =       COL_Black ;
        bgColor =       COL_White;
        fgSKColor =     COL_W;
        bgSKColor =     COL_BLK;    //0x00FFFF00;
        bgHLColor =     COL_MidGrey;
        break;

    case COLOUR_LIST_SUBMENU:
    case COLOUR_LIST_SUBMENU1:
    case COLOUR_LIST_SUBMENU2:
    case COLOUR_LIST_SUBMENU3:
    case COLOUR_LIST_SUBMENU4:
        fgTColor  =     COL_Blue;
        bgTColor  =     COL_PaleYellow;
        fgColor =       COL_Black ;
        bgColor =       COL_White;
        bgHLColor =     COL_MidGrey;
        fgSKColor =     COL_Blue;
        bgSKColor =     COL_PaleYellow; //0x00FFFF00;
        break;

    case COLOUR_LIST_COLOUR:
        fgColor     =   COL_RG2;
        bgColor     =   COL_W2;
        fgSKColor   =   COL_W;
        bgSKColor   =   COL_B;
        fgTColor    =   COL_RG;
        bgTColor    =   COL_B;
        fgHLColor   =   dspl_GetBgdColour();
        bgHLColor   =   dspl_GetFgdColour();
        break;

    //Colours for specific displays
    case COLOUR_GAME:
        fgColor =   COL_BLK ;
        bgColor =   COL_W;
        fgSKColor = COL_BLK ;
        bgSKColor = COL_Orange;
        fgHLColor = COL_B;
        bgHLColor = COL_W;
        fgTColor  = COL_RB;
        bgTColor  = COL_G;
        break;

    case COLOUR_IDLE:
        fgColor =       COL_BLK;//Green ;
        bgColor =       COL_TRANSPARENT;//White ;
        fgSKColor =     COL_Blue;
        bgSKColor =     COL_TRANSPARENT;
        //Colours are for the icons
        fgTColor  =     COL_RB;
        bgTColor  =     COL_G;
        break;

    case COLOUR_INCALL:
        fgColor =   COL_RG ;
        bgColor =   COL_BLK;
        fgSKColor = COL_B ;     /* SPR#1699 - SH - Modified so softkeys visible */
        bgSKColor = COL_TRANSPARENT;
        fgHLColor = COL_B;
        bgHLColor = COL_W;
        fgTColor  = COL_RB;
        bgTColor  = COL_G;
        break;

    default:
        fgColor =   0x002020FF;
        bgColor =   COL_GR;//0x00FFFFFF;
        fgSKColor =     0x0000FF01;
        bgSKColor =     COL_GR;//0x00FF0000;
        break;
    }

    /*If we have no preference for the other colours - set to default*/
    if (fgHLColor == NO_COLOUR_DEFINED)
        fgHLColor = bgColor;
    if (bgHLColor == NO_COLOUR_DEFINED)
        bgHLColor = fgColor;

    if (fgSKColor == NO_COLOUR_DEFINED)
        fgSKColor = fgColor;
    if (bgSKColor == NO_COLOUR_DEFINED)
        bgSKColor = bgColor;
    if (fgTColor == NO_COLOUR_DEFINED)
        fgTColor = fgColor;
    if (bgTColor == NO_COLOUR_DEFINED)
        bgTColor = bgColor;

    switch (colType)
    {
    case    COL_TYPE_SCREEN:
    default:
            *fgd    = fgColor;
            *bgd    = bgColor;
            break;
    case    COL_TYPE_SK:
            *fgd    = fgSKColor;
            *bgd    = bgSKColor;
            break;
    case    COL_TYPE_HL:
            *fgd    = fgHLColor;
            *bgd    = bgHLColor;
            break;
    case    COL_TYPE_TITLE:
            *fgd    = fgTColor;
            *bgd    = bgTColor;
            break;

    }
    if (*fgd == *bgd)
    {
        if (*fgd != COL_B)
            *fgd = COL_B;
    }
}
#endif
/***************************Go-lite Optimization changes end***********************/
//This array will be used to store all the colour info for each colour type.
//This will allow us to let the user change the colour selected
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/

/***************************Go-lite Optimization changes Start***********************/
//Aug 25, 2004    REF: CRR 24904   Deepa M.D
//This function is used only for the Color build.Hence it is put under the
//COLOURDISPLAY compiler switch
#ifdef COLOURDISPLAY
void setDataColour(int screenType, int colType, U32 fgdORbgd, U32 newColour)
{

    TRACE_EVENT("setDataColour");

    if ((newColour == NO_COLOUR_DEFINED) || (fgdORbgd ==NO_COL))
        return;
    if ((screenType < LAST_COLOUR_DEF) &&
        (screenType >=0) &&
        (colType < LAST_COLOUR_DEF) &&
        (colType >=0))
    {
        if (fgdORbgd == FGD_COL)
        {
            //Do not allow transparent foreground colours
            if ((newColour & 0xFF000000) != 0xFF000000)
                colArray[screenType][colType].fgd = newColour;
        }
        else
        {
            colArray[screenType][colType].bgd = newColour;
        }
    }
}
#endif
/***************************Go-lite Optimization changes Start***********************/


/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void initDefaultDataColour (void)
{
    int i,j;

        for (i=0; i<LAST_COLOUR_DEF;i++)
        {
            for (j=0; j<COL_TYPE_MAX;j++)
            {
                /***************************Go-lite Optimization changes Start***********************/
                //Aug 25, 2004    REF: CRR 24297  Deepa M.D
                //For Go-lite build, do the initialization of the colArray with black and white.
                //March 01, 2005    REF: ENH 29313    Deepa M.D
                // Isolating colour build related changes from MMI LITE flag.
                // The proper  Feature flag  COLORDISPLAY was used for all color
                //related changes.
#ifdef COLOURDISPLAY
                init_getDataColour(i, j, &colArray[i][j].fgd, &colArray[i][j].bgd);
#else
                colArray[i][j].fgd  = COL_Lite_Black;
                colArray[i][j].bgd = COL_Lite_White;
#endif
                /***************************Go-lite Optimization changes end***********************/
            }
        }
}

void getDataColour(int screenType, int colType, U32 *fgd, U32 *bgd)
{
    TRACE_EVENT("getDataColour");

    if ((screenType == COLOUR_LIST_COLOUR) && (colType ==COL_TYPE_HL))
    {
    /* x0083025 on Sep 14, 2007 for OMAPS00145860 (adrian) */
    MMI_TRACE_EVENT("new_getDataColour IF");

        *fgd    = dspl_GetBgdColour();
        *bgd    = dspl_GetFgdColour();
    }
    else if ((screenType < LAST_COLOUR_DEF) &&
        (screenType >=0) &&
        (colType < COL_TYPE_MAX) &&
        (colType >=0))
    {
        /* x0083025 on Sep 14, 2007 for OMAPS00145860 (adrian) */
        MMI_TRACE_EVENT("new_getDataColour ELSE IF");
        *fgd = colArray[screenType][colType].fgd;
        *bgd = colArray[screenType][colType].bgd;
        /***************************Go-lite Optimization changes Start***********************/
        //Aug 25, 2004    REF: CRR 24297  Deepa M.D
        //Set the fgd and bgd color for Go-lite version based
        //on the value stored in the colArray
        //March 01, 2005    REF: ENH 29313    Deepa M.D
        // Isolating colour build related changes from MMI LITE flag.
        // The proper  Feature flag  COLORDISPLAY was used for all color
        //related changes.
#ifndef COLOURDISPLAY
        if(*fgd==COL_Lite_Black)
            *fgd=COL_Black;
        else
            *fgd=COL_White;
        if(*bgd==COL_Lite_Black)
            *bgd=COL_Black;
        else
            *bgd=COL_White;
#endif
        /***************************Go-lite Optimization changes end***********************/
    }
    else
    {
        /* x0083025 on Sep 14, 2007 for OMAPS00145860 (adrian) */
        MMI_TRACE_EVENT("new_getDataColour ELSE");
        *fgd = colArray[0][0].fgd;
        *bgd = colArray[0][0].bgd;
    /***************************Go-lite Optimization changes Start***********************/
        //Aug 25, 2004    REF: CRR 24297  Deepa M.D
        //Set the fgd and bgd color for Go-lite version based
        //on the value stored in the colArray
        //March 01, 2005    REF: ENH 29313    Deepa M.D
        // Isolating colour build related changes from MMI LITE flag.
        // The proper  Feature flag  COLORDISPLAY was used for all color
        //related changes.
#ifndef COLOURDISPLAY
        if(*fgd==COL_Lite_Black)
            *fgd=COL_Black;
        else
            *fgd=COL_White;
        if(*bgd==COL_Lite_Black)
            *bgd=COL_Black;
        else
            *bgd=COL_White;
#endif
        /***************************Go-lite Optimization changes end***********************/
TRACE_EVENT_P1("fdg color is %d",*fgd);
        TRACE_EVENT_P1("bdg color is %d",*bgd);

    }
}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
static U32 oldFgdCol,oldBgdCol;
static U32 oldmnuFgdCol,oldmnuBgdCol;
void resources_setColour(unsigned int colIndex)
{
    U32 fgdColour,bgdColour;
    getDataColour(colIndex, COL_TYPE_SCREEN, &fgdColour,  &bgdColour);
    oldFgdCol = dspl_SetFgdColour( fgdColour);
    oldBgdCol = dspl_SetBgdColour( bgdColour);
    if (colIndex==0xFFFF)
    {//disabled for the moment
        char str[50];
        sprintf(str,"Id=%d (%x,%x)",colIndex,fgdColour,bgdColour);
        dspl_ScrText (0, 180, str, 0);
    }
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void resources_setSKColour(unsigned int colIndex)
{
    U32 fgdSKColour,bgdSKColour;
    getDataColour(colIndex, COL_TYPE_SK, &fgdSKColour,  &bgdSKColour );
    oldmnuFgdCol = dspl_SetFgdColour( fgdSKColour);
    oldmnuBgdCol = dspl_SetBgdColour( bgdSKColour);
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void resources_setHLColour(unsigned int colIndex)
{
    U32 fgdColour,bgdColour;
#ifdef COLOURDISPLAY
    getDataColour(colIndex, COL_TYPE_HL, &fgdColour,  &bgdColour );
#else
    //For b+w highlight, get fgd colour as bgd and vice versa
    fgdColour = dspl_GetBgdColour();
    bgdColour = dspl_GetFgdColour();
    //If one colour is black/white, make other colour the opposite
    if (fgdColour == COL_Black)
        bgdColour = COL_White;
    else if (bgdColour == COL_Black)
        fgdColour = COL_White;
    else if (fgdColour == COL_White)
        bgdColour = COL_Black;
    else if (bgdColour == COL_White)
        fgdColour = COL_Black;
    else
    {   //Default : assume the rest of the display is black on white=> highlight is white on black.
        fgdColour = COL_White;
        bgdColour = COL_Black;
    }

#endif
    oldmnuFgdCol = dspl_SetFgdColour( fgdColour);
    oldmnuBgdCol = dspl_SetBgdColour( bgdColour);
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void resources_setTitleColour(unsigned int colIndex)
{
    U32 fgdColour,bgdColour;
    getDataColour(colIndex, COL_TYPE_TITLE, &fgdColour,  &bgdColour );
    oldmnuFgdCol = dspl_SetFgdColour( fgdColour);
    oldmnuBgdCol = dspl_SetBgdColour( bgdColour);
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
void resources_restoreColour(void)
{
    dspl_SetFgdColour( oldFgdCol);
    dspl_SetBgdColour( oldBgdCol);
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void resources_restoreMnuColour(void)
{
    dspl_SetFgdColour( oldmnuFgdCol);
    dspl_SetBgdColour( oldmnuBgdCol);
}


/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void getDisplayData(int txtId,int *colDisplayType, int *colType, int *colFgdSelect)
{
    *colFgdSelect = NO_COL;

/**/
    switch (txtId)
    {

default:
                *colFgdSelect = NO_COL;
                break;

case    TxtIdleScreenBackground:
                *colDisplayType =   COLOUR_IDLE;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtIdleScreenSoftKey:
                *colDisplayType =   COLOUR_IDLE;
                *colType =          COL_TYPE_SK;
                *colFgdSelect =     FGD_COL;
                break;
case    TxtIdleScreenText:
                *colDisplayType =   COLOUR_IDLE;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     FGD_COL;
                break;
case    TxtIdleScreenNetworkName:
                *colDisplayType =   COLOUR_IDLE;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     FGD_COL;
                break;
case    TxtGeneralBackground:
                *colDisplayType =   COLOUR_LIST_MAIN;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtMenuSoftKeyForeground:
                *colDisplayType =   COLOUR_LIST_MAIN;
                *colType =          COL_TYPE_SK;
                *colFgdSelect =     FGD_COL;
                break;
case    TxtMenuSoftKeyBackground:
                *colDisplayType =   COLOUR_LIST_MAIN;
                *colType =          COL_TYPE_SK;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtSubMenuHeadingText:
                *colDisplayType =   COLOUR_LIST_SUBMENU;
                *colType =          COL_TYPE_TITLE;
                *colFgdSelect =     FGD_COL;
                break;

case    TxtSubMenuHeadingBackground:
                *colDisplayType =   COLOUR_LIST_SUBMENU;
                *colType =          COL_TYPE_TITLE;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtSubMenuTextForeground:
                *colDisplayType =   COLOUR_LIST_SUBMENU;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     FGD_COL;
                break;

case    TxtSubMenuTextBackground:
                *colDisplayType =   COLOUR_LIST_SUBMENU;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtSubMenuSelectionBar:
                *colDisplayType =   COLOUR_LIST_SUBMENU;
                *colType =          COL_TYPE_HL;
                *colFgdSelect =     BGD_COL;
                break;
case    TxtPopUpTextForeground: /* GW#2294 COLOUR_STATUS has been used for all popups - change this colour instead of COLOUR_POPUP .*/
                *colDisplayType =   COLOUR_STATUS;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     FGD_COL;
                break;
case    TxtPopUpTextBackground: /* GW#2294 COLOUR_STATUS has been used for all popups - change this colour instead of COLOUR_POPUP .*/
                *colDisplayType =   COLOUR_STATUS;
                *colType =          COL_TYPE_SCREEN;
                *colFgdSelect =     BGD_COL;
                break;
        }
/**/
}
/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
//This is called to set the colour of menu items controlled by the text id's
int resources_getColourFromText(int txtId)
{
    U32 col;
    switch (txtId)
    {
case    TxtColourBlack:         col = COL_Black;        break;
case    TxtColourBlue:          col = COL_Blue;         break;
case    TxtColourCyan:          col = COL_Cyan;         break;
case    TxtColourGreen:         col = COL_Green;        break;
case    TxtColourMagenta:       col = COL_Magenta;      break;
case    TxtColourYellow:        col = COL_Yellow;       break;
case    TxtColourRed:           col = COL_Red;          break;
case    TxtColourWhite:         col = COL_White;        break;
case    TxtColourPink:          col = COL_Pink;         break;//    0x00FF4040;     break;
case    TxtColourOrange:        col = COL_Orange;       break;
case    TxtColourLightBlue:     col = COL_LightBlue;    break;//    0x004040FF; break;
case    TxtColourLightGreen:    col = COL_LightGreen;   break;//    0x0040FF40; break;
case    TxtColourPaleYellow:    col = COL_PaleYellow;   break;//    0x00FFFF40; break;
case    TxtColourTransparent:   col = COL_Transparent;  break;
default:    col = NO_COLOUR_DEFINED;
        }
    return (col);
}


/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
void resources_setColourMnuItem( int txtId)
{
U32 col = NO_COLOUR_DEFINED;
int colType;
int colFgdSelect = FALSE;
int colDisplayType;
U32 fgd,bgd;

    col = resources_getColourFromText(txtId);
    if (col == NO_COLOUR_DEFINED)
    {
        getDisplayData(txtId, &colDisplayType, &colType,&colFgdSelect);
        getDataColour(colDisplayType, colType, &fgd, &bgd);
        switch (colFgdSelect)
        {
                case FGD_COL:   col = fgd;  break;
                case BGD_COL:   col = bgd;  break;
                default:                    break;
        }
    }
    if (col != NO_COLOUR_DEFINED)
    {
        if (col!=COL_Transparent)
        {
            dspl_SetFgdColour( col );
            dspl_SetBgdColour( (~col) & 0x00FFFFFF );
        }
        else
        {
            dspl_SetFgdColour( COL_Black );
            dspl_SetBgdColour( COL_Magenta );

        }
    }
}


/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History

*******************************************************************************/
int res_getTitleHeight( void )
{
    if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE)
    {
        return(TITLE_HEIGHT_LATIN);
    }
    else
    {
        return(TITLE_HEIGHT_CHINESE);
    }
}
/*Function added for SPr 1442*/
/*******************************************************************************
 $Function:     string_len_in_bytes

 $Description:  internal function which returns th length of a string in bytes

 $Returns:      length of string

 $Arguments:    string, maximum possibel length, whether unicode or not

*******************************************************************************/
int string_len_in_bytes(char* string, int max_len, int unicode)
{   int i;
    int length=0;
    /* if unicode, nee to check for double-NULL termination*/
    if (string[0] == (char)0x80 || unicode== TRUE) /*a0393213 lint warnings removal - typecast done*/
    {
        for(i=0; i < max_len; i+=2)
        {   if (string[i] == 0 && string[i+1]==0)
            {   length = i;
                break;
            }
        }
        return length;

    }

    else/*just use standard function*/
    {   return strlen(string);
    }
}

#ifdef LSCREEN
#define TRUNC_LENGTH 3 /*... at end of string in D-sample*/
#else
#define TRUNC_LENGTH 1/* . at end of string in c-sample*/
#endif

/*Function added for SPr 1442*/
/*******************************************************************************
 $Function:     resources_truncate_to_screen_width

 $Description:  Copies and truncates the input string to the passed screen width
                and puts it into the output string.
                Note: this function only works for Unicode strings which have a unicode
                tag at the beginning, or if the unicode parameter is set to TRUE.
                If the input length is zero, then this function calculates
                the actual length of the input string.

 $Returns:      length of truncated string

 $Arguments:    input sctring and it's length, ouput string and it's length,
                screen width desired (pixels), unicode flag (TRUE/FALSE)

*******************************************************************************/
//GW #1541 16/01/03 - Modified code to first test if string will fit and return string if it does.
int resources_truncate_to_screen_width(char* IpStr, int IpLen, char* OpStr, int OpLen,
    int ScreenWidth, BOOL unicode)

{
    int start_position = 0;
    #ifdef LSCREEN
    char* ellipse_str = "...";
    #else
    char* ellipse_str = ".";
    #endif
    int ellipsis_len = dspl_GetTextExtent(ellipse_str, 0);
    int i;
    int j;
    int calc_input_len = 0;
    int no_of_chars = 0;
    int len;

    memset(OpStr, 0, OpLen);

    /*if input string length 0, we calculate the string len ourselves*/
    if (IpLen == 0)
    { calc_input_len = string_len_in_bytes(IpStr, 256, unicode);
    }
    else
    {   calc_input_len = IpLen;
    }   /*Test for string alrady fitting */

    if (dspl_GetTextExtent(IpStr, 0) <  ScreenWidth)
    {
        for (i=0; i<OpLen && i<calc_input_len; )
        {   //if length of string less that width of screen
            //if unicode copy two chars
            if (IpStr[0] == (char)0x80 || unicode == TRUE)/*a0393213 lint warnings removal-typecasting done*/
            {
                OpStr[i] = IpStr[i];
                OpStr[i+1] = IpStr[i+1];
                i+=2;
            }
            else
            {   OpStr[i] = IpStr[i];
                i++;
            }
        }
        return string_len_in_bytes(OpStr, OpLen, unicode);
    }
    /*SPR 1541, use function dspl_GetNcharToFit rather than loop to work
    out how many chars will fit in line*/
    no_of_chars = dspl_GetNcharToFit (IpStr,  ScreenWidth - ellipsis_len);
    /*copy characters*/
    if (no_of_chars < OpLen)
        memcpy(OpStr, IpStr, no_of_chars);
    else
        memcpy(OpStr, IpStr, OpLen);

    /*SPR 1541, end*/
    TRACE_EVENT_P1("trunc string len:%d", dspl_GetTextExtent(OpStr, 0));
    /*we need to add the ellipsis if we've truncated the string*/
    if(string_len_in_bytes(OpStr, OpLen, unicode) < calc_input_len)
    {   /*if unicode*/
        if (OpStr[0] == (char)0x80|| unicode == TRUE) /*a0393213 lint warnings removal - typecasting done*/
        {
            if (string_len_in_bytes(OpStr, OpLen, TRUE) < (OpLen -2*TRUNC_LENGTH+2))
            {  start_position = string_len_in_bytes(OpStr, OpLen, unicode);
            }
            else
            {   start_position = OpLen - 2*TRUNC_LENGTH+2;}
        TRACE_EVENT_P1("Adding chars at %d", start_position);
            for(j=start_position; j < start_position+2*TRUNC_LENGTH; j+=2)
            {   OpStr[j] = 0;
                OpStr[j + 1] = '.';
            }
            /*add NULL termination*/
            OpStr[start_position+ 2*TRUNC_LENGTH] = NULL;
            OpStr[start_position+ 2*TRUNC_LENGTH+1] = NULL;
        }
        else  /*if ASCII*/
        {   len = strlen(OpStr);
            if (len < (OpLen -(TRUNC_LENGTH+1)))
            {  start_position = string_len_in_bytes(OpStr, OpLen, FALSE);
            }
            else
            {   start_position = OpLen - TRUNC_LENGTH;}
            memcpy(&OpStr[start_position], ellipse_str, TRUNC_LENGTH);

        }
    }

TRACE_EVENT_P1("trunc string len post ellipsis:%d", dspl_GetTextExtent(OpStr, 0));

    return string_len_in_bytes(OpStr, OpLen, unicode);

}

/*******************************************************************************

 $Function:

 $Description:

 $Returns:

 $Arguments:

 $History
  GW 28/11/02 -

*******************************************************************************/
/***************************Go-lite Optimization changes Start***********************/
//Aug 25, 2004    REF: CRR 24904   Deepa M.D
//This function is used only for the Color build.Hence it is put under the
//COLOURDISPLAY compiler switch
#ifdef COLOURDISPLAY
int colMenuSelected(MfwMnu* mnu, MfwMnuItem* mnuItem)
{
    T_MFW_HND win = mfw_parent(mfw_header());
    int mnuId;
    int colDisplayType;
    int colType;
    int colFgdSelect = FALSE;
    int mnuColour;
    int storedMenuId;

    //GW Read the stored menu Id from generic procedure
    storedMenuId = MmiBook_getStoredOption();
    mnuId = (int)mnuItem->str;

    mnuColour=resources_getColourFromText(mnuId);

    getDisplayData(storedMenuId, &colDisplayType, &colType,&colFgdSelect);

    setDataColour(colDisplayType, colType, colFgdSelect,mnuColour);

    info_screen(win, TxtColour, TxtSelected, 0);

    // API/GW - Saved the selected colour so the flash file structure after selected
    flash_data_write(colourFileDir, colourFileName, colArray, sizeof(colArray));

    return(0);
}

#endif
/***************************Go-lite Optimization changes Start***********************/


/*******************************************************************************
 $Function:     set_SIMToolkit_title_string

 $Description:  Changes the value of the SAT main menu entry title.

 $Returns:

 $Arguments:    New SAT Title.

*******************************************************************************/


void res_set_SIMToolkit_title_string(char* SAT_string)
{
    SIMToolKitString = SAT_string;
}

/*API - 27/07/03 - CQ10203 - New function to reset the SMS VP in flash on factory reset*/
/*******************************************************************************
 $Function:     resetSMSValidityPeriod

 $Description:  Resets the value of the SMS VP in flash

 $Returns:

 $Arguments:    None

*******************************************************************************/
void resetSMSValidityPeriod()
{
/* x0045876, 14-Aug-2006 (WR - "sms_settings" was set but never used) */
#ifndef NEPTUNE_BOARD
    T_MFW_SMS_INFO sms_settings;
#endif

    TRACE_EVENT("resetSMSValidityPeriod()");

    if ( FFS_flashData.vp_rel != VP_REL_24_HOURS)
        FFS_flashData.vp_rel = VP_REL_24_HOURS;

/* x0045876, 14-Aug-2006 (WR - "sms_settings" was set but never used) */
#ifndef NEPTUNE_BOARD
    /*NDH - 13/01/04 - CQ16753 - Propogate the Validity Period Settings to the ACI */
    sms_settings.vp_rel = FFS_flashData.vp_rel;
#endif

#ifdef NEPTUNE_BOARD
    //(void)sms_set_val_period(&sms_settings); /* NEPTUNE: Sumit: temp comment */
#else
    (void)sms_set_val_period(&sms_settings);
#endif
    /*NDH - 13/01/04 - CQ16753 - END */

}
/*API - CQ10203 - END*/

/*******************************************************************************

                                End of File

*******************************************************************************/