前回の演習で作成したユーザー・インターフェースの背景にあるコードを完成させます。
lookupService GooglePlacesService{@restbinding};
@restbinding プロパティーは、サービス・アクセスの詳細が、EGL デプロイメント記述子ではなく、コード内にあることを示します。 このような決断は便利ではありますが、柔軟性には欠けます。 サービスのロケーションを変更する場合に、ソース・コードの変更が必要になります。 演習 14 では、EGL デプロイメント記述子を紹介します。開発作業の多くでは、サービス・アクセスの詳細をこの記述子に置くことが多くなります。
function checkForEnter(event Event in)
if(event.ch == 10)
search();
end
end
背景にある以下のような詳細を考慮に入れてください。EGL ランタイム・コードは、checkForEnter 関数を呼び出して、イベント・オブジェクト (イベントに関する詳細を含んだメモリー構造) を渡します。 この場合、呼び出しを実行したイベントは onKeyDown で、イベント・オブジェクトには、ユーザーのキー・ストロークを表す ASCII 文字が含まれています。 特に、数値 10 は ASCII 表の復帰 (Enter キー) を表す 10 進値です。これについては、ASCII Table and Description (http://www.asciitable.com) に説明があります。
checkForEnter 関数が呼び出されるのは、テキスト・フィールドにフォーカスが置かれた状態で、ユーザーが Tab や Enter などのキーを押した場合のみです。 関数側では、キーが Enter であった場合にのみ、search 関数を呼び出します。 search 関数はこの後で作成します。
function buttonClicked(event Event in)
search();
end
buttonClicked 関数、およびボタン固有の onClick プロパティーに対するその関係により、ユーザーが「Search」ボタンをクリックした際に search 関数が呼び出されるようになります。
function search()
localMap.zoom = 10;
localMap.removeAllMarkers();
// show an initial marker, as necessary to display the map at all
localMap.addMarker(new MapMarker{ latitude = "37.47", longitude = "-122.26",
address = "I am here!", description = "San Francisco"});
// Call the remote Google service, passing the type value
call lookupService.getSearchResults( typeComboBox.value ) returning to showResults
onException displayError;
end
検索結果セットを表すこの初期表示でユーザーが localMap.addMarker() 関数に提供する唯一の詳細は、都市のロケーション・マーカーです。
linkListing HyperLink[0];
for(i int from 1 to retResult.result.getSize() by 1)
newLink HyperLink{padding = 4, text = retResult.result[i].name, href = "#"};
newLink.setAttribute("title", retResult.result[i].vicinity );
newLink.setAttribute("lat",
retResult.result[i].geometry.location.lat);
newLink.setAttribute("lng",
retResult.result[i].geometry.location.lng);
newLink.onClick ::= mapAddress;
linkListing.appendElement(newLink);
end
listingBox.setChildren(linkListing);
end
newLink HyperLink{padding = 4, text = retResult.result[i].title, href = "#"};
このハイパーリンクでは、Web アドレスではなく、コードが呼び出されます。 ただし、プレースホルダーがあることで、ユーザーがハイパーリンクをクリックして Web サイトが開く場合と同様に、下線の引かれた色付きのテキストという一般的な方法でハイパーリンクが表示されます。
function mapAddress(e Event in)
// Show the marker when the user clicks the link
businessAddress string = e.widget.getAttribute("address") as string;
businessName string = e.widget.getAttribute("title") as string;
lat string = e.widget.getAttribute("lat") as string;
lng string = e.widget.getAttribute("lng") as string;
localMap.addMarker( new MapMarker{ latitude = lat,
longitude = lng, address = businessAddress, description = businessName});
End
ユーザーが実行時にハイパーリンクをクリックすると、mapAddress 関数は、showResults 関数で設定された属性を取得し、表示されたマップ上にマーカーを設定します。
function displayError(ex AnyException in)
DojoDialogLib.showError("Google Service",
"Cannot invoke Google Places service: " + ex.message, null);
end
DojoDialogLib は、演習 2 でワークスペースに追加した com.ibm.egl.rui.dojo.samples プロジェクトのライブラリー・パーツです。このライブラリーにある showError 関数によって、ダイアログ内に情報が表示されます。 この関数呼び出しには message という名前のストリングが含まれており、これは、EGL ランタイム・コードが displayError 関数に渡す例外レコード内にあります。
このポートレットは独立して動作するので、単独でテストできます。

localMap.removeAllMarkers();
次の演習では、この新規ハンドラーをアプリケーションに組み込みます。