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