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