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.

转载于:https://www.cnblogs.com/songtzu/p/3539771.html

Abiword 编辑事件设计相关推荐

  1. JavaScript 中的事件设计

    1. 事件绑定的几种方式  主要介绍一下 最常用的事件设计 其他就稍微带过. 直接在代码里面添加onclick指定函数名字. B) 在JS代码中通过dom元素的onclick等属性 这种做法this表 ...

  2. 实战小课 | 深入剖析 「事件设计方法与规范」,夯实数据分析基础!

    神策数据立足于"重构中国互联网数据根基",凭借已有的 1000 + 家付费企业的服务和成功实践经验,开辟线下活动"神策数据实战学堂",以数据驱动为主题聚焦不同热 ...

  3. 基于web的在线视频编辑的设计

    前言 在这里,先吐槽一下,最近一直很忙,就要过年了,公司项目赶得要命,吃不好,睡不好,周末都没得休息(写到这里就憋着一肚火了).不过,付出还是有回报的,在团队的合作努力下,项目还是在过年前完成了,最近 ...

  4. easyui表格编辑事件_Unity手游开发札记——从Odin插件聊基于元数据的编辑器实现

    Metadata is data that provides information about other data. 最近一个多月的时间在全力做新项目的Demo,由于程序暂时还只有我一个人,所以从 ...

  5. 视频录制与编辑架构设计

    视频录制模块 视频录制由视频预览.伴奏播放.视频录制/暂停.倍速/半速录制四部分组成. (1)视频预览 在Android&IOS平台我们可以使用自己的Camera+OpenGL ES进行视频的 ...

  6. Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。

    Fullcalendar这个插件挺好,就是很多方法感觉官方文档也没怎么说,导致上手难度大,而且有些默认事件真的不太友好...废话不多说,先上效果图! 1.效果GIF 1.1 基本按钮功能 1.2  事 ...

  7. Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)2.主页面及部分事件设计

    时隔大半年,总算抽出时间更新这个博客了.去年下半年因为大四忙着备战考研,一直没有心情将第二篇继续更新,今年上半年又忙着搞毕业设计,焦头烂额了属于是orz 由于我的android studio的模拟器实 ...

  8. editable组件_表格行内编辑事件

    1.简介 x-editable组件是一个适用于bootstrap(目前只更新到bootstrap3),jquery,jquery UI三种风格样式的弹出框编辑插件.本文根据项目需求主要介绍它在boot ...

  9. DataTable双击或单击编辑事件

    有木有小伙伴想实现-----单击或双击表2某行数据,把此行数据填充到表1或其他显示形式对其进行操作(如修改),操作(修改)完成后数据则会发生变化等效果. table_1 xx xx xx table_ ...

最新文章

  1. (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  2. 公司项目NODEJS实践0.3[ mongo / session ...]
  3. 可重入函数、不可重入函数,注意事项
  4. Get Started with Apex Unit Tests
  5. 空壳公司骗贷的常见手段及风控措施
  6. 从入门到掉坑:Go 内存池/对象池技术介绍
  7. php model层怎么写逻辑,目前用php框架的话,大家会把逻辑写到model中吗?
  8. Javascript图像处理——图像形态学
  9. 阿里达摩院拿什么救人?
  10. ivy java_Ivy 在eclipse里的配置
  11. 推荐系统概述——《ML算法原理和实践》学习笔记
  12. Libra客户端使用
  13. python读取lmdb文件_LMDB 的 Python 接口使用方法
  14. 使用纯JavaScript实现全网页动态樱花飘落特效
  15. MIT线性代数笔记二十八讲 相似矩阵和若尔当标准型
  16. 简单易懂的现代魔法——Play Framework攻略2
  17. 微信开发工具 git代码管理
  18. 原生JS制作自动+手动轮播图,附带二级分类菜单
  19. cocos做飞机大战笔记【根据道具设置子弹】
  20. UVM:7.5.2 常用操作及其对期望值和镜像值的影响

热门文章

  1. 企业真的要培养员工?
  2. 一起谈.NET技术,初识Silverlight 4及其架构
  3. 自动发现网络拓扑,一站式点击完成
  4. Java数据结构Map遍历和排序
  5. Qt creator工程项目移植时因环境变换造成qmake错误的解决方案
  6. 两个单链表相交的一系列问题
  7. oracle获取父级,如何通过sql获取oracle connect中的最终父id列
  8. spring基于注解的IOC以及IoC的案例——概念
  9. do……while 循环
  10. Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法