--- /dev/null
+package org.simantics.views.swt;\r
+\r
+import java.util.Collections;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.dialogs.MessageDialog;\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.Simantics;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.primitiverequest.PossibleObject;\r
+import org.simantics.db.common.primitiverequest.RelatedValue2;\r
+import org.simantics.db.common.primitiverequest.ResourceByURI;\r
+import org.simantics.db.common.primitiverequest.SingleObject;\r
+import org.simantics.db.common.request.WriteResultRequest;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.scenegraph.loader.ScenegraphVariable;\r
+import org.simantics.scenegraph.ontology.ScenegraphResources;\r
+import org.simantics.utils.threads.SWTThread;\r
+import org.simantics.views.ontology.ViewsResources;\r
+import org.simantics.views.swt.client.base.SWTRoot;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ModelledDialogs {\r
+\r
+ public static void scheduleMessage(final String uri) {\r
+ scheduleMessage(uri, Collections.<String, Variant>emptyMap());\r
+ }\r
+\r
+ public static void scheduleMessage(final String uri, final Map<String, Variant> parameters) {\r
+\r
+ SWTThread.getThreadAccess().asyncExec(new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ openMessage(uri, parameters);\r
+ }\r
+\r
+ });\r
+\r
+ }\r
+ \r
+ private static int getStyle(Resource type) throws DatabaseException {\r
+ ViewsResources VIEWS = ViewsResources.getInstance(Simantics.getSession());\r
+ if(VIEWS.MessageDialog_Type_Error.equals(type)) return MessageDialog.ERROR;\r
+ else if(VIEWS.MessageDialog_Type_Information.equals(type)) return MessageDialog.INFORMATION;\r
+ else if(VIEWS.MessageDialog_Type_Question.equals(type)) return MessageDialog.QUESTION;\r
+ else if(VIEWS.MessageDialog_Type_QuestionWithCancel.equals(type)) return MessageDialog.QUESTION_WITH_CANCEL;\r
+ else if(VIEWS.MessageDialog_Type_Confirm.equals(type)) return MessageDialog.CONFIRM;\r
+ else if(VIEWS.MessageDialog_Type_Warning.equals(type)) return MessageDialog.WARNING;\r
+ else throw new DatabaseException("MessageDialog model needs to define a dialog type");\r
+ }\r
+ \r
+ \r
+ public static int openMessage(final String uri) {\r
+ return openMessage(uri, Collections.<String, Variant>emptyMap());\r
+ }\r
+\r
+ private static SWTRoot createCustomArea(final Resource customArea, final Map<String, Variant> parameters) throws DatabaseException {\r
+ \r
+ if(customArea == null) return null;\r
+\r
+ final SWTViewLoaderProcess loader = new SWTViewLoaderProcess(null, null);\r
+ \r
+ Variable context = Simantics.getSession().sync(new WriteResultRequest<Variable>(Simantics.getSession().getService(VirtualGraph.class)) {\r
+\r
+ @Override\r
+ public Variable perform(WriteGraph graph) throws DatabaseException {\r
+\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ ScenegraphResources SG = ScenegraphResources.getInstance(graph);\r
+ Resource runtime = graph.newResource();\r
+ graph.claim(runtime, L0.InstanceOf, null, SG.Runtime);\r
+ Variable base = Variables.getVariable(graph, customArea);\r
+ String uri = base.getURI(graph);\r
+ graph.claimLiteral(runtime, SG.Runtime_HasVariable, uri, Bindings.STRING);\r
+\r
+ return new ScenegraphVariable(base, customArea, runtime, loader.getRoot(), parameters);\r
+\r
+ }\r
+\r
+ });\r
+\r
+ return loader.load(Simantics.getSession(), context);\r
+ \r
+ }\r
+ \r
+ public static int openMessage(final String uri, final Map<String, Variant> parameters) {\r
+\r
+ //assert SWTThread.getThreadAccess().currentThreadAccess();\r
+ \r
+ try {\r
+\r
+ Session session = Simantics.getSession();\r
+ ViewsResources VIEWS = ViewsResources.getInstance(session);\r
+ final Resource configuration = session.sync(new ResourceByURI(uri));\r
+ final Resource typeResource = session.sync(new SingleObject(configuration, VIEWS.MessageDialog_HasType));\r
+ final int type = getStyle(typeResource);\r
+ final String dialogTitle = session.sync(new RelatedValue2<String>(configuration, VIEWS.MessageDialog_title, Bindings.STRING));\r
+ final String dialogMessage = session.sync(new RelatedValue2<String>(configuration, VIEWS.MessageDialog_message, Bindings.STRING));\r
+ final String[] buttonLabels = session.sync(new RelatedValue2<String[]>(configuration, VIEWS.MessageDialog_buttonLabels, Bindings.STRING_ARRAY));\r
+ final Integer defaultButton = session.sync(new RelatedValue2<Integer>(configuration, VIEWS.MessageDialog_defaultButton, Bindings.INTEGER));\r
+ final Resource customArea = session.sync(new PossibleObject(configuration, VIEWS.MessageDialog_HasCustomArea));\r
+\r
+ final SWTRoot root = createCustomArea(customArea, parameters);\r
+\r
+ class Dialog extends MessageDialog {\r
+\r
+ public Dialog() {\r
+ super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), \r
+ dialogTitle, null, \r
+ dialogMessage, \r
+ type, buttonLabels, defaultButton);\r
+ }\r
+\r
+ @Override\r
+ protected boolean isResizable() {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ protected Control createCustomArea(Composite parent) {\r
+ if(root != null) {\r
+ Composite customArea = new Composite(parent, SWT.NONE);\r
+ customArea.setLayout(new GridLayout());\r
+ GridDataFactory.fillDefaults().grab(true, true).minSize(50, 50).applyTo(customArea);\r
+ root.createControls(customArea);\r
+ return customArea;\r
+ } else {\r
+ return super.createCustomArea(parent);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ return new Dialog().open();\r
+\r
+ } catch (DatabaseException e) {\r
+ Logger.defaultLogError(e);\r
+ }\r
+ \r
+ return -1;\r
+\r
+ }\r
+ \r
+ \r
+ \r
+\r
+}\r