Skip to content

Package: EnumLiteralFilteredComboViewerSWTRenderer$3

EnumLiteralFilteredComboViewerSWTRenderer$3

nameinstructionbranchcomplexitylinemethod
focusGained(FocusEvent)
M: 0 C: 1
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
focusLost(FocusEvent)
M: 7 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%
{...}
M: 0 C: 9
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) 2017-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: * Edgar Mueller - initial API and implementation
13: * Lucas Koehler - adapt matching for internationalization
14: ******************************************************************************/
15: package org.eclipse.emf.ecp.view.internal.core.swt.renderer;
16:
17: import javax.inject.Inject;
18:
19: import org.eclipse.emf.ecore.EEnum;
20: import org.eclipse.emf.ecp.view.internal.core.swt.MatchItemComboViewer;
21: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
22: import org.eclipse.emf.ecp.view.spi.model.VControl;
23: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
24: import org.eclipse.emfforms.spi.common.report.ReportService;
25: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
26: import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
27: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
28: import org.eclipse.jface.viewers.ComboViewer;
29: import org.eclipse.jface.viewers.IStructuredSelection;
30: import org.eclipse.swt.SWT;
31: import org.eclipse.swt.custom.CCombo;
32: import org.eclipse.swt.events.FocusEvent;
33: import org.eclipse.swt.events.FocusListener;
34: import org.eclipse.swt.widgets.Composite;
35: import org.eclipse.swt.widgets.Event;
36: import org.eclipse.swt.widgets.Listener;
37:
38: /**
39: * Renderer for enums that makes use of a {@link MatchItemComboViewer}.
40: *
41: */
42: public class EnumLiteralFilteredComboViewerSWTRenderer extends EnumComboViewerSWTRenderer {
43:
44:         private MatchItemComboViewer viewer;
45:
46:         /**
47:          * Default constructor.
48:          *
49:          * @param vElement the view model element to be rendered
50:          * @param viewContext the view context
51:          * @param reportService The {@link ReportService}
52:          * @param emfFormsDatabinding The {@link EMFFormsDatabinding}
53:          * @param emfFormsLabelProvider The {@link EMFFormsLabelProvider}
54:          * @param vtViewTemplateProvider The {@link VTViewTemplateProvider}
55:          * @param emfFormsEditSupport The {@link EMFFormsEditSupport}
56:          */
57:         @Inject
58:         public EnumLiteralFilteredComboViewerSWTRenderer(VControl vElement, ViewModelContext viewContext,
59:                 ReportService reportService,
60:                 EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
61:                 VTViewTemplateProvider vtViewTemplateProvider, EMFFormsEditSupport emfFormsEditSupport) {
62:                 super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider,
63:                         emfFormsEditSupport);
64:         }
65:
66:         @Override
67:         protected ComboViewer createComboViewer(final Composite parent, final EEnum eEnum) {
68:                 final CCombo combo = new CCombo(parent, SWT.BORDER);
69:                 combo.addListener(SWT.Resize, new Listener() {
70:                         @Override
71:                         public void handleEvent(final Event argEvent) {
72:                                 combo.setText(combo.getText());
73:                         }
74:                 });
75:                 combo.setEditable(true);
76:
77:                 viewer = new MatchItemComboViewer(combo) {
78:                         @Override
79:                         public void onEnter() {
80:                                 // Trigger databinding for current selection
81:                                 fireViewerSelectionEvents();
82:                                 combo.clearSelection();
83:                         }
84:                 };
85:
86:                 combo.addFocusListener(new FocusListener() {
87:
88:                         @Override
89:                         public void focusLost(FocusEvent e) {
90:                                 fireViewerSelectionEvents();
91:                                 combo.clearSelection();
92:                         }
93:
94:                         @Override
95:                         public void focusGained(FocusEvent e) {
96:
97:                         }
98:                 });
99:
100:                 return viewer;
101:         }
102:
103:         /**
104:          * Triggers the combo viewer's selection events by re-setting its selection.
105:          * <p>
106:          * When typing in the match item viewer's combo box, the selection is updated correctly in the underlying combo.
107:          * However, the databinding is not triggered because StructuredViewer#updateSelection does not fire post selection
108:          * change events. To trigger the databinding, we manually set the selection to the viewer.
109:          * We do not set empty selections because the user cannot set an empty value and the ccombo sometimes
110:          * returns an empty selection when manually setting the cursor in the combo box (even though a value is
111:          * shown in the CCombo).
112:          */
113:         private void fireViewerSelectionEvents() {
114:                 final IStructuredSelection selection = viewer.getStructuredSelection();
115:                 if (!selection.isEmpty()) {
116:                         viewer.setSelection(selection);
117:                 }
118:         }
119: }