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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.ui.features;
\r
14 import java.util.ArrayList;
\r
15 import java.util.List;
\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
35 * A basic {@link IEditorNamingService} implementation for structural models.
\r
37 * @author Tuukka Lehtonen
\r
39 public class EditorNamingService2 implements IEditorNamingService {
\r
41 private static final boolean DEBUG = false;
\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
49 ResourceArray a = input.getResourceArray();
\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
58 return "(empty input)";
\r
60 StructuralResource2 sr = StructuralResource2.getInstance(g);
\r
61 DiagramResource dr = DiagramResource.getInstance(g);
\r
62 ModelingResources mr = ModelingResources.getInstance(g);
\r
64 Resource mainInput = a.resources[0];
\r
65 NameLabelMode mode = NameLabelUtil.getNameLabelMode(g);
\r
67 if (g.isInstanceOf(mainInput, dr.Diagram)) {
\r
69 System.out.println("input resource[0] is a diagram ");
\r
71 if (a.size() == 1) {
\r
72 String name = nameSingleDiagramInput(g, mainInput, in, mode);
\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
86 return name + " : " + ctName;
\r
92 // Just a normal configuration diagram.
\r
95 return namePathInput(g, input, in, mode);
\r
97 } else if (g.isInstanceOf(mainInput, dr.Composite)) {
\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
110 String name = NameLabelUtil.modalName(g, mainInput, mode);
\r
112 name = "(no name)";
\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
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
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
141 protected Variable getPossibleConfigurationCompositeVariable(ReadGraph graph, IResourceEditorInput2 in) throws DatabaseException {
\r
143 if (in.getRVI() != null)
\r
144 return in.getVariable(graph);
\r
145 } catch (DatabaseException e) {
\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
155 protected String namePathInput(ReadGraph g, IResourceEditorInput input, IEditorInput in, NameLabelMode mode) throws DatabaseException {
\r
156 StringBuilder sb = new StringBuilder();
\r
158 Resource composite = input.getResourceArray().resources[1];
\r
159 sb.append(getSafeLabel(g, composite, mode));
\r
162 pathSuffix(g, input.getResourceArray(), mode, 2, sb);
\r
164 return sb.toString();
\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
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
176 List<String> pathNames = new ArrayList<String>(a.size() + 1);
\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
187 path(pathNames, addParenthesis, separator, result);
\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
201 protected String getSafeLabel(ReadGraph graph, Resource r, NameLabelMode mode) throws DatabaseException {
\r
202 return NameLabelUtil.modalName(graph, r, mode);
\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
212 if (!(in instanceof IResourceEditorInput))
\r
213 return "Unsupported input: " + in;
\r
215 IResourceEditorInput input = (IResourceEditorInput) in;
\r
216 return NameUtils.getSafeName(graph, input.getResource());
\r
219 protected String truncated(String name, int maxLength) throws DatabaseException {
\r
220 if (name.length() <= maxLength)
\r
222 return name.substring(0, Math.max(0, maxLength - 3)) + "...";
\r