<Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

classic Classic list List threaded Threaded
13 messages Options
Reply | Threaded
Open this post in threaded view
|

<Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

prasanta sadhukhan
Hi All,

Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/

Please review a fix for an issue where it is seen string with "tab" in them are not aligned properly.
This is because while calculating tab stop postion, it is calculating number of tabs in float value (an aftereffect of JDK-8156217)
so next tab stop location is coming out wrong.
Fix is to use "number of tabs" as an integer value in order to calculate the tab position correctly.

Regards
Prasanta
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky

Hi Prasanta,

It seems to me that the result of the sentence should be  truncated to int, not its members.

The test can be automated.

--Semyon

On 11/08/2017 03:25 AM, Prasanta Sadhukhan wrote:
Hi All,

Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/

Please review a fix for an issue where it is seen string with "tab" in them are not aligned properly.
This is because while calculating tab stop postion, it is calculating number of tabs in float value (an aftereffect of JDK-8156217)
so next tab stop location is coming out wrong.
Fix is to use "number of tabs" as an integer value in order to calculate the tab position correctly.

Regards
Prasanta

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Sergey Bylokhov
In reply to this post by prasanta sadhukhan
Hi, Prasanta.
Is it possible that dropping the float part of "tabSize" and "x" will
cause Off-by-one error? For example:
     float tabSize=3.99f;
     float x=21.9f;
     int tabBase=0;
  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
  650         return tabBase + ((ntabs + 1) * tabSize);

The result is: ntabs=7 -> 31.92 which is not correct.

I guess you will need something like this:
     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
     return tabBase + ntabs * tabSize;
The result is: ntabs=6 -> 23.94


On 08/11/2017 03:25, Prasanta Sadhukhan wrote:

> Hi All,
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>
> Please review a fix for an issue where it is seen string with "tab" in
> them are not aligned properly.
> This is because while calculating tab stop postion, it is calculating
> number of tabs in float value (an aftereffect of JDK-8156217
> <https://bugs.openjdk.java.net/browse/JDK-8156217>)
> so next tab stop location is coming out wrong.
> Fix is to use "number of tabs" as an integer value in order to calculate
> the tab position correctly.
>
> Regards
> Prasanta


--
Best regards, Sergey.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky
Hi Sergey,

It also may be written as

      int ntabs = (int)((x - tabBase) / tabSize);
      return tabBase + (ntabs + 1) * tabSize

See my previous comment.

--Semyon


On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:

> Hi, Prasanta.
> Is it possible that dropping the float part of "tabSize" and "x" will
> cause Off-by-one error? For example:
>     float tabSize=3.99f;
>     float x=21.9f;
>     int tabBase=0;
>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>  650         return tabBase + ((ntabs + 1) * tabSize);
>
> The result is: ntabs=7 -> 31.92 which is not correct.
>
> I guess you will need something like this:
>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>     return tabBase + ntabs * tabSize;
> The result is: ntabs=6 -> 23.94
>
>
> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>> Hi All,
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>
>> Please review a fix for an issue where it is seen string with "tab"
>> in them are not aligned properly.
>> This is because while calculating tab stop postion, it is calculating
>> number of tabs in float value (an aftereffect of JDK-8156217
>> <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>> so next tab stop location is coming out wrong.
>> Fix is to use "number of tabs" as an integer value in order to
>> calculate the tab position correctly.
>>
>> Regards
>> Prasanta
>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Sergey Bylokhov
On 08/11/2017 10:39, Semyon Sadetsky wrote:
> It also may be written as
>
>       int ntabs = (int)((x - tabBase) / tabSize);
>       return tabBase + (ntabs + 1) * tabSize

Yes "(int)+1" is also can be used for positive values, but the "ceil()"
is better since this purpose of this method, and in general it works for
negative values as well.

>
>
> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>> Hi, Prasanta.
>> Is it possible that dropping the float part of "tabSize" and "x" will
>> cause Off-by-one error? For example:
>>     float tabSize=3.99f;
>>     float x=21.9f;
>>     int tabBase=0;
>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>
>> The result is: ntabs=7 -> 31.92 which is not correct.
>>
>> I guess you will need something like this:
>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>     return tabBase + ntabs * tabSize;
>> The result is: ntabs=6 -> 23.94
>>
>>
>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>> Hi All,
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>
>>> Please review a fix for an issue where it is seen string with "tab"
>>> in them are not aligned properly.
>>> This is because while calculating tab stop postion, it is calculating
>>> number of tabs in float value (an aftereffect of JDK-8156217
>>> <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>> so next tab stop location is coming out wrong.
>>> Fix is to use "number of tabs" as an integer value in order to
>>> calculate the tab position correctly.
>>>
>>> Regards
>>> Prasanta
>>
>>
>


--
Best regards, Sergey.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky
On 11/08/2017 11:28 AM, Sergey Bylokhov wrote:

> On 08/11/2017 10:39, Semyon Sadetsky wrote:
>> It also may be written as
>>
>>       int ntabs = (int)((x - tabBase) / tabSize);
>>       return tabBase + (ntabs + 1) * tabSize
>
> Yes "(int)+1" is also can be used for positive values, but the
> "ceil()" is better since this purpose of this method, and in general
> it works for negative values as well.
There may not be negative values here, so Math.ceil() is redundant.

--Semyon

>
>>
>>
>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>> Hi, Prasanta.
>>> Is it possible that dropping the float part of "tabSize" and "x"
>>> will cause Off-by-one error? For example:
>>>     float tabSize=3.99f;
>>>     float x=21.9f;
>>>     int tabBase=0;
>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>
>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>
>>> I guess you will need something like this:
>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>     return tabBase + ntabs * tabSize;
>>> The result is: ntabs=6 -> 23.94
>>>
>>>
>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>> Hi All,
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>
>>>> Please review a fix for an issue where it is seen string with "tab"
>>>> in them are not aligned properly.
>>>> This is because while calculating tab stop postion, it is
>>>> calculating number of tabs in float value (an aftereffect of
>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>> so next tab stop location is coming out wrong.
>>>> Fix is to use "number of tabs" as an integer value in order to
>>>> calculate the tab position correctly.
>>>>
>>>> Regards
>>>> Prasanta
>>>
>>>
>>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Sergey Bylokhov
On 08/11/2017 11:38, Semyon Sadetsky wrote:
>> Yes "(int)+1" is also can be used for positive values, but the
>> "ceil()" is better since this purpose of this method, and in general
>> it works for negative values as well.
> There may not be negative values here, so Math.ceil() is redundant.

I do not see a reason why standard function can be redundant, and why
manual implementation is better. Since even in the first version of the
fix there is an issues in manual implementation.

>
> --Semyon
>>
>>>
>>>
>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>> Hi, Prasanta.
>>>> Is it possible that dropping the float part of "tabSize" and "x"
>>>> will cause Off-by-one error? For example:
>>>>     float tabSize=3.99f;
>>>>     float x=21.9f;
>>>>     int tabBase=0;
>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>
>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>
>>>> I guess you will need something like this:
>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>     return tabBase + ntabs * tabSize;
>>>> The result is: ntabs=6 -> 23.94
>>>>
>>>>
>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>> Hi All,
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>
>>>>> Please review a fix for an issue where it is seen string with "tab"
>>>>> in them are not aligned properly.
>>>>> This is because while calculating tab stop postion, it is
>>>>> calculating number of tabs in float value (an aftereffect of
>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>> so next tab stop location is coming out wrong.
>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>> calculate the tab position correctly.
>>>>>
>>>>> Regards
>>>>> Prasanta
>>>>
>>>>
>>>
>>
>>
>


--
Best regards, Sergey.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky
On 11/8/17 12:24 PM, Sergey Bylokhov wrote:

> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>> Yes "(int)+1" is also can be used for positive values, but the
>>> "ceil()" is better since this purpose of this method, and in general
>>> it works for negative values as well.
>> There may not be negative values here, so Math.ceil() is redundant.
>
> I do not see a reason why standard function can be redundant, and why
> manual implementation is better. Since even in the first version of
> the fix there is an issues in manual implementation.
I don't see it standard, just redundant in the case. What did you mean
under "manual implementation"?

--Semyon

>
>>
>> --Semyon
>>>
>>>>
>>>>
>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>> Hi, Prasanta.
>>>>> Is it possible that dropping the float part of "tabSize" and "x"
>>>>> will cause Off-by-one error? For example:
>>>>>     float tabSize=3.99f;
>>>>>     float x=21.9f;
>>>>>     int tabBase=0;
>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>
>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>
>>>>> I guess you will need something like this:
>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>     return tabBase + ntabs * tabSize;
>>>>> The result is: ntabs=6 -> 23.94
>>>>>
>>>>>
>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>> Hi All,
>>>>>>
>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>
>>>>>> Please review a fix for an issue where it is seen string with
>>>>>> "tab" in them are not aligned properly.
>>>>>> This is because while calculating tab stop postion, it is
>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>> so next tab stop location is coming out wrong.
>>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>>> calculate the tab position correctly.
>>>>>>
>>>>>> Regards
>>>>>> Prasanta
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

prasanta sadhukhan
I guess by "manual implementation", Sergey was mentioning about
programmer doing the calculation rather than using system api to do the
job for us.

Anyway, I saw using Math.ceil and no "nTabs+1", alignment does not work

This is because
For ex, if x = 66.0, tabSize = 48.0, tabBase = 0, then nTabs =
ceil(66/48) = 2 and tabStop=tabBase + ntabs * tabSize=96
Now, nextTabStop is called from Utilities.getTabbedTextWidth() in a loop
passing the same value which it gets as return value from nextTabStop,
for "x"
so x = 96.0, tabSize=48.0,ntabs = ceil(96/48)=2 and tabStop=96 again and
it go on getting same tabStop.

With
int ntabs = (int) ((x - tabBase) / tabSize);
         return tabBase + ((ntabs + 1) * tabSize);

we get proper alignment
x 66.0 tabSize 48.0 ntabs 1 tabstop 96.0
x 96.0 tabSize 48.0 ntabs 2 tabstop 144.0
x 144.0 tabSize 48.0 ntabs 3 tabstop 192.0

So, I guess, as Semyon suggested, making the "result of the sentence
should be  truncated to int, not its members" should be the way to go.

Lastly, could you please suggest as to how to automate this test?

Regards
Prasanta
On 11/9/2017 8:36 AM, [hidden email] wrote:

> On 11/8/17 12:24 PM, Sergey Bylokhov wrote:
>
>> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>>> Yes "(int)+1" is also can be used for positive values, but the
>>>> "ceil()" is better since this purpose of this method, and in
>>>> general it works for negative values as well.
>>> There may not be negative values here, so Math.ceil() is redundant.
>>
>> I do not see a reason why standard function can be redundant, and why
>> manual implementation is better. Since even in the first version of
>> the fix there is an issues in manual implementation.
> I don't see it standard, just redundant in the case. What did you mean
> under "manual implementation"?
>
> --Semyon
>>
>>>
>>> --Semyon
>>>>
>>>>>
>>>>>
>>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>>> Hi, Prasanta.
>>>>>> Is it possible that dropping the float part of "tabSize" and "x"
>>>>>> will cause Off-by-one error? For example:
>>>>>>     float tabSize=3.99f;
>>>>>>     float x=21.9f;
>>>>>>     int tabBase=0;
>>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>>
>>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>>
>>>>>> I guess you will need something like this:
>>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>>     return tabBase + ntabs * tabSize;
>>>>>> The result is: ntabs=6 -> 23.94
>>>>>>
>>>>>>
>>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>>> Hi All,
>>>>>>>
>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>>
>>>>>>> Please review a fix for an issue where it is seen string with
>>>>>>> "tab" in them are not aligned properly.
>>>>>>> This is because while calculating tab stop postion, it is
>>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>>> so next tab stop location is coming out wrong.
>>>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>>>> calculate the tab position correctly.
>>>>>>>
>>>>>>> Regards
>>>>>>> Prasanta
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Sergey Bylokhov
On 09/11/2017 01:56, Prasanta Sadhukhan wrote:
> So, I guess, as Semyon suggested, making the "result of the sentence
> should be  truncated to int, not its members" should be the way to go.

Thank you for clarification, then this solution looks fine.

>
> Lastly, could you please suggest as to how to automate this test?
>
> Regards
> Prasanta
> On 11/9/2017 8:36 AM, [hidden email] wrote:
>> On 11/8/17 12:24 PM, Sergey Bylokhov wrote:
>>
>>> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>>>> Yes "(int)+1" is also can be used for positive values, but the
>>>>> "ceil()" is better since this purpose of this method, and in
>>>>> general it works for negative values as well.
>>>> There may not be negative values here, so Math.ceil() is redundant.
>>>
>>> I do not see a reason why standard function can be redundant, and why
>>> manual implementation is better. Since even in the first version of
>>> the fix there is an issues in manual implementation.
>> I don't see it standard, just redundant in the case. What did you mean
>> under "manual implementation"?
>>
>> --Semyon
>>>
>>>>
>>>> --Semyon
>>>>>
>>>>>>
>>>>>>
>>>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>>>> Hi, Prasanta.
>>>>>>> Is it possible that dropping the float part of "tabSize" and "x"
>>>>>>> will cause Off-by-one error? For example:
>>>>>>>     float tabSize=3.99f;
>>>>>>>     float x=21.9f;
>>>>>>>     int tabBase=0;
>>>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>>>
>>>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>>>
>>>>>>> I guess you will need something like this:
>>>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>>>     return tabBase + ntabs * tabSize;
>>>>>>> The result is: ntabs=6 -> 23.94
>>>>>>>
>>>>>>>
>>>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>>>> Hi All,
>>>>>>>>
>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>>>
>>>>>>>> Please review a fix for an issue where it is seen string with
>>>>>>>> "tab" in them are not aligned properly.
>>>>>>>> This is because while calculating tab stop postion, it is
>>>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>>>> so next tab stop location is coming out wrong.
>>>>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>>>>> calculate the tab position correctly.
>>>>>>>>
>>>>>>>> Regards
>>>>>>>> Prasanta
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>


--
Best regards, Sergey.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky
In reply to this post by prasanta sadhukhan
Hi Prasanta,


On 11/09/2017 01:56 AM, Prasanta Sadhukhan wrote:

> I guess by "manual implementation", Sergey was mentioning about
> programmer doing the calculation rather than using system api to do
> the job for us.
>
> Anyway, I saw using Math.ceil and no "nTabs+1", alignment does not work
>
> This is because
> For ex, if x = 66.0, tabSize = 48.0, tabBase = 0, then nTabs =
> ceil(66/48) = 2 and tabStop=tabBase + ntabs * tabSize=96
> Now, nextTabStop is called from Utilities.getTabbedTextWidth() in a
> loop passing the same value which it gets as return value from
> nextTabStop, for "x"
> so x = 96.0, tabSize=48.0,ntabs = ceil(96/48)=2 and tabStop=96 again
> and it go on getting same tabStop.
>
> With
> int ntabs = (int) ((x - tabBase) / tabSize);
>         return tabBase + ((ntabs + 1) * tabSize);
>
> we get proper alignment
> x 66.0 tabSize 48.0 ntabs 1 tabstop 96.0
> x 96.0 tabSize 48.0 ntabs 2 tabstop 144.0
> x 144.0 tabSize 48.0 ntabs 3 tabstop 192.0
>
> So, I guess, as Semyon suggested, making the "result of the sentence
> should be  truncated to int, not its members" should be the way to go.
>
> Lastly, could you please suggest as to how to automate this test?
I think the easiest way is to set the caret in the corresponding
position and read its coordinates.

--Semyon

>
> Regards
> Prasanta
> On 11/9/2017 8:36 AM, [hidden email] wrote:
>> On 11/8/17 12:24 PM, Sergey Bylokhov wrote:
>>
>>> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>>>> Yes "(int)+1" is also can be used for positive values, but the
>>>>> "ceil()" is better since this purpose of this method, and in
>>>>> general it works for negative values as well.
>>>> There may not be negative values here, so Math.ceil() is redundant.
>>>
>>> I do not see a reason why standard function can be redundant, and
>>> why manual implementation is better. Since even in the first version
>>> of the fix there is an issues in manual implementation.
>> I don't see it standard, just redundant in the case. What did you
>> mean under "manual implementation"?
>>
>> --Semyon
>>>
>>>>
>>>> --Semyon
>>>>>
>>>>>>
>>>>>>
>>>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>>>> Hi, Prasanta.
>>>>>>> Is it possible that dropping the float part of "tabSize" and "x"
>>>>>>> will cause Off-by-one error? For example:
>>>>>>>     float tabSize=3.99f;
>>>>>>>     float x=21.9f;
>>>>>>>     int tabBase=0;
>>>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>>>
>>>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>>>
>>>>>>> I guess you will need something like this:
>>>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>>>     return tabBase + ntabs * tabSize;
>>>>>>> The result is: ntabs=6 -> 23.94
>>>>>>>
>>>>>>>
>>>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>>>> Hi All,
>>>>>>>>
>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>>>
>>>>>>>> Please review a fix for an issue where it is seen string with
>>>>>>>> "tab" in them are not aligned properly.
>>>>>>>> This is because while calculating tab stop postion, it is
>>>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>>>> so next tab stop location is coming out wrong.
>>>>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>>>>> calculate the tab position correctly.
>>>>>>>>
>>>>>>>> Regards
>>>>>>>> Prasanta
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

prasanta sadhukhan
Hi Semyon,

Please find the modified webrev for automated test.
http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.01/

Regards
Prasanta
On 11/9/2017 11:36 PM, Semyon Sadetsky wrote:

> Hi Prasanta,
>
>
> On 11/09/2017 01:56 AM, Prasanta Sadhukhan wrote:
>> I guess by "manual implementation", Sergey was mentioning about
>> programmer doing the calculation rather than using system api to do
>> the job for us.
>>
>> Anyway, I saw using Math.ceil and no "nTabs+1", alignment does not work
>>
>> This is because
>> For ex, if x = 66.0, tabSize = 48.0, tabBase = 0, then nTabs =
>> ceil(66/48) = 2 and tabStop=tabBase + ntabs * tabSize=96
>> Now, nextTabStop is called from Utilities.getTabbedTextWidth() in a
>> loop passing the same value which it gets as return value from
>> nextTabStop, for "x"
>> so x = 96.0, tabSize=48.0,ntabs = ceil(96/48)=2 and tabStop=96 again
>> and it go on getting same tabStop.
>>
>> With
>> int ntabs = (int) ((x - tabBase) / tabSize);
>>         return tabBase + ((ntabs + 1) * tabSize);
>>
>> we get proper alignment
>> x 66.0 tabSize 48.0 ntabs 1 tabstop 96.0
>> x 96.0 tabSize 48.0 ntabs 2 tabstop 144.0
>> x 144.0 tabSize 48.0 ntabs 3 tabstop 192.0
>>
>> So, I guess, as Semyon suggested, making the "result of the sentence
>> should be  truncated to int, not its members" should be the way to go.
>>
>> Lastly, could you please suggest as to how to automate this test?
> I think the easiest way is to set the caret in the corresponding
> position and read its coordinates.
>
> --Semyon
>>
>> Regards
>> Prasanta
>> On 11/9/2017 8:36 AM, [hidden email] wrote:
>>> On 11/8/17 12:24 PM, Sergey Bylokhov wrote:
>>>
>>>> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>>>>> Yes "(int)+1" is also can be used for positive values, but the
>>>>>> "ceil()" is better since this purpose of this method, and in
>>>>>> general it works for negative values as well.
>>>>> There may not be negative values here, so Math.ceil() is redundant.
>>>>
>>>> I do not see a reason why standard function can be redundant, and
>>>> why manual implementation is better. Since even in the first
>>>> version of the fix there is an issues in manual implementation.
>>> I don't see it standard, just redundant in the case. What did you
>>> mean under "manual implementation"?
>>>
>>> --Semyon
>>>>
>>>>>
>>>>> --Semyon
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>>>>> Hi, Prasanta.
>>>>>>>> Is it possible that dropping the float part of "tabSize" and
>>>>>>>> "x" will cause Off-by-one error? For example:
>>>>>>>>     float tabSize=3.99f;
>>>>>>>>     float x=21.9f;
>>>>>>>>     int tabBase=0;
>>>>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>>>>
>>>>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>>>>
>>>>>>>> I guess you will need something like this:
>>>>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>>>>     return tabBase + ntabs * tabSize;
>>>>>>>> The result is: ntabs=6 -> 23.94
>>>>>>>>
>>>>>>>>
>>>>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>>>>> Hi All,
>>>>>>>>>
>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>>>>
>>>>>>>>> Please review a fix for an issue where it is seen string with
>>>>>>>>> "tab" in them are not aligned properly.
>>>>>>>>> This is because while calculating tab stop postion, it is
>>>>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>>>>> so next tab stop location is coming out wrong.
>>>>>>>>> Fix is to use "number of tabs" as an integer value in order to
>>>>>>>>> calculate the tab position correctly.
>>>>>>>>>
>>>>>>>>> Regards
>>>>>>>>> Prasanta
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> [10] RFR JDK-8187957:Tab Size does not work correctly in JTextArea

Semyon Sadetsky
+1

--Semyon


On 11/13/2017 12:52 AM, Prasanta Sadhukhan wrote:

> Hi Semyon,
>
> Please find the modified webrev for automated test.
> http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.01/
>
> Regards
> Prasanta
> On 11/9/2017 11:36 PM, Semyon Sadetsky wrote:
>> Hi Prasanta,
>>
>>
>> On 11/09/2017 01:56 AM, Prasanta Sadhukhan wrote:
>>> I guess by "manual implementation", Sergey was mentioning about
>>> programmer doing the calculation rather than using system api to do
>>> the job for us.
>>>
>>> Anyway, I saw using Math.ceil and no "nTabs+1", alignment does not work
>>>
>>> This is because
>>> For ex, if x = 66.0, tabSize = 48.0, tabBase = 0, then nTabs =
>>> ceil(66/48) = 2 and tabStop=tabBase + ntabs * tabSize=96
>>> Now, nextTabStop is called from Utilities.getTabbedTextWidth() in a
>>> loop passing the same value which it gets as return value from
>>> nextTabStop, for "x"
>>> so x = 96.0, tabSize=48.0,ntabs = ceil(96/48)=2 and tabStop=96 again
>>> and it go on getting same tabStop.
>>>
>>> With
>>> int ntabs = (int) ((x - tabBase) / tabSize);
>>>         return tabBase + ((ntabs + 1) * tabSize);
>>>
>>> we get proper alignment
>>> x 66.0 tabSize 48.0 ntabs 1 tabstop 96.0
>>> x 96.0 tabSize 48.0 ntabs 2 tabstop 144.0
>>> x 144.0 tabSize 48.0 ntabs 3 tabstop 192.0
>>>
>>> So, I guess, as Semyon suggested, making the "result of the sentence
>>> should be  truncated to int, not its members" should be the way to go.
>>>
>>> Lastly, could you please suggest as to how to automate this test?
>> I think the easiest way is to set the caret in the corresponding
>> position and read its coordinates.
>>
>> --Semyon
>>>
>>> Regards
>>> Prasanta
>>> On 11/9/2017 8:36 AM, [hidden email] wrote:
>>>> On 11/8/17 12:24 PM, Sergey Bylokhov wrote:
>>>>
>>>>> On 08/11/2017 11:38, Semyon Sadetsky wrote:
>>>>>>> Yes "(int)+1" is also can be used for positive values, but the
>>>>>>> "ceil()" is better since this purpose of this method, and in
>>>>>>> general it works for negative values as well.
>>>>>> There may not be negative values here, so Math.ceil() is redundant.
>>>>>
>>>>> I do not see a reason why standard function can be redundant, and
>>>>> why manual implementation is better. Since even in the first
>>>>> version of the fix there is an issues in manual implementation.
>>>> I don't see it standard, just redundant in the case. What did you
>>>> mean under "manual implementation"?
>>>>
>>>> --Semyon
>>>>>
>>>>>>
>>>>>> --Semyon
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On 11/08/2017 10:24 AM, Sergey Bylokhov wrote:
>>>>>>>>> Hi, Prasanta.
>>>>>>>>> Is it possible that dropping the float part of "tabSize" and
>>>>>>>>> "x" will cause Off-by-one error? For example:
>>>>>>>>>     float tabSize=3.99f;
>>>>>>>>>     float x=21.9f;
>>>>>>>>>     int tabBase=0;
>>>>>>>>>  649         int ntabs = ((int) x - tabBase) / (int)tabSize;
>>>>>>>>>  650         return tabBase + ((ntabs + 1) * tabSize);
>>>>>>>>>
>>>>>>>>> The result is: ntabs=7 -> 31.92 which is not correct.
>>>>>>>>>
>>>>>>>>> I guess you will need something like this:
>>>>>>>>>     int ntabs = (int) Math.ceil((x - tabBase) / tabSize);
>>>>>>>>>     return tabBase + ntabs * tabSize;
>>>>>>>>> The result is: ntabs=6 -> 23.94
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 08/11/2017 03:25, Prasanta Sadhukhan wrote:
>>>>>>>>>> Hi All,
>>>>>>>>>>
>>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8187957
>>>>>>>>>> webrev:
>>>>>>>>>> http://cr.openjdk.java.net/~psadhukhan/8187957/webrev.00/
>>>>>>>>>>
>>>>>>>>>> Please review a fix for an issue where it is seen string with
>>>>>>>>>> "tab" in them are not aligned properly.
>>>>>>>>>> This is because while calculating tab stop postion, it is
>>>>>>>>>> calculating number of tabs in float value (an aftereffect of
>>>>>>>>>> JDK-8156217 <https://bugs.openjdk.java.net/browse/JDK-8156217>)
>>>>>>>>>> so next tab stop location is coming out wrong.
>>>>>>>>>> Fix is to use "number of tabs" as an integer value in order
>>>>>>>>>> to calculate the tab position correctly.
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>> Prasanta
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>