I'm thinking applyCSS would just call impl_processCSS(true) and then we should work towards removing impl_processCSS(boolean) if possible, so that we're all just using applyCSS() all the time (once impl_processCSS(boolean) can be removed and all bugs sorted out, then we could just move impl_processCSS() guts into applyCSS, methinks).
Its OK with me if we make the transition over time. Richard On Jul 12, 2013, at 9:19 AM, David Grieve <david.gri...@oracle.com> wrote: > There is Node#impl_processCSS() that is the normal css processing path > (Scene#doCSSPass -> Node#processCSS -> Node#impl_processCSS() -> > CssStyleHelper#transitionToState) . > > impl_processCSS(boolean) was left in because it is a way of forcing the > reapply in cases where CSS was needed to be processed before the next pulse > but has become the panacea for covering up errors, i.e. "this doesn't display > right, try impl_processCSS(true)." > > On Jul 12, 2013, at 12:06 PM, Richard Bair <richard.b...@oracle.com> wrote: > >> My thought was that applyCSS could for now just call impl_processCSS(true) >> -- so it is "Thor's Hammer" and will just hammer everything to be updated. >> Not necessarily fast. Then in subsequent releases we could maybe tune it up. >> Do we *need* the boolean? I know it is sometimes false (TreeView, TableView, >> etc) and other times true. But is the "true" usage really needed or was it >> just to cover up errors we were seeing? I remember having done this but >> don't remember if it was truly needed or not? >> >> Richard >> >> On Jul 12, 2013, at 9:03 AM, David Grieve <david.gri...@oracle.com> wrote: >> >>> I hesitate to mention Node#impl_processCSS(boolean) which is very very >>> close to your notion of applyCss(); impl_processCSS(boolean) is a thorn in >>> my side, but is used in certain places in controls code to ensure CSS is >>> applied before layout in order to ascertain a node's dimensions. What it >>> does is walk up the tree to find the closest parent who's cssFlag is other >>> than clean and then calls processCSS from that node on down. The flag says >>> whether to simply update css or to reapply css (reapply involves figuring >>> out what styles apply to a node). >>> >>> impl_processCSS is also used by SceneBuilder. They created >>> https://javafx-jira.kenai.com/browse/RT-21206 asking to make >>> impl_processCSS(boolean) public. >>> >>> It should also be mentioned that pseudo-class state matters, including the >>> state of the parents, so depending on when you call applyStyle(), you might >>> get different results. The applyStyle() method can't really ignore >>> pseudo-class state since things like orientation (horizontal/vertical) are >>> kind of important. >>> >>> On Jul 12, 2013, at 11:32 AM, Richard Bair <richard.b...@oracle.com> wrote: >>> >>>>>> Is there any reason why I might want to measure a node independent of >>>>>> the layout of its parent? If I have a Button in a StackPane, is there a >>>>>> time I might want to measure the Button independent of the StackPane? I >>>>>> suppose so, if for example I wanted to get snapshots of it at its min >>>>>> size, max size, and pref size, regardless of what the layout container >>>>>> might do with the button. That seems reasonable. >>>>> Yes, maybe. But that would require a completely different API. >>>> >>>> In what way? Just having applyCSS exposed allows me to do this? >>>> >>>>>>> The concept of layout roots is not documented well in the API ( we use >>>>>>> the term in few place, but never define it) and people would have to >>>>>>> know how to identify the layout root and also know that they need to >>>>>>> start from the layout root. Also, there's no way to check which Node is >>>>>>> the layout root, although you can identify it using managedProperty(), >>>>>>> it's parent and/or sub scene. >>>>>> Hmmm. OK, so today suppose I have a scene graph with a root node and >>>>>> someplace down in the hierarchy is an unmanaged node. If I call layout() >>>>>> on the root node, then it will layout everything except for the >>>>>> unmanaged node. If i wanted to get a list of all the dirty layout roots, >>>>>> well, there is no public API to do so. >>>>>> >>>>>> After your change, the semantics of layout would be the same -- calling >>>>>> layout on the root node isn't going to cause the unmanaged node to be >>>>>> laid out. So for what Steve and I are proposing to make sense (just >>>>>> expose applyCSS), we also have to expose either another method >>>>>> (layoutEverythingForTheLove) that will force everything in the tree to >>>>>> be laid out, or we have to have another method (getLayoutRoots) which >>>>>> will accumulate the layout roots so that you can then call layout() on >>>>>> them all manually. >>>>> Actually, calling layout() on scene root will layout everything in the >>>>> root after my changes (as the flags must always be set up to the root, so >>>>> we can find the way to all dirty layout roots), currently this doesn't >>>>> work as the scene root doesn't know whether there are other dirty layout >>>>> roots in the scene. So if you have (Sub)Scene, you can just call >>>>> getRoot().layout() and everything should be laid-out correctly (if you >>>>> also called CSS before). But this would re-layout much more then is >>>>> needed for some specific Node. >>>> >>>> If that's the case then it seems like all you need is applyCSS. Because >>>> from any node you get getScene().getRoot().layout(), or in the worst case >>>> walk up to the root and then fire off the applyCSS / layout. >>>> >>>> In this case, applyCSS becomes the essential API, and "validate" or >>>> whatever it would be called becomes the convenience API. In this case I >>>> would suggest adding the essential API and adding the convenience API >>>> subsequently when the pain is clearly felt and understood. >>>> >>>> Richard >>> >> >