I finally had a moment to get back at this. I've changed the name of the property from tabWidth to tabSize and implemented the CSS property '-fx-tab-size'. The CSS documentation will need to be updated. I didn't see where the CSS document is located in the source tree.
While adding CSS support I noticed that in both Text.java and TextFlow.java the indentation is wrong for the StyleableProperties nested class (has one extra space). I wasn't sure how much I should change in the scope of this feature. If I don't fix some indenting my changes will look funny beside the lines of existing code. If I fix all of the broken indenting I'll change a lot of lines that have nothing to do with this feature. If I just properly indent the lines I change or add, the indenting will be more chaotic than it is currently. I have noticed a rendering anomaly with a tab size of zero (the value I was initially clamping to) and rather than dealing with that I took the easy way out and changed it to agree with the minimum of 1 that Kevin indicated for the range. I have not limited the maximum tab size. I know Phil has expressed that MAXINT is not his preference, but I can't think of a good criteria for what the maximum should be. I can imagine someone using a tab separator to align columns of text that have much more than 16 characters for example. I did a quick test with the tab size set to Integer.MAX_VALUE-1 and nothing blew up. Of course the text after the tab was nowhere to be seen. Regards, Scott On Thu, Oct 17, 2019 at 3:42 PM Phil Race <philip.r...@oracle.com> wrote: > > > On 10/17/19 12:32 PM, Kevin Rushforth wrote: > > It seems that you have a path forward then. So, there are a couple > > questions to answer: > > > > 1. Should the type of the property be int or double? If it really is > > only ever going to be a number of spaces, then int seems fine. That, > > along with the name of the property, would underscore the fact that > > no, this isn't a size where units make sense; it's a number of spaces. > > A discrete number of spaces, so int. > > > > > 2. Should the range be [1,MAXINT] or [1,16] or [1,something-else]? > > Once that is decided, I think clamp on use would be the most > > consistent with other similar properties, but that's worth checking. > > If we go with "MAXINT" (which is not my preference), I think there'd > need to be some testing of > the various code paths and pipelines to be sure that various values from > large, through extreme, > all do something sensible, and of course, no exceptions or crashes. > > Various code paths means Text, TextFlow, linewrapping or not ... > complex text and simple text too. > Perhaps complex text should be tested anyway, although I've been > assuming that we are handling > tab spacing outside of that but didn't verify it. > > -phil. > > > > > -- Kevin > > > > > > On 10/17/2019 12:11 PM, Scott Palmer wrote: > >> 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 > > > >