Hi Alex,

On 4/14/2014 5:59 AM, Alexander Scherbatiy wrote:
On 4/11/2014 10:30 PM, Vivi An wrote:
Hello Alex,

On 4/11/2014 6:21 AM, Alexander Scherbatiy wrote:

src/share/classes/javax/swing/tree/DefaultTreeSelectionModel.java
208      * The lead path is set to the last unique path.

This comment contradicts with the:
http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/TreeSelectionModel.html
   The lead TreePath is the last path that was added (or set).
and with:
http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultTreeSelectionModel.html#leadPath
  protected TreePath leadPath
  Last path that was added.
Hmm, the preceding comment of 208 was the old one, did not feel like conflict with the doc. I added "selected" to try to make it clearer.

   I see. It seems that the "last unique path" phrase is ambiguous.

It has been added after the fix JDK-6210002 Undefined behavior of DefaultTreeSelectionModel.getSelectionPath() after setSelectionPaths.
  Before the fix the javadoc was:
http://docs.oracle.com/javase/6/docs/api/javax/swing/tree/DefaultTreeSelectionModel.html#setSelectionPaths%28javax.swing.tree.TreePath[]%29
    "The lead path is set to the last path in pPaths."

It was found that the setSelectionPaths method works differently for the duplicated paths.
  For example:
  ----------------
  model.setSelectionPaths(new TreePath[] {path1, path2, path1});
   // lead path is path2 (last set path is path1)
  ----------------

It was decided not to change the setSelectionPaths method algorithm to not break the already written applications and just update the specification from "The lead path is set to the last path in pPaths." to "The lead path is set to the last unique path." So "unique path" refers to paths in the current setSelectionPaths arguments.


  You fix changes the current setSelectionPaths behavior from:
  ----------------
  model.setSelectionPaths(new TreePath[] {path1, path2, path3});
   // lead path is path3 (last set path is path3)
  model.setSelectionPaths(new TreePath[] {path1, path2, newpath, path3});
   // lead path is path3 (last set path is path3)
  ----------------
 to
  ----------------
  model.setSelectionPaths(new TreePath[] {path1, path2, path3});
   // lead path is path3 (last set path is path3)
  model.setSelectionPaths(new TreePath[] {path1, path2, newpath, path3});
   // lead path is newpath (last set path is path3)
  ----------------

This also can break existed applications that relies on the setSelectionPaths() method.

I think that the DefaultTreeSelectionModel.setSelectionPaths() documentation should be updated to avoid ambiguous meaning.

You fix should use the current DefaultTreeSelectionModel.setSelectionPaths() method that sets lead path to the last non-duplicating path from the given paths array.

Now I understand what you mean by "ambiguous" :). Yes, it is. Even we update the setSelectionPaths API doc to something like "The lead path is set to the last unique pathin pPaths". The lead path set through setSelectionPaths will still not match the JDK doc you mentioned (The lead TreePath is the last path that was added (or set) in all scenarios:

=============================
For example:
In case user making multi-selection of nodes through <Shift+ Cursor Up>, if user selected a tree node "path3" first, pressed <Shift+Cursor up> to select other tree nodes: <path2>, then <path1>, the lead path is always set to "path3" in setSelectionPaths because it's always the last path in the passed in pPaths - which I think is not right. That's why I made the fix in. The fix will make the lead path to be the last path that was added (set), as mentioned in the JDK doc, but yes, this can break existing application because it's behavior change.

Anyway, we don't have to make change in setSelectionPaths for 8036983. Since in JTree.java, we now use setLeadSelectionPath to fire active descendant property change instead of valueChange, which is eventually triggered through key event processing and BasicTreeUI::extendSelection with the lead path (Active child) we expected.

Reverted the change in DefaultTreeSelectionModel.java, keep all other changes in JTree.java and JTable.java, JDK-8040209 <https://bugs.openjdk.java.net/browse/JDK-8040209>was filed so we can track the lead path or API doc in DefaultTreeSelectionModel.setSelectionPaths separately. Re-tested manual test cases attached to the bug and re-ran JCK tests, tests passed.


How's change to: "The lead path is last tree path that was added or set." to fully adapt to the doc.

Could you also run the JTable and JTree JCK tests?
64 Tests all passed on Windows, report attached to the bug

I think that we could ask the TCK team to add the test that checks DefaultTreeSelectionModel.setSelectionPaths() behaviour for the duplicating paths.
JCK-7302801 <https://bugs.openjdk.java.net/browse/JCK-7302801> is filed to track this down.

Thank you

~ Vivi

  Thanks,
  Alexandr.


Thanks,
Alexandr.

On 4/11/2014 3:24 AM, Vivi An wrote:
Thanks Petr

Please see comments inline. Plus, one more question, does new package private function requires CCC approval?

~ Vivi

On 4/10/2014 7:25 AM, Petr Pchelko wrote:
Hello, Vivi.

Is it possible to write a test (manual or automated) for the fix?
Two test files (One for JTree, one for JTable) attached to the bug for manual test, comments added in each file about the how to do the test.
Is is possible to make an automatic test?
You could show the JTree, manually get it’s AccessibleContext and call methods that reproduce the problem.

Adding a manual test to the JBS wouldn’t help, because nobody would ever run this test. So the best is to make an automatic jtreg test, or at least convert your manual tests to jtreg and push them into the repo together with the fix.

With best regards. Petr.
Discussed with SQE, auto test for this will require more investigation, since it's not only a test to get access information of a component, in addition, it requires some human interaction, so an autotest is possible with combine Robot+JTreg, since this target to 14_03, another bug JDK-8039978 is filed to track down the auto test requirement for this, it's a good point since I will have more of such fix coming up.

10 апр. 2014 г., в 6:04 после полудня, Vivi An <vivi...@oracle.com> написал(а):

Updated webrev:

http://cr.openjdk.java.net/~dmarkov/8036983/jdk9/webrev.01/

Comments as below

Thanks

Vivi



On 4/9/2014 8:08 AM, Alexander Scherbatiy wrote:
On 4/8/2014 9:19 PM, Vivi An wrote:
Hello,

Could you please review the fix for JDK 9?

This bug is JAB related. ActivateDescenderPropertyChanged event for JTree and JTable were not sent properly in case SHIFT+CursorDown or Ctrl+CursorUp/Down are used. Fix made mainly uses lead path (acctive child path) instead of selection path to check if an event needs to be fired.

Bug: https://bugs.openjdk.java.net/browse/JDK-8036983
Webrev: http://cr.openjdk.java.net/~dmarkov/8036983/jdk9/webrev.00/

+ public void fireActiveDescendantPropertyChange(TreePath oldPath, TreePath newPath) {
Is it possible to make the method package access instead of public?
Yes, good idea, fixed
+ int focusedRow = JTable.this.getSelectionModel().getLeadSelectionIndex();;
There is one more semicolon at the end.

Fixed
Is it possible to write a test (manual or automated) for the fix?
Two test files (One for JTree, one for JTable) attached to the bug for manual test, comments added in each file about the how to do the test.
Thanks,
Alexandr.
Thanks

~ Vivi





Reply via email to