eclipse

eclipse selection service

gonGon 2010. 9. 13. 14:59
eclipse의 editor나 view에서 selection이 발생했을 경우, selection event를 workbench를 통해 다른 view나 editor에 전달할 수 있다.

1. event provider

1.1 ISelectionProvider 구현

org.eclipse.jface.viewers.ISelectionProvider interface를 구현해야 한다.
구현할 method는 아래와 같다.

public void addSelectionChangedListener(ISelectionChangedListener listener) 
public ISelection getSelection() 
public void removeSelectionChangedListener
public void setSelection(ISelection selection)

event를 발생시키는 part에서는 스스로를 provider로 workbench에 등록시킨다.

getSite().setSelectionProvider(viewer);


TreeViewer와 같이 eclipse가 selection provider로서 구현하여 제공하는 control을 사용하여 selectionProvider의 인자로 등록한다면 ISelectionProvider를 구현하지 않아도 된다.
그러나 SelectionProvider를 구현한다면, 

new ListenerList() 하여 listener들을 담을 객체를 만들고, addSelectionChangedListener에서 add(listener)를 해 주고, removeSelectionChangedListener에서는 remove(listener)을 해 준다.

listener들에게 event 를 전파할 때는 ListenerList를 loop를 돌며 selectionChanged(event)를 호출해 준다.

public void fireEvent(final SelectionChangedEvent event ){
Object[] listeners = selectionListeners.getListeners();
for (int i = 0; i < listeners.length; ++i) {
final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
SafeRunnable.run(new SafeRunnable() {
public void run() {
l.selectionChanged(event);
}
});
}
}





2. event listneer
event를 수신하는 part는 아래와 같이 event listener로 등록한다.

getSite().getPage().addSelectionListener(this);
getSite().getWorkbenchWindow()
.getSelectionService().addSelectionListener(this));