Skip to content

Package: GridControlSWTRenderer$CustomGridTableViewer

GridControlSWTRenderer$CustomGridTableViewer

nameinstructionbranchcomplexitylinemethod
GridControlSWTRenderer.CustomGridTableViewer(GridControlSWTRenderer, Composite, int)
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%
getViewerRowFromItem(Widget)
M: 0 C: 4
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-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: * jonas - initial API and implementation
13: * Christian W. Damus - bugs 534829, 530314
14: ******************************************************************************/
15: package org.eclipse.emf.ecp.view.spi.table.nebula.grid;
16:
17: import java.util.ArrayList;
18: import java.util.Arrays;
19: import java.util.LinkedHashMap;
20: import java.util.List;
21: import java.util.Map;
22:
23: import javax.inject.Inject;
24:
25: import org.eclipse.core.databinding.observable.IObserving;
26: import org.eclipse.core.databinding.observable.list.IObservableList;
27: import org.eclipse.core.databinding.observable.value.IObservableValue;
28: import org.eclipse.emf.common.command.Command;
29: import org.eclipse.emf.common.command.CompoundCommand;
30: import org.eclipse.emf.common.util.Diagnostic;
31: import org.eclipse.emf.ecore.EObject;
32: import org.eclipse.emf.ecore.EStructuralFeature;
33: import org.eclipse.emf.ecp.view.internal.table.nebula.grid.GridClearKeyListener;
34: import org.eclipse.emf.ecp.view.internal.table.nebula.grid.GridCopyKeyListener;
35: import org.eclipse.emf.ecp.view.internal.table.nebula.grid.GridCutKeyListener;
36: import org.eclipse.emf.ecp.view.internal.table.nebula.grid.GridPasteKeyListener;
37: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
38: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
39: import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
40: import org.eclipse.emf.ecp.view.spi.table.swt.TableControlSWTRenderer;
41: import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
42: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
43: import org.eclipse.emf.ecp.view.template.style.background.model.VTBackgroundStyleProperty;
44: import org.eclipse.emf.ecp.view.template.style.fontProperties.model.VTFontPropertiesStyleProperty;
45: import org.eclipse.emf.edit.command.SetCommand;
46: import org.eclipse.emf.edit.domain.EditingDomain;
47: import org.eclipse.emfforms.spi.common.converter.EStructuralFeatureValueConverterService;
48: import org.eclipse.emfforms.spi.common.report.AbstractReport;
49: import org.eclipse.emfforms.spi.common.report.ReportService;
50: import org.eclipse.emfforms.spi.common.validation.PreSetValidationService;
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.editsupport.EMFFormsEditSupport;
54: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
55: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
56: import org.eclipse.emfforms.spi.swt.table.TableConfiguration;
57: import org.eclipse.emfforms.spi.swt.table.TableControl;
58: import org.eclipse.emfforms.spi.swt.table.TableViewerCompositeBuilder;
59: import org.eclipse.emfforms.spi.swt.table.TableViewerCreator;
60: import org.eclipse.emfforms.spi.swt.table.TableViewerSWTBuilder;
61: import org.eclipse.emfforms.spi.swt.table.action.TableActionBar;
62: import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
63: import org.eclipse.jface.viewers.AbstractTableViewer;
64: import org.eclipse.jface.viewers.ColumnViewerEditor;
65: import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
66: import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
67: import org.eclipse.jface.viewers.ISelection;
68: import org.eclipse.jface.viewers.ISelectionChangedListener;
69: import org.eclipse.jface.viewers.IStructuredSelection;
70: import org.eclipse.jface.viewers.SelectionChangedEvent;
71: import org.eclipse.jface.viewers.ViewerComparator;
72: import org.eclipse.jface.viewers.ViewerRow;
73: import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
74: import org.eclipse.nebula.jface.gridviewer.GridViewerEditor;
75: import org.eclipse.nebula.widgets.grid.Grid;
76: import org.eclipse.nebula.widgets.grid.GridItem;
77: import org.eclipse.swt.SWT;
78: import org.eclipse.swt.events.MouseEvent;
79: import org.eclipse.swt.events.MouseListener;
80: import org.eclipse.swt.events.MouseMoveListener;
81: import org.eclipse.swt.graphics.Point;
82: import org.eclipse.swt.widgets.Composite;
83: import org.eclipse.swt.widgets.Item;
84: import org.eclipse.swt.widgets.ScrollBar;
85: import org.eclipse.swt.widgets.Widget;
86: import org.osgi.framework.BundleContext;
87: import org.osgi.framework.FrameworkUtil;
88: import org.osgi.framework.ServiceReference;
89:
90: /**
91: * @author Jonas Helming
92: * @since 1.10
93: *
94: */
95: public class GridControlSWTRenderer extends TableControlSWTRenderer {
96:
97:         private final EStructuralFeatureValueConverterService converterService;
98:         private final EMFFormsLocalizationService localizationService;
99:
100:         /**
101:          * Custom Nebula Grid table viewer to expose getViewerRowFromItem() method.
102:          *
103:          * @author Mat Hansen
104:          *
105:          */
106:         public class CustomGridTableViewer extends GridTableViewer {
107:
108:                 /**
109:                  * Creates a grid viewer on a newly-created grid control under the given
110:                  * parent. The grid control is created using the given SWT style bits. The
111:                  * viewer has no input, no content provider, a default label provider, no
112:                  * sorter, and no filters.
113:                  *
114:                  * @param parent
115:                  * the parent control
116:                  * @param style
117:                  * the SWT style bits used to create the grid.
118:                  */
119:                 public CustomGridTableViewer(Composite parent, int style) {
120:                         super(parent, style);
121:                 }
122:
123:                 // make method public
124:                 @Override
125:                 public ViewerRow getViewerRowFromItem(Widget item) {
126:                         return super.getViewerRowFromItem(item);
127:                 }
128:         }
129:
130:         /**
131:          * Default constructor.
132:          *
133:          * @param vElement the view model element to be rendered
134:          * @param viewContext the view context
135:          * @param emfFormsDatabinding The {@link EMFFormsDatabindingEMF}
136:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
137:          * @param reportService The {@link ReportService}
138:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
139:          * @param imageRegistryService The {@link ImageRegistryService}
140:          * @param emfFormsEditSupport The {@link EMFFormsEditSupport}
141:          * @param converterService the {@link EStructuralFeatureValueConverterService}
142:          * @param localizationService the {@link EMFFormsLocalizationService}
143:          * @since 1.11
144:          */
145:         @Inject
146:         // CHECKSTYLE.OFF: ParameterNumber
147:         public GridControlSWTRenderer(VTableControl vElement, ViewModelContext viewContext, ReportService reportService,
148:                 EMFFormsDatabindingEMF emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
149:                 VTViewTemplateProvider vtViewTemplateProvider, ImageRegistryService imageRegistryService,
150:                 EMFFormsEditSupport emfFormsEditSupport, EStructuralFeatureValueConverterService converterService,
151:                 EMFFormsLocalizationService localizationService) {
152:                 // CHECKSTYLE.ON: ParameterNumber
153:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider,
154:                         imageRegistryService, emfFormsEditSupport);
155:                 this.converterService = converterService;
156:                 this.localizationService = localizationService;
157:         }
158:
159:         /**
160:          * A Mouse and SelectionChanged listener which allows to copy values like in spreadsheets.
161:          *
162:          * @author Eugen Neufeld
163:          *
164:          */
165:         private class CopyDragListener implements MouseListener, MouseMoveListener, ISelectionChangedListener {
166:
167:                 private IStructuredSelection lastSelection;
168:                 private EObject masterObject;
169:                 private final PreSetValidationService preSetValidationService;
170:                 private boolean copyDragActive;
171:                 private GridItem startDragItem;
172:
173:                 CopyDragListener() {
174:                         final BundleContext bundleContext = FrameworkUtil
175:                                 .getBundle(getClass())
176:                                 .getBundleContext();
177:
178:                         final ServiceReference<PreSetValidationService> serviceReference = bundleContext
179:                                 .getServiceReference(PreSetValidationService.class);
180:
181:                         preSetValidationService = serviceReference != null ? bundleContext.getService(serviceReference) : null;
182:                 }
183:
184:                 private boolean isCopyModifierPressed(MouseEvent e) {
185:                         return (e.stateMask & SWT.MOD2) != 0;
186:                 }
187:
188:                 private boolean canCopy() {
189:                         return getVElement().isEffectivelyEnabled() && !getVElement().isEffectivelyReadonly();
190:                 }
191:
192:                 @Override
193:                 public void mouseMove(MouseEvent e) {
194:                         if (canCopy()) {
195:                                 copyDragActive = isCopyModifierPressed(e) && lastSelection != null && lastSelection.size() > 1
196:                                         && masterObject != null;
197:                         }
198:                 }
199:
200:                 @Override
201:                 public void mouseDoubleClick(MouseEvent e) {
202:                 }
203:
204:                 @Override
205:                 public void mouseDown(MouseEvent e) {
206:                         if (isCopyModifierPressed(e) && canCopy()) {
207:                                 final Grid grid = (Grid) e.widget;
208:                                 startDragItem = grid.getItem(new Point(e.x, e.y));
209:                         }
210:                 }
211:
212:                 @Override
213:                 public void mouseUp(MouseEvent e) {
214:                         if (e.button == 1 && canCopy()) {
215:
216:                                 final Grid grid = (Grid) e.widget;
217:                                 final GridItem currentItem = grid.getItem(new Point(e.x, e.y));
218:                                 if (isCopyModifierPressed(e) && copyDragActive && startDragItem != currentItem) {
219:                                         final List list = lastSelection.toList();
220:                                         final VDomainModelReference dmr = (VDomainModelReference) grid.getColumn(new Point(e.x, e.y))
221:                                                 .getData(TableConfiguration.DMR);
222:
223:                                         Object masterValue = null;
224:                                         EStructuralFeature structuralFeature = null;
225:                                         IObservableValue masterOV = null;
226:                                         try {
227:                                                 masterOV = getEMFFormsDatabinding().getObservableValue(dmr, masterObject);
228:                                                 masterValue = masterOV.getValue();
229:                                                 structuralFeature = (EStructuralFeature) masterOV.getValueType();
230:                                         } catch (final DatabindingFailedException ex) {
231:                                                 getReportService().report(new AbstractReport(ex));
232:                                         } finally {
233:                                                 if (masterOV != null) {
234:                                                         masterOV.dispose();
235:                                                 }
236:                                         }
237:                                         final EditingDomain editingDomain = getEditingDomain(masterObject);
238:                                         final CompoundCommand cc = new CompoundCommand();
239:                                         final List<String> invalidValues = new ArrayList<String>();
240:                                         for (int i = 0; i < list.size(); i++) {
241:                                                 final EObject eObject = (EObject) list.get(i);
242:                                                 if (masterObject == eObject) {
243:                                                         continue;
244:                                                 }
245:                                                 final Diagnostic diagnostic = validate(eObject, dmr, structuralFeature);
246:                                                 final boolean valid = diagnostic.getSeverity() == Diagnostic.OK;
247:                                                 if (!valid) {
248:                                                         invalidValues.add(diagnostic.getChildren().get(0).getMessage());
249:                                                 } else {
250:                                                         final Command setCommand = SetCommand.create(editingDomain, eObject,
251:                                                                 structuralFeature, masterValue);
252:                                                         cc.append(setCommand);
253:                                                 }
254:                                         }
255:                                         editingDomain.getCommandStack().execute(cc);
256:                                 }
257:                                 copyDragActive = false;
258:                                 startDragItem = null;
259:                         }
260:                 }
261:
262:                 private Diagnostic validate(EObject eObject, VDomainModelReference dmr, EStructuralFeature structuralFeature) {
263:                         IObservableValue value = null;
264:                         try {
265:                                 if (preSetValidationService != null) {
266:                                         value = getEMFFormsDatabinding().getObservableValue(dmr, eObject);
267:                                         final Map<Object, Object> context = new LinkedHashMap<Object, Object>();
268:                                         context.put("rootEObject", IObserving.class.cast(value).getObserved());//$NON-NLS-1$
269:                                         final Diagnostic diag = preSetValidationService.validate(
270:                                                 structuralFeature, value.getValue(), context);
271:                                         return diag;
272:                                 }
273:                         } catch (final DatabindingFailedException ex) {
274:                                 getReportService().report(new AbstractReport(ex));
275:                         } finally {
276:                                 if (value != null) {
277:                                         value.dispose();
278:                                 }
279:                         }
280:                         return Diagnostic.OK_INSTANCE;
281:                 }
282:
283:                 /**
284:                  * {@inheritDoc}
285:                  *
286:                  * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
287:                  */
288:                 @Override
289:                 public void selectionChanged(SelectionChangedEvent event) {
290:                         // was implemented using
291:                         // lastSelection = event.getStructuredSelection();
292:                         // this method throws a class cast exception in case no structured selection is present,
293:                         // so doing below null check should be fine
294:                         final ISelection selection = event.getSelection();
295:                         if (!IStructuredSelection.class.isInstance(selection)) {
296:                                 lastSelection = null;
297:                                 return;
298:                         }
299:                         lastSelection = (IStructuredSelection) event.getSelection();
300:                         if (lastSelection.size() == 1) {
301:                                 masterObject = (EObject) lastSelection.getFirstElement();
302:                         }
303:                 }
304:
305:         }
306:
307:         /**
308:          * {@link TableViewerCreator} for the table control swt renderer. It will create a GridTableViewer with the expected
309:          * custom variant data and the correct style properties as defined in the template model.
310:          *
311:          */
312:         protected class GridTableControlSWTRendererTableViewerCreator implements TableViewerCreator<GridTableViewer> {
313:
314:                 @Override
315:                 public GridTableViewer createTableViewer(Composite parent) {
316:
317:                         final GridTableViewer tableViewer = new CustomGridTableViewer(parent,
318:                                 SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
319:                         tableViewer.getGrid().setData(CUSTOM_VARIANT, TABLE_CUSTOM_VARIANT);
320:                         tableViewer.getGrid().setHeaderVisible(true);
321:                         tableViewer.getGrid().setLinesVisible(true);
322:                         tableViewer.getGrid().setCellSelectionEnabled(true);
323:                         tableViewer.getGrid().setFooterVisible(false);
324:
325:                         addKeyListener(tableViewer);
326:                         if (getViewModelContext().getContextValue("enableMultiEdit") == Boolean.TRUE) {
327:                                 final CopyDragListener mdl = new CopyDragListener();
328:                                 tableViewer.addSelectionChangedListener(mdl);
329:                                 tableViewer.getGrid().addMouseMoveListener(mdl);
330:                                 tableViewer.getGrid().addMouseListener(mdl);
331:                         }
332:
333:                         /* Set background color */
334:                         final VTBackgroundStyleProperty backgroundStyleProperty = getBackgroundStyleProperty();
335:                         if (backgroundStyleProperty.getColor() != null) {
336:                                 tableViewer.getGrid().setBackground(getSWTColor(backgroundStyleProperty.getColor()));
337:                         }
338:
339:                         /* Set foreground color */
340:                         final VTFontPropertiesStyleProperty fontPropertiesStyleProperty = getFontPropertiesStyleProperty();
341:                         if (fontPropertiesStyleProperty.getColorHEX() != null) {
342:                                 tableViewer.getGrid()
343:                                         .setForeground(getSWTColor(fontPropertiesStyleProperty.getColorHEX()));
344:                         }
345:
346:                         tableViewer.getGrid().setData(FIXED_COLUMNS, new Integer(1));
347:
348:                         /* manage editing support activation */
349:                         createTableViewerEditor(tableViewer);
350:
351:                         return tableViewer;
352:                 }
353:
354:                 /**
355:                  * Add key listener.
356:                  *
357:                  * @param tableViewer the viewer to add the listeners to
358:                  */
359:                 protected void addKeyListener(final GridTableViewer tableViewer) {
360:                         tableViewer.getGrid().addKeyListener(new GridCopyKeyListener(tableViewer.getGrid().getDisplay()));
361:                         tableViewer.getGrid()
362:                                 .addKeyListener(new GridPasteKeyListener(tableViewer.getGrid().getDisplay(), getVElement(),
363:                                         getEMFFormsDatabinding(), getConverterService(), getLocalizationService(), true));
364:                         tableViewer.getGrid().addKeyListener(new GridClearKeyListener(getVElement(), getEMFFormsDatabinding()));
365:                         tableViewer.getGrid().addKeyListener(
366:                                 new GridCutKeyListener(tableViewer.getGrid().getDisplay(), getVElement(), getEMFFormsDatabinding()));
367:                 }
368:
369:                 /**
370:                  * This method creates and initialises a {@link GridViewerEditor} for the given {@link GridTableViewer}.
371:                  *
372:                  * @param gridTableViewer the table viewer
373:                  */
374:                 protected void createTableViewerEditor(final GridTableViewer gridTableViewer) {
375:                         // TODO Grid
376:                         // final TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,
377:                         // new org.eclipse.emf.ecp.edit.internal.swt.controls.ECPFocusCellDrawHighlighter(tableViewer));
378:
379:                         // final TableViewer tableViewer = (TableViewer) getTableViewer();
380:                         // final TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(
381:                         // (TableViewer) gridTableViewer,
382:                         // new CustomFocusCellHighlighter(gridTableViewer);
383:
384:                         final ColumnViewerEditorActivationStrategy actSupport = new GridColumnViewerEditorActivationStrategy(
385:                                 gridTableViewer);
386:                         actSupport.setEnableEditorActivationWithKeyboard(true);
387:                         GridViewerEditor.create(
388:                                 gridTableViewer,
389:                                 actSupport,
390:                                 ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
391:                                         | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
392:                 }
393:         }
394:
395:         @Override
396:         protected TableViewerCreator<GridTableViewer> getTableViewerCreator() {
397:                 return new GridTableControlSWTRendererTableViewerCreator();
398:         }
399:
400:         @Override
401:         // CHECKSTYLE.OFF: ParameterNumber
402:         protected TableViewerSWTBuilder createTableViewerSWTBuilder(Composite parent, IObservableList list,
403:                 IObservableValue labelText, IObservableValue labelTooltipText, TableViewerCompositeBuilder compositeBuilder,
404:                 ObservableListContentProvider cp, ViewerComparator comparator,
405:                 TableActionBar<? extends AbstractTableViewer> actionBar) {
406:                 // CHECKSTYLE.ON: ParameterNumber
407:                 return GridTableViewerFactory.fillDefaults(parent, SWT.NONE, list, labelText, labelTooltipText)
408:                         .customizeCompositeStructure(compositeBuilder)
409:                         .customizeActionBar(actionBar)
410:                         .customizeTableViewerCreation(getTableViewerCreator())
411:                         .customizeContentProvider(cp)
412:                         .customizeComparator(comparator)
413:                         .showHideColumns(true)
414:                         .columnSubstringFilter(true)
415:                         .columnRegexFilter(true);
416:         }
417:
418:         @Override
419:         protected int getSelectionIndex() {
420:                 return ((GridTableViewer) getTableViewer()).getGrid().getSelectionIndex();
421:         }
422:
423:         @Override
424:         protected Item[] getColumns() {
425:                 return ((GridTableViewer) getTableViewer()).getGrid().getColumns();
426:         }
427:
428:         @Override
429:         protected ScrollBar getHorizontalBar() {
430:                 return ((GridTableViewer) getTableViewer()).getGrid().getHorizontalBar();
431:         }
432:
433:         @Override
434:         protected ScrollBar getVerticalBar() {
435:                 return ((GridTableViewer) getTableViewer()).getGrid().getVerticalBar();
436:         }
437:
438:         @Override
439:         protected int computeRequiredHeight(Integer visibleLines) {
440:                 if (getTableViewer() == null || getTableViewerComposite() == null) {
441:                         return SWT.DEFAULT;
442:                 }
443:                 final TableControl table = getTableViewerComposite().getTableControl();
444:                 if (table == null) {
445:                         return SWT.DEFAULT;
446:                 }
447:                 if (table.isDisposed()) {
448:                         return SWT.DEFAULT;
449:                 }
450:                 final int itemHeight = table.getItemHeight() + 1;
451:                 // show one empty row if table does not contain any items or visibleLines < 1
452:                 int itemCount;
453:                 if (visibleLines != null) {
454:                         itemCount = Math.max(visibleLines, 1);
455:                 } else {
456:                         itemCount = Math.max(table.getItemCount(), 1);
457:                 }
458:                 final int headerHeight = table.getHeaderVisible() ? table.getHeaderHeight() : 0;
459:
460:                 final int tableHeight = itemHeight * itemCount + headerHeight;
461:                 return tableHeight;
462:         }
463:
464:         /**
465:          *
466:          * @return the {@link EStructuralFeatureValueConverterService}
467:          */
468:         protected EStructuralFeatureValueConverterService getConverterService() {
469:                 return converterService;
470:         }
471:
472:         /**
473:          *
474:          * @return the {@link EMFFormsLocalizationService}
475:          */
476:         protected EMFFormsLocalizationService getLocalizationService() {
477:                 return localizationService;
478:         }
479:
480:         /**
481:          * EditorActivationStrategy for GridColumns.
482:          *
483:          * @author Stefan Dirix
484:          */
485:         private class GridColumnViewerEditorActivationStrategy extends ColumnViewerEditorActivationStrategy {
486:
487:                 private final GridTableViewer gridTableViewer;
488:
489:                 /**
490:                  * Constructor.
491:                  *
492:                  * @param viewer the {@link GridTableViewer}.
493:                  */
494:                 GridColumnViewerEditorActivationStrategy(GridTableViewer gridTableViewer) {
495:                         super(gridTableViewer);
496:                         this.gridTableViewer = gridTableViewer;
497:                 }
498:
499:                 @Override
500:                 protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
501:                         if (event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
502:                                 || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
503:                                 || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC) {
504:                                 return true;
505:                         }
506:                         if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
507:                                 && gridTableViewer.isCellEditorActive()) {
508:                                 gridTableViewer.applyEditorValue();
509:                         }
510:                         if (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED) {
511:                                 for (final int keyCode : Arrays.asList(SWT.CTRL, SWT.ALT)) {
512:                                         if ((event.keyCode & keyCode) != 0 || (event.stateMask & keyCode) != 0) {
513:                                                 return false;
514:                                         }
515:                                 }
516:                                 if ((event.keyCode & SWT.SHIFT) != 0) {
517:                                         return false;
518:                                 }
519:                                 return !isDoNotEnterEditorCode(event.keyCode);
520:                         }
521:                         return false;
522:                 }
523:
524:                 private boolean isDoNotEnterEditorCode(int keyCode) {
525:                         // BEGIN COMPLEX CODE
526:                         return keyCode == SWT.ARROW_UP || keyCode == SWT.ARROW_DOWN
527:                                 || keyCode == SWT.ARROW_LEFT || keyCode == SWT.ARROW_RIGHT
528:                                 || keyCode == SWT.TAB || keyCode == SWT.DEL;
529:                         // END COMPLEX CODE
530:                 }
531:         }
532:
533: }