API REVIEW REQUEST: Public API for Node Orientation

steve.x.northover at oracle.com steve.x.northover at oracle.com
Thu Nov 8 14:35:01 PST 2012


I have entered JIRA for the API issues and add Pavel to them.  Anyone 
who cares can track the API evolution there and of course, ask questions 
on this list.

http://javafx-jira.kenai.com/browse/RT-26140
http://javafx-jira.kenai.com/browse/RT-26142
http://javafx-jira.kenai.com/browse/RT-26141

Steve

On 02/11/2012 12:03 PM, steve.x.northover at oracle.com wrote:
> Hi Pavel,
>
> In order to make more progress on the implementation, we have decided 
> to enter JIRA issues for your API suggestions and follow up there.  
> Leif will be entering the JIRA and posting the bug id's back to the 
> list so that anyone who is interested can follow along.
>
> Thanks for your input,
> Steve
>
> On 30/10/2012 6:41 AM, Pavel Safrata wrote:
>> Hi Steve,
>>
>> On 29.10.2012 16:17, steve.x.northover at oracle.com wrote:
>>>
>>>
>>> On 29/10/2012 7:49 AM, Pavel Safrata wrote:
>>>> Hi Steve,
>>>>
>>>> On 26.10.2012 18:41, steve.x.northover at oracle.com wrote:
>>>>>  Hi Pavel!
>>>>>
>>>>> > the inheritance ignoring reparenting.
>>>>>
>>>>> I don't think this was explained well in the documentation. There 
>>>>> should be no difference in visual behavior for the final result 
>>>>> with respect to the ordering of "orientate" and "insert" operations.
>>>>
>>>> It seems to be explained well. This is how I understand it, please 
>>>> tell me which of the two statements is incorrect and why:
>>>>
>>>> I have a left-to-right parent with an inheriting child. I create 
>>>> new parent, "orientate" it to right-to-left and "insert" it between 
>>>> the original parent and the child. Based on "If an application 
>>>> explicitly sets the root of a hierarchy to left-to-right and then 
>>>> reparents the hierarchy into a parent that is right-to-left, the 
>>>> hierarchy will remain left-to-right" I understand that the child 
>>>> will remain left-to-right.
>>>>
>>>> Again, I have a left-to-right parent with an inheriting child. I 
>>>> create a new parent and "insert" it between the original parent and 
>>>> the child. Then I "orientate" it to right-to-left. Based on 
>>>> "Inheritance of node orientation allows application developers to 
>>>> specify the orientation of a root node and have it apply to all 
>>>> children" I understand that the new orientation will be applied to 
>>>> the child, so it will become right-to-left.
>>>>
>>>
>>> The second statement is true.  The behavior can be summarized as: 
>>> "When not explicitly set, orientation is inherited".  I'm not sure 
>>> about the confusion in the first statement.  The sentence is meant 
>>> to mean that a hierarchy of nodes with an explicitly set root will 
>>> always have the explicitly set orientation of the root no matter 
>>> where the root is reparented.  Perhaps I should delete the sentence 
>>> and replace it with something like what I just said.
>>
>> Got it. The confusion is that you mean reparenting the hierarchy 
>> including the root, I thought you meant leaving the root on place and 
>> reparenting its children to a different root. So I think it is ok 
>> (but yes, rewording the sentence may be useful, I'm not the only one 
>> to understand it that way).
>>
>>>
>>>>>
>>>>> > How will mirroring cooperate with transformations?
>>>>>
>>>>> The mirroring transformation is transparent to the application and 
>>>>> is included automatically in local-to-scene (it's a bug if it is 
>>>>> not).  A public Mirror (or rather Flip) transformation would 
>>>>> provide API for this transformation, but I'm not sure why we would 
>>>>> need to do this.
>>>>
>>>> Ah, that sounds quite good. The only thing that slightly bothers me 
>>>> is the state where there are no transformations anywhere and 
>>>> local-to-scene transform still reports it is not an identity 
>>>> transform, which seems confusing. But perhaps I'm too picky.
>>>>
>>>>>
>>>>> > Shouldn't effectiveNodeOrientation be a property?
>>>>>
>>>>> That's a possibility.  It would be a properly that changed when 
>>>>> inherited orientation up the ancestor tree changed.  Do we have 
>>>>> any other properties like this in FX?
>>>>
>>>> localToSceneTransform :-) But I admit there is some extra logic 
>>>> needed for such properties that we don't want to add blindly for 
>>>> performance reasons. So it may be better to just rename the getter 
>>>> to simply effectiveNodeOrientation().
>>>>
>>>
>>> It might be that this needs to be a property after all.  The issue 
>>> is that a child may have state that is sets based on effective 
>>> orientation (say alignment of a text node) and this state needs to 
>>> be kept up to date with effective orientation.  However, providing 
>>> the method is defined correctly, there is nothing stopping it from 
>>> becoming a property in future.  I understand the performance issue.  
>>> I will investigate further.
>>
>> For a property we'd have effectiveNodeOrientationProperty() and 
>> getEffectiveNodeOrientation(). For a non-property we'd have something 
>> like effectiveNodeOrientation(). So I think we need to decide in the 
>> beginning..
>>
>>>
>>>>>
>>>>> > The same applies to isAutomaticallyMirrored.
>>>>>
>>>>> This is a mechanism that allows controls to opt out of mirroring. 
>>>>> Conceptually, it should be "... set once in the constructor and 
>>>>> never changed...".  I am not particularly happy with this method. 
>>>>> Do you have a better suggestion?
>>>>
>>>> I've just discussed it locally, there are other options but not 
>>>> particularly nice as well. Guys here also prefer your solution 
>>>> because there is no need to store the value. So I'm withdrawing my 
>>>> objections, however, we believe that the method
>>>> - needs a better documentation that will state explicitly that it's 
>>>> supposed to return a constant
>>>> - should be protected (is there any reason for it to be public?)
>>>> - needs a name that doesn't start with "get" or "is"
>>>
>>> I will update the documentation to be better.  Can you show me other 
>>> examples where the "get" and "is" are not used in FX where they 
>>> might normally be used? 
>>
>> For instance Point2D.magnitude() or Transform.determinant().
>>
>> This is for the compatibility with tools and IDEs that use the naming 
>> to determine if it is a property or not.
>>
>>> I am not a fan of protected.  Other than indicating explicitly that 
>>> subclasses are supposed to override this method, are there any other 
>>> benefits?
>>
>> I believe it is a good approach not to publish things that don't need 
>> to be public. It is a node implementation thing, it should not 
>> confuse users in the list of publicly accessible methods. Other than 
>> you not being a fan, are there any concrete reasons for it to be 
>> public? (the fan thing doesn't leave much room for discussion)
>>
>>>
>>>>
>>>>>
>>>>> > Could you please elaborate on "the application will need to 
>>>>> configure parameters that are appropriate for the effect in both 
>>>>> orientations"?
>>>>>
>>>>> For example, if you want a light source effect to come from the 
>>>>> upper left corner when a control is RTL, you will need to create 
>>>>> an effect where the light source comes from the upper right corner 
>>>>> so that when the control is mirrored, it will come from the left.
>>>>
>>>> Hmm, I would prefer to do that automatically, I don't think anybody 
>>>> wants the reversed shadow just because the reading direction is 
>>>> different. But it looks like it would require serious rework of 
>>>> effects which is probably not feasible..
>>>
>>> This issue is this:  You can't know what the application wants. In 
>>> some cases, it is using an effect as part of a control theme and it 
>>> makes sense for the effect to go from right-to-left when the 
>>> orientation changes.  In other cases, there is directionality 
>>> involved that should remain constant (like the car example in the 
>>> documentation).
>>
>> I think that effects are quite independent of what the application 
>> wants. The reflection always has to reflect the rendered node (having 
>> a right-to-left node with left-to-right reflection doesn't make any 
>> sense), and I think shadow is always dropped the same way based on 
>> the light source, regardless of it being right-to-left text or a car 
>> door. But again, I don't see any reasonable way to implement this 
>> right now.
>>
>> Pavel
>>
>>>
>>>>
>>>> Pavel
>>>>
>>>>>
>>>>> Steve
>>>>>
>>>>> On 26/10/2012 9:16 AM, Pavel Safrata wrote:
>>>>>> Hi Steve,
>>>>>> I have a few comments/questions.
>>>>>>
>>>>>> I'm not sure about the inheritance ignoring reparenting. I think 
>>>>>> that if an application will use orientation extensively it will 
>>>>>> reach a hard-to-trace "mess state" where most of the nodes 
>>>>>> "inherit" but they don't actually have the parent's value. Also 
>>>>>> it means that peforming "orientate parent" - "insert it into 
>>>>>> scene" will result in a different behavior than "insert" first 
>>>>>> and then "orientate", which seems confusing. What if I create a 
>>>>>> new node and insert it into scene, will it inherit form its new 
>>>>>> parent? In summary, I find this behavior hard to track and I 
>>>>>> think that when the value is Inherit it should always match the 
>>>>>> parent's orientation.
>>>>>>
>>>>>> How will mirroring cooperate with transformations? For instance 
>>>>>> user can obtain local-to-scene transformation and if the 
>>>>>> mirrorring is not contained there, the computations with the 
>>>>>> transform (such as transforming points) will be wrong. Maybe we 
>>>>>> could just introduce a public Mirror (or rather Flip) 
>>>>>> transformation and use it publicly for the mirrorring?
>>>>>>
>>>>>> How will it behave in 3D? Mirror nodes along X axis regardless of 
>>>>>> their z-direction volume?
>>>>>>
>>>>>> Shouldn't effectiveNodeOrientation be a property? It seems it 
>>>>>> might make sense to observe the value. Also our naming convention 
>>>>>> is that you should not use getSomthing unless "something" is a 
>>>>>> property.
>>>>>>
>>>>>> The same applies to isAutomaticallyMirrored. This method seems 
>>>>>> weird anyway. When and how often is it called? Can a node change 
>>>>>> the value dynamically? If yes, we should have a property, if not, 
>>>>>> we should make sure it doesn't - let the node call some init 
>>>>>> method in the constructor or something like that.
>>>>>>
>>>>>> Could you please elaborate on "the application will need to 
>>>>>> configure parameters that are appropriate for the effect in both 
>>>>>> orientations"? How do I drop the shadow to the same direction for 
>>>>>> all nodes, specifically?
>>>>>>
>>>>>> Thanks,
>>>>>> Pavel
>>>>>>
>>>>>> On 23.10.2012 22:30, steve.x.northover at oracle.com wrote:
>>>>>>> Hi all,
>>>>>>>
>>>>>>> I have been looking into Node Orientation which is an API that 
>>>>>>> controls the directionality of a Node.  This is different from 
>>>>>>> BIDI or the BIDI algorithm which governs the direction of text. 
>>>>>>> Node orientation concerns the flow of visual data which is 
>>>>>>> either left-to-right or right-to-left.  The best example is a 
>>>>>>> tree control.  In tree control that is oriented right-to-left, 
>>>>>>> the expansion arrows point to the right and the branches of the 
>>>>>>> tree expand from the right to the left.
>>>>>>>
>>>>>>> https://wikis.oracle.com/display/OpenJDK/Node+Orientation+in+JavaFX
>>>>>>>
>>>>>>> Steve
>>>>>>
>>>>
>>


More information about the openjfx-dev mailing list