33 #pragma mark public methods
63 - (void)setRowTemplates:(
id)rowTemplates
65 if (_allTemplates == rowTemplates)
68 _allTemplates = rowTemplates;
70 [
self _updateItemsByCompoundTemplates];
71 [
self _updateItemsBySimpleTemplates];
73 if ([
self numberOfRows] > 0)
76 [
self _reflectPredicate:predicate];
81 + (Class)_binderClassForBinding:(
CPString)theBinding
86 return [
super _binderClassForBinding:theBinding];
89 - (id)_replacementKeyPathForBinding:(
CPString)aBinding
94 return [
super _replacementKeyPathForBinding:aBinding];
97 - (void)_initRuleEditorShared
99 [
super _initRuleEditorShared];
105 - (id)initWithFrame:(CGRect)aFrame
107 self = [
super initWithFrame:aFrame];
119 return [
super predicate];
122 - (void)_updateItemsBySimpleTemplates
125 count = [_allTemplates count],
130 var t = _allTemplates[count];
132 [templates insertObject:t atIndex:0];
135 var trees = [
self _constructTreesForTemplates:templates];
136 if ([trees count] > 0)
137 _rootTrees = [
self _mergeTree:trees];
140 - (void)_updateItemsByCompoundTemplates
143 count = [_allTemplates count],
148 var t = _allTemplates[count];
150 [templates insertObject:t atIndex:0];
153 var trees = [
self _constructTreesForTemplates:templates];
154 if ([trees count] > 0)
155 _rootHeaderTrees = [
self _mergeTree:trees];
158 - (
CPArray)_constructTreesForTemplates:(
id)templates
161 count = [templates count];
163 for (var i = 0; i < count; i++)
165 var tree = [
self _constructTreeForTemplate:templates[i]];
166 [trees addObjectsFromArray:tree];
178 var icount = [aTree
count];
179 for (var i = 0; i < icount; i++)
182 jcount = [mergedTree count],
185 for (var j = 0; j < jcount; j++)
187 var mergednode = [mergedTree objectAtIndex:j];
189 if ([[mergednode title] isEqualToString:[anode title]])
191 var children1 = [mergednode children],
192 children2 = [anode children],
193 children12 = [children1 arrayByAddingObjectsFromArray:children2],
194 mergedChildren = [
self _mergeTree:children12];
196 [mergednode setChildren:mergedChildren];
202 [mergedTree addObject:anode];
212 count = [templateViews count];
221 templateView = [templateViews objectAtIndex:count],
222 isPopup = [templateView isKindOfClass:[CPPopUpButton class]];
226 itemArray = [[templateView itemArray] valueForKey:@"title"];
227 itemsCount = [itemArray count];
231 for (; menuIndex < itemsCount; menuIndex++)
233 var item = [_CPPredicateEditorTree new];
234 [item setIndexIntoTemplate:count];
235 [item setTemplate:aTemplate];
236 [item setMenuItemIndex:menuIndex];
238 [item setTitle:[itemArray objectAtIndex:menuIndex]];
240 [children addObject:item];
243 [children makeObjectsPerformSelector:@selector(setChildren:) withObject:tree];
250 #pragma mark Set the Predicate
252 - (void)setObjectValue:(
id)objectValue
254 var ov = [
self objectValue];
255 if ((ov == nil) != (objectValue == nil) || ![ov
isEqual:objectValue])
257 [
self _setPredicate:objectValue];
258 [
self _reflectPredicate:objectValue];
262 - (void)_reflectPredicate:(
id)predicate
264 var animation = _currentAnimation;
265 _currentAnimation = nil;
268 if (predicate != nil)
272 predicate = [[
CPCompoundPredicate alloc] initWithType:[
self _compoundPredicateTypeForRootRows] subpredicates:[
CPArray arrayWithObject:predicate]];
274 var row = [
self _rowObjectFromPredicate:predicate];
276 [_boundArrayOwner setValue:[
CPArray arrayWithObject:row] forKey:_boundArrayKeyPath];
279 [
self setAnimation:animation];
282 - (id)_rowObjectFromPredicate:(
CPPredicate)predicate
288 if (matchedTemplate == nil)
291 var copyTemplate = [matchedTemplate copy],
292 subpredicates = [matchedTemplate displayableSubpredicatesOfPredicate:predicate];
294 if (subpredicates == nil)
296 [copyTemplate _setComparisonPredicate:predicate];
301 [copyTemplate _setCompoundPredicate:predicate];
305 var row = [
self _rowFromTemplate:copyTemplate originalTemplate:matchedTemplate withRowType:type];
307 if (subpredicates == nil)
310 var count = [subpredicates count],
313 for (var i = 0; i < count; i++)
315 var subrow = [
self _rowObjectFromPredicate:subpredicates[i]];
317 [subrows addObject:subrow];
320 [row setValue:subrows forKey:[
super subrowsKeyPath]];
335 while ((count = [rootItems count]) > 0)
338 for (var i = 0; i < count; i++)
340 treeChild = [rootItems objectAtIndex:i];
342 var currentView = [templateViews objectAtIndex:[treeChild indexIntoTemplate]],
343 title = [treeChild title];
345 if (title == nil || [title
isEqual:[currentView titleOfSelectedItem]])
347 var node = [_CPPredicateEditorRowNode rowNodeFromTree:treeChild];
348 [node applyTemplate:aTemplate withViews:templateViews forOriginalTemplate:originalTemplate];
350 [criteria addObject:node];
351 [values addObject:[node displayValue]];
356 rootItems = [treeChild children];
364 #pragma mark Get the predicate
366 - (void)_updatePredicate
368 [
self _updatePredicateFromRows];
371 - (void)_updatePredicateFromRows
373 var rootRowsArray = [
super _rootRowsArray],
376 count2 = count = [rootRowsArray count],
381 var item = [rootRowsArray objectAtIndex:count],
382 subpredicate = [
self _predicateFromRowItem:item];
384 if (subpredicate != nil)
385 [subpredicates insertObject:subpredicate atIndex:0];
389 predicate = [subpredicates lastObject];
393 [
self _setPredicate:predicate];
396 - (id)_predicateFromRowItem:(
id)rowItem
399 rowType = [rowItem valueForKey:_typeKeyPath];
403 var subrows = [rowItem valueForKey:_subrowsArrayKeyPath],
404 count = [subrows count];
406 for (var i = 0; i < count; i++)
408 var subrow = [subrows objectAtIndex:i],
409 predicate = [
self _predicateFromRowItem:subrow];
411 [subpredicates addObject:predicate];
415 var criteria = [rowItem valueForKey:_itemsKeyPath],
416 displayValues = [rowItem valueForKey:_valuesKeyPath],
417 count = [criteria count],
418 lastItem = [criteria lastObject],
419 template = [lastItem templateForRow],
420 templateViews = [template templateViews];
422 for (var j = 0; j < count; j++)
424 var view = [templateViews objectAtIndex:j],
425 value = [displayValues objectAtIndex:j];
426 [[criteria objectAtIndex:j] setTemplateViews:templateViews];
429 [view selectItemWithTitle:value];
430 else if ([view respondsToSelector:
@selector(setObjectValue:)])
431 [view setObjectValue:[value objectValue]];
434 return [template predicateWithSubpredicates:subpredicates];
442 #pragma mark Control delegate
444 - (void)_sendRuleAction
446 [
super _sendRuleAction];
449 - (BOOL)_sendsActionOnIncompleteTextChange
477 #pragma mark RuleEditor delegate methods
479 - (int)_queryNumberOfChildrenOfItem:(
id)rowItem withRowType:(
int)type
484 return [trees count];
486 return [[rowItem children] count];
489 - (id)_queryChild:(
int)childIndex ofItem:(
id)rowItem withRowType:(
int)type
494 return [_CPPredicateEditorRowNode rowNodeFromTree:trees[childIndex]];
497 return [[rowItem children] objectAtIndex:childIndex];
500 - (id)_queryValueForItem:(
id)rowItem inRow:(
int)rowIndex
502 return [rowItem displayValue];
507 var CPPredicateTemplatesKey =
@"CPPredicateTemplates";
511 - (id)initWithCoder:(
id)aCoder
513 self = [
super initWithCoder:aCoder];
517 var nibTemplates = [aCoder decodeObjectForKey:CPPredicateTemplatesKey];
519 if (nibTemplates != nil)
520 [
self setRowTemplates:nibTemplates];
526 - (void)encodeWithCoder:(
id)aCoder
528 [
super encodeWithCoder:aCoder];
529 [aCoder encodeObject:_allTemplates forKey:CPPredicateTemplatesKey];
538 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
540 [_source _reflectPredicate:nil];
543 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
545 [_source _reflectPredicate:aValue];
558 return _predicateTarget;
564 - (void)setTarget:(
id)aValue
566 _predicateTarget = aValue;
574 return _predicateAction;
580 - (void)setAction:(
SEL)aValue
582 _predicateAction = aValue;