[EMF Forms] Changing visible columns and their order in a table [message #1790712] |
Thu, 14 June 2018 18:10 |
Nikola Veber Messages: 31 Registered: December 2017 |
Member |
|
|
Hi,
I have been trying to allow users to configure some of the tables in my app.
In the simple example, I am implementing custom table renderer, extending TableControlSWTRenderer.
I have tried following, which worked in a static example:
VTableDomainModelReference domainModelReference = (VTableDomainModelReference)((VTableControl)getVElement()).getDomainModelReference();
domainModelReference.getColumnDomainModelReferences().clear();
VFeaturePathDomainModelReference colRef2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
colRef2.setDomainModelEFeature(Elements2Package.Literals.FIELD__FIELD_NAME);
domainModelReference.getColumnDomainModelReferences().add(colRef2);
When I make the setting dynamic, the implementation stops working producing exceptions like:
org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException: The resolved Object FieldNew doesn't contain the feature xyz.
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.ClassCastException: org.eclipse.emf.ecore.impl.EAttributeImpl cannot be cast to org.eclipse.emf.ecore.EReference)
org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException: The resolved Object FieldNew doesn't contain the feature alias.
By dynamic, I mean that the list of provided EAttributes (feature paths as well, worked in the static case) changes between renderings.
After a while, I realized that there were still columns defined in the viewmodel, which could not be rendered, as the DomainModelReferences list has been cleared.
After removing all column configurations from the viewmodel, the problem remains similar, with exceptions like
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.ClassCastException: elements2.impl.ColConfigImpl cannot be cast to org.eclipse.emf.ecore.EStructuralFeature$Setting)
ColConfigImpl being the class containing the feature refenced via the feature path.
My guess is that touching the domain model references is not the way to go, and one should rather change the viewmodel itself? (how?!)
I would be grateful for any tips!
Best regards
Nikola
|
|
|
|
Re: [EMF Forms] Changing visible columns and their order in a table [message #1790738 is a reply to message #1790737] |
Fri, 15 June 2018 08:45 |
Nikola Veber Messages: 31 Registered: December 2017 |
Member |
|
|
Hi Eugen,
I have tried changing them in constructor, after calling super constructor, before calling super constructor (super(tesChange(vElement), viewContext,...), as well as by overriding the render method, to make changes before calling "return super.render(cell, parent); (in TableControlSWTRenderer)".
I am using the renderer in an extension of Generic Editor. Settings are made in Eclipse Preferences, where I keep a map of columns (EAttributes for DomainModelEFeature and lists of EReferences for DomainModelEReferencePath).
Rendering is trigered by the navigation in the tree, next time an object of that type is selected.
(Table Renderer is applied to a table defined in a ViewModel for one type, so the rendering is triggered by the framework / GenericEditor).
Thanks,
Nikola
P.S.
I tried just for fun to shuffle the list, doing
domainModelReference.getColumnDomainModelReferences().move(0, domainModelReference.getColumnDomainModelReferences().size()-1);
producing following stack trace (which may show in more detail how the rendering is triggered)
!ENTRY org.eclipse.ui 4 0 2018-06-15 10:33:18.160
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.ClassCastException: elements2.impl.ColConfigImpl cannot be cast to org.eclipse.emf.ecore.EStructuralFeature$Setting)
at org.eclipse.swt.SWT.error(SWT.java:4491)
at org.eclipse.swt.SWT.error(SWT.java:4406)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:138)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4155)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3772)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1127)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:654)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:598)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
at org.eclipse.equinox.launcher.Main.run(Main.java:1515)
at org.eclipse.equinox.launcher.Main.main(Main.java:1488)
Caused by: java.lang.ClassCastException: elements2.impl.ColConfigImpl cannot be cast to org.eclipse.emf.ecore.EStructuralFeature$Setting
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eSetting(BasicEObjectImpl.java:1596)
at org.eclipse.emfforms.core.services.databinding.featurepath.FeaturePathDomainModelReferenceConverter.getSetting(FeaturePathDomainModelReferenceConverter.java:173)
at org.eclipse.emfforms.internal.core.services.databinding.EMFFormsDatabindingImpl.getSetting(EMFFormsDatabindingImpl.java:257)
at org.eclipse.emfforms.internal.core.services.mappingprovider.table.EMFFormsMappingProviderTable.getMappingFor(EMFFormsMappingProviderTable.java:94)
at org.eclipse.emfforms.internal.core.services.mappingprovider.EMFFormsMappingProviderManagerImpl.getAllSettingsFor(EMFFormsMappingProviderManagerImpl.java:101)
at org.eclipse.emfforms.internal.core.services.controlmapper.SettingToControlMapperImpl.updateControlMapping(SettingToControlMapperImpl.java:188)
at org.eclipse.emfforms.internal.core.services.controlmapper.SettingToControlMapperImpl.checkAndUpdateSettingToControlMapping(SettingToControlMapperImpl.java:303)
at org.eclipse.emfforms.internal.core.services.controlmapper.SettingToControlMapperImpl.vControlAdded(SettingToControlMapperImpl.java:274)
at org.eclipse.emfforms.internal.core.services.controlmapper.SettingToControlMapperImpl$ModelChangeAddRemoveListenerImplementation.notifyAdd(SettingToControlMapperImpl.java:67)
at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl$ViewModelContentAdapter.addAdapter(ViewModelContextImpl.java:634)
at org.eclipse.emf.ecore.util.EContentAdapter.setTarget(EContentAdapter.java:219)
at org.eclipse.emf.ecore.util.EContentAdapter.setTarget(EContentAdapter.java:182)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl$EAdapterList.didAdd(BasicNotifierImpl.java:121)
at org.eclipse.emf.common.util.BasicEList.addUnique(BasicEList.java:419)
at org.eclipse.emf.common.util.AbstractEList.add(AbstractEList.java:303)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl$EAdapterList.add(BasicNotifierImpl.java:193)
at org.eclipse.emf.ecore.util.EContentAdapter.addAdapter(EContentAdapter.java:349)
at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl$ViewModelContentAdapter.addAdapter(ViewModelContextImpl.java:627)
at org.eclipse.emf.ecore.util.EContentAdapter.setTarget(EContentAdapter.java:219)
at org.eclipse.emf.ecore.util.EContentAdapter.setTarget(EContentAdapter.java:182)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl$EAdapterList.didAdd(BasicNotifierImpl.java:121)
at org.eclipse.emf.common.util.BasicEList.addUnique(BasicEList.java:419)
at org.eclipse.emf.common.util.AbstractEList.add(AbstractEList.java:303)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl$EAdapterList.add(BasicNotifierImpl.java:193)
at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl.instantiate(ViewModelContextImpl.java:281)
at org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl.<init>(ViewModelContextImpl.java:205)
at org.eclipse.emf.ecp.view.spi.context.ViewModelContextFactory.createViewModelContext(ViewModelContextFactory.java:55)
at org.eclipse.emfforms.spi.swt.treemasterdetail.TreeMasterDetailComposite$UpdateDetailRunnable.run(TreeMasterDetailComposite.java:606)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
... 24 more
[Updated on: Fri, 15 June 2018 08:49] Report message to a moderator
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.02048 seconds