On Tue, 8 Apr 2025 16:55:51 GMT, Martin Fox <m...@openjdk.org> wrote:
>> Note: The JBS issue >> [JDK-8207333](https://bugs.openjdk.org/browse/JDK-8207333) refers to Linux, >> but it happens on macOS too. >> >> When a TableColumn has a ContextMenu, if the user right clicks on the >> tableColumnHeader, the ContextMenu shows up, but, as described on the issue, >> on macOS and Linux, the table gets sorted as well. >> >> Currently, `TableColumnHeader#mouseReleasedHandler` checks for >> `MouseEvent::isPopupTriggered`, but it doesn't have a check on >> `mousePressed`. However, it can be seen that a right click on the header >> has the following values for `MouseEvent:: isPopupTriggered` on the >> different platforms and mouse pressed and released events: >> >> | isPopupTriggered on: | Windows | macOS | Linux | >> | ------------- | ------------- | ------------- | ------------- | >> | mousePressed | false | true | true | >> | mouseReleased | true | false | falseĀ | >> >> Also, the JavaDoc for `MouseEvent::isPopupTriggered` clearly states that: >> >>> **Note**: Popup menus are triggered differently on different systems. >>> Therefore, `popupTrigger` should be checked in both `onMousePressed` and >>> `mouseReleased` for proper cross-platform functionality. >> >> Therefore, this PR adds a check to `MouseEvent::isPopupTrigger` in the mouse >> pressed event, that can be used later on to cancel the header sorting when >> the mouse released event happens. >> >> Also a system test has been added. It fails on macOS and Linux, and passes >> on Windows before this PR, and passes on the three platforms with this PR. > > modules/javafx.controls/src/main/java/javafx/scene/control/skin/TableColumnHeader.java > line 251: > >> 249: me.consume(); >> 250: >> 251: header.getTableHeaderRow().columnDragLock = true; > > On Mac a context menu can be invoked using the right button or the left > button in conjunction with the Control key. In the second case the pop > trigger flag will be set and the primary button will be down. If I'm reading > the code correctly this could get the header stuck in column re-ordering mode. Testing on macOS 15.3.2, it does not get stuck when using control+left-click, works as expected. There is one (existing and unrelated) problem - if the user tries to dismiss the popup menu by clicking on the header, it dismisses the popup (correctly), but then proceeds to re-sort the table (unexpected). One can say it works as designed, since the click falls on a header cell and the expected operation is to toggle the sorting, with the side effect of dismissing the popup. On the other hand, Excel (both mac and windows) behaves differently - a click on the spreadsheet header dismisses the popup and does not select the column, as it normally does when no popup is present. What do you guys think? > modules/javafx.controls/src/main/java/javafx/scene/control/skin/TableColumnHeader.java > line 275: > >> 273: private static final EventHandler<MouseEvent> mouseReleasedHandler >> = me -> { >> 274: TableColumnHeader header = (TableColumnHeader) me.getSource(); >> 275: header.getTableHeaderRow().columnDragLock = false; > > On Ubuntu 22.04 the table column header is not receiving a mouse released > event if a context menu is shown. Not sure where the released event is going > but it's not to any node on the primary stage. The docs are vague on this but > this looks like a separate bug that's making it hard to test this PR. what happens in the master branch (without this PR's changes)? ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1754#discussion_r2033796787 PR Review Comment: https://git.openjdk.org/jfx/pull/1754#discussion_r2033797532