<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>イージーネット Tech Blog &#187; Flex</title>
	<atom:link href="http://blog.eni.co.jp/tech/tag/flex/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.eni.co.jp/tech</link>
	<description>株式会社イージーネットのスタッフによる技術系ブログです</description>
	<lastBuildDate>Tue, 12 Jan 2010 01:46:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/tag/flex/feed" />
		<item>
		<title>AIR/Flex でファイルアップロード</title>
		<link>http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html#comments</comments>
		<pubDate>Thu, 25 Jun 2009 11:45:13 +0000</pubDate>
		<dc:creator>末田 佳和</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=820</guid>
		<description><![CDATA[こんにちは。
プロダクト&#38;サービス事業部 リーダーの末田です。
今回は、AIR/Flex でファイルのアップロード(HTTPのPOST)について書こうと思います。
ファイルアップロードにおけるAIR/FlexとINPUTタグの違い
ファイルのアップロード自体は、わざわざAIR/Flexで行わなくても、HTMLのINPUTタグで可能ですが、AIR/Flexで行うと以下のような利点があります。

ブラウザが固まらない
INPUTタグによるファイルアップロードの場合、
アップロードを行っている間、ブラウザは無反応になります。
大きなファイルをアップロードしている場合、特に顕著に発生します。
その時にブラウザ内をクリックするとOSから「応答なし」という判断になることもあります。
AIR/Flexでは、そのようなことは起きません。
また、アップロード中に他の操作を受け付けることもできます。
アップロードの進捗が見えやすい
INPUTタグによるファイルアップロードの場合、
アップロードの進捗は見えない、もしくはプログレスバーが動いてはいるが、よくわからない、といった表示になります。
Ajaxを利用して、自作のプログレスバーを表示することもできますが、
クライアント側、サーバ側それぞれに仕組みが必要になります。
AIR/Flexでは、アップロードの進捗をイベントとして受け取ることができるので、クライアント側だけで、自作のプログレスバーを表示することができます。
ドラッグアンドドロップ等でファイルを選択できる(AIRのみ)
INPUTタグによるファイルアップロードの場合、
アップロードするファイルを指定する方法は、標準のファイル選択ダイアログのみとなりますが、AIRでは、ファイルパスの指定方法は限定されません。
Flexでは、標準のファイル選択ダイアログのみとなります。


基本的なファイルアップロード
AIR/Flexの場合
AIR/Flexでの基本的なファイルアップロードのサンプルコードです。
以下のように動作します。

ボタンをクリックすると、
ファイル参照ダイアログが開き、
ファイルを選択してOKをクリックすると、
ファイルがアップロードされます。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; width=&#34;300&#34; height=&#34;200&#34;&#62;
  &#60;mx:Script&#62;
    &#60;!&#91;CDATA&#91;
&#160;
    private function onClickBtn1 &#40;&#41; : void &#123;
&#160;
      //ファイル参照オブジェクトを準備します
      var file:FileReference = new FileReference&#40;&#41;;
&#160;
      //ファイル参照ダイアログで、ファイルが選択された場合に発生するイベント
      file.addEventListener&#40;Event.SELECT, function &#40;event:Event&#41;:void [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
プロダクト&amp;サービス事業部 リーダーの末田です。</p>
<p>今回は、AIR/Flex でファイルのアップロード(HTTPのPOST)について書こうと思います。</p>
<h3>ファイルアップロードにおけるAIR/FlexとINPUTタグの違い</h3>
<p>ファイルのアップロード自体は、わざわざAIR/Flexで行わなくても、HTMLのINPUTタグで可能ですが、AIR/Flexで行うと以下のような利点があります。</p>
<ol>
<li>ブラウザが固まらない</li>
<p>INPUTタグによるファイルアップロードの場合、<br />
アップロードを行っている間、ブラウザは無反応になります。<br />
大きなファイルをアップロードしている場合、特に顕著に発生します。<br />
その時にブラウザ内をクリックするとOSから「応答なし」という判断になることもあります。<br />
AIR/Flexでは、そのようなことは起きません。<br />
また、アップロード中に他の操作を受け付けることもできます。</p>
<li>アップロードの進捗が見えやすい</li>
<p>INPUTタグによるファイルアップロードの場合、<br />
アップロードの進捗は見えない、もしくはプログレスバーが動いてはいるが、よくわからない、といった表示になります。<br />
Ajaxを利用して、自作のプログレスバーを表示することもできますが、<br />
クライアント側、サーバ側それぞれに仕組みが必要になります。<br />
AIR/Flexでは、アップロードの進捗をイベントとして受け取ることができるので、クライアント側だけで、自作のプログレスバーを表示することができます。</p>
<li>ドラッグアンドドロップ等でファイルを選択できる(AIRのみ)</li>
<p>INPUTタグによるファイルアップロードの場合、<br />
アップロードするファイルを指定する方法は、標準のファイル選択ダイアログのみとなりますが、AIRでは、ファイルパスの指定方法は限定されません。<br />
Flexでは、標準のファイル選択ダイアログのみとなります。
</ol>
<p><span id="more-820"></span></p>
<h3>基本的なファイルアップロード</h3>
<h4>AIR/Flexの場合</h4>
<p>AIR/Flexでの基本的なファイルアップロードのサンプルコードです。<br />
以下のように動作します。</p>
<ol>
<li>ボタンをクリックすると、</li>
<li>ファイル参照ダイアログが開き、</li>
<li>ファイルを選択してOKをクリックすると、</li>
<li>ファイルがアップロードされます。</li>
</ol>

<div class="wp_codebox"><table width="100%" ><tr id="p8205"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p820code5"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:Application xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;300&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;200&quot;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onClickBtn1 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
      <span style="color: #808080; font-style: italic;">//ファイル参照オブジェクトを準備します</span>
      <span style="color: #000000; font-weight: bold;">var</span> file:FileReference = <span style="color: #000000; font-weight: bold;">new</span> FileReference<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//ファイル参照ダイアログで、ファイルが選択された場合に発生するイベント</span>
      file.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">SELECT</span>, <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">//アップロードするURLを指定します</span>
        <span style="color: #000000; font-weight: bold;">var</span> req:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://localhost:8080/blogsample/upload.ctrl&quot;</span><span style="color: #66cc66;">&#41;</span>;
        req.<span style="color: #006600;">method</span> = URLRequestMethod.<span style="color: #006600;">POST</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">//アップロード終了イベント</span>
        file.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
          <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;complete&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">//アップロード実行</span>
        file.<span style="color: #006600;">upload</span><span style="color: #66cc66;">&#40;</span>req, <span style="color: #ff0000;">&quot;file1&quot;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//ファイル参照ダイアログを開く</span>
      file.<span style="color: #006600;">browse</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
&nbsp;
  <span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">Button</span> id=<span style="color: #ff0000;">&quot;btn1&quot;</span> x=<span style="color: #ff0000;">&quot;100&quot;</span> y=<span style="color: #ff0000;">&quot;90&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;20&quot;</span> label=<span style="color: #ff0000;">&quot;UPLOAD&quot;</span> click=<span style="color: #ff0000;">&quot;onClickBtn1()&quot;</span><span style="color: #66cc66;">/&gt;</span>
&nbsp;
<span style="color: #66cc66;">&lt;/</span>mx:Application<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<p>Flexでは、<a href="http://www.adobe.com/livedocs/flex/3_jp/langref/flash/net/FileReference.html">flash.net.FileReference</a> クラスを使います。<br />
このクラスだけで、ファイルの選択（ダイアログ表示）とアップロードを行うことができます。</p>
<h4>AIRの場合</h4>
<p>AIR上では、このクラスだけでなく、<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/filesystem/File.html">flash.filesystem.File</a>クラスも利用することができます。<br />
このクラスではファイルパスを指定できるので、ファイル参照ダイアログを開かなくても、アップロードするファイルを指定できます。</p>
<p>これにより、ドラッグアンドドロップ等、様々な方法でアップロードするファイルを指定できます。</p>
<p>AIR上で<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/filesystem/File.html">flash.filesystem.File</a>クラスを使用した場合のサンプルです。</p>
<p>以下のように動作します。</p>
<ol>
<li>ボタンをクリックすると、</li>
<li>ファイルがアップロードされます。</li>
</ol>

<div class="wp_codebox"><table width="100%" ><tr id="p8206"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p820code6"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:WindowedApplication xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;300&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;200&quot;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onClickBtn1 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
      <span style="color: #808080; font-style: italic;">//ファイルオブジェクトを準備します</span>
      <span style="color: #000000; font-weight: bold;">var</span> file:File = <span style="color: #000000; font-weight: bold;">new</span> File<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;c:<span style="color: #000099; font-weight: bold;">\\</span>uploadsample.txt&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//アップロードするURLを指定します</span>
      <span style="color: #000000; font-weight: bold;">var</span> req:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;http://localhost:8080/blogsample/upload.ctrl&quot;</span><span style="color: #66cc66;">&#41;</span>;
      req.<span style="color: #006600;">method</span> = URLRequestMethod.<span style="color: #006600;">POST</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//アップロード終了イベント</span>
      file.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;complete&quot;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
      <span style="color: #808080; font-style: italic;">//アップロード実行</span>
      file.<span style="color: #006600;">upload</span><span style="color: #66cc66;">&#40;</span>req, <span style="color: #ff0000;">&quot;file1&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
&nbsp;
  <span style="color: #66cc66;">&lt;</span>mx:<span style="color: #0066CC;">Button</span> id=<span style="color: #ff0000;">&quot;btn1&quot;</span> x=<span style="color: #ff0000;">&quot;100&quot;</span> y=<span style="color: #ff0000;">&quot;90&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;20&quot;</span> label=<span style="color: #ff0000;">&quot;UPLOAD&quot;</span> click=<span style="color: #ff0000;">&quot;onClickBtn1()&quot;</span><span style="color: #66cc66;">/&gt;</span>
&nbsp;
<span style="color: #66cc66;">&lt;/</span>mx:WindowedApplication<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<h3>アップロード時のパラメータ</h3>
<p>ファイルのアップロード時、一緒にリクエストパラメータを送信する場合は、<br />
<a href="">flash.net.URLVariables</a>クラスを使用します。</p>
<p>URLVariablesクラスに、リクエストパラメータのキー名をプロパティ名、値をプロパティの値として設定し、URLRequestクラスのdataプロパティに設定することにより、送信できます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p8207"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p820code7"><pre class="actionscript" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">var</span> req = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">var</span> param:URLVariables = <span style="color: #000000; font-weight: bold;">new</span> URLVariables<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
param.<span style="color: #006600;">hogekey</span>=<span style="color: #ff0000;">&quot;hogevalue&quot;</span>;
req.<span style="color: #0066CC;">data</span> = param;</pre></td></tr></table></div>

<h3>アップロードの進捗の取得</h3>
<p>アップロードの進捗度合いは、<a href="http://www.adobe.com/livedocs/flex/3_jp/langref/flash/net/FileReference.html">flash.net.FileReference</a> クラスもしくは、<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/filesystem/File.html">flash.filesystem.File</a>クラスの<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/events/ProgressEvent.html>flash.events.ProgressEvent.PROGRESS</a>イベントを補足することで取得できます。<br />
このイベント取得時に取得できる<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/events/ProgressEvent.html>flash.events.ProgressEvent</a>から、全体のバイト数(bytesTotal)と現在アップロードしたバイト数(bytesLoaded)を取得できます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p8208"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p820code8"><pre class="actionscript" style="font-family:monospace;">file.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>ProgressEvent.<span style="color: #006600;">PROGRESS</span>, <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span>event:ProgressEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bytesTotal=&quot;</span> + event.<span style="color: #0066CC;">bytesTotal</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;bytesLoaded=&quot;</span> + event.<span style="color: #0066CC;">bytesLoaded</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<h3>まとめ</h3>
<p>以上で、ファイルアップロードに関しては一通り行えると思います。<br />
これを利用して、詳細なプログレスバーが出る、<br />
HTMLでは実現が難しいようなアップローダー等が実現できます。</p>
<p>INPUTタグでのアップロードでは、大きなファイルになればなるほど、<br />
問題が大きく、インタフェースとして使いにくいものですので、<br />
ぜひ活用していきたく思っています。</p>
<h3>使用したソフトウェア</h3>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th>Adobe AIR</th>
<td>1.5</td>
</tr>
<tr>
<th>Adobe Flex SDK</th>
<td>3.2.0</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html">AIR/Flex でドラッグ アンド ドロップ</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html">リッチなAdobe AIR/Flexのツールチップをよりリッチに</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html" />
	</item>
		<item>
		<title>リッチなAdobe AIR/Flexのツールチップをよりリッチに</title>
		<link>http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 10:15:58 +0000</pubDate>
		<dc:creator>白石 将</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=564</guid>
		<description><![CDATA[はじめまして､こんにちは｡
プロダクト&#38;サービス事業部の白石です｡
近々新バージョンのニュースリリースをおこなう予定の弊社製品easyFiLEXですが､
僕自身も開発者として本プロジェクトに参加していました｡
今回バージョンアップとなるeasyFiLEXの注目の機能として､
Adobe AIR上で動作するデスクトップアプリからファイルの送信が可能になったことが第一に挙げられます｡
そんな目玉機能の一部を任され､
初めてのデスクトップアプリ､
初めてのAdobe AIR/Flex､
さらに初めてのActionScriptと何から何まで初めてづくしの開発となりました｡
そんな初めてだらけの中で試行錯誤しつつ､
｢これは知ってると便利!!｣と思ったことを紹介しようと思います｡

カスタムツールチップの作成

今回紹介するのはAdobe AIR/Flexのツールチップについてです｡
Adobe Flex リファレンスガイドではツールヒントと呼んでいますが本記事ではツールチップと呼ぶことにします｡
ツールチップそのものをただ使うだけであれば､

1
&#60;mx:Label text=&#34;This is Label&#34; toolTip=&#34;mx.controls.Label&#34; /&#62;

のようにtoolTipプロパティを設定するだけの極々簡単なものです｡
このツールチップは設定した文字列を､
カーソルが重なった時にポップアップして表示するだけのものですが､
以下のように少し複雑なツールチップを表示することも出来ます｡

なんだか少し良い感じに見えますよね。
では､このツールチップをどうやって実装するのか説明したいと思います｡
まずはmx.core.IToolTipインターフェイスをインプリメントしたコンポーネントを作成します｡
PersonToolTip.mxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;mx:HBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; width=&#34;150&#34; height=&#34;80&#34;
	alpha=&#34;.8&#34; implements=&#34;mx.core.IToolTip&#34;
	borderStyle=&#34;solid&#34; dropShadowEnabled=&#34;true&#34;
	backgroundColor=&#34;#FCFCCB&#34;&#62;
	&#60;mx:Script&#62;
		&#60;!&#91;CDATA&#91;
			import mx.controls.Text;
			&#91;Bindable&#93;
			public var person:Object;
&#160;
			public function get text&#40;&#41;:String &#123; 
				return null; 
			&#125; 
&#160;
			public function set text&#40;value:String&#41;:void &#123;
			&#125;
		&#93;&#93;&#62;
	&#60;/mx:Script&#62;	
	&#60;mx:Form paddingTop=&#34;5&#34; paddingRight=&#34;5&#34; paddingBottom=&#34;5&#34; paddingLeft=&#34;5&#34;&#62;
		&#60;mx:FormItem label=&#34;name : &#34;&#62;
			&#60;mx:Label text=&#34;{person.name}&#34; /&#62;
		&#60;/mx:FormItem&#62;
		&#60;mx:FormItem label=&#34;age : &#34;&#62;
			&#60;mx:Label text=&#34;{person.age}&#34; /&#62;
		&#60;/mx:FormItem&#62;
		&#60;mx:FormItem label=&#34;address : &#34;&#62;
			&#60;mx:Label text=&#34;{person.address}&#34; /&#62;
		&#60;/mx:FormItem&#62;
	&#60;/mx:Form&#62;
&#60;/mx:HBox&#62;

mx.core.IToolTipをインプリメントしたコンポーネントを作成したら､
そのコンポーネントを使うアプリケーションを作成します｡
Person.mxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;mx:WindowedApplication xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>はじめまして､こんにちは｡<br />
プロダクト&amp;サービス事業部の白石です｡</p>
<p>近々新バージョンのニュースリリースをおこなう予定の弊社製品<a href="http://www.eni.co.jp/products/easyfilex/index.html">easyFiLEX</a>ですが､<br />
僕自身も開発者として本プロジェクトに参加していました｡</p>
<p>今回バージョンアップとなるeasyFiLEXの注目の機能として､<br />
<a href="http://www.adobe.com/jp/products/air/">Adobe AIR</a>上で動作するデスクトップアプリからファイルの送信が可能になったことが第一に挙げられます｡</p>
<p>そんな目玉機能の一部を任され､<br />
初めてのデスクトップアプリ､<br />
初めてのAdobe AIR/Flex､<br />
さらに初めてのActionScriptと何から何まで初めてづくしの開発となりました｡</p>
<p>そんな初めてだらけの中で試行錯誤しつつ､<br />
｢これは知ってると便利!!｣と思ったことを紹介しようと思います｡</p>
<p><span id="more-564"></span></p>
<h3>カスタムツールチップの作成</h3>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/label.png" alt="label_tooltip" title="label_tooltip" width="179" height="87" class="aligncenter size-full wp-image-568" /></p>
<p>今回紹介するのはAdobe AIR/Flexのツールチップについてです｡<br />
<a href="http://livedocs.adobe.com/flex/3_jp/langref/index.html">Adobe Flex リファレンスガイド</a>ではツールヒントと呼んでいますが本記事ではツールチップと呼ぶことにします｡</p>
<p>ツールチップそのものをただ使うだけであれば､</p>

<div class="wp_codebox"><table width="100%" ><tr id="p56413"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p564code13"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;This is Label&quot;</span> toolTip=<span style="color: #ff0000;">&quot;mx.controls.Label&quot;</span> <span style="color: #66cc66;">/&gt;</span></pre></td></tr></table></div>

<p>のようにtoolTipプロパティを設定するだけの極々簡単なものです｡</p>
<p>このツールチップは設定した文字列を､<br />
カーソルが重なった時にポップアップして表示するだけのものですが､<br />
以下のように少し複雑なツールチップを表示することも出来ます｡</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/person.png" alt="person" title="person" width="225" height="165" class="alignnone size-full wp-image-622" style="margin-left:5em"/><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/person_tooltip.png" alt="person_tooltip" title="person_tooltip" width="226" height="164" class="alignnone size-full wp-image-623" style="margin-left:5em"/></p>
<p>なんだか少し良い感じに見えますよね。</p>
<p>では､このツールチップをどうやって実装するのか説明したいと思います｡</p>
<p>まずは<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/core/IToolTip.html">mx.core.IToolTipインターフェイス</a>をインプリメントしたコンポーネントを作成します｡</p>
<p><strong>PersonToolTip.mxml</strong></p>

<div class="wp_codebox"><table width="100%" ><tr id="p56414"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p564code14"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:HBox xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;150&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;80&quot;</span>
	alpha=<span style="color: #ff0000;">&quot;.8&quot;</span> <span style="color: #0066CC;">implements</span>=<span style="color: #ff0000;">&quot;mx.core.IToolTip&quot;</span>
	borderStyle=<span style="color: #ff0000;">&quot;solid&quot;</span> dropShadowEnabled=<span style="color: #ff0000;">&quot;true&quot;</span>
	<span style="color: #0066CC;">backgroundColor</span>=<span style="color: #ff0000;">&quot;#FCFCCB&quot;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">controls</span>.<span style="color: #0066CC;">Text</span>;
			<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
			<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> person:<span style="color: #0066CC;">Object</span>;
&nbsp;
			<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">get</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">String</span> <span style="color: #66cc66;">&#123;</span> 
				<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">null</span>; 
			<span style="color: #66cc66;">&#125;</span> 
&nbsp;
			<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #0066CC;">set</span> <span style="color: #0066CC;">text</span><span style="color: #66cc66;">&#40;</span>value:<span style="color: #0066CC;">String</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>	
	<span style="color: #66cc66;">&lt;</span>mx:Form paddingTop=<span style="color: #ff0000;">&quot;5&quot;</span> paddingRight=<span style="color: #ff0000;">&quot;5&quot;</span> paddingBottom=<span style="color: #ff0000;">&quot;5&quot;</span> paddingLeft=<span style="color: #ff0000;">&quot;5&quot;</span><span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:FormItem label=<span style="color: #ff0000;">&quot;name : &quot;</span><span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;{person.name}&quot;</span> <span style="color: #66cc66;">/&gt;</span>
		<span style="color: #66cc66;">&lt;/</span>mx:FormItem<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:FormItem label=<span style="color: #ff0000;">&quot;age : &quot;</span><span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;{person.age}&quot;</span> <span style="color: #66cc66;">/&gt;</span>
		<span style="color: #66cc66;">&lt;/</span>mx:FormItem<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:FormItem label=<span style="color: #ff0000;">&quot;address : &quot;</span><span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;{person.address}&quot;</span> <span style="color: #66cc66;">/&gt;</span>
		<span style="color: #66cc66;">&lt;/</span>mx:FormItem<span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Form<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;/</span>mx:HBox<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<p>mx.core.IToolTipをインプリメントしたコンポーネントを作成したら､<br />
そのコンポーネントを使うアプリケーションを作成します｡</p>
<p><strong>Person.mxml</strong></p>

<div class="wp_codebox"><table width="100%" ><tr id="p56415"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p564code15"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:WindowedApplication xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span>
	<span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;300&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;200&quot;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">ToolTipEvent</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> toolTipCreateEventHandle<span style="color: #66cc66;">&#40;</span>event:ToolTipEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> toolTip:PersonToolTip = <span style="color: #000000; font-weight: bold;">new</span> PersonToolTip<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				toolTip.<span style="color: #006600;">person</span> = personModel;
				event.<span style="color: #006600;">toolTip</span> = toolTip;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:Model id=<span style="color: #ff0000;">&quot;personModel&quot;</span><span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>person<span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>name<span style="color: #66cc66;">&gt;</span>taro<span style="color: #66cc66;">&lt;/</span>name<span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>age<span style="color: #66cc66;">&gt;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&lt;/</span>age<span style="color: #66cc66;">&gt;</span>
			<span style="color: #66cc66;">&lt;</span>address<span style="color: #66cc66;">&gt;</span>Osaka<span style="color: #66cc66;">&lt;/</span>address<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;/</span>person<span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Model<span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;</span>mx:Panel title=<span style="color: #ff0000;">&quot;Person&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;75%&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;75%&quot;</span> paddingTop=<span style="color: #ff0000;">&quot;10&quot;</span> paddingLeft=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:Label <span style="color: #0066CC;">text</span>=<span style="color: #ff0000;">&quot;{personModel.name}&quot;</span>
			toolTip=<span style="color: #ff0000;">&quot; &quot;</span> toolTipCreate=<span style="color: #ff0000;">&quot;toolTipCreateEventHandle(event)&quot;</span> <span style="color: #66cc66;">/&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Panel<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;/</span>mx:WindowedApplication<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<p>この二つのファイルを作成したら後は実行するだけです｡</p>
<p>どうでしたか?<br />
凄く簡単でしたよね?</p>
<p>簡単に動作を説明すると､</p>
<ol>
<li>taroにカーソルを合わせる</li>
<li>toolTipプロパティで設定した&quot; &quot;という文字列でツールチップを作成</li>
<li>ツールチップが作成される際に投げられる<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/core/UIComponent.html#event:toolTipCreate">toolTipCreateイベント</a>処理開始</li>
<li>イベントにPersonToolTipコンポーネントを渡す</li>
<li>カスタムツールチップ表示</li>
</ol>
<p>といった具合に処理されています｡</p>
<p>toolTipプロパティに&quot;&quot;ではなくて､&quot; &quot;(空白文字)を渡している点に注意してください｡</p>
<p>toolTipプロパティが&quot;&quot;では､空文字となるためツールチップが作成されません｡<br />
つまり､toolTipCreateイベントが投げられないのでカスタムツールチップに差し替えることが出来ないのです｡<br />
逆に言ってしまえばtoolTipCreateイベントが投げられれば良いので､&quot;hoge&quot;でも&quot;foo&quot;でも&quot;bar&quot;でも構いません｡</p>
<p>ところで､toolTipCreateイベントの処理の中で<br />
イベント自身である<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/events/ToolTipEvent.html">mx.events.ToolTipEventクラス</a>のtoolTipプロパティにPersonToolTipコンポーネントを渡すだけでツールチップが差し替えられるのは何故なのでしょうか?</p>
<p><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/core/UIComponent.html#event:toolTipCreate">mx.core.UIComponentクラス のtoolTipCreateイベントのリファレンスガイド</a>には以下のように書いてあります｡</p>
<blockquote><p>独自の IToolTip オブジェクトを作成し、それに対する参照をイベントオブジェクトの toolTip プロパティに格納し、これを toolTipCreate ハンドラに渡すと、ToolTipManager によってそのカスタムツールヒントが表示されます。 </p></blockquote>
<p>上記の機能を利用してツールチップをカスタムツールチップに差し替えているわけです｡</p>
<h3>ComboBoxとカスタムツールチップを組み合わせてみる</h3>
<p>このカスタムツールチップは何かと使えそうなので､<br />
<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/ComboBox.html">mx.controls.ComboBoxコントロール</a>にこのカスタムツールチップを使用する方法を考えてみました｡</p>

<div class="wp_codebox"><table width="100%" ><tr id="p56416"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p564code16"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:WindowedApplication xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span>
	<span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;300&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;200&quot;</span> creationComplete=<span style="color: #ff0000;">&quot;init()&quot;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">collections</span>.<span style="color: #006600;">ArrayCollection</span>;
			<span style="color: #0066CC;">import</span> mx.<span style="color: #006600;">events</span>.<span style="color: #006600;">ToolTipEvent</span>;
&nbsp;
			<span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
			<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">var</span> persons:ArrayCollection = <span style="color: #000000; font-weight: bold;">new</span> ArrayCollection<span style="color: #66cc66;">&#40;</span>
				<span style="color: #66cc66;">&#91;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">name</span>:<span style="color: #ff0000;">&quot;taro&quot;</span>, age:<span style="color: #cc66cc;">20</span>, address:<span style="color: #ff0000;">&quot;Osaka&quot;</span><span style="color: #66cc66;">&#125;</span>,
				  <span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">name</span>:<span style="color: #ff0000;">&quot;hanako&quot;</span>, age:<span style="color: #cc66cc;">18</span>, address:<span style="color: #ff0000;">&quot;Tokyo&quot;</span><span style="color: #66cc66;">&#125;</span>,
				  <span style="color: #66cc66;">&#123;</span><span style="color: #0066CC;">name</span>:<span style="color: #ff0000;">&quot;ichiro&quot;</span>, age:<span style="color: #cc66cc;">24</span>, address:<span style="color: #ff0000;">&quot;Hukuoka&quot;</span><span style="color: #66cc66;">&#125;</span>
				<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> toolTipCreateEventHandle<span style="color: #66cc66;">&#40;</span>event:ToolTipEvent<span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">var</span> toolTip:PersonToolTip = <span style="color: #000000; font-weight: bold;">new</span> PersonToolTip<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				toolTip.<span style="color: #006600;">person</span> = personsComboBox.<span style="color: #006600;">selectedItem</span>;
				event.<span style="color: #006600;">toolTip</span> = toolTip;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
&nbsp;
	<span style="color: #66cc66;">&lt;</span>mx:Panel title=<span style="color: #ff0000;">&quot;Persons&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;75%&quot;</span> <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;75%&quot;</span> paddingTop=<span style="color: #ff0000;">&quot;10&quot;</span> paddingLeft=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #66cc66;">&gt;</span>
		<span style="color: #66cc66;">&lt;</span>mx:ComboBox id=<span style="color: #ff0000;">&quot;personsComboBox&quot;</span> dataProvider=<span style="color: #ff0000;">&quot;{persons}&quot;</span> labelField=<span style="color: #ff0000;">&quot;name&quot;</span>
			toolTip=<span style="color: #ff0000;">&quot; &quot;</span> toolTipCreate=<span style="color: #ff0000;">&quot;toolTipCreateEventHandle(event)&quot;</span> <span style="color: #66cc66;">/&gt;</span>
	<span style="color: #66cc66;">&lt;/</span>mx:Panel<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;/</span>mx:WindowedApplication<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<p>ただ､これだとComboBox自身のツールチップは表示されるのですが､<br />
ドロップダウンリストでのツールチップが有効にならないのでイマイチ使い勝手はよくありません｡</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/combobox_tooltip.png" alt="combobox_tooltip" title="combobox_tooltip" width="226" height="164" class="alignnone size-full wp-image-624" style="margin-left:5em"/><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/06/dropdown.png" alt="dropdown" title="dropdown" width="225" height="164" class="alignnone size-full wp-image-625" style="margin-left:5em"/></p>
<p>どうにか実現出来ないかと､</p>
<ul>
<li><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/listClasses/ListBase.html#showDataTips">dropdown.showDataTipsプロパティ</a>にtrueを設定</li>
<li><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/List.html">List</a>を継承しイベントリスナーに<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/events/ToolTipEvent.html#TOOL_TIP_CREATE">ToolTipEvent.TOOL_TIP_CREATEイベント</a>を追加したクラスを作成して<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/ComboBox.html#dropdownFactory">dropdownFactoryプロパティ</a>に設定</li>
<li><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/ComboBox.html#event:itemRollOver">ItemRollOver</a>､<a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/controls/ComboBox.html#event:itemRollOut">ItemRollOut</a>イベントを駆使</li>
</ul>
<p>と色々と試行錯誤してみたのですが､どれも上手くいってません｡<br />
上手く実現出来た方がいれば是非教えてください｡</p>
<p><a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/managers/ToolTipManager.html">ToolTipManagerクラス</a>にIToolTipインターフェイスの実装クラスを渡したら､<br />
そのままツールチップとして表示してくれるメソッドが用意されていれば簡単だったのですが･･･</p>
<h3>まとめ</h3>
<p>結局､ComboBoxとの夢の共演は果たせなかったのですが､<br />
このカスタムツールチップは色々な所で使える便利な機能だと思います。</p>
<p>最初から便利なコンポーネントが用意されているAIR/Flex環境ですが､<br />
少しだけ工夫をすることで更に便利なものにすることが出来てしまいます。</p>
<p>今回は紹介出来ませんでしたが､<br />
まだ他にもちょっとしたTipsのような形で紹介出来そうなことも発見しました｡</p>
<p>また次の機会にでも､<br />
ちょっとした工夫を紹介出来たらと思います｡</p>
<h3>使用したソフトウェア</h3>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th>Adobe AIR</th>
<td>1.5</td>
</tr>
<tr>
<th>Adobe Flex SDK</th>
<td>3.2.0</td>
</tr>
</table>
<h3>参考ドキュメント</h3>
<ul>
<li>
        <a href="http://www.adobe.com/livedocs/flex/3_jp/html/help.html?content=tooltips_4.html">Flex 3 開発ガイド  ツールヒントマネージャの使用</a>
    </li>
<li>
        <a href="http://wiki.mediaboxtraining.com/doku.php/tutorials:flex:tooltip">Personalise your information bubbles (ToolTip)</a>
    </li>
</ul>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html">AIR/Flex でファイルアップロード</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html">AIR/Flex でドラッグ アンド ドロップ</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html" />
	</item>
		<item>
		<title>Seleniumの自動テストを止めることなく、Flexを手動操作する方法</title>
		<link>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html#comments</comments>
		<pubDate>Fri, 29 May 2009 08:17:50 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Wait]]></category>
		<category><![CDATA[自動テスト]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=478</guid>
		<description><![CDATA[はじめまして。
プロダクト&#38;サービス事業部の笹山です。
今回は、SeleniumRCを用いてWebアプリケーションのテスト中に、Flex部分のみを手動操作し、
その後再び自動テストを継続させる方法について書きたいと思います。
有名なツールなのでみなさんご存知と思いますが、まずSeleniumRCとは、
「Webブラウザの操作を自動化させ、Webアプリケーションの画面表示や画面遷移のテストを行うツール」で
Webアプリケーションのテストには欠かせないツールです。
今回弊社では、easyFiLEXのテストをSeleniumRCを用いて行うことになりました。

easyFiLEXテストでSeleniumRCを使用する際の問題
弊社Tech Blog(05/18)記事にもあるように、easyFiLEXではFlexを採用しています。
easyFiLEXには、Wizard形式の画面があり、その一部画面にFlexが採用されています。
しかし、SeleniumRCは一般的なWebアプリケーションのテストを行うツールで、Flexには対応していません。
そのため、Flexが採用されているWizard形式の１画面がクリアできず、次の画面のテストができないのです。
ここをどう解決するか非常に悩みました。
FlashSelenium発見と挫折
まずは、Google先生に聞いてみました。
すると以下のサイトが検索に引っ掛かりました。

「Selenium RCによるFlash用の機能テストの作成と実行」

FlashSeleniumというSeleniumRCとFlexを連携させるツールです。
「これで解決！（Flex部分のテストも自動化できる！）」と思いました。
意気揚揚と公開されているサンプルを動かしはじめましたが、サンプルすら動きませんでした。（動いた方は教えてください。）

FlashSeleniumのサンプルFlash
FlashSeleniumのサンプルテストコード

解決方法の発見
途方に暮れselenium-client-driverのJavaDocを眺めていた時、ふと目に入った文字が・・・。
com.thoughtworks.selenium.Wait
便利なクラスがselenium-client-driverに用意されていました。
「条件がtrueになるまで、指定時間待つ」というものです。
easyFiLEXのテストでは以下の手順で使用しました。
手順内の画面は、
Flexが採用されているWizard形式の１画面で、「ファイルのアップロード後、送信先を指定する画面」です。
送信先を指定しない限り、次の画面へ進むことができないようになっています。

Flexが採用されている画面までは、SeleniumRCを用いてWizard形式画面の自動テストを行います。
Flexが採用されている画面に遷移後、SeleniumRCで送信先を指定せずに「次へ」ボタンを押下させ、バリデーションエラーを発生させます。
バリデーションエラー：「送信先が選択されていません。1つ以上選択してください。」
/li>
バリデーションエラーが画面上に表示されている間は、指定時間待機させます。（以下コード参照）
待機中にFlex操作を手動で行い、バリデーションエラーが画面上から消えると、再び自動テストが始まります。

Selenium実行途中でWaitをかけるコード

1
2
3
4
5
6
7
8
9
new Wait&#40;&#41; &#123;
    public boolean until&#40;&#41; &#123;
        if&#40;!selenium.isTextPresent&#40;&#34;送信先が選択されていません。1つ以上選択してください。&#34;&#41;&#41; &#123;
            return true;
        &#125; else &#123;
            [...]]]></description>
			<content:encoded><![CDATA[<p>はじめまして。</p>
<p>プロダクト&amp;サービス事業部の笹山です。</p>
<p>今回は、SeleniumRCを用いてWebアプリケーションのテスト中に、Flex部分のみを手動操作し、<br />
その後再び自動テストを継続させる方法について書きたいと思います。</p>
<p>有名なツールなのでみなさんご存知と思いますが、まずSeleniumRCとは、<br />
「Webブラウザの操作を自動化させ、Webアプリケーションの画面表示や画面遷移のテストを行うツール」で<br />
Webアプリケーションのテストには欠かせないツールです。</p>
<p>今回弊社では、<a title="easyFiLEX" href="http://www.eni.co.jp/products/easyfilex/index.html" target="_blank">easyFiLEX</a>のテストをSeleniumRCを用いて行うことになりました。<br />
<span id="more-478"></span></p>
<h3>easyFiLEXテストでSeleniumRCを使用する際の問題</h3>
<p><a title="Tech Blog（05/18）記事" href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html" target="_blank">弊社Tech Blog(05/18)記事</a>にもあるように、easyFiLEXではFlexを採用しています。<br />
easyFiLEXには、Wizard形式の画面があり、その一部画面にFlexが採用されています。</p>
<p>しかし、SeleniumRCは一般的なWebアプリケーションのテストを行うツールで、Flexには対応していません。<br />
そのため、Flexが採用されているWizard形式の１画面がクリアできず、次の画面のテストができないのです。</p>
<p>ここをどう解決するか非常に悩みました。</p>
<h3>FlashSelenium発見と挫折</h3>
<p>まずは、Google先生に聞いてみました。</p>
<p>すると以下のサイトが検索に引っ掛かりました。</p>
<ul>
<li><a title="http://www.adobe.com/jp/devnet/flash/articles/flash_selenium.html" href="「Selenium RCによるFlash用の機能テストの作成と実行」" target="_blank">「Selenium RCによるFlash用の機能テストの作成と実行」</a></li>
</ul>
<p>FlashSeleniumというSeleniumRCとFlexを連携させるツールです。</p>
<p>「これで解決！（Flex部分のテストも自動化できる！）」と思いました。<br />
意気揚揚と公開されているサンプルを動かしはじめましたが、サンプルすら動きませんでした。（動いた方は教えてください。）</p>
<ul>
<li><a title="FlashSeleniumのサンプルFlash" href="http://www.geocities.com/paulocaroli/flash/colors.html" target="_blank">FlashSeleniumのサンプルFlash</a></li>
<li><a title="FlashSeleniumのサンプルテストコード" href="http://code.google.com/p/flash-selenium/" target="_blank">FlashSeleniumのサンプルテストコード</a></li>
</ul>
<h3>解決方法の発見</h3>
<p>途方に暮れselenium-client-driverのJavaDocを眺めていた時、ふと目に入った文字が・・・。</p>
<pre><strong>com.thoughtworks.selenium.Wait</strong></pre>
<p>便利なクラスがselenium-client-driverに用意されていました。</p>
<p><strong>「条件がtrueになるまで、指定時間待つ」</strong>というものです。<br />
easyFiLEXのテストでは以下の手順で使用しました。</p>
<p>手順内の画面は、</p>
<pre>Flexが採用されているWizard形式の１画面で、「ファイルのアップロード後、送信先を指定する画面」です。
送信先を指定しない限り、次の画面へ進むことができないようになっています。</pre>
<ol>
<li>Flexが採用されている画面までは、SeleniumRCを用いてWizard形式画面の自動テストを行います。</li>
<li>Flexが採用されている画面に遷移後、SeleniumRCで送信先を指定せずに「次へ」ボタンを押下させ、バリデーションエラーを発生させます。<br />
バリデーションエラー：<span style="color: #ff0000;">「送信先が選択されていません。1つ以上選択してください。」</span></p>
<p><div id="attachment_505" class="wp-caption aligncenter" style="width: 291px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/05/selenium_wait.png"><img class="size-medium wp-image-505" title="selenium_wait" src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/05/selenium_wait-281x300.png" alt="easyFiLEX送信先設定画面におけるバリデーションエラー" width="281" height="300" /></a><p class="wp-caption-text">easyFiLEX送信先設定画面におけるバリデーションエラー発生時の画面</p></div></li>
<li>バリデーションエラーが画面上に表示されている間は、指定時間待機させます。（<a href="#wait_code">以下コード参照</a>）</li>
<li>待機中にFlex操作を手動で行い、バリデーションエラーが画面上から消えると、再び自動テストが始まります。</li>
</ol>
<h3 id="wait_code">Selenium実行途中でWaitをかけるコード</h3>

<div class="wp_codebox"><table width="100%" ><tr id="p47818"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p478code18"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> Wait<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> until<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>selenium.<span style="color: #006633;">isTextPresent</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;送信先が選択されていません。1つ以上選択してください。&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>.<span style="color: #006633;">wait</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;タイムアウト&quot;</span>, 60000<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>最後に</h3>
<p>Flex部分だけは手動操作になってしまいますが、それ以降はスムーズに自動テストできるので現時点ではこの方法でテストを行っています。</p>
<p>時間の都合上、FlashSeleniumについて深く調査はしていませんが、調査をして「このブログに公開できたら・・・」と思っています。</p>
<h3>公式サイト</h3>
<ul>
<li><a title="Selenium公式サイト" href="http://seleniumhq.org/" target="_blank">Selenium公式サイト</a></li>
</ul>
<div id="FluJE_quick_lookup" style="opacity: 0;"><span>Quick Lookup:</span></p>
<input id="FluJE_quick_lookup_input" /></div>
<h3>あわせて読みたい</h3>
<p><a href="http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html">SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/05/selenium_wait.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html" />
	</item>
		<item>
		<title>AIR/Flex でドラッグ アンド ドロップ</title>
		<link>http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html#comments</comments>
		<pubDate>Mon, 18 May 2009 08:00:46 +0000</pubDate>
		<dc:creator>末田 佳和</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[drag]]></category>
		<category><![CDATA[drop]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[RIA]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=86</guid>
		<description><![CDATA[こんにちは。
プロダクト&#38;サービス事業部 リーダーの末田です。
初めての本格的な投稿なのですが、
今回はAdobe AIR/Flexでのドラッグ アンド ドロップについて書こうと思います。
弊社製品にeasyFiLEXというものがあるのですが、
そこで、ドラッグ アンド ドロップがしたいんだ！ という強い要望があり、
Adobe AIR/Flexの技術を利用して実現しました。
いまどきだと、Ajaxでも実現できるのですが、今回はFlexを採用しました。
AIRとFlexそしてブラウザの関係ですが、AIRはローカルマシン上の環境、
FlexはAIR上、もしくはWebブラウザ上のFlash Player(Plugin)で動作します。
Webブラウザ上  →　Flex
AIR          　→　Flex
AIRの上ではFlexではない、通常のHTMLとJavaScriptでも動作します。
Flexを利用すると、Webブラウザ上でもローカルマシン上のAIRでも、
同じ技術でリッチなインタフェースを実現でき、
さらに、最初からドラッグ アンド ドロップがサポートされています。
Flexでは、Flexコンポーネント間のドラッグ アンド ドロップが簡単に実現できます。
しかしeasyFiLEXは、ローカルマシン上にあるファイルをWebアプリであるeasyFiLEXにアップロードして、
他の人とファイルをやり取りする仕組みのアプリケーションです。
ですので、実現したかったのは、ローカルマシンにある(例えばデスクトップにある)ファイルを
ドラッグしてブラウザ上に持って行き、ドロップすると、そのファイルがアップロードされる、
という操作を実現したかったのです。

しかし、ブラウザ上のFlexでは、コンポーネント間のドラッグアンドドロップは簡単にできますが、
ローカルマシン上のオブジェクトからFlexコンポーネント、または逆、といった環境の場合実現できないことがわかりました。
（もしできるのであればぜひ教えてください！ ActiveXであれば実現できるようです）

ブラウザ上のFlexでのドラッグアンドドロップ動作関係



Flexコンポーネント
ローカルマシン上のオブジェクト


Flexコンポーネント
○
×


ローカルマシン上のオブジェクト
×
-



そこで、AIRの出番です。
ブラウザ上のFlexでは(おそらく)セキュリティ上の関係で、
ローカルマシン上にあるファイルにはアクセスできない仕様になっていると思われますが、
AIRはローカルマシンにインストールして利用するため、この制限がゆるくなっています。
なので、AIR上のFlexでは、Flexコンポーネントとローカルマシン上のオブジェクトの間でドラッグアンドドロップが可能です。

AIR上のFlexでのドラッグアンドドロップ動作関係



Flexコンポーネント
ローカルマシン上のオブジェクト


Flexコンポーネント
○
○


ローカルマシン上のオブジェクト
○
-



せっかくなので、ドラッグ アンド ドロップを実現するコードを紹介したいと思います。
※対象バージョン/環境
Adobe AIR 1.5.1 SDK
Adobe Flex 3.3.0 SDK
コード全体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;
&#60;mx:WindowedApplication xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34;
  applicationComplete=&#34;init()&#34;&#62;
  &#60;mx:Script&#62;
    &#60;!&#91;CDATA&#91;
&#160;
    private function init &#40;&#41; : [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
プロダクト&amp;サービス事業部 リーダーの末田です。</p>
<p>初めての本格的な投稿なのですが、<br />
今回はAdobe AIR/Flexでのドラッグ アンド ドロップについて書こうと思います。</p>
<p>弊社製品に<a href="http://www.eni.co.jp/products/easyfilex/index.html">easyFiLEX</a>というものがあるのですが、<br />
そこで、ドラッグ アンド ドロップがしたいんだ！ という強い要望があり、<br />
Adobe AIR/Flexの技術を利用して実現しました。<br />
いまどきだと、Ajaxでも実現できるのですが、今回はFlexを採用しました。</p>
<p>AIRとFlexそしてブラウザの関係ですが、AIRはローカルマシン上の環境、<br />
FlexはAIR上、もしくはWebブラウザ上のFlash Player(Plugin)で動作します。</p>
<p>Webブラウザ上  →　Flex<br />
AIR          　→　Flex</p>
<p>AIRの上ではFlexではない、通常のHTMLとJavaScriptでも動作します。<br />
Flexを利用すると、Webブラウザ上でもローカルマシン上のAIRでも、<br />
同じ技術でリッチなインタフェースを実現でき、<br />
さらに、最初からドラッグ アンド ドロップがサポートされています。</p>
<p>Flexでは、Flexコンポーネント間のドラッグ アンド ドロップが簡単に実現できます。<br />
しかしeasyFiLEXは、ローカルマシン上にあるファイルをWebアプリであるeasyFiLEXにアップロードして、<br />
他の人とファイルをやり取りする仕組みのアプリケーションです。<br />
ですので、実現したかったのは、ローカルマシンにある(例えばデスクトップにある)ファイルを<br />
ドラッグしてブラウザ上に持って行き、ドロップすると、そのファイルがアップロードされる、<br />
という操作を実現したかったのです。</p>
<p><span id="more-86"></span></p>
<p>しかし、ブラウザ上のFlexでは、コンポーネント間のドラッグアンドドロップは簡単にできますが、<br />
ローカルマシン上のオブジェクトからFlexコンポーネント、または逆、といった環境の場合実現できないことがわかりました。<br />
（もしできるのであればぜひ教えてください！ ActiveXであれば実現できるようです）</p>
<table class="content" border="0">
<caption>ブラウザ上のFlexでのドラッグアンドドロップ動作関係</caption>
<tbody>
<tr>
<th></th>
<th>Flexコンポーネント</th>
<th>ローカルマシン上のオブジェクト</th>
</tr>
<tr>
<th>Flexコンポーネント</th>
<td class="center">○</td>
<td class="center">×</td>
</tr>
<tr>
<th>ローカルマシン上のオブジェクト</th>
<td class="center">×</td>
<td class="center">-</td>
</tr>
</tbody>
</table>
<p>そこで、AIRの出番です。<br />
ブラウザ上のFlexでは(おそらく)セキュリティ上の関係で、<br />
ローカルマシン上にあるファイルにはアクセスできない仕様になっていると思われますが、<br />
AIRはローカルマシンにインストールして利用するため、この制限がゆるくなっています。<br />
なので、AIR上のFlexでは、Flexコンポーネントとローカルマシン上のオブジェクトの間でドラッグアンドドロップが可能です。</p>
<table class="content" border="0">
<caption>AIR上のFlexでのドラッグアンドドロップ動作関係</caption>
<tbody>
<tr>
<th></th>
<th>Flexコンポーネント</th>
<th>ローカルマシン上のオブジェクト</th>
</tr>
<tr>
<th>Flexコンポーネント</th>
<td class="center">○</td>
<td class="center">○</td>
</tr>
<tr>
<th>ローカルマシン上のオブジェクト</th>
<td class="center">○</td>
<td class="center">-</td>
</tr>
</tbody>
</table>
<p>せっかくなので、ドラッグ アンド ドロップを実現するコードを紹介したいと思います。</p>
<p>※対象バージョン/環境<br />
Adobe AIR 1.5.1 SDK<br />
Adobe Flex 3.3.0 SDK</p>
<h3>コード全体</h3>

<div class="wp_codebox"><table width="100%" ><tr id="p8623"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p86code23"><pre class="actionscript" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>?<span style="color: #0066CC;">xml</span> <span style="color: #0066CC;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;</span>mx:WindowedApplication xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span>
  applicationComplete=<span style="color: #ff0000;">&quot;init()&quot;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;</span>mx:Script<span style="color: #66cc66;">&gt;</span>
    <span style="color: #66cc66;">&lt;!</span><span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> init <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> : <span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #0066CC;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span>.<span style="color: #006600;">NATIVE_DRAG_ENTER</span>, onDragEnter<span style="color: #66cc66;">&#41;</span>;
      <span style="color: #0066CC;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span>.<span style="color: #006600;">NATIVE_DRAG_DROP</span>, onDragDrop<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onDragEnter <span style="color: #66cc66;">&#40;</span>event:flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>event.<span style="color: #0066CC;">target</span> is InteractiveObject<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        flash.<span style="color: #006600;">desktop</span>.<span style="color: #006600;">NativeDragManager</span>.<span style="color: #006600;">acceptDragDrop</span><span style="color: #66cc66;">&#40;</span>InteractiveObject<span style="color: #66cc66;">&#40;</span>event.<span style="color: #0066CC;">target</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onDragDrop <span style="color: #66cc66;">&#40;</span>event:flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #006600;">clipboard</span>.<span style="color: #006600;">hasFormat</span><span style="color: #66cc66;">&#40;</span>ClipboardFormats.<span style="color: #006600;">FILE_LIST_FORMAT</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">list</span>:<span style="color: #0066CC;">Array</span> = event.<span style="color: #006600;">clipboard</span>.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span>ClipboardFormats.<span style="color: #006600;">FILE_LIST_FORMAT</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #0066CC;">Array</span>;
        <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">each</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> file:flash.<span style="color: #006600;">filesystem</span>.<span style="color: #006600;">File</span> <span style="color: #b1b100;">in</span> <span style="color: #0066CC;">list</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
          <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>file.<span style="color: #006600;">nativePath</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;/</span>mx:Script<span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;</span>mx:Panel <span style="color: #0066CC;">width</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> <span style="color: #0066CC;">height</span>=<span style="color: #ff0000;">&quot;100%&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #66cc66;">&gt;</span>
  <span style="color: #66cc66;">&lt;/</span>mx:Panel<span style="color: #66cc66;">&gt;</span>
<span style="color: #66cc66;">&lt;/</span>mx:WindowedApplication<span style="color: #66cc66;">&gt;</span></pre></td></tr></table></div>

<h3>イベントリスナーの設定</h3>

<div class="wp_codebox"><table width="100%" ><tr id="p8624"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p86code24"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span>.<span style="color: #006600;">NATIVE_DRAG_ENTER</span>, onDragEnter<span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span>.<span style="color: #006600;">NATIVE_DRAG_DROP</span>, onDragDrop<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>まず、2つのイベントリスナーを設定します。<br />
flash.events.NativeDragEvent.NATIVE_DRAG_ENTER が、ドラッグしてきてオブジェクトの境界内に入った時<br />
flash.events.NativeDragEvent.NATIVE_DRAG_DROP が、ドラッグしてきたアイテムをオブジェクトの上で離した時<br />
の2つです。<br />
AIR上とWeb上でまず違うのがここです。<br />
そもそも、flash.events.NativeDragEventのイベントがAIRでしか発生しません。</p>
<p>私はここではまりました。<br />
私はFlex Builderを使っているのですが、Flex Builderのデバッグモードで動作させた場合、<br />
このイベントが発生しません。<br />
一度リリースビルドを行い、インストールするとイベントが発生しました。</p>
<h3>flash.events.NativeDragEvent.NATIVE_DRAG_ENTERイベント</h3>
<p>このイベントは、ドラッグしてきてオブジェクトの境界内に入った時に発生します。<br />
この際、ドラッグしてきてOKです、とシステムに知らさなければいけません。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p8625"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p86code25"><pre class="actionscript" style="font-family:monospace;">flash.<span style="color: #006600;">desktop</span>.<span style="color: #006600;">NativeDragManager</span>.<span style="color: #006600;">acceptDragDrop</span><span style="color: #66cc66;">&#40;</span>obj:InteractiveObject<span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>を呼ぶことにより、ドラッグを受け付けることになります。<br />
このメソッドを呼ぶと、マウスポインタが「＋」マークのついたポインタに変わります。</p>
<h3>flash.events.NativeDragEvent.NATIVE_DRAG_DROPイベント</h3>
<p>このイベントは、実際にドロップされたときに発生します。<br />
先の、NativeDragManager.acceptDragDrop()が事前に呼ばれていないと発生しません。</p>
<p>ドロップされたオブジェクトは、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p8626"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p86code26"><pre class="actionscript" style="font-family:monospace;">flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">NativeDragEvent</span>.<span style="color: #006600;">clipboard</span>.<span style="color: #006600;">getData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></td></tr></table></div>

<p>で取得できます。<br />
そのオブジェクトは、flash.desktop.Clipboardというクラスを経由して様々な情報を取得できます。<br />
今回は、ローカルのファイル情報を取得しましたが、テキストデータやイメージデータ等も取得できます。</p>
<p>以上が、AIR/FlexでFlexコンポーネントとローカルマシン上のオブジェクトの間のドラッグ アンド ドロップを実現する方法です。<br />
詳細はAIR/Flexのドキュメントにも詳しく書かれていますが、もひとつわかりにくい気もします。</p>
<p>それでは！</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html">AIR/Flex でファイルアップロード</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html">リッチなAdobe AIR/Flexのツールチップをよりリッチに</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html" />
	</item>
	</channel>
</rss>
