<?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; drag</title>
	<atom:link href="http://blog.eni.co.jp/tech/tag/drag/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/drag/feed" />
		<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="p865"><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="p86code5"><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="p866"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p86code6"><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="p867"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p86code7"><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="p868"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p86code8"><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>
