]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.views.swt/src/org/simantics/views/swt/ModelledDialogs.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.views.swt / src / org / simantics / views / swt / ModelledDialogs.java
diff --git a/bundles/org.simantics.views.swt/src/org/simantics/views/swt/ModelledDialogs.java b/bundles/org.simantics.views.swt/src/org/simantics/views/swt/ModelledDialogs.java
new file mode 100644 (file)
index 0000000..0f46ad6
--- /dev/null
@@ -0,0 +1,164 @@
+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