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.
转载于:https://www.cnblogs.com/songtzu/p/3539771.html
Abiword 编辑事件设计相关推荐
- JavaScript 中的事件设计
1. 事件绑定的几种方式 主要介绍一下 最常用的事件设计 其他就稍微带过. 直接在代码里面添加onclick指定函数名字. B) 在JS代码中通过dom元素的onclick等属性 这种做法this表 ...
- 实战小课 | 深入剖析 「事件设计方法与规范」,夯实数据分析基础!
神策数据立足于"重构中国互联网数据根基",凭借已有的 1000 + 家付费企业的服务和成功实践经验,开辟线下活动"神策数据实战学堂",以数据驱动为主题聚焦不同热 ...
- 基于web的在线视频编辑的设计
前言 在这里,先吐槽一下,最近一直很忙,就要过年了,公司项目赶得要命,吃不好,睡不好,周末都没得休息(写到这里就憋着一肚火了).不过,付出还是有回报的,在团队的合作努力下,项目还是在过年前完成了,最近 ...
- easyui表格编辑事件_Unity手游开发札记——从Odin插件聊基于元数据的编辑器实现
Metadata is data that provides information about other data. 最近一个多月的时间在全力做新项目的Demo,由于程序暂时还只有我一个人,所以从 ...
- 视频录制与编辑架构设计
视频录制模块 视频录制由视频预览.伴奏播放.视频录制/暂停.倍速/半速录制四部分组成. (1)视频预览 在Android&IOS平台我们可以使用自己的Camera+OpenGL ES进行视频的 ...
- Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
Fullcalendar这个插件挺好,就是很多方法感觉官方文档也没怎么说,导致上手难度大,而且有些默认事件真的不太友好...废话不多说,先上效果图! 1.效果GIF 1.1 基本按钮功能 1.2 事 ...
- Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)2.主页面及部分事件设计
时隔大半年,总算抽出时间更新这个博客了.去年下半年因为大四忙着备战考研,一直没有心情将第二篇继续更新,今年上半年又忙着搞毕业设计,焦头烂额了属于是orz 由于我的android studio的模拟器实 ...
- editable组件_表格行内编辑事件
1.简介 x-editable组件是一个适用于bootstrap(目前只更新到bootstrap3),jquery,jquery UI三种风格样式的弹出框编辑插件.本文根据项目需求主要介绍它在boot ...
- DataTable双击或单击编辑事件
有木有小伙伴想实现-----单击或双击表2某行数据,把此行数据填充到表1或其他显示形式对其进行操作(如修改),操作(修改)完成后数据则会发生变化等效果. table_1 xx xx xx table_ ...
最新文章
- (牛客腾讯思维编程题)编码编码分组打印下标题目分析
- 公司项目NODEJS实践0.3[ mongo / session ...]
- 可重入函数、不可重入函数,注意事项
- Get Started with Apex Unit Tests
- 空壳公司骗贷的常见手段及风控措施
- 从入门到掉坑:Go 内存池/对象池技术介绍
- php model层怎么写逻辑,目前用php框架的话,大家会把逻辑写到model中吗?
- Javascript图像处理——图像形态学
- 阿里达摩院拿什么救人?
- ivy java_Ivy 在eclipse里的配置
- 推荐系统概述——《ML算法原理和实践》学习笔记
- Libra客户端使用
- python读取lmdb文件_LMDB 的 Python 接口使用方法
- 使用纯JavaScript实现全网页动态樱花飘落特效
- MIT线性代数笔记二十八讲 相似矩阵和若尔当标准型
- 简单易懂的现代魔法——Play Framework攻略2
- 微信开发工具 git代码管理
- 原生JS制作自动+手动轮播图,附带二级分类菜单
- cocos做飞机大战笔记【根据道具设置子弹】
- UVM:7.5.2 常用操作及其对期望值和镜像值的影响
热门文章
- 企业真的要培养员工?
- 一起谈.NET技术,初识Silverlight 4及其架构
- 自动发现网络拓扑,一站式点击完成
- Java数据结构Map遍历和排序
- Qt creator工程项目移植时因环境变换造成qmake错误的解决方案
- 两个单链表相交的一系列问题
- oracle获取父级,如何通过sql获取oracle connect中的最终父id列
- spring基于注解的IOC以及IoC的案例——概念
- do……while 循环
- Python+selenium 自动化-调用dom节点的click()监听事件,强力操作节点,穿透元素进行点击,节点被遮挡不可点击解决方法