[API Review] RT-21094 - Styleable interface
Richard Bair
richard.bair at oracle.com
Thu Jan 24 08:39:01 PST 2013
Curse you generics!!!! (shakes fist)
On Jan 23, 2013, at 5:59 PM, David Grieve <david.grieve at oracle.com> wrote:
> Thanks for the feedback. I think I have it straight now:
>
> List<CssMetaData<? extends Styleable, ?>> getCssMetaData();
>
> e.g.,
>
> CssMetaData<Node, Number> OPACITY;
>
> @Override
> public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
> List<CssMetaData<? extends Styleable, ?>> list;
> list = new ArrayList<CssMetaData<? extends Styleable, ?>>();
> list.add(OPACITY);
> return list;
> }
>
> On Jan 22, 2013, at 6:00 PM, Tom Schindl <tom.schindl at bestsolution.at> wrote:
>
>> Hi,
>>
>> I didn't understand what <S extends Styleable> ... would be good for
>> because this will lead to a warning in the subclasses:
>>
>>> public class Node implements Styleable {
>>>
>>> @Override
>>> public List<CssMetaData<Node, Object>> getMetaData() {
>>> // TODO Auto-generated method stub
>>> return null;
>>> }
>>>
>>> }
>>
>>>> Type safety: The return type List<CssMetaData<Node,Object>> for getMetaData() from the type Node needs unchecked conversion to conform to List<CssMetaData<? extends Styleable,Object>> from the type Styleable
>>
>> And I think the value should not be ? but Object. What we'd really need
>> here are self-references but Java does not have them.
>>
>> One of the problems with generic lists is that they are not covariant
>>
>> List<Styleable,Object> v = ...;
>> List<Node,Object> l = ...;
>> v = l; // illegal
>>
>> and so one can not overload them in subclasses and return a more
>> specific one, same goes for adding/removing elements:
>>
>> List<CssMetaData<Styleable,Object>> l = ...;
>> CssMetaData<Button,Boolean> v = ...
>> l.add(v); // illegal
>>
>> So something is going wrong here!
>>
>> Tom
>>
>> Am 22.01.13 23:15, schrieb David Grieve:
>>> The JIRA is public now, thanks for pointing that out.
>>>
>>> The getCssMetaData() API should be
>>>
>>> <S extends Styleable> List<CssMetaData<S, ?>> getCssMetaData();
>>>
>>>
>>> On Jan 22, 2013, at 4:42 PM, Tom Schindl <tom.schindl at bestsolution.at
>>> <mailto:tom.schindl at bestsolution.at>> wrote:
>>>
>>>> Hi,
>>>>
>>>> The problem I see with this is that CssMetaData accepts 2 generic
>>>> parameters but your API returns a RAW-Type, this looks bogus to me!
>>>>
>>>> BTW the JIRA is not public.
>>>>
>>>> Tom
>>>>
>>>> Am 22.01.13 22:09, schrieb David Grieve:
>>>>> http://javafx-jira.kenai.com/browse/RT-21094
>>>>>
>>>>> There is a class in private implementation called Styleable which
>>>>> allows SceneBuilder to look at a Tooltip (for example) and get the
>>>>> info it needs for styling. What I'd like to do is make Styleable part
>>>>> of the public API _and_ have Node and PopupControl (there may be a
>>>>> couple of other controls) implement Styleable. From the CSS
>>>>> standpoint, Styleable contains the API that CSS needs to match
>>>>> selectors and set calculated values on properties.
>>>>>
>>>>> By making Styleable public API, I can change CssMetaData from
>>>>> CssMetaData<N extends Node, V> to CssMetaData<N extends Styleable,
>>>>> V>. This is important to do now before the CSS API is fully baked so
>>>>> that we can, in the future, have Scene be Styleable.
>>>>>
>>>>> public interface Styleable {
>>>>>
>>>>> /**
>>>>> * The type of this {@code Styleable} that is to be used in
>>>>> selector matching.
>>>>> * This is analogous to an "element" in HTML.
>>>>> * (<a href="
>>>>> http://www.w3.org/TR/CSS2/selector.html#type-selectors">CSS Type
>>>>> Selector</a>).
>>>>> */
>>>>> String getType();
>>>>>
>>>>> /**
>>>>> * The id of this {@code Styleable}. This simple string identifier
>>>>> is useful for
>>>>> * finding a specific Node within the scene graph. While the id of
>>>>> a Node
>>>>> * should be unique within the scene graph, this uniqueness is not
>>>>> enforced.
>>>>> * This is analogous to the "id" attribute on an HTML element
>>>>> * (<a
>>>>> href="http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier">CSS
>>>>> ID Specification</a>).
>>>>> * <p>
>>>>> * For example, if a Node is given the id of "myId", then the
>>>>> lookup method can
>>>>> * be used to find this node as follows:
>>>>> <code>scene.lookup("#myId");</code>.
>>>>> * </p>
>>>>> */
>>>>> String getId();
>>>>>
>>>>> /**
>>>>> * A list of String identifiers which can be used to logically group
>>>>> * Nodes, specifically for an external style engine. This variable is
>>>>> * analogous to the "class" attribute on an HTML element and, as
>>>>> such,
>>>>> * each element of the list is a style class to which this Node
>>>>> belongs.
>>>>> *
>>>>> * @see <a
>>>>> href="http://www.w3.org/TR/css3-selectors/#class-html">CSS3 class
>>>>> selectors</a>
>>>>> */
>>>>> List<String> getStyleClass();
>>>>>
>>>>> /**
>>>>> * The inline style. This is analogous to the "style" attribute of an
>>>>> * HTML element.
>>>>> */
>>>>> String getStyle();
>>>>>
>>>>> /**
>>>>> * Return the parent of this Styleable, or null if there is no
>>>>> parent.
>>>>> */
>>>>> Styleable getStyleableParent();
>>>>>
>>>>> /**
>>>>> * The CssMetaData of this Styleable
>>>>> */
>>>>> List<CssMetaData> getCssMetaData();
>>>>>
>>>>> }
>>>>>
>>>>
>>>>
>>>> --
>>>> B e s t S o l u t i o n . a t EDV Systemhaus GmbH
>>>> ------------------------------------------------------------------------
>>>> tom schindl geschäftsführer/CEO
>>>> ------------------------------------------------------------------------
>>>> eduard-bodem-gasse 5-7/1 A-6020 innsbruck fax ++43 512 935833
>>>> http://www.BestSolution.at phone ++43 512 935834
>>>
>>
>>
>> --
>> B e s t S o l u t i o n . a t EDV Systemhaus GmbH
>> ------------------------------------------------------------------------
>> tom schindl geschäftsführer/CEO
>> ------------------------------------------------------------------------
>> eduard-bodem-gasse 5-7/1 A-6020 innsbruck fax ++43 512 935833
>> http://www.BestSolution.at phone ++43 512 935834
>
More information about the openjfx-dev
mailing list