📄 phonecard.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "datatype.h"
#include "general.h"
#include "common.h"
#include "mmalloc.h"
#include "windows.h"
#include "pub_wnd.h"
#include "smsbrowse.h"
#include "para_def.h"
#include "grpmanage.h"
#include "cardmanage.h"
#include "phonecard.h"
#include "debug_out.h"
#include "phonebook.h"//yu
#include "Translate.h"
#define COMPILE_OK 1
#define COMPILING 1
#define FIND_BY_NAME 0
#define FIND_BY_NUMBER 1
//static int PB_GroupManage(void);
static int PB_SelectGroup(BYTE *oldGrp);
static int PB_DetailShow(WORD pos);
static int PB_StoreInfo(void);
static PHONE_CARD gFindedCard;
static BYTE gDisplayGroup = 0xFF;
int xstrcmp(char *pSrc, char *pDst, int len)
{
int i;
char a, b;
for (i = 0; i < len; ++i) {
a = *pSrc++;
b = *pDst++;
if ((a >= 'a') && (a <= 'z'))
a -= 0x20;
if ((b >= 'a') && (b <= 'z'))
b -= 0x20;
if (a != b)
return (a-b);
}
return 0;
}
PHONE_CARD *GetSelectCard(void)
{
return &gFindedCard;
}
static int inputFullCard(PHONE_CARD *pCard)
{
PHONE_CARD nCard;
char number[NUMBER_LEN];
rect area;
int sel, data;
memcpy(&nCard, pCard, sizeof(PHONE_CARD));
sel = PB_SelectGroup(&nCard.group);
if (sel < 0)
return -1;
memcpy(number, nCard.number, NUMBER_LEN);
inputnumber:
SetRect(&area, 10, 12, 102, LCD_HEIGHT-14);//yu SetRect(&area, 10, LCD_ICONEND+2, LCD_WIDTH-10, LCD_HEIGHT-17);
sel = InputLine(&area, TranslateChar("输入号码"), (BYTE*)number, NUMBER_LEN-1, INPUT_DIGITAL | INPUT_FIXED);
if (sel < 0)
return -1;
if (CheckNumberExist(number, nCard.number)) {
XTipWndShow(TranslateChar("号码已经存在"),1); //XMessageBox(NULL,TranslateChar("号码已经存在"), ID_OK);
goto inputnumber;
}
if(0==strlen(number))
goto inputnumber;
inputname:
SetRect(&area, 10, 12, 102, LCD_HEIGHT-14);//yuSetRect(&area, 10, LCD_ICONEND+2, LCD_WIDTH-10, LCD_HEIGHT-17);
sel = InputLine(&area, TranslateChar("输入姓名"), (BYTE*)nCard.name, NAME_LEN-1, INPUT_PINYIN);
if (sel == -1)
return -1;
if (sel == -2)
goto inputnumber;
if(0==strlen(nCard.name))
goto inputname;
//----------------- yu
if((0==strlen(nCard.name)) && (0== strlen(number)))
{
XTipWndShow(TranslateChar("保存错误"),1);
return -3;
}
//-----------------
//inputtype:
//--
data = nCard.type_ring;
sel = SelectCallring(&data);
if (sel == -1)
return -1;
if (sel == -2)
goto inputname;
nCard.type_ring = (BYTE)data;
//--
//input_ok:
memcpy(nCard.number, number, NUMBER_LEN-1);//yu memcpy(nCard.number, number, NAME_LEN-1);
memcpy(pCard, &nCard, sizeof(PHONE_CARD));
return 0;
}
#if COMPILE_OK
const static char *menuName[] = {
// 0 "详细信息",
// 1 "修改记录",
"增加号码",
// 3 "添加备注",
"删除记录",
"删除全部",
// "类别管理",
"存储状态",
};
typedef struct {
window_t wnd;
listbox_t list;
inputbox_t *keyb;
menu_t tmenu;
int select;
WORD card[MAX_CARD_NUM]; /* 搜索结果,待显示的电话本 */
WORD acard[MAX_CARD_NUM]; /* 全部待搜索电话本 */
WORD total; /* 全部待搜索电话本总数 */
WORD sum; /* 搜索结果,待显示的电话本数目 */
char keyWord[NUMBER_LEN]; /* 关键字 */
BYTE keyLen; /* 关键字输入长度 */
BYTE group[MAX_GROUP_NUM];
BYTE grpSum;
BYTE grpCur;
BYTE grpShow;
BYTE idFind;
int next; /* 退出状态 */
} pb_browse_t;
static pb_browse_t *gPBBrowse = NULL;
static int OnDrawCardItem(listbox_t *lb, rect *rc, int num)
{
PHONE_CARD nCard;
if (num >= gPBBrowse->sum)
return -1;
if (PB_ReadOne(gPBBrowse->card[num], &nCard) < 0)
return -1;
MoveTo(rc->Xmin + 2, rc->Ymax);
if(0==strlen(nCard.name))
DrawText((BYTE*)nCard.number, 0, 12);
else
DrawText((BYTE*)nCard.name, 0, 12);
return 0;
}
static WORD SearchPhoneBook(char *keyWord)
{
WORD i, finded;
int len;
char ascName[NAME_LEN];
PHONE_CARD nCard;
len = strlen(keyWord);
if (len == 0) {
memcpy(gPBBrowse->card, gPBBrowse->acard, MAX_CARD_NUM*2);
gPBBrowse->sum = gPBBrowse->total;
return gPBBrowse->total;
}
finded = 0;
for (i = 0; i < gPBBrowse->total; ++i) {
PB_ReadOne(gPBBrowse->acard[i], &nCard);
ChangeNameToASCII((BYTE*)nCard.name, (BYTE*)ascName, NAME_LEN);
if (xstrcmp(ascName, keyWord, len) != 0)
continue;
gPBBrowse->card[finded++] = gPBBrowse->acard[i];
}
return finded;
}
static WORD SearchGroupPhoneBook(BYTE grp)
{
WORD i, finded;
PHONE_CARD nCard;
finded = 0;
for (i = 0; i < gPBBrowse->total; ++i) {
PB_ReadOne(gPBBrowse->acard[i], &nCard);
if (nCard.group != grp)
continue;
gPBBrowse->card[finded++] = gPBBrowse->acard[i];
}
return finded;
}
static int SearchPhoneCard(void)
{
if (gDisplayGroup != 0xFF)
gPBBrowse->sum = SearchGroupPhoneBook(gDisplayGroup);
else
gPBBrowse->sum = SearchPhoneBook(gPBBrowse->keyWord);
return (int)(gPBBrowse->sum);
}
static void ShowKeyword(void)
{
rect area;
BYTE first, len;
SetRect(&area, 48, LCD_HEIGHT-HZ_MAIN, LCD_WIDTH, LCD_HEIGHT);
EraseRect(&area);
first = 0;
len = gPBBrowse->keyLen;
if (len > 10) {
first = len - 10;
len = 10;
}
MoveTo(60, LCD_HEIGHT+1);
DrawText((BYTE*)gPBBrowse->keyWord, first, len);
}
static void OnPaintGroup(void)
{
char name[GRP_NAME_LEN];
rect rc;
if (gPBBrowse->grpShow == 0xFF)
return;
GRP_ReadOne(gPBBrowse->group[gPBBrowse->grpCur], name);
TextAlign(alignCenter, alignBottom);
MoveTo(LCD_HMID, LCD_HEIGHT);
DrawString((BYTE*)name);
TextAlign(alignLeft, alignBottom);
SetRect(&rc, 0, LCD_HEIGHT-12, LCD_WIDTH, LCD_HEIGHT);
InvertRect(&rc);
}
static void OnBrowseKeyDown(int keyID)
{
int tmp;
switch (keyID) {
case KEY_MENU:
/* 删除输入法键盘 */
XDeleteInputBoard(gPBBrowse->keyb);
XPopMenu(&gPBBrowse->tmenu, 1, LCD_HEIGHT-2, 0);
/* 重新创建输入法键盘 */
gPBBrowse->keyb = XCreateInputBoard(&gPBBrowse->wnd.comp, INPUT_ENGLISH | INPUT_FIXED);
if (gDisplayGroup != 0xFF) {
XDisableInput(gPBBrowse->keyb);
}
else {
XShowInputBoard(gPBBrowse->keyb);
v_WriteLcdBuff();
}
break;
case KEY_OK:
if (0 != gPBBrowse->sum) {
if (gPBBrowse->idFind == 1) {
PB_ReadOne(gPBBrowse->card[gPBBrowse->select], &gFindedCard);
gPBBrowse->next = 1;
}
else {
/* 删除输入法键盘 */
XDeleteInputBoard(gPBBrowse->keyb);
tmp = PB_DetailShow(gPBBrowse->card[gPBBrowse->select]);
if (tmp == 1)
gPBBrowse->next = 1;
else
gPBBrowse->next = 2;
/* 重新创建输入法键盘 */
gPBBrowse->keyb = XCreateInputBoard(&gPBBrowse->wnd.comp, INPUT_ENGLISH | INPUT_FIXED);
if (gDisplayGroup != 0xFF) {
XDisableInput(gPBBrowse->keyb);
}
}
XPostQuitMessage(&gPBBrowse->wnd);
}
break;
case KEY_CANCEL://yu add
//gPBBrowse->grpShow != 0xFF;???
gPBBrowse->keyLen=0;
gPBBrowse->next = -1;
XPostQuitMessage(&gPBBrowse->wnd);
break;
case KEY_DEL:
if ((gPBBrowse->grpShow == 0xFF) && gPBBrowse->keyLen) {
gPBBrowse->keyLen--;
gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
ShowKeyword();
gPBBrowse->select = 0;
SearchPhoneCard();
XListBoxSet(&gPBBrowse->list, gPBBrowse->sum, HZ_MAIN, OnDrawCardItem);
gPBBrowse->select = XListBoxSetCurrent(&gPBBrowse->list, gPBBrowse->select);
XShowComponent(&gPBBrowse->list.comp);
v_WriteLcdBuff();
return;
}
else {
gPBBrowse->next = -1;
XPostQuitMessage(&gPBBrowse->wnd);
}
break;
case KEY_UP:
case KEY_DOWN:
XListBoxKeyHandle(&gPBBrowse->list, keyID);
gPBBrowse->select = XListBoxGetSelect(&gPBBrowse->list);
break;
default:
break;
}
}
static int pbBrowseProc(XMSG *msg)
{
int num;
BYTE *buf;
switch (msg->message) {
case MSG_PAINT:
EraseRect(&msg->comp->rc);
OnPaintGroup();
break;
case MSG_WAITOUT:
case MSG_KEYDOWN:
num = XInputMsgHandle(gPBBrowse->keyb, msg);
if (num == 1) {
buf = XInputGetInput(gPBBrowse->keyb);
if (gPBBrowse->keyLen < NUMBER_LEN-1) {
gPBBrowse->keyWord[gPBBrowse->keyLen++] = buf[0];
gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
if (0 == SearchPhoneCard()) {
gPBBrowse->keyLen--;
gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
SearchPhoneCard();
}
ShowKeyword();
XListBoxSet(&gPBBrowse->list, gPBBrowse->sum, HZ_MAIN, OnDrawCardItem);
gPBBrowse->select = XListBoxSetCurrent(&gPBBrowse->list, gPBBrowse->select);
XShowComponent(&gPBBrowse->list.comp);
v_WriteLcdBuff();
}
}
else if (num == 0) {
OnBrowseKeyDown(msg->param1);
}
else {
v_WriteLcdBuff();
}
break;
default:
XDefaultWindowProc(msg);
break;
}
return 0;
}
static int OnMenuNewCard(menu_t *pMenu)
{
int inStat;
PHONE_CARD nCard;
if (MAX_CARD_NUM == PB_GetNumber()) {
XTipWndShow(TranslateChar("空间已满"),1);//yu XMessageBox(NULL, TranslateChar("空间已满"), ID_OK);
return -1;
}
memset(&nCard, 0, sizeof(PHONE_CARD));
nCard.group = gPBBrowse->grpShow;
nCard.prior = gDevicePara.dev.defPrior;
inStat = inputFullCard(&nCard);
if (0 == inStat) {
PB_WriteOne(NEW_CARD, &nCard);
XTipWndShow(TranslateChar("保存成功"),1);//yu add
gPBBrowse->next = 2;
gPBBrowse->select = gPBBrowse->sum;
XPostQuitMessage(&gPBBrowse->wnd);
}
else {
XTipWndShow(TranslateChar("保存失败"),1);
XShowComponent(&gPBBrowse->wnd.comp);
v_WriteLcdBuff();
}
return 0;
}
static int OnMenuDeleteOne(menu_t *pMenu)
{
if (0 == gPBBrowse->sum)
return -1;
if (XMessageBox(NULL, TranslateChar("删除电话本?"), ID_OK) == ID_OK) {
if(0==PB_DeleteOne(gPBBrowse->card[gPBBrowse->select]))
XTipWndShow(TranslateChar("删除成功"),1);//yu add
gPBBrowse->next = 2;
XPostQuitMessage(&gPBBrowse->wnd);
}
return 0;
}
extern void PB_ClearData(void);
static int OnMenuDeleteAll(menu_t *pMenu)
{
if (0 == gPBBrowse->sum)
return -1;
if (XMessageBox(NULL, TranslateChar("删除全部?"), ID_OK) == ID_OK) {
PB_ClearData();
XTipWndShow(TranslateChar("删除成功"),1);//yu add
gPBBrowse->next = 2;
XPostQuitMessage(&gPBBrowse->wnd);
}
return 0;
}
/*
static int OnMenuGroup(menu_t *pMenu)
{
PB_GroupManage();
gPBBrowse->grpSum = GRP_GetIndex(gPBBrowse->group, MAX_GROUP_NUM);
if (gPBBrowse->grpShow != 0xFF) {
if (gPBBrowse->grpSum == 0) {
gPBBrowse->grpShow = 0xFF;
}
else {
if (gPBBrowse->group[gPBBrowse->grpCur] != gPBBrowse->grpShow) {
gPBBrowse->grpCur = 0;
gPBBrowse->grpShow = 0xFF;
}
}
}
// XShowComponent(&gPBBrowse->wnd.comp);
gPBBrowse->next = 2;
XPostQuitMessage(&gPBBrowse->wnd);
return 0;
}
*/
static int OnMenuStoreInfo(menu_t *pMenu)
{
PB_StoreInfo();
XShowComponent(&gPBBrowse->wnd.comp);
v_WriteLcdBuff();
return 0;
}
int PB_Browse(void *argv)
{
rect area;
XMSG msg;
BYTE i;
int ret;
gPBBrowse = (pb_browse_t*)malloc(sizeof(pb_browse_t));
if (NULL == gPBBrowse)
return -1;
gPBBrowse->idFind = 0;
if (argv != NULL) {
gPBBrowse->idFind = 1;
gDisplayGroup = 0xFF; /* 全程搜索 */
}
// memset(gPBBrowse, 0, sizeof(pb_browse_t));
gPBBrowse->select = -1; /* 没有选择项 */
gPBBrowse->grpShow= gDisplayGroup;
gPBBrowse->grpSum = GRP_GetIndex(gPBBrowse->group, MAX_GROUP_NUM);
gPBBrowse->grpCur = 0;
if (gDisplayGroup != 0xFF) {
for (i = 0; i < gPBBrowse->grpSum; ++i) {
if (gPBBrowse->group[i] == gDisplayGroup) {
gPBBrowse->grpCur = i;
break;
}
}
}
repeat:
gPBBrowse->total = PB_GetIndex(0xFF, gPBBrowse->acard);
// gPBBrowse->select = 0;
if (gPBBrowse->grpShow == 0xFF) {
gPBBrowse->keyLen = 0;
gPBBrowse->keyWord[0] = 0;
}
/* 参数设置模块窗口的矩形区域 */
SetRect(&area, 0, LCD_ICONEND+1, LCD_WIDTH, LCD_HEIGHT);
/* 创建参数设置模块的窗口,父窗口为空 */
XCreateWindow(NULL, &gPBBrowse->wnd, &area, TranslateChar("电话本"), pbBrowseProc, FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -