グラフィカル ユーザー インターフェイス

概要

要約:
Curl® 言語のグラフィックスおよびユーザー インターフェイスは、 Curl® GUI ツールキットと、 グラフィック オブジェクトやシーンを作成するための、独自に作成するインターフェイスで構成されます。 GUI ツールキットは、Curl 言語によるアプレット作成を容易にするための高度なビルディング ブロックのコレクションで、次の機能をサポートしています。
  • HTML に似た、簡単なテキストおよび画像
  • 高度なカスタマイズが可能な、複雑なインタラクティブ レイアウト
GUI ツールキット は、テキスト書式、画像、リンク、ボタン、ドロップダウン リスト、テキスト フィールドなど、シンプルな定義済みの要素に基づく一連の機能をサポートしています。これらを使って、シンプルな HTML に似たインタラクティブ Web ページ、複雑で高度にカスタマイズされた Web アプリケーションの両方を作成することができます。
ツールキット は以下の開発者を対象としています。
GUI ツールキット は高レベルのユーザー インターフェイスの作成に使われることから、ほとんどの Curl Web アプリケーションで使用されています。ツールキット の機能は次のとおりです。
テキストのフォーマットの方法は 「テキスト書式について」 でチュートリアル方式で解説されています。  「テキストフォーマット」は 組み込まれたテキスト書式と自分で作成する書式方法について書かれています。

GUI ツールキットのスーパーパッケージ : CURL.GUI.STANDARD

GUI ツールキットは、テキストやグラフィックスを受け入れる高レベルユーザー インターフェイスをサポートするパッケージから成り立っています。

スーパーパッケージの CURL.GUI.STANDARD はすべてのGUI ツールキットパッケージを含んでいます。

Curl® 実行環境が、アプレットソースコードの中の {curl ... applet} ヘラルドに遭遇すると、 自動的にCURL.GUI.STANDARD がインポートされます。 Curl アプレットとヘラルドの詳細は 「アプレット」を参照してください。 CURL.GUI.STANDARDCURL.GRAPHICS.STANDARD スーパーパッケージをインポートします。
{curl ... package} ヘラルドを指定してアプレットではなくパッケージを作成する場合は、 CURL.GUI.STANDARD パッケージがコンパイルされる時に自動的にロードされません。 GUI ツールキット機能をパッケージに含めるには、インポート式を使用してください。
{import * from CURL.GUI.STANDARD}
注意: アプレットが必要としているパッケージのみをインポートする場合は、 CURL.GUI.STANDARDの中のパッケージには多くの従属関係があることに注意してください。

グラフィカル オブジェクト

Curl® GUI ツールキットには、グラフィカル ユーザー インターフェイスでアプリケーションを作成するために使用されるクラスの完全なセットがあります。このシステムにおいて、ディスプレイ用に作成されたすべてのオブジェクトは、それらが Visual サブクラスのインスタンスであることから、可視オブジェクトと呼ばれます。Visual クラスは、表示可能なオブジェクトを表します。
可視オブジェクトには、書式設定されたテキストとその他すべてのグラフィックの 2 つの異なるタイプがあります。書式設定されたテキストには、文字書式、段落書式、表テキスト書式など、テキストの書式設定式で作成されたすべてのオブジェクトが含まれます。テキストの書式設定の詳細は、「テキスト書式」を参照してください。他のすべての可視オブジェクトは、Graphic サブクラスのインスタンスであるため、グラフィカル オブジェクトと呼ばれます。
以下は、グラフィカルオブジェクトがプロパティーを継承できる重要なトップレベルクラスです。
OptionListInterface
DataBindingTarget
GraphicOptions
Visual
Graphic
Curl® 言語で書き込まれたアプレットをプログラミングする場合は、通常、グラフィカル オブジェクトを別のグラフィカル オブジェクト (ウィンドウやコンピュータ画面など) 内で表示される可能性がある、コンテナとして機能する他のグラフィカル オブジェクト (スクロール ボックスや表など) に挿入することによって、グラフィカル オブジェクトのグラフィック階層を構築し、ユーザー インターフェイスを作成します。
非グラフィカル オブジェクトをグラフィック階層に加えると、Curl® 実行環境 は自動的にまずその非グラフィカル オブジェクトをグラフィカル オブジェクトに変換しようと試みます。文字列や書式が設定されたテキストは、グラフィカル コンテナ内に置かれると自動的にグラフィカル オブジェクトに変換されます。この自動変換メカニズムによって、テキストを簡単に各グラフィック階層に追加できます。このように、さまざまな方法で書式が設定されたテキストや設定されていないテキストの一部をグラフィカル オブジェクトのように使用できます。
すべてのグラフィカル オブジェクトおよび要素にはそれらの表示方法を定義する属性があります。これらの属性はオプションと呼ばれ、オプションによってグラフィカル ユーザー インターフェイスを構築する際に、明示的にまたは自動的に設定できます。

グラフィック階層

ユーザー インターフェイスとして機能するために構築されたグラフィック階層は、ネストされたグラフィカル オブジェクトの構造を表します。たとえば、
ダイアログ ボックスにあるテキスト、編集可能なテキスト フィールドおよび 2 つのコマンド ボタンで構成される構造は、グラフィック階層を表します。


テキスト、テキスト フィールド、ボタン、およびダイアログ ボックスはすべてグラフィカル オブジェクトです。ボタンがダイアログ ボックスに置かれた場合、ボタンはダイアログ ボックスのグラフィカルな子で、ダイアログ ボックスはボタンのグラフィカルな親です。
通常、Curl アプレットの実行中は、複数のグラフィック階層は任意のどの時点にも存在しますが、任意のグラフィカル オブジェクトは同時に多くて 1 つのグラフィック階層の一部となります。各グラフィック階層は RootFrame オブジェクトをその階層のルートに持ちます。
オブジェクトをグラフィック階層に追加すると、Curl 実行環境 はこれらのオブジェクトのいくつかを変換し、他のオブジェクトをそれらのオブジェクトに暗黙的に追加したりする可能性があります。これらのオブジェクトはディスプレイには表示されませんが、グラフィック階層を表示するための インスペクター を使用すると、インスペクター に表示されます。インスペクタ に関する詳細は、IDEドキュメンテーションのインスペクタの章を参照してください。
Curl 言語では、次の 2つのスタイルを使用してグラフィック階層を作成できます。 GUI ツールキットを使用すると、これら 2 つのスタイルをシームレスに結合できます。次のセクションに、両方のプログラミング メソッドの例を示します。

グラフィック階層の構築

このセクションでは、VBox テキスト要素、TextFieldHBox、および 2 つの CommandButton で構成される簡単なグラフィック階層の構築方法を 2 つ示します。VBoxHBox、および他のすべてのグラフィカル コンテナのタイプに関する詳細は、「グラフィカル コンテナ」の章を参照してください。CommandButton の詳細は、『開発者ガイド』の「ボタン コントロール」のセクションを参照してください。


宣言型でのグラフィック階層の作成

宣言型スタイルを使用してネストされたグラフィカル オブジェクトを作成すると、グラフィック階層が 1 つの大きなステップで構築されたと考えることができます。グラフィック階層は次のように構築されます。
  1. 以下を含む VBox を作成します。
Curl 言語式の構造は、グラフィック階層の構造を映します。このグラフィック階層の構造で、VBox にはテキスト、TextField、および 2 つの CommandButton を持つ HBox が含まれます。オブジェクトの相対的な配置は、各オブジェクトの中かっこの相対的位置で定義します。次のサンプル グラフィック階層に、このような式の構文を示します。
{ClassName1 option-bindings1,
    {ClassName2 option-bindings2},
    {ClassName3 option-bindings3}
}
説明:
例にあるコードは、幅、高さ、境界の色といった様々なグラフィカル オブジェクトの表示方法を決定するオプション設定を示すことに注目してください。コードはクラス名の後に置く必要がありますが、コードが対応するオブジェクト インスタンスの中かっこ内であれば、グラフィカルな子の前、中、後ろのどこにでも置くことができます。

例: 宣言型でのグラフィック階層の作成
|| Here graphical objects are created directly within a
|| VBox container without assignment to variables
{VBox spacing=6pt,
    margin=0.25in,
    background="silver",

    ||text
    "Enter the name of a famous Curler:",

    ||TextField
    {TextField width=3in},

    ||HBox containing two CommandButtons
    {HBox spacing=6pt,
        {CommandButton label="OK"},
        {CommandButton label="Cancel"}
    }
}

変数でのメソッド呼び出しの使用

次の例に示すように、グラフィカル オブジェクトを表す変数を使用して同じレイアウトを構築できます。この例では、(すべてのグラフィカル オブジェクトによって継承された) Visual.add メソッドおよび代入式の使用方法も示します。
set field-access-expression = option-value
この方法を使用して、次のようにグラフィック階層を構築できます。
  1. VBoxHBox を作成します。
  2. 2 つの CommandButtonHBox に加えます。
  3. テキストを VBox に加えます。
  4. 同様に TextField を加えます。
  5. 同様に CommandButton を含む HBox を加えます。
  6. VBox のオプションを設定します。

例: 変数でのメソッド呼び出しの使用
|| Using the variables v and h to represent the
|| VBox and HBox graphical objects respectively

||Create VBox and HBox
{value
    let v:VBox={VBox}
    let h:HBox={HBox spacing=6pt}

    ||Add two buttons to HBox
    {h.add {CommandButton label="OK"}}
    {h.add {CommandButton label="Cancel"}}

    ||Add text, TextField and HBox to VBox
    {v.add "Enter the name of a famous Curler: "}
    {v.add {TextField width=3in}}
    {v.add h}

    ||set the options of the VBox
    set v.spacing=6pt
    set v.margin=0.25in
    set v.background="silver"

    v
}

グラフィック階層のオブジェクトのインスタンス

要約:
オブジェクトの各インスタンスは、グラフィック階層において 1 度だけ生成されます。
n オブジェクトがある各グラフィック階層には、n オブジェクト インスタンスがあることに注意してください。つまり、グラフィック階層に同じオブジェクトの複数のコピーは存在できないため、どのオブジェクトもコピーではないということです。可視オブジェクトを表す変数を使用している場合、参照された各変数は、特定の Visual インスタンスを示します。
よくある間違いは、グラフィック階層への可視オブジェクトの追加を配列へのオブジェクトのコピーの追加と同様に扱うことです。可視オブジェクトをグラフィック階層のどこかに追加しようとする際に、そのオブジェクトが既にグラフィック階層にある場合、そのオブジェクトは新しい場所に移動されます。
以下の例を参照してください。表 (t) は、それ自体に 2 つのボタンを追加しようとします。最初の t.add 呼び出しは、ボタンを最初の行にある右のテーブル セルに置きます。しかし、t が同じボタンを次の呼び出しに追加しようとするため、2 番目の t.add 呼び出しは最初の行からボタンを取り出し、そのボタンを 2 番目の行に置きます。結果として生じるテーブルにあるボタンは 1 つだけで、そのボタンは 2 番目の行の右のテーブル セルにあります。

例: 同じオブジェクトを 2 回追加
{value let b:CommandButton={CommandButton label="hello"}
    let t:Table={Table columns=2,
                    background="pink",
                    valign="center"}
    {t.add {text Button 1:}}
    {t.add b}
    {t.add {text Button 2:}}
    {t.add b}
    t
}
次の例は、ボタンのクローンをテーブルに追加する方法を示します。コードでは、ボタンが呼び出されるたびに新しいボタンを作成するプロシージャを定義します。このプロシージャにより、オブジェクトを現在の在置から取り出し、グラフィック階層にある別の位置に置く動作が回避されます。

例: オブジェクトのクローンの追加
{define-proc public {another-b}:CommandButton
    {return {CommandButton label="hello"}}
}

{value let t:Table={Table columns=2,
                       background="pink",
                       valign="center"}
    {t.add {text Button 1:}}
    {t.add {another-b}}
    {t.add {text Button 2:}}
    {t.add {another-b}}
    t
}