# CDE印刷のウィジェットとAPI

CDEユーザは、一般的に、一連のダイアログを介してファイルをプリントします。 最初のファイルはたとえばファイルをプリントするプルダウン・メニューを選択することで初期化されます。 この章では、主にXプリントを行なうアプリケーションに使用されるCDEnextが提供するダイアログ・セットを示します。

- 初期プリント・ダイアログは、`DtPrintSetupBox`ウィジェットとして提供されます。 このウィジェットは、一般的なプリント・オプションのセット、アプリケーションに固有なプリント・オプションのセット、および、プリント操作を開始したり、取り消したりする下部のコマンド・ボタンのセットからなっています。 またそれは、プリント・ダイアログ・マネージャ(PDM)やヘルプ・ダイアログを伴います。

- `DtPrinterSelectionDialog`でXプリンタを選択します。 また、`DtPrintSetupBox`ウィジェットを介してアクセス可能です。

- 追加のプリンタ情報獲得ダイアログである `DtPrinterInfoDialog`は、 `DtPrintSetupBox`または `DtPrinterSelectionDialog`を介してアクセス可能です。

ユーザが、プリントするファイルを選択できる、ファイル選択ダイアログ (`DtPrintSetupBox`を介してアクセス可能)もあります。 これらすべてのサブ・ダイアログは`DtPrintSetupBox`ウィジェットの一部と考えられるので、それらに外部APIはありません。

しかし、`DtPrintSetupBox`は主にXプリントのために設計されています。 またプリントするどのCDEnextアプリケーションでも使用できる、一般的なアプリケーション・プリント・ダイアログとして使用できるようにも、設計されています。 `DtPrintSetupBox`はまた、追加プリンタやスプーラ固有のXプリント設定ダイアログを提供するプリント・ダイアログ・マネージャとの単純統合もできるように設計されています。

本章の残りの節では、DtPrint簡易関数、DtPrintダイアログ・マネージャ、および印刷ウィジェットとヘルプの統合方法について示します。

## DtPrint関数

この節では、DtPrint関数の概要を述べます。 `/proj/cde/examples/dtprint`ディレクトリに 使用法を示したコード例があります。

`DtPrintSetupBox`

- `DtPrintSetupBox`はウィジェットで、アプリケーションからの印刷に先立って、各種オプション設定用に使用される典型的な初期ウインドウです。 このウィジェットは、Xプリント・サービスを利用するアプリケーションが使用できるように主として設計されています。 しかし、ウィジェット・インタフェースはまた、ほかの印刷方法を使っているアプリケーションでも使用できるよう柔軟に設計されてもいます。

`DtCreatePrintSetupBox`

- `DtCreatePrintSetupBox`は、 `DtPrintSetupBox`ウィジェットの管理されていないインスタンスを作成し、そのウィジェットIDを返す簡易関数です。

`DtCreatePrintSetupDialog`

- `DtCreatePrintSetupDialog`は、 `DtPrintSetupBox`ウィジェットを持つダイアログのインスタンスを作成し、`DtPrintSetupBox`ウィジェットのIDを返す簡易関数です。

`DtPrintFillSetupData`

- `DtPrintFillSetupData`は、 `DtPrintSetupBox`との直接的会話型以外の状況で(たとえば、ツールバー上の[簡易印刷]ボタンなど)、Xプリント・ジョブを初期化するためのXプリンタとの接続を獲得するために使用されます。 このプリンタ接続情報は、既存の`DtPrintSetupBox`ウィジェットのインスタンスから獲得できます。 また、もし`DtPrintSetupBox`ウィジェットのインスタンスが無効な場合、`DtPrintFillSetupData`では、新しいXプリンタとの接続を提供できます。

`DtPrintCopySetupData`

- `DtPrintCopySetupData`は、 `DtPrintSetupData`構造をコピーするために使用されます。 ターゲットの要素は、ソースの対応する要素と異なっている場合だけ更新されます。 割り当てられたメモリをポイントする要素について、 `DtPrintCopySetupData`は、ターゲットの更新された要素に対して、新しいメモリを割り当てます。 ターゲットの既存の要素は解放されます。 `DtPrintSetupData`構造中のすべての要素は、 `DtPrintFreeSetupData`を呼び出すことで解放できます。

`DtPrintFreeSetupData`

- `DtPrintSetupData`構造の要素がポイントするメモリを解放します。

`DtPrintResetConnection`

- `DtPrintResetConnection`は、 `DtPrintSetupBox`ウィジェットが提供する簡易関数です。 そのウィジェットは、アプリケーションがウィジェットに命じて、Xプリント・サーバ接続の管理を中止させることができます。 モード・パラメタは、ウィジェットに命じてプリント接続をクローズしたり、それをクローズしないで単に接続の制御を放棄するために含まれます。

  `DtPrintResetConnection`は、プリント処理を実行する子プロセスをフォークするアプリケーションで使用されることを意図しています。 フォークを実行した直後、親プロセスはそのXプリント・サーバ接続をクローズし、ビデオXサーバとの接続を保存します。 一方、フォークされた子はそのビデオXサーバとの接続をクローズし、Xプリント・サーバ接続でのプリント処理を実行します。

`DtPrintSetupProc`

- `DtPrintSetupProc`は、 `DtPrintSetupBox`ウィジェットの手続きリソース用型定義です。

`DtPrinterSelectionDialog`

- `DtPrinterSelectionDialog`によって、クライアント・サーバ用の(サーバがXp拡張子をサポートしている場合に提供される)プリンタの完成したリストから、ユーザはXプリンタを選択することができます。 加えて、`XpServerList`リソース、または、`XPSERVERLIST`環境変数で示される各サーバも、同様に選択することができます。 ユーザは、一般的に、一つのプリンタを選択し、[OK]ボタンを押して、選択されたプリンタを呼び出し側に返します。

## プリント・ダイアログ・マネージャ

プリント・ダイアログ・マネージャ(PDM)は、Xプリント・サーバとXプリント・アプリケーションとを切り離します。 それらは、プリンタ固有またはスプーラ固有のGUIを設定します。 アプリケーションではそれらGUI自身を理解したり、表示したりできます。 しかし、新しいPDMを提供することで新しいプリンタやスプーラをサポートできるように、PDMへのタスクの負荷を軽くすることをおすすめします。 でなければ、すべてのアプリケーションを変更する必要があります。

この節では、PDM選択プロトコルを使用する、PDMのCDEnext実装を説明します。 CDEnext実装は、初期的にプロトコルと結びつけられている、プリント・ダイアログ・マネージャ・デーモン(PDMD)が、実行可能である(`dtpdmd`)ことが必要です。 次に、アプリケーションに代わってどのPDMが必要か、また起動させるかを決定します。 CDEnext内では、実行可能な`dtpdm`は汎用PDMであり、`dtpdmd`が起動できます。

プリンタ・ベンダは、以下の手法の一つを選んで、新しいGUIを取り入れます。

- PDM選択プロトコルに適合する、ベンダ自身のPDM実装を開発します。

- `dtpdmd`で起動できるPDMを開発します。 これは、おすすめの手法です。

- あるいは、新しく共用または動的なライブラリを、`dtpdmd`に統合します。 これは、ベンダに依存する手法です。

実行可能な`dtpdm`は、いくつもの異なったプリンタにそれぞれ適合するダイアログを用意できるような、適当な汎用プリント・ダイアログ・マネージャを実装しています。 しかし、HP DeskJet 1600Cに基づくPCL、と、Sun SPARCprinter 2に基づくPostscript、の二つの参照プリンタの要求には、特に調整されます。 `dtpdm`は、プリンタ設定ダイアログ上に表示するオプションを、限られた量だけ自動的に構成するために、特定のプリンタの属性を使用します。 `dtpdm`のジョブ設定ダイアログは、lpスプーラで使用するよう設計されています。

実行可能な`dtpdmd`は、PDM起動メカニズムを実装しています。 PDM選択プロトコルは、PDMの選択と起動という、二つの階層を持つメカニズムです。 また、セキュリティ関係は、`dtpdmd`で処理されます。 その結果、`dtpdmd`から呼び出されるPDMは、GUIを表示する最小で単一なタスクになります。

### Dtプリント・ダイアログ・マネージャ・デーモン：dtpdmd

`dtpdmd`は、永続的なデーモン・プロセスで、PDMからのクライアントの要求を受け取り、ある検索ルールを使用し、それから、要求に応えるために適切なPDMを起動します。 PDMが終了すると、制御は`dtpdmd`に戻ります。 代わって、`dtpdmd`は、クライアントに最終的なステータスを示します。

`dtpdmd`は、PDMと通信するためにPDMD/PDMプロトコルを使用します。 PDMに通信するには、標準化されたコマンド行を経由して行ないます。 PDMから通信を受けるには、標準化された終了コードを経由して行ないます。

### Dtプリント・ダイアログ・マネージャ

このダイアログ・マネージャは、プリント・サーバとは別のプロセスであり、 印刷アプリケーションに代わって、プリンタ固有のGUIを提供します。 アプリケーションの要求で、`dtpdm`は、プリンタ固有またはジョブ固有のオプションをユーザが設定できるよう、ユーザのディスプレイに、プリンタ固有のダイアログ・セットを表示します。 設定ダイアログはアプリケーションの一部として現われるため、 実際には`dtpdm`プログラムがアプリケーションに代わってこのダイアログを管理します。 適用可能なメッセージ・カタログを持つすべてのロケール中に、ダイアログを提供することは可能です。

`dtpdm`は、`XmNotebook`ウィジェットを持つダイアログを表示します。 このノートブック・ウィジェットには、二つのタブがあります。 一つはプリンタ設定ボックス用、もう一つはジョブ設定ボックス用です。 多様な印刷オプションが構成できるよう、それぞれのボックスは制御します。 `dtpdm`ダイアログにはまた、三つのボタンがあります。 ボタンのラベルは、[了解]、[取消し]、および、[ヘルプ]です。 [了解]ボタンが起動されると、ダイアログは取り消され、新たに構成された印刷オプションを現在のプリント・コンテキストに(`XpSetAttributes`を経由して)設定します。 [取消し]ボタンが起動されると、ダイアログは取り消され、プリント・コンテキストには何の変化もありません。

## CDE印刷ウィジェット用ヘルプ

`DtPrintSetupBox`ウィジェットは、そのサブダイアログに対して、組み込みのサポートを提供します。 つまり、これらのサブダイアログの一つで、ユーザが[ヘルプ]ボタンをクリックすると、関連するヘルプ・テキストを持つヘルプ・ダイアログを表示します。 この目的のために使用されるヘルプ・ボリュームと位置IDは、次のとおりです。

- プリンタ情報：HelpVolume = `LibDtPrint`, LocationId = `PrinterInfo`

- プリンタ選択：HelpVolume = `LibDtPrint`, LocationId = `SelectPrinter`

- ファイル選択：HelpVolume = `LibDtPrint`, LocationId = `SelectFile`

しかし、メイン・ダイアログに対しては、ユーザが[ヘルプ]ボタンを押しても、ヘルプ・ダイアログは自動的には表示されません。 しかしながら、`DtPrintSetupBox`が提供するフックによって、アプリケーション・ライタは簡単に、一般的で、アプリケーションに固有なヘルプを供給できます。 これらのフックには次のものがあります。

- 一般的な印刷オプション用で、一つまたは複数の位置IDを持つ、 共有の`DtPrintSetupBox`ヘルプ・ボリューム。

- アプリケーションによって`DtPrintSetupBox`上にインストールされた、いくつかの`XmNhelpCallback`がコールされることを可能にする、`DtPrintSetupBox`[ヘルプ]ボタン上にインストールされた起動コールバック。

`DtPrintSetupBox`用のヘルプをアプリケーションに統合するには、以下のようにして下さい。

- トピックに関係したヘルプを含むヘルプ・ボリュームを指定してください。 ここで、アプリケーション固有の印刷オプションがないことを確認すれば、 `DtPrintSetupBox`で指定された共有のヘルプ・ボリュームだけで充分です。 さもなければ、アプリケーションのヘルプ・ボリュームの作成者は、 `DtPrintSetupBox`ボリュームとの内部的なリンクを指定する必要があります。 たとえば、カレンダ・マネージャのヘルプ・ボリュームが次のようだとします。

             Calendar Print Setup Dialog Box
             -------------------------------

                     some graphic

             Report Type     Choose to print Day View, Week View, Month View, or
                             Year View, plus Appointment List or To Do List.

             From/To         The dates for which you want to print
                             calendar data. With the From and To SpinBox,
                             you can select ...
             See Also:

                 * Generic Print options link1
                 * To Print Your Appointment List link2
                 * To Print Your To Do List link3

  ここでlink1は、 共有の`DtPrintSetupBox`ヘルプ・ボリュームとのリンクです。

- 印刷に関係するアプリケーションのヘルプ・ボリューム中での位置をマークする、位置IDのセットを定義してください。 どこまで詳細にIDを作るか(たとえば、プリント設定ダイアログ用に一つ、プリント設定ダイアログ中の各プリント・オプション用に一つ、またはその他の編成用)を決定するのはユーザの責任です。 位置IDが詳細になればなるほど、ヘルプはより特定されることになります。 この場合の、ヘルプは、ヘルプを必要とする項目のユーザによる選択を可能にするヘルプ・システムをサポートする場合に表示されるものです。

- `DtPrintSetupBox`の `XmNhelpCallback`リソースが追加されるコールバックを定義してください。 このコールバックは、`DtNhelpVolume`および`DtNlocationId`リソースを適切に設定する、`DtHelpDialogWidget`または `DtHelpQuickDialogWidget`を表示できます。