試作AIRアプリ「ぶっくまーかー」

本の管理ができるAIRアプリ「ぶっくまーかー」です。
AIRプログラムの勉強がてらの試作品です。
インストールはこちらから

って、ほとんど機能ないですが、試作アプリでSQLiteを使っていますので、プログラムの参考になればうれしいです。
インストールしたら右クリックでソース表示できます。
以下の機能があります。

  • 本の検索(ISBN,キーワード)
  • 本の追加と削除

これだけ\(゜ロ\)(/ロ゜)/
以下はAIRPHPのソースです。

PHPソースコード

XML/Serializerが必要なのでpearでインストールします。

# pear install http://download.pear.php.net/package/XML_Serializer-0.18.0.tgz

アマゾンとの連携をします。おもな機能として、

  • ISBNからアイテム検索
  • ワードからアイテムリスト検索
  • ASIN(アマゾンの固有アイテムID)からアイテムを検索
<?php
require_once 'inc.php';
require_once 'XML/Unserializer.php';
require_once 'XML/Serializer.php';
if( $_GET['type'] == "isbn" ){
    //ISBNから検索
    $_GET['isbn']        = $_GET['isbn']        ? $_GET['isbn']        : "9784088596662";
    $_GET['SearchIndex'] = $_GET['SearchIndex'] ? $_GET['SearchIndex'] : "Books";
    $isbn = str_replace( "-" , ""  , trim( $_GET['isbn'] ) );
    $request = array(
                     "Service"        => "AWSECommerceService",
                     "AWSAccessKeyId" => $APIKEY,
                     "Operation"      => "ItemLookup",
                     "IdType"         => "ISBN",
                     "ItemId"         => $isbn,
                     "SearchIndex"    => $_GET['SearchIndex'],
                     "ResponseGroup"  => "Large",
                     "Version"        => "2008-03-03",
                     );
    $url = "http://webservices.amazon.co.jp/onca/xml" . request2url( $request );
    $Unserializer =& new XML_Unserializer(
                                          array('parseAttributes' => true,
                                                'targetEncoding'  => 'utf-8'
                                                )
                                          );
    $file = file_get_contents( $url );
    $status = $Unserializer->unserialize( $file );
    if (PEAR::isError($status)) {
        die($status->getMessage());
    }
    $xmlArr = $Unserializer->getUnserializedData();
    $item = h( $xmlArr["Items"]["Item"] );
    if( is_array( $item["ItemAttributes"]['Author'] ) ){
        $author = $item["ItemAttributes"]['Author'][0];
    }else{
        $author = $item["ItemAttributes"]['Author'];
    }
    if( $item["ASIN"] == "" ){
        exit;
    }
    $xml = <<<EOD
<result>
 <item>
  <asin>{$item["ASIN"]}</asin>
  <isbn13>{$item["ItemAttributes"]['EAN']}</isbn13>
  <url>{$item['DetailPageURL']}</url>
  <title>{$item["ItemAttributes"]['Title']}</title>
  <image>{$item['LargeImage']['URL']}</image>
  <author>{$author}</author>
  <category>{$item["ItemAttributes"]['Binding']}</category>
  <mode>{$item["ItemAttributes"]['ProductGroup']}</mode>
 </item>
</result>
EOD;
    header ("Content-Type: text/xml; charset=UTF-8");
    echo $xml;
    exit;
}elseif( $_GET['type'] == "asin" ){
    //ASINから検索
    $asin = $_GET['asin'] ? $_GET['asin'] : "4873113652";
    $request = array(
                     "Service"        => "AWSECommerceService",
                     "AWSAccessKeyId" => $APIKEY,
                     "Operation"      => "ItemLookup",
                     "IdType"         => "ASIN",
                     "ItemId"         => $asin,
                     "ResponseGroup"  => "Large",
                     "Version"        => "2008-03-03",
                     );
    $url = "http://webservices.amazon.co.jp/onca/xml" . request2url( $request );
    $Unserializer =& new XML_Unserializer(
                                          array('parseAttributes' => true,
                                                'targetEncoding'  => 'utf-8'
                                                )
                                          );
    $file = file_get_contents( $url );
    $status = $Unserializer->unserialize( $file );
    if (PEAR::isError($status)) {
        die($status->getMessage());
    }
    $xmlArr = $Unserializer->getUnserializedData();
    $item = h( $xmlArr["Items"]["Item"] );
    if( is_array( $item["ItemAttributes"]['Author'] ) ){
        $author = $item["ItemAttributes"]['Author'][0];
    }else{
        $author = $item["ItemAttributes"]['Author'];
    }
    if( $item["ASIN"] == "" ){
        exit;
    }
    $xml = <<<EOD
<result>
 <item>
  <asin>{$item["ASIN"]}</asin>
  <isbn13>{$item["ItemAttributes"]['EAN']}</isbn13>
  <url>{$item['DetailPageURL']}</url>
  <title>{$item["ItemAttributes"]['Title']}</title>
  <image>{$item['LargeImage']['URL']}</image>
  <author>{$author}</author>
  <category>{$item["ItemAttributes"]['Binding']}</category>
  <mode>{$item["ItemAttributes"]['ProductGroup']}</mode>
 </item>
</result>
EOD;
    header ("Content-Type: text/xml; charset=UTF-8");
    echo $xml;
    exit;
}elseif( $_GET['type'] == "word" ){
    $word = $_GET['word'] ? $_GET['word'] : "php";
    $request = array(
                     "Service"        => "AWSECommerceService",
                     "AWSAccessKeyId" => $APIKEY,
                     "Version"        => "2007-01-15",
                     "Operation"      => "ItemSearch",
                     "SearchIndex"    => "Books",
                     "Keywords"       => $word,
                     "ResponseGroup"  => "Medium"
                     );
    $url = "http://webservices.amazon.co.jp/onca/xml" . request2url( $request );
    $Unserializer =& new XML_Unserializer(
                                          array('parseAttributes' => true,
                                                'targetEncoding'  => 'utf-8'
                                                )
                                          );
    $file = file_get_contents( $url );
    $status = $Unserializer->unserialize( $file );
    if (PEAR::isError($status)) {
        die($status->getMessage());
    }
    $xmlArr = $Unserializer->getUnserializedData();
    $items = h( $xmlArr["Items"]["Item"] );
    $xml = <<<EOD
<result>
EOD;
    foreach( $items as $key => $item ){
        if( is_array( $item["ItemAttributes"]['Author'] ) ){
            $author = $item["ItemAttributes"]['Author'][0];
        }else{
            $author = $item["ItemAttributes"]['Author'];
        }
        if( $item["ASIN"] == "" ){
            exit;
        }
        $xml .= <<<EOD
 <item>
  <asin>{$item["ASIN"]}</asin>
  <isbn13>{$item["ItemAttributes"]['EAN']}</isbn13>
  <url>{$item['DetailPageURL']}</url>
  <title>{$item["ItemAttributes"]['Title']}</title>
  <image>{$item['LargeImage']['URL']}</image>
  <author>{$author}</author>
  <category>{$item["ItemAttributes"]['Binding']}</category>
  <mode>{$item["ItemAttributes"]['ProductGroup']}</mode>
 </item>
EOD;
    }
    $xml .= <<<EOD
</result>
EOD;
    header ("Content-Type: text/xml; charset=UTF-8");
    echo $xml;
    exit;
}
?>

inc.php

<?php
function d() {
    echo '<pre style="background:#fff;color:#333;border:1px solid #ccc;margin:2px;padding:4px;font-family:monospace;font-size:12px">';
    foreach (func_get_args() as $v) var_dump($v);
    echo '</pre>';
}
function h($str){
    if(is_array($str)){
        return array_map( "h",$str );
    }else{
        return htmlspecialchars($str,ENT_QUOTES);
    }
}
function e($str){
    if(is_array($str)){
        return array_map( "e",$str );
    }else{
        return mysql_real_escap_string($str);
    }
}
function m($str){
    if(is_array($str)){
        return array_map( "m",$str );
    }else{
        return mb_convert_encoding($str,"SJIS","UTF-8");
    }
}
function request2url( $array ){
    $url = "?";
    foreach( $array as $key => $val ){
        $url .= "{$key}={$val}&";
    }
    return $url;
}
$APIKEY = "取得してね";
?>

AIR

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    verticalScrollPolicy="off" horizontalScrollPolicy="off" backgroundAlpha="0" showStatusBar="false"
    showTitleBar="false" showGripper="false"
    borderStyle="solid" borderThickness="0"
    creationComplete="init()" width="466" height="596"
     viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.effects.easing.*;
import mx.events.ValidationResultEvent;
import mx.controls.RadioButton;
import mx.events.DropdownEvent;
import mx.events.DragEvent;
import mx.collections.ArrayCollection;
import mx.effects.easing.*;
import mx.managers.CursorManager;
import mx.utils.StringUtil;
import mx.controls.Alert;
private var conn:SQLConnection;
private var stmt:SQLStatement;
private var mode:String = "Books";
[Bindable]
private var database:ArrayCollection = new ArrayCollection();
import flash.system.Capabilities;
//初期化関数
private function init():void{
    //シェアードオブジェクトゲット
    var so:SharedObject = SharedObject.getLocal("bookmarker");
    //画面解像度からはみ出してない?
    if( so.data.appX < Capabilities.screenResolutionX && so.data.appY < Capabilities.screenResolutionY ){
        this.nativeWindow.x = so.data.appX;
        this.nativeWindow.y = so.data.appY;
    }else{
        //はみ出しているので初期値
        this.nativeWindow.x = 100;
        this.nativeWindow.y = 100;
        so.clear();
    }
    setDB();
}
/*******************************
    DB初期設定
********************************/
//データベースコネクト
private function setDB():void{
    var dbfile:File = File.desktopDirectory;
    dbfile = dbfile.resolvePath("amazon.db");
    conn = new SQLConnection();
    conn.open(dbfile);
    //DBテーブル初期作成
    createDB();
}
//データベース作成
private function createDB():void{
    stmt = new SQLStatement();
    stmt.sqlConnection = conn;
    //基本テーダーをDB
    stmt.text = " CREATE TABLE IF NOT EXISTS amazonData ( " +
            " id       INTEGER PRIMARY KEY , " +
            " asin     TEXT UNIQUE , " +
            " isbn13   TEXT , " +
            " title    TEXT , " +
            " image    TEXT , " +
            " url      TEXT , " +
            " adddate  DATETIME DEFAULT current_date , " +
            " moddate  DATETIME DEFAULT current_date , " +
            " category TEXT , " +
            " mode     TEXT , " +
            " print    INTEGER ) ; ";
    stmt.addEventListener(SQLEvent.RESULT , function():void{
    });
    stmt.execute();
}
/*******************************
    本データ表示・追加・削除
********************************/
//本データ表示
private function getData():void{
    stmt = new SQLStatement();
    stmt.sqlConnection = conn;
    stmt.text =    " SELECT *, strftime('%Y-%m-%d', adddate) as adddate FROM amazonData WHERE print = 1 ORDER BY id DESC ";
    stmt.addEventListener(SQLEvent.RESULT , function():void{
        dg.dataProvider = stmt.getResult().data;
        dgShow.play();
    });
    try{
        stmt.execute();
    }catch(e:SQLError){
    }
    //isbnText.setFocus();
}
//本データーの追加
private function addData(e:DragEvent):void{
    var item:Object = e.dragSource.dataForFormat("items" );
    var xml:XML = new XML( item );
    if( xml.title != "" ){
        stmt = new SQLStatement();
        stmt.sqlConnection = conn;
        //文字のエスケープ
        var title:String = xml.title.replace( "'" , "''" );
        stmt.text = " INSERT INTO amazonData ( image ,isbn13 , asin , title , url , category , mode , print )VALUES( '" +
            xml.image    + "' , '"+
            xml.isbn13   + "' , '"+
            xml.asin     + "' , '"+
            title        + "' , '"+
            xml.url      + "' , '"+
            xml.category + "' , '"+
            xml.mode     + "' , '1')";
        stmt.addEventListener(SQLEvent.RESULT , function():void{
        } );
        try{
            stmt.execute();
        }catch(e:SQLError){
        }
    }
}
/*******************************
    Amazonへ問い合わせ
********************************/
//ISBN番号からアマゾン情報を取得
private function getAmazonData():void{
    if( isbnText.text != "" ){
        amazonS.send({
            "isbn":isbnText.text,
            "SearchIndex":mode
        });
        myLoader.visible = true;
        tl.visible = false;
    }else{
        Alert.show("ちゃんと記入してね!","エラーだよ!");
    }
}
//ISBN番号からアマゾン情報を取得
private function getAmazonDataWord():void{
    if( wordText.text != "" ){
        amazonS2.send({
            "word":wordText.text
        });
        myLoader.visible = true;
        dgWord.visible = false;
        tl2.visible = false;
    }else{
        Alert.show("ちゃんと記入してね!","エラーだよ!");
    }
}
//ASIN番号からアマゾン情報を取得
private function getAmazonDataByAsin():void{
    if( dgWord.selectedItem.asin != "" ){
        amazonS3.send({
            "asin":dgWord.selectedItem.asin
        });
        myLoader.visible = true;
        tl2.visible = false;
    }else{
        Alert.show("");
    }
}
/*******************************
    Amazonへ問い合わせ完了イベント
********************************/
//問い合わせ完了イベント
private function amazonFinish():void{
    myLoader.visible = false;
    isbnText.text = '';
    tl.visible = true;
}
//問い合わせ完了イベント
private function amazonFinish2():void{
    myLoader.visible = false;
    wordText.text = '';
    dgWord.visible = true;
}
//問い合わせ完了イベント
private function amazonFinish3():void{
    myLoader.visible = false;
    tl2.visible = true;
}
//Faultイベント
private function onFault():void{
}
//本データの削除
private function deleteData():void{
    stmt = new SQLStatement();
    stmt.sqlConnection = conn;
    stmt.text = " DELETE FROM amazonData WHERE isbn13 = '"+ dg.selectedItem.isbn13 +"' ";
    stmt.addEventListener(SQLEvent.RESULT , function():void{
        getData();
    } );
    try{
        stmt.execute();
    }catch(e:SQLError){
    }
}
/*******************************
    ISBNナンバー監視
********************************/
private function isbnChange():void{
    isbnText.text = StringUtil.trim( isbnText.text ).replace('-','');
    if( isbnText.text!= '' && isbnText.length == 13){
        getAmazonData();
    }
}
/*******************************
    バリデーターイベント
********************************/
private function handleValid(eventObj:ValidationResultEvent):void {
    if(eventObj.type==ValidationResultEvent.VALID){
        // Enable Submit button.
    }else{
    }
}
/*******************************
    その他
********************************/
//ラジオボタンの選択
private function setCategory(e:Event):void{
    var rb:RadioButton = e.currentTarget as RadioButton;
    mode = "" + rb.value;
    isbnText.setFocus();
}
//タブナビゲーションチェンジ
private function tnChange():void{
    if( tn.selectedIndex == 2 ){
        getData();
    }
}
private function closeHandler():void{
    //現在のウィンドウ情報を保存しとく
    var so:SharedObject = SharedObject.getLocal("bookmarker");
    so.data.appX = this.nativeWindow.x;
    so.data.appY = this.nativeWindow.y;
    so.flush();
    this.nativeWindow.close();
}
]]>
</mx:Script>
<mx:Style>
Alert {
    titleStyleName: "alertTitle";
    messageStyleName: "alertMessage";
    buttonStyleName: "alertButton";
    dropShadowEnabled: true;
    shadowDistance: 0;
    shadowColor:#ff0000;
    shadowDirection: right;
    cornerRadius: 10;
    embedFonts: true;
    borderColor: #cc66ff;
    backgroundAlpha: 0.55;
}
.alertTitle {
    letterSpacing: 0;
    fontSize: 14;
    color: #ffffff;
}
.alertMessage {
    letterSpacing: 0;
    fontSize: 20;
    fontWeight: normal;
    color: black;
    backgroundColor:#ffffff;
}
.alertButton {
    backgroundColor:#ffccff;
    letterSpacing: 0;
    fontSize: 16;
    cornerRadius: 10;
    fontWeight: normal;
    textRollOverColor: white;
    color: red;
}
WindowedApplication{
    color:#5800a2;
}
DataGrid {
    backgroundAlpha: 0.55;
    alternatingItemColors: #ffffff, #ffccff;
    headerColors: #cc99ff, #ffffff;
    horizontalGridLines: true;
    letterSpacing: 0;
    horizontalGridLineColor: #ff66ff;
    verticalGridLineColor: #ffffff;
    useRollOver: false;
    borderThickness: 3;
    borderColor: #cc99ff;
    selectionColor: #ff99ff;
}
Button {
    cornerRadius: 7;
    highlightAlphas: 0.9, 0.63;
    fillAlphas: 0.81, 0.82, 0.75, 0.65;
    fillColors: #ffffff, #fd38f4, #ffffff, #9966ff;
    color: #990066;
    borderColor: #cc66ff;
    themeColor: #9966ff;
}
TextInput{
    backgroundAlpha:0.8;
    borderStyle: solid;
    borderThickness:2;
    borderColor:#FF4FF9;
    cornerRadius: 15;
}
.noBorder{
}
TileList{
    selectionColor: #ff99ff;
    useRollOver: false;
    alternatingItemColors: #ffffff, #ffccff;
    backgroundAlpha:0.2;
    borderStyle: solid;
    borderThickness:2;
    borderColor:#FF4FF9;
    cornerRadius: 15;
}
Canvas{
    backgroundAlpha:0;
}
TabNavigator {
    horizontalAlign: center;
    tabWidth: 105;
    tabHeight: 22;
    cornerRadius: 8;
    textIndent: 0;
    backgroundAlpha: 1;
    backgroundColor: #ffffff;
    borderColor: #cc33ff;
    borderThickness: 2;
    tabStyleName: "myTabs";
    firstTabStyleName: "myTabs";
    lastTabStyleName: "myTabs";
    selectedTabTextStyleName: "mySelectedTabs";
}
.myTabs {
    cornerRadius: 6;
    highlightAlphas: 0.62, 0.42;
    fillAlphas: 1, 1;
    fillColors: #ffffff, #f190ff;
    backgroundAlpha: 0.78;
    backgroundColor: #ffffff;
    color: #cc3399;
    fontSize: 13;
}
.mySelectedTabs {
}
.noBorder{
    borderStyle: solid;
    borderThickness:0;
}
.myCanvas{
    backgroundAlpha:1;
    borderStyle: solid;
    borderThickness:2;
    borderColor:#FF4FF9;
    backgroundColor: #ffccff;
    cornerRadius: 7;
    shadowDistance: 1;
}
.myCanvas2{
    backgroundImage:"bg2.jpg";
    backgroundAlpha:0.3;
}
</mx:Style>
<!--############## HTTPサービス #############-->
<mx:HTTPService id="amazonS"
     url="http://moeten.info/flex/20080308_amazonBook/index2.php?type=isbn"
     useProxy="false" resultFormat="e4x" showBusyCursor="true" method="GET" result="amazonFinish()" fault="onFault()"/>
<mx:HTTPService id="amazonS2"
     url="http://moeten.info/flex/20080308_amazonBook/index2.php?type=word"
     useProxy="false" resultFormat="e4x" showBusyCursor="true" method="GET" result="amazonFinish2()" fault="onFault()"/>
<mx:HTTPService id="amazonS3"
     url="http://moeten.info/flex/20080308_amazonBook/index2.php?type=asin"
     useProxy="false" resultFormat="e4x" showBusyCursor="true" method="GET" result="amazonFinish3()" fault="onFault()"/>
<!--############## エラーチェック #############-->
<mx:StringValidator source="{wordText}" property="text"
    tooShortError="バーコードリーダーで入力してください。例)4873113652"
    tooLongError="バーコードリーダーで入力してください。例)4873113652"
    minLength="1"
    trigger="{myButtonWord}" triggerEvent="click"
    valid="handleValid(event)" invalid="handleValid(event)"/>
<mx:StringValidator source="{isbnText}" property="text"
    tooShortError="バーコードリーダーで入力してください。例)9784873113654"
    tooLongError="バーコードリーダーで入力してください。例)9784873113654"
    minLength="13" maxLength="13"
    trigger="{myButtonIsbn}" triggerEvent="click"
    valid="handleValid(event)" invalid="handleValid(event)"/>
<!--############## エフェクト #############-->
<mx:Sequence id="dgShow" target="{dg}">
    <mx:Zoom zoomHeightFrom="0.8" zoomHeightTo="1" zoomWidthFrom="0.8" zoomWidthTo="1" easingFunction="Back.easeOut"/>
</mx:Sequence>
<mx:WipeRight id="loadShow"/>
<mx:Sequence id="tlShow">
    <mx:Move yFrom="-100" yTo="70" easingFunction="Back.easeOut"/>
    <mx:Glow color="0xffccff" />
</mx:Sequence>
<mx:Sequence id="tlHide">
    <mx:Move yFrom="70" yTo="-100" easingFunction="Back.easeIn"/>
</mx:Sequence>
<mx:Sequence id="tl2Show">
    <mx:Move yFrom="-100" yTo="211" easingFunction="Back.easeOut"/>
    <mx:Glow  color="0xffccff" />
</mx:Sequence>
<mx:Sequence id="tl2Hide">
    <mx:Move yFrom="211" yTo="-100" easingFunction="Back.easeIn"/>
</mx:Sequence>
<mx:Sequence id="dgWordShow">
    <mx:Move yFrom="-100" yTo="38" easingFunction="Back.easeOut"/>
    <mx:Glow color="0xffccff" />
</mx:Sequence>
<mx:Sequence id="dgWordHide">
    <mx:Move yFrom="38" yTo="-100" easingFunction="Back.easeIn"/>
</mx:Sequence>
<mx:Sequence id="bookAddShow">
    <mx:Zoom zoomHeightFrom="0.5" zoomHeightTo="1" zoomWidthFrom="0.5" zoomWidthTo="1" easingFunction="Back.easeOut"/>
</mx:Sequence>
<mx:Sequence id="bookAddHide">
    <mx:Zoom zoomHeightFrom="1" zoomHeightTo="0.5" zoomWidthFrom="1" zoomWidthTo="0.5" easingFunction="Back.easeIn"/>
</mx:Sequence>
<!--############## フィルタ #############-->
<mx:DropShadowFilter id="dsf" blurX="4" blurY="4" distance="0" color="0x333333"  />
<!--############## コンポーネント #############-->
    <mx:Canvas width="424" height="568" styleName="myCanvas" filters="{[dsf]}" horizontalScrollPolicy="off" verticalScrollPolicy="off" x="20" y="10">
        <mx:Image x="-13" y="3" source="title.jpg" mouseDown="this.nativeWindow.startMove()"/>
        <mx:TabNavigator id="tn" width="416" height="494" x="2" y="66" change="tnChange()" >
            <!-- ISBNから検索+本を追加 -->
            <mx:Canvas label="ISBN" width="100%" height="100%" styleName="myCanvas2"  verticalScrollPolicy="off" >
                <mx:HBox x="48" y="10">
                    <mx:Label text="ISBN13" x="10" y="12"/>
                    <mx:TextInput width="163" id="isbnText" change="isbnChange()" x="63" y="10"/>
                    <mx:Button id="myButtonIsbn" label="ISBNから本を検索" click="getAmazonData()" x="245" y="10"/>
                </mx:HBox>
                <mx:HBox x="48" y="40" horizontalAlign="center">
                    <mx:RadioButton label="和籍" value="Books"        click="setCategory(event)" groupName="category" selected="true"/>
                    <mx:RadioButton label="洋書" value="ForeignBooks" click="setCategory(event)" groupName="category"/>
                    <mx:RadioButton label="DVD"  value="DVD"          click="setCategory(event)" groupName="category"/>
                    <mx:RadioButton label="CD"   value="Music"        click="setCategory(event)" groupName="category"/>
                </mx:HBox>
                <mx:TileList id="tl" showEffect="tlShow" hideEffect="tlHide" visible="false" dataProvider="{amazonS.lastResult.item}" height="304" width="396" rowCount="1" dragComplete="{tl.visible=false}" columnCount="1" dragEnabled="true" dragMoveEnabled="true" x="6" y="70">
                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:VBox width="290" height="290" verticalAlign="middle" horizontalAlign="center" horizontalScrollPolicy="off" verticalScrollPolicy="off">
                                <mx:Text text="{data.title}" width="280" textAlign="left" />
                                <mx:Image source="{data.image}" width="200" height="200"/>
                                <mx:Text text="{data.author}" width="280" textAlign="left" />
                                <!--
                                <mx:Text text="{data.asin}" width="280" textAlign="left" visible="false" />
                                <mx:Text text="{data.isbn13}" width="280" textAlign="left" visible="false" />
                                <mx:Text text="{data.url}" width="280" textAlign="left" visible="false" />
                                <mx:Text text="{data.image}" width="280" textAlign="left" visible="false" />
                                <mx:Text text="{data.category}" width="280" textAlign="left" visible="false" />
                                <mx:Text text="{data.mode}" width="280" textAlign="left" visible="false" />
                                -->
                            </mx:VBox>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:TileList>
                <mx:DataGrid height="67" rowHeight="80" dragEnabled="true"
                    dragMoveEnabled="true" dropEnabled="true"
                     dragDrop="addData(event)" selectable="false"
                    backgroundAlpha="0.5"  visible="{tl.visible}" showEffect="bookAddShow" hideEffect="bookAddHide"
                    width="90" x="315" y="382" backgroundImage="@Embed(source='bgBook.png')">
                    <mx:columns>
                        <mx:DataGridColumn headerText="本追加" dataField="id" visible="false"/>
                    </mx:columns>
                </mx:DataGrid>
            </mx:Canvas>
            <!-- キーワードから検索+本を追加 -->
            <mx:Canvas label="キーワード" width="100%" height="100%" styleName="myCanvas2" verticalScrollPolicy="off" >
                <mx:DataGrid
                    dataProvider="{amazonS2.lastResult.item}"
                    itemClick="getAmazonDataByAsin()"
                    x="10" y="38" width="395" height="165" id="dgWord" showEffect="dgWordShow" hideEffect="dgWordHide" visible="false">
                    <mx:columns>
                        <mx:DataGridColumn headerText="列 1" dataField="title"/>
                        <mx:DataGridColumn headerText="列 2" dataField="asin"/>
                        <mx:DataGridColumn headerText="列 2" dataField="isbn13"/>
                    </mx:columns>
                </mx:DataGrid>
                <mx:TileList id="tl2" showEffect="tl2Show" hideEffect="tl2Hide"  dragComplete="{tl2.visible=false;}" x="10" y="211" width="395" height="163" dataProvider="{amazonS3.lastResult.item}" rowCount="1" columnCount="1"
                    dragEnabled="true" dragMoveEnabled="true" visible="false">
                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:HBox verticalAlign="middle" horizontalScrollPolicy="off" verticalScrollPolicy="off">
                                <mx:Image source="{data.image}" width="100" height="150"/>
                                <mx:VBox>
                                    <mx:Text text="{data.title}" width="280" textAlign="left" />
                                    <mx:Text text="{data.author}" width="280" textAlign="left" />
                                </mx:VBox>
                            </mx:HBox>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:TileList>
                <mx:DataGrid height="67" rowHeight="80" dragEnabled="true"
                    dragMoveEnabled="true" dropEnabled="true"
                     dragDrop="addData(event)" selectable="false"
                    backgroundAlpha="0.5" visible="{tl2.visible}" showEffect="bookAddShow" hideEffect="bookAddHide"
                    width="90" x="315" y="382" backgroundImage="@Embed(source='bgBook.png')">
                    <mx:columns>
                        <mx:DataGridColumn headerText="本追加" dataField="id" visible="false"/>
                    </mx:columns>
                </mx:DataGrid>
                <mx:Button id="myButtonWord" label="キーワードから本を検索" click="getAmazonDataWord()" x="247" y="10"/>
                <mx:TextInput width="127" id="wordText" text="ハルヒ" x="112" y="10"/>
                <mx:Label x="53" y="12" text="キーワード"/>
            </mx:Canvas>
            <!-- 書庫リスト -->
            <mx:Canvas label="書籍リスト" width="100%" height="100%" styleName="myCanvas2" horizontalScrollPolicy="off" verticalScrollPolicy="off" >
                <mx:TileList id="dg" height="353" rowHeight="45" dragEnabled="true"
                    dragMoveEnabled="true"
                     dragDrop="addData(event)"
                    backgroundAlpha="0.5"
                    columnCount="1" y="38" x="7" width="398">
                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:HBox verticalScrollPolicy="off" horizontalScrollPolicy="off" width="100%" verticalAlign="top" horizontalAlign="left" buttonMode="true">
                                <mx:Image source="{data.image}" width="30" height="40"/>
                                <mx:Text text="{data.title}" width="300" textAlign="left" fontSize="14" leading="0"/>
                            </mx:HBox>
                        </mx:Component>
                    </mx:itemRenderer>
                </mx:TileList>
                <mx:DataGrid id="trushdg" width="50" height="50" styleName="noBorder"  dropEnabled="true"
                    backgroundImage="trush.jpg" dragDrop="deleteData()" x="352" y="399">
                    <mx:columns>
                        <mx:DataGridColumn headerText="ゴミ箱" dataField="id" visible="false"/>
                    </mx:columns>
                </mx:DataGrid>
                <mx:Label x="42" y="12" text="ここまだ⇒検索"/>
                <mx:TextInput x="119" y="10"/>
                <mx:Button x="287" y="10" label="絞り込み"/>
            </mx:Canvas>
        </mx:TabNavigator>
        <mx:Image x="391" y="8" source="btnClose.png" click="{closeHandler()}" buttonMode="true"/>
        <mx:ProgressBar visible="false" width="424" indeterminate="true" id="myLoader" label=" " showEffect="loadShow" hideEffect="loadShow" themeColor="#EE31FF" height="8" x="-4" y="0"/>
    </mx:Canvas>
</mx:WindowedApplication>