import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbenchSite;
import org.simantics.browsing.ui.Column;
import org.simantics.browsing.ui.StatePersistor;
public Boolean useNodeBrowseContexts;
public Boolean useNodeActionContexts;
public StatePersistor persistor;
-
+
public ISelection lastSelection;
-
+
+ private ISelectionChangedListener internalToExternalSelectionPropagator = event -> {
+ IWorkbenchSite site = getSite();
+ if (site != null) {
+ ISelectionProvider sp = site.getSelectionProvider();
+ if (sp != null) {
+ sp.setSelection(event.getSelection());
+ }
+ }
+ };
+
@Override
public void createControls(Composite parent) {
if (uiContext != null) {
control.setUiContexts(Collections.singleton(uiContext));
}
-
+
control.setStatePersistor(persistor);
-
+
control.finish();
setProperties();
-
+
control.setInputSource(PassThruInputSource.INSTANCE);
- ISelectionProvider sp = (ISelectionProvider)control.getExplorer().getAdapter(ISelectionProvider.class);
- sp.addSelectionChangedListener(new ISelectionChangedListener() {
-
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- if (site != null) {
- ISelectionProvider sp = site.getSelectionProvider();
- if (sp != null) {
- sp.setSelection(event.getSelection());
- }
- }
- }
-
- });
-
- IPostSelectionProvider psp = (IPostSelectionProvider)control.getExplorer().getAdapter(IPostSelectionProvider.class);
- psp.addPostSelectionChangedListener(new ISelectionChangedListener() {
-
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
-
-// ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();
- if (site != null) {
- ISelectionProvider sp = site.getSelectionProvider();
- if (sp != null) {
- sp.setSelection(event.getSelection());
- }
- }
-
- }
-
- });
-
- control.addListenerToControl(SWT.Selection, new Listener() {
-
- @Override
- public void handleEvent(Event event) {
-
- if(selectionListener != null)
- selectionListener.apply(event);
-
- ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();
- // [Tuukka@2012-04-08] Disabled this because it was causing
- // horrible selection feedback effects in the Model Browser
- // view that is using it. It causes the browser to react to
- // external selections which were initially published as its own
- // with a delay.
- //System.out.println("selection: " + selection);
-// if(publishSelection != null && publishSelection) {
-// if (site != null) {
-// ISelectionProvider sp = site.getSelectionProvider();
-// if (sp != null) {
-// sp.setSelection(selection);
-// }
-// }
-// }
-
- propertyCallback.apply("selection", selection);
-
- lastSelection = selection;
-
- }
-
+ ISelectionProvider isp = (ISelectionProvider)control.getExplorer().getAdapter(ISelectionProvider.class);
+ if (isp instanceof IPostSelectionProvider) {
+ ((IPostSelectionProvider) isp).addPostSelectionChangedListener(internalToExternalSelectionPropagator);
+ } else {
+ isp.addSelectionChangedListener(internalToExternalSelectionPropagator);
+ }
+
+ control.addListenerToControl(SWT.Selection, event -> {
+ if(selectionListener != null)
+ selectionListener.apply(event);
+ ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();
+ propertyCallback.apply("selection", selection);
+ lastSelection = selection;
});
-
+
}
public void synchronizeColumnsVisible(Boolean columnsVisible) {
final public void synchronizeLayout(LayoutBean layout) {
}
-
+
+ @Override
+ public void dispose() {
+ ISelectionProvider isp = (ISelectionProvider)control.getExplorer().getAdapter(ISelectionProvider.class);
+ if (isp instanceof IPostSelectionProvider) {
+ ((IPostSelectionProvider) isp).removePostSelectionChangedListener(internalToExternalSelectionPropagator);
+ } else {
+ isp.removeSelectionChangedListener(internalToExternalSelectionPropagator);
+ }
+ super.dispose();
+ }
+
}