]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/NewConnectionPoint.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / NewConnectionPoint.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/NewConnectionPoint.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/NewConnectionPoint.java
new file mode 100644 (file)
index 0000000..6865775
--- /dev/null
@@ -0,0 +1,182 @@
+package org.simantics.modeling.ui.actions;\r
+\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.eclipse.jface.dialogs.IDialogSettings;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.window.Window;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.ui.PlatformUI;\r
+import org.simantics.Simantics;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.PossibleIndexRoot;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.ActionFactory;\r
+import org.simantics.db.layer0.adapter.Instances;\r
+import org.simantics.db.layer0.util.Layer0Utils;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.modeling.ModelingResources;\r
+import org.simantics.modeling.ui.Activator;\r
+import org.simantics.modeling.userComponent.ComponentTypeCommands;\r
+import org.simantics.structural.stubs.StructuralResource2;\r
+import org.simantics.ui.workbench.dialogs.ResourceSelectionDialog3;\r
+import org.simantics.utils.datastructures.Pair;\r
+import org.simantics.utils.ui.ErrorLogger;\r
+\r
+public class NewConnectionPoint implements ActionFactory {\r
+\r
+    @Override\r
+    public Runnable create(Object target) {\r
+        if (!(target instanceof Resource))\r
+            return null;\r
+        final Resource componentType = (Resource)target;\r
+        return new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                try {\r
+                    \r
+                    Map<Resource, Pair<String, ImageDescriptor>> map = Simantics.sync(new UniqueRead<Map<Resource,Pair<String,ImageDescriptor>>>() {\r
+\r
+                        @Override\r
+                        public Map<Resource, Pair<String, ImageDescriptor>> perform(ReadGraph graph) throws DatabaseException {\r
+                            \r
+                            HashMap<Resource, Pair<String,ImageDescriptor>> map = new HashMap<Resource, Pair<String,ImageDescriptor>>(); \r
+                            \r
+                            Layer0 L0 = Layer0.getInstance(graph);\r
+                            \r
+                            StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
+                            ModelingResources MOD = ModelingResources.getInstance(graph);\r
+                            \r
+                            Instances query = graph.adapt(STR.ConnectionRelation, Instances.class);\r
+                            \r
+                            Resource model = graph.sync(new PossibleIndexRoot(componentType));\r
+                            \r
+//                            List<String> domainNames = new ArrayList<String>();\r
+                            \r
+                            for(Resource _res : query.find(graph, model)) {\r
+\r
+                                boolean isDiagramRelation = graph.hasStatement(_res, MOD.DiagramConnectionRelationToConnectionRelation);\r
+                                if (isDiagramRelation)\r
+                                    continue;\r
+\r
+                                Collection<Resource> domains = graph.getObjects(_res, L0.HasDomain);\r
+                                \r
+                                String name = null;\r
+                                if(domains.size() == 0) {\r
+                                    continue;\r
+                                } else if (domains.size() > 1) {\r
+                                    StringBuilder sb = new StringBuilder();\r
+                                    sb.append(NameUtils.getSafeName(graph, _res));\r
+//                                    domainNames.clear();\r
+//                                    for (Resource domain : domains)\r
+//                                        domainNames.add(NameUtils.getSafeName(graph, domain));\r
+//                                    Collections.sort(domainNames, AlphanumComparator.CASE_INSENSITIVE_COMPARATOR);\r
+//                                    String prefix = findLongestCommonPrefix(domainNames);\r
+//                                    sb.append(" - ").append(prefix).append("{");\r
+//                                    boolean first = true;\r
+//                                    for (String s : domainNames) {\r
+//                                        if (!first)\r
+//                                            sb.append(",");\r
+//                                        first = false;\r
+//                                        sb.append(s.substring(prefix.length()));\r
+//                                    }\r
+//                                    sb.append("}");\r
+                                    name = sb.toString();\r
+                                } else {\r
+                                    // domains.size() == 1\r
+                                    name = NameUtils.getSafeName(graph, _res) + " (" + graph.getURI(domains.iterator().next()) + ")";\r
+                                }\r
+                                map.put(_res, new Pair<String, ImageDescriptor>(name, null));\r
+                                \r
+                            }\r
+                            \r
+                            return map;\r
+                            \r
+                        }\r
+\r
+                    });\r
+                    \r
+                    final Resource[] cps = queryCps(map);\r
+                    if(cps.length == 0) return;\r
+                    \r
+                    Simantics.getSession().async(new WriteRequest() {\r
+                        @Override\r
+                        public void perform(WriteGraph graph) throws DatabaseException {\r
+                            graph.markUndoPoint();\r
+                            for (Resource cp : cps)\r
+                                ComponentTypeCommands.createConnectionPoint(graph, componentType, cp);\r
+                            Layer0Utils.addCommentMetadata(graph, createConnectionPointComment(graph, componentType, cps));\r
+                        }\r
+                        String createConnectionPointComment(ReadGraph graph, Resource target, Resource[] cps) throws DatabaseException {\r
+                            StringBuilder result = new StringBuilder();\r
+                            result.append("Created connection point");\r
+                            if (cps.length > 1)\r
+                                result.append('s');\r
+                            result.append(" for ")\r
+                            .append(NameUtils.getSafeName(graph, componentType))\r
+                            .append(":\n");\r
+                            for (int i = 0; i < cps.length; ++i) {\r
+                                result.append('\t');\r
+                                result.append(NameUtils.getSafeName(graph, cps[i]));\r
+                                result.append('\n');\r
+                            }\r
+                            return result.toString();\r
+                        }\r
+                    });\r
+                    \r
+                } catch (DatabaseException e1) {\r
+                    ErrorLogger.defaultLogError(e1);\r
+                }\r
+            }\r
+        };\r
+    }\r
+\r
+//    private static String findLongestCommonPrefix(List<String> strs) {\r
+//        int count = strs.size();\r
+//        if (count == 0)\r
+//            return "";\r
+//        if (count == 1)\r
+//            return strs.get(0);\r
+//        int maxLen = Integer.MAX_VALUE;\r
+//        for (int n = 0; n < count; ++n)\r
+//            maxLen = Math.min(maxLen, strs.get(n).length());\r
+//        int i = 0;\r
+//        chars:\r
+//            for (; i < maxLen; ++i) {\r
+//                char ch = strs.get(0).charAt(i);\r
+//                for (int n = 1; n < count; ++n) {\r
+//                    if (strs.get(n).charAt(i) != ch)\r
+//                        break chars;\r
+//                }\r
+//            }\r
+//        return strs.get(0).substring(0, Math.max(0, i));\r
+//    }\r
+\r
+    private Resource[] queryCps(Map<Resource, Pair<String, ImageDescriptor>> map) {\r
+\r
+        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();\r
+        ResourceSelectionDialog3<Resource> dialog = new ResourceSelectionDialog3<Resource>(shell, map, "Select connection point type") {\r
+            @Override\r
+            protected IDialogSettings getBaseDialogSettings() {\r
+                return Activator.getDefault().getDialogSettings();\r
+            }\r
+        };\r
+        if (dialog.open() == Window.OK) {\r
+            Object[] result = dialog.getResult();\r
+            if (result != null && result.length > 0) {\r
+                final Resource[] res = new Resource[result.length];\r
+                System.arraycopy(result, 0, res, 0, result.length);\r
+                return res;\r
+            }\r
+        }\r
+        return Resource.NONE;\r
+        \r
+    }\r
+}\r