43 unsigned _predicateOptions;
44 unsigned _predicateModifier;
45 unsigned _leftAttributeType;
46 unsigned _rightAttributeType;
48 BOOL _rightIsWildcard;
86 - (id)initWithLeftExpressions:(CPArray)leftExpressions rightExpressions:(CPArray)rightExpressions modifier:(
int)modifier operators:(CPArray)operators options:(
int)options
93 _rightIsWildcard = NO;
94 _leftAttributeType = 0;
95 _rightAttributeType = 0;
96 _predicateModifier = modifier;
97 _predicateOptions = options;
99 var leftView = [
self _viewFromExpressions:leftExpressions],
100 rightView = [
self _viewFromExpressions:rightExpressions],
101 middleView = [
self _viewFromOperatorTypes:operators];
103 _views = [[CPArray alloc] initWithObjects:leftView, middleView, rightView];
118 - (id)initWithLeftExpressions:(CPArray )leftExpressions rightExpressionAttributeType:(CPAttributeType)attributeType modifier:(CPComparisonPredicateModifier)modifier operators:(CPArray )operators options:(
int)options
123 var leftView = [
self _viewFromExpressions:leftExpressions],
124 middleView = [
self _viewFromOperatorTypes:operators],
125 rightView = [
self _viewFromAttributeType:attributeType];
128 _leftIsWildcard = NO;
129 _rightIsWildcard = YES;
130 _leftAttributeType = 0;
131 _rightAttributeType = attributeType;
132 _predicateModifier = modifier;
133 _predicateOptions = options;
134 _views = [[CPArray alloc] initWithObjects:leftView, middleView, rightView];
146 - (id)initWithCompoundTypes:(CPArray )compoundTypes
151 var leftView = [
self _viewFromCompoundTypes:compoundTypes],
154 [rightView addItemWithTitle:@"of the following are true"];
157 _leftIsWildcard = NO;
158 _rightIsWildcard = NO;
159 _rightAttributeType = 0;
160 _views = [[CPArray alloc] initWithObjects:leftView, rightView];
175 - (double)matchForPredicate:(CPPredicate)predicate
180 if ([[
self compoundTypes] containsObject:[predicate compoundPredicateType]])
185 if (!_leftIsWildcard && ![[
self leftExpressions] containsObject:[predicate leftExpression]])
188 if (![[
self operators] containsObject:[predicate predicateOperatorType]])
191 if (!_rightIsWildcard && ![[
self rightExpressions] containsObject:[predicate rightExpression]])
205 - (CPArray)templateViews
217 - (void)setPredicate:(CPPredicate)predicate
219 if (_templateType == 2)
220 [
self _setCompoundPredicate:predicate];
222 [
self _setComparisonPredicate:predicate];
231 - (CPArray)displayableSubpredicatesOfPredicate:(CPPredicate)predicate
235 var subpredicates = [predicate subpredicates];
236 if ([subpredicates count] == 0)
239 return subpredicates;
253 - (CPPredicate)predicateWithSubpredicates:(CPArray)subpredicates
255 if (_templateType == 2)
257 var type = [[_views[0] selectedItem] representedObject];
261 if (_templateType == 1)
263 var lhs = [
self _leftExpression],
264 rhs = [
self _rightExpression],
265 operator = [[_views[1] selectedItem] representedObject];
285 - (CPArray)leftExpressions
287 if (_templateType == 1 && !_leftIsWildcard)
289 var view = [_views objectAtIndex:0];
290 return [[view itemArray] valueForKey:@"representedObject"];
300 - (CPArray)rightExpressions
302 if (_templateType == 1 && !_rightIsWildcard)
304 var view = [_views objectAtIndex:2];
305 return [[view itemArray] valueForKey:@"representedObject"];
315 - (CPArray)compoundTypes
317 if (_templateType == 2)
319 var view = [_views objectAtIndex:0];
320 return [[view itemArray] valueForKey:@"representedObject"];
330 - (CPComparisonPredicateModifier)modifier
332 if (_templateType == 1)
333 return _predicateModifier;
344 if (_templateType == 1)
346 var view = [_views objectAtIndex:1];
347 return [[view itemArray] valueForKey:@"representedObject"];
359 if (_templateType == 1)
360 return _predicateOptions;
369 - (CPAttributeType)rightExpressionAttributeType
371 return _rightAttributeType;
378 - (CPAttributeType)leftExpressionAttributeType
380 return _leftAttributeType;
384 + (id)_bestMatchForPredicate:(CPPredicate)predicate inTemplates:(CPArray)templates quality:(
double)quality
386 var count = [templates count],
391 for (i = 0; i < count; i++)
393 var
template = [templates objectAtIndex:i],
394 amatch = [template matchForPredicate:predicate];
396 if (amatch > match_value)
399 match_value = amatch;
405 [
CPException raise:CPRangeException
reason:@"Unable to find template matching predicate: " + [predicate predicateFormat]];
409 return [templates objectAtIndex:templateIndex];
414 var left = [_views objectAtIndex:0],
416 index = [left indexOfItemWithRepresentedObject:type];
418 [left selectItemAtIndex:index];
423 var left = [_views objectAtIndex:0],
424 middle = [_views objectAtIndex:1],
425 right = [_views objectAtIndex:2],
431 [left setObjectValue:[leftExpression constantValue]];
434 var index = [left indexOfItemWithRepresentedObject:leftExpression];
435 [left selectItemAtIndex:index];
438 var op_index = [middle indexOfItemWithRepresentedObject:operator];
439 [middle selectItemAtIndex:op_index];
441 if (_rightIsWildcard)
442 [right setObjectValue:[rightExpression constantValue]];
445 var index = [right indexOfItemWithRepresentedObject:rightExpression];
446 [right selectItemAtIndex:index];
450 - (CPExpression)_leftExpression
452 return [
self _expressionFromView:_views[0] forAttributeType:_leftAttributeType];
455 - (CPExpression)_rightExpression
457 return [
self _expressionFromView:_views[2] forAttributeType:_rightAttributeType];
460 - (CPExpression)_expressionFromView:(
CPView)aView forAttributeType:(CPAttributeType)attributeType
462 if (attributeType == 0)
463 return [[aView selectedItem] representedObject];
467 value = [aView intValue];
469 value = [aView state];
471 value = [aView stringValue];
473 return [CPExpression expressionForConstantValue:value];
478 return (_templateType - 1);
483 var views = [CPArray array];
485 var copy = [[[
self class] alloc] init];
486 [copy _setTemplateType:_templateType];
487 [copy _setOptions:_predicateOptions];
488 [copy _setModifier:_predicateModifier];
489 [copy _setLeftAttributeType:_leftAttributeType];
490 [copy _setRightAttributeType:_rightAttributeType];
491 [copy setLeftIsWildcard:_leftIsWildcard];
492 [copy setRightIsWildcard:_rightIsWildcard];
494 [_views enumerateObjectsUsingBlock:function(aView, idx, stop)
500 vcopy = [aView
copy];
507 [views addObject:vcopy];
510 [copy setTemplateViews:views];
515 + (id)_operatorsForAttributeType:(CPAttributeType)attributeType
519 switch (attributeType)
539 default : CPLogConsole(
"Cannot create operators for an CPAttributeType " + attributeType);
543 return operators_array;
548 return _templateType;
551 - (id)_displayValueForPredicateOperator:(
int)operator
583 default : CPLogConsole(
@"unknown predicate operator %d" +
operator);
589 - (id)_displayValueForCompoundPredicateType:(
unsigned int)predicateType
592 switch (predicateType)
606 - (id)_displayValueForConstantValue:(
id)value
608 return [value description];
611 - (id)_displayValueForKeyPath:(
CPString)keyPath
619 count = [expressions count];
621 for (var i = 0; i < count; i++)
623 var exp = expressions[i],
624 type = [exp expressionType],
629 case CPKeyPathExpressionType: title = [
self _displayValueForKeyPath:[exp keyPath]];
631 case CPConstantValueExpressionType: title = [
self _displayValueForConstantValue:[exp constantValue]];
638 [item setRepresentedObject:exp];
639 [popup addItem:item];
650 count = [operators count];
652 for (var i = 0; i < count; i++)
654 var op = operators[i],
655 title = [
self _displayValueForPredicateOperator:op],
658 [item setRepresentedObject:op];
659 [popup addItem:item];
667 - (
CPView)_viewFromCompoundTypes:(CPArray)compoundTypes
670 count = [compoundTypes count];
672 for (var i = 0; i < count; i++)
674 var type = compoundTypes[i],
675 title = [
self _displayValueForCompoundPredicateType:type],
678 [item setRepresentedObject:type];
679 [popup addItem:item];
687 - (
CPView)_viewFromAttributeType:(CPAttributeType)attributeType
693 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 50, 26)];
697 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 150, 26)];
706 [view setDatePickerElements:CPYearMonthDayDatePickerElementFlag];
711 [view setTag:attributeType];
719 [textField setBezeled:YES];
720 [textField setBezelStyle:CPTextFieldSquareBezel];
721 [textField setBordered:YES];
722 [textField setEditable:YES];
724 [textField setSendsActionOnEndEditing:YES];
729 - (void)_setOptions:(
unsigned)options
731 _predicateOptions = options;
734 - (void)_setModifier:(
unsigned)modifier
736 _predicateModifier = modifier;
741 if (_templateType == 2)
742 return [
CPString stringWithFormat:
@"<%@ %p %@>",[
self className],
self,[[
self compoundTypes] componentsJoinedByString:
@", "]];
743 else if (_templateType == 1 && _rightIsWildcard)
744 return [
CPString stringWithFormat:
@"<%@ %p [%@] [%@] %d>",[
self className],
self,[[
self leftExpressions] componentsJoinedByString:
@", "],[[
self operators] componentsJoinedByString:
@", "],[
self rightExpressionAttributeType]];
746 return [
CPString stringWithFormat:@"<%@ %p [%@] [%@] [%@]>",[
self className],self,[[
self leftExpressions] componentsJoinedByString:@", "],[[
self operators] componentsJoinedByString:@", "],[[
self rightExpressions] componentsJoinedByString:@", "]];
765 var CPPredicateTemplateTypeKey =
@"CPPredicateTemplateType",
766 CPPredicateTemplateOptionsKey =
@"CPPredicateTemplateOptions",
767 CPPredicateTemplateModifierKey =
@"CPPredicateTemplateModifier",
768 CPPredicateTemplateLeftAttributeTypeKey =
@"CPPredicateTemplateLeftAttributeType",
769 CPPredicateTemplateRightAttributeTypeKey =
@"CPPredicateTemplateRightAttributeType",
770 CPPredicateTemplateLeftIsWildcardKey =
@"CPPredicateTemplateLeftIsWildcard",
771 CPPredicateTemplateRightIsWildcardKey =
@"CPPredicateTemplateRightIsWildcard",
772 CPPredicateTemplateViewsKey =
@"CPPredicateTemplateViews";
776 - (id)initWithCoder:(
CPCoder)coder
781 _templateType = [coder decodeIntForKey:CPPredicateTemplateTypeKey];
782 _predicateOptions = [coder decodeIntForKey:CPPredicateTemplateOptionsKey];
783 _predicateModifier = [coder decodeIntForKey:CPPredicateTemplateModifierKey];
784 _leftAttributeType = [coder decodeIntForKey:CPPredicateTemplateLeftAttributeTypeKey];
785 _rightAttributeType = [coder decodeIntForKey:CPPredicateTemplateRightAttributeTypeKey];
786 _leftIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateLeftIsWildcardKey];
787 _rightIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateRightIsWildcardKey];
788 _views = [coder decodeObjectForKey:CPPredicateTemplateViewsKey];
792 if (_templateType == 1 && _leftIsWildcard == NO)
794 var itemArray = [_views[0] itemArray],
795 count = [itemArray count];
797 for (var i = 0; i < count; i++)
799 var item = itemArray[i];
800 if ([item representedObject] == nil)
802 var exp = [CPExpression expressionForKeyPath:[item title]];
803 [item setRepresentedObject:exp];
812 - (void)encodeWithCoder:(
CPCoder)coder
814 [coder encodeInt:_templateType forKey:CPPredicateTemplateTypeKey];
815 [coder encodeInt:_predicateOptions forKey:CPPredicateTemplateOptionsKey];
816 [coder encodeInt:_predicateModifier forKey:CPPredicateTemplateModifierKey];
817 [coder encodeInt:_leftAttributeType forKey:CPPredicateTemplateLeftAttributeTypeKey];
818 [coder encodeInt:_rightAttributeType forKey:CPPredicateTemplateRightAttributeTypeKey];
819 [coder encodeBool:_leftIsWildcard forKey:CPPredicateTemplateLeftIsWildcardKey];
820 [coder encodeBool:_rightIsWildcard forKey:CPPredicateTemplateRightIsWildcardKey];
821 [coder encodeObject:_views forKey:CPPredicateTemplateViewsKey];
831 var ret = [[[
self class] alloc] initWithFrame:[
self frame]];
833 [ret setTextFont:[
self textFont]];
834 [ret setMinDate:[
self minDate]];
835 [ret setMaxDate:[
self maxDate]];
836 [ret setTimeInterval:[
self timeInterval]];
837 [ret setDatePickerMode:[
self datePickerMode]];
838 [ret setDatePickerElements:[
self datePickerElements]];
839 [ret setDatePickerStyle:[
self datePickerStyle]];
840 [ret setLocale:[
self locale]];
841 [ret setDateValue:[
self dateValue]];
842 [ret setBackgroundColor:[
self backgroundColor]];
843 [ret setDrawsBackground:[
self drawsBackground]];
844 [ret setBordered:[
self isBordered]];
860 return _templateType;
866 - (void)_setTemplateType:(
int)aValue
868 _templateType = aValue;
874 - (void)_setOptions:(
unsigned)aValue
876 _predicateOptions = aValue;
882 - (void)_setModifier:(
unsigned)aValue
884 _predicateModifier = aValue;
890 - (unsigned)leftAttributeType
892 return _leftAttributeType;
898 - (void)_setLeftAttributeType:(
unsigned)aValue
900 _leftAttributeType = aValue;
906 - (unsigned)rightAttributeType
908 return _rightAttributeType;
914 - (void)_setRightAttributeType:(
unsigned)aValue
916 _rightAttributeType = aValue;
922 - (BOOL)leftIsWildcard
924 return _leftIsWildcard;
930 - (void)setLeftIsWildcard:(BOOL)aValue
932 _leftIsWildcard = aValue;
938 - (BOOL)rightIsWildcard
940 return _rightIsWildcard;
946 - (void)setRightIsWildcard:(BOOL)aValue
948 _rightIsWildcard = aValue;
954 - (void)setTemplateViews:(CPArray)aValue