<?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>Blog de GreenIvory &#187; Développement</title>
	<atom:link href="http://blog.greenivory.fr/category/developpement/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.greenivory.fr</link>
	<description>Développement agile sur technologies web 2.0</description>
	<lastBuildDate>Tue, 20 Jul 2010 09:16:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mise à jour de Safari (5) et GWT</title>
		<link>http://blog.greenivory.fr/2010/06/10/mise-a-jour-de-safari-5-et-gwt/</link>
		<comments>http://blog.greenivory.fr/2010/06/10/mise-a-jour-de-safari-5-et-gwt/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 07:15:21 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[mise à jour]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=1048</guid>
		<description><![CDATA[
J&#8217;ai mis à jour Safari 5 (car quelques nouveautés intéressantes) et je n&#8217;ai remarqué aucun souci avec le plugin GWT, ça passe !
J&#8217;suis pas non plus complètement fou, je m&#8217;étais renseigné, et ce qu&#8217;il ressortait c&#8217;est que ça passe quand on est sous Mac OS X 10.6 et que Safari tourne en 64 bits. Si [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>J&#8217;ai mis à jour <strong>Safari 5</strong> (car q<a href="http://www.apple.com/safari/whats-new.html#reader">uelques nouveautés intéressantes</a>) et je n&#8217;ai remarqué <strong>aucun souci avec le plugin <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a></strong>, ça passe !</p>
<p>J&#8217;suis pas non plus complètement fou, je m&#8217;étais renseigné, et ce qu&#8217;il ressortait c&#8217;est que ça passe quand on est sous Mac OS X 10.6 et que Safari tourne en 64 bits. Si vous n&#8217;êtes pas dans cette configuration-là, je ne vous conseille pas la mise à jour de Safari.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2010/06/10/mise-a-jour-de-safari-5-et-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse : Ant Configuration Selection</title>
		<link>http://blog.greenivory.fr/2010/01/04/eclipse-ant-configuration-selection/</link>
		<comments>http://blog.greenivory.fr/2010/01/04/eclipse-ant-configuration-selection/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 20:03:24 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=644</guid>
		<description><![CDATA[Je viens de réinstaller une nouvelle version d&#8217;Eclipse (3.5, Galileo), mais en conservant mon workspace en l&#8217;état (de ma version 3.4, Ganymede). Quand je lance un tâche Ant depuis la Ant view, en faisant un double-clic, Eclipse m&#8217;ouvre une fenêtre intitulée Ant Configuration Selection, m&#8217;invitant à sélectionner la tâche Ant à lancer&#8230; c&#8217;est assez ennuyeux [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de réinstaller une nouvelle version d&#8217;<a href="http://www.eclipse.org/">Eclipse</a> (3.5, Galileo), mais en conservant mon workspace en l&#8217;état (de ma version 3.4, Ganymede). Quand je lance un tâche Ant depuis la <em>Ant view</em>, en faisant un double-clic, Eclipse m&#8217;ouvre une fenêtre intitulée <em>Ant Configuration Selection</em>, m&#8217;invitant à sélectionner la tâche Ant à lancer&#8230; c&#8217;est assez ennuyeux à la longue (c&#8217;est-à-dire au bout de 2 fois <img src='http://blog.greenivory.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>
<p>Voici comment résoudre le problème :</p>
<pre>cd [workspace]/.metadata/.plugins/org.eclipse.debug.core/.launches/
rm [nom.du.project]*.launch</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2010/01/04/eclipse-ant-configuration-selection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tester son application GWT/GXT avec Selenium</title>
		<link>http://blog.greenivory.fr/2009/09/28/tester-son-application-gwtgxt-avec-selenium/</link>
		<comments>http://blog.greenivory.fr/2009/09/28/tester-son-application-gwtgxt-avec-selenium/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 10:45:11 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=545</guid>
		<description><![CDATA[GXT (grâce à GWT) permet de créer des applications web riches, dont l&#8217;ergonomie est assez proche d&#8217;une application lourde. Nous avons déjà eu l&#8217;occasion de publier des articles à ce sujet sur ce blog. Il est assez simple de faire des tests unitaires sur des services dans les couches basses d&#8217;une application. Et encore, dès [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://extjs.com/products/gxt/" xml:lang="en" hreflang="en"><abbr title="Ext pour GWT" xml:lang="en">GXT</abbr></a> (grâce à <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a>) permet de créer des <strong>applications web riches</strong>, dont l&#8217;ergonomie est assez proche d&#8217;une application lourde. Nous avons déjà eu l&#8217;occasion de publier des articles à ce sujet sur ce blog. Il est assez simple de faire des <strong>tests unitaires</strong> sur des services dans les couches basses d&#8217;une application. Et encore, dès qu&#8217;il y a une base de données en jeu, ça se complique (et c&#8217;est d&#8217;ailleurs très souvent le cas). Mais qu&#8217;en est-il des interfaces graphiques ? Evidemment, certains éléments graphiques peuvent être testés via des tests unitaires, mais comment s&#8217;assurer que l&#8217;interface, dans son ensemble, répond aux besoins ?</p>
<p>C&#8217;est là qu&#8217;intervient <a href="http://seleniumhq.org/">Selenium</a>. Selenium est un jeu d&#8217;outils qui permettent d&#8217;<strong>automatiser les tests d&#8217;interface graphique</strong>, en pilotant un navigateur via du code (ce code, c&#8217;est le <strong>testcase</strong>). Par exemple, on va pouvoir demander le chargement d&#8217;une page, effectuer un clic sur un lien bien précis, vérifier que la page contient un texte, &#8230; Une session complète sera dédiée à Selenium au <a href="http://developerforum.eu/">DeveloperForum 5</a>, le <strong>8 octobre 2009 à Strasbourg</strong>.</p>
<p>Mais avant de pouvoir tester nos interfaces, il faut mettre en place Selenium. Voici comment faire fonctionner Selenium dans un projet <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a> dans Eclipse sur Mac OS X Snow Leopard (10.6).</p>
<h2>Comment ça marche ?</h2>
<p>Il faut deux éléments pour faire fonctionner le tout :</p>
<ul>
<li><strong>Selenium IDE</strong> est une extension Firefox qui permet d&#8217;enregistrer les actions réalisées dans la fenêtre de Firefox et d&#8217;ainsi produire le code du testcase (dans le langage de votre choix &#8211; dans notre cas, ce sera Java).</li>
<li><strong>Selenium RC</strong> (Remote Control) est un serveur capable de piloter un navigateur et pouvant recevoir des commandes via le réseau, déclenchées par le testcase.</li>
</ul>
<h2>Mise en place</h2>
<p>Utilisez Firefox pour télécharger et installer Selenium IDE (extension Firefox) : <a href="http://seleniumhq.org/download/">http://seleniumhq.org/download/</a><br />
Téléchargez ensuite Selenium RC et décompresser l&#8217;archive dans le répertoire de votre choix. Depuis ce répertoire, lancez Selenium RC via la ligne de commande :</p>
<pre>java -jar selenium-server-1.0.1/selenium-server.jar</pre>
<p>Le serveur se lance et devrait vous afficher les gentillesses suivantes :</p>
<pre>10:53:44.369 INFO - Java: Apple Inc. 14.1-b02-90
10:53:44.370 INFO - OS: Mac OS X 10.6.1 i386
10:53:44.379 INFO - v1.0.1 [2696], with Core v@VERSION@ [@REVISION@]
10:53:44.461 INFO - Version Jetty/5.1.x
10:53:44.462 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
10:53:44.463 INFO - Started HttpContext[/selenium-server,/selenium-server]
10:53:44.463 INFO - Started HttpContext[/,/]
10:53:44.475 INFO - Started SocketListener on 0.0.0.0:4444
10:53:44.475 INFO - Started org.mortbay.jetty.Server@1ff7a1e</pre>
<h2>Premier test</h2>
<p><strong>Dans Firefox</strong>, allez sur une page web de votre choix puis, dans le menu <em>Outils</em>, choisissez <em>Selenium IDE</em>. Commencez à surfer sur la page web et regardez Selenium &laquo;&nbsp;Big Brother&nbsp;&raquo; IDE enregistrer toutes vos actions dans le navigateur&#8230; Exactement comme lorsqu&#8217;on enregistre un macro dans certains logiciels. Après avoir navigué dans quelques pages, sélectionnez du texte dans la page et faites un clic droit puis sélectionnez l&#8217;option <em>verifyTextPresent &lt;le texte que vous avez sélectionné&gt;</em>.</p>
<p>Dans le menu de la <strong>fenêtre de Selenium</strong>, choisissez <em>Exporter le test sous&#8230;</em> puis choisissez <em>Java (JUnit)</em>. Enregistrez le fichier avec le nom de votre choix, sans oublier l&#8217;extension <em>.java</em>.</p>
<p><strong>Dans Eclipse</strong>, dans votre projet <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a>/<a href="http://extjs.com/products/gxt/" xml:lang="en" hreflang="en"><abbr title="Ext pour GWT" xml:lang="en">GXT</abbr></a>, créez un nouveau dossier de sources nommé <em>test</em> (si ce n&#8217;est pas déjà fait). Ajoutez-y le fichier généré par Selenium IDE puis corrigez le nom du package ainsi que le nom de la classe. Corrigez le build path de votre projet en ajoutant le JAR <em>selenium-java-client-driver.jar</em> (que vous trouverez dans l&#8217;archive de Selenium que vous avez téléchargée). Clic droit sur la classe dans Eclipse puis <em>Run As &gt; JUnit Test</em>.</p>
<p>Et là, c&#8217;est le drame : une <strong>erreur se produit lors du lancement de Firefox</strong>. Après le passage à Snow Leopard, une incompatibilité de librairie est arrivée. Pour la contourner, il existe une <a href="http://stackoverflow.com/questions/1364523/firefox-bin-quit-unexpectedly-while-running-selenium-test">solution</a> qui vaut ce qu&#8217;elle vaut (j&#8217;adore cette expression qui ne veut rien dire dans l&#8217;absolu et qui pourtant veut bien dire&#8230; ce qu&#8217;elle veut dire !) :</p>
<ul>
<li>Quittez Firefox</li>
<li>Lancer le Terminal puis rendez-vous dans <em>/Applications/Firefox.app/Contents/MacOS</em>.</li>
<li>Renommez <em>libsqlite3.dylib</em> : <code>mv libsqlite3.dylib _libsqlite3.dylib</code></li>
</ul>
<p>Relancez votre testcase et tout devrait rentrer dans l&#8217;ordre !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/09/28/tester-son-application-gwtgxt-avec-selenium/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migration de GXT 1.x à GXT 2.x</title>
		<link>http://blog.greenivory.fr/2009/08/13/migration-de-gxt-1x-a-gxt-2x/</link>
		<comments>http://blog.greenivory.fr/2009/08/13/migration-de-gxt-1x-a-gxt-2x/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 13:11:42 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[migration]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=450</guid>
		<description><![CDATA[Il existe bien sûr un guide de migration qui permet de passer de GXT 1.x à GXT 2.x, avec plus ou moins de succès. Mais une chose importante a été oubliée dans ce guide. Quand on utilise des listes paginées, le paramètre indiquant la page de données voulue s&#8217;appelait auparavant start, il s&#8217;appelle désormais offset. [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe bien sûr un <strong>guide de migration</strong> qui permet de passer de <a href="http://extjs.com/products/gxt/" xml:lang="en" hreflang="en"><abbr title="Ext pour GWT" xml:lang="en">GXT</abbr></a> 1.x à <a href="http://extjs.com/products/gxt/" xml:lang="en" hreflang="en"><abbr title="Ext pour GWT" xml:lang="en">GXT</abbr></a> 2.x, avec plus ou moins de succès. Mais une chose importante a été oubliée dans ce guide. Quand on utilise des listes paginées, le paramètre indiquant la page de données voulue s&#8217;appelait auparavant <em>start</em>, il s&#8217;appelle désormais <em>offset</em>. C&#8217;est comme ça, et ce n&#8217;est pas paramétrable.<br />
Faut juste modifier toutes les servlets&#8230; à moins que, comme nous, vous n&#8217;ayez centralisé ce genre de choses.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/08/13/migration-de-gxt-1x-a-gxt-2x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KISS !</title>
		<link>http://blog.greenivory.fr/2009/04/21/kiss/</link>
		<comments>http://blog.greenivory.fr/2009/04/21/kiss/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 09:08:12 +0000</pubDate>
		<dc:creator>Valérie</dc:creator>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[principe]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=278</guid>
		<description><![CDATA[Je ne vais ni vous envoyer de bisous ni vous parler d&#8217;un groupe de hard-rock, mais bien d&#8217;un principe que l&#8217;on applique tous les jours pour notre développement logiciel : KISS !
Il s&#8217;agit d&#8217;un acronyme signifiant : &#171;&#160;Keep It Short &#38; Simple&#171;&#160;.
Il existe d&#8217;autres variantes &#171;&#160;Keep It Sweep &#38; Simple&#160;&#187; ou &#171;&#160;Keep It Strictly Simple&#160;&#187; [...]]]></description>
			<content:encoded><![CDATA[<p>Je ne vais ni vous envoyer de bisous ni vous parler d&#8217;un groupe de hard-rock, mais bien d&#8217;un principe que l&#8217;on applique tous les jours pour notre développement logiciel : KISS !</p>
<p>Il s&#8217;agit d&#8217;un acronyme signifiant : &laquo;&nbsp;<strong>Keep It Short &amp; Simple</strong>&laquo;&nbsp;.<br />
Il existe d&#8217;autres variantes &laquo;&nbsp;Keep It Sweep &amp; Simple&nbsp;&raquo; ou &laquo;&nbsp;Keep It Strictly Simple&nbsp;&raquo; mais l&#8217;idée reste la même.</p>
<p>KISS veut dire qu&#8217;il faut toujours chercher à faire simple, cette maxime est un moyen de rappeler au développeur qu&#8217;un programme simple est un programme que l&#8217;on maintient et que l&#8217;on comprend plus facilement, mais aussi qui est certainement moins sujet aux anomalies.<br />
Ce terme est parfois utilisé pour éviter le phénomène de &laquo;&nbsp;<a title="wikipedia : creeping featurism" href="http://en.wikipedia.org/wiki/Creeping_featurism" target="_blank">feature creep</a>&nbsp;&raquo; d&#8217;un logiciel. Bien sûr cette maxime s&#8217;inscrit dans nos pratiques agiles.</p>
<p>Mais KISS peut s&#8217;appliquer à bien d&#8217;autres domaines, l&#8217;informatique n&#8217;en a pas l&#8217;exclusivité !</p>
<p>Comme l&#8217;a très bien dit Léonard de Vinci : &laquo;&nbsp;La simplicité est la sophistication suprême.&nbsp;&raquo;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/04/21/kiss/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Changement de sélection dans une ListView</title>
		<link>http://blog.greenivory.fr/2009/04/16/changement-de-selection-dans-une-listview/</link>
		<comments>http://blog.greenivory.fr/2009/04/16/changement-de-selection-dans-une-listview/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 12:46:53 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[ListView]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=261</guid>
		<description><![CDATA[Après MashupXFeed et les réseaux sociaux, retournons à un peu de technique : comment gérer le changement de sélection dans une ListView et récupérer la sélection ?
Voilà une réponse possible : ajouter un listener sur le SelectionModel.

// Initialize the ListView and required stuff to load and display it.
ListView listView = new ListView();
listView.setTemplate(getTemplate());
listView.setItemSelector("div.listview-item");

// Setup selection Listener.
listView.getSelectionModel().addListener(
 [...]]]></description>
			<content:encoded><![CDATA[<p>Après <a href="http://www.greenivory.com/content/blogcategory/35/69/" xml:lang="en" hreflang="en">MashupXFeed</a> et les réseaux sociaux, retournons à un peu de technique : comment gérer le changement de sélection dans une <code>ListView</code> et récupérer la sélection ?</p>
<p>Voilà une réponse possible : ajouter un <em>listener</em> sur le <em>SelectionModel</em>.</p>
<pre lang="java">
// Initialize the ListView and required stuff to load and display it.
ListView<ModelData> listView = new ListView<ModelData>();
listView.setTemplate(getTemplate());
listView.setItemSelector("div.listview-item");

// Setup selection Listener.
listView.getSelectionModel().addListener(
   Events.SelectionChange,
   new Listener<SelectionEvent<ModelData>>() {
      public void handleEvent(SelectionEvent<ModelData> se) {
         ModelData selectedModel = se.selection.get(0);
      }
   });
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/04/16/changement-de-selection-dans-une-listview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boîte de confirmation avec GXT</title>
		<link>http://blog.greenivory.fr/2009/04/07/boite-de-confirmation-avec-gxt/</link>
		<comments>http://blog.greenivory.fr/2009/04/07/boite-de-confirmation-avec-gxt/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 17:06:18 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[confirmation]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[MessageBox]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=240</guid>
		<description><![CDATA[À chaque fois que j&#8217;en ai besoin, c&#8217;est pareil : je ne me souviens jamais de la manière de tester la &#171;&#160;valeur de retour&#160;&#187; de MessageBox.confirm(). Alors en l&#8217;écrivant ici, peut-être que je finirai par m&#8217;en souvenir&#8230;

Listener handler = new Listener() {
    public void handleEvent(WindowEvent be) {
      [...]]]></description>
			<content:encoded><![CDATA[<p>À chaque fois que j&#8217;en ai besoin, c&#8217;est pareil : je ne me souviens jamais de la manière de tester la &laquo;&nbsp;valeur de retour&nbsp;&raquo; de <code>MessageBox.confirm()</code>. Alors en l&#8217;écrivant ici, peut-être que je finirai par m&#8217;en souvenir&#8230;</p>
<pre lang="java">
Listener<WindowEvent> handler = new Listener<WindowEvent>() {
    public void handleEvent(WindowEvent be) {
        Dialog dialog = (Dialog) be.component;
        Button btn = dialog.getButtonPressed();
        if (btn.getItemId().equals(Dialog.YES)) {
            // L'utilisateur a confirmé !
        }
    }
};
MessageBox.confirm(
    "Confirmation", "Souhaitez-vous réellement... ?", handler
    );
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/04/07/boite-de-confirmation-avec-gxt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT et les NullPointerException</title>
		<link>http://blog.greenivory.fr/2009/04/01/gwt-et-les-nullpointerexception/</link>
		<comments>http://blog.greenivory.fr/2009/04/01/gwt-et-les-nullpointerexception/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 16:11:23 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[null]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=221</guid>
		<description><![CDATA[Quelle histoire, ce sabotage de Google ! Un peu de sérieux, en attendant des nouvelles de ce cher Serge-Jean (plus facile à écrire qu&#8217;à dire !).
Je me suis fait avoir par quelque chose d&#8217;assez subtil avec GWT. En parsant du XML avec le XMLParser fourni par GWT, j&#8217;ai eu besoin de récupérer la valeur d&#8217;attributs optionnels. [...]]]></description>
			<content:encoded><![CDATA[<p>Quelle histoire, ce <a href="http://blog.greenivory.fr/2009/04/01/google-menace/">sabotage de Google</a> ! Un peu de sérieux, en attendant des nouvelles de ce cher Serge-Jean (plus facile à écrire qu&#8217;à dire !).</p>
<p>Je me suis fait avoir par quelque chose d&#8217;assez subtil avec <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a>. En parsant du XML avec le <code>XMLParser</code> fourni par <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a>, j&#8217;ai eu besoin de récupérer la valeur d&#8217;attributs optionnels. J&#8217;avais donc écrit des blocs de code qui ressemblent à peu près à ceci :</p>
<pre lang="java">
NamedNodeMap paramAttrs = paramNode.getAttributes();
String view = null;
try {
   view = paramAttrs.getNamedItem("view").getNodeValue();
} catch (NullPointerException e) { }
</pre>
<p>En me disant que si un élément est <code>null</code> dans la chaîne d&#8217;exécution, alors <code>view</code> vaudrait tout simplement <code>null</code>. Ceci est valable en Java, mais une fois traduit en JavaScript par <a href="http://code.google.com/webtoolkit/" xml:lang="en" hreflang="en"><abbr title="Google Web Toolkit" xml:lang="en">GWT</abbr></a>, ça ne marche pas du tout. La solution est donc de tester &laquo;&nbsp;à la main&nbsp;&raquo; les valeurs nulles :</p>
<pre lang="java">
NamedNodeMap paramAttrs = paramNode.getAttributes();
Node item = paramAttrs.getNamedItem("view");
String view = item != null ? item.getNodeValue() : null;
</pre>
<p>Dans cet exemple, je vous l&#8217;accorde, ce n&#8217;est pas plus long et c&#8217;est même plus propre, mais j&#8217;avais un peu plus d&#8217;éléments dans ma ligne, et donc plusieurs valeurs (potentiellement nulles) à tester.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/04/01/gwt-et-les-nullpointerexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problème avec DragListener.dragCancel()</title>
		<link>http://blog.greenivory.fr/2009/03/20/probleme-avec-draglistenerdragcancel/</link>
		<comments>http://blog.greenivory.fr/2009/03/20/probleme-avec-draglistenerdragcancel/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 03:40:12 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[drag and drop]]></category>
		<category><![CDATA[GXT]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=145</guid>
		<description><![CDATA[Je viens de passer un certain temps à me rendre compte que dans la méthode dragCancel() d&#8217;un objet DragListener la propriété component de l&#8217;objet DragEvent reçu en argument vaut null ! Donc si vous avez besoin de cette information, pensez à la stocker dans votre objet dans la méthode dragStart()&#8230;
Version de GXT : 1.2.3
]]></description>
			<content:encoded><![CDATA[<p>Je viens de passer un certain temps à me rendre compte que dans la méthode <code>dragCancel()</code> d&#8217;un objet <code>DragListener</code> la propriété <code>component</code> de l&#8217;objet <code>DragEvent</code> reçu en argument vaut <code>null</code> ! Donc si vous avez besoin de cette information, pensez à la stocker dans votre objet dans la méthode <code>dragStart()</code>&#8230;</p>
<p>Version de <a href="http://extjs.com/products/gxt/" xml:lang="en" hreflang="en"><abbr title="Ext pour GWT" xml:lang="en">GXT</abbr></a> : 1.2.3</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/03/20/probleme-avec-draglistenerdragcancel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrollbar et RowLayout</title>
		<link>http://blog.greenivory.fr/2009/03/05/scrollbar-et-rowlayout/</link>
		<comments>http://blog.greenivory.fr/2009/03/05/scrollbar-et-rowlayout/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 12:02:21 +0000</pubDate>
		<dc:creator>Frédéric</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[GXT]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[scroll]]></category>

		<guid isPermaLink="false">http://blog.greenivory.fr/?p=82</guid>
		<description><![CDATA[L&#8217;utilisation d&#8217;un RowLayout dans un conteneur supprime la possibilité d&#8217;avoir une barre de défilement pour ce conteneur. En fait, la raison est assez simple : RowLayout calcule la position et la taille précises de chaque enfant, et c&#8217;est à chacun de ses enfants de gérer sa barre de défilement, au besoin.
Donc, si vous avez besoin [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;utilisation d&#8217;un <code>RowLayout</code> dans un conteneur supprime la possibilité d&#8217;avoir une barre de défilement pour ce conteneur. En fait, la raison est assez simple : <code>RowLayout</code> calcule la position et la taille précises de chaque enfant, et c&#8217;est à chacun de ses enfants de gérer sa barre de défilement, au besoin.</p>
<p>Donc, <strong>si vous avez besoin d&#8217;une barre de défilement dans un panneau, n&#8217;utilisez pas </strong><code><strong>RowLayout</strong></code> : dans la plupart des cas, un <code>FlowLayout</code> peut être préférable. Utiliser un <code>FlowLayout</code> revient à utiliser un <code>RowLayout(Orientation.VERTICAL)</code> avec des contraintes <code>RowData(1, -1)</code> pour chaque enfant (c&#8217;est-à-dire : utiliser toute la largeur disponible et laisser chacun des enfants calculer sa propre hauteur).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.greenivory.fr/2009/03/05/scrollbar-et-rowlayout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
