[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]


8 Compound String Textウィジェットの使用

この章では,次の内容について説明します。

8.1 CSTextウィジェットの概要

コンパウンド・ストリングは,文字セットおよび記述情報が一緒に格納されている文字列です。 コンパウンド・ストリングは複数のセグメントから構成され, 文字列内の各セグメントは,それぞれ異なる文字セットおよび記述方向のプロパティを持つことができます。

コンパウンド・ストリングでは,テキスト文字列の文字だけでなく,そのテキスト文字列をワークステーションの画面に表示するために必要な文字セットと記述方向も指定します。 テキスト・ラベルを含むDECwindows Motifツールキットのすべてのウィジェットは,これらのラベルを表すためにコンパウンド・ ストリングを使用します。Compound String Textウィジェットを使用することにより, アプリケーションのユーザは,アプリケーションのユーザ・ インターフェイスを通じて使用される同じ文字セットと記述方向で, テキストの入力および編集を行うことができます。

DECwindows MotifツールキットにはCompound String Textウィジェット, つまりCSTextウィジェットがあり,これを使用するとアプリケーションにテキスト編集機能を与えることができます。CSText ウィジェットは次に示すように, スクロール・バーの付いたものと付いていないものの両方が利用できます。

どちらのCSTextウィジェットを使用しても,アプリケーションのユーザはキーボードを使用してテキストを入力したり, 既存のテキストを編集することができます。2 つのウィジェットの違いは,DXmCreateScrolledCSText ウィジェットが水平または垂直スクロール・バーをサポートするのに対して,DXmCreateCSText はそれらのスクロール・バーをサポートしない点です。

スクロール・バー以外は,どちらのCSTextウィジェットも同じ見た目です。 テキスト入力領域には,テキストを挿入する場所を示すテキスト・カーソルが表示されます。 ウィジェットが入力フォーカスを持っている場合, テキスト・カーソルが点滅し,高輝度で表示されます。ウィジェットが入力フォーカスを持っていない場合, テキスト・カーソルはかすんで表示され, 点滅しません。

CSTextウィジェットのテキスト・カーソルは,現在の編集方向 も示すことができます。編集方向とは文字を挿入または削除できる方向です。 アプリケーションで DXmNbidirectionalCursorリソースをTRUE に設定すると,アプリケーションのユーザはトグル・キー(F17)を押すことによって, 左から右および,右から左の編集方向を切り換えることができます。DXmNbidirectionalCursor の省略時の値はFALSEです。

ユーザがCSTextウィジェットで編集方向を変更すると,方向指示テキスト・ カーソルと呼ばれるテキスト・カーソルの形状が変化し, 新しい編集方向を示します。CSTextウィジェットが入力フォーカスを持たない場合は, そのウィジェットには標準のテキスト・カーソルがかすんで表示されます。 方向指示テキスト・カーソルを持つCSTextウィジェットを作成する方法については, 第8.2.2.7項を参照してください。

ウィジェットはコールバック・メカニズムを使用して,ウィジェット内のテキストが変わるとアプリケーションに通知します。 ただし,ウィジェットはコールバック時, テキストを返さないことに注意してください。 テキストを検索するには,CSTextウィジェットと一緒に,XtGetValues Intrinsicsルーチン,もしくはDECwindows Motifツールキットが提供する支援ルーチンの1 つを使用しなければなりません。このトピックについての詳しい説明は, 第8.2.1.2項を参照してください。

DECwindows Motifツールキットは,CSTextウィジェットに入っているテキストの指定など, 共通して実行される多くのタスクのための支援ルーチンを備えています。 次の各節で,これらの支援ルーチンの使用方法について説明します。 ルーチンのリストについては,表 8-1 を参照してください。

表 8-1 CSTextウィジェットの支援ルーチン

ルーチン名 説明
ウィジェットのテキスト内容の操作
DXmCSTextCopy 現在選択されている( 強調表示されている)テキストをクリップボードに複写する。
DXmCSTextCut 現在選択されている(強調表示されている)テキストを,クリップボードへ複写した後, 削除する。
DXmCSTextGetString CSTextウィジェットの現在値であるコンパウンド・ ストリングを返す。
DXmCSTextInsert 新しいコンパウンド・ ストリングを,コンパウンド・ストリングの指定された位置に挿入する。
DXmCSTextNumLines Compound String Textウィジェットにおける出力行数を返す。
DXmCSTextPaste クリップボード上のデータを, 現在のカーソル位置にあるテキストに貼り付ける。
DXmCSTextRemove 現在選択されている(強調表示されている)テキストを取り除く。
DXmCSTextReplace "from"から"to"までのコンパウンド・ストリングの文字列を, 特定の文字列と置き換える。"from"と"to"は,改行文字を含み,ゼロをベースとする文字オフセットである。
DXmCSTextSetString CSTextウィジェットのテキストを完全に新しいテキストと置き換える。
ウィジェット動作の変更
DXmCSTextHorizontalScroll テキストを特定数のピクセルだけスクロールする。
DXmCSTextGetEditable アプリケーションのユーザが, ウィジェットの現在のテキストの内容を編集できるかどうかを示す論理値を返す。 このルーチンがTRUE (1)を返す場合, ユーザはテキストを編集することができ,FALSE (2)を返す場合, ユーザはテキストを編集することができない。
DXmCSTextGetInsertionPosition 挿入カーソルの位置( オフセット)を返す。
DXmCSTextGetLastPosition 文字列の最後の文字に対応する位置( オフセット)を返す。
DXmCSTextGetMaxLength ウィジェットでユーザが入力できるテキストの最大長を返す。
DXmCSTextGetTopPosition 表示されているテキストの左上( または右上)の文字の位置(オフセット)を返す。
DXmCSTextPosToXY テキスト内の指定された文字の xyの位置を示す。
DXmCSTextXYToPos 指定された xyの位置に一番近い文字のテキスト内の位置を示す。
DXmCSTextSetAddMode CSTextウィジェットが追加モードにあるかどうかを制御する。 追加モードにある場合,ユーザは1次選択に影響を与えることなく, 挿入カーソルを移動することができる。
DXmCSTextSetEditable ユーザがCSTextウィジェットの現在のテキストの内容を編集できるかどうかを示す論理値を設定する。 編集できるようにするには,この値をTRUEに設定する。
DXmCSTextSetHighlight コンパウンド・ ストリングの強調表示になっているモードを変更する。
DXmCSTextSetInsertionPosition 挿入カーソルをソース内の特定の位置(オフセット)に設定する。
DXmCSTextSetMaxLength ウィジェットにおいてユーザが入力できる,改行文字を含む文字のサイズの上限を設定する。
DXmCSTextSetTopPosition 表示されるテキストの左上( または右上)となる位置(オフセット)を設定する。
DXmCSTextShowPosition 特定の位置を強制表示する。
DXmCSTextVerticalScroll 指定した行数だけテキストをスクロールする。
テキスト選択の処理
DXmCSTextClearSelection ウィジェットにおけるコンパウンド・ ストリングの選択を取り消し,テキストの強調表示を解除する。
DXmCSTextGetSelection 選択メカニズムを使用して選択されたコンパウンド・ストリング・ テキストの一部を取得する。選択されたテキストはディスプレイに強調表示される。
DXmCSTextGetSelectionInfo 現在選択されている(強調表示されている) テキストに対応する左と右の位置(オフセット)を返す。 現在選択されているテキストがない場合,FALSEを返す。
DXmCSTextHasSelection Compound String Textウィジェットが現在1次選択を所有している場合,TRUEを返す。
DXmCSTextSetSelection 始点と終点の位置によって指定されているコンパウンド・ストリング・ テキストの一部を選択として設定し,そのテキストを画面に強調表示する。

8.2 CSTextウィジェットのリソースの変更

次の各節では,CSTextウィジェットのリソースとCSTextウィジェット支援ルーチンの使用方法を説明します。

8.2.1 CSTextウィジェットのテキスト内容の操作

CSTextウィジェットは,ユーザ・インターフェイスにおけるテキスト入力機能およびテキスト編集機能を提供します。 実行時(ウィジェットの作成後) にCSTextウィジェットのテキスト内容を操作するには,次の2つの方法のいずれかを使用できます。

支援ルーチンにはXtSetValuesまたはXtGetValuesを使用するのに比べて, 次のような利点があります。

8.2.1.1 コンパウンド・ストリングのCSTextウィジェットへの配置

CSTextウィジェットの作成後,そのウィジェットにコンパウンド・ストリングを配置するには,XtSetValues Intrinsics ルーチンまたは支援ルーチンが使用できます。

XtSetValues Intrinsicsルーチンを使用するには,コンパウンド・ストリングのアドレスをXmNvalue リソースの値として引数リストに指定します( 省略時の設定はNULL)。その後,この引数リストをXtSetValues Intrinsicsルーチンへ渡して,その値をウィジェットのリソースに割り当てます。

CSTextウィジェットの各種支援ルーチンを使用すると,そのウィジェットに入っているテキストを変更したり, テキストをすべて置き換えることができます。

現在CSTextウィジェット内にあるテキストを変更するには, DXmCSTextReplace支援ルーチンを使用します。このルーチンは次の引数を取ります。

テキスト内の位置を,始まりからオフセットとして指定してください。スペースと改行文字を含む文字数を計算して, オフセットを決定します。最初の文字の番号は0 ( ゼロ)です。それ以降の文字には順次番号が付けられます。

新規のコンパウンド・ストリングをコンパウンド・ストリング・テキスト・ ソースの指定位置に挿入するには,DXmCSTextInsertルーチンを使用します。 始点と終点の両方について同じ位置を指定してください。始点と終点を同じ位置として指定しなければ, その始点と終点によって定義されるセクション内のテキストが, 新規のテキストに置き換えられます。

クリップボード上のデータを,現在のカーソル位置にあるテキストへ挿入するには,DXmCSTextPaste ルーチンを使用します。

CSTextウィジェットのすべてのテキストを置き換えるには, DXmCSTextSetStringルーチンを使用してください。このルーチンはXmNvalue リソースに新規のテキストのアドレスを置きます。

8.2.1.2 CSTextウィジェットからのコンパウンド・ ストリングの検索

CSTextウィジェットの現在値を検索するには,XtGetValues Intrinsicsルーチンまたは支援ルーチンが使用できます。

XtGetValues Intrinsicsルーチンを使用するには,コンパウンド・ストリングのアドレスを保持する変数を作成し, この変数をXmNvalueリソースの値として引数リストに指定します。 その後,この引数リストをXtGetValues Intrinsics ルーチンへ渡します。XtGetValues IntrinsicsルーチンはXmNvalue リソースに入っているアドレスを,プログラマが引数リストで指定した変数に書き込みます。 返されたポインタは解放しないでください。

DXmCSTextGetString支援ルーチンを使用すると,CSTextウィジェットの現在の内容を検索できます。 この支援ルーチンはXmNvalueリソースの値を返します。 返されたポインタは解放してください。

例 8-1はDXmCSTextGetStringルーチンの使用方法の一例を示しています。

例 8-1 DXmCSTextGetString支援ルーチンの使用

   .
   .
   .
static void change_cs(w, tag, reason)
     Widget                   w;
     int                      *tag;
     XmNanyCallbackStruct     *reason;
{
    int ac = 0;
    Arg arglist[15];
    XmString  new_text;
    XtCallbackRec   ok_arg[2];

    new_text = DXmCSTextGetString(w);

    ac = 0;
    XtSetArg( arglist[ac], XmNdialogTitle, new_text);ac++;
    XtSetValues (text_shell, arglist, ac);
    .
    .
    .

    XtFree(new_text);

   .
   .
   .

}

8.2.1.3 テキスト編集の禁止

省略時の設定により,ユーザはCSTextウィジェットに入っているテキストを編集することができます。 ただし,XmNeditableリソースをFALSEに設定すると, テキストの編集を禁止することができます(このリソースの省略時の設定はTRUE) 。ウィジェットの作成後にこの値を変更するには, XtSetValues Intrinsicsルーチンまたは支援ルーチンを使用します。

XmNeditableリソースの設定および読み込みには,DXmCSTextSetEditable とDXmCSTextGetEditableの各支援ルーチンを使用します。

8.2.1.4 テキストの長さの制限

XmNmaxLengthリソースを使用すると,ユーザがCSTextウィジェットに入力できるテキストの最大量を指定することができます。 実行時にこのリソースに値を割り当てるには,XtSetValues Intrinsics ルーチンまたはDXmCSTextSetMaxLength 支援ルーチンを使用してください。また, 実行時にこのリソースの値を読み込むには,XtGetValues Intrinsics ルーチンまたはDXmCSTextGetMaxLength支援ルーチンを使用します。例 8-6 にXmNmaxLengthリソースの設定例があります。

8.2.2 CSTextウィジェットの見た目の変更

プログラマはCSTextウィジェットの見た目と機能のうち,次の項目を変更することができます。

以降の節で,これらのリソースについて説明します。

8.2.2.1 サイズの指定

CSTextウィジェットの寸法を指定するには,XmNcolumnsおよびXmNrowsの各リソースを使用します。 これらのリソースは,ウィジェットに入っている文字のサイズを基準にして, ウィジェットのサイズを指定します。文字のサイズはその文字を表示するために使用されるフォントによって決定します。

CSTextウィジェットの幅を指定するには,XmNcolumnsリソースを使用します。 この属性を使用すると,横方向に格納できる文字数によってウィジェットの幅を指定できます。 省略時の値は20文字です。

CSTextウィジェットの高さを指定するには,XmNrowsリソースを使用します。 XmNrows リソースで指定する行数によってCSTextウィジェット全体の高さが決定します。 省略時の値は1です。各行の高さは文字の高さによって決定します。

これら2つの寸法の正確なピクセルの長さは,使用しているフォントにより異なります。DECwindows Motif ツールキットでは,フォントはフォント・ リストで指定され,この場合はXmNfontList引数です。複数のフォントがフォント・ リストで指定されているCSTextウィジェットの最大値は, 指定されているすべてのフォントとXmNcolumnsとXmNrowsの各リソースの単位から決まります。

共通ウィジェットのリソースXmNwidthとXmNheightを使用すると,CSText ウィジェットのサイズをピクセルで指定できますが,この方法は好ましくありません。 フォントのサイズを固定すると,フォントのサイズによってはテキストの文字がそのウィジェット内に収まらない場合があります。

8.2.2.2 マージンの指定

XmNmarginWidthとXmNmarginHeightの各リソースを使用すると,CSTextウィジェットのテキスト入力領域の回りのマージンの大きさを指定することができます。

ウィジェットの境界から文字の配列の始めまでのマージンを指定するには, XmNmarginWidth リソースを使用します。テキストの長さによって, そのテキストの終わりから境界までのマージンが決定されます。このマージンはピクセルで指定してください。 省略時の値は6です。

ウィジェットの上下の境界と,テキスト入力領域の上下の辺との間のマージンを指定するには,XmNmarginHeight リソースを使用します。このマージンはピクセルで指定してください。 省略時の値は6です。

8.2.2.3 サイズ変更動作の制御

ユーザがウィジェットに収まりきらないテキストを入力しても,CSTextウィジェットはそのテキストを収容できるようにウィジェットのサイズを拡大したりしません。 しかし,CSTextウィジェットの各リソースを使用すると, この動作を次の方法で制御することができます。

XmNresizeHeight,XmNresizeWidth,XmNwordWrapのいずれかのリソースを使用することにより,CSText ウィジェットの自動サイズ変更動作を有効にできます。 これらのリソースの省略時の値はFALSEです。

CSTextウィジェットの高さを拡大するように設定するには,XmNresizeHeight リソースをTRUEに設定します。XmNscrollVerticalリソースがTRUE の場合, XmNresizeHeightリソースは無視されます。

CSTextウィジェットの幅を拡大するように設定するには,XmNresizeWidth リソースをTRUEに設定します。XmNresizeWidthリソースがTRUE の場合,たとえ XmNcolumnsを1に設定しても,CSTextウィジェットはサイズを拡大してすべてのテキストを表示します。XmNwordWrap リソースがTRUE の場合,XmNresizeWidthリソースは無視されます。

XmNstringDirectionリソースは,CSTextウィジェットのサイズを拡大する方向を決定します。 たとえば,記述方向が右から左の場合,ウィジェットは右端の桁をその場所に固定して, 左へ拡大します。省略時の設定は左から右です。

XmNwordWrapリソースをTRUEに設定すると,1行がウィジェットの右辺を越える場合に, ウィジェット内にテキストが収まるように行末の単語を新しい行に自動改行するように指定できます。XmNeditMode リソースがXmSINGLE_LINE_EDIT に設定されている場合,このリソースは無視されます。

8.2.2.4 スクロール・バーの位置設定

サイズ変更を制御するもう1つの方法は,スクロールするCSTextウィジェットを作成することです。 これを行うには,アプリケーションでDXmCreateScrolledCSText ルーチンを呼び出して,XmNscrollVerticalまたはXmNscrollHorizontal のいずれかのリソースを設定します。これらのリソースはスクロールしないCSText ウィジェットには影響を与えません。例 8-2 はスクロールするCSTextウィジェットの作成方法を示しています。

例 8-2 例-スクロールするCSTextウィジェットの作成

   .
   .
   .
    ac = 0;
    XtSetArg( arglist[ac], XmNfontList, font_list ); ac++;
    XtSetArg( arglist[ac], XmNx, 40);ac++;
    XtSetArg( arglist[ac], XmNy, 100);ac++;
    XtSetArg( arglist[ac], XmNrows, 2 ); ac++;
    XtSetArg( arglist[ac], XmNcolumns, 35 ); ac++;
    XtSetArg( arglist[ac], XmNmaxLength, 10 ); ac++;
    XtSetArg( arglist[ac], XmNactivateCallback, callback_arg);ac++;
    XtSetArg( arglist[ac], XmNscrollVertical, TRUE);ac++;

    text_w = DXmCreateScrolledCSText(text_shell, "textwidget", arglist, ac );

    XmFontListFree (font_list );

    XtManageChild(text_w);
   .
   .
   .
 }

CSTextウィジェットに垂直または水平スクロール・バーを組み込むと,ウィジェットは追加のテキストに適合するように高さや幅を変更しません。 ユーザはスクロール・バーを使用して,現在見えていないテキストをスクロールすることができます。

省略時の設定では,垂直スクロール・バーはウィジェットの右側に表示されますが, XmNscrollLeftSideリソースをTRUEに設定すると,ウィジェットの左側に表示することができます。 省略時の設定はFALSEです。

省略時の設定では,水平スクロール・バーはウィジェットの下側に表示されますが, XmNscrollTopSideリソースをTRUEに設定すると,ウィジェットの上側に表示することができます。 省略時の設定はFALSEです。

アプリケーションはDXmCSTextHorizontalScrollルーチンおよびDXmCSTextVerticalScroll ルーチンを呼び出して,テキストを指定数のピクセルだけ水平方向にスクロールしたり, 指定した行数だけ垂直方向にスクロールすることができます。

8.2.2.5 テキスト・カーソルの見た目の制御

CSTextウィジェットが入力フォーカスをもっている場合,そのテキスト・ カーソルは点滅します。CSTextウィジェットの各リソースに値を割り当てることにより, 次のことを指定できます。

テキスト・カーソルの点滅速度を指定するには,XmNblinkRateリソースを使用します。 この値はミリ秒単位で指定してください。省略時の値は500 ミリ秒です。

ウィジェットでテキスト・カーソルを表示するかどうかを指定するには, XmNcursorPositionVisibleリソースを使用します。テキスト・カーソルは前景色で描いた場合に表示されます。 テキスト・カーソルを表示したい場合は, この値をTRUEに設定します。省略時の値はTRUEです。

XmNcursorPositionVisibleは,テキスト・カーソルを前景色で描くかどうかだけを指定することに注意してください。 テキスト・カーソルをCSText ウィジェットの現在見えていない部分のテキストに配置すると, そのテキスト・カーソルは表示されません。テキスト・ カーソルをいつもTextウィジェットの見えている部分に置くためには,XmNautoShowCursorPosition リソースを使用します(第8.2.2.6項で説明)。

さらに,現在の編集方向によってテキスト・カーソルの形を変えるかどうかを指定することもできます。 詳しい説明は第8.2.2.7 項を参照してください。

8.2.2.6 挿入点の位置設定

ウィジェットのテキスト内にテキスト・カーソルを配置するには, XmNcursorPositionリソースを使用します。挿入点の位置は,コンパウンド・ ストリングの始点からのオフセットとして指定してください。オフセットは, スペースと改行を含む文字列の文字数を計算して決定します。 文字列における最初の文字の番号は0 (ゼロ)です。それ以降の文字には順次番号が付けられます。

挿入点が常に,スクロール可能なCSTextウィジェットの見えている部分にあるよう指定するには,XmNautoShowCursorPosition をTRUEに設定します。TRUE に設定すると,ウィジェットは挿入点の位置が変わるたびにスクロールし, 挿入点をテキストの見えている部分に保ちます。XmNautoShowCursorPosition の省略時の値はTRUEです。

DXmCSTextGetInsertionPositionルーチンは,挿入カーソルの現在の位置を返します。 この位置は,スペースおよび改行文字を含む文字数を計算して決定されたオフセットです。 最初の文字の番号は0 (ゼロ)で,それ以降の文字には順次番号が付けられます。

テキストを現在のコンパウンド・ストリングの終わりに挿入するには,DXmCSTextGetLastPosition ルーチンを呼び出して,コンパウンド・ ストリングの最後の文字位置を調べます。その後, DXmCSTextSetInsertionPositionルーチンを呼び出し,挿入カーソルを調べた位置に設定します。

8.2.2.7 現在の記述方向および編集方向の識別

DXmNtextPathリソースおよびDXmNeditingPathリソースの値を読み込むことにより,CSText ウィジェットに入っているテキストの現在の記述方向と編集方向を識別できます。

DXmNtextPathリソースは,CSTextウィジェットにおけるテキストの主要な記述方向を示します。 省略時の設定はleft-to-right (左から右)です。 CSTextウィジェットは作成時に,DXmNtextPathリソースの値を,そのウィジェットに入っているコンパウンド・ ストリングで指定された記述方向に設定します。 このコンパウンド・ストリングに複数のセグメントがある場合には,CSText ウィジェットは最初のセグメントの値を使用します。

DXmNeditingPathリソースは,テキストの入力と編集が可能な記述方向を示します。 たとえば,DXmNeditingPathリソースの値がleft-to-right (左から右) の場合,deleteキーは挿入点の左側の文字を削除します。この値がright-to-left ( 右から左)の場合,deleteキーは挿入点の右側の文字を削除します。

ウィジェットの作成時,CSTextウィジェットはDXmNeditingPathリソースの値をDXmNtextPath リソースの値と同じになるように設定します。ただし, DXmNeditingPath リソースの値は,ユーザが編集方向を変更すると変わります( アプリケーションのユーザはトグル・キー[F17]を押すことによって, 編集方向を切り換えることができます)。

CSTextウィジェットはカーソルの形状を変更して,現在の編集方向を示すことができます。 この機能を使用するには,DXmNbidirectionalCursorリソースをTRUE に設定します。省略時の設定では,テキスト・カーソルは編集方向を示しません。

8.2.3 CSTextウィジェットにおけるマルチライン編集

XmTextウィジェットと同様,CSTextウィジェットはマルチライン編集をサポートします。XmText のマルチライン編集については『OSF/Motifプログラマーズ・ガイド』を参照してください。

マルチライン編集はスクロールするCSTextウィジェットを使用しているとき, 特に有用です。マルチライン編集を可能にするためには,アプリケーションは XmNeditMode リソースをXmMULTI_LINE_EDITに設定しなければなりません。 例 8-3は,マルチライン編集を実現するCSText ウィジェットの作成方法を示しています。

例 8-3 マルチライン編集機能をもつCSText ウィジェット

   .
   .
   .
    ac = 0;
    XtSetArg( arglist[ac], XmNfontList, font_list ); ac++;
    XtSetArg( arglist[ac], XmNx, 40);ac++;
    XtSetArg( arglist[ac], XmNy, 100);ac++;
    XtSetArg( arglist[ac], XmNrows, 2 ); ac++;
    XtSetArg( arglist[ac], XmNcolumns, 35 ); ac++;
    XtSetArg( arglist[ac], XmNactivateCallback, callback_arg);ac++;
    XtSetArg( arglist[ac], XmNscrollVertical, TRUE);ac++;
    XtSetArg( arglist[ac], XmNeditMode, XmMULTI_LINE_EDIT);ac++;
    XtSetArg( arglist[ac], XmNvalue,
            XmStringCreateLtoR("Line number 1\nLine number 2",""));ac++;

    text_w = DXmCreateScrolledCSText(text_shell, "textwidget", arglist, ac );
   .
   .
   .

この例はマルチライン編集機能をもつ,スクロールするCSTextウィジェットを作成します。XmNrows 引数はCSTextウィジェットを2行に制限します。 ユーザはスクロール・バーを使用して,追加行を表示することができます。

最初のコンパウンド・ストリングが2行に表示されます。つまり, XmStringCreateLtoRルーチンがテキストを走査して,そのテキストの改行文字を探します。 改行文字が見つかると,そのポイントまでのテキスト( Line number 1) がセグメントに入れられ,そのあとにセパレータ構成要素が続きます。 各セグメントは個別に選択することができます。

省略時の設定により,ユーザはCSTextウィジェットに入っているテキストを編集したり, 追加のテキストを挿入したり,Returnキーを押して改行文字( セグメント)を追加することができます。ただし,XmNeditableリソースをFALSE に設定して,テキストの編集を禁止することもできます。このリソースの省略時の設定はTRUE です。


注意
キーパッドのEnterキーは,マルチライン編集モードであっても, アクティベート・コールバックを生成します。

8.2.4 テキスト選択の処理

DECwindowsあるいはX Window環境で実行しているすべてのアプリケーションは, グローバルな選択機能へアクセスできます。この機能を使用すると, アプリケーションのユーザはポインタ・カーソルを移動することによって, ディスプレイの一部を選択することができます。選択した部分はディスプレイ上に強調表示されます。

CSTextウィジェットは自動的に選択機能をサポートします。さらに,次の機能を実行することもできます。

8.2.4.1 テキストの選択

CSTextウィジェットにおけるテキストの一部を選択するには, DXmCSTextSetSelection支援ルーチンを使用します。このルーチンは次の引数を使用します。

第8.2.1.1項で,コンパウンド・ ストリングにおける位置の決定方法を説明しています。

選択を引き起こしたイベントの時刻印字は,X Eventデータ構造体から取得します。

選択したテキストに挿入点が含まれている場合,選択したテキストはユーザが新しいテキストを入力すると削除されます。XmNpendingDelete リソースをFALSE に設定すると,選択したテキストが削除されないように指定できます。 省略時の設定では,このリソースはTRUEに設定されています。

8.2.4.2 選択したテキストの検索

CSTextウィジェットにおいて選択したテキストを検索するには, DXmCSTextGetSelectionを使用します。選択したテキストはコンパウンド・ ストリングとして返されます。

8.2.4.3 選択したテキストのクリップボードへの複写

DXmCSTextCopyルーチンは,選択した(強調表示されている)テキストをクリップボードへ複写します。

8.2.4.4 選択したテキストのクリップボードからの貼り付け

DXmCSTextPasteルーチンは,クリップボード上のデータを,テキストの現在のカーソル位置に貼り付けます。

8.2.4.5 選択したテキストの削除

DXmCSTextCutルーチンは,選択した(強調表示されている)テキストをクリップボードに複写したのち, それを削除します。

8.2.4.6 選択に関する位置情報の取得

選択した(強調表示されている)テキストの左右の位置を返すには, DXmCSTextGetSelectionInfoルーチンを使用します。挿入カーソルの各ルーチンに関しては, テキスト内の位置はスペースと改行文字を含む文字数を計算して決定されたオフセットです。 最初の文字の番号は0 (ゼロ) で,それ以降の文字には順次番号が付けられます。

DXmCSTextGetSelectionInfoは,現在選択されているテキストがない場合,FALSE を返します。

テキスト内の指定した文字のxyの位置を識別するには,DXmCSTextPosToXY ルーチンを使用します。指定した xyの位置に一番近いテキスト内の文字を識別するには,DXmCSTextXYToPos ルーチンを使用します。

8.2.4.7 1次選択所有権の判断

CSTextウィジェットが1次選択を所有するかどうかを判断するには, DXmCSTextHasSelectionルーチンを使用します。1次選択のメカニズムについての説明は, 『OSF/Motifプログラマーズ・ ガイド』を参照してください。

8.2.4.8 テキストの選択の取り消し

Compound String Textウィジェットにおいてテキストの選択を取り消すには,DXmCSTextClearSelection 支援ルーチンを使用します。 DXmCSTextClearSelectionは,選択したテキストの強調表示を解除します。

8.2.5 コールバックとCStextウィジェットの関連付け

CSTextウィジェットに入っているテキストが変わると,ウィジェットはコールバック・ メカニズムを使用して,アプリケーションに変更を通知します。 ウィジェット内のテキストは,新しいテキストの入力や既存のテキストの編集など, ユーザとアプリケーションの会話の結果として変わることがあります。 プログラムもまた,XtSetValues Intrinsicsルーチンまたは支援ルーチンを使用してCSText ウィジェット内のテキストを変更することにより, コールバックを引き起こすことができます。

さらに,CSTextウィジェットは入力フォーカスを受け入れたり失ったりした際にも, コールバックを実行します。ユーザがキーボードからテキストを入力できるのは,CSText ウィジェットが入力フォーカスを持っているときだけです。 ユーザがCSTextウィジェットの枠内でMB1をクリックすると,CSText ウィジェットは入力フォーカスを取得します。

テキストのセグメントを表示するために必要な文字セットをフォント・リストで見つけられない場合,CSText ウィジェットはコールバックを実行します。 このコールバックで,CSTextウィジェットはフォント・リストにエントリされていない, 必要な文字セットを識別します。CSTextウィジェットはコールバック・ ルーチンが返ると,もう一度フォント・リストを検索してその文字セットを探します。

プログラマがコールバック・ルーチンでCSTextウィジェットのフォント・ リストを更新すると,ウィジェットはそのフォント・リストで文字セットを見つけ, この文字セットのタグが付いたテキストを表示することができます。 コールバック・ルーチンをこのコールバック条件と関連付けなければ,CSText ウィジェットはフォント・リストの2度目の検索を実行しません。CSText ウィジェットはフォント・リストで見つけた最初のフォントを使用します。

CSTextウィジェットが実行するコールバックで返されるデータについての詳しい説明は, 『日本語DECwindows Motif for OpenVMS 拡張機能説明書』(日本語),『DECwindows Extensions to Motif』(英語)を参照してください。

コールバック・ルーチンをCSTextウィジェットと関連付けるには,コールバック・ ルーチン・リストをコールバック・リソースの1つに渡します。 表 8-2に,コールバックの各種リソースの一覧と, これらコールバックを引き起こす条件について説明します。

表 8-2 Textウィジェットのコールバック

コールバック・リソース コールバックの条件
XmNactivateCallback ユーザがアクション( Returnキーを押すことなど)を実行する際に呼び出されるコールバックのリストを指定する。
XmNmodifyVerifyCallback テキストをCSText ウィジェットから削除したり挿入する前に呼び出されるコールバックのリストを指定する。
XmNmotionVerifyCallback 挿入カーソルを新しい位置に移動する前に呼び出されるコールバックのリストを指定する。
XmNvalueChangedCallback CSTextウィジェットに含まれているテキストが変わる際に呼び出されるコールバックのリストを指定する。 このコールバックはユーザとアプリケーションの会話によって引き起こされたり, アプリケーションがXtSetValues Intrinsics ルーチンやCSTextウィジェット支援ルーチンのを使用して, ウィジェット内のテキストを変更したことが理由で呼び出される。
XmNfocusCallback CSTextウィジェットが入力フォーカスを受け入れる前に呼び出される1 つまたは複数のコールバック・ ルーチンを指定する。省略時の設定はNULLである。
XmNlosingFocusCallback CSTextウィジェットが入力フォーカスを失いそうな場合に呼び出される1 つまたは複数のコールバック・ ルーチンを指定する。
XmNhelpCallback ユーザがヘルプ・コールバックを呼び出した際に呼び出される1 つまたは複数のコールバック・ルーチンを指定する。
DXmNnoFontCallback コンパウンド・ストリングのテキストを表示するために必要な文字セットを,CSText ウィジェットがフォント・リストで見つけることができない場合に呼び出される,1 つまたは複数のコールバック・ルーチンを指定する。

8.3 変換ルーチン

DECwindows Motifツールキットにはアプリケーションで使用する変換ルーチンが用意されています。 これらの変換ルーチンは,CSTextウィジェットと一緒に使用すると特に有用です。 変換ルーチンについて,表 8-3に説明します。

表 8-3 変換ルーチン

ルーチン名 説明
DXmCvtCStoFC コンパウンド・ストリングをファイル互換フォーマットの文字列に変換する。 現在はテキスト・フォーマットを使用。
DXmCvtFCtoCS ファイル互換フォーマットの文字列をコンパウンド・ ストリングに変換する。
DXmCvtCStoOS コンパウンド・ ストリングをオペレーティング・システム固有のフォーマットに変換する。 現在はテキスト・フォーマットを使用。
DXmCvtOStoCS オペレーティング・ システム固有のフォーマットの文字列をコンパウンド・ストリングに変換する。
DXmCvtCStoDDIF コンパウンド・ストリングをDDIFフォーマットの文字列に変換する。
DXmCvtDDIFtoCS DDIFフォーマットの文字列をコンパウンド・ストリングに変換する。

8.4 CSTextウィジェットの作成

CSTextウィジェットを作成するには,次の手順を実行してください。

  1. 表 8-4にリストしているウィジェットの作成方法の1 つを使用して,CSTextウィジェットを作成する。

    設定したいウィジェットのリソースへのアクセスを提供する方法を選択する。

    表 8-4 CSTextウィジェットの作成

    方法 CSTextウィジェット
    ツールキット・ルーチン スクロール・ バーをもたないCSTextウィジェットを作成するには, DXmCreateCSTextルーチンを使用する。
    ツールキット・ルーチン 水平または垂直スクロール・ バーをもつCSTextウィジェットを作成するには, DXmCreateScrolledCSTextルーチンを使用する。アプリケーションはXmNscrollVertical またはXmNscrollHorizontalリソースも設定しなければならない。
    UILオブジェクト・ タイプ UILモジュールでCSTextウィジェットを定義するには,UIL オブジェクト・タイプDXmCSTextを使用する。実行時,MRM ルーチンのMrmFetchWidgetがこの定義に従ってウィジェットを作成する。
    UILオブジェクト・タイプ UILモジュールで,スクロールするCSTextウィジェットを定義するには,UIL オブジェクト・タイプDXmScrolledCSTextを使用する。 実行時,MRMルーチンのMrmFetchWidgetがこの定義に従ってウィジェットを作成する。

  2. IntrinsicsルーチンXtManageChildを使用して,CSTextウィジェットを管理する。

これらの手順が終了すると,親ウィジェットがすでに実現されている場合は,CSText ウィジェットがディスプレイに表示されます。

ツールキット・ルーチンとUILは,ウィジェットの作成時に,すべてのリソースへのアクセスを提供します。

CSTextウィジェットを作成するとき,ウィジェットの各種リソースに値を割り当てることにより, そのウィジェットの見た目の初期設定を指定できます。

8.4.1 UILによるCSTextウィジェットの作成

例 8-4は,UILを使用してCSTextウィジェットを作成する方法を示しています。 このCSTextウィジェットは2 行で25桁であり,最初の内容は"Sample Text"です。ウィジェットは変数 cs_fontによって識別されるフォント・リストを使用します。

例 8-4 UILによるCSTextウィジェットの作成

   .
   .
   .
module cstext
    version = 'v1.0'
    names = case_sensitive

procedure
         cstext_activate();

value
    cs_font  : font('-ADOBE-Courier-Bold-R-Normal--14-140-*-*-M-90-ISO8859-1');

object
    cstext_main : DXmCSText {
        arguments
             {
             XmNfontList = cs_font;
             XmNvalue = compound_string("Sample Text");
             XmNx = 20;
             XmNy = 20;
             XmNrows = 2;
             XmNcolumns = 25;
             };
    };

end module;
   .
   .
   .

例 8-5は,このUILモジュールに関連するC ソース・コードを示しています。

例 8-5 UILを使用してCSTextウィジェットを作成するためのC のソース

   .
   .
   .
#include <stdio>
#include <Mrm/MrmAppl.h>
#include <DXm/DXmCSText.h>

Widget toplevel, text_w;

static MrmHierarchy s_MrmHierarchy;
static MrmType *dummy_class;
static char *db_filename_vec[] =
  {"cstext.uid"
  };

int main(argc, argv)
    unsigned int argc;
    char **argv;
{
    XtAppContext app_context;

    MrmInitialize();
    DXmInitialize();

    toplevel = XtAppInitialize(&app_context, "example", NULL, 0, &argc,
                             argv, NULL, NULL, 0);

   /* Open the UID files (the output of the UIL compiler) in the hierarchy*/

    if (MrmOpenHierarchy(1,
      db_filename_vec,
      NULL,
      &s_MrmHierarchy)
      !=MrmSUCCESS)
          printf("can't open hierarchy");

    if (MrmFetchWidget(s_MrmHierarchy, "cstext_main", toplevel,
      &text_w, &dummy_class) != MrmSUCCESS)
        printf("can't fetch widget");

    XtManageChild(text_w);

    XtRealizeWidget(toplevel);

    XtAppMainLoop(app_context);

}

   .
   .
   .

8.4.2 ツールキットのCSTextウィジェット作成ルーチンの使用

第8.4節で説明したように,UIL またはツールキットのウィジェット作成ルーチンを使用して,CSText ウィジェットを実現できます。 例 8-6は, CSTextウィジェットを作成するために,ツールキットのCSTextウィジェット作成ルーチンを使用する方法を示しています。

例 8-6 ツールキットのCSText作成ルーチン

   .
   .
   .
#include <stdio>
#include <Mrm/MrmAppl.h>
#include <DXm/DXmCSText.h>

static void change_cs();
static void ok_text();

Widget toplevel, text_shell,
       text_label, text_w,
       ok_button;

int main(argc, argv)
    unsigned int argc;
    char **argv;
{
    XtAppContext app_context;
    Arg arglist[15];
    int ac = 0;
    XFontStruct *font;
    XmFontList font_list;
    XtCallbackRec   callback_arg[2];

    toplevel = XtAppInitialize(&app_context, "example", NULL, 0, &argc,
                               argv, NULL, NULL, 0);

    ac = 0;
【1】XtSetArg( arglist[ac], XmNdialogTitle,
                         XmStringCreateLtoR("User Defined",""));ac++;
    XtSetArg( arglist[ac], XmNallowOverlap, TRUE);ac++;
    XtSetArg( arglist[ac], XmNheight, 300);ac++;
    XtSetArg( arglist[ac], XmNwidth, 300);ac++;
    XtSetArg( arglist[ac], XmNresizePolicy, XmRESIZE_GROW);ac++;

    text_shell = XmCreateBulletinBoard(toplevel, "CSText", arglist, ac );

    ac = 0;
【2】XtSetArg( arglist[ac], XmNlabelString,
              XmStringCreateLtoR("Enter a 10-letter title\nfor this widget",""));ac++;
    XtSetArg( arglist[ac], XmNx, 90);ac++;
    XtSetArg( arglist[ac], XmNy, 20);ac++;
    text_label = XmCreateLabel(text_shell, "textlabel", arglist, ac );

    font = DXmLoadQueryFont( XtDisplay (toplevel),
                "-ADOBE-Courier-Bold-R-Normal--14-140-*-*-M-90-ISO8859-1");

    if (font == NULL){
               printf("Fonts Are Not Available");
               exit(0);
       }

    font_list = XmStringCreateFontList(font, XmSTRING_DEFAULT_CHARSET);

    callback_arg[0].callback = change_cs;
    callback_arg[0].closure = 0;
    callback_arg[1].callback = NULL;
    callback_arg[1].closure = NULL;

【3】ac = 0;
    XtSetArg( arglist[ac], XmNfontList, font_list ); ac++;
    XtSetArg( arglist[ac], XmNx, 40);ac++;
    XtSetArg( arglist[ac], XmNy, 100);ac++;
    XtSetArg( arglist[ac], XmNrows, 2 ); ac++;
    XtSetArg( arglist[ac], XmNcolumns,35 ); ac++;
    XtSetArg( arglist[ac], XmNmaxLength, 10 ); ac++;
    XtSetArg( arglist[ac], XmNactivateCallback, callback_arg);ac++;

    text_w = DXmCreateCSText(text_shell, "textwidget",arglist, ac );

    XmFontListFree (font_list );

【4】XtManageChild(text_w);

    XtManageChild(text_label);
    XtManageChild(text_shell);

    XtRealizeWidget(toplevel);

    XtAppMainLoop(app_context);

 }

 /* The user entered a new title*/
【5】
static void change_cs(w, tag, reason)
     Widget             w;
     int               *tag;
     unsigned long     *reason;
{
    int ac = 0;
    Arg arglist[15];
    XmString  new_text;
    XtCallbackRec   ok_arg[2];

    new_text = DXmCSTextGetString(w);
    XtUnmanageChild(w);

    ac = 0;
【6】XtSetArg( arglist[ac], XmNdialogTitle, new_text);ac++;
    XtSetValues (text_shell, arglist, ac);

    ac = 0;
【7】XtSetArg( arglist[ac], XmNlabelString,
              XmStringCreateLtoR("Thank You\nPress OK to Exit",""));ac++;
    XtSetValues (text_label, arglist,ac);

    ok_arg[0].callback = ok_text;
    ok_arg[0].closure = 0;
    ok_arg[1].callback = NULL;
    ok_arg[1].closure = NULL;

    ac = 0;
    XtSetArg( arglist[ac], XmNlabelString, XmStringCreateLtoR("OK",""));ac++;
    XtSetArg( arglist[ac], XmNactivateCallback, ok_arg);ac++;
    XtSetArg( arglist[ac], XmNheight, 60);ac++;
    XtSetArg( arglist[ac], XmNwidth, 60);ac++;
    XtSetArg( arglist[ac], XmNx, 125);ac++;
    XtSetArg( arglist[ac], XmNy, 150);ac++;
    ok_button = XmCreatePushbutton(text_shell, "ok", arglist, ac);

     XtFree(new_text);

     XtManageChild(text_label);
     XtManageChild(ok_button);
     XtManageChild(text_shell);

}

 /* The user pressed OK*/

static void ok_text(w, tag, reason)
     Widget             w;
     int               *tag;
     unsigned long     *reason;
{
     exit(1);

}

   .
   .
   .

  1. 親として使用するBulletinBoardウィジェットを作成します。 このサンプル・プログラムはCSTextウィジェットを使用して,BulletinBoard ウィジェットのタイトルを変更します。 BulletinBoardウィジェットの拡大は可能だが,縮小はできないように,XmNresizePolicy リソースをXmRESIZE_GROWに設定します。このように設定しなければ,CSText ウィジェットの管理が解除されたとき,BulletinBoard ウィジェットは縮小します。

  2. Labelウィジェットを作成します。XmNlabelStringリソースには,"Enter a 10-letter title for this widget" という文字列から作成されたコンパウンド・ ストリングが入っています。

  3. 2行,35桁で,最長10文字のCSTextウィジェットを作成します。CSText ウィジェットの見栄えは,10桁でなく35桁で作成されることに注意してください。XmNmaxLength リソースは行や桁の数に関係なく, 入力を10文字に制限します。

  4. CSTextウィジェット,XmLabelウィジェット,BulletinBoardウィジェットを管理して, 最上位のウィジェットを実現します。

  5. CSTextウィジェットにおけるアクティベート・コールバックの結果として,change_cs コールバックが呼び出されます。change_csコールバックはDXmCSTextGetString を呼び出して,CSTextウィジェットのユーザ入力値から作成されたコンパウンド・ ストリングを取得し, CSTextウィジェットの管理を解除します。

  6. BulletinBoardウィジェットのタイトルとして,コンパウンド・ ストリングを使用します。

  7. すると,XmLabelウィジェットのラベルが"Thank You Press OK to Exit"に変わり,BulletinBoard,XmLabel,XmPushbuttonの各ウィジェットが管理されます。 ユーザが「了解」プッシュ・ボタンを押すと, プログラムは終了します。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]