复合字符串的方向被存储起来,以便使数据结构对于描述从左到右的语言(如英语、西班牙语、法语和德语)的文本或者从右到左的语言(如希伯来语和阿拉伯语)的文本同样有用。在 Motif 应用程序中,可以使用 VendorShell 或 MenuShell 中的 XmNlayoutDirection 资源来设置布局方向。管理器和原始小部件(以及小配件)也具有 XmNlayoutDirection 资源。缺省值从具有相同资源的最近的祖先继承。
如果是 XmText 小部件,则必须指定垂直方向及水平方向。将 layoutDirection 设置为 XmRIGHT_TO_LEFT 将会使字符串方向成为从右到左,而光标则垂直向下移动。如果垂直方向重要且要求从顶到底对齐,确保指定 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM。本设置将组件布局首先指定为从右到左,然后从上到下,从而产生所需的行为。
XmText 和 TextField 小部件的行为也受 XmNalignment 和 XmNlayoutModifier XmRendition 资源的影响。这些资源与 XmNlayoutDirection 共同控制文本小部件的布局行为。图 6–2 中阐释了此行为。
该图中使用的输入字符串是:
下图中 XmNlayoutModifier 字符串 @ls orientation=设置值如左列中所示。
如插图所示,XmNalignment 规定文本是否与布局方向一起右对齐或左对齐。XmNlayoutModifier 将文本分成多段,并根据定向值将它们从左到右或从右到左排列。换句话说,如果 XmNlayoutDirection 是 XmRIGHT_TO_LEFT,并且 XmNAlignment 值是 XmALIGNMENT_BEGINNING,则此字符串右对齐。
下列代码使用标记为“ArabicShaped”的“绘制”创建 XmNlabelString 为 XmCHARSET_TEXT 类型的 XmLabel。使用“ar”(对应于阿拉伯语言环境的语言环境名称)的 XmNlayoutAttrObject 以及布局修饰符字符串来创建“绘制”。该布局修饰符字符串为输出缓冲指定了 NUMERALS_CONTEXTUAL 的 Numerals 值和 “iso8859-6”的 ShapeCharset值。
特定于语言环境的布局模块将其输入文本转换到使用 16 位 Unicode 代码集编码的物理字符的输出缓冲区。由于已经指定了显式布局语言环境,因此此文本能够独立于运行时语言环境设置正确绘制。在此实例中,用 ISO 8859-6 对输入进行编码。
int n; Arg args[10]; Widget w; XmString labelString; XmRendition rendition; XmStringTag renditionTag; XmRenderTable renderTable; /* alef lam baa noon taa - iso8859-6 */ labelString = XmStringGenerate("\307\344\310\346\312\", NULL XmCHARSET_TEXT, "ArabicShaped"); w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent, XmNlabelString, labelString, XmNlabelType, XmSTRING, NULL); n = 0; XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*"); n++; XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++; XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++; XtSetArg(args[n], XmNlayoutModifier, "@ls numerals=:contextual, shapecharset=iso8859-6"); n++; renditionTag = (XmStringTag) "ArabicShaped"; rendition = XmRenditionCreate(w, renditionTag, argcs s, n); renderTable = XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE); XtVaSetValues(w, XmNrenderTable, renderTable, NULL);
下列代码使用一个 Rendition创建 TextField 小部件和 RenderTable。XmNlayoutAttrObject 和 XmNlayoutModifier 伪资源均未指定,因此缺省为 NULL。此值意味着与“Rendition”关联的布局对象属于缺省语言环境(如果存在)。
要使此实例正常工作,该语言环境必须设置为代码集是 ISO 8859-6,并且特定于该语言环境的布局模块可支持 IMPLICIT_BASIC 算法。Rendition 的 LayoutObject 的 ImplicitAlg 值通过 Rendition 的 XmNlayoutModifier 伪资源进行修改。
int n; Arg args[10]; Widget w; XmRendition rendition; XmStringTag renditionTag; XmRenderTable renderTable; w = XmCreateTextField(parent, "text field", args, 0); n = 0; XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*"); n++; XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++; renditionTag = (XmStringTag) "ArabicShaped"; rendition = XmRenditionCreate(w, renditionTag, args, n); renderTable = XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE); XtVaSetValues(w, XmNrenderTable, renderTable, NULL); .... n = 0; XtSetArg(args[n], XmNlayoutModifier, "@ls implicitalg=basic"); n++; XmRenditionUpdate(rendition, args, n);