UI 要素と ELF コマンドに関連して、「親」と「子」という用語が使用されます。この場合は、親はほかの UI 要素を含む UI 要素で、子は親に含まれる要素です。ある親の子が、別の子の親であることもあります。
ウィンドウは階層の最上位の親です。階層には他にも、レイアウト、コントロール、メニュー、メニュー項目などの要素があります。レイアウトは他のレイアウトを、メニュー項目はサブメニューを含むことがあるので、階層は任意の深さにすることができます。
ウィンドウの作成を簡略化し、スクリプトを簡潔にするために、ELF コマンドは既定のペアレントの概念を認識するようになっています。これは、作成された要素それぞれについて、親を明示的に指定する必要がないことを意味します。ウィンドウが作成されると、そのウィンドウは後で作成されるメニューやコントロールの既定のペアレントになります。既定のペアレントを明示的に変更する(setParent コマンドを使用して)か、別のウィンドウを作成するまで、新しい UI 要素はこのウィンドウ内に表示されます。
レイアウトやメニューには異なる既定のペアレントがあります。ウィンドウはコントロールに対する最初の既定のペアレントで、メニュー バーのあるウィンドウを作成した場合、このウィンドウはメニューの既定のペアレントにもなります。作成されたレイアウトは、レイアウトやコントロールの新しい既定のペアレントになります。メニュー バー レイアウトが作成されると、このレイアウトはメニューの新しい既定のペアレントになります。メニューが作成されると、このメニューがメニュー項目の既定のペアレントになります。
既定のペアレントは、新しい親を作成することにより暗黙的に変更することもできますし、setParent コマンドを使用して明示的に変更することもできます。-menu フラグは、メニューの既定のペアレントを変更するために使用します。親をウィンドウまたはメニュー バー レイアウトに設定すると、メニューとレイアウト両方の既定のペアレントが設定されます。次の短いサンプル コードでは、レイアウトの既定のペアレントの使用法を表しています。
window ExampleWindow1; columnLayout; button -label "Button 1"; button -label "Button 2"; rowColumnLayout -numberOfColumns 2; text -label "Name:"; textField; text -label "City:"; textField; setParent ..; checkBox -label "Lights "; checkBox -label "Camera "; checkBox -label "Action "; showWindow ExampleWindow1;
text 要素および textField 要素は rowColumnLayout の子です。rowColumnLayout によってこれらは 2 列になるように配置されています。setParent .. コマンドが使用されていなければ、既定のペアレントは rowColumnLayout のままで、チェック ボックスは 2 列にレイアウトされます。これをわかりやすく表すための次の例は、前の例と同じですが、setParent コマンドがコメント アウトされています。
window ExampleWindow2; columnLayout; button -label "Button 1"; button -label "Button 2"; rowColumnLayout -numberOfColumns 2; text -label "Name:"; textField; text -label "City:"; textField; //setParent ..; checkBox -label "Lights "; checkBox -label "Camera "; checkBox -label "Action "; showWindow ExampleWindow2;
setParent コマンドはフラグとして -up や -top を受け取り、1 レベル上の階層や一番上の階層に移動できます。また、たとえば setParent <windowOrLayoutName>; のように、新しい既定のペアレントを明示的に指定することもできます。setParent コマンドを setParent -query のように使用して、現在の親を照会することも可能です。
次の短いサンプル コードでは、メニューにおける既定のペアレントの使用法を表しています。
window -menuBar true ExampleWindow3; menu -label "File" TestFileMenu; menuItem -label "Open" menuItem1; menuItem -label "Close" menuItem2; menuItem -label "Quit" menuItem3; menu -label "Edit" TestEditMenu; menuItem -label "Cut" menuItem1; menuItem -label "Copy" menuItem2; menuItem -label "Paste" menuItem3; menu -label "Options" TestOptionsMenu; menuItem -label "Color" -subMenu true menuItem1; menuItem -label "Red"; menuItem -label "Green"; menuItem -label "Blue"; setParent -menu ..; menuItem -label "Size" -subMenu true menuItem2; menuItem -label "Small"; menuItem -label "Medium"; menuItem -label "Large"; setParent -menu ..; showWindow ExampleWindow3;
UI 要素を作成するコマンドはすべて、要素の親を明示的に指定する -parent parentName フラグを受け付けます。このフラグは常に、既定のペアレントに優先されます。
コレクションはまた別の扱いをされます。コレクションでは、現在のレイアウトが既定のペアレントとして使用されます。また、明示的に親を指定するための -parent フラグを使用することもできます。しかし、コレクションには、ウィンドウをスパンする機能があり、-global フラグでこの動作を選択できます。-global フラグを使用した場合、コレクションは親を持ちません。コレクションが親を持つのは、コレクションを削除しやすくする場合だけです。親が削除されると、コレクションも同時に削除されます。グローバル コレクションは、明示的に削除する必要があります。