940 likes | 1.13k Views
Plasticité des Interfaces. utilise les répertoires: ../../LANGDOC/COURS ./EXEMPLES / ../LANGDOC/XUL. XUL XBL XPCOM XPI. Web GUI Mozilla Project. www.polytech.unice.fr~pfz. pfz@polytech.unice.fr. Bien s'installer sous XUL/Firefox. user_pref( "nglayout.disable_xul_cache", true);
E N D
Plasticité des Interfaces utilise les répertoires: ../../LANGDOC/COURS ./EXEMPLES/ ../LANGDOC/XUL XUL XBL XPCOM XPI Web GUI Mozilla Project www.polytech.unice.fr\~pfz pfz@polytech.unice.fr
Bien s'installer sous XUL/Firefox user_pref( "nglayout.disable_xul_cache", true); user_pref( "nglayout.disable_xul_fastload", true); sous FF (Mozilla) • désactiver le cache XUL, dans Profiles/..defaut/prefs.js sous Gecko 1.9 (FF3, Thunderbird 3) • Xul distant est intégré • les "manifest chrome" sont à placer dans le répertoire chrome/ sous Gecko 2.0 (FF4+, Thunderbird 3.3) • Xul distant n'est pas supporté par défaut • les "manifest chrome" sont à déclarer dans chrome.manifest installer l'extension XUL Remote Manager et ajouter "<file>" à la "whitelist" ATTENTION - RDF XUL : pas d'espaces dans les paths; par ex "C:\Documents and Settings\Bureau"
Sommaire du Cours Introduction - Web GUI & Clients "Riches" Chap I - Mozilla & XPFE/XUL: Historique & Standards Chap II - XUL: les bases- Box & Widgets Chap III - XUL: le style - Rendu avec CSS Chap IV - XUL: Dynamique avec JS+DOM Chap V - XUL: Génération de Contenu avec RDF Chap VI - XUL: Les Widgets avec XBL Chap VII - XUL: Modularité avec les "overlays" Chap VIII - XUL: Communication avec AJAX & XPCOM Chap IX - XUL: et les Autres Chap X- XUL: Services Web avec SOAP Chap XI - XUL: Distribution & Installation Annexe I - RDF & OWL Annexe II - AJAX 24/09/2014 Transparent 3
Références • Web • cours "XML" SI-4 http:www.polytech.unice.fr/~pfz/document.html • Mozilla Development Center https://developer.mozilla.org/Fr • XULPlanet http://www.xulplanet.com/ • XULFR.org http://mozillazine-fr.org/annuaire-mozilla/fr/developpeurs/ • xul.fr http://www.xul.fr/ • XULforum http://www.xulforum.org/site/ • Biblio: • Xul Tutorial (pdf) • Rapid Application development with Mozilla • ouvrages disponibles.
n-Tier Architecture for Web light Client ApI HTML CSS DHTML, JS AJAX Client CGI Servlet, JSP Presentation Layer PHP, ASP XML XSL C, Java, C++ Application (Business) Layer Application (Business) Layer Application (Business) Layers ApI Hypertrophy SQL Data Layer Data Bases Apache Server 24/09/2014 Transparent 5
RIA Architecture Structure Style Application Application Application Datas Data Base Server Rich Client XML, RDF PHP, ASP Networking http, AJAX CSS, XSL Contrôle & Web Services ApI JS, DOM SOAP, WSDL ApI ApI ApI SQL ApI 24/09/2014 Transparent 6
"Light Client" vs "Rich Client" (R.I.A.) Rich Client XML XSL "import" of fonctionalities dynamic interface transform HTML, CSS DHTML, JS, AJAX reduce the back&forth needs metadata multi-formats SQL Data Bases 24/09/2014 Transparent 7
Web GUI main concepts • Layout • Boxes or Canvas or both ? • Attribute Rules vs Programmation • Structure vs Computation ? • Widgets • Event Programming & Animation • Data Generation & "Pouring" • Media-type Processing • Networking • Design
State of "my"Art j.b.X. (just before Xul) Web GUI based on Navigators XML + XSL + CSS as input with XSLT producing (X)HTML + CSS JS with actions changing via DOM XML source or XSL source Dynamic refresh of the XML rendering Dynamic changes on widgets of the GUI "à la main", en transpirant ! .xsl .xsl 24/09/2014
XML as metadatas for Web GUI SPRY (Adobe Labs) using XML to describe "contents" using JS & DOM to generate wIdgets & "contents" using AJAX to access/modify "contents" from RDF, XML to PHP/SQL using XML/RDF to describe "contents" using XSLT from XML to SQL exporting from SQL to XML XSLT using XML/RDF to describe "contents" using XSLT to generate wIdgets (DHTML, JS) using XSLT to generate/modify "contents" (HTML) using XSLT to generate/modify style (CSS) • XUL (Mozilla Foundation) • using RDFL to describe "contents" • using XUL to generate WIdgets & "contents" • using AJAX to access "contents" • using JASON, XML-RPC, WSDL for "networking" and "web services" 24/09/2014
XML as metadatas & XSLT RefsWeb TechnosWeb XML rdf JS Exam LD 2010 CSS XSLT Pfz's State of the Art HTML XSLT .xsl XSL XML .xsl 24/09/2014
Web Reference Browser xml dtd xsd html css css metadata .xml de XML vers HTML5+CSS3 via xsl 24/09/2014 Transparent 12
Doc Example Browsers TechnosWeb .xml dtd xsd html css css css js metadata xml via xsl de XML vers HTML5+CSS3+JS 24/09/2014 Transparent 13
XML (meta) modèle de données (ERD ) 1,? 1,* 1,* n,m • <Show • version • > uses: n,m used_by: n,m • <Categorie • type • path • > • <Code • titre • keywords • file • version • > • <Description • libellé* • img? • > <Auteur> Type Keyword Keyword Path Keyword Keyword Aut Keyword 24/09/2014 Transparent 14
R.I.A. - XML as metadatas & SPRY XML rdf Rich Client XML rdf HTML SPRY CSS, XSL JS DHTML AJAX DHTML 24/09/2014
Spry: framework JS pour dHTML avec une assistance compatibleavec HTML, XHTML, CSS XML, etDialectes XSLT, XUL • sur le Web • http://labs.adobe.com/technologies/spry/ • http://labs.adobe.com/wiki/index.php/Spry • http://www.adobe.com/devnet/spry/ • http://labs.adobe.com/technologies/spry/demos/index.html 24/09/2014 Transparent 16 • Librairie (libre) JS par Adobe Labs • Conception • Création assistée de Widgets • Effets dynamiques avec JS • Définition de "Data Sets" à partir XML/RDF • Génération de contenus HTML • Gestion des Interfaces/HTTP • Extensible ("Open") • Implémentation • (X)HTML + "Include" JS • DOM • XML • CSS • HTTP + AJAX • intégration complète avec DW CS
Spry -Schéma & Utilisation versions Spry 1.4 1.5 1.6 <html> <head> <style> ….. </style> </head> <body> <div id="TP1" class="TabbedPanels"> <ul class="TabbedPanelsTabGroup"> <li class="TabbedPanelsTab" tabindex="0">cours 1</li> <li class="TabbedPanelsTab" >cours 2</li> <li class="TabbedPanelsTab" >cours 3</li> </ul></div> </body></html> <head> <script src="SpryAssets/SpryTabbedPanels.js" type="text/javascript"> </script><script src="SpryAssets/SpryMenuBar.js"… /> </script><script src="SpryAssets/xpath.js"… /> </script><script src="SpryAssets/SpryData.js" … /> <link href="SpryAssets/SpryTabbedPanels.css" rel="stylesheet" … /> <link href="SpryAssets/SpryMenuBarHorizontal.css" … /> <link href="SpryAssets/SpryMenuBarVertical.css"… /> </head> interpréteur JS Dom HTML généré Code Partiel 24/09/2014 Transparent 17
Spry - Génération de XML DATA SETs <head> </script><script src="SpryAssets/xpath.js"… /> </script><script src="SpryAssets/SpryData.js" … /> </head> <html> <head> <script type="text/javascript"> var dsBib = new Spry.Data.XMLDataSet("bib.xml", "Bib/Article"); dsBib .setColumnType("Date", "date"); </script> </head> <body> <div spry:region="dsBib"> <table> <tr> <th>Titre</th> <th>Date</th> <th spry:sort="@ref">ref</th> </tr> <tr spry:repeat="dsBib" spry:setrow="dsBIb"> <td>{Title}</td> <td>{Date}</td> <td>{@ref}</td> </tr> </table> </body></html> XPath Code Partiel mis à plat "flatening" JS Object 24/09/2014 Transparent 18
Spry: Démos 24/09/2014 Transparent 19
Comment un Arbre (une forêt, en fait) ...? XML +XSL XML Dom XML CSS XSL Dom XSL Parseur XMLs avec une démarche "structurée"
Comment un Arbre ... ? XML +XSL Dom XML XML CSS Dom XSL XSL Parseur XMLs Dom ...peut en cacher un Autre
Peut en cacher un Autre ... ? XML +XSL Dom XML XML CSS Dom XSL XSL JS Parseur XMLs Dom ... qui contrôle (modifie) les 2 premiers Peut en cacher un Autre
Goto the Best of Xul XulPeriodic Table • Xul Element Table • Dynamic DOM • cursor coordinates • add (copy) Buttons • check from input • delete menu item • scroll To Visible • Slide-show (anything) with XBL • XUL with SVG • Pfz's Tutorial • Xul with RDF • XUL with XPCOM
Chap I - Mozilla & XPFE/XUL Historique StandardsLexiqueRéférences Architecture XPFE
I amMosaic Killer Historique & Standards Projet Mozilla • code Netscape => Open Source (1998) • Gecko: moteur de "rendu" HTML 4.0 • XPFE: "Cross Platform Front-End" • Suite Mozilla 1.7 & 1.8 => SeaMonkey • XUL - XML User interface Langage XUL utilise les Standards du W3C • XML – eXtensible Markup Language • HTML 4, 5 & XHTML • CSS 2 & CSS3 - Cascading Style Sheets • DTD • DOM & JS 1.5 (ECMAScript) • RDF - Resource Description FrameWork • RSS, SOAP, AJAX, SVG Objectif: • Développement d'Interfaces clients portables • Clients "riches" entre "légers" et "lourds" 1998 2008
XUL & XPFE XUL Events XUL XBL LDAP SOAP POP files Sockets SVG XML DOMs HTML JS CSS XPCOM RDF XPConnect
Architecture XPFE: le 4ième Tiers • Contenu • XUL supporte (X)HTML, XML, • RDF/XML • MathML & SVG Présentation • XUL supporte CSS 2 • XUL supporte les formats image • XUL utilise des thèmes ("skins") XUL - Conteneur • XUL - la description du "layout" des conteneurs (box) • automatisation avec RDF et les templates • XUL utilise des locales (DTD, localisation) CONTENT TREE XUL XBL XML RDF • Comportement (Contrôle) • XUL utilise DOM & JS1.5 • XBL ("Bindings") pour décrire le comportement des "widgets" LAYOUT BOX TREE Why only one Tree, when we may have Two ? • XPFE - Communication • XUL supporte AJAX • XPCOM pour les Services Web,etc. via XPConnect
/Mozilla Firefox /chrome Mozilla Structure & Components • Packages "Content" • .xul pour les "windows" et "elements" browser.xul • .js pour les fichiers de script browser.js • contents.rdf • Packages "Skin" • fichiers de style .css: browser.css • fichiers images • Packages "Locale" • fichiers .text (;dtd) pour les textes à afficher • en-US.jar fr-FR.jar browse.dtd le répertoire "chrome/" file.manifest l'url chrome://global/skin/ extensions + privilèges Utilisation "pointilleuse"
Chap II - XUL - les Bases IntroBoxes & Spacers Texts & Buttons ToolBar & Menu Group & Tabboxes Lists & Grids Panels & Splitters Stack & Decks Layout Tree
my First XUL ... <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="window.css" type="text/css"?> <window id="findfile-window" title="XUL-Essai1" orient="horizontal" xmlns=http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul > <vbox> <hbox flex="1" maxheight="80" align="top"> <button label="Gauche" style="min-width: 100px;" flex="1"/> <spacer flex="2"/> <button label="Droite" style="min-width: 100px;" flex="1"/> </hbox> <spacer flex="1" maxheight="50"/> <description> Entrez votre critère pour démarrer la recherche. </description> <spacer flex="1" maxheight="50"/> <button label="HELLO" oncommand="alert('hello World!');"/> </vbox> </window> ...canalsosay "hello World" <window>
my Boxes <window ....> <vbox> <hbox flex="2" maxheight="80" align="top"> </hbox> <spacer flex="1" maxheight="50"/> <box flex="2" orient="vertical" pack="center"> </box> <spacer flex="1" maxheight="50"/> </vbox> </window> <box> <hbox> <vbox> <spacer> id, class, style orient width, heigth, min- , max- flex pack align
my Buttons are Boxes <window ....> <vbox> <hbox> <button id="ok" label="OK" maxwidth="20" /> <spacer maxwidth="10"/> <button label="ALERT" style="min-width: 100px;" oncommand="alert ('Le bouton a été pressé !');"/> <checkbox label="Voir les images" checked="true"/> </hbox> <radio label="ROUGE" selected="true" id="red" /> <button id="newW" class="dialog" label="Click ou Type W" image="IMAGES/newW.png" disabled="false" accesskey="W" oncommand='window.open("window.css","_new");' /> </vbox> </window> <button> <checkbox> <radio> <radiogroup> id, class, style label, crop image disabled, selected, checked accesskey oncommandonclick
myTexts are also Boxes <window ....> <vbox> <description> Donner son profil puis se loger ci-dessous. </description> <hbox> <textbox id="profil" multiline="true" value="compléter votre profil ici"/> </hbox> <hbox> <label control="login" value="Login :"/> <textbox id="login"/> </hbox> <hbox> <label control="pass" type="password" value="Mot de passe:"/> <textbox id="pass" maxlength="12" /> </hbox> <label value="Envoyer" onclick="send();"/> </vbox> </window> <label> <description> <textbox> id, class, style value control type multiline maxlength onclick
all myElements are Boxes ! XulPeriodic Table <tabbox> <tabpanel> <tabpanels> <tabs> <tab> <iframe> <browser> <splitter> <gripy> <tree> <template> <listbox> <listitem> <listhead> <listheader> <listcols> <listcol> <listcell> <menulist> <caption> <image> <progressbar> <toolbox> <toolbar> <toolbarbutton> <menubar> <menu> <menupopup> <menuitem> <popupset> <arrowscrollbox> <grid> <rows> <row> <columns> <column> <groupbox> <radiogroup> <stack> <deck>
Layout: la solution Mozilla A Layout Tree • les noeuds sont "calculés" en fonction du content tree et des sources CSS et XBL • les éléments XUL sont typés "box", avec 4 propriétés: [x, y, width, heigth] • les objets hidden n'y sont pas (plus) • les objets collapse y sont avec [0,0,0,0] • A Content Tree • à partir des éléments (balises) de HTML, XML, SVG , etc. • avec l'ordre partiel du source (arborescence) • idem pour les éléments XUL, XBL, et les templates RDF • modification dynamique via les DOMs respectifs CONTENT TREE XUL XBL XML RDF not isomorphic ! LAYOUT BOX TREE
Les secrets de XUL • Architecture XPFE ouverte • Compatibilité avec les standards XML, DOM, CSS • Deux Arborescences distinctes pour Contenu et Présentation • Un type parent "Box" pour tous les objets graphiques • Avantages • existence d'un méta-modèle commun (XML) • existence de deux modèles explicites pour le layout et les contenus • validation (DTD, XSD) • accès et modification via le DOM • modification dynamique (incrémentale) via JS XUL c'est le XML des GUI !
2 Arbres, sinon Rien ! • Héritage, Masquage, Cascading • CSS properties: font, color, etc. • Box properties: pos, size • (X)HTML defaults • DOM Navigation "Orderings" • child(), sibling() • first(), last() • Modifications • par sous arbres: XSL, RDF, XBL • eval. incrémentales ("refresh") <elem> <elem> <elem>
myTrees <window ....> <tree flex="1"> <treecols> <treecol id="sender" label="Sender" flex="1"/> <treecol id="subject" label="Subject" flex="2"/> </treecols> <treechildren> <treeitem> <treerow properties="makeItRed"> <treecell label="joe@somewhere.com"/> <treecell label="Top secret plans"/> </treerow> </treeitem> <treeitem> <treerow> <treecell label="mel@whereever.com"/> <treecell label="Let's do lunch"/> </treerow> </treeitem> </treechildren> </tree> </window> CSS ::-moz- <tree> <treecols> <treecol> <treechildren> <treeitem> <treerow> <treececll>
myhierachicalTrees <window ....> <tree rows="6"> <treecols> <treecol id="fname" label="First Name" primary="true" flex="3"/> <treecol id="lname" label="Last Name" flex="7"/> </treecols> <treechildren> <treeitem container="true" open="true"> <treerow> <treecell label="Guys"/> </treerow> <treechildren> <treeitem> <treerow> <treecell label="Bob"/> <treecell label="Carpenter"/> </treerow> </treeitem> <treeitem> <treerow> <treecell label="Jerry"/> <treecell label="Hodge"/> </treerow> </treeitem> </treechildren> </treeitem> </treechildren> </tree> </window> container primary open
<tree enableColumnDrag="true" flex="1"> <treecols> <treecol id="runner" label="Runner" flex="2" persist="width ordinal hidden"/> <splitter class="tree-splitter"/> <treecol id="city" label="City" flex="2" persist="width ordinal hidden"/> <splitter class="tree-splitter"/> <treecol id="starttime" label="Start" flex="1" persist="width ordinal hidden"/> <splitter class="tree-splitter"/> <treecol id="endtime" label="End" flex="1" persist="width ordinal hidden"/> </treecols> <treechildren> <treeitem> <treerow> <treecell label="Joshua Granville"/> <treecell label="Vancouver"/> <treecell label="7:06:00"/> <treecell label="9:10:26"/> </treerow> </treeitem> <treeitem> <treerow> <treecell label="Robert Valhalla"/> <treecell label="Seattle"/> <treecell label="7:08:00"/> <treecell label="9:15:51"/> </treerow> </treeitem> </treechildren> </tree> myremembering state Trees enableColumnDrag persist
Chap III - XUL et le Style (X)HTML CSS avec -moz les "skins"
avec html <?xml version="1.0" encoding="iso-8859-1"?> <window id="findfile-window" title="XUL-Essai1" orient="horizontal" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" > <vbox> <html:table> <htm:tr> <htm:td> <button label="Gauche" style="min-width: 100px;" /> </html:td> <html:td> <button label="Droite" style="min-width: 100px;" /> </html:td> </html:tr> </html:table> <html:p> Entrez votre critère pour démarrer la recherche. </html:p> <button label="HELLO" oncommand="alert('Bonjour!');"/> </vbox> </window> pREFIXE OBLIGATOIRE possible, mais pas conseillé
avec CSS • CSS 2 & CSS3 • button • #special-button • .bigbuttons • button.bigbuttons • toolbar > button • toolbar > button.bigbuttons • button.bigbuttons:hover • button#special-button:active • box[orient="horizontal"] • CSS Mozillatrees • ::-moz-tree-cell • ::-moz-tree-row • ::-moz-tree-column • ::-moz-tree-line • ::-moz-tree-indentation • CSS Mozilla • -moz-opacity • -moz-border-radius • -moz-image-region • -moz-box-orient tree.xul <treerowproperties="makeItRed"> treechildren::-moz-tree-row(makeItBlue) { background-color: red; } tree.css
/Doc&Sett/pfz /Application data /Profiles/chrome /Doc&Sett/pfz /Application data /Profiles/chrome myskinS window > box { background-color: #0088CC;} menubar, menupopup, toolbar, tabpanels { background-color: lightblue; border-top: 1px solid white; border-bottom: 1px solid #666666; border-left: 1px solid white; border-right: 1px solid #666666; } caption { background-color: lightblue; } tab:first-child { -moz-border-radius: 4px 0px 0px0px; } tab:last-child { -moz-border-radius: 0px 4px 0px 0px; } #opensearch { list-style-image: url("chrome://editor/skin/icons/btn1.gif"); -moz-image-region: rect(48px 16px 64px 0); -moz-box-orient: vertical; } • customizes ton FF userChrome.css menubar { background-color: red; } • créer un thème "skin" findfile.css
Chap IV - XUL Dynamique, JS + DOM XUL DOM Changer les Styles
XUL + DOM + JS my XUL isDynamic <window ... > <script> function addButton() { var aBox = document.getElementById("aBox"); var button = document.createElement("button"); button.setAttribute("label","A Button"); aBox.appendChild(button); } </script> <box id="aBox" width="200"> <button label="Add" oncommand="addButton();"/> </box> </window> • créer, copier des boutons • tester, modifier des listes • gérer les "events" • animation • etc.
Chap V - XUL Génération de Contenu RDF/XML(new FF3) <tree> <templates> <rule> <query> <action> TextScan
Template + RDF <window …> <tree flex="1" width="200" height="200" datasources="zoo.rdf" ref="http://www.zoo.com/all-animals"> <treecols> <treecol id="name" /> <treecol id="species" /> </treecols> <template> <rule> <treechildren> <treeitem uri='rdf:*'> <treerow> <treecell label="rdf:http://www.zoo.com/rdf#name"/> <treecell label="rdf:http://www.zoo.com/rdf#species"/> </treerow> </treeitem> </treechildren> </rule> </template> </tree> zoo.rdf <RDF:RDF xmlns:Z="http://www.zoo.com/rdf#"> <RDF:Description Z:specimens="101" rdf:about="http://www.zoo.com/mammals"> <Z:name> Lion </Z:name> </RDF:Description>
<window …> <tree flex="1" datasources="zoo.xml" ref="*" querytype="xml" > <treecols> <treecol id="name" /> <treecol id="spec" /> </treecols> <template> <query expr="about" /> <action> <treechildren> <treeitem uri='?'> <treerow> <treecell label="?name"/> <treecell label="?species"/> </treerow> </treeitem> </treechildren> </action> </template> </tree> New FF3: Template + XML (external) zoo.xml <zoo> <about name="Arachnids"> … </about> <about name="Birds"> <about name=" " species=" "> </about> </about> </zoo> 24/09/2014 Transparent 50
<window …> <tree flex="1" datasources="#ZOO" ref="*" querytype="xml" > <treecols> <treecol id="name" /> <treecol id="spec" /> </treecols> <template> <query expr="about" /> <action> <!-- idem --> </action> </template> </tree> New FF3: Template + XML (internal) <zoo id="ZOO"> <about name="Arachnids"> … </about> <about name="Birds"> <about name=" " species=" "> </about> </about> </zoo> 24/09/2014 Transparent 51