X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.selectionview%2Fsrc%2Forg%2Fsimantics%2Fselectionview%2FPropertyTabContributorImpl.java;fp=bundles%2Forg.simantics.selectionview%2Fsrc%2Forg%2Fsimantics%2Fselectionview%2FPropertyTabContributorImpl.java;h=bf64f3bcf56c0ca64ae95f5fc013c85ef62e156b;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.selectionview/src/org/simantics/selectionview/PropertyTabContributorImpl.java b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/PropertyTabContributorImpl.java new file mode 100644 index 000000000..bf64f3bcf --- /dev/null +++ b/bundles/org.simantics.selectionview/src/org/simantics/selectionview/PropertyTabContributorImpl.java @@ -0,0 +1,225 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.selectionview; + +import java.util.function.Consumer; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.ui.IWorkbenchSite; +import org.simantics.Simantics; +import org.simantics.browsing.ui.common.ErrorLogger; +import org.simantics.browsing.ui.common.views.IFilterArea; +import org.simantics.browsing.ui.common.views.IFilterAreaProvider; +import org.simantics.browsing.ui.swt.PartNameListener; +import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport; +import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupportImpl; +import org.simantics.db.Disposable; +import org.simantics.db.common.procedure.adapter.ListenerSupport; +import org.simantics.db.management.ISessionContext; +import org.simantics.db.request.Read; + +/** + * Important points of customization: + * + + * @author Antti Villberg + * @author Tuukka Lehtonen + * @see ModelledTabContributor ModelledTabContributor for graph-modelled tab contributions + */ +public abstract class PropertyTabContributorImpl implements PropertyTabContributor, Disposable /*, ListenerSupport*/ { + + // For ListenerSupport (supporting DB request listeners) +// protected boolean disposed = false; +// protected ISelection input = StructuredSelection.EMPTY; +// private Object identity; + + abstract public void createControls(Composite body, IWorkbenchSite site, final ISessionContext context, WidgetSupport support); + + public PropertyTabContributorImpl() { + } + + public IFilterArea getFilterArea() { + return null; + } + + public void requestFocus() { + } + + public ISelectionProvider getSelectionProvider() { + return null; + } + + public String getPartName(ISelection forSelection) { + return null; + } + + public Read getPartNameReadRequest(ISelection forSelection) { + return null; + } + +// public void updatePartName(ISelection forSelection, Callback updateCallback) { +// Read read = getPartNameReadRequest(forSelection); +// if (read == null) { +// updateCallback.run("Override to control part name (PropertyTabContributorImpl.updatePartName)"); +// } else { +// Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this)); +// } +// } + +// public void updatePartName(Callback updateCallback) { +// updatePartName(input, updateCallback); +// } + +// protected void dispose() { +// this.disposed = true; +// } + +// @Override +// public void exception(Throwable t) { +// ErrorLogger.defaultLogError(getClass().getSimpleName() + " received unexpected exception.", t); +// } + +// @Override +// public boolean isDisposed() { +// return disposed; +// } + + public void createControl(Composite parent, final IWorkbenchSite site, final ISessionContext context, final WidgetSupportImpl support) { + + class TabComposite extends Composite { + public TabComposite(Composite parent) { + super(parent, 0); + + GridLayoutFactory.fillDefaults().applyTo(parent); + GridDataFactory.fillDefaults().span(1, 1).grab(true, true).applyTo(this); + + Composite body = this; + GridLayoutFactory.fillDefaults().spacing(0, 0).equalWidth(false).numColumns(1).applyTo(body); + + try { + PropertyTabContributorImpl.this.createControls(body, site, context, support); + } catch (Throwable t) { + ErrorLogger.defaultLogError(t); + } + } + } + + final TabComposite tc = new TabComposite(parent); + tc.addListener(SWT.Dispose, new Listener() { + public void handleEvent(Event e) { + if(support instanceof Disposable) + ((Disposable)support).dispose(); + PropertyTabContributorImpl.this.dispose(); + } + }); + + } + + @Override + public IPropertyTab create(Composite parent, IWorkbenchSite site, ISessionContext context, Object input) { + IPropertyTab tab = new Tab(site, parent); + tab.createControl((Composite) tab.getControl(), context); + return tab; + } + + protected WidgetSupportImpl createSupport() { + return new WidgetSupportImpl(); + } + + class Tab extends Composite implements IPropertyTab2, IFilterAreaProvider, ListenerSupport { + + final IWorkbenchSite site; + final WidgetSupportImpl support = createSupport(); + protected ISelection input = StructuredSelection.EMPTY; + + public Tab(IWorkbenchSite site, Composite parent) { + super(parent, SWT.NONE); + this.site = site; + } + + @Override + public void createControl(Composite parent, ISessionContext context) { + PropertyTabContributorImpl.this.createControl(parent, site, context, support); + } + + @Override + public Control getControl() { + return this; + } + + @Override + public boolean isDisposed() { + return super.isDisposed(); + } + + @Override + public void requestFocus() { + PropertyTabContributorImpl.this.requestFocus(); + } + + @Override + public void setInput(ISessionContext context, ISelection selection, boolean force) { + this.input = selection; + support.fireInput(context, selection); + } + + @Override + public ISelectionProvider getSelectionProvider() { + return PropertyTabContributorImpl.this.getSelectionProvider(); + } + + @Override + public IFilterArea getFilterArea() { + return PropertyTabContributorImpl.this.getFilterArea(); + } + + @Override + public void updatePartName(Consumer updateCallback) { + String partName = PropertyTabContributorImpl.this.getPartName(input); + if(partName != null) { + updateCallback.accept(partName); + return; + } + Read read = getPartNameReadRequest(input); + if (read == null) { + updateCallback.accept("Override to control part name (PropertyTabContributorImpl.updatePartName)"); + } else { + Simantics.getSession().asyncRequest(read, new PartNameListener(updateCallback, this)); + } + //PropertyTabContributorImpl.this.updatePartName(input, updateCallback); + } + + @Override + public void exception(Throwable t) { + ErrorLogger.defaultLogError(getClass().getSimpleName() + " received unexpected exception.", t); + } + + } + + @Override + public void dispose() { + } + +}