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 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],
486 copy = [[[
self class] alloc] init];
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)],
652 count = [operators count];
654 for (var i = 0; i < count; i++)
656 var op = operators[i],
657 title = [
self _displayValueForPredicateOperator:op],
660 [item setRepresentedObject:op];
661 [popup addItem:item];
669 - (
CPView)_viewFromCompoundTypes:(CPArray)compoundTypes
671 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
672 count = [compoundTypes count];
674 for (var i = 0; i < count; i++)
676 var type = compoundTypes[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
733 _predicateOptions = options;
736 - (void)_setModifier:(
unsigned)modifier
738 _predicateModifier = modifier;
743 if (_templateType == 2)
744 return [
CPString stringWithFormat:
@"<%@ %p %@>",[
self className],
self,[[
self compoundTypes] componentsJoinedByString:
@", "]];
745 else if (_templateType == 1 && _rightIsWildcard)
746 return [
CPString stringWithFormat:
@"<%@ %p [%@] [%@] %d>",[
self className],
self,[[
self leftExpressions] componentsJoinedByString:
@", "],[[
self operators] componentsJoinedByString:
@", "],[
self rightExpressionAttributeType]];
748 return [
CPString stringWithFormat:@"<%@ %p [%@] [%@] [%@]>",[
self className],self,[[
self leftExpressions] componentsJoinedByString:@", "],[[
self operators] componentsJoinedByString:@", "],[[
self rightExpressions] componentsJoinedByString:@", "]];
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
CPCompoundPredicateType compoundPredicateType()
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)
Unarchives objects created using CPKeyedArchiver.
int options()
Returns the comparison predicate options for the receiver.
CPExpression leftExpression()
CPNotEqualToPredicateOperatorType
CPCompoundPredicate is a subclass of CPPredicate used to represent logical “gate” operations (AND/O...
CPExpression rightExpression()
Implements keyed archiving of object graphs (e.g. for storing data).
An immutable string (collection of characters).
CPLessThanPredicateOperatorType
CPPredicateOperatorType predicateOperatorType()
CPBinaryDataAttributeType
Defines methods for use when archiving & restoring (enc/decoding).
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
CPTransformableAttributeType
CPData archivedDataWithRootObject:(id anObject)
id stringWithFormat:(CPString format, [,] ...)
FrameUpdater prototype description