So do we go ahead and implement tabSize without the CSS support?   I’m not sure 
the CSS property should be added before unit issues are worked out, as I think 
the units would be expected in the CSS context.  E.g. CSS implicitly adds ‘px’ 
if no unit is specified.  If our tabSize units are spaces, that breaks.

Scott

> On Oct 17, 2019, at 2:16 PM, Kevin Rushforth <kevin.rushfo...@oracle.com> 
> wrote:
> 
> It might make sense to just add the tabSize property now, and later consider 
> adding a tabUnits property in the future if needed. By default, having the 
> units be "number of spaces in the current font" is what makes the most sense, 
> so before we could add tabUnits we would need to extend it as you suggest. 
> I'm not sure it's needed, though, so that would be another reason not to do 
> it now.
> 
> It's probably best to have the type of tabSize be double rather than int. We 
> do this for most attributes to leave the door open for fractional values. I 
> don't know why anyone would want a tab that was 5.7 spaces, but if we ever 
> were to add a tabUnits property, I could easily see wanting fractional values 
> for some units.
> 
> -- Kevin
> 
> On 10/17/2019 10:40 AM, Scott Palmer wrote:
>> Hi Phil,
>> 
>> Thanks for taking a look.  I was going to get back to this soon to attempt 
>> adding the CSS property as you mention in your previous email.  I considered 
>> tabSize as a name as well.  I don’t have a preference if we leave things as 
>> representing tabs as a number of spaces.  But it wouldn’t be too difficult 
>> to support units, making it mostly compatible with CSS rules.  The way I 
>> envision that is having two properties, tabSize and tabUnit.
>> 
>> David mentioned javafx.css.SizeUnits… I looked quickly at the java docs for 
>> it, and it’s basically undocumented .  So I went to 
>> https://www.w3.org/TR/css-values-3/#lengths and I see there is no CSS unit 
>> like ‘ems’ but meaning the width of a space in the current font.  The 
>> problem with that is it would leave out the possibility to set the tab width 
>> to anything relative to the current implementation of 8 spaces. (In 
>> hindsight it should have been implemented based on ‘ems’, which for a fixed 
>> width font as typically used in a code editor would be the same as 8 spaces 
>> anyway)
>> Do we add something to SizeUnits so we can work around this?  e.g. ‘fxsp’  
>> (FX-space - fx prefix to avoid a potential collision with any future 
>> official CSS units)
>> 
>> // Two tab-related properties
>> public void setTabSize(int size); // defaults to 8
>> public void setTabUnits(SizeUnits units); // ?? no unit for width of space 
>> in current font
>> 
>> If we did the above, I would consider adding this for convenience:
>> public void setTabWidth(int size, TabUnits units);
>> 
>> As far as setting a range, I’m not sure there is any worthwhile benefit to 
>> enforcing a maximum.  If we want to store the value in a short instead of an 
>> int to potentially save a couple bytes, sure.  Otherwise, if someone wants 
>> to set tabs to be 20 spaces or 100, why should we prevent it?  If there 
>> isn't a performance or memory impact, I wouldn’t enforce a maximum.
>> 
>> Ignoring any out of range values rather than clamping seems fine to me as 
>> well.  I was thinking of what happens if the value was bound to another 
>> value that strayed out of range. Clamping would get you as close as possible 
>> to the bound value, rather than stuck at the previously observed value.  I 
>> just guessed that would be preferred, but if ignoring is more consistent 
>> with other values, then I agree it makes sense.  As long as the behaviour is 
>> documented, I can’t think of any significant downside either way.
>> 
>> 
>> Regards,
>> 
>> Scott
>> 
>> 
>>> On Oct 17, 2019, at 12:45 PM, Phil Race <philip.r...@oracle.com> wrote:
>>> 
>>> Hi,
>>> 
>>> Some more points which I thought about but for whatever reason did not pen 
>>> ..
>>> 
>>> First one minor thing: tabWidth is an OK name, but it does not
>>> conjure up that the value you specify isn't a width in pixels but the
>>> number of discrete space characters to use. FWIW CSS calls it tab-size.
>>> But CSS then supports pixels and ems .. that complicates matters a lot.
>>> 
>>> https://developer.mozilla.org/en-US/docs/Web/CSS/tab-size
>>> 
>>> Thee rest is mostly to do with "legal or sensible values"
>>> 
>>> You have :
>>>         if (spaces < 0)
>>>             spaces = 0;
>>> 
>>> since negative values are not something we want to support!
>>> But I think instead of clamping you could "ignore", any out of range value.
>>> This is practiced elsewhere in FX where illegal values are ignored rather 
>>> than
>>> throwing an exception, although it might be that clamping is quite common
>>> in range cases.
>>> 
>>> The follow on to that is that what is a sensible maximum value.
>>> Currently we have int which is more than we need. For that matter so is 
>>> short.
>>> I think we should have a documented and enforced sensible maximum.
>>> Perhaps it could be "8" meaning we only support reducing tab width as I
>>> don't know if anyone really wants to increase it.
>>> CSS doesn't have a limit that I can see but if we are already only 
>>> supporting
>>> it described as number of spaces, we can have this other limitation too.
>>> If you think 8 is too small, then maybe 16 ?
>>> Also remember we can compatibly relax it later but we can't compatibly 
>>> tighten it.
>>> 
>>> 
>>> -phil.
>>> 
>>> On 10/15/19 12:17 PM, Phil Race wrote:
>>>> Hi,
>>>> 
>>>> I've looked over this and I don't see any issues - meaning gotchas.
>>>> It just provides a way to over-ride the hard-coded 8,
>>>> whether using a Text node directly or a TextFlow.
>>>> 
>>>> Two observations of what one might call limitations
>>>> 1) This is a rendering time property, which is controlled by the program.
>>>> A document containing tabs saved and re-rendered somewhere else
>>>> won't be helped.
>>>> 
>>>> 2) This just provides API on the scene graph node types, not any of the UI 
>>>> controls
>>>> which use Text nodes. Something like a CSS property may be the way to go if
>>>> you wanted that.
>>>> Text has a nested class StyleableProperties for CSS properties with which 
>>>> it
>>>> plays nice : font, underline, strikethrough, text-alignment
>>>> 
>>>> So creating an fx-tabWidth (or similar name) CSS property could be 
>>>> propagated
>>>> through to there in a similar way.
>>>> 
>>>> -phil.
>>>> 
>>>> 
>>>> On 9/30/19 9:48 AM, Scott Palmer wrote:
>>>>> Okay, current work relocated to a clone of the new official Git repo.
>>>>> My initial implementation is here:
>>>>> https://github.com/swpalmer/jfx/commit/cc6193451bf8a693093f3ded5dcbe47af2fcbe8f
>>>>>  
>>>>> <https://github.com/swpalmer/jfx/commit/cc6193451bf8a693093f3ded5dcbe47af2fcbe8f>
>>>>> 
>>>>> I would submit it as a pull request but that seems premature since there 
>>>>> hasn’t been any real discussion of challenges I’ve overlooked.  All I 
>>>>> have are the famous last words, “It works for me.”
>>>>> 
>>>>> I saw in the archives a concern about tab width vs tab stops. For some 
>>>>> reason I didn’t get the email.  Anyway, I don’t think arbitrary tab stop 
>>>>> positions, at different intervals that is, are what was asked for.  That 
>>>>> certainly would require a significantly different implementation.
>>>>> 
>>>>> Would love to keep some momentum going on this before I become busy with 
>>>>> other things and won’t have time for it.
>>>>> 
>>>>> Scott
>>>>> 
>>>>>> On Sep 23, 2019, at 3:57 PM, Scott Palmer <swpal...@gmail.com> wrote:
>>>>>> 
>>>>>> My current work is here 
>>>>>> https://github.com/javafxports/openjdk-jfx/compare/develop...swpalmer:jdk-8130738?expand=1
>>>>>>  
>>>>>> <https://github.com/javafxports/openjdk-jfx/compare/develop...swpalmer:jdk-8130738?expand=1>
>>>>>> 
>>>>>> While writing a unit test I realized that the StubToolkit isn’t really 
>>>>>> running the Prism layout code, so I’m not sure how that gets tested.  I 
>>>>>> made it work with StubTextLayout for now.
>>>>>> 
>>>>>> Regards,
>>>>>> 
>>>>>> Scott
>>>>>> 
>>>>>> 
>>>>>>> On Sep 20, 2019, at 12:57 PM, Scott Palmer <swpal...@gmail.com 
>>>>>>> <mailto:swpal...@gmail.com>> wrote:
>>>>>>> 
>>>>>>> Thanks Kevin.
>>>>>>> 
>>>>>>> My current implementation appears to be working for TextFlow and Text, 
>>>>>>> with the TextFlow overriding the tabWidth of the child Text nodes.  
>>>>>>> This seems to work out naturally from the way TextFlow overrides the 
>>>>>>> TextLayout instance used by the Text node.
>>>>>>> 
>>>>>>> If there are tricky corner-cases that I’m missing, I guess figuring out 
>>>>>>> all the cases it will need to handle is part of this discussion.  It 
>>>>>>> didn’t seem to be that challenging so far, so perhaps I am missing 
>>>>>>> something (hopefully not).  I wrote a small test app to visually see 
>>>>>>> that things were working as I expected.  I have not yet written the 
>>>>>>> unit tests.
>>>>>>> 
>>>>>>> Cheers,
>>>>>>> 
>>>>>>> Scott
>>>>>>> 
>>>>>>>> On Sep 20, 2019, at 10:58 AM, Kevin Rushforth 
>>>>>>>> <kevin.rushfo...@oracle.com <mailto:kevin.rushfo...@oracle.com>> wrote:
>>>>>>>> 
>>>>>>>> Hi Scott,
>>>>>>>> 
>>>>>>>> I'm sure Phil will have more comments on this. While the API seems 
>>>>>>>> simple enough on the surface, I suspect that this will be a 
>>>>>>>> challenging feature to implement correctly for all of the cases it 
>>>>>>>> will need to handle. It would need careful review and testing as well. 
>>>>>>>> My only comment on the API itself is that if we do accept this 
>>>>>>>> feature, it should probably go on both Text and TextFlow, and be one 
>>>>>>>> of the attributes of Text that is ignored / overridden when a Text 
>>>>>>>> node is in a TextFlow.
>>>>>>>> 
>>>>>>>> -- Kevin
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On 9/18/2019 6:14 PM, Scott Palmer wrote:
>>>>>>>>> I would like to implement this feature, being able to adjust the tab 
>>>>>>>>> size in a TextFlow or Text node (JDK-8130738 
>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8130738 
>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8130738>>). It involves new 
>>>>>>>>> public API, so I want to start a discussion about it here.  (My 
>>>>>>>>> motivation is that RichTextFX suggests an entirely unacceptable 
>>>>>>>>> workaround of substituting actual spaces when the tab character is 
>>>>>>>>> typed and cites the lack of this API.)
>>>>>>>>> 
>>>>>>>>> I’ve already jumped the gun and taken a crack at an implementation.  
>>>>>>>>> It is currently incomplete as I was just poking around to see if it 
>>>>>>>>> was going to be easy enough to not take up too much of my time.  It 
>>>>>>>>> boils down to:
>>>>>>>>> TextFlow and Text get a new property for tab width, an integer 
>>>>>>>>> representing the number of spaces taken by a tab. (The value is only 
>>>>>>>>> used to initialize the tab width for the TextLayout when needed.)
>>>>>>>>> TextLayout interface gets a new method:  boolean setTabWidth(int 
>>>>>>>>> spaces)
>>>>>>>>> TextLayout gets a new constant: DEFAULT_TAB_WIDTH = 8;
>>>>>>>>> PrismTextLayout implements the new setTabWidth API.
>>>>>>>>> 
>>>>>>>>> I’m not sure that the Text node needs this new property.  I figured 
>>>>>>>>> it would be rarely used on that class, so I had implemented it via an 
>>>>>>>>> added property in the private TextAttributes class.  Maybe it isn’t 
>>>>>>>>> needed at all.
>>>>>>>>> 
>>>>>>>>> What’s the next step?
>>>>>>>>> 
>>>>>>>>> Regards,
>>>>>>>>> 
>>>>>>>>> Scott
> 

Reply via email to