Construction d'Eclipse Forms avec la plateforme Eclipse

6 046 vues

Publié le

Ce support de cours s'intéresse à détailler la construction d'Eclipse Forms avec la plateforme Eclipse. L'API Eclipse Forms permet de construire des interfaces graphiques ayant un look proche des interfaces Web. Il fait partie de la série des supports de cours liée au Workbench. Les aspects suivants sont étudiés : FormToolkit, Form et ScrolledForm, Agents de placement, Composants (ExpandableComposite, Section, PageBook, FormText, MasterDetailsBlock) et FormEditor.

Publié dans : Technologie, Business
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
6 046
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 134
Actions
Partages
0
Téléchargements
138
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Construction d'Eclipse Forms avec la plateforme Eclipse

  1. 1. Développement de clients riches : Plateforme Eclipse Chapitre 3 : Conception de plug-ins Workbench : Eclipse Forms Mickaël BARON - 2010 mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à l'Identique 2.0 France keulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr Eclipse Forms - M. Baron - Page 2
  3. 3. Organisation du cours sur le Workbench : Eclipse Forms FormToolkit Form et ScrolledForm Agents de placement Composants ExpandableComposite, Section, PageBook, FormText MasterDetailsBlock keulkeul.blogspot.com FormEditor Tous les exemples du cours sont disponibles directement à l’adresse mbaron.developpez.com/eclipse/forms Eclipse Forms - M. Baron - Page 3
  4. 4. Workbench Eclipse Forms : déroulement du cours Pédagogie du cours Illustration avec de nombreux exemples qui sont disponibles à l’adresse mbaron.developpez.com/eclipse/forms Des bulles d’aide tout au long du cours Logiciels utilisés Ceci est une astuce Eclipse 3.6 Helios Ceci est une alerte keulkeul.blogspot.com Pré-requis Connaître la structure d’un plug-ins et savoir créer une extension Structure du Workbench Eclipse Forms - M. Baron - Page 4
  5. 5. Workbench Eclipse Forms : ressources … Des liens sur Eclipse Forms de manière générale www.eclipse.org/articles/Article-Forms/article.html www.eclipse.org/articles/article.php?file=Article-Forms33/index.html www.jdg2e.com/forms/EclipseForms.html www.ibm.com/developerworks/opensource/library/os-eclipse-forms www.vogella.de/articles/EclipseForms/article.html keulkeul.blogspot.com Eclipse Forms - M. Baron - Page 5
  6. 6. Eclipse Forms : Généralités L’utilisation des boîtes à outils SWT / JFace ne permet pas, nativement, d’obtenir des IHMs homogènes L’API Eclipse Forms permet d’obtenir des IHMs ressemblant fortement aux interfaces Web Cette API s’appuie sur les composants natifs SWT en les décorant de telle sorte que tous les composants aient une apparence identique L’API Eclipse Forms fournit également de nouveaux keulkeul.blogspot.com composants et agents de placement L’outil PDE est un exemple d’IHMs à base d’Eclipse Forms que nous utilisons depuis le début de ces supports de cours Eclipse Forms - M. Baron - Page 6
  7. 7. Eclipse Forms : Généralités Exemple : IHMs du PDE développées avec Eclipse Forms keulkeul.blogspot.com Une apparence homogène digne des IHMs du Web Eclipse Forms - M. Baron - Page 7
  8. 8. Eclipse Forms : FormToolkit Le point de départ de toutes constructions d’IHMs à base d’Eclipse Forms est l’objet FormToolkit Cet objet fournit les fonctionnalités suivantes Fabrique de l’ensemble des composants SWT (Button, Label, Text, …) Fabrique du composant FormText Fabrique de conteneurs (Composite, ExpandableComposite, Form, ScrolledForm, Section, PageBook) Les nouveaux composants ou conteneurs doivent être construits à partir d’un FormToolkit sous peine de ne pas keulkeul.blogspot.com obtenir des interfaces homogènes Construction d’un objet FormToolkit FormToolkit formtoolkit = new FormToolkit(parent.getDisplay()); Eclipse Forms - M. Baron - Page 8
  9. 9. Eclipse Forms : FormToolkit Exemple : HelloWorld avec Eclipse Forms package eclipse.workbench.eclipseformsexample.views; Un objet FormToolkit utilisé public class HelloWorldPart extends ViewPart { comme fabrique des public HelloWorldPart() { } composants Eclipse Forms public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("Hello World with Eclipse Forms"); Depuis la version 3.3 toolkit.decorateFormHeading(form.getForm()); } possibilité de modifier public void setFocus() { l’apparence de l’en-tête } } keulkeul.blogspot.com Classe HelloWorldPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 9
  10. 10. Eclipse Forms : FormToolkit Exemple : Composants SWT sans FormToolkit package eclipse.workbench.eclipseformsexample.views; public class NativeSWTPart extends ViewPart { public NativeSWTPart() { } Les composants SWT ne public void createPartControl(Composite parent) { sont pas construits à FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); partir de FormToolkit form.setText("Native SWT components with Eclipse Forms"); toolkit.decorateFormHeading(form.getForm()); GridLayout layout = new GridLayout(); layout.numColumns = 2; form.getBody().setLayout(layout); Label label = new Label(form.getBody(), SWT.NULL); label.setText("Text field label : "); Text text = new Text(form.getBody(), SWT.BORDER); text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Button button = new Button(form.getBody(), SWT.CHECK); keulkeul.blogspot.com button.setText("A SWT natif checkbox component in a form"); GridData gd = new GridData(); gd.horizontalSpan = 2; button.setLayoutData(gd); } } Nécessitera une modification du code pour uniformiser l’apparence Classe NativeSWTPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 10
  11. 11. Eclipse Forms : FormToolkit Exemple : Composants SWT avec FormToolkit package eclipse.workbench.eclipseformsexample.views; public class NoNativeSWTPart extends ViewPart { public NoNativeSWTPart() { } Les composants SWT ne public void createPartControl(Composite parent) { sont construits à partir de FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); FormToolkit form.setText("FormTookit SWT components with Eclipse Forms"); toolkit.decorateFormHeading(form.getForm()); GridLayout layout = new GridLayout(); layout.numColumns = 2; form.getBody().setLayout(layout); toolkit.createLabel(form.getBody(), "Text field label : "); Text text = toolkit.createText(form.getBody(), "",SWT.BORDER); text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Button button = toolkit.createButton(form.getBody(), "A SWT natif checkbox component in a form", SWT.CHECK); keulkeul.blogspot.com GridData gd = new GridData(); gd.horizontalSpan = 2; button.setLayoutData(gd); } } L’apparence des Classe NoNativeSWTPart.java du interfaces est uniforme projet eclipseformsexample Eclipse Forms - M. Baron - Page 11
  12. 12. Eclipse Forms : Form et ScrolledForm Les composants Form et ScrolledForm sont généralement utilisés comme conteneur de plus haut niveau d’une IHM à base d’Eclipse Forms ScrolledForm ajoute en plus la possibilité de gérer des ascenseurs horizontaux et verticaux quand son contenu est trop important Ces composants sont constitués de deux parties Un en-tête (titre, barre de menus, barre d’outils, messages, …) Un corps qui est un conteneur pour ajouter d’autres composants keulkeul.blogspot.com Corps des Forms En-tête Eclipse Forms - M. Baron - Page 12
  13. 13. Eclipse Forms : Form et ScrolledForm Les deux parties d’un composant Form sont accessibles via les méthodes suivantes Composite getHead() : accès au conteneur de l’en-tête Composite getBody() : accès au conteneur du corps Dans le cas de ScrolledForm, il encapsule un composant Form qui peut être accessible directement via Form getForm() : accès à l’objet Form encapsulé par ScrolledForm keulkeul.blogspot.com De cette manière tout ce qui est accessible dans Form (corps, en-tête, …) peut l’être à partir d’un ScrolledForm Eclipse Forms - M. Baron - Page 13
  14. 14. Eclipse Forms : customiser Form et ScrolledForm L’en-tête d’un composant Form peut être customisé Ajout d’un menu Ajout d’actions dans la barre d’outils Image personnalisée Personnalisation de la zone cliente de l’en-tête keulkeul.blogspot.com Gestion des Image adaptée en messages fonction de la gravité du message Eclipse Forms - M. Baron - Page 14
  15. 15. Eclipse Forms : customiser Form et ScrolledForm Le composant Form fournit des méthodes spécifiques pour effectuer la customisation de l’en-tête void setText(String text) : modification du titre void setImage(Image img) : modification de l’image du titre void setHeadClient(Control headClient) : modification de la zone cliente de l’en-tête IToolBarManager getToolBarManager() : accès au gestionnaire de la boîte à outils IMenuManager getMenuManager() : accès au gestionnaire du menu void setMessage(String message, int type) : modification du message keulkeul.blogspot.com (IMessageProvider.WARNING, ERROR, NONE, INFORMATION) void addMessageHyperlinkListener(IHyperlinkListener hl) : écouteur sur le lien du message … Eclipse Forms - M. Baron - Page 15
  16. 16. Eclipse Forms : customiser Form et ScrolledForm Exemple : Customisation de l’en-tête d’un Form package eclipse.workbench.eclipseformsexample.views; public class FormCustomizationPart extends ViewPart { public FormCustomizationPart() { } Création d’un bouton public void createPartControl(Composite parent) { dans la zone client de FormToolkit toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); l’en-tête form.setText("Form Customization"); toolkit.decorateFormHeading(form.getForm()); form.setHeadClient( toolkit.createButton(form.getForm().getHead(), "This is the head client", SWT.PUSH)); form.setImage(Activator.getDefault().getImageRegistry().get(Activator.TINY_ECLIPSE_LOGO)); form.getForm().getToolBarManager().add(new Action("ToolBar Action", Activator.getDefault().getImageRegistry().getDescriptor(Activator.TINY_ECLIPSE_LOGO)) { }); form.getForm().getToolBarManager().update(true); // Suite dans le prochain transparent keulkeul.blogspot.com } } Classe FormCustomizationPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 16
  17. 17. Eclipse Forms : customiser Form et ScrolledForm Exemple (suite) : Customisation de l’en-tête d’un Form Classe FormCustomizationPart.java du Création de menus à projet eclipseformsexample partir du gestionnaire de menu form.getForm().getMenuManager().add(new Action("MenuBar Action", Activator.getDefault().getImageRegistry().getDescriptor(Activator.TINY_ECLIPSE_LOGO)) { }); form.getForm().getMenuManager().update(true); form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { System.out.println("Link active : " + e.getLabel()); form.getForm().setMessage(null); Ajout d’un écouteur sur } }); le lien du message form.getForm().setMessage("This is an error message", IMessageProvider.WARNING); } } keulkeul.blogspot.com Ecriture d’un message dans l’en-tête Eclipse Forms - M. Baron - Page 17
  18. 18. Eclipse Forms : Composants supportés Tous les composants de SWT sont supportés (au sens qui ne sont pas des conteneurs ni des agents de placement) et d’autres spécifiques à Eclipse Forms (Hyperlink) Button via createButton(…) Hyperlink via createHyperlink(…) ImageHyperlink via createImageHyperlink(…) Label via createLabel(…) keulkeul.blogspot.com Text via createText(…) Table via createTable(…) Tree via createTree(…) Eclipse Forms - M. Baron - Page 18
  19. 19. Eclipse Forms : Composants supportés Exemple : Composants supportés package eclipse.workbench.eclipseformsexample.views; public class SupportedComponentPart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("All Eclipse Form Supported Components"); toolkit.decorateFormHeading(form.getForm()); Utilisation de fabriques GridLayout layout = new GridLayout(); layout.numColumns = 1; pour construire des form.getBody().setLayout(layout); objets SWT // Button component with push style. toolkit.createButton(form.getBody(), "Eclipse Form Button", SWT.PUSH); // Hyperlink component. Hyperlink createHyperlink = toolkit.createHyperlink(form.getBody(), "Eclipse Hyperlink", SWT.WRAP); createHyperlink.setText("Eclipse Form Hyperlink"); keulkeul.blogspot.com // ImageHyperlink component. ImageHyperlink createImageHyperlink = toolkit.createImageHyperlink(form.getBody(), SWT.WRAP); createImageHyperlink.setText("Eclipse Form ImageHyperlink"); createImageHyperlink.setImage(Activator.getDefault().getImageRegistry().get(Activator.ECLIPSE_LOGO)); // Suite dans le prochain transparent } } Classe SupportedComponentPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 19
  20. 20. Eclipse Forms : Composants supportés Exemple (suite) : Composants supportés Classe SupportedComponentPart.java du projet eclipseformsexample // Label component. toolkit.createLabel(form.getBody(), "Eclipse Form Label"); // Text component. toolkit.createText(form.getBody(), "Eclipse Form Text", SWT.BORDER); // Table component. Table createTable = toolkit.createTable(form.getBody(), SWT .FULL_SELECTION); createTableViewer(createTable); // Tree component. Tree myTree = toolkit.createTree(form.getBody(), SWT.FULL_SELECTION); createTreeViewer(myTree); } private void createTreeViewer(Tree myTree) { final TreeViewer treeViewer = new TreeViewer(myTree); keulkeul.blogspot.com ... } private void createTableViewer(Table createTable) { final TableViewer viewer = new TableViewer(createTable); ... } } Utilisation des Viewers à partir des composants natifs pour ajouter une touche Modèle / Vue Eclipse Forms - M. Baron - Page 20
  21. 21. Eclipse Forms : Agents de placement Lors de l’agencement des interfaces à base d’Eclipse Forms, il est possible d’employer les agents de placement SWT De façon à fournir une apparence Web deux nouveaux agents de placement ont été ajoutés TableWrapLayout : il s’agit d’un GridLayout avec possibilité de retour à la ligne du contenu quand la place est manquante ColumnLayout : il s’agit d’un RowLayout qui agence des composants uniquement en colonne dans la mesure du possible Ces nouveaux agents de placement peuvent être utilisés keulkeul.blogspot.com en dehors d’interfaces Eclipse Forms, pour du « pur » SWT La modification de l’agent de placement d’un composant Form (Form et ScrolledForm) doit se faire à partir du corps form.getBody().setLayout(…) Eclipse Forms - M. Baron - Page 21
  22. 22. Eclipse Forms : TableWrapLayout L’agent de placement TableWrapLayout se comporte comme GridLayout Il permet en plus le retour à la ligne du contenu quand l’espace client se réduit à la manière d’une page HTML Il contrôle une grille avec la possibilité de fusionner des cellules et de contraindre ou pas la largeur des cellules TableWrapLayout() : une grille avec une colonne et les colonnes n’auront pas la même taille Paramétrages après sa construction keulkeul.blogspot.com int numColumns : nombre de colonne int horizontalSpacing et verticalSpacing : espace horizontal et vertical entre les cellules int leftMargin, rightMargin, topMargin et bottomMargin : espace sur les bords du conteneur Eclipse Forms - M. Baron - Page 22
  23. 23. Eclipse Forms : TableWrapLayout Possibilité de contraindre chaque composant par un objet de type TableWrapData TableWrapData(int align, int valign) : construit avec un style spécifié pour alignement horizontal (align) et l’alignement vertical (valign) TableWrapData peut être paramétré après sa construction int colspan : nombre de colonne occupé L’alignement horizontal int rowspan : nombre de ligne occupée et vertical doit être précisé à la construction Les différentes constantes utilisées keulkeul.blogspot.com LEFT, CENTER, RIGHT, FILL et FILL_GRAB : utilisées pour l’alignement horizontal TOP, MIDDLE, BOTTOM, FILL et FILL_GRAB : utilisées pour l’alignement vertical Eclipse Forms - M. Baron - Page 23
  24. 24. Eclipse Forms : TableWrapLayout Exemple : TableWrapLayout en action Lors de la réduction de la largeur de la vue, le contenu de chaque label est automatiquement mise en forme keulkeul.blogspot.com Classe TableWrapLayoutPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 24
  25. 25. Eclipse Forms : TableWrapLayout Exemple (suite) : TableWrapLayout en action package eclipse.workbench.eclipseformsexample.views; public class TableWrapLayoutPart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("TableWrapLayout Layout Example"); toolkit.decorateFormHeading(form.getForm()); TableWrapLayout layout = new TableWrapLayout(); Création de l’agent de placement layout.verticalSpacing = 25; form.getBody().setLayout(layout); TableWrapLayout layout.numColumns = 3; Label label; TableWrapData td; label = toolkit.createLabel(form.getBody(), "What happened? Remember that we are ...", SWT.WRAP); td = new TableWrapData(); td.colspan = 3; label.setLayoutData(td); TableWrapData fournit des keulkeul.blogspot.com ... paramètres de TableWrapLayout } } spécifique à label Classe TableWrapLayoutPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 25
  26. 26. Eclipse Forms : ColumnLayout L’agent de placement ColumnLayout se comporte comme RowLayout Il permet d’agencer des composants uniquement en colonne dans la mesure du possible Si pas assez de place débordement sur une nouvelle ligne Il contrôle le nombre de colonne minimum et maximum qui peut être créé ColumnLayout() : création d’un ColumnLayout avec une colonne minimum et trois colonnes maximums keulkeul.blogspot.com Paramétrages après sa construction int minNumColumns : nombre de colonne minimum int maxNumColumns : nombre de colonne maximum Eclipse Forms - M. Baron - Page 26
  27. 27. Eclipse Forms : ColumnLayout Exemple : ColumnLayout en action package eclipse.workbench.eclipseformsexample.views; public class ColumnLayoutPart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("TableWrapLayout Layout Example"); toolkit.decorateFormHeading(form.getForm()); ColumnLayout layout = new ColumnLayout(); 1 colonne minimum et 2 layout.minNumColumns = 1; layout.maxNumColumns = 2; colonnes maximum form.getBody().setLayout(layout); Label label; ColumnLayoutData cld = new ColumnLayoutData(); label = toolkit .createLabel(form.getBody(), "First Content used to demonstrate ColumnLayout", SWT.WRAP); label.setLayoutData(cld); keulkeul.blogspot.com label = toolkit.createLabel(form.getBody(), "Second Content used to demonstrate ColumnLayout", SWT.WRAP); label = toolkit .createLabel(form.getBody(), "Third Content used to demonstrate ColumnLayout", SWT.WRAP); cld = new ColumnLayoutData(); label.setLayoutData(cld); }} Classe ColumnLayoutPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 27
  28. 28. Eclipse Forms : ColumnLayout Exemple (suite) : ColumnLayout en action Espace suffisante pour créer 2 colonnes Espace insuffisant pour créer 2 colonnes Même si l’espace est suffisant, la troisième colonne n’est pas créée keulkeul.blogspot.com Eclipse Forms - M. Baron - Page 28
  29. 29. Eclipse Forms : ExpandableComposite Le composant ExpandableComposite permet de réduire ou déplier un composant de manière à masquer la complexité de grandes interfaces Le composant ExpandableComposite est constitué d’un titre keulkeul.blogspot.com Lorsque le composant Une icône pour le rendu qui ExpandableComposite est indique si le composant est en déplié, le composant client est mode réduit ou déplié affiché (Control ou Composite) Eclipse Forms - M. Baron - Page 29
  30. 30. Eclipse Forms : ExpandableComposite Un composant ExpandableComposite se construit ExpandableComposite createExpandableComposite(Composite c, int style) : création à partir d’un objet Toolkit TWISTIE et TREE_NODE : icône pour le rendu qui indique si l’état réduit ou déplié CLIENT_INDENT : indentation par rapport au titre EXPANDED : dans l’état déplié à la construction NO_TITLE : pas de titre Des méthodes pour modifier son comportement keulkeul.blogspot.com void setText(String p) : modifie le titre void setClient(Control client) : modifie le composant client void addExpansionListener(IExpansionListener list) : ajout d’un listener pour être informé du changement d’état (réduit ou déplié) Eclipse Forms - M. Baron - Page 30
  31. 31. Eclipse Forms : ExpandableComposite Exemple : ExpandableComposite en action package eclipse.workbench.eclipseformsexample.views; public class ExpandableCompositePart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("Expandable Composite Example"); Création d’un toolkit.decorateFormHeading(form.getForm()); ExpandableComposite TableWrapLayout layout = new TableWrapLayout(); form.getBody().setLayout(layout); avec un style particulier ExpandableComposite ec = toolkit.createExpandableComposite(form .getBody(), ExpandableComposite.CLIENT_INDENT | ExpandableComposite.TREE_NODE); ec.setText("This is the first Expandable composite title"); Composite expandableClient = toolkit.createComposite(ec); expandableClient.setLayout(new GridLayout()); toolkit.createButton(expandableClient, "Radio 1", SWT.RADIO); toolkit.createButton(expandableClient, "Radio 2", SWT.RADIO); ec.setClient(expandableClient); keulkeul.blogspot.com ec.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); } } Classe ExpandableCompositePart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 31
  32. 32. Eclipse Forms : Section Le composant Section se comporte comme le composant ExpandableComposite en ajoutant une description au dessous du titre une titre avec une apparence différente Le composant Section est Le composant Section est constitué d’un composant constitué d’un titre décoré description (Control) keulkeul.blogspot.com Lorsque le composant Section est déplié, le composant client est affiché (Control ou Composite) Eclipse Forms - M. Baron - Page 32
  33. 33. Eclipse Forms : Section Exemple : Section en action package eclipse.workbench.eclipseformsexample.views; public class SectionCompositePart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("Section Composite Example"); toolkit.decorateFormHeading(form.getForm()); Si style DESCRIPTION est précisé, TableWrapLayout layout = new TableWrapLayout(); une zone pour une description est form.getBody().setLayout(layout); prévue sous le titre Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED); TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB); section.setLayoutData(td); section.setText("Section title"); section .setDescription("This is the description that goes below the title"); keulkeul.blogspot.com Composite sectionClient = toolkit.createComposite(section); sectionClient.setLayout(new GridLayout()); toolkit.createButton(sectionClient, "Radio 1", SWT.RADIO); toolkit.createButton(sectionClient, "Radio 2", SWT.RADIO); section.setClient(sectionClient); } } Classe SectionCompositePart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 33
  34. 34. Eclipse Forms : PageBook Le composant PageBook permet d’empiler plusieurs pages (Composite) et de choisir celle qui sera visible Ce composant est décrit par la classe ScrolledPageBook Chaque page est un Composite qui peut contenir directement des objets Control ou des objets Composite Différents méthodes pour son utilisation Composite createPage(Object key) : création d’une page identifiée keulkeul.blogspot.com par key Control getCurrentPage() : récupère la page en cours void showPage(Object key) : affiche la page identifié par key Eclipse Forms - M. Baron - Page 34
  35. 35. Eclipse Forms : PageBook Exemple : PageBook en action package eclipse.workbench.eclipseformsexample.views; public class PageBookPart extends ViewPart { public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("PageBook Composite Example"); toolkit.decorateFormHeading(form.getForm()); TableWrapLayout layout = new TableWrapLayout(); Création d’un composant layout.numColumns = 2; layout.topMargin = 0; ScrolledPageBook form.getBody().setLayout(layout); final ScrolledPageBook pageBook = toolkit.createPageBook(form.getBody(), SWT.BORDER); Composite page1 = pageBook.createPage("page 1"); page1.setLayout(new GridLayout()); Composite sectionClient1 = toolkit.createComposite(page1); sectionClient1.setLayout(new GridLayout()); toolkit.createButton(sectionClient1, "Radio 1", SWT.RADIO); keulkeul.blogspot.com toolkit.createButton(sectionClient1, "Radio 2", SWT.RADIO); GridData layoutData = new GridData(GridData.FILL_BOTH); sectionClient1.setLayoutData(layoutData); ... // Suite dans le prochain transparent. } } Classe PageBookPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 35
  36. 36. Eclipse Forms : PageBook Exemple (suite) : PageBook en action package eclipse.workbench.eclipseformsexample.views; public class PageBookPart extends ViewPart { public void createPartControl(Composite parent) { // Suite du précédent transparent Composite page2 = pageBook.createPage("page 2"); page2.setLayout(new GridLayout()); Composite sectionClient2 = toolkit.createComposite(page2); sectionClient2.setLayout(new GridLayout()); toolkit.createButton(sectionClient2, "Radio 1", SWT.CHECK); toolkit.createButton(sectionClient2, "Radio 2", SWT.CHECK); layoutData = new GridData(GridData.FILL_BOTH); sectionClient2.setLayoutData(layoutData); TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB); td.heightHint = 80; td.colspan = 2; pageBook.setLayoutData(td); A l’ouverture de la vue, la page pageBook.showPage("page 1"); identifiée par « page 1 » sera visible final Button createButton = toolkit.createButton(form.getBody(), "Show Page 1", SWT.FLAT); keulkeul.blogspot.com createButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { pageBook.showPage("page 1"); } }); final Button createButton2 = toolkit.createButton(form.getBody(), "Show Page 2", SWT.FLAT); createButton2.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { pageBook.showPage("page 2"); } }); Classe PageBookPart.java du projet } } eclipseformsexample Eclipse Forms - M. Baron - Page 36
  37. 37. Eclipse Forms : FormText Nous avons vu précédemment que pour créer du contenu texte avec des liens hypertextes, on utilisait une combinaison d’objets Label et Hyperlink Cela peut devenir assez contraignant de manipuler des composants SWT (répétition et lourdeur du code) Le composant FormText permet de résoudre en offrant Un rendu de texte (avec retour automatique à la ligne) Une gestion automatique des liens hypertextes (tout mot débutant par http:// est désigné comme URL) Une prise en compte des balises proches du HTML keulkeul.blogspot.com Le point d’entrée du composant FormText reste du texte void setText(String text, boolean parseTags, boolean expandURLS) : le contenu à afficher est défini dans text. Si parseTags vaut TRUE les balises dans text sont prises en compte. Si expandURLS vaut TRUE la gestion automatique des liens hypertextes est activéePage 37 Eclipse Forms - M. Baron -
  38. 38. Eclipse Forms : FormText FormText peut traiter du contenu XML dont la balise racine doit être form Les balises suivantes peuvent être enfants de form p : définit un paragraphe, l’attribut suivant est autorisé vspace : si true espace vertical ajouté, si false pas d’espace li : définit des listes d’élément, les attributs suivants sont autorisés vspace : si true espace vertical ajouté, si false pas d’espace style : le style de la puce bullet, text ou image keulkeul.blogspot.com value : valeur pour le style uniquement pour text et image indent : espace en pixel pour indenter le texte après la puce bindent : espace en pixel pour indenter la puce Eclipse Forms - M. Baron - Page 38
  39. 39. Eclipse Forms : FormText Des sous balises à p et li peuvent être utilisées img : afficher une image, l’attribut suivant est autorisé href : référence de l’image (voir transparent suivant) align : alignement de l’image par rapport au texte. Les valeurs autorisées sont top, middle et bottom a : afficher un lien, les attributs suivant sont autorisés href : lien hypertexte envoyé à l’événement nowrap : si true le lien peut être coupé b et br : pour afficher le texte en gras et retour à la ligne span : spécifie couleur et fonte du texte color : référence de la couleur (voir transparent suivant) keulkeul.blogspot.com font : référence de la fonte (voir transparent suivant) nowrap : si true le texte peut être coupé control : pour ajouter un control SWT (FormText étant le parent) href : référence au control (voir transparent Forms - M. Baron - Page 39 Eclipse suivant)
  40. 40. Eclipse Forms : FormText La particularité du composant FormText est de dissocier la définition des ressources (Image, Couleur et Fonte) de la structure de la page La définition est réalisée par directement par l’API de FormText ce qui permet d’utiliser des ressources déjà définies dans le Workbench void setImage(String key, Image img) : création d’une référence d’une image identifiée par key void setFont(String key, Font font) : création d’une référence d’une fonte identifiée par key keulkeul.blogspot.com void setColor(String key, Color color) : création d’une référence d’une couleur identifiée par key void setControl(String key, Control control) : création d’une référence sur un Control SWT identifiée par key Forms - M. Baron - Page Eclipse 40
  41. 41. Eclipse Forms : FormText Exemple : FormText en action Ajout de liens hypertextes Utilisation d’une fonte et Tout ce contenu est défini d’une couleur spécifiques dans un texte décoré de balises HTML Des puces qui peuvent prendre des apparences différentes <form> <p>Here is some plain text for the text to render; this text is at <a href="http://www.eclipse.org" nowrap="true">http://www.eclipse.org</a> web site.</p> <p><span color="header" font="header"> This text is in header font and color.</span></p> <p>This line will contain some <b>bold</b> and some <span font="code">source</span> text. We can also add keulkeul.blogspot.com <img href="image"/> an image.</p> <li>A default (bulleted) list item.</li> <li>Another bullet list item.</li> <li style="text" value="1.">A list item with text.</li> <li style="text" value="2.">Another list item with text</li> <li style="image" value="image">List item with an image bullet</li> <li style="text" bindent="20" indent="40" value="3."> A list item with text.</li> <li style="text" bindent="20" indent="40" value="4."> A list item with text.</li> <p> leading blanks; more white nn new lines <br/> n more <b> bb </b> white . </p> </form> Eclipse Forms - M. Baron - Page 41
  42. 42. Eclipse Forms : FormText Exemple (suite) : FormText en action package eclipse.workbench.eclipseformsexample.views; public class FormTextPart extends ViewPart { public void createPartControl(Composite parent) { ... StringBuffer buf = new StringBuffer(); buf.append("<form>"); buf.append("<p>Here is some plain text for the text to render; "); buf.append("this text is at <a href="http://www.eclipse.org" " + "nowrap="true">http://www.eclipse.org</a> web site.</p>"); buf.append("<p>"); buf.append("<p><span color="header" font="header">" + "This text is in header font and color.</span></p>"); La fonte identifiée par buf.append("<p>This line will contain some <b>bold</b> and " header est référencée + "some <span font="code">source</span> text. "); buf.append("We can also add <img href="image"/> an image.</p>"); dans la suite buf.append("<li>A default (bulleted) list item.</li>"); buf.append("<li>Another bullet list item.</li>"); buf.append("<li style="text" value="1.">A list item with text.</li>"); buf.append("<li style="text" value="2.">Another list item with text</li>"); buf.append("<li style="image" value="image">List item with an image bullet</li>"); buf.append("<li style="text" bindent="20" indent="40" value="3.">" keulkeul.blogspot.com + "A list item with text.</li>"); buf.append("<li style="text" bindent="20" indent="40" value="4.">" + "A list item with text.</li>"); buf.append("<p> leading blanks; more white nn new " + "lines <br/> n more <b> bb </b> white . </p>"); buf.append("</form>"); } // Suite dans le prochain transparent. Classe FormTextPart.java du projet } eclipseformsexample Eclipse Forms - M. Baron - Page 42
  43. 43. Eclipse Forms : FormText Exemple (suite) : FormText en action Classe FormTextPart.java du projet eclipseformsexample package eclipse.workbench.eclipseformsexample.views; public class FormTextPart extends ViewPart { Les espaces « enchainés » ne public void createPartControl(Composite parent) { sont pas pris en comptes // Suite du précédent transparent FormText formText = toolkit.createFormText(form.getBody(), true); formText.setWhitespaceNormalized(false); Création d’une référence Image identifiée par image formText.setImage("image", Activator.getDefault().getImageRegistry() .get(Activator.TINY_ECLIPSE_LOGO)); Création d’une référence Color identifiée par header formText.setColor("header", toolkit.getColors().getColor(IFormColors.TITLE)); formText.setFont("header", JFaceResources.getHeaderFont()); formText.setFont("code", JFaceResources.getTextFont()); Création de références keulkeul.blogspot.com formText.setText(buf.toString(), true, false); Font identifiées par formText.addHyperlinkListener(new HyperlinkAdapter() { header et code public void linkActivated(HyperlinkEvent e) { System.out.println("Link active: " + e.getHref()); } }); Ajout d’un écouteursur les liens } } hypertextes découverts par FormText Eclipse Forms - M. Baron - Page 43
  44. 44. Eclipse Forms : FormText Exemple : FormText et la gestion des espaces Prise en compte des espaces successifs package eclipse.workbench.eclipseformsexample.views; keulkeul.blogspot.com public class FormTextPart extends ViewPart { public void createPartControl(Composite parent) { ... FormText formText = toolkit.createFormText(form.getBody(), true); formText.setWhitespaceNormalized(true); ... } } Classe FormTextPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 44
  45. 45. Eclipse Forms : FormText Exemple : FormText et l’intégration d’objets Control SWT package eclipse.workbench.eclipseformsexample.views; public class FormTextWithSWTControlPart extends ViewPart { public void createPartControl(Composite parent) { ... StringBuffer buf = new StringBuffer(); buf.append("<form>"); buf.append("<p>"); buf.append("Here is some plain text for the text to render; "); buf.append("this text is at <a href="http://www.eclipse.org" " + "nowrap="true">http://www.eclipse.org</a> web site." Dans le contenu + "<control href="mybutton"/></p>"); buf.append("<p><control href="mytable"/>"); texte, liaison avec buf.append("</p>"); buf.append("</form>"); deux objets Control FormText formText = toolkit.createFormText(form.getBody(), true); formText.setWhitespaceNormalized(false); Construction des Button myButton = new Button(formText, SWT.FLAT); myButton.setText("Bonjour"); deux objets Control formText.setControl("mybutton", myButton); dont le parent est keulkeul.blogspot.com Table createTable = toolkit.createTable(formText, SWT.FULL_SELECTION); createTableViewer(createTable); FormText formText.setControl("mytable", createTable); formText.setText(buf.toString(), true, false); FormText ne gère pas la } } destruction des objets Control (dispose) Classe FormTextWithSWTControlPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 45
  46. 46. Eclipse Forms : MasterDetailsBlock Le composant MasterDetailsBlock est un patron de conception orienté graphique qui permet de séparer un objet Form en deux parties Master : un composant Viewer offrant une sélection (ListViewer, TableViewer, TreeViewer, …) Details (DetailsPart) : un ensemble de propriétés (affichées par des composants SWT) qui réagit à la sélection du Master La partie Details est composé d’un ensemble de DetailsPage Le choix de la DetailsPage est fonction de l’élément sélection- keulkeul.blogspot.com né dans la partie Master Les parties Master et Details sont contenues dans un SashForm permettant à l’utilisateur de modifier la taille de chaque partie Eclipse Forms - M. Baron - Page 46
  47. 47. Eclipse Forms : MasterDetailsBlock Partie Master Des actions peuvent être définies spécifiquement pour le MasterDetailsBlock keulkeul.blogspot.com A chaque modification de sélection de la partie Partie Details (DetailsPart) Master, choix de la DetailsPage et modification de son contenu Eclipse Forms - M. Baron - Page 47
  48. 48. Eclipse Forms : MasterDetailsBlock Un composant MasterDetailsBlock est défini par la classe abstraite MasterDetailsBlock Trois méthodes doivent être implémentées void createMasterPart(IManagedForm mf, Composite parent) : construction de l’IHM de la partie Master void createToolBarActions(IManagedForm mf) : ajout des actions spécifiques pour le MasterDetailsBlock void registerPages(DetailsPart detailsPart) : ajout de nouveaux objets DetailsPages dans le DetailsPart keulkeul.blogspot.com Le composant MasterDetailsBlock nécessite l’utilisation d’un objet IManagedForm IManagedForm encapsule un composant Form et lui ajoute des méthodes pour gérer son cycle de Eclipse Forms - M. Baron - Page vie 48
  49. 49. Eclipse Forms : MasterDetailsBlock Exemple : Initialiser un composant MasterDetailsBlock package eclipse.workbench.eclipseformsexample.views; public class MasterDetailsBlockPart extends ViewPart { Construction d’un public MasterDetailsBlockPart() { MasterDetailsBlock (voir } implémentation dans la suite) @Override public void createPartControl(Composite parent) { FormToolkit toolkit = new FormToolkit(parent.getDisplay()); ScrolledForm form = toolkit.createScrolledForm(parent); form.setText("MasterDetails block Example"); toolkit.decorateFormHeading(form.getForm()); MyMasterDetailsBlock refMasterDetailsBlock = new MyMasterDetailsBlock(); ManagedForm refManagedForm = new ManagedForm(toolkit, form); refMasterDetailsBlock.createContent(refManagedForm); } Construction d’un ManagedForm @Override public void setFocus() { à partir d’un Form keulkeul.blogspot.com } } Associer le ManagedForm au MasterDetailsBlock Classe MasterDetailsBlockPart.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 49
  50. 50. Eclipse Forms : MasterDetailsBlock Exemple (suite) : Construire l’IHM de la partie Master package eclipse.workbench.eclipseformsexample.views; public class MyMasterDetailsBlock extends MasterDetailsBlock { protected void createMasterPart(final IManagedForm managedForm, Composite parent) { FormToolkit toolkit = managedForm.getToolkit(); Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR); section.setText("Persons"); section.setDescription("The list contains objects from the model whose details are ..."); Composite client = toolkit.createComposite(section, SWT.WRAP); Table t = toolkit.createTable(client, SWT.FULL_SELECTION); ... toolkit.paintBordersFor(client); section.setClient(client); Créationd’une SectionPart pour final SectionPart spart = new SectionPart(section); être gérée par ManagedForm managedForm.addPart(spart); viewer = new TableViewer(t); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { managedForm.fireSelectionChanged(spart, event.getSelection()); } keulkeul.blogspot.com }); viewer.setContentProvider(new MyStructuredContentProvider()); viewer.setLabelProvider(new MyTableLabelProvider()); viewer.setInput(...); A chaque changement de la } sélection, la SelectionPart est ... } notifiée Classe MyMasterDetailsBlock.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 50
  51. 51. Eclipse Forms : MasterDetailsBlock Exemple (suite) : Ajouter des actions package eclipse.workbench.eclipseformsexample.views; public class MyMasterDetailsBlock extends MasterDetailsBlock { ... Suite du précédent transparent. protected void createToolBarActions(IManagedForm managedForm) { final ScrolledForm form = managedForm.getForm(); Action haction = new Action("hor", Action.AS_RADIO_BUTTON) { public void run() { sashForm.setOrientation(SWT.HORIZONTAL); form.reflow(true); } }; haction.setToolTipText("Horizontal Orientation"); haction.setImageDescriptor(Activator.getDefault().getImageRegistry() .getDescriptor(Activator.IMG_HORIZONTAL)); Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) { public void run() { sashForm.setOrientation(SWT.VERTICAL); form.reflow(true); } }; vaction.setToolTipText("Vertical Orientation"); keulkeul.blogspot.com vaction.setImageDescriptor(Activator.getDefault().getImageRegistry() .getDescriptor(Activator.IMG_VERTICAL)); form.getToolBarManager().add(haction); form.getToolBarManager().add(vaction); } Ajout des actions au ... } ManagedForm Classe MyMasterDetailsBlock.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 51
  52. 52. Eclipse Forms : MasterDetailsBlock Exemple (suite) : Ajouter des DetailsPage Classe MyMasterDetailsBlock.java du projet eclipseformsexample package eclipse.workbench.eclipseformsexample.views; public class MyMasterDetailsBlock extends MasterDetailsBlock { ... Suite du précédent transparent. protected void registerPages(DetailsPart detailsPart) { detailsPart.registerPage(TablePerson.class, new MyDetailsPage(viewer)); } } Quand l’élément sélectionné est de type TablePerson la page MyDetailsPage sera keulkeul.blogspot.com affichée dans la partie Details du composant MasterDetailsBlock Eclipse Forms - M. Baron - Page 52
  53. 53. Eclipse Forms : MasterDetailsBlock Un DetailsPage est utilisé pour construire les interfaces utilisateur de la partie Details Pour rappel la partie Details est composé d’un ensemble de DetailsPage Un DetailsPage est défini par l’interface IDetailsPage void initialize(IManagedForm form) : appelée lors de la construction d’un objet IDetailsPage et permet de stocker un objet IManagedForm void createContents(Composite parent) : construction de l’IHM keulkeul.blogspot.com void selectionChanged(IFormPart part, ISelection selection) : appelée quand la partie Master a notifié d’un changement La notification du changement est réalisée par la méthode fireSelectionChanged(IFormPart, ISelection) d’un objet IManagedForm Eclipse Forms - M. Baron - Page 53
  54. 54. Eclipse Forms : MasterDetailsBlock Exemple (suite) : Création d’un DetailsPage package eclipse.workbench.eclipseformsexample.views; public class MyDetailsPage implements IDetailsPage { Cette méthode est utilisée pour ... public void createContents(Composite parent) { construire l’IHM de la DetailsPage FormToolkit toolkit = mform.getToolkit(); Section s1 = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR); s1.setText("Person Edit Details"); s1.setDescription("Set the properties of the selected Person object."); ... tabText = new Text[4]; tabText[0] = addNewLabelText(client, "Name", new ModifyListener() { public void modifyText(ModifyEvent e) { input.setName(tabText[0].getText()); ref.refresh(input); } }); ... Chaque modification de l’IHM toolkit.paintBordersFor(s1); s1.setClient(client); impacte la partie modèle } private Text addNewLabelText(Composite client, String name, ModifyListener ref) { FormToolkit toolkit = mform.getToolkit(); keulkeul.blogspot.com toolkit.createLabel(client, name); Text text = toolkit.createText(client, "", SWT.SINGLE); //$NON-NLS-1$ text.addModifyListener(ref); GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); gd.widthHint = 10; text.setLayoutData(gd); createSpacer(toolkit, client, 10); return text; MyDetailsPage.java Classe du projet } eclipseformsexample ... // Suite dans le prochain transparent. } Eclipse Forms - M. Baron - Page 54
  55. 55. Eclipse Forms : MasterDetailsBlock Exemple (suite) : Création d’un DetailsPage package eclipse.workbench.eclipseformsexample.views; public class MyDetailsPage implements IDetailsPage { Cette méthode est appelée, lors ... // Suite du précédent transparent. de la modification de la sélection public void initialize(IManagedForm form) { de la partie Master this.mform = form; } public void selectionChanged(IFormPart part, ISelection selection) { IStructuredSelection ssel = (IStructuredSelection) selection; if (ssel.size() == 1) { input = (TablePerson)ssel.getFirstElement(); } else { input = null; } update(); L’objet de la sélection de } type TablePerson est private void update() { conservé tabText[0].setText(input.getName()); tabText[1].setText(input.getFirstName()); tabText[2].setText(input.getSportName()); keulkeul.blogspot.com tabText[3].setText(Integer.toString(input.getOld())); flag.setSelection(input.isVegetarian()); Tous les éléments graphiques sont mis } à jour en fonction de nouvelles valeurs ... // D’autres méthodes qui sont implémentées à vide. contenues dans la sélection courante } Classe MyDetailsPage.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 55
  56. 56. Eclipse Forms : Multi-page FormEditor Un composant FormEditor permet d’ajouter des Forms dans un MultiPageEditorPart Pour rappel un MultiPageEditorPart est un éditeur avec plusieurs pages où chaque page peut contenir un éditeur (EditorPart) ou un composant SWT Un FormEditor permet d’ajouter des FormPage ayant le comportement d’un EditorPart mais supportant les Forms keulkeul.blogspot.com Une page contenant un éditeur dont le contenu est représenté via des Forms Eclipse Forms - M. Baron - Page 56
  57. 57. Eclipse Forms : Multi-page FormEditor Exemple : Créer un FormEditor avec deux pages public class SimpleFormEditor extends FormEditor { public SimpleFormEditor() { } Deux pages ont été ajoutées au protected void addPages() { FormEditor try { this.addPage(new FirstFormPage(this)); this.addPage(new SecondFormPage(this)); } catch (PartInitException e) { e.printStackTrace(); } } public void doSave(IProgressMonitor monitor) { } public void doSaveAs() { } public boolean isSaveAsAllowed() { return false; Un FormEditor se comporte comme keulkeul.blogspot.com } un MultiPageEditorPart. } Des informations supplémentaires sont disponibles dans le support de cours sur les éditeurs Classe SimpleFormEditor.java du projet eclipseformsexample Eclipse Forms - M. Baron - Page 57
  58. 58. Eclipse Forms : Multi-page FormEditor Exemple (suite) : Créer un FormEditor avec deux pages public class FirstFormPage extends FormPage { public FirstFormPage(FormEditor f) { super(f, "first","FirstPage"); } Classe SecondFormPage.java du protected void createFormContent(IManagedForm managedForm) { projet Eclipseformsexample FormToolkit toolkit = managedForm.getToolkit(); final ScrolledForm form = managedForm.getForm(); form.setText("First Page Content"); toolkit.decorateFormHeading(form.getForm()); GridLayout layout = new GridLayout(); layout.numColumns = 1; public class SecondFormPage extends FormPage { form.getBody().setLayout(layout); // Label component. public SecondFormPage(FormEditor f) { super(f, "second","SecondPage"); toolkit.createLabel(form.getBody(), "Eclipse Form Label"); } } } protected void createFormContent(IManagedForm managedForm) { FormToolkit toolkit = managedForm.getToolkit(); final ScrolledForm form = managedForm.getForm(); keulkeul.blogspot.com form.setText("Second Page Content"); toolkit.decorateFormHeading(form.getForm()); Classe FirstFormPage.java du GridLayout layout = new GridLayout(); layout.numColumns = 1; projet eclipseformsexample form.getBody().setLayout(layout); // Button component with push style. toolkit.createButton(form.getBody(), "Eclipse Form Button", SWT.PUSH); } } Eclipse Forms - M. Baron - Page 58

×