Basé sur le trés bon outil de conception de document ReportMill, voici le premier outil de conception d’interface riches en Java. Un bouton « preview JFX » permet de basculer de l’interface ReportMill au JavaFXPad et de générer le JavaFX Script correspondant. C’est encore pas mal buggé mais l’initiative est intéressante et l’outil de base à déjà fait ses preuves.
Archive for the ‘Eclipse’ Category
Java sur la route du RIA
L’annonce de JavaFX a fait chauffer les feed reader, Sun se positionne sur le marché du RIA face à Mricosoft et Adobe et c’est une bonne chose. F3 (que j’ai déjà evoqué précédemment) qui est à l’origine de JavaFX Script est une trés bonne techno, et facilite le developpement d’applications Swing plus ergonomique. Mais n’oublions pas que Java est depuis le début en mesure d’offrir des interfaces riches déployées via un navigateur (RWA), c’est l’Applet. Apple l’a bien compris et a migré la bibliothèque graphique de NeXT en Swing depuis la version 5 de WebObjects. Java Web Start est arrivé par la suite proposant alors une facilité de déploiement aussi puissante que le navigateur pour les applications orientées desktop (RDA). Sun a donc été précurseur dans ce domaine mais l’Applet n’a pas séduit et c’est la que Silverlight et Flex marquent un point car ils disposent d’outils de conception visuelle (Expression Web, Flex Builder). Selon le CTO de Sun Bob Brewin cet outil devrait voir le jour rapidement [Ed Burnette interview Q6] : JavaFX Designer.
Contrairement à Simon Brocklehurst je pense qu’il est indispensable d’avoir cet outil et que la dualité graphiste/developeur est importante, je ne néglige pas les capacités artistiques des dévelopeurs et je pense même que concevoir une application avec un code propre c’est aussi de l’art, mais chacun son métier.
L’autre difficulté de Java c’est la taille du plugin, en effet celui-ci inclu le runtime de la plate-forme soit au moins 13 Mo. Un peu lourd pour un plugin la ou les autres ne dépassent pas 5 Mo. Mais cela aussi devrait s’améliorer.
Enfin n’oublions pas le mobile, domaine ou Java est bien plus présent que les autres acteurs et qui peut aussi faire la différence.
Chris Oliver n’a pas choisi XML pour JavaFX Script contrairement à Microsoft avec XAML. Il est vrai que la syntaxe de Java FX Script est plus séduisante et offre des avantages mais on perd alors les avantages d’XML en terme d’extension (XInclude, XPath, XSLT). Dommage que Sun n’est pas poussé plus en avant le framework JAXX qui propose une syntaxe XML pour définir des UI. Mais ne nous y trompons pas il est indéniable que JavaFX Script propose une syntaxe facilitant la création d’UI plus ergonomique.
Qu’en est il alors de SWT, Bob Brewin prétend que la syntaxe de JavaFX Script peut être étendu pour SWT [Ed Burnette interview Q5]. sachant que SWT est en cours d’adaptation à WPF, pourrait on avoir un XAML générant du SWT
? Cependant n’oublions pas que SWT n’est pas destiné au RWA mais uniquement au RDA. Les objectifs de Silverlight, Flex, JavaFX Script ne sont pas les mêmes que ceux de Eclipse RCP, NetBeans RCP, Apollo, et WPF. A noter que Silverlight n’utiliserais que 30% de WPF [5mn avec Kevin Gallo, Product Manager Silverlight par Didier Girard] contrairement à JavaFX qui s’appuie directement sur Java et donc toutes ses bibliothèques.
Ce qu’il est intéressant de constater c’est qu’Eclipse est présent à presque tous les niveaux :
- Flex Builder est basé sur Eclipse
- Plugin JavaFX Script
- Eclipse on WPF
- Eclipse on Swing
En choisissant Eclipse on est sûr de pas se tromper
.
Pour ceux qui voudrait comparer plus techniquement JavaFX Script et XAML je vous conseille les pads :
Application RCP fullscreen
Desktop ou Web, quel choix faire ? Je me pose la question en ce moment. Une des fonctionnalités spécifique qui fait la différence c’est le « fullscreen ». Sous IE comme sous Firefox une barre de scroll reste à droite, dommage. En SWT il est possible d’avoir un fullscreen complet et même de mettre la fenêtre en « toujours visible », ci-dessous le code pour le faire, il suffit simplement de specifier le style du Shell NO_TRIM pour supprimer la bordure et l’entete par defaut et ON_TOP pour mettre la fenêtre toujours visible (ça c’est pas faisable en Web à ma connaissance) :
<pre>
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setShellStyle(SWT.NO_TRIM | SWT.ON_TOP);
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Test FullScreen RCP");
}
@Override
public void createWindowContents(Shell shell) {
super.createWindowContents(shell);
shell.setMaximized(true);
}
}
</pre>
NetBeans et RAD
Roman Strobl nous présente une démo de la prochaine version de NetBeans, ce qui est intéressant c’est que l’on y voit la mise en application des JSR 296 Swing Application Framework et 295 Beans Binding. Rien de neuf il est vrai car déjà beaucoup de GUI designer faisait ca, mais cette fois-ci c’est entièrement open-source est issu de JSR. Dois-t-on attendre aussi cela d’Eclipse IDE à traver un plugin ? Selon moi l’outil de Rapid Application Development n’a d’avenir dans le sens où il facilite le développement pas quand il développe à la place du développeur. Je préfère l’approche Eclipse qui se profile avec un langage XML de conception XSWT dans lequel on intégre JFace Data Binding et au final Visual Editor qui génère ce XML et non du code. Bien que Visual Editor soit celui qui génére le code le plus propre, l’utilisation de XML réduit le code et le rend plus maintenable. De plus il permet de clairement séparer les métiers de conception graphique et de développement fonctionnel, à l’image de ce que fait Microsoft avec XAML au coeur des Expression Tools pour le designer et de Visual Studio pour le développeur ou encore Adobe avec MXML et FlexBuilder. A noter que le team NetBeans s’intéresse aussi à l’approche XML avec JAXX.
RAP et GWT
Comme John O’Shea je ne serais pas à EclipseCon mais j’aurais aimé assister aux sessions sur RAP. La communauté GWT grandi à vue d’oeil et les autres intitiatives comme RAP vont avoir du mal à sortir du lot. Il est intéressant de voir comment les composants pour GWT fleurissent, et il serait encore plus intéressant de pouvoir intégrer tous ces composants dans un environnement RCP AJAX. Une intégration de GWT dans RAP serait elle possible ? Surement difficile du fait du choix RWT/Innopract mais pourquoi pas.
Rich Ajax Platform
RAP est le nouveau projet Eclipse pour développer des applications RIA. Le principe est de développer des applications RIA comme on développe des applications RCP avec une bibliothèque de composants graphiques RWT basée sur l’API SWT et sur la bibliothéque Javascript qooxdoo. Le projet est encore en phase de validation, mais des démos sont disponibles (widget, workbench). Un alternative intéressante dans le même créneau que GWT.
Grid Eclipse Nebula widget
Le sous-projet Nebula d’Eclipse propose un composant tableur (Grid), pour une version alpha ce composant est déjà plutôt stable, je l’ai utilisé sans problèmes pour gérer les réservations de séances de cours de natation pour l’école de voile de La Flotte (CNPA). Il manque une couche JFace pour faciliter son utilisation et permettre une meilleure intégration avec le modèle, mais c’est en cours. Cependant je ne sais pas si un GridViewer sera trés utile car les besoins d’un tableur dans une application sont trés divers.
Ci-dessous un exemple de creation de Grid, avec entête de colonnes et de lignes, groupe de colonnes, gestion des évènements de réduction/extension des groupes de colonnes. Le but est d’afficher les horaires en colonne et les jours de la semaine en ligne. Chaque colonne est composée de 3 sous colonnes affichant la capacité totale de la séance, les places disponibles et les places vendues. La capacité totale étant la colonne désactivable :
public Grid createGrid(Listin_schedules, Composite in_composite) { // creation de la Grid Grid l_grid = new Grid(in_composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); // affichage de l'entête des colonnes l_grid.setHeaderVisible(true); // affichage de l'entête des lignes l_grid.setRowHeaderVisible(true); // activation de la sélection cellule par cellule l_grid.setCellSelectionEnabled(true); GC l_gc = new GC(l_grid); // parcours des horaires de natation for (ScheduleType l_scheduleType : in_schedules) { // creation d'un groupe de colonnes avec affichages dynamique des colonnes (TOGGLE) GridColumnGroup l_scheduleColumn = new GridColumnGroup(l_grid, SWT.TOGGLE); // nom de l'entete du groupe de colonne l_scheduleColumn.setText(l_scheduleType.getLabel()); final int l_colWidth = l_gc.stringExtent(l_scheduleType.getLabel() + " <<").x + 6; // initialisation de l'état de l'affichage (non étendu) l_scheduleColumn.setExpanded(false); // écoute de l'évènement d'extension l_scheduleColumn.addListener(SWT.Expand, new Listener() { public void handleEvent(Event event) { int l_width = l_colWidth / 3; if (l_width < 20) { l_width = 20; } for (GridColumn l_column : ((GridColumnGroup) event.widget).getColumns()) { l_column.setWidth(l_width); } } }); // écoute de l'évènement de reduction l_scheduleColumn.addListener(SWT.Collapse, new Listener() { public void handleEvent(Event event) { int l_width = l_colWidth / 2; if (l_width < 20) { l_width = 20; } for (GridColumn l_column : ((GridColumnGroup) event.widget).getColumns()) { if (l_column.isSummary()) { l_column.setWidth(l_width); } } } }); int l_width = l_colWidth / 2; if (l_width < 20) { l_width = 20; } // création des colonnes du groupe GridColumn l_capacity = new GridColumn(l_scheduleColumn, SWT.CENTER); l_capacity.setText("C"); l_capacity.setWidth(20); l_capacity.setCellSelectionEnabled(false); // affichage en mode réduit ? non l_capacity.setSummary(false); l_capacity = new GridColumn(l_scheduleColumn, SWT.CENTER); l_capacity.setText("V"); l_capacity.setWidth(l_width); l_capacity.setCellSelectionEnabled(false); // affichage en mode réduit ? oui l_capacity.setSummary(true); l_capacity = new GridColumn(l_scheduleColumn, SWT.CENTER); l_capacity.setText("L"); l_capacity.setWidth(l_width); l_capacity.setSummary(true); l_capacity.setData(l_scheduleType); } l_gc.dispose(); //l_grid.pack(true); return l_grid; }
Le peuplement de la Grid se fait en utilisant des GridItem
// création d'un GridItem l_gridItem = new GridItem(l_grid, SWT.CENTER); // nommage de l'entête de ligne l_gridItem.setHeaderText(l_headerText); // affectation d'une valeur à une colonne en utilisant l'index de celle-ci l_gridItem.setText(, );
Il est possible de fusionner les cellulles d'une même ligne
e.g.:
l_gridItem.setColumnSpan(0, in_grid.getColumnCount());
Et enfin pour récupérer la sélection :
Point[] l_selections = l_grid.getCellSelection();
for (Point l_selection : l_selections) {
// récupération du GridItem
l_grid.getItem(l_selection.y);
// récupération de la GridColumn
l_grid.getColumn(l_selection.x)
}

Editer des fichiers à distance
Une astuce pour éditer ses fichiers sur un serveur distant en utilisant RSE (Remote System Explorer) du projet DSDP (Device Software Development Platform Target Management).
Evolution des UI Forms
L’évolution des forms d’Eclipse est en cours, Kim Peter a posté des screenshots dans le bugReport pour nous mettre l’eau à la bouche. Cela devrait être implémenté pour la M5 et vous pourrez bientôt tester au niveau du package org.eclipse.ui.forms.examples. Les nouvelles fonctionnalités sont :
- zone de titre amélioré et optimisé (notamment pour Vista)
- menu contextuel sur le clic-droit
- drag and drop du titre
- barre d’onglets en haut
- message d’erreur dans la zone de titre (avec icones)
Mylar : Eclipse Plugin
Mylar est un plugin Eclipse pour la gestion de taches, l’avantage de Mylar et d’associer des contextes aux taches. Une statistique montre que les utilisateurs d’IDE passe 75% de leur temps sur le navigateur de projet, Mylar vient reduire cela en focalisant le navigateur uniquement sur les éléments (classes, méthodes, ressources…) concernant cette tache. De manière dynamique le contexte se construit au fur et à mesure de vos investigations sur un bug par exemple.
Un autre avantage important est d’être relié à des « bug tracker », actuellement seul bugzilla, jira et trac sont intégrés et il existe un intégrateur générique (encore en dev) dont Mantis.
