# 共通デスクトップ環境の Motif ウィジェット

共通デスクトップ環境は、Motif ツールキットを提供します。
さらに、 共通デスクトップ環境 は、
OPEN LOOK™と
Microsoft® ウィンドウの特定の機能を提供するために使用できる４つのカスタム・ウィジェットを提供します。 この章では、Motifカスタム・ウィジェットについて説明します。

PG.widgs.mkr.2 PG.widgs.mkr.2
PG.widgs.mkr.3
PG.widgs.mkr.8
PG.widgs.mkr.13
PG.widgs.mkr.17

ウィジェット・ライブラリ、 `libDtWidget`には、既存のMotif 2.1ウィジェットの機能を組み合わせたり、拡張する４つのウィジェットがあります。 :

- `
  DtSpinBox`は、テキスト・フィールドと矢印ボタンを組み合わせたコントロールを作成して、数値またはテキスト値を増減できます。 これは、`XmSimpleSpinBox`によります。

- `
  DtComboBox`は、テキスト・フィールドとリスト・ボックスを組み合わせたコントロールを作成して、テキスト・フィールドに対する多数の有効な選択項目の１つを表示します。 これは、`XmComboBox`によります。

- `
  DtMenuButton`は、メニュー・バーの外側に
  メニュー階層式機能を提供します。

- `
  DtEditor`は、カット＆ペーストなどの単純なテキスト・エディタ関数を組み込みます。

これらのウィジェットは、すべての共通デスクトップ環境アプリケーションに共通の機能を提供します。 これらのウィジェットは、サブクラス化はサポートしていません。

カスタム・ウィジェット・ライブラリは、次のライブラリに直接依存します。:

- `Xm`Motifスーパークラスのサポートについては`Xm` ライブラリ

- ウィジェットの作成と操作については`Xt` ライブラリ

- ベースX ウィンドウ・システムについては`X11`ライブラリ

- `DtEditor`が使用するデスクトップ・サポートについては`DtSvc`

## 共通デスクトップ環境のMotifの使い方

共通デスクトップ環境はMotif 2.1と４つのカスタム・ウィジェットからなります。 カスタム・ウィジェットは、この章で詳しく述べています。

共通デスクトップ環境は、Motif 1.2 アプリケーションとソースおよびバイナリの互換性があります。 既存のMotif 1.2 アプリケーションは、Motif 2.1 インクルード・ファイルを使用してコンパイルできます。 既存のMotif 1.2バイナリは、Motif 2.1ライブラリを使用して変更を行うことなく実行できます。

### Motifライブラリ

Motif 2.1およびX11R6.2 ライブラリは、Xウィンドウ・システム用の共通デスクトップ環境のMotif準拠アプリケーションを開発するために使用します。

#### Motifライブラリ(libXm)

共通デスクトップ環境 は、すべての
Motif 2.1 ヘッダ・ファイルを提供します。

#### Motif UIL ライブラリ(libUil)

Motif ユーザ・インタフェース言語 (UIL)Motif アプリケーションのユーザ・インタフェースの初期状態を記述するための指定言語です。

UILにアクセスするには、
`uil/UilDef.h` ヘッダ・ファイルを組み込みます。

#### Motif リソース・マネージャ・ライブラリ(libMrm)

Motifリソース・マネージャ(MRM)は、UILコンパイラが作成したユーザ・インタフェース定義(UID) ファイルにある定義に基づいて、ウィジェットを作成します。 MRMは、UILコンパイラの出力を解釈し、ウィジェット作成関数に対する適切な引数リストを生成します。 Motifリソース・マネージャにアクセスするには、`libMrm`を使用します。

アプリケーションの中で`libMrm` にアクセスするには、
`Mrm/MrmPublic.h` ヘッダ・ ファイルを組み込みます。

### 強化機能

Motif 2.1 は、OPEN LOOKおよびMicrosoft Windowsのユーザにとってより使いやすくするためのマイナー強化が含まれています。 より使いやすくするための機能としては、次のものがあります。:

- 3ボタン・マウスのボタン２を使用して現在の選択を広げることができます。 この機能は、
  OPEN LOOK ADJUST マウス・ボタンに相当します。

- タブを使用して、`PushButton` ウィジェットとガジェット、 `ArrowButton`ウィジェットとガジェット、および `DrawnButton` ウィジェットのグループ内を移動できます。

- ボタン 3で`CascadeButton` メニューを起動できます。

- `
  XmFileSelectionBox` ウィジェットに３つの新しいリソース(`pathMode, fileFilterStyle,`、および`dirTextLabelStrin`g)を提供し、新しいルック・アンド ・フィールドを与えます。 `XmFileSelectionBox`の新しいリソースの詳細については、共通デスクトップ環境: プログラマ概要を参照してください。

- Motif仮想キーに複数のキーを割り当てることによって、OPEN LOOKおよびMicrosoft Windowsとの相互運用を可能にします。

上記の拡張機能はそれぞれ ウィジェット・リソース( `XmFileSelectionBox`)またはアプリケーション全体のリソース (その他すべて)によって制御できます。このリソースのデフォルト値は、Motif 1.2と同一の動作とAPIを提供します。 これらの拡張機能とリソースの詳細については、 `XmDisplay(3x)`および`XmFileSelectionBox(3x)` のマニュアル・ページを参照してください。

### 外観の強化

共通デスクトップ環境では、次の点で Motifの外観を変更します。 :

- `RadioBox`の塗りつぶしカラーが、状態をより明確に示すように変更されます。

- `RadioBox`の形がダイヤモンド形から円形に変更されます。

- 状態をより明確に示すように、`CheckBox`にチェック絵文字が追加されます。

- `CascadeButtons` とメニュー項目が、アクティブなときには境界に刻み目が付けられるように変更されます。

- スケールと区別するために、読みとり専用スケールからつまみが削除されます。

- デフォルトのシャドウの太さが、１ピクセルに変更されます。

- デフォルトのハイライトの太さが、１ピクセルに変更されます。

- デフォルトの`PushButton`の外観は、ボタンのデフォルトのシャドウの内側にハイライトを描きます。

アプリケーション全体のリソースは、これらの強化機能のそれぞれを制御することができます。 これらのリソースのデフォルト値は、Motif 1.2と同一の動作とAPI を提供します。

これらの強化機能の詳細については、`XmDisplay`(3)、 `XmPushButton`(3)、 `XmPushButtonGadget`(3)、 `XmToggleButton`(3)、 `XmToggleButtonGadget`(3)、および `XmScale`(3)のマニュアル・ページを参照してください。

## テキスト・フィールドと矢印ボタン・ウィジェット (DtSpinBox`)`

`DtSpinBox` は、
テキスト項目のリストを循環させたり、数値入力を増減するために使用します。 `DtSpinBox`は、`XmManager`クラスのサブクラスであり、テキスト・フィールド と２個の矢印を表示するために使用されます。

`DtSpinBox` ウィジェットは、
任意のテキストまたは数値フィールドを増減するために使用されるユーザ・インタフェース・コントロールです。 たとえば、１年の各月または１カ月の各日を循環させることができます。 PG.widgs.mkr.4に、 `DtSpinBox` ウィジェットの例を示します。

### DtSpinBox ウィジェットの例

### ライブラリとヘッダ・ファイル

`DtSpinBox` ウィジェットは、`
libDtWidget` ライブラリにあります。ヘッダ・ファイルは、 `Dt/SpinBox.h`です。

### デモ・プログラム

`DtSpinBox` ウィジェット の使用例が入っているデモが、 `/usr/dt/examples/dtwidget/controls.c`にあります。

### XmSimpleSpinBoxへの変更

Motif 2.1 `DtSimpleSpinBox` ウィジェットを使用するには、クラス、型、および作成 ルーチンの`Dt`名を`Xm`に変更します。 たとえば、コードの中に出てくる `DtSpinBox`のすべてを `XmSimpleSpinBox`に変更します。 一方既存のコードを -DDT_USE_XM_SSPINBOXでコンパイルすることもできます。 この情報は、CDE 1.0 アプリケーションを修正して、Motif 2.1 ウィジェットを使用する場合を配慮して提供されます。

### 簡易関数

`DtSpinBox`ウィジェットのための簡易関数を PG.widgs.mkr.5にリストします。 詳細については、`DtSpinBox`(3)のマニュアル・ページを参照してください。

### DtSpinBox 簡易関数

`関数` | `説明`
`DtCreateSpinBox()` | SpinBox ウィジェットを作成します。
`DtSpinBoxAddItem()` | `DtSpinBox` ウィジェットの指定された位置に項目を追加します。
`DtSpinBoxDeletePos()` | 指定された項目を`DtSpinBox` ウィジェットから削除します。
`DtSpinBoxSetItem()` | `DtSpinBox` ウィジェットに項目を設定します。

### クラス

`DtSpinBoxWidget`は、`Core`、 `Composite`、 `Constraint`、および `XmManager` クラスから動作とリソースを継承します。

クラス・ポインタは、`dtSpinBoxWidgetClass`

クラス名は、`DtSpinBoxWidget`です。

`DtSpinBoxWidget` は、サブクラス化をサポートしません。

### リソース

`DtSpinBox` ウィジェットは、次のウィジェット・リソースのセットを定義します。各リソースのクラス、 型、デフォルト、およびアクセスを PG.widgs.mkr.6 にリストします。

- `DtNarrowLayout`は、`DtSpinBox`の矢印のスタイルと位置を指定します。

- `DtNarrowSensitivity`は、`DtSpinBox`の矢印の感度を指定します。

- `DtNspinBoxChildType`は、`DtSpinBox`のスタイルを指定します。

- `DtNdecimalPoints`は、子の型 が数値のとき、整数値の中の小数点の位置を指定します。

- `DtNincrementValue`は、子の型 が数値のとき、位置を増減する量を指定します。

- `DtNinitialDelay`は、矢印ボタンが連続スピンを始めるまでの時間をミリ秒単位で指定します。

- `DtNnumValues`は、子の型 が文字列のとき、`DtNvalues`リストの項目数を指定します。

- `DtNvalues`は、子の型のリソースが文字列のとき、循環する文字列のリストを指定します。

- `DtNmaximumValue`は、子の型が数値のとき、`DtSpinBox`の上限を指定します。

- `DtNminimumValue`は、子の型が数値のとき、`DtSpinBox`の下限を指定します。

- `DtNmodifyVerifyCallback`は、 `DtSpinBox` の位置が変わる直前に呼び出されます。 アプリケーションは、このコールバックを使用して、新しい位置の設定、特定の値までのスピン、または実行直前の取り消しなど、アプリケーション関連の新しい論理を実現することができます。

- `DtNposition`は、子の型のリソースによって異なる値を持ちます。子の型が文字列のとき、`DtNposition`は、現在の項目の`DtNvalues`リストの索引です。 子の型が数値のとき、`DtNposition`は、最大値から最小値までの範囲内の`DtSpinBox`の整数値です。

- `DtNrepeatDelay`は、ユーザが `DtSpinBox`をスピンしているときに`DtNvalueChangedCallback`を呼び出す間隔を指定するミリ秒単位の数値です。

- `DtNvalueChangedCallback`は、スピン矢印の使用によって`DtNposition`リソースの値が変更されるときに必ず呼び出されます。

詳細については、`DtSpinBox`(3) のマニュアル・ページを参照してください。

### ``DtSpinBoxWidge`t` リソース

`名前` | `クラス` | `型` | `デフォルト` | `アクセス`
`DtNarrowLayout` | `DtCArrowLayout` | `unsigned char` | `DtARROWS_END` | CSG
`DtNarrowSensitivity` | `DtCArrowSensitivity` | `unsigned char` | `DtARROWS_SENSITIVE` | CSG
`DtNspinBoxChildType` | `DtCSpinBoxChildType` | `unsigned char` | `DtSTRING` | CG
`DtNdecimalPoints` | `DtCDecimalPoints` | `short` | `0` | CSG
`DtNincrementValue` | `DtCIncrementValue` | `int` | `1` | CSG
`DtNinitialDelay` | `DtCInitialDelay` | `unsigned int` | `250 ms` | CSG
`DtNnumValues` | `DtCNumValues` | `int` | `0` | CSG
`DtNvalues` | `DtCValues` | `XmStringTable` | `NULL` | CSG
`DtNmaximumValue` | `DtCMaximumValue` | `int` | `10` | CSG
`DtNminimumValue` | `DtCMinimumValue` | `int` | `0` | CSG
`DtNmodifyVerifyCallback` | `DtCCallback` | `XtCallbackList` | `NULL` | C
`DtNposition` | `DtCPosition` | `int` | `0` | CSG
`DtNrepeatDelay` | `DtCRepeatDelay` | `unsigned int` | `200 ms` | CSG
`DtNvalueChangedCallback` | `DtCCallback` | `XtCallbackList` | `NULL` | C

### コールバックのための構造体

コールバックのための構造体を次に示し、 PG.widgs.mkr.7で説明します。

    typedef struct {
     int  reason;
     XEvent *event;
     Widget widget;
     Boolean doit;
     int position;
     XmString value;
     Boolean crossed_boundary;
    } DtSpinBoxCallbackStruct;

### ``DtSpinBox コールバック

`コールバック` | `説明`
reason | このコールバックは、３つの実行可能なreasonを使用します。スピンの最初にコールバックへの最初の呼び出しを行う、またはスピン矢印の１つを起動する場合には、 `DtCR_OK`がreasonです。 `DtSpinBox`が連続でスピンしている場合のreasonは、スピンしている矢印に応じて `DtCR_SPIN_NEXT`か`DtCR_SPIN_PRIOR`になります。
event | このコールバックが呼び出される原因となったイベントへのポインタ `DtSpinBox`が連続でスピンしているときには`NULL`になります。
widget | スピンによって影響を受けるテキスト・ウィジェットのウィジェット識別子
doit | この値は、`call_data`が `DtNmodifyVerifyCallback`から来るときだけ設定します。modifyVerify コールバックの場合、アプリケーションがこのフィールドをどのように設定するかによって、コールバックを開始したアクションを実行するかどうか決まります。 このフィールドにアクションが設定 されたときには、アクションは実行されません。
position | スピンの結果として得られる`DtNposition`リソースの新しい値。
value | スピンの結果として得られるテキスト・ウィジェットに表示される新しい`XmString`の値。 この文字列を `call_data`構造体の範囲を越えて使用する場合には、コピーしなければなりません。
crossed_boundary | この論理値は、スピン・ボックスが循環するとき、および（または） `XmSTRING`の`DtNspinBoxChildType`が最初の項目から最後の項目へ、または最後の項目から最初の項目へ続くときにはTrueです。 `DtNspinBoxChildType`が`XmNUMERIC`のとき、`DtSpinBox`が最大値から最小値まで、または最小値から最大値まで循環するときには、Trueです。

### DtSpinBox ウィジェットの例

次の例は、`DtSpinBox` ウィジェットの作成方法と使用方法を示しています。 このコードは、`/usr/dt/examples/dtwidget`ディレクトリの`controls.c`デモの一部です。

    /*
     * Example code for SpinBox
     */

    #include <Dt/SpinBox.h>

    static char *spinValueStrings[] = {
     “alpha”, “beta”, “gamma”, “delta”,
     “epsilon”, “zeta”, “eta”, “theta”,
     “iota”, “kappa”, “lambda”, “mu”,
     “nu”, “xi”, “omicron”, “pi”,
     “rho”, “sigma”, “tau”, “upsilon”,
     “phi”, “chi”, “psi”, “omega”
    };

    static void ModifyVerifyCb(Widget, XtPointer, XtPointer);

    static void CreateSpinBoxes(Widget parent)
    {
        Widget titleLabel, spinBox;
        XmString *valueXmstrings;
        int numValueStrings;
        XmString labelString;
        Arg args[20];
        int i, n;

        /* Create value compound strings */

        numValueStrings = XtNumber(spinValueStrings);
     valueXmstrings = (XmString *)XtMalloc(numValueStrings
     sizeof(XmString*));
     for (i = 0; i < numValueStrings; i++) {
      valueXmstrings[i] =
       XmStringCreateLocalized(spinValueStrings[i]);
        }

        /* Create title label */

        labelString = XmStringCreateLocalized(“SpinBox Widget”);
        n = 0;
        XtSetArg(args[n], XmNlabelString, labelString); n++;
        titleLabel = XmCreateLabel(parent, “title”, args, n);
        XtManageChild(titleLabel);
        XmStringFree(labelString);

     /*
     * Create a SpinBox containing string values.
     */

        n = 0;
        XtSetArg(args[n], DtNvalues, valueXmstrings); n++;
        XtSetArg(args[n], DtNnumValues, numValueStrings); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        spinBox = DtCreateSpinBox(parent, “spinBox1”, args, n);
        XtManageChild(spinBox);

        /*
      * Create a SpinBox containing numeric values to 3 decimal places.
      * Position the arrows on either side of the displayed value.
      */

        n = 0;
        XtSetArg(args[n], DtNspinBoxChildType, DtNUMERIC); n++;
        XtSetArg(args[n], DtNminimumValue, 1000); n++;
        XtSetArg(args[n], DtNmaximumValue, 100000); n++;
        XtSetArg(args[n], DtNincrementValue,1000); n++;
        XtSetArg(args[n], DtNdecimalPoints,3); n++;
        XtSetArg(args[n], DtNposition,1000); n++;
        XtSetArg(args[n], DtNarrowLayout,DtARROWS_SPLIT); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        spinBox = DtCreateSpinBox(parent, “spinBox2”, args, n);
        XtManageChild(spinBox);

        /*
    * Create a SpinBox containing numeric values to 2 decimal places.
    * Position the arrows on the left of the displayed value.
    * Disallow alternate user changes by adding a modify/verify
     callback.
        */

        n = 0;
        XtSetArg(args[n], DtNspinBoxChildType, DtNUMERIC); n++;
        XtSetArg(args[n], DtNminimumValue, 1500); n++;
        XtSetArg(args[n], DtNmaximumValue, 60500); n++;
        XtSetArg(args[n], DtNincrementValue,1500); n++;
        XtSetArg(args[n], DtNdecimalPoints,2); n++;
        XtSetArg(args[n], DtNposition,7500); n++
     XtSetArg(args[n], DtNarrowLayout,DtARROWS_FLAT_BEGINNING); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        spinBox = DtCreateSpinBox(parent, “spinBox3”, args, n);
        XtManageChild(spinBox);

        XtAddCallback(spinBox, DtNmodifyVerifyCallback, ModifyVerifyCb,
     NULL);

     /*
     * Create a SpinBox containing string values.
     * Position the arrows on the left of the display value
     */

        n = 0;
        XtSetArg(args[n], DtNvalues, valueXmstrings); n++;
        XtSetArg(args[n], DtNnumValues, numValueStrings); n++;
        XtSetArg(args[n], DtNarrowLayout, DtARROWS_BEGINNING); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        spinBox = DtCreateSpinBox(parent, “spinBox4”, args, n);
        XtManageChild(spinBox);

       /*
       * Create a SpinBox containing numeric values to 3 decimal places.
       * Position the arrows on the right of the displayed value.
       */

        n = 0;
        XtSetArg(args[n], DtNspinBoxChildType, DtNUMERIC); n++;
        XtSetArg(args[n], DtNminimumValue, 1000); n++;
        XtSetArg(args[n], DtNmaximumValue, 100000); n++;
        XtSetArg(args[n], DtNincrementValue,1000); n++;
        XtSetArg(args[n], DtNdecimalPoints,3); n++;
        XtSetArg(args[n], DtNposition,1000); n++;
        XtSetArg(args[n], DtNarrowLayout, DtARROWS_FLAT_END); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        spinBox = DtCreateSpinBox(parent, “spinBox5”, args, n);
        XtManageChild(spinBox);

        /*
         * Free value strings, SpinBox has taken a copy.
         */

        for (i = 0; i < numValueStrings; i++) {
      XmStringFree(valueXmstrings[i]);
        }
        XtFree((char*)valueXmstrings);

    }

     /*
     * modify/verify callback.
     *
      * Allow/disallow alternate user changes
      */

    static void ModifyVerifyCb(Widget w, XtPointer cd, XtPointer cb)
    {
        DtSpinBoxCallbackStruct *scb= (DtSpinBoxCallbackStruct*)cb;
        static Boolean allowChange = True;

        scb->doit = allowChange;

        if (allowChange == False) {
     printf(“DtSpinBox: DtNmodifyVerifyCallback.
    Change disallowed.\n”);
     XBell(XtDisplay(w), 0);
        }

        allowChange = (allowChange == True) ? False: True;
    }

## テキスト・フィールドとボックス・ウィジェット(DtComboBox)

`DtComboBox` ウィジェットは、リストとリストの現在の選択項目を表示するために使用します。 このウィジェットは、表示用だけに使用するか、選択可能なコントロールとして使用することができます。

`DtComboBox` ウィジェットは、テキスト・フィールドとリスト・ウィジェットの組み合わせで、テキスト・フィールドに対する有効な選択項目のリストを提供します。 このリストから項目を選択すると、そのリスト項目が自動的にテキスト・フィールドに記入されます。 PG.widgs.mkr.14に、`DtComboBox` ウィジェットの例を示します。

### テキスト・フィールド とリスト・ボックス・ウィジェット (DtComboBox)の例

### ライブラリとヘッダ・ファイル

`DtComboBox` ウィジェットは、`libDtWidget` ライブラリにあります。 ヘッダ・ファイルは、 `Dt/ComboBox.h`です。

### デモ・プログラム

`DtComboBox` ウィジェットの使用例が入っているデモが、 `/usr/dt/examples/dtwidget/controls.c`にあります。

### XmComboBoxへの変更

Motif 2.1 `XmComboBox` ウィジェットを使用するには、 クラス、型、および作成 ルーチンの`Dt`名を`Xm`に変更します。 たとえば、コードの中に出てくる `DtComboBox`のすべてを`XmComboBox`に変更します。一方、既存のコードを -DDT_USE_XM_COMBOBOXでコンパイルできます。 この情報は、CDE 1.0 アプリケーションを修正して、Motif 2.1 ウィジェットを使用する場合を配慮して提供されます。

### 簡易関数

`DtComboBox` ウィジェットは、次の簡易関数を提供しますが、詳細については PG.widgs.mkr.10に示します。

詳細については、`DtComboBox`(3)の マニュアル・ページ を参照してください。

### DtComboBox ウィジェット簡易関数

`関数` | `説明`
`DtCreateComboBox()` | `DtComboBox` ウィジェットを作成します。
`DtComboBoxAddItem()` | `DtComboBox` ウィジェットの指定された位置に項目を追加します。
`DtComboBoxDeletePos()` | 指定された項目を`DtComboBox` ウィジェットから削除します。
`DtComboBoxSetItem()` | `DtComboBox`ウィジェットの`XmList`の中の項目を選択して、それをリスト表示の最初の項目にします。
`DtComboBoxSelectItem()` | `DtComboBox`ウィジェットの `XmList`の中の項目を選択します。

`DtComboBox`は、`XmManager` クラスのサブクラス であり、 `XmList` または`XmScrolledList`を表示するために使われます。

### クラス

`DtComboBox`は、`Core`、`Composite`、 `Constraints`、および`XmManager` クラスから動作とリソースを継承します。

クラス・ポインタは、`dtComboBoxWidgetClass`です。

クラス名は、`DtComboBoxWidget`です。

`DtComboBoxWidget`は、サブクラス化をサポートしません。

### リソース

`DtComboBox`は、次のリソースを提供します。これらのリソースのクラス、 型、デフォルト、およびアクセスを PG.widgs.mkr.11 に示します。

- `DtNmarginHeight` は、テキスト・ウィジェットのトップとボトムの間に追加されるピクセル数と、シャドウの開始位置を指定します。

- `DtNmarginWidth`は、テキスト・ウィジェットの右辺と左辺の間に追加されるピクセル数と、シャドウの開始位置を指定します。

- `DtNselectedItem`は`XmList`に渡され、リストの指定された`XmString`と一致する`DtNitems`の中の単一項目として`XmNselectedItemCount` と`XmNselectedItems`を設定します。

- `DtNselectedPosition`は`XmList` に渡され、リストの指定された位置にある単一項目として `XmNselectedItemCount` と`XmNselectedItems`を設定します。

- `DtNselectionCallback`は、`DtComboBox` ウィジェット・リストから項目が選択されたときに発行されます。

- `DtNcomboBoxType`は、 `DtComboBox`のスタイルの種類を決めます。

リスト・ウィジェット IDは、`XtNameToWidget()`関数を使用してアクセスできます。 これらのウィジェット のリソースを設定することができます。詳細については、`DtComboBox`(3)のマニュアル・ページを参照してください。

アクセス欄のコードは、次のことが可能かどうかを示します。:

- 作成時にリソースを設定する(C)

- `XtSetValues`を使用して設定する (S)

- `XtGetValues`を使用して検索する (G)

### DtComboBox ウィジェット・リソース

`名前` | `クラス` | `型` | `デフォルト` | `アクセス`
`DtNmarginHeight` | `DtCMarginHeight` | `Dimension` | `2` | `CSG`
`DtNmarginWidth` | `DtCMarginWidth` | `Dimension` | `2` | `CSG`
`DtNselectedItem` | `DtCSelectedItem` | `XmString` | `Dimension` | `CSG`
`DtNselectedPosition` | `DtCSelectedPosition` | `int` | `Dimension` | `CSG`
`DtNselectionCallback` | `DtCCallback` | `XtCallbackList` | `XmString` | `C`
`DtNcomboBoxType` | `DtCComboBoxType` | `unsigned char` | `int` | `CG`

### コールバックのための構造体

コールバックのための構造体を次に示し、 PG.widgs.mkr.12で説明します。

    typedef struct {
     int  reason;
     XEvent *event;
     XmString item_or_text;
     int item_position;
    } DtComboBoxCallbackStruct;

### DtComboBoxコールバックのための構造体

`構造体` | `説明`
reason | このコールバックを発行する唯一のreason は、`XmCR_SELECT`です。
event | このコールバック が呼び出される原因となったイベントへのポインタ。 NULLになることもあります。
item_or_text | イベントがコールバックを呼び出したときのテキスト・ウィジェットの内容。 このデータは`call_data` 構造体の範囲でのみ有効で、この範囲外で使用するときにはコピーしなければなりません。
item_position | `DtComboBox` リストの`DtNposition` リソースの新しい値。 値が０の場合、ユーザは`XmTextField` ウィジェットに値を入力したことになります。

### DtComboBoxウィジェットの例

次の例は、`DtComboBox` ウィジェットの作成方法と使用方法を示しています。 このコードは、`/usr/dt/examples/dtwidget`ディレクトリの`controls.c` デモの一部です。

    /*
     * Example code for DtComboBox
     */

    #include <Dt/ComboBox.h>

    static char *comboValueStrings[] = {
     “alpha”, “beta”, “gamma”, “delta”,
     “epsilon”, “zeta”, “eta”, “theta”,
     “iota”, “kappa”, “lambda”, “mu”,
     “nu”, “xi”, “omicron”, “pi”,
     “rho”, “sigma”, “tau”, “upsilon”,
     “phi”, “chi”, “psi”, “omega”
    };

    static char *colorStrings[] = { “Red”, “Yellow”, “Green”, “Brown”,
    “Blue” };

    static void CreateComboBoxes(Widget parent)
    {
        Widget titleLabel, comboBox, list;
        XmString *valueXmstrings, *colorXmstrings;
        int numValueStrings, numColorStrings;
        XmString labelString, xmString;
        Arg args[20];
        int i, n;

        /* Create value compound strings */

        numValueStrings = XtNumber(comboValueStrings);
        valueXmstrings = (XmString *)XtMalloc(numValueStrings *
      sizeof(XmString*));
        for (i = 0; i < numValueStrings; i++) {
      valueXmstrings[i] =

      XmStringCreateLocalized(comboValueStrings[i]);
        }

        /* Create color compound strings */

     numColorStrings = XtNumber(colorStrings);
     colorXmstrings = (XmString *)XtMalloc(numColorStrings *
     sizeof(XmString*));
      for (i = 0; i < numColorStrings; i++) {
      colorXmstrings[i] =

      XmStringCreateLocalized(colorStrings[i]);
        }

        /* Create title label */

        labelString = XmStringCreateLocalized(“ComboBox Widget”);
        n = 0;
        XtSetArg(args[n], XmNlabelString, labelString); n++;
        titleLabel = XmCreateLabel(parent, “title”, args, n);
        XtManageChild(titleLabel);
        XmStringFree(labelString);

        /*
         * Create an editable ComboBox containing the color strings.
         * Get the widget id of the drop down list, add some greek
         * letter names to it, and make more items visible.
         */

        n = 0;
        XtSetArg(args[n], DtNcomboBoxType, DtDROP_DOWN_COMBO_BOX); n++;
        XtSetArg(args[n], DtNitems, colorXmstrings); n++;
        XtSetArg(args[n], DtNitemCount, numColorStrings); n++;
        XtSetArg(args[n], DtNvisibleItemCount, 5); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        comboBox = DtCreateComboBox(parent, “comboBox1”, args, n);
        XtManageChild(comboBox);

        list = XtNameToWidget(comboBox, “*List”);
        XmListAddItems(list, valueXmstrings, 10, 0);
        XtVaSetValues(list, XmNvisibleItemCount, 10, NULL);

        /*
         * Create an editable ComboBox with no entries.
         * Get the widget id of the drop down list, add some greek
         * letter names to it and select the third item in the list.
         */

        n = 0;
        XtSetArg(args[n], DtNcomboBoxType, DtDROP_DOWN_COMBO_BOX); n++;
        XtSetArg(args[n], DtNorientation, DtLEFT); n++;
        XtSetArg(args[n], DtNcolumns, 10); n++;
        comboBox = DtCreateComboBox(parent, “comboBox2”, args, n);
        XtManageChild(comboBox);

        list = XtNameToWidget(comboBox, “*List”);
        XmListAddItems(list, valueXmstrings, 7, 0);
        XtVaSetValues(list, XmNvisibleItemCount, 7, NULL);
        XtVaSetValues(comboBox, DtNselectedPosition, 3, NULL);

        /*
         * Create a non-editable ComboBox containing some greek letter

       names.
         * Position the arrow on the left.
         * Select the `gamma' item in the list.
         */

        n = 0;
        XtSetArg(args[n], DtNorientation, DtLEFT); n++;
        XtSetArg(args[n], DtNitems, valueXmstrings); n++;
        XtSetArg(args[n], DtNitemCount, numValueStrings); n++;
        XtSetArg(args[n], DtNvisibleItemCount, 8); n++;
        comboBox = DtCreateComboBox(parent, “comboBox3”, args, n);
        XtManageChild(comboBox);

        xmString = XmStringCreateLocalized(“gamma”);
        XtVaSetValues(comboBox, DtNselectedItem, xmString, NULL);
        XmStringFree(xmString);

        /*
         * Create a non-editable ComboBox with no entries.
         * Position the arrow on the right.
         * Add the greek letter names to the list and select the fourth
       item.
         */

        n = 0;
        XtSetArg(args[n], DtNorientation, DtRIGHT); n++;
        XtSetArg(args[n], DtNvisibleItemCount, 8); n++;
        comboBox = DtCreateComboBox(parent, “comboBox4”, args, n);
        XtManageChild(comboBox);

     for (i = 0; i < numValueStrings; i++) {
      DtComboBoxAddItem(comboBox, valueXmstrings[i],
      0, True);
        }
        XtVaSetValues(comboBox, DtNselectedPosition, 4, NULL);

        /*
         * Free value and color strings, ComboBox has taken a copy.
         */

     for (i = 0; i < numValueStrings; i++) {
      XmStringFree(valueXmstrings[i]);
        }
        XtFree((char*)valueXmstrings);

     for (i = 0; i < numColorStrings; i++) {
      XmStringFree(colorXmstrings[i]);
        }
        XtFree((char*)colorXmstrings);
    }

## メニュー・ボタン・ウィジェット (DtMenuButton)

`DtMenuButton`ウィジェットは、メニュー区画の外側にメニュー階層機能を提供するために使用します。

`DtMenuButton` ウィジェットは、`XmCascadeButton`ウィジェットの メニュー
階層機能を補足するコマンド・ウィジェットです。 `XmCascadeButton` ウィジェットを補うものとして、`MenuBar`、 `Pulldown`、または `Popup`の外側で示すことができます。 (`MenuPane`の内部では`XmCascadeButton` ウィジェットを使用します。 ) PG.widgs.mkr.9 に、`DtMenuButton` ウィジェットの使用例を示します。

### メニュー・ボタン・ウィジェットの例 (DtMenuButton)

### ライブラリとヘッダ・ファイル

`DtMenuButton` ウィジェットは、`libDtWidget` ライブラリにあります。ヘッダ・ファイルは、 `Dt/MenuButton.h`です。

### デモ・プログラム

`DtMenuButton` ウィジェットの使用例が入っているデモが、 `/usr/dt/examples/dtwidget/controls.c`にあります。

### 簡易関数

`DtCreateMenuButton()`は、共通デスクトップ環境ウィジェットを作成する簡易関数です。

`DtMenuButton` ウィジェットは、`XmLabel` クラスのサブクラスです。視覚的には、 `DtMenuButton` ウィジェットは、ラベル文字とメニュー・グリフを持ちます。メニュー・グリフは、常にウィジェットの右端に表示され、デフォルトでは下向き矢印です。

`DtMenuButton` ウィジェットには、暗黙的に作成されたサブメニューが接続されています。 サブメニュー は、この`DtMenuButton` ウィジェットを親とするポップアップ・メニューです。 暗黙的に作成されたサブメニューの名前は、この`DtMenuButton` ウィジェットの名前の前に `submenu_` を付けたものです。 サブメニューのウィジェット IDは、この`DtMenuButton` ウィジェットの`DtNsubMenuId` リソースに`XtGetValues`を設定することにより取得できます。 暗黙的に作成されたサブメニューは、このウィジェットの利用者によって破壊されることはありません。

サブメニューは、`DtMenuButton`ウィジェットのどこかで[メニュー・ポスト]ボタン(`XmRowColumn`の `XmNmenuPost` リソースを参照)を押すことによって、またはMotifの取り消しキー(通常は[Escape]キー)を押すことによってポップアップすることができます。

### クラス

`DtMenuButtonWidget`は、`Core`、`XmPrimitive`、および`XmLabel` クラスから動作とリソースを継承します。

クラス・ポインタは、`dtMenuButtonWidgetClass`です。

クラス名は、`DtMenuButtonWidget`です。

`DtMenuButtonWidget` は、サブクラス化をサポートしません。

### リソース

`DtMenuButtonWidget`は、次のリソースを提供します。これらのリソースのクラス、型、デフォルト、およびアクセスを PG.widgs.mkr.15 に示します。

- `DtNcascadingCallback`は、接続されたサブメニューが表示される前に呼び出されるコールバックのリストを指定します。

- `DtNcascadePixmap`は、メニュー・グリフとして表示されるピックスマップを指定します。ピックスマップが指定されない場合は、下向き矢印が表示されます。

- `DtNsubMenuId`は、この`DtMenuButton`ウィジェットと関連付けられるポップアップ・メニュー区画のウィジェット IDを指定します。 ポップアップ・ メニュー 区画をこの`DtMenuButton`を親として作成しなければなりません。リソースの設定時にこのウィジェットによってサブメニューが自動的に破壊されるので、ウィジェットの作成時にこのリソースを設定することはできません。

詳細については、`DtMenuButtonWidget`(3)のマニュアル・ページを参照してください。

アクセス欄のコードは、次のことが可能かどうかを示します。:

- 作成時にリソースを設定する(C)

- `XtSetValues`を使用して設定する (S)

- `XtGetValues`を使用して検索する (G)

### DtMenuButtonWidgetリソース

`名前` | `クラス` | `型` | `デフォルト` | `アクセス`
`DtNcascadingCallback` | `DtCCallback` | `XtCallbackList` | `NULL` | `C`
`DtNcascadePixmap` | `DtCPixmap` | `Pixmap` | `XmUNSPECIFIED_PIXMAP` | `CSG`
`DtNsubMenuId` | `DtCMenuWidget` | `Widget` | `NULL` | `SG`

### コールバックのための構造体

コールバックのための構造体を次に示し、 PG.widgs.mkr.16で説明します。

    typedef struct {
     int  reason;
     XEvent *event;
    } XmAnyCallbackStruct;

### DtMenuButtonWidgetコールバックのための構造体

`構造体` | `説明`
reason | コールバックが呼び出されたreasonを返します。
event | コールバックの要因となった`XEvent`へのポインタ。コールバックがXEventによって起動されなかった場合には`NULL`になります。

### DtMenuButton ウィジェットの例

次の例は、`DtMenuButton` ウィジェットの作成方法と使用方法を示しています。 このコードは、`/usr/dt/examples/dtwidget`ディレクトリの`controls.c`デモの一部です。

    /*
     * Example code for DtMenuButton
     */

    #include Dt/DtMenuButton.h

    /* MenuButton custom glyph */

    #define menu_glyph_width 16
    #define menu_glyph_height 16
    static unsigned char menu_glyph_bits[] = {
     0xe0, 0x03, 0x98, 0x0f, 0x84, 0x1f, 0x82, 0x3f, 0x82, 0x3f, 0x81,

     0x7f,
     0x81, 0x7f, 0xff, 0x7f, 0xff, 0x40, 0xff, 0x40, 0xfe, 0x20, 0xfe,

     0x20,
     0xfc, 0x10, 0xf8, 0x0c, 0xe0, 0x03, 0x00, 0x00};

    static void CreateMenuButtons(Widget parent)
    {
        Widget menuButton, submenu, titleLabel, button;
        Pixmap cascadePixmap;
        Pixel fg, bg;
        Cardinal depth;
        XmString labelString;
        Arg args[20];
        int i, n;

        /* Create title label */

        labelString = XmStringCreateLocalized(“MenuButton Widget”);
        n = 0;
        XtSetArg(args[n], XmNlabelString, labelString); n++;
        titleLabel = XmCreateLabel(parent, “title”, args, n);
        XtManageChild(titleLabel);
        XmStringFree(labelString);

        /*
         * Create a MenuButton.
         * Add push buttons to the built-in popup menu.
         */

        labelString = XmStringCreateLocalized(“Action”);
        n = 0;
        XtSetArg(args[n], XmNlabelString, labelString); n++;
     menuButton = DtCreateMenuButton(parent, “menuButton1”, args, n);
        XtManageChild(menuButton);
        XmStringFree(labelString);

        XtVaGetValues(menuButton, DtNsubMenuId, &submenu, NULL);
        button= XmCreatePushButton(submenu, “Push”, NULL, 0);
        XtManageChild(button);
        button = XmCreatePushButton(submenu, “Pull”, NULL, 0);
        XtManageChild(button);
        button = XmCreatePushButton(submenu, “Turn”, NULL, 0);
        XtManageChild(button);

        /*
         * Create a MenuButton.
         * Replace the built-in popup menu with a tear-off menu.
         * Add a custom pixmap in the colors of the MenuButton.
         */

        labelString = XmStringCreateLocalized(“Movement”);
        n = 0;
        XtSetArg(args[n], XmNlabelString, labelString); n++;
     menuButton = DtCreateMenuButton(parent, “menuButton1”, args, n);
        XtManageChild(menuButton);
        XmStringFree(labelString);

        /* Create a tear-off menu */

        n = 0;
        XtSetArg(args[0], XmNtearOffModel, XmTEAR_OFF_ENABLED); n++;
        submenu = XmCreatePopupMenu(menuButton, “submenu”, args, n);
        button = XmCreatePushButton(submenu, “Run”, NULL, 0);
        XtManageChild(button);
        button = XmCreatePushButton(submenu, “Jump”, NULL, 0);
        XtManageChild(button);
        button = XmCreatePushButton(submenu, “Stop”, NULL, 0);
        XtManageChild(button);

        XtVaSetValues(menuButton, DtNsubMenuId, submenu, NULL);

        /* Create a pixmap using the menu button's colors and depth */

        XtVaGetValues(menuButton,
       XmNforeground, &fg,
       XmNbackground, &bg,
       XmNdepth, &depth,
       NULL);

        cascadePixmap = XCreatePixmapFromBitmapData(XtDisplay
      (menuButton),DefaultRootWindow(XtDisplay
      (menuButton)),
      (char*)menu_glyph_bits,
      menu_glyph_width, menu_glyph_height,
      fg, bg, depth);
        XtVaSetValues(menuButton, DtNcascadePixmap, cascadePixmap,

     NULL);
    }

## テキスト・エディタ・ウィジェット (DtEditor)

共通デスクトップ環境テキスト編集システムは、次の２つのコンポーネントから成ります。 :

- グラフィカル・インタフェース、アクション・インタフェース、およびToolTalkインタフェースを介して編集サービスを提供するテキスト・エディタ・クライアントの`dtpad`。

- 次の編集サービスのためのプログラム・インタフェースを提供するエディタ・ウィジェットの `DtEditor`(3)。 :

  - カット＆ペースト

  - 検索と置換

  - 単純な書式化

  - スペルチェック( 8ビット・ロケール用)

  - 以前の編集を元に戻す

  - ASCII テキスト、マルチバイト・テキスト、およびバッファ・データの入出力をサポートする拡張入出力処理機能

  - ファイルの直接読み書きのサポート

Motifテキスト・ウィジェットはプログラム・インタフェースも提供しますが、システム全体で一貫したエディタを使用するアプリケーションは、 `DtEditor`(3) ウィジェットを使用しなければなりません。共通デスクトップ環境のテキスト・エディタとメール・プログラムは、エディタ・ウィジェットを使用します。 このウィジェットは、次のような状況のときに使用してください。:

1. [スペルチェック]、[元に戻す]、および[検索/変更]など、`DtEditor`(3)ウィジェットが提供する機能を使いたい場合。

2. ユーザがファイルからデータを読み込んだり、ファイルにデータを書き込んだりするコードを作成したくない場合。

3. ユーザが入力した文字またはユーザが行ったカーソル移動を調べる必要がないプログラムを作成する場合。

この節では、テキスト・エディタ・ウィジェット`DtEditor`(3)について説明します。

エディタ・ウィジェット・ライブラリは、テキスト・ファイルの作成と編集のためのサポートを提供します。 デスクトップ環境で実行するアプリケーションで、一貫した方法でテキスト・データを編集できるようにします。 `DtEditor`(3) ウィジェットは、テキスト用のスクロールする編集ウィンドウ、オプションのステータス行、およびテキストの検索と置換、スペルチェック、書式オプションの指定を行うためのダイアログから成ります。 テキスト・エディタ・ウィジェットには、ウィジェットをプログラム的に制御するための簡易関数のセットが含まれています。

### ライブラリとヘッダ・ファイル

`DtEditor` ウィジェットは、`libDtWidget` ライブラリにあります。ヘッダ・ファイルは、 `Dt/Editor.h`です。

### デモ・プログラム

`DtEditor` ウィジェットの使用例が入っているデモが、 `/usr/dt/examples/dtwidget/editor.c`にあります。

### クラス

`DtEditor` ウィジェット・クラスについては、ウィジェットのサブクラス化はサポートされません。

`DtEditor` は、`Core`、`Composite`、 `Constraints`、`XmManager`、および`XmForm`クラスから動作とリソースを継承します。

エディタ・ウィジェットのクラス名は、`DtEditorWidget`です。

クラス・ポインタ は、`dtEditorWidgetClass`です。

### 簡易関数

`DtEditor`簡易関数を次の表に示します。

#### ライフ・サイクル関数

`DtEditor`ライフ・サイクル関数を PG.widgs.mkr.18に示します。

#### DtEditor ライフ・サイクル関数

`関数` | `説明`
`DtCreateEditor` | `DtEditor` ウィジェットの新規インスタンス とその子を作成します。
`DtEditorReset` | `DtEditor` ウィジェットを初期状態に復元します。

#### 入出力関数

`DtEditor`入出力関数を PG.widgs.mkr.19に示します。

#### DtEditor 入出力関数

`関数` | `説明`
`DtEditorAppend` | エディタ・ウィジェットの最後に内容データを追加します。
`DtEditorAppendFromFile` | エディタ・ウィジェットの最後にファイルの内容を追加します。
`DtEditorGetContents` | エディタ・ウィジェットの内容全体を検索します。
`DtEditorInsert` | 内容データを現在の挿入位置に挿入します。
`DtEditorInsertFromFile` | ファイルの内容を現在の挿入位置に挿入します。
DtEditorReplace | テキストの一部を与えられたデータと置き換えます。
DtEditorReplaceFromFile | テキストの一部をファイルの内容と置き換えます。
`DtEditorSaveContentsToFile` | 全体の内容をファイルに保存します。
`DtEditorSetContents` | 内容データをエディタ・ウィジェットに読み込んで、ウィジェットの内容全体を置き換えます。
`DtEditorSetContentsFromFile` | ファイルの内容をエディタ・ウィジェットに読み込んで、ウィジェットの内容全体を置き換えます。

#### 選択関数

`DtEditor`選択関数を PG.widgs.mkr.20に示します。

#### DtEditor 選択関数

`関数` | `説明`
`DtEditorClearSelection` | 現在選択されている内容を空白に置き換えます。
`DtEditorCopyToClipboard` | 現在選択されている内容をクリップボードにコピーします。
`DtEditorCutToClipboard` | 現在選択されている内容を削除して、クリップボードに入れます。
`DtEditorDeleteSelection` | 現在選択されている内容を削除します。
`DtEditorDeselect` | 選択されている内容を選択解除します。
`DtEditorPasteFromClipboard` | クリップボードの内容をエディタ・ウィジェットにペーストして、現在選択されている内容を置き換えます。
`DtEditorSelectAll` | エディタ・ウィジェットの内容全体を選択します。

#### 書式化関数

`DtEditor`書式化関数を PG.widgs.mkr.21に示します。

#### DtEditor 書式化関数

`関数` | `説明`
`DtEditorFormat` | エディタ・ウィジェットの内容の全部または一部を書式化します。
`DtEditorInvokeFormatDialog` | [書式]ダイアログ・ボックスを表示して、マージンと位置揃えのスタイルに関する書式設定を指定し、書式操作を実行することができます。

#### 検索/変更関数

`DtEditor`検索/変更関数を PG.widgs.mkr.22に示します。

#### DtEditArea 検索/変更関数

`関数` | `説明`
`DtEditorChange` | 文字列の１つまたはすべての存在箇所を置換します。
`DtEditorFind` | 文字列の次の出現箇所を検索します。
`DtEditorInvokeFindChangeDialog` | 文字列を検索(オプションで置換も)するためのダイアログ・ボックスを表示します。
`DtEditorInvokeSpellDialog` | 現在の内容の中でスペルが間違っている単語のリストがあるダイアログ・ボックスを表示します。

#### 補助関数

`DtEditor`補助関数を PG.widgs.mkr.23に示します。

#### DtEditor 補助関数

`関数` | `説明`
`DtEditorCheckForUnsavedChanges` | エディタ・ウィジェットの内容が前回の検索または保存以後に変更されていれかどうかを報告します。
DtEditorDisableRedisplay | ビジュアル属性が変更された場合でも、エディタ・ウィジェットの再表示をしません。
DtEditorEnableRedisplay | エディタ・ウィジェット の表示の更新を強制します。
`DtEditorGetInsertPosition` | エディタ・ウィジェットの挿入カーソル位置を返します。
`DtEditorGetLastPosition` | 編集ウィンドウの最後の文字の位置を返します。
`DtEditorGetMessageTextFieldID` | アプリケーション・メッセージを表示するために使用されるテキスト・フィールド・ウィジェットのウィジェット IDを検索します。
`DtEditorGetSizeHints` | エディタ・ウィジェットからサイズ情報を検索します。
`DtEditorGoToLine` | 挿入カーソルを指定された行へ移動します。
`DtEditorSetInsertionPosition` | 挿入カーソルの位置を設定します。
`DtEditorTraverseToEditor` | エディタ・ウィジェットの編集ウィンドウへのキーボード移動を設定します。
`DtEditorUndoEdit` | ユーザが行なった最後の編集を元に戻します。

### リソース

`DtEditor` ウィジェットは、次のリソースのセットを提供します。

- `DtNautoShowCursorPosition`にTrueが設定されたとき、スクロール編集ウィンドウに表示されるテキストに挿入カーソルが必ずあるようにします。 挿入カーソル が変わると、エディタの内容をスクロールして、挿入ポイントがウィンドウに入るようにします。

- `DtNblinkRate`は、テキスト・カーソルの点滅間隔をミリ秒単位で指定します。 挿入カーソルの点滅に要する時間は、点滅間隔の2倍です。点滅間隔がゼロに設定されたときには、カーソルは点滅しません。 値を負にすることはできません。

- `DtNbuttonFontList`は、 `DtEditor`のダイアログ・ボックスに表示されるボタンのフォント・リストを指定します。

- `DtNcolumns` は、エディタの初期の幅を整数の文字単位で指定します。 値は０より大きくなければなりません。

- `DtNcursorPosition`は、エディタの中で現在の挿入カーソルが置かれる位置を指定します。 位置は、テキストの先頭からの文字数によって決められます。 最初の 文字位置は０です。

- `DtNcursorPositionVisible`論理値がTrueのとき点滅しているテキスト・カーソルで挿入カーソルの位置をマークします。

- `DtNdialogTitle`は、DtEditorによって表示されるすべてのダイアログのタイトルを指定します。 これには、単語の検索と置換、スペルが間違っている単語、および書式設定のためのダイアログが含まれます。

- `DtNeditable`にTrueが設定されているとき、ユーザはデータを編集できます。 Falseが設定されているときには、ユーザはデータを編集できません。

- `DtNlabelFontList`は、 `DtEditor`ラベルとして使用されるフォント・リストを指定します(ラベルは、ステータス行と`DtEditor`ダイアログ・ボックスに表示されます)。

- `DtNoverstrike`にFalseが設定されているとき、エディタ・ウィジェットに入力された文字は、カーソルの位置に挿入されます ( デフォルト)。Trueが設定されているときには、エディタ・ウィジェットに入力された文字は、挿入カーソルの直後の文字を置き換えます。 行末に達したときには、文字は行末に追加されます。 ステータス行が表示されている場合、 `DtNoverstrike`がTrueのときは `DtNoverstrikeIndicatorLabel` が必ずステータス行に表示されます。

- `DtNrows`は、エディタの初期の高さを文字単位で指定します。 値は０より大きくなければなりません。

- `DtNscrollHorizontal`は、論理値がTrueのときテキストを水平方向にスクロールできるようにするスクロール・バーを追加します。

- `DtNscrollLeftSide`は、論理値がTrueのときスクロール編集ウィンドウの左側に垂直スクロール・バーを置きます。

- `DtNshowStatusLine`は、Trueが設定されたときテキスト・ウィンドウの下にステータス行を表示します。 ステータス行のフィールドには、挿入カーソルの現在の行番号、ドキュメント内の総行数、およびエディタが上書きモードかどうかを表示します。ユーザは、行番号表示に行番号を入力することによって、直接その行を表示することができます。

ステータス行は、アプリケーションによって提供されるメッセージを表示するためのMotifの`XmTextField`(3) ウィジェットも含んでいます。 このフィールドは、アプリケーションが編集中の ドキュメントについての ステータスとフィードバックを表示するのに便利な場所です。 テキスト・フィールドのIDは、 `DtEditorGetMessageTextFieldID`(3)を使用して検索されます。メッセージは、このウィジェットの `XmNvalue`または`XmNvalueWcs` リソースを設定することによって表示されます。 テキスト・フィールドが必要ない場合には、 そのIDで`XtUnmanageWidget`(3) を呼び出すことによって管理から外せます。

- `DtNspellFilter` は、スペルチェックに使用するフィルタを指定します。 関数`DtEditorInvokeSpellDialog`(3)は、`DtNspellFilter`によって指定されたフィルタを使用してエディタの内容をチェックします。 指定されたフィルタは、ファイル名を受け入れて、このファイルの中のスペルが間違っている単語と認識不能の単語のリストを`stdout`に出力しなければなりません。デフォルトのフィルタは、`spell`(1)です。

- `DtNtextBackground`は、編集ウィンドウのバックグラウンドを指定します。

- `DtNtextDeselectCallback` は、編集領域内でテキストが選択されていないときに呼び出される関数を指定します。 コールバックによって送られるreasonは、 `DtEDITOR_TEXT_DESELECT`です。

- `DtNtextFontList` は、`DtEditor` 編集ウィンドウとテキスト・フィールドに使用されるフォント・リストを指定します。 テキスト・フィールドは、ステータス行と`DtEditor`ダイアログ・ボックスに表示されます。

- `DtNtextForeground` は、編集ウィンドウのフォアグラウンドを指定します。

- `DtNtextSelectCallback`は、編集領域内でテキストが選択されたときに呼び出される関数を指定します。コールバックによって送られるreasonは、 `DtEDITOR_TEXT_SELECT`です。

- `DtNtextTranslations` は、編集ウィンドウに追加される変換を指定します。 このリソースで指定された変換は、編集ウィンドウに対して定義された重複する変換を無効にします。 `DtEditor`によって提供される変換のリストにていては、 `DtEditor`(3) マニュアル・ページを参照してください。

- `DtNtopCharacter`は、スクロールした編集ウィンドウの最上部にテキストの位置がある行を表示します。 行は、テキストを左右に移動することなくウィジェットの最上部に表示されます。 位置は、テキストの先頭からの文字数によって決められます。最初の文字位置は０です。

  `DtNtopCharacter`に対する`XGetValues`(3)は、ウィジェットの最上部に表示される行の最初の文字の位置を返します。

- `DtNwordWrap`は、ウィンドウの右端に達したときに、語の切れ目でソフト・キャリッジ・リターンによる行分割を行います。ワードラップは、エディタ・ウィジェットの内容の視覚的外観にだけ影響を及ぼすので注意してください。行分割(ソフト・キャリッジ・リターン)は、テキストに物理的に挿入されるわけではありません。エディタは、ウィジェットの内容が検索されるときまたはファイルに保存されるときに、ハード・キャリッジ・リターンへの置換をサポートします。 詳細については、`DtEditorGetContents`(3) と`DtEditorSaveContentsToFile`(3) のマニュアル・ページを参照してください。

各リソースのクラス、 型、デフォルト、およびアクセスを PG.widgs.mkr.24にリストします。継承クラスのリソース 値を設定することによって、このウィジェットの属性を設定することもできます。`.Xdefaults` ファイルの中で名前またはクラスによってリソースを参照するには、 `DtN`または`DtC`の接頭辞を除いて、残りの文字を使用します。 `.Xdefaults`ファイルでリソースに対して定義済みの値の１つを指定するには、`Dt`接頭辞を除いて、残りの文字を使用します(小文字または大文字で、ただし、語の間に下線を入れています)。

アクセス欄のコードは、次のことが可能かどうかを示します。:

- 作成時にリソースを設定する。(C)

- `XtSetValues`を使用して設定する (S)

- `XtGetValues`を使用して検索する。 (G)

詳細については、`DtEditor`(3)のマニュアル・ページを参照してください。

### DtEditor リソース

`名前` | `クラス` | `型` | `デフォルト` | `アクセス`
`DtNautoShowCursorPosition` | `DtCAutoShowCursorPosition` | `Boolean` | `True` | `CSG`
`DtNblinkRate` | `DtCBlinkRate` | `int` | `500` | `CSG`
DtNbuttonFontList | DtCFontList | XmFontList | Dynamic | CSG
`DtNcolumns` | `DtCColumns` | `XmNcolumns` | `Dynamic` | `CSG`
`DtNcursorPosition` | `DtCCursorPosition` | `XmTextPosition` | `0` | `CSG`
`DtNcursorPositionVisible` | `DtCCursorPositionVisible` | `Boolean` | `True` | `CSG`
`DtNdialogTitle` | `DtCDialogTitle` | `XmString` | `NULL` | `CSG`
`DtNeditable` | `DtCEditable` | `Boolean` | `True` | `CSG`
DtNlabelFontList | DtCFontList | XmFontList | Dynamic | CSG
`DtNmaxLength` | `DtCMaxLength` | `int` | `Largest integer` | `CSG`
`DtNoverstrike` | `DtCOverstrike` | `Boolean` | `False` | `CSG`
`DtNrows` | `DtCRows` | `XmNrows` | `Dynamic` | `CSG`
`DtNscrollHorizontal` | `DtCScroll` | `Boolean` | `True` | `CG`
`DtNscrollLeftSide` | `DtCScrollSide` | `Boolean` | `Dynamic` | `CG`
`DtNscrollTopSide` | `DtCScrollSide` | `Boolean` | `False` | `CG`
`DtNscrollVertical` | `DtCScroll` | `Boolean` | `True` | `CG`
`DtNshowStatusLine` | `DtCShowStatusLine` | `Boolean` | `False` | `CSG`
`DtNspellFilter` | `DtCspellFilter` | `char *` | `Spell` | `CSG`
`DtNtextBackground` | `DtCBackground` | `Pixel` | `Dynamic` | `CSG`
`DtNtextDeselectCallback` | `DtCCallback` | `XtCallbackList` | `NULL` | `C`
DtNtextFontList | DtCFontList | XmFontList | Dynamic | CSG
`DtNtextForeground` | `DtCForeground` | `Pixel` | `Dynamic` | `CSG`
DtNtextTranslations | DtCTranslations | XtTranslations | NULL | CS
`DtNtextSelectCallback` | `DtCCallback` | `XtCallbackList` | `NULL` | `C`
`DtNtopCharacter` | `DtCTextPosition` | `XmTextPosition` | `0` | `CSG`
`DtNwordWrap` | `DtCWordWrap` | `Boolean` | `True` | `CSG`

### 継承されるリソース

`DtEditor`は、次のスーパークラスから動作とリソースを継承します。:

- `XmForm`

- `XmManager`

- `Composite`

- `Core`

詳細については、該当するマニュアル・ページを参照してください。

### ローカライズ・リソース

次のリストは、`DtEditor` ウィジェットとそのダイアログ・ボックスのローカライズのために設計されるウィジェット・リソースのセットを示しています。これらのリソースのデフォルト値は、ロケールに依存します。

- `DtNcenterToggleLabel`は、[書式の設定]ダイアログ・ボックスの中央に揃えるトグル・ボタンのラベルを指定します。Cロケールでのデフォルト値は、[Center]です。

- `DtNchangeAllButtonLabel`は、ドキュメントの中の検索文字列のすべての存在箇所を置換する[検索/変更]ダイアログ・ボックスにあるボタンのラベルを指定します。Cロケールでのデフォルト値は、[Change All]です。

- `DtNchangeButtonLabel`は、ドキュメントの中の検索文字列の次の存在箇所を置換する[検索/変更]ダイアログ・ボックスにあるボタンのラベルを指定します。Cロケールでのデフォルト値は、[Change]です。

- `DtNchangeFieldLabel`は、ユーザが置換文字列を指定する[検索/変更]ダイアログ・ボックスにあるフィールドのラベルを指定します。Cロケールでのデフォルト値は、[Change To]です。

- `DtNcurrentLineLabel`は、ステータス行の現在の行番号フィールドのラベルを指定します。Cロケールでのデフォルト値は、[Line]です。

- `DtNfindButtonLabel`は、ドキュメントの中の検索文字列の次の存在箇所を検索する[検索/変更]ダイアログ・ボックスにあるボタンのラベルを指定します。Cロケールでのデフォルト値は、[Find]です。

- `DtNfindChangeDialogTitle`は、[検索/変更]ダイアログ・ボックスのタイトルを指定します。 `DtNdialogTitle` がヌルでない場合は、このリソースの前面に追加されてタイトルを形成します。Cロケールでのデフォルト値は、[ Find/Change] です。

- `DtNfindFieldLabel`は、ユーザが検索文字列を指定する[検索/変更]ダイアログ・ボックスにあるフィールドのラベルを指定します。Cロケールでのデフォルト値は、[Find]です。

- `DtNformatAllButtonLabel`は、ドキュメント全体を書式化する[書式の設定]ダイアログ・ボックスにあるボタンのラベル を指定します。Cロケールでのデフォルト値は、[All]です。

- `DtNformatParagraphButtonLabel`は、挿入カーソルを含んでいるパラグラフを書式化する[書式の設定]ダイアログ・ボックスにあるボタンのラベル を指定します。Cロケールでのデフォルト値は、[Paragraph]です。

- `DtNformatSettingsDialogTitle`は、[書式の設定]ダイアログ・ボックスのタイトルを指定します。 DtNdialogTitleがヌルでない場合は、このリソースの前面に追加されてタイトルを形成します。Cロケールでのデフォルト値は、[Format Setting]です。

- `DtNinformationDialogTitle`は、ユーザにフィードバックと一般情報を提示するのに使用される[インフォメーション]ダイアログ・ボックスのタイトルを指定します。 `DtNdialogTitle`がヌルでない場合は、このリソースの前面に追加されてタイトルを形成します。Cロケールでのデフォルト値は、[Information]です。

- `DtNjustifyToggleLabel`は、[書式の設定]ダイアログ・ボックスにある両端揃えトグルボタンを指定します。Cロケールでのデフォルト値は、[Justify]です。

- `DtNleftAlignToggleLabel`は、[書式の設定]ダイアログ・ボックスにある左揃えトグルボタンのラベルを指定します。Cロケールでのデフォルト値は、[ Left Align]です。

- `DtNleftMarginFieldLabel`は、[書式の設定]ダイアログ・ボックスにある左マージン値フィールドのラベルを指定します。Cロケールでのデフォルト値は、[Left Margin]です。

- `DtNmisspelledListLabel`は、[スペルチェック]ダイアログ・ボックスにある認識不能のまたはスペルが間違っている単語のリストのラベルを指定します。Cロケールでのデフォルト値は、[Misspelled Words]です。

- `DtNoverstrikeLabel`は、エディタが上書きモードであることを示すステータス行にあるラベルを指定します。Cロケールでのデフォルト値は、[Overstrike]です。

- `DtNrightAlignToggleLabel`は、[書式の設定]ダイアログ・ボックスにある右揃えトグルボタンのラベルを指定します。Cロケールでのデフォルト値は、[Right Align]です。

- `DtNrightMarginFieldLabel`は、[書式の設定]ダイアログ・ボックスにある右マージン値フィールドのラベル を指定します。Cロケールでのデフォルト値は、[Right Margin]です。

- `DtNspellDialogTitle`は、[書式の設定]ダイアログ・ボックスのタイトルを指定します。 `DtNdialogTitle`がヌルでない場合は、このリソースの前方に追加されてタイトルを形成します。Cロケールでのデフォルト値は、[Spell]です。

- `DtNtotalLineCountLabel` は、ドキュメントの総行数を示すステータス 行にあるディスプレイのラベル を指定します。Cロケールでのデフォルト値は、[Total]です。

ローカライズ・リソースのそれぞれのクラス、型、デフォルト、およびアクセスを PG.widgs.mkr.25にリストします。アクセス欄のコードは、次のことが可能かどうかを示します。 :

- 作成時にリソース を設定する(C)

- `XtSetValues`を使用して設定する (S)

- `XtGetValues`を使用して検索する。 (G)

詳細については、`DtEditor`(3)のマニュアル・ページを参照してください。

### DtEditor ローカライズ・リソース

`名前` | `クラス` | `型` | `デフォルト` | `アクセス`
`DtNcenterToggleLabel` | `DtCCenterToggleLabel` | `XmString` | `Dynamic` | `CSG`
`DtNchangeAllButtonLabel` | `DtCChangeAllButtonLabel` | `XmString` | `Dynamic` | `CSG`
`DtNchangeButtonLabel` | `DtCChangeButtonLabel` | `XmString` | `Dynamic` | `CSG`
`DtNchangeFieldLabel` | `DtCChangeFieldLabel` | `XmString` | `Dynamic` | `CSG`
`DtNcurrentLineLabel` | `DtCCurrentLineLabel` | `XmString` | `Dynamic` | `CSG`
`DtNfindButtonLabel` | `DtCFindButtonLabel` | `XmString` | `Dynamic` | `CSG`
`DtNfindChangeDialogTitle` | `DtCFindChangeDialogTitle` | `XmString` | `Dynamic` | `CSG`
`DtNfindFieldLabel` | `DtCFindFieldLabel` | `XmString` | `Dynamic` | `CSG`
`DtNformatAllButtonLabel` | `DtCFormatAllButtonLabel` | `XmString` | `Dynamic` | `CSG`
`DtNformatParagraphButtonLabel` | `DtCFormatParagraphButtonLabel` | `XmString` | `Dynamic` | `CSG`
`DtNformatSettingsDialogTitle` | `DtCFormatSettingsDialogTitle` | `XmString` | `Dynamic` | `CSG`
`DtNinformationDialogTitle` | `DtCInformationDialogTitle` | `XmString` | `Dynamic` | `CSG`
`DtNjustifyToggleLabel` | `DtCJustifyToggleLabel` | `XmString` | `Dynamic` | `CSG`
`DtNleftAlignToggleLabel` | `DtCLeftAlignToggleLabel` | `XmString` | `Dynamic` | `CSG`
`DtNleftMarginFieldLabel` | `DtCLeftMarginFieldLabel` | `XmString` | `Dynamic` | `CSG`
`DtNmisspelledListLabel` | `DtCMisspelledListLabel` | `XmString` | `Dynamic` | `CSG`
`DtNoverstrikeLabel` | `DtCOverstrikeLabel` | `XmString` | `Dynamic` | `CSG`
`DtNrightAlignToggleLabel` | `DtCRightAlignToggleLabel` | `XmString` | `Dynamic` | `CSG`
`DtNrightMarginFieldLabel` | `DtCRightMarginFieldLabel` | `XmString` | `Dynamic` | `CSG`
`DtNspellDialogTitle` | `DtCSpellDialogTitle` | `XmString` | `Dynamic` | `CSG`
`DtNtotalLineCountLabel` | `DtCTotalLineCountLabel` | `XmString` | `Dynamic` | `CSG`

### コールバック関数

`DtEditor` ウィジェットは、次の３つのコールバック関数をサポートします。:

- `DtEditorNHelpCallback`

- `DtNtextSelectCallback`

- `DtNtextDeselectCallback`

エディタ・ウィジェットとそのダイアログ・ボックスについてのヘルプ情報を提示したい場合は、 `XmNhelpCallback` リソース を設定し、`DtEditorHelpCallbackStruct`の一部として渡されるreason フィールドを使用して、[ヘルプ]ダイアログ・ボックスの内容を設定します。次の構造体へのポインタが`XmNHelpCallback`に渡されます。 コールバックのための構造体を次に示し、 PG.widgs.mkr.26で説明します。

    typedef struct {
     int       reason;
     XEvent    *event;
    } DtEditorHelpCallbackStruct;

### DtEditorHelp コールバックのための構造体

`構造体` | `説明`
reason | コールバックが呼び出されたreason。 reasonのリストについては、`DtEditor`(3) のマニュアル・ページ を参照してください。
event | コールバックを呼び出したイベントへのポインタ。値は、NULLになることもあります。

テキストが選択されているかどうかによってメニュー項目とコマンドを有効か無効にしたいときには、`DtNtextSelectCallback`リソースおよび`DtNtextDeselectCallback`リソースを使用します。 `DtNtextSelectCallback`は、編集ウィンドウでテキストが選択されたときに呼び出される関数を指定します。 `DtNtextDeselectCallback`は、編集ウィンドウでテキストが選択されていないときに呼び出される関数を指定します。 コールバックによって送られるreasonは、 `DtEDITOR_TEXT_SELECT`と`DtEDITOR_TEXT_DESELECT`です。