Solaris 共通デスクトップ環境 プログラマーズ・ガイド

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

共通デスクトップ環境 (CDE) は、Motif 2.1 ライブラリ (バグ修正付き) および拡張機能を提供します。さらに、CDE は、OPEN LOOK と Microsoft Windows の特定の機能を提供するために使用できる 4 つのカスタム・ウィジェットを提供します。この章では、これらの Motif カスタム・ウィジェットについて説明します。

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

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

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

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

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

DtMenuButton ウィジェットは、XmCascadeButton ウィジェットのメニュー階層機能を補足するコマンド・ウィジェットです。XmCascadeButton ウィジェットを補うものとして、メニュー・バープルダウン、またはポップアップの外側で示すことができます (MenuPane の内部では XmCascadeButton ウィジェットを使用します)。図 7-1 に、DtMenuButton ウィジェットの使用例を示します。

図 7-1 メニュー・ボタン・ウィジェット (DtMenuButton) の例

Graphic

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

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

デモ・プログラム

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

簡易関数

DtCreateMenuButton() は、CDE ウィジェットを作成する簡易関数です。

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

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

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

クラス

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

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

クラス名は、DtMenuButtonWidget です。

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

リソース

DtMenuButtonWidget は、次のリソースを提供します。これらのリソースのクラス、型、デフォルト、およびアクセスを表 7-1 に示します。

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

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

表 7-1 DtMenuButtonWidget リソース

名前 

クラス 

型 

デフォルト 

アクセス 

DtNcascadingCallback

DtCCallback

XtCallbackList 

NULL 

DtNcascadePixmap

DtCPixmap

Pixmap 

XmUNSPECIFIED_PIXMAP 

CSG 

DtNsubMenuId

DtCMenuWidget

Widget 

NULL 

SG 

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

コールバックのための構造体を次に示し、表 7-2 で説明します。

typedef struct {
 	int 	reason;
 	XEvent	*event;
} XmAnyCallbackStruct;
表 7-2 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)

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

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

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

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

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

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

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

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

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

デモ・プログラム

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

クラス

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

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

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

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

簡易関数

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

ライフ・サイクル関数

DtEditor ライフ・サイクル関数を表 7-3 に示します。

表 7-3 DtEditor ライフ・サイクル関数

関数 

説明 

DtCreateEditor

DtEditor ウィジェットの新規インスタンスとその子を作成します。

DtEditorReset

DtEditor ウィジェットを初期状態に復元します。

入出力関数

DtEditor 入出力関数を表 7-4 に示します。

表 7-4 DtEditor 入出力関数

関数 

説明 

DtEditorAppend

エディタ・ウィジェットの最後に内容データを追加します。 

DtEditorAppendFromFile

エディタ・ウィジェットの最後にファイルの内容を追加します。 

DtEditorGetContents

エディタ・ウィジェットの内容全体を検索します。 

DtEditorInsert

内容データを現在の挿入位置に挿入します。 

DtEditorInsertFromFile

ファイルの内容を現在の挿入位置に挿入します。 

DtEditorReplace

テキストの一部を与えられたデータと置き換えます。 

DtEditorReplaceFromFile

テキストの一部をファイルの内容と置き換えます。 

DtEditorSaveContentsToFile

現在選択されている内容を空白に置き換えます。 

DtEditorSetContents

内容データをエディタ・ウィジェットに読み込んで、ウィジェットの内容全体を置き換えます。 

DtEditorSetContentsFromFile

ファイルの内容をエディタ・ウィジェットに読み込んで、ウィジェットの内容全体を置き換えます。 

選択関数

DtEditor 選択関数を表 7-5 に示します。

表 7-5 DtEditor 選択関数

関数 

説明 

DtEditorClearSelection

現在選択されている内容を空白に置き換えます。 

DtEditorCopyToClipboard

現在選択されている内容をクリップボードにコピーします。 

DtEditorCutToClipboard

現在選択されている内容を削除して、クリップボードに入れます。 

DtEditorDeleteSelection

現在選択されている内容を削除します。 

DtEditorDeselect

選択されている内容を選択解除します。 

DtEditorPasteFromClipboard

クリップボードの内容をエディタ・ウィジェットにペーストして、現在選択されている内容を置き換えます。 

DtEditorSelectAll

エディタ・ウィジェットの内容全体を選択します。 

書式化関数

DtEditor 書式化関数を表 7-6 に示します。

表 7-6 DtEditor 書式化関数

関数 

説明 

DtEditorFormat

エディタ・ウィジェットの内容の全部または一部を書式化します。 

DtEditorInvokeFormatDialog

[書式] ダイアログ・ボックスを表示して、マージンと位置揃えのスタイルに関する書式設定を指定し、書式操作を実行できます。 

検索/変更関数

DtEditor検索/変更関数を表 7-7 に示します。

表 7-7 DtEditArea 検索/変更関数

関数 

説明 

DtEditorChange

文字列の 1 つまたはすべての存在箇所を置換します。 

DtEditorFind

文字列の次の出現箇所を検索します。 

DtEditorInvokeFindChangeDialog

文字列を検索 (オプションで置換も) するためのダイアログ・ボックスを表示します。 

DtEditorInvokeSpellDialog

現在の内容の中でスペルが間違っている単語のリストがあるダイアログ・ボックスを表示します。 

補助関数

DtEditor 補助関数を表 7-8 に示します。

表 7-8 DtEditor 補助関数

関数 

説明 

DtEditorCheckForUnsavedChanges

エディタ・ウィジェットの内容が前回の検索または保存以後に変更されているかどうかを報告します。 

DtEditorDisableRedisplay

ビジュアル属性が変更された場合でも、エディタ・ウィジェットの再表示をしません。 

DtEditorEnableRedisplay

エディタ・ウィジェットの表示の更新を強制します。 

DtEditorGetInsertPosition

エディタ・ウィジェットの挿入カーソル位置を返します。 

DtEditorGetLastPosition

編集ウィンドウの最後の文字の位置を返します。 

DtEditorGetMessageTextFieldID

アプリケーション・メッセージを表示するために使用されるテキスト・フィールド・ウィジェットのウィジェット ID を検索します。 

DtEditorGetSizeHints

エディタ・ウィジェットからサイズ情報を検索します。 

DtEditorGoToLine

挿入カーソルを指定された行へ移動します。 

DtEditorSetInsertionPosition

挿入カーソルの位置を設定します。 

DtEditorTraverseToEditor

エディタ・ウィジェットの編集ウィンドウへのキーボード移動を設定します。 

DtEditorUndoEdit

ユーザが行なった最後の編集を元に戻します。 

リソース

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

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

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

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

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

表 7-9 DtEditor リソース

名前 

クラス 

型 

デフォルト 

アクセス 

DtNautoShowCursorPosition

DtCAutoShowCursorPosition

Boolean 

True 

CSG 

DtNblinkRate

DtCBlinkRate

int 

500 

CSG 

DtNbuttonFontList

DtCFontList

XmFontList 

Dynamic 

CSG  

DtNcolumns

DtCColumns

XmNcolumns 

Dynamic 

CSG 

DtNcursorPosition

DtCCursorPosition

XmTextPosition 

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 

DtNtextFontList

DtCFontList

XmFontList 

Dynamic 

CSG 

DtNtextForeground

DtCForeground

Pixel 

Dynamic 

CSG 

DtNtextTranslations

DtCTranslations

XtTranslations 

NULL 

CS 

DtNtextSelectCallback

DtCCallback

XtCallbackList 

NULL 

DtNtopCharacter

DtCTextPosition

XmTextPosition 

CSG 

DtNwordWrap

DtCWordWrap

Boolean 

True 

CSG 

継承されるリソース

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

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

ローカライズ・リソース

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

ローカライズ・リソースのそれぞれのクラス、型、デフォルト、およびアクセスを表 7-10 にリストします。アクセス欄のコードは、次の作業が可能かどうかを示します。

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

表 7-10 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 ウィジェットは、次の 3 つのコールバック関数をサポートします。

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

typedef struct {
		int     reason;
 	XEvent   *event;
} DtEditorHelpCallbackStruct;
表 7-11 DtEditorHelp コールバックのための構造体

構造体 

説明 

reason

コールバックが呼び出された reason。reason のリストについては、DtEditor(3) のマニュアル・ページを参照してください。

event

このコールバックを呼び出したイベントへのポインタ。値は、NULL になることもあります。 

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