<?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/"
	>

<channel>
	<title>_nec &#187; events</title>
	<atom:link href="http://nec.shell8.net/tag/events/feed/" rel="self" type="application/rss+xml" />
	<link>http://nec.shell8.net</link>
	<description>webfejlesztés, front-end programozás, javascript, css, xhtml, ajax, air</description>
	<lastBuildDate>Wed, 31 Aug 2011 06:54:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Adobe AIR #4 Drag&#8217;n&#039;Drop és Filefeltöltés</title>
		<link>http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/</link>
		<comments>http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 17:52:05 +0000</pubDate>
		<dc:creator>_nec</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[dragndrop]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://nec.shell8.net/?p=24</guid>
		<description><![CDATA[Az alapok után, ismerve az ablakkezelést és az eseményeket nézzünk meg egy összetettebb kérdéskört. AIR alkalmazásunknak lehetősége van más alkalmazásokból különböző adatok fogadására, a GUI-ban megszokott egyszerű drag&#8217;n'drop műveletekkel. Míg művelet végrehajtása a felhasználónak könnyű, a háttérben jópár komplexebb dologra kell figyelni. Habár böngészőkben is használható javascript alapokon, webes fejlesztőknek ez eléggé új terület lehet, [...]]]></description>
			<content:encoded><![CDATA[<p>Az <a href="/2008/06/19/adobe-air-alapok/">alapok után</a>, ismerve az <a href="/2008/06/23/adobe-air-ablakkezeles/">ablakkezelést</a> és az <a href="/2008/06/25/adobe-air-esemenyek/">eseményeket</a> nézzünk meg egy összetettebb kérdéskört. </p>
<p>AIR alkalmazásunknak lehetősége van más alkalmazásokból különböző adatok fogadására, a GUI-ban megszokott egyszerű <em>drag&#8217;n'drop</em> műveletekkel. Míg művelet végrehajtása a felhasználónak könnyű, a háttérben jópár komplexebb dologra kell figyelni. Habár böngészőkben is használható javascript alapokon, webes fejlesztőknek ez eléggé új terület lehet, így előbb nézzük meg a művelet sajátosságait a konkrét példa előtt.<br />
<span id="more-24"></span></p>
<h3>Események</h3>
<p>A drag&#8217;n'drop műveletnek minimum két résztvevője van, ahonnan indul a drag és ahol végetér, közben pedig azok az elemek is reagálhatnak, melyekkel érintkezésbe kerül a mozgatott adat. A művelet során lényegében csak eseményekre hagyatkozhatunk, ezekkel zajlik az adathordozás.</p>
<p>Eseményszinten nézve ezt az alábbiak alkotják:<br />
<strong>a forrás az adatmozgatás eredete<br />
</strong></p>
<ul>
<li>dragstart &#8211; a művelet kezdetén</li>
<li>drag &#8211; folyamatosan a mozgatás ideje alatt</li>
<li>dragend &#8211; az adat &#8220;elengedésekor&#8221;</li>
</ul>
<p><strong>a forrás a mozgatás célpontja illetve lehetséges célpontjai</strong></p>
<ul>
<li>dragover &#8211; folyamatosan küldi, mikor a mozgatott adat az elem fölött van</li>
<li>dragenter &#8211; mikor a mozgatott adat belép az elem fölé</li>
<li>dragleave &#8211; mikor a mozgatott adat elhagyja az elemet</li>
<li>drop &#8211; mikor a felhasználó az elemre <em>ejti</em> a mozgatott adatot</li>
</ul>
<p>Ezekre az eseményekre figyelve kezelhetjük a műveletet illetve vezethetjük a felhasználót, hogy hova mit mozgathat, ügyelve a felhasználóbarát kezelésre.</p>
<p>Az eseményen belül innentől a <em>dataTransfer</em> objektumra koncentrálunk, ez tartalmazza a művelet során érkező adatokat.</p>
<h3>Adat típusok</h3>
<p>A böngészők nagy általánosságban az alábbi típusokat kezelik le a művelet során:<br />
text, html, url, file. Ez utóbbi böngészőgyártótól függően még lebontható képre, helyi file-ra, stb.</p>
<p>Fontos megjegyezni. hogy a típust mindíg az adatmozgatás eredete állítja be, az esemény hordozza magával, a fogadó ellenőrizheti. Pl ha a címsorunkból kijelöljük a linket és azt mozgatjuk, az AIR szöveget fog látni. De ha pl az RSS feed ikonját mozgatjuk, már URL-nek látja. Itt a böngésző a forrás, az állítja be a típust.</p>
<p>Az AIR mozgatható adattípusai a következőek:</p>
<ul>
<li>Text &#8211; sima szöveg<br />
(<em>&#8220;text/plain&#8221;</em>)</li>
<li>HTML &#8211; html struktúrált szöveg<br />
(<em>&#8220;text/html&#8221;</em>)</li>
<li>URL &#8211; egy vagy több link<br />
(<em>&#8220;text/uri-list&#8221;</em>)</li>
<li>Bitmap &#8211; bittérkép, kép adat<br />
(<em>&#8220;image/x-vnd.adobe.air.bitmap&#8221;</em>)</li>
<li>File list &#8211; file lista, egy vagy több helyi file-t tartalmaz<br />
(<em>&#8220;application/x-vnd.adobe.air.file-list&#8221;</em>)</li>
</ul>
<p>Ezek a flash képességeire emlékeztethet egyeseket, ami nem csoda, hisz az AIR esetében javascriptből félig flashbe lóg a lábunk. Az adattípust a <em>dataTransfer.types </em>tömb tartalmazza egyszerre többet is hordozhat, hisz pl egy html kódrészlet alapjában véve szöveg, de tartalmazhat linkeket és amúgy html formázott szöveg, így lehet akár három típusa is. Hogy ezeket miként használjuk fel, majd az adatok kinyerésénél megézzük.</p>
<p>Most &#8211; miután látjuk mikor és mit mozgathat a felhasználó &#8211; jön az, hogy mit kezdhet illetve kezdjen az adattal.</p>
<h3>effectAllowed, dropEffect</h3>
<p>Az adat forrása a mozgatás kezdetekor meghatározhatja milyen lehetőségek vannak az adat elhelyezését illetően. Az adatokat fogadó alkalmazás pedig kikötheti, hogy ő mit akar végrehajtani ezek közül. Ez a két paraméter az eseményben az <em>dataTransfer.</em><em>effectAllowed</em> és a fogadónál a <em>dataTransfer.</em><em>dropEffect</em>. Értékei a következők lehetnek:</p>
<ul>
<li>none &#8211; nincs/nem draggelhető adat, vagy az adott adattípust nem fogadja az elem</li>
<li>copy &#8211; másolás</li>
<li>move &#8211; mozgatás</li>
<li>link &#8211; linkelés</li>
<li>copyLink &#8211; másolás vagy linkelés</li>
<li>copyMove &#8211; másolás vagy mozgatás</li>
<li>linkMove &#8211; linkelés vagy mozgatás</li>
<li>all &#8211; mindegyik</li>
</ul>
<p>Az első négy művelet egyenként megfelel az adott rendszer szabvány kurzorainak, amit felvesz az egérkurzor a művelet során. Pl ha intézőből mozgatunk file-t, az &#8216;all&#8217; értékkel jön, mi pedig jelezhetjük egy file feltöltésnél hogy ez csak &#8216;copy&#8217; azaz másolás lesz a lehetséges műveletek közül, ekkor az egérkurzor jelzi ezt nekünk.</p>
<h3>Drop</h3>
<p>A művelet vége a <em>drop</em> esemény, ekkor kezdhetjük meg a feldolgozását az adatnak amit kaptunk. Az eseményből a <em>dataTransfer.getData( </em>string<em> mimetype )</em> metódussal nyerhetjük ki azt az adatot, amire típus alapján szükségünk van. A <em>mimetype </em>paraméter a fent ismertetett típusok egyike.</p>
<p>Sajnos ez így még korántsem tökéletes, próbálkozásaim során reprodukálható volt az a jelenség, hogy képet böngészőből mozgatva próbáltam elfogadtatni vagy vizsgáltatni AIRben, nagyokat fagyott a futtatókörnyezet. Gyakorlatban inkább a filelistával és feltöltéssel mutatom be a fentieket.</p>
<h3>Példa: filefeltöltés drag&#8217;n'drop -ra</h3>
<p>A tanulmányozás során négy zónát raktam le htmlbe ahova huzogathatok adatokat:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;">	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;target link&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Linkeket ide<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		Ez csak linkeket fogad.
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;target text&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Szövegelj ide<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		Ez csak szöveget fogad.
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;target file&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Fileok jöhetnek<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		Ez csak fileokat fogad.
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;target image&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Képes vagyok<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		Ez csak képeket fogad.
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Majd oldalbetöltéskor meghatároztam az események lekezelését. Itt jegyezném meg, hogy bár kényelmes használni, sajnos a jQuery <em>.bind</em> eseménykezélese egyelőre erre nem jó, mert a továbbított Event objektum nem tartalmazza a <em>dataTransfer</em> objektumot.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>19
20
21
22
23
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div.target'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span>s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		s.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dragenter&quot;</span><span style="color: #339933;">,</span> dragEnterOver<span style="color: #009900;">&#41;</span>
		s.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dragover&quot;</span><span style="color: #339933;">,</span> dragEnterOver<span style="color: #009900;">&#41;</span>
		s.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;drop&quot;</span><span style="color: #339933;">,</span> dragDrop<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Aztán jöhetnek az eseménykezelők. Az elsőben (<em>dragEnterOver</em>) válogatom le, melyik mezőbe melyik elemet engedem.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">function</span> dragEnterOver<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		event.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'link'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">types</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;text/uri-list&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">dropEffect</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;link&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'text'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">types</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;text/plain&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">dropEffect</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;copy&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'file'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">types</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;application/x-vnd.adobe.air.file-list&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">dropEffect</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;copy&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span>event.<span style="color: #660066;">target</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hasClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'image'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">types</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;image/x-vnd.adobe.air.bitmap&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">dropEffect</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;copy&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">dropEffect</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;none&quot;</span><span style="color: #339933;">;</span>			
		<span style="color: #009900;">&#125;</span>        
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mivel a statikus HTML elemek alapból nem támogatják a drag&#8217;n'drop-ot, azzal kezdjük, hogy az megakadályozzuk az alapértelmezett reakciót. Majd a zónák osztálynevei és a hordozott adat alapján leválogatjuk, hogy fogadjuk-e, és ha igen, miként fogadjuk az adatot.</p>
<p>Végül a drop esemény lekezelése, kinyerjük az adatot. Ezt most röviden összekötjük egy filelista feltöltéssel HTTP-n keresztül, javascriptből, röviden mert meglepően egyszerű.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">function</span> dragDrop<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> list <span style="color: #339933;">=</span> event.<span style="color: #660066;">dataTransfer</span>.<span style="color: #660066;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;application/x-vnd.adobe.air.file-list&quot;</span><span style="color: #009900;">&#41;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">typeof</span> list <span style="color: #339933;">!=</span> <span style="color: #3366CC;">&quot;undefined&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #003366; font-weight: bold;">var</span> request <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> air.<span style="color: #660066;">URLRequest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;http://valami.tavoli.domain.hu/upload.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> list <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				list<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">upload</span><span style="color: #009900;">&#40;</span>
					request<span style="color: #339933;">,</span>
					<span style="color: #3366CC;">'filefile'</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #006600; font-style: italic;">// örömünkben írjuk ki a fileok neveit</span>
				air.<span style="color: #660066;">Introspector</span>.<span style="color: #660066;">Console</span>.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>list<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>A <em>getData</em> és a <em>mime-type</em> használatával kinyerjük a fileokat (40.), ez minden esetben egy file lista, melynet tagjai <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/filesystem/File.html">File</a> objektumok. Ha megnézzük a doksiban, látható, hogy van egy <em><a href="http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&#038;file=00002204.html">upload</a></em> metódusa, amit a <em>FileReference</em> objektumból örököl, ami már egy flash objektum. De a js, hála a script összemosásnak, látja ezt a metódust és ha meghívja őket egyenként (44.-51.) egy <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/net/URLRequest.html">URLRequest</a> társaságában, fel is tölti őket.</p>
<p>Mára ennyi fért bele, jó kísérletezést, bónusz, vagy házifeladat a copy-paste és a clipboard használatának utánajárni, hasonló ezekhez. Következő részben az AIR alkalmazás natív rendszerszintű menükezelését nézzük meg.</p>
<p><strong>Eddig az Adobe AIR-ről:</strong></p>
<ul>
<li><a href=" http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/">Eval(); Adobe AIR-ben</a></li>
<li><a href="http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/">#6 SQLite JavaScriptből</a></li>
<li><a href="http://nec.shell8.net/2008/07/11/adobe-air-nativ-menukezeles/">#5 Natív menükezelés</a></li>
<li><a href="http://nec.shell8.net/2008/06/25/adobe-air-esemenyek">#3 Események</a></li>
<li><a href="http://nec.shell8.net/2008/06/23/adobe-air-ablakkezeles">#2 Ablakkezelés</a></li>
<li><a href="http://nec.shell8.net/2008/06/19/adobe-air-alapok">#1 Az alapok</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Adobe AIR #3 Események</title>
		<link>http://nec.shell8.net/2008/06/25/adobe-air-esemenyek/</link>
		<comments>http://nec.shell8.net/2008/06/25/adobe-air-esemenyek/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 16:29:41 +0000</pubDate>
		<dc:creator>_nec</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[esemény]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://nec.shell8.net/?p=23</guid>
		<description><![CDATA[Az előző részben az ablakkezelésről esett szó Adobe AIR alkalmazásokban, ebben a részben pedig az AIR eseményeiről és eseménykezeléséről írok majd. Rögtön egy ablakkezeléshez is kapcsolódó példával kezdek, amihez szorosan kötődik egy eseménykezelés, nevezetesen az alkalmazás ablak átméretezése. Esetünkben jQuery segíti a DOM eseménykezelést. $&#40;'span#ResizeBottomLeft'&#41;.mousedown&#40;function&#40;&#41;&#123; window.nativeWindow.startResize&#40;air.NativeWindowResize.BOTTOM_LEFT&#41;; &#125;&#41;; Az átméretezés indítsa után az ablak folyamatosan küld [...]]]></description>
			<content:encoded><![CDATA[<p>Az előző részben az <a href="http://nec.shell8.net/2008/06/23/adobe-air-ablakkezeles/">ablakkezelésről esett szó</a> Adobe AIR alkalmazásokban, ebben a részben pedig az AIR eseményeiről és eseménykezeléséről írok majd. Rögtön egy ablakkezeléshez is kapcsolódó példával kezdek, amihez szorosan kötődik egy eseménykezelés, nevezetesen az alkalmazás ablak átméretezése.<br />
<span id="more-23"></span><br />
Esetünkben jQuery segíti a DOM eseménykezelést.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span#ResizeBottomLeft'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mousedown</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		window.<span style="color: #660066;">nativeWindow</span>.<span style="color: #660066;">startResize</span><span style="color: #009900;">&#40;</span>air.<span style="color: #660066;">NativeWindowResize</span>.<span style="color: #660066;">BOTTOM_LEFT</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Az átméretezés indítsa után az ablak folyamatosan küld egy <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/events/Event.html#RESIZE">air.Event.RESIZE</a> típusú eseményt, melynek az <em>afterBounds.height</em> és <em>afterBounds.width</em> értékeit figyelve módosíthatjuk amit esetleg kell. Az eseményt a a window.nativeWindow objektumon kell elkapni, egy egyszerű addEventListener segítségével.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">	window.<span style="color: #660066;">nativeWindow</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span>air.<span style="color: #660066;">Event</span>.<span style="color: #660066;">RESIZE</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		MyChrome.<span style="color: #660066;">resizeHandler</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Mivel a futtatókörnyezet as/flex scriptrendszere szorosan egybeolvadt a javascriptel, nyugodtan használhatjuk a DOM programozásaink során megszokott <a href="http://developer.mozilla.org/en/docs/DOM:element.addEventListener">addEventListener</a> metódust az AIR események elfogására. Az air.Event.RESIZE gyakorlatilag egy konstans, ami az esemény nevét tartalmazza, az eseményfigyelő pedig feldolgozza a kapott adatokat, ahogy megszokhattuk jsben.</p>
<p><strong>Esemény mint sültgalamb</strong></p>
<p>Saját káromon tanultam, hogy ne várjak magamtól biztosra eseményt. Van pár esemény, pl az air.Event.CLOSING és az air.Event.EXITING, melyek az ablak bezárásánál illetve az alkalmazás bezárásánál sülnek el (ugye az ablak zárás nem feltétlenül azonos az alkalmazás bezárásával, kivéve ha egy ablakból áll az alkalmazás, de eseményszinten akkor is különböznek). A CLOSING esemény lefut, ha rákattintunk a bezár gombra a sima <em>standard chrome</em> keretű ablakon. Na de mi van akkor ha nincs chrome?</p>
<p>Akkor a bezárást mi indítjuk (<em>milyen hülye szópárosítás</em>), valószínüleg egy onclick eseményre, valami gombszerű elemen a <em>window.nativeWindow.close()</em> segítsével. Ugyan logikus lehetne, de <span style="text-decoration: underline;">nem fut le magától a CLOSING esemény</span>, holott én szeretném az alkalmazásommal elkapni az ablakkezelőtől, hogy pl lementsek adatokat bezárás előtt. Ilyenkor nekünk kell kézzel elküldeni az eseményt is. Lássunk erre is példát:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">	<span style="color: #003366; font-weight: bold;">var</span> eClose <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> air.<span style="color: #660066;">Event</span><span style="color: #009900;">&#40;</span>air.<span style="color: #660066;">Event</span>.<span style="color: #660066;">CLOSING</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	window.<span style="color: #660066;">nativeWindow</span>.<span style="color: #660066;">dispatchEvent</span><span style="color: #009900;">&#40;</span>eClose<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tehát létrehozzuk az esemény objektumot egy <a href="http://help.adobe.com/en_US/AIR/1.1/jslr/flash/events/Event.html">air.Event</a> példányosítással, majd a kívánt objektumon elküldjük az eseményt. Ha valahol elkapjuk ezt az eseményt, nagyon ügyeljünk arra, hogy ha dolgunkat elvégeztük, zárjuk is be az ablakot.  Az EXITING esetén ugyanez az eljárás.</p>
<p>Van itt viszont egy apró gond, ilyenkor vagy kiküldöd a CLOSING/EXITING eseményt, vagy elvégzed a feladatot a megfelelő metódusokkal, így egyszerre nem mehet.</p>
<p><strong>Saját chrome?</strong></p>
<p>Megoldás erre ha átszervezed az alkalmazásod &#8211; hangsúlyozom, itt most nincs <em>chrome</em> ablak, mindent lefejlesztettünk, átrajzoltunk, gyakorlatilag saját <em>chrome</em>-ot csináltunk. Vedd külön azokat a kontrollokat, jellemzőket és metódusokat, amik csak a saját <em>chrome</em>-odat kezelik, és tedd külön az alkalmazás lényegi logikáját. Ekkor a chrome működhet úgy, hogy a bezárás gomb nem a <em>window.nativeWindow.close()</em> metódust hívja meg, hanem a megfelelő eseményt indítja útjára. Ugyanitt ebben a chrome objektumban figyeltesd ezt az eseményt, és ha lefut, végezze el a feladatát már a <em>window.nativeWindow.close()</em> segítségével.</p>
<p>Ekkor az eseményre figyelhet az alkalmazás logika is, megállíthatja azt, elvégezheti a mentést, akármit, és ő zárhat végül. Jó kísérletezést a hétvégére!</p>
<p>Legközelebb belevágunk az AIR file-szintű műveleteibe, és csinálunk AIRben flashmentes multi-uploadert, drag-n-drop közbeiktatásával.</p>
<p><strong>Eddig az Adobe AIR-ről:</strong></p>
<ul>
<li><a href=" http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/">Eval(); Adobe AIR-ben</a></li>
<li><a href="http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/">#6 SQLite JavaScriptből</a></li>
<li><a href="http://nec.shell8.net/2008/07/11/adobe-air-nativ-menukezeles/">#5 Natív menükezelés</a></li>
<li><a href="http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/">#4 Drag’n&#8217;Drop és Filefeltöltés</a></li>
<li><a href="http://nec.shell8.net/2008/06/23/adobe-air-ablakkezeles">#2 Ablakkezelés</a></li>
<li><a href="http://nec.shell8.net/2008/06/19/adobe-air-alapok">#1 Az alapok</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nec.shell8.net/2008/06/25/adobe-air-esemenyek/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

