Skip to content

Package: EMFFormsSpreadsheetControlRenderer

EMFFormsSpreadsheetControlRenderer

nameinstructionbranchcomplexitylinemethod
EMFFormsSpreadsheetControlRenderer(EMFFormsDatabindingEMF, EMFFormsLabelProvider, ReportService, VTViewTemplateProvider, EMFFormsIdProvider, EMFFormsSpreadsheetValueConverterRegistry, EMFFormsSpreadsheetFormatDescriptionProvider, EMFFormsDomainExpander)
M: 0 C: 27
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
createComment(Workbook, Sheet, VDomainModelReference, int, int)
M: 0 C: 44
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 12
100%
M: 0 C: 1
100%
expandDMR(VDomainModelReference, EObject)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
getDefaultStyle()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getMandatoryStyle(VElement, ViewModelContext)
M: 14 C: 19
58%
M: 4 C: 2
33%
M: 3 C: 1
25%
M: 3 C: 5
63%
M: 0 C: 1
100%
getSerializedDMR(VDomainModelReference)
M: 0 C: 35
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
render(Workbook, VControl, ViewModelContext, EMFFormsSpreadsheetRenderTarget)
M: 41 C: 173
81%
M: 0 C: 14
100%
M: 0 C: 8
100%
M: 9 C: 47
84%
M: 0 C: 1
100%
setupSheetFormat(Sheet)
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
writeDescription(ViewModelContext, Cell, VDomainModelReference)
M: 0 C: 30
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
writeFormatInformation(Cell, EStructuralFeature)
M: 0 C: 14
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 5
100%
M: 0 C: 1
100%
writeLabel(VControl, ViewModelContext, Cell, EMFFormsExportTableParent, VDomainModelReference, EStructuralFeature)
M: 0 C: 71
100%
M: 1 C: 7
88%
M: 1 C: 4
80%
M: 0 C: 16
100%
M: 0 C: 1
100%
writeValue(ViewModelContext, EMFFormsSpreadsheetRenderTarget, Sheet, VDomainModelReference)
M: 10 C: 80
89%
M: 2 C: 8
80%
M: 2 C: 4
67%
M: 2 C: 17
89%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2015 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: * Eugen Neufeld - initial API and implementation
13: * Johannes Faltermeier - template pattern for extenders
14: ******************************************************************************/
15: package org.eclipse.emfforms.internal.spreadsheet.core.renderer;
16:
17: import java.io.IOException;
18: import java.io.StringWriter;
19: import java.util.Set;
20:
21: import org.apache.poi.ss.usermodel.Cell;
22: import org.apache.poi.ss.usermodel.CellStyle;
23: import org.apache.poi.ss.usermodel.ClientAnchor;
24: import org.apache.poi.ss.usermodel.Comment;
25: import org.apache.poi.ss.usermodel.CreationHelper;
26: import org.apache.poi.ss.usermodel.Drawing;
27: import org.apache.poi.ss.usermodel.Row;
28: import org.apache.poi.ss.usermodel.Sheet;
29: import org.apache.poi.ss.usermodel.Workbook;
30: import org.eclipse.core.databinding.observable.value.IObservableValue;
31: import org.eclipse.emf.common.util.URI;
32: import org.eclipse.emf.ecore.EObject;
33: import org.eclipse.emf.ecore.EStructuralFeature;
34: import org.eclipse.emf.ecore.EStructuralFeature.Setting;
35: import org.eclipse.emf.ecore.resource.Resource;
36: import org.eclipse.emf.ecore.resource.ResourceSet;
37: import org.eclipse.emf.ecore.resource.URIConverter.WriteableOutputStream;
38: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
39: import org.eclipse.emf.ecore.util.EcoreUtil;
40: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
41: import org.eclipse.emf.ecp.view.spi.indexdmr.model.VIndexDomainModelReference;
42: import org.eclipse.emf.ecp.view.spi.model.VControl;
43: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
44: import org.eclipse.emf.ecp.view.spi.model.VElement;
45: import org.eclipse.emf.ecp.view.spi.model.VView;
46: import org.eclipse.emf.ecp.view.template.model.VTStyleProperty;
47: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
48: import org.eclipse.emf.ecp.view.template.style.mandatory.model.VTMandatoryFactory;
49: import org.eclipse.emf.ecp.view.template.style.mandatory.model.VTMandatoryStyleProperty;
50: import org.eclipse.emfforms.spi.common.report.ReportService;
51: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
52: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
53: import org.eclipse.emfforms.spi.core.services.domainexpander.EMFFormsDomainExpander;
54: import org.eclipse.emfforms.spi.core.services.domainexpander.EMFFormsExpandingFailedException;
55: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
56: import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
57: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsAbstractSpreadsheetRenderer;
58: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsExportTableParent;
59: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsIdProvider;
60: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetFormatDescriptionProvider;
61: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetRenderTarget;
62: import org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetReport;
63: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsCellStyleConstants;
64: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsConverterException;
65: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverter;
66: import org.eclipse.emfforms.spi.spreadsheet.core.converter.EMFFormsSpreadsheetValueConverterRegistry;
67:
68: /**
69: * Spreadsheet renderer for {@link VControl}.
70: *
71: * @author Eugen Neufeld
72: * @author Johannes Faltermeier
73: */
74: public class EMFFormsSpreadsheetControlRenderer extends EMFFormsAbstractSpreadsheetRenderer<VControl> {
75:
76:         private final EMFFormsDatabindingEMF emfformsDatabinding;
77:         private final EMFFormsLabelProvider emfformsLabelProvider;
78:         private final ReportService reportService;
79:         private final VTViewTemplateProvider vtViewTemplateProvider;
80:         private final EMFFormsIdProvider idProvider;
81:         private final EMFFormsSpreadsheetValueConverterRegistry converterRegistry;
82:         private final EMFFormsSpreadsheetFormatDescriptionProvider formatDescriptionProvider;
83:         private final EMFFormsDomainExpander domainExpander;
84:
85:         /**
86:          * Default constructor.
87:          *
88:          * @param emfformsDatabinding The EMFFormsDatabinding to use
89:          * @param emfformsLabelProvider The EMFFormsLabelProvider to use
90:          * @param reportService The {@link ReportService}
91:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
92:          * @param idProvider The {@link EMFFormsIdProvider}
93:          * @param converterRegistry The {@link EMFFormsSpreadsheetValueConverterRegistry}
94:          * @param formatDescriptionProvider The {@link EMFFormsSpreadsheetFormatDescriptionProvider}
95:          * @param domainExpander The {@link EMFFormsDomainExpander}
96:          */
97:         // BEGIN COMPLEX CODE
98:         public EMFFormsSpreadsheetControlRenderer(
99:                 EMFFormsDatabindingEMF emfformsDatabinding,
100:                 EMFFormsLabelProvider emfformsLabelProvider,
101:                 ReportService reportService,
102:                 VTViewTemplateProvider vtViewTemplateProvider,
103:                 EMFFormsIdProvider idProvider,
104:                 EMFFormsSpreadsheetValueConverterRegistry converterRegistry,
105:                 EMFFormsSpreadsheetFormatDescriptionProvider formatDescriptionProvider,
106:                 EMFFormsDomainExpander domainExpander) {
107:                 this.emfformsDatabinding = emfformsDatabinding;
108:                 this.emfformsLabelProvider = emfformsLabelProvider;
109:                 this.reportService = reportService;
110:                 this.vtViewTemplateProvider = vtViewTemplateProvider;
111:                 this.idProvider = idProvider;
112:                 this.converterRegistry = converterRegistry;
113:                 this.formatDescriptionProvider = formatDescriptionProvider;
114:                 this.domainExpander = domainExpander;
115:         }
116:
117:         // END COMPLEX CODE
118:         /**
119:          * {@inheritDoc}
120:          *
121:          * @see org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsAbstractSpreadsheetRenderer#render(org.apache.poi.ss.usermodel.Workbook,
122:          * org.eclipse.emf.ecp.view.spi.model.VElement, org.eclipse.emf.ecp.view.spi.context.ViewModelContext,
123:          * org.eclipse.emfforms.spi.spreadsheet.core.EMFFormsSpreadsheetRenderTarget)
124:          */
125:         @Override
126:         public int render(Workbook workbook, VControl vElement,
127:                 ViewModelContext viewModelContext, EMFFormsSpreadsheetRenderTarget renderTarget) {
128:                 Sheet sheet = workbook.getSheet(renderTarget.getSheetName());
129:•                if (sheet == null) {
130:                         sheet = workbook.createSheet(renderTarget.getSheetName());
131:                         setupSheetFormat(sheet);
132:                 }
133:                 Row labelRow = sheet.getRow(0);
134:•                if (labelRow == null) {
135:                         labelRow = sheet.createRow(0);
136:                 }
137:                 Row descriptionRow = sheet.getRow(1);
138:•                if (descriptionRow == null) {
139:                         descriptionRow = sheet.createRow(1);
140:                 }
141:                 Row formatRow = sheet.getRow(2);
142:•                if (formatRow == null) {
143:                         formatRow = sheet.createRow(2);
144:                 }
145:
146:                 final CellStyle readOnly = (CellStyle) viewModelContext.getContextValue(EMFFormsCellStyleConstants.LOCKED);
147:                 final CellStyle readOnlyWrap = (CellStyle) viewModelContext
148:                         .getContextValue(EMFFormsCellStyleConstants.LOCKED_AND_WRAPPED);
149:
150:                 final Cell idCell = labelRow.getCell(0, Row.CREATE_NULL_AS_BLANK);
151:                 idCell.setCellValue(EMFFormsIdProvider.ID_COLUMN);
152:                 idCell.setCellStyle(readOnly);
153:
154:                 final Cell labelCell = labelRow.getCell(renderTarget.getColumn() + 1,
155:                         Row.CREATE_NULL_AS_BLANK);
156:                 labelCell.setCellStyle(readOnlyWrap);
157:
158:                 final Cell descriptionCell = descriptionRow.getCell(renderTarget.getColumn() + 1,
159:                         Row.CREATE_NULL_AS_BLANK);
160:                 descriptionCell.setCellStyle(readOnlyWrap);
161:
162:                 final Cell formatCell = formatRow.getCell(renderTarget.getColumn() + 1,
163:                         Row.CREATE_NULL_AS_BLANK);
164:                 formatCell.setCellStyle(readOnlyWrap);
165:
166:                 try {
167:                         final EMFFormsExportTableParent exportTableParent = (EMFFormsExportTableParent) viewModelContext
168:                                 .getContextValue(EMFFormsExportTableParent.EXPORT_TABLE_PARENT);
169:                         VDomainModelReference dmrToResolve = EcoreUtil.copy(vElement.getDomainModelReference());
170:•                        if (exportTableParent != null) {
171:                                 final VIndexDomainModelReference indexDMR = exportTableParent.getIndexDMRToExtend();
172:                                 indexDMR.setTargetDMR(dmrToResolve);
173:
174:                                 dmrToResolve = exportTableParent.getIndexDMRToResolve();
175:                         }
176:
177:•                        if (labelCell.getCellComment() == null) {
178:                                 final EStructuralFeature structuralFeature = emfformsDatabinding.getValueProperty(
179:                                         dmrToResolve, viewModelContext.getDomainModel()).getStructuralFeature();
180:
181:                                 writeLabel(vElement, viewModelContext, labelCell, exportTableParent, dmrToResolve, structuralFeature);
182:
183:                                 final Comment comment = createComment(workbook, sheet, dmrToResolve,
184:                                         renderTarget.getRow(), renderTarget.getColumn() + 1);
185:                                 labelCell.setCellComment(comment);
186:
187:                                 writeDescription(viewModelContext, descriptionCell, dmrToResolve);
188:
189:                                 writeFormatInformation(formatCell, structuralFeature);
190:                         }
191:•                        if (viewModelContext.getDomainModel() != null) {
192:                                 writeValue(viewModelContext, renderTarget, sheet, dmrToResolve);
193:                         }
194:
195:                         return 1;
196:                 } catch (final DatabindingFailedException ex) {
197:                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
198:                 } catch (final NoLabelFoundException ex) {
199:                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
200:                 } catch (final IOException ex) {
201:                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
202:                 } catch (final EMFFormsConverterException ex) {
203:                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
204:                 }
205:
206:                 return 0;
207:         }
208:
209:         private void writeValue(ViewModelContext viewModelContext, EMFFormsSpreadsheetRenderTarget renderTarget,
210:                 Sheet sheet, VDomainModelReference dmrToResolve) throws DatabindingFailedException, EMFFormsConverterException {
211:                 Row valueRow = sheet.getRow(renderTarget.getRow() + 3);
212:•                if (valueRow == null) {
213:                         valueRow = sheet.createRow(renderTarget.getRow() + 3);
214:                 }
215:                 valueRow.getCell(0, Row.CREATE_NULL_AS_BLANK)
216:                         .setCellValue(idProvider.getId(viewModelContext.getDomainModel()));
217:
218:                 try {
219:                         expandDMR(dmrToResolve, viewModelContext.getDomainModel());
220:                 } catch (final EMFFormsExpandingFailedException ex) {
221:                         reportService.report(new EMFFormsSpreadsheetReport(ex, EMFFormsSpreadsheetReport.ERROR));
222:                         return;
223:                 }
224:                 final Setting setting = emfformsDatabinding.getSetting(dmrToResolve, viewModelContext.getDomainModel());
225:
226:                 /* only create new cells for non-unsettable features and unsettable feature which are set */
227:                 /*
228:                  * if the eObject is null, this means that the dmr could not be resolved correctly. in this case we want
229:                  * to create an empty cell
230:                  */
231:•                if (setting.getEObject() == null || !setting.getEStructuralFeature().isUnsettable()
232:•                        || setting.getEStructuralFeature().isUnsettable() && setting.isSet()) {
233:                         final Object value = setting.get(true);
234:                         final EMFFormsSpreadsheetValueConverter converter = converterRegistry
235:                                 .getConverter(viewModelContext.getDomainModel(), dmrToResolve);
236:
237:                         final Cell valueCell = valueRow.getCell(renderTarget.getColumn() + 1,
238:                                 Row.CREATE_NULL_AS_BLANK);
239:                         converter.setCellValue(valueCell, value, setting.getEStructuralFeature(), viewModelContext);
240:
241:                 }
242:         }
243:
244:         private void expandDMR(VDomainModelReference dmrToResolve, EObject domainModel)
245:                 throws EMFFormsExpandingFailedException {
246:                 domainExpander.prepareDomainObject(dmrToResolve, domainModel);
247:         }
248:
249:         private void writeLabel(VControl vControl, ViewModelContext viewModelContext, final Cell labelCell,
250:                 final EMFFormsExportTableParent exportTableParent, VDomainModelReference dmrToResolve,
251:                 final EStructuralFeature structuralFeature) throws NoLabelFoundException {
252:                 IObservableValue displayName;
253:•                if (viewModelContext.getDomainModel() != null) {
254:                         displayName = emfformsLabelProvider.getDisplayName(dmrToResolve, viewModelContext.getDomainModel());
255:                 } else {
256:                         final VView view = (VView) viewModelContext.getViewModel();
257:                         displayName = emfformsLabelProvider.getDisplayName(dmrToResolve, view.getRootEClass());
258:                 }
259:                 String labelValue = displayName.getValue().toString();
260:•                if (exportTableParent != null) {
261:                         labelValue = exportTableParent.getLabelPrefix() + "_" + labelValue; //$NON-NLS-1$
262:                 }
263:
264:                 String extra = ""; //$NON-NLS-1$
265:                 final VTMandatoryStyleProperty mandatoryStyle = getMandatoryStyle(vControl, viewModelContext);
266:•                if (mandatoryStyle.isHighliteMandatoryFields() && structuralFeature.getLowerBound() > 0) {
267:                         extra = mandatoryStyle.getMandatoryMarker();
268:                 }
269:                 labelValue = labelValue + extra;
270:
271:                 labelCell.setCellValue(labelValue);
272:                 displayName.dispose();
273:         }
274:
275:         private void writeDescription(ViewModelContext viewModelContext, final Cell descriptionCell,
276:                 VDomainModelReference dmrToResolve) throws NoLabelFoundException {
277:                 IObservableValue description;
278:•                if (viewModelContext.getDomainModel() != null) {
279:                         description = emfformsLabelProvider.getDescription(dmrToResolve, viewModelContext.getDomainModel());
280:                 } else {
281:                         final VView view = (VView) viewModelContext.getViewModel();
282:                         description = emfformsLabelProvider.getDescription(dmrToResolve, view.getRootEClass());
283:                 }
284:                 descriptionCell.setCellValue(description.getValue().toString());
285:                 description.dispose();
286:         }
287:
288:         private void writeFormatInformation(final Cell formatCell, final EStructuralFeature structuralFeature) {
289:                 String format = ""; //$NON-NLS-1$
290:•                if (formatDescriptionProvider != null) {
291:                         format = formatDescriptionProvider.getFormatDescription(structuralFeature);
292:                 }
293:                 formatCell.setCellValue(format);
294:         }
295:
296:         private static void setupSheetFormat(final Sheet sheet) {
297:                 sheet.setDefaultColumnWidth(30);
298:                 // do not scroll the first column (id) and the three top rows (label+info)
299:                 sheet.createFreezePane(1, 3);
300:         }
301:
302:         private VTMandatoryStyleProperty getMandatoryStyle(VElement vElement, ViewModelContext viewModelContext) {
303:•                if (vtViewTemplateProvider == null) {
304:                         return getDefaultStyle();
305:                 }
306:                 final Set<VTStyleProperty> styleProperties = vtViewTemplateProvider
307:                         .getStyleProperties(vElement, viewModelContext);
308:•                for (final VTStyleProperty styleProperty : styleProperties) {
309:•                        if (VTMandatoryStyleProperty.class.isInstance(styleProperty)) {
310:                                 return (VTMandatoryStyleProperty) styleProperty;
311:                         }
312:                 }
313:                 return getDefaultStyle();
314:         }
315:
316:         private VTMandatoryStyleProperty getDefaultStyle() {
317:                 return VTMandatoryFactory.eINSTANCE.createMandatoryStyleProperty();
318:         }
319:
320:         private Comment createComment(Workbook workbook, Sheet sheet, VDomainModelReference domainModelReference, int row,
321:                 int column) throws IOException {
322:                 final CreationHelper factory = workbook.getCreationHelper();
323:
324:                 // When the comment box is visible, have it show in a 1x3 space
325:                 final ClientAnchor anchor = factory.createClientAnchor();
326:                 anchor.setCol1(column);
327:                 anchor.setCol2(column + 1);
328:                 anchor.setRow1(row);
329:                 anchor.setRow2(row + 1);
330:
331:                 final Drawing drawing = sheet.createDrawingPatriarch();
332:                 final Comment comment = drawing.createCellComment(anchor);
333:
334:                 comment.setAuthor("EMFForms Spreadsheet Renderer"); //$NON-NLS-1$
335:                 comment.setVisible(false);
336:                 comment.setString(factory.createRichTextString(getSerializedDMR(domainModelReference)));
337:                 return comment;
338:         }
339:
340:         private String getSerializedDMR(VDomainModelReference domainModelReference) throws IOException {
341:                 final ResourceSet rs = new ResourceSetImpl();
342:                 final Resource resource = rs.createResource(URI.createURI("VIRTAUAL_URI")); //$NON-NLS-1$
343:                 resource.getContents().add(EcoreUtil.copy(domainModelReference));
344:                 final StringWriter sw = new StringWriter();
345:                 final WriteableOutputStream os = new WriteableOutputStream(sw, "UTF-8"); //$NON-NLS-1$
346:                 resource.save(os, null);
347:                 final String value = sw.getBuffer().toString();
348:                 return value;
349:         }
350:
351: }