Développement de clientsriches : Plateforme Eclipse             Chapitre 2 : Boîtes à outilsComposants de Visualisation (V...
Licence                                   Creative Commons                                       Contrat Paternité        ...
Organisation du cours sur JFace : partie Viewers                        Composants de visualisation avec SWT              ...
JFace : généralités                        Nous avons vu que la boîte à outils SWT fournissait un                        e...
JFace : généralités                        JFace a pour fonction de simplifier les développements en                      ...
JFace : généralités                        Pré-requis : connaître Java et les principes de SWT                        Plan...
JFace : installation                        La librairie JFace fait partie intégrante du projet Eclipse, et               ...
JFace : configuration …                        La configuration présentée ci-dessous décrit l’utilisation du              ...
JFace : configuration … (suite)                        Etape 2 : ajout des dépendances aux librairies JFace               ...
JFace / Viewers : introduction                        Typiquement en SWT, vous créez le composant, ajoutez des            ...
JFace / Viewers : introduction                          L’implémentation proposée par JFace de MVC se rapproche           ...
JFace / Viewers : introduction                           La boîte à outils SWT fournit des composants de                  ...
JFace / Viewers : introduction                        Le package org.eclipse.jfaces.viewers fournit un ensemble           ...
JFace / Viewers : introduction                                                    TreeViewer                        TableV...
JFace / Viewers : introduction                                                CheckboxTableViewer                         ...
JFace / Viewers : composants natifs                        Nous allons nous intéresser à présenter, avant la description  ...
JFace / Viewers : Table                        Un composant Table est construit suivant le principe des                   ...
JFace / Viewers : Table                        La classe TableColumn décrit une colonne                          TableColu...
JFace / Viewers : Table                            Exemple : une table et ses colonnes                        public class...
JFace / Viewers : Table                        La classe TableItem représente une ligne d’un tableau et peut              ...
JFace / Viewers : Table                            Exemple : une table, ses colonnes et ses lignes                        ...
JFace / Viewers : Table                        Le composant Table fournit un ensemble de méthodes pour                    ...
JFace / Viewers : Table                            Exemple (suite) : une table, ses colonnes et ses lignes                ...
JFace / Viewers : Tree                        Un composant Tree est construit suivant le principe des                     ...
JFace / Viewers : Tree                           La classe TreeColumn décrit une colonne et possède les                   ...
JFace / Viewers : Tree                        La classe TreeItem désigne une ligne contenant des cellules                 ...
JFace / Viewers : Tree                            Exemple : un arbre et ses noeuds                        public class Tre...
JFace / Viewers : Tree                            Exemple (suite) : un arbre, ses colonnes et ses noeuds                  ...
JFace / Viewers : Tree                        Le composant Tree fournit un ensemble de méthodes pour                      ...
JFace / Viewers : Tree                            Exemple (suite) : un arbre, ses colonnes et ses noeuds                  ...
JFace / Viewers : Viewer                        Un composant Viewer est organisé autour de trois concepts                 ...
Person                                                        JFace / Viewers : Viewer               - name : String      ...
JFace / Viewers : Viewer                         Hiérarchie des principaux Viewers                          En charge de g...
JFace / Viewers : un exemple pour débuter                        Exemple : TableViewer et ses trois concepts              ...
JFace / Viewers : un exemple pour débuter                            Exemple (suite) : TableViewer et ses trois concepts  ...
JFace / Viewers : un exemple pour débuter                        Exemple (suite) : TableViewer et ses trois concepts      ...
JFace / Viewers : un exemple pour débuter                            Exemple (suite) : TableViewer et ses trois concepts  ...
JFace / Viewers : ContentProvider                        Le rôle du ContentProvider est de fournir une adaptation         ...
JFace / Viewers : ContentProvider                        Selon le Viewer utilisé, l’API fournit des ContentProvider       ...
JFace / Viewers : ContentProvider                        Nous fournissons ci-dessous un récapitulatif facilitant le choix ...
JFace / Viewers : ContentProvider                            Hiérarchie des principales interfaces ContentProvider        ...
JFace / Viewers : ContentProvider                        L’interface IStructuredContentProvider peut être considérée      ...
JFace / Viewers : ContentProvider                         Exemple : TableViewer et IStructuredContentProvider             ...
JFace / Viewers : LabelProvider                            Nous avons vu que le rôle du ContentProvider était de          ...
JFace / Viewers : LabelProvider                        Un LabelProvider générique est défini par l’interface              ...
JFace / Viewers : LabelProvider                        L’interface ILabelProvider permet d’afficher une image et un       ...
JFace / Viewers : LabelProvider                        L’interface ITableLabelProvider fournit du texte/image pour        ...
JFace / Viewers : LabelProvider                        Depuis l’API Eclipse 3.3, il est possible d’associer à un viewer   ...
JFace / Viewers : LabelProvider                         Exemple : un LabelProvider pour toutes les colonnes               ...
JFace / Viewers : LabelProvider                        Pour la gestion de l’affichage de l’en-tête de la table il faut    ...
JFace / Viewers : LabelProvider                        Les LabelProviders peuvent être différents pour chaque             ...
JFace / Viewers : LabelProvider                        Selon le composant ColumnViewer utilisé (TableViewer ou            ...
JFace / Viewers : LabelProvider                        Un TableViewerColumn fournit une seule méthode permet-             ...
JFace / Viewers : LabelProvider                        Différents constructeurs pour la classe TableViewerColumn          ...
JFace / Viewers : LabelProvider                            Exemple : un LabelProvider pour chaque colonne                 ...
JFace / Viewers : LabelProvider                        Un objet ViewerColumn manipule un LabelProvider de type            ...
JFace / Viewers : LabelProvider                        CellLabelProvider est abstraite, deux classes concrètes sont       ...
JFace / Viewers : LabelProvider                        Exemple (suite) : LabelProvider pour chaque colonne                ...
JFace / Viewers : LabelProvider                         Exemple (suite) : LabelProvider pour chaque colonne               ...
JFace / Viewers : LabelProvider                         Exemple (suite) : LabelProvider pour chaque colonne               ...
JFace / Viewers : LabelProvider                        Les LabelProvider proposés actuellement ne permettent              ...
JFace / Viewers : LabelProvider                          Exemple : dessiner le contenu des cellules                       ...
JFace / Viewers : LabelProvider                            Exemple (suite) : dessiner le contenu des cellules             ...
JFace / Viewers : TableViewer                        Nous avons vu que le composant TableViewer permettait                ...
JFace / Viewers : TableViewer                        Le principe du « Lazy Loading » est de ne charger en mé-             ...
JFace / Viewers : TableViewer                        Pour utiliser ILazyContentProvider, il faut connaître la taille      ...
JFace / Viewers : TableViewer                            Exemple : TableViewer et ILazyContentProvider                    ...
JFace / Viewers : TreeViewer                        Le composant TreeViewer permet d’encapsuler le composant              ...
JFace / Viewers : TreeViewer                        L’interface ITreeContentProvider est utilisée par un viewer de        ...
JFace / Viewers : TreeViewer                        Exemple : TreeViewer et ITreeContentProvider                        pu...
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Composants de visualisation (Viewer) avec JFace
Upcoming SlideShare
Loading in...5
×

Composants de visualisation (Viewer) avec JFace

6,628

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,628
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
386
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Composants de visualisation (Viewer) avec JFace

  1. 1. Développement de clientsriches : Plateforme Eclipse Chapitre 2 : Boîtes à outilsComposants de Visualisation (Viewer) avec JFace Mickaël BARON - 2007 (Rév. Janvier 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à lIdentique 2.0 Francekeulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr JFace I - M. Baron - Page 2
  3. 3. Organisation du cours sur JFace : partie Viewers Composants de visualisation avec SWT Manipulation du modèle par le ContentProvider Manipulation du rendu par le LabelProvider Tour complet de tous les viewers Sélection Des informations complémentaires peuvent être trouvées sur mon blog Edition keulkeul.blogspot.comkeulkeul.blogspot.com Techniques de Tri et de Filtre Tous les exemples du cours sont disponibles directement à l’adresse mbaron.developpez.com/eclipse/jface1 JFace I - M. Baron - Page 3
  4. 4. JFace : généralités Nous avons vu que la boîte à outils SWT fournissait un ensemble de composants graphiques de base JFace s’appuie sur la bibliothèque SWT pour fournir une API de développement plus évoluée et plus structurée Les principaux concepts proposés par JFace une abstraction des composants natifs SWTkeulkeul.blogspot.com une séparation de la partie modèle et de la vue (modèle MVC) des composants graphiques additionnels (Dialog, Preferences, …) une utilisation plus fine des ressources (Action, ImageDescriptor, …) JFace I - M. Baron - Page 4
  5. 5. JFace : généralités JFace a pour fonction de simplifier les développements en SWT, sans pour autant masquer totalement SWT Nous verrons dans la suite que JFace ne cache pas complètement SWT dans les sens où il est possible d’accéder directement aux composants SWT Combinée à SWT, JFace est utilisée pour le développement d’applications pour la plateforme Eclipse La plateforme Eclipse s’appuie sur JFace et SWTkeulkeul.blogspot.com L’extension et l’encapsulation de SWT La boîte à outils connectée aux composants natifs JFace I - M. Baron - Page 5
  6. 6. JFace : généralités Pré-requis : connaître Java et les principes de SWT Plan du cours JFace Les composants de visualisation (TableViewer, …) (Partie 1) Les boîtes de dialogue évoluées (Partie 2) Les préférences utilisateur (Partie 2) La gestion de ressources (ImageDescriptor, Action, …) (Partie 2) La création d’assistants (Wizards) (Partie 2) Utilisation tant que possible des nouveautés proposées par l’API Eclipse 3.3keulkeul.blogspot.com Différents articles et exemples www.eclipse.org/articles/Article-TreeViewer/TreeViewerArticle.htm wiki.eclipse.org/index.php/JFaceSnippets keulkeul.blogspot.com (mon blog perso) JFace I - M. Baron - Page 6
  7. 7. JFace : installation La librairie JFace fait partie intégrante du projet Eclipse, et les binaires sont disponibles dans la distribution Eclipse Les packages JFace sont préfixés par org.eclipse.jface Les viewers : org.eclipse.jface.viewers Les boîtes de dialogues : org.eclipse.jface.dialogs Les préférences : org.eclipse.jface.preference Pour SWT, il faut Les ressources : org.eclipse.jface.resource télécharger l’archive Les assistants : org.eclipse.jface.wizard sur le site d’Eclipse Les sources sont également fournies avec la distributionkeulkeul.blogspot.com Eclipse Tout comme pour la boîte à outils SWT, il est possible de créer une application Java reposant sur JFace (hors application Eclipse RCP ou plugin) JFace I - M. Baron - Page 7
  8. 8. JFace : configuration … La configuration présentée ci-dessous décrit l’utilisation du package viewers pour un simple projet Java Etape 1 : création d’un projet Javakeulkeul.blogspot.com Une autre configuration basée sur l’utilisation de développement de plug-in (via le PDE) sera décrite dans la partie plug-in Eclipse JFace I - M. Baron - Page 8
  9. 9. JFace : configuration … (suite) Etape 2 : ajout des dépendances aux librairies JFace org.eclipse.core.commands org.eclipse.equinox.app org.eclipse.jface org.eclipse.swtkeulkeul.blogspot.com Les librairies ajoutées dans le chemin de construction ne sont pas exhaustives. Il s’agit d’un minimum pour utiliser une TableViewer JFace I - M. Baron - Page 9
  10. 10. JFace / Viewers : introduction Typiquement en SWT, vous créez le composant, ajoutez des données et appelez des méthodes De ce fait il devient difficile de mettre à jour proprement les données des composants Une approche MVC (Model, View, Control) est fournie par la surcouche JFace Elle permet la séparation « stricte » entre le modèle de données et le modèle graphique Ajouter plus facilement des écouteurs (listeners) sur le modèle dekeulkeul.blogspot.com données pour notifier de ces changements Brancher plusieurs vues pour un même modèle Accéder aux autres modèles (sélection, édition, …) « Customiser » le rendu des données JFace I - M. Baron - Page 10
  11. 11. JFace / Viewers : introduction L’implémentation proposée par JFace de MVC se rapproche plus du Document/Vue ou Model/View (le contrôleur étant associé à la vue) Principe de l’architecture Le modèle est l’élément principale du composant La ou les vue(s) du composant sont abonnées au modèle La modèle notifie ses vues suite à des modifications La partie Documentkeulkeul.blogspot.com La partie Modèle V (Notification des vues (En Java le vue et le après modification) contrôleur ne sont pas M dissociés) C JFace I - M. Baron - Page 11
  12. 12. JFace / Viewers : introduction La boîte à outils SWT fournit des composants de visualisation qui s’appuient sur des composants du système Ces composants n’ont pas été étudiés dans le cours SWT puisqu’il semble plus important de les présenter avec leur « habillage MVC » Liste des composants de visualisation : Table : organisation des données dans un tableau Tree : organisation des données sous forme d’arbre List : organisation des données sous forme de listekeulkeul.blogspot.com A noter que le composant TableTree n’est pas un composant natif comme peut l’être Table ou Tree Le composant TableTree est un composant de type custom obtenu par composition d’un Tree et d’une JFace I - M. Baron - Page 12 Table
  13. 13. JFace / Viewers : introduction Le package org.eclipse.jfaces.viewers fournit un ensemble de classes pour l’encapsulation des composants SWT Les composants de visualisation sont appelés des Viewers Le nom des classes est composé du nom de l’encapsulation SWT suivi de « Viewer » Dans la suite de ce cours, nous étudierons les composants : TreeViewer : un arbre TableViewer : un tableau ListViewer : une listekeulkeul.blogspot.com TableTreeViewer : un tableau avec un arbre sur la première colonne CheckboxTableViewer : un tableau avec des éléments à cocher CheckboxTreeViewer : un arbre avec des éléments à cocher ComboViewer : une boite à valeurs JFace I - M. Baron - Page 13
  14. 14. JFace / Viewers : introduction TreeViewer TableViewerkeulkeul.blogspot.com TableTreeViewer (TreeViewer avec colonnes) JFace I - M. Baron - Page 14
  15. 15. JFace / Viewers : introduction CheckboxTableViewer ComboViewer ListViewer CheckboxTreeViewerkeulkeul.blogspot.com JFace I - M. Baron - Page 15
  16. 16. JFace / Viewers : composants natifs Nous allons nous intéresser à présenter, avant la description des viewers, les composants natifs de visualisation Composants présentés : Table, Tree, ComboBox Nous ferons uniquement une présentation des concepts nécessaires pour la suite (plus de détail voir API SWT) L’intérêt ? Même si les viewers fournissent une abstraction des composants natifs, il est souvent utile d’accéder aux composants natifs pour : Modifier le nom d’une colonne (TableColumn)keulkeul.blogspot.com Modifier l’agencement d’un viewer (setLayoutData(…)) Pourquoi pas au niveau du cours SWT ? Redondant avec cette partie car au final il est plus flexible d’utiliser les composants de visualisation par l’API JFaceJFace I - M. Baron - Page 16
  17. 17. JFace / Viewers : Table Un composant Table est construit suivant le principe des composants SWT Table(Composite p, int style) : construction à partir d’un parent et d’un style Différents styles disponibles SINGLE, MULTI, FULL_SELECTION, HIDE_SELECTION : concerne le type de sélection autorisée (FULL_SELECTION = ligne complète) CHECK : la première colonne contient une boîte à cocher VIRTUAL : pour afficher de nombreuses lignes (à voir plus tard) Un composant Table est composé de colonnes décrites par la classe TableColumnkeulkeul.blogspot.com de lignes décrites par la classe TableItem TableColumn et TableItem hérite de la classe Item qui rappelons-le (voir cours SWT) s’occupe de gérer une image et un texte JFace I - M. Baron - Page 17
  18. 18. JFace / Viewers : Table La classe TableColumn décrit une colonne TableColumn(Table parent, int style) : préciser l’objet parent Table et un style Le style donne la position du contenu : LEFT, RIGHT et CENTER Un objet TableColumn peut être vu comme un composant label dans le sens où il peut afficher du texte et une image Les valeurs à afficher sont transmises par l’intermédiaire des modifieurs setText(String p) et setImage(Image i) De nombreuses autres informations peuvent être renseignées setMoveable/Resizable(boolean p) : colonne déplaçablekeulkeul.blogspot.com setResizable(boolean p) : colonne redimensionnable setToolTipText(String p) : modifier valeur de la bulle d’aide setWidth(int width) : modifier largeur de la colonne addSelectionListener(SelectionListener sl) : ajouter un écouteur sur la sélection JFace I - M. Baron - Page 18
  19. 19. JFace / Viewers : Table Exemple : une table et ses colonnes public class TableColumnExample { public TableColumnExample() { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Exemple de la Table SWT"); shell.setLayout(new FillLayout()); Table table = new Table(shell, SWT.NONE); table.setHeaderVisible(true); Construction de trois colonnes for (int i = 0; i < 3; i++) { TableColumn column = new TableColumn(table, SWT.NONE); column.setWidth(100); Fixe la largeur column.setText("Colonnne " + i); column.setMoveable(true); column.setResizable(true); }keulkeul.blogspot.com ... } Les colonnes sont ... déplaçables et } redimensionnables TableColumnExample.java Il manque les du projet TableExamples cellules !! JFace I - M. Baron - Page 19
  20. 20. JFace / Viewers : Table La classe TableItem représente une ligne d’un tableau et peut être vu comme un ensemble de labels (cellule = Label) TableItem(Table parent, int style) : préciser le parent Table et un style Pas de style particulier, mais tout autre style qui s’applique à un Label Possibilité de modifier pour chaque cellule du TableItem le texte et l’image setImage(int i, Image im) ou setImage(Image[] im) setText(int i, String s) ou setText(String[] es) Contrairement à TableColumn, TableItem fournit des méthodes pour modifier l’apparence d’une cellulekeulkeul.blogspot.com setForeground(int i, Color c) et setBackground(int i, Color c) : modifi- cation de la couleur de fond et du dessus setFont(int i, Font f) : modification de la fonte pour une cellule donnée setChecked(boolean b) : état de la boite à cocher uniquement pour la première colonne JFace I - M. Baron - Page 20
  21. 21. JFace / Viewers : Table Exemple : une table, ses colonnes et ses lignes public class TableRowColumnExample { Construction de 50 public TableRowColumnExample() { lignes ... for (int i = 0; i < 50; i++) { new TableItem(table, SWT.NONE); } Couleur de fond des cellules différente selon la « parité » TableItem[] items = table.getItems(); for (int i = 0; i < items.length; i++) { int backgroundColor = (i % 2 == 0 ? SWT.COLOR_CYAN : SWT.COLOR_RED); items[i].setBackground(Display.getDefault().getSystemColor(backgroundColor)); for (int j = 0 ; j < 3 ; j++) { items[i].setText(j, "cellule " + j + ":" + i); } } Modification du contenu de la ...keulkeul.blogspot.com } cellule de la ligne i de la colonne j ... } TableRowColumnExample.java du projet TableExamples JFace I - M. Baron - Page 21
  22. 22. JFace / Viewers : Table Le composant Table fournit un ensemble de méthodes pour Modifier la sélection setSelection(int index) : sélectionne un seul élément setSelection(int[] indices) : sélectionne un ensemble d’élément Accéder aux TableColumn et TableItem TableColumn getColumn(int i) : accesseur sur un TableColumn TableItem getItem(int i) : accesseur sur un TableItem TableItem getItem(Point p) : accesseur sur un TableItem à un emplacement donné (x et y relatif au composant Table) Customiser l’apparence graphique setHeaderVisible(boolean s) : affiche ou pas les en-têtes des colonneskeulkeul.blogspot.com setLinesVisible(boolean s) : affiche ou pas les lignes de la table Effectuer des traitements sur le contenu setTopIndex(int i) : positionne l’élément i en tête de la table clear(int i) : efface le contenu d’une ligne JFace I - M. Baron - Page 22
  23. 23. JFace / Viewers : Table Exemple (suite) : une table, ses colonnes et ses lignes public class AdvancedTableRowColumnExample { Active la sélection multiple public AdvancedTableRowColumnExample() { et la sélection de la ligne ... complète Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION); ... table.setHeaderVisible(true); Positionner la ligne 20 table.setLinesVisible(true); en haut de la table Sélectionne les lignes 22 et 25 table.setTopIndex(20); int[] selectedIndex = {22, 25}; table.setSelection(selectedIndex); table.clear(23); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch())keulkeul.blogspot.com display.sleep(); } display.dispose(); Efface le contenu de la } ligne 23 (suppression ... du texte) } AdvancedTableRowColumnExample du projet TableExamples JFace I - M. Baron - Page 23
  24. 24. JFace / Viewers : Tree Un composant Tree est construit suivant le principe des composants SWT Tree(Composite p, int style) : construction à partir d’un parent et d’un style Les différents styles disponibles sont les mêmes que ceux utilisés pour le composant Table Un composant Tree est composé de colonnes décrites par la classe TreeColumnkeulkeul.blogspot.com de lignes décrites par la classe TreeItem TreeColumn et TreeItem hérite de la classe Item qui (voir cours SWT) s’occupe de gérer une image et un texte JFace I - M. Baron - Page 24
  25. 25. JFace / Viewers : Tree La classe TreeColumn décrit une colonne et possède les mêmes fonctionnalités que la classe TableColumn Plusieurs colonnes Un arbre contenant des noeuds sur la colonne 1 Chaque item désigne une ligne (1 nœud + plusieurs cellules)keulkeul.blogspot.com Depuis la version 3.1, possibilité d’avoir plusieurs colonnes pour un composant Tree, ceci permet de remplacer le compo- sant TableTree devenu « déprécié » JFace I - M. Baron - Page 25
  26. 26. JFace / Viewers : Tree La classe TreeItem désigne une ligne contenant des cellules Chaque cellule peut être vue comme un ensemble de labels Une cellule du TreeItem contient un nœud de l’arbre les autres sont considérées comme des cellules d’une table A la différence des TableItem, les TreeItem peuvent contenir d’autres TreeItem (un nœud peut contenir des sous nœuds) TreeItem(Tree parent, int style) : préciser le parent Tree et un style TreeItem(TreeItem parentItem, int style) : précise le nœud parent Possibilité de modifier pour chaque cellule du TreeItem lekeulkeul.blogspot.com texte et l’image Possibilité de déplier le contenu d’un nœud setExpanded(boolean expanded) : si expanded est vrai, le nœud est déplié JFace I - M. Baron - Page 26
  27. 27. JFace / Viewers : Tree Exemple : un arbre et ses noeuds public class TreeExample { public TreeExample() { ... Les nœuds Tree myTree = new Tree(shell, SWT.FULL_SELECTION); parents x4 final int ROW = 4; for (int i = 0; i < ROW; i++) { TreeItem current = new TreeItem(myTree, SWT.NONE); Les sous nœuds current.setText("Noeud " + i); parents x3 final int SUB_ROW = 3; for (int j = 0; j < SUB_ROW; j++) { TreeItem subCurrent = new TreeItem(current, SWT.NONE); subCurrent.setText("Sous Noeud " + j); } } shell.open(); ...keulkeul.blogspot.com } ... } TreeExample du projet TreeExamples JFace I - M. Baron - Page 27
  28. 28. JFace / Viewers : Tree Exemple (suite) : un arbre, ses colonnes et ses noeuds public class TreeColumnExample { public TreeColumnExample() { ... Tree myTree = new Tree(shell, SWT.FULL_SELECTION); TreeColumn column = new TreeColumn(myTree, SWT.NONE); column.setText("Colonne 1"); column.setResizable(true); column.setMoveable(true); column.setWidth(100); Création des colonnes ... final int ROW = 4; for (int i = 0; i < ROW; i++) { TreeItem current = new TreeItem(myTree, SWT.NONE); current.setText("Noeud " + i); final int SUB_ROW = 3; for (int j = 0; j < SUB_ROW; j++) { TreeItem subCurrent = new TreeItem(current, SWT.NONE); subCurrent.setText("Sous Noeud " + j);keulkeul.blogspot.com subCurrent.setText(1, "valeur 1 " + j); subCurrent.setText(2, "valeur 2 " + j); } } shell.open(); ... } TreeColonneExample du projet ... } TreeExamples JFace I - M. Baron - Page 28
  29. 29. JFace / Viewers : Tree Le composant Tree fournit un ensemble de méthodes pour Modifier la sélection setSelection(TreeItem index) : sélectionne un seul élément setSelection(TreeItem[] indices) : sélectionne un ensemble d’élément Accéder aux TableColumn et TableItem TreeColumn getColumn(int i) : accesseur sur un TreeColumn TreeItem getItem(int i) : accesseur sur un TreeItem Customiser l’apparence graphique setHeaderVisible(boolean s) : affiche ou pas les en-têtes des colonnes setLinesVisible(boolean s) : affiche ou pas les lignes de la tablekeulkeul.blogspot.com Effectuer des traitements sur le contenu setTopItem(TreeItem i) : positionne l’élément i en tête de la table clear(int i, boolean a) : efface le contenu d’une ligne, si a est vraie les sous nœuds sont supprimés JFace I - M. Baron - Page 29
  30. 30. JFace / Viewers : Tree Exemple (suite) : un arbre, ses colonnes et ses noeuds public class TreeColumnSelectionExample { public TreeColumnSelectionExample() { ... Tree myTree = new Tree(shell, SWT.FULL_SELECTION); ... final int ROW = 4; for (int i = 0; i < ROW; i++) { TreeItem current = new TreeItem(myTree, SWT.NONE); for (int j = 0; j < SUB_ROW; j++) { ... } Afficher le nœud 5 en } haut du Tree myTree.setTopItem(myTree.getItem(5)); myTree.setSelection(myTree.getItem(5)); myTree.getItem(5).setExpanded(true);keulkeul.blogspot.com Modifier la sélection shell.open(); sur le nœud 5 ... } Déplier le nœud 5 ... } TreeColonneSelectionExample du projet TreeExamples JFace I - M. Baron - Page 30
  31. 31. JFace / Viewers : Viewer Un composant Viewer est organisé autour de trois concepts Input Objet métier qui sera affiché par le Viewer Il peut s’agir d’un simple objet (une liste de String par exemple) ou d’un objet « structurée » ContentProvider Adaptation des données de l’Input pour le type du Viewer Remarque : notifié si l’input est modifié LabelProviderkeulkeul.blogspot.com S’intéresse au rendu de chaque élément transmis par ContentProvider Peut fournir du texte ou des images Ces concepts seront étudiées très succinctement puis détaillés pour chaque composant Viewer JFace I - M. Baron - Page 31
  32. 32. Person JFace / Viewers : Viewer - name : String - firstName : String Transmission -… des données à Concept stockant les Les données sont transmises pour + getName() : String l’Input données à afficher structuration + getFirstName() : String (Initialisation) getElements(myList) +… Input Input List<Person> List<Person> ContentProvider myList 1 2 ContentProvider List<Person> myList Person[] 3 IStructuredContentProvider Les données à afficher par la table 6 "Dupont" TableViewer TableViewer Les données sont Transmission pour structurées : Person[]chaque TableItem de Le viewer centralise les Pour chaque ligne et chaque colonne Person, 0la table d’une chaîne "Dupont" appels aux différents transmission d’un objet Person et de de caractères concepts l’indice de colonne concernékeulkeul.blogspot.com getColumnText(Person, i) Table Table 4 LabelProvider LabelProvider 5 ITableLabelProvider Retour pour appel à getColumnText(…) d’une chaîne à afficher dans la cellule : String JFace I - M. Baron - Page 32
  33. 33. JFace / Viewers : Viewer Hiérarchie des principaux Viewers En charge de gérer le Gestion des composants de LabelProvider, le texte. Non étudiés dans ce Viewer ContentProvider et cours l’Input En charge de ContentViewer TextViewer gérer le tri et le filtre En charge des Viewers Classe qui décrit le contenant des StructuredViewer colonnes (new 3.3) … comportement de viewers de type Liste En charge des En charge des viewers ColumnViewer viewers de type de type Table (new 3.3) Arbre (new 3.3) AbstractListViewerkeulkeul.blogspot.com AbstractTableViewer AbstractTreeViewer ListViewer TreeViewer TableViewer ComboViewer JFace I - M. Baron - Page 33
  34. 34. JFace / Viewers : un exemple pour débuter Exemple : TableViewer et ses trois concepts Cinq colonneskeulkeul.blogspot.com Un objet Person contenant un nom, un prénom, un sport, un age et une TableViewerExample.java du projet habitude alimentaire TableViewerExamples JFace I - M. Baron - Page 34
  35. 35. JFace / Viewers : un exemple pour débuter Exemple (suite) : TableViewer et ses trois concepts public class Person { private String name; private String firstName; Cinq propriétés private String sportName; private int old; private boolean vegetarian; public Person(String name, String firstName, String sportName, int years, boolean vegetarian) { this.name = name; this.firstName = firstName; this.sportName = sportName; this.old = years; this.vegetarian = vegetarian; } public String getName() { return name;keulkeul.blogspot.com } public void setName(String name) { Cinq modifieurs et this.name = name; accesseurs } ... Person.java du projet } TableViewerExamples JFace I - M. Baron - Page 35
  36. 36. JFace / Viewers : un exemple pour débuter Exemple (suite) : TableViewer et ses trois concepts public class TableViewerExample { public TableViewerExample() { Display display = new Display(); Shell shell = new Shell(display); TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); ... viewer.setContentProvider(new MyStructuredContentProvider()); viewer.setLabelProvider(new MyTableLabelProvider()); List<Person> myPersonList = new ArrayList<Person>(); myPersonList... viewer.setInput(myPersonList); Table table = viewer.getTable(); Concept : Input new TableColumn(table, SWT.CENTER).setText("Nom"); new TableColumn(table, SWT.CENTER).setText("Prénom"); new TableColumn(table, SWT.CENTER).setText("Sport"); ... for (int i = 0; i < n; i++) {keulkeul.blogspot.com table.getColumn(i).setWidth(100); } shell.open(); La description détaillée de }... ... TableViewer sera réalisée dans la suite du cours TableViewerExample.java du projet TableViewerExamples JFace I - M. Baron - Page 36
  37. 37. JFace / Viewers : un exemple pour débuter Exemple (suite) : TableViewer et ses trois concepts static class MyStructuredContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { ArrayList<Person> localInputElement = (ArrayList<Person>)inputElement; return localInputElement.toArray(); } Concept : ContentProvider } static class MyTableLP extends BaseLabelProvider implements ITableLabelProvider { public String getColumnText(Object element, int columnIndex) { Person currentPerson = (Person)element; switch(columnIndex) { case 0 : return currentPerson.getName(); Concept : LabelProvider case 1 : return currentPerson.getFirstName(); case 2 : return currentPerson.getSportName(); case 3 : return Integer.toString(currentPerson.getOld()); case 4 : return Boolean.toString(currentPerson.isVegetarian()); default : return ""; } }keulkeul.blogspot.com public Image getColumnImage(Object element, int columnIndex) { return null; } } TableViewerExample.java du projet TableViewerExamples JFace I - M. Baron - Page 37
  38. 38. JFace / Viewers : ContentProvider Le rôle du ContentProvider est de fournir une adaptation des données du modèle (fournies par Input) pour un type de Viewer (TableViewer, TreeViewer, …) Un ContentProvider générique est décrit par l’interface IContentProvider L’interface IContentProvider fournit une seule méthode void inputChanged(Viewer, Object oldInput, Object newInput) : en charge de notifier le ContentProvider si les données du modèle (Input) ont changékeulkeul.blogspot.com La méthode setContentProvider(IContentProvider) permet d’associer un ContentProvider avec un Viewer De façon générale vous n’aurez pas à implémenter directe- ment l’interface IContentProvider JFace I - M. Baron - Page 38
  39. 39. JFace / Viewers : ContentProvider Selon le Viewer utilisé, l’API fournit des ContentProvider défini par des interfaces assurant les fonctionnalités des viewers concernés La méthode assertContentProvider(IContentProvider) s’assure que le IContentProvider fourni à la vue est du bon type La méthode assert est protected et ne peut être accessible directement Dans le cas où vous implémentez une mauvaise interface, le viewer n’affiche aucune informationkeulkeul.blogspot.com A noter que l’API fournit des implémentations « toutes prêtes » offrant des fonctionnalités directement utilisables Dans la suite, nous nous occuperons de nos propres implémentations de IContentProvider JFace I - M. Baron - Page 39
  40. 40. JFace / Viewers : ContentProvider Nous fournissons ci-dessous un récapitulatif facilitant le choix de l’interface à implémenter pour les viewers étudiés IStructuredContentProvider : TableViewer, CheckboxTableViewer, ListViewer ILazyContentProvider : TableViewer, CheckboxTableViewer ITreeContentProvider : TreeViewer, CheckboxTreeViewer ILazyTreeContentProvider : TreeViewer, CheckboxTreeViewer ITreePathContentProvider : TreeViewer, CheckboxTreeViewer …keulkeul.blogspot.com Seront étudiées en priorité les interfaces ITreeContentProvider et IStructuredContentProvider Il existe d’autres interfaces de type ContentProvider qui ne seront pas étudiées dans ce cours JFace I - M. Baron - Page 40
  41. 41. JFace / Viewers : ContentProvider Hiérarchie des principales interfaces ContentProvider Quand le nombre Quand le nombre IContentProvider d’éléments d’un arbre d’éléments est inconnu est inconnu ILazyContentProvider ILazyTreeContentProvider Permet de connaître le … IStructuredContentProvider nombre d’éléments (lignes, racines, …) Et pleins d’autres encore …keulkeul.blogspot.com ITreePathContentProvider ITreeContentProvider Lazy pour Lazy Loading signifie que Permet de connaître la relation entre l’élément considéré n’est chargé qu’au élément et son père et vice-et-versa moment où il est effectivement utilisé JFace I - M. Baron - Page 41
  42. 42. JFace / Viewers : ContentProvider L’interface IStructuredContentProvider peut être considérée comme le point de départ de l’utilisation des Viewers IStructuredContentProvider fournit une API pour connaître le nombre d’éléments d’un viewer Nombre de lignes d’un tableau (TableViewer) Nombre d’éléments d’une liste (ListViewer) Nombre d’éléments racine d’un arbre (élément ne possédant pas de père) (TreeViewer) Cette interface propose une seule méthodekeulkeul.blogspot.com Object[] getElements(Object inputElement) : retourne toutes les lignes à afficher Le paramètre inputElement est donné par l’objet input du composant viewer JFace I - M. Baron - Page 42
  43. 43. JFace / Viewers : ContentProvider Exemple : TableViewer et IStructuredContentProvider public class TableViewerExample { public TableViewerExample() { Display display = new Display(); Shell shell = new Shell(display); TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); ... viewer.setContentProvider(new MyStructuredContentProvider()); List<Person> myPersonList = new ArrayList<Person>(); myPersonList... viewer.setInput(myPersonList); TableViewerExample.java ... du projet } TableViewerExamples L’input est de type List<Person> static class MyStructuredContentProvider implements IStructuredContentProvider {keulkeul.blogspot.com public Object[] getElements(Object inputElement) { ArrayList<Person> localInputElement = (ArrayList<Person>)inputElement; return localInputElement.toArray(); } } L’input est transmis en ... En retour de cette méthode, il faut transmettre paramètre de getElements(…) } les lignes du tableau qui seront affichées JFace I - M. Baron - Page 43
  44. 44. JFace / Viewers : LabelProvider Nous avons vu que le rôle du ContentProvider était de fournir les objets du modèle (Input) au Viewer Le rôle du LabelProvider est d’effectuer un rendu de chaque élément transmis par le ContentProvider Ce rendu s’effectue via un composant de type label qui permet d’afficher une image et un texte Rendu de la cellule Ici un label sans Colonne d’un obtenu par un label l’affichage de TableViewer (Image + Texte) l’imagekeulkeul.blogspot.com L’API proposée par JFace n’est pas aussi souple que celle de Swing pour la gestion du rendu des éléments d’un viewer Nous verrons dans les exemples proposés que des solutions « bricolages » existent JFace I - M. Baron - Page 44
  45. 45. JFace / Viewers : LabelProvider Un LabelProvider générique est défini par l’interface IBaseLabelProvider qui ne propose rien d’exceptionnelle Une implémentation par défaut de IBaseLabelProvider est fournie par la classe BaseLabelProvider Hiérarchie des principales interfaces LabelProvider Utilisée pour les viewers de type LabelProvider adapté IBaseLabelProvider StructuredViewer comme pour les composants de TreeViewer sauf TableViewer type TableViewer ILabelProvider ITableLabelProviderkeulkeul.blogspot.com ITreePathLabelProvider IViewerLabelProvider Ajoute une méthode updateLabel Ajoute une méthode updateLabel spécialiser dans la mise à jour de chemin spécialiser dans la mise à jour pour un TreeViewer (à voir plus tard) d’élément (à voir plus tard) JFace I - M. Baron - Page 45
  46. 46. JFace / Viewers : LabelProvider L’interface ILabelProvider permet d’afficher une image et un texte pour un élément d’un Viewer (excepté le TableViewer) Rappelons qu’un élément peut correspondre à une ligne d’une liste, à un nœud d’un arbre, … L’interface possède deux méthodes : Image getImage(Object element) : affichage d’un objet Image String getText(Object element) : affichage d’un texte Le paramètre element correspond à un élément transmis parkeulkeul.blogspot.com le ContentProvider (exemple : un objet de type Person) A noter que pour supprimer l’affichage du texte ou d’une image, il faut retourner null JFace I - M. Baron - Page 46
  47. 47. JFace / Viewers : LabelProvider L’interface ITableLabelProvider fournit du texte/image pour chaque colonne d’un élément donné pour un TableViewer L’interface possède deux méthodes : Image getColumnImage(Object element, int columnIndex) : retourne une image pour une colonne et un élément donnés String getColumnText(Object element, int columnIndex) : retourne un texte pour une colonne et un élément donnés Concernant l’exemple, element est de type Person. Il faudra donc en fonction de la valeur de columnIndex retourner dekeulkeul.blogspot.com l’attribut adéquate de l’objet Person La méthode getColumnImage(…) sera appelée autant de fois qu’il y a de lignes JFace I - M. Baron - Page 47
  48. 48. JFace / Viewers : LabelProvider Depuis l’API Eclipse 3.3, il est possible d’associer à un viewer un LabelProvider unique pour toutes les colonnes (avant 3.3) un LabelProvider différent pour chaque colonne (depuis 3.3) Cette nouvelle API permet donc de paramétrer plus finement le rendu des différents éléments Ceci a été rendu possible par l’ajout de ColumnViewer Concernant la modification du LabelProvider unique pourkeulkeul.blogspot.com toutes les colonnes, ColumnViewer fournit une méthode setLabelProvider(IBaseLabelProvider p) : associer un LabelProvider à toutes les colonnes JFace I - M. Baron - Page 48
  49. 49. JFace / Viewers : LabelProvider Exemple : un LabelProvider pour toutes les colonnes public class TableViewerExample { public TableViewerExample() { ... TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); viewer.setLabelProvider(new MyTableLabelProvider()); ... } Implémentation par défaut de ... IBaseLabelProvider class MyTableLP extends BaseLabelProvider implements ITableLabelProvider { public String getColumnText(Object element, int columnIndex) { Person currentPerson = (Person)element; Selon la valeur de switch(columnIndex) { columnIndex on case 0 : return currentPerson.getName(); case 1 : return currentPerson.getFirstName(); sélectionne l’attribut à case 2 : return currentPerson.getSportName(); afficher case 3 : return Integer.toString(currentPerson.getOld()); case 4 : return Boolean.toString(currentPerson.isVegetarian()); default : return "";keulkeul.blogspot.com } } public Image getColumnImage(Object element, int columnIndex) { return null; } }} N’affiche pas d’image TableViewerExample.java du projet TableViewerExamples JFace I - M. Baron - Page 49
  50. 50. JFace / Viewers : LabelProvider Pour la gestion de l’affichage de l’en-tête de la table il faut passer par les objets natifs TableColumn Exemple : un LabelProvider pour toutes les colonnes public class TableViewerExample { public TableViewerExample() { ... TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); viewer.setLabelProvider(new MyTableLabelProvider()); Table table = viewer.getTable(); new TableColumn(table, SWT.CENTER).setText("Nom"); new TableColumn(table, SWT.CENTER).setText("Prénom"); new TableColumn(table, SWT.CENTER).setText("Sport"); new TableColumn(table, SWT.CENTER).setText("Age"); new TableColumn(table, SWT.CENTER).setText("Végétarien"); for (int i = 0; i < n; i++) { Nécessite de construire deskeulkeul.blogspot.com table.getColumn(i).setWidth(100); } TableColumn pour ... paramétrer chaque en-tête } ... de colonne } TableViewerExample.java du projet TableViewerExamples JFace I - M. Baron - Page 50
  51. 51. JFace / Viewers : LabelProvider Les LabelProviders peuvent être différents pour chaque colonne (nouveauté Eclipse 3.3) Ne concerne que les composants de type ColumnViewer, c’est-à-dire les composants TableViewer et TreeViewer La classe abstraite ViewerColumn s’occupe de représenter une colonne d’un composant ColumnViewer setLabelProvider(CellLabelProvider clp) : modifie le LabelProvider pour une colonnekeulkeul.blogspot.com setEditingSupport(EditingSupport es) : modification de l’éditeur (à voir plus tard) CellLabelProvider, qui hérite de BaseLabelProvider, est une nouveauté 3.3 JFace I - M. Baron - Page 51
  52. 52. JFace / Viewers : LabelProvider Selon le composant ColumnViewer utilisé (TableViewer ou TreeViewer) l’API fournit respectivement deux sous classes à ViewerColumn TableViewerColumn pour associer un LabelProvider à une colonne d’un TableViewer TreeViewerColumn pour associer un LabelProvider à une colonne d’un TreeViewer Le principe d’utilisation entre ces deux classes reste le mêmekeulkeul.blogspot.com Nous détaillerons donc TableViewerColumn puis pour TreeViewerColumn nous donnerons simplement des exemples JFace I - M. Baron - Page 52
  53. 53. JFace / Viewers : LabelProvider Un TableViewerColumn fournit une seule méthode permet- tant d’accéder au composant natif décrivant une colonne TableColumn getColumn() : accesseur sur une colonne d’une Table Rappelons qu’un TableColumn décrit « nativement » une colonne d’un objet Table (Table contient n TableColumn) L’accès à TableColumn va permettre de paramétrer le contenu de la colonne (un nom, une image, une dimension) La construction d’un TableViewerColumn précisera qu’une nouvelle colonne doit être associer à un TableViewerkeulkeul.blogspot.com Nativement, cela revient à associer un TableColumn avec un objet Table Par conséquent, il n’est pas possible de supprimer des colon- nes sans reconstruire l’objet TableViewer JFace I - M. Baron - Page 53
  54. 54. JFace / Viewers : LabelProvider Différents constructeurs pour la classe TableViewerColumn TableViewerColumn(TableViewer tv, int style) : construit une colonne avec un style (associer un nouveau TableColumn avec une Table) TableViewerColumn(TableViewer tv, int style, int index) : même chose avec la possibilité de choisir l’index de la nouvelle colonne dans la table Le style de la colonne précise l’emplacement du texte dans la colonne (LEFT, RIGHT et CENTER) Démarche pour utiliser un LabelProvider différent pour chaque colonnekeulkeul.blogspot.com Construire le TableViewer Construire et paramétrer (nom et taille par exemple) toutes les colon- nes via un TableViewerColumn A partir de chaque référence des TableViewerColumn, associer un LabelProvider unique JFace I - M. Baron - Page 54
  55. 55. JFace / Viewers : LabelProvider Exemple : un LabelProvider pour chaque colonne public class TableViewerColumnExample { public TableViewerColumnExample() { ... TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); viewer.setContentProvider(new MyStructuredContentProvider()); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new ColumnLabelProvider() { ... } Un LabelProvider par column.getColumn().setText("Nom"); colonne (à voir après) column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new ColumnLabelProvider() { ... } column.getColumn().setText("Sport"); ... Modification de l’en- tête de la colonnekeulkeul.blogspot.com viewer.setInput(myPersonList); Table table = viewer.getTable(); table.setLayoutData(new GridData(GridData.FILL_BOTH)); ... Nécessite toujours de } manipuler le composant } natif Table TableViewerColumnExample.java du projet TableViewerExamples JFace I - M. Baron - Page 55
  56. 56. JFace / Viewers : LabelProvider Un objet ViewerColumn manipule un LabelProvider de type CellLabelProvider (qui hérite de BaseLabelProvider) Le rôle de CellLabelProvider est de fournir des méthodes pour la manipulation des bulles d’aides de type Color getToolTipBackgroundColor(Object objet) : retourne la couleur du fond de la bulle d’aide String getToolTipText(Object element) : retourne le texte contenu dans la bulle d’aide int getTooltipDisplayDelayTime(Object element) : durée qu’il faut pour afficher la bulle d’aide boolean useNativeToolTip(Object object) : indique si les bulles d’aideskeulkeul.blogspot.com natives doivent être utilisées Pour utiliser les bulles d’aides il faut les activer … ColumnViewerToolTipSupport.enableFor(myViewer, ToolTip.NO_RECREATE) Activation des bulles d’aides pour un viewer donné JFace I - M. Baron - Page 56
  57. 57. JFace / Viewers : LabelProvider CellLabelProvider est abstraite, deux classes concrètes sont fournies par l’API ColumnLabelProvider : LabelProvider spécifique à une colonne OwnerDrawLabelProvider : LabelProvider pour dessiner le contenu ColumnLabelProvider fournit des méthodes pour modifier Color getBackground(Object element) : la couleur de fond Color getForeground(Object element) : la couleur de l’avantkeulkeul.blogspot.com Font getFont(Object element) : la fonte Image getImage(Object element) : l’image (si null = d’image) String getText(Object element) : le texte JFace I - M. Baron - Page 57
  58. 58. JFace / Viewers : LabelProvider Exemple (suite) : LabelProvider pour chaque colonne Cinq colonnes qui ont chacune un LabelProvider La couleur de fond de cette colonne est différente des autreskeulkeul.blogspot.com TableViewerColumnExample.java du projet TableViewerExamples JFace I - M. Baron - Page 58
  59. 59. JFace / Viewers : LabelProvider Exemple (suite) : LabelProvider pour chaque colonne public class TableViewerColumnExample { public TableViewerColumnExample() { ... TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); viewer.setContentProvider(new MyStructuredContentProvider()); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new ColumnLabelProvider() { public Color getBackground(Object element) { return Display.getDefault().getSystemColor(SWT.COLOR_GREEN); } public String getText(Object element) { Person currentPerson = (Person)element; Modifie la couleur de return currentPerson.getName(); } fond de la première } colonne column.getColumn().setText("Nom"); column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { Retourne le texte àkeulkeul.blogspot.com Person currentPerson = (Person)element; return currentPerson.getFirstName(); afficher dans la } cellule } column.getColumn().setText("Sport"); ... } TableViewerColumnExample.java } du projet TableViewerExamples JFace I - M. Baron - Page 59
  60. 60. JFace / Viewers : LabelProvider Exemple (suite) : LabelProvider pour chaque colonne public class TableViewerColumnExample { public TableViewerColumnExample() { ... column.setLabelProvider(new ColumnLabelProvider() { public int getToolTipDisplayDelayTime(Object object) { return 500; } public int getToolTipTimeDisplayed(Object object) { return 5000; } public Color getToolTipBackgroundColor(Object object) { Gestion des return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK); bulles d’aides } par colonne public String getToolTipText(Object element) { return "Ceci est un exemple de bulle d’aide"; } public boolean useNativeToolTip(Object object) { return false; }keulkeul.blogspot.com }); column.getColumn().setText("Végétarien"); ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE); } } N’oubliez pas d’activer les bulles d’aides TableViewerColumnExample.java via ColumnViewerToolTipSupport du projet TableViewerExamples JFace I - M. Baron - Page 60
  61. 61. JFace / Viewers : LabelProvider Les LabelProvider proposés actuellement ne permettent que d’afficher du texte et/ou une image Pour dessiner dans le label (possibilité également de passer par une image), l’API 3.3 fournit OwnerDrawLabelProvider La classe abstraite OwnerDrawLabelProvider permet de « dessiner » dans le label (ex : une cellule pour une table) abstract void measure(Event event, Object e) : dimensionner le label abstract void paint(Event event, Object e) : dessiner le contenu abstract void erase(Event event, Object e) : dessiner la sélectionkeulkeul.blogspot.com static void setUpOwnerDraw(ColumnViewer viewer) : rediriger les événements du Viewer dans le LabelProvider Pour qu’un ColumnViewer prenne en compte un LabelProvider de type OwnerDrawLabelProvider, employez obligatoirement setUpOwnerDraw JFace I - M. Baron - Page 61
  62. 62. JFace / Viewers : LabelProvider Exemple : dessiner le contenu des cellules public class OwnerDrawLabelExample { public OwnerDrawLabelExample() { ... TableViewer viewer = new TableViewer(shell, SWT.FULL_SELECTION); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.setLabelProvider(new OwnerDrawLabelProvider() { protected void measure(Event event, Object element) { Person currentPerson = (Person)element; Précise la int height = event.gc.textExtent(currentPerson.getName()).y + 5; dimension du int width = event.gc.textExtent(currentPerson.getName()).x; event.setBounds(new Rectangle(0,0, width, height)); label } protected void paint(Event event, Object element) { // La suite dans le slide suivant ... } } column.getColumn().setText("Nom"); ... // Traitement des autres colonnes OwnerDrawLabelProvider.setUpOwnerDraw(viewer);keulkeul.blogspot.com } } Style, couleur et fonte différents dans un même label OwnerDrawLabelExample.java du projet TableViewerExamples JFace I - M. Baron - Page 62
  63. 63. JFace / Viewers : LabelProvider Exemple (suite) : dessiner le contenu des cellules protected void paint(Event event, Object element) { Person currentPerson = (Person)element; Display display = viewer.getControl().getDisplay(); Utilisation d’un TextLayout pour TextLayout layout = new TextLayout(display); faciliter l’agencement layout.setText(currentPerson.getName()); du texte dans la cellule TextStyle plain = new TextStyle(JFaceResources .getFont(JFaceResources.DEFAULT_FONT), display .getSystemColor(SWT.COLOR_LIST_FOREGROUND), null); Précise les TextStyle italic = new TextStyle(JFaceResources.getFontRegistry() différents .getItalic(JFaceResources.DEFAULT_FONT), display styles .getSystemColor(SWT.COLOR_BLUE), null); Font newFont = new Font(display, "Arial", 9, SWT.BOLD); TextStyle font = new TextStyle(newFont, display La cellule la plus grande .getSystemColor(SWT.COLOR_WHITE), display .getSystemColor(SWT.COLOR_BLACK)); fixe la taille de toutes les autres dimensionskeulkeul.blogspot.com layout.setStyle(plain, 0, 2); layout.setStyle(italic, 3, 5); d’une même colonne layout.setStyle(font, 6, currentPerson.getName().length() - 1); layout.draw(event.gc, event.x, event.y); } OwnerDrawLabelExample.java du projet TableViewerExamples JFace I - M. Baron - Page 63
  64. 64. JFace / Viewers : TableViewer Nous avons vu que le composant TableViewer permettait d’encapsuler le composant Table de l’API SWT ContentProvider autorisés IStructuredContentProvider et ILazyContentProvider LabelProvider autorisés ILabelProvider et ITableLabelProvider pour toutes les colonnes ColumnLabelProvider et OwnerDrawLabelProvider pour chaque colon- ne via le composant TableViewerColumn Différents styles sont utilisables (voir partie Table pour con- naître sont qui sont exploitables)keulkeul.blogspot.com Particulièrement le style SWT.VIRTUAL permet d’utiliser le ContentProvider ILazyContentProvider Si le style est SWT.VIRTUAL utilisez obligatoirement ILazyContentProvider au risque de lever une exception JFace I - M. Baron - Page 64
  65. 65. JFace / Viewers : TableViewer Le principe du « Lazy Loading » est de ne charger en mé- moire que les objets effectivement utilisés Selon les besoins, de nouveaux objets sont alors ajoutés en mémoire Dans le cas de l’interface ILazyContentProvider seuls les objets visibles, représentés par les lignes affichées, sont pris en compte par le TableViewer Si il y a affichage de nouvelles lignes, les objets associéskeulkeul.blogspot.com sont ajoutés dans le TableViewer L’interface ILazyContentProvider contient une méthode updateElement(int index) : appelée quand une nouvelle ligne (index) est visible JFace I - M. Baron - Page 65
  66. 66. JFace / Viewers : TableViewer Pour utiliser ILazyContentProvider, il faut connaître la taille des éléments à afficher AbstractTableViewer#setItemCount(int count) : précise le nombre d’élément count géré par la table A chaque nouvel objet dans la TableViewer (appelle de la méthode updateElement), prise en compte de l’objet dans la table par : AbstractTableViewer#replace(Object el, int index) : objet el à ajouter à la position indexkeulkeul.blogspot.com 12 objets ont été chargés dans la TableViewer JFace I - M. Baron - Page 66
  67. 67. JFace / Viewers : TableViewer Exemple : TableViewer et ILazyContentProvider public class LazyContentProviderExample { public LazyContentProviderExample() { ... TableViewer viewer = new TableViewer(shell, SWT.VIRTUAL | SWT.FULL_SELECTION); viewer.setLabelProvider(new MyTableLabelProvider()); viewer.setContentProvider(new MyLazyContentProvider(viewer)); ... viewer.setInput(myPersonList); viewer.setItemCount(myPersonList.size()); Précise le nombre de ligne ... dans la table } static class MyLazyContentProvider implements ILazyContentProvider { private AbstractTableViewer ref; private ArrayList<Person> myPersonList; private MyLazyContentProvider(AbstractTableViewer pRef) { this.ref = pRef; } Ajoute un objet à la public void updateElement(int index) { position indexkeulkeul.blogspot.com ref.replace(myPersonList.get(index), index); } public void inputChanged(Viewer view, Object oldInput, Object newInput) { this.myPersonList = (ArrayList<Person>)newInput; } public void dispose() {} LazyContentProviderExample.java } du projet TableViewerExamples } JFace I - M. Baron - Page 67
  68. 68. JFace / Viewers : TreeViewer Le composant TreeViewer permet d’encapsuler le composant Tree de l’API SWT ContentProvider autorisés ITreeContentProvider, ILazyTreeContentProvider, ITreePathContentProvider et ILazyTreePathContentProvider LabelProvider autorisés ILabelProvider pour toutes les colonnes ColumnLabelProvider et OwnerDrawLabelProvider pour chaque colon- ne via le composant TreeViewerColumnkeulkeul.blogspot.com Différents styles sont utilisables (voir partie Table pour con- naître ceux qui sont exploitables) Notons que le fait d’utiliser plusieurs TreeViewerColumn permet de construire un TableTreeViewer JFace I - M. Baron - Page 68
  69. 69. JFace / Viewers : TreeViewer L’interface ITreeContentProvider est utilisée par un viewer de type arbre (Tree) Elle hérite de l’interface IStructuredContentProvider qui fournit une méthode pour déterminer le nombre d’éléments (dans ce cas, le nombre d’éléments racines) ITreeContentProvider fournit trois méthodes Object[] getChildren(Object paramElement) : retourne les enfants d’un élément donnékeulkeul.blogspot.com Object getParent(Object element) : retourne l’élément père d’un élément boolean hasChildren(Object element) : précise si l’élément est racine ou pas JFace I - M. Baron - Page 69
  70. 70. JFace / Viewers : TreeViewer Exemple : TreeViewer et ITreeContentProvider public class Job { private List<Person> myPerson; Job.java du projet private String job; TreeViewerExamples public void addPerson(Person pPerson) { myPerson.add(pPerson); pPerson.setParent(this); } public List<Person> getPersons() { return myPerson; } public String getJob() { return job; }} public class Person { private String name; ... private Job parent; public Person(String pName, ...) { name = pNamae; ...keulkeul.blogspot.com } public String getName() { return name; Person.java du projet } TreeViewerExamples public void setParent(Job pJob) { this.parent = pJob; } ... } JFace I - M. Baron - Page 70
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×