]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.views.swt.client/src/org/simantics/views/swt/client/impl/SWTExplorer.java
Usability fixes for GraphExplorerImpl -related WB selection propagation
[simantics/platform.git] / bundles / org.simantics.views.swt.client / src / org / simantics / views / swt / client / impl / SWTExplorer.java
1 package org.simantics.views.swt.client.impl;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import org.eclipse.jface.viewers.IPostSelectionProvider;
10 import org.eclipse.jface.viewers.ISelection;
11 import org.eclipse.jface.viewers.ISelectionChangedListener;
12 import org.eclipse.jface.viewers.ISelectionProvider;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.ui.IWorkbenchSite;
16 import org.simantics.browsing.ui.Column;
17 import org.simantics.browsing.ui.StatePersistor;
18 import org.simantics.browsing.ui.swt.PassThruInputSource;
19 import org.simantics.browsing.ui.swt.widgets.ModelBrowser;
20 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl;
21 import org.simantics.scl.runtime.function.Function1;
22 import org.simantics.views.ViewUtils.ColumnBean;
23 import org.simantics.views.ViewUtils.LayoutBean;
24 import org.simantics.views.swt.client.base.SWTViewUtils;
25 import org.simantics.views.swt.client.base.SingleSWTViewNode;
26
27 public class SWTExplorer extends SingleSWTViewNode<ModelBrowser> {
28         
29         private static final long serialVersionUID = 7932335224632082902L;
30         
31         public LayoutBean layout;
32         public String browseContext;
33         public String contextMenuId;
34         public String uiContext;
35         public Function1<Object, Boolean> selectionListener;
36         public Object input;
37         public List<ColumnBean> columns;
38         public List<ColumnBean> editingColumns;
39         public Boolean columnsVisible;
40         public Boolean displayFilter;
41         public Boolean publishSelection;
42         public Boolean useNodeBrowseContexts;
43         public Boolean useNodeActionContexts;
44         public StatePersistor persistor;
45
46         public ISelection lastSelection;
47
48         private ISelectionChangedListener internalToExternalSelectionPropagator = event -> {
49                 IWorkbenchSite site = getSite();
50                 if (site != null) {
51                         ISelectionProvider sp = site.getSelectionProvider();
52                         if (sp != null) {
53                                 sp.setSelection(event.getSelection());
54                         }
55                 }
56         };
57
58         @Override
59         public void createControls(Composite parent) {
60
61                 if(browseContext == null) return;
62                 
63                 final IWorkbenchSite site = getSite();
64
65                 Map<String, Object> args = new HashMap<String, Object>();
66                 args.put("displaySelectors", Boolean.FALSE);
67                 args.put("displayFilter", displayFilter != null ? displayFilter : Boolean.FALSE);
68                 if(useNodeBrowseContexts != null && useNodeBrowseContexts) {
69                         args.put("useNodeBrowseContexts", true);
70                 }
71                 if(useNodeActionContexts != null && useNodeActionContexts) {
72                         args.put("useNodeActionContexts", true);
73                 }
74
75                 control = new ModelBrowser(Collections.singleton(browseContext), args, site, parent, new WidgetSupportImpl(), style);
76                 control.setContextMenuId(contextMenuId);
77                 if (uiContext != null) {
78                         control.setUiContexts(Collections.singleton(uiContext));
79                 }
80
81                 control.setStatePersistor(persistor);
82
83                 control.finish();
84
85                 setProperties();
86
87                 control.setInputSource(PassThruInputSource.INSTANCE);
88
89                 ISelectionProvider isp = (ISelectionProvider)control.getExplorer().getAdapter(ISelectionProvider.class);
90                 if (isp instanceof IPostSelectionProvider) {
91                         ((IPostSelectionProvider) isp).addPostSelectionChangedListener(internalToExternalSelectionPropagator);
92                 } else {
93                         isp.addSelectionChangedListener(internalToExternalSelectionPropagator);
94                 }
95
96                 control.addListenerToControl(SWT.Selection, event -> {
97                         if(selectionListener != null)
98                                 selectionListener.apply(event);
99                         ISelection selection = (ISelection)control.getExplorer().getWidgetSelection();
100                         propertyCallback.apply("selection", selection);
101                         lastSelection = selection;
102                 });
103
104         }
105
106         public void synchronizeColumnsVisible(Boolean columnsVisible) {
107                 if(columnsVisible != null) control.setColumnsVisible(columnsVisible);
108         }
109         
110         public void synchronizeDisplayFilter(Boolean displayFilter) {
111 //              if(displayFilter != null) control.setColumnsVisible(displayFilter);
112         }
113
114         public void synchronizePublishSelection(Boolean publishSelection) {
115         }
116
117         public void synchronizeInput(Object input) {
118                 if(input != null) control.setInput(input, false);
119         }
120         
121         public void synchronizeBrowseContext(String browseContext) {
122         }
123         
124         public void synchronizeContextMenuId(String contextMenuId) {
125         }
126
127         public void synchronizeSelectionListener(Function1<Object, Boolean> selectionListener) {
128         }
129
130         public void synchronizePersistor(StatePersistor persistor) {
131         }
132
133         public void synchronizeColumns(ArrayList<ColumnBean> columns) {
134                 if(columns != null) {
135                         Column[] cols = new Column[columns.size()];
136                         for(int i=0;i<columns.size();i++) cols[i] = SWTViewUtils.toColumn(columns.get(i));
137                         control.setColumns(cols);
138                 }
139         }
140
141         public void synchronizeEditingColumns(ArrayList<ColumnBean> columns) {
142                 if(columns != null) {
143                         String[] ecs = new String[columns.size()];
144                         for(int i=0;i<columns.size();i++) ecs[i] = columns.get(i).key;
145                         control.setEditingColumn(ecs);
146                 }
147         }
148
149         final public void synchronizeLayout(LayoutBean layout) {
150         }
151
152         @Override
153         public void dispose() {
154                 ISelectionProvider isp = (ISelectionProvider)control.getExplorer().getAdapter(ISelectionProvider.class);
155                 if (isp instanceof IPostSelectionProvider) {
156                         ((IPostSelectionProvider) isp).removePostSelectionChangedListener(internalToExternalSelectionPropagator);
157                 } else {
158                         isp.removeSelectionChangedListener(internalToExternalSelectionPropagator);
159                 }
160                 super.dispose();
161         }
162
163 }