四、删除一个entry从Phone List中删除一个entry。
mmi_phb_entry_op_option_sim()
ShowCategory15Screen()

选择[删除],SetHiliteHandler(MITEM1012_PBOOK_DELETE, mmi_phb_highlight_op_delete_entry);
mmi_phb_entry_op_delete_confirm() //是否删除?
mmi_phb_op_delete_entry_req() //删除
mmi_phb_show_in_progress(STR_PHB_DELETING, IMG_GLOBAL_DELETED); //显示“正在处理”信息
store_index = g_phb_name_index[g_phb_cntx.active_index]; //获取这个entry在PhoneBook[]中的存储位置
myMsgPtr->index = (storage == MMI_SIM) ? (store_index + 1) - MAX_PB_PHONE_ENTRIES : (store_index + 1); //entry在L4中存储位置
发送消息:PRT_PHB_DEL_ENTRY_REQ到L4.
SetProtocolEventHandler(mmi_phb_op_delete_entry_rsp, PRT_PHB_DEL_ENTRY_RSP); //设置CBack函数
调整histroy screen。

L4返回消息:
mmi_phb_op_delete_entry_rsp()
if (localPtr->result.flag == 0 /* OK */ )
{
PhbUpdateSpeedDial(storage, record_index, MMI_PHB_PHONEBOOK, NULL, NULL); //根据NVRAM的存储位置record_index,更新速拨信息。(速拨信息中也保存 record_index信息。)
if (store_index >= MAX_PB_PHONE_ENTRIES) //删除的entry是SIM卡中号码
{
g_phb_cntx.sim_used--;
}
else //删除的是ME中号码
{
g_phb_cntx.phone_used--;
删除optional IDs.
删除video.
删除生日。

deletedCnt = mmi_phb_op_clear_lookup_table_by_index(store_index); 设置LookUpTable[]中number = 1000000000(无效号码)
if (deletedCnt)
{
mmi_phb_lookup_table_sort(); //对LookUpTable[]重新排序
g_phb_cntx.lookup_table_count -= deletedCnt;
}

mmi_phb_op_delete_update_index(store_index);
for (pos = 0; pos < PhoneBookEntryCount; pos++)
{
if (g_phb_name_index[pos] == store_index)
{
PhoneBookEntryCount--; //总的phone entries递减
break;
}
}
for (i = pos; i < PhoneBookEntryCount; i++) //调整g_phb_name_index[]中的索引位置。
{
g_phb_name_index[i] = g_phb_name_index[i + 1];
}
//注意:这里并没有清除PhoneBook[store_index]中的内容。因为在对phone entries进行操作时,不是直接操作PhoneBook[]的,而是通过索引的。
//另外:在上面的存储一个entry时,在把姓名和号码保存到PhoneBook[]时,并没有在PhoneBook[]中查找一个空的位置来存储,所使用的stort_index是从 L4传过来的。也就是:在保存一个entry到L4时,在CBack函数中,L4会返回一个存储位置:record_index,然后store_index = record_index – 1。
}
}
else //删除失败
{

}


五、快速查找​
思路是:第一次进入快速查找时,SHOW出所有的entry。用户输入一个字母后,输入的字母与所有的entries的前2个字节比较,如果符合的话,就把该entry增加到一个指针数组中。用户输入第二个字母后,再把输入的所有字母与所有的entries比较,再次设置指针。。。。。。

mmi_phb_quick_search_list_pre_entry()

//注意这2个函数:第一个是MTK的快速查询,第二个是进入百家姓
mmi_phb_entry_quick_search_list()
mmi_phb_entry_quick_search_list_ex()

mmi_phb_entry_quick_search_list()
RegisterCat200SearchFunction(mmi_phb_quick_search_find_entry);
ShowCategory200Screen();
mmi_phb_quick_search_make_cache(); //把PhoneBook[]中的entries姓名第一个字母,放入g_phb_qsearch_cache[]中。(前2个字节)

当用户输入一个字母如:a,进入:
Cat200multitap_inputcallback(UI_character_type inp) //inp=’a’
if (inp != 0)
{
gui_single_line_input_box_insert_multitap_character(&MMI_singleline_inputbox, inp); //把’a’插入MMI_singleline_inputbox中。
}
if (!gui_single_line_input_box_test_overflow(&MMI_singleline_inputbox)) //判断输入是否溢出
{
if (cat200_search_function) //上面注册的函数
{
no_entries = cat200_search_function(MMI_singleline_inputbox.text);//输入的字母与PhoneBook[]中比较,过滤,设置g_phb_qsearch[]
load_dynamic_item_buffer(no_entries); //根据g_phb_qsearch[]的值,动态获取匹配的entry

if (no_entries >= 0)
{
refresh_search_list_change_list(no_entries);
}
singleline_inputbox_input_callback();
redraw_singleline_inputbox();
gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);

}
}

小结:​
1.Show 出所有的entries,最下面供用户输入,设置g_phb_qsearch[]全部为1。​
2.用户输入第一个字母。把这个字母与所有entries的首字母比较。若相等,设置g_phb_qsearch[i]=1;否则g_phb_qsearch[i]=0。​
然后重新获取所有g_phb_qsearch[i]=1的entries,并show list。​
3.用户输入第二个字母。把这2个输入的字母与所有的entries比较。若相等,设置g_phb_qsearch[i]=1;否则g_phb_qsearch[i]=0。​
然后重新获取所有g_phb_qsearch[i]=1的entries,并show list。​
4.如此继续。。。。。。​
5.当删除一个字母时,所做的操作相同。​


六、姓名查找​
mmi_phb_highlight_search_name()
mmi_phb_search_name_pre_entry()
if (PhoneBookEntryCount)
{
mmi_phb_entry_search_name();
ShowCategory5Screen_ext(); //接收用户输入姓名:pbName。
SetLeftSoftkeyFunction(mmi_phb_entry_search_name_option, KEY_EVENT_UP);
}

左软件选项:
mmi_phb_entry_search_name_option()
ShowCategory15Screen(); //2个选择:[查找] mmi_phb_highlight_search_name_option_search()
[输入法] mmi_phb_highlight_search_name_option_input_method()

1.输入法相关知识
EntryInputMethodScreen()
ShowCategory15Screen()

左软件响应:
InputMethodScreenHandleLSK()
S32 index = GetHighlightedItem();
currPreFuncPtr = preHandleInputMethodLSKFuncPtrs[index];
currPostFuncPtr = postHandleInputMethodLSKFuncPtrs[index];
if (currPreFuncPtr != NULL)
{
(*currPreFuncPtr) ();
}
if (currPostFuncPtr != NULL)
{
(*currPostFuncPtr) ();
}

2.查找
mmi_phb_search_name()
g_phb_cntx.highlight_entry = mmi_phb_search_name_find_closet(); //查找到的应该高亮的entry
mmi_phb_list_pre_entry(); //动态show所有的entries。
mmi_phb_entry_list( PhoneBookEntryCount, /* Total Entry */
STR_SCR_PBOOK_VIEW_CAPTION, /* Title String */
IMG_SCR_PBOOK_CAPTION, /* Title Image */
STR_GLOBAL_OPTIONS, /* LSK */
IMG_GLOBAL_OPTIONS, /* LSK */
#if defined(__MMI_INTELLIGENT_CALL_ALERT__)
mmi_phb_get_index_speak_name,
#else
mmi_phb_get_index, /* Highlight Callback */
#endif
mmi_phb_entry_op_option, /* LSK Callback */
send_key_ptr, /* SEND Key Callback */
mmi_phb_list_get_item, /* List Callback */
mmi_phb_list_get_hint, /* Hint Callback */
mmi_phb_list_pre_entry, /* Re-Entry Callback */
TRUE, /* Alpha Index */
TRUE); /* Right Arrow Key */
ShowCategory184Screen(
STR_TITLE,
IMG_TITLE,
STR_LSK,
IMG_LSK,
STR_GLOBAL_BACK,
IMG_GLOBAL_BACK,
EntryCount,
ItemPtr,
HintPtr,
g_phb_cntx.highlight_entry,
guiBuffer);

如何根据姓名查找:
mmi_phb_search_name_find_closet()
if (pfnUnicodeStrlen((S8*) pbName) == 0)
{
return 0;
}
result_index = mmi_phb_search_name_binary_search(0, (PhoneBookEntryCount - 1), (S8*) pbName);

//find the position of ucs2_name in the array g_phb_name_index[] between low and high;
mmi_phb_search_name_binary_search()
输入的姓名与PhoneBook[]中的姓名比较,直到找出一个合适的entry作为高亮。