mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
130 lines
3.1 KiB
Plaintext
130 lines
3.1 KiB
Plaintext
/*
|
|
* Created by cacaodev@gmail.com.
|
|
* Copyright (c) 2011 Pear, Inc. All rights reserved.
|
|
*/
|
|
|
|
//@class _CPPredicateEditorTree;
|
|
@implementation _CPPredicateEditorRowNode : CPObject
|
|
{
|
|
_CPPredicateEditorTree tree @accessors;
|
|
CPMutableArray templateViews @accessors;
|
|
CPMutableArray copiedTemplateContainer @accessors;
|
|
CPArray children @accessors(copy);
|
|
}
|
|
|
|
+ (id)rowNodeFromTree:(id)aTree
|
|
{
|
|
return [_CPPredicateEditorRowNode _rowNodeFromTree:aTree withTemplateTable:{}];
|
|
}
|
|
|
|
+ (id)_rowNodeFromTree:(id)aTree withTemplateTable:(id)templateTable
|
|
{
|
|
var views,
|
|
copiedContainer;
|
|
|
|
var uuid = [[aTree template] UID],
|
|
cachedNode = templateTable[uuid],
|
|
node = [[_CPPredicateEditorRowNode alloc] init];
|
|
|
|
[node setTree:aTree];
|
|
|
|
if (!cachedNode)
|
|
{
|
|
views = [CPMutableArray array];
|
|
copiedContainer = [CPMutableArray array];
|
|
templateTable[uuid] = node;
|
|
}
|
|
else
|
|
{
|
|
views = [cachedNode templateViews];
|
|
copiedContainer = [cachedNode copiedTemplateContainer];
|
|
}
|
|
|
|
[node setTemplateViews:views];
|
|
[node setCopiedTemplateContainer:copiedContainer];
|
|
|
|
var nodeChildren = [CPMutableArray array],
|
|
treeChildren = [aTree children],
|
|
count = [treeChildren count];
|
|
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
var treeChild = treeChildren[i],
|
|
child = [_CPPredicateEditorRowNode _rowNodeFromTree:treeChild withTemplateTable:templateTable];
|
|
|
|
[nodeChildren addObject:child];
|
|
}
|
|
|
|
[node setChildren:nodeChildren];
|
|
|
|
return node;
|
|
}
|
|
|
|
- (BOOL)applyTemplate:(id)template withViews:(id)views forOriginalTemplate:(id)originalTemplate
|
|
{
|
|
var t = [tree template],
|
|
count = [children count];
|
|
|
|
if (t !== template)
|
|
{
|
|
[templateViews setArray:views];
|
|
[copiedTemplateContainer removeAllObjects];
|
|
[copiedTemplateContainer addObject:template];
|
|
}
|
|
|
|
for (var i = 0; i < count; i++)
|
|
[children[i] applyTemplate:template withViews:views forOriginalTemplate:originalTemplate];
|
|
}
|
|
|
|
- (BOOL)isEqual:(id)node
|
|
{
|
|
if (![node isKindOfClass:[_CPPredicateEditorRowNode class]])
|
|
return NO;
|
|
|
|
return (tree === [node tree]);
|
|
}
|
|
|
|
- (void)copyTemplateIfNecessary
|
|
{
|
|
if ([copiedTemplateContainer count] === 0)
|
|
{
|
|
var copy = [[tree template] copy];
|
|
[copiedTemplateContainer addObject:copy];
|
|
[templateViews addObjectsFromArray:[copy templateViews]];
|
|
}
|
|
}
|
|
|
|
- (CPView)templateView
|
|
{
|
|
[self copyTemplateIfNecessary];
|
|
return [templateViews objectAtIndex:[tree indexIntoTemplate]];
|
|
}
|
|
|
|
- (id)templateForRow
|
|
{
|
|
[self copyTemplateIfNecessary];
|
|
return [copiedTemplateContainer lastObject];
|
|
}
|
|
|
|
- (CPString)title
|
|
{
|
|
return [tree title];
|
|
}
|
|
|
|
- (id)displayValue
|
|
{
|
|
var title = [self title];
|
|
|
|
if (title !== nil)
|
|
return title;
|
|
|
|
return [self templateView];
|
|
}
|
|
|
|
- (CPString)description
|
|
{
|
|
return [CPString stringWithFormat:@"<%@ %@ %@ tree:%@ tviews:%@", [self className],[self UID], [self title], [tree UID], [templateViews description]];
|
|
}
|
|
|
|
@end
|