[Laszlo-dev] Detecting classes
Rami Ojares / AMG
rami.ojares at archon.fi
Mon Jan 18 01:34:06 PST 2010
Below is the debug output.
At the bottom is the result of clicking one of the "<Pane>" objects in
the debugger.
So from that I draw the following conclusions.
The argument c (the child) is an object with attributes
- attrs, children (might be missing), class
attrs seems to be an object (curly braces)
children seems to be an array (brackets)
class seems to be something special ( less-than, greater-than) I would
assume this is class (sorry but I don't know exactly what is the
distinction between class and object in javascript).
So far so good.
The childClass seems to be always something of the form <...> (ie. class)
Like it was supposed to.
Then I execute the crucial line
childClass.prototype is lz.Pane
But it always returns false...damn.
- rami
DEBUG: c = {attrs: {…, axis: 'x'}, class: <simplelayout>}
DEBUG: childClass = <simplelayout>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 16761035, visible: false}, children:
[{attrs: {title: 'CALENDAR'}, children: [{attrs: {bgcolor: 8388608,
width: 50}, children: [{attrs: {font: 'Verdana,Vera,sans-serif',
fontsize: 12, fontstyle: 'plain', text: $always{parent.width}}, class:
<anonymous extends='text'>}], class: <view>}], class: <PaneTab>}],
class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 32896}, children: [{attrs: {title: 'EDIT'},
class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 8388608}, children: [{attrs: {title:
'TEST'}, class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 128}, children: [{attrs: {title: '1'},
class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 32896, fixed: true, initWidth: 600},
children: [{attrs: {title: '2'}, class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 8388608}, children: [{attrs: {title: '3'},
class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 128, visible: false}, children: [{attrs:
{title: '4'}, class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 32896}, children: [{attrs: {title: '5'},
class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: c = {attrs: {bgcolor: 8388608, initWidth: 400}, children:
[{attrs: {title: '6'}, class: <PaneTab>}], class: <Pane>}
DEBUG: childClass = <Pane>
DEBUG: returning false
DEBUG: parent = /anonymous
DEBUG: parent.panes = []
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[1]/PaneTab]
ERROR @rojares/SplitPane/Pane.lzx≈71: TypeError: Error #1010
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[2]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[3]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[4]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3], /anonymous/Pane[4]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[5]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3], /anonymous/Pane[4], /anonymous/Pane[5]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[6]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3], /anonymous/Pane[4], /anonymous/Pane[5],
/anonymous/Pane[6]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[7]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3], /anonymous/Pane[4], /anonymous/Pane[5],
/anonymous/Pane[6], /anonymous/Pane[7]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[8]/PaneTab]
DEBUG: parent = /anonymous
DEBUG: parent.panes = [/anonymous/Pane[1], /anonymous/Pane[2],
/anonymous/Pane[3], /anonymous/Pane[4], /anonymous/Pane[5],
/anonymous/Pane[6], /anonymous/Pane[7], /anonymous/Pane[8]]
DEBUG: parent.dividers = []
DEBUG: this.subviews = [/anonymous/Pane[9]/PaneTab]
lzx> Debug.inspect(<Pane>)
«Class#21» {
attributes: {…, fixed: false, height: $always{parent.height},
initWidth: -1, minWidth: 0, …, selectedTab: null}
tagname: 'Pane'
}
«Class#21| <Pane>»
lzx>
P T Withington kirjoitti:
> Could we see an example of your debug output? That might give an
> insight.
>
> Also, it seems the subclass test could be simplified to:
>
> childClass.prototype is lz.Pane
>
> The 'is' operator understands mixins, whereas 'isPrototypeOf' does not.
>
> On Jan 17, 2010, at 23:21, Rami Ojares / AMG <rami.ojares at archon.fi>
> wrote:
>
>> Hi Tucker,
>> When 4.7 was released the restructuring of tagname etc. forced me to
>> detect Pane tags as per your suggestion.
>> Currently I can´t get it to work.
>>
>> Here's the situation:
>>
>> I have a createChildren method overridden in SplitPane class
>> And from there I am calling the method you said would detect Pane
>> classes
>> (I only changed c.class to c['class'] because compiler told me to.
>> And I put the declaration
>> of variable outside of if statement)
>>
>> Now the isPane seems to return false everytime.
>> Since I don't really understand what is going on in here I ask for
>> your guidance and assistance.
>> <method name="createChildren" args="children"><![CDATA[
>> var splitpaneChildren = [];
>> var paneCount = 0;
>> for(var i=0; i<children.length; i++) {
>> var pane = children[i];
>> var divider;
>> if (isPane(pane)) {
>> divider = {
>> 'class': lz.Divider,
>> attrs: {
>> width: this.dividerWidth,
>> index: paneCount
>> }
>> };
>> // add index attribute also to Pane
>> pane.attrs.index = paneCount;
>> splitpaneChildren.push(divider);
>> splitpaneChildren.push(pane);
>> paneCount++;
>> }
>> else splitpaneChildren.push(pane);
>> }
>> super.createChildren(splitpaneChildren);
>> ]]></method>
>>
>> <method name="isPane" args="c"><![CDATA[
>> Debug.debug("c = %w", c);
>> var childClass;
>> if (c.name) childClass = lz[c.name];
>> else childClass = c['class'];
>> Debug.debug("childClass = %w", childClass);
>> var ret = lz['Pane'].prototype.isPrototypeOf(childClass.prototype);
>> Debug.debug("returning %w", ret);
>> return ret;
>> ]]></method>
>>
>> - rami
>>> If you are trying to detect instances of <Pane> (even anonymous
>>> ones, which would be subclasses), the recommended approach would be
>>> to use the `is` operator as above. But I see where your problem
>>> lies, you are trying to sort the child "specifications" before they
>>> have been instantiated. To be totally accurate, that means you
>>> would have to look for `name` _or_ `class`, and that you would need
>>> to know if the tag or class is a subclass of the tag's class you are
>>> sorting on.
>>>
>>> Something like:
>>>
>>> function isPane(c) {
>>> if (c.name) {
>>> var childClass = lz[c.name];
>>> } else {
>>> var childClass = c.class;
>>> }
>>> return lz['Pane'].prototype.isPrototypeOf(childClass.prototype);
>>> }
>>>
>>> [That last line is pretty obscure, we should probably offer a
>>> built-in `extends` or `isSubclassOf` predicate.]
>>
More information about the Laszlo-dev
mailing list