On 10/08/2011 05:41 PM, Pavel Porvatov             wrote: 
            I got your point. What about this solution: 
            If in the compose mode, endCompositoin just sendComposedText             instead of sendCommittedText. 
            
            The patch is attached 
            
                     Could you please explain the fix? May be it removes NPE but it           puzzles me. So if buffer.length() == 0 you invoke           sendCommittedText, right? But sendCommittedText commits           buffer, but buffer is empty. Looks strange... 
          
          BTW: the code like "if (!notInCompositionMode) {" a little bit           difficult to understand =) I'd preffer to avoid two negations           and use "if (notInCompositionMode)" and swap if/else blocks...           
          
          Regards, Pavel 
          
                 Hi Pavel,
        
        Sorry for the confusion. Here is some explanation, please         correct me if I am wrong:
        1. There two modes which is judge from the buffer size: composed         mode when the buffer size is not zero and normal mode when the         buffer size is zero.
             Right
               2. The original code make no difference whether it is in the         composed mode or normal mode. In the normal mode, which buffer         size is zero, it sends the committed text. In the composed mode,         which buffer size is not zero, it also sends the committed code.         And NPE occurred here.
        3. In the patch, I do not change the logic when in the normal         mode. (notInCompositionMode branch)  Why? I guess it is the         logic of "Ends any input composition that may           currently be going on in this context. Depending on the           platform and possibly user preferences, this may commit or           delete uncommitted text. "           from the api spec....
             Yes. But after your change the following code looks strange for        me:
              if (!notInCompositionMode) {
                 ....
              } else {
      >>>>            sendCommittedText();
              }
      So if we are not in composition mode we send something (empty       string actually). Logically we shouldn't send anything (IMO),       because buffer is empty. Why should we do something at all if       endComposition is invoked and we are not in composition mode?
               4. In the patch, the logic in the composed mode is that: if it         is in the composed mode, keep every thing as just composed :-)
             
      I found a new bug (???) in the fix. If you apply the patch, run       the MouseEventTest2 test and follow the instructions from the bug       description NPE will not be thrown, but the JTextArea remains in       composition mode even after endComposition completion.
         
    Right. It seems that we have to do some thing in the jdk :-). Here     it is:
    
    The patch attached is just adding a null check at the beginning of     the mouseClicked method in DefaultCaret. So why the component is     null in the DefaultCaret? That because the caret has already been     deinstalled. It seems to be an order problem of mouse event and the     event which endCompositon sent. The endComposition will exchange the     caret and deinstall the old one. On the other hand, mouse click     event was happening on the old caret. So the component of the old     caret is null now. NPE happens.
    
     
      Regards, Pavel
         
    
    --  Yours Charles    ">

(original) (raw)

On 10/14/2011 04:06 PM, Pavel Porvatov wrote:
Hi Charles,
On 10/11/2011 05:50 PM, Pavel Porvatov wrote:
Hi

Charles,

On 10/08/2011 05:41 PM, Pavel Porvatov
wrote:

I got your point. What about this solution:

If in the compose mode, endCompositoin just sendComposedText
instead of sendCommittedText.



The patch is attached




Could you please explain the fix? May be it removes NPE but it
puzzles me. So if buffer.length() == 0 you invoke
sendCommittedText, right? But sendCommittedText commits
buffer, but buffer is empty. Looks strange...



BTW: the code like "if (!notInCompositionMode) {" a little bit
difficult to understand =) I'd preffer to avoid two negations
and use "if (notInCompositionMode)" and swap if/else blocks...




Regards, Pavel




Hi Pavel,



Sorry for the confusion. Here is some explanation, please
correct me if I am wrong:

1. There two modes which is judge from the buffer size: composed
mode when the buffer size is not zero and normal mode when the
buffer size is zero.


Right


2. The original code make no difference whether it is in the
composed mode or normal mode. In the normal mode, which buffer
size is zero, it sends the committed text. In the composed mode,
which buffer size is not zero, it also sends the committed code.
And NPE occurred here.

3. In the patch, I do not change the logic when in the normal
mode. (notInCompositionMode branch) Why? I guess it is the
logic of "Ends any input composition that may
currently be going on in this context. Depending on the
platform and possibly user preferences, this may commit or
delete uncommitted text. "
from the api spec....


Yes. But after your change the following code looks strange for
me:

if (!notInCompositionMode) {

....

} else {

>>>> sendCommittedText();

}

So if we are not in composition mode we send something (empty
string actually). Logically we shouldn't send anything (IMO),
because buffer is empty. Why should we do something at all if
endComposition is invoked and we are not in composition mode?


4. In the patch, the logic in the composed mode is that: if it
is in the composed mode, keep every thing as just composed :-)




I found a new bug (???) in the fix. If you apply the patch, run
the MouseEventTest2 test and follow the instructions from the bug
description NPE will not be thrown, but the JTextArea remains in
composition mode even after endComposition completion.




Right. It seems that we have to do some thing in the jdk :-). Here
it is:



The patch attached is just adding a null check at the beginning of
the mouseClicked method in DefaultCaret. So why the component is
null in the DefaultCaret? That because the caret has already been
deinstalled. It seems to be an order problem of mouse event and the
event which endCompositon sent. The endComposition will exchange the
caret and deinstall the old one. On the other hand, mouse click
event was happening on the old caret. So the component of the old
caret is null now. NPE happens.





Regards, Pavel






--
Yours Charles