代码改变世界

Abiword 编辑事件设计

2011-09-24 11:42  netwy  阅读(507)  评论(0编辑  收藏  举报

      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.