]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.swt.core/src/org/simantics/document/swt/core/selection/DocumentTabContributor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.swt.core / src / org / simantics / document / swt / core / selection / DocumentTabContributor.java
1 package org.simantics.document.swt.core.selection;\r
2 \r
3 import java.util.function.Consumer;\r
4 \r
5 import org.eclipse.jface.layout.GridDataFactory;\r
6 import org.eclipse.jface.layout.GridLayoutFactory;\r
7 import org.eclipse.jface.viewers.ISelection;\r
8 import org.eclipse.jface.viewers.ISelectionProvider;\r
9 import org.eclipse.jface.viewers.StructuredSelection;\r
10 import org.eclipse.swt.SWT;\r
11 import org.eclipse.swt.widgets.Composite;\r
12 import org.eclipse.swt.widgets.Control;\r
13 import org.eclipse.swt.widgets.Event;\r
14 import org.eclipse.swt.widgets.Listener;\r
15 import org.eclipse.ui.IWorkbenchSite;\r
16 import org.simantics.Simantics;\r
17 import org.simantics.browsing.ui.common.ErrorLogger;\r
18 import org.simantics.browsing.ui.common.views.IFilterArea;\r
19 import org.simantics.browsing.ui.common.views.IFilterAreaProvider;\r
20 import org.simantics.browsing.ui.swt.PartNameListener;\r
21 import org.simantics.db.ReadGraph;\r
22 import org.simantics.db.common.procedure.adapter.ListenerSupport;\r
23 import org.simantics.db.common.request.UniqueRead;\r
24 import org.simantics.db.common.utils.Logger;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.db.layer0.variable.Variable;\r
27 import org.simantics.db.management.ISessionContext;\r
28 import org.simantics.db.request.Read;\r
29 import org.simantics.document.swt.core.SWTDocumentClient;\r
30 import org.simantics.document.swt.core.SWTViews;\r
31 import org.simantics.selectionview.IPropertyTab;\r
32 import org.simantics.selectionview.IPropertyTab2;\r
33 import org.simantics.selectionview.PropertyTabContributor;\r
34 import org.simantics.utils.ui.ISelectionUtils;\r
35 import org.simantics.utils.ui.jface.ActiveSelectionProvider;\r
36 \r
37 final public class DocumentTabContributor implements PropertyTabContributor, ListenerSupport {\r
38 \r
39     // For ListenerSupport (supporting DB request listeners)\r
40     protected boolean    disposed = false;\r
41     protected ISelection input    = StructuredSelection.EMPTY;\r
42     final protected String documentURI;\r
43     private SWTDocumentClient client;\r
44     \r
45     protected ISelectionProvider selectionProvider = new ActiveSelectionProvider();\r
46     \r
47     public DocumentTabContributor(String documentURI) {\r
48         this.documentURI = documentURI;\r
49     }\r
50 \r
51     public void createControls(Composite body, IWorkbenchSite site) {\r
52         \r
53         client = new SWTDocumentClient(SWTViews.getMapping(), selectionProvider, site, body);\r
54         \r
55     }\r
56 \r
57     public IFilterArea getFilterArea() {\r
58         return null;\r
59     }\r
60 \r
61     public void requestFocus() {\r
62     }\r
63 \r
64     public ISelectionProvider getSelectionProvider() {\r
65         return selectionProvider; \r
66     }\r
67 \r
68     public Read<String> getPartNameReadRequest(ISelection forSelection) {\r
69         return null;\r
70     }\r
71 \r
72     public void updatePartName(ISelection forSelection, Consumer<String> updateCallback) {\r
73         Read<String> read = getPartNameReadRequest(forSelection);\r
74         if (read == null) {\r
75             updateCallback.accept("Selection");\r
76         } else {\r
77             Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this));\r
78         }\r
79     }\r
80 \r
81     public void updatePartName(Consumer<String> updateCallback) {\r
82         updatePartName(input, updateCallback);\r
83     }\r
84 \r
85     protected void dispose() {\r
86         this.disposed = true;\r
87     }\r
88 \r
89     @Override\r
90     public void exception(Throwable t) {\r
91         ErrorLogger.defaultLogError("PropertyTabContributorImpl received unexpected exception.", t);\r
92     }\r
93 \r
94     @Override\r
95     public boolean isDisposed() {\r
96         return disposed;\r
97     }\r
98 \r
99     public void createControl(Composite parent, final IWorkbenchSite site) {\r
100 \r
101         class TabComposite extends Composite {\r
102             public TabComposite(Composite parent) {\r
103                 super(parent, 0);\r
104 \r
105                 GridLayoutFactory.fillDefaults().applyTo(parent);\r
106                 GridDataFactory.fillDefaults().span(1, 1).grab(true, true).applyTo(this);\r
107 \r
108                 Composite body = this;\r
109                 GridLayoutFactory.fillDefaults().spacing(0, 0).equalWidth(false).numColumns(1).applyTo(body);\r
110 \r
111                 try {\r
112                         DocumentTabContributor.this.createControls(body, site);\r
113                 } catch (Throwable t) {\r
114                     ErrorLogger.defaultLogError(t);\r
115                 }\r
116             }\r
117         }\r
118 \r
119         final TabComposite tc = new TabComposite(parent);\r
120         tc.addListener(SWT.Dispose, new Listener() {\r
121             public void handleEvent(Event e) {\r
122                 DocumentTabContributor.this.dispose();\r
123             }\r
124         });\r
125     }\r
126 \r
127     @Override\r
128     public IPropertyTab create(Composite parent, IWorkbenchSite site, ISessionContext context, Object input) {\r
129         IPropertyTab tab = new Tab(site, parent);\r
130         tab.createControl((Composite) tab.getControl(), context);\r
131         return tab;\r
132     }\r
133 \r
134     class Tab extends Composite implements IPropertyTab2, IFilterAreaProvider {\r
135 \r
136         final IWorkbenchSite    site;\r
137         \r
138         public Tab(IWorkbenchSite site, Composite parent) {\r
139             super(parent, SWT.NONE);\r
140             this.site = site;\r
141         }\r
142 \r
143         @Override\r
144         public void createControl(Composite parent, ISessionContext context) {\r
145                 DocumentTabContributor.this.createControl(parent, site);\r
146         }\r
147 \r
148         @Override\r
149         public Control getControl() {\r
150             return this;\r
151         }\r
152 \r
153         @Override\r
154         public boolean isDisposed() {\r
155             return super.isDisposed();\r
156         }\r
157 \r
158         @Override\r
159         public void requestFocus() {\r
160                 DocumentTabContributor.this.requestFocus();\r
161         }\r
162 \r
163         @Override\r
164         public void setInput(ISessionContext context, ISelection selection, boolean force) {\r
165                 \r
166                 DocumentTabContributor.this.input = selection;\r
167 \r
168                         try {\r
169                                 \r
170                                 String input = Simantics.getSession().syncRequest(new UniqueRead<String>() {\r
171 \r
172                                         @Override\r
173                                         public String perform(ReadGraph graph) throws DatabaseException {\r
174                                                 Variable var = ISelectionUtils.filterSingleSelection(DocumentTabContributor.this.input, Variable.class);\r
175                                                 if(var == null) return null;\r
176                                                 return var.getURI(graph).substring("http:/".length());\r
177                                         }\r
178 \r
179                                 });\r
180                                 \r
181                                 ListenerSupport support = new ListenerSupport() {\r
182 \r
183                                         @Override\r
184                                         public void exception(Throwable t) {\r
185                                                 Logger.defaultLogError(t);\r
186                                         }\r
187 \r
188                                         @Override\r
189                                         public boolean isDisposed() {\r
190                                                 return DocumentTabContributor.this.isDisposed();\r
191                                         }\r
192                                         \r
193                                 };\r
194                                 \r
195                                 if(input != null) {\r
196                                         client.track(support, documentURI, input);\r
197                                         layout(true, true);\r
198                                 }\r
199                         \r
200                         } catch (DatabaseException e) {\r
201                                 Logger.defaultLogError(e);\r
202                         }\r
203             \r
204         }\r
205 \r
206         @Override\r
207         public ISelectionProvider getSelectionProvider() {\r
208             return DocumentTabContributor.this.getSelectionProvider();\r
209         }\r
210 \r
211         @Override\r
212         public IFilterArea getFilterArea() {\r
213             return DocumentTabContributor.this.getFilterArea();\r
214         }\r
215 \r
216         @Override\r
217         public void updatePartName(Consumer<String> updateCallback) {\r
218                 DocumentTabContributor.this.updatePartName(input, updateCallback);\r
219         }\r
220 \r
221     }\r
222     \r
223     @Override\r
224     public int hashCode() {\r
225         return documentURI.hashCode();\r
226     }\r
227     \r
228     @Override\r
229     public boolean equals(Object object) {\r
230         \r
231         if (this == object)\r
232             return true;\r
233         else if (object == null)\r
234             return false;\r
235         else if (!(object instanceof DocumentTabContributor))\r
236             return false;\r
237 \r
238         DocumentTabContributor dtc = (DocumentTabContributor)object;\r
239         return documentURI.equals(dtc.documentURI);\r
240         \r
241     }\r
242         \r
243 }\r