+package org.simantics.views;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.util.Bean;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RequestProcessor;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.ResourceRead;\r
+import org.simantics.db.common.request.TernaryRead;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.Functions;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.procedure.Listener;\r
+import org.simantics.scl.runtime.function.Function1;\r
+import org.simantics.scl.runtime.function.Function2;\r
+import org.simantics.views.ontology.ViewsResources;\r
+\r
+public class ViewUtils {\r
+\r
+ public static class ExtendedMargins {\r
+ \r
+ public int left, right, top, bottom;\r
+ \r
+ }\r
+\r
+ public static final Binding EXTENDED_MARGINS_BINDING = Bindings.getBindingUnchecked(ExtendedMargins.class);\r
+ \r
+ public static class GridLayoutBean extends Bean {\r
+ \r
+ public int numColumns;\r
+ public int horizontalSpacing;\r
+ public int verticalSpacing;\r
+ public int marginLeft;\r
+ public int marginRight;\r
+ public int marginTop;\r
+ public int marginBottom;\r
+ \r
+ }\r
+ \r
+ public static class GridDataBean extends Bean {\r
+ \r
+ public int horizontalSpan;\r
+ public boolean grabExcessHorizontalSpace;\r
+ public boolean grabExcessVerticalSpace;\r
+ public int horizontalAlignment;\r
+ public int verticalAlignment;\r
+ public int widthHint;\r
+ public int heightHint;\r
+ \r
+ }\r
+ \r
+ public static class ColumnBean extends Bean {\r
+ \r
+ public String key;\r
+ public String label;\r
+ public String alignment;\r
+ public int width;\r
+ public String tooltip;\r
+ public boolean grab;\r
+ public int weight;\r
+ \r
+ }\r
+ \r
+\r
+ \r
+ public static GridLayoutBean getLayout(RequestProcessor processor, Resource configuration) throws DatabaseException {\r
+\r
+ return processor.sync(new ResourceRead<GridLayoutBean>(configuration) {\r
+\r
+ @Override\r
+ public GridLayoutBean perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ ViewsResources VIEW = ViewsResources.getInstance(graph);\r
+\r
+ Integer columns = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_columnCount, Bindings.INTEGER);\r
+ Integer horizontalSpacing = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_horizontalSpacing, Bindings.INTEGER);\r
+ Integer verticalSpacing = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_verticalSpacing, Bindings.INTEGER);\r
+ ExtendedMargins extendedMargins = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_extendedMargins, EXTENDED_MARGINS_BINDING);\r
+ \r
+ GridLayoutBean layout = new GridLayoutBean();//.fillDefaults().numColumns(1).equalWidth(false).margins(0, 0).spacing(0, 0).create();\r
+ layout.numColumns = columns;\r
+ layout.horizontalSpacing = horizontalSpacing;\r
+ layout.verticalSpacing = verticalSpacing;\r
+ layout.marginLeft = extendedMargins.left;\r
+ layout.marginRight = extendedMargins.right;\r
+ layout.marginTop = extendedMargins.top;\r
+ layout.marginBottom = extendedMargins.bottom;\r
+\r
+ return layout;\r
+\r
+ }\r
+\r
+ });\r
+ \r
+ }\r
+\r
+ public static GridDataBean getGridData(RequestProcessor processor, Resource configuration) throws DatabaseException {\r
+ \r
+ return processor.sync(new ResourceRead<GridDataBean>(configuration) {\r
+\r
+ @Override\r
+ public GridDataBean perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ ViewsResources VIEW = ViewsResources.getInstance(graph);\r
+ GridDataBean data = new GridDataBean();\r
+ \r
+ data.horizontalSpan = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_horizontalSpan, Bindings.INTEGER);\r
+ data.grabExcessHorizontalSpace = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_horizontalGrab, Bindings.BOOLEAN);\r
+ data.grabExcessVerticalSpace = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_verticalGrab, Bindings.BOOLEAN);\r
+ data.horizontalAlignment = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_horizontalAlignment, Bindings.INTEGER);\r
+ data.verticalAlignment = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_verticalAlignment, Bindings.INTEGER);\r
+ data.widthHint = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_preferredWidth, Bindings.INTEGER);\r
+ data.heightHint = graph.getPossibleRelatedValue(resource, VIEW.GridLayout_GridData_preferredHeight, Bindings.INTEGER);\r
+\r
+ return data;\r
+ \r
+ }\r
+\r
+ });\r
+ \r
+ }\r
+\r
+ public static int getStyle(RequestProcessor processor, Resource configuration) throws DatabaseException {\r
+ \r
+ return processor.sync(new ResourceRead<Integer>(configuration) {\r
+\r
+ @Override\r
+ public Integer perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ ViewsResources VIEW = ViewsResources.getInstance(graph);\r
+ \r
+ int result = 0;\r
+ for(Resource constant : graph.getObjects(resource, VIEW.Control_Style_HasConstant)) {\r
+ int value = graph.getValue(constant, Bindings.INTEGER);\r
+ result |= value;\r
+ }\r
+ \r
+ return result;\r
+ \r
+ }\r
+\r
+ });\r
+ \r
+ }\r
+\r
+ public static ColumnBean getColumn(RequestProcessor processor, Resource configuration) throws DatabaseException {\r
+ \r
+ return processor.sync(new ResourceRead<ColumnBean>(configuration) {\r
+\r
+ @Override\r
+ public ColumnBean perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ ViewsResources VIEW = ViewsResources.getInstance(graph);\r
+ String key = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasKey, Bindings.STRING);\r
+ String label = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasLabel, Bindings.STRING);\r
+ String alignment = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasAlignment, Bindings.STRING);\r
+ Integer width = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasWidth, Bindings.INTEGER);\r
+ String tooltip = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasTooltip, Bindings.STRING);\r
+ Boolean grab = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasGrab, Bindings.BOOLEAN);\r
+ Integer weight = graph.getPossibleRelatedValue(resource, VIEW.Explorer_Column_HasWeight, Bindings.INTEGER);\r
+ \r
+ ColumnBean bean = new ColumnBean();\r
+ bean.key = key;\r
+ bean.label = label;\r
+ bean.alignment = alignment;\r
+ bean.width = width;\r
+ bean.tooltip = tooltip;\r
+ bean.grab = grab;\r
+ bean.weight = weight;\r
+ \r
+ return bean;\r
+ \r
+ }\r
+ \r
+ });\r
+ \r
+ }\r
+ \r
+ public static <T> void listen(Resource configuration, Variable context, String relationURI, final Binding binding, final Function1<T, Boolean> function) throws DatabaseException {\r
+\r
+ Simantics.getSession().async(new TernaryRead<Resource, Variable, String, T> (configuration, context, relationURI) {\r
+\r
+ @Override\r
+ public T perform(ReadGraph graph) throws DatabaseException {\r
+ Object value = graph.getRelatedValue2(parameter, graph.getResource(parameter3), parameter2);\r
+ Object result = binding.createDefaultUnchecked();\r
+ try {\r
+ binding.readFrom(Bindings.getBinding(binding.type()), value, result);\r
+ } catch (BindingException e) {\r
+// e.printStackTrace();\r
+ throw new DatabaseException(e);\r
+ }\r
+ return (T)result;\r
+ }\r
+ \r
+ }, new Listener<T>() {\r
+\r
+ private boolean disposed = false;\r
+ \r
+ @Override\r
+ public void exception(Throwable t) {\r
+// t.printStackTrace();\r
+ }\r
+\r
+ @Override\r
+ public void execute(T result) {\r
+ disposed = function.apply(result);\r
+ }\r
+\r
+ @Override\r
+ public boolean isDisposed() {\r
+ return disposed;\r
+ }\r
+\r
+ });\r
+ \r
+ }\r
+ \r
+ public static <T> void listen(Resource configuration, Variable context, String relationURI, final Function1<T, Boolean> function) throws DatabaseException {\r
+\r
+ Simantics.getSession().async(new TernaryRead<Resource, Variable, String, T> (configuration, context, relationURI) {\r
+\r
+ @Override\r
+ public T perform(ReadGraph graph) throws DatabaseException {\r
+ return graph.getRelatedValue2(parameter, graph.getResource(parameter3), parameter2);\r
+ }\r
+ \r
+ }, new Listener<T>() {\r
+\r
+ private boolean disposed = false;\r
+ \r
+ @Override\r
+ public void exception(Throwable t) {\r
+// t.printStackTrace();\r
+ }\r
+\r
+ @Override\r
+ public void execute(T result) {\r
+ disposed = function.apply(result);\r
+ }\r
+\r
+ @Override\r
+ public boolean isDisposed() {\r
+ return disposed;\r
+ }\r
+\r
+ });\r
+ \r
+ }\r
+ \r
+ public static Function2<Object, Object, Object> getActionFunctionDeprecated(final Resource configuration, final Resource runtime, final String relationURI) throws DatabaseException {\r
+ \r
+ return new Function2<Object, Object, Object>() {\r
+ \r
+ @Override\r
+ public Object apply(final Object selection, final Object event) {\r
+ \r
+ Simantics.getSession().async(new WriteRequest() {\r
+\r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+\r
+ Resource relation = graph.getResource(relationURI);\r
+ \r
+ final Resource function = graph.getSingleObject(configuration, relation);\r
+ \r
+ Functions.exec(graph, function, graph, runtime, selection, event);\r
+ \r
+ }\r
+ \r
+ });\r
+ \r
+ return null;\r
+ \r
+ }\r
+ \r
+ };\r
+ \r
+ }\r
+ \r
+ public static void setWorkbenchSelection(ISelection selection) {\r
+ ISelectionProvider provider = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart().getSite().getSelectionProvider();\r
+ provider.setSelection(selection);\r
+ }\r
+ \r
+}\r