Skip to content

Content of file TableControlRendererSort_PTest.java

/*******************************************************************************
 * Copyright (c) 2011-2019 EclipseSource Muenchen GmbH and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * eugen - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.spi.table.swt;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.util.Arrays;
import java.util.Dictionary;
import java.util.Hashtable;

import javax.inject.Inject;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.model.VElement;
import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
import org.eclipse.emf.ecp.view.table.test.common.TableTestUtil;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
import org.eclipse.emfforms.spi.swt.core.di.EMFFormsDIRendererService;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;

/**
 * @author eugen
 *
 */
@RunWith(DatabindingClassRunner.class)
public class TableControlRendererSort_PTest {

	private static class TableControlSWTRendererSort extends TableControlSWTRenderer {

		@Inject
		// CHECKSTYLE.OFF: ParameterNumber
		TableControlSWTRendererSort(VTableControl vElement, ViewModelContext viewContext,
			ReportService reportService,
			EMFFormsDatabindingEMF emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider,
			VTViewTemplateProvider vtViewTemplateProvider, ImageRegistryService imageRegistryService,
			EMFFormsEditSupport emfFormsEditSupport) {
			// CHECKSTYLE.ON: ParameterNumber
			super(vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider,
vtViewTemplateProvider, imageRegistryService, emfFormsEditSupport); } @Override protected TableControlComparator createTableViewerComparator() { // CHECKSTYLE.OFF: AnonInnerLength return new TableControlComparator() { private int propertyIndex; private int direction; @Override public int getDirection() { switch (direction) { case 0: return SWT.DOWN; // ascending case 1: return SWT.UP; // descending default: return SWT.DOWN; } } @Override public void setColumn(int column) { if (column == propertyIndex) { // Same column as last sort; toggle the direction direction = (direction + 1) % 2; } else { // New column; do an ascending sort propertyIndex = column; direction = 0; } // columnFeatures starts at index 0 with the first regular column setSortColumnFeature(getColumnFeature(propertyIndex)); } @Override public int compare(Viewer viewer, Object e1, Object e2) { return TableControlSWTRendererSort.this.compare(viewer, e1, e2, direction + 1, propertyIndex); } }; // CHECKSTYLE.ON: AnonInnerLength } @Override protected Control renderTableControl(SWTGridCell gridCell, Composite parent) throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { final Control result = super.renderTableControl(gridCell, parent); getTableViewerComposite().setCompareColumn(1); return result; } } private static class TableControlSWTRendererSortService implements EMFFormsDIRendererService<VTableControl> { @Override public double isApplicable(VElement vElement, ViewModelContext viewModelContext) { if (!VTableControl.class.isInstance(vElement)) { return NOT_APPLICABLE; } final VTableControl tableControl = (VTableControl) vElement; final VTableDomainModelReference domainRef = (VTableDomainModelReference) tableControl .getDomainModelReference(); if (domainRef.getDomainModelEFeature() == EcorePackage.eINSTANCE.getEClass_EStructuralFeatures()) { return Double.MAX_VALUE; } return NOT_APPLICABLE; } @Override public Class<? extends AbstractSWTRenderer<VTableControl>> getRendererClass() { return TableControlSWTRendererSort.class; } } private static ServiceRegistration<EMFFormsDIRendererService> serviceRegistration; private Shell shell; @BeforeClass public static void beforeClass() { final Bundle bundle = FrameworkUtil.getBundle(TableControlRendererSort_PTest.class); final BundleContext bundleContext = bundle.getBundleContext(); final Dictionary<String, Object> properties = new Hashtable<String, Object>(); properties.put(Constants.SERVICE_RANKING, Double.MAX_VALUE); serviceRegistration = bundleContext.registerService(EMFFormsDIRendererService.class, new TableControlSWTRendererSortService(), properties); } @AfterClass public static void afterClass() { serviceRegistration.unregister(); } @Before public void init() { shell = SWTViewTestHelper.createShell(); } @After public void after() { if (shell != null && !shell.isDisposed()) { shell.dispose(); } } @Test public void tableCustomSort() throws EMFFormsNoRendererException, NoRendererFoundException, NoPropertyDescriptorFoundExeption { // table control final VTableControl tableControl = TableTestUtil.createTableControl(); final VTableDomainModelReference tableDMR = (VTableDomainModelReference) tableControl.getDomainModelReference(); tableDMR.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_EStructuralFeatures()); tableDMR.getColumnDomainModelReferences().add(createDMR(EcorePackage.eINSTANCE.getENamedElement_Name())); // render shell.open(); final EClass domain = EcoreFactory.eINSTANCE.createEClass(); final EAttribute att1 = EcoreFactory.eINSTANCE.createEAttribute(); att1.setName("zzz"); final EAttribute att2 = EcoreFactory.eINSTANCE.createEAttribute(); att2.setName("aaa"); domain.getEStructuralFeatures().add(att1); domain.getEStructuralFeatures().add(att2); Control control = null; try { control = SWTViewTestHelper.render(tableControl, domain, shell); } catch (NoRendererFoundException | NoPropertyDescriptorFoundExeption | EMFFormsNoRendererException ex) { fail("An exception occurred while rendering the table: " + ex.getMessage()); } if (control == null) { fail("No control was rendered"); } final Table table = SWTTestUtil.findControl(control, 0, Table.class); SWTTestUtil.waitForUIThread(); assertEquals(SWT.DOWN, table.getSortDirection()); // SWT.DOWN := ascending sorting final EAttribute first = (EAttribute) table.getItem(0).getData(); assertEquals("aaa", first.getName()); final EAttribute second = (EAttribute) table.getItem(1).getData(); assertEquals("zzz", second.getName()); } private static VFeaturePathDomainModelReference createDMR(EAttribute attribute, EReference... refs) { final VFeaturePathDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference(); dmr.setDomainModelEFeature(attribute); dmr.getDomainModelEReferencePath().addAll(Arrays.asList(refs)); return dmr; } }