Sun WorkShop Visual では、スマートコードというツールキットに依存しないコードを生成できます。スマートコードは、単独の アプリケーションでも、クライアントとサーバーで構成される「クライアントサーバーアプリケーション」 でも使用できます。クライアントサーバーアプリケーションに使用される場合、Sun WorkShop Visual は、Java、Motif (C または C++) あるいは Microsoft Windows の MFC コード、および別個のサーバーアプリケーションを使用して、 thin クライアントを生成します。Sun WorkShop Visual は、トランスポートプロトコルとして HTTP を用いるコードを生成します。生成されたアプリケーションは、企業のイントラネットで使用したり、イン ターネット上のさまざまなサイトに接続することができます。
デザインからクライアントサーバーや「Web 対応」のアプリケーションを作成するため、Sun WorkShop Visual は、通信用の基本データ構造として「グループ」を使用し、グループにアクセスする手段としてスマートコ ードを使用します。グループ機能は、これ以外にもデザインの操作に役立てることができます。グループに ついては、第 15 章「グループ」を参照してください。
デフォルトでは、従来の Motif、MFC、または Java のコールバックが生成されます。スマートコードを生成するには、「コールバック」ダイアログで「スマー トコード」トグルを選択してください。
スマートコードにより、コールバックは (言語独立ではなく) ツールキット独立になります。生成したい言語は選択できます。スマートコードは、指定の言語を使用して グループ内のウィジェットを「包み込む」コードの層です。
図 16-1 に示すオプションメニューにより、以下のどちらかのスタイルのスマートコードを選択できます。
1. 取得/設定
ウィジェットのグループに対して「getter」関数と「setter」関数を提供します。
2. thin クライアント
getter と setter を提供するだけではなく、Sun WorkShop Visual
に、ユーザーインタフェースを含んだ別個のクライアントアプリケーションと、スマートコードのコールバ
ックを含んだサーバーアプリケーションを生成させます。さらに、この 2
つの間の通信プロトコルを処理するコードも生成されます。
3. インターネット
このオプションは、上述の「thin
クライアント」オプションにきわめてよく似ていますが、サーバーアプリケーションは生成されません。こ
のオプションは、既存のサーバーに接続するアプリケーションや Web
ページを取り出すアプリケーションを生成するために使用します。
スマートコードのコールバックにはグループが必要です。このグループは、ツール キットに依存しない方法でプログラムできるオブジェクト群へのハンドルをコールバックに提供します。グ ループを指定するには、次のどちらかを実行します。
「スタイル」オプションメニューを使用すれば必要なスマートコードのタイプを選 択できるため、作成するアプリケーションの構造を選択できます。各スタイルで生成されるコードは異なり ます。以下の項では各スタイルを個々に説明します。
「コールバック」ダイアログのスマートコードの「スタイル」メニューから「取得/ 設定」を選択すると、Sun WorkShop Visual は、指定したグループ内のコンポーネントに対してツールキットに依存しないラッパーを生成します。これ らは「getter」関数および「setter」関数とも呼ばれ、ツールキット固有のコードを書かずに、グループの コンポーネントの値を取得および設定することができます。
たとえば、C を使用しており、図 16-2 に示すように、「MyGroup」というグループに「text1」というウィジェットと「toggle1」というトグルが あるとします。
コールバック内のこのグループにアクセスするには、スマートコードのコールバッ クを定義し、スマートコードのスタイルとして「取得/設定」を選択し、コールバックで使用するグループ として「MyGroup」を指定します。これを図 16-3 に示します。
図 16-3 に示すコールバック用に生成されるコードは次のようになります。
#include <stdio.h>
#include "sc_groups_c.h"
void
accessMyGroup_user ( d, group, client_data)
sc_data_t * d;
MyGroup_t* group;
void* client_data;
{
}
スマートコードのコールバックに渡されるデータ構造 sc_data_t には、主にクライアントとサーバー間の通信に関係する情報が含まれています。この構造の定義は、ヘッダ ーファイル sc_groups_<言語>.h に含まれています。Sun WorkShop Visual は、このファイルを「コード生成」ダイアログで指定したディレクトリに生成します。スマートコード用に 生成されるコードの詳細については 「生成コード」、デザインからクライアントとサーバーを作成する方法については 第 17 章「thin クライアント用スマートコード」を参照してください。
「text1」の値を得るには、このコールバックに次の行を追加する必要があります。
char * val = SC_GET(Value, group->text1);
次に示すコードでは、トグルの状態を確認し、トグルがオンになっている場合には 「text1」にテキストを入力します。
if (SC_GET(State, group->toggle1)
SC_SET(Value, group->text1, "The toggle is set");
この例では、C を使用しているものと想定しています。C
の構文は扱いにくいため、プログラミングのしやすさを維持するためにマクロが使われています。このマク
ロは SC_SET と SC_GET であり、2 つの引数を受け取ります。最初の引数は参照の種類
(値、状態などの取得しようとしている対象) であり、2 番目の引数は (グループを介して)
アクセスしたいウィジェットです。
「コード生成」ダイアログで言語として C++ を選択した場合には、図 16-3 に示す例に対して生成されるスマートコードのコールバックは、上の例の場合とは異なります。この場合に は、Sun WorkShop Visual は、新しいクラス名としてコールバックの名前を使用して、定義済みの内部スマートコードクラス sc_data_c のサブクラスを生成します。クラス sc_data_c は、上述の C データ構造 sc_data_t に対応しています。このコールバックが起動されたときにメインアプリケーションから呼び出されるルーチ ンは、新しいクラスの doit() メソッドです。以下にディレクトリ callouts_cpp の accessMyGroup_user.cpp の内容を示します。accessMyGroup は、「コールバック」ダイアログに入力されたコールバック・メソッドの名前です。
getGroup() メソッドは、親 sc_data_c クラス内の簡易ルーチンです。
#include <stdio.h>
#include "sc_groups_cpp.h"
class accessMyGroup_user: public sc_data_c
{
void doit() {
MyGroup_c * g = (MyGroup_c *)getGroup();
/* 自分のコードをここに追加します */
}
};
sc_data_c *
getNew_accessMyGroup()
{
return (sc_data_c*) new accessMyGroup_user;
}
C++ では、C コードで説明したマクロを使用する必要はありません。次のコード行は「text1」の内容を取り出します。
char * str = g->text1->getValue();
次の行はトグルの状態を確認し、トグルがオンになっている場合には「text1」の内 容を設定します。
if (g->toggle1->getState())
g->text1->setValue("The toggle is set");
「コード生成」ダイアログで言語として Java を選択した場合には、図 16-3 に示すスマートコードのコールバックが、SCData スマートコードクラスのサブクラスとして生成されます。これは、上述の C++ の場合に似ています。クラスの doit() メソッドに、ユーザー自身のコードを追加します。スーパークラスである SCData には、グループへのハンドルを取得するための簡易関数が含まれています。SCData クラスは、生成ディレクトリの下位にある utils_java サブディレクトリのファイル SCData.java で定義されます。
図 16-3 に示す例の場合には、 callouts_java サブディレクトリの accessMyGroup_user.java というファイルに以下のコードが生成されます。
package callouts_java;
import groups_java.* ;
import utils_java.* ;
public class accessMyGroup_user extends SCData
{
public void doit() {
group0_c g = (group0_c)getGroup();
/* 自分のコードをここに追加します */
}
public static accessMyGroup_user getNew()
{
return new accessMyGroup_user();
}
}
Java では、C コードで説明したマクロを使用する必要はありません。その代わり、C++ の場合と似た操作を行う必要があります。次のコード行は「text1」の内容を取り出します。
String str = g.text1.getValue();
次の行ではトグルの状態を確認し、トグルがオンになっている場合には「text1」の 内容を設定します。
if (g.toggle1.getState())
g.text1.setValue("The toggle is set");
上の例では、「活性化」用に定義されたコールバックを示します。つまり、「取得/ 設定」コードは、ボタンが押されるまで呼び出されません。ダイアログが最初に表示されたときにダイアロ グ内のウィジェットを「準備する」必要がある場合には、シェルの「作成」コールバックに対してスマート コードのコールバックを定義してください。このコールバックは、ダイアログの作成時に一度だけ行われま す。
ウィジェットの作成コールバックは、すべてのウィジェットの子が作成された後で 呼び出されます。スマートコードのコールバックからアクセスするには、グループ内のウィジェットを事前 に作成しておく必要があります。シェルの作成コールバックを使用してダイアログを準備すれば、シェルは 作成される最後のウィジェットであるため、作成コールバックが起動される前に、必ずすべてのウィジェッ トが作成されます。シェル上にコールバックを設定したくない場合には、グループ内のすべてのウィジェッ トを含んでいる任意のコンテナをデザインに追加します (まだの場合)。子ウィジェットは必ず親よりも前に作成されるため、このようにすれば、スマートコードの コールバックが起動される前に、スマートコードのコールバック用に指定したグループ内のウィジェットが 確実に作成されます。
ツールキットに依存しないラッパーは、手軽に使用できます。ウィジェットの種類 ごとに提供される関数の一覧については、「getter と setter」を参照してください。
コールバックを検索しやすくし、スマートコードの要求時に生成されるファイルに 慣れていただくため、Sun WorkShop Visual は一連の HTML ファイルも生成します。主要な HTML ファイルは以下のものです。
このファイルは、最上位ディレクトリ (つまり、「コード生成」ダイアログで指定したディレクトリ) にあります。
このファイルを Web ブラウザ (または HTML を読み込めるその他のソフト) で開くと、生成されるファイル名が簡単な説明とともに表示されます。また、生成ディレクトリから Sun WorkShop Visual のインストールディレクトリにシンボリックリンクが張られているため、このファイルからスマートコード の一般的な機能について記述する HTML ファイルを参照することもできます。
ここでは、グループと取得と設定用のスマートコードの主要な機能を紹介します。 この学習では、グループを設定し、スマートコードを使用してグループメンバーの値を取得および設定しま す。
完成したアプリケーションは、図 16-4 に示すようになります。
1. Sun WorkShop Visual を起動します。
2. アプリケーションシェルとフォームを作成します。ボタン、ラベル、テキストフィールド、およびトグルを フォームの中に入れます。
この最初の階層を図 16-5 に示します。
グループエディタは、図 16-6 に示すように表示されます。
4. 新しいグループの名前を「MyGroup」に変更するには、これを「名前」というテキストフィールドに入力し て Return キーを押します。
グループの名前を変更する必要はありませんが、特に多数のグループを作成する場 合には、名前を変更すると後の操作が簡単になることがあります。
後で見るように、「適用」ボタンが有効になるのは、コールバックに追加するグル ープを選択しているときだけです。
6. 図 16-7 を参考にして、フォーム内のウィジェットとボタンのラベルの配置、ラベル、およびトグルを変更します。
これは単なる表面的な変更です。ボタンのラベルは「Go」、ラベルは「Text:」、 トグルのラベルは「Set text」に設定します。
これを行うには、ツールバー上の「コールバック」ボタンを押すか、またはウィジ ェットメニューから「コールバック」を選択します。
8. コールバックのリストで「活性化」が選択されていることを確認します。
「活性化」を選択するのは、ボタンが押されたときにコールバックが呼び出される ようにするためです。
注 - コールバックのリストでは、活性化コールバックの後に「J」が表示されています。 これは Java コードに適用できることを示しています。これらの注釈については、「コールバック」を参照してください。
10. 「スマートコード」オプションメニューから「取得/設定」を選択します。
これによってグループエディタが表示されます。なお、「適用」ボタンは現在有効 になっています。
エディタが消えて、グループボタンの横にあるテキストフィールドに名前「MyGrou p」が追加されます。名前を直接テキストフィールドに入力することもできます。
13. コールバックに「doGoButton」という名前を付けて「追加」を押します。
ピリオドを中括弧で囲んだ状態 ({...}) で新しいコールバックがリストに表示され、これはスマートコードのコールバックであることを示します。 定義されたコールバックを図 16-8 に示します。
コールバックの定義が完成しました。次は、これに記入する必要があります。
15. デザインを tutorial.xd として保存します。
16. 「コード生成」ダイアログを表示し、ソースファイルのターゲットディレクトリを選択します。
17. 「スタブ」、「コード」、「外部宣言」、「メインプログラム」、および「メークファイル」の生成トグル がオンになっていることを確認します。
「コード生成」ダイアログの正しい設定を図 16-9 に示します。この学習では、ファイルの名前をデフォルトの「untitled」から「tutorial」に変更しました 。
18. 「コード生成」ダイアログの上の方にある「オプション」ボタンを押して「コード生成オプション」ダイア ログを表示します。
19. 「文字列」オプションメニューに「コード」を設定し、このダイアログを閉じます。
「取得/設定」スマートコード用に生成されるファイルについては、「取得/設定の生成コード」を参照してください。
22. 好みのエディタを使用して、ディレクトリ callouts_c 内のファイル doGoButton_user.c を編集します。
これは図 16-10 で強調表示されているファイルです。
#include <stdio.h>
#include "sc_groups_c.h"
void
doGoButton_user ( d, group, client_data)
sc_data_t * d;
MyGroup_t* group;
void* client_data;
{
}
if (SC_GET(State, group->toggle1))
SC_SET(Value, group->text1, "The toggle is set");
else
SC_SET(Value, group->text1, "");
これで学習が完了しました。この学習で追加した関数は非常に簡単なものですが、 ここで確立した枠組みに従えば、自分のアプリケーションをきわめて簡単に拡張することができます。thin クライアント用スマートコードのコールバックを定義することにより、デザインからクライアントとサーバ ーの両方を簡単に生成できます。これについては、第 17 章「thin クライアント用スマートコード」を参照してください。具体的な方法については、「thin クライアント用スマートコードの学習」を参照してください。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |