construction d'eclipse forms avec la plateforme eclipse

58
Développement de clients riches : Plateforme Eclipse Mickaël BARON - 2010 mailto:[email protected] ou mailto:[email protected] Chapitre 3 : Conception de plug Chapitre 3 : Conception de plug - - ins ins Workbench : Eclipse Forms

Upload: mickael-baron

Post on 01-Jun-2015

5.199 views

Category:

Technology


2 download

DESCRIPTION

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.

TRANSCRIPT

Page 1: Construction d'Eclipse Forms avec la plateforme Eclipse

Développement de clients riches : Plateforme Eclipse

Mickaël BARON - 2010 mailto:[email protected] ou mailto:[email protected]

Chapitre 3 : Conception de plugChapitre 3 : Conception de plug--insins

Workbench : Eclipse Forms

Page 2: Construction d'Eclipse Forms avec la plateforme Eclipse

2Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Creative Commons

Contrat Paternité

Partage des Conditions Initiales à l'Identique

2.0 France

http://creativecommons.org/licenses/by-sa/2.0/fr

Licence

Page 3: Construction d'Eclipse Forms avec la plateforme Eclipse

3Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Organisation du cours sur le Workbench : Eclipse Forms

Tous les exemples du cours sont disponibles directement à l’adressembaron.developpez.com/eclipse/forms

� FormToolkit

� Form et ScrolledForm

� Agents de placement

� Composants

� ExpandableComposite, Section, PageBook, FormText

� MasterDetailsBlock

� FormEditor

Page 4: Construction d'Eclipse Forms avec la plateforme Eclipse

4Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Workbench Eclipse Forms : déroulement du cours

Ceci est une alerte

Ceci est une astuce

� 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

� Eclipse 3.6 Helios

� Pré-requis

� Connaître la structure d’un plug-ins et savoir créer une extension

� Structure du Workbench

Page 5: Construction d'Eclipse Forms avec la plateforme Eclipse

5Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comWorkbench 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

Page 6: Construction d'Eclipse Forms avec la plateforme Eclipse

6Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

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

Page 7: Construction d'Eclipse Forms avec la plateforme Eclipse

7Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : Généralités

� Exemple : IHMs du PDE développées avec Eclipse Forms

Une apparence homogène digne des IHMs du Web

Page 8: Construction d'Eclipse Forms avec la plateforme Eclipse

8Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

obtenir des interfaces homogènes

� Construction d’un objet FormToolkitFormToolkit formtoolkit = new FormToolkit(parent.getD isplay());

Page 9: Construction d'Eclipse Forms avec la plateforme Eclipse

9Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormToolkit

� Exemple : HelloWorld avec Eclipse Forms

package eclipse.workbench.eclipseformsexample.views ;

public class HelloWorldPart extends ViewPart {

public HelloWorldPart() {}

public void createPartControl(Composite parent) {FormToolkit toolkit = new FormToolkit(parent.getDisplay());ScrolledForm form = toolkit.createScrolledForm(parent);form.setText("Hello World with Eclipse Forms");

toolkit.decorateFormHeading(form.getForm());}

public void setFocus() {}

}

Classe HelloWorldPart.java du projet eclipseformsexample

Un objet FormToolkit utilisé

comme fabrique des

composants Eclipse Forms

Depuis la version 3.3

possibilité de modifier

l’apparence de l’en-tête

Page 10: Construction d'Eclipse Forms avec la plateforme Eclipse

10Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormToolkit

� Exemple : Composants SWT sans FormToolkitpackage eclipse.workbench.eclipseformsexample.views ;

public class NativeSWTPart extends ViewPart {

public NativeSWTPart() {}

public void createPartControl(Composite parent) {FormToolkit toolkit = new FormToolkit(parent.getDispl ay());ScrolledForm form = toolkit.createScrolledForm(parent );form.setText("Native SWT components with Eclipse For ms");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);button.setText("A SWT natif checkbox component in a form");GridData gd = new GridData();gd.horizontalSpan = 2;button.setLayoutData(gd);

}}

Classe NativeSWTPart.java du projet eclipseformsexample

Les composants SWT ne

sont pas construits à

partir de FormToolkit

Nécessitera une

modification du code pour

uniformiser l’apparence

Page 11: Construction d'Eclipse Forms avec la plateforme Eclipse

11Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormToolkit

� Exemple : Composants SWT avec FormToolkitpackage eclipse.workbench.eclipseformsexample.views ;

public class NoNativeSWTPart extends ViewPart {

public NoNativeSWTPart() {}

public void createPartControl(Composite parent) {FormToolkit toolkit = new FormToolkit(parent.getDispl ay());ScrolledForm form = toolkit.createScrolledForm(parent );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);GridData gd = new GridData();gd.horizontalSpan = 2;button.setLayoutData(gd);

}}

Classe NoNativeSWTPart.java du projet eclipseformsexample

Les composants SWT ne

sont construits à partir de

FormToolkit

L’apparence des

interfaces est uniforme

Page 12: Construction d'Eclipse Forms avec la plateforme Eclipse

12Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

Corps des Forms

En-tête

Page 13: Construction d'Eclipse Forms avec la plateforme Eclipse

13Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

� De cette manière tout ce qui est accessible dans Form

(corps, en-tête, …) peut l’être à partir d’un ScrolledForm

Page 14: Construction d'Eclipse Forms avec la plateforme Eclipse

14Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : customiser Form et ScrolledForm

� L’en-tête d’un composant Form peut être customisé

Image

personnalisée

Ajout d’un menu

Ajout d’actions

dans la barre

d’outils

Personnalisation de la

zone cliente de l’en-tête

Gestion des

messagesImage adaptée en

fonction de la gravité

du message

Page 15: Construction d'Eclipse Forms avec la plateforme Eclipse

15Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

(IMessageProvider.WARNING, ERROR, NONE, INFORMATION)

� void addMessageHyperlinkListener(IHyperlinkListener hl) : écouteur

sur le lien du message

� …

Page 16: Construction d'Eclipse Forms avec la plateforme Eclipse

16Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : customiser Form et ScrolledForm

� Exemple : Customisation de l’en-tête d’un Formpackage eclipse.workbench.eclipseformsexample.views ;

public class FormCustomizationPart extends ViewPart {

public FormCustomizationPart() {}

public void createPartControl(Composite parent) {FormToolkit toolkit = new FormToolkit(parent.getDispl ay());final ScrolledForm form = toolkit.createScrolledForm( parent);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}

}

Classe FormCustomizationPart.java du projet eclipseformsexample

Création d’un bouton

dans la zone client de

l’en-tête

Page 17: Construction d'Eclipse Forms avec la plateforme Eclipse

17Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : customiser Form et ScrolledForm

� Exemple (suite) : Customisation de l’en-tête d’un Form

form.getForm().getMenuManager().add(new Action("Men uBar Action",Activator.getDefault().getImageRegistry().getDescri ptor(Activator.TINY_ECLIPSE_LOGO)) { });

form.getForm().getMenuManager().update(true);form.getForm().addMessageHyperlinkListener(new Hype rlinkAdapter() {

public void linkActivated(HyperlinkEvent e) {System.out.println("Link active : " + e.getLabel()) ;form.getForm().setMessage(null);

}});form.getForm().setMessage("This is an error message", IMessageProvider.WARNING);

}}

Classe FormCustomizationPart.java du projet eclipseformsexample

Création de menus à

partir du gestionnaire de

menu

Ajout d’un écouteur sur

le lien du message

Ecriture d’un message

dans l’en-tête

Page 18: Construction d'Eclipse Forms avec la plateforme Eclipse

18Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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(…)

� Text via createText(…)

� Table via createTable(…)

� Tree via createTree(…)

Page 19: Construction d'Eclipse Forms avec la plateforme Eclipse

19Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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.getDispl ay());

ScrolledForm form = toolkit.createScrolledForm(parent );form.setText("All Eclipse Form Supported Components") ;toolkit.decorateFormHeading(form.getForm());

GridLayout layout = new GridLayout();layout.numColumns = 1;form.getBody().setLayout(layout);

// 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");

// 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.javadu projet eclipseformsexample

Utilisation de fabriques

pour construire des

objets SWT

Page 20: Construction d'Eclipse Forms avec la plateforme Eclipse

20Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse Forms : Composants supportés

� Exemple (suite) : Composants supportés

// 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);...

}

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

Classe SupportedComponentPart.javadu projet eclipseformsexample

Page 21: Construction d'Eclipse Forms avec la plateforme Eclipse

21Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

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(…)

Page 22: Construction d'Eclipse Forms avec la plateforme Eclipse

22Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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

Page 23: Construction d'Eclipse Forms avec la plateforme Eclipse

23Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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é

� int rowspan : nombre de ligne occupée

� Les différentes constantes utilisées

� 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

L’alignement horizontal et vertical doit être

précisé à la construction

Page 24: Construction d'Eclipse Forms avec la plateforme Eclipse

24Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Classe TableWrapLayoutPart.java du projet eclipseformsexample

Page 25: Construction d'Eclipse Forms avec la plateforme Eclipse

25Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getDispl ay());

ScrolledForm form = toolkit.createScrolledForm(parent );form.setText("TableWrapLayout Layout Example");toolkit.decorateFormHeading(form.getForm());

TableWrapLayout layout = new TableWrapLayout();layout.verticalSpacing = 25;form.getBody().setLayout(layout);

layout.numColumns = 3;Label label;TableWrapData td;

label = toolkit.createLabel(form.getBody(), "What ha ppened? Remember that we are ...", SWT. WRAP);td = new TableWrapData();td.colspan = 3;label.setLayoutData(td);

...}

}

Classe TableWrapLayoutPart.java du projet eclipseformsexample

Création de l’agent de placement

TableWrapLayout

TableWrapData fournit des paramètres de TableWrapLayout

spécifique à label

Page 26: Construction d'Eclipse Forms avec la plateforme Eclipse

26Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� Paramétrages après sa construction

� int minNumColumns : nombre de colonne minimum

� int maxNumColumns : nombre de colonne maximum

Page 27: Construction d'Eclipse Forms avec la plateforme Eclipse

27Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getDispl ay());

ScrolledForm form = toolkit.createScrolledForm(parent );form.setText("TableWrapLayout Layout Example");toolkit.decorateFormHeading(form.getForm());

ColumnLayout layout = new ColumnLayout();layout.minNumColumns = 1;layout.maxNumColumns = 2;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);

label = toolkit.createLabel(form.getBody(),"Second Content used to demonstrate ColumnLayout", SW T.WRAP);

label = toolkit.createLabel(form.getBody(), "Third Content used to d emonstrate ColumnLayout", SWT.WRAP);

cld = new ColumnLayoutData();label.setLayoutData(cld);

}}

Classe ColumnLayoutPart.java du projet eclipseformsexample

1 colonne minimum et 2

colonnes maximum

Page 28: Construction d'Eclipse Forms avec la plateforme Eclipse

28Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

Page 29: Construction d'Eclipse Forms avec la plateforme Eclipse

29Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

Une icône pour le rendu qui

indique si le composant est en

mode réduit ou déplié

Lorsque le composant

ExpandableComposite est déplié, le composant client est

affiché (Control ou Composite)

Page 30: Construction d'Eclipse Forms avec la plateforme Eclipse

30Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

� 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é)

Page 31: Construction d'Eclipse Forms avec la plateforme Eclipse

31Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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.getDispl ay());

final ScrolledForm form = toolkit.createScrolledForm( parent);form.setText("Expandable Composite Example");toolkit.decorateFormHeading(form.getForm());

TableWrapLayout layout = new TableWrapLayout();form.getBody().setLayout(layout);

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", S WT.RADIO);toolkit.createButton(expandableClient, "Radio 2", S WT.RADIO);

ec.setClient(expandableClient);ec.addExpansionListener(new ExpansionAdapter() {

public void expansionStateChanged(ExpansionEvent e) {form.reflow(true);

}});

}}

Classe ExpandableCompositePart.javadu projet eclipseformsexample

Création d’un

ExpandableCompositeavec un style particulier

Page 32: Construction d'Eclipse Forms avec la plateforme Eclipse

32Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 constitué d’un titre décoré

Le composant Section est constitué d’un composant

description (Control)

Lorsque le composant Section est déplié, le

composant client est affiché (Control ou Composite)

Page 33: Construction d'Eclipse Forms avec la plateforme Eclipse

33Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getDispl ay());

final ScrolledForm form = toolkit.createScrolledForm( parent);form.setText("Section Composite Example");toolkit.decorateFormHeading(form.getForm());

TableWrapLayout layout = new TableWrapLayout();form.getBody().setLayout(layout);

Section section = toolkit.createSection(form.getBody(),Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE

| Section.EXPANDED);TableWrapData td = new TableWrapData(TableWrapData.F ILL_GRAB);section.setLayoutData(td);

section.setText("Section title");section

.setDescription("This is the description that goes bel ow the title");

Composite sectionClient = toolkit.createComposite(se ction);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

Si style DESCRIPTION est précisé,

une zone pour une description est

prévue sous le titre

Page 34: Construction d'Eclipse Forms avec la plateforme Eclipse

34Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

par key

� Control getCurrentPage() : récupère la page en cours

� void showPage(Object key) : affiche la page identifié par key

Page 35: Construction d'Eclipse Forms avec la plateforme Eclipse

35Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.getDispl ay());

final ScrolledForm form = toolkit.createScrolledForm( parent);form.setText("PageBook Composite Example");toolkit.decorateFormHeading(form.getForm());

TableWrapLayout layout = new TableWrapLayout();layout.numColumns = 2;layout.topMargin = 0;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);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

Création d’un composant

ScrolledPageBook

Page 36: Construction d'Eclipse Forms avec la plateforme Eclipse

36Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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.F ILL_GRAB);td.heightHint = 80;td.colspan = 2;pageBook.setLayoutData(td);

pageBook.showPage("page 1");

final Button createButton = toolkit.createButton(form .getBody(), "Show Page 1", SWT.FLAT);createButton.addSelectionListener(new SelectionAdap ter() {

public void widgetSelected(SelectionEvent e) { pageBook.showPage("page 1"); }

});final Button createButton2 = toolkit.createButton(fo rm.getBody(), "Show Page 2", SWT.FLAT);createButton2.addSelectionListener(new SelectionAda pter() {

public void widgetSelected(SelectionEvent e) { pageBook.showPage("page 2"); }

});}

}

Classe PageBookPart.java du projet eclipseformsexample

A l’ouverture de la vue, la page

identifiée par « page 1 » sera visible

Page 37: Construction d'Eclipse Forms avec la plateforme Eclipse

37Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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 TRUEles balises dans text sont prises en compte. Si expandURLS vaut TRUE la gestion automatique des liens hypertextes est activée

Page 38: Construction d'Eclipse Forms avec la plateforme Eclipse

38Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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

Page 39: Construction d'Eclipse Forms avec la plateforme Eclipse

39Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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 valeursautorisé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)

� 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 suivant)

Page 40: Construction d'Eclipse Forms avec la plateforme Eclipse

40Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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

Page 41: Construction d'Eclipse Forms avec la plateforme Eclipse

41Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormText

� Exemple : FormText en action

Tout ce contenu est défini

dans un texte décoré de

balises HTML

<form><p>Here is some plain text for the text to render; this t ext 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 <sp an font=\"code\">source</span> text. We can also add<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 wit h text</li><li style=\"image\" value=\"image\">List item with a n image bullet</li><li style=\"text\" bindent=\"20\" indent=\"40\" val ue=\"3.\"> A list item with text.</li><li style=\"text\" bindent=\"20\" indent=\"40\" val ue=\"4.\"> A list item with text.</li><p> leading blanks; more white \n\n new line s <br/> \n more <b> bb </b> white . </p></form>

Utilisation d’une fonte et

d’une couleur spécifiques

Ajout de liens hypertextes

Des puces qui peuvent prendre

des apparences différentes

Page 42: Construction d'Eclipse Forms avec la plateforme Eclipse

42Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormText

� Exemple (suite) : FormText en actionpackage 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 r ender; ");buf.append("this text is at <a href=\"http://www.eclips e.org\" "

+ "nowrap=\"true\">http://www.eclipse.org</a> web s ite.</p>");buf.append("<p>");buf.append("<p><span color=\"header\" font=\"header\">"

+ "This text is in header font and color.</span></p>" );buf.append("<p>This line will contain some <b>bold</b> and "

+ "some <span font=\"code\">source</span> text. ");buf.append("We can also add <img href=\"image\"/> an image.</p>");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 i tem with text.</li>");buf.append("<li style=\"text\" value=\"2.\">Another list item with text</li>");buf.append("<li style=\"image\" value=\"image\">Lis t item with an image bullet</li>");buf.append("<li style=\"text\" bindent=\"20\" inden t=\"40\" value=\"3.\">"

+ "A list item with text.</li>");buf.append("<li style=\"text\" bindent=\"20\" inden t=\"40\" value=\"4.\">"

+ "A list item with text.</li>");buf.append("<p> leading blanks; more white \n\n new "

+ "lines <br/> \n more <b> bb </b> white . </p >");buf.append("</form>");

// Suite dans le prochain transparent.}

}

Classe FormTextPart.java du projet eclipseformsexample

La fonte identifiée par

header est référencée dans la suite

Page 43: Construction d'Eclipse Forms avec la plateforme Eclipse

43Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormText

� Exemple (suite) : FormText en action

package eclipse.workbench.eclipseformsexample.views ;

public class FormTextPart extends ViewPart {public void createPartControl(Composite parent) {

// Suite du précédent transparent FormText formText = toolkit.createFormText(form.getBo dy(), true);formText.setWhitespaceNormalized(false);

formText.setImage("image", Activator.getDefault().getImageRegistry().get(Activator.TINY_ECLIPSE_LOGO));

formText.setColor("header", toolkit.getColors().getColor(IFormColors .TITLE));

formText.setFont("header", JFaceResources.getHeaderFont());formText.setFont("code", JFaceResources.getTextFont());

formText.setText(buf.toString(), true, false);

formText.addHyperlinkListener(new HyperlinkAdapter( ) {public void linkActivated(HyperlinkEvent e) {

System.out.println("Link active: " + e.getHref());}

});}

}

Classe FormTextPart.java du projet eclipseformsexample

Les espaces « enchainés » ne

sont pas pris en comptes

Création d’une référence

Image identifiée par image

Création d’une référence

Color identifiée par header

Création de références

Font identifiées par header et code

Ajout d’un écouteur sur les liens

hypertextes découverts par FormText

Page 44: Construction d'Eclipse Forms avec la plateforme Eclipse

44Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormText

� Exemple : FormText et la gestion des espaces

package eclipse.workbench.eclipseformsexample.views ;

public class FormTextPart extends ViewPart {public void createPartControl(Composite parent) {

...FormText formText = toolkit.createFormText(form.getBo dy(), true);formText.setWhitespaceNormalized(true);...

}}

Classe FormTextPart.java du projet eclipseformsexample

Prise en compte des

espaces successifs

Page 45: Construction d'Eclipse Forms avec la plateforme Eclipse

45Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : FormText

� Exemple : FormText et l’intégration d’objets Control SWTpackage eclipse.workbench.eclipseformsexample.views ;

public class FormTextWithSWTControlPart extends ViewP art {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 rend er; ");buf.append("this text is at <a href=\"http://www.eclips e.org\" "

+ "nowrap=\"true\">http://www.eclipse.org</a> web s ite."+ "<control href=\"mybutton\"/></p>");

buf.append("<p><control href=\"mytable\"/>");buf.append("</p>");buf.append("</form>");

FormText formText = toolkit.createFormText(form.getBo dy(), true);formText.setWhitespaceNormalized(false);

Button myButton = new Button(formText, SWT.FLAT);myButton.setText("Bonjour");formText.setControl("mybutton", myButton);

Table createTable = toolkit.createTable(formText, SWT.FULL_SELECTION);createTableViewer(createTable);formText.setControl("mytable", createTable);

formText.setText(buf.toString(), true, false);}

}

Classe FormTextWithSWTControlPart.javadu projet eclipseformsexample

Construction des

deux objets Controldont le parent est

FormText

FormText ne gère pas la destruction des objets

Control (dispose)

Dans le contenu

texte, liaison avec

deux objets Control

Page 46: Construction d'Eclipse Forms avec la plateforme Eclipse

46Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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-

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

Page 47: Construction d'Eclipse Forms avec la plateforme Eclipse

47Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

Partie Master

Partie Details (DetailsPart)

Des actions peuvent être définies

spécifiquement pour le MasterDetailsBlock

A chaque modification de sélection de la partie

Master, choix de la DetailsPage et modification de son contenu

Page 48: Construction d'Eclipse Forms avec la plateforme Eclipse

48Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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 vie

Page 49: Construction d'Eclipse Forms avec la plateforme Eclipse

49Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple : Initialiser un composant MasterDetailsBlock

package eclipse.workbench.eclipseformsexample.views ;

public class MasterDetailsBlockPart extends ViewPart {

public MasterDetailsBlockPart() {}

@Overridepublic void createPartControl(Composite parent) {

FormToolkit toolkit = new FormToolkit(parent.getDispl ay());ScrolledForm form = toolkit.createScrolledForm(parent );form.setText("MasterDetails block Example");toolkit.decorateFormHeading(form.getForm());

MyMasterDetailsBlock refMasterDetailsBlock = new MyMa sterDetailsBlock();ManagedForm refManagedForm = new ManagedForm(toolkit, form);refMasterDetailsBlock.createContent(refManagedForm);

}

@Overridepublic void setFocus() {}

}

Classe MasterDetailsBlockPart.java du projet eclipseformsexample

Construction d’un

MasterDetailsBlock (voir implémentation dans la suite)

Construction d’un ManagedFormà partir d’un Form

Associer le ManagedForm au

MasterDetailsBlock

Page 50: Construction d'Eclipse Forms avec la plateforme Eclipse

50Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple (suite) : Construire l’IHM de la partie Masterpackage eclipse.workbench.eclipseformsexample.views ;

public class MyMasterDetailsBlock extends MasterDetai lsBlock {protected void createMasterPart(final IManagedForm man agedForm, Composite parent) {

FormToolkit toolkit = managedForm.getToolkit();Section section = toolkit.createSection(parent, Sect ion.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_SELE CTION);...toolkit.paintBordersFor(client);section.setClient(client);

final SectionPart spart = new SectionPart(section);managedForm.addPart(spart);viewer = new TableViewer(t);viewer.addSelectionChangedListener(new ISelectionChangedListener() {

public void selectionChanged(SelectionChangedEvent event) {managedForm.fireSelectionChanged(spart, event.getSelection());

}});viewer.setContentProvider(new MyStructuredContentPr ovider());viewer.setLabelProvider(new MyTableLabelProvider()) ;viewer.setInput(...);

}...

}

Classe MyMasterDetailsBlock.java du projet eclipseformsexample

Création d’une SectionPart pour être gérée par ManagedForm

A chaque changement de la

sélection, la SelectionPart est notifiée

Page 51: Construction d'Eclipse Forms avec la plateforme Eclipse

51Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple (suite) : Ajouter des actionspackage eclipse.workbench.eclipseformsexample.views ;

public class MyMasterDetailsBlock extends MasterDetai lsBlock {... Suite du précédent transparent.

protected void createToolBarActions(IManagedForm manag edForm) {final ScrolledForm form = managedForm.getForm();Action haction = new Action("hor", Action.AS_RADIO_B UTTON) {

public void run() {sashForm.setOrientation(SWT.HORIZONTAL);form.reflow(true);

}};haction.setToolTipText("Horizontal Orientation");haction.setImageDescriptor(Activator.getDefault().g etImageRegistry()

.getDescriptor(Activator.IMG_HORIZONTAL));Action vaction = new Action("ver", Action.AS_RADIO_B UTTON) {

public void run() {sashForm.setOrientation(SWT.VERTICAL);form.reflow(true);

}};vaction.setToolTipText("Vertical Orientation");vaction.setImageDescriptor(Activator.getDefault().g etImageRegistry()

.getDescriptor(Activator.IMG_VERTICAL));form.getToolBarManager().add(haction);form.getToolBarManager().add(vaction);

}...

}

Classe MyMasterDetailsBlock.java du projet eclipseformsexample

Ajout des actions au

ManagedForm

Page 52: Construction d'Eclipse Forms avec la plateforme Eclipse

52Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple (suite) : Ajouter des DetailsPage

package eclipse.workbench.eclipseformsexample.views ;

public class MyMasterDetailsBlock extends MasterDetai lsBlock {... Suite du précédent transparent.

protected void registerPages(DetailsPart detailsPart) {detailsPart.registerPage(TablePerson.class, new MyDetailsPage(viewer));

}}

Classe MyMasterDetailsBlock.java du projet eclipseformsexample

Quand l’élément sélectionné est de type

TablePerson la page MyDetailsPage sera affichée dans la partie Details du

composant MasterDetailsBlock

Page 53: Construction d'Eclipse Forms avec la plateforme Eclipse

53Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

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

� 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

Page 54: Construction d'Eclipse Forms avec la plateforme Eclipse

54Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple (suite) : Création d’un DetailsPagepackage eclipse.workbench.eclipseformsexample.views ;

public class MyDetailsPage implements IDetailsPage {...public void createContents(Composite parent) {

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 selecte d Person object.");...tabText = new Text[4];tabText[0] = addNewLabelText(client, "Name", new Mo difyListener() {

public void modifyText(ModifyEvent e) {input.setName(tabText[0].getText());ref.refresh(input);

}});...toolkit.paintBordersFor(s1);s1.setClient(client);

}private Text addNewLabelText(Composite client, String name, ModifyListener ref) {

FormToolkit toolkit = mform.getToolkit();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;

}... // Suite dans le prochain transparent.

}

Classe MyDetailsPage.java du projet eclipseformsexample

Cette méthode est utilisée pour

construire l’IHM de la DetailsPage

Chaque modification de l’IHM

impacte la partie modèle

Page 55: Construction d'Eclipse Forms avec la plateforme Eclipse

55Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.com

Eclipse Forms : MasterDetailsBlock

� Exemple (suite) : Création d’un DetailsPagepackage eclipse.workbench.eclipseformsexample.views ;

public class MyDetailsPage implements IDetailsPage {... // Suite du précédent transparent.

public void initialize(IManagedForm form) {this.mform = form;

}

public void selectionChanged(IFormPart part, ISelecti on selection) {IStructuredSelection ssel = (IStructuredSelection) se lection;if (ssel.size() == 1) {

input = (TablePerson)ssel.getFirstElement();} else {

input = null;}update();

}

private void update() {tabText[0].setText(input.getName());tabText[1].setText(input.getFirstName());tabText[2].setText(input.getSportName());tabText[3].setText(Integer.toString(input.getOld()) );flag.setSelection(input.isVegetarian());

}

... // D’autres méthodes qui sont implémentées à vid e.}

Classe MyDetailsPage.java du projet eclipseformsexample

Cette méthode est appelée, lors

de la modification de la sélection

de la partie Master

L’objet de la sélection de

type TablePerson est

conservé

Tous les éléments graphiques sont mis

à jour en fonction de nouvelles valeurs

contenues dans la sélection courante

Page 56: Construction d'Eclipse Forms avec la plateforme Eclipse

56Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse 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

Une page contenant un éditeur dont le contenu est représenté

via des Forms

Page 57: Construction d'Eclipse Forms avec la plateforme Eclipse

57Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse Forms : Multi-page FormEditor

� Exemple : Créer un FormEditor avec deux pages

public class SimpleFormEditor extends FormEditor {

public SimpleFormEditor() {}

protected void addPages() {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;

}}

Classe SimpleFormEditor.java du projet eclipseformsexample

Un FormEditor se comporte comme un MultiPageEditorPart.

Des informations supplémentaires sont disponibles dans le support de

cours sur les éditeurs

Deux pages ont été ajoutées au FormEditor

Page 58: Construction d'Eclipse Forms avec la plateforme Eclipse

58Eclipse Forms - M. Baron - Page

keul

keul

.blo

gspo

t.comEclipse Forms : Multi-page FormEditor

� Exemple (suite) : Créer un FormEditor avec deux pagespublic class FirstFormPage extends FormPage {

public FirstFormPage(FormEditor f) {super(f, "first","FirstPage");

}

protected void createFormContent(IManagedForm managedF orm) {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;form.getBody().setLayout(layout);

// Label component.toolkit.createLabel(form.getBody(), "Eclipse Form La bel");

}}

public class SecondFormPage extends FormPage {

public SecondFormPage(FormEditor f) {super(f, "second","SecondPage");

}

protected void createFormContent(IManagedForm managedF orm) {FormToolkit toolkit = managedForm.getToolkit();

final ScrolledForm form = managedForm.getForm();form.setText("Second Page Content");toolkit.decorateFormHeading(form.getForm());

GridLayout layout = new GridLayout();layout.numColumns = 1;form.getBody().setLayout(layout);

// Button component with push style.toolkit.createButton(form.getBody(), "Eclipse Form B utton", SWT.PUSH);

}}

Classe FirstFormPage.java du projet eclipseformsexample

Classe SecondFormPage.java du projet Eclipseformsexample