<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - epeios</title>
		<link>https://www.developpez.net/forums/blogs/22748-epeios/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 29 May 2026 18:02:45 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - epeios</title>
			<link>https://www.developpez.net/forums/blogs/22748-epeios/</link>
		</image>
		<item>
			<title><![CDATA['Epeios organizer' : un exemple d'interface desktop et web en C++.]]></title>
			<link>https://www.developpez.net/forums/blogs/22748-epeios/b1562/epeios-organizer-exemple-d-interface-desktop-web-cpp/</link>
			<pubDate>Tue, 09 Aug 2016 15:29:02 GMT</pubDate>
			<description>_* 
Introduction 
 
*_(Ce...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><u><b><br />
Introduction<br />
<br />
</b></u>(<i>Ce billet est issu d'un autre site, et a été reproduit ici sur la suggestion d'un modérateur</i>)<br />
<br />
Cette application a pour buts, d'une part, de tester la mise en œuvre de certains concepts de développement (<i>proof of concepts</i>), et, d'autre part, au fur et à mesure de son évolution, de mettre à disposition des fonctionnalités de prise de notes, d'agenda, de gestion d'adresses…<br />
<br />
Ces deux buts vont être détaillés dans les deux sections suivantes.<br />
<br />
Auparavant, voici quelques liens relatifs à cette application :<br />
<br />
<ul><li style="">Sources du logiciel (compilables sous <i>GNU/Linux</i> et autres systèmes <i>POSIX</i>, dont <i>OS X</i>) et binaires <i>Windows</i> (<i>XP SP3</i> et supérieurs) : <a href="http://q37.info/download/computing/apps/orgnzq/" target="_blank">http://q37.info/download/computing/apps/orgnzq/</a>,</li><li style="">démonstration en ligne de la version <i>web</i> : <a href="http://q37.info/xdh/orgnzq.html" target="_blank">http://q37.info/xdh/orgnzq.html</a>. </li></ul><br />
 Les sources peuvent aussi être consultés directement à l'adresse :<br />
<br />
<ul><li style=""><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/tip/apps/orgnzq" target="_blank">http://hg.savannah.gnu.org/hgweb/epe...ip/apps/orgnzq</a> pour l'application proprement dite,</li><li style=""><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/tip/tools/xdhcefq" target="_blank">http://hg.savannah.gnu.org/hgweb/epe.../tools/xdhcefq</a> pour l’utilitaire prenant en charge la technologie <i>XDHTML</i> en tant qu'application <i>desktop</i>,</li><li style="">h<a href="http://hg.savannah.gnu.org/hgweb/epeios/file/tip/tools/xdhbrwq" target="_blank">ttp://hg.savannah.gnu.org/hgweb/epeios/file/tip/tools/xdhbrwq</a> pour l’utilitaire prenant en charge la technologie <i>XDHTML</i> en tant qu'application <i>web</i>,</li><li style=""><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/tip/stable" target="_blank">http://hg.savannah.gnu.org/hgweb/epeios/file/tip/stable</a> pour le <i>framework</i>. </li></ul><br />
 Le lien sur la technologie <a href="http://www.developpez.net/forums/blogs/22748-epeios/b1561/l-utilisation-technologies-web-application-native/" target="_blank"><i>XDHTML</i></a> mise en œuvre dans cette application.<br />
<br />
<u><b>But n° 1 : <i>proof of concepts</i></b></u><br />
<br />
<b>Hors gestion de l'interface graphique</b><br />
<br />
Pour l'ensemble des binaires sous forme d'utilitaire avec interface en ligne de commande (<i>CLI</i>), ou déployés en tant que <i>daemon</i>, les objectifs suivants sont visés :<br />
<ul><li style="">développement uniquement en <i>C++</i>,</li><li style="">portabilité multi-plateformes et multi-architectures,</li><li style="">utilisation uniquement des bibliothèques <i>C/C++</i> standards et systèmes. </li></ul><br />
Par rapport à ces objectifs, cette application tourne sur <i>GNU/Linux</i> (et potentiellement toute plateforme <i>POSIX</i>), <i>OS X</i> et <i>Windows</i>, sous architecture <i>IA-32</i>, <i>AMD-64</i> et <i>ARM 32 bits</i>. Pour la compilation, seul un compilateur <i>C++</i>, ainsi que la commande <u>make</u>, sont nécessaires.<br />
<br />
<b>Gestion de l'interface graphique</b><br />
<br />
Pour la gestion de l'interface graphique, en plus des objectifs ci-dessus, sont visés les objectifs suivants (technologie <i><a href="http://www.developpez.net/forums/blogs/22748-epeios/b1561/l-utilisation-technologies-web-application-native/" target="_blank">XDHTML</a></i>) :<br />
<ul><li style="">utilisation des technologies <i>web</i> (<i>HTML5</i>, <i>CSS</i>…),</li><li style="">un seul et unique code <i>C++</i> pour les versions <i>web</i>, <i>desktop</i> et mobile,</li><li style="">modification de l'apparence de l'application sans avoir à modifier son code source, juste en modifiant des fichiers <i>XSL</i>. </li></ul><br />
Par rapport à ces objectifs, seules les versions <i>web</i> et <i>desktop</i> ont été développées. Hors version <i>desktop</i>, et notamment pour la version <i>web</i>, les mêmes observations que ci-dessus concernant les plateformes, les architectures et la compilation sont valables. L'adaptation de l'interface aux particularités des plateformes sur lesquelles elle tourne (<i>desktop</i>, <i>web</i> ou mobile), par rapport aux dimensions de l'affichage notamment, se fera au niveau des fichiers <i>XSL</i>.<br />
<br />
Le cœur de l'application prend la forme d'une bibliothèque dynamique, qui répond intégralement aux objectifs ci-dessus (notamment pas de dépendances hors bibliothèques <i>C/C++</i> standards et systèmes). Sa mise en œuvre en tant que version <i>desktop</i> est prise en charge par un utilitaire nommé <u>xdhcefq</u>, et sa mise en œuvre en tant que version <i>web</i>, par un utilitaire nommé <u>xdhbrwq</u> (qui, de ce fait, est assimilable à une <i>CGI</i>).<br />
<br />
<u>xdhcefq</u> s'appuie sur <i>Chromium Embedded Framework</i> (<a href="http://bitbucket.org/chromiumembedded/cef" target="_blank"><i>CEF</i></a>), et est donc soumis aux mêmes contraintes en termes de plateformes, architectures et compilation. Néanmoins, on peut envisager de développer l'équivalent de <u>xdhcefq</u> en s'appuyant sur <i>XULRunner</i> ou <i>QtWebKit</i>, par exemple, ou tout autre composant, présent ou à venir, proposant un moteur de rendu <i>web</i>. Le cœur de l'application n'aura pas à être modifié.<br />
<br />
<b>Réutilisabilité</b><br />
<br />
Un maximum de code développé dans le cadre de cette application est intégré dans un <i>framework</i> (publié sous licence <i>AGPL</i>), pour qu'il puisse être réutilisé pour d'autres applications. Les utilitaires <u>xdhcefq</u> et <u>xdhbrwq</u> notamment, qui permettent de déployer une application respectivement dans sa version <i>desktop</i> et sa version <i>web</i>, ne sont pas propres à cette application, mais seront utilisables par n’importe quelle application s'appuyant sur la technologie <i>XDHTML</i>.<br />
<br />
<u><b>But n° 2 : les fonctionnalités</b></u><br />
<br />
A terme, cette application proposera des fonctionnalités de prise de notes, d'agenda, de carnets d'adresse…, avec de notables différences avec l'existant.<br />
<br />
Une de ces différences, suite à la mise en œuvre de la technologie <i>XDHTML</i>, porte sur la facilité avec laquelle l'aspect de son interface pourra être modifié par toute personne familière avec les technologies <i>web</i> et <i>XSLT</i>. Une autre de ces différences portera sur l'adaptabilité de l'application. Ainsi, la gestion de l'authentification, des types de champs, et du stockage des données se fait par un système de <i>plugins</i>, ce qui facilitera la mise en œuvre d'alternatives.<br />
<br />
L'apparence de l'application est très rustique, d'une part parce que mes connaissances en <i>HTML</i> et <i>CSS</i> sont très limitées, et, d'autre part, parce qu'il est facile pour toute personne ayant des connaissances en <i>HTML</i>, <i>CSS</i> et <i>XSLT</i> de modifier cette apparence à sa guise, conformément à ce qui est annoncé dans la précédente section.<br />
<br />
Du fait que l'on se concentre actuellement sur le but n°1 (les <i>proof of concepts</i>) de l'application, ses fonctionnalités sont encore très limitées. Voici celles qui sont actuellement disponibles :<br />
<ul><li style="">prise en charge de plusieurs utilisateurs,</li><li style="">gestion d'onglets,</li><li style="">réorganisation des onglets par drag &amp; drop,</li><li style="">création d'une fiche,</li><li style="">modification d'une fiche en cliquant sur son entrée dans la liste,</li><li style="">création, dans une fiche, de champs <i>mono</i> ou <i>multi</i> de type :<br />
<ul><li style="">texte simple,</li><li style="">texte enrichi (avec mise en forme),</li><li style="">date,</li><li style="">heure, </li></ul><br /></li><li style="">réorganisation de l'ordre des champs d'une fiche par <i>drag &amp; drop</i>,</li><li style="">modification d'un champ d'une fiche en cliquant sur son libellé,</li><li style="">modification d'une entrée d'un champ <i>multi</i> en cliquant sur son contenu,</li><li style="">réorganisation des entrées d'un champ <i>multi</i> par <i>drag &amp; drop</i>,</li><li style="">et, accessoirement, affichage d'un <i>A propos…</i> avec la séquence de touches <i>Ctrl-Shift-A</i> (cela provoque l'ouverture d'une nouvelle page avec certains navigateurs ; il faudra revenir sur la page de l'application). </li></ul><br />
Une démonstration en ligne de l'application est accessible à : <a href="http://q37.info/xdh/orgnzq.html" target="_blank">http://q37.info/xdh/orgnzq.html</a>.<br />
<br />
Cette démonstration tourne sur un petit serveur placé derrière une box <i>ADSL</i>. De ce fait, l'application peut manquer de réactivité. Cette démonstration devrait tourner sur la plupart des navigateurs <i>web</i> graphique moderne, à la notable exception de <i>Microsoft Edge</i> (sauf s'il s'agit de la dernière version, celle fournie avec <i>Windows 10</i> version 1607). En outre, à cause de <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=98168" target="_blank">ceci</a>, certaines données ne s'afficheront pas correctement dans <i>Firefox</i>.<br />
<br />
Avec la version <i>desktop</i> de l'application, vous pouvez vous connecter directement au <i>backend</i> de la version <i>web</i> de démonstration en sélectionnant Moteur de traitement sur q37.info sur la première page de l'application. Si vous vous connectez avec le même compte sur la version de démonstration en ligne et sur la version <i>desktop</i>, les modifications opérées dans l'une seront naturellement visibles dans l'autre, et vice-versa.<br />
<br />
<u><b>Déploiement</b></u><br />
<br />
<b>GNU/Linux</b><br />
<br />
<i><b>Compilation</b></i><br />
<br />
En supposant que <i>g++</i> et <i>make</i> soient installés :<br />
<ul><li style="">Télécharger et décompresser les sources de l'application situés à : <a href="http://q37.info/download/computing/apps/orgnzq/" target="_blank">http://q37.info/download/computing/apps/orgnzq/</a>,</li><li style="">télécharger et décompresser la version de <i>CEF</i> de la branche 2704 correspondant à votre architecture (<i>Linux 32bit</i> ou <i>Linux 64bit</i>) située à <a href="http://cefbuilds.com/#branch_2704" target="_blank">http://cefbuilds.com/</a>,</li><li style="">créer une variable d'environnement nommée CEF pointant sur la racine du <i>package</i> de <i>CEF</i> (<u>export CEF=&lt;path to&gt;/cef_binary_3.2704...</u>),</li><li style="">se placer à la racine du <i>package</i> de l’application et lancer la commande <u>make</u>. </li></ul><br />
<i><b>Lancement de l'interface desktop</b></i><br />
<br />
Pour lancer l'interface <i>desktop</i>, se placer dans le répertoire frontend et lancer xdhcefq/xdhcefq -m=XDHTML/orgnzqxdh. A cause d'une particularité de la version <i>Linux</i> de <i>CEF</i>, il faut faire CTRL-C dans la console pour fermer l'application.<br />
<br />
<i><b>Lancement du backend comme daemon</b></i><br />
<br />
Pour lancer le <i>backend</i> en mode <i>daemon</i>, se placer dans <u>processing</u>, et lancer <u>dmnzq/tool/dmnzq backend/dmnzq.xprj</u>. Vous pouvez alors, dans l'interface <i>desktop</i>, sélectionner Moteur de traitement local pour se connecter à ce <i>backend</i>.<br />
<br />
<i><b>Lancement de l'interface web</b></i><br />
<br />
Dans le répertoire <u>frontend/xdhbrwq</u>, il y a un répertoire <u>htdocs</u> dont il faut placer le contenu à un endroit qui soit accessible à votre serveur <i>httpd</i>.<br />
<br />
Pour lancer la <i>CGI</i>, se placer dans le répertoire <u>frontend</u> et lancer <u>xdhbrwq/xdhbrwq XDHTML/orgnzqxdh</u>. Puis ouvrir un navigateur <i>web</i> et saisir l'adresse correspondant au fichier <u>orgnzq.html</u> du répertoire <u>htdocs</u> mentionné ci-dessus. Remplir les champs, et <b>sélectionner <u>localhost</u></b> à la place de <u>q37.info</u>. <br />
<br />
<b>Windows</b><br />
<br />
Les binaires fournis sont destinés à <i>Windows XP SP3</i> et supérieurs.<br />
<br />
Prendre à l'adresse <a href="http://q37.info/download/computing/apps/orgnzq/" target="_blank">http://q37.info/download/computing/apps/orgnzq/</a> et désarchiver le <i>package</i> correspondant aux binaires <i>Windows</i>. Une fois chargé et désarchivé, suivre les instructions données dans le chapitre <i>GNU/Linux</i> (sauf ceux relatifs à la compilation). Selon la version de <i>Windows</i>, les <u>/</u> (<i>slash</i>) devront peut-être être remplacés par des <u>\</u> (<i>backslash</i>).<br />
<br />
<b>Autres systèmes d'exploitation</b><br />
<br />
Pour les systèmes d'exploitation <i>POSIX</i> pour lesquels il n'y a pas de version de <i>CEF</i>, il n'est possible que de lancer le <i>backend</i> et la <i>CGI</i>. Suivre les instructions concernant <i>GNU/Linux</i>, en ignorant tout ce qui concerne <i>CEF</i>. La compilation de l'utilitaire <u>xdhcefq</u>, qui intervient en dernier, échouera naturellement, mais tout le reste devrait être compilé et pouvoir être lancé en suivant les instructions dans la section consacrée à <i>GNU/Linux</i>.<br />
<br />
Pour la version <i>OS X</i>, la procédure est détaillée <a href="http://q37.info/computing/epeios/tools/xdhcefq/home" target="_blank">ici</a>.<br />
<br />
<u><b>Les nouveautés</b></u><br />
<br />
Dans cette version, il y a deux principales nouveautés, détaillées dans les sections suivantes.<br />
<br />
<b>Nouveaux types de champs basés sur <i>jQuery</i></b><br />
<br />
La première nouveauté concerne la mise en œuvre de <i>widgets</i> basés sur <i>jQuery</i>, qui semblent jouir d'une certaine popularité. Ainsi, en plus du type <i>texte</i> de base, il y a trois nouveaux types, <i>texte enrichi</i>, <i>date</i> et <i>heure</i>, qui font appel à des <i>widgets</i> basés sur <i>jQuery</i>. Des <i>plugins</i> ont été développés pour gérer ces nouveaux types de champs. Un <i>plugin</i> n'est pas associé à un <i>widget</i> précis, mais à l’ensemble des <i>widget</i> manipulant des données de même nature. Ainsi, pour le <i>texte enrichi</i>, c'est le <i>widget</i> <a href="http://ckeditor.com/" target="_blank"><i>CKEditor</i></a> qui est utilisé, mais on pourrait utiliser <a href="http://jqueryte.com/" target="_blank"><i>jQuery TE</i></a> à la place, tout en utilisant le même <i>plugin</i>, les deux <i>widgets</i> manipulant des données au format <i>HTML</i>. Par contre, si l'on voulait utiliser un <i>widget</i> qui manipulerait des données au format <i>BBCode</i>, il faudrait développer un nouveau <i>plugin</i>.<br />
<br />
Concernant le type <i>texte enrichi</i> basé sur du <i>HTML</i>, les données correspondantes sont malheureusement mal affichées dans <i>Firefox</i> à cause de <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=98168" target="_blank">ceci</a>. Vu la popularité de ce navigateur, ainsi que le fait que la fonctionnalité incriminée soit considérée comme obsolète dans <i>XSLT</i> 2.0, j'ai cherché une alternative, mais n'est malheureusement encore rien trouvé. Depuis que la dernière version de <i>Microsoft</i> <i>Edge</i>, celle fournie avec la dernière mise à jour de <i>Windows 10</i> (version 1607), est capable d'afficher correctement la version <i>Web</i> de cette application, cela fait de <i>Firefox</i> le seul navigateur Web graphique moderne à poser problème… <br />
<br />
<b>Les onglets</b><br />
<br />
La seconde nouveauté concerne les onglets. Cette application devant ultérieurement offrir la possibilité de créer des champs de type <i>fiche</i>, c'est-à-dire d'insérer dans une fiche une référence à une ou plusieurs autres fiches (faire du relationnel en quelque sorte), l'idée est d'avoir, d'une part, la fiche en cours de saisie, celle dans laquelle on voudrait référencer une ou plusieurs fiches, dans un onglet et, d'autre part, une liste de fiches, parmi lesquelles on sélectionnerait les fiches à référencer, dans un autre onglet. Bien sûr, ce n'est qu'un des usages envisageables des onglets.<br />
<br />
Accessoirement, on peut réorganiser les onglets par <i>drag &amp; drop</i>.</blockquote>

]]></content:encoded>
			<dc:creator>epeios</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/22748-epeios/b1562/epeios-organizer-exemple-d-interface-desktop-web-cpp/</guid>
		</item>
		<item>
			<title>De l’utilisation des technologies web dans une application native.</title>
			<link>https://www.developpez.net/forums/blogs/22748-epeios/b1561/l-utilisation-technologies-web-application-native/</link>
			<pubDate>Tue, 09 Aug 2016 15:22:31 GMT</pubDate>
			<description>* 
Introduction* 
 
(Ce...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><br />
Introduction</b><br />
<br />
(<i>Ce billet est issu d'un autre site ; je le reproduis ici car un billet à venir y fait référence</i>).<br />
<br />
Ce billet présente un projet portant sur le développement en <i>C++</i> d'interfaces graphiques, qui a la particularité d'offrir à l'utilisateur un moyen simple de personnaliser au maximum l'interface d'une application sans avoir à en modifier le code source. Mettre les sources d'une application à disposition de l'utilisateur pour qu'il puisse l'adapter à ses besoins, c'est bien, mais lui offrir la possibilité de la personnaliser sans avoir à modifier ces sources (surtout qu'en l’occurrence, il s'agit de sources <i>C++</i>), c'est mieux.<br />
<br />
Ce projet est issu d'un ancien projet qui s'appuyait sur <i>XULRunner</i> ; cela expliquera certains choix qui ont été fait. Cependant, un <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=1006402" target="_blank">bug</a> rédhibitoire (pour moi) de <i>XULRunner</i>, et des doutes concernant la pérennité de <i>XULRunner</i>, m'ont poussé à l'abandonner, et à explorer d'autres technologies en vue de le remplacer.<br />
<br />
<b><i>HTML5</i></b><br />
<br />
A plusieurs reprises, on m'avait vanté les qualités de <i>Qt</i> ; je résolus donc d'essayer ce dernier. Mais je n'ai pas persévéré dans cette voie, leur approche ne me convenant pas. Je précise que je cherchais uniquement une technologie pour gérer les interface graphiques, ce qui était l'unique usage que j'avais de <i>XULRunner</i>, bien qu'il soit capable de beaucoup plus ; pour toute la partie traitement, j'utilisais un autre <i>framework</i>.<br />
<br />
Coïncidence, à peu près au même moment fût publiée la version finalisée de <i>HTML5</i>, et j’entrepris donc d'explorer cette piste. Au final, pour l'usage que je comptais en faire, <i>HTML5</i> s'est révélé être très proche de <i>XUL</i> (langage dont <i>XULRunner</i> est le moteur de rendu) ; je pouvais donc réutiliser pas mal d'outils que j'avais développés dans le cadre de mon utilisation de <i>XULRunner</i>.<br />
<br />
<b><i>Chromium Embedded Framework</i></b><br />
<br />
Comme mon but était de trouver des technologies pour développer des applications natives, il me fallait trouver un moyen d'<i>exécuter</i> <i>HTML5</i> dans ce contexte. Comme j'avais déjà <i>Qt</i> d’installé, j'ai essayé <i>QtWebKit</i>, mais certaines limitations de ce composant, ainsi que le fait de recourir à tout l'environnement de développement <i>Qt</i> pour n'utiliser que ce composant m’apparaissait totalement disproportionné, je me suis mis à la recherche d'un équivalent.<br />
<br />
Qui dit <i>HTML(5)</i>, dit <i>JavaScript</i>. Néanmoins, <i>C++</i> étant mon langage de prédilection, je choisis de délaisser<i> JavaScript</i> au profit de ce dernier. Restait, comme écrit, à trouver le moyen d’exécuter <i>HTML5</i> dans un contexte natif. Ce moyen, je l'ai trouvé avec <i>Chromium Embedded Framework</i> <i>(<a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a>)</i>.<br />
<br />
<b><i>xdhcefq</i></b><br />
<br />
Un problème que j'avais lorsque j'utilisais <i>XULRunner</i>, c'est que ses fichiers d’en-tête <i>polluaient</i> les sources de mes applications. Pour éviter ce désagrément, je résolus de développer un utilitaire qui prenait en charge toutes les interactions avec <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i>, le code proprement dit de traitement de l'interface graphique étant déporté dans une bibliothèque, bibliothèque dont le code source n'aura donc pas à inclure de fichier d'en-tête de <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i>. Cet utilitaire, c'est <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>.<br />
<br />
A noter que les exemples d’utilisation qui sont donnés pour <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i> s'appuient sur son <i>API</i> <i>C++</i>. Comme l'utilisation de cet <i>API</i> nécessitait la compilation de bibliothèques supplémentaires, j'ai préféré utiliser l'<i>API</i> <i>C</i>, qui ne nécessitait pas ces bibliothèques supplémentaires. Mais la mise en œuvre de <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i> est nettement plus compliquée en passant par la version <i>C</i> de l'<i>API</i>. Cependant, comme je n'ai à me préoccuper de <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i> que lors du développement de <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>, et que, pour le développement des applications proprement dites, je n'aurais plus à me préoccuper de l'<i>API</i> (<i>C</i> ou <i>C++</i>) de <i><a href="http://bitbucket.org/chromiumembedded/cef" target="_blank">CEF</a></i> (ce qui est, je le rappelle, justement l'objet de <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>), j'ai préféré recourir à l'<i>API</i> <i>C</i>, car elle moins contraignante.<br />
<br />
<b><i>xdhdq</i></b><br />
<br />
L'ensemble des technologies concernant la gestion d'interfaces graphiques dans le <i>framework</i> <i>Epeios</i> est regroupé sous le vocable <i><a href="http://q37.info/computing/epeios/xdhtml/" target="_blank">XDHTML</a></i>. Ci-après, vous allez trouver les principes de base de cette technologie. Pour rendre cela plus concret, une petite application triviale, s'appelant <i><a href="http://q37.info/computing/epeios/apps/xdhdq/" target="_blank">xdhdq</a></i>, a été développée. Cette application prend la forme d'une bibliothèque dynamique, qui est chargée par <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>. C'est de cette application que les exemples ci-dessous sont tirés.<br />
<br />
Si vous désirez approfondir, <i><a href="http://q37.info/computing/epeios/apps/xdhdq" target="_blank">xdhdq</a></i> est librement téléchargeable à partir de sa page dédiée. Elle vient avec <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>, qui est indispensable pour la faire tourner. Elle est disponible pour <i>GNU/Linux</i>, <i>OS X</i> et <i>Windows</i>, avec architecture <i>IA-32</i> et <i>AMD64</i>.<br />
<br />
<b>Génération des composants <i>HTML</i> de l'interface graphique</b><br />
<br />
Le code <i>HTML</i> de l'interface n'est pas directement généré par l'application, mais est le résultat d'une transformation <i>XSL</i> sur des données <i>XML</i> fournies par l'application. Les fichiers <i>XSL</i> utilisés pour la transformation sont spécifiés dans le <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/xdhdqxdh.xcfg" target="_blank">fichier de configuration</a> de l’application. Des exemples de tels fichiers <i>XSL</i> sont visibles <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/" target="_blank">ici</a> (ce sont ceux suffixés par <u>Layout.xsl</u>).<br />
<br />
<b>Gestion de l'accessibilité des éléments</b><br />
<br />
Pour gérer <i>l'accessibilité</i> d'un élément (c'est-à-dire le fait qu'un élément ait un attribut comme hidden ou disabled de défini ou non) se fait à l'aide d'un élément et d'un attribut maison (respectivement <u>xdh-cast</u> et <u>data-xdh-cast</u>). L'attribut <u>data-xdh-cast</u> est affecté aux éléments concernés lors de l'opération décrite juste au-dessus, et la définition des éléments <u>xdh-cast</u> se fait, comme précédemment, à partir d'une transformation <i>XSL</i> sur des données <i>XML</i> générées par l’application. Les fichiers <i>XSL</i> utilisés pour cette transformation sont également spécifiés dans le <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/xdhdqxdh.xcfg" target="_blank">fichier de configuration</a> de l’application, et des exemples de tels fichiers sont également visibles <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/" target="_blank">ici</a> (ce sont ceux suffixés par Casting.xsl).<br />
<br />
Voici un exemple de déclaration (issu de <u><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/PrologLayout.xsl" target="_blank">PrologLayout.xsl</a></u>) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #009900;"><span style="color: #0000ff;">&lt;select</span> <span style="color: #339933;">data-xdh-cast</span>=<span style="color: #FF0000;">&quot;PredefinedProjectsCast&quot;</span><span style="color: #0000ff;">&gt;</span></span>...<span style="color: #009900;"><span style="color: #0000ff;">&lt;/select<span style="color: #0000ff;">&gt;</span></span></span></pre>
</div><br />
Et la définition correspondante (issue de <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/PrologCasting.xsl" target="_blank"><u>PrologCasting.xs</u>l</a>):<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:template</span> <span style="color: #339933;">match</span>=<span style="color: #FF0000;">&quot;ProjectType&quot;</span><span style="color: #0000ff;">&gt;</span></span>
 <span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:variable</span> <span style="color: #339933;">name</span>=<span style="color: #FF0000;">&quot;Type&quot;</span> <span style="color: #339933;">select</span>=<span style="color: #FF0000;">&quot;.&quot;</span><span style="color: #0000ff;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:choose<span style="color: #0000ff;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:when</span> <span style="color: #339933;">test</span>=<span style="color: #FF0000;">&quot;$Type='New'&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;xdh-cast</span> <span style="color: #339933;">id</span>=<span style="color: #FF0000;">&quot;PredefinedProjectsCast&quot;</span> <span style="color: #339933;">kind</span>=<span style="color: #FF0000;">&quot;Hide&quot;</span><span style="color: #0000ff;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;/xsl:when<span style="color: #0000ff;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:when</span> <span style="color: #339933;">test</span>=<span style="color: #FF0000;">&quot;$Type='Predefined'&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;xdh-cast</span> <span style="color: #339933;">id</span>=<span style="color: #FF0000;">&quot;PredefinedProjectsCast&quot;</span> <span style="color: #339933;">kind</span>=<span style="color: #FF0000;">&quot;Plain&quot;</span><span style="color: #0000ff;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;/xsl:when<span style="color: #0000ff;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;xsl:when</span> <span style="color: #339933;">test</span>=<span style="color: #FF0000;">&quot;$Type='Remote'&quot;</span><span style="color: #0000ff;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #0000ff;">&lt;xdh-cast</span> <span style="color: #339933;">id</span>=<span style="color: #FF0000;">&quot;PredefinedProjectsCast&quot;</span> <span style="color: #339933;">kind</span>=<span style="color: #FF0000;">&quot;Hide&quot;</span><span style="color: #0000ff;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #0000ff;">&lt;/xsl:when<span style="color: #0000ff;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #0000ff;">&lt;/xsl:choose<span style="color: #0000ff;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #0000ff;">&lt;/xsl:template<span style="color: #0000ff;">&gt;</span></span></span></pre></td></tr></table></pre>
</div><br />
<b>Gestion d’événements</b><br />
<br />
La gestion d’événement se fait grâce aux attributs <u>data-xdh-onevent</u>, pour définir un seul gestionnaire d’événement, ou <u>data-xdh-onevents</u> (avec un <u>s</u> à la fin), pour en définir plusieurs. Les événements déclenchent une action définie dans un <i>callback</i> écrit en <i>C++</i> et pourvu d'un identifiant unique. La définition d'un gestionnaire d’événement consiste donc à indiquer un événement (<u>mouseleave</u>, <u>click</u>...) ainsi que l'identifiant de l'action à lui associer. Par exemple (tiré de <u><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/MainLayout.xsl" target="_blank">MainLayout.xsl</a></u>) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #009900;"><span style="color: #0000ff;">&lt;fieldset</span> <span style="color: #339933;">data-xdh-onevents</span>=<span style="color: #FF0000;">&quot;(mouseenter|HideFacetiousButton)|(mouseleave|ShowFacetiousButton)&quot;</span><span style="color: #0000ff;">&gt;</span></span></pre>
</div><br />
On peut omettre la spécification de l’événement, auquel cas ce sera l’événement par défaut qui sera utilisé (généralement <u>click</u>).<br />
<br />
Il existe certains événements prédéfinis, qui peuvent prendre plusieurs paramètres. Par exemple (issu de <u><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/PrologLayout.xsl" target="_blank">PrologLayout.xsl</a></u>) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #009900;"><span style="color: #0000ff;">&lt;button</span> <span style="color: #339933;">data-xdh-onevent</span>=<span style="color: #FF0000;">&quot;(OpenFile|DisplayProjectFilename|(#plgSelectProjectFile#|.xprj))&quot;</span><span style="color: #0000ff;">&gt;</span></span></pre>
</div><br />
Un clic (événement qui n'est pas spécifié, car c'est l’événement par défaut pour cet élément) sur ce bouton provoquera l'affichage d'une sélecteur de fichier (action prédéfinie <u>OpenFile</u>), avec, pour titre, le texte correspondant à l'identifiant <u>plgSelectProjectFile</u> (qui est défini dans la section Locale du <a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/xdhdqxdh.xcfg" target="_blank">fichier de configuration</a>), et <u>.xprj</u> comme filtre d'extension. Une fois le sélecteur fermé, l’action <u>DisplayProjectFilename</u> (qui est une action classique, c'est-à-dire qui correspond à un <i>callback</i> <i>C++</i>) est lancée.<br />
<br />
<b>Composants <i>HTML</i> et <i>JQuery</i></b><br />
<br />
De nombreux composants <i>HTML</i> d'interface graphique s'appuient sur <i>JQuery</i>, et, de ce fait, ont toujours quasiment le même code <i>JavaScript</i> d’instanciation. Pour éviter d'avoir à taper ce code, on peut recourir à l'attribut <u>data-xdh-widget</u>, par exemple de la manière suivante (tiré de <u><a href="http://hg.savannah.gnu.org/hgweb/epeios/file/951697d1519c/apps/xdhdq/frontend/XDHTML/XSL/FieldsLayout.xsl" target="_blank">FieldsLayout.xsl</a></u>) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code xml :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #009900;"><span style="color: #0000ff;">&lt;textarea</span> <span style="color: #339933;">data-xdh-widget</span>=<span style="color: #FF0000;">&quot;ckeditor|enterMode : CKEDITOR.ENTER_BR, linkShowTargetTab: false, language: '#fieldsLanguage#', startupFocus : true,|val\(\)|ckeditor\(\).editor.focus\(\)&quot;</span><span style="color: #0000ff;">&gt;</span></span></pre>
</div><br />
Cela crée un composant <u><a href="http://ckeditor.com/" target="_blank">ckeditor</a></u>, avec certains paramètres propres à ce composant (situés entre le premier et le second <u>|</u> ; voir le site du composant pour leurs significations). Comme la récupération du contenu de ce composant, ainsi que la manière de lui donner le <i>focus</i>, ne se fait pas de façon classique, le code <i>JavaScript</i> adéquat est précisé (respectivement <u>val()</u> et <u>ckeditor().editor.focus()</u> ; les <u>\</u> servent à échapper les caractères <u>(</u>et <u>)</u>).<br />
<br />
<b>Et maintenant ?</b><br />
<br />
Il y a principalement deux projets en cours relatifs à la technologie <i><a href="http://q37.info/computing/epeios/xdhtml/" target="_blank">XDHTML</a></i>. Le premier consiste en une véritable application, à titre de <i>POC</i> évoluée, mais pleinement fonctionnelle et d'une réelle utilité. Le second consiste à développer l'équivalent de <i><a href="http://q37.info/computing/epeios/tools/xdhcefq/" target="_blank">xdhcefq</a></i>, mais pour les applications <i>web</i>. L'idée et d'avoir un seul et même code <i>C++</i>, et pour la version native, et pour la version <i>web</i> d'une application (il restera néanmoins possible, si désiré, d'adapter l'interface pour l'une ou l'autre type d'application).</blockquote>

]]></content:encoded>
			<dc:creator>epeios</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/22748-epeios/b1561/l-utilisation-technologies-web-application-native/</guid>
		</item>
	</channel>
</rss>
