Par programme d'Incendie d'une RCP de Sélection de l'Événement

Dans mon Eclipse RCP application que j'utilise le Service de Sélection tel que décrit dans ce joli article. Il y a un TreeViewer dans une vue enregistrée comme un SelectionProvider:

getSite().setSelectionProvider(viewer);

un Autre point de vue est de recevoir les événements de l' TreeViewer:

selectionListener = new ISelectionListener() {
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    pageSelectionChanged(part, selection);
  }
 };
 getSite().getPage().addSelectionListener(selectionListener);

Tout fonctionne bien, si les événements sont déclenchés mes clics de souris normaux. Je voudrais lancer un programme d'événements de sélection par la sélection d'un élément dans l'arborescence:

treeViewer.setSelection(new StructuredSelection(element),true);

ça ne marche pas. Méthode selection changed n'est pas appelée dans le récepteur. La question est débattue dans ce forum. Il n'y a pas de solution.

EDIT

il n'y a pas de façon correcte de gérer un clic déclenché par la souris de la même manière qu'une sélection programmatique. Un clic de souris active la vue qu'une sélection programmatique ne fait pas.

Mon La Solution est d'enregistrer la deuxième vue de la même façon par Selection Service comme première vue. Après cela les deux vues obtiennent les événements de sélection directement de l'éditeur actif.

19
demandé sur Cœur 2012-02-01 23:33:38

7 réponses

Vous pouvez faire deux choses:

1) Faire la sélection et ensuite appeler les auditeurs notify pour un SWT.La SÉLECTION c'est à dire :

mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());

la méthode du notifyListener est censée être utilisée pour les contrôles personnalisés, donc pour être plus correct, vous pouvez faire l'option Numéro 2.

2) appelez la méthode que vous appelez dans votre auditeur i.e.:

this.myButton.addSelectionListener(new SelectionListener() {
    public void widgetSelected(final SelectionEvent e) {
      doSomethingaboutTheSelMethod();
 }

Dans ce cas, vous pouvez appeler:

doSomethingaboutTheSelMethod();
24
répondu user847988 2012-09-13 12:17:25

je viens d'avoir ce problème et l'ai résolu comme ceci:

treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);

donner la mise au point à l'arbre avant de faire la sélection semblait avertir les auditeurs, où avant il n'était pas.

6
répondu Link19 2012-05-10 15:15:04

essayez de faire un

treeViewer.fireSelectionChanged();

ou

treeViewer.firePostSelectionChanged();

après avoir paramétré la sélection.


EDIT

Ok, donc les appels ci-dessus ne marchent pas... Si vous êtes assez désespéré, vous pourriez tracer à travers les sources et trouver ce qui appelle réellement selectionChanged(). Il suffit de définir un point de rupture dans votre méthode et de monter la pile. Peut-être que vous avez une idée de comment réaliser cet appel d'une autre manière.

1
répondu Kai 2012-02-02 11:27:18

addPostSelectionListener au lieu de addSelectionListener pour enregistrer votre auditeur à la page workbench. En regardant le code de StructuredViewer, la méthode mentionnée firePostSelectionChanged sera appelé lors de la programmation de la sélection.

1
répondu p12t 2012-02-03 10:13:12

StructuredViewer.setSelection(ISelection, boolean) feu SelectionChangedEvent à moins que:

  • le spectateur exécute du code qui préserve explicitement la sélection (comme refresh) ou
  • une exception se produit avant qu'il arrive à la notification d'événement (par exemple quand vous appelez setSelection à partir d'un fil non-UI qui lance accès au thread non valide).
1
répondu Martti Käärik 2012-02-21 12:59:42

j'ai eu le même problème. La solution de contournement que j'ai utilisée était de déclencher l'événement sur le programmateur de l'auditeur après avoir appelé le treeViewer.getTree().select(treeViewer.getTree().getItem(0)); méthode.

  1. interrogez les auditeurs enregistrés sur L'arbre et obtenez une référence à votre auditeur:

    org.eclipse.swt.widgets.Listener[] listeners = treeViewer.getTree().getListeners(SWT.Selection);
    for (int i=0; i<listeners.length; i++) {
            if (listeners[i] instanceof TypedListener) {
                if (((TypedListener)listeners[i]).getEventListener() instanceof TreeSelectionListener){
                      // Step 2: Fire the event code goes here
     }}}
    
  2. Créer un SelectionEvent et déclencher la sélection en appelant manuellement le widgetSelected méthode:

    Event underlyingEvent = new Event();
    underlyingEvent.widget = treeViewer.getTree();
    SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
    ((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
    

Cette solution a bien fonctionné pour moi. Espérons qu'il le fait pour vous.

1
répondu ALYS 2012-08-23 12:32:50

assurez-vous que votre partie (vue) a la mise au point! Sinon setSelection ne marchera pas.

Premier Inject Le PartService dans votre classe, ou l'ajouter comme paramètre dans votre méthode de commande execute (EPartService partService), puis effectuez les opérations suivantes:

MPart myPart = partService.findPart(MyPart.ID);
partService.activate(myPart, true);
treeViewer.getControl().setFocus();
treeViewer.setSelection(new StructuredSelection(myObject), true);
1
répondu Ray 2016-04-02 07:48:18