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