|
|
Re: Listen to selection changes in properties view [message #509389 is a reply to message #507948] |
Fri, 22 January 2010 10:52 |
mnhg Messages: 3 Registered: January 2010 |
Junior Member |
|
|
I found a solution, which seems to work.
First i created my own SelectionProvider to get the selection from my treeviewer and from the propertyview in one provider.
TreeViewer treeViewer=....
MergedSelectionProvider selectionProvider = new MergedSelectionProvider();
treeViewer.addSelectionChangedListener(new ViewerSelectionForwarder(selectionProvider, treeViewer));
getSite().getPage().addSelectionListener(new PropertySelectionForwarder(selectionProvider, treeViewer));
getSite().setSelectionProvider(selectionProvider);
public class MergedSelectionProvider implements ISelectionProvider {
Set<ISelectionChangedListener> listeners = new HashSet<ISelectionChangedListener>();
IStructuredSelection selection = new StructuredSelection();
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
@Override
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
// listeners.remove(listener);
// Not allowed do remove any listener, otherwise nobody listen to the property view
}
@Override
public ISelection getSelection() {
return selection;
}
@Override
public void setSelection(ISelection selection) {
setSelection(this, selection);
}
public void setSelection(ISelectionProvider provider, ISelection selection) {
if (selection != this.selection) {
this.selection = (IStructuredSelection) selection;
fireSelectionChanged(new SelectionChangedEvent(provider,
this.selection));
}
}
private void fireSelectionChanged(final SelectionChangedEvent event) {
for (final ISelectionChangedListener listener : listeners) {
SafeRunnable.run(new SafeRunnable() {
public void run() {
listener.selectionChanged(event);
}
});
}
}
}
The following class only forwards the selection changes of the viewer.
public class ViewerSelectionForwarder implements ISelectionChangedListener {
MergedSelectionProvider provider;
Viewer viewer;
public ViewerSelectionForwarder(MergedSelectionProvider provider,
Viewer viewer) {
this.provider = provider;
this.viewer = viewer;
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
provider.setSelection(viewer, event.getSelection());
}
}
This class get the selection in the property view directly from the tree control. In my conrete scenario i could get by the name of the tree item and the selected parent element in the viewer to the selected attribute. It's not the nices solution but it's seem to work for my case.
public class PropertySelectionForwarder implements ISelectionListener,
SelectionListener {
Set<PropertySheet> properties = new HashSet<PropertySheet>();
Viewer viewer;
MergedSelectionProvider provider;
public PropertySelectionForwarder(MergedSelectionProvider provider,
Viewer viewer) {
this.viewer = viewer;
this.provider = provider;
}
// Register property view
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (part instanceof PropertySheet && !properties.contains(part)) {
PropertySheetPage p = (PropertySheetPage) ((PropertySheet) part)
.getCurrentPage();
Tree t = (Tree) p.getControl();
t.addSelectionListener(this);
properties.add((PropertySheet) part);
}
}
// selection change in property view
@Override
public void widgetDefaultSelected(SelectionEvent e) { // ignore
}
@Override
public void widgetSelected(SelectionEvent e) {
if (!(e.item instanceof TreeItem)
|| !(viewer.getSelection() instanceof IStructuredSelection)) {
fireSelection(new StructuredSelection());
return;
}
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
if (sel.size() != 1
|| !(sel.getFirstElement() instanceof XMLEditorElement)) {
fireSelection(new StructuredSelection());
return;
}
TreeItem t = (TreeItem) e.item;
if (!(t.getData() instanceof PropertySheetEntry)) {
fireSelection(new StructuredSelection());
return;
}
XMLEditorElement parent = (XMLEditorElement) sel.getFirstElement();
PropertySheetEntry pse = (PropertySheetEntry) t.getData();
XMLEditorAttribute attribute = parent.getAttributeByName(pse
.getDisplayName());
fireSelection(new StructuredSelection(attribute));
}
private void fireSelection(IStructuredSelection selection) {
provider.setSelection(selection);
}
}
Any opinions, suggestions or error?
|
|
|
|
Powered by
FUDForum. Page generated in 0.02429 seconds