diff src/ui3/bmi/mmiCalculatorMain.c @ 421:6a4d9f47793e

src/ui3/bmi: file renames to make the case consistent
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 21 Jan 2018 03:28:53 +0000
parents src/ui3/bmi/MmiCalculatorMain.c@e8ddbb0837ed
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ui3/bmi/mmiCalculatorMain.c	Sun Jan 21 03:28:53 2018 +0000
@@ -0,0 +1,940 @@
+/*******************************************************************************
+
+					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");
+		}
+	}
+}
+
+
+
+