In my Eclipse RCP application I use the Selection Service as described in this nice article. There is a TreeViewer in one view registered as a SelectionProvider:
getSite().setSelectionProvider(viewer);
Another view is receiving the events from the TreeViewer:
selectionListener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
pageSelectionChanged(part, selection);
}
};
getSite().getPage().addSelectionListener(selectionListener);
Everything works fine, if the events are triggered my normal mouse clicks. I would like to programmatically fire a selection events by selection an item in the tree:
treeViewer.setSelection(new StructuredSelection(element),true);
This is not working. Method selectionChanged is not called in the receiver-view. The issue is discussed in this forum thread. There is no solution.
EDIT
There is no proper way to handle a mouse triggered click the same way as a programmatically selection. A mouse click activates the view a programmatically selection does not.
My Solution is to register the second view the same way by Selection Service
as the first view. After that both view are getting selection events directly from the active editor.
You can do two things:
1) do the selection and then call notify listeners for an SWT.SELECTION i.e. :
mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());
The notifyListener method is intented to be used for custom controls so to be more correct you could do option number 2.
2) call the method that you call in your listener i.e.:
this.myButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent e) {
doSomethingaboutTheSelMethod();
}
In this case you can call:
doSomethingaboutTheSelMethod();
I've just had this problem and solved it like this:
treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);
Giving the focus to the tree before making the selection seemed to notify the listeners, where before it was not.
I had the same problem. The workaround I used was to trigger the event on the Listener programmatic-ally after calling the treeViewer.getTree().select(treeViewer.getTree().getItem(0));
method.
Query the listeners registered on the Tree and get a reference to your listener:
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
}}}
Create a SelectionEvent and trigger the selection by manually calling the widgetSelected method:
Event underlyingEvent = new Event();
underlyingEvent.widget = treeViewer.getTree();
SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
This solution worked fine for me. Hope it does for you.
Try to do a
treeViewer.fireSelectionChanged();
or
treeViewer.firePostSelectionChanged();
after setting the selection.
EDIT
Ok, so the above calls doesn't work... If you are desperate enough you could trace through the sources and find out what actually calls selectionChanged()
. Just set a breakpoint in your method and get up the stack. Maybe you get an idea of how to achieve this call on another way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With