On Thu, 23 Feb 2023 07:36:43 GMT, Karthik P K <k...@openjdk.org> 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

Reply via email to