Skip to content

Package: DataTypeControl

DataTypeControl

nameinstructionbranchcomplexitylinemethod
DataTypeControl(VControl, ViewModelContext, ReportService, EMFFormsDatabinding, EMFFormsLabelProvider, VTViewTemplateProvider)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
createBindings(Viewer)
M: 0 C: 39
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
createJFaceViewer(Composite)
M: 15 C: 64
81%
M: 5 C: 3
38%
M: 3 C: 2
40%
M: 3 C: 19
86%
M: 0 C: 1
100%
getUnsetText()
M: 2 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
isUnsettable()
M: 0 C: 2
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2013 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Clemens Elflein - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.editor.ecore.controls;
15:
16: import java.util.List;
17:
18: import javax.inject.Inject;
19:
20: import org.eclipse.core.databinding.Binding;
21: import org.eclipse.core.databinding.conversion.Converter;
22: import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
23: import org.eclipse.emf.ecore.EAttribute;
24: import org.eclipse.emf.ecore.EClass;
25: import org.eclipse.emf.ecore.EClassifier;
26: import org.eclipse.emf.ecore.EDataType;
27: import org.eclipse.emf.ecore.EOperation;
28: import org.eclipse.emf.ecore.EParameter;
29: import org.eclipse.emf.ecore.EReference;
30: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
31: import org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlJFaceViewerSWTRenderer;
32: import org.eclipse.emf.ecp.view.spi.model.VControl;
33: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
34: import org.eclipse.emfforms.spi.common.report.ReportService;
35: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
36: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
37: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
38: import org.eclipse.emfforms.spi.editor.helpers.ResourceSetHelpers;
39: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
40: import org.eclipse.jface.fieldassist.AutoCompleteField;
41: import org.eclipse.jface.fieldassist.ComboContentAdapter;
42: import org.eclipse.jface.viewers.ArrayContentProvider;
43: import org.eclipse.jface.viewers.ComboViewer;
44: import org.eclipse.jface.viewers.LabelProvider;
45: import org.eclipse.jface.viewers.Viewer;
46: import org.eclipse.swt.SWT;
47: import org.eclipse.swt.widgets.Composite;
48:
49: /**
50: * A control to select the DataType for ETypedElements.
51: *
52: * This control assists the user while selecting EDataTypes.
53: * For example you can type "String" in order to select "EString"
54: *
55: */
56: public class DataTypeControl extends SimpleControlJFaceViewerSWTRenderer {
57:         /**
58:          * Default constructor.
59:          *
60:          * @param vElement the view model element to be rendered
61:          * @param viewContext the view context
62:          * @param reportService The {@link ReportService}
63:          * @param emfFormsDatabinding The {@link EMFFormsDatabinding}
64:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
65:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
66:          */
67:         @Inject
68:         public DataTypeControl(VControl vElement, ViewModelContext viewContext, ReportService reportService,
69:                 EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
70:                 VTViewTemplateProvider vtViewTemplateProvider) {
71:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider);
72:         }
73:
74:         @Override
75:         protected String getUnsetText() {
76:                 return "No EDataType set!";
77:         }
78:
79:         @Override
80:         protected Viewer createJFaceViewer(Composite parent) {
81:                 final ComboViewer combo = new ComboViewer(parent, SWT.DROP_DOWN);
82:
83:                 Class<?> type = EClassifier.class;
84:                 boolean includeEcorePackage = false;
85:
86:•                if (getViewModelContext().getDomainModel() instanceof EAttribute) {
87:                         type = EDataType.class;
88:                         includeEcorePackage = true;
89:•                } else if (getViewModelContext().getDomainModel() instanceof EReference) {
90:                         type = EClass.class;
91:                         includeEcorePackage = false;
92:•                } else if (getViewModelContext().getDomainModel() instanceof EOperation) {
93:                         includeEcorePackage = true;
94:•                } else if (getViewModelContext().getDomainModel() instanceof EParameter) {
95:                         includeEcorePackage = true;
96:                 }
97:
98:                 final List<?> classifiers = ResourceSetHelpers.findAllOfTypeInResourceSet(
99:                         getViewModelContext().getDomainModel(), type,
100:                         includeEcorePackage);
101:
102:                 combo.setLabelProvider(new LabelProvider() {
103:                         @Override
104:                         public String getText(Object element) {
105:                                 if (element instanceof EClassifier) {
106:                                         return ((EClassifier) element).getName();
107:                                 }
108:                                 return super.getText(element);
109:                         }
110:                 });
111:                 combo.setContentProvider(new ArrayContentProvider());
112:                 combo.setInput(classifiers.toArray());
113:
114:                 new AutoCompleteField(combo.getCombo(), new ComboContentAdapter(),
115:                         combo.getCombo().getItems());
116:
117:                 return combo;
118:         }
119:
120:         @Override
121:         protected Binding[] createBindings(final Viewer viewer) throws DatabindingFailedException {
122:                 final Binding binding = getDataBindingContext().bindValue(
123:                         WidgetProperties.text().observe(
124:                                 ((ComboViewer) viewer).getCombo()),
125:                         getModelValue(),
126:                         new EMFUpdateValueStrategy().setConverter(new Converter(
127:                                 String.class, EClassifier.class) {
128:                                 @Override
129:                                 public Object convert(Object fromObject) {
130:                                         // We want the result for such a request to be null, not a DataType with null name (can occur)
131:                                         if (fromObject == null) {
132:                                                 return null;
133:                                         }
134:
135:                                         final Object[] classifiers = (Object[]) ((ComboViewer) viewer).getInput();
136:                                         for (int i = 0; i < classifiers.length; i++) {
137:                                                 if (fromObject
138:                                                         .equals(((EClassifier) classifiers[i])
139:                                                                 .getName())) {
140:                                                         return classifiers[i];
141:                                                 }
142:                                         }
143:
144:                                         // If we haven't found the DataType yet, Try adding an E to the Input and search again.
145:                                         // So we find EString even if String was searched.
146:                                         final String fromStringWithE = "E" + fromObject.toString();
147:                                         for (int i = 0; i < classifiers.length; i++) {
148:                                                 if (fromStringWithE.equals(((EClassifier) classifiers[i]).getName())) {
149:                                                         return classifiers[i];
150:                                                 }
151:                                         }
152:
153:                                         return null;
154:                                 }
155:                         }), new EMFUpdateValueStrategy().setConverter(new Converter(EClassifier.class, String.class) {
156:                                 @Override
157:                                 public Object convert(Object fromObject) {
158:                                         if (fromObject == null) {
159:                                                 return "";
160:                                         }
161:                                         return ((EClassifier) fromObject).getName();
162:                                 }
163:                         }));
164:                 // TODO: this update creates a nasty usability bug!
165:                 /*
166:                  * ((ComboViewer)viewer).getCombo().addFocusListener(new FocusListener() {
167:                  * @Override
168:                  * public void focusLost(FocusEvent e) {
169:                  * binding.updateModelToTarget();
170:                  * }
171:                  * @Override
172:                  * public void focusGained(FocusEvent e) {
173:                  * }
174:                  * });
175:                  */
176:                 return new Binding[] { binding };
177:         }
178:
179:         @Override
180:         protected boolean isUnsettable() {
181:                 // We unset the property via databinding as soon as the input is invalid
182:                 return false;
183:         }
184: }