Xm CTL 扩展了 XmText 和 XmTextField,方法是模仿 Motif 2.0 CSText 小部件,添加一组以可视方式运行的相似的移动和删除操作。标准 Motif 2.1 Text 和 TextField 不区分逻辑和物理顺序:下一个和向前意为“向右”,而上一个和向后意为“向左”。然而,CSText 进行了适当的区分并定义了一组具有严格物理名称的新操作(例如,left-character ()、delete-right-word() 等等)。这些操作例程均被定义为对小部件的 XmNlayoutDirection 敏感,并可调用适当的 next- 或 previous- 操作。
Xm CTL 扩展比 CSText 扩展稍微复杂一些。Xm CTL 扩展对小部件的全局定向不敏感,但是对伪 XOC 所确定的光标周围物理字符的特定方向性(包括中性稳定性)敏感。
新资源名称使您能控制选择策略,提供绘制标签及控制对齐方式。
新 Xm CTL 操作集合大致是 {Move,Delete,Kill} 乘以 {Left,Right} 乘以 {Character,Word} 的向量积。下表中列出操作集。
表 6–2 Xm CTL 中的新资源
姓名 |
类/类型 |
存取 |
缺省值 |
---|---|---|---|
XmNrenditionTag |
XmCRenditionTag/XmRString |
CSG |
XmFONTLIST_DEFAULT_TAG |
XmNalignment |
XmCAlignment/XmRAlignment |
CSG |
XmALIGNMENT_BEGINNING |
XmNeditPolicy |
XmCEditPolicy/XmREditPolicy |
CSG |
XmEDIT_LOGICAL |
指定位于 XmNrenderTable 资源(用于小部件)中的 XmRendition 的绘制标签。
指定此小部件中使用的文本对齐方式。仅支持 XmALIGNMENT_END 和 XmALIGNMENT_CENTER。
指定此小部件使用的编辑策略(XmEDIT_LOGICAL 或 XmEDIT_VISUAL)。如果指定 XmEDIT_VISUAL ,则选择、光标移动和删除将以可视形式进行。设置该资源还可将标准键盘移动和删除事件的转换更改为新的“可视”操作列表或现有的逻辑操作。
forward-cell() 和 backward-cell() 操作在指定的方向中查询字符的定向。如方向是从左向右,则这些操作调用相应的 next-/forward- 或 previous-/backward- 变式。
这些操作通过使用布局服务变换 OutToInp 和 Property 缓冲区(对于嵌套级)来确定字符的方向。因而,小部件的行为取决于语言环境的特定变换。如果 OutToInp(尤其是 Property 缓冲区)中的信息不正确,则小部件可能会产生意外行为。此外,由于语言环境特定的模块处于该规范的范围之外,相同文本、应用程序、资源值和 LayoutObject 配置的双向编辑行为可能因平台的不同而不同。
可视模式操作导致显示基于单元的行为。逻辑模式操作导致基于字符的逻辑行为。例如,delete-right-character() 操作删除与显示单元相对应的输入缓冲区字符。即一个 LayoutObject 变换“特性”字节“新单元指示器”为 1 的输入缓冲区字符,以及“新单元指示器”为 0 的所有后继字符。
有关 Property 缓冲区的更多信息,请参见《CAE 规范》中的 m_transform_layout()。
同样,对于 backward-character(),插入点在输入缓冲区中向后移动一个字符,光标被在与关联的输出缓冲区字符相对应的可视位置重新绘制。因而,要进行若干次击键以在复合显示单元中移动。当插入点在“新单元指示器”为 0 的输入缓冲区字符(即音调符号或连字片段)中移动时,光标并不实际更改显示位置。
此行为意味着删除操作或者从逻辑/输入缓冲区端执行,或者从物理/输出端的显示单元级执行。没有严格的、物理的逐字符删除模式,因为在输入和输出缓冲区之间不存在一对一的对应关系。例如,给定的物理字符只能代表逻辑字符片断。
下表描述 XmText 操作例程。
如果 XmNeditPolicy 为 XmEDIT_LOGICAL 且被不带参数调用,则插入光标在逻辑上向后移动一个字符。如果插入光标位于行首,则它将移动到上一行(如果存在)的最后一个逻辑字符。否则,插入光标位置不变。
如果 XmNeditPolicy 为 XmEDIT_VISUAL,则光标移动到光标位置的左侧。如果插入光标位于行首,则它将移动到上一行(如果存在)的结尾字符。
如果使用 extend 参数调用 left-character(),则插入光标将像没有参数时一样移动,并扩展当前所选内容。
left-character() 操作使用原因值 XmCR_MOVING_INSERT_CURSOR 生成对 XmNmotionVerifyCallback 过程的调用。如果使用 extend 参数进行调用,则此操作可以生成对 XmNgainPrimaryCallback 过程的调用。有关更多信息,请参见《Motif 程序员参考》中的回调说明。
如果 XmNeditPolicy 为 XmEDIT_LOGICAL 且不被带参数调用,则它将插入光标逻辑地向前移动一个字符。如果插入光标位于行的逻辑结尾处,则此操作将插入光标移动到下一行(如果存在)的逻辑开始处。
如果 XmNeditPolicy 为 XmEDIT_VISUAL,则光标移动到该光标位置的右侧。如果插入光标位于行尾,则它将插入光标移动到下一行(如果存在)的开始处。
如果使用 extend 参数进行调用,则 XmNeditPolicy 将像不带参数调用一样移动插入光标,并扩展当前所选内容。
right-character() 操作使用原因值 XmCR_MOVING_INSERT_CURSOR 生成对 XmNmotionVerifyCallback 过程的调用。如果使用 extend 参数进行调用,则此操作可以生成对 XmNgainPrimaryCallback 过程的调用。有关更多信息,请参见《Motif 程序员参考》中的回调说明。
如果 XmNeditPolicy 为 XmEDIT_LOGICAL 且被不带任何参数调用,则插入光标移动到逻辑后继字(如果存在)的逻辑开始处。否则,此光标移动到当前字的逻辑结尾处。如果插入光标位于行的逻辑结尾处或此行的最后一个逻辑字,则光标移动到下一行(如果存在)的第一个逻辑字;否则,光标移动到当前字的逻辑结尾处。
如果 XmNeditPolicy 为 XmEDIT_VISUAL 且被不带参数调用,则插入光标移动到行尾右侧或后面的第一个空格字符后的第一个非空格字符处。
如果使用 extend 参数进行调用,则就像不带参数调用一样移动插入光标,并扩展当前所选内容。
left-word() 操作使用原因值 XmCR_MOVING_INSERT_CURSOR 生成对 XmNmotionVerifyCallback 过程的调用。如果使用 extend 参数调用,则此操作可以生成对 XmNgainPrimaryCallback 过程的调用。有关更多信息,请参见《 Motif 程序员参考》中的回调说明。
如果 XmNeditPolicy 为 XmEDIT_LOGICAL,则它等效于 delete-previous-char()。如果 XmNeditPolicy 为 XmEDIT_VISUAL,则在正常模式下,如果有一个非空选择,则它将删除此选择。否则,此操作删除插入光标左侧的字符。在添加模式下,如果有一个非空选择,光标未离开所选内容,并且 XmNpendingDelete 设置为真,则此操作删除此选择。否则,此操作删除插入光标左侧的字符,这可能会影响选择。
delete-left-character() 操作使用原因值 XmCR_MODIFYING_TEXT_VALUE 生成对 XmNmodifyVerifyCallback 过程的调用,并且使用原因值 XmCR_VALUE_CHANGED 生成对 XmNvalueChangedCallback 过程的调用。
如果 XmNeditPolicy为 XmEDIT_VISUAL,则它等效于 delete-next-character()。如果 XmNeditPolicy为 XmEDIT_VISUAL,则在正常模式下,如果有一个非空选择,则它删除此选择。否则,它删除插入光标右侧的字符。在添加模式中,如果有一个非空选择,并且光标未离开所选内容,则将 XmNpendingDelete 设置为真,并删除此选择;否则,删除插入光标右侧的字符。此操可能会对选择造成影响。
delete-right-character() 操作使用原因值 XmCR_MODIFYING_TEXT_VALUE 生成对 XmNmodifyVerify-Callback 过程的调用,并且使用原因值 XmCR_VALUE_CHANGED 生成对 XmNvalue-ChangedCallback 过程的调用。
实现了一些基于单元的例程以支持字符组合、连字和音调符号。换句话说,两个或多个字符可以被占用一个表示单元的单个字形表示。
XmText 单元操作例程如下表所示。
将插入光标向后移动一个单元。如果 XmNeditPolicy 为 XmEDIT_LOGICAL,则插入光标移动到逻辑上位于当前单元之前的那个单元(如果存在)的开始处。否则,光标移动到当前单元的开始处。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,则光标移动到光标左侧单元(如果存在)的开始处。prev-cell() 操作使用原因值 XmCR_MOVING_INSERT_CURSOR 生成对 XmNmotionVerifyCallback 过程的调用。如果使用 extend 参数进行调用,则此操作可以生成对 XmNgainPrimaryCallback 过程的调用。有关更多信息,请参阅《Motif 程序员参考》中的回调说明。
将插入光标移动到下一个逻辑单元(如果存在)的开始处。否则,此操作将光标移动到此单元的结尾处。如果 XmNeditPolicy 为 XmEDIT_LOGICAL,则光标向前移动一个单元。
如果 XmNeditPolicy 为 XmEDIT_VISUAL,则光标移动到此光标位置右侧单元的开始处(如果此单元存在);否则,光标移动到当前单元的结尾处。forward-cell() 操作使用原因值 XmCR_MOVING_INSERT_CURSOR 生成对 XmNmotionVerifyCallback 过程的调用。如果使用 extend 参数进行调用,则此操作可以生成对 XmNgainPrimaryCallback 过程的调用。有关更多信息,请参阅《Motif 程序员参考》中的回调说明。