Abiword 編輯事件設計
?
?Abiword作為專業的字處理軟件,其各種編輯事件的處理封裝比較巧妙。其中包含鼠標、鍵盤、字符等各種操作的封裝。
本文將詳細記錄事件的處理各個類的設計概要。
一、EV_EditMethod類
????? 該類的定義:具有根據名字調用方法的能力。
** 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函數中根據其m_fn(函數指針)動態調用各個函數。
二、ap_EditMethods類
???? 首先改類利用EV_EditMethod_Fn函數對象定義靜態的成員函數。
typedef bool ( EV_EditMethod_Fn) (AV_View * pView, EV_EditMethodCallData * pCallData);?
???? 其次,定義靜態的EV_EditMethod的數組s_arrayEditMethods。該數組要求按字符順序排序(strcmp)
#define F(fn)???ap_EditMethods::fn
#define N(fn)???#fn
#define NF(fn)???N(fn), F(fn)
三、EV_EditMethodContainer類
該類主要用于存儲EV_EditMethod的數組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類,提供兩者的基本映射。
針對該類數據集合的封裝系統定義了3個集合類:
1、ev_EB_MouseTable類,定義鼠標的EV_EditBinding指針的三維數組。
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指針的二維數組。
EV_EditBinding *?m_peb[EV_COUNT_NVK][EV_COUNT_EMS];
3、ev_EB_Char_Table類,定義了鍵盤(字符鍵)的EV_EditBinding指針的二維數組。
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;
常用的函數有:
bool????setBinding(EV_EditBits eb, const char * szMethodName);
? bool????setBinding(EV_EditBits eb, EV_EditBinding * peb);
六、初始化
以上類的初始工作有AP_BindingSet類完成。
在src\wp\ap\xp的文件夾中,以ap_LB_*開頭的文件中定義鼠標、鍵盤、字符等操作對應的數組結構
在ap_LB_Default.cpp定義如下數組:
ap_bs_Mouse MouseTable[]
ap_bs_NVK NVKTable[]
ap_bs_Char CharTable[]
其他文件中有類似的數據結構。
系統利用AP_BindingSet類來初始化以上各個類對象。
七、EV_EditEventMapper類
封裝EV_EditBindingMap類,提供一致的鼠標、鍵盤等外部的接口來獲取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.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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