Hi,
I debugged the problem with the double insertion when using
auto-completion with the ScriptShell, found the issue and boy, it's
a mean one ;-)
First off, Vidura's code works fine. Unfortunately so does the
original...
The ContentProposalModifer class subclasses ContentProposalAdapter
and passes the required parameters to the parent's constructor.
These parameters include among others:
- The ScriptShell's input
- The IContentProposalProvider (the
CompletionProviderDispatcher)
- The activation KeyStroke
- The auto-activation characters.
What happens now, is that both the new implementation as well as
the original listen for the keystrokes in the ScriptShell. Since
both of them will handle the same key inputs they will also
calculate the same proposals and insert the same code. It looks
like you are only using one popup, but actually you are using 2
overlapping that just happen to get the same key events
simultaneously.
I did a simple test where I inverted the order of the displayed
proposals for the new implementation:
If you type 'get' and trigger the autocompletion you will see a
popup with 2 suggestions (getModule and getScriptEngine). If you
select the first one the included code will be
'getModuleScriptEngine'. Since one popup has the inverted order it
calculates the string to be included for a different proposal.
I found a quick-and-dirty workaround though:
When calling the parent constructor we must use null for the
keystroke and a hard to get auto-activation character.
If we only give null for the keystroke and an empty array for the
activation characters the parent will auto-trigger and immediately
open a popup. This is also the situation where you can see that
actually 2 popups are opened independently.
To fix this issue it is necessary to also give at least one
auto-activation character. For testing I chose (char) 0xFF and
this seems to fix the problem as long as no character 0xFF
(character, not string) is entered in the ScriptShell.
If both Christian and Vidura are okay with the fix, I can commit
it. If you want another solution I guess we will need some major
(!) refactoring.
Best regards,
Martin