juillet
2013
Dans cet article nous allons voir comment, utiliser le service IEventBroker dans une application Eclipse 4 RCP pour que vos composants puissent communiquer entre eux.
A cet effet nous allons prendre l’exemple un éditeur de texte doté d’une barre d’état qui affichera la position courante du curseur.
Nous allons supposer que vous avez installé Eclipse 4.3 (Kepler) ainsi que e4 tools, si ce n’est pas le cas les procédures d’installations sont décrites dans l’article suivant :
Tutoriel sur la construction d’applications Eclipse RCP basées sur Eclipse 4
Nous n’allons pas nous pencher sur la création d’application Eclipse 4 ou sur l’ajout de composants au modèle d’application, tout est bien expliqué dans le tutoriel sus-cité.
Créez un nouveau projet Eclipse 4, veuillez consulter l’article ci-dessus pour voir les étapes à suivre.
Ajouter un PartStak à votre TrimedWindow et ajouter une Input Part au PartStak, avec les paramètres suivant :
Id : dz.iaityahia.example.texteditor.inputpart.editor
Label : Editeur
Ajoutez un Window Trim a votre TrimBars avec l’option Side Bottom pour que la barre se positionne en bas de votre fenêtre, ça sera notre barre d’état.
Ajoutez une ToolBar a votre WindowTrim et un ToolControl a la ToolBar que vous venez d’ajouter, avec dz.iaityahia.example.texteditor.toolcontrol.positionstatus comme Id.
En final votre modèle d’application devra ressembler à ce qui suit :
Afin de pouvoir invoquer IEventBroker, ajouter la dépendance au package org.eclipse.e4.core.services.events
Créez maintenant les classes suivantes, nous verrons plus loin chaque classe en détail
EditorView : Classe de notre Inupt Part
CursorPosition : Modele objet qui va contenir la position du curseur
CursorPositionStatus : Classe du ToolControl de notre barre d’état.
Connectez la Classe EditorView à votre Input Part, en cliquant sur le bouton findadjacent au champs Class URI,
Notez que vous pouvez créer directement votre classe en cliquant sur le lien Class URI.
Connectez la classe CursorPositionStatus a votre ToolControl de la même manière.
Modifiez maintenant le code de vos classes comme suit :
Classe CursorPosition
import java.text.MessageFormat;
/**
* @author iaityahia
* cette classe définie le modèle object de la
* position du curseur
*
*/
public class CursorPosition {
public int column; //colonne du curseur
public int line; //ligne du curseur
private MessageFormat mf= new MessageFormat("Ligne : {0} | Colonne : {1}");
/**
* Constructeur de la classe
* avec l'initialisation de la ligne et la colonne
*/
public CursorPosition() {
column = 0;
line = 0;
}
/**
* Renvoie la chaine de la position suivant le modèle
* definie dans mf
* @return position sous forme de ligne colonne
*/
public String toString() {
Object[] args ={line,column};
return mf.format(args);
}
}
Dans cette classe définissons le l’objet qui va contenir les informations de la position du curseur, nous avons aussi redéfini la méthode toString pour quelle renvoi la position sous fomrme de chaine « Ligne : 0 | Colonne : 0″
Classe EditorView
* @author iaityahia
*
*/
package dz.iaityahia.example.texteditor;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class EditorView {
@Inject IEventBroker eventBroker; // Nous injections IEventBroker
CursorPosition pos ;
StyledText text;
@Inject
public EditorView() {
}
/**
* Création du contenu de la part
* @param parent
*/
@PostConstruct
public void createPartControl(Composite parent) {
// création de l'objet qui va contenir la position du curseur
pos = new CursorPosition();
// création de l'éditeur de texte
text = new StyledText (parent, SWT.BORDER);
// création du gestionaire qui va récupérer la position du curseur
//et enrgistrer l'évenement
Listener listener = new Listener()
{
@Override
public void handleEvent(Event arg0)
{
int caretOffset = text.getCaretOffset();
pos.line = text.getLineAtOffset(caretOffset) ;
pos.column = caretOffset - text.getContent().getOffsetAtLine(pos.line);
//Incrémenter la ligne et la colonne, l'indexation commence à zéro
pos.line++;
pos.column++;
// Enregistrement de la position avec la clé CURSOR_POSITION
eventBroker.post("CURSOR_POSITION", pos);
}
};
// Ajout du gestionnaire aux événements
// KeyUp et MouseUp
text.addListener(SWT.KeyUp, listener);
text.addListener(SWT.MouseUp, listener);
}
@PreDestroy
public void preDestroy() {
}
@Focus
public void onFocus() {
text.setFocus();
}
}
Dans cette classe nous Injecton le service IEventBroker et nous définissons le contenu de notre Part (view) via la méthode createPartControl annotée avec l’annotation @PostConstruct.
l’injection du service IEventBroker récupère l’instance existante dans le contexte d’application, si elle n’existe une nouvelle instance sera créée.
Dans un éditeur de texte la position du curseur peut être changée lorsque l’utilisateur relâche la sourie ou une touche de clavier alors que l’éditeur détient le focus, c’est pour cette raison que nous avons créée un Listener commun pour les événements KeyUp et MouseUp.
Le service IEventBroker nous offre la possibilité d’envoyer les donner de deux manières, synchrone avec la méthode send et asynchrone avec la méthode post, dans notre cas nous optons pour un envoie asynchrone.
Classe CursorPositionStatus
* Cette classe construit le label qui servira pour l'affichage
* de la position du curseur et implément la méthode qui est chargée de recevoir
* les évenements émis depuis l'éditeur
*
* @author iaityahia
*
*/
package dz.iaityahia.example.texteditor;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
public class CursorPosStatus {
private Label posLabel;
/**
* Création du Label
*
* @param parent
*/
@PostConstruct
public void postConstruct(Composite parent) {
GridLayout layout =new GridLayout();
layout.marginHeight = 0;
parent.setLayout(layout);
posLabel =new Label(parent,SWT.NONE);
GridData gd = new GridData(GridData.BEGINNING,GridData.CENTER,true,true);
gd.widthHint = 150;
gd.horizontalIndent =5;
posLabel.setLayoutData(gd);
}
/**
* Méthode qui reçoit les évenements
* @param pos
*/
@Inject @Optional
void eventReceived(@UIEventTopic("CURSOR_POSITION") CursorPosition pos) {
posLabel.setText(pos.toString());
}
}
Dans cette classe nous concevons le Label qui va se charger d’afficher la position du curseur, avec la méthode postConstruct, également nous implémentons la méthode qui va nous permettre de recevoir les données émises via le service IEventBroker, la méthode se distingue avec l’annotation @UIEventTopic, notez qu’il est très important d’annoter votre méthode avec @Optional sinon Eclipse va lever des exceptions.
En final nous aurons quelque chose qui ressemble a capture suivante, si vous essayez de modifier le contenu de l’éditeur vous allez remarquer que la position du curseur s’affiche dans notre barre d’état.