Skip to content

Package: EReferenceLabelControlSWTRenderer$5

EReferenceLabelControlSWTRenderer$5

nameinstructionbranchcomplexitylinemethod
convert(Object)
M: 11 C: 5
31%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 3 C: 1
25%
M: 0 C: 1
100%
{...}
M: 0 C: 6
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-2014 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: * Alexandra Buzila - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.internal.editor.controls;
15:
16: import org.eclipse.core.databinding.Binding;
17: import org.eclipse.core.databinding.UpdateValueStrategy;
18: import org.eclipse.core.databinding.observable.value.IObservableValue;
19: import org.eclipse.emf.common.notify.AdapterFactory;
20: import org.eclipse.emf.common.notify.Notification;
21: import org.eclipse.emf.ecore.EObject;
22: import org.eclipse.emf.ecp.edit.internal.swt.SWTImageHelper;
23: import org.eclipse.emf.ecp.edit.spi.util.ECPModelElementChangeListener;
24: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
25: import org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer;
26: import org.eclipse.emf.ecp.view.spi.model.VControl;
27: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
28: import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
29: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
30: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
31: import org.eclipse.emfforms.spi.common.report.ReportService;
32: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
33: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedReport;
34: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
35: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
36: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
37: import org.eclipse.jface.layout.GridDataFactory;
38: import org.eclipse.jface.layout.GridLayoutFactory;
39: import org.eclipse.swt.SWT;
40: import org.eclipse.swt.widgets.Composite;
41: import org.eclipse.swt.widgets.Control;
42: import org.eclipse.swt.widgets.Display;
43: import org.eclipse.swt.widgets.Label;
44: import org.osgi.framework.BundleContext;
45: import org.osgi.framework.FrameworkUtil;
46: import org.osgi.framework.ServiceReference;
47:
48: /**
49: * @author Alexandra Buzila
50: *
51: */
52: public class EReferenceLabelControlSWTRenderer extends SimpleControlSWTControlSWTRenderer {
53:
54:         private static final EMFFormsDatabinding EMFFORMS_DATABINDING;
55:         private static final EMFFormsLabelProvider EMFFORMS_LABELPROVIDER;
56:         private static final VTViewTemplateProvider VT_VIEW_TEMPLATEPROVIDER;
57:
58:         static {
59:                 final BundleContext bundleContext = FrameworkUtil.getBundle(EReferenceLabelControlSWTRenderer.class)
60:                         .getBundleContext();
61:                 final ServiceReference<EMFFormsDatabinding> emfFormsDatabindingServiceReference = bundleContext
62:                         .getServiceReference(EMFFormsDatabinding.class);
63:                 EMFFORMS_DATABINDING = bundleContext.getService(emfFormsDatabindingServiceReference);
64:                 final ServiceReference<EMFFormsLabelProvider> emfFormsLabelProviderServiceReference = bundleContext
65:                         .getServiceReference(EMFFormsLabelProvider.class);
66:                 EMFFORMS_LABELPROVIDER = bundleContext.getService(emfFormsLabelProviderServiceReference);
67:                 final ServiceReference<VTViewTemplateProvider> vtViewTemplateProviderServiceReference = bundleContext
68:                         .getServiceReference(VTViewTemplateProvider.class);
69:                 VT_VIEW_TEMPLATEPROVIDER = bundleContext.getService(vtViewTemplateProviderServiceReference);
70:         }
71:
72:         /**
73:          * Default constructor.
74:          *
75:          * @param vElement the view model element to be rendered
76:          * @param viewContext the view context
77:          * @param reportService The {@link ReportService}
78:          */
79:         public EReferenceLabelControlSWTRenderer(VControl vElement, ViewModelContext viewContext,
80:                 ReportService reportService) {
81:                 super(vElement, viewContext, reportService, EMFFORMS_DATABINDING, EMFFORMS_LABELPROVIDER,
82:                         VT_VIEW_TEMPLATEPROVIDER);
83:         }
84:
85:         private Composite labelComposite;
86:         private Label label;
87:         private ComposedAdapterFactory composedAdapterFactory;
88:         private AdapterFactoryItemDelegator adapterFactoryItemDelegator;
89:         private Label imageLabel;
90:         private ECPModelElementChangeListener modelElementChangeListener;
91:
92:         /**
93:          * {@inheritDoc}
94:          *
95:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer#createBindings(org.eclipse.swt.widgets.Control,
96:          * org.eclipse.emf.ecore.EStructuralFeature.Setting)
97:          */
98:         @Override
99:         protected Binding[] createBindings(Control control) throws DatabindingFailedException {
100:
101:                 final Binding[] bindings = new Binding[3];
102:                 final IObservableValue value = WidgetProperties.text().observe(label);
103:
104:                 bindings[0] = getDataBindingContext().bindValue(value, getModelValue(),
105:                         withPreSetValidation(new UpdateValueStrategy() {
106:
107:                                 @Override
108:                                 public Object convert(Object value) {
109:                                         try {
110:                                                 return getModelValue().getValue();
111:                                         } catch (final DatabindingFailedException ex) {
112:                                                 getReportService().report(new DatabindingFailedReport(ex));
113:                                                 return null;
114:                                         }
115:                                 }
116:                         }), new UpdateValueStrategy() {
117:                                 @Override
118:                                 public Object convert(Object value) {
119:                                         updateChangeListener((EObject) value);
120:                                         return getText(value);
121:                                 }
122:                         });
123:                 final IObservableValue tooltipValue = WidgetProperties.tooltipText().observe(label);
124:                 bindings[1] = getDataBindingContext().bindValue(tooltipValue, getModelValue(),
125:                         withPreSetValidation(new UpdateValueStrategy() {
126:
127:                                 @Override
128:                                 public Object convert(Object value) {
129:                                         try {
130:                                                 return getModelValue().getValue();
131:                                         } catch (final DatabindingFailedException ex) {
132:                                                 getReportService().report(new DatabindingFailedReport(ex));
133:                                                 return null;
134:                                         }
135:                                 }
136:                         }), new UpdateValueStrategy() {
137:                                 @Override
138:                                 public Object convert(Object value) {
139:                                         return getText(value);
140:                                 }
141:                         });
142:
143:                 final IObservableValue imageValue = WidgetProperties.image().observe(imageLabel);
144:                 bindings[2] = getDataBindingContext().bindValue(imageValue, getModelValue(),
145:                         withPreSetValidation(new UpdateValueStrategy() {
146:
147:                                 @Override
148:                                 public Object convert(Object value) {
149:                                         try {
150:                                                 return getModelValue().getValue();
151:                                         } catch (final DatabindingFailedException ex) {
152:                                                 getReportService().report(new DatabindingFailedReport(ex));
153:                                                 return null;
154:                                         }
155:                                 }
156:                         }), new UpdateValueStrategy() {
157:                                 @Override
158:                                 public Object convert(Object value) {
159:                                         return getImage(value);
160:                                 }
161:                         });
162:
163:                 return bindings;
164:         }
165:
166:         private Object getImage(Object value) {
167:                 return SWTImageHelper.getImage(adapterFactoryItemDelegator.getImage(value));
168:         }
169:
170:         /**
171:          * Computes the label text for the referenced object.
172:          *
173:          * @param value The referenced object
174:          * @return the label text to display
175:          */
176:         protected Object getText(Object value) {
177:                 final String textName = adapterFactoryItemDelegator.getText(value);
178:                 return textName == null ? "" : textName; //$NON-NLS-1$
179:         }
180:
181:         private void updateChangeListener(final EObject value) {
182:                 if (modelElementChangeListener != null) {
183:                         if (modelElementChangeListener.getTarget().equals(value)) {
184:                                 return;
185:                         }
186:                         modelElementChangeListener.remove();
187:                         modelElementChangeListener = null;
188:                 }
189:                 if (value == null) {
190:                         return;
191:                 }
192:                 modelElementChangeListener = new ECPModelElementChangeListener(value) {
193:
194:                         @Override
195:                         public void onChange(Notification notification) {
196:                                 Display.getDefault().syncExec(new Runnable() {
197:
198:                                         @Override
199:                                         public void run() {
200:                                                 getDataBindingContext().updateTargets();
201:                                                 labelComposite.layout();
202:
203:                                         }
204:
205:                                 });
206:
207:                         }
208:                 };
209:
210:         }
211:
212:         /**
213:          * {@inheritDoc}
214:          *
215:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer#createSWTControl(org.eclipse.swt.widgets.Composite,
216:          * org.eclipse.emf.ecore.EStructuralFeature.Setting)
217:          */
218:         @Override
219:         protected Control createSWTControl(Composite parent2) throws DatabindingFailedException {
220:                 final Composite composite2 = new Composite(parent2, SWT.NONE);
221:                 composite2.setBackground(parent2.getBackground());
222:                 GridLayoutFactory.fillDefaults().numColumns(1).spacing(0, 0).equalWidth(false).applyTo(composite2);
223:
224:                 labelComposite = new Composite(composite2, SWT.NONE);
225:                 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(labelComposite);
226:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(labelComposite);
227:                 labelComposite.setBackground(composite2.getBackground());
228:
229:                 // create labels
230:                 imageLabel = new Label(labelComposite, SWT.NONE);
231:                 imageLabel.setBackground(labelComposite.getBackground());
232:                 label = new Label(labelComposite, SWT.NONE);
233:                 label.setBackground(labelComposite.getBackground());
234:                 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.CENTER).applyTo(label);
235:                 GridDataFactory.fillDefaults().grab(false, true).align(SWT.FILL, SWT.CENTER).hint(20, 20)
236:                         .applyTo(imageLabel);
237:
238:                 composedAdapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
239:                         new ReflectiveItemProviderAdapterFactory(),
240:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
241:                 adapterFactoryItemDelegator = new AdapterFactoryItemDelegator(composedAdapterFactory);
242:
243:                 return composite2;
244:         }
245:
246:         /**
247:          * {@inheritDoc}
248:          *
249:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#getUnsetText()
250:          */
251:         @Override
252:         protected String getUnsetText() {
253:                 return "Not set"; //$NON-NLS-1$
254:         }
255:
256:         @Override
257:         public void dispose() {
258:                 composedAdapterFactory.dispose();
259:                 if (modelElementChangeListener != null) {
260:                         modelElementChangeListener.remove();
261:                 }
262:                 label.dispose();
263:                 super.dispose();
264:         }
265:
266: }