Sounds like this may be a case of "where view details become essential to the 
operation of the control, then define the Control to always include those 
specific view details.”


> On Mar 23, 2015, at 11:45 AM, Robert Krüger <krue...@lesspain.de> wrote:
> 
> 
> 
> On Mon, Mar 23, 2015 at 7:07 PM, Richard Bair <richard.b...@oracle.com 
> <mailto:richard.b...@oracle.com>> wrote:
> tl;dr; I lean toward keeping the Control API as view-agnostic as possible, 
> but where view details become essential to the operation of the control, then 
> define the Control to always include those specific view details.
> 
> ============================================================================
> 
> Very interesting discussion, I’m enjoying reading through it. The following 
> is a bit of background as to where my head was when we were designing this.
> 
> In Swing we had a similar concept to the Skins, they were the various UI 
> delegates. In theory they allowed you to change the look of a Swing component 
> (and they did) — but there were all kinds of “view specific” details that 
> leaked into it, and also in the Swing components. With JavaFX, I wanted to go 
> down more of a purist route, where the Skin would literally do all the UI 
> (view)  and the control would be the controller. OK, the Control was a Node 
> because it made more sense conceptually to put a Button into a scene graph 
> than to create a Button, associate it with a view, put the View into the 
> scene graph, and somewhere stash the controller so you could get it back 
> later. And for something like a Button, it works well.
> 
> Almost as soon as we’d gone down this road we got into the various problems 
> you guys have been discussion around scroll bars and view positions. If 
> you’re using the standard UI, then you kind of want to have access to these 
> properties so you can get the UX right. However if we add these properties to 
> ListView, then it would go down the road of saying “ListView displays a list 
> of items and has a scroll bar or at least a scroll position and you have 
> convenience API for making certain items visible, etc”.
> 
> Another very common complaint was about how to go about knowing the size of a 
> cell for a specific list view item. You’d really want an API on ListView that 
> said “getCell(item)” and then you got the cell, at least assuming it was 
> visible, otherwise since it is virtualized it doesn’t make a whole lot of 
> sense. But anyway, if you don’t know whether the skin even does 
> virtualization, then how can you define these semantics in a way that is 
> broadly consistent and usable?
> 
> Basically it comes down to having the API on the controller (Control) and 
> restricting what kinds of skins can be created per control or having users 
> cast the skin to a concrete type and work with the Skin directly for such 
> things. If we were a dynamic language we could be dirty and munge the two 
> together into a single thing (dynamic properties), but with its own set of 
> trade-offs (you have to know what kind of skin you’re dealing with, and if 
> you get it wrong, your app breaks).
> 
> As time went on we ended up adding more view-specific functionality to the 
> controls (even adding view state via the CSS background API etc!!). I don’t 
> know what the right answer is for this design question, but where we were 
> heading was a place where you would have different UI controls for different 
> “classes” of controls. So a ListView with scrollbars is our ListView, and a 
> PagingListView or something would probably be different. They could have a 
> common base class if we designed it such, otherwise they would just have 
> those similarities that are consistent between the two classes of control.
> 
> That is why I find this actually quite appropriate:
> 
> > So Skins prevent us from getting visual details of the Control (such
> > as scroll position, position of item on screen, ...), because it is
> > Skin-specific, but at the same time they fail to customize the look &
> > feel, because visual presentation leaks into the Control anyway.
> 
> 
> This is the design balance! If you get it wrong, you get exactly what you’re 
> saying here.
> 
> In the end, I lean toward keeping the Control API as view-agnostic as 
> possible, but where view details become essential to the operation of the 
> control, then define the Control to always include those specific view 
> details.
> 
> 
> Not understanding the discussion in-depth, I just hope that solving issues 
> like https://javafx-jira.kenai.com/browse/RT-39917 
> <https://javafx-jira.kenai.com/browse/RT-39917> is possible within the 
> current design. If such limitations are something one has to live with, it is 
> not possible to create a UX that can compete with other toolkits including 
> Swing. At the moment this is a brick wall we seem to be hitting porting our 
> product from Swing to JFX.

Reply via email to