サムネイルにマウスオーバーしたときに、情報ウィンドウを表示するようにした。
また、サムネイルをクリックしたとき、または、情報ウィンドウ内のタイトルをクリックしたとき、または、「今すぐ買う」ボタンをクリックしたときに、アマゾンの詳細情報ウィンドウを開くようにした。
これらの処理はInfoWindowManagerというクラスで処理している。
タグで初期化しているが、ただのActionScriptだけのクラスになっている。
これは表示機能をまったく持っていないので、MVCのCらしいクラス。
Applicationタグ内は以下のような感じになった。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" backgroundColor="0xFFFFFF"
xmlns:v="customcomponent.*"
applicationComplete="init()">
<mx:Script>
<![CDATA[
namespace amecs = "http://webservices.amazon.com/AWSECommerceService/2008-08-19";
use namespace amecs;
import jp.co.example.amazon.*;
import jp.co.example.core.data.*;
import jp.co.example.core.event.*;
import jp.co.example.core.load.*;
import customcomponent.*;
private var urlmanager:URLManager=new URLManager();
private var xmlloader:XMLLoader=new XMLLoader();
private var xmldatamanager:XMLDataManager=new XMLDataManager();
private function init():void{
lotatecontroler.addEventListener(Controler.LOTATE_IMAGES,hboximages.startLotate);
hboximages.addEventListener(InfoWindowManager.CALL_OPEN_WINDOW,infowindowmanager.callOpenWindow);
hboximages.addEventListener(InfoWindowManager.CALL_CLOSE_WINDOW,infowindowmanager.callCloseWindow);
hboximages.addEventListener(InfoWindowManager.CALL_DETAIL_URL,infowindowmanager.goToDetail);
urlmanager.init();
loadXML();
}
private function loadXML():void{
var urlstr:String=urlmanager.makeURLStr('ItemSearch',['Flash','Books','Medium']);
xmlloader.addEventListener(XMLLoader.LOAD_XML_COMPLETE,onLoadXML);
var xml:XML=<xml url="" />;
xml.@url=urlstr;
xmlloader.loadXML(xml);
}
private function onLoadXML(ce:CustomEvent):void{
xmldatamanager.datasource=XML(ce._target.data);
setImages();
setInfos();
}
private function setImages():void{
hboximages.init(xmldatamanager.datasource.Items.Item.MediumImage);
}
private function setInfos():void{
infowindowmanager.init(xmldatamanager.datasource.Items.Item);
}
]]>
</mx:Script>
<v:InfoWindowManager id="infowindowmanager"/>
<mx:VBox width="100%" height="100%" backgroundColor="#FFFFFF">
<v:HBoxImages id="hboximages" backgroundColor="#FFFFFF"/>
<v:Controler id="lotatecontroler"/>
</mx:VBox>
</mx:Application>
最初の回転と、床の写り込みと、ユーザー評価などがまだない。
注意点としては、このApplicationタグないでHBoxImagesというカスタムコンポーネントのインスタンスにリスニングの設定をして、そこからInfoWindowManagerのメソッドを呼ぶようにしているが、実際にイベントを発信するのは、HBoxImagesに入れ子になっているImagePlateになっている。
なので、ImagePlateのdispatchEventメソッドで送信するEventインスタンスの引数設定で、bubblesの部分をtrueにしないとこのApplicationタグまで、イベントが届かない。
また、情報表示用のウィンドウでは、InfoWindowというカスタムクラスをポップアップするようにしているが、その中の情報とリンクのハンドラは、InfoWindowManagerがポップアップ時に設定するようになっている。
その際、リスニングの設定をaddEventListenerメソッドの引数のuseWeakReferenceをtrueにすることによって、ウィンドウが閉じられて、参照がなくなった際に、ガーベージコレクションの対象になるようにしている。