It would be better (we could more efficiently compile, and hence the
back-end compiler/runtime could be more efficient) if this could be
done declaratively. I thought that was the point of a dragstate, that
it was declarative and could be applied or not as necessary?
We can always support the crazy dynamic things that you could get away
with in JS1 runtimes. JS2 instances still have prototype attributes
that behave just as dynamically as JS1 attributes. There will just be
a trade-off: if you do things dynamically at run time, they will not
be as efficient. Right now, we are compiling the LFC classes as
sealed, but then creating a dynamic subclass that can be extended by
LZX class definitions, so dynamic is the default. Maybe some day we
will change that, or give the LZX programmer a choice.
On 2008-02-08, at 10:29 EST, André Bargull wrote:
Concerning states:
How do you want to define the constraint-method on the the parent
class/instance, if you don't know the parent at compile time?
-> People also instantiate classes dynamically at runtime instead of
using solely declarative xml-programming.
For example, you've got a view and you want to make that view
draggable by attaching a dragstate to it:
<canvas debug="true" >
<class name="testview" >
<attribute name="dragger" />
<handler name="onmousedown" >this.dragger.apply()</handler>
<handler name="onmouseup" >this.dragger.remove()</handler>
</class>
<testview width="100" height="100" bgcolor="blue" clickable="true" >
<handler name="oninit" >
this.dragger = new lz.dragstate(this);
</handler>
</testview>
<testview x="150" width="100" height="100" bgcolor="red"
clickable="true" >
<dragstate name="dragger" />
</testview>
</canvas>
On 2/8/2008 3:59 PM, P T Withington wrote:
What I'm working on right now is unifying attribute
initialization. Rather than having separate lists of initial
values, initial expressions/constraints, and style constraints, I
am creating a single list and using classes to distinguish what
type of initialization (or constraining) happens to each
attribute. This should solve the problems we have with literal
overriding a constraint, etc., which all stem from the runtime not
being able to compute how the separate lists interact up the
inheritance chain. This is part of the groundwork to have LZX
classes output as JS2 class declarations at compile time, rather
than the current 'template' that the instantiator reads to create
classes at run time.
As part of this work, and part of the JS2 work, I am changing the
tag compiler to, instead of outputting constraints as free-floating
functions that get call/apply-ed to specific instances, to output
them as methods on the correct class. This is mostly an efficiency
thing. We still could move these constraint methods around if we
had to, I'd just like not to have to, because method calls should
be more efficient than applying a random function to an instance.
Finally, I think I have a fix to make `releaseConstraint` actually
work, that falls out of the above changes. That code had totally
rotted, as you will see in the comment, yet there are a number of
places that either expect it to work or should be using it. (For
example, if you try to change the `align` or `valign` of a view,
you probably get really unexpected results -- the current code
applies a constraint for the new value, but the old constraint is
not released. If it works at all, it is through serendipity of the
order in which the constraints are fired.)
So, states: I think for a state, if there are constraints in the
state, the constraint method will be defined on the parent class/
instance, and the constraint apply/released as the state is applied
or not.
And for implicit replication, yes, I agree, it is probably a matter
of moving the constraint method to the instance/class it will be
applied to (at compile time), and at run time, you may or may not
actually instantiate the replication manager.
On 2008-02-08, at 08:41 EST, André Bargull wrote:
What do you actually plan to do for states, because through states
you'll get dynamic constraints, so dynamic method attachment/
detachment, too.
You've wrote once about a LzConstraint-class, but I can't quite
remember in which context. If you had this LzConstraint-class,
couldn't you add/remove constraints more easily at runtime?
So specifically for implicit replication, you'd only remove the
datapath-/xpath-constraint from the source-node's datapath and
attach it to the replication-manager and that's it.
Also keep in mind, that currently constraint datapaths aren't
fully "bug-free", i.e. LPP-4209 or LPP-5353.
On 2/8/2008 1:46 PM, P T Withington wrote:
True. And this I think is one of the complaints about implicit
replication, that it is unpredictable.
The alternative is that implicit replication will just have to be
slower than explicit (because it needs to do this dynamic method
detachment and attachment at runtime, rather than being able to
be analyzed at compile time). That would certainly be another
way to deprecate implicit replication! :)
On 2008-02-07, at 17:24 EST, André Bargull wrote:
But you need to consider, that the constraint does not apply to
a replication-manager in every case! If the xpath-expression
points to a single node, replication isn't triggered and
therefore no replication-manager will be created. If you just
replace all constraint datapaths with explicit replication, many
programs will break, because people don't expect to get a
replicator-node in this cases.
Delving into making constraints class methods, we have some
tag- compiler work to do.
Apparently you can say:
<view datapath="${...}" />
or:
<view>
<datapath xpath="${...}" />
In both cases, the constraint really applies to the
(invisible) replication manager, not to the view or the
datapath. Right now this constraint is picked up at run time,
ripped off the clone template and smashed onto the replication
manager. That is not going to work in modern (JS2) runtimes.
I think the right approach here is to have the tag compiler re-
write implicit replication into explicit replication, so:
<view datapath="${...}" />
becomes:
<replicator datapath="${...}">
<view />
</replicator>
etc.
Does this seem feasible? Could we even spit out a deprecation
warning suggesting that explicit replication be used?