<?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>DWUG &#187; AIR</title>
	<atom:link href="http://www.dwug.es/docs/tutoriales/air/feed" rel="self" type="application/rss+xml" />
	<link>http://www.dwug.es</link>
	<description>Grupo de Usuarios Adobe Dreamweaver</description>
	<lastBuildDate>Wed, 01 Feb 2012 11:43:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>AIR: icono en la bandeja de sistema</title>
		<link>http://www.dwug.es/go/405</link>
		<comments>http://www.dwug.es/go/405#comments</comments>
		<pubDate>Thu, 15 Nov 2007 07:58:08 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/405</guid>
		<description><![CDATA[(Nota: este articulo utiliza terminología de entorno Windows, pero el código es válido para Mac) Como todo programa de escritorio normal, una aplicación AIR queda situada en la barra de tareas al ser minimizada. Sin embargo: ¿Es posible enviarla como un icono a la bandeja de sistema? La respuesta es sí. Existen ejemplos en Flex, [...]]]></description>
			<content:encoded><![CDATA[<p>(Nota: este articulo utiliza terminología de entorno Windows, pero el código es válido para Mac)</p>
<p>Como todo programa de escritorio normal, una aplicación AIR queda situada en la barra de tareas al ser minimizada.</p>
<p>Sin embargo: ¿Es posible enviarla como un icono a la bandeja de sistema? La respuesta es sí. Existen ejemplos en Flex, pero en nuestro caso, como buenos fans de Dreamweaver, utilizaremos html y JavaScript.</p>
<p><span id="more-405"></span>
<p>Nuestro código realiza básicamente lo siguiente:</p>
<p>- Comprueba el estado de la ventana; si está minimizada, la hace desaparecer de la barra de tareas y muestra un icono en la bandeja de sistema. En el resto de estados(normal o maximizada) no aparece el icono y la aplicación se muestra normalmente en la barra de tareas</p>
<p>- Además el icono tiene un menu contextual definido por nosotros que nos permite restaurar la ventana o cerrar la aplicación (nuestro icono es la T negra en fondo naranja):<br />
<img id="image406" src="http://www.dwug.es/wp-files/2007/11/system_tray_demo_01.jpg" alt="icono en la barra de sistema" width="128" height="81" /></p>
<p><a id="p408" href="/wp-files/2007/11/AIR_system_tray_demo.zip" title="Archivos de ejemplo">Descarga los archivos de ejemplo</a></p>
<p>Antes de continuar, expliquemos brevemente cómo crear un icono de sistema y un menú</p>
<p>Un poco de teoría</p>
<p><strong>Entendiendo el icono de sistema</strong></p>
<p>En AIR, el icono de sistema está definido por shell.icon, que contiene una propiedad de tipo Array llamada bitmaps en la que se carga la imagen. La imagen puede ser gif, jpg o png, aunque se recomienda ésta última.</p>
<p>shell.icon.bitmaps no acepta simplemente una ruta a la imagen, sino que  requiere pasarle el bitmapData de la misma. Por tanto esto no funciona:</p>
<p><code>air.Shell.shell.icon.bitmaps="imagen_de_icono.png" //mal!!!</code>
<p>¿Cómo obtener el bitmapData de la imagen? Podemos utilizar una instancia de Loader que una vez cargada nos proporcione esta información. Es decir:</p>
<ul>
<li>Creamos un loader y cargamos la imagen en el mismo</li>
<li>Una vez cargada, asignamos a air.Shell.shell.icon.bitmaps el  bitmapData de la imagen contenida en el loader</li>
<li>Cuando air.Shell.shell.icon.bitmaps tiene un valor, el icono aparece en la bandeja. Si lo vaciamos, el icono desaparece.</li>
</ul>
<p><strong>Entendiendo los menus:</strong></p>
<p>En AIR cada menú es una instancia de NativeMenu que contiene dentro menu items que son a su vez instancias de NativeMenuItem.<br />
Una vez creado, el menu se adjunta al icono asociándolo al atributo &#8220;menu&#8221; de shell.icon:</p>
<p><code>air.Shell.shell.icon.menu=miMenu</code>
<p>Durante el código veremos como se adjuntan los items al menu.</p>
<p>Una vez entendidos estos dos conceptos, comenzamos con el código.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/405/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>AIR for JavaScript Developers Pocketguide</title>
		<link>http://www.dwug.es/go/379</link>
		<comments>http://www.dwug.es/go/379#comments</comments>
		<pubDate>Sat, 14 Jul 2007 09:46:11 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/379</guid>
		<description><![CDATA[Mike Chambers, Daniel Dura y Kevin Hoyt han publicado bajo licencia Creative Commons un interesantísimo manual de bolsillo para todos aquellos que desean crear aplicaciones para AIR utilizando JavaScript. El manual, de 154 páginas está disponible tanto en version PDF como impresa (vía Amazon): http://www.adobe.com/go/airjavascriptpocketguide]]></description>
			<content:encoded><![CDATA[<p>Mike Chambers, Daniel Dura y Kevin Hoyt han publicado bajo licencia Creative Commons un interesantísimo manual de bolsillo para todos aquellos que desean crear aplicaciones para AIR utilizando JavaScript.</p>
<p>El manual, de 154 páginas está disponible tanto en version PDF como impresa (vía Amazon):<br />
<a href="http://www.adobe.com/go/airjavascriptpocketguide"></p>
<p>http://www.adobe.com/go/airjavascriptpocketguide</a><!--267724ae2e9586a8fda2916351717e26--><!--9520fa95f01399ddde372c90435c4765--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/379/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear un lector online/offline con Spry y AIR</title>
		<link>http://www.dwug.es/go/377</link>
		<comments>http://www.dwug.es/go/377#comments</comments>
		<pubDate>Mon, 25 Jun 2007 10:45:45 +0000</pubDate>
		<dc:creator>Andres Cayon</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Spry]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.dwug.es/go/377</guid>
		<description><![CDATA[Aunque AIR ofrece la posibilidad de comprobar si existe conexión o no, para este tutorial hemos preferido comprobar directamente si la fuente de datos XML remota está accesible o no. El motivo para ello es asegurarnos de que aunque haya conexión, el XML remoto está disponible (el sitio podría estar caído). Al mismo tiempo tiempo [...]]]></description>
			<content:encoded><![CDATA[<p>Aunque AIR ofrece la posibilidad de comprobar si existe conexión o no, para este tutorial hemos preferido comprobar directamente si la fuente de datos XML remota está accesible o no.</p>
<p><span id="more-377"></span>
<p>El motivo para ello es asegurarnos de que aunque haya conexión, el XML remoto está disponible (el sitio podría estar caído). Al mismo tiempo tiempo queríamos evitar una doble conexión (una para comprobar el estado y otra para leerlo). Para ello partimos de un xml local. El código realiza estos pasos:</p>
<ol>
<li>Crea un dataset de Spry vacio</li>
<li>Se intenta conectar con el xml remoto: Si lo encuentra, actualiza el  xml local. En caso contrario, el xml local permanece sin alterar</li>
<li>Hacemos que Spry cargue el xml local (que ya estará actualizado si el remoto estaba disponible)</li>
</ol>
<p>El primer paso es cargar los archivo js necesarios de AIR y Spry: </p>
<p>[php]&lt;script type=&quot;text/javascript&quot; src=&quot;js/AIRAliases.js&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;SpryAssets/xpath.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
&lt;script src=&quot;SpryAssets/SpryData.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
[/php]
<p>A continuación comienza el bloque de script: Las primeras seis lineas crean el dataset,  la conexión y definen 2 listeners para gestionar la lectura o el error en su caso; finalmente, leemos el contenido de la url:</p>
<p><code>//Creamos un dataset vacio, que cargaremos más adelante llamando a loadDataset()<br />
var	ds1 = new Spry.Data.XMLDataSet(null, "events/event",{useCache:false});<br />
//llamamos al archivo externo<br />
//añadimos 2 listeners para gestionar la lectura del archivo o el error de lectura<br />
var urlRemota = new air.URLRequest("http://www.dwug.es/spry/3/events.xml");<br />
var loader = new air.URLLoader();<br />
loader.addEventListener(air.Event.COMPLETE, lecturaCompleta);<br />
loader.addEventListener(air.IOErrorEvent.IO_ERROR, errorIO);<br />
loader.load(urlRemota);</code></p>
<p>La función loadDataSet se encarga de cargar el archivo xml local:</p>
<p><code>function loadDataset(){<br />
ds1.setURL("data/eventos.xml");<br />
ds1.loadData();<br />
}</code></p>
<p>La función errorIO se encarga de cambiar el texto de un div del documento a &#8216;offline&#8217; y carga el dataset local (que no se ha modificado, ya que ha habido un error):</p>
<p><code>function errorIO(event){<br />
document.getElementById('estado').innerHTML="Offline";<br />
loadDataset();<br />
}</code></p>
<p>La función lecturaCompleta (invocada si se ha relizado la conexión y se ha leido el xml remoto) se encarga de sobreescribir el xml local y cargar el dataset (que ahora ya estará actualizado):</p>
<p><code>function lecturaCompleta(event){<br />
document.getElementById('estado').innerHTML="Online";<br />
//obtenemos el contenido del xml remoto<br />
var dataXML = event.target.data;<br />
//buscamos el archivo local: primero su carpeta y luego el archivo<br />
var carpetaDestino=air.File.applicationResourceDirectory.resolve("data");<br />
var archivoDestino = carpetaDestino.resolve("eventos.xml");<br />
//Abrimos el fileStream para poder acceder al archivo<br />
var destinoStream = new air.FileStream();<br />
//listener para avisar de que se ha escrito<br />
destinoStream.addEventListener(air.Event.CLOSE, escrituraCompleta);<br />
//Abrimos de forma asíncrona, para que lance el evento al terminar<br />
destinoStream.openAsync(archivoDestino, air.FileMode.WRITE);<br />
//sobreescribimos el archivo local<br />
destinoStream.writeUTFBytes(dataXML);<br />
//cerramos el fileStream<br />
destinoStream.close();<br />
}</code></p>
<p>Finalmente, la función escrituraCompleta se invoca cuando se ha terminado de sobreescribir el xml local con los datos remotos. se limita a cargar el dataset:</p>
<p><code>function escrituraCompleta(event){<br />
loadDataset();<br />
}</code></p>
<p>El código completo del documento puede verse en la siguiente URL:<br />
<a href="http://www.dwug.es/spry/spry_air_online_offline.txt">http://www.dwug.es/spry/spry_air_online_offline.txt</a></p>
<p><!--0853aeb698316ff51beaa2db5dbd4a54--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dwug.es/go/377/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

