zoukankan      html  css  js  c++  java
  • 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类完成。

    在srcwpapxp的文件夹中,以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.

  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/songtzu/p/3539771.html
Copyright © 2011-2022 走看看