レイアウトの構築

はじめに

VLE でレイアウトを構築する場合は、VLE パレットと共に [レイアウト ツリー] ペインと [レイアウト] ペインを使用して、オブジェクトをレイアウトに追加したりオブジェクトのサイズや位置を変更したりします。次に、[プロパティ] ペインを使用してオブジェクトのプロパティを編集します。この章では、VLE の UI の使用方法と作業時の VLE からのフィードバックについて説明します。
レイアウトの編集」のセクションでは、オブジェクトのレイアウトへの追加方法、およびそれらのオブジェクトの操作方法について説明します。「プロパティの編集」のセクションでは、レイアウトに追加したオブジェクトのプロパティの編集方法について説明します。これら2つのセクションでは、レイアウト内でのすべてのオブジェクトに共通の問題について述べています。それに続くいくつかのセクションでは、レイアウト内での特定のオブジェクトの使用に関する特有の問題について述べています。

レイアウト : プロセスの概要

VLE レイアウトの構築手順の概要を以下に示します。

レイアウトの編集

[レイアウト ツリー] ペインと [レイアウト] ペインは、UI レイアウトの構築に役立つ 2 つのビューを提供します。[レイアウト ツリー] は、レイアウト内のコンテナ、コントロールおよび他の UI オブジェクトの階層ツリー ビューを表示し、[レイアウト] ペインは UI オブジェクトの外観をビジュアル表示します。どちらのペインでも UI オブジェクトに対して多数の操作を実行することができ、両方のペインはさまざまな場面で連動します。
[レイアウト ツリー] ペインでは、コンテナ内の子オブジェクトの順位も示されます。VBox などの場合、子オブジェクトの順位はオブジェクトがレイアウトに現れる順番にもなります。たとえば、VBox の子オブジェクト順位で最初にあるオブジェクトは、レイアウトではボックスの最上位に現れます。Canvas など、コンテナ内のオブジェクトの位置が子オブジェクトの順位に関係しないオブジェクトもあり、この場合、子オブジェクトの順位は UI コントロールのタブ順序などに反映されるだけです。

オブジェクトの追加

オブジェクトを追加するには、[パレット] でオブジェクト アイコンをクリックし、[レイアウト ツリー] または [レイアウト] ペインをクリックしてレイアウトに挿入します。VLE には、新規オブジェクトの挿入場所を示すインジケータが現れます。次の図では、HBox のオブジェクトが右端の ListBox の右側に挿入されるようにカーソルが置かれています。ターゲット オブジェクトを囲むオレンジ色の境界線と、新規オブジェクトの位置を示す緑色の線 (両方のペインにあります) に注目してください。
Figure: HBox へのオブジェクトの追加
上図を次の図と比べてみてください。次の図のカーソルは、HBox を含む Canvas にオブジェクトが挿入されることを示しています。[レイアウト ツリー] ペインの緑色の線の長さと位置に注意してください。
Figure: Canvas へのオブジェクトの追加
オブジェクトを追加するときにクリックしてドラッグし、レイアウト内でオブジェクトのサイズを指定できます。ドラッグせずにクリックするだけの場合、オブジェクトは明示的なサイズ指定なしで追加されます。オブジェクトには、ドラッグせずに挿入した場合に既定のサイズで配置されるもの (CommandButton など) と、実質上サイズ指定のないもの (VBox など) があります。このようなオブジェクトの実際のサイズは、中のオブジェクトのサイズによって決まります。多くの場合、どのようなオブジェクトにも対応できるように、特定の 横幅高さ を指定せずにコンテナを追加する方が便利です。たとえば、VBox を追加した結果は、次の図のようになります。
Figure: 寸法指定のない VBox
左側の HBox には寸法が明示的に設定されていますが、VBox には設定されていません。このようなオブジェクトの内部にオブジェクトを配置してみましょう。次の図では、上図で追加した VBox にオブジェクトが挿入されるようにカーソルが置かれています。[レイアウト ツリー] にある緑色の線の位置を見てください。これは、オブジェクトが VBox の内部に挿入されることを示しています。[レイアウト] ペインでは、サイズ指定のない VBox を囲むオレンジ色の境界線によりこれを確認できます。
Figure: 寸法指定のない VBox へのオブジェクトの挿入

オブジェクトの選択と位置の確認

VLE でアイテムを選択すると、[レイアウト ツリー] ペインでは太字で表示され、[レイアウト] ペインではそのオブジェクトに選択ハンドルが表示されます。[レイアウト ツリー] ペインでアイテムの上にカーソルを移動すると、そのオブジェクト名は緑色で表示され、[レイアウト] ペインではオブジェクトがオレンジ色の境界線で囲まれます。次の図では、左端の ListBox が選択されていて、右端の ListBox の上にカーソルがあります。
Figure: 選択されたオブジェクトとカーソルの位置
一度に複数のオブジェクトを選択できます。Shift キーを押しながらクリックすると、オブジェクトをグループ選択できます。[編集] メニューの [すべて選択] を使用してグループ選択を行うこともできます。次の図はグループ選択を示しています。
Figure: グループ選択
最後に選択されたオブジェクトには白い選択ハンドルが付き、グループの主選択アイテムになります。これは、グループ フォーマット コマンド ([フォーマット] メニューの [同じ幅] など) を使用する場合に、他のアイテムの基準となるオブジェクトです。
また、選択されたオブジェクトは灰色の点線のボーダーラインで囲われます。このボーダーラインをドラッグすることで、オブジェクトの移動が可能です。これは子要素を持つコンテナの移動などに役立ちます。
また、拡大/縮小機能を使って、レイアウト全体を確認することが出来ます。[レイアウト] ペイン左下のDropdownListを使用して倍率を指定してください。 このDropdownListは、以下の2つの特別な機能を提供する子アイテムを持っています。

オブジェクトの移動

VLE では、オブジェクトを移動する場合にも同様のインジケータが表示されます。次の図は、左から 2 番目の ListBox が選択され、3 番目と 4 番目の間に移動することを示しています。ここでも緑色の線とオレンジ色の境界線に注目してください。
Figure: HBox の内部での ListBox の移動
上図を次の図と比べてみてください。この図では、2 番目の ListBoxHBox の外側、Canvas 内部に配置されることを示しています。
Figure: HBox の外側への ListBox の移動

オブジェクトのコピーと貼り付け

[レイアウト ツリー] または [レイアウト] ペインでオブジェクトを選択して、コピーおよび貼り付けを行うことができます。また、オブジェクトをドラッグ中にCtrlキーを押す事でもコピー・貼り付けを行う事が出来ます。この時、オブジェクトがコピー可能である場合はマウスカーソルの横に「プラス」アイコンが表示されます。貼り付け操作では、現在選択されているオブジェクトによって貼り付けられる位置が決まります。さらに、貼り付け操作の後は選択アイテムが変わり、前に選択されていたオブジェクトの選択が解除され、貼り付けた内容が新たに選択されます。現在 1 つのオブジェクトが選択されていて (ほとんどの場合は今コピーしたばかりの、貼り付けようとするオブジェクト)、これがコンテナでない場合、貼り付ける内容は選択オブジェクトの兄弟になり、これを含むコンテナの子オブジェクト順位において、選択オブジェクトの直後に置かれます。
たとえば、次の図は VBox 内の TextField をコピーして 3 回貼り付けた結果を示しています。
Figure: VBox 内の TextField のコピーと貼り付け
現在 1 つのオブジェクトが選択されていて、これがコンテナの場合、そのコンテナ内部の、子オブジェクト順位の最後に貼り付けられます。特に、コンテナでないと考えていたオブジェクトが実際コンテナであった場合などは、この動作が予期せぬ結果となる場合があります(ラベルを含むコンテナである CommandButton など)。
たとえば、次の図は VBox 内の CommandButton をコピーして 3 回貼り付けた結果を示しています。
Figure: VBox 内の CommandButton のコピーと貼り付け
このような結果を避け、先に示した図のような結果を得るには、貼り付け操作の前に CommandButton を中に含んでいるオブジェクトを選択するか、貼り付け後にオブジェクトを並べ替える必要があります。
複数のオブジェクトが選択されている場合、貼り付ける内容はこれらのオブジェクトの親にあたるコンテナ内に挿入され、そのコンテナの子オブジェクト順位において、最後の選択オブジェクトの直後に置かれます。
VLE でオブジェクトを貼り付けるときには、他にも注意する点があります。たとえば、コンテナに他の複数のコンテナが子として含まれている場合、外側のコンテナの子オブジェクト順位の特定位置にオブジェクトを直接貼り付けることはできません。外側のコンテナを選択した場合、貼り付けるオブジェクトは他の既存の子オブジェクトの最後に置かれます。子オブジェクトの 1 つを選択した場合、貼り付けるオブジェクトはその子オブジェクトの中に置かれます。このような場合、該当コンテナの子オブジェクト順位の最後にオブジェクトを貼り付けてから、ドラッグ アンド ドロップ操作で適切な位置に移動するのが最良の方法です。

プロパティの編集

[プロパティ] ペインでは、[レイアウト ツリー] または [レイアウト] ペインで現在選択されているオブジェクトのプロパティ値を設定したり、イベント ハンドラを作成できます。[プロパティ] タブにはこのオブジェクトの利用可能なプロパティのリストが表示され、[イベント ハンドラ] タブには利用可能なイベント ハンドラのリストが表示されます。ペイン上部のタイトル バーには、現在選択されているオブジェクトのタイプが表示されます。
イベント ハンドラとプロパティのリストは、名前またはカテゴリ順にソートでき、カテゴリ ノードを展開したり折りたたむこともできます。タブの下方の領域には、選択したプロパティまたはイベント ハンドラの名前が表示されます。プロパティの場合、簡単な説明も表示されます。プロパティが非ローカル オプションの場合、この表示領域の右側の、プロパティ名とは反対側の端に [非ローカル オプション] と表示されます。

プロパティ値の変更

プロパティ値の多くは、プロパティ名の右側にあるフィールドに直接入力して編集できます。VLE のツールで入力可能な値より、もっと複雑な値を指定する必要がある場合は、選択したプロパティ値を IDE で編集することができます。[編集] メニューから [コードの編集] を選択するか、F7 を押します。またはプロパティを右クリックして、[コードの編集] を選択します。ビジュアル レイアウト エディタで解釈および表示できないコードで構成されるプロパティ値の場合は、プロパティ値フィールドの右側に [コードの編集] ボタンが表示されます。ボタンの リアクティブ ラベル など、プロパティの性質上 VLE で解釈できないために、[コードの編集] ボタンが常に表示されているプロパティもあります。
[プロパティ] ペインでプロパティ値を変更すると、[レイアウト] ペインにも新しい値が反映され、プロパティの名前が太字で表示されます。ビジュアル レイアウト エディタが値を解釈できない場合は、[レイアウト] ペインの表示は変わりません。
文字列を取るプロパティ、または文字列を列挙型の値に変換するプロパティでは、Curl コードの記述では通常は必要な二重引用符を使用せずに入力してください。たとえば、Frame の背景色プロパティを値フィールドで #aaff33 に設定すると、IDE エディタでは "#aaff33" という設定に変換されます。
VLE では、特定の型の値を必要とするプロパティには、適切なプロパティ値を選択する特別のメカニズムが用意されています。

色のプロパティ

背景色 など、値として色を選択するプロパティでは、色選択のダイアログが提供されます。値フィールドの右端にあるアイコン (...) をクリックすると、[色選択] ダイアログが開きます。

寸法のプロパティ

高さ横幅 などのプロパティは値として Elastic を取ることができ、専用の [プロパティ エディタ] を提供します。このエディタでは以下の選択が可能です。

検証のプロパティ

TextField の VLE プロパティ シートには、2 つのプロパティ 検証方法メッセージの表示 があります。これらのプロパティを使用して、フィールドへのユーザー入力を検証できます。検証方法 プロパティを使用すると、TextField に検証機能を追加できます。データ検証の詳細については、「コントロールにおけるデータ検証」を参照してください。値フィールドの右端にあるアイコン (...) をクリックすると、[検証方法 設定] ダイアログが開きます。このダイアログでは以下の選択が可能です。
メッセージの表示 プロパティでは、MessageDisplayTextField に関連付けます。このプロパティを設定するには、まず [コントロール] パレット タブの [MessageDisplay] ボタンを使用して MessageDisplay オブジェクトをレイアウトに追加する必要があります。また、メッセージ表示にはデザイン名を付ける必要があります。メッセージの表示 フィールドの右端にある矢印ボタンをクリックすると、レイアウト内のすべての MessageDisplay オブジェクトの名前がリストに表示されます。

列挙型のプロパティ

水平起点垂直起点 など、特定の値しか指定できないプロパティの場合は、有効な値を含むドロップダウン リストを提供します。フィールドに直接入力することも、IDE で編集することも可能ですが、入力する値は有効な値でなければなりません。

プロパティ値を元に戻す

レイアウトでオブジェクトをまず作成すると、プロパティ シートにはそのプロパティの既定値が表示されます。既定の状態が値指定なしの場合もあります。
プロパティを編集した後で既定値に戻すときは、値の復帰を行う必要があります。[編集] メニューの [プロパティを元に戻す] を選択するか、プロパティを右クリックして [プロパティ値を元に戻す] を選択します。状況によっては、プロパティ値を元に戻しても、入力した値を削除するのとは同じ効果が得られない場合があります。たとえば、ComboBoxvalue プロパティに入力したテキストを削除すると、value = "" になりますが、これと初期化されていない状態とは異なります。初期化されていない状態のプロパティ値に戻った場合は、プロパティ名が太字で表示されなくなることから判断できます。
xy などの特定のプロパティの値は元に戻せないことに注意してください。

レイアウトにおけるシェイプの使用

[パレット] の [シェイプ] タブを使用して、Shape オブジェクトをレイアウトに追加できます。シェイプの一般的な情報については、「シェイプ」を参照してください。シェイプのサイズと位置に関連するプロパティについては、「シェイプのプロパティの編集」を参照してください。

シェイプの追加と配置

レイアウトにシェイプを追加するには、VLE の[シェイプ]パレットのボタンを使用します。シェイプはその起点を中心に構築されます。[レイアウト] ペインにシェイプをドロップすると、十字カーソルを置いた位置がシェイプの起点になるように 平行移動 プロパティが調整されます。シェイプのドロップ後は、カーソルはオブジェクト移動カーソルに変わります。
次の図は、RectangleShapeCanvas にドロップした結果を示しています。シェイプをクリック アンド ドラッグしてキャンバスに配置し、そのサイズを指定することもできます。「シェイプのサイズ変更」を参照してください。
Figure: レイアウトへの RectangleShape の追加
[レイアウト ツリー] ペインにシェイプをドロップすると、シェイプの起点はキャンバスの起点に合わせて配置されます。これにより、シェイプの中心はキャンバスの左上隅になります。次の図に示すように、キャンバスの境界線の外側にシェイプの大部分がはみ出します。
Figure: レイアウト ツリーへの RectangleShape の追加
ドラッグ アンド ドロップによってキャンバス内でシェイプを移動できます。これにより、シェイプの 平行移動 プロパティが変更されます。
ArrowShape の終点と始点の位置を個々に設定できます。次の図のカーソルは、2D 領域で矢印の終点を任意の方向にクリック アンド ドラッグできることを示す特殊なカーソルです。
Figure: ArrowShape の終点の移動
ShapeBox は、グラフィック階層のシェイプのコンテナで、通常はその中に含まれるコンテンツに合わせてサイズが調整されます。Canvas と同様に、ShapeBox 自体はシェイプではありません。ShapeBox は、シェイプやシェイプグループを囲む境界線などのグラフィック要素を追加する場合に使用できます。グラフィック階層にシェイプを配置するために ShapeBox をレイアウトに明示的に追加する必要はありません。

ShapeGroup による配置

ShapeGroup は、他のシェイプのコンテナとして機能します。「ShapeGroup でのシェイプの分類」を参照してください。シェイプを ShapeGroup に追加すると、シェイプの平行移動がグループの平行移動に追加されます。次の図にこの実例を示します。次の例では、ArrowShape の平行移動は 72pt, 60pt に設定されています。ShapeGroup の平行移動は 0pt, 0pt に設定されています。
Figure: ShapeGroupArrowShape
次の図は、ArrowShapeShapeGroup にドロップした結果を示しています。ShapeGroup の平行移動はまだ 0 ですが、矢印の平行移動を追加すると、グループが左上隅から矢印を囲む位置に移動します。
Figure: ShapeGroup 内の ArrowShape
次の図は、中に何も含まれていない ShapeGroup を示しています。平行移動は 36pt, 36pt に設定されています。
Figure: ShapeGroupArrowShape
次の図は、ArrowShape[レイアウト ツリー]ShapeGroup にドロップした結果を示しています。[レイアウト ツリー] に追加したシェイプの平行移動は 0 に設定されます。矢印は、ShapeGroup で指定された平行移動の位置に配置されます。
Figure: ShapeGroup 内の ArrowShape
次の図は、平行移動に 0 より大きい値が設定された ShapeGroupArrowShape を示しています。
Figure: ShapeGroupArrowShape
次の図は、ArrowShapeShapeGroup にドラッグした結果を示しています。位置に両方の平行移動の値が反映されています。
Figure: ShapeGroup 内の ArrowShape
[レイアウト] ペインでは、ドラッグ アンド ドロップ操作によりシェイプを ShapeGroup に移動できますが、同様の操作でシェイプを削除することはできません。ShapeGroup に追加したシェイプを [レイアウト] ペインでドラッグすると、ShapeGroup を基準にしてシェイプの平行移動が変更されます。次の図は、2 つ目の ArrowShape を下と左にドラッグした結果を示しています。[分割して挿入] を使用すると、ShapeGroup を簡単にレイアウトに追加できます。この場合、シェイプの平行移動によってグループ内のシェイプの位置が変わることはありません。
シェイプグループからシェイプを削除するには、[レイアウト ツリー] ペインでドラッグ アンド ドロップ操作を行うか、[レイアウト ツリー] ペインまたは [レイアウト] ペインで切り取りと貼り付け操作を行います。この操作はサブキャンバスにグラフィックを移動して削除する場合などにも当てはまりますが、シェイプとシェイプグループを操作する場合によく行われます。
Figure: ShapeGroup への ArrowShape のドラッグ

シェイプの回転

GUI オブジェクトとは異なり、シェイプは回転およびスケーリングをサポートします。[レイアウト] ペイン内の操作でシェイプのスケーリングを行うことはできません。プロパティ シートの スケール プロパティを編集する必要があります。「シェイプのプロパティの編集」を参照してください。
シェイプの回転は [レイアウト] ペインで行います。いずれかの隅のサイズ変更ハンドルの近くにカーソルを置くと、カーソルが特殊な曲線状の回転カーソルに変わります。このカーソルは、シェイプをクリック アンド ドラッグによって回転できることを示します。次の図は、回転カーソルと時計回りに回転した RectangleShape を示しています。
Figure: RectangleShape の回転
シェイプは起点を中心に回転します。VLE 内のシェイプは、四角形 プロパティを編集しなければ、シェイプの中心を起点として描画されます。TextShape には、水平配置方法 プロパティと 垂直配置方法 プロパティがあります。これらのプロパティを使用して、シェイプの起点を基準にしてテキストの位置を変更できます。TextShape の配置を変更すると、平行移動回転に対する反応も変わります。
次の図は、テキストの水平方向の配置と垂直方向の配置が起点にある場合のテキストの回転を示しています。
Figure: TextShape の回転
次の図は、水平方向の配置を左に設定した結果を示しています。
Figure: 水平方向の配置が左に設定された TextShape の回転
ImageShape は、ImageShape.fixed-transformation? プロパティが false に設定されていない限り、回転 の変更を無視します。このプロパティにアクセスするには、プロパティ シートの 変換を固定? を使用します。回転したイメージをレンダリングするには、高度なレンダリング機能が必要です。「ImageShape の処理」を参照してください。回転したイメージを正しくレンダリングするには、キャンバスのプロパティ シートの use-host-rendering? プロパティを使用して Canvas.use-host-rendering?false に設定する必要があります。
次の図に示すように、イメージは回転中は正しくレンダリングされませんが、回転の完了後に正しくレンダリングされます。
Figure: ImageShape の回転

シェイプのサイズ変更

オブジェクトのサイズ変更ハンドルをドラッグしてサイズを変更すると、VLE によって 四角形 および 平行移動 プロパティが編集されます。起点はオブジェクトの中心のままで、オブジェクトの位置は変わりません。
次の図は、RectangleShape とそのプロパティを示しています。四角形 プロパティの 4 つの距離値がすべて同じ値であるため、オブジェクトの起点を中心に正方形が均等に描かれています。
Figure: RectangleShape平行移動四角形
次の図は、オブジェクトの右端を右方向にドラッグしてサイズを変更した結果を示しています。四角形 プロパティの lextentrextent の値が両方とも同じ量だけ増えます。起点は四角形の中心のままですが、右側に移動しています。平行移動 プロパティの x コンポーネントの値が大きくなり、四角形の左、上、および下の辺は移動していません。
Figure: ドラッグによる RectangleShape の拡大
平行移動 プロパティを編集せずに 四角形 プロパティを編集して元の値に戻すと、変更された起点が中心となるように新しい寸法が設定されるため、四角形は右方向に移動します。
Figure: 平行移動 を編集せずに 四角形 を編集した場合

Z オーダー

シェイプはキャンバス内のどこにでも配置できるため、あるシェイプを別のシェイプで部分的または完全に隠すことができます。[レイアウト ツリー] ペイン内のオブジェクトのリスト順は、レイアウト内のオブジェクトの Z オーダーを反映しています。つまり、リストの先頭にあるオブジェクトは、Z オーダーでは最背面です。[フォーマット] メニューの [前面に移動] コマンドと [背面に移動] コマンドを使用して、レイアウトにおけるオブジェクトの Z オーダーを調整できます。これらのコマンドによってレイアウト ツリー内のリスト順が調整されます。オブジェクトをリストの下方向に移動して前面に表示することもできます。
注意: グラフィックとシェイプは、キャンバス内の Z オーダー レイヤがそれぞれ異なります。すべてのシェイプは、相対的な Z オーダーに関係なくすべてのグラフィックの上に描かれます。この動作はキャンバスのプロパティで、VLE レイアウトに特有のものではありません。シェイプをキャンバス内のグラフィックの下に配置する必要がある場合は、シェイプを ShapeBox にラップできます。
次の図は、over というシェイプで完全に隠される、under という RectangleShape を示しています。レイアウト ツリーで、隠されたオブジェクト under を選択すると、そのオブジェクト自体を選択しなくても、サイズ変更ハンドルが表示されます。
Figure: 小さな四角形を隠す大きな四角形
次の図は、under を前面に移動した結果を示しています。オブジェクトが表示され、レイアウト ツリーでは over の下にリストされています。
Figure: 小さな四角形を前面に移動

シェイプのプロパティの編集

サイズと位置を制御するプロパティ

VLE レイアウトのほとんどのオブジェクトのサイズと位置は、高さと幅、Canvas などのコンテナにおける xy の位置、およびレイアウトを制御する HBox などのコンテナ内の位置で決まります。
シェイプのサイズと位置は 2 次元空間の座標で決まるため、VLE プロパティ シートにおけるシェイプのプロパティは、他の GUI オブジェクトのプロパティとは異なります。
サイズと位置に関係するシェイプのプロパティの要約を次に示します。
VLE レイアウトに CommandButton などの GUI オブジェクトをドラッグ アンド ドロップで配置すると、その起点の x 座標と y 座標が変更されます。これらの変更は、オブジェクトのプロパティ シートの [シェイプ] セクションにある xy の値に反映されます。シェイプを移動すると、x 位置と y 位置に関連する Shape.transformation のコンポーネントである 平行移動 が変更されます。変更は、オブジェクトのプロパティ シートにある 平行移動 プロパティに反映されます。
サイズ変更ハンドルをドラッグして GUI オブジェクトの寸法を変更すると、オブジェクトの高さと幅が変わります。RectangleShape などのシェイプの寸法もサイズ変更ハンドルをドラッグして変更できますが、実際に変更されるのはその下にある GRect の寸法です。変更は、オブジェクトのプロパティ シートにある 四角形 プロパティに反映されます。シェイプの位置は GRect とそれに適用されている平行移動の影響を受けるため、シェイプのサイズ変更ハンドルをドラッグすると、通常は 四角形 プロパティと 平行移動 プロパティの両方が変更されます。
ArrowShape などの一部のシェイプには、GRect が関連付けられていません。VLE プロパティ シートの 始点部 および 終点部 プロパティによって、ArrowShape.headArrowShape.tail の位置を記述する Distance2d の値が決まります。矢印の終点と始点は、[レイアウト] ペインでドラッグ アンド ドロップ操作により移動できます。矢印の終点をドラッグしている間は、カーソルが特殊な形になります。詳細については、「レイアウトにおけるシェイプの使用」を参照してください。
GUI オブジェクトとは異なり、シェイプは回転およびスケーリングをサポートします。スケール プロパティと 回転 プロパティは、これらのパラメータの現在の値を示します。シェイプは、[レイアウト] ペインでドラッグ アンド ドロップ操作により回転できます。回転操作中は、カーソルが特殊な形になります。詳細については、「レイアウトにおけるシェイプの使用」を参照してください。
[レイアウト] ペインで スケール プロパティを変更することはできません。プロパティ シートまたは Curl IDE で値を編集する必要があります。

ShapeGroup のプロパティ

ShapeGroup を使用すると、シェイプをグループ化して、グループ単位で移動したり、グループ内のすべてのシェイプにプロパティを適用したりできます。ShapeGroup のプロパティ シートには、グループに設定することで子シェイプに適用できるプロパティがすべて含まれています。
ShapeGroup のプロパティ シートでは、回転 または スケール プロパティは使用できません。これは、VLE では ShapeGroup の回転を設定できないためです。IDE で スケール または 回転 を設定した場合は、アプレットを実行すると変更を確認できますが、VLE でレイアウトを表示している間は確認できません。

レイアウトにおけるメニューの使用

[パレット] の [メニュー] タブを使用して、メニューやメニューに関連するオブジェクトをレイアウトに追加できます。メニューの一般的な情報については、「メニュー」を参照してください。MenuBar はコンテナで、[新規レイアウト][新規複合オブジェクト] コンテナ リストに表示されます。ただし、MenuBar には、メニュー関連のオブジェクトである SubMenuMenuAction、および menu-separator のみ含めることができます。このセクションでは、VLE でメニューを構築する場合の UI 操作や表示について説明します。

MenuBar の構築

[MenuBar] ボタンを使用して、MenuBar をレイアウトに追加できます。メニュー バーはクリック アンド ドラッグにより特定のサイズに変更できますが、サイズを指定せずに MenuBar をドロップし、その中のサブメニューやメニュー アクションによりサイズを制御することをお勧めします。横幅 プロパティ エディタの add-stretch オプションを使用して、MenuBar の伸長性を高めることができます。「寸法のプロパティ」を参照してください。
次の図は、Canvas 内での寸法が指定されていない MenuBar を示しています。
Figure: MenuBar の追加
次の図は、MenuBar にオブジェクト (この場合は SubMenu) が挿入されるようカーソルが置かれています。
Figure: SubMenu の追加
次の図は MenuBarSubMenu が配置され、SubMenu が選択されている様子を示しています。サブメニューの左下の空のサブメニュー ペインに注目してください。このペインにサブメニューやメニューアクションを追加できます。
Figure: SubMenu の配置
メニュー バーの既存のコンテンツの左または右にオブジェクトを追加できます。メニュー バーに既に存在するオブジェクトの上または下には追加できません。MenuBar の幅をコンテンツに合わせて広げられない場合は、MenuBarRasterBox と同じように動作し、コンテンツを折り返して表示します。
次の図では、2 つ目のサブメニューが最初のサブメニューの右側に追加されるようにカーソルが置かれています。緑色の線は SubMenu の挿入先を示しています。
Figure: MenuBar への 2 つ目の SubMenu の追加
次の図では、2 つ目のサブメニューが最初のサブメニューの右側に配置されています。
Figure: MenuBar の 2 つ目の SubMenu

SubMenu の構築

SubMenu オブジェクトにさらに SubMenuMenuAction、および menu-separator を追加してサブメニューに縦に整列できます。次の図では、最初のサブメニューにオブジェクトが挿入されるようにカーソルが置かれています。緑色のボックスは、オブジェクトがメニュー バーではなくサブメニューに配置されていることを示します。
Figure: SubMenu への SubMenu の追加
次の図は、新しいサブメニューが配置された様子を示しています。右向きの矢印は、サブメニューが親サブメニューに含まれていることを示し、アプリケーションにおけるサブメニューとそのサブメニューの外観を表現しています。
Figure: SubMenu 内の SubMenu

メニュー構造の表示

メニュー バーのサブメニューがまったく選択されていない場合は、アプリケーションでいずれのメニュー項目も使用されていない場合と同様に、[レイアウト] ペインにメニュー バーが表示されます。つまり、MenuBar の直接の子のみ表示されます。[レイアウト ツリー] ペインには、常に階層構造全体が表示されます。次の図は、レイアウト ビューで構造が非表示になっているメニュー バーを示しています。
Figure: 構造が非表示になっている MenuBar
メニューを作成するときに、[レイアウト] ペインで非表示になっているメニュー階層に、オブジェクトの追加が必要となる場合があります。[レイアウト] ペインのオブジェクトの上にカーソルを移動すると、次の図に示すように、そのオブジェクトと祖先が表示されます。
Figure: 構造が表示された MenuBar
メニューに追加するメニュー オブジェクトを選択すると、オレンジ色と緑色の線によって、新しいオブジェクトの配置先を確認できます。次の図は、新しいオブジェクトを sub-menu-3 と同じレベルに追加する様子を示しています。オレンジ色のボックスは、新しいオブジェクトが sub-menu-1 の子であることを示し、緑色の線はそのオブジェクトが sub-menu-3 の上に配置されることを示します。
Figure: 非表示の SubMenu への SubMenu の追加
次の図は、新しいサブメニューが sub-menu-1 の子として配置された様子を示しています。
Figure: 追加された SubMenu
次の図は、オブジェクトを sub-menu-3 の子として追加する様子を示しています。オレンジ色と緑色のボックスは、新しいオブジェクトが sub-menu-3 の子であることを示します。
Figure: 下位レベルへの SubMenu の追加
次の図は、新しいサブメニューが sub-menu-3 の子として配置された様子を示しています。
Figure: 追加された SubMenu
メニュー構造の非表示の部分を表示すると、メニュー構造でカーソルの下にあるオブジェクトまでのパスが黄色で示されます。メニューにアイテムを追加できる場合は、オブジェクト追加の印も表示されます。次の図では、sub-menu-5 にオブジェクトが挿入されるようにカーソルが置かれています。
Figure: 非表示のサブメニューへのオブジェクトの挿入

レイアウトにおける表の使用

[パレット] の [] タブを使用して、表や表に関連するオブジェクトをレイアウトに追加できます。表の一般的な情報については、「」を参照してください。 はコンテナで、[新規レイアウト][新規複合オブジェクト] コンテナ リストに表示されます。VLE レイアウトに表と表コンポーネントを追加すると、実際には Curl コード のインストラクションが追加され、RTE がこれに従って表を作成します。Table API のこの点に関する詳細については、TableContentPrototyperow-prototype、および column-prototype を参照してください。このセクションでは、VLE で表を構築する場合の UI 操作や表示について説明します。
レイアウトに表を追加するには [表] ボタンを使います。次に、グラフィック、コントロールやその他の VLE オブジェクトを、レイアウトの他の部分に追加するのと同じ方法で表に追加します。オブジェクトを表に追加すると、表の内部でこれらのオブジェクトを含む構造が作成されます。行われる作業に応じて、VLE エディタは基礎となる Curl® 言語 API を用いてこれらを記述していきます。
表はその使い方に応じて、行の集まり、列の集まり、または個々のセルの集まりと見なすことができます。VLE の表ツールは、表を本質的には行の集まりとして扱いますが、開発者は他の方法でも扱うことができます。

空の表にオブジェクトを追加

次の図は、CanvasTable が含まれている VLE レイアウトで、表にコントロールが追加される直前の様子を示しています。何も追加しない限り、表は完全に空であることに注意してください。
Figure: 表に TextField を追加
次の図は、表に TextField が追加された後のレイアウトを示しています。表には、TextField だけでなく、行 0列 0 も含まれていることに注目してください。表にオブジェクトを追加すると、VLE によりこのような構造が作成されます。[レイアウト ツリー] には、表の行内のノードとして TextField が表示されます。表内のオブジェクトは列内に存在しているとも言えますが、VLE ではすべて行ノードの子オブジェクトとして一覧表示されます。
Figure: 表に追加された TextField

オブジェクトの追加による列の作成

既存オブジェクトの右または左側にオブジェクトを追加すると、そのオブジェクトを含む列が新たに作成されます。列がいつどのように追加されたかに関係なく、列には左から右に 0 から n の番号が付けられます。
次の図は、表内の既存のオブジェクトの右側にカーソルが置かれ、その位置に追加のオブジェクトが挿入される様子を示しています。太い緑色の線は新しいオブジェクトの挿入位置を示しています。
Figure: 新しい列の作成
次の図は操作が完了した様子を示しています。行 0 には 2 番目のテキスト フィールド オブジェクトが含まれ、このオブジェクトの列が作成されています。
Figure: 新しい列内の新しい TextField

オブジェクトの追加による行の作成

既存オブジェクトの上または下にオブジェクトを追加すると、そのオブジェクトを含む行が新たに作成されます。行がいつどのように追加されたかに関係なく、行には上から下に 0 から n の番号が付けられます。
次の 2 つの図は、既存オブジェクトの下にオブジェクトが追加され、新しい行が作成されることを示しています。
Figure: 新しい行の作成
Figure: 新しい行内の新しい TextField

オブジェクトの追加による行と列の作成

オブジェクトを追加して、新規の行と列を同時に作成することも可能です。次の図はこの操作を表しています。緑色の四角形は、新規オブジェクトが既存オブジェクトの右下に挿入されることを示しています。
Figure: 新しい行と列の作成
次の図では、新しいテキスト フィールドが 行 1列 1 に配置されたことを示しています。行 1列 0 には スキップ が追加されています。この スキップ は、行 1列 0 をスキップしてから、行 1列 1TextField を挿入するよう RTE に指示しています。
Figure: 新しい行と列内の新しい TextField
既存行の上に行を追加する場合、または既存列の左側に列を追加する場合にも、同様の領域が生成されます。

表オブジェクトの選択と位置の確認

他のレイアウト オブジェクトと同様に、表の行や列に移動してこれらを選択することができます。[レイアウト ツリー] で行または列のラベルの上にカーソルを移動すると、対応するオブジェクトがオレンジ色の境界線で囲まれます。次の図は行がハイライト表示されている様子を示しています。
Figure: 行のハイライト表示
次の図は列がハイライト表示されている様子を示しています。
Figure: 列のハイライト表示
行または列を選択するには [レイアウト ツリー] でクリックします。次の図は列が選択された様子を示しています。
Figure: 列の選択

表内のコンテンツのドラッグ アンド ドロップ

表内のオブジェクトは、ドラッグ アンド ドロップ操作によって移動できます。次の図は、一番上の行にあるテキスト フィールドを右にドラッグしている様子を示しています。緑色の四角形はフィールドの移動先を示しています。
Figure: テキスト フィールドのドラッグ アンド ドロップ
次の図はドラッグ アンド ドロップ操作が完了した様子を示しています。行 0行 1行 0 にそれぞれ スキップ が含まれていることに注意してください。矢印カーソルが 列 0 の上に置かれています。[レイアウト] ペインで列幅がゼロに折りたたまれていて、カーソル位置を表すオレンジ色の境界線で囲まれた四角形も同様に狭められている点に注意してください。
Figure: ドラッグ アンド ドロップ操作の完了

表オブジェクトの置き換え

表内のオブジェクトは別のオブジェクトに置き換えることができます。置き換えるオブジェクトは緑色の四角形で示されます。次の図は、TextField が置き換えられる様子を示しています。
Figure: TextField の置き換え
次の図は、TextFieldCommandButton に置き換えられた様子を示しています。
Figure: CommandButton に置き換えられた TextField

折りたたまれた表構造

VLE で表のオブジェクトを追加および削除しているうちに、何もコンテンツを含まない行や列、または skip しか含まない行や列が生成される可能性があります。このようなオブジェクトは、不要であれば削除することができます。または、次の図に示すように、このような行または列にオブジェクトを追加することもできます。小さな緑色の四角形は、新しいオブジェクトの挿入先を示しています。
Figure: 折りたたまれている行に TextField を追加
次の図は操作が完了した様子を示しています。
Figure: 追加された TextField

表コンポーネントの明示的な追加

表にコンテンツが追加されていくと、VLE は行や列を追加して必要な表構造を作成していきます。[表] パレット タブのボタンを使用して、行、列、およびスキップオブジェクトを明示的に追加することもできます。
セル を追加するには [セル] パレット ボタンか、[分割して挿入] を使用します。セルを追加することにより、そのセルのプロパティを設定できます。「表のプロパティの編集」を参照してください。

表のプロパティの編集

表オブジェクトのプロパティを編集する場合には、いくつか注意すべき点があります。1 つは、 オブジェクトには デザイン名 プロパティがありますが、、および セル オブジェクトにはないということです。IDE エディタで デザイン名 プロパティの追加を行ってみても、望ましい結果は得られません。
、および セル オブジェクトではプロパティ値を設定できます。セル の設定値は 、または の設定値を無効にし、 または の設定値は の設定値を無効にします。表のセルに対し、その列と行の両方のプロパティ設定が存在してこれらの影響を受ける場合、コードで最後に適用された設定が実行時に使用されます。VLE により生成された表構造では、これは常に列のプロパティになります。
次の図は、プロパティが複数レベルで設定されていることを示しています。Canvas では、フォントサイズ プロパティが 12pt に設定されています。表では フォント強調表示 プロパティが bold に設定されていて、表の内部のすべてのテキストに適用されます。行 0 ではテキストの色が赤に設定され、その行の内部のセルでは青に設定されています。
Figure: 表、行、セルでプロパティを設定
VLE エディタで を操作すると オブジェクトは自動的に生成されますが、セル オブジェクトは自動的に生成されません。セルのプロパティを設定する必要がある場合は、セル を直接追加するか、[分割して挿入] で追加しなければなりません。
行スパン列スパン の 2 つのプロパティは セル のみで利用できます。列スパン を増加すると、次の図で示すように、対応するセルの数だけ行内の既存のオブジェクトが右に移動し、必要に応じて列が追加されます。
Figure: Colspan の使用
行スパン を増加すると、次の図で示すように、列内で対応する数のオブジェクトが スキップ に置き換えられます。行スパン の値を 1 に戻しても、置き換えられたオブジェクトは元に戻りません。
Figure: Rowspan の使用

レイアウトにおける TabContainer の使用

TabContainer はコントロールですが、[Tab container] ボタンは VLE [パレット] の「コンテナ」タブ上に配置されています。この配置は TabContainer の主な機能が他のコントロールを格納するということにあるためです。ユーザーがいくつかの関連するコントロールのグループを切り替えられるようにすることが、このコントロールの主要な機能です。
VLE での TabContainer の操作は、IDE エディタで直接コードを書き込んで TabContainer を使用するのといくらか異なります。タブ コンテナの作成についての詳細は、「タブ コンテナ」を参照してください。主な違いは TabPane オブジェクトを明示的に追加しない点であり、 VLE パレット上には [TabPane] ボタンがありません。TabContainer にコンテナを追加する場合は、タブ コンテナ ペインは VLE によって暗黙的に作成されます。IDE エディタ内で VLE によって生成されたコードを編集する際には、実装時、および実行時ともにタブ コンテナの機能性をフルに使用していても、タブ コンテナ内には TabPane オブジェクトが見えません。VLE によって生成されたコードの解釈についての詳細は、「レイアウトの使い方」を参照してください。
次の図は、VLE レイアウトにおけるタブ コンテナ使用のプロセスを示しています。
他の多くのコンテナと同様に、ほとんどの場合、タブ コンテナをレイアウトに追加する際に特定の寸法を与えないことが最善の方法となります。この方法だと、コンテナの中身がサイズを決定することができます。次の図では、タブ コンテナのあるレイアウトを示しています。この時点では、タブが表示されず、寸法のないコンテナであることに注意してください。
Figure: レイアウトにおけるタブ コンテナ
VBox のようなコンテナを TabContainer に追加すると、タブが作成されます。
Figure: TabContainer へのVBoxの追加
次のコード フラグメントは、VBox を追加する際に VLE がレイアウトに追加するコードを示しています。レイアウトは TabContainerlayout-container を格納しています。タブ コンテナ内の layout-containerVBox です。
{define-layout-class MyContainer
    || Begin meta-data DO NOT EDIT
    format-version = 2,
    design-time-class = "Canvas",
    run-time-class = "Canvas",
    || End meta-data
    width = 188.99pt,
    height = 154.76pt,
    background = "#D4D0C8",
    border-width = 1.5pt,
    border-color = "#D4D0C8",
    border-style = "raised",
    font-size = 8pt,
    control-appearance-changeable? = true,

    {layout-container void:TabContainer
        || Begin meta-data DO NOT EDIT
        anchor = "top-left",
        x = 12pt,
        y = 12pt,
        || End meta-data
        {TabContainer

            {layout-container void:VBox
                || Begin meta-data DO NOT EDIT
                tab-label = "tab1",
                || End meta-data
                {VBox
                }
            }
        }
    }

    {constructor {default}
        {self.initialize-components}
    }
}
VBox にコントロールを追加するとタブ表示領域が書き込まれます。
Figure: タブ コンテナにコントロールを追加
VBox はタブ コンテナ内にあるので、タブに表示されるテキストを定義する tab-label プロパティを持っています。次の図では、Tab 1 に設定された tab-label を示します。
Figure: タブ ラベルの編集
タブ コンテナにコンテナを追加することによって、追加のタブを作成します。次の図では、VBox を追加した結果を示しています。
Figure: 2番目の VBox を追加
この最後の図では、コンテンツとタブ ラベルのある2番目のタブを示しています。
Figure: 2番目の VBox の追加

レイアウトにおける TreeControl の使用

レイアウトにおける TreeControl の使用に関して特に注意すべき点は、TreeControl.data-modelTreeControl.tree-item-creation-proc に関するものです。これらのプロパティの値を指定するには、コードを編集する必要があります。VLE には、指定されたデータ モデルをデザイン時に表示する機能がありません。そのため、TreeControl.data-model または TreeControl.tree-item-creation-proc の編集結果は確認できません。
TreeControl をレイアウトに配置すると、次の小さなデータ サンプルが表示されます。
Figure: VLE のツリー コントロールの内容
このサンプル データを使用すると、フォントサイズツリー コネクタの色 などの他のコントロール プロパティの編集結果を確認できます。
ツリー コントロールの使用方法の詳細については、「ツリー コントロール」を参照してください。

レイアウトにおける複合オブジェクトの使用

VLE の複合オブジェクトを使用できる場合は、レイアウトの構築でも使用できます。複合オブジェクトは VLE に組み込まれたグラフィック階層で、VLE パレット アイテムからアクセスできます。複合オブジェクトのパレット機能拡張をインストールする必要がある場合は、「VLE 機能拡張ファイルのインストールとアンインストール」を参照してください。複合オブジェクトの作成方法については、「複合オブジェクトの構築」を参照してください。
Curl IDE ドキュメントには、複合オブジェクトを使用する拡張例があります。拡張例の使用方法については、「拡張例」を参照してください。
拡張例は次のファイルに含まれています。
d:\automated-build-temp\build\win32-atom\docs\default\examples\layout-editor\CompoundObject.zip
このアーカイブ ファイルにはいくつかのディレクトリが含まれています。display-panes ディレクトリには DISPLAY-PANES というプロジェクトがあり、スロットを使用する複合オブジェクトを定義しています。このセクションでは、VLE レイアウトでこれらのオブジェクトを使用する方法について説明します。これらの複合オブジェクトの作成方法については、「例 : 複合オブジェクトのスロット」セクションで説明されています。
display-panes-example ディレクトリには DISPLAY-PANES-EXAMPLE というプロジェクトがあり、DISPLAY-PANES の複合オブジェクトを使用しています。このアプレットはブラウザで実行できます。パレット機能拡張ファイル display-panes-ext.scurl を VLE パレットにロードすると、複合オブジェクトを使用するレイアウトを表示することもできます。このプロジェクトは、複合オブジェクトを定義するプロジェクトのマニフェストにデリゲートします。2 つのプロジェクトの相対位置を変更した場合は、デリゲート先 を置き換える必要があります。
vle-container.scurl ファイルには、次のレイアウトが定義されています。
このプロジェクトを使用して、複合オブジェクトの動作を確認したり、新しいオブジェクトを作成したりできます。
次の図は、パレットに表示された DISPLAY-PANES 複合オブジェクトと、レイアウト内の TwoPaneVert のインスタンスを示しています。[レイアウト ツリー] ペインに、複合オブジェクトのスロットとしてマークされたオブジェクトが表示されています。これらのオブジェクトは、タイプとデザイン名で一覧表示され、スロットであることを示す小さなダイヤ形のマークが付いています。複合オブジェクトでプレース ホルダとして機能する Fill オブジェクトは表示されていません。
Figure: レイアウトにおける複合オブジェクトの使用
次の図に示すように複合オブジェクトを選択できます。ただし、複合オブジェクト内のスロット オブジェクトを選択することはできません。[レイアウト ツリー] ペインでスロットの上にカーソルを移動すると、次の図に示すように、スロットがハイライト表示されます。
Figure: 選択された複合オブジェクト
オブジェクトをパレットから複合オブジェクトのスロットに挿入できます。次の図では、スロット upperCommandButton を挿入するようにカーソルが置かれた様子を示しています。オレンジ色と緑色の四角形は、コントロールが配置されたことを示します。
Figure: スロットへのコントロールの追加
次の図は、スロット upper のコマンド ボタンを示しています。コマンド ボタンは、プレース ホルダの Fill オブジェクトを置き換えたものです。
Figure: スロット内のコントロール
オブジェクトは、あるスロットから別のスロットにドラッグできます。次の図は、コマンド ボタンが upper からドラッグされて lower にドロップされる様子を示しています。
Figure: 複合オブジェクトからドラッグされたコントロール
複合オブジェクトのスロットは選択できないため、オブジェクトをスロットに貼り付けることはできません。コマンド ボタンを切り取った (ctrl-c) 場合も、スロットには貼り付けできません。オブジェクトをレイアウト内の別の場所に貼り付けてからスロットにドラッグする必要があります。
Figure: オブジェクトを貼り付けてからドラッグ

イベント ハンドラの記述

イベント ハンドラは、オブジェクトにアタッチされているイベントの発生に応答する形で実行されます。[プロパティ] ペインの [イベント ハンドラ] タブには、選択したオブジェクトで使用できるイベント ハンドラが一覧表示されます。
動的なイベント ハンドラの記述や編集には IDE エディタを使います。イベント ハンドラの値フィールドには、イベント ハンドラのコードの先頭部分が表示され、フィールドの右側に [コードの編集] ボタンが表示されます。[コードの編集] ボタンをクリックすると、IDE でファイルが開かれ、イベント ハンドラの位置までスクロールされます。イベント ハンドラが存在しない場合は、次のようにスケルトン状態で挿入されます。
{on event-type do}     
イベント ハンドラの記述と使用の詳細については、「イベント」と「コントロールで発生するイベント」を参照してください。
UI の別のオブジェクトを参照するには、そのオブジェクトの デザイン名 プロパティを設定します。次の構文を使用してこれを参照します。
    self.design-name
トップレベルのレイアウト コンテナにアクセスするには、次の構文を使用します。
    self.container
    
self が現在のレイアウトを参照することに注意してください。