Sun WorkShop Visual は、できる限りコードを作成することなくアプリケーションの開発ができるように設計されています。ただ し、アプリケーション機能を実行し、それをユーザーインタフェースにリンクするためにはユーザー自身で コードを作成する必要があります。また、ユーザーインタフェースの動作を制御するためにもコードの作成 が必要になります。Sun WorkShop Visual では、それらのコード生成作業が容易に行えるように、以下のような機能が用意されています。
本章では、前章までに構築した学習の例を使用して、デザインにコールバックとリ ンクを追加する方法について記述します。また、前述の各機能についても、それぞれ詳細に説明します。 P>
コールバックのリストとは、ユーザーアプリケーションでユーザーアクションによ り起動されるように指定されている、1 つ以上のコールバック関数のリストです。ユーザーのアクションには、マウスボタンの押下、キーボード選 択およびポインタの移動があります。コールバックを設定すると、ウィジェット内で特定のユーザーアクシ ョンが行われるたびにインタフェースに指示を出して、コールバックリストにある関数を呼び出すことがで きます。図 6-1 にコールバックダイアログを示します。
コールバックの右側に「M」が表示されている場合はメソッドが、「C」が表示され ている場合はコールバックが宣言されていることを示します。
Java コードに適用されるコールバックには、図 6-1 に示したように、後に文字「J」が表示されます。コールバック関数は Java コードには変換されないため、Java アプリケーションにコールバック関数を含めたい場合は、コールバック・メソッドを使用してください。Su n WorkShop Visualを使用した Java コードの生成の詳細については、第 10 章「Java 用のデザイン」を参照してください。
アスタリスク (*) は、そのコールバックが Microsoft Windows ではサポートされていないことを示します。
コールバックダイアログの左下の領域でスマートコードのコールバックを設定でき ます。これらのコールバックは、指定したウィジェットを別のコードの層で「包み込む」ことで、 ツールキットから独立させます。スマートコードは、thick クライアント、thin クライアントやサーバーの各アプリケーションをデザインから作成する場合に便利です。スマートコードに ついての詳細は、第 16 章「取得/設定用スマートコード」を参照してください。本章の学習セクションではスマートコードは 使用しませんが、他の章の学習セクションには多くの使用例が用意されています。
次の手順では、これまでの章で作成した学習デザインを使用してコールバックの最 も簡単な例を指定します。「Exit」ボタン ( exit_button ) をクリックすると、プログラムを終了する quit() という関数を 1 つだけ持つコールバックリストが活性化されます。
「コールバック」ダイアログを使用すると、関数のリストとユーザーアクションを 関連付けることができます。 quit() がまだ作成されていない場合であっても、 quit() と exit_button をこの段階で関連付けることができます。
quit() およびその他のコールバック関数は、C または C++ で作成され、Sun WorkShop Visual で生成されたコードとリンクされます。この学習セクションの 「コールバック関数の追加」では、 quit() 関数を作成します。コールバック作成に関しては、「コールバック関数」で詳しく説明します。
次に、 quit() と「活性化 (activate)」を関連付けます。活性化とは、ウィジェット内にポインタを置いた状態で、ユーザーがマウス ボタンを押して放すことを意味します。 <Return> あるいは Motif ユーザーズガイドに記述されているその他のキーを使用しても活性化することができます。
「コールバック」ダイアログに表示されているコールバックを選択すると、そのコ ールバックに関連付けられているコールバック関数のリストが表示されます。活性化コールバックを追加す るには、次のようにします。
コールバックルーチンのリストには、ウィジェットに局所的なコールバックと継承 されたコールバック (以降、継承コールバックと呼ぶ) の両方を表示します。継承コールバックの詳細は、「継承されたコールバック」を参照してください。
継承されていないコールバックのみ、変更することができます。図 6-2 には、代表的な 2 つの例を示します。例 A は、学習用インタフェースの「Exit」ボタンのコールバックを、例 B は少し複雑な例を示しています。
定義のインスタンスであるウィジェットの場合は、定義中の対応するウィジェット からコールバックを継承することができます。
図 6-3 に示すように、継承されたコールバックは角括弧 [ ] で囲まれて表示されます。
コールバックリストは C コードのように見えますが、論理的な流れはありません。つまり、 if...else や while のような C の論理演算子は使用できず、また、コールバックが特定の順序で実行されるとは限りません。リスト内のす べての関数は、指定されたイベントが発生した場合に、それらが入力された順序とは関係なく実行されます 。実行の順序が重要である場合には、必要な順序でサブルーチン呼び出しを含んでいる単一のコールバック 関数を作成することができます。
「クライアントデータ」テキストボックスに指定したデータは、コールバックへ渡 されます。コールバックで何らかのデータを必要とする場合は、大域変数ではなく、この機能を使用するこ とをお勧めします。「クライアントデータ」テキストボックスに、引数として表示させたい文字列を入力し てください。通常 C および C++ 構文でキャストされる型を追加することもできます。ただし、関数の引数を示す括弧 ( ) は自動的に追加されるため、入力する必要はありません。コールバック関数へ渡される引数の詳細およびそ の例については、「コールバック関数の引数」 を参照してください。
注 - クライアントデータは、コールバック関数には追加できますが、コールバック・メ ソッドには追加できません。詳細は、「コールバック・メソッド」 を参照してください。
選択したウィジェットが C++ クラスに包含されていて、プルダウンメニューから 「メソッドの名前」 が選択されて名前テキストフィールドの左側に表示されている場合に、「メソッド」 ボタンが名前テキストフィールドの右側に表示されます。「関数の名前」 が選択されている場合はボタンは表示されません。「メソッド」 ボタンを押すと、選択したウィジェットの包含クラスですでに定義されているコールバック・メソッドのリ ストが表示されます。
リストからコールバック・メソッドを選択して「了解」ボタンを押すと、選択した コールバック・メソッドが「メソッドの名前」テキストフィールドに表示されます。ウィジェットを包含す る方法の詳細は、「C++ クラス」を参照してください。
「コードを編集」ボタンを押すと、Sun WorkShop Visual を実行したままで、スタブファイル (生成されたファイルで、指定したコールバックを含む) を編集することができます。詳細は、「コールバック関数の追加」を参照してください。使用するエディタの指定方法については、 「コールバックおよびプレリュード編集の設定」を参照してください。
「コードを編集」ボタンの横には、生成するコードの様式を選択するためのオプシ ョンメニューがあります。選択できるコード様式は以下のとおりです。
注 - 最後の 2 つのオプションは、Microsoft Windows モードの場合に限り表示されます。これらのオプションについては、「様式メニュー」を参照してください。
様式オプションメニューは、「コードを編集」機能と連動しています。スタブファ イルを編集する際は、使用する言語を指定する必要があります。ダイアログを呼び出すと、Sun WorkShop Visual が使用言語を認識し、対応するメニューを設定しようとします。しかし、1 つのデザインで 2 つの言語を使用して作業している場合など、不可能な場合があります。このメニューで、正しいオプション を選択しているかどうかを常に確認してください。
スマートコードでないコールバックをスマートコードのコールバックに変えたい 場合、そのコールバックが 1 ヵ所でしか使われていなければ、「更新」ボタンを使用する必要はありません。しかし、そのコールバック が 2 ヵ所以上で使われている場合は、「更新」ボタンで変更を別の場所で使用されているコールバックにも反映 する必要があります。これは、1 つのコールバックの中で「スマートコードであるもの」と「スマートコードでないもの」の 2 種類が存在することはできないためです。スマートコードではないコールバックが選択された場合は、「ス マートコード」トグルは使用できない状態になります。
既存のコールバックをスマートコードのコールバックに変更した場合で、すでに そのコールバックに対してスタブファイルを生成しているときは、スタブファイル中のスマートコードでな いコールバックのスタブの名前を変更するか削除して、Sun WorkShop Visual が新しいスマートコードを生成できるようにしてください。
「設定を消去」ボタンは、スマートコードのコールバックが 1 つ以上あり、さらに新しいコールバックルーチンを追加したい場合に便利です。このボタンを押すと、すべ てのコールバックやデフォルト以外の設定が選択されていない状態になります。そのため、これまで選択さ れていたコールバックのスマートコードの設定を誤って変更してしまうことがありません。
「削除」ボタンは、現在のコールバックリスト全体を削除します。この操作を元 に戻すことはできないため、「削除」ボタンは十分に注意して使用してください。
学習デザインの例については、「リンク」以降で引き続き説明します。次の節では、コールバックおよびその使用方法につい てさらに詳細に記述します。
「作成関数」では、Sun WorkShop Visual がアプリケーションのダイアログに必要なウィジェットを作成し、その初期リソース値を設定する方法につ いて記述しています。しかし、アプリケーションを動作させるのはコールバック関数とトランスレーション です。トランスレーションの詳細は、「トランスレーションとアクション」 を参照してください。
ほとんどのコールバック関数は、類似した構造を持っています。代表的なコールバ ック関数は、以下に示す動作のいくつか、またはすべてを実行します。
呼び出しデータは、ウィジェットの開発者によって定義されたデータ構造体へのポ インタです。呼び出しデータ構造体については、Motif またはそのウィジェット・ツールキットの開発元の資料を参照してください。Motif の参考資料の詳細は、「X および Motif に関する資料」を参照してください。
クライアントデータは、任意の変数または構造のアドレスを渡すために使用できる ポインタです。コールバックを登録する場合、そのコールバック関数に渡されるクライアントデータ引数に 対しての値を指定することができます。
Sun WorkShop Visual では、クライアントデータの名前は、コールバック関数の単一のオプション引数としてコールバックダイア ログで指定されます。指定方法については、「クライアントデータ」を参照してください。これは、適切なプレリュードで定義し、初期化 した構造体へのポインタとすることができます。たとえば、典型的なプレリュードは以下のようになります 。
/* メインダイアログシェルに対するマネージの前プレリュード */
/* rungrep コールバックに対するクライアントデータを定義して初期化する */
static rcdata_t rcdata = {
&hitstring,
&errorshell,
&errorform,
&errortext,
&mainshell
};
/* シェルに対するマネージの前プレリュード終わり */
rungrep((XtPointer)&rcdata)
コールバックダイアログで上述の内容を指定するには、次のようにします。
1. 「関数の名前」テキストボックスに関数名 rungrep を入力します。
2. キャストを含めた引数を「クライアントデータ」テキストフィールドに次のように入力します。
(XtPointer)&rcdata
構造体 rcdata_t の宣言は、通常はコールバック関数モジュールおよび生成されたコードに (モジュール・プレリュードとして #include を追加することで) 含まれているヘッダーファイルにあります。コールバック関数はクライアントデータを ( rcdata_t * ) にキャストした後、データをアクセスすることができます。
構造体 rcdata は、変数そのものの値ではなく、ウィジェット変数に対してのポインタを含むように定義されていることに 注意してください。これにより、 rcdata はウィジェットが作成される前に初期化することができます。ウィジェット変数の値がコピーされる構造体 を定義することもできますが、その場合には、すべてのウィジェットが作成されるまでこの構造体は初期化 されないため、注意が必要です。
クラスメンバー関数をコールバック関数としてウィジェットに追加することは理想 的ですが、残念ながらこれは不可能です。コールバック関数は C ライブラリによって呼び出され、クラスメンバー関数が必要とする呼び出し文脈 ( this ポインタ) を提供することができないためです。Sun WorkShop Visual は、コールバックから自動的に呼び出すための方法「コールバック・メソッド」を提供しています。コール バック・メソッドの詳細は、「コールバック・メソッド」を参照してください。
すべてのコールバック関数には、その関数の属するウィジェットのアドレスが引数 として渡されます。この引数はウィジェット型の変数です。Sun WorkShop Visual が生成するコードでは、そのウィジェットの変数名がポインタとして使用されます。次のような方法を使用 すれば、コールバック関数がその関数の属するウィジェットではなく、ユーザーが作成したアプリケーショ ンの中のウィジェットにアクセスするように設定できます。
コールバック関数の属するウィジェット以外のウィジェットの名前を、クライアン トデータ構造の一部として渡します。クライアントデータ構造については 「コールバック関数の引数」を参照してください。
最も簡単な方法は、ウィジェット変数を大域的として定義することです。大域的変 数として定義すると、その変数をコールバック関数モジュール内で外部宣言して、コールバック関数から呼 び出すことができます。Sun WorkShop Visual が生成した「外部宣言」ファイルをスタブファイルにインクルードすると、この操作が行われます。
Sun WorkShop Visual は、デフォルトで、名前の付いたウィジェットを大域的として宣言します。この動作は、コアリソースパネ ルでウィジェットの記憶クラスを設定することにより、変更することができます。
大域的変数の利点は、その単純さです。しかし、多くの大域的変数を持つことはプ ログラムの構造にとって良いことではありません。また、大域的変数に意味のある名前を持たせて重複を避 けるために、命名規則に気を配らなければなりません。
#include を使用して基本モジュールをコールバック関数のモジュールに組み込んで、大域的変数の必要性を減らすこ とができます。基本モジュールは、X および Motif ヘッダーファイルを組み込まずに生成することをお勧めします。
上述のようにしても、Sun WorkShop Visual は名前を付けたウィジェットを大域的として宣言します。ウィジェットの記憶クラスを静的に変更し、コー ルバック関数のモジュールに対して局所的にすることができます。
このテクニックは、1 つのコールバック関数が、単一のデザイン内にあるすべての、または、ほとんどのウィジェットを呼び出す 必要がある場合に効果的です。さらに複雑な状況においては、アクセス用関数をコールバック関数のモジュ ールに追加することができます。コールバック関数はアクセス用関数を介して、他のコールバックモジュー ルに局所的であるウィジェットを操作することができます。
ウィジェットへは、X ツールキット簡易関数 XtNameToWidget() を使用してアクセスすることもできます。ウィジェット名をこの関数に渡すと、ウィジェットのポインタが 返されます。詳細は X ツールキットのマニュアルを参照してください。
「コールバックのウィジェットへのアクセス」に記述しているように、デザインの中のウィジ ェットは、さまざまな方法で操作することができます。本節では、操作方法の概要を説明します。詳細な説 明は省略しますが、適切な関数とその関連資料を示します。
Motif ツールキットは、一部のウィジェットの属性を獲得し、設定するための簡易関数を数多く提供しています。 これらの関数はすべて、 XmTextSetString() 、 XmTextGetString() 、 XmToggleButtonGetState() のように、影響を与えるウィジェットクラスにちなんで名前が付けられています。これらの簡易関数は、『 Motif プログラマーズ・リファレンス』で説明されています。
まず、簡易関数に着目してください。これらは最も簡単に使用することができ、し かも効率的です。
簡易関数はウィジェットの引数をとります。これは適切なクラスのウィジェットへ のポインタです。ウィジェットのクラスが不適切な場合は、一般に簡易関数はコアダンプします。また、簡 易関数にはウィジェットおよびガジェットの両バージョンがあるため、不適切なバージョンが使用された場 合にはコアダンプが起こります。
簡易関数が存在しない場合は、 XtGetValues() または XtSetValues() を使用して直接ウィジェットのリソースを獲得または設定しなければなりません。これはウィジェットプロ グラミングの基礎であるため、X または Motif に関する書籍で詳しく解説されています。
すべてのリソースがウィジェット作成後に設定できるとは限りません。各ウィジェ ットクラスのアクセス制御については『 Motif プログラマーズ・ガイド』を参照してください。
ウィジェットを使用できなくする (つまり、ユーザー入力に対して応答不可能にする)、あるいは再度使用できるようにするためには、 XtSetSensitive() を使用します。リソース XmNsensitive は直接設定しないでください。
ウィジェットが応答不可能になると、その子孫もすべて応答不可能になります。応 答不可能なウィジェットは通常、グレー表示されます。
テキストまたはテキストフィールドウィジェットが応答不可能になると、ユーザー はキー入力でテキストをパンおよびスクロールすることができなくなるため、表示範囲が限られます。リソ ース XmNeditable は False に設定することをお勧めします。
ウィジェットを表示または非表示にする方法には、マネージ (管理) とマップの 2 通りがあります。
ウィジェットがマネージされていない場合は、ウィジェットの親はウィジェットの ためのスペースを確保しないため、そのウィジェットは画面上に表示されません。ウィジェットをマネージ から外すには XtUnmanageChild() または XtUnmanageChildren() を使用し、また、マネージを行うには XtManageChild() または XtManageChildren() を使用します。Sun WorkShop Visual は、ウィジェットが作成された後にそれらをマネージするためのコードを生成しますが、コアリソースパネ ルの「マネージ」トグルによってマネージするかどうかを変更することができます。
ウィジェットがマネージされていてもマップされていない場合は、親はウィジェッ トのためのスペースを確保していますが、画面には表示されず、空のスペースがあるだけです。ウィジェッ トは通常、マネージされると自動的にマップされます。これは、「コアリソース」パネルの「設定」ページ にあるリソース XmNmappedWhenManaged で制御することができます。
マップおよびアンマップ (マップ取り消し) は、配置を変更せずにダイアログ内のウィジェットの表示を変更するためによく使用されます。ウィジェッ トのマネージおよびアンマネージ (マネージ取り消し) を行うと、配置が変更されます。
ダイアログシェルの子をマネージまたはアンマネージすることにより、ダイアログ 全体を表示したり非表示にしたりすることができます。ダイアログが最上位シェルを使用している場合は、 シェルに XtPopup() および XtPopdown() を使用します。
注 - Sun WorkShop Visual の組み込みリンク機能を使用してウィジェットを自動的に、かつ動的に表示/非表示にする方法については 、「リンク」を参照してください。
Sun WorkShop Visual は、ダイアログに対してウィジェットを作成するためのコードを生成します。デフォルトの main() プログラムは、起動時にすべての作成関数を呼び出します。ウィジェット作成は比較的時間がかかるため、 作業全体に支障をきたす場合があります。そこで多くの場合、ダイアログが最初にポップアップされるまで は、その作成を延期する慣例となっています。ダイアログがすでに作成されたかどうかを判断するためには 、ポップアップを実行するコールバック関数内で静的なブール型のフラグを使用することができます。
完全なダイアログを作成するためのコードの作成に加え、ダイアログ部分に対して の作成関数を生成することもできます。これについては、「子のみを生成するウィジェット」で説明します。たとえば、これらの関数をコールバック関 数から呼び出して、再使用可能な構成要素のインスタンスをもう 1 つ作成することもできます。
ウィジェット (およびそのすべての子) を破壊するためには、 XtDestroyWidget() を使用します。しかしウィジェットを破壊して再度作成すると効率が悪いため、ウィジェットをアンマネー ジし、必要であれば再度マネージすることをお勧めします。
Sun WorkShop Visual には、リンクと呼ばれる事前定義されているコールバック関数があります。以下の 6 種類のリンクが使用できます。
プッシュボタン、矢印ボタンおよびカスケードボタンだけがリンク元になることが できます。すべてのリンクは「活性化」イベントにより有効になります。リンクはデザイン内のどのような ウィジェットでも表示、非表示、マネージ、アンマネージ、有効化、無効化することができます。1 個のボタンに複数のリンクを持たせることができます。
リンクとは、Sun WorkShop Visual が設定するコールバックです。しかし、コールバックと異なり、ダイナミックディスプレイで動作するため 、ウィンドウ動作のプロトタイプの作成に使用することができます。コードを生成する場合には、ダイナミ ックディスプレイでの動作とまったく同様に動作するリンクを取り込む、あるいは単純なリンクの代わりに 複雑なコールバックを代用することができます。
リンクを追加するには、以下のいずれかの条件を満たしている必要があります。い ずれの条件にも合致しない場合は、「追加」ボタンは無効になり、リンクの追加を行うことができません。
注 - リンクの宛先ウィジェットの変数名が変更された場合は、そのウィジェットに設定 されたリンクはすべて無効になります。
これから、作成したヘルプ画面を表示して、適切なタイミングで非表示にするとい う、一般的なリンクの構成を設定していきます。このような設定を行うには、以下の操作を行います。
構成領域では現在、「OK」プッシュボタンが表示されています。次に、このプッシ ュボタンに「非表示」リンクを設定します。
3. ok_button と入力し、<Return> を押して新しい名前を登録します。
4. ウィジェットメニューをプルダウンして、「リンク編集」を選択します。
図 6-4 に示されるパネルが表示されます。
「OK」ボタンが選択された場合にヘルプ画面全体が消去されるように、「非表示」 リンクのターゲットを help_window ウィジェットに設定します。
ターゲットウィジェットを選択するには、以下の操作を行います。
シェルの名前である help_window がリンクパネルの「ウィジェット」フィールドに表示されます。しかし、「追加」コマンドはまだ使用でき ません。これは、シェルの直接の子であるダイアログテンプレートに名前が付いていないためです。すでに 説明したように、シェルへのリンクを設定する前に、シェルの子に名前を付ける必要があります。
ダイアログテンプレートに名前を付けている間、リンクパネルは開いたままにでき ます。
7. 「変数名」フィールドをダブルクリックし、次のように入力します。
dialog_2
これでシェルは有効なターゲットウィジェットとなり、「追加」が使用できるよう になります。
図 6-5 に示されるように、リンク表示領域には新しいリンクが表示されます。
12. 新しいリンクを実行するには、ダイナミックディスプレイで「OK」ボタンをクリックします。
ヘルプ画面が消去されます。構成領域でシェルを選択しなおすと、ヘルプ画面を復 元することができます。
メインウィンドウにおいてボタンが押された場合にヘルプ画面を表示する「表示」 リンクも設定することができます。この設定を行うには、以下の操作を行います。
13. ウィンドウ保持領域の myFirstShell アイコンをクリックします。
次に、ヘルプメニューにあるプッシュボタンに新しいリンクを設定します。
14. 2 番目のメニューの子であるプッシュボタン、 help_button を選択します。
リンクウィンドウは、リソースパネルや配置エディタとは異なり、現在選択されて いるプッシュボタンに対して自動的にリンクの追加を開始しません。現在選択されているボタンに対してリ ンク編集するためには、以下の作業を行う必要があります。
15. ウィジェットメニューをプルダウンし、「リンク編集」を選択します。
リンクウィンドウにはプッシュボタンの名前と、現在のリンク (現時点では存在しません) が表示されます。ヘルプ画面のシェルであるターゲットウィジェットを選択します。
16. ウィンドウ保持領域で help_window アイコンをクリックします。
以下の操作を行なって、これらの 2 個のリンクを実行します。
19. ウィンドウ保持領域で myFirstShell アイコンをクリックします。
20. ダイナミックディスプレイの「Help」メニューをプルダウンし、「About This Layout」を選択します。
このプッシュボタンにある「表示」リンクにより、ヘルプ画面が表示されます。
21. ダイナミックディスプレイにあるヘルプ画面の「OK」ボタンをクリックします。
プッシュボタンの「非表示」リンクにより、ヘルプ画面が消去されます。手順 20 と
手順 21 は、何度でも繰り返すことができます。
学習デザインの例については、第 7 章「コードの生成」以降で引き続き説明します。ここでは、Sun WorkShop Visual を使用してユーザーが作成したアプリケーションに機能を追加する方法について記述します。
Motif 1.2 では、X 選択メカニズムを使用してアプリケーションと通信することができる、高度なドラッグ & ドロップ機能を提供しています。Sun WorkShop Visual のサポートは、ユーザーにアプリケーションでドロップサイトを指定させる単純なものです。ドラッグの開 始はコールバックまたはアクション関数内から行われる動的関数であるため、Sun WorkShop Visual は明示的なサポートは行いません。
ドロップサイトは特定の型のデータを転送メカニズムから受け取ることができるウ ィジェットです。 Sun WorkShop Visual は、コアリソースパネルのドロップサイトページを使用してドラッグ & ドロップのサポートを行います。
ウィジェットをドロップサイトとして指定するためには、「ドロップサイト」トグ ルをオンにし、インポートするターゲットの種類およびドロップ関数を指定します。「インポートするター ゲットの種類」フィールドは、ドロップ関数によって処理することができる型を指定するために、アトムに 変換される文字列のリストです。リストは、コンマまたはスペースで区切られた文字列として指定されます 。
デフォルトでは、Motif はラベル (およびラベルの派生) ウィジェット上でマウスボタン 2 が押された場合に、ドラッグ操作を開始して、 labelString または labelPixmap を転送します。Sun WorkShop Visual は、Motif のデフォルト動作を利用するために、「インポートするターゲットの種類」に指定されている型をインポー トするドロップサイトのウィジェットに、ドロップ関数を追加します。以下の学習例を使用して、ドロップ サイトの動作を確認してください。
1. アプリケーションシェルに 2 個のプッシュボタンを含むローカラムを追加して、ダイアログを作成します。
2. それぞれのウィジェットに次のように名前をつけます。
shell
、
rowcolumn
、
MyButton1
、
MyButton2
3. MyButton1 の「ドロップサイト」ページをポップアップします。
4. 「ドロップサイト」トグルをオンに設定し、アニメーションスタイルを「シャドウ・イ ン」に設定します。
5. 「インポートするターゲットの種類」フィールドに、次のように入力します。 COMPOUND_TEXT
6. 「ドロップ関数」フィールドに次のように入力します。
drop_button1
「ドロップ関数」フィールドおよび「ドラッグ関数」フィールドには、ドロップおよび動的ドラッグ動作を 処理するための関数名を指定します。
8. メインウィンドウ上のいずれかのテキスト (たとえば変数名フィールドのテキスト MyButton2 ) を、ダイナミックディスプレイウィンドウの MyButton1 の上までドラッグします。
「MyButton1 」ボタンがシャドウイン表示され (ボタン枠の内側に影が表示され)、ドラッグターゲットとして有効なドロップサイトであることを示します 。
9. マウスボタンを離して、ウィジェットにテキストをドロップします。
Sun WorkShop Visual の提供するドロップ関数によって、ドロップされたテキストが単純にコピーされます。
10. MyButton2 を選択して、手順 4 を繰り返します。
11.
「インポートするターゲットの種類」フィールドに次のように入力します。
PIXMAP
12. 「ドロップ関数」フィールドに次のように入力します。
drop_button2
13. ツールバー上のピックスマップをダイナミックディスプレイウィンドウの MyButton2 の上までドラッグします。
通常はドロップサイトではないウィジェットに対しては、 XmDropSiteRegister() への呼び出しを持つ、C および C++ に対してのコードが生成されます。テキストウィジェットはデフォルトで COMPOUND_TEXT をインポートすることができるドロップサイトです。「ドロップサイト」トグルをオフに設定すると、この ウィジェットを使用不可能にすることができ、また、適切なリソースを変更するだけで修正することができ ます。
転送を処理するためには、ドロップ関数を指定する必要があります。ドロップ関数 は、生成されたコード中では外部関数として宣言されているだけです。
ウィジェットには動作があります。たとえば、ユーザーがプッシュボタン上でマウ スボタン 1 を押すと、そのプッシュボタンは強調表示されます。ユーザーがマウスボタンを離すと、プッシュボタンの 外観は通常に戻り、活性化コールバックリストの関数が呼び出されます。
この動作は、プッシュボタンウィジェットに固定されているのではありません。イ ベントへの応答として行われるアクションにイベントを割り当てる、ウィジェットのトランスレーションテ ーブルによって決定されます。ウィジェットが作成されると、そのトランスレーションテーブルは、一連の エントリがデフォルトになるように初期化されます。たとえば、プッシュボタンウィジェットのデフォルト ・トランスレーションテーブルには、次の内容が含まれます。
<Btn1Down>:Arm()
<Btn1Up>:Activate() Disarm()
コロンの前に存在するのはイベント指定であり、右側はウィジェットが応答として 実行するアクションの名前です。第 2 のテーブルであるアクションテーブルは、アクションを実行する関数のアドレスにそのアクション名を割り 当てるために使用されます。たとえば、プッシュボタンのデフォルト・アクションテーブルには以下の内容 が含まれます。
"Arm",Arm
"Activate",Activate
"Disarm",Disarm
各行の最初の項目はアクションの名前で、次の項目は関数の名前です。規約および 常識の観点から、アクションと関数の名前は同じであるか、あるいは少なくとも明確に関連している必要が あります。
Sun WorkShop Visual 内のウィジェットのトランスレーションテーブルは変更することができますが、ウィジェットのアクション テーブルは変更できません。ただし、ウィジェットごとのアクションテーブルの後に検索される、アプリケ ーションに対して大域的なアクションテーブルに、新しいアクションを定義することは可能です。これには 、「トランスレーションテーブルの修正」に示すようなコードが必要です。
注 - Microsoft Windows 上ではトランスレーション機能はサポートされていません。したがって、Microsoft Windows モードでは「トランスレーション」ダイアログの「適用」ボタンはピンク色で表示されます。
Sun WorkShop Visual 内のウィジェットのトランスレーションテーブルは、簡単に修正することができます。修正の手順を理解す るには、次に示す簡単な演習を行うことをお勧めします。
1. プッシュボタンを含む単純なウィジェット階層を作成します。
2. ウィジェット階層でプッシュボタンアイコンを選択します。
3. 「ウィジェット」メニューから、「トランスレーション」を選択します。
図 6-7 に示すトランスレーションダイアログが表示されます。
4.
「追加」の下のフィールドをクリックし、次のように入力します。
Ctrl<Key>q: ArmAndActivate()
これにより、プッシュボタンウィジェットの新しいトランスレーションが追加され ました。この時点でその効果を試すことができます。
注 - アクションが見つからないことを示すエラーダイアログが表示されますが、これは 参考用で、実際には変更は行われています。Sun WorkShop Visual でアクションテーブルを作成する方法についての詳細は、「追加のアクション」 を参照してください。
6. ダイナミックディスプレイ・ウィンドウのプッシュボタン上にマウスポインタを置きます。
新しいトランスレーションを実行すると、マウスボタン 1 をクリックすることと同じ動作が行われます。ウィンドウが入力フォーカスを持っていない場合はトランス レーションは動作しません。また、入力フォーカス動作は、ウィンドウマネージャの構成によって異なりま す。
このボタンが他のイベントのトリガーとなるように、指定したトランスレーション を変更することもできます。ウィジェットのリセットが行われるまでは、新しいトランスレーションだけで なく、以前に指定したトランスレーションも有効であることに注意してください。
トランスレーションダイアログには、「上書き」と「追加」のラベルが付いた領域 があります。新しいトランスレーションは、どちらかのまたは両方の領域に入力することができます。これ らの領域は、既存のトランスレーションと同じイベントを使用してトランスレーションを指定する場合に限 り、使い分ける必要があります。「上書き」領域に新しいトランスレーションを入力すると、新しいトラン スレーションは既存のものと置き換えられます。「追加」領域を使用すると、既存のトランスレーションが 優先されます。
トランスレーションが上書きされない限り、トランスレーションの追加を行なって も、ウィジェットに対する既存のデフォルト・トランスレーションに影響はありません。Motif ウィジェットは、それらが意図されている動作を生成するデフォルト・トランスレーションを多数持ってい るため、特に注意してください。
「置換」トグルを設定すると、既存のトランスレーションはすべて取り除かれ、新 しく入力されるトランスレーションに置き換えられます。このため、「置換」を使用する場合には十分な注 意が必要です。すべてのデフォルト・トランスレーションを取り除く「置換」と、 1 つずつ置き換えを行う「上書き」を混同しないように注意してください。
トランスレーションテーブルの構文は複雑です。次の節以降で、Sun WorkShop Visual で使用する構文について記述します。詳細は、X ツールキットのマニュアルを参照してください。
トランスレーションテーブルの各エントリは、以下の形式になっています。
[修飾キーリスト]<イベント>[,<イベント>...][(回数)][詳細]:
[アクション([引数群])...]
角括弧 [ ] は、項目が任意であることを示しています。また、省略符号 (...) は、項目が繰り返される可能性があることを示しています。
修飾キーリストは、修飾キー (Control、Shift など) およびマウスボタン (X ではマウスには 5 個のボタンが使用できることになっています) が押されているか、などの状態を表わします。最も頻繁に使用される修飾キーは Ctrl、Shift、Alt です。これらは c、s、a と省略形にすることができます。
修飾キーリストが省略されている場合、その修飾キーの状態は重要ではありません 。
<Key>Q は <Q> 、 <Ctrl-Q> 、 <Alt-Meta-Q> などに対応します。
特定の修飾キーがリストに示されていない場合、その状態は重要ではありません。< /P>
Ctrl<Key>Q は、 <Ctrl-Q> 、 <Ctrl-Meta-Q> 、 <Ctrl-Alt-Meta-Q> などに対応します。
修飾キーリストには、複数の修飾キーを指定することができます。
Ctrl Meta <Key>Q
は、
<Ctrl-Meta-Q>
には対応しますが、
<Ctrl-Q>
または
<Meta-Q>
には対応しません。
修飾キーが押されてはいけないことを指定する場合は、修飾キーの前にチルド (~) を付けます。
Ctrl ~Meta<Key>Q は <Ctrl-Q> に対応しますが、 <Ctrl-Meta-Q> には対応しません。
押される修飾キーが指定と正確に一致している必要があることを指定する場合は、 感嘆符 (!) で修飾キーリストを開始します。
!Ctrl<Key>Q は、 <Ctrl-Q> に対応しますが、 <Ctrl-Meta-Q> またはマウスボタンと同時に押す <Ctrl-Q> には対応しません。
修飾キー「None」は、いかなる修飾キーも押してはいけないことを意味します。
None<Key>Q は、<Q> に対応しますが、 <Ctrl-Q> や <Alt-Meta-Q> などには対応しません。
通常、トランスレーションでは大文字と小文字を区別しません。 <Key>Q は、 <Q> と <q> の両方に対応します。修飾キーリストの前にコロン (:) を置くことにより、トランスレーションに大文字と小文字を区別するように指定することができます。
イベント には、X イベントの名前、あるいは多数の別名の 1 つを指定します。最もよく使用されるイベントには、 Key (キーを押すこと)、 BtnDown と BtnUp (マウスボタンの場合)、そしてボタン N Down とボタン N Up (N は 1 から 5 までの数) などがあります。すべてのイベントと別名のリストについては、Xt の資料を参照してください。
<Btn1Up> は、マウスボタン 1 を離すことに対応します。
トランスレーションには、連続する一連のイベントを指定することができます。こ の場合、コンマで区切ります。
<Key>Q , <Key>A は、 <Q> の次に間をおかず <A> が続くことに対応します。
<Btn1Down> , <Btn1Up> は、マウスボタン 1 のクリックに対応します。
ボタンの押下および解除イベントと一緒に回数を指定して、複数のクリックを検出 することができます。回数は、1 から 9 までの数字で、プラス記号 (+) がその後に続く場合があります。
<Btn1Down>(2) は、マウスボタン 1 を 2 回押すことに対応します。
<Btn1Up>(3+) は、マウスボタン 1 を 3 回以上離すことに対応します。
回数指定をする場合は、ボタンイベントはすべて短い期間 (通常は 200 ミリ秒以内) に発生しなければなりません。短い期間内に発生しないイベントは、対象外となります。
イベント指定の最後のフィールドは、「詳細」と呼ばれます。「詳細」は通常、キ ーイベントと一緒にのみ使用されます。この場合、押されるキーの指定は「詳細」が行います。
詳細フィールドで指定される値は、ヘッダー <X11/keysymdef.h> にあるように、接頭辞 XK_ が取り除かれているキーシム ( keysym ) です。ほとんどのキーの場合、これはキー上の文字と同じです。
アルファベット以外のキーの場合は、「キーシム」の名前を確認してください。「+ 」に対しての「キーシム」は、 XK_plus です。したがって、以下のようになります。
ここで行われる照会では、大文字と小文字が区別されないため、プラスキー上にあ る他の記号 (多くのキーボードの場合は < 、 = 、 > ) にも対応します。
Motif では、入力される特定のキーイベントを Motif 仮想キーシムに変換するため、さらに複雑になります。トランスレーションテーブルには、X のキーシムの代わりに、これらの仮想キーシムを使用することをお勧めします。
<Key>Delete ではなく、 <Key>osfDelete を使用します。
仮想キーシムのリストを以下に示します。これらの解釈については、『 Motif プログラマーズ・リファレンス』の VirtualBindings(3X) を参照してください。
「詳細」フィールドをマウスボタン・イベントに使用して、特定のマウスボタンを 指定することもできます。しかし、イベントフィールドでのマウスボタンの指定の方が簡単であるため、こ の方法はあまり一般的ではありません。
トランスレーションテーブルの右側にあるアクションは、複雑なものではありませ ん。通常、各アクションは後に括弧が続いている名前にすぎません。括弧内には任意の数の文字列引数を指 定することができますが、ほとんどのアクション関数は、引数の指定を予定していません。引数は、引用符 で囲んではなりません。スクロールバーウィジェットに対する代表的な追加トランスレーションを次に示し ます。
<Key>d:IncrementDownOrRight(0)
<Key>u:IncrementUpOrLeft(0)
複数のアクションを指定することもできますが、まったく指定しなくてもかまいま せん。既存トランスレーションを、イベント指定が同じでアクションの異なるトランスレーションを使用し て上書きすることにより、ウィジェットのデフォルト動作の一部を使用禁止にすることができます。
多くの場合、使用されるアクションは、ツールキットによって事前定義されていま す。「追加のアクション」では、独自のアクションの追加方法を説明します。
イベントが受け取られると、トランスレーションテーブルは上から下に検索が行わ れます。検索は、イベントに一致するイベント指定を持った最初のエントリで終了します。つまり、最も詳 細なイベント指定を持つエントリが最初にくるように、トランスレーションテーブルを編成するべきです。 たとえば、トランスレーションテーブルに次のようなエントリがあるとします。
<Key>q: action1()
Ctrl<Key>q: action2()
ユーザーが <Q> または <Ctrl-Q> を入力した場合、検索は最初のエントリで終了し、どちらの場合においても action1() が呼び出されます。 <Ctrl-Q> で action2 を呼び出すようにするには、エントリの順番を逆にする必要があります。
トランスレーションテーブルを変更することにより、通常はアクションを引き起こ さないイベント列に対しても、ウィジェットにアクションを実行させることができます。ユーザーは、独自 のアクション関数を書くことができますが、トランスレーションの最大の利点は、ユーザーがウィジェット の組み込みアクションの 1 つを使用できるということです。
Motif ツールキットの組み込みアクションは、『 Motif プログラマーズ・リファレンス』に記述されています。各ウィジェットの記述には、デフォルトのトランス レーションと呼び出すアクションの両方が含まれています。プリミティブ・ウィジェットの中には、多くの アクションを提供するものもあります。
これらのアクションの 1 つを使ったトランスレーションを使用する場合は、
Sun WorkShop Visual で直接そのテストを行うことができます。逆に、プッシュボタンの Activate() アクションのように、ウィジェットのコールバックリスト中の関数を呼び出す組み込みアクションも存在し ます。この場合、適切なイベント列においてそのアクションを呼び出すようにトランスレーションの指定を 行い、通常のコールバック関数中にコードを置いた方が簡単です。
要求を満たすような組み込みアクションが見つからない場合は、アクションを実行 する独自のアクション関数を書くことができます。図 6-8 にトランスレーションの例を示します。この例では、 <Ctrl-e> が押されており、アクション 「doActionE」 が起動されています。
独自のアクション関数を定義する場合、定義したアクション関数をアプリケーショ ンの 「アクションテーブル」 に追加する必要があります。図 6-9 に示すように「アクションテーブル」ダイアログでアクション関数を定義すると、Sun WorkShop Visual が自動的にこれを行います。「アクションテーブル」ダイアログは、「モジュール」メニューから 「アクション手続き」を選択すると表示されます。
図 6-8 の例では、「doActionE」 がアプリケーションで定義が必要なアクションです。図 6-9 はこのアクションの定義を示しています。「アクション名」 にはトランスレーションダイアログで使用した名前を指定します。「手続き名」 には、呼び出される関数の名前を指定します。わかりやすさのために、通常これらの名前には同じ名前を使 用します。
アクション関数にはクライアントデータは関連付けられていませんが、トランスレ ーションダイアログのアクションで定義した引数が渡されます。トランスレーションダイアログでは、任意 の数の文字列引数を括弧で囲んで指定できます。
アクション関数は、デザイン内にいくつでも定義できます。Sun WorkShop Visual は、定義したアクション関数のスタブ、および関連付けられたアクションテーブルをメインコードファイル に生成します。
Sun WorkShop Visual では、以下の Xt 手続きを追加できます。
1. 追加のイベント手続き
この手続きには、入力ソースとタイムアウトがあり、イベントのソースとして処理されます。同様に、Xt
作業手続きも追加のイベント手続きに含まれており、処理するイベントがない場合に呼び出されます。
2. 言語手続き
アプリケーションの言語対応をカスタマイズする方法として、X
アプリケーションの開始時に、これらの関数の 1
つが呼び出されます。言語手続きはいくつでも指定できます。
3. イベントハンドラ
これらの関数は、事前定義したアクションが 1 つでも起動されると呼び出されます (例 : マウスボタン 1
が押された場合)。これらの手続きはトランスレーションテーブルを介しません。
上記の最初の 2 種類の Xt 手続きはアプリケーション全体に対して指定します。3 番目の手続きはウィジェットごとに指定します。各手続きについての詳細は、以下で説明します。
Xt (X ツールキット) アプリケーションは、通常、X サーバーからのイベントを待ちます。キーボードの押下やマウスクリックなどのユーザーアクションは、X サーバーを介して Xt アプリケーションに送られます。ユーザーアクションが発生しなければ、アプリケーションはアクションが 発生するのを待つだけです。つまり、Xt アプリケーションは膨大な時間をアクション待ちに費やす可能性があるということです。そのため、Xt では、他に処理するイベントがない場合に、呼び出す手続きを登録できます。さらに、X サーバーに起因していない特定のイベントに応答する手続きを登録することもできます。追加することので きる「追加の」手続きは次のとおりです。
Sun WorkShop Visual 内に追加したウィジェットコールバック関数と同様に、追加した Xt 手続きがスタブファイルへのスタブとして生成されます。ウィジェットコールバックの編集と同じ方法で、 Sun WorkShop Visual 内からスタブを編集できます。手続きを追加するためのコードは、Sun WorkShop Visual によってメインモジュールに生成されます。
これらの手続きを追加するには、「モジュール」メニューから対応する項目を選択 してください。各関数について以下で詳細に説明します。
作業手続きは、Xt が他に処理するイベントがない場合に呼び出される関数です。そのため、作業手続きは、Xサーバーからの イベントに干渉せずにバックグラウンドでバッチ処理を行う場合に使用できます。作業手続きの一般的な使 い方の 1 つにプログラムの初期設定があります。アプリケーションの起動時には、多くのウィジェットを作成しなけ ればならない場合が頻繁にあります。ウィジェットの作成には膨大な時間がかかるため、作業手続きを使用 することで、アプリケーションはユーザーアクションに対して即座に応答することができます。
作業手続きは True または False の値を返します。True は、関数が実行後に作業待ち行列から削除されることを示します。False は、待ち行列にユーザーイベントがなければ、次回に作業手続きが再度呼び出されることを示します。作業 手続きは、いつでも必要な数だけ登録することができます。
作業手続きを追加するには、「モジュール」メニューから 「作業手続き」 を選択してください。これにより、図 6-10 に示すダイアログが表示されます。作業手続きはいくつでも追加できますが、作業手続きの実行中は他のイ ベントをアプリケーションが処理できないことを留意しておいてください。そのため、作業手続きはすぐに 返される必要があります。作業手続きの優先順位は、一般的に、登録された順になります。
ファイルやパイプをイベントのソースとして設定する場合に入力手続きを使用しま す。入力手続きは、ファイルが読み取り (または書き込み) 準備できたときに呼び出されます。入力手続きを追加するには、「モジュール」メニューから 「入力手続き」 を選択してください。図 6-11 に示すダイアログが表示されます。
入力手続きを定義するには、ファイルやパイプのファイル記述子を指定する必要が あります。「入力マスク」には、ファイルに必要なアクセスの種類を指定してください。ファイルに指定し たアクセスが設定されると、入力手続きが呼び出されます。入力手続きはいくつでも定義できます。定義さ れた順に追加されていきます。
タイムアウト手続きは 指定した時間の経過後に関数を実行する場合に使用します 。タイムアウトが呼び出されるのは一度だけです。したがって、タイムアウト手続きを定期的に呼び出す場 合は、終了する前に、そのタイムアウト手続きを別のタイムアウト手続きとして追加する必要があります。 これを行うには、次の関数呼び出しを実行します。
XtAppAddTimeOut(appContext, timeoutPeriod, procedure, clientData);
タイムアウト手続きを追加するには、「モジュール」メニューから「タイムアウト 手続き」を選択してください。図 6-12 に示すダイアログが表示されます。
UNIX で頻繁に使用される方法としてシグナルを使った時間割り込みプログラミングがありますが、X 環境ではタイムアウト手続きの方が適しています。タイムアウト手続きはいくつでも定義できます。定義し た手続きはすべて、Sun WorkShop Visual によってメインコードファイルに生成されます。
アプリケーションは特定のロケールの環境で動作します。キーボード入力の受け取 り方、文字および日付の形式や時間文字列の表示の仕方はロケールによって決まります。そのため開発者は 、世界各国で使用できるようにアプリケーションをカスタマイズできます。
Sun WorkShop Visual は、X ツールキットのルーチン XtSetLanguageProc への呼び出しをメインコードファイルに生成します。このルーチンへの引数の 1 つが、ロケールを設定する手続きの名前です。Xt にはデフォルトの言語手続きが用意されていますが、独自の定義付けを行なって、ロケールの設定方法を追 加したり、特定のロケールだけをサポートするように指定することもできます。言語手続きを定義するには 、「モジュール」メニューから 「言語手続き」 を選択してください。図 6-13 に示す「言語手続き」ダイアログが表示されます。
言語手続きはいくつでも指定できますが、有効になるのは 1 つだけです ( XtSetLanguageProc の引数として渡すことのできる言語手続きは 1 つだけであるため)。Sun WorkShop Visual は、「言語手続き」ダイアログの一番上に表示されている手続きを引数として渡します。ダイアログ中の手 続きの順序は、言語手続きのリストの下にある矢印ボタンで変更できます。その場合、該当する手続きを選 択して、その手続きがリストの一番上に表示されるまで上向き矢印ボタンを押し続けてください。スタブは 、すべての言語手続きに対してスタブファイルに生成されます。
イベントハンドラは、ウィジェットのトランスレーションテーブルを介さない、低 レベルの入力処理を実行する場合に役立ちます。イベントハンドラは、特に、多数のイベントがある場合に 適しています。トランスレーションとそれに関連付したアクションでイベントハンドラと同様の機能を果た すこともできますが、イベントハンドラを使用する方がイベントの処理が簡単になります。
他の Xt 関数とは異なり、イベントハンドラはアプリケーション全体ではなく個々のウィジェットで定義されます。
イベントハンドラを追加するには、イベントが必要なウィジェットを選択した状態 で「ウィジェット」メニューから 「イベントハンドラ」 を選択します。図 6-14 に示すダイアログが表示されます。
このダイアログには、関数を入力するためのテキストフィールドとイベントマスク があります。テキストフィールドの横にはボタンがあり、このボタンを押すと使用可能な手続きやイベント マスクを示すサブダイアログが表示されます。新しい関数を定義できますが、イベントマスクはサブダイア ログに表示されている有効なイベントマスクでなければなりません。Javaコードに適用できるイベントマス クには、図 6-15 に示す Java のコーヒーカップのマークが注釈として付けられます。
「マスク不可」 トグルがオンになっている場合は、イベントハンドラはマスクできないイベント (ClientMessage、GraphicsExpose、MappingNotify、NoExpose、SelectionClear、SelectionNotify、SelectionRequest) も受け取ります。これらのイベントは特に便利なものではないため、通常このトグルはオフに設定します。
「生データ」 トグルは、raw イベントハンドラの追加を Sun WorkShop Visual に通知する場合に使用します。このイベントハンドラは、登録されたイベントに対しては即座に応答しませ ん。ただし、別のイベントハンドラなどによってイベントがどこかで選択されると、ハンドラが起動されま す。
raw イベントハンドラの使い方の 1 つに別のイベントハンドラの 「シャドウ」 があります。raw イベントハンドラともう 1 つのイベントハンドラの両方が同じイベントマスク (ただし、一方だけが raw イベントマスク) で追加されると、適切なイベントが発生したときに両方のハンドラが呼び出されます。この場合、raw イベントハンドラがもう 1 つのハンドラが受け取ったイベントを記録します。
コールバック関数と同様に、同じイベントハンドラを複数 (任意) のウィジェットに対して指定できます。内容の設定は「クライアントデータ」テキストフィールドで行いま す。
一般的に、ウィジェットに組み込み処理に対するサポートがほとんどない場合、ま たは大量の入力や定型的でない入力に対する処理が必要な場合には、イベントハンドラが使用されます。た とえば、描画領域ウィジェットにはイベントハンドラを使用した方がよいでしょう。
イベントハンドラは、通常、Sun WorkShop Visual によって一般的なウィジェット構成の一部としてコードファイルに生成され、スタブはスタブファイルに生 成されます。
イベントハンドラには 「ウィジェット注釈」 があります。「表示」メニューのプルライトメニューからイベントハンドラ注釈を示す「イベント」を選択 すると、イベントハンドラが定義されているウィジェットが一目でわかります。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |