29 CPUndefinedAttributeType = 0;
30 CPInteger16AttributeType = 100;
31 CPInteger32AttributeType = 200;
32 CPInteger64AttributeType = 300;
33 CPDecimalAttributeType = 400;
34 CPDoubleAttributeType = 500;
35 CPFloatAttributeType = 600;
36 CPStringAttributeType = 700;
37 CPBooleanAttributeType = 800;
38 CPDateAttributeType = 900;
39 CPBinaryDataAttributeType = 1000;
40 CPTransformableAttributeType = 1800;
45 unsigned _predicateOptions;
46 unsigned _predicateModifier;
47 unsigned _leftAttributeType;
48 unsigned _rightAttributeType;
50 BOOL _rightIsWildcard;
89 - (id)initWithLeftExpressions:(CPArray)leftExpressions rightExpressions:(CPArray)rightExpressions modifier:(
int)modifier operators:(CPArray)operators options:(
int)options
96 _rightIsWildcard = NO;
97 _leftAttributeType = 0;
98 _rightAttributeType = 0;
99 _predicateModifier = modifier;
100 _predicateOptions = options;
102 var leftView = [
self _viewFromExpressions:leftExpressions],
103 rightView = [
self _viewFromExpressions:rightExpressions],
104 middleView = [
self _viewFromOperatorTypes:operators];
106 _views = [[CPArray alloc] initWithObjects:leftView, middleView, rightView];
121 - (id)initWithLeftExpressions:(CPArray )leftExpressions rightExpressionAttributeType:(CPAttributeType)attributeType modifier:(
CPComparisonPredicateModifier)modifier operators:(CPArray )operators options:(
int)options
126 var leftView = [
self _viewFromExpressions:leftExpressions],
127 middleView = [
self _viewFromOperatorTypes:operators],
128 rightView = [
self _viewFromAttributeType:attributeType];
131 _leftIsWildcard = NO;
132 _rightIsWildcard = YES;
133 _leftAttributeType = 0;
134 _rightAttributeType = attributeType;
135 _predicateModifier = modifier;
136 _predicateOptions = options;
137 _views = [[CPArray alloc] initWithObjects:leftView, middleView, rightView];
149 - (id)initWithCompoundTypes:(CPArray )compoundTypes
154 var leftView = [
self _viewFromCompoundTypes:compoundTypes],
157 [rightView addItemWithTitle:@"of the following are true"];
160 _leftIsWildcard = NO;
161 _rightIsWildcard = NO;
162 _rightAttributeType = 0;
163 _views = [[CPArray alloc] initWithObjects:leftView, rightView];
178 - (double)matchForPredicate:(CPPredicate)predicate
183 if ([[
self compoundTypes] containsObject:[predicate compoundPredicateType]])
188 if (!_leftIsWildcard && ![[
self leftExpressions] containsObject:[predicate leftExpression]])
191 if (![[
self operators] containsObject:[predicate predicateOperatorType]])
194 if (!_rightIsWildcard && ![[
self rightExpressions] containsObject:[predicate rightExpression]])
208 - (CPArray)templateViews
220 - (void)setPredicate:(CPPredicate)predicate
222 if (_templateType == 2)
223 [
self _setCompoundPredicate:predicate];
225 [
self _setComparisonPredicate:predicate];
234 - (CPArray)displayableSubpredicatesOfPredicate:(CPPredicate)predicate
236 if ([predicate isKindOfClass:[CPCompoundPredicate
class]])
238 var subpredicates = [predicate subpredicates];
239 if ([subpredicates count] == 0)
242 return subpredicates;
256 - (CPPredicate)predicateWithSubpredicates:(CPArray)subpredicates
258 if (_templateType == 2)
260 var type = [[_views[0] selectedItem] representedObject];
264 if (_templateType == 1)
266 var lhs = [
self _leftExpression],
267 rhs = [
self _rightExpression],
268 operator = [[_views[1] selectedItem] representedObject];
272 modifier:[
self modifier]
274 options:[
self options]];
288 - (CPArray)leftExpressions
290 if (_templateType == 1 && !_leftIsWildcard)
292 var view = [_views objectAtIndex:0];
293 return [[view itemArray] valueForKey:@"representedObject"];
303 - (CPArray)rightExpressions
305 if (_templateType == 1 && !_rightIsWildcard)
307 var view = [_views objectAtIndex:2];
308 return [[view itemArray] valueForKey:@"representedObject"];
318 - (CPArray)compoundTypes
320 if (_templateType == 2)
322 var view = [_views objectAtIndex:0];
323 return [[view itemArray] valueForKey:@"representedObject"];
335 if (_templateType == 1)
336 return _predicateModifier;
347 if (_templateType == 1)
349 var view = [_views objectAtIndex:1];
350 return [[view itemArray] valueForKey:@"representedObject"];
362 if (_templateType == 1)
363 return _predicateOptions;
372 - (CPAttributeType)rightExpressionAttributeType
374 return _rightAttributeType;
381 - (CPAttributeType)leftExpressionAttributeType
383 return _leftAttributeType;
387 + (id)_bestMatchForPredicate:(CPPredicate)predicate inTemplates:(CPArray)templates quality:(
double)quality
389 var count = [templates count],
394 for (i = 0; i < count; i++)
396 var
template = [templates objectAtIndex:i],
397 amatch = [template matchForPredicate:predicate];
399 if (amatch > match_value)
402 match_value = amatch;
408 [
CPException raise:CPRangeException
reason:@"Unable to find template matching predicate: " + [predicate predicateFormat]];
412 return [templates objectAtIndex:templateIndex];
415 - (void)_setCompoundPredicate:(CPCompoundPredicate)predicate
417 var left = [_views objectAtIndex:0],
419 index = [left indexOfItemWithRepresentedObject:type];
421 [left selectItemAtIndex:index];
424 - (void)_setComparisonPredicate:(CPComparisonPredicate)predicate
426 var left = [_views objectAtIndex:0],
427 middle = [_views objectAtIndex:1],
428 right = [_views objectAtIndex:2],
434 [left setObjectValue:[leftExpression constantValue]];
437 var index = [left indexOfItemWithRepresentedObject:leftExpression];
438 [left selectItemAtIndex:index];
441 var op_index = [middle indexOfItemWithRepresentedObject:operator];
442 [middle selectItemAtIndex:op_index];
444 if (_rightIsWildcard)
445 [right setObjectValue:[rightExpression constantValue]];
448 var index = [right indexOfItemWithRepresentedObject:rightExpression];
449 [right selectItemAtIndex:index];
453 - (CPExpression)_leftExpression
455 return [
self _expressionFromView:_views[0] forAttributeType:_leftAttributeType];
458 - (CPExpression)_rightExpression
460 return [
self _expressionFromView:_views[2] forAttributeType:_rightAttributeType];
463 - (CPExpression)_expressionFromView:(
CPView)aView forAttributeType:(CPAttributeType)attributeType
465 if (attributeType == 0)
466 return [[aView selectedItem] representedObject];
469 if (attributeType >= CPInteger16AttributeType && attributeType <= CPFloatAttributeType)
470 value = [aView intValue];
471 else if (attributeType == CPBooleanAttributeType)
472 value = [aView state];
474 value = [aView stringValue];
476 return [CPExpression expressionForConstantValue:value];
481 return (_templateType - 1);
489 + (id)_operatorsForAttributeType:(CPAttributeType)attributeType
493 switch (attributeType)
495 case CPInteger16AttributeType : [operators_array addObjects:4,5,0,2,1,3];
497 case CPInteger32AttributeType : [operators_array addObjects:4,5,0,2,1,3];
499 case CPInteger64AttributeType : [operators_array addObjects:4,5,0,2,1,3];
501 case CPDecimalAttributeType : [operators_array addObjects:4,5,0,2,1,3];
503 case CPDoubleAttributeType : [operators_array addObjects:4,5,0,2,1,3];
505 case CPFloatAttributeType : [operators_array addObjects:4,5,0,2,1,3];
507 case CPStringAttributeType : [operators_array addObjects:99,4,5,8,9];
509 case CPBooleanAttributeType : [operators_array addObjects:4,5];
511 case CPDateAttributeType : [operators_array addObjects:4,5,0,2,1,3];
513 default : CPLogConsole(
"Cannot create operators for an CPAttributeType " + attributeType);
517 return operators_array;
522 return _templateType;
525 - (id)_displayValueForPredicateOperator:(
int)operator
557 default : CPLogConsole(
@"unknown predicate operator %d" +
operator);
563 - (id)_displayValueForCompoundPredicateType:(
unsigned int)predicateType
566 switch (predicateType)
574 default : value = [
CPString stringWithFormat:@"unknown compound predicate type %d",predicateType];
580 - (id)_displayValueForConstantValue:(
id)value
582 return [value description];
585 - (id)_displayValueForKeyPath:(
CPString)keyPath
592 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
593 count = [expressions count];
595 for (var i = 0; i < count; i++)
597 var exp = expressions[i],
598 type = [exp expressionType],
603 case CPKeyPathExpressionType: title = [
self _displayValueForKeyPath:[exp keyPath]];
605 case CPConstantValueExpressionType: title = [
self _displayValueForConstantValue:[exp constantValue]];
611 var item = [[
CPMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""];
612 [item setRepresentedObject:exp];
613 [popup addItem:item];
623 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
624 count = [operators count];
626 for (var i = 0; i < count; i++)
628 var op = operators[i],
629 title = [
self _displayValueForPredicateOperator:op],
630 item = [[
CPMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""];
632 [item setRepresentedObject:op];
633 [popup addItem:item];
641 - (
CPView)_viewFromCompoundTypes:(CPArray)compoundTypes
643 var popup = [[
CPPopUpButton alloc] initWithFrame:CGRectMake(0, 0, 100, 18)],
644 count = [compoundTypes count];
646 for (var i = 0; i < count; i++)
648 var type = compoundTypes[i],
649 title = [
self _displayValueForCompoundPredicateType:type],
650 item = [[
CPMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""];
652 [item setRepresentedObject:type];
653 [popup addItem:item];
661 - (
CPView)_viewFromAttributeType:(CPAttributeType)attributeType
665 if (attributeType >= CPInteger16AttributeType && attributeType <= CPFloatAttributeType)
667 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 50, 26)];
669 else if (attributeType == CPStringAttributeType)
671 view = [
self _textFieldWithFrame:CGRectMake(0, 0, 150, 26)];
673 else if (attributeType == CPBooleanAttributeType)
675 view = [[
CPCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 26)];
677 else if (attributeType == CPDateAttributeType)
678 view = [[
CPDatePicker alloc] initWithFrame:CGRectMake(0, 0, 150, 26)];
682 [view setTag:attributeType];
689 var textField = [[
CPTextField alloc] initWithFrame:frame];
690 [textField setBezeled:YES];
691 [textField setBezelStyle:CPTextFieldSquareBezel];
692 [textField setBordered:YES];
693 [textField setEditable:YES];
695 [textField setSendsActionOnEndEditing:YES];
700 - (void)_setOptions:(
unsigned)options
702 _predicateOptions = options;
705 - (void)_setModifier:(
unsigned)modifier
707 _predicateModifier = modifier;
712 if (_templateType == 2)
713 return [
CPString stringWithFormat:
@"<%@ %p %@>",[
self className],
self,[[
self compoundTypes] componentsJoinedByString:
@", "]];
714 else if (_templateType == 1 && _rightIsWildcard)
715 return [
CPString stringWithFormat:
@"<%@ %p [%@] [%@] %d>",[
self className],
self,[[
self leftExpressions] componentsJoinedByString:
@", "],[[
self operators] componentsJoinedByString:
@", "],[
self rightExpressionAttributeType]];
717 return [
CPString stringWithFormat:@"<%@ %p [%@] [%@] [%@]>",[
self className],self,[[
self leftExpressions] componentsJoinedByString:@", "],[[
self operators] componentsJoinedByString:@", "],[[
self rightExpressions] componentsJoinedByString:@", "]];
736 var CPPredicateTemplateTypeKey =
@"CPPredicateTemplateType",
737 CPPredicateTemplateOptionsKey =
@"CPPredicateTemplateOptions",
738 CPPredicateTemplateModifierKey =
@"CPPredicateTemplateModifier",
739 CPPredicateTemplateLeftAttributeTypeKey =
@"CPPredicateTemplateLeftAttributeType",
740 CPPredicateTemplateRightAttributeTypeKey =
@"CPPredicateTemplateRightAttributeType",
741 CPPredicateTemplateLeftIsWildcardKey =
@"CPPredicateTemplateLeftIsWildcard",
742 CPPredicateTemplateRightIsWildcardKey =
@"CPPredicateTemplateRightIsWildcard",
743 CPPredicateTemplateViewsKey =
@"CPPredicateTemplateViews";
747 - (id)initWithCoder:(
CPCoder)coder
752 _templateType = [coder decodeIntForKey:CPPredicateTemplateTypeKey];
753 _predicateOptions = [coder decodeIntForKey:CPPredicateTemplateOptionsKey];
754 _predicateModifier = [coder decodeIntForKey:CPPredicateTemplateModifierKey];
755 _leftAttributeType = [coder decodeIntForKey:CPPredicateTemplateLeftAttributeTypeKey];
756 _rightAttributeType = [coder decodeIntForKey:CPPredicateTemplateRightAttributeTypeKey];
757 _leftIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateLeftIsWildcardKey];
758 _rightIsWildcard = [coder decodeBoolForKey:CPPredicateTemplateRightIsWildcardKey];
759 _views = [coder decodeObjectForKey:CPPredicateTemplateViewsKey];
763 if (_templateType == 1 && _leftIsWildcard == NO)
765 var itemArray = [_views[0] itemArray],
766 count = [itemArray count];
768 for (var i = 0; i < count; i++)
770 var item = itemArray[i];
771 if ([item representedObject] == nil)
773 var exp = [CPExpression expressionForKeyPath:[item title]];
774 [item setRepresentedObject:exp];
783 - (void)encodeWithCoder:(
CPCoder)coder
785 [coder encodeInt:_templateType forKey:CPPredicateTemplateTypeKey];
786 [coder encodeInt:_predicateOptions forKey:CPPredicateTemplateOptionsKey];
787 [coder encodeInt:_predicateModifier forKey:CPPredicateTemplateModifierKey];
788 [coder encodeInt:_leftAttributeType forKey:CPPredicateTemplateLeftAttributeTypeKey];
789 [coder encodeInt:_rightAttributeType forKey:CPPredicateTemplateRightAttributeTypeKey];
790 [coder encodeBool:_leftIsWildcard forKey:CPPredicateTemplateLeftIsWildcardKey];
791 [coder encodeBool:_rightIsWildcard forKey:CPPredicateTemplateRightIsWildcardKey];
792 [coder encodeObject:_views forKey:CPPredicateTemplateViewsKey];
805 return _templateType;
811 - (void)_setTemplateType:(
int)aValue
813 _templateType = aValue;
819 - (void)_setOptions:(
unsigned)aValue
821 _predicateOptions = aValue;
827 - (void)_setModifier:(
unsigned)aValue
829 _predicateModifier = aValue;
835 - (unsigned)leftAttributeType
837 return _leftAttributeType;
843 - (void)_setLeftAttributeType:(
unsigned)aValue
845 _leftAttributeType = aValue;
851 - (unsigned)rightAttributeType
853 return _rightAttributeType;
859 - (void)_setRightAttributeType:(
unsigned)aValue
861 _rightAttributeType = aValue;
867 - (BOOL)leftIsWildcard
869 return _leftIsWildcard;
875 - (void)setLeftIsWildcard:(BOOL)aValue
877 _leftIsWildcard = aValue;
883 - (BOOL)rightIsWildcard
885 return _rightIsWildcard;
891 - (void)setRightIsWildcard:(BOOL)aValue
893 _rightIsWildcard = aValue;
899 - (void)setTemplateViews:(CPArray)aValue