Skip to content

Package: RAPGridControlSWTRenderer

RAPGridControlSWTRenderer

nameinstructionbranchcomplexitylinemethod
RAPGridControlSWTRenderer(VTableControl, ViewModelContext, ReportService, EMFFormsDatabindingEMF, EMFFormsLabelProvider, VTViewTemplateProvider, ImageRegistryService, EMFFormsEditSupport, EStructuralFeatureValueConverterService, EMFFormsLocalizationService)
M: 18 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
computeRequiredHeight(Integer)
M: 55 C: 0
0%
M: 12 C: 0
0%
M: 7 C: 0
0%
M: 15 C: 0
0%
M: 1 C: 0
0%
createTableViewerSWTBuilder(Composite, IObservableList, IObservableValue, IObservableValue, TableViewerCompositeBuilder, ObservableListContentProvider, TableControlSWTRenderer.ECPTableViewerComparator, TableActionBar)
M: 22 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 8 C: 0
0%
M: 1 C: 0
0%
getColumns()
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%
getConverterService()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getHorizontalBar()
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%
getLocalizationService()
M: 3 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 1 C: 0
0%
M: 1 C: 0
0%
getSelectionIndex()
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%
getTableViewerCreator()
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%
getVerticalBar()
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-2019 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: * lucas - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emf.ecp.view.spi.table.nebula.grid.rap;
15:
16: import java.util.Arrays;
17:
18: import javax.inject.Inject;
19:
20: import org.eclipse.core.databinding.observable.list.IObservableList;
21: import org.eclipse.core.databinding.observable.value.IObservableValue;
22: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
23: import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
24: import org.eclipse.emf.ecp.view.spi.table.swt.TableControlSWTRenderer;
25: import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
26: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
27: import org.eclipse.emf.ecp.view.template.style.background.model.VTBackgroundStyleProperty;
28: import org.eclipse.emf.ecp.view.template.style.fontProperties.model.VTFontPropertiesStyleProperty;
29: import org.eclipse.emfforms.spi.common.converter.EStructuralFeatureValueConverterService;
30: import org.eclipse.emfforms.spi.common.report.ReportService;
31: import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
32: import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
33: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
34: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
35: import org.eclipse.emfforms.spi.swt.table.TableControl;
36: import org.eclipse.emfforms.spi.swt.table.TableViewerCompositeBuilder;
37: import org.eclipse.emfforms.spi.swt.table.TableViewerCreator;
38: import org.eclipse.emfforms.spi.swt.table.TableViewerSWTBuilder;
39: import org.eclipse.emfforms.spi.swt.table.action.TableActionBar;
40: import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
41: import org.eclipse.jface.viewers.AbstractTableViewer;
42: import org.eclipse.jface.viewers.ColumnViewerEditor;
43: import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
44: import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
45: import org.eclipse.jface.viewers.ViewerRow;
46: import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
47: import org.eclipse.nebula.jface.gridviewer.GridViewerEditor;
48: import org.eclipse.swt.SWT;
49: import org.eclipse.swt.widgets.Composite;
50: import org.eclipse.swt.widgets.Item;
51: import org.eclipse.swt.widgets.ScrollBar;
52: import org.eclipse.swt.widgets.Widget;
53:
54: /**
55: * @author Lucas Koehler
56: * @since 1.17
57: *
58: */
59: public class RAPGridControlSWTRenderer extends TableControlSWTRenderer {
60:
61:         private final EStructuralFeatureValueConverterService converterService;
62:         private final EMFFormsLocalizationService localizationService;
63:
64:         /**
65:          * Custom Nebula Grid table viewer to expose getViewerRowFromItem() method.
66:          *
67:          * @author Mat Hansen
68:          *
69:          */
70:         public class CustomGridTableViewer extends GridTableViewer {
71:
72:                 /**
73:                  * Creates a grid viewer on a newly-created grid control under the given
74:                  * parent. The grid control is created using the given SWT style bits. The
75:                  * viewer has no input, no content provider, a default label provider, no
76:                  * sorter, and no filters.
77:                  *
78:                  * @param parent
79:                  * the parent control
80:                  * @param style
81:                  * the SWT style bits used to create the grid.
82:                  */
83:                 public CustomGridTableViewer(Composite parent, int style) {
84:                         super(parent, style);
85:                 }
86:
87:                 // make method public
88:                 @Override
89:                 public ViewerRow getViewerRowFromItem(Widget item) {
90:                         return super.getViewerRowFromItem(item);
91:                 }
92:         }
93:
94:         /**
95:          * Default constructor.
96:          *
97:          * @param vElement the view model element to be rendered
98:          * @param viewContext the view context
99:          * @param emfFormsDatabinding The {@link EMFFormsDatabindingEMF}
100:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
101:          * @param reportService The {@link ReportService}
102:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
103:          * @param imageRegistryService The {@link ImageRegistryService}
104:          * @param emfFormsEditSupport The {@link EMFFormsEditSupport}
105:          * @param converterService the {@link EStructuralFeatureValueConverterService}
106:          * @param localizationService the {@link EMFFormsLocalizationService}
107:          * @since 1.11
108:          */
109:         @Inject
110:         // CHECKSTYLE.OFF: ParameterNumber
111:         public RAPGridControlSWTRenderer(VTableControl vElement, ViewModelContext viewContext, ReportService reportService,
112:                 EMFFormsDatabindingEMF emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
113:                 VTViewTemplateProvider vtViewTemplateProvider, ImageRegistryService imageRegistryService,
114:                 EMFFormsEditSupport emfFormsEditSupport, EStructuralFeatureValueConverterService converterService,
115:                 EMFFormsLocalizationService localizationService) {
116:                 // CHECKSTYLE.ON: ParameterNumber
117:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider,
118:                         imageRegistryService, emfFormsEditSupport, localizationService);
119:                 this.converterService = converterService;
120:                 this.localizationService = localizationService;
121:         }
122:
123:         /**
124:          * {@link TableViewerCreator} for the table control swt renderer. It will create a GridTableViewer with the expected
125:          * custom variant data and the correct style properties as defined in the template model.
126:          *
127:          */
128:         protected class GridTableControlSWTRendererTableViewerCreator implements TableViewerCreator<GridTableViewer> {
129:
130:                 @Override
131:                 public GridTableViewer createTableViewer(Composite parent) {
132:
133:                         final GridTableViewer tableViewer = new CustomGridTableViewer(parent,
134:                                 SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
135:                         tableViewer.getGrid().setData(CUSTOM_VARIANT, TABLE_CUSTOM_VARIANT);
136:                         tableViewer.getGrid().setHeaderVisible(true);
137:                         tableViewer.getGrid().setLinesVisible(true);
138:                         tableViewer.getGrid().setFooterVisible(false);
139:
140:                         /* Set background color */
141:                         final VTBackgroundStyleProperty backgroundStyleProperty = getBackgroundStyleProperty();
142:                         if (backgroundStyleProperty.getColor() != null) {
143:                                 tableViewer.getGrid().setBackground(getSWTColor(backgroundStyleProperty.getColor()));
144:                         }
145:
146:                         /* Set foreground color */
147:                         final VTFontPropertiesStyleProperty fontPropertiesStyleProperty = getFontPropertiesStyleProperty();
148:                         if (fontPropertiesStyleProperty.getColorHEX() != null) {
149:                                 tableViewer.getGrid()
150:                                         .setForeground(getSWTColor(fontPropertiesStyleProperty.getColorHEX()));
151:                         }
152:
153:                         tableViewer.getGrid().setData(FIXED_COLUMNS, new Integer(1));
154:
155:                         /* manage editing support activation */
156:                         createTableViewerEditor(tableViewer);
157:
158:                         return tableViewer;
159:                 }
160:
161:                 /**
162:                  * This method creates and initialises a {@link GridViewerEditor} for the given {@link GridTableViewer}.
163:                  *
164:                  * @param gridTableViewer the table viewer
165:                  */
166:                 protected void createTableViewerEditor(final GridTableViewer gridTableViewer) {
167:                         final ColumnViewerEditorActivationStrategy actSupport = new GridColumnViewerEditorActivationStrategy(
168:                                 gridTableViewer);
169:                         actSupport.setEnableEditorActivationWithKeyboard(true);
170:                         GridViewerEditor.create(
171:                                 gridTableViewer,
172:                                 actSupport,
173:                                 ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
174:                                         | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
175:                 }
176:         }
177:
178:         @Override
179:         protected TableViewerCreator<GridTableViewer> getTableViewerCreator() {
180:                 return new GridTableControlSWTRendererTableViewerCreator();
181:         }
182:
183:         @Override
184:         // CHECKSTYLE.OFF: ParameterNumber
185:         protected TableViewerSWTBuilder createTableViewerSWTBuilder(Composite parent, IObservableList list,
186:                 IObservableValue labelText, IObservableValue labelTooltipText, TableViewerCompositeBuilder compositeBuilder,
187:                 ObservableListContentProvider cp, ECPTableViewerComparator comparator,
188:                 TableActionBar<? extends AbstractTableViewer> actionBar) {
189:                 // CHECKSTYLE.ON: ParameterNumber
190:                 return GridTableViewerFactory.fillDefaults(parent, SWT.NONE, list, labelText, labelTooltipText)
191:                         .customizeCompositeStructure(compositeBuilder)
192:                         .customizeActionBar(actionBar)
193:                         .customizeTableViewerCreation(getTableViewerCreator())
194:                         .customizeContentProvider(cp)
195:                         .customizeComparator(comparator)
196:                         .showHideColumns(true)
197:                         .columnSubstringFilter(true);
198:
199:         }
200:
201:         @Override
202:         protected int getSelectionIndex() {
203:                 return ((GridTableViewer) getTableViewer()).getGrid().getSelectionIndex();
204:         }
205:
206:         @Override
207:         protected Item[] getColumns() {
208:                 return ((GridTableViewer) getTableViewer()).getGrid().getColumns();
209:         }
210:
211:         @Override
212:         protected ScrollBar getHorizontalBar() {
213:                 return ((GridTableViewer) getTableViewer()).getGrid().getHorizontalBar();
214:         }
215:
216:         @Override
217:         protected ScrollBar getVerticalBar() {
218:                 return ((GridTableViewer) getTableViewer()).getGrid().getVerticalBar();
219:         }
220:
221:         @Override
222:         protected int computeRequiredHeight(Integer visibleLines) {
223:•                if (getTableViewer() == null || getTableViewerComposite() == null) {
224:                         return SWT.DEFAULT;
225:                 }
226:                 final TableControl table = getTableViewerComposite().getTableControl();
227:•                if (table == null) {
228:                         return SWT.DEFAULT;
229:                 }
230:•                if (table.isDisposed()) {
231:                         return SWT.DEFAULT;
232:                 }
233:                 final int itemHeight = table.getItemHeight() + 1;
234:                 // show one empty row if table does not contain any items or visibleLines < 1
235:                 int itemCount;
236:•                if (visibleLines != null) {
237:                         itemCount = Math.max(visibleLines, 1);
238:                 } else {
239:                         itemCount = Math.max(table.getItemCount(), 1);
240:                 }
241:•                final int headerHeight = table.getHeaderVisible() ? table.getHeaderHeight() : 0;
242:
243:                 final int tableHeight = itemHeight * itemCount + headerHeight;
244:                 return tableHeight;
245:         }
246:
247:         /**
248:          *
249:          * @return the {@link EStructuralFeatureValueConverterService}
250:          */
251:         protected EStructuralFeatureValueConverterService getConverterService() {
252:                 return converterService;
253:         }
254:
255:         /**
256:          *
257:          * @return the {@link EMFFormsLocalizationService}
258:          */
259:         protected EMFFormsLocalizationService getLocalizationService() {
260:                 return localizationService;
261:         }
262:
263:         /**
264:          * EditorActivationStrategy for GridColumns.
265:          *
266:          * @author Stefan Dirix
267:          */
268:         private class GridColumnViewerEditorActivationStrategy extends ColumnViewerEditorActivationStrategy {
269:
270:                 private final GridTableViewer gridTableViewer;
271:
272:                 /**
273:                  * Constructor.
274:                  *
275:                  * @param viewer the {@link GridTableViewer}.
276:                  */
277:                 GridColumnViewerEditorActivationStrategy(GridTableViewer gridTableViewer) {
278:                         super(gridTableViewer);
279:                         this.gridTableViewer = gridTableViewer;
280:                 }
281:
282:                 @Override
283:                 protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
284:                         if (event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
285:                                 || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
286:                                 || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC) {
287:                                 return true;
288:                         }
289:                         if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
290:                                 && gridTableViewer.isCellEditorActive()) {
291:                                 // TODO Does not work in RAP
292:                                 // gridTableViewer.applyEditorValue();
293:                         }
294:                         if (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED) {
295:                                 for (final int keyCode : Arrays.asList(SWT.CTRL, SWT.ALT, SWT.SHIFT)) {
296:                                         if ((event.keyCode & keyCode) != 0 || (event.stateMask & keyCode) != 0) {
297:                                                 return false;
298:                                         }
299:                                 }
300:                                 return !isDoNotEnterEditorCode(event.keyCode);
301:                         }
302:                         return false;
303:                 }
304:
305:                 private boolean isDoNotEnterEditorCode(int keyCode) {
306:                         // BEGIN COMPLEX CODE
307:                         return keyCode == SWT.ARROW_UP || keyCode == SWT.ARROW_DOWN
308:                                 || keyCode == SWT.ARROW_LEFT || keyCode == SWT.ARROW_RIGHT
309:                                 || keyCode == SWT.TAB || keyCode == SWT.DEL;
310:                         // END COMPLEX CODE
311:                 }
312:         }
313:
314: }