blob: 605bfb87828dd62b4518f0ffcbeeb56d5ccb6109 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2016 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Johannes Faltermeier
*
*******************************************************************************/
package org.eclipse.emf.ecp.view.table.ui.swt.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Set;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecp.common.spi.UniqueSetting;
import org.eclipse.emf.ecp.edit.spi.swt.table.ECPCellEditorComparator;
import org.eclipse.emf.ecp.edit.spi.swt.table.StringCellEditor;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContextDisposeListener;
import org.eclipse.emf.ecp.view.spi.context.ViewModelService;
import org.eclipse.emf.ecp.view.spi.model.ModelChangeListener;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
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.VView;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
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.DetailEditing;
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.table.model.VTableFactory;
import org.eclipse.emf.ecp.view.spi.table.swt.TableControlSWTRenderer;
import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
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.core.services.view.EMFFormsContextListener;
import org.eclipse.emfforms.spi.core.services.view.RootDomainModelChangeListener;
import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
import org.eclipse.emfforms.spi.swt.core.di.EMFFormsContextProvider;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
@RunWith(DatabindingClassRunner.class)
public class SWTTable_PTest {
private static String log;
private static ServiceReference<EMFFormsRendererFactory> factoryServiceReference;
private static EMFFormsRendererFactory rendererFactory;
private static PrintStream systemErr;
private Shell shell;
private EObject domainElement;
@BeforeClass
public static void beforeClass() {
systemErr = System.err;
System.setErr(new PrintStreamWrapper(systemErr));
final BundleContext bundleContext = FrameworkUtil.getBundle(SWTTable_PTest.class).getBundleContext();
factoryServiceReference = bundleContext.getServiceReference(EMFFormsRendererFactory.class);
rendererFactory = bundleContext.getService(factoryServiceReference);
}
@AfterClass
public static void afterClass() {
System.setErr(systemErr);
final BundleContext bundleContext = FrameworkUtil.getBundle(SWTTable_PTest.class).getBundleContext();
bundleContext.ungetService(factoryServiceReference);
}
@Before
public void init() {
log = "";
shell = SWTViewTestHelper.createShell();
final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
eClass.getESuperTypes().add(EcorePackage.eINSTANCE.getEClass());
domainElement = eClass;
}
@After
public void after() {
if (!log.isEmpty()) {
fail("Unexpected log to System.err: " + log);
}
}
@Test
public void testUninitializedTableWithoutColumns() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
// setup model
final TableControlHandle handle = createUninitializedTableWithoutColumns();
//
final Control render = SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
assertTrue(Label.class.isInstance(render));// Error label with error text
assertEquals("The field domainModelEFeature of the given VFeaturePathDomainModelReference must not be null.",
Label.class.cast(render).getText());
}
@Test
public void testInitializedTableWithoutColumnsAndEmptyReference() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
// setup model
final EClass createEClass = EcoreFactory.eINSTANCE.createEClass();
createEClass.eUnset(EcorePackage.eINSTANCE.getEClass_ESuperTypes());
domainElement = createEClass;
final TableControlHandle handle = createInitializedTableWithoutTableColumns();
try {
SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
} catch (final NullPointerException e) {
fail("Fails without a reference in domain object");
}
}
@Ignore
@Test
public void testInitializedTableWithoutColumnsSingleReference() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
// setup model
final VView view = VViewFactory.eINSTANCE.createView();
view.setRootEClass(VViewPackage.eINSTANCE.getView());
domainElement = view;
final TableControlHandle handle = createInitializedTableWithoutTableColumns();
final VFeaturePathDomainModelReference domainModelReference = VViewFactory.eINSTANCE
.createFeaturePathDomainModelReference();
domainModelReference.setDomainModelEFeature(VViewPackage.eINSTANCE.getView_RootEClass());
handle.getTableControl().setDomainModelReference(domainModelReference);
try {
SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
} catch (final ClassCastException e) {
e.printStackTrace();
fail("Fails with single reference in domain object");
}
}
@Ignore
@Test
public void testInitializedTableWithoutColumnsEmptySingleReference() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
// setup model
final VView view = VViewFactory.eINSTANCE.createView();
domainElement = view;
final TableControlHandle handle = createInitializedTableWithoutTableColumns();
final VFeaturePathDomainModelReference domainModelReference = VViewFactory.eINSTANCE
.createFeaturePathDomainModelReference();
domainModelReference.setDomainModelEFeature(VViewPackage.eINSTANCE.getView_RootEClass());
handle.getTableControl().setDomainModelReference(domainModelReference);
try {
SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
} catch (final NullPointerException e) {
fail("Fails with empty single reference in domain object");
}
}
@Test
public void testTableWithoutColumns() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
// setup model
final TableControlHandle handle = createInitializedTableWithoutTableColumns();
final Control render = SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
assertTrue(render instanceof Composite);
assertEquals(domainElement.eClass().getEAttributes().size(),
VTableDomainModelReference.class.cast(handle.getTableControl().getDomainModelReference())
.getColumnDomainModelReferences().size());
final Control control = getTable(render);
assertTrue(control instanceof Table);
final Table table = (Table) control;
assertEquals(3, table.getColumnCount());
}
@Test
public void testTableWithoutColumnsWithoutViewServices() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
final TableControlHandle handle = createInitializedTableWithoutTableColumns();
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control render = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (render == null) {
fail();
}
assertTrue(render instanceof Composite);
assertEquals(0, VTableDomainModelReference.class.cast(handle.getTableControl().getDomainModelReference())
.getColumnDomainModelReferences().size());
final Control control = getTable(render);
assertTrue(control instanceof Table);
final Table table = (Table) control;
assertEquals(1, table.getColumnCount());
}
@Test
public void testTableWithTwoColumns() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
// setup model
final TableControlHandle handle = createTableWithTwoTableColumns();
final Control render = SWTViewTestHelper.render(handle.getTableControl(), domainElement, shell);
assertTrue(render instanceof Composite);
final Control control = getTable(render);
assertTrue(control instanceof Table);
final Table table = (Table) control;
assertEquals(2 + 1, table.getColumnCount());
}
@Test
public void testTableWithTwoColumnsWithoutViewServices() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
// setup model
final TableControlHandle handle = createTableWithTwoTableColumns();
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control render = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (render == null) {
fail();
}
assertTrue(render instanceof Composite);
final Control control = getTable(render);
assertTrue(control instanceof Table);
final Table table = (Table) control;
assertEquals(2 + 1, table.getColumnCount());
}
@Test
public void testTableWithTwoColumnsAdd() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
final TableControlHandle handle = createTableWithTwoTableColumns();
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control control = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (control == null) {
fail("No control was rendered");
}
final Table table = (Table) getTable(control);
assertEquals(1, table.getItemCount());
final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
((EClass) domainElement).getESuperTypes().add(eClass);
assertEquals(2, table.getItemCount());
}
@Test
public void testTableWithTwoColumnsRemove() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
final TableControlHandle handle = createTableWithTwoTableColumns();
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control control = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (control == null) {
fail("No control was rendered");
}
final Table table = (Table) getTable(control);
assertEquals(1, table.getItemCount());
final EClass eClass = ((EClass) domainElement).getESuperTypes().get(0);
((EClass) domainElement).getESuperTypes().remove(eClass);
assertEquals(0, table.getItemCount());
}
@Test
public void testTableWithTwoColumnsClear() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
((EClass) domainElement).getESuperTypes().add(eClass);
final TableControlHandle handle = createTableWithTwoTableColumns();
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control control = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (control == null) {
fail("No control was rendered");
}
final Table table = (Table) getTable(control);
assertEquals(2, table.getItemCount());
((EClass) domainElement).getESuperTypes().clear();
assertEquals(0, table.getItemCount());
}
@Test
public void testPanelTableWithTwoColumns() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
((EClass) domainElement).getESuperTypes().add(eClass);
final TableControlHandle handle = createTableWithTwoTableColumns();
handle.getTableControl().setDetailEditing(DetailEditing.WITH_PANEL);
handle.getTableControl().setDetailView(createDetailView());
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(
handle.getTableControl(),
new ViewModelContextWithoutServices(handle.getTableControl()));
final Control render = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
final Control control = Composite.class.cast(render).getChildren()[0];
if (control == null) {
fail("No control was rendered");
}
final Composite controlComposite = (Composite) ((Composite) control).getChildren()[1];
final Composite tableComposite = (Composite) controlComposite.getChildren()[0];
final Table table = (Table) tableComposite.getChildren()[0];
final ScrolledComposite scrolledComposite = (ScrolledComposite) controlComposite.getChildren()[1];
final Composite parentForECPView = (Composite) scrolledComposite.getChildren()[0];
assertEquals(2, table.getItemCount());
final TableViewer tableViewer = getTableViewerFromRenderer(tableRenderer);
// no initial selection
assertEquals(0, parentForECPView.getChildren().length);
// single selection
tableViewer.setSelection(new StructuredSelection(table.getItem(0).getData()));
assertEquals(1, parentForECPView.getChildren().length);
final Composite viewComposite = (Composite) parentForECPView.getChildren()[0];
final Composite detailComposite = (Composite) viewComposite.getChildren()[0];
assertEquals(6, detailComposite.getChildren().length);
// multi selection
tableViewer.setSelection(new StructuredSelection(new Object[] { table.getItem(0).getData(),
table.getItem(1).getData() }));
assertEquals(0, parentForECPView.getChildren().length);
// select again
tableViewer.setSelection(new StructuredSelection(table.getItem(0).getData()));
assertEquals(1, parentForECPView.getChildren().length);
// no selection
tableViewer.setSelection(new StructuredSelection());
assertEquals(0, parentForECPView.getChildren().length);
}
@Test
public void testTableSorting() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
// domain
((EClass) domainElement).getESuperTypes().clear();
final EClass class1 = createEClass("a", "b");
final EClass class2 = createEClass("b", "c");
final EClass class3 = createEClass("c", "a");
((EClass) domainElement).getESuperTypes().add(class1);
((EClass) domainElement).getESuperTypes().add(class2);
((EClass) domainElement).getESuperTypes().add(class3);
// table control
final VTableControl tableControl = createTableControl();
final VTableDomainModelReference tableDMR = (VTableDomainModelReference) tableControl.getDomainModelReference();
tableDMR.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_ESuperTypes());
tableDMR.getColumnDomainModelReferences().add(createDMR(EcorePackage.eINSTANCE.getENamedElement_Name()));
tableDMR.getColumnDomainModelReferences().add(
createDMR(EcorePackage.eINSTANCE.getEClassifier_InstanceClassName()));
// render
final AbstractSWTRenderer<VElement> tableRenderer = rendererFactory.getRendererInstance(tableControl,
new ViewModelContextWithoutServices(tableControl));
final Control control = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (control == null) {
fail("No control was rendered");
}
final Table table = SWTTestUtil.findControl(control, 0, Table.class);
assertTableItemOrder(table, class1, class2, class3);
// column 0 is validation column
// select column 1
// up
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
// down
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class3, class2, class1);
// none
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
// select column 2
// up
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class3, class1, class2);
// down
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class2, class1, class3);
// none
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
}
@Test
public void testTableSortingWithCellEditor() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
EMFFormsNoRendererException {
// domain
((EClass) domainElement).getESuperTypes().clear();
final EClass class1 = createEClass("a", "b");
final EClass class2 = createEClass("b", "c");
final EClass class3 = createEClass("c", "a");
((EClass) domainElement).getESuperTypes().add(class1);
((EClass) domainElement).getESuperTypes().add(class2);
((EClass) domainElement).getESuperTypes().add(class3);
// table control
final VTableControl tableControl = createTableControl();
final VTableDomainModelReference tableDMR = (VTableDomainModelReference) tableControl.getDomainModelReference();
tableDMR.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_ESuperTypes());
tableDMR.getColumnDomainModelReferences().add(createDMR(EcorePackage.eINSTANCE.getENamedElement_Name()));
tableDMR.getColumnDomainModelReferences().add(
createDMR(EcorePackage.eINSTANCE.getEClassifier_InstanceClassName()));
// render
final TableControlSWTRenderer tableRenderer = createRendererInstanceWithCustomCellEditor(tableControl);
final Control control = tableRenderer.render(new SWTGridCell(0, 0, tableRenderer), shell);
if (control == null) {
fail("No control was rendered");
}
final Table table = SWTTestUtil.findControl(control, 0, Table.class);
assertTableItemOrder(table, class1, class2, class3);
// column 0 is validation column
// select column 1
// up
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class3, class2, class1);
// down
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
// none
SWTTestUtil.selectWidget(table.getColumns()[1]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
// select column 2
// up
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class3, class1, class2);
// down
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class2, class1, class3);
// none
SWTTestUtil.selectWidget(table.getColumns()[2]);
SWTTestUtil.waitForUIThread();
assertTableItemOrder(table, class1, class2, class3);
}
private TableControlSWTRenderer createRendererInstanceWithCustomCellEditor(final VTableControl tableControl)
throws EMFFormsNoRendererException {
final ViewModelContextWithoutServices viewModelContext = new ViewModelContextWithoutServices(tableControl);
final EMFFormsContextProvider contextProvider = viewModelContext.getService(EMFFormsContextProvider.class);
final IEclipseContext eclipseContext = contextProvider.getContext();
final TableControlSWTRenderer tableControlSWTRenderer = new TableControlSWTRenderer(
tableControl,
viewModelContext,
eclipseContext.get(ReportService.class),
eclipseContext.get(EMFFormsDatabindingEMF.class),
eclipseContext.get(EMFFormsLabelProvider.class),
eclipseContext.get(VTViewTemplateProvider.class),
eclipseContext.get(ImageRegistryService.class),
eclipseContext.get(EMFFormsEditSupport.class)) {
@Override
protected CellEditor createCellEditor(EObject tempInstance, EStructuralFeature feature, Table table) {
if (feature == EcorePackage.eINSTANCE.getENamedElement_Name()) {
return new CompareCellEditor(table);
}
return super.createCellEditor(tempInstance, feature, table);
}
};
tableControlSWTRenderer.init();
return tableControlSWTRenderer;
}
private static void assertTableItemOrder(Table table, Object... objects) {
assertEquals(objects.length, table.getItemCount());
final TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
assertSame(objects[i], items[i].getData());
}
}
private static EClass createEClass(String name, String instanceClassName) {
final EClass clazz = EcoreFactory.eINSTANCE.createEClass();
clazz.setName(name);
clazz.setInstanceClassName(instanceClassName);
return clazz;
}
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;
}
private VView createDetailView() {
final VView detailView = VViewFactory.eINSTANCE.createView();
final VControl name = VViewFactory.eINSTANCE.createControl();
final VFeaturePathDomainModelReference nameRef = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
nameRef.setDomainModelEFeature(EcorePackage.eINSTANCE.getENamedElement_Name());
name.setDomainModelReference(nameRef);
detailView.getChildren().add(name);
final VControl abstr = VViewFactory.eINSTANCE.createControl();
final VFeaturePathDomainModelReference abstractRef = VViewFactory.eINSTANCE
.createFeaturePathDomainModelReference();
abstractRef.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_Abstract());
abstr.setDomainModelReference(abstractRef);
detailView.getChildren().add(abstr);
return detailView;
}
private Control getTable(Control render) {
Composite composite = (Composite) render;
composite = (Composite) composite.getChildren()[0];
composite = (Composite) composite.getChildren()[1];
// composite = (Composite) composite.getChildren()[0];
// composite = (Composite) composite.getChildren()[0];
// composite = (Composite) composite.getChildren()[0];
return composite.getChildren()[0];
}
private static TableControlHandle createTableWithTwoTableColumns() {
final TableControlHandle tableControlHandle = createInitializedTableWithoutTableColumns();
final VDomainModelReference tableColumn1 = createTableColumn(EcorePackage.eINSTANCE.getEClass_Abstract());
tableControlHandle.addFirstTableColumn(tableColumn1);
final VDomainModelReference tableColumn2 = createTableColumn(EcorePackage.eINSTANCE.getEClass_Abstract());
tableControlHandle.addSecondTableColumn(tableColumn2);
return tableControlHandle;
}
public static VDomainModelReference createTableColumn(EStructuralFeature feature) {
final VFeaturePathDomainModelReference reference = VViewFactory.eINSTANCE
.createFeaturePathDomainModelReference();
reference.setDomainModelEFeature(feature);
return reference;
}
public static TableControlHandle createInitializedTableWithoutTableColumns() {
final TableControlHandle tableControlHandle = createUninitializedTableWithoutColumns();
final VFeaturePathDomainModelReference domainModelReference = VTableFactory.eINSTANCE
.createTableDomainModelReference();
domainModelReference.setDomainModelEFeature(EcorePackage.eINSTANCE.getEClass_ESuperTypes());
tableControlHandle.getTableControl().setDomainModelReference(domainModelReference);
return tableControlHandle;
}
public static TableControlHandle createUninitializedTableWithoutColumns() {
final VTableControl tableControl = createTableControl();
return new TableControlHandle(tableControl);
}
/**
* @return
*/
private static VTableControl createTableControl() {
final VTableControl tc = VTableFactory.eINSTANCE.createTableControl();
tc.setDomainModelReference(VTableFactory.eINSTANCE.createTableDomainModelReference());
return tc;
}
private TableViewer getTableViewerFromRenderer(AbstractSWTRenderer<VElement> renderer) {
try {
final Method method = TableControlSWTRenderer.class.getDeclaredMethod("getTableViewer");
method.setAccessible(true);
return (TableViewer) method.invoke(renderer);
} catch (final NoSuchMethodException ex) {
fail(ex.getMessage());
} catch (final SecurityException ex) {
fail(ex.getMessage());
} catch (final IllegalAccessException ex) {
fail(ex.getMessage());
} catch (final IllegalArgumentException ex) {
fail(ex.getMessage());
} catch (final InvocationTargetException ex) {
fail(ex.getMessage());
}
return null;
}
/**
* Stub implementation without getting services from ex. point.
*
* @author jfaltermeier
*
*/
private class ViewModelContextWithoutServices implements ViewModelContext {
private final VElement view;
private final EMFFormsContextProvider contextProvider;
@SuppressWarnings("restriction")
ViewModelContextWithoutServices(VElement view) {
this.view = view;
contextProvider = new org.eclipse.emfforms.internal.swt.core.di.EMFFormsContextProviderImpl();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getViewModel()
*/
@Override
public VElement getViewModel() {
return view;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getDomainModel()
*/
@Override
public EObject getDomainModel() {
return domainElement;
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#registerViewChangeListener(org.eclipse.emf.ecp.view.spi.model.ModelChangeListener)
*/
@Override
public void registerViewChangeListener(ModelChangeListener modelChangeListener) {
// not needed
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#unregisterViewChangeListener(org.eclipse.emf.ecp.view.spi.model.ModelChangeListener)
*/
@Override
public void unregisterViewChangeListener(ModelChangeListener modelChangeListener) {
// not needed
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#registerDomainChangeListener(org.eclipse.emf.ecp.view.spi.model.ModelChangeListener)
*/
@Override
public void registerDomainChangeListener(ModelChangeListener modelChangeListener) {
// not needed
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#unregisterDomainChangeListener(org.eclipse.emf.ecp.view.spi.model.ModelChangeListener)
*/
@Override
public void unregisterDomainChangeListener(ModelChangeListener modelChangeListener) {
// not needed
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#dispose()
*/
@Override
public void dispose() {
// not needed
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#hasService(java.lang.Class)
*/
@Override
public <T> boolean hasService(Class<T> serviceType) {
if (EMFFormsContextProvider.class.equals(serviceType)) {
return true;
}
return false;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getService(java.lang.Class)
*/
@SuppressWarnings("unchecked")
@Override
public <T> T getService(Class<T> serviceType) {
if (EMFFormsContextProvider.class.equals(serviceType)) {
return (T) contextProvider;
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getControlsFor(org.eclipse.emf.ecore.EStructuralFeature.Setting)
* @deprecated
*/
@Deprecated
@Override
public Set<VControl> getControlsFor(Setting setting) {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getControlsFor(org.eclipse.emf.ecp.common.spi.UniqueSetting)
* @deprecated
*/
@Deprecated
@Override
public Set<VElement> getControlsFor(UniqueSetting setting) {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getContextValue(java.lang.String)
*/
@Override
public Object getContextValue(String key) {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#putContextValue(java.lang.String,
* java.lang.Object)
*/
@Override
public void putContextValue(String key, Object value) {
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#registerDisposeListener(org.eclipse.emf.ecp.view.spi.context.ViewModelContextDisposeListener)
*/
@Override
public void registerDisposeListener(ViewModelContextDisposeListener listener) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#addContextUser(java.lang.Object)
*/
@Override
public void addContextUser(Object user) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#removeContextUser(java.lang.Object)
*/
@Override
public void removeContextUser(Object user) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getChildContext(org.eclipse.emf.ecore.EObject,
* org.eclipse.emf.ecp.view.spi.model.VElement, org.eclipse.emf.ecp.view.spi.model.VView,
* org.eclipse.emf.ecp.view.spi.context.ViewModelService[])
*/
@Override
public ViewModelContext getChildContext(EObject eObject, VElement parent, VView vView,
ViewModelService... viewModelServices) {
// TODO Auto-generated method stub
final ViewModelContextWithoutServices vmcws = new ViewModelContextWithoutServices(vView);
return vmcws;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext#registerEMFFormsContextListener(org.eclipse.emfforms.spi.core.services.view.EMFFormsContextListener)
*/
@Override
public void registerEMFFormsContextListener(EMFFormsContextListener contextListener) {
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext#unregisterEMFFormsContextListener(org.eclipse.emfforms.spi.core.services.view.EMFFormsContextListener)
*/
@Override
public void unregisterEMFFormsContextListener(EMFFormsContextListener contextListener) {
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getParentContext()
*/
@Override
public ViewModelContext getParentContext() {
// TODO Auto-generated method stub
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext#changeDomainModel(org.eclipse.emf.ecore.EObject)
*/
@Override
public void changeDomainModel(EObject newDomainModel) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext#registerRootDomainModelChangeListener(org.eclipse.emfforms.spi.core.services.view.RootDomainModelChangeListener)
*/
@Override
public void registerRootDomainModelChangeListener(RootDomainModelChangeListener rootDomainModelChangeListener) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.core.services.view.EMFFormsViewContext#unregisterRootDomainModelChangeListener(org.eclipse.emfforms.spi.core.services.view.RootDomainModelChangeListener)
*/
@Override
public void unregisterRootDomainModelChangeListener(
RootDomainModelChangeListener rootDomainModelChangeListener) {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.ecp.view.spi.context.ViewModelContext#getParentVElement()
*/
@Override
public VElement getParentVElement() {
// TODO Auto-generated method stub
return null;
}
}
private static class PrintStreamWrapper extends PrintStream {
private final PrintStream printStream;
PrintStreamWrapper(PrintStream printStream) {
super(new ByteArrayOutputStream());
this.printStream = printStream;
}
/**
* {@inheritDoc}
*
* @see java.io.PrintStream#print(java.lang.String)
*/
@Override
public void print(String s) {
log = log.concat("\n" + s);
printStream.print(s + "\n");
}
}
private static class CompareCellEditor extends StringCellEditor implements ECPCellEditorComparator {
CompareCellEditor(Table table) {
super(table);
}
@Override
public int compare(Object e1, Object e2, int direction) {
final String value1 = String.class.cast(e1);
final String value2 = String.class.cast(e2);
int result;
if (value1 == null) {
result = 1;
} else if (value2 == null) {
result = -1;
} else {
result = value1.toString().compareTo(value2.toString()) * -1;// we flip the oder in our custom
// comparator
}
// If descending order, flip the direction
if (direction == 2) {
result = -result;
}
return result;
}
}
}