📄 mmicalculator.c
字号:
/*******************************************************************************
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: MmiCalculator.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.
27/08/02 gdy add
$End
*******************************************************************************/
/******************************************************************************
Include Files
*******************************************************************************/
//extern const unsigned char calculatorbmp[];
#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 "mmibookshared.h"
#include "MmiEditor.h"
#include "Mfw_edt.h"
#include "MmiDialogs.h"
#include "p_sim.h"
#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_edt.h"
#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"
#include "Mmiicons.h"
#include "MmiEditor.h"
#include "MmiBookShared.h"
#include "MmiSmsMenu.h"
#include "Mmiicons.h"
#include "mmiusersymbolinput.h"
#include "GameDisplay.h"
//#include "Mmischedule.h"
#include "cus_aci.h"
#include "p_sim.h"
#include "pcm.h"
#include "MmiCalculator.h"
//#include "mmiicndialogs.h"
#include "mmiicons.h"
/*******************************************************************************
Function Prototypes
*******************************************************************************/
#define HUNDRED_MILLION 100000000
#define DIV_LEN 6
#define MAX_OPTNUMBER 13
#define MAX_CALC_TOTAL 999999999
#define MIN_CALC_TOTAL -99999999
#define MAX_NUMBER 14
static T_MFW_HND calc_win = NULL;
static T_MFW_HND calculator_create(MfwHnd parent_window);
static int calculator_win_cb(T_MFW_EVENT event,T_MFW_WIN * win);
static void calculator_DialogCB(T_MFW_HND win, USHORT event, SHORT identifier, void *parameter);
void calculator_destroy(MfwHnd own_window);
static int calculator_kbd_cb (MfwEvt e, MfwKbd *kc);
//void CalclatorSetEditor(T_MFW_HND win);
void calcDisplay(CalcData* data);
void calculate(char str1[MAXLEN],char str2[MAXLEN],char mark[2],char result_s[MAXLEN+MAXLEN]);
//char getoperator(int c);
static game_Line set_Line(int x1,int y1,int x2,int y2,int color);
void reset_calculator(CalcData* data);
int calculate1(char str1[MAXLEN],char str2[MAXLEN],char mark[2],char result_s[MAXLEN+MAXLEN]);
int stringchange(char *fi,char *ff,char *si,char *sf,char *mark);
void stringexchange(char *from,char *to);
static long pow10(int i);
void convert(char a[MAXLEN],char b[MAXLEN+MAXLEN]);
int calculator_new(MfwMnu* m, MfwMnuItem* i)
{
T_MFW_HND parent_win = mfwParent(mfw_header());
T_MFW_HND win=calculator_create(parent_win);
if( win NEQ NULL )
SEND_EVENT(win, CALCULATOR_INIT, 0, 0);
return MFW_EVENT_CONSUMED;
}
static T_MFW_HND calculator_create(MfwHnd parent_window)
{
CalcData * data = (CalcData *)ALLOC_MEMORY (sizeof (CalcData ));
T_MFW_WIN * win;
if( data EQ NULL )
{
return NULL;
}
// Create window handler
data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)calculator_win_cb);
if( data->win EQ NULL )
{
return NULL;
}
// connect the dialog data to the MFW-window
data->mmi_control.dialog = (T_DIALOG_FUNC)calculator_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;
data->kbd =kbd_create(data->win,KEY_ALL,(T_MFW_CB)calculator_kbd_cb);
//calc_win=data->win;
winShow(data->win);
return data->win;
}
static int calculator_win_cb(T_MFW_EVENT event,T_MFW_WIN * win)
{
CalcData * data = (CalcData *)win->user;//tida edt data
T_MFW_WIN * win_timer =((T_MFW_HDR *)data->parent_win)->data;
int old_color,i;
TRACE_EVENT("calculator_win_cb");
if( event EQ MfwWinVisible )
{
DRAW_ICON(ICON_SPECIAL_BG);
//drawIconByIcnAttr((MfwIcnAttr*)&icnSpBkgAttr,0);
/******end**********/
if( !strlen(data->result) )
{
strcpy(data->result,"0");
}
calcDisplay(data);
// old_color=dspl_GetBkgColor();
// dspl_SetBkgColor(0x00ffff);
// dspl_Clear(0, 141, 120, 160);
if( (data->result[0]=='0')&&(strlen((char*)data->result)==1) )
{
i=0;
}
else
{
i=strlen((char*)data->result);
}
/* 2004/05/18 yhf modify */
#if ( MAIN_LCD_SIZE==4 )
if( strlen((char*)data->operate_number1)&&!((strlen(data->operate_number1)==1)&&(data->operate_number1[0]=='0'))&&!i )
displaySoftKeys(TxtResult, TxtDelete);
else
displaySoftKeys(0, TxtSoftBack);
#endif
//if(strlen((char*)data->operate_number1)&&!((strlen(data->operate_number1)==1)&&(data->operate_number1[0]=='0'))&&!i)
// displaySoftKeys(TxtResult, TxtDelete);
//else
// displaySoftKeys(0, TxtSoftBack);
// dspl_SetBkgColor(old_color);
return 1;
}
return 0;
}
static void calculator_DialogCB(T_MFW_HND win, USHORT event, SHORT identifier, void *parameter)
{
T_MFW_WIN *win_data = ( (T_MFW_HDR *) win )->data;
CalcData* data = (CalcData *) win_data->user;
switch( event )
{
case CALCULATOR_INIT:
reset_calculator(data);
data->continues=FALSE;
data->resultflag=TRUE;
memset((char*)data->result,0,sizeof(data->result));
memset((char*)data->SpecialResult,0,sizeof(data->SpecialResult));
// strcpy((char*)data->result,"0");
winShow(win);
break;
case CALC_EXIT:
calculator_destroy(win);
break;
}
}
void calculator_destroy(MfwHnd own_window)
{
T_MFW_WIN * win_data;
CalcData * data = NULL;
if( own_window )
{
win_data = ((T_MFW_HDR *)own_window)->data;
if( win_data != NULL ) //PATCH TB
data = (CalcData *)win_data->user;
if( data )
{
win_delete (data->win);
// Free Memory
FREE_MEMORY ((void *)data, sizeof (CalcData));
}
else
{
}
}
}
static int calculator_kbd_cb (MfwEvt e, MfwKbd *kc)
{
T_MFW_HND win = mfw_parent(mfw_header());
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
T_DISPLAY_DATA display_info;
CalcData* data = (CalcData *)win_data->user;//data
char string[MAXLEN+MAXLEN];
char tem_str[MAXLEN];
char exponent[2];
int i,j,k,l,EndOfPoint;
BOOL t;
switch( kc->code )
{
case KCD_0:
case KCD_1:
case KCD_2:
case KCD_3:
case KCD_4:
case KCD_5:
case KCD_6:
case KCD_7:
case KCD_8:
case KCD_9:
if( !data->flag )
{
if( data->continues==TRUE )
{
data->continues=FALSE;
memset((char*)data->result,0,sizeof(data->result));
}
TRACE_EVENT("data->flag==FALSE");
if( strlen(data->operate_number1)<MAX_OPTNUMBER )
if( !data->pointflag )
{
if( data->index<MAX_NUMBER )
{
if( (data->operate_number1[0]=='0')&&data->index )
data->index--;
data->operate_number1[data->index]='0'+kc->code;
data->index++;
}
}
else
{
if( data->afterpoint<5 )
{
data->operate_number1[data->index]='0'+kc->code;
data->afterpoint++;
data->index++;
}
else break;
}
//data->opera='\0';
}
else
{
TRACE_EVENT("data->flag==TRUE");
if( strlen(data->operate_number2)<15 )
if( !data->pointflag )
{
if( data->index<MAX_NUMBER )
{
if( (data->operate_number2[0]=='0')&&data->index )
data->index--;
data->operate_number2[data->index]='0'+kc->code;
data->index++;
}
}
else
{
if( data->afterpoint<5 )
{
data->operate_number2[data->index]='0'+kc->code;
data->afterpoint++;
data->index++;
}
}
}
data->resultflag=FALSE;
data->operaflag=FALSE;
winShow(win);
break;
case KCD_STAR:
if( data->flag==FALSE )
{
if( (!strlen(data->operate_number1))&&(data->index) )
{
data->operate_number1[data->index]='-';
data->index++;
}
else
{
memset(tem_str,0,sizeof(tem_str));
if( data->operate_number1[0]=='-' )
{
strcpy( tem_str,data->operate_number1+1);
strcpy(data->operate_number1,tem_str);
data->index--;
}
else
{
strcpy(tem_str,"-");
strcat(tem_str,data->operate_number1);
strcpy(data->operate_number1,tem_str);
data->index++;
}
}
}
else
{
if( (!strlen(data->operate_number2))&&(data->index) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -