Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRuleEditorDelegate.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 137 - (hide annotations) (download)
Tue Dec 8 12:56:18 2009 UTC (14 years, 4 months ago) by masaki
File size: 19888 byte(s)
[New] 数値による日付の条件からNSPredicateを作成するようにした。
1 masaki 120 //
2     // XspfMRuleEditorDelegate.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/28.
6     // Copyright 2009 masakih. All rights reserved.
7     //
8    
9     #import "XspfMRuleEditorDelegate.h"
10    
11     #import "XspfMRuleEditorRow.h"
12    
13     @implementation XspfMRuleEditorDelegate
14 masaki 125
15     static NSString *XspfMREDRowsKey = @"rows";
16     static NSString *XspfMREDCriteriaKey = @"criteria";
17     static NSString *XspfMREDDisplayValuesKey = @"displayValues";
18     static NSString *XspfMREDRowTypeKey = @"rowType";
19     static NSString *XspfMREDSubrowsKey = @"subrows";
20     static NSString *XspfMREDValueKey = @"value";
21     static NSString *XspfMREDPredicateRowsKey = @"predicateRows";
22     static NSString *XspfMREDNameKey = @"name";
23    
24     static NSString *XspfMStringPredicateIsEqualOperator = @"is";
25     static NSString *XspfMStringPredicateIsNotEqualOperator = @"is not";
26     static NSString *XspfMStringPredicateContainsOperator = @"contains";
27     static NSString *XspfMStringPredicateBeginsWithOperator = @"begins with";
28     static NSString *XspfMStringPredicateEndsWithOperator = @"ends with";
29    
30     //static NSString *XspfMAbDatePredicatePicker01 = @"date";
31     //static NSString *XspfMAbDatePredicatePicker02 = @"beginDate";
32     //static NSString *XspfMAbDatePredicatePicker03 = @"endDate";
33     //static NSString *XspfMAbDatePredicateIsEqualOperator = @"is the date";
34     //static NSString *XspfMAbDatePredicateLessThanOperator = @"is after the date";
35     //static NSString *XspfMAbDatePredicateGreaterThanOperator = @"is before the date";
36     //static NSString *XspfMAbDatePredicateBetweenOperator = @"is in the range";
37     //static NSString *XspfMAbDatePredicateAndField = @"andField";
38    
39    
40 masaki 137 - (NSExpression *)rangeUnitFromDisplayValues:(NSArray *)displayValues option:(NSNumber *)optionValue
41     {
42     NSInteger option = [optionValue integerValue];
43    
44     NSString *variable = nil;
45     id value02 = [displayValues objectAtIndex:2];
46     id value03 = [displayValues objectAtIndex:3];
47     id value04 = nil, value05 = nil;
48     switch(option) {
49     case 0:
50     variable = [NSString stringWithFormat:@"%d-%@-AGO", [value02 intValue], [value03 uppercaseString]];
51     break;
52     case 1:
53     case 2:
54     variable = [NSString stringWithFormat:@"%d-%@", [value02 intValue], [value03 uppercaseString]];
55     break;
56     case 3:
57     value04 = [displayValues objectAtIndex:4];
58     value05 = [displayValues objectAtIndex:5];
59     variable = [NSString stringWithFormat:@"%d-%@-%d-%@", [value02 intValue], [value03 uppercaseString], [value04 intValue], [value05 uppercaseString]];
60     break;
61     }
62    
63     return [NSExpression expressionForVariable:variable];
64     }
65 masaki 124 - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
66     {
67     id field01 = nil;
68     id field02 = nil;
69    
70     Class datepickerclass = [NSDatePicker class];
71     for(id v in displayValues) {
72     if([v isKindOfClass:datepickerclass]) {
73     if([v tag] == 0) {
74     field01 = v;
75     } else {
76     field02 = v;
77     }
78     }
79     }
80    
81     if(!field01 || !field02) return nil;
82    
83     id value01, value02;
84     value01 = [field01 dateValue]; value02 = [field02 dateValue];
85     if([value01 compare:value02] == NSOrderedDescending) {
86     id t = value02;
87     value02 = value01;
88     value01 = t;
89     }
90    
91     id expression01, expression02;
92 masaki 133 expression01 = [NSExpression expressionForConstantValue:value01];
93     expression02 = [NSExpression expressionForConstantValue:value02];
94 masaki 124
95     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
96     }
97 masaki 132 - (NSExpression *)relatedDate:(NSNumber *)typeValue
98     {
99     NSString *variable = nil;
100     NSInteger type = [typeValue integerValue];
101     switch(type) {
102     case 0:
103     variable = @"TODAY";
104     break;
105     case 1:
106     variable = @"YESTERDAY";
107     break;
108     case 2:
109     variable = @"THISWEEK";
110     break;
111     case 3:
112     variable = @"LASTWEEK";
113     break;
114     }
115    
116     return [NSExpression expressionForVariable:variable];
117     }
118    
119 masaki 124 - (NSView *)textField
120     {
121     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
122     [[text cell] setControlSize:NSSmallControlSize];
123     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
124 masaki 126 [text setStringValue:@"1234567890"];
125 masaki 124 [text sizeToFit];
126     [text setStringValue:@""];
127     [text setDelegate:self];
128    
129     return text;
130     }
131     - (NSView *)datePicker
132     {
133     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
134     [[date cell] setControlSize:NSSmallControlSize];
135     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
136     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
137     [date setDrawsBackground:YES];
138     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
139     [date sizeToFit];
140     [date setDelegate:self];
141    
142     return date;
143     }
144     - (NSView *)ratingIndicator
145     {
146     id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
147     id cell = [rate cell];
148     [cell setControlSize:NSSmallControlSize];
149     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
150     [rate setMinValue:0];
151     [rate setMaxValue:5];
152     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
153     [cell setEditable:YES];
154     [rate sizeToFit];
155    
156     return rate;
157     }
158     - (NSView *)numberField
159     {
160 masaki 134 id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
161     [[text cell] setControlSize:NSSmallControlSize];
162     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
163     [text setStringValue:@"123"];
164     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
165     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
166     [formatter setMinimum:[NSNumber numberWithInt:0]];
167     [text setFormatter:formatter];
168     [text sizeToFit];
169     [text setStringValue:@"1"];
170     [text setDelegate:self];
171    
172     return text;
173 masaki 124 }
174    
175 masaki 128
176 masaki 124 - (NSDictionary *)buildRows:(NSArray *)template
177     {
178     NSMutableDictionary *result = [NSMutableDictionary dictionary];
179     for(id row in template) {
180 masaki 125 id criteria = [row valueForKey:XspfMREDCriteriaKey];
181     id name = [row valueForKey:XspfMREDNameKey];
182 masaki 124 [result setObject:criteria forKey:name];
183     }
184    
185     return result;
186     }
187 masaki 126 - (id)criteriaWithKeyPath:(NSString *)keypath
188     {
189     NSString *key = nil;
190     if([keypath isEqualToString:@"title"]) {
191     key = @"String";
192     } else if([keypath isEqualToString:@"rating"]) {
193     key = @"Rate";
194     }
195     if(key) {
196     id row = [rowTemplate valueForKey:key];
197 masaki 133 id c = [[[row objectAtIndex:0] mutableCopy] autorelease];
198 masaki 126 [c setValue:keypath forKey:XspfMREDValueKey];
199     return [NSArray arrayWithObject:c];
200     }
201    
202     if([[NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil] containsObject:keypath]) {
203 masaki 132 id keys = [NSArray arrayWithObjects:@"AbDate", /*@"RlDate",*/ nil];
204 masaki 126 id result = [NSMutableArray array];
205     for(key in keys) {
206     id row = [rowTemplate valueForKey:key];
207 masaki 133 id c = [[[row objectAtIndex:0] mutableCopy] autorelease];
208 masaki 126 [c setValue:keypath forKey:XspfMREDValueKey];
209     [result addObject:c];
210     }
211    
212     return result;
213     }
214    
215     return nil;
216     }
217 masaki 120 - (void)awakeFromNib
218     {
219     if(!compound) {
220     compound = [[XspfMCompound alloc] init];
221     }
222 masaki 124
223     rowIDs = [[NSMutableArray array] retain];
224     rowFields = [[NSMutableDictionary dictionary] retain];
225    
226     NSBundle *m = [NSBundle mainBundle];
227     NSString *path = [m pathForResource:@"LibraryRowTemplate" ofType:@"plist"];
228     NSArray *rowsTemplate = [NSArray arrayWithContentsOfFile:path];
229     if(!rowsTemplate) {
230     exit(12345);
231 masaki 120 }
232 masaki 124
233     rowTemplate = [[self buildRows:rowsTemplate] retain];
234    
235     // NSLog(@"rowTemplate =>\n%@", rowTemplate);
236    
237     NSMutableArray *newRows = [NSMutableArray array];
238    
239 masaki 126 id c = [self criteriaWithKeyPath:@"title"];
240     if(c) [newRows addObjectsFromArray:c];
241 masaki 124
242     for(id keyPath in [NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil]) {
243 masaki 126 c = [self criteriaWithKeyPath:keyPath];
244     if(c) [newRows addObjectsFromArray:c];
245 masaki 124 }
246    
247 masaki 126 c = [self criteriaWithKeyPath:@"rating"];
248     if(c) [newRows addObjectsFromArray:c];
249 masaki 124
250     rows = [newRows retain];
251 masaki 125
252    
253    
254     ////
255     predicateRows = [[NSMutableArray alloc] init];
256     [ruleEditor bind:XspfMREDRowsKey toObject:self withKeyPath:XspfMREDPredicateRowsKey options:nil];
257 masaki 120 }
258    
259 masaki 127 - (NSArray *)displayValuesWithPredicate:(NSComparisonPredicate *)predicate
260     {
261     id value02 = nil; id value03 = nil;
262     id leftKeyPath = [[predicate leftExpression] keyPath];
263    
264     switch([predicate predicateOperatorType]) {
265     case NSEqualToPredicateOperatorType:
266     value02 = XspfMStringPredicateIsEqualOperator;
267     break;
268     case NSNotEqualToPredicateOperatorType:
269     value02 = XspfMStringPredicateIsNotEqualOperator;
270     break;
271     case NSContainsPredicateOperatorType:
272     value02 = XspfMStringPredicateContainsOperator;
273     break;
274     case NSBeginsWithPredicateOperatorType:
275     value02 = XspfMStringPredicateBeginsWithOperator;
276     break;
277     case NSEndsWithPredicateOperatorType:
278     value02 = XspfMStringPredicateEndsWithOperator;
279     break;
280     }
281     id rightConstant = [[predicate rightExpression] constantValue];
282     value03 = [self textField];
283     [value03 setObjectValue:rightConstant];
284    
285     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
286    
287     return disp;
288     }
289     - (NSArray *)ratingDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
290     {
291     id value02 = nil; id value03 = nil;
292     id leftKeyPath = [[predicate leftExpression] keyPath];
293    
294     switch([predicate predicateOperatorType]) {
295     case NSEqualToPredicateOperatorType:
296     value02 = XspfMStringPredicateIsEqualOperator;
297     break;
298     case NSGreaterThanPredicateOperatorType:
299     value02 = @"is greater than";
300     break;
301     case NSLessThanPredicateOperatorType:
302     value02 = @"is less than";
303     break;
304     }
305     id rightConstant = [[predicate rightExpression] constantValue];
306     value03 = [self ratingIndicator];
307     [value03 setObjectValue:rightConstant];
308    
309     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
310    
311     return disp;
312     }
313 masaki 132 - (NSArray *)dateRangeDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
314     {
315     id leftKeyPath = [[predicate leftExpression] keyPath];
316     id rightVar = [[predicate rightExpression] variable];
317    
318     id value02 = nil;
319     id value03 = nil;
320     id value04 = nil;
321     id value05 = nil;
322     id value06 = nil;
323     id value07 = nil;
324    
325     if([rightVar isEqualToString:@"TODAY"]) {
326     value02 = @"is today";
327     } else if([rightVar isEqualToString:@"YESTERDAY"]) {
328     value02 = @"is yesterday";
329     } else if([rightVar isEqualToString:@"THISWEEK"]) {
330     value02 = @"is this week";
331     } else if([rightVar isEqualToString:@"LASTWEEK"]) {
332     value02 = @"is last week";
333     }
334    
335     return [NSArray arrayWithObjects:leftKeyPath, value02, value03, value04, value05, value06, value07, nil];
336     }
337    
338 masaki 127 - (NSArray *)dateDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
339     {
340     id value02 = nil; id value03 = nil;
341     id leftKeyPath = [[predicate leftExpression] keyPath];
342    
343     switch([predicate predicateOperatorType]) {
344     case NSEqualToPredicateOperatorType:
345     value02 = @"is the date";
346     break;
347     case NSGreaterThanPredicateOperatorType:
348     value02 = @"is after the date";
349     break;
350     case NSLessThanPredicateOperatorType:
351     value02 = @"is before the date";
352     break;
353     case NSBetweenPredicateOperatorType:
354     return [self dateRangeDisplayValuesWithPredicate:predicate];
355    
356     }
357     id rightConstant = [[predicate rightExpression] constantValue];
358     value03 = [self datePicker];
359     [value03 setObjectValue:rightConstant];
360    
361     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
362    
363     return disp;
364     }
365    
366 masaki 125 - (id)buildRowsFromPredicate:(id)predicate
367     {
368     if([predicate isKindOfClass:[NSCompoundPredicate class]]) {
369     id subrows = [NSMutableArray array];
370    
371     id value = nil;
372     switch([predicate compoundPredicateType]) {
373     case NSNotPredicateType:
374     // ?
375     break;
376     case NSAndPredicateType:
377     value = @"All";
378     break;
379     case NSOrPredicateType:
380     value = @"Any";
381     break;
382     }
383    
384     #warning MUST IMPLEMENT!!
385     NSArray *sub = [predicate subpredicates];
386     for(id p in sub) {
387     [subrows addObject:[self buildRowsFromPredicate:p]];
388     }
389    
390     id criteria = [NSArray arrayWithObjects:value, @"of the following are true", nil];
391 masaki 127 id type = [NSNumber numberWithInt:NSRuleEditorRowTypeCompound];
392 masaki 125
393     id result = [NSMutableDictionary dictionaryWithObjectsAndKeys:
394     criteria, XspfMREDCriteriaKey,
395     criteria, XspfMREDDisplayValuesKey,
396     type, XspfMREDRowTypeKey,
397     subrows, XspfMREDSubrowsKey,
398     nil];
399    
400     return result;
401     } else if([predicate isKindOfClass:[NSComparisonPredicate class]]) {
402     id leftKeyPath = [[predicate leftExpression] keyPath];
403     if(!leftKeyPath) return [NSArray array];
404 masaki 128
405     NSArray *disp = nil;
406 masaki 127 if([leftKeyPath isEqualToString:@"title"]) {
407 masaki 128 disp = [self displayValuesWithPredicate:predicate];
408 masaki 125 }
409 masaki 127 if([leftKeyPath isEqualToString:@"rating"]) {
410 masaki 128 disp = [self ratingDisplayValuesWithPredicate:predicate];
411 masaki 127 }
412 masaki 132 if([[NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil] containsObject:leftKeyPath]) {
413 masaki 128 disp = [self dateDisplayValuesWithPredicate:predicate];
414     }
415    
416     if(disp) {
417 masaki 127 NSArray *row = [self criteriaWithKeyPath:leftKeyPath];
418     NSMutableDictionary *criterion = [NSMutableDictionary dictionaryWithObjectsAndKeys:
419     row, XspfMREDCriteriaKey,
420     disp, XspfMREDDisplayValuesKey,
421     [NSNumber numberWithInt:NSRuleEditorRowTypeSimple], XspfMREDRowTypeKey,
422     nil];
423     return criterion;
424     }
425 masaki 125
426     } else if([predicate isKindOfClass:[NSPredicate class]]) {
427     NSLog(@"--> %@", predicate);
428     } else {
429     NSLog(@"???predicate class is %@", NSStringFromClass([predicate class]));
430     }
431    
432     return [NSArray array];
433     }
434 masaki 123 - (void)setPredicate:(id)predicate
435     {
436 masaki 126 NSLog(@"predicate -> (%@) %@", NSStringFromClass([predicate class]), predicate);
437 masaki 123
438 masaki 125 id hoge = [self buildRowsFromPredicate:predicate];
439     id new = [NSArray arrayWithObject:hoge];
440    
441     [self willChangeValueForKey:XspfMREDPredicateRowsKey];
442     [predicateRows release];
443     predicateRows = [new retain];
444     [self didChangeValueForKey:XspfMREDPredicateRowsKey];
445     [ruleEditor reloadCriteria];
446 masaki 123 }
447 masaki 125 - (void)setPredicateRows:(id)p
448     {
449     NSLog(@"new -> %@", p);
450     [predicateRows release];
451     predicateRows = [p retain];
452     }
453    
454     #pragma mark#### NSRleEditor Delegate ####
455 masaki 124 - (NSInteger)ruleEditor:(NSRuleEditor *)editor
456     numberOfChildrenForCriterion:(id)criterion
457     withRowType:(NSRuleEditorRowType)rowType
458     {
459     NSInteger result = 0;
460    
461     if(rowType == NSRuleEditorRowTypeCompound) {
462     return [compound numberOfChildrenForChild:criterion];
463     }
464    
465     if(!criterion) {
466     result = [rows count];
467     } else {
468 masaki 125 result = [[criterion valueForKey:XspfMREDCriteriaKey] count];
469 masaki 124 }
470    
471     // NSLog(@"numner\tcriterion -> %@, type -> %d, result -> %d", criterion, rowType, result);
472    
473     return result;
474     }
475    
476     - (id)ruleEditor:(NSRuleEditor *)editor
477     child:(NSInteger)index
478     forCriterion:(id)criterion
479     withRowType:(NSRuleEditorRowType)rowType
480     {
481     id result = nil;
482    
483     if(rowType == NSRuleEditorRowTypeCompound) {
484     return [compound childForChild:criterion atIndex:index];
485     }
486    
487     if(!criterion) {
488     result = [rows objectAtIndex:index];
489     } else {
490 masaki 125 result = [[criterion valueForKey:XspfMREDCriteriaKey] objectAtIndex:index];
491 masaki 124 }
492    
493     // NSLog(@"child\tindex -> %d, criterion -> %@, type -> %d, result -> %@", index, criterion, rowType, result);
494    
495     return result;
496     }
497     - (id)ruleEditor:(NSRuleEditor *)editor
498     displayValueForCriterion:(id)criterion
499     inRow:(NSInteger)row
500     {
501     id result = nil;
502    
503     NSRuleEditorRowType rowType = [editor rowTypeForRow:row];
504     if(rowType == NSRuleEditorRowTypeCompound) {
505     return [compound displayValueForChild:criterion];
506     }
507    
508     if(!criterion) {
509     //
510     } else {
511 masaki 125 result = [criterion valueForKey:XspfMREDValueKey];
512 masaki 124 }
513    
514 masaki 132 if([result isEqualToString:@"separator"]) {
515     return [NSMenuItem separatorItem];
516     }
517    
518 masaki 124 // create or find field object.
519     do {
520     Class searchClass = Nil;
521     SEL defaultSEL = Nil;
522     NSInteger tag = 0;
523    
524 masaki 125 if([result hasPrefix:@"textField"]) {
525 masaki 124 searchClass = [NSTextField class];
526     defaultSEL = @selector(textField);
527     } else if([result hasPrefix:@"dateField"]) {
528     searchClass = [NSDatePicker class];
529     defaultSEL = @selector(datePicker);
530     if(![result isEqualToString:@"dateField"]) { // result == dateField02
531     tag = 1000;
532     }
533     } else if([result hasPrefix:@"rateField"]) {
534     searchClass = [NSLevelIndicator class];
535     defaultSEL = @selector(ratingIndicator);
536 masaki 134 } else if([result hasPrefix:@"numberField"]) {
537     searchClass = [NSTextField class];
538     defaultSEL = @selector(numberField);
539     if([result isEqualToString:@"numberField"]) {
540     tag = 2000;
541     } else { // result == numberField02
542     tag = 2100;
543     }
544 masaki 124 }
545     if(!searchClass) break;
546    
547     id displayValues = [editor displayValuesForRow:row];
548     id field = nil;
549     for(id v in displayValues) {
550     if([v isKindOfClass:searchClass] && [v tag] == tag) {
551     field = v;
552     }
553     }
554     result = field ? field :[self performSelector:defaultSEL];
555     if(tag != 0) [result setTag:tag];
556     } while(NO);
557    
558     // NSLog(@"display\tcriterion -> %@, row -> %d, result -> %@", criterion, row, result);
559    
560     return result;
561     }
562     - (NSDictionary *)ruleEditor:(NSRuleEditor *)editor
563     predicatePartsForCriterion:(id)criterion
564     withDisplayValue:(id)displayValue
565     inRow:(NSInteger)row
566     {
567     id result = nil;
568    
569     NSRuleEditorRowType rowType = [editor rowTypeForRow:row];
570     if(rowType == NSRuleEditorRowTypeCompound) {
571     return [compound predicateForChild:criterion withDisplayValue:displayValue];
572     }
573    
574 masaki 132 if([criterion valueForKey:@"XspfMIgnoreExpression"]) return nil;
575    
576 masaki 124 result = [NSMutableDictionary dictionary];
577 masaki 132
578 masaki 124 if([criterion valueForKey:@"NSRuleEditorPredicateOperatorType"]) {
579     [result setValue:[criterion valueForKey:@"NSRuleEditorPredicateOperatorType"] forKey:@"NSRuleEditorPredicateOperatorType"];
580     }
581     if([criterion valueForKey:@"NSRuleEditorPredicateOptions"]) {
582     [result setValue:[criterion valueForKey:@"NSRuleEditorPredicateOptions"] forKey:@"NSRuleEditorPredicateOptions"];
583     }
584     if([criterion valueForKey:@"NSRuleEditorPredicateLeftExpression"]) {
585     id value = [criterion valueForKey:@"NSRuleEditorPredicateLeftExpression"];
586     id exp = nil;
587 masaki 125 if([value isEqual:XspfMREDValueKey]) {
588 masaki 124 exp = [NSExpression expressionForKeyPath:displayValue];
589     } else {
590     exp = [NSExpression expressionForKeyPath:[criterion valueForKey:@"NSRuleEditorPredicateLeft"]];
591     }
592     if(exp) {
593     [result setValue:exp forKey:@"NSRuleEditorPredicateLeftExpression"];
594     }
595     }
596     if([criterion valueForKey:@"NSRuleEditorPredicateRightExpression"]) {
597     id selector = [criterion valueForKey:@"NSRuleEditorPredicateRightExpression"];
598     id exp = nil;
599     if(NSSelectorFromString(selector)) {
600     exp = [NSExpression expressionForConstantValue:[displayValue performSelector:NSSelectorFromString(selector)]];
601     } else {
602     exp = [NSExpression expressionForConstantValue:[criterion valueForKey:@"NSRuleEditorPredicateRightExpression"]];
603     }
604     if(exp) {
605     [result setValue:exp forKey:@"NSRuleEditorPredicateRightExpression"];
606     }
607     }
608     if([criterion valueForKey:@"XspfMPredicateRightExpression"]) {
609     SEL selector = NSSelectorFromString([criterion valueForKey:@"XspfMPredicateRightExpression"]);
610     id arg01 = [criterion valueForKey:@"XspfMRightExpressionArg01"];
611 masaki 137 id arg02 = [criterion valueForKey:@"XspfMRightExpressionArg02"];
612 masaki 124
613 masaki 137
614     if(arg02 && arg01) {
615 masaki 132 if([arg01 isEqual:XspfMREDDisplayValuesKey]) {
616 masaki 124 arg01 = [editor displayValuesForRow:row];
617     }
618 masaki 137 if([arg02 isEqual:XspfMREDDisplayValuesKey]) {
619     arg02 = [editor displayValuesForRow:row];
620     }
621     id r = [self performSelector:selector withObject:arg01 withObject:arg02];
622     [result setValue:r forKey:@"NSRuleEditorPredicateRightExpression"];
623     } else if(arg01) {
624     if([arg01 isEqual:XspfMREDDisplayValuesKey]) {
625     arg01 = [editor displayValuesForRow:row];
626     }
627 masaki 124 id r = [self performSelector:selector withObject:arg01];
628     [result setValue:r forKey:@"NSRuleEditorPredicateRightExpression"];
629     } else {
630     id r = [self performSelector:selector];
631     [result setValue:r forKey:@"NSRuleEditorPredicateRightExpression"];
632     }
633     }
634    
635 masaki 125 // NSLog(@"predicate\tcriterion -> %@, value -> %@, row -> %d, result -> %@", criterion, displayValue, row, result);
636 masaki 124
637     return result;
638     }
639     - (void)ruleEditorRowsDidChange:(NSNotification *)notification
640     {
641     //
642     }
643    
644 masaki 120 @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26