<?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>ZeServeur &#187; rcp</title>
	<atom:link href="http://zeserveur.fr/blog/tag/rcp/feed" rel="self" type="application/rss+xml" />
	<link>http://zeserveur.fr/blog</link>
	<description>La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information…</description>
	<lastBuildDate>Sat, 06 Mar 2010 11:46:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>EMF, SWT et Databinding</title>
		<link>http://zeserveur.fr/blog/2009/07/19/emf-swt-et-databinding</link>
		<comments>http://zeserveur.fr/blog/2009/07/19/emf-swt-et-databinding#comments</comments>
		<pubDate>Sun, 19 Jul 2009 10:27:13 +0000</pubDate>
		<dc:creator>zetom</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[databinding]]></category>
		<category><![CDATA[emf]]></category>
		<category><![CDATA[rcp]]></category>
		<category><![CDATA[swt]]></category>

		<guid isPermaLink="false">http://zeserveur.fr/blog/?p=172</guid>
		<description><![CDATA[Habitué au XML pour gérer le stockage de mes modèles de données, je me suis dit &#171;&#160;Tiens, pour une fois, regarde ce que donne l&#8217;EMF&#160;&#187;&#8230;
Et je ne suis pas du tout deçu!!! Ca m&#8217;a fait gagné pas mal de temps  
EMF, kesako?
D&#8217;après le site officiel, &#171;&#160;The EMF project is a modeling framework and code [...]]]></description>
			<content:encoded><![CDATA[<p>Habitué au XML pour gérer le stockage de mes modèles de données, je me suis dit &laquo;&nbsp;Tiens, pour une fois, regarde ce que donne l&#8217;EMF&nbsp;&raquo;&#8230;<br />
Et je ne suis pas du tout deçu!!! Ca m&#8217;a fait gagné pas mal de temps <img src='http://zeserveur.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>EMF, kesako?</h2>
<p>D&#8217;après le <a title="site officiel" href="http://www.eclipse.org/projects/project_summary.php?projectid=modeling.emf">site officiel</a>, &laquo;&nbsp;<em>The EMF project is a modeling framework and code generation facility for building  tools and other applications based on a structured data model. From a model  specification described in XMI, EMF provides tools and runtime support to  produce a set of Java classes for the model, along with a set of adapter  classes that enable viewing and command-based editing of the model, and  a basic editor.</em>&nbsp;&raquo;</p>
<p><span id="more-172"></span></p>
<h2>Ecore Diagram ou la description graphique d&#8217;un modèle</h2>
<p>EMF dispose, en incubation (mais il marche très bien), du sous-projet &laquo;&nbsp;Ecore Diagram&nbsp;&raquo; permettant de décrire graphiquement un modèle Ecore:</p>
<p><img class="aligncenter size-medium wp-image-173" title="ECore Diagram" src="http://zeserveur.fr/blog/wp-content/uploads/2009/07/ecorediagram-300x211.jpg" alt="ECore Diagram" width="300" height="211" /></p>
<p>Une fois le modèle décrit, il ne reste plus qu&#8217;à générer le code Java&#8230;</p>
<p>Donc <em>New &gt; Others &gt; EMF Generator Model</em>. On lui indique notre modèle ecore et hop, il affiche à nouveau notre modèle, mais sous forme arborescente:</p>
<p><img class="aligncenter size-medium wp-image-174" title="Editeur Genmodel" src="http://zeserveur.fr/blog/wp-content/uploads/2009/07/genmodel-300x225.jpg" alt="Editeur Genmodel" width="300" height="225" />Là, bouton droit sur la racine qui nous permet de :</p>
<ul>
<li>Générer le code du modèle</li>
<li>Générer le code pour éditer le modèle</li>
<li>Générer le code de l&#8217;éditeur</li>
<li>Générer le code pour tester le modèle</li>
<li>Générer tout</li>
</ul>
<p>Pour le moment, moi, ce qui m&#8217;intéresse, c&#8217;est le code du modèle&#8230; et me voilà avec une vingtaine de classes (interface &amp; implémentation), des factories&#8230;</p>
<p>Génial, pas une ligne de code écrite et je peux déjà lire &amp; écrire des données&#8230;</p>
<h2>Lire et écrire son modèle EMF</h2>
<p>Après une petite recherche de code, voilà de quoi lire et écrire un modèle</p>
<div class="geshi no java">
<div class="head">/** The resource used to store the model. */</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> Resource resource<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Load the resource associated to a model.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pFile The file.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @return The associated resource.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> Resource load<span class="br0">&#40;</span><span class="kw2">final</span> <span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ResourceSet lResourceSet = <span class="kw2">new</span> ResourceSetImpl<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Register the appropriate resource factory to handle all file extensions.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; lResourceSet.<span class="me1">getResourceFactoryRegistry</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getExtensionToFactoryMap</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">put</span><span class="br0">&#40;</span>Resource.<span class="me1">Factory</span>.<span class="kw3">Registry</span>.<span class="me1">DEFAULT_EXTENSION</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">new</span> XMIResourceFactoryImpl<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Register the package to ensure it is available during loading.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; lResourceSet.<span class="me1">getPackageRegistry</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">put</span><span class="br0">&#40;</span>ModelPackage.<span class="me1">eNS_URI</span>, ModelPackage.<span class="me1">eINSTANCE</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Get the URI of the model file.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; URI lFileURI = URI.<span class="me1">createFileURI</span><span class="br0">&#40;</span>pFile.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Create a resource for this file.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> lResourceSet.<span class="me1">createResource</span><span class="br0">&#40;</span>lFileURI<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Load the model.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pFile The file.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @return The associated model.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @throws IOException IO Error.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> SequenceProject loadModel<span class="br0">&#40;</span><span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="kw2">throws</span> <span class="kw3">IOException</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; resource = EMFUtils.<span class="me1">load</span><span class="br0">&#40;</span>pFile<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resource.<span class="me1">load</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">HashMap</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; SequenceProject lSequenceProject<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>resource.<span class="me1">getContents</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lSequenceProject= ModelFactory.<span class="me1">eINSTANCE</span>.<span class="me1">createSequenceProject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resource.<span class="me1">getContents</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span>lSequenceProject<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lSequenceProject = <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>EObject lObj : resource.<span class="me1">getContents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>lObj <span class="kw2">instanceof</span> SequenceProject<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lSequenceProject = <span class="br0">&#40;</span>SequenceProject<span class="br0">&#41;</span> lObj<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> lSequenceProject<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Save the model.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @throws IOException Error.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> save<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">throws</span> <span class="kw3">IOException</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resource.<span class="me1">save</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">HashMap</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2></h2>
<h2>SWT et le Databinding</h2>
<p>Maintenant, il ne reste plus qu&#8217;à câbler le modèle aux formulaires SWT&#8230; et là, merci au databinding car il n&#8217;y a (presque) rien à faire!</p>
<p>En effet, les développeurs d&#8217;EMF et SWT ont eu la bonne idée de fournir un mécanisme permettant d&#8217;éviter l&#8217;initialisation et la sauvegarde des champs texte, menus déroulants, listes lorsqu&#8217;ils sont liés à un modèle EMF.</p>
<p>Voilà les dépendances nécessaires pour le modèle:</p>
<ul>
<li>org.eclipse.emf.ecore</li>
<li>org.eclipse.emf.ecore.xmi</li>
</ul>
<p>&#8230; et pour le databinding:</p>
<ul>
<li>org.eclipse.core.databinding.beans</li>
<li>org.eclipse.emf.databinding</li>
<li>org.eclipse.jface.databinding</li>
</ul>
<p>auxquels on ajoute évidemment la base (org.eclipse.ui, org.eclipse.ui.forms&#8230;)</p>
<h3>Lier les widgets de base</h3>
<p>Ensuite, il suffit d&#8217;indiquer, lors de la création du widget SWT à qui il doit être relié:</p>
<div class="geshi no java">
<div class="head">Text lText = toolkit.createText(pParent, &laquo;&nbsp;&nbsp;&raquo;);</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; lText.<span class="me1">setLayoutData</span><span class="br0">&#40;</span><span class="kw2">new</span> GridData<span class="br0">&#40;</span>GridData.<span class="me1">FILL_HORIZONTAL</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; bindElement<span class="br0">&#40;</span>lText, <span class="st0">&quot;movieName&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>où <code>bindElement</code> est une méthode magique pour le databinding&#8230; Il suffit de lui donner l&#8217;élement (<code>EObject</code>) qui contient le champ à lier ainsi que le nom dudit champ.</p>
<p>Voilà quelques exemples d&#8217;implémentations:</p>
<div class="geshi no java">
<div class="head">/** The data binding context. */</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> DataBindingContext dataBindingContext = <span class="kw2">new</span> DataBindingContext<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Bind the UI element to the EMF element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pControl The UI Element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pField The EObject field.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">void</span> bindElement<span class="br0">&#40;</span><span class="kw2">final</span> Combo pControl, <span class="kw2">final</span> <span class="kw3">String</span> pField<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IObservableValue lUIElement = SWTObservables.<span class="me1">observeSelection</span><span class="br0">&#40;</span>pControl<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IObservableValue lModelElement = BeansObservables.<span class="me1">observeValue</span><span class="br0">&#40;</span>getEObject<span class="br0">&#40;</span><span class="br0">&#41;</span>, pField<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dataBindingContext.<span class="me1">bindValue</span><span class="br0">&#40;</span>lUIElement, lModelElement, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Bind the UI element to the EMF element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pControl The UI Element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pField The EObject field.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">void</span> bindElement<span class="br0">&#40;</span><span class="kw2">final</span> ComboViewer pControl, <span class="kw2">final</span> <span class="kw3">String</span> pField<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IObservableValue lUIElement = ViewersObservables.<span class="me1">observeSingleSelection</span><span class="br0">&#40;</span>pControl<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IObservableValue lModelElement = BeansObservables.<span class="me1">observeValue</span><span class="br0">&#40;</span>getEObject<span class="br0">&#40;</span><span class="br0">&#41;</span>, pField<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dataBindingContext.<span class="me1">bindValue</span><span class="br0">&#40;</span>lUIElement, lModelElement, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Bind the UI element to the EMF element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pControl The UI Element.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param pField The EObject field.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw4">void</span> bindElement<span class="br0">&#40;</span><span class="kw2">final</span> Text pControl, <span class="kw2">final</span> <span class="kw3">String</span> pField<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ISWTObservableValue lUIElement = SWTObservables.<span class="me1">observeText</span><span class="br0">&#40;</span>pControl, SWT.<span class="me1">Modify</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; IObservableValue lModelElement = BeansObservables.<span class="me1">observeValue</span><span class="br0">&#40;</span>getEObject<span class="br0">&#40;</span><span class="br0">&#41;</span>, pField<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dataBindingContext.<span class="me1">bindValue</span><span class="br0">&#40;</span>lUIElement, lModelElement, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>Lier une liste</h3>
<p>Ca, ça marche pour les widgets de base&#8230; mais pour les listes, c&#8217;est (un peu) plus compliqué&#8230; enfin, si peu&#8230;</p>
<p>En effet, le databinding nous fournit le content provider (<code>ObservableListContentProvider</code>) et l&#8217;input (<code>WritableList</code> ; mais on a la même chose pour les Set et les Map) ; pour le label provider, c&#8217;est comme d&#8217;habitude&#8230;</p>
<div class="geshi no java">
<div class="head">ListViewer viewer = new ListViewer(lComp);</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; viewer.<span class="me1">setContentProvider</span><span class="br0">&#40;</span><span class="kw2">new</span> ObservableListContentProvider<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; viewer.<span class="me1">setLabelProvider</span><span class="br0">&#40;</span><span class="kw2">new</span> LabelProvider<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; input = <span class="kw2">new</span> WritableList<span class="br0">&#40;</span>getInputList<span class="br0">&#40;</span><span class="br0">&#41;</span>, getEObjectClass<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; viewer.<span class="me1">setInput</span><span class="br0">&#40;</span>input<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Et maintenant, pour ajouter/supprimer un élément de la liste, il suffit de le faire sur l&#8217;input (pas besoin de notifier le viewer, c&#8217;est fait automatiquement):</p>
<div class="geshi no java">
<div class="head">input.add(myElement);</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;input.<span class="me1">remove</span><span class="br0">&#40;</span>myElement<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>&#8230; et le modèle est mis automatiquement à jour!</p>
<p>Voilà en gros le fonctionnement&#8230; je vais maintenant jouer un peut avec EMF Query et je reviendrai poster le résultat de mes recherches <img src='http://zeserveur.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong>Articles Similaires</strong>
<ul class="similar-posts">
<li><a href="http://zeserveur.fr/blog/2009/05/02/rcp-workspace" rel="bookmark" title="02/05/2009">RCP Workspace</a></li>
<li><a href="http://zeserveur.fr/blog/2009/05/25/junit-eclipse-rcp-et-test-de-plugins" rel="bookmark" title="25/05/2009">JUnit, Eclipse RCP et Test de plugins</a></li>
<li><a href="http://zeserveur.fr/blog/2009/08/17/forum-eclipse" rel="bookmark" title="17/08/2009">Forum Eclipse</a></li>
<li><a href="http://zeserveur.fr/blog/2009/09/08/eclipse-et-le-buddy-classloading" rel="bookmark" title="08/09/2009">Eclipse et le &laquo;&nbsp;Buddy Class Loading&nbsp;&raquo;&#8230;</a></li>
<li><a href="http://zeserveur.fr/blog/2009/08/26/connecteur-quality-center-pour-mylyn" rel="bookmark" title="26/08/2009">Connecteur Quality Center pour Mylyn</a></li>
</ul>
<p><!-- Similar Posts took 143.229 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://zeserveur.fr/blog/2009/07/19/emf-swt-et-databinding/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JUnit, Eclipse RCP et Test de plugins</title>
		<link>http://zeserveur.fr/blog/2009/05/25/junit-eclipse-rcp-et-test-de-plugins</link>
		<comments>http://zeserveur.fr/blog/2009/05/25/junit-eclipse-rcp-et-test-de-plugins#comments</comments>
		<pubDate>Mon, 25 May 2009 14:09:29 +0000</pubDate>
		<dc:creator>zetom</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[headless]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[rcp]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://zeserveur.fr/blog/?p=140</guid>
		<description><![CDATA[Question du jour: Comment lancer des tests unitaires JUnit quand on a une architecture basée sur des plugins??
Réponse: avec un Headless mode monsieur!
Dans une appli architecturée en couches (UI/Business/IO), il arrive très souvent qu&#8217;on souhaite tester les couches basses (Business/IO) de manière unitaire. 
Oui mais voilà, si on fait du RCP et donc qu&#8217;on travaille [...]]]></description>
			<content:encoded><![CDATA[<p><b>Question du jour</b>: Comment lancer des tests unitaires JUnit quand on a une architecture basée sur des plugins??</p>
<p><b>Réponse</b>: avec un Headless mode monsieur!</p>
<p>Dans une appli architecturée en couches (UI/Business/IO), il arrive très souvent qu&#8217;on souhaite tester les couches basses (Business/IO) de manière unitaire. </p>
<p>Oui mais voilà, si on fait du RCP et donc qu&#8217;on travaille avec des plugins, c&#8217;est un peu la galère de faire des TU car il faut charger les plugins pour lancer le test correctement&#8230;<br />
<span id="more-140"></span></p>
<p>Heureusement, Eclipse est bien fait <img src='http://zeserveur.fr/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  et permet de lancer une appli RCP en occultant la partie IHM ; ça s&#8217;appelle du <b>Headless mode</b>.</p>
<p>Donc après avoir fait son TU avec JUnit, on fait comme d&#8217;habitude pour le lancer (<i>bouton droit > Run As&#8230; > JUnit Plug-in Test</i>)&#8230; sauf que là, on a un Eclipse nu qui se lance <img src='http://zeserveur.fr/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Alors reprenons la configuration du Run (<i>Run Configuration&#8230;</i>) et jetons un coup d&#8217;oeil aux paramètres&#8230; et plus précisément dans la section <i>Main</i>.<br />
On voit qu&#8217;on démarre le TU avec le product <i>org.eclipse.sdk.ide</i>&#8230; qui lance bien évidemment l&#8217;IDE!</p>
<p>Il suffit alors de sélectionner <i>Run an application</i> et de choisir <b>[No application] &#8211; Headless Mode</b> (le premier du menu déroulant):<br />
<img src="http://zeserveur.fr/blog/wp-content/uploads/2009/05/headless-300x200.jpg" alt="headless" title="headless" width="300" height="200" class="aligncenter size-medium wp-image-141" /></p>
<p>Et là, run&#8230; oh magie, le TU se lance, embarque tous les plugins nécessaires et pas d&#8217;IHM en vue! <strong>Articles Similaires</strong>
<ul class="similar-posts">
<li><a href="http://zeserveur.fr/blog/2009/05/02/rcp-workspace" rel="bookmark" title="02/05/2009">RCP Workspace</a></li>
<li><a href="http://zeserveur.fr/blog/2009/05/25/suites-de-tests-avec-junit4" rel="bookmark" title="25/05/2009">Suites de Tests avec JUnit4</a></li>
<li><a href="http://zeserveur.fr/blog/2009/09/08/eclipse-et-le-buddy-classloading" rel="bookmark" title="08/09/2009">Eclipse et le &laquo;&nbsp;Buddy Class Loading&nbsp;&raquo;&#8230;</a></li>
<li><a href="http://zeserveur.fr/blog/2009/08/26/connecteur-quality-center-pour-mylyn" rel="bookmark" title="26/08/2009">Connecteur Quality Center pour Mylyn</a></li>
<li><a href="http://zeserveur.fr/blog/2009/07/19/emf-swt-et-databinding" rel="bookmark" title="19/07/2009">EMF, SWT et Databinding</a></li>
</ul>
<p><!-- Similar Posts took 45.429 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://zeserveur.fr/blog/2009/05/25/junit-eclipse-rcp-et-test-de-plugins/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RCP Workspace</title>
		<link>http://zeserveur.fr/blog/2009/05/02/rcp-workspace</link>
		<comments>http://zeserveur.fr/blog/2009/05/02/rcp-workspace#comments</comments>
		<pubDate>Sat, 02 May 2009 09:07:28 +0000</pubDate>
		<dc:creator>zetom</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[rcp]]></category>
		<category><![CDATA[workspace]]></category>

		<guid isPermaLink="false">http://zeserveur.fr/blog/?p=38</guid>
		<description><![CDATA[Un workspace Eclipse est le répertoire où toutes les métadonnées des fichiers de préférences sont stockées (sous la forme de fichiers spécifiques Eclipse). Dans une application RCP, il se situe à la racine de l&#8217;application, dans le répertoire workspace.
Le problème en RCP, c&#8217;est que la plupart du temps, on a pas &#171;&#160;réellement&#160;&#187; besoin de ce [...]]]></description>
			<content:encoded><![CDATA[<p>Un workspace Eclipse est le répertoire où toutes les métadonnées des fichiers de préférences sont stockées (sous la forme de fichiers spécifiques Eclipse). Dans une application RCP, il se situe à la racine de l&#8217;application, dans le répertoire <em>workspace</em>.</p>
<p>Le problème en RCP, c&#8217;est que la plupart du temps, on a pas &laquo;&nbsp;réellement&nbsp;&raquo; besoin de ce répertoire (face à un client, &laquo;&nbsp;plugins&nbsp;&raquo;, &laquo;&nbsp;feature&nbsp;&raquo; et &laquo;&nbsp;configuration&nbsp;&raquo;, ça se justife&#8230; mais là ?!).</p>
<p>L&#8217;idée est donc de court-circuiter la création de ce répertoire pour le définir &laquo;&nbsp;à la main&nbsp;&raquo; lors du runtime.</p>
<p><span id="more-38"></span></p>
<h3>Le paramètre magique</h3>
<p>Il suffit tout simplement d&#8217;ajouter un paramètre à la ligne de command d&#8217;Eclipse pour lui indiquer que l&#8217;on va nous même lui spécifier l&#8217;emplacement du workspace.<br />
Evidemment, il faut le positionner dès le lancement de l&#8217;application sinon Eclipse va sortir en exception en indiquant qu&#8217;aucun workspace n&#8217;a été positionné.</p>
<p>Ce fameux &laquo;&nbsp;Program Argument&nbsp;&raquo; s&#8217;appelle <em>-data @noDefault</em>.</p>
<p>De manière à ce que l&#8217;application RCP prenne en compte toute seule ce changement, il suffit de l&#8217;indiquer dans votre <em>.product</em> (Onglet &laquo;&nbsp;Launching&nbsp;&raquo;):</p>
<p><img class="aligncenter size-full wp-image-39" title=".product arguments" src="http://zeserveur.fr/blog/wp-content/uploads/2009/05/args.jpg" alt=".product arguments" width="332" height="176" /></p>
<p>Il peut également être utile de le positionner dans les paramètres de lancement du Run:</p>
<p><img class="aligncenter size-full wp-image-40" title="args_tab" src="http://zeserveur.fr/blog/wp-content/uploads/2009/05/args_tab.gif" alt="args_tab" width="522" height="131" /></p>
<h3>Modification du répertoire</h3>
<p>Maintenant qu&#8217;Eclipse est déchargé de l&#8217;initialisation du workspace, on va simplement lui indiquer où se répertoire se trouve maitenant.</p>
<p>Pour être sûr que ce paramétrage fonctionne sous Linux &amp; Merdow$, on va le créer dans le répertoire temporaire; ce dernier se récupère via les propriétés Java: <code>System.getProperty("java.io.tmpdir")</code></p>
<p>Comme je l&#8217;ai dit précédemment, il faut faire cela très tôt&#8230; on va donc le faire dans notre classe<br />
<em>Application</em> (qui implémente <em>org.eclipse.equinox.app.IApplication</em>):</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* {@inheritDoc}</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw3">Object</span> start<span class="br0">&#40;</span><span class="kw2">final</span> IApplicationContext pContext<span class="br0">&#41;</span> <span class="kw2">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set location to the temporary folder</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Platform.<span class="me1">getInstanceLocation</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">set</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">URL</span><span class="br0">&#40;</span><span class="st0">&quot;file&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">null</span>, <span class="kw3">System</span>.<span class="me1">getProperty</span><span class="br0">&#40;</span><span class="st0">&quot;java.io.tmpdir&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>Et c&#8217;est tout&#8230;</h3>
<p>Voilà, maintenant notre application RCP n&#8217;est plus parasitée par ce répertoire&#8230;<strong>Articles Similaires</strong>
<ul class="similar-posts">
<li><a href="http://zeserveur.fr/blog/2009/05/25/junit-eclipse-rcp-et-test-de-plugins" rel="bookmark" title="25/05/2009">JUnit, Eclipse RCP et Test de plugins</a></li>
<li><a href="http://zeserveur.fr/blog/2009/09/08/eclipse-et-le-buddy-classloading" rel="bookmark" title="08/09/2009">Eclipse et le &laquo;&nbsp;Buddy Class Loading&nbsp;&raquo;&#8230;</a></li>
<li><a href="http://zeserveur.fr/blog/2009/07/19/emf-swt-et-databinding" rel="bookmark" title="19/07/2009">EMF, SWT et Databinding</a></li>
<li><a href="http://zeserveur.fr/blog/2009/02/12/eclipse-34-le-delta-pack" rel="bookmark" title="12/02/2009">Eclipse 3.4 &#038; le delta pack</a></li>
<li><a href="http://zeserveur.fr/blog/2009/08/17/forum-eclipse" rel="bookmark" title="17/08/2009">Forum Eclipse</a></li>
</ul>
<p><!-- Similar Posts took 70.415 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://zeserveur.fr/blog/2009/05/02/rcp-workspace/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
