Skip to content

Package: TableDetailViewControlSWTRenderer$4

TableDetailViewControlSWTRenderer$4

nameinstructionbranchcomplexitylinemethod
convert(Object)
M: 5 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
{...}
M: 6 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%

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: * Johannes Faltermeier - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.internal.editor.controls;
15:
16: import java.net.URL;
17:
18: import javax.inject.Inject;
19:
20: import org.eclipse.core.databinding.Binding;
21: import org.eclipse.core.databinding.UpdateValueStrategy;
22: import org.eclipse.core.databinding.observable.IObserving;
23: import org.eclipse.core.databinding.observable.value.IObservableValue;
24: import org.eclipse.core.databinding.property.value.IValueProperty;
25: import org.eclipse.emf.common.command.Command;
26: import org.eclipse.emf.common.notify.AdapterFactory;
27: import org.eclipse.emf.ecore.EObject;
28: import org.eclipse.emf.ecore.EReference;
29: import org.eclipse.emf.ecore.EStructuralFeature;
30: import org.eclipse.emf.ecp.edit.spi.swt.reference.DeleteReferenceAction;
31: import org.eclipse.emf.ecp.edit.spi.swt.reference.NewReferenceAction;
32: import org.eclipse.emf.ecp.edit.spi.util.ECPModelElementChangeListener;
33: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
34: import org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer;
35: import org.eclipse.emf.ecp.view.spi.model.VControl;
36: import org.eclipse.emf.ecp.view.spi.model.VView;
37: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
38: import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
39: import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
40: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
41: import org.eclipse.emf.edit.command.SetCommand;
42: import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
43: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
44: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
45: import org.eclipse.emfforms.spi.common.report.ReportService;
46: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
47: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedReport;
48: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
49: import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
50: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
51: import org.eclipse.jface.action.Action;
52: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
53: import org.eclipse.jface.dialogs.MessageDialog;
54: import org.eclipse.jface.layout.GridDataFactory;
55: import org.eclipse.jface.layout.GridLayoutFactory;
56: import org.eclipse.swt.SWT;
57: import org.eclipse.swt.events.SelectionEvent;
58: import org.eclipse.swt.events.SelectionListener;
59: import org.eclipse.swt.widgets.Button;
60: import org.eclipse.swt.widgets.Composite;
61: import org.eclipse.swt.widgets.Control;
62: import org.eclipse.swt.widgets.Display;
63: import org.eclipse.swt.widgets.Label;
64:
65: /**
66: * @author jfaltermeier
67: *
68: */
69: public class TableDetailViewControlSWTRenderer extends SimpleControlSWTControlSWTRenderer {
70:
71:         /**
72:          * @author Jonas
73:          *
74:          */
75:         private final class CreateNewElementHandler implements SelectionListener {
76:                 private final EObject eObject;
77:                 private final EStructuralFeature structuralFeature;
78:
79:                 /**
80:                  * @param eObject
81:                  * @param structuralFeature
82:                  */
83:                 private CreateNewElementHandler(EObject eObject, EStructuralFeature structuralFeature) {
84:                         this.eObject = eObject;
85:                         this.structuralFeature = structuralFeature;
86:                 }
87:
88:                 @Override
89:                 public void widgetSelected(SelectionEvent e) {
90:                         final VView detailView = VViewFactory.eINSTANCE.createView();
91:                         final VTableControl tableControl = (VTableControl) eObject;
92:                         if (tableControl.getDomainModelReference() == null) {
93:                                 MessageDialog.openInformation(Display.getDefault().getActiveShell(),
94:                                         "Set Domain Model Reference", "Please set a Domain Model Reference first."); //$NON-NLS-1$ //$NON-NLS-2$
95:                                 return;
96:                         }
97:                         final VTableDomainModelReference domainModelReference = (VTableDomainModelReference) tableControl
98:                                 .getDomainModelReference();
99:                         EReference ref = null;
100:                         if (domainModelReference.getDomainModelReference() == null) {
101:                                 ref = (EReference) domainModelReference.getDomainModelEFeature();
102:                         } else {
103:                                 IValueProperty valueProperty;
104:                                 try {
105:                                         valueProperty = getEMFFormsDatabinding()
106:                                                 .getValueProperty(domainModelReference, getViewModelContext().getDomainModel());
107:                                 } catch (final DatabindingFailedException ex) {
108:                                         getReportService().report(new DatabindingFailedReport(ex));
109:                                         return;
110:                                 }
111:                                 final EStructuralFeature feature = (EStructuralFeature) valueProperty.getValueType();
112:                                 if (EReference.class.isInstance(feature)) {
113:                                         ref = EReference.class.cast(feature);
114:                                 }
115:                         }
116:
117:                         if (ref == null) {
118:                                 MessageDialog.openInformation(Display.getDefault().getActiveShell(),
119:                                         "Set Domain Model Reference", "Please set a Domain Model Reference first."); //$NON-NLS-1$ //$NON-NLS-2$
120:                                 return;
121:                         }
122:                         detailView.setRootEClass(ref.getEReferenceType());
123:                         final Command setCommand = SetCommand.create(getEditingDomain(eObject), eObject,
124:                                 structuralFeature, detailView);
125:                         getEditingDomain(eObject).getCommandStack().execute(setCommand);
126:                 }
127:
128:                 @Override
129:                 public void widgetDefaultSelected(SelectionEvent e) {
130:                 }
131:         }
132:
133:         private final EMFFormsEditSupport emfFormsEditSupport;
134:
135:         /**
136:          * Default constructor.
137:          *
138:          * @param vElement the view model element to be rendered
139:          * @param viewContext the view context
140:          * @param reportService The {@link ReportService}
141:          * @param emfFormsDatabinding The {@link EMFFormsDatabinding}
142:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
143:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
144:          * @param emfFormsEditSupport The {@link EMFFormsEditSupport}
145:          */
146:         @Inject
147:         public TableDetailViewControlSWTRenderer(VControl vElement, ViewModelContext viewContext,
148:                 ReportService reportService,
149:                 EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
150:                 VTViewTemplateProvider vtViewTemplateProvider, EMFFormsEditSupport emfFormsEditSupport) {
151:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider);
152:                 this.emfFormsEditSupport = emfFormsEditSupport;
153:         }
154:
155:         private ComposedAdapterFactory composedAdapterFactory;
156:         private AdapterFactoryItemDelegator adapterFactoryItemDelegator;
157:         private Label label;
158:         private Label imageLabel;
159:         private ECPModelElementChangeListener modelElementChangeListener;
160:         private Composite labelComposite;
161:
162:         /**
163:          * {@inheritDoc}
164:          *
165:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer#createBindings(org.eclipse.swt.widgets.Control,
166:          * org.eclipse.emf.ecore.EStructuralFeature.Setting)
167:          */
168:         @Override
169:         protected Binding[] createBindings(Control control) throws DatabindingFailedException {
170:                 final Binding[] bindings = new Binding[3];
171:                 final IObservableValue value = WidgetProperties.text().observe(label);
172:
173:                 bindings[0] = getDataBindingContext().bindValue(value, getModelValue(),
174:                         withPreSetValidation(new UpdateValueStrategy() {
175:
176:                                 @Override
177:                                 public Object convert(Object value) {
178:                                         try {
179:                                                 return getModelValue().getValue();
180:                                         } catch (final DatabindingFailedException ex) {
181:                                                 getReportService().report(new DatabindingFailedReport(ex));
182:                                                 return null;
183:                                         }
184:                                 }
185:                         }), new UpdateValueStrategy() {
186:                                 @Override
187:                                 public Object convert(Object value) {
188:                                         return getText(value);
189:                                 }
190:                         });
191:
192:                 final IObservableValue tooltipValue = WidgetProperties.tooltipText().observe(label);
193:                 bindings[1] = getDataBindingContext().bindValue(tooltipValue, getModelValue(),
194:                         withPreSetValidation(new UpdateValueStrategy() {
195:
196:                                 @Override
197:                                 public Object convert(Object value) {
198:                                         try {
199:                                                 return getModelValue().getValue();
200:                                         } catch (final DatabindingFailedException ex) {
201:                                                 getReportService().report(new DatabindingFailedReport(ex));
202:                                                 return null;
203:                                         }
204:                                 }
205:                         }), new UpdateValueStrategy() {
206:                                 @Override
207:                                 public Object convert(Object value) {
208:                                         return getText(value);
209:                                 }
210:                         });
211:
212:                 final IObservableValue imageValue = WidgetProperties.image().observe(imageLabel);
213:                 bindings[2] = getDataBindingContext().bindValue(imageValue, getModelValue(),
214:                         withPreSetValidation(new UpdateValueStrategy() {
215:
216:                                 @Override
217:                                 public Object convert(Object value) {
218:                                         try {
219:                                                 return getModelValue().getValue();
220:                                         } catch (final DatabindingFailedException ex) {
221:                                                 getReportService().report(new DatabindingFailedReport(ex));
222:                                                 return null;
223:                                         }
224:                                 }
225:                         }), new UpdateValueStrategy() {
226:                                 @Override
227:                                 public Object convert(Object value) {
228:                                         return getImage(value);
229:                                 }
230:                         });
231:
232:                 return bindings;
233:         }
234:
235:         private Object getText(Object value) {
236:                 final String textName = adapterFactoryItemDelegator.getText(value);
237:                 return textName == null ? "" : textName; //$NON-NLS-1$
238:         }
239:
240:         private Object getImage(Object value) {
241:                 if (value == null) {
242:                         return null;
243:                 }
244:                 return Activator.getImage((URL) adapterFactoryItemDelegator.getImage(value));
245:         }
246:
247:         /**
248:          * {@inheritDoc}
249:          *
250:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTControlSWTRenderer#createSWTControl(org.eclipse.swt.widgets.Composite)
251:          */
252:         @Override
253:         protected Control createSWTControl(Composite parent) throws DatabindingFailedException {
254:                 final IObservableValue observableValue = getEMFFormsDatabinding()
255:                         .getObservableValue(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
256:                 final EStructuralFeature structuralFeature = (EStructuralFeature) observableValue.getValueType();
257:                 final EObject eObject = (EObject) ((IObserving) observableValue).getObserved();
258:                 observableValue.dispose();
259:
260:                 /* parent composite */
261:                 final Composite composite = new Composite(parent, SWT.NONE);
262:                 composite.setBackground(parent.getBackground());
263:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).spacing(0, 0).applyTo(composite);
264:
265:                 /* label composite */
266:                 labelComposite = new Composite(composite, SWT.NONE);
267:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(labelComposite);
268:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(labelComposite);
269:                 labelComposite.setBackground(composite.getBackground());
270:
271:                 /* image */
272:                 imageLabel = new Label(labelComposite, SWT.NONE);
273:                 imageLabel.setBackground(labelComposite.getBackground());
274:                 GridDataFactory.fillDefaults().grab(false, false).align(SWT.FILL, SWT.BEGINNING).hint(20, 20)
275:                         .applyTo(imageLabel);
276:
277:                 /* text */
278:                 label = new Label(labelComposite, SWT.NONE);
279:                 label.setBackground(labelComposite.getBackground());
280:                 GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.BEGINNING).applyTo(label);
281:
282:                 /* button bar */
283:                 final Composite buttonComposite = new Composite(composite, SWT.NONE);
284:                 GridDataFactory.fillDefaults().grab(false, false).align(SWT.FILL, SWT.BEGINNING).applyTo(buttonComposite);
285:                 GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).spacing(2, 0).applyTo(buttonComposite);
286:
287:                 /* delete button */
288:                 final Button deleteButton = createButtonForAction(new DeleteReferenceAction(getEditingDomain(eObject), eObject,
289:                         structuralFeature, null), buttonComposite);
290:                 deleteButton.addSelectionListener(new SelectionListener() {
291:                         @Override
292:                         public void widgetSelected(SelectionEvent e) {
293:                                 final Command setCommand = SetCommand.create(getEditingDomain(eObject), eObject, structuralFeature,
294:                                         null);
295:                                 getEditingDomain(eObject).getCommandStack().execute(setCommand);
296:                         }
297:
298:                         @Override
299:                         public void widgetDefaultSelected(SelectionEvent e) {
300:                         }
301:                 });
302:
303:                 /* create button */
304:                 final Button createButton = createButtonForAction(new NewReferenceAction(getEditingDomain(eObject), eObject,
305:                         structuralFeature, emfFormsEditSupport, getEMFFormsLabelProvider(), null, getReportService(), getVElement()
306:                                 .getDomainModelReference(),
307:                         getViewModelContext().getDomainModel()), buttonComposite);
308:                 createButton.addSelectionListener(new CreateNewElementHandler(eObject, structuralFeature));
309:
310:                 /* init */
311:                 composedAdapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
312:                         new ReflectiveItemProviderAdapterFactory(),
313:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
314:                 adapterFactoryItemDelegator = new AdapterFactoryItemDelegator(composedAdapterFactory);
315:
316:                 return composite;
317:         }
318:
319:         private Button createButtonForAction(final Action action, final Composite composite) {
320:                 final Button selectButton = new Button(composite, SWT.PUSH);
321:                 selectButton.setImage(Activator.getImage(action));
322:                 selectButton.setEnabled(true);
323:                 selectButton.setToolTipText(action.getToolTipText());
324:                 return selectButton;
325:         }
326:
327:         /**
328:          * {@inheritDoc}
329:          *
330:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#dispose()
331:          */
332:         @Override
333:         protected void dispose() {
334:                 composedAdapterFactory.dispose();
335:                 composedAdapterFactory = null;
336:                 adapterFactoryItemDelegator = null;
337:                 if (modelElementChangeListener != null) {
338:                         modelElementChangeListener.remove();
339:                 }
340:                 super.dispose();
341:         }
342:
343:         /**
344:          * {@inheritDoc}
345:          *
346:          * @see org.eclipse.emf.ecp.view.spi.core.swt.SimpleControlSWTRenderer#getUnsetText()
347:          */
348:         @Override
349:         protected String getUnsetText() {
350:                 return ""; //$NON-NLS-1$
351:         }
352:
353: }