--- /dev/null
+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