Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » GMF (Graphical Modeling Framework) » Re: problem customizing edit plugin, PropertyDescriptor
Re: problem customizing edit plugin, PropertyDescriptor [message #217011] Sat, 31 January 2009 14:21 Go to next message
Eclipse UserFriend
Originally posted by: jgreen.upb.de

This is a multi-part message in MIME format.
--------------010507070702060004050302
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Okay, could this be a GMF problem?
I observe that the property is set twice: First the correct value is set, and then it is immediately set to another
value. This happens when I use the properties view of the GMF editor. When I use the tree editor's properties view,
everything is fine!
I attached the two stacks of the first and the second (erroneous) call of the objects set method. Here is where the
second differs from the first

....
PropertySheetViewer.applyEditorValue() line: 258
PropertySheetViewer.setInput(Object) line: 963
PropertySheetPage.refresh() line: 471
TggPropertySection(AdvancedPropertySection).refresh() line: 188
AdvancedPropertySection$1.run() line: 215
RunnableLock.run() line: 35
UISynchronizer(Synchronizer).runAsyncMessages(boolean) line: 133
Display.runAsyncMessages(boolean) line: 3800
Display.readAndDispatch() line: 3425
....

I don't understand why GMF would be interfering here. Any why the second call of the set method only occurs when I
type/filter the given choices (e.g. "EPack..." to find the class EPackage more quickly). Maybe anyone of you has an
idea? Otherwise, I'll dig deeper myself when I find the time.

Thanks

Joel


Ed Merks wrote:
> Joel,
>
> As Jim suggests, we do this type of filtering all over the place (do
> something to returned a reduced set of choices) and have never seen this
> type of problem. The filtering as you type is completely orthoganal to
> the set of choices originally returned, so certainly the problem can't
> be in your properly descriptor, I don't think. All I can do is suggest
> you set a breakpoint where the value is being set, and then look down
> the stack to see where something has gone wrong in the process. That's
> would I'd need to do, if I could reproduce the problem, which I can't...
>
>
> Joel Greenyer wrote:
>> Hi Jim,
>> here's my changed addPropertyDescriptor method from the
>> NodeItemProvider class.
>> Nodes may be inside a graph pattern. One of these graph pattern may be
>> a domain graph pattern. A domain graph pattern is associated with a
>> typed model, which references a list of packages. I want an EClass of
>> each of those packages to be in the list of choices. In case that
>> something along this way is null (because the model is not
>> consistent), I catch the NullPointerException and return an empty list.
>>
>> What do you do different?
>> Thanks for helping
>>
>> Joel
>>
>>
>> /**
>> * This adds a property descriptor for the EType feature.
>> * <!-- begin-user-doc -->
>> * <!-- end-user-doc -->
>> * @generated NOT
>> */
>> protected void addETypePropertyDescriptor(Object object) {
>> itemPropertyDescriptors.add
>> (
>>
>> new ItemPropertyDescriptor(
>>
>> ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFa ctory(),
>> getResourceLocator(),
>> getString("_UI_ETypedElement_eType_feature"),
>> getString("_UI_PropertyDescriptor_description",
>> "_UI_ETypedElement_eType_feature", "_UI_ETypedElement_type"),
>> EcorePackage.Literals.ETYPED_ELEMENT__ETYPE,
>> true,
>> null,
>> null,
>> null){
>>
>>
>> public Collection getChoiceOfValues(Object object) {
>>
>> Node node = (Node) object;
>> try {
>> for (GraphPattern graphPattern : node.getGraphPattern()) {
>>
>> if (graphPattern instanceof DomainGraphPattern){
>> TypedModel typedModel = ((DomainGraphPattern)
>> graphPattern).getTypedModel();
>> EList<EClass> eClassList = new BasicEList<EClass>();
>> for (EPackage usedPackage : typedModel.getUsedPackage()) {
>> for (EClassifier eClassifier : usedPackage.getEClassifiers()) {
>> if (eClassifier instanceof EClass){
>> eClassList.add((EClass) eClassifier);
>> }
>> }
>> }
>> return eClassList;
>> }
>> }
>>
>> } catch (NullPointerException e) {
>> //nothing to worry about there. May occur if the necessary
>> references have not been set up properly.
>> }
>> return Collections.EMPTY_LIST;
>> }
>>
>> }
>> );
>> }
>>
>>
>>
>> Jim van Dam wrote:
>>> Hi Joel,
>>>
>>> > My approach was overriding getChoiceOfValues(Object).
>>> > So, my question is whether my approach to customize the
>>> > ItemPropertyDescriptor is correct?
>>> This is what I do all the time (generated based on custom templates
>>> or genmodel annotations) and everything works fine for us including
>>> typing.
>>> Could you show us sourcecode?
>>>
>>> Regards,
>>>
>>> Jim
>>>
>>> Joel Greenyer wrote:
>>>> Hi Ed,
>>>> mmh, I was clear :(
>>>>
>>>> Alright... I have elements that are typed by an EClass. For the type
>>>> feature, the drop-down in the properties view gives me the choice of
>>>> all EClasses that are reachable in the current ResourceSet. But I
>>>> want to narrow down this choice, since one may only select EClasses
>>>> from certain EPackages (depending on the element's context). My
>>>> approach was overriding getChoiceOfValues(Object). This works fine
>>>> except for this typeing/filtering functionality: I can type
>>>> "EPack...", then the EPackage class appears at the top. However,
>>>> when I hit enter, the EPackage is not selected, but I find another
>>>> element being selected instead.
>>>> So, my question is whether my approach to customize the
>>>> ItemPropertyDescriptor is correct?
>>>>
>>>> Thanks
>>>> Joel
>>>>
>>>> Ed Merks wrote:
>>>>> Joel,
>>>>>
>>>>> Comments below.
>>>>>
>>>>> Joel Greenyer wrote:
>>>>>> Hi,
>>>>>> in the properties view, when I want to select an element from a
>>>>>> large list of choices, it is very helpful that I can start typing,
>>>>>> e.g. "EPac..." to find the element "EPackage" more quickly.
>>>>>> In my edit plug-in, I have customized an addXXXPropertyDecriptor
>>>>>> method to filter out values which are unnecessary in a particular
>>>>>> context. When still large Lists of choices remain, I start typing
>>>>>> "EPac..." and select the EPackage, but then I end up having
>>>>>> another element selected.
>>>>> I don't get this part about another element being selected. The
>>>>> first thing in the filtered result is selected and hitting enter
>>>>> should choose it...
>>>>>>
>>>>>> Any idea how to avoid this?
>>>>>> Thanks for helping
>>>>>>
>>>>>> Joel


--------------010507070702060004050302
Content-Type: text/plain;
name="stack1.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="stack1.txt"

NodeImpl.setEType(EClassifier) line: 419
NodeImpl(ETypedElementImpl).eSet(int, Object) line: 596
NodeImpl(VariableImpl).eSet(int, Object) line: 441
NodeImpl.eSet(int, Object) line: 542
NodeImpl(BasicEObjectImpl).eSet(EStructuralFeature, Object) line: 1071
SetCommand.doExecute() line: 721
SetCommand(AbstractOverrideableCommand).execute() line: 131
EMFCommandOperation.doExecute(IProgressMonitor, IAdaptable) line: 119
EMFCommandOperation(AbstractEMFOperation).execute(IProgressM onitor, IAdaptable) line: 169
DefaultOperationHistory.execute(IUndoableOperation, IProgressMonitor, IAdaptable) line: 511
WorkspaceCommandStackImpl.doExecute(Command, Map<?,?>) line: 201
WorkspaceCommandStackImpl(AbstractTransactionalCommandStack) .execute(Command, Map<?,?>) line: 165
WorkspaceCommandStackImpl(AbstractTransactionalCommandStack) .execute(Command) line: 219
NodeItemProvider$1(ItemPropertyDescriptor).setPropertyValue( Object, Object) line: 1427
PropertySource.setPropertyValue(Object, Object) line: 116
SetModelPropertyValueCommand.doExecuteWithResult(IProgressMo nitor, IAdaptable) line: 104
SetModelPropertyValueCommand(AbstractTransactionalCommand).d oExecute(IProgressMonitor, IAdaptable) line: 247
SetModelPropertyValueCommand(AbstractEMFOperation).execute(I ProgressMonitor, IAdaptable) line: 169
CompositeTransactionalCommand(CompositeEMFOperation).doExecu te(IProgressMonitor, IAdaptable) line: 216
CompositeTransactionalCommand(AbstractEMFOperation).execute( IProgressMonitor, IAdaptable) line: 169
TriggeredOperations.execute(IProgressMonitor, IAdaptable) line: 165
DefaultOperationHistory.execute(IUndoableOperation, IProgressMonitor, IAdaptable) line: 511
UndoableModelPropertySheetEntry.valueChanged(UndoableModelPr opertySheetEntry, ICommand) line: 244
UndoableModelPropertySheetEntry.setValue(Object) line: 199
UndoableModelPropertySheetEntry.applyEditorValue() line: 127
CellEditor$1.run() line: 333
SafeRunner.run(ISafeRunnable) line: 37
Platform.run(ISafeRunnable) line: 880
JFaceUtil$1.run(ISafeRunnable) line: 48
SafeRunnable.run(ISafeRunnable) line: 175
ExtendedComboBoxCellEditor(CellEditor).fireApplyEditorValue( ) line: 331
ExtendedComboBoxCellEditor(ComboBoxCellEditor).applyEditorVa lueAndDeactivate() line: 273
ComboBoxCellEditor$2.widgetDefaultSelected(SelectionEvent) line: 151
TypedListener.handleEvent(Event) line: 113
EventTable.sendEvent(Event) line: 84
CCombo(Widget).sendEvent(Event) line: 1003
CCombo(Widget).sendEvent(int, Event, boolean) line: 1027
CCombo(Widget).sendEvent(int, Event) line: 1012
CCombo(Widget).notifyListeners(int, Event) line: 770
CCombo.listEvent(Event) line: 1071
CCombo$1.handleEvent(Event) line: 110
EventTable.sendEvent(Event) line: 84
List(Widget).sendEvent(Event) line: 1003
List(Widget).sendEvent(int, Event, boolean) line: 1027
List(Widget).sendEvent(int, Event) line: 1012
List(Widget).sendKeyEvent(int, int, int, int, Event) line: 1040
List(Widget).sendKeyEvent(int, int, int, int) line: 1036
List(Widget).wmChar(int, int, int) line: 1352
List(Control).WM_CHAR(int, int) line: 3894
List.WM_CHAR(int, int) line: 1528
List(Control).windowProc(int, int, int, int) line: 3787
Display.windowProc(int, int, int, int) line: 4528
OS.DispatchMessageW(MSG) line: not available [native method]
OS.DispatchMessage(MSG) line: 2371
Display.readAndDispatch() line: 3420
Workbench.runEventLoop(Window$IExceptionHandler, Display) line: 2382
Workbench.runUI() line: 2346
Workbench.access$4(Workbench) line: 2198
Workbench$5.run() line: 493
Realm.runWithDefault(Realm, Runnable) line: 288
Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 488
PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 149
IDEApplication.start(IApplicationContext) line: 113
EclipseAppHandle.run(Object) line: 193
EclipseAppLauncher.runApplication(Object) line: 110
EclipseAppLauncher.start(Object) line: 79
EclipseStarter.run(Object) line: 386
EclipseStarter.run(String[], Runnable) line: 179
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
Main.invokeFramework(String[], URL[]) line: 549
Main.basicRun(String[]) line: 504
Main.run(String[]) line: 1236
Main.main(String[]) line: 1212

--------------010507070702060004050302
Content-Type: text/plain;
name="stack2.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="stack2.txt"

NodeImpl.setEType(EClassifier) line: 419
NodeImpl(ETypedElementImpl).eSet(int, Object) line: 596
NodeImpl(VariableImpl).eSet(int, Object) line: 441
NodeImpl.eSet(int, Object) line: 542
NodeImpl(BasicEObjectImpl).eSet(EStructuralFeature, Object) line: 1071
SetCommand.doExecute() line: 721
SetCommand(AbstractOverrideableCommand).execute() line: 131
EMFCommandOperation.doExecute(IProgressMonitor, IAdaptable) line: 119
EMFCommandOperation(AbstractEMFOperation).execute(IProgressM onitor, IAdaptable) line: 169
DefaultOperationHistory.execute(IUndoableOperation, IProgressMonitor, IAdaptable) line: 511
WorkspaceCommandStackImpl.doExecute(Command, Map<?,?>) line: 201
WorkspaceCommandStackImpl(AbstractTransactionalCommandStack) .execute(Command, Map<?,?>) line: 165
WorkspaceCommandStackImpl(AbstractTransactionalCommandStack) .execute(Command) line: 219
NodeItemProvider$1(ItemPropertyDescriptor).setPropertyValue( Object, Object) line: 1427
PropertySource.setPropertyValue(Object, Object) line: 116
SetModelPropertyValueCommand.doExecuteWithResult(IProgressMo nitor, IAdaptable) line: 104
SetModelPropertyValueCommand(AbstractTransactionalCommand).d oExecute(IProgressMonitor, IAdaptable) line: 247
SetModelPropertyValueCommand(AbstractEMFOperation).execute(I ProgressMonitor, IAdaptable) line: 169
CompositeTransactionalCommand(CompositeEMFOperation).doExecu te(IProgressMonitor, IAdaptable) line: 216
CompositeTransactionalCommand(AbstractEMFOperation).execute( IProgressMonitor, IAdaptable) line: 169
TriggeredOperations.execute(IProgressMonitor, IAdaptable) line: 165
DefaultOperationHistory.execute(IUndoableOperation, IProgressMonitor, IAdaptable) line: 511
UndoableModelPropertySheetEntry.valueChanged(UndoableModelPr opertySheetEntry, ICommand) line: 244
UndoableModelPropertySheetEntry.setValue(Object) line: 199
UndoableModelPropertySheetEntry.applyEditorValue() line: 127
PropertySheetViewer.applyEditorValue() line: 258
PropertySheetViewer.setInput(Object) line: 963
PropertySheetPage.refresh() line: 471
TggPropertySection(AdvancedPropertySection).refresh() line: 188
AdvancedPropertySection$1.run() line: 215
RunnableLock.run() line: 35
UISynchronizer(Synchronizer).runAsyncMessages(boolean) line: 133
Display.runAsyncMessages(boolean) line: 3800
Display.readAndDispatch() line: 3425
Workbench.runEventLoop(Window$IExceptionHandler, Display) line: 2382
Workbench.runUI() line: 2346
Workbench.access$4(Workbench) line: 2198
Workbench$5.run() line: 493
Realm.runWithDefault(Realm, Runnable) line: 288
Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 488
PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 149
IDEApplication.start(IApplicationContext) line: 113
EclipseAppHandle.run(Object) line: 193
EclipseAppLauncher.runApplication(Object) line: 110
EclipseAppLauncher.start(Object) line: 79
EclipseStarter.run(Object) line: 386
EclipseStarter.run(String[], Runnable) line: 179
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
Main.invokeFramework(String[], URL[]) line: 549
Main.basicRun(String[]) line: 504
Main.run(String[]) line: 1236
Main.main(String[]) line: 1212

--------------010507070702060004050302--
Re: problem customizing edit plugin, PropertyDescriptor [message #217975 is a reply to message #217011] Mon, 09 February 2009 15:12 Go to previous message
Jan Rieke is currently offline Jan RiekeFriend
Messages: 2
Registered: July 2009
Junior Member
Joel Greenyer schrieb:
> Okay, could this be a GMF problem?

In case someone still reads this thread:

I think this is caused by bugs 183039 and 193757 (see
https://bugs.eclipse.org/bugs/show_bug.cgi?id=183039,
https://bugs.eclipse.org/bugs/show_bug.cgi?id=193757).

Overriding getChoiceOfValues(Object) seems to have nothing to do with
it. It's a general GMF bug, and I think caused by a reset of the typing
filter during the first set() of the new value. The subsequent
ExtendedComboBoxCellEditor.doGetValue() call then returns a wrong value,
because it's using a filtered-index-based get() on the unfiltered list.

Regards,
Jan


> I observe that the property is set twice: First the correct value is
> set, and then it is immediately set to another value. This happens when
> I use the properties view of the GMF editor. When I use the tree
> editor's properties view, everything is fine!
> I attached the two stacks of the first and the second (erroneous) call
> of the objects set method. Here is where the second differs from the first
>
> ...
> PropertySheetViewer.applyEditorValue() line: 258
> PropertySheetViewer.setInput(Object) line: 963
> PropertySheetPage.refresh() line: 471
> TggPropertySection(AdvancedPropertySection).refresh() line: 188
> AdvancedPropertySection$1.run() line: 215
> RunnableLock.run() line: 35
> UISynchronizer(Synchronizer).runAsyncMessages(boolean) line: 133
> Display.runAsyncMessages(boolean) line: 3800
> Display.readAndDispatch() line: 3425
> ...
>
> I don't understand why GMF would be interfering here. Any why the second
> call of the set method only occurs when I type/filter the given choices
> (e.g. "EPack..." to find the class EPackage more quickly). Maybe anyone
> of you has an idea? Otherwise, I'll dig deeper myself when I find the time.
>
> Thanks
>
> Joel
Previous Topic:Creating a child of the same size as its compartment
Next Topic:Use of ChoiceFormat in View/Edit Pattern on Labels
Goto Forum:
  


Current Time: Fri Apr 19 21:09:57 GMT 2024

Powered by FUDForum. Page generated in 0.03480 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top