Hi Pavel, I wrote a test case for the behavior of DefaultCaret. Please take a look, it is attached.
2011/9/15 Pavel Porvatov <[email protected]> > ** > Hi Sean, > > Hi Pavel, > > I'm comfortable with moving the checking into > DefaultCaret#updateSystemSelection > method. > About regression test, I'm not sure how to write, because it > contains user operation. Can you > give me a similar test so I can write one for this bug? > > Yes, you can find a lot examples in the test/javax/swing directory by word > Robot, e.g. test\javax\swing\JSlider\6848475\bug6848475.java. One hint: use > reflection ONLY if there are no another ways to write a test... > > Regards, Pavel > > > 2011/9/13 Pavel Porvatov <[email protected]> > > Hi Sean, > > Hi Pavel , > > I'm sorry I didn't make update for this bug for a long time, and here > is some > recent investigation. The scenario is as follows: > > Suppose we are dragging "abcde" over TextField tf, which have "hello > dragging" as > its content. When we are dragging from start to end, there is a cursor > moving from > "h" to "g", which means the place to insert "abcde" if we drop it. > When we dragging "abcde" exit tf, there will be a dragExit event, the tf > needs to > restore its original status after we drag out. Eg. if its cursor is between > "h" and > "e" in "hello", which appears like "h|ello", when we are dragging over it, > it may like > "hello dr|agging", and when drag exit, it needs to be "h|ello" again. > So in dragExit handler, it calls > javax.swing.TransferHandler.cleanup(false), which > means only to restore the original state. cleanup calls > javax.swing.text.JTextComponent.setDropLocation to set the cursor to > original > position. And setDropLocation calls DefaultCaret.setDot > and DefaultCaret.moveDot > to set the state. > The problem is moveDot doesn't know this is just to restore the original > state, > it treats the invocation as an action to select something. And it > calls updateSystemSelection > which will call java.awt.datatransfer.Clipboard.setContent. And the > selected content > is changed from "abcde" to the original selected part of "hello dragging", > then > the drop operation finds it is not the string dragged and nothing is > dropped. > > So I made a simple patch(attached) . It just check if the textField owns > focus > before updateSystemSelection, if it is not focused, it does not treat the > moveDot as > a selection action and does not call Clipboard.setContent. This works on > Linux, > however, DefaultCaret is shared by Linux and Windows while windows doesn't > have > this problem. So I don't think this is a correct patch, but it brings my > question. > > I think it is strange for DefaultCaret to use setDot and moveDot to > restore > original state, especially moveDot will cause an updateSystemSelection > operation, > which makes moveDot much like an action from user instead of just restoring > state. > > I'm not sure why it works well on windows, but I don't think it is right > to call > updateSystemSelection or it is not right to use setDot and moveDot to > restore > the original state. Is there any reason for that ? > > Thanks for the patch! I believe you are right and we shouldn't update > system selection clipboard when the component doesn't have focus. I'd like > to modify your fix and move checking into the > DefaultCaret#updateSystemSelection method: > if (this.dot != this.mark && component != null && component.hasFocus()) { > > We also must write regression tests for fixes if possible, so an automatic > test is needed as well. Could you please write a test for the fix? > > > > I'm not sure why it works well on windows, > That's because Windows doesn't have system selection clipboard... > > > > Is there any reason for that ? > No, that's a just bug... > > Regards, Pavel > > > 2011/6/6 Pavel Porvatov <[email protected]> > > Hi Sean, > > Hi, > > I reported, but the system doesn't reply me a bug number. It says "will > give me email", > but I haven't got one yet. Is this the right process, or I might make a > problem when > reporting? > > I don't know why the system didn't report bug ID, but your bug was filed > successfully. You can find it here: > http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7049024 > > Regards, Pavel > > > 2011/5/27 Pavel Porvatov <[email protected]> > > Hi Sean, > > Hi all, > > I have a testcase related to DnD failure with JTextArea and > JTextField on linux. The > testcase is as follows: > > /* > * DnDTest.java > */ > import java.awt.Color; > import java.awt.Component; > import java.awt.Dimension; > import java.awt.FlowLayout; > import java.awt.Frame; > import java.awt.event.WindowAdapter; > import java.awt.event.WindowEvent; > > import javax.swing.JTextArea; > import javax.swing.JTextField; > > > public class DnDTest extends Frame { > Component c; > public DnDTest() { > super("Single Frame --- AWT Frame"); > super.setBackground(Color.gray); > // set layout here. > setLayout(new FlowLayout()); > c = new JTextArea("JTextArea component"); > c.setPreferredSize(new Dimension(400, 100)); > add(c); > c = new JTextField("JTextField component(No IM)"); > c.setPreferredSize(new Dimension(400, 20)); > add(c); > addWindowListener(new WindowAdapter() { > public void windowClosing(WindowEvent event) { > System.exit(0); > } > }); > setSize(850, 360); > setVisible(true); > } > public static void main(String[] args) { > new DnDTest(); > } > } > > > Reproduce steps: > 1. Run the testcase with b143 > 2. Open a new file with gedit and input some words like "abcde" > 3. Drag "abcde" into JTextField and drop it there. > 4. Once more, drag "abcde" into JTextField and then move out of the Frame > (keep draging) and drag into JTextField again and drop it. > > Expectation: > The second DnD inputs another "abcde" into JTextField. > > Result: > The second DnD inputs nothing into JTextField. > > Yes, looks like a bug. The test case works on Windows as expected. > > > Investigation: > The JTextArea as well has this problem, and in step 4, if we drag "abcde" > over JTextField and then drop into JTextArea, nothing > is input into JTextArea either. However, if "abcde" is drag into JTextField > or JTextArea directly or when JTextArea/Field are > empty as in step 2, it works. > > > Are there any comments? And can anyone file a bug for it please ? > > Anybody can file a bug, http://bugreport.sun.com/bugreport/ > > Regards, Pavel > > > > > -- > Best Regards, > Sean Chou > > > > > > -- > Best Regards, > Sean Chou > > > > > > -- > Best Regards, > Sean Chou > > > -- Best Regards, Sean Chou
bug7049024.java
Description: Binary data
