Hi Anthony,
That's great. Thank you very much :-)
On 02/17/2012 08:01 PM, Anthony Petrov wrote:
Hi Charles,
The latest fix looks reasonable. Basically, by removing the
enableInputMethod(true) call from peers' constructors we ensure we
don't override the enable/disable state set by user code.
I've filed a CR: http://bugs.sun.com/view_bug.do?bug_id=7146572
Let's wait a couple more days in case anyone else wants to comment on
this fix. If no further comments come, I'll push the fix next week.
Thanks for the contribution!
--
best regards,
Anthony
On 2/13/2012 12:16 PM, Charles Lee wrote:
Hi guys,
Here, I want propose a even easier patch to fix this issue. Please
check here: http://cr.openjdk.java.net/~littlee/OJDK-124/webrev.01/
<http://cr.openjdk.java.net/%7Elittlee/OJDK-124/webrev.01/>
The patch is mainly about remove enableInputMethod in two places in
XTextAreaPeer and XTextFieldPeer.
If it does the right thing, would anyone help to review the patch?
On 02/09/2012 02:18 PM, Charles Lee wrote:
Hi Anthony,
Thank you for your review. I have changed the test case a little,
which will include a button to change the input method enable[1]. Is
it the dynamic thing in your mind?
This test case can work well on my original patch, but I found
something interesting:
Enable or disable jtext/xtext input method will have nothing to do
with input method. Only enableInputMethod of target has influence. I
was doing some code reading about this and find that (Please correct
me if wrong) :
1. jtext/xtext process InputMethodEvent from
XComponentPeer.handleEvent, and eventually goes to
Component.processInputMethodEvent and
JTextComponent.processInputMethodEvent. There are no route for input
method enable check.
2. So when input method is enabled in TextArea/TextField, jtext
should be work well.
3. And when input method is disabled by enableInputMethod(false),
input context will be removed from notification, and there will be
no more InputMethodEvent put into queue. So peer.handleEvent will
never be invoked since e is KeyEvent in the dispatchEventImpl method
of Component.
So I conclude that set enable input method of jtext/xtext will have
no effect and my original patch can be reduced a very simple one.
Just remove the target.enableInputMethod(true) in both
XTextFieldPeer and XTextAreaPeer.
P.S. Why there is a jtext(JTextArea) in the XTextAreaPeer? I am
missing some history here :-)
[1]
public class MyAWTTest extends JFrame {
private final TextArea ta;
private final TextField tf;
private final AtomicBoolean flag;
public MyAWTTest() {
super("Single Frame --- AWT Frame");
setLayout(new FlowLayout());
ta = new TextArea("TextArea component(No IM)");
ta.enableInputMethods(false);
ta.setPreferredSize(new Dimension(400, 100));
add(ta);
tf = new TextField("TextField component(No IM)", 52);
tf.enableInputMethods(false);
add(tf);
flag = new AtomicBoolean(false);
Button button = new Button("Click me, change the world");
add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!flag.get()) {
ta.setText("TextArea component");
tf.setText("TextField component");
ta.enableInputMethods(true);
tf.enableInputMethods(true);
flag.set(true);
} else {
ta.setText("TextArea component (NO IM)");
tf.setText("TextField component (NO IM)");
ta.enableInputMethods(false);
tf.enableInputMethods(false);
flag.set(false);
}
}
});
setSize(850, 360);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MyAWTTest();
}
});
}
}
On 02/07/2012 07:29 PM, Anthony Petrov wrote:
Hi Charles,
The general idea of the fix is OK and the fix looks fine to me.
However, there's still a problem if an app enables or disables
Input Methods dynamically during the app's execution. The updated
status of the property needs to be propagated to the jtext or xtext
somehow.
--
best regards,
Anthony
On 2/7/2012 1:17 PM, Charles Lee wrote:
Hi guys,
Given a simple test case below[1], enableInputMethod(false) does
not work. We can always invoke input method.
[1]
public class MyAWTTest extends JFrame {
Component c;
public MyAWTTest() {
super("Single Frame --- AWT Frame");
setLayout(new FlowLayout());
c = new TextArea("TextArea component(No IM)");
c.enableInputMethods(false);
c.setPreferredSize(new Dimension(400, 100));
add(c);
c = new TextField("TextField component(No IM)", 52);
c.enableInputMethods(false);
add(c);
setSize(850, 360);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MyAWTTest();
}
});
}
}
Patch @ http://cr.openjdk.java.net/~littlee/OJDK-124/webrev.00/
<http://cr.openjdk.java.net/%7Elittlee/OJDK-124/webrev.00/>
The patch is mainly about:
1. Add a new method in the ComponentAccessor which help to escape
the package restraints. Please check the changes in Component and
AWTAccessor.
2. Remove the enableInputMethod(true) in the XTextAreaPeer and
XTextFieldPeer and use areInputMethodEnabled to set jtext
correctly. Please check the changes in XTextAreaPeer and
XTextFieldPeer.
I know it may not be a beautiful fix, but anyone interests in it?
--
Yours Charles