日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Abiword 编辑事件设计

發布時間:2025/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Abiword 编辑事件设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。