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.

  • 相关阅读:
    Spring_7_AOP之Advice应用
    JAVA豆知识
    SPRING事务_2
    JSP_5_JavaBean
    Spring事务_1
    java基本类型和包装类型
    SVN使用教程总结
    通过反射来创建对象?getConstructor()和getDeclaredConstructor()区别?
    Java泛型中extends和super的区别?
    数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
  • 原文地址:https://www.cnblogs.com/songtzu/p/3539771.html
Copyright © 2011-2022 走看看