Abiword 编辑事件设计
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.