Skip to content

Package: GridViewerColumnBuilder$5

GridViewerColumnBuilder$5

nameinstructionbranchcomplexitylinemethod
handleEvent(Event)
M: 20 C: 0
0%
M: 4 C: 0
0%
M: 3 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) 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 - bug 547271
14: ******************************************************************************/
15: package org.eclipse.emf.ecp.view.spi.table.nebula.grid;
16:
17: import org.eclipse.emfforms.common.Optional;
18: import org.eclipse.emfforms.common.Property;
19: import org.eclipse.emfforms.common.Property.ChangeListener;
20: import org.eclipse.emfforms.spi.swt.table.AbstractTableViewerColumnBuilder;
21: import org.eclipse.emfforms.spi.swt.table.ColumnConfiguration;
22: import org.eclipse.emfforms.spi.swt.table.ViewerRefreshManager;
23: import org.eclipse.jface.databinding.swt.WidgetValueProperty;
24: import org.eclipse.jface.layout.GridDataFactory;
25: import org.eclipse.jface.layout.GridLayoutFactory;
26: import org.eclipse.jface.viewers.EditingSupport;
27: import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
28: import org.eclipse.nebula.jface.gridviewer.GridViewerColumn;
29: import org.eclipse.nebula.widgets.grid.GridColumn;
30: import org.eclipse.swt.SWT;
31: import org.eclipse.swt.custom.ControlEditor;
32: import org.eclipse.swt.events.ModifyEvent;
33: import org.eclipse.swt.events.ModifyListener;
34: import org.eclipse.swt.events.SelectionAdapter;
35: import org.eclipse.swt.events.SelectionEvent;
36: import org.eclipse.swt.widgets.Button;
37: import org.eclipse.swt.widgets.Composite;
38: import org.eclipse.swt.widgets.Control;
39: import org.eclipse.swt.widgets.Display;
40: import org.eclipse.swt.widgets.Event;
41: import org.eclipse.swt.widgets.Item;
42: import org.eclipse.swt.widgets.Listener;
43: import org.eclipse.swt.widgets.Text;
44: import org.eclipse.swt.widgets.Widget;
45:
46: /**
47: * Nebula Grid viewer configuration helper class.
48: *
49: * @author Mat Hansen <mhansen@eclipsesource.com>
50: *
51: */
52: public class GridViewerColumnBuilder extends AbstractTableViewerColumnBuilder<GridTableViewer, GridViewerColumn> {
53:
54:         /**
55:          * To avoid redundant refreshes from the filtering control listener of every column
56:          * in the grid, refresh requests are posted on this async runnable manager.
57:          */
58:         private ViewerRefreshManager refreshManager;
59:
60:         /**
61:          * The constructor.
62:          *
63:          * @param config the {@link ColumnConfiguration}
64:          */
65:         public GridViewerColumnBuilder(ColumnConfiguration config) {
66:                 super(config);
67:         }
68:
69:         @Override
70:         public GridViewerColumn createViewerColumn(GridTableViewer tableViewer) {
71:                 refreshManager = ViewerRefreshManager.getInstance(tableViewer);
72:
73:                 return new GridViewerColumn(tableViewer, getConfig().getStyleBits());
74:         }
75:
76:         @Override
77:         protected void configure(GridTableViewer tableViewer, GridViewerColumn viewerColumn) {
78:                 super.configure(tableViewer, viewerColumn);
79:
80:                 // Nebula Grid supports a few more things
81:                 configureHideShow(tableViewer, viewerColumn);
82:                 configureFiltering(tableViewer, viewerColumn);
83:
84:         }
85:
86:         @Override
87:         protected void configureDatabinding(Widget column) {
88:                 super.configureDatabinding(column);
89:                 bindValue(column, new GridColumnTooltipTextProperty(), getConfig().getColumnTooltip());
90:         }
91:
92:         @Override
93:         protected Item getTableColumn(GridViewerColumn viewerColumn) {
94:                 return viewerColumn.getColumn();
95:         }
96:
97:         @Override
98:         protected void configureViewerColumn(GridViewerColumn viewerColumn) {
99:                 final GridColumn column = viewerColumn.getColumn();
100:
101:                 column.setResizeable(getConfig().isResizeable());
102:                 column.setMoveable(getConfig().isMoveable());
103:                 column.setVisible(getConfig().visible().getValue());
104:                 // column.getColumn().setWidth(width);
105:         }
106:
107:         @Override
108:         protected void configureEditingSupport(GridViewerColumn viewerColumn, GridTableViewer tableViewer) {
109:                 final Optional<EditingSupport> editingSupport = getConfig().createEditingSupport(tableViewer);
110:                 if (editingSupport.isPresent()) {
111:                         viewerColumn.setEditingSupport(editingSupport.get());
112:                 }
113:         }
114:
115:         /**
116:          * Configure hide/show columns toggle.
117:          *
118:          * @param tableViewer the table viewer
119:          * @param viewerColumn the viewer column to configure
120:          */
121:         protected void configureHideShow(final GridTableViewer tableViewer, final GridViewerColumn viewerColumn) {
122:
123:                 getConfig().visible().addChangeListener(new ChangeListener<Boolean>() {
124:                         @Override
125:                         public void valueChanged(Property<Boolean> property, Boolean oldValue, Boolean newValue) {
126:                                 getConfig().matchFilter().resetToDefault();
127:
128:                                 final GridColumn column = viewerColumn.getColumn();
129:                                 Listener hideShowListener = extractShowListener(viewerColumn.getColumn());
130:                                 if (column.getHeaderControl() == null && hideShowListener != null) {
131:                                         column.removeListener(SWT.Show, hideShowListener);
132:                                         column.removeListener(SWT.Hide, hideShowListener);
133:                                 } else {
134:                                         hideShowListener = null;
135:                                 }
136:                                 column.setVisible(newValue);
137:                                 if (hideShowListener != null) {
138:                                         column.addListener(SWT.Show, hideShowListener);
139:                                         column.addListener(SWT.Hide, hideShowListener);
140:                                 }
141:                         }
142:                 });
143:
144:         }
145:
146:         private static Listener extractShowListener(final GridColumn column) {
147:                 for (final Listener listener : column.getListeners(SWT.Show)) {
148:                         if (listener.getClass().getEnclosingClass() != null
149:                                 && ControlEditor.class.isAssignableFrom(listener.getClass().getEnclosingClass())) {
150:                                 return listener;
151:                         }
152:                 }
153:                 return null;
154:         }
155:
156:         /**
157:          * Configure column filter.
158:          *
159:          * @param tableViewer the table viewer
160:          * @param viewerColumn the viewer column to configure
161:          */
162:         protected void configureFiltering(final GridTableViewer tableViewer, final GridViewerColumn viewerColumn) {
163:                 final GridColumn column = viewerColumn.getColumn();
164:
165:                 getConfig().showFilterControl().addChangeListener(new ChangeListener<Boolean>() {
166:
167:                         private Control filterControl;
168:
169:                         @Override
170:                         public void valueChanged(Property<Boolean> property, Boolean oldValue, Boolean newValue) {
171:                                 if (newValue) {
172:                                         filterControl = createHeaderFilterControl(column.getParent());
173:                                         column.setHeaderControl(filterControl);
174:                                 } else {
175:                                         column.setHeaderControl(null);
176:                                         if (filterControl != null) {
177:                                                 filterControl.dispose();
178:                                         }
179:
180:                                         getConfig().matchFilter().resetToDefault();
181:                                 }
182:                                 // hack: force header height recalculation
183:                                 column.setWidth(column.getWidth());
184:                         }
185:
186:                 });
187:
188:                 getConfig().matchFilter().addChangeListener(new ChangeListener<Object>() {
189:                         @Override
190:                         public void valueChanged(Property<Object> property, Object oldValue, Object newValue) {
191:                                 refreshManager.postRefresh();
192:                         }
193:                 });
194:
195:         }
196:
197:         /**
198:          * Creates a column filter control.
199:          *
200:          * @param parent the parent composite
201:          * @return new filter control instance
202:          */
203:         protected Control createHeaderFilterControl(Composite parent) {
204:
205:                 final Composite filterComposite = new Composite(parent, SWT.NONE);
206:                 GridLayoutFactory.fillDefaults().numColumns(2).applyTo(filterComposite);
207:
208:                 final Text txtFilter = new Text(filterComposite, SWT.BORDER);
209:                 GridDataFactory.fillDefaults().grab(true, false).applyTo(txtFilter);
210:
211:                 txtFilter.addModifyListener(new ModifyListener() {
212:                         private final Runnable runnable = new Runnable() {
213:                                 @Override
214:                                 public void run() {
215:                                         if (!txtFilter.isDisposed()) {
216:                                                 getConfig().matchFilter().setValue(txtFilter.getText());
217:                                         }
218:                                 }
219:                         };
220:
221:                         @Override
222:                         public void modifyText(ModifyEvent e) {
223:                                 Display.getDefault().timerExec(300, runnable);
224:                         }
225:                 });
226:
227:                 filterComposite.addListener(SWT.Show, new Listener() {
228:                         @Override
229:                         public void handleEvent(Event event) {
230:•                                if (!txtFilter.isDisposed() && getConfig().matchFilter().getValue() != null) {
231:                                         txtFilter.setText(String.valueOf(getConfig().matchFilter().getValue()));
232:                                 }
233:                         }
234:                 });
235:
236:                 final Button btnClear = new Button(filterComposite, SWT.PUSH);
237:                 GridDataFactory.fillDefaults().grab(false, false).applyTo(btnClear);
238:                 btnClear.setText("x"); //$NON-NLS-1$
239:                 btnClear.addSelectionListener(new SelectionAdapter() {
240:                         @Override
241:                         public void widgetSelected(SelectionEvent e) {
242:                                 txtFilter.setText(""); //$NON-NLS-1$
243:                         }
244:                 });
245:
246:                 return filterComposite;
247:         }
248:
249:         /**
250:          * Internal class to bind the GridColumn's TooltipText using JFace Databinding.
251:          *
252:          * @author Eugen Neufeld
253:          *
254:          */
255:         class GridColumnTooltipTextProperty extends WidgetValueProperty {
256:
257:                 @Override
258:                 public String toString() {
259:                         return "GridColumn.toolTipText <String>"; //$NON-NLS-1$
260:                 }
261:
262:                 @Override
263:                 public Object getValueType() {
264:                         return String.class;
265:                 }
266:
267:                 @Override
268:                 protected Object doGetValue(Object source) {
269:                         return ((GridColumn) source).getHeaderTooltip();
270:                 }
271:
272:                 @Override
273:                 protected void doSetValue(Object source, Object value) {
274:                         ((GridColumn) source).setHeaderTooltip((String) value);
275:                 }
276:         }
277: }