view src/ui/bmi/mmiCalculatorMain.c @ 265:e57bfdadf49a

mmiIcons.c: fix bogus icnType in incoming_call_animate[] The incoming call animation icons are actually drawn in 256-color format, but they were incorrectly declared as BMP_FORMAT_32BIT_COLOUR in the incoming_call_animate[] array. Why were they still getting displayed correctly despite this bogosity? Answer: because the mmi_dialogs_animation_new_CB() function overrides the icon bitmap type to 0x02, which means 256-color format. Needless to say, the icon format should be made correct at the source of the data, and at some later point we may need to remove the override from the animation display function.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 17 May 2021 07:18:36 +0000
parents f1f29e85f92b
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:       Calculator
 $File:         MmiCalculatorMain.c
 $Revision:     1.0

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

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

 Description

    This provides the main calculator functionality


********************************************************************************
 $History: MmiCalculatorMain.c

    25/10/00            Original Condat(UK) BMI version.

    xrashmic 20 Oct, 2005 MMI-SPR-33845
    To display BACK softkey when no more character are left in the calulator editor

    Oct 20, 2004    REF: CRR 25755 xnkulkar
    Description: calculator -divide by zero operation is allowed.
    Fix:    Display "Not Allowed" message when user tries to divide a number by 0 and do not perform the
                 division. Also, show the editor again so that user can enter a number other than 0.

 $End

*******************************************************************************/
#define MAX_CALC_TOTAL 999999999
#define MIN_CALC_TOTAL -99999999

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

                                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 "message.h"
#include "prim.h"
#include "aci_cmh.h"


#include "mfw_mfw.h"
#include "mfw_win.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "ksd.h"
#include "psa.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "mfw_sms.h"

#include "dspl.h"

#include "MmiMmi.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiIdle.h"
#include "MmiSoftKeys.h"
#include "Mmiicons.h"
#include "MmiMenu.h"
#include "MmiMain.h"
#include "MmiStart.h"
#include "MmiPins.h"
#include "MmiSettings.h"

/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"
#include "AUICalcEditor.h"
#else
#include "MmiEditor.h"
#endif
#include "MmiBookShared.h"
#include "mmiSmsMenu.h"
#include "MmiCalculatorMain.h"
#include "mmiColours.h"

#include "cus_aci.h"

#include "pcm.h"


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

                                Function Prototypes

*******************************************************************************/
static T_MFW_HND calc_create(MfwHnd parent_window);
void calc_destroy(MfwHnd own_window);
static void calcGetNumberCB( T_MFW_HND win, USHORT Identifier, SHORT reason );
static void calcGetOperandCB( T_MFW_HND win, USHORT Identifier, SHORT reason );
static void calc_DialogCB( T_MFW_HND win, USHORT event, SHORT identifier, void *parameter);
T_MFW_HND calc_start(T_MFW_HND parent_window);
double calcGetRunningTotal(void);
char operatorSymbol(UBYTE operator);
static void calc_menu_cb(T_MFW_HND parent_win, UBYTE identifier, UBYTE reason);
/*******************************************************************************

                                Static Global Variable(s)

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

static double running_total;

static T_MFW_HND calculator_win = NULL;


// Oct 20, 2004    REF: CRR 25755 xnkulkar
// Added this flag to detect 'divide by zero' operation
BOOL divideByZero = FALSE;

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

                                Public Functions

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

 $Function:     calculator

 $Description:  Starts the calculator function on user selection

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calculator(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_HND           parent       = mfwParent( mfw_header());
    TRACE_FUNCTION("calculator()");
    calc_start(parent);
    return MFW_EVENT_CONSUMED;
}

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

 $Function:     calcPlus

 $Description:  Handles the selction of the "Plus" option in the calculator menu

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calcPlus(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_WIN*          win_data;
    tCalcData*          data;

    TRACE_FUNCTION("calcPlus()");
    //if new window successfully created
    if (calculator_win NEQ NULL)
        {   win_data   = ( (T_MFW_HDR *) calculator_win )->data;
            data = (tCalcData*)win_data->user;
            data->operation = PLUS;//set the arithmetic operation
            SEND_EVENT (calculator_win, CALC_ENTER_OPERAND, 0, 0);
        }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:     calcMinus

 $Description:  Handles the selection of the "Minus" option in the calculator menu

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calcMinus(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_WIN*          win_data;
    tCalcData*          data;

    //if new window successfully created
    TRACE_FUNCTION("calcMinus()");
    if (calculator_win NEQ NULL)
        {   win_data   = ( (T_MFW_HDR *) calculator_win )->data;
            data = (tCalcData*)win_data->user;
            data->operation = MINUS;//set the arithmetic operation
            SEND_EVENT (calculator_win, CALC_ENTER_OPERAND, 0, 0);
        }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:     calcDivide

 $Description:  Handles the selection of the "Divide" option in the calculator menu

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calcDivide(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_WIN*          win_data;
    tCalcData*          data;

    TRACE_FUNCTION("calcDivide()");
    //if new window successfully created
    if (calculator_win NEQ NULL)
        {   win_data   = ( (T_MFW_HDR *) calculator_win )->data;
            data = (tCalcData*)win_data->user;
            data->operation = DIVIDE;//set the arithmetic operation
            SEND_EVENT (calculator_win, CALC_ENTER_OPERAND, 0, 0);
        }
    return MFW_EVENT_CONSUMED;
}
/*******************************************************************************

 $Function:     calcMultiply

 $Description:  Handles the selection of the "Multiply" option in the calculator menu

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calcMultiply(MfwMnu* m, MfwMnuItem* i)
{
    T_MFW_WIN*          win_data;
    tCalcData*          data;

    TRACE_FUNCTION("calcMultiply()");
    //if new window successfully created
    if (calculator_win NEQ NULL)
        {   win_data   = ( (T_MFW_HDR *) calculator_win )->data;
            data = (tCalcData*)win_data->user;
            data->operation = MULTIPLY;//set the arithmetic operation
            SEND_EVENT (calculator_win, CALC_ENTER_OPERAND, 0, 0);
        }
    return MFW_EVENT_CONSUMED;
}

// Oct 20, 2004    REF: CRR 25755 xnkulkar
/*******************************************************************************

 $Function:     info_screen_cb

 $Description:  Callback function for info screen

 $Returns:  nothing

 $Arguments:    Parent Window handle, identifier and reason

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

static void info_screen_cb(T_MFW_HND parent_win, UBYTE identifier, UBYTE reason)
{
    // Send CALC_ENTER_OPERAND event tp prompt the user to enter the operand again
    SEND_EVENT (calculator_win, CALC_ENTER_OPERAND, 0, 0);
}

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

 $Function:     calcEquals

 $Description:  Handles the selection of the "Equals" option in the calculator menu

 $Returns:      MFW_EVENT_CONSUMED if event handled, otherwise
                MFW_EVENT_PASSED

 $Arguments:    menu, menu item

*******************************************************************************/
int calcEquals(MfwMnu* m, MfwMnuItem* i)
{
    TRACE_FUNCTION("calcEquals()");

    // Oct 20, 2004    REF: CRR 25755 xnkulkar
    // if 'divide by zero' operation is attempted
    if(divideByZero == TRUE)
    {
        divideByZero = FALSE;   // disable the flag
        info_screen(0, TxtNotAllowed, TxtNull,(T_VOID_FUNC) info_screen_cb); // display "Not Allowed" message
        return MFW_EVENT_CONSUMED; // consume the event
    }

    if (calculator_win NEQ NULL)
    {
        SEND_EVENT (calculator_win, CALC_DISPLAY_RESULT, 0, 0);
    }

    return MFW_EVENT_CONSUMED;
}

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

                                Private Functions

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

 $Function:     calcGetRunningTotal

 $Description:  If the calculator's running total value ever needs to be accessed by
                code in another file, then this function ought to be made public to prevent
                to allow safe access;

 $Returns:      Calculator's running total (double)

 $Arguments:    none

*******************************************************************************/
double calcGetRunningTotal(void)
{
    TRACE_FUNCTION("calcGetRunningTotal()");
    return running_total;
}

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

 $Function:     operatorSymbol

 $Description:  returns character corresponding to arithmetic operation

 $Returns:      Operator character

 $Arguments:    Operator enum

*******************************************************************************/
char operatorSymbol(UBYTE operator)
{
    TRACE_FUNCTION("operatorSymbol()");
    switch (operator)
    {
        case (PLUS):    return '+';  //  break;  // RAVI
        case (MINUS):   return '-'; // break;  // RAVI
        case (MULTIPLY): return '*'; // break;  // RAVI
        case (DIVIDE):  return '/'; // break;  // RAVI
        default:        return '\0'; // break;  // RAVI
    }
}


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

 $Function:     calc_start

 $Description:  Creates the calculator window and calls for it to be initialised

 $Returns:      Window

 $Arguments:    Parent Window

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

T_MFW_HND calc_start(T_MFW_HND parent_window)
{
    T_MFW_HND           win           = calc_create(parent_window);
    TRACE_FUNCTION("calc_start()");
    if (win NEQ NULL)
    {
        SEND_EVENT (win, CALC_INIT, 0, 0);
    }

    return win;
}

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

 $Function:     calc_create

 $Description:  Creates the calculator window and connect the dialog data to it

 $Returns:      Window

 $Arguments:    Parent Window

*******************************************************************************/
static T_MFW_HND calc_create(MfwHnd parent_window)
{
    tCalcData     * data = (tCalcData *)ALLOC_MEMORY (sizeof (tCalcData ));
    T_MFW_WIN  * win;

    TRACE_FUNCTION("calc_create()");
    if (data EQ NULL)
    {
        return NULL;
    }

    // Create window handler
    data->win = win_create (parent_window, 0, E_WIN_VISIBLE, NULL);
    if (data->win EQ NULL)
    {
        return NULL;
    }
    // connect the dialog data to the MFW-window
    data->mmi_control.dialog = (T_DIALOG_FUNC)calc_DialogCB;
    data->mmi_control.data   = data;
    win                      = ((T_MFW_HDR *)data->win)->data;
    win->user                = (void *)data;
    data->parent_win         = parent_window;
    calculator_win = data->win;
    return data->win;
}

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

 $Function:     calc_DialogCB

 $Description:  Callback function for the calculator window

 $Returns:      nothing

 $Arguments:    Window, event, identifier (not used), parameter (not used)

*******************************************************************************/
static void calc_DialogCB(T_MFW_HND win, USHORT e,  SHORT identifier, void *parameter)
{
    T_MFW_WIN           *win_data   = ( (T_MFW_HDR *) win )->data;
    tCalcData* data = (tCalcData *) win_data->user;
    char display_buffer[28] = "";
#ifdef NEW_EDITOR
//  T_AUI_EDITOR_DATA   editor_data;    /* SPR#1428 - SH - New Editor data */  // RAVI
#else
//  T_EDITOR_DATA       editor_data;   // RAVI
#endif
    char* running_total_out;
//  char debug_buffer[50];  // RAVI
    TRACE_FUNCTION("calc_DialogCB()");

    switch( e )
    {   //when window first created
        case CALC_INIT:
        {   //set running total to 0 and display in editor
            TRACE_EVENT("CALC-INIT-JGG");
            running_total = 0;
            data->menu_options_win = NULL;

            /* SPR#1428 - SH - New editor: calc starts with 0 */
#ifdef NEW_EDITOR
            sprintf(data->buffer, "%s", "0");   /* SH - calc starts off with '0'*/
#else
            sprintf(data->buffer, "%s", "");    /* SH - calc starts off with nothing*/
#endif

            calcSetEditor(win);//set editor with default attribute values
            /* SPR#1428 - SH - New Editor changes: use calc editor */
#ifdef NEW_EDITOR
            AUI_edit_SetEvents(&data->editor_data, 0, TRUE, FOREVER, (T_AUI_EDIT_CB)calcGetNumberCB);
            data->editor_win = AUI_calc_Start(win, &data->editor_data);
#else /* NEW_EDITOR */
            data->editor_data.Callback          = (T_EDIT_CB)calcGetNumberCB;
            data->editor_win = editor_start(win, &(data->editor_data));  /* start the editor */
#endif /* NEW_EDITOR */
            winShow(data->win);
        }
        break;

        //when an arithmetic operator has been selected from the calc menu
        case CALC_ENTER_OPERAND:
        {
            TRACE_EVENT("CALC_ENTER_OPERAND");
            /* This memory alloc seems to fix a problem where running_total_out
             * would become an empty string after sevaral running calculations */
            running_total_out = (char*)ALLOC_MEMORY(22*sizeof(char));   /* SH - change malloc to ALLOC_MEMORY */

            running_total_out[0] = '\0';

            /* Display the first operand and the operator symbol
             * above the operand to be entered */
            if ( (long)calcGetRunningTotal() == calcGetRunningTotal())
                sprintf((char*)running_total_out, "%d", (long)calcGetRunningTotal());
            else
                sprintf((char*)running_total_out, "%f", calcGetRunningTotal());

            if (running_total_out[8] == '.')
                running_total_out[8] = '\0';
            else
                running_total_out[9] = '\0';

            sprintf((char*)display_buffer,"%s %c", running_total_out, operatorSymbol(data->operation));
            FREE_MEMORY((void*)running_total_out, 22*sizeof(char));     /* SH - change free to FREE_MEMORY */

            /* SPR#1428 - SH - Calc now starts off with '0' */
#ifdef NEW_EDITOR
            sprintf(data->buffer, "%s", "0");   /* SH - calc starts off with '0'*/
#else
            sprintf(data->buffer, "%s", "");    /* SH - calc starts off with nothing*/
#endif

            calcSetEditor(win);

            /* SPR#1428 - SH - New Editor changes */
 #ifdef NEW_EDITOR
            AUI_edit_SetEvents(&data->editor_data, 0, TRUE, FOREVER, (T_AUI_EDIT_CB)calcGetOperandCB);
            AUI_edit_SetTextStr(&data->editor_data, TxtSoftOptions, TxtDelete, TxtCalculator, (UBYTE *)display_buffer);
            AUI_edit_SetAltTextStr(&data->editor_data, 1, TxtSoftOptions, TRUE, TxtSoftBack);//x0035544 17-11-2005
            data->input_number_win = AUI_calc_Start(win, &data->editor_data);
#else /* NEW_EDITOR */
            data->editor_data.TextString = display_buffer;
            data->editor_data.editor_attr.win.px = 0;
            data->editor_data.editor_attr.win.py = Mmi_layout_line(3); //30
            data->editor_data.editor_attr.win.sx = SCREEN_SIZE_X;
            data->editor_data.editor_attr.win.sy = numberLineHeight()+2;

            data->editor_data.Callback          = (T_EDIT_CB)calcGetOperandCB;
            data->input_number_win = editor_start(win, &(data->editor_data));  /* start the editor */
#endif /* NEW_EDITOR */

            winShow(data->win);

            /* Marcus: Issue 1039: 05/09/2002: Start */
            if (data->menu_options_win != NULL)
            {
                bookMenuDestroy( data->menu_options_win );
                data->menu_options_win = NULL;
            }
            /* Marcus: Issue 1039: 05/09/2002: End */
        }
        break;

        //when "Equals" selected from calc menu
        case CALC_DISPLAY_RESULT:
        {
            //if running total out of display range, set it to 0
            if ((calcGetRunningTotal() > MAX_CALC_TOTAL) || (calcGetRunningTotal() < MIN_CALC_TOTAL))
                running_total =0;
            //Convert running total double to string
            //if integer total, don't display any decimal places
            if ( (long)calcGetRunningTotal() == calcGetRunningTotal())
                sprintf(data->buffer, "%d", (long) calcGetRunningTotal());
            else //if a floating-point total, display as many decimal places as will fit
                sprintf(data->buffer, "%f", (double) calcGetRunningTotal());
            //if last number in display is a decimal point
            if (data->buffer[8] == '.')
                data->buffer[8] = '\0';//remove it
            data->buffer[9] = '\0'; //ensure string is properly terminated
            //ensure string is no longer than 9 chars

            calcSetEditor(win);

            /* SPR#1428 - SH - New Editor changes */
 #ifdef NEW_EDITOR
            AUI_edit_SetEvents(&data->editor_data, 0, TRUE, FOREVER, (T_AUI_EDIT_CB)calcGetNumberCB);
            AUI_calc_Start(win, &data->editor_data);
 #else /* NEW_EDITOR */
            data->editor_data.Callback          = (T_EDIT_CB)calcGetNumberCB;
            editor_start(win, &(data->editor_data));  /* start the editor */
#endif /* NEW_EDITOR */

            /* Marcus: Issue 1039: 05/09/2002: Start */
            if (data->menu_options_win != NULL)
            {
                bookMenuDestroy( data->menu_options_win );
                data->menu_options_win = NULL;
            }
            /* Marcus: Issue 1039: 05/09/2002: End */

            winShow(data->win);
        }
        break;
        default:
        {
                TRACE_EVENT("calc_DialogCB(): Unknown Event");
        }
        break;

    }
}

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

 $Function:     calcGetNumberCB

 $Description:  Callback function for the editor window

 $Returns:      nothing

 $Arguments:    Window,  identifier (not used), reason (not used)

*******************************************************************************/
static void calcGetNumberCB( T_MFW_HND win, USHORT Identifier, SHORT reason)
{
    T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) win )->data;
    tCalcData   *data       = (tCalcData *) win_data->user;
    float after_decimal = 0;
    int digits_after_point = 0;
    int i;
    char* end;
//    char debug[40];  // RAVI


    TRACE_FUNCTION("calcGetNumberCB()");

    switch (reason )
    {
        case INFO_KCD_LEFT:
        {   TRACE_EVENT("Left button pressed in calculator");
            //get the number entered before the decimal point
            running_total = strtol(data->buffer, &end, 10);
            if (strlen(end) != 0)
            {   //if decimal point entered
                if ((end[0] == '.') && isdigit(end[1]))//get number after decimal point
                {
                    end++;
                    digits_after_point = strlen(end);
                    after_decimal = strtol(end, &end, 10);
                }

                //convert number after decimal point to it's actual fractional value
                for (i=0; i < digits_after_point; i++)
                    after_decimal = after_decimal/10;
                //add whole number and fraction together
                running_total = running_total + after_decimal;
            }
            if (data->menu_options_win != NULL)
                bookMenuDestroy( data->menu_options_win );
            //start the calculator option menu and kill this window
            data->menu_options_win = bookMenuStart( data->win, calcOptionMenuAttributes(),0);
             SEND_EVENT(data->menu_options_win, ADD_CALLBACK, NULL, (void *)calc_menu_cb);

        }
        break;

        case INFO_KCD_HUP:
        case INFO_KCD_RIGHT:
        {
            TRACE_EVENT("Right button pressed in calculator");
            calc_destroy(win);
        }
        break;

        default:
        {
            /* otherwise no action to be performed
            */
            /*calc_destroy(win); */ /*SH - do not destroy calc for other key */
            break;
        }
    }
}


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

 $Function:     calcGetOperandCB

 $Description:  Callback function for the editor window, when second number in operation
                is entered.

 $Returns:      nothing

 $Arguments:    Window,  identifier (not used), reason (not used)

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

static void calcGetOperandCB( T_MFW_HND win, USHORT Identifier, SHORT reason)
{
    T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) win )->data;
    tCalcData   *data       = (tCalcData *) win_data->user;
//  char* buffer;  // RAVI
    float operand = 0;
    float after_decimal = 0;
    int digits_after_point = 0;
    int i;
    char* end;
    char debug[40];

    TRACE_FUNCTION("calcGetOperandCB()");
    TRACE_EVENT_P2("ID, reason: %d, %d", Identifier, reason);

    switch (reason )
    {
        case INFO_KCD_LEFT:
  /* SPR#1428 - SH - New Editor: Can use '*' or centre button as 'equals', to show result */
#ifdef NEW_EDITOR
#ifdef COLOURDISPLAY
        case INFO_KCD_SELECT:
#endif /* COLOURDISPLAY */
        case INFO_KCD_STAR:
#endif /* NEW_EDITOR */
        {   //Get whole number before decimal point
            operand = strtol(data->buffer, &end, 10);

            //if buffer not pointing at an empty string now
            if (strlen(end) != 0)
            {   //if decimal point entered
                if ((end[0] == '.') && isdigit(end[1]))//get number after decimal point
                {
                    end++;
                    digits_after_point = strlen(end);
                    after_decimal = strtol(end, &end, 10);
                    sprintf(debug,"Digits after decimal: %f.", after_decimal);
                }
                //convert number after decimal point to an appropriate fraction
                for (i=0; i < digits_after_point; i++)
                    after_decimal = after_decimal/10;
                //add whole and fraction together
                operand = operand + after_decimal;
            }

            //perform the arithmetic function requested
            switch (data->operation)
            {
                case PLUS: running_total = running_total + operand; break;
                case MINUS: running_total = running_total - operand;break;
                case MULTIPLY: running_total = running_total * operand;break;
                case DIVIDE:
                // Oct 20, 2004    REF: CRR 25755 xnkulkar
                // if the attempted division is by zero
                if(operand == 0)
                {
                    divideByZero = TRUE; // enable the flag
                }
                else // else perform the division operation
                {
                    running_total = running_total / operand;
                }
                break;
                default: TRACE_EVENT("Unknown calc operation"); break;
            }

        /* SPR#1428 - SH - New Editor: Can use '*' as 'equals', to show result */
#ifdef NEW_EDITOR
#ifdef COLOURDISPLAY
        if (reason==INFO_KCD_STAR || reason==INFO_KCD_SELECT)
#else /* COLOURDISPLAY */
            if (reason==INFO_KCD_STAR)
#endif /* COLOURDISPLAY */
            {
                TRACE_EVENT("Star key - show result");
                /* Star didn't destroy window automatically, do it here */
                if (data->menu_options_win != NULL)
                {
                    bookMenuDestroy( data->menu_options_win );
                    data->menu_options_win = NULL;
                }
                if (data->input_number_win)
                {
                    AUI_calc_Destroy(data->input_number_win);
                    data->input_number_win = NULL;
                }
                SEND_EVENT(data->win, CALC_DISPLAY_RESULT, 0, 0);
            }
            else
#endif /* NEW_EDITOR */
            {
                //Show option menu
                if (data->menu_options_win != NULL)
                    bookMenuDestroy( data->menu_options_win );
                data->menu_options_win = bookMenuStart( data->win, calcOptionMenuAttributes(),0);
            }
        }
        break;

        case INFO_KCD_HUP:
        case INFO_KCD_RIGHT:
        {
            TRACE_EVENT("Right button pressed in calculator");

            calc_destroy(win);
        }
        break;

        default:
        {
            /* otherwise no action to be performed
            */
            break;
        }
    }
}


static void calc_menu_cb(T_MFW_HND parent_win, UBYTE identifier, UBYTE reason)
{
    T_MFW_WIN           *win_data   = ( (T_MFW_HDR *) parent_win )->data;
    tCalcData* data = (tCalcData *) win_data->user;

    TRACE_FUNCTION("calc_menu_cb()");
    //set menu window to NULL to prevent any dealloc problems
    data->menu_options_win = NULL;
    calc_destroy(parent_win);
}

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

 $Function:     calcSetEditor

 $Description:  Sets the editor attributes to defaults for the calculator module

 $Returns:      nothing

 $Arguments:    Window

*******************************************************************************/
void calcSetEditor(T_MFW_HND win)
{
    T_MFW_WIN           *win_data   = ( (T_MFW_HDR *) win )->data;
    tCalcData* data = (tCalcData *) win_data->user;

    TRACE_FUNCTION("calcSetEditor()");

    /* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
    {
        AUI_edit_SetDefault(&data->editor_data);
        AUI_edit_SetDisplay(&data->editor_data, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT);
        AUI_edit_SetBuffer(&data->editor_data, ATB_DCS_ASCII, (UBYTE *)data->buffer, 10);
        AUI_edit_SetMode(&data->editor_data, 0, ED_CURSOR_NONE);
        AUI_edit_SetEvents(&data->editor_data, 0, TRUE, FOREVER, NULL);
        AUI_edit_SetTextStr(&data->editor_data, TxtSoftOptions, TxtDelete, TxtCalculator, NULL);
        //xrashmic 20 Oct, 2005 MMI-SPR-33845
        //Editor always starts with min one character "0" and
        //alterRight softkey is set to "BACK" here.
        data->editor_data.min_enter=1;
        data->editor_data.AltRightSoftKey=TxtSoftBack ;
        AUI_edit_SetFormatAttr(&data->editor_data, DS_ALIGN_RIGHT);
    }
#else /* NEW_EDITOR */
    editor_attr_init(&((data->editor_data).editor_attr), 0, edtCurBar1, 0, data->buffer, 10, COLOUR_EDITOR);
    editor_data_init( &data->editor_data, NULL, TxtSoftOptions, TxtDelete, NULL, 1, CALC_MODE, FOREVER);
            data->editor_data.hide              = FALSE;
            data->editor_data.Identifier        = 0xFFFF ;
            data->editor_data.destroyEditor     = TRUE;
#endif /* NEW_EDITOR */

    return;
}

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

 $Function:     calc_destroy

 $Description:  Destroys the calculator editor window and frees up memory

 $Returns:      nothing

 $Arguments:    Window

*******************************************************************************/
void calc_destroy(MfwHnd own_window)
{
  T_MFW_WIN * win_data;
  tCalcData   * data = NULL;

  TRACE_EVENT ("calc_destroy()");
  if (own_window)
    {

    win_data = ((T_MFW_HDR *)own_window)->data;
        if (win_data != NULL) //PATCH TB
            data = (tCalcData *)win_data->user;

      if (data)
        {

            win_delete (data->win);
            /* Marcus: Issue 1039: 05/09/2002: Start */
            if (data->menu_options_win != NULL)
            {
                bookMenuDestroy( data->menu_options_win );
                data->menu_options_win = NULL;
            }
            /* Marcus: Issue 1039: 05/09/2002: End */
          // Free Memory
            FREE_MEMORY ((void *)data, sizeof (tCalcData));

        }
      else
        {
            TRACE_EVENT ("calc_destroy() called twice");
        }
    }
}