On Thu, 23 Feb 2023 07:36:43 GMT, Karthik P K <[email protected]> wrote:
>> When Text width was more than TextField width, the logic to update
>> `textTranslateX` in `updateCaretOff` method was causing the issue of
>> unexpected behavior for Right and Center alignment.
>>
>> Made changes to update `textTranslateX` in `updateCaretOff` method only when
>> text width is less than text field width i.e `delta` is positive.
>> For both right and center alignments, the `textTranslateX` value calculated
>> in `updateTextPos` method will be updated without any condition so that
>> expected behavior is achieved for all scenarios of text width relative to
>> text field width.
>>
>> Added unit tests to validate LEFT, CENTER and RIGHT alignments. RIGHT and
>> CENTER alignment tests are expected to fail without the fix provided in this
>> PR.
>
> Karthik P K has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Fix text and prompt alignment issue
modules/javafx.controls/src/main/java/javafx/scene/control/skin/TextFieldSkin.java
line 805:
> 803: // appear at the left of the centered prompt.
> 804: newX = midPoint -
> promptNode.getLayoutBounds().getWidth() / 2;
> 805: if (newX > 0) {
Let's say `caretWidth / 2` is 5, and that would be position we would show the
prompt text if it doesn't fit.
If the `newX` calculation is less than 5, but greater than 0, the prompt text
would be further to the left than you'd expect.
So I think this line should be:
Suggestion:
if (newX > caretWidth / 2) {
Probably best to put that in a local variable.
modules/javafx.controls/src/main/java/javafx/scene/control/skin/TextFieldSkin.java
line 818:
> 816: } else if (newX < 0 && oldX > 1) {
> 817: textTranslateX.set(caretWidth / 2);
> 818: }
I get the impression this code also needs to use `caretWidth / 2` instead of
`0` and `1`.
ie:
Suggestion:
// Update if there is space on the right
if (newX + textNodeWidth <= textRight.get() - caretWidth / 2) {
textTranslateX.set(newX);
} else if (newX < caretWidth / 2 && oldX > caretWidth / 2) {
textTranslateX.set(caretWidth / 2);
}
It would only work for very narrow caret's otherwise, and for wide caret's it
would have some unexpected positioning in the edge case where text almost fits.
modules/javafx.controls/src/main/java/javafx/scene/control/skin/TextFieldSkin.java
line 831:
> 829: // Align to left when prompt text length is more
> than text field width
> 830: promptNode.setLayoutX(caretWidth / 2);
> 831: }
Similar comment, I don't think its correct. It's just odd that promptNewX may
be smaller than caretWidth / 2 but is accepted, but when the text is too wide
the "minimum" value suddently is caretWidth / 2.
Also, I don't see how `promptOldX` has any relevance when it comes to
positioning the prompt. I think this is only relevant for the actual text
(because it can scroll depending on where the cursor is), not for the prompt --
unless the prompt can be scrolled as well. If that's the case then the
`CENTER` case may need to be updated to take `promptOldX` into account as well.
As it stands currently, they have behaviors that seem to conflict.
modules/javafx.controls/src/main/java/javafx/scene/control/skin/TextFieldSkin.java
line 839:
> 837: } else if (newX < 0 && oldX > 1) {
> 838: textTranslateX.set(caretWidth / 2);
> 839: }
Again, I don't think its correct. It's just odd that `newX` may be smaller
than `caretWidth / 2` but is accepted, but when the text is too wide the
"minimum" value suddenly is `caretWidth / 2`.
-------------
PR: https://git.openjdk.org/jfx/pull/980