Abiword 編輯事件設(shè)計(jì)
?
?Abiword作為專業(yè)的字處理軟件,其各種編輯事件的處理封裝比較巧妙。其中包含鼠標(biāo)、鍵盤、字符等各種操作的封裝。
本文將詳細(xì)記錄事件的處理各個類的設(shè)計(jì)概要。
一、EV_EditMethod類
????? 該類的定義:具有根據(jù)名字調(diào)用方法的能力。
** The EditMethod mechanism provides essentially a 'call-by-name'
** capability.? A key, mouse, menu, or toolbar event may be bound
** to a 'named' function (of type EV_EditMethod_Fn).
其中Fn函數(shù)中根據(jù)其m_fn(函數(shù)指針)動態(tài)調(diào)用各個函數(shù)。
二、ap_EditMethods類
???? 首先改類利用EV_EditMethod_Fn函數(shù)對象定義靜態(tài)的成員函數(shù)。
typedef bool ( EV_EditMethod_Fn) (AV_View * pView, EV_EditMethodCallData * pCallData);?
???? 其次,定義靜態(tài)的EV_EditMethod的數(shù)組s_arrayEditMethods。該數(shù)組要求按字符順序排序(strcmp)
#define F(fn)???ap_EditMethods::fn
#define N(fn)???#fn
#define NF(fn)???N(fn), F(fn)
三、EV_EditMethodContainer類
該類主要用于存儲EV_EditMethod的數(shù)組s_arrayEditMethods,并且提供操作EV_EditMethod指針的方法。如:
bool??????????????????? addEditMethod(EV_EditMethod * pem);
EV_EditMethod *??getNthEditMethod(UT_uint32 ndx);
EV_EditMethod *??findEditMethodByName(const char * szName) const;
四、EV_EditBinding類
該類主要用于封裝EV_EditMethod類,提供兩者的基本映射。
針對該類數(shù)據(jù)集合的封裝系統(tǒng)定義了3個集合類:
1、ev_EB_MouseTable類,定義鼠標(biāo)的EV_EditBinding指針的三維數(shù)組。
EV_EditBinding *?m_peb[EV_COUNT_EMO][EV_COUNT_EMS][EV_COUNT_EMC];
EMC:typedef UT_uint32 EV_EditMouseContext;的縮寫
EMS:typedef UT_uint32 EV_EditModifierState;?的縮寫
EKP: typedef UT_uint32 EV_EditKeyPress;?的縮寫
EMB:typedef UT_uint32 EV_EditMouseButton;的縮寫
EMO:typedef UT_uint32 EV_EditMouseOp;的縮寫
在ev_EditBits.h文件中有具體宏的定義。
2、ev_EB_NVK_Table類,定義了鍵盤(功能鍵)的EV_EditBinding指針的二維數(shù)組。
EV_EditBinding *?m_peb[EV_COUNT_NVK][EV_COUNT_EMS];
3、ev_EB_Char_Table類,定義了鍵盤(字符鍵)的EV_EditBinding指針的二維數(shù)組。
EV_EditBinding *?m_peb[256][EV_COUNT_EMS_NoShift];
五、EV_EditBindingMap類
該類主要利用EV_EditMethodContainer類初始化ev_EB_MouseTable、ev_EB_NVK_Table、ev_EB_Char_Table的指針。
EV_EditMethodContainer *?m_pemc;
? ev_EB_MouseTable *???m_pebMT[EV_COUNT_EMB];
? ev_EB_NVK_Table *???m_pebNVK;
? ev_EB_Char_Table *???m_pebChar;
常用的函數(shù)有:
bool????setBinding(EV_EditBits eb, const char * szMethodName);
? bool????setBinding(EV_EditBits eb, EV_EditBinding * peb);
六、初始化
以上類的初始工作有AP_BindingSet類完成。
在src\wp\ap\xp的文件夾中,以ap_LB_*開頭的文件中定義鼠標(biāo)、鍵盤、字符等操作對應(yīng)的數(shù)組結(jié)構(gòu)
在ap_LB_Default.cpp定義如下數(shù)組:
ap_bs_Mouse MouseTable[]
ap_bs_NVK NVKTable[]
ap_bs_Char CharTable[]
其他文件中有類似的數(shù)據(jù)結(jié)構(gòu)。
系統(tǒng)利用AP_BindingSet類來初始化以上各個類對象。
七、EV_EditEventMapper類
封裝EV_EditBindingMap類,提供一致的鼠標(biāo)、鍵盤等外部的接口來獲取EV_EditMethod對象
EV_EditEventMapperResult Keystroke(EV_EditBits eb, EV_EditMethod ** ppEM);
EV_EditEventMapperResult Mouse(EV_EditBits eb, EV_EditMethod ** ppEM);
描述:
** EditEventMapper, EditBinding, and EditMethod form the basis for
** all editing operations.? All keystrokes and mouse events
** are directed thru here.? These are
** defined as classes outside of the document so that we may switch
** between different implementations as we want.
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
