The key issue is making inheritance work.
The _only_ way to have it work is to mimic the way default attributes
work in the tag compiler. They get compiled into an alist that gets
merged with subclass lists.
The old way, where default values came in one list and constraints
came in another, and styles in another, etc. Never really worked.
There were always bugs where a constraint overrode a style that was
closer when it should have taken the default, etc. Now, everything
comes in one list, and there are special objects in the alist that
become constraints or styles or databindings, but the inheritance is
one uniform computation -- subclass values shadow superclass values as
expected -- and you just run down the merged list and install the
values (or bindings) that surface.
So, whatever we do in the kernel has to work with that model. There's
no easy way. The tag compiler does a lot of work to build the
attribute list from a tag spec. We either have to do that all by hand
in the LFC, or we'd need to invent some new syntax and implement that
in the script compiler. Or, as Henry has suggested (and you just
reminded me), we could start allowing LZX into the LFC. This might be
the way to go in the long run, but will require some changes to our
build system, and obviously, we can't allow just _any_ LZX in the LFC,
it has to be carefully bootstrapped. But you could imagine that
LzView becomes something like LzViewInternal in the LFC, 99%
implemented in Javascript, and then we write the actual <view> tag in
LZX, with documentation and default values. This would probably make
our documentation system much simpler too, since it would not have to
parse Javascript for documentation. Seems like a nice long-term
project for remodularization.
In the short term, here is a sketch of something you could flesh out
that should give us most of what you want. There is the issue of how
we document this -- I think it means editing the documentation of each
attribute that you want to bind by default to a CSS attribute. This
is the brute force way. We might be able to come up with a better
solution where we create a new subclass of LzConstraintExpr that just
records the correspondence between an attribute name and the CSS
property name and builds a closure at runtime to install the correct
constraint. I'll have to think about that a little more...
/** @access private
* @modifiers override
*/
@@ -1073,6 +1117,9 @@
* The background color of the view. Setting <code>bgcolor</code> to
* <code>null</code> will make the view transparent.
*
+ * The background color of the view is controlled by the CSS property
+ * <code>background-color</code>
+ *
* May be set to any valid CSS color specification. When read, will
* be read as the equivalent numeric value. To retrieve a CSS color
* specification, use <code>this.presentAttribute('bgcolor',
@@ -1097,6 +1144,16 @@
this.bgcolor = bgc;
if (this.onbgcolor.ready) this.onbgcolor.sendEvent( bgc );
};
+ /**
+ * Default CSS style binder
+ * @access private
+ */
+ function $lzc$style_bgcolor(ignore) {
+ #pragma "userFunctionName=$style{'background-color'}"
+ this.__LZstyleBindAttribute('bgcolor', 'background-color',
'color');
+ }
+ // Install that as the default in the class attributes table
+ attributes.bgcolor = new LzConstraintExpr('$lzc$style_bgcolor');
/** The horizontal offset of this view's upper left corner from the
* upper left corner of its container.
On 2009-10-06, at 06:44, Max Carlson wrote:
Thoughts?
--
Regards,
Max Carlson
OpenLaszlo.org
From: Max Carlson <m...@openlaszlo.org>
Date: 3 October 2009 22:27:39.000 EDT
To: P T Withington <p...@laszlosystems.com>
Cc: OpenLaszlo development list <laszlo-dev@openlaszlo.org>
Subject: Adding default style attribute values (was Re: [Laszlo-
reviews] For Review: Change 20090924-maxcarlson-T Summary: Compile
style attribute for <attribute/>)
I definitely think we should try assigning standard CSS style
properties. That way, many $style declarations can go away.
A few options come to mind:
1. A LzInheritedHash of default stylename -> attribute mappings
2. Separate class properties similar to setter names, e.g.
style_visible = 'display';
3. Somehow hacking them into the existing attributes LzInheritedHash
Then LzNode would call __LZstyleBindAttribute() for matching
attribute names...
I hate to create a parallel mechanism to that used by the compiler,
but I don't see a way around it. All three of these should support
inheritance.
While we're on the subject, should compiler/AttributeSpec.java be
updated to know about styles?