Xm CTL 扩展了 XmText 和 XmTextField,方法是模仿 Motif 2.0 CSText 小部件, 添加一组以可视方式运行的相似的移动和删除操作。标准 Motif 2.1 Text 和 TextField 不区分逻辑和物理顺序:下一个 和向前 意为 “向右”,而上一个 和向后 意为“向左” CSText,然而,请进行适当的区分并定义一组具有严格物理名称的新操作(例如,left-character ()、delete-right-word()等等)。所有这些操作例程均被定义为对小部件的 XmNlayoutDirection 敏感,并可调用适当的下一个 或上一个 操作。 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 |
指定此小部件使用的编辑策略(XmEDIT_LOGICAL 或 XmEDIT_VISUAL)。 如果指定 XmEDIT_VISUAL ,则选择、光标移动和删除将以可视形式进行。 设置该资源还可将标准键盘移动和删除事件的转换更改为新的“可视”操作列表或现有的逻辑操作。
forward-cell() 和 backward-cell() 操作在指定的方向中查询字符的定向。 如果方向是从左向右,则它们调用相应的下一个/向前 或上一个/向后 变量:
这些操作通过使用布局服务变换 OutToInp 和 Property 缓冲区(对于嵌套级)来确定字符的定向。 因而,小部件的行为取决于语言环境的特定变换。 如果 OutToInp (尤其是 Property 缓冲区)中的信息不准确,则小部件可能会产生意外行为。 此外,由于语言环境特定的模块处于该规范的范围之外,相同文本、应用程序、资源值和 LayoutObject 配置的双向编辑行为可能因平台的不同而不同。
可视模式操作导致显示基于单元的行为。逻辑模式操作导致基于字符的逻辑行为。 例如,delete-right-character() 操作删除与显示单元相对应的输入缓冲区字符。 即,一个 LayoutObject 变换 “特性”字节“新单元指示器”为 1 的输入缓冲区字符,以及“新单元指示器” [有关 Property 缓冲区的详细信息,请参见《CAE 规范 》中的 m_transform_layout() 规范。] 为 0 的所有后继字符。
同样,对于 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 参数调用,则它将象没有参数一样移动插入光标并扩展当前所选内容。
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 程序员参考 中的回调说明。