2010-02-09 7 views
14

Dans Eclipse RCP, je crée des vues pour la perspective en utilisant IPageLayout.addView(...)Comment communiquer entre les vues dans Eclipse RCP?

Mais de cette façon, je n'ai pas de référence à la vue. Par conséquent, je ne sais pas comment je peux dire à ViewA de mettre à jour ViewB.

Quel est le meilleur modèle à utiliser ici?

Répondre

15

Outre ce que VonC a mentionné ci-dessus, vous pouvez également utiliser ISourceProviderListener si les modifications besoin ne sont pas déclenchés par la sélection.

  • Avez ViewB implémente ISourceProviderListener
  • Créer une implémentation de ISourceProvider et l'enregistrer dans les services
  • ont ViewA obtenir le ISourceProvider et le mettre à jour pour déclencher les changements dans ViewB

Lire la documentation sur ces interfaces avec IServiceLocator et ISourceProviderService pour avoir une meilleure idée de comment tout cela se joue.

Vous pouvez également voir this Lars Vogel's tutorial qui a quelques exemples comment utiliser le ISourceProvider

+0

'ISourceProviderListener': J'ai manqué qu'un. Bonne solution aussi. +1 Et ce serait maintenant "En plus de ce que VonC a mentionné ** ci-dessous **";) – VonC

+1

Malheureusement, ce n'est plus comme ça que ça marche en e4. Plus de vues et d'éditeurs, juste ... des parties. L'information sur la façon dont la communication entre eux fonctionne semble difficile à trouver pour e4. Pour tous ceux qui cherchent, [ce nouveau tutoriel] (http://www.vogella.com/tutorials/Eclipse4EventSystem/article.html) semble indiquer le chemin. –

8

Vous avez le paradigme différent de communication récapituler dans le IBM article

  • Pour une vue capable d'écouter les changements de sélection, une vue doit implémenter l'interface ISelectionListener et doit se faire enregistrer à la page établi
  • aide l'interface IAdaptable: Une classe qui implémente IAdaptable a la capacité de renvoyer dynamiquement certains types d'adaptateurs qui peuvent ensuite être utilisés pour récupérer des informations supplémentaires.
  • changement de propriété paradigme auditeur

En ce qui concerne la première approche, les détails de l'article:

Une façon plus intelligente de consommer des sélections de l'interface utilisateur est d'enregistrer les opinions des consommateurs que les auditeurs à des parties de vue spécifiques. Comme vous pouvez le voir dans l'exemple ci-dessous, l'ID de vue de la partie vue source est mentionné en tant que paramètre lors de l'enregistrement d'un écouteur de sélection.

getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this); 

Cette approche permettra d'éliminer les callbacks redondants à la vue des consommateurs qui se produirait autrement si cette opinion était enregistrée comme un auditeur non spécifique.

L'extrait de code dans le Listing 2 montre la méthode createPartControl() d'une vue qui crée une JFaceTableViewer et il ajoute en tant que fournisseur de sélection sur le site établi. Ce code permet à toutes les modifications de sélection de l'interface utilisateur dans le TableViewer de se propager à la page et, finalement, aux vues des consommateurs intéressés.

Listing 2. Mise en place d'un fournisseur de sélection

public void createPartControl(Composite parent) { 
    // Set up a JFace Viewer 
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
    viewer.setContentProvider(new ViewContentProvider()); 
    viewer.setLabelProvider(new ViewLabelProvider()); 
    viewer.setSorter(new NameSorter()); 
    viewer.setInput(getViewSite()); 

    // ADD the JFace Viewer as a Selection Provider to the View site. 
    getSite().setSelectionProvider(viewer); 

} 

Vous trouverez une approche similaire dans le RCP tutorial for eclipse3.5 (update February, 4th 2010)

1

Il existe différentes façons pour les communications de vue et plug-ins: eventbroker, auditeur etc ..

EvenBroker (e4) Mise en œuvre: Utilisez eventbroker pour envoyer un message (chaîne) entre les vues et les plugins.

Sender Side:

@Inject 
private IEventBroker eventBroker; 
private static final String STATUS ="status"; 
eventBroker.send(STATUS, "status test message.."); 

récepteur latéral:

@Inject 
private IEventBroker eventBroker; 
private static final String STATUS ="status"; 
@Inject @Optional 
public void getEvent(@UIEventTopic(STATUS) String message) { 
    ... //call method 
} 
+0

Je ne voudrais pas dupliquer la variable 'STATUS' (juste l'avoir en tant que' public static final String' et la référencer à la fois de l'expéditeur et du destinataire), mais sinon, c'est le chemin à parcourir dans e4. En passant, vous pouvez envoyer n'importe quel objet de cette façon, pas seulement des chaînes, et si vous voulez que cela se produise de manière asynchrone, utilisez 'broker.post()' au lieu de 'broker.send()'. –

Questions connexes