この節では、CTL アプリケーションの開発方法について説明します。
複合文字列の方向は、左から右に記述される言語 (英語、スペイン語、フランス語、ドイツ語など) の場合と同様に、右から左に記述される言語 (ヘブライ語、アラビア語など) の場合にも利用可能なデータ構造で保管されます。Motif アプリケーションでは、VendorShell または MenuShell から XmNlayoutDirection リソースを使用してレイアウト方向を設定できます。、マネージャ、プリミティブウィジェット、およびガジェットも XmNlayoutDirection リソースを持ちます。デフォルト値は、同じリソースを持つもっとも近い先祖から継承されます。
XmText ウィジェットに関しては、水平方向と垂直方向も指定する必要があります。layoutDirection に XmRIGHT_TO_LEFT を設定すると、文字列の方向は右から左に設定されますが、カーソルは真下に移動します。垂直方向が重要で、上から下を希望する場合には、XmRIGHT_TO_LEFT_TOP_TO_BOTTOM を指定します。これにより、コンポーネントは希望どおりまず右から左に、続いて上から下へレイアウトされます。
XmText および TextField ウィジェットの動作は、 XmRendition の XmNalignment および XmNlayoutModifier リソースにも依存します。これらのリソースおよび XmNlayoutDirection は、Text ウィジェットのレイアウト動作を制御します。このことを図 6–2 で説明します。
図で使用する入力文字列は次のとおりです。
この図の左下のカラムに、XmNlayoutModifier の文字列 @ls orientation= に設定される値を示します。
図に示すとおり、XmNalignment はレイアウト方向に関連してテキストを右フラッシュするか左フラッシュするかを指定します。XmNlayoutModifier はテキストをセグメントに分割して、向きの値に従って左から右、または右から左に並べ直します。たとえば、XmNlayoutDirection が XmRIGHT_TO_LEFT で、XmNAlignment の値が XmALIGNMENT_BEGINNING ならば、文字列は右フラッシュされます。
以下に示すプログラム例では、「ArabicShaped」というタグを持つレンディションを使用して、XmNlabelString のタイプが XmCHARSET_TEXT である XmLabel が作成されます。レンディションの作成には、「ar」(アラビア語ロケールのロケール名に対応)の XmNlayoutAttrObject が使用されます。また、その出力バッファには Numerals の値として NUMERALS_CONTEXTUAL を、ShapeCharset の値として「iso8859–6」をそれぞれ指定するレイアウト修飾子文字列が使用されています。
ロケール固有のレイアウトモジュールにより、物理文字の出力バッファ内の入力テキストは 16 ビット Unicode コードセットを使用して変換されます。レイアウトロケールが明示的に指定されているため、実行時のロケール設定とは関係なく、このテキストは適切にレンダリングされます。下の例では入力テキストは ISO8859–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);
以下に示すプログラム例では、TextField ウィジェットとレンダーテーブルが 1 個の レンディション により作成されます。擬似リソース XmNlayoutAttrObject および XmNlayoutModifier は両方とも未指定の状態になっているため、デフォルト値 NULL が使用されます。このことはレンディションに関連付けされたレイアウトオブジェクトが存在する場合、それがデフォルトロケールのものであることを示しています。
サンプルプログラムが正しく機能するためには、使用するロケールのコードセットが ISO 8859-6 で、ロケール固有のレイアウトモードが IMPLICIT_BASIC アルゴリズムをサポートしている必要があります。コード例では、レンディションの LayoutObject の ImplicitAlg 値がレンディションの 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);
適切に国際化されたアプリケーションではレンディションおよびレンダーテーブルを、リソースファイルに指定すべきです。レンダーテーブルがファイルとして指定される場合、プログラムの実行ファイルはロケールごとの特定の要求に依存しなくなるため、ロケールの要求に応じて簡単にカスタマイズを行うことができます。
レンダーテーブルをリソースファイルとして指定する場合、次の構文が用いられます。resource_spec:[tag[, tag]*]
ここで tag には、レンディションの XmNtag リソースに適した文字列を指定します。
この行により、指定に従って 1 つまたは複数のレンディションを含む最初のレンダーテーブルが作成されます。レンディションは指定されたタグに添付されます。
resource_spec[*|.] rendition[*|.]resource_name: value
以下の例では、XmRendition に関連付けられた CTL リソースのうち、リソースファイルを使用して設定できるものを紹介します。レイアウトオブジェクトを有効にするには、fontType が FONT_IS_XOC に設定されている必要があります。@ls を使って指定された layoutModifier はレンディションオブジェクトによりレイアウトオブジェクトに受け渡されます。
layoutModifier を使ってレイアウトオブジェクト上に設定可能なリソースの完全な一覧については、『CAE Specification: Portable Layout Services: Context-dependent and Directional Text』(The Open Group: Feb 1997; ISBN 1-85912-142-X; document number C616) を参照してください。
レンダーテーブルを作成するには、テーブルを構成するレンディションがアプリケーションプログラムにより少なくとも 1 個は作成されている必要があります。XmRenderTableAddRenditions() 関数は新しいレンディションをレンダーテーブルに追加します。新しいレンダーテーブルを作成するには、既存のレンダーテーブル名の代わりに NULL を引数に指定して XmRenderTableAddRenditions() 関数を使用します。
以下に示すプログラム例では、XmNfontType を XmFONT_IS_XOC に設定して作成されたレンディションを使用してレンダーテーブルが作成されます。
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=nominal:contextual, shapecharset=iso8859-6"); n++; renditionTag = (XmStringTag) "ArabicShaped"; rendition = XmRenditionCreate(w, renditionTag, args, n); renderTable = XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE); XtVaSetValues(w, XmNrenderTable, renderTable, NULL);