1 /*******************************************************************************
2 * Copyright (c) 2007, 2012 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.browsing.ui.swt;
14 import java.lang.reflect.Method;
15 import java.util.function.BiFunction;
17 import org.eclipse.core.runtime.Platform;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.ui.services.IServiceLocator;
21 import org.osgi.framework.Bundle;
22 import org.simantics.Simantics;
23 import org.simantics.browsing.ui.BuiltinKeys;
24 import org.simantics.browsing.ui.GraphExplorer;
25 import org.simantics.browsing.ui.NodeContext;
26 import org.simantics.browsing.ui.SelectionDataResolver;
27 import org.simantics.browsing.ui.SelectionFilter;
28 import org.simantics.browsing.ui.common.AdaptableHintContext;
29 import org.simantics.db.ReadGraph;
30 import org.simantics.db.Resource;
31 import org.simantics.db.common.request.PossibleTypedParent;
32 import org.simantics.db.common.request.UniqueRead;
33 import org.simantics.db.common.utils.Logger;
34 import org.simantics.db.exception.DatabaseException;
35 import org.simantics.db.layer0.SelectionHints;
36 import org.simantics.db.layer0.variable.Variable;
37 import org.simantics.db.layer0.variable.Variables;
38 import org.simantics.simulation.ontology.SimulationResource;
39 import org.simantics.utils.datastructures.hints.IHintContext;
40 import org.simantics.utils.ui.ExceptionUtils;
43 * @author Tuukka Lehtonen
45 public class GraphExplorerFactory {
47 private int maxChildrenShown = GraphExplorerImpl.DEFAULT_MAX_CHILDREN;
49 private SelectionDataResolver selectionDataResolver;
50 private SelectionFilter selectionFilter;
52 private IServiceLocator serviceLocator;
54 private BiFunction<GraphExplorer, Object[], Object[]> selectionTransformation = new BiFunction<GraphExplorer, Object[], Object[]>() {
56 private Resource getModel(final Object object) {
57 if(object instanceof NodeContext) {
58 NodeContext context = (NodeContext)object;
59 Object input = context.getConstant(BuiltinKeys.INPUT);
60 if(input instanceof Resource) {
61 final Resource inputResource = (Resource)input;
63 return Simantics.getSession().sync(new UniqueRead<Resource>() {
66 public Resource perform(ReadGraph graph) throws DatabaseException {
67 SimulationResource SIMU = SimulationResource.getInstance(graph);
68 return graph.sync(new PossibleTypedParent(inputResource, SIMU.Model));
72 } catch (DatabaseException e) {
73 Logger.defaultLogError(e);
75 } else if (input instanceof Variable) {
76 final Variable inputVariable = (Variable)input;
78 return Simantics.getSession().sync(new UniqueRead<Resource>() {
81 public Resource perform(ReadGraph graph) throws DatabaseException {
82 return Variables.getModel(graph, inputVariable);
86 } catch (DatabaseException e) {
87 Logger.defaultLogError(e);
95 public Object[] apply(GraphExplorer explorer, Object[] objects) {
96 Object[] result = new Object[objects.length];
97 for (int i = 0; i < objects.length; i++) {
98 IHintContext context = new AdaptableHintContext(SelectionHints.KEY_MAIN);
99 context.setHint(SelectionHints.KEY_MAIN, objects[i]);
100 Resource model = getModel(objects[i]);
102 context.setHint(SelectionHints.KEY_MODEL, model);
110 public static GraphExplorerFactory getInstance() {
111 return new GraphExplorerFactory();
116 * @return this instance
118 public GraphExplorerFactory maxChildrenShown(int n) {
119 this.maxChildrenShown = n;
123 public GraphExplorerFactory selectionTransformation(BiFunction<GraphExplorer, Object[], Object[]> transformation) {
124 this.selectionTransformation = transformation;
130 * @return this instance
132 public GraphExplorerFactory selectionDataResolver(SelectionDataResolver r) {
133 this.selectionDataResolver = r;
137 public GraphExplorerFactory setSelectionFilter(SelectionFilter filter) {
138 this.selectionFilter = filter;
142 public GraphExplorerFactory setServiceLocator(IServiceLocator serviceLocator) {
143 this.serviceLocator = serviceLocator;
147 public GraphExplorer create(Composite parent) {
148 return create(parent, 0);
154 * @param style SWT style hints for the explorer tree control to create
157 public GraphExplorer create(Composite parent, int style) {
158 return createWithStyle(parent, style | SWT.VIRTUAL);
159 //return createWithStyle(parent, style);
162 private static class GraphExplorerWithMaxChildren extends GraphExplorerImpl {
163 // private int maxChildrenShown;
164 GraphExplorerWithMaxChildren(Composite parent, int style, int maxChildrenShown) {
165 super(parent, style);
166 setMaxChildren(maxChildrenShown);
167 // this.maxChildrenShown = maxChildrenShown;
170 // public int getMaxChildren() {
171 // return maxChildrenShown;
175 public GraphExplorer createWithStyle(Composite parent, int style) {
176 GraphExplorerImpl explorer = new GraphExplorerWithMaxChildren(parent, style, maxChildrenShown);
177 explorer.setSelectionDataResolver(selectionDataResolver);
178 explorer.setSelectionFilter(selectionFilter);
179 explorer.setSelectionTransformation(selectionTransformation);
180 explorer.setServiceLocator(serviceLocator);
184 public GraphExplorer create2(Composite parent, int style) {
185 GraphExplorerImpl2 explorer = new GraphExplorerImpl2(parent, style);
186 explorer.setSelectionDataResolver(selectionDataResolver);
187 explorer.setSelectionFilter(selectionFilter);
188 explorer.setSelectionTransformation(selectionTransformation);
189 explorer.setServiceLocator(serviceLocator);
193 public GraphExplorer create3(Composite parent, int style) {
194 //GraphExplorerImpl2 explorer = new GraphExplorerImpl2(parent, style);
196 Bundle bundle = Platform.getBundle("org.simantics.browsing.ui.nattable");
197 @SuppressWarnings("unchecked")
198 Class<GraphExplorer> clazz = (Class<GraphExplorer>)bundle.loadClass("org.simantics.browsing.ui.nattable.NatTableGraphExplorer");
199 //Class<GraphExplorer> clazz = (Class<GraphExplorer>)bundle.getClass().getClassLoader().loadClass("org.simantics.browsing.ui.nattable.NatTableGraphExplorer");
200 GraphExplorer explorer = clazz.getConstructor(Composite.class, int.class).newInstance(parent,style);
201 explorer.setSelectionDataResolver(selectionDataResolver);
202 explorer.setSelectionFilter(selectionFilter);
203 explorer.setSelectionTransformation(selectionTransformation);
204 Method m = clazz.getMethod("setServiceLocator", IServiceLocator.class);
205 m.invoke(explorer, serviceLocator);
206 //explorer.setServiceLocator(serviceLocator);
208 } catch (Throwable t) {
209 ExceptionUtils.logAndShowError(t);
214 // void hookActions(IWorkbenchSite site) {
215 // IActionBars actionBars = null;
217 // if (site instanceof IEditorSite)
218 // actionBars = ((IEditorSite) site).getActionBars();
219 // if (site instanceof IViewSite)
220 // actionBars = ((IViewSite) site).getActionBars();
221 // if (site instanceof IPageSite)
222 // actionBars = ((IPageSite) site).getActionBars();
224 // if (actionBars != null) {
225 // actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), new Action() {
227 // public void run() {
228 // System.out.println("SELECT_ALL");
231 // actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(), new Action() {
233 // public void run() {
234 // System.out.println("FIND");
237 // actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), new Action() {
239 // public void run() {
240 // System.out.println("UNDO");
241 // // SimanticsUI.undo();
244 // actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), new Action() {
246 // public void run() {
247 // System.out.println("REDO");
248 // // SimanticsUI.redo();
251 // actionBars.updateActionBars();