<Swing Dev> [9] Review request for 8132119 Provide public API for text related methods in SwingUtilities2

Semyon Sadetsky semyon.sadetsky at oracle.com
Fri Jan 15 16:58:36 UTC 2016



On 1/15/2016 7:31 PM, Alexander Scherbatiy wrote:
>
>  Hello,
>
>  Could you review the updated fix:
>    http://cr.openjdk.java.net/~alexsch/8132119/webrev.06
>
>   - the description of the getClippedString method is updated to 
> mention that ellipsis is added at the end of the clipped string
>
> On 1/15/2016 1:16 PM, Semyon Sadetsky wrote:
>> Hi,
>>
>> getClippedString() : It is worth to explain that 3dots are added at 
>> end or returned.
>>
>> getStringWidth(): It is worth to add a note that the returning value 
>> is not the exact visual string width because rendering hints are not 
>> taken into account.
>     I thought that rendering hints can affect a string quaility and 
> drawing performance. Do they really change the visual string width?
Please look how the font anti-aliasing works: 
https://upload.wikimedia.org/wikipedia/commons/3/34/A_aliased_and_simple.jpg
For example if user cut this width from a drawing artifacts may be remained.
>>
>> What was the reason for renaming clipStringIfNecessary() and 
>> stringWidth()?
>>
>> stringWidth() is a standard method name to get the advance in all 
>> other JDK interfaces.
>     The 'get' prefix is used here not because it is JavaBeans 
> requirements but because of the method name conventions.
>     For example, the same Utilities class contains 
> getTabbedTextWidth() method which also has the 'get' prefix.
>
>> clipStringIfNecessary method name better reflects the method 
>> operation than the proposed one.
>     The 'necessary' word is vague in this case. Is there any need to 
> clip a string if it is not necessary?
>     The method description gives the explanation in which case the 
> string will be clipped.
>
>  Thanks,
>  Alexandr.
>
>> This is an utility static API and we don't need to follow JavaBeans 
>> naming conventions here.
>>
>> --Semyon
>>
>>
>> On 1/13/2016 6:03 PM, Alexander Scherbatiy wrote:
>>>
>>>   Hello,
>>>
>>>   Could you review the updated fix:
>>>      http://cr.openjdk.java.net/~alexsch/8132119/webrev.05/
>>>
>>>   - the methods description are updated to mention a component 
>>> numeric shaper and non-print graphics context
>>>   - @since tag value is updated to 9
>>>
>>>  Thanks,
>>>  Alexandr.
>>>
>>> On 1/12/2016 10:42 PM, Philip Race wrote:
>>>> @since needs to be just "9" as of the updated verona versioning 
>>>> scheme.
>>>>
>>>> -phil.
>>>>
>>>> On 1/12/16, 4:25 AM, Semyon Sadetsky wrote:
>>>>> Hi Alexander,
>>>>>
>>>>> I see that you've added the next clarifications to the methods specs:
>>>>>
>>>>> > draws string/returns width ... using text properties and 
>>>>> anti-aliasing hints from the provided component
>>>>>
>>>>> It still seems too brief and even incorrect for getStringWidth().
>>>>>
>>>>> For drawString():
>>>>>
>>>>> For non-printing case I would write:
>>>>>
>>>>> Sets the anti-aliasing rendering hints to the Graphics object if 
>>>>> those are specified in the component properties. Then the string 
>>>>> is drawn using the provided Graphics object with the numeric 
>>>>> shaper taken into account if it is defined for the component.
>>>>>
>>>>> Please consider the printing case...
>>>>>
>>>>> For getStringWidth():
>>>>>
>>>>> Did not get which anti-aliasing hints it takes into account while 
>>>>> there is no Graphics in the params list...
>>>>> On the contrary, it does not take into account the rendering context.
>>>>> My suggestion:
>>>>>
>>>>> Returns string pixel width by the provided font metrics and 
>>>>> according to the numeric shaper if it is defined for the component.
>>>>>
>>>>> --Semyon
>>>>>
>>>>> For
>>>>> On 12/10/2015 5:06 PM, Alexander Scherbatiy wrote:
>>>>>>
>>>>>>  Hello,
>>>>>>
>>>>>>  Could you review the updated fix:
>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.04/
>>>>>>
>>>>>> On 12/10/2015 2:39 PM, Alexey Ivanov wrote:
>>>>>>> Hi Alexandr,
>>>>>>>
>>>>>>> I suggest using {@code underlinedIndex} in this sentence:
>>>>>>>
>>>>>>> * The {@code underlinedIndex} parameter points to a char value 
>>>>>>> (Unicode code unit) in the
>>>>>>> * given string.
>>>>>>>
>>>>>>> in the Javadoc for drawStringUnderlineCharAt().
>>>>>>>
>>>>>>>
>>>>>>> And I suggest using "fits" instead of "can fit" in @return for 
>>>>>>> getClippedString() and rephrasing the conditions where empty 
>>>>>>> string is returned:
>>>>>>>
>>>>>>> * @return the clipped string that fits in the provided space, an 
>>>>>>> empty
>>>>>>> *         string if the given string argument is {@code null} or 
>>>>>>> empty.
>>>>>>
>>>>>>    The fix is updated according to the provided comments.
>>>>>>
>>>>>>    Thanks,
>>>>>>    Alexandr.
>>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Alexey
>>>>>>>
>>>>>>> On 10.12.2015 5:23, Alexander Scherbatiy wrote:
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> Could you review the updated fix:
>>>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.03/
>>>>>>>>
>>>>>>>> - methods description is updated to mention used text 
>>>>>>>> properties and anti-aliasing hints from the provided component
>>>>>>>> - the drawStringUnderlineCharAt method description is updated
>>>>>>>> - @since tag is added for the drawString() method
>>>>>>>> - the description that some parameters may/must not be null is 
>>>>>>>> added
>>>>>>>> - the test is updated to call the methods on EDT
>>>>>>>> - the test is updated to check passed null arguments
>>>>>>>>
>>>>>>>> On 09/12/15 14:40, Alexey Ivanov wrote:
>>>>>>>>> Hi Alexandr,
>>>>>>>>>
>>>>>>>>> Shouldn't drawString() also have @since tag?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Could you please also clarify whether underlinedIndex in 
>>>>>>>>> drawStringUnderlineCharAt refers to the char index in the string?
>>>>>>>>>
>>>>>>>>> The statement
>>>>>>>>> * The underlined index refers to char values (Unicode code 
>>>>>>>>> units).
>>>>>>>>> makes it unclear: underlinedIndex is an *index* or a *char* 
>>>>>>>>> (Unicode code point).
>>>>>>>>
>>>>>>>>  I updated it to "The underlined index points to a char value 
>>>>>>>> (Unicode code unit) in the given string."
>>>>>>>>  The 'refers' word was used for a value at the given index.
>>>>>>>>  However, I am not sure that the new variant is better.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> * Nothing is drawn for null string. No character is underlined 
>>>>>>>>> for the
>>>>>>>>> * index {@code < 0}, {@code >=} than the string width or if 
>>>>>>>>> the char value
>>>>>>>>> * specified at the given index is in the low-surrogate range.
>>>>>>>>>
>>>>>>>>> I think it will be better to spell comparison operators, I 
>>>>>>>>> mean to use  "greater than" rather than ">=". And "length" 
>>>>>>>>> must be used instead of "width".
>>>>>>>>>
>>>>>>>>> I propose the following text:
>>>>>>>>>
>>>>>>>>> No character is underlined if the index is negative or greater 
>>>>>>>>> than the string length or if the char value specified at the 
>>>>>>>>> given index is in the low-surrogate range.
>>>>>>>>>
>>>>>>>>> For the first part of condition, you can add clarification in 
>>>>>>>>> parenthesis: {@code index < 0 || index >= string.length()}.
>>>>>>>>  Updated.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> For consistency, please remove the full stop in @return tag in 
>>>>>>>>> description of getClippedString.
>>>>>>>>
>>>>>>>> Updated.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Alexandr.
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Alexey
>>>>>>>>>
>>>>>>>>> On 25.11.2015 18:28, Alexandr Scherbatiy wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hello,
>>>>>>>>>>
>>>>>>>>>> Could you review the updated fix:
>>>>>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.02
>>>>>>>>>>
>>>>>>>>>> The javadoc references for the #drawStringUnderlineCharAt and 
>>>>>>>>>> #getClippedString methods are moved after parameters 
>>>>>>>>>> description.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Alexandr.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> 14.09.2015 17:39, Alexander Scherbatiy пишет:
>>>>>>>>>>>
>>>>>>>>>>> Hello,
>>>>>>>>>>>
>>>>>>>>>>> Could you review the updated fix:
>>>>>>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.01/
>>>>>>>>>>>
>>>>>>>>>>> I tried to use Utilities.drawStringUnderlineCharAt(...) with 
>>>>>>>>>>> chars that have
>>>>>>>>>>> - 1 character:2 glyphs mapping (U+00E1) and ligature (U+FB01)
>>>>>>>>>>> The whole glyph is underlined.
>>>>>>>>>>> - 2 characters: 1 glyph mapping (supplementary char U+10400)
>>>>>>>>>>>
>>>>>>>>>>> The char value specified the the underlined index should 
>>>>>>>>>>> point to the high-surrogate range of a supplementary character.
>>>>>>>>>>> I updated the javadoc for the 
>>>>>>>>>>> Utilities.drawStringUnderlineCharAt(...) method to:
>>>>>>>>>>> -----------------------------
>>>>>>>>>>> /**
>>>>>>>>>>> * Draws the given string at the specified location underlining
>>>>>>>>>>> * the specified character.
>>>>>>>>>>> * <p>
>>>>>>>>>>> * The underlined index refers to char values (Unicode code 
>>>>>>>>>>> units).
>>>>>>>>>>> * If the char value specified at the given underlined index 
>>>>>>>>>>> is in
>>>>>>>>>>> * the high-surrogate range and the char value at the 
>>>>>>>>>>> following index is in
>>>>>>>>>>> * the low-surrogate range then the supplementary character 
>>>>>>>>>>> corresponding
>>>>>>>>>>> * to this surrogate pair is underlined.
>>>>>>>>>>> * <p>
>>>>>>>>>>> * Nothing is drawn for null string. No character is 
>>>>>>>>>>> underlined for the
>>>>>>>>>>> * index {@code < 0}, {@code >=} than the string width or if 
>>>>>>>>>>> the char value
>>>>>>>>>>> * specified at the given index is in the low-surrogate range.
>>>>>>>>>>> -----------------------------
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Alexandr.
>>>>>>>>>>>
>>>>>>>>>>> On 9/7/2015 12:27 PM, Alexander Scherbatiy wrote:
>>>>>>>>>>>> On 9/2/2015 8:09 PM, Phil Race wrote:
>>>>>>>>>>>>> I don't remember or know how Swing resolves this but the 
>>>>>>>>>>>>> measurement ones
>>>>>>>>>>>>> are not reliable since they do not take a Graphics 
>>>>>>>>>>>>> context, so you cannot
>>>>>>>>>>>>> measure the string properly. You need a FontRenderContext 
>>>>>>>>>>>>> to measure.
>>>>>>>>>>>>
>>>>>>>>>>>> The provided methods use 
>>>>>>>>>>>> SwingUtilities2.getFontRenderContext(JComponent) method 
>>>>>>>>>>>> which returns the FontRenderContext associated with the 
>>>>>>>>>>>> component.
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> So as it stands these APIs do not appear suitable to be 
>>>>>>>>>>>>> made public as they
>>>>>>>>>>>>> are not reliable.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Whilst I could look at the code, if I instead just look at 
>>>>>>>>>>>>> the API, I am scratching my
>>>>>>>>>>>>> head over :-
>>>>>>>>>>>>>
>>>>>>>>>>>>> public static void drawString(JComponent c, Graphics g, 
>>>>>>>>>>>>> String text, int x, int y)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Here you provide the Graphics *and* the Component.
>>>>>>>>>>>>> And it says the JComponent may be null.
>>>>>>>>>>>>> So I am supposing that there is optional information that 
>>>>>>>>>>>>> may be pulled from the
>>>>>>>>>>>>> JComponent regarding rendering mode ?
>>>>>>>>>>>>
>>>>>>>>>>>> The optional information provided by the component is:
>>>>>>>>>>>> - java.awt.font.NumericShaper
>>>>>>>>>>>> - java.awt.font.FontRenderContext
>>>>>>>>>>>> - antialiasing hints
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> drawStringUnderlineCharAt(..) probably needs to explain if 
>>>>>>>>>>>>> the index is code point
>>>>>>>>>>>>> or UTF16 char index and what happens if there is not 1:1 
>>>>>>>>>>>>> code point:glyph mapping.
>>>>>>>>>>>> I will update this.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Are we sure that (any of) these really ought/need to be 
>>>>>>>>>>>>> public - particularly given the
>>>>>>>>>>>>> resolution of 
>>>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-6302464
>>>>>>>>>>>>
>>>>>>>>>>>> These methods are used by JDK L&Fs to draw text. The 
>>>>>>>>>>>> initial request was to provide public methods that can be 
>>>>>>>>>>>> used by a custom L&F to draw strings consistently with 
>>>>>>>>>>>> other L&Fs.
>>>>>>>>>>>>
>>>>>>>>>>>> They are also designed to properly render text for 
>>>>>>>>>>>> printing. To do that they use call to internal 
>>>>>>>>>>>> ProxyPrintGraphics class to obtain the print graphics context.
>>>>>>>>>>>>
>>>>>>>>>>>> Even if printing staff will be public, these methods are 
>>>>>>>>>>>> just utility methods (in the same way as other text methods 
>>>>>>>>>>>> in the javax.swing.text.Utilities class) that help easily 
>>>>>>>>>>>> to draw and print text in the same way as JDK L&Fs do that.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Alexandr.
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> -phil.
>>>>>>>>>>>>>
>>>>>>>>>>>>> On 09/02/2015 08:28 AM, Alexander Scherbatiy wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Could you review the fix:
>>>>>>>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8132119
>>>>>>>>>>>>>> webrev: 
>>>>>>>>>>>>>> http://cr.openjdk.java.net/~alexsch/8132119/webrev.00
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The suggested drawString, drawStringUnderlineCharAt, 
>>>>>>>>>>>>>> clipStringIfNecessary, and stringWidth methods are
>>>>>>>>>>>>>> added to the javax.swing.text.Utilities class.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> Alexandr.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>
>>
>




More information about the swing-dev mailing list