1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.selectionview;
\r
14 import java.util.function.Consumer;
\r
16 import org.eclipse.jface.layout.GridDataFactory;
\r
17 import org.eclipse.jface.layout.GridLayoutFactory;
\r
18 import org.eclipse.jface.viewers.ISelection;
\r
19 import org.eclipse.jface.viewers.ISelectionProvider;
\r
20 import org.eclipse.jface.viewers.StructuredSelection;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.eclipse.swt.widgets.Composite;
\r
23 import org.eclipse.swt.widgets.Control;
\r
24 import org.eclipse.swt.widgets.Event;
\r
25 import org.eclipse.swt.widgets.Listener;
\r
26 import org.eclipse.ui.IWorkbenchSite;
\r
27 import org.simantics.Simantics;
\r
28 import org.simantics.browsing.ui.common.ErrorLogger;
\r
29 import org.simantics.browsing.ui.common.views.IFilterArea;
\r
30 import org.simantics.browsing.ui.common.views.IFilterAreaProvider;
\r
31 import org.simantics.browsing.ui.swt.PartNameListener;
\r
32 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;
\r
33 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl;
\r
34 import org.simantics.db.Disposable;
\r
35 import org.simantics.db.common.procedure.adapter.ListenerSupport;
\r
36 import org.simantics.db.management.ISessionContext;
\r
37 import org.simantics.db.request.Read;
\r
40 * Important points of customization:
\r
42 * <li>{@link #createControls(Composite, IWorkbenchSite, ISessionContext, WidgetSupport)}</li>
\r
43 * <li>{@link #getSelectionProvider()}</li>
\r
44 * <li>{@link #getPartNameReadRequest(ISelection)}</li>
\r
47 * @author Antti Villberg
\r
48 * @author Tuukka Lehtonen
\r
49 * @see ModelledTabContributor ModelledTabContributor for graph-modelled tab contributions
\r
51 public abstract class PropertyTabContributorImpl implements PropertyTabContributor, Disposable /*, ListenerSupport*/ {
\r
53 // For ListenerSupport (supporting DB request listeners)
\r
54 // protected boolean disposed = false;
\r
55 // protected ISelection input = StructuredSelection.EMPTY;
\r
56 // private Object identity;
\r
58 abstract public void createControls(Composite body, IWorkbenchSite site, final ISessionContext context, WidgetSupport support);
\r
60 public PropertyTabContributorImpl() {
\r
63 public IFilterArea getFilterArea() {
\r
67 public void requestFocus() {
\r
70 public ISelectionProvider getSelectionProvider() {
\r
74 public String getPartName(ISelection forSelection) {
\r
78 public Read<String> getPartNameReadRequest(ISelection forSelection) {
\r
82 // public void updatePartName(ISelection forSelection, Callback<String> updateCallback) {
\r
83 // Read<String> read = getPartNameReadRequest(forSelection);
\r
84 // if (read == null) {
\r
85 // updateCallback.run("Override to control part name (PropertyTabContributorImpl.updatePartName)");
\r
87 // Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this));
\r
91 // public void updatePartName(Callback<String> updateCallback) {
\r
92 // updatePartName(input, updateCallback);
\r
95 // protected void dispose() {
\r
96 // this.disposed = true;
\r
100 // public void exception(Throwable t) {
\r
101 // ErrorLogger.defaultLogError(getClass().getSimpleName() + " received unexpected exception.", t);
\r
105 // public boolean isDisposed() {
\r
106 // return disposed;
\r
109 public void createControl(Composite parent, final IWorkbenchSite site, final ISessionContext context, final WidgetSupportImpl support) {
\r
111 class TabComposite extends Composite {
\r
112 public TabComposite(Composite parent) {
\r
115 GridLayoutFactory.fillDefaults().applyTo(parent);
\r
116 GridDataFactory.fillDefaults().span(1, 1).grab(true, true).applyTo(this);
\r
118 Composite body = this;
\r
119 GridLayoutFactory.fillDefaults().spacing(0, 0).equalWidth(false).numColumns(1).applyTo(body);
\r
122 PropertyTabContributorImpl.this.createControls(body, site, context, support);
\r
123 } catch (Throwable t) {
\r
124 ErrorLogger.defaultLogError(t);
\r
129 final TabComposite tc = new TabComposite(parent);
\r
130 tc.addListener(SWT.Dispose, new Listener() {
\r
131 public void handleEvent(Event e) {
\r
132 if(support instanceof Disposable)
\r
133 ((Disposable)support).dispose();
\r
134 PropertyTabContributorImpl.this.dispose();
\r
141 public IPropertyTab create(Composite parent, IWorkbenchSite site, ISessionContext context, Object input) {
\r
142 IPropertyTab tab = new Tab(site, parent);
\r
143 tab.createControl((Composite) tab.getControl(), context);
\r
147 protected WidgetSupportImpl createSupport() {
\r
148 return new WidgetSupportImpl();
\r
151 class Tab extends Composite implements IPropertyTab2, IFilterAreaProvider, ListenerSupport {
\r
153 final IWorkbenchSite site;
\r
154 final WidgetSupportImpl support = createSupport();
\r
155 protected ISelection input = StructuredSelection.EMPTY;
\r
157 public Tab(IWorkbenchSite site, Composite parent) {
\r
158 super(parent, SWT.NONE);
\r
163 public void createControl(Composite parent, ISessionContext context) {
\r
164 PropertyTabContributorImpl.this.createControl(parent, site, context, support);
\r
168 public Control getControl() {
\r
173 public boolean isDisposed() {
\r
174 return super.isDisposed();
\r
178 public void requestFocus() {
\r
179 PropertyTabContributorImpl.this.requestFocus();
\r
183 public void setInput(ISessionContext context, ISelection selection, boolean force) {
\r
184 this.input = selection;
\r
185 support.fireInput(context, selection);
\r
189 public ISelectionProvider getSelectionProvider() {
\r
190 return PropertyTabContributorImpl.this.getSelectionProvider();
\r
194 public IFilterArea getFilterArea() {
\r
195 return PropertyTabContributorImpl.this.getFilterArea();
\r
199 public void updatePartName(Consumer<String> updateCallback) {
\r
200 String partName = PropertyTabContributorImpl.this.getPartName(input);
\r
201 if(partName != null) {
\r
202 updateCallback.accept(partName);
\r
205 Read<String> read = getPartNameReadRequest(input);
\r
206 if (read == null) {
\r
207 updateCallback.accept("Override to control part name (PropertyTabContributorImpl.updatePartName)");
\r
209 Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this));
\r
211 //PropertyTabContributorImpl.this.updatePartName(input, updateCallback);
\r
215 public void exception(Throwable t) {
\r
216 ErrorLogger.defaultLogError(getClass().getSimpleName() + " received unexpected exception.", t);
\r
222 public void dispose() {
\r