You’re right.  Something I was reading indicated that while there was no 
default unit, ‘px’ was implicitly appended.  I can’t find that now. Go figure.

Everything I find now about CSS tab-size is in agreement with what David wrote. 
 It’s a number of spaces.  With units it would be a ‘length’ but nothing 
supports that.

So I think it makes sense to add -fx-tab-size as a CSS property, only 
supporting a number with no units.

Scott


> On Oct 17, 2019, at 2:32 PM, Phil Race <philip.r...@oracle.com> wrote:
> 
> Really ? It defaults to pixels ? Is that just inherited as being the default 
> CSS unit ?
> Is that FX's implementation
> 
> Hmm. A bit of reading about web CSS says that strictly anything without an 
> explicit unit should be ignored.
> The only exception is zero, where it doesn't matter.
> 
> Eg see : 
> https://stackoverflow.com/questions/7907749/default-unit-for-font-size
> 
> Although I am sure there are more authoratative  sources than that.
> 
> -phil.
> 
> On 10/17/19 11:22 AM, Scott Palmer wrote:
>> 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