1 package org.simantics.document.swt.core.selection;
\r
3 import java.util.function.Consumer;
\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
37 final public class DocumentTabContributor implements PropertyTabContributor, ListenerSupport {
\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
45 protected ISelectionProvider selectionProvider = new ActiveSelectionProvider();
\r
47 public DocumentTabContributor(String documentURI) {
\r
48 this.documentURI = documentURI;
\r
51 public void createControls(Composite body, IWorkbenchSite site) {
\r
53 client = new SWTDocumentClient(SWTViews.getMapping(), selectionProvider, site, body);
\r
57 public IFilterArea getFilterArea() {
\r
61 public void requestFocus() {
\r
64 public ISelectionProvider getSelectionProvider() {
\r
65 return selectionProvider;
\r
68 public Read<String> getPartNameReadRequest(ISelection forSelection) {
\r
72 public void updatePartName(ISelection forSelection, Consumer<String> updateCallback) {
\r
73 Read<String> read = getPartNameReadRequest(forSelection);
\r
75 updateCallback.accept("Selection");
\r
77 Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this));
\r
81 public void updatePartName(Consumer<String> updateCallback) {
\r
82 updatePartName(input, updateCallback);
\r
85 protected void dispose() {
\r
86 this.disposed = true;
\r
90 public void exception(Throwable t) {
\r
91 ErrorLogger.defaultLogError("PropertyTabContributorImpl received unexpected exception.", t);
\r
95 public boolean isDisposed() {
\r
99 public void createControl(Composite parent, final IWorkbenchSite site) {
\r
101 class TabComposite extends Composite {
\r
102 public TabComposite(Composite parent) {
\r
105 GridLayoutFactory.fillDefaults().applyTo(parent);
\r
106 GridDataFactory.fillDefaults().span(1, 1).grab(true, true).applyTo(this);
\r
108 Composite body = this;
\r
109 GridLayoutFactory.fillDefaults().spacing(0, 0).equalWidth(false).numColumns(1).applyTo(body);
\r
112 DocumentTabContributor.this.createControls(body, site);
\r
113 } catch (Throwable t) {
\r
114 ErrorLogger.defaultLogError(t);
\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
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
134 class Tab extends Composite implements IPropertyTab2, IFilterAreaProvider {
\r
136 final IWorkbenchSite site;
\r
138 public Tab(IWorkbenchSite site, Composite parent) {
\r
139 super(parent, SWT.NONE);
\r
144 public void createControl(Composite parent, ISessionContext context) {
\r
145 DocumentTabContributor.this.createControl(parent, site);
\r
149 public Control getControl() {
\r
154 public boolean isDisposed() {
\r
155 return super.isDisposed();
\r
159 public void requestFocus() {
\r
160 DocumentTabContributor.this.requestFocus();
\r
164 public void setInput(ISessionContext context, ISelection selection, boolean force) {
\r
166 DocumentTabContributor.this.input = selection;
\r
170 String input = Simantics.getSession().syncRequest(new UniqueRead<String>() {
\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
181 ListenerSupport support = new ListenerSupport() {
\r
184 public void exception(Throwable t) {
\r
185 Logger.defaultLogError(t);
\r
189 public boolean isDisposed() {
\r
190 return DocumentTabContributor.this.isDisposed();
\r
195 if(input != null) {
\r
196 client.track(support, documentURI, input);
\r
197 layout(true, true);
\r
200 } catch (DatabaseException e) {
\r
201 Logger.defaultLogError(e);
\r
207 public ISelectionProvider getSelectionProvider() {
\r
208 return DocumentTabContributor.this.getSelectionProvider();
\r
212 public IFilterArea getFilterArea() {
\r
213 return DocumentTabContributor.this.getFilterArea();
\r
217 public void updatePartName(Consumer<String> updateCallback) {
\r
218 DocumentTabContributor.this.updatePartName(input, updateCallback);
\r
224 public int hashCode() {
\r
225 return documentURI.hashCode();
\r
229 public boolean equals(Object object) {
\r
231 if (this == object)
\r
233 else if (object == null)
\r
235 else if (!(object instanceof DocumentTabContributor))
\r
238 DocumentTabContributor dtc = (DocumentTabContributor)object;
\r
239 return documentURI.equals(dtc.documentURI);
\r