| Home » Modeling » GMF (Graphical Modeling Framework) » Re: problem customizing edit plugin, PropertyDescriptor
 Goto Forum:| 
| Re: problem customizing edit plugin, PropertyDescriptor [message #217011] | Sat, 31 January 2009 09:21  |  | 
| Eclipse User  |  |  |  |  | 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 10:12  |  | 
| Eclipse User  |  |  |  |  | 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
 |  |  |  | 
 
 
 Current Time: Fri Oct 31 10:27:20 EDT 2025 
 Powered by FUDForum . Page generated in 0.03436 seconds |