On Wed, 5 Feb 2020 23:31:29 GMT, Kevin Rushforth <[email protected]> wrote:

>> Issue: 
>> Dragging a tab and dropping it back to it's original position causes an 
>> incorrect reordering of tabs. Incorrect order of tabs can be observed using 
>> arrow key traversal through tabs.
>> 
>> Cause:
>> Below mechanism of identifying if tab header is dragged and dropped at same 
>> position is not reliable. 
>> When a tab is selected for dragging, the tab's layout X is stored as 
>> `dragHeaderStartX`.
>> When the tab is dropped, the tab's destination layout X is saved as 
>> `dragHeaderDestX`.
>> These two values are used to decide if the reordering of tabs is needed.
>> This is an unreliable mechanism in two cases,
>> 
>> 1. When the `TabPane.TabClosingPolicy` is set to 
>> `TabPane.TabClosingPolicy.SELECTED_TAB`, the close button icon gets added 
>> only to the selected tab. 
>> Each time when the tab selection is changed, the header region needs a 
>> re-layout. When a non selected tab is chosen for dragging `dragHeaderStartX` 
>> and `dragHeaderDestX` will always differ.
>> 
>> 2. Calculation of `dragHeaderDestX` involves floating point operation. So 
>> the computed `dragHeaderDestX` may sometimes vary by fraction than 
>> `dragHeaderStartX`.
>> 
>> Fix:
>> Use the index of tab header for identifying the tabs which are reordered.
>> Save the index when reordering begins. `dragTabHeaderStartIndex`
>> Save the index when tab is dropped. `dragTabHeaderIndex`
>> If the index are same then reordering of tabs is NOT needed.
>> If the index are NOT same then the tabs from `dragTabHeaderStartIndex` to 
>> `dragTabHeaderIndex` are reordered.
>> 
>> Verification:
>> This fix is specific to TabPane reordering. No other tests/behavior should 
>> be affected.
>> Added a new system test.
> 
> Looks good.

I'd like @agahisas to take a look as well.

-------------

PR: https://git.openjdk.java.net/jfx/pull/106

Reply via email to