国際化対応言語環境の利用ガイド

XmTextXmTextField

Xm CTL では、XmTextXmTextField が拡張され、ビジュアル的な移動機能と削除機能が追加されました。これは Motif 2.0 CSText ウィジェット以降の機能です。Motif 2.1 の標準の Text および TextField では、論理的順序と物理的順序は区別されません。「次」および「前方」は「右へ」を意味し、「前」および「後方」は「左へ」を意味します。一方、CSText ではこれらは区別されており、物理名だけを用いる一連の動作が新たに定義されています。これらには、たとえば left-character()delete-right-word() などがあります。これらの処理ルーチンはすべてウィジェットの XmNlayoutDirection に依存するように定義されていて、適切な「次の〜」または「前の〜」の動作が呼び出されます。Xm CTL の拡張は CSText の場合よりも多少複雑です。これは、ウィジェットのグローバルな方向だけでなく、疑似 XOC (中立安定を含む) により決定されるカーソルの周囲の物理文字の個々の方向性にも依存するためです。

さらに、選択基準を決定し、レンディションのタグを提供し、揃え方を決定する新しいリソースが追加されています。

新しい Xm CTL の動作は、{Move,Delete,Kill}{Left,Right}{Character,Word} を一つに合成したような動作になっています。以下にその詳細について説明します。

表 7-2 Xm CTL の新しいリソース

名前 

クラス/種類 

アクセス 

デフォルト値 

XmNrenditionTag

XmCRenditionTag/XmRString

CSG 

XmFONTLIST_DEFAULT_TAG

XmNalignment

XmCAlignment/XmRAlignment

CSG 

XmALIGNMENT_BEGINNING

XmNeditPolicy

XmCEditPolicy/XmREditPolicy

CSG 

XmEDIT_LOGICAL

XmNrenditionTag

このウィジェットに対して使用される XmRendition のレンディションタグを指定します。XmRenditionXmnrenderTable リソースに含まれます。

XmNalignment

ウィジェット内で使用されるテキストの揃え方を指定します。XmALIGNMENT_ENDXmALIGNMENT_CENTER だけがサポートされています。

XmNeditPolicy

ウィジェットに対して使用される編集の基準を XmEDIT_LOGICAL または XmEDIT_VISUAL として指定します。XmEDIT_VISUAL を指定すると、選択、カーソル移動、および削除は視覚的に行われます。このリソースを設定すると、同時に標準のキーボード操作の変換規則および削除イベントも、以下に示す新しい「視覚的」な動作リストまたは既存の論理動作に変更されます。

文字の向き決定動作ルーチン

以下のリストに含まれる動作はすべて、指定された方向にある文字の向きの問い合わせを行います。たとえば方向が左から右ならば、対応する形式として next-/forward- または previous-/backward- が呼び出されます。

文字の向き決定の追加動作

Layout Services 変換の OutToInp および Property バッファ (入れ子のレベル用) を使用して、文字の向きを決定します。したがって、ウィジェットの動作は各ロケール固有の変換に依存します。OutToInp バッファや Property バッファの情報が正しくないと、ウィジェットが予想外の動作を行うことがあります。特に Property バッファの情報は大きく影響します。ロケール固有のモジュールがこの仕様の適用範囲から外れている場合、同じテキスト、アプリケーション、リソース値、および LayoutObject 構成に対して行われる双方向の編集動作が、プラットフォームによって異なる場合があります。

ビジュアルモードの動作はセルベースの動作を表示します。論理モードの動作は論理的な文字ベースの動作を生じます。たとえば、delete-right-character() では、ディスプレイセルに対応した入力バッファの文字が削除されます。つまり、LayoutObject 変換の「プロパティ」バイトの「新しいセルのインジケータ」が 1 に設定されている入力バッファの文字 1 個、および「新しいセルのインジケータ」 [Property バッファの詳細については、『CAE Specification』m_transform_layout() の仕様を参照してください。] が 0 である後続のすべての文字が消去されます。

同様に、backward-character() では入力バッファ内で挿入点が 1 つ前に移動します。これに伴い、カーソルは出力バッファ内で関連付けられた文字に対応する表示上の位置に再描画されます。これは、複合表示セル上を移動するにはキーストロークを繰り返す必要があることを意味します。つまり「新しいセルのインジケータ」が 0 の入力バッファ文字 (区別的発音符または合字) を横切って挿入点が移動するため、カーソルの表示位置は実際には変化しません。

このことは、削除動作が論理/入力バッファ側から実行されるか、物理的/出力側の表示セルレベルから実行されることを意味します。入力バッファと出力バッファの間には 1 対 1 の対応関係が存在しないため、厳密な意味での 1 文字単位の削除モードは存在しません。たとえば、1 つの物理文字が論理文字の一部分だけを表しているような場合が考えられます。

XmText 動作ルーチン

XmText の動作ルーチンを以下に示します。

left-character(extend)

XmNeditPolicyXmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルは 1 論理文字分だけ前に移動します。挿入カーソルが行の先頭にある場合、1 つ前の行があればその行の最後の論理文字に移動します。1 つ前の行が存在しない場合には、カーソル位置は変化しません。

XmNeditPolicyXmEDIT_VISUAL ならば、カーソルは 1 つ左に移動します。挿入カーソルが行の先頭にある場合、1 つ前の行があればその行の最後の論理文字に移動します。

extend 引数を指定して left-character() が呼び出されると、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。

left-character() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。extend 引数を指定して呼び出された場合、XmNgainPrimaryCallback プロシージャが呼び出されることがあります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。

left-word(extend)

XmNeditPolicyXmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルがワードの論理的開始位置にあれば、挿入カーソルは 1 つ前の論理ワードの開始位置に移動します。1 つ前の論理ワードが存在しない場合には、挿入カーソルの位置は変化しません。ワード内の、ワードの論理的な先頭以外に挿入カーソルが位置している場合には、挿入カーソルはワードの論理的開始位置に移動します。挿入カーソルが行の論理的開始位置にある場合、挿入カーソルを 1 つ前の行の論理的な最後のワードの始点に移動します。1 つ前の行が存在しない場合には、挿入カーソルの位置は変化しません。

XmNeditPolicyXmEDIT_VISUAL で、引数なしで left-word() が呼び出されると、左側または行の先頭以降の最初の白い空白文字の後の、白以外の最初の空白文字に挿入カーソルを移動します。挿入カーソルがすでにワードの先頭に位置している場合、1 つ前のワードの先頭に挿入カーソルを移動します。挿入カーソルがすでに行の先頭にある場合、1 つ前の行の最後のワードの先頭に移動します。

extend 引数を指定して left-word() が呼び出されると、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。

left-word() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。extend 引数を指定して呼び出される場合、XmNgainPrimaryCallback プロシージャが呼び出されることがあります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。

right-character(extend)

XmNeditPolicyXmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルを 1 論理文字分だけ次に移動します。挿入カーソルが行の論理的な最後尾にある場合、次の行があればその行の先頭に挿入カーソルを移動します。

XmNeditPolicyXmEDIT_VISUAL ならば、カーソルは 1 つ右に移動します。挿入カーソルが行末にある場合、次の行があればその行の最後の論理文字に移動します。

extend 引数を指定して right-character() が呼び出された場合、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。

right-character() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。extend 引数を指定して呼び出される場合、XmNgainPrimaryCallback プロシージャが呼び出される場合があります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。

right-word(extend)

XmNeditPolicyXmEDIT_LOGICAL で、引数なしで呼び出された場合、挿入カーソルは次の論理ワードの開始位置に移動します。次の論理ワードが存在しない場合には、現在のワードの論理的な最後尾に挿入カーソルを移動します。挿入カーソルが行の論理的な最後尾にあるか、行の論理的な最後のワード内にある場合、挿入カーソルは次の行の論理的な先頭ワードに移動します。次の行が存在しない場合、挿入カーソルは現在のワードの論理的な最後尾に移動します。

XmNeditPolicyXmEDIT_VISUAL で、right-word() が引数なしで呼び出された場合、右側または行末以降の最初の白い空白文字の後の、白以外の最初の空白文字に挿入カーソルを移動します。

extend 引数を指定して right-word() が呼び出された場合、現在の選択範囲を延長させながら、引数なしの場合と同じように挿入カーソルを移動します。

right-word() の動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。extend 引数を指定して left-word() が呼び出される場合、XmNgainPrimaryCallback プロシージャが呼び出される場合があります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。

delete-left-character()

XmNeditPolicyXmEDIT_LOGICAL ならば、delete-previous-char と同じです。XmNeditPolicyXmEDIT_VISUAL ならば、次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の 1 文字が削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の 1 文字が削除されます。結果が選択内容に影響を与える場合があります。

delete-left-character() 動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmodifyVerifyCallback プロシージャを呼び出します。また、reason の値として XmCR_VALUE_CHANGED を用いて XmNvalueChangedCallback プロシージャを呼び出します。

delete-right-character()

XmNeditPolicyXmEdit_LOGICAL ならば、delete-next-character と同じです。XmNeditPolicyXmEDIT_VISUAL ならば、次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が削除されます。結果が選択内容に影響を与える場合があります。

delete-right-character() 動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmodifyVerify-Callback プロシージャを呼び出します。また、reason の値として XmCR_VALUE_CHANGED を用いて XmNvalue- ChangedCallback プロシージャを呼び出します。

delete-left-word()

XmNeditPolicyXmEDIT_VISUAL ならば、delete-prev-word() が引数なしで呼び出された場合と同じです。XmNeditPolicyXmEDIT_LOGICAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の文字から次の空白文字、句読点、タブ、または行頭の文字まで削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の文字から次の空白文字、句読点、タブ、または行頭の文字までが削除されます。結果が選択内容に影響を与える場合があります。

delete-right-word()

XmNeditPolicyXmEDIT_VISUAL ならば、kill-right-word() と同じです。XmNeditPolicyXmEDIT_LOGICAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の文字から次の空白文字、句読点、タブ、または行末の文字まで削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の文字から次の空白文字、句読点、タブ、または行末の文字まで削除されます。結果が選択内容に影響を与える場合があります。

kill-left-character()

XmNeditPolicyXmEDIT_LOGICAL ならば、kill-prev-char と同じです。XmNeditPolicyXmEDIT_VISUAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の 1 文字が消去されます。消去された文字はカットバッファに保存されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の 1 文字が削除されます。結果が選択内容に影響を与える場合があります。

kill-left-character() の動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmotionVerifyCallback プロシージャを呼び出します。さらに、reason の値として XmCR_VALUE_CHANGED を用いて XmNvalueChangedCallback プロシージャを呼び出します。

kill-right-character()

XmNeditPolicyXmEDIT_LOGICAL ならば、delete-next-character と同じです。XmNeditPolicyXmEDIT_VISUAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が消去されます。消去された文字はカットバッファに保存されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されず、XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の 1 文字が削除されます。結果が選択内容に影響を与える場合があります。

kill-right-character() の動作は、reason の値として XmCR_MODIFYING_TEXT_VALUE を用いて XmNmotionVerifyCallback プロシージャを呼び出します。さらに、reason の値として XmCR_VALUE_CHANGED を用いて XmNvalueChangedCallback プロシージャを呼び出します。

kill-left-word()

XmNeditPolicyXmEDIT_VISUAL ならば、delete-prev-word() と同じです。XmNeditPolicyXmEDIT_LOGICAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの左側の文字から次の空白文字、句読点、タブ、または行頭の文字まで削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されません。範囲が選択されていない場合は、挿入カーソルの左側の文字から次の空白文字、句読点、タブ、または行頭の文字までが削除され、削除された内容がカットバッファに保存されます。結果が選択内容に影響を与える場合があります。

kill-right-word()

XmNeditPolicyXmEDIT_VISUAL ならば、delete-right-word() と同じです。XmNeditPolicyXmEDIT_LOGICAL ならば次のようになります。すなわち、通常モードで範囲が選択されている場合は、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の文字から次の空白文字、句読点、タブ、または行末の文字まで削除されます。追加モードで、選択されている範囲がある場合は、カーソルは選択範囲から切り離されません。XmNpendingDelete が True に設定され、選択された部分が削除されます。範囲が選択されていない場合は、挿入カーソルの右側の文字から次の空白文字、句読点、タブ、または行末の文字までが削除され、削除された内容がカットバッファに保存されます。結果が選択内容に影響を与える場合があります。

文字合成、合字、区別的発音符などをサポートするため、セルベースのルーチンが提供されています。つまり、1 個のプレゼンテーションセルを占有する 1 個のグリフを用いて、複数の文字を表すことができます。

XmText セルの動作ルーチンを以下に示します。

prev-cell(extend)

1 セル分、挿入カーソルを前に移動します。XmNeditPolicyXmEDIT_LOGICAL ならば、現在のセルよりも論理的に 1 つ前のセルの先頭に挿入カーソルが移動します。1 つ前のセルが存在しない場合には、挿入カーソルは現在のセルの先頭に移動します。

XmNeditPolicyXmEDIT_VISUAL ならば、カーソルはその左側のセルの先頭に移動します。prev-cell() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、引数を指定して呼び出された場合、XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。

forward-cell(extend)

論理的な次のセルの始点に挿入カーソルを移動します。1 つ前のセルが存在しない場合には、現在のセルの最後尾にカーソルを移動します。XmNeditPolicyXmEDIT_LOGICAL ならば、次のセルにカーソルを移動します。

XmNeditPolicyXmEDIT_VISUAL ならば、カーソルはその右側のセルの先頭に移動します。右側にセルが存在しない場合、カーソルは現在のセルの最後尾に移動します。 forward-cell() 動作は、reason の値として XmCR_MOVING_INSERT_CURSOR を用いて XmNmotionVerifyCallback プロシージャを呼び出します。また、引数を指定して呼び出された場合、XmNgainPrimaryCallback プロシージャへの呼び出しが発生する場合があります。詳細については『Motif Programmer's Reference』のコールバックに関する説明を参照してください。