]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/features/EditorNamingService2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / features / EditorNamingService2.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.features;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.List;\r
16 \r
17 import org.eclipse.ui.IEditorInput;\r
18 import org.simantics.NameLabelMode;\r
19 import org.simantics.NameLabelUtil;\r
20 import org.simantics.db.ReadGraph;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.common.ResourceArray;\r
23 import org.simantics.db.common.utils.NameUtils;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.db.layer0.variable.Variable;\r
26 import org.simantics.diagram.stubs.DiagramResource;\r
27 import org.simantics.modeling.ModelingResources;\r
28 import org.simantics.structural.stubs.StructuralResource2;\r
29 import org.simantics.ui.workbench.IEditorNamingService;\r
30 import org.simantics.ui.workbench.IResourceEditorInput;\r
31 import org.simantics.ui.workbench.IResourceEditorInput2;\r
32 import org.simantics.utils.strings.EString;\r
33 \r
34 /**\r
35  * A basic {@link IEditorNamingService} implementation for structural models.\r
36  * \r
37  * @author Tuukka Lehtonen\r
38  */\r
39 public class EditorNamingService2 implements IEditorNamingService {\r
40 \r
41     private static final boolean DEBUG = false;\r
42 \r
43     @Override\r
44     public String getName(ReadGraph g, String editorId, IEditorInput in) throws DatabaseException {\r
45         if (!(in instanceof IResourceEditorInput))\r
46             return "Unsupported input: " + in;\r
47         IResourceEditorInput input = (IResourceEditorInput) in;\r
48 \r
49         ResourceArray a = input.getResourceArray();\r
50 \r
51         if (DEBUG) {\r
52             System.out.println("EditorNamingService2.getName: " + input);\r
53             for (int i = 0; i < a.resources.length; ++i)\r
54                 System.out.println("    [" + i + "] " + NameUtils.getURIOrSafeNameInternal(g, a.resources[i]));\r
55         }\r
56 \r
57         if (a.isEmpty())\r
58             return "(empty input)";\r
59 \r
60         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
61         DiagramResource dr = DiagramResource.getInstance(g);\r
62         ModelingResources mr = ModelingResources.getInstance(g);\r
63 \r
64         Resource mainInput = a.resources[0];\r
65         NameLabelMode mode = NameLabelUtil.getNameLabelMode(g);\r
66 \r
67         if (g.isInstanceOf(mainInput, dr.Diagram)) {\r
68             if (DEBUG)\r
69                 System.out.println("input resource[0] is a diagram ");\r
70 \r
71             if (a.size() == 1) {\r
72                 String name = nameSingleDiagramInput(g, mainInput, in, mode);\r
73 \r
74                 // Component type configuration diagram?\r
75                 Resource composite = g.getPossibleObject(mainInput, mr.DiagramToComposite);\r
76                 if (composite != null) {\r
77                     Resource defines = g.getPossibleObject(composite, sr.Defines);\r
78                     if (defines != null && g.isInstanceOf(defines, sr.ComponentType)) {\r
79                         if (in instanceof IResourceEditorInput2) {\r
80                             IResourceEditorInput2 in2 = (IResourceEditorInput2) in;\r
81                             String rvi = in2.getRVI();\r
82                             String ctName = NameLabelUtil.modalName(g, defines, mode);\r
83                             if (rvi == null || rvi.isEmpty()) {\r
84                                 return ctName + " (Configuration)";\r
85                             } else {\r
86                                 return name + " : " + ctName;\r
87                             }\r
88                         }\r
89                     }\r
90                 }\r
91 \r
92                 // Just a normal configuration diagram.\r
93                 return name;\r
94             } else {\r
95                 return namePathInput(g, input, in, mode);\r
96             }\r
97         } else if (g.isInstanceOf(mainInput, dr.Composite)) {\r
98             // Symbol?\r
99             Resource defines = g.getPossibleObject(mainInput, sr.Defines);\r
100             if (defines != null && g.isInheritedFrom(defines, dr.DefinedElement)) {\r
101                 Resource componentType = g.getPossibleObject(defines, mr.SymbolToComponentType);\r
102                 if (componentType != null) {\r
103                     String symbolName = NameLabelUtil.modalName(g, defines, mode);\r
104                     String cName = NameLabelUtil.modalName(g, componentType, mode);\r
105                     return symbolName + " (Symbol of " + cName + ")";\r
106                 }\r
107             }\r
108         }\r
109 \r
110         String name = NameLabelUtil.modalName(g, mainInput, mode);\r
111         if (name == null)\r
112             name = "(no name)";\r
113         return name;\r
114     }\r
115 \r
116     protected String nameSingleDiagramInput(ReadGraph g, Resource input, IEditorInput in, NameLabelMode mode) throws DatabaseException {\r
117         ModelingResources mr = ModelingResources.getInstance(g);\r
118         StructuralResource2 sr = StructuralResource2.getInstance(g);\r
119 \r
120         if (in instanceof IResourceEditorInput2) {\r
121             IResourceEditorInput2 in2 = (IResourceEditorInput2) in;\r
122             String rvi = in2.getRVI();\r
123             if (rvi != null && !rvi.isEmpty()) {\r
124                 String compositeName = getPossibleCompositeName(g, in2, mode);\r
125                 if (compositeName != null)\r
126                     return compositeName;\r
127             }\r
128         }\r
129 \r
130         // Prefer composite name over diagram name.\r
131         Resource composite = g.getPossibleObject(input, mr.DiagramToComposite);\r
132         if (composite == null)\r
133             return getSafeLabel(g, input, mode);\r
134         // Prefer the name of what the composite defines if it defines something.\r
135         Resource defines = g.getPossibleObject(composite, sr.Defines);\r
136         if (defines != null)\r
137             return getSafeLabel(g, defines, mode);\r
138         return getSafeLabel(g, composite, mode);\r
139     }\r
140 \r
141     protected Variable getPossibleConfigurationCompositeVariable(ReadGraph graph, IResourceEditorInput2 in) throws DatabaseException {\r
142         try {\r
143             if (in.getRVI() != null)\r
144                 return in.getVariable(graph);\r
145         } catch (DatabaseException e) {\r
146         }\r
147         return null;\r
148     }\r
149 \r
150     protected String getPossibleCompositeName(ReadGraph g, IResourceEditorInput2 in, NameLabelMode mode) throws DatabaseException {\r
151         Variable composite = getPossibleConfigurationCompositeVariable(g, in);\r
152         return composite == null ? null : NameLabelUtil.modalName(g, composite, mode);\r
153     }\r
154 \r
155     protected String namePathInput(ReadGraph g, IResourceEditorInput input, IEditorInput in, NameLabelMode mode) throws DatabaseException {\r
156         StringBuilder sb = new StringBuilder();\r
157 \r
158         Resource composite = input.getResourceArray().resources[1];\r
159         sb.append(getSafeLabel(g, composite, mode));\r
160 \r
161         sb.append(" ");\r
162         pathSuffix(g, input.getResourceArray(), mode, 2, sb);\r
163 \r
164         return sb.toString();\r
165     }\r
166 \r
167     protected void pathSuffix(ReadGraph g, ResourceArray a, NameLabelMode mode, int dropFromTail, StringBuilder result) throws DatabaseException {\r
168         path(g, a, mode, 0, dropFromTail, true, ".", result);\r
169     }\r
170 \r
171     protected void path(ReadGraph g, ResourceArray a, NameLabelMode mode, int dropFromHead, int dropFromTail, boolean addParenthesis, String separator, StringBuilder result) throws DatabaseException {\r
172         if (a.resources.length > 1) {\r
173             @SuppressWarnings("unused")\r
174             int level = 0;\r
175 \r
176             List<String> pathNames = new ArrayList<String>(a.size() + 1);\r
177 \r
178             for (int i = a.resources.length - 1 - dropFromHead; i >= dropFromTail; --i) {\r
179                 String pathElementName = truncated(getSafeLabel(g, a.resources[i], mode), 256);\r
180 //                System.out.println("name for path element " + i + ": " + a.resources[i] + ": " + pathElementName);\r
181                 if (pathElementName.contains(separator))\r
182                     pathElementName = '"' + pathElementName + '"';\r
183                 pathNames.add(pathElementName);\r
184                 ++level;\r
185             }\r
186 \r
187             path(pathNames, addParenthesis, separator, result);\r
188         }\r
189     }\r
190 \r
191     protected void path(List<String> segments, boolean addParenthesis, String separator, StringBuilder result) throws DatabaseException {\r
192         if (!segments.isEmpty()) {\r
193             if (addParenthesis)\r
194                 result.append("(");\r
195             result.append(EString.implode(segments, separator));\r
196             if (addParenthesis)\r
197                 result.append(')');\r
198         }\r
199     }\r
200 \r
201     protected String getSafeLabel(ReadGraph graph, Resource r, NameLabelMode mode) throws DatabaseException {\r
202         return NameLabelUtil.modalName(graph, r, mode);\r
203     }\r
204 \r
205     protected String limitedName(ReadGraph graph, String name, IEditorInput in) throws DatabaseException {\r
206         // Keep the workbench safe from harm by trimming too long titles.\r
207         // The workbench will get very stuck if it is given a title of tens of\r
208         // thousands of characters.\r
209         if (name.length() < 256)\r
210             return name;\r
211 \r
212         if (!(in instanceof IResourceEditorInput))\r
213             return "Unsupported input: " + in;\r
214 \r
215         IResourceEditorInput input = (IResourceEditorInput) in;\r
216         return NameUtils.getSafeName(graph, input.getResource());\r
217     }\r
218 \r
219     protected String truncated(String name, int maxLength) throws DatabaseException {\r
220         if (name.length() <= maxLength)\r
221             return name;\r
222         return name.substring(0, Math.max(0, maxLength - 3)) + "...";\r
223     }\r
224 \r
225 }