Michael,
I have been giving the styling discussion some thought. It seems like your
primary objective is to provide support for CSS-like type selectors. In other
words, you would like to ensure that a consistent set of styles is applied to
all instances of a particular component type - is that correct?
If so, I have a solution that I think will fit in well with the existing
architecture but will still meet your needs. I am thinking that
Component#setSkin() can be updated to apply a predefined set of styles to each
component instance as it is created. For example, I could say that all
PushButtons should have the "{font:'Arial-BOLD-24'}" style applied at creation
time.
I thought about various means for how those styles should be specified. I first
considered supporting a global stylesheet defined in CSS. However, the problem
with this approach is that CSS doesn't know anything about Java packages. So
you'd end up repeating quite a bit in your style declarations:
org.apache.pivot.wtk.PushButton: {
font: "Arial-BOLD-24";
}
It would also necessitate writing or porting a CSS parser, which I would like
to avoid. More importantly, it would introduce a dependency on CSS that we
currently don't have.
Unfortunately, the same problem would apply to a JSON-based global stylesheet,
since JSON doesn't have a concept of namespaces either:
{ org.apache.pivot.wtk.PushButton: {
font: "Arial-BOLD-24";
}
}
I also thought about an XML approach, since XML does support namespaces:
<styles xmlns="org.apache.pivot.wtk">
<PushButton font="Arial-BOLD-24"/>
</styles>
However, this seems pretty clumsy, and it is a bit confusing, since it looks a
bit like BXML but is not.
In all of these cases, there is also the issue of how the location of the
stylesheet will be provided to the platform. It could be specified via a custom
system property, but those are only available to trusted code. That's too
limiting.
So here is what I have come up with. To review, one current way to apply styles
to any instance of a type is as follows:
<PushButton styles="@my_button_styles.json"/>
The button styles are encapsulated in an external JSON file named
"my_button_styles.json" that looks like this:
{ font: "Arial-BOLD-24"
}
However, since we want all PushButton instances to have the same styles
applied, we want to put them somewhere that the platform knows about, so they
can be applied when the component is created. I think we can do it like this:
create a directory structure that parallels the package structure of the
component you want to style, and create a JSON file that represents the styles
you want applied to that particular type:
/org
/apache
/pivot
/wtk
PushButton.json
When the component is created, Component#setSkin() will look for a file with
the same name as the component class, but with a .json extension. If it finds
one, it will apply the styles contained in the file to the new instance.
I like this approach because it is consistent with the existing infrastructure,
but also because it applies the CSS notion of a "class" in a Java-centric
manner: the actual Java class lives in /org/apache/pivot/wtk/PushButton.class,
and the style "class" for that class lives in
/org/apache/pivot/wtk/PushButton.json.
Please let me know what you think.
Greg