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;
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;
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]])
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];
287 if (_templateType == 1 && !_leftIsWildcard)
289 var view = [_views objectAtIndex:0];
290 return [[view itemArray] valueForKey:@"representedObject"];
302 if (_templateType == 1 && !_rightIsWildcard)
304 var view = [_views objectAtIndex:2];
305 return [[view itemArray] valueForKey:@"representedObject"];
317 if (_templateType == 2)
319 var view = [_views objectAtIndex:0];
320 return [[view itemArray] valueForKey:@"representedObject"];
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;
371 return _rightAttributeType;
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],
415 type = [predicate compoundPredicateType],
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],
426 leftExpression = [predicate leftExpression],
427 rightExpression = [predicate rightExpression],
428 operator = [predicate predicateOperatorType];
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 floatValue];
469 value = [aView state];
471 value = [aView dateValue];
473 value = [aView stringValue];
475 return [CPExpression expressionForConstantValue:value];
480 return (_templateType - 1);
485 var views = [CPArray array],
488 [
copy _setTemplateType:_templateType];
489 [
copy _setOptions:_predicateOptions];
490 [
copy _setModifier:_predicateModifier];
491 [
copy _setLeftAttributeType:_leftAttributeType];
492 [
copy _setRightAttributeType:_rightAttributeType];
493 [
copy setLeftIsWildcard:_leftIsWildcard];
494 [
copy setRightIsWildcard:_rightIsWildcard];
496 [_views enumerateObjectsUsingBlock:function(aView, idx, stop)
500 if ([aView implementsSelector:@selector(copy)])
502 vcopy = [aView copy];
509 [views addObject:vcopy];
512 [
copy setTemplateViews:views];
517 + (id)_operatorsForAttributeType:(CPAttributeType)attributeType
521 switch (attributeType)
541 default : CPLogConsole(
"Cannot create operators for an CPAttributeType " + attributeType);
545 return operators_array;
550 return _templateType;
553 - (id)_displayValueForPredicateOperator:(
int)
operator 585 default : CPLogConsole(
@"unknown predicate operator %d" +
operator);
591 - (id)_displayValueForCompoundPredicateType:(
unsigned int)predicateType
594 switch (predicateType)
608 - (id)_displayValueForConstantValue:(
id)value
610 return [value description];
613 - (id)_displayValueForKeyPath:(
CPString)keyPath
620 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
621 count = [expressions count];
623 for (var i = 0; i < count; i++)
625 var exp = expressions[i],
626 type = [exp expressionType],
631 case CPKeyPathExpressionType: title = [
self _displayValueForKeyPath:[exp keyPath]];
633 case CPConstantValueExpressionType: title = [
self _displayValueForConstantValue:[exp constantValue]];
640 [item setRepresentedObject:exp];
641 [popup addItem:item];
651 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
654 for (var i = 0; i < count; i++)
657 title = [
self _displayValueForPredicateOperator:op],
660 [item setRepresentedObject:op];
661 [popup addItem:item];
671 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
674 for (var i = 0; i < count; i++)
677 title = [
self _displayValueForCompoundPredicateType:type],
680 [item setRepresentedObject:type];
681 [popup addItem:item];
689 - (
CPView)_viewFromAttributeType:(CPAttributeType)attributeType
695 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 50, 26)];
699 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 150, 26)];
703 view = [[
CPCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 26)];
707 view = [[
CPDatePicker alloc] initWithFrame:CGRectMake(0, 0, 180, 26)];
708 [view setDatePickerElements:CPYearMonthDayDatePickerElementFlag];
713 [view setTag:attributeType];
720 var textField = [[
CPTextField alloc] initWithFrame:frame];
721 [textField setBezeled:YES];
722 [textField setBezelStyle:CPTextFieldSquareBezel];
723 [textField setBordered:YES];
724 [textField setEditable:YES];
726 [textField setSendsActionOnEndEditing:YES];
731 - (void)_setOptions:(
unsigned)
options 736 - (void)_setModifier:(
unsigned)
modifier 743 if (_templateType == 2)
745 else if (_templateType == 1 && _rightIsWildcard)
767 var CPPredicateTemplateTypeKey =
@"CPPredicateTemplateType",
768 CPPredicateTemplateOptionsKey =
@"CPPredicateTemplateOptions",
769 CPPredicateTemplateModifierKey =
@"CPPredicateTemplateModifier",
770 CPPredicateTemplateLeftAttributeTypeKey =
@"CPPredicateTemplateLeftAttributeType",
771 CPPredicateTemplateRightAttributeTypeKey =
@"CPPredicateTemplateRightAttributeType",
772 CPPredicateTemplateLeftIsWildcardKey =
@"CPPredicateTemplateLeftIsWildcard",
773 CPPredicateTemplateRightIsWildcardKey =
@"CPPredicateTemplateRightIsWildcard",
774 CPPredicateTemplateViewsKey =
@"CPPredicateTemplateViews";
778 - (id)initWithCoder:(
CPCoder)coder
783 _templateType = [coder decodeIntForKey:CPPredicateTemplateTypeKey];
784 _predicateOptions = [coder decodeIntForKey:CPPredicateTemplateOptionsKey];
785 _predicateModifier = [coder decodeIntForKey:CPPredicateTemplateModifierKey];
786 _leftAttributeType = [coder decodeIntForKey:CPPredicateTemplateLeftAttributeTypeKey];
787 _rightAttributeType = [coder decodeIntForKey:CPPredicateTemplateRightAttributeTypeKey];
788 _leftIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateLeftIsWildcardKey];
789 _rightIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateRightIsWildcardKey];
790 _views = [coder decodeObjectForKey:CPPredicateTemplateViewsKey];
794 if (_templateType == 1 && _leftIsWildcard == NO)
796 var itemArray = [_views[0] itemArray],
797 count = [itemArray count];
799 for (var i = 0; i < count; i++)
801 var item = itemArray[i];
802 if ([item representedObject] == nil)
804 var exp = [CPExpression expressionForKeyPath:[item title]];
805 [item setRepresentedObject:exp];
814 - (void)encodeWithCoder:(
CPCoder)coder
816 [coder encodeInt:_templateType forKey:CPPredicateTemplateTypeKey];
817 [coder encodeInt:_predicateOptions forKey:CPPredicateTemplateOptionsKey];
818 [coder encodeInt:_predicateModifier forKey:CPPredicateTemplateModifierKey];
819 [coder encodeInt:_leftAttributeType forKey:CPPredicateTemplateLeftAttributeTypeKey];
820 [coder encodeInt:_rightAttributeType forKey:CPPredicateTemplateRightAttributeTypeKey];
821 [coder encodeBool:_leftIsWildcard forKey:CPPredicateTemplateLeftIsWildcardKey];
822 [coder encodeBool:_rightIsWildcard forKey:CPPredicateTemplateRightIsWildcardKey];
823 [coder encodeObject:_views forKey:CPPredicateTemplateViewsKey];
833 var ret = [[[
self class] alloc] initWithFrame:[
self frame]];
835 [ret setTextFont:[
self textFont]];
836 [ret setMinDate:[
self minDate]];
837 [ret setMaxDate:[
self maxDate]];
838 [ret setTimeInterval:[
self timeInterval]];
839 [ret setDatePickerMode:[
self datePickerMode]];
840 [ret setDatePickerElements:[
self datePickerElements]];
841 [ret setDatePickerStyle:[
self datePickerStyle]];
842 [ret setLocale:[
self locale]];
843 [ret setDateValue:[
self dateValue]];
844 [ret setBackgroundColor:[
self backgroundColor]];
845 [ret setDrawsBackground:[
self drawsBackground]];
846 [ret setBordered:[
self isBordered]];
862 return _templateType;
868 - (void)_setTemplateType:(
int)aValue
870 _templateType = aValue;
876 - (void)_setOptions:(
unsigned)aValue
878 _predicateOptions = aValue;
884 - (void)_setModifier:(
unsigned)aValue
886 _predicateModifier = aValue;
892 - (unsigned)leftAttributeType
894 return _leftAttributeType;
900 - (void)_setLeftAttributeType:(
unsigned)aValue
902 _leftAttributeType = aValue;
908 - (unsigned)rightAttributeType
910 return _rightAttributeType;
916 - (void)_setRightAttributeType:(
unsigned)aValue
918 _rightAttributeType = aValue;
924 - (BOOL)leftIsWildcard
926 return _leftIsWildcard;
932 - (void)setLeftIsWildcard:(BOOL)aValue
934 _leftIsWildcard = aValue;
940 - (BOOL)rightIsWildcard
942 return _rightIsWildcard;
948 - (void)setRightIsWildcard:(BOOL)aValue
950 _rightIsWildcard = aValue;
956 - (void)setTemplateViews:(CPArray)aValue
Used to implement exception handling (creating & raising).
CPLikePredicateOperatorType
A CALayer is similar to a CPView
CPGreaterThanPredicateOperatorType
CPFont systemFontOfSize:(CGSize aSize)
CPEqualToPredicateOperatorType
CPInPredicateOperatorType
CPComparisonPredicateModifier modifier()
Returns the comparison predicate modifier for the receiver.
void raise:reason:(CPString aName, [reason] CPString aReason)
CPArray operators()
Returns Returns the array of operators for the receiver.
Unarchives objects created using CPKeyedArchiver.
int options()
Returns the comparison predicate options for the receiver.
CPNotEqualToPredicateOperatorType
CPCompoundPredicate is a subclass of CPPredicate used to represent logical “gate” operations (AND/O...
Implements keyed archiving of object graphs (e.g. for storing data).
An immutable string (collection of characters).
CPAttributeType rightExpressionAttributeType()
Returns the attribute type of the receiver’s right expression.
CPLessThanPredicateOperatorType
CPArray rightExpressions()
Returns the right hand expressions for the receiver.
CPBinaryDataAttributeType
Defines methods for use when archiving & restoring (enc/decoding).
CPAttributeType leftExpressionAttributeType()
Returns the attribute type of the receiver’s left expression.
CPComparisonPredicate is a subclass of CPPredicate used to compare expressions.
id unarchiveObjectWithData:(CPData aData)
CPBeginsWithPredicateOperatorType
CPContainsPredicateOperatorType
CPPredicate predicateWithLeftExpression:rightExpression:modifier:type:options:(CPExpression left, [rightExpression] CPExpression right, [modifier] CPComparisonPredicateModifier modifier, [type] int type, [options] unsigned options)
CPLessThanOrEqualToPredicateOperatorType
CPEndsWithPredicateOperatorType
CPBetweenPredicateOperatorType
CPGreaterThanOrEqualToPredicateOperatorType
CPMatchesPredicateOperatorType
CPArray compoundTypes()
Returns the compound predicate types for the receiver.
CPTransformableAttributeType
CPArray templateViews()
Returns the views for the receiver.
CPArray leftExpressions()
Returns the left hand expressions for the receiver.
CPData archivedDataWithRootObject:(id anObject)
id stringWithFormat:(CPString format, [,] ...)