Skip to content

Package: EmbeddedGroupSWTRenderer

EmbeddedGroupSWTRenderer

nameinstructionbranchcomplexitylinemethod
EmbeddedGroupSWTRenderer(VGroup, ViewModelContext, ReportService, EMFFormsRendererFactory)
M: 14 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
bindValue(Control)
M: 20 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 6 C: 0
0%
M: 1 C: 0
0%
createHeadingControl(Composite)
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
dispose()
M: 9 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
getGridDescription(SWTGridDescription)
M: 264 C: 0
0%
M: 14 C: 0
0%
M: 8 C: 0
0%
M: 51 C: 0
0%
M: 1 C: 0
0%
renderControl(SWTGridCell, Composite)
M: 51 C: 0
0%
M: 9 C: 0
0%
M: 6 C: 0
0%
M: 12 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /**
2: * Copyright (c) 2011-2016 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: * EclipseSource Munich - initial API and implementation
13: */
14: package org.eclipse.emf.ecp.view.alignmentgroup.internal.swt;
15:
16: import java.util.ArrayList;
17: import java.util.Collection;
18: import java.util.LinkedHashMap;
19: import java.util.List;
20: import java.util.Map;
21:
22: import javax.inject.Inject;
23:
24: import org.eclipse.core.databinding.observable.value.IObservableValue;
25: import org.eclipse.core.runtime.IStatus;
26: import org.eclipse.core.runtime.Status;
27: import org.eclipse.emf.databinding.EMFDataBindingContext;
28: import org.eclipse.emf.databinding.edit.EMFEditObservables;
29: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
30: import org.eclipse.emf.ecp.view.spi.group.model.VGroup;
31: import org.eclipse.emf.ecp.view.spi.model.VContainedElement;
32: import org.eclipse.emf.ecp.view.spi.model.VElement;
33: import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
34: import org.eclipse.emf.ecp.view.spi.model.reporting.StatusReport;
35: import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
36: import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
37: import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
38: import org.eclipse.emfforms.spi.common.report.ReportService;
39: import org.eclipse.emfforms.spi.swt.core.AbstractAdditionalSWTRenderer;
40: import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
41: import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
42: import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
43: import org.eclipse.emfforms.spi.swt.core.layout.GridDescriptionFactory;
44: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
45: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
46: import org.eclipse.jface.databinding.swt.ISWTObservableValue;
47: import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
48: import org.eclipse.swt.SWT;
49: import org.eclipse.swt.widgets.Composite;
50: import org.eclipse.swt.widgets.Control;
51: import org.eclipse.swt.widgets.Label;
52:
53: /**
54: * A Group renderer, which doesn't enforce its own layout.
55: *
56: * @author Eugen Neufeld
57: *
58: */
59: public class EmbeddedGroupSWTRenderer extends AbstractSWTRenderer<VGroup> {
60:
61:         private final EMFFormsRendererFactory rendererFactory;
62:         private final EMFDataBindingContext dbc;
63:
64:         /**
65:          * Default Constructor.
66:          *
67:          * @param vElement the view element to be rendered
68:          * @param viewContext The view model context
69:          * @param reportService the ReportService to use
70:          * @param rendererFactory the EMFFormsRendererFactory to use
71:          */
72:         @Inject
73:         public EmbeddedGroupSWTRenderer(final VGroup vElement, final ViewModelContext viewContext,
74:                 ReportService reportService, EMFFormsRendererFactory rendererFactory) {
75:                 super(vElement, viewContext, reportService);
76:                 this.rendererFactory = rendererFactory;
77:                 dbc = new EMFDataBindingContext();
78:         }
79:
80:         private SWTGridDescription currentGridDescription;
81:
82:         @Override
83:         public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) {
84:                 currentGridDescription = new SWTGridDescription();
85:                 final List<SWTGridCell> grid = new ArrayList<SWTGridCell>();
86:                 currentGridDescription.setRows(getVElement().getChildren().size() + 1);
87:                 currentGridDescription.setGrid(grid);
88:
89:                 int row = 1;
90:                 final Map<Integer, List<SWTGridCell>> gridCellsPerRow = new LinkedHashMap<Integer, List<SWTGridCell>>();
91:•                for (final VContainedElement containedElement : getVElement().getChildren()) {
92:                         gridCellsPerRow.put(row, new ArrayList<SWTGridCell>());
93:                         AbstractSWTRenderer<VElement> renderer;
94:                         try {
95:                                 renderer = rendererFactory.getRendererInstance(containedElement,
96:                                         getViewModelContext());
97:                         } catch (final EMFFormsNoRendererException ex) {
98:                                 getReportService().report(
99:                                         new StatusReport(
100:                                                 new Status(IStatus.INFO, "org.eclipse.emf.ecp.view.group.swt.embedded", String.format( //$NON-NLS-1$
101:                                                         "No Renderer for %s found.", containedElement.eClass().getName()), ex))); //$NON-NLS-1$
102:                                 continue;
103:                         }
104:                         final Collection<AbstractAdditionalSWTRenderer<VElement>> additionalRenderers = rendererFactory
105:                                 .getAdditionalRendererInstances(containedElement, getViewModelContext());
106:                         SWTGridDescription rendererGridDescription = renderer.getGridDescription(GridDescriptionFactory.INSTANCE
107:                                 .createEmptyGridDescription());
108:•                        for (final AbstractAdditionalSWTRenderer<VElement> additionalRenderer : additionalRenderers) {
109:                                 rendererGridDescription = additionalRenderer.getGridDescription(rendererGridDescription);
110:                         }
111:•                        if (currentGridDescription.getColumns() < rendererGridDescription.getColumns()) {
112:                                 currentGridDescription.setColumns(rendererGridDescription.getColumns());
113:                         }
114:•                        for (final SWTGridCell rendererGridCell : rendererGridDescription.getGrid()) {
115:                                 final SWTGridCell gc = new SWTGridCell(row, rendererGridCell.getColumn(),
116:                                         rendererGridCell.getRenderer());
117:                                 gc.setHorizontalAlignment(rendererGridCell.getHorizontalAlignment());
118:                                 gc.setHorizontalFill(rendererGridCell.isHorizontalFill());
119:                                 gc.setHorizontalGrab(rendererGridCell.isHorizontalGrab());
120:                                 gc.setHorizontalSpan(rendererGridCell.getHorizontalSpan());
121:                                 gc.setVerticalAlignment(rendererGridCell.getVerticalAlignment());
122:                                 gc.setVerticalFill(rendererGridCell.isVerticalFill());
123:                                 gc.setVerticalGrab(rendererGridCell.isVerticalGrab());
124:                                 gc.setPreferredSize(rendererGridCell.getPreferredSize());
125:
126:                                 currentGridDescription.getGrid().add(gc);
127:                                 gridCellsPerRow.get(row).add(gc);
128:                         }
129:                         row++;
130:                 }
131:•                for (int i = 0; i < currentGridDescription.getColumns(); i++) {
132:                         final SWTGridCell gridCell = new SWTGridCell(0, i, this);
133:                         gridCell.setVerticalGrab(false);
134:                         gridCell.setVerticalFill(false);
135:                         gridCell.setHorizontalFill(false);
136:                         gridCell.setHorizontalGrab(false);
137:                         grid.add(i, gridCell); // label;
138:                 }
139:
140:•                for (final Integer gdRow : gridCellsPerRow.keySet()) {
141:                         final List<SWTGridCell> rowGridCells = gridCellsPerRow.get(gdRow);
142:•                        if (currentGridDescription.getColumns() > rowGridCells.size()) {
143:                                 // span last cell -> x columns - #cells + 1 as the current cell already was subtracted
144:                                 rowGridCells.get(rowGridCells.size() - 1).setHorizontalSpan(
145:                                         currentGridDescription.getColumns() - rowGridCells.size() + 1);
146:                         }
147:                 }
148:                 return currentGridDescription;
149:         }
150:
151:         /**
152:          * {@inheritDoc}
153:          *
154:          * @see org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer#renderControl(org.eclipse.emfforms.spi.swt.core.layout.GridCell,
155:          * org.eclipse.swt.widgets.Composite)
156:          */
157:         @Override
158:         protected Control renderControl(SWTGridCell cell, Composite parent) throws NoRendererFoundException,
159:                 NoPropertyDescriptorFoundExeption {
160:•                if (cell.getRenderer().equals(this)) {
161:                         final Control heading = createHeadingControl(parent);
162:
163:•                        switch (getVElement().getLabelAlignment()) {
164:                         case LABEL_ALIGNED:
165:•                                if (cell.getColumn() == 0) {
166:                                         bindValue(heading);
167:                                         heading.setData(CUSTOM_VARIANT, "org_eclipse_emf_ecp_view_group_title"); //$NON-NLS-1$
168:                                 }
169:                                 break;
170:                         case INPUT_ALIGNED:
171:•                                if (cell.getColumn() + 1 == currentGridDescription.getColumns()) {
172:                                         // bindValue(l);
173:                                         heading.setData(CUSTOM_VARIANT, "org_eclipse_emf_ecp_view_group_title"); //$NON-NLS-1$
174:                                 }
175:                                 break;
176:                         default:
177:                                 break;
178:                         }
179:                         return heading;
180:                 }
181:                 return cell.getRenderer().render(cell, parent);
182:         }
183:
184:         /**
185:          * Creates the control, which is used as a heading for the embedded group.
186:          *
187:          * @param parent The parent to render the heading control on
188:          * @return the heading {@link Control}
189:          */
190:         protected Control createHeadingControl(Composite parent) {
191:                 final Label heading = new Label(parent, SWT.NONE);
192:                 heading.setBackground(parent.getBackground());
193:                 return heading;
194:         }
195:
196:         /** Creates a binding that synchronizes the value of the target {@link Label} with the model value. */
197:         private void bindValue(Control target) {
198:                 final ISWTObservableValue targetValue = WidgetProperties.text().observe(target);
199:                 final IObservableValue modelValue = EMFEditObservables.observeValue(
200:                         AdapterFactoryEditingDomain.getEditingDomainFor(getVElement()), getVElement(),
201:                         VViewPackage.eINSTANCE.getElement_Label());
202:                 dbc.bindValue(targetValue, modelValue);
203:         }
204:
205:         @Override
206:         protected void dispose() {
207:•                if (dbc != null) {
208:                         dbc.dispose();
209:                 }
210:                 super.dispose();
211:         }
212: }