Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRuleEditorDelegate.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 152 - (hide annotations) (download)
Thu Dec 17 14:10:00 2009 UTC (14 years, 4 months ago) by masaki
File size: 25389 byte(s)
[Test] Criterionを表すクラスを一部復活。
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 masaki 152 //static NSString *XspfMREDValueKey = @"value";
21 masaki 125 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 masaki 152 /*
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 masaki 138 variable = [NSString stringWithFormat:@"%d-%@-ago", [value02 intValue], value03];
51 masaki 137 break;
52     case 1:
53 masaki 138 variable = [NSString stringWithFormat:@"%d-%@", [value02 intValue], value03];
54     break;
55 masaki 137 case 2:
56 masaki 138 variable = [NSString stringWithFormat:@"not-%d-%@", [value02 intValue], value03];
57 masaki 137 break;
58     case 3:
59     value04 = [displayValues objectAtIndex:4];
60     value05 = [displayValues objectAtIndex:5];
61 masaki 138 variable = [NSString stringWithFormat:@"%d-%@-%d-%@", [value02 intValue], value03, [value04 intValue], value05];
62 masaki 137 break;
63     }
64    
65     return [NSExpression expressionForVariable:variable];
66     }
67 masaki 124 - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
68     {
69     id field01 = nil;
70     id field02 = nil;
71    
72     Class datepickerclass = [NSDatePicker class];
73     for(id v in displayValues) {
74     if([v isKindOfClass:datepickerclass]) {
75     if([v tag] == 0) {
76     field01 = v;
77     } else {
78     field02 = v;
79     }
80     }
81     }
82    
83     if(!field01 || !field02) return nil;
84    
85     id value01, value02;
86     value01 = [field01 dateValue]; value02 = [field02 dateValue];
87     if([value01 compare:value02] == NSOrderedDescending) {
88     id t = value02;
89     value02 = value01;
90     value01 = t;
91     }
92    
93     id expression01, expression02;
94 masaki 133 expression01 = [NSExpression expressionForConstantValue:value01];
95     expression02 = [NSExpression expressionForConstantValue:value02];
96 masaki 124
97     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
98     }
99 masaki 132 - (NSExpression *)relatedDate:(NSNumber *)typeValue
100     {
101     NSString *variable = nil;
102     NSInteger type = [typeValue integerValue];
103     switch(type) {
104     case 0:
105     variable = @"TODAY";
106     break;
107     case 1:
108     variable = @"YESTERDAY";
109     break;
110     case 2:
111     variable = @"THISWEEK";
112     break;
113     case 3:
114     variable = @"LASTWEEK";
115     break;
116     }
117    
118     return [NSExpression expressionForVariable:variable];
119     }
120 masaki 152 */
121 masaki 124 - (NSView *)textField
122     {
123     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
124     [[text cell] setControlSize:NSSmallControlSize];
125     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
126 masaki 126 [text setStringValue:@"1234567890"];
127 masaki 124 [text sizeToFit];
128     [text setStringValue:@""];
129     [text setDelegate:self];
130    
131     return text;
132     }
133     - (NSView *)datePicker
134     {
135     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
136     [[date cell] setControlSize:NSSmallControlSize];
137     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
138     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
139     [date setDrawsBackground:YES];
140     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
141     [date sizeToFit];
142     [date setDelegate:self];
143    
144     return date;
145     }
146     - (NSView *)ratingIndicator
147     {
148     id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
149     id cell = [rate cell];
150     [cell setControlSize:NSSmallControlSize];
151     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
152     [rate setMinValue:0];
153     [rate setMaxValue:5];
154     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
155     [cell setEditable:YES];
156     [rate sizeToFit];
157    
158     return rate;
159     }
160     - (NSView *)numberField
161     {
162 masaki 134 id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
163     [[text cell] setControlSize:NSSmallControlSize];
164     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
165     [text setStringValue:@"123"];
166     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
167     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
168     [formatter setMinimum:[NSNumber numberWithInt:0]];
169     [text setFormatter:formatter];
170     [text sizeToFit];
171     [text setStringValue:@"1"];
172     [text setDelegate:self];
173    
174     return text;
175 masaki 124 }
176    
177 masaki 128
178 masaki 124 - (NSDictionary *)buildRows:(NSArray *)template
179     {
180     NSMutableDictionary *result = [NSMutableDictionary dictionary];
181     for(id row in template) {
182 masaki 125 id name = [row valueForKey:XspfMREDNameKey];
183 masaki 152 id rule = [XspfMRule ruleWithPlist:row];
184     [result setObject:rule forKey:name];
185 masaki 124 }
186 masaki 152 rowTemplate = [result retain];
187 masaki 124 return result;
188     }
189 masaki 126 - (id)criteriaWithKeyPath:(NSString *)keypath
190     {
191     NSString *key = nil;
192     if([keypath isEqualToString:@"title"]) {
193     key = @"String";
194     } else if([keypath isEqualToString:@"rating"]) {
195     key = @"Rate";
196 masaki 152 } else if([[NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil] containsObject:keypath]) {
197     key = @"AbDate";
198 masaki 126 }
199     if(key) {
200     id row = [rowTemplate valueForKey:key];
201 masaki 152 id c = [[[row childAtIndex:0] copy] autorelease];
202     [c setValue:keypath];
203 masaki 126 return [NSArray arrayWithObject:c];
204     }
205    
206     return nil;
207     }
208 masaki 120 - (void)awakeFromNib
209     {
210     if(!compound) {
211 masaki 143 compound = [[XspfMCompound alloc] init];
212 masaki 120 }
213 masaki 152
214 masaki 124 NSBundle *m = [NSBundle mainBundle];
215     NSString *path = [m pathForResource:@"LibraryRowTemplate" ofType:@"plist"];
216     NSArray *rowsTemplate = [NSArray arrayWithContentsOfFile:path];
217     if(!rowsTemplate) {
218     exit(12345);
219 masaki 120 }
220 masaki 124
221 masaki 152 [self buildRows:rowsTemplate];
222    
223 masaki 124 NSMutableArray *newRows = [NSMutableArray array];
224    
225 masaki 126 id c = [self criteriaWithKeyPath:@"title"];
226     if(c) [newRows addObjectsFromArray:c];
227 masaki 124
228     for(id keyPath in [NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil]) {
229 masaki 126 c = [self criteriaWithKeyPath:keyPath];
230     if(c) [newRows addObjectsFromArray:c];
231 masaki 124 }
232    
233 masaki 126 c = [self criteriaWithKeyPath:@"rating"];
234     if(c) [newRows addObjectsFromArray:c];
235 masaki 124
236 masaki 152 simples = [newRows retain];
237    
238 masaki 125 ////
239     predicateRows = [[NSMutableArray alloc] init];
240     [ruleEditor bind:XspfMREDRowsKey toObject:self withKeyPath:XspfMREDPredicateRowsKey options:nil];
241 masaki 120 }
242    
243 masaki 127 - (NSArray *)displayValuesWithPredicate:(NSComparisonPredicate *)predicate
244     {
245     id value02 = nil; id value03 = nil;
246     id leftKeyPath = [[predicate leftExpression] keyPath];
247    
248     switch([predicate predicateOperatorType]) {
249     case NSEqualToPredicateOperatorType:
250     value02 = XspfMStringPredicateIsEqualOperator;
251     break;
252     case NSNotEqualToPredicateOperatorType:
253     value02 = XspfMStringPredicateIsNotEqualOperator;
254     break;
255     case NSContainsPredicateOperatorType:
256     value02 = XspfMStringPredicateContainsOperator;
257     break;
258     case NSBeginsWithPredicateOperatorType:
259     value02 = XspfMStringPredicateBeginsWithOperator;
260     break;
261     case NSEndsWithPredicateOperatorType:
262     value02 = XspfMStringPredicateEndsWithOperator;
263     break;
264     }
265     id rightConstant = [[predicate rightExpression] constantValue];
266     value03 = [self textField];
267     [value03 setObjectValue:rightConstant];
268    
269     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
270    
271     return disp;
272     }
273     - (NSArray *)ratingDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
274     {
275     id value02 = nil; id value03 = nil;
276     id leftKeyPath = [[predicate leftExpression] keyPath];
277    
278     switch([predicate predicateOperatorType]) {
279     case NSEqualToPredicateOperatorType:
280     value02 = XspfMStringPredicateIsEqualOperator;
281     break;
282     case NSGreaterThanPredicateOperatorType:
283     value02 = @"is greater than";
284     break;
285     case NSLessThanPredicateOperatorType:
286     value02 = @"is less than";
287     break;
288     }
289     id rightConstant = [[predicate rightExpression] constantValue];
290     value03 = [self ratingIndicator];
291     [value03 setObjectValue:rightConstant];
292    
293     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
294 masaki 143
295 masaki 127 return disp;
296     }
297 masaki 138 - (void)resolveVariable:(NSString *)variable value02:(id *)value02 value03:(id *)value03 value04:(id *)value04 value05:(id *)value05 value06:(id *)value06 value07:(id *)value07
298     {
299     NSArray *words = [variable componentsSeparatedByString:@"-"];
300    
301     switch([words count]) {
302     case 2:
303     *value02 = @"is in the last";
304     *value03 = [self numberField];
305     [*value03 setTag:2000];
306     [*value03 setStringValue:[words objectAtIndex:0]];
307     *value04 = [words objectAtIndex:1];
308     break;
309     case 3:
310     if([[words objectAtIndex:0] isEqualToString:@"not"]) {
311     *value02 = @"is not in the last";
312     *value03 = [self numberField];
313     [*value03 setTag:2000];
314     [*value03 setStringValue:[words objectAtIndex:1]];
315     *value04 = [words objectAtIndex:2];
316     } else {
317     *value02 = @"is exactly";
318     *value03 = [self numberField];
319     [*value03 setTag:2000];
320     [*value03 setStringValue:[words objectAtIndex:0]];
321     *value04 = [words objectAtIndex:1];
322     *value05 = @"ago";
323     }
324     break;
325     case 4:
326     *value02 = @"is between";
327     *value03 = [self numberField];
328     [*value03 setTag:2000];
329     [*value03 setStringValue:[words objectAtIndex:0]];
330     *value04 = @"and";
331     *value05 = [self numberField];
332     [*value05 setTag:2100];
333     [*value05 setStringValue:[words objectAtIndex:2]];
334     *value06 = [words objectAtIndex:3];
335     *value07 = @"ago";
336     break;
337     }
338     }
339 masaki 146 - (void)rangeDateDisplayValuesWithExpression:(NSExpression *)rightExp value02:(id *)value02 value03:(id *)value03 value04:(id *)value04 value05:(id *)value05
340     {
341     NSExpression *firstExp = [[rightExp collection] objectAtIndex:0];
342     NSExpression *secondExp = [[rightExp collection] objectAtIndex:1];
343    
344     *value02 = @"is in the range";
345     *value03 = [self datePicker];
346     [*value03 setObjectValue:[firstExp constantValue]];
347     *value04 = @"to";
348     *value05 = [self datePicker];
349     [*value05 setObjectValue:[secondExp constantValue]];
350     [*value05 setTag:1000];
351     }
352 masaki 138
353 masaki 132 - (NSArray *)dateRangeDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
354     {
355     id leftKeyPath = [[predicate leftExpression] keyPath];
356 masaki 146 id rightVar = nil;
357     if([[predicate rightExpression] expressionType] == NSVariableExpressionType) {
358     rightVar = [[predicate rightExpression] variable];
359     }
360 masaki 132
361     id value02 = nil;
362     id value03 = nil;
363     id value04 = nil;
364     id value05 = nil;
365     id value06 = nil;
366     id value07 = nil;
367    
368 masaki 146 if(!rightVar) {
369     [self rangeDateDisplayValuesWithExpression:[predicate rightExpression] value02:&value02 value03:&value03 value04:&value04 value05:&value05];
370     }
371    
372 masaki 132 if([rightVar isEqualToString:@"TODAY"]) {
373     value02 = @"is today";
374     } else if([rightVar isEqualToString:@"YESTERDAY"]) {
375     value02 = @"is yesterday";
376     } else if([rightVar isEqualToString:@"THISWEEK"]) {
377     value02 = @"is this week";
378     } else if([rightVar isEqualToString:@"LASTWEEK"]) {
379     value02 = @"is last week";
380 masaki 138 } else {
381     [self resolveVariable:rightVar value02:&value02 value03:&value03 value04:&value04 value05:&value05 value06:&value06 value07:&value07];
382 masaki 132 }
383    
384     return [NSArray arrayWithObjects:leftKeyPath, value02, value03, value04, value05, value06, value07, nil];
385     }
386    
387 masaki 127 - (NSArray *)dateDisplayValuesWithPredicate:(NSComparisonPredicate *)predicate
388     {
389     id value02 = nil; id value03 = nil;
390     id leftKeyPath = [[predicate leftExpression] keyPath];
391    
392     switch([predicate predicateOperatorType]) {
393     case NSEqualToPredicateOperatorType:
394     value02 = @"is the date";
395     break;
396     case NSGreaterThanPredicateOperatorType:
397     value02 = @"is after the date";
398     break;
399     case NSLessThanPredicateOperatorType:
400     value02 = @"is before the date";
401     break;
402     case NSBetweenPredicateOperatorType:
403     return [self dateRangeDisplayValuesWithPredicate:predicate];
404    
405     }
406     id rightConstant = [[predicate rightExpression] constantValue];
407     value03 = [self datePicker];
408     [value03 setObjectValue:rightConstant];
409    
410     id disp = [NSArray arrayWithObjects:leftKeyPath, value02, value03, nil];
411    
412     return disp;
413     }
414    
415 masaki 143 - (id)criterionFromCriteria:(id)criteria withDisplayValues:(NSArray *)displayValues
416     {
417     NSMutableArray *result = [NSMutableArray array];
418    
419     NSInteger index = 0;
420    
421     do {
422     id displayValue = [displayValues objectAtIndex:index];
423     id hitCriterion = nil;
424     for(id criterion in criteria) {
425     id value = [criterion valueForKey:@"value"];
426     if([value isEqualToString:displayValue]) {
427     hitCriterion = criterion;
428     break;
429     }
430    
431     if(![displayValue isKindOfClass:[NSControl class]]) continue;
432    
433     Class fieldClass = Nil;
434     NSInteger tag = 0;
435     if([value hasPrefix:@"textField"]) {
436     fieldClass = [NSTextField class];
437     } else if([value hasPrefix:@"dateField"]) {
438     fieldClass = [NSDatePicker class];
439     if(![value isEqualToString:@"dateField"]) { // result == dateField02
440     tag = 1000;
441     }
442     } else if([value hasPrefix:@"rateField"]) {
443     fieldClass = [NSLevelIndicator class];
444     } else if([value hasPrefix:@"numberField"]) {
445     fieldClass = [NSTextField class];
446     if([value isEqualToString:@"numberField"]) {
447     tag = 2000;
448     } else { // result == numberField02
449     tag = 2100;
450     }
451     }
452     if(!fieldClass) continue;
453    
454     if([displayValue isKindOfClass:fieldClass] && [displayValue tag] == tag) {
455     hitCriterion = criterion;
456     break;
457     }
458     }
459    
460     if(hitCriterion) {
461     [result addObject:hitCriterion];
462     }
463    
464     criteria = [hitCriterion valueForKey:@"criteria"];
465     index++;
466     } while(criteria);
467    
468     return result;
469     }
470    
471 masaki 125 - (id)buildRowsFromPredicate:(id)predicate
472     {
473     if([predicate isKindOfClass:[NSCompoundPredicate class]]) {
474     id subrows = [NSMutableArray array];
475    
476     id value = nil;
477     switch([predicate compoundPredicateType]) {
478     case NSNotPredicateType:
479     // ?
480     break;
481     case NSAndPredicateType:
482     value = @"All";
483     break;
484     case NSOrPredicateType:
485     value = @"Any";
486     break;
487     }
488    
489     NSArray *sub = [predicate subpredicates];
490     for(id p in sub) {
491     [subrows addObject:[self buildRowsFromPredicate:p]];
492     }
493    
494 masaki 143 id criteria = [NSArray arrayWithObjects:value, @"of the following are true", nil];
495 masaki 127 id type = [NSNumber numberWithInt:NSRuleEditorRowTypeCompound];
496 masaki 125
497     id result = [NSMutableDictionary dictionaryWithObjectsAndKeys:
498     criteria, XspfMREDCriteriaKey,
499 masaki 143 criteria, XspfMREDDisplayValuesKey,
500 masaki 125 type, XspfMREDRowTypeKey,
501     subrows, XspfMREDSubrowsKey,
502     nil];
503    
504     return result;
505     } else if([predicate isKindOfClass:[NSComparisonPredicate class]]) {
506     id leftKeyPath = [[predicate leftExpression] keyPath];
507     if(!leftKeyPath) return [NSArray array];
508 masaki 128
509     NSArray *disp = nil;
510 masaki 127 if([leftKeyPath isEqualToString:@"title"]) {
511 masaki 128 disp = [self displayValuesWithPredicate:predicate];
512 masaki 125 }
513 masaki 127 if([leftKeyPath isEqualToString:@"rating"]) {
514 masaki 128 disp = [self ratingDisplayValuesWithPredicate:predicate];
515 masaki 127 }
516 masaki 132 if([[NSArray arrayWithObjects:@"lastPlayDate", @"modificationDate", @"creationDate", nil] containsObject:leftKeyPath]) {
517 masaki 128 disp = [self dateDisplayValuesWithPredicate:predicate];
518 masaki 147 // NSLog(@"dispalyValues -> %@", disp);
519 masaki 128 }
520    
521     if(disp) {
522 masaki 127 NSArray *row = [self criteriaWithKeyPath:leftKeyPath];
523 masaki 143 id c = [self criterionFromCriteria:row withDisplayValues:disp];
524 masaki 127 NSMutableDictionary *criterion = [NSMutableDictionary dictionaryWithObjectsAndKeys:
525 masaki 143 c, XspfMREDCriteriaKey,
526 masaki 127 disp, XspfMREDDisplayValuesKey,
527     [NSNumber numberWithInt:NSRuleEditorRowTypeSimple], XspfMREDRowTypeKey,
528     nil];
529     return criterion;
530     }
531 masaki 125
532     } else if([predicate isKindOfClass:[NSPredicate class]]) {
533     NSLog(@"--> %@", predicate);
534     } else {
535     NSLog(@"???predicate class is %@", NSStringFromClass([predicate class]));
536     }
537    
538     return [NSArray array];
539     }
540 masaki 150 - (void)resolveExpression:(id)exp
541     {
542     NSString *message = nil;
543    
544     switch([exp expressionType]) {
545     case NSConstantValueExpressionType:
546     message = [NSString stringWithFormat:@"constant -> %@", [exp constantValue]];
547     break;
548     case NSEvaluatedObjectExpressionType:
549     message = [NSString stringWithFormat:@"constant -> %@", [exp constantValue]];
550     break;
551     case NSVariableExpressionType:
552     message = [NSString stringWithFormat:@"variable -> %@", [exp variable]];
553     break;
554     case NSKeyPathExpressionType:
555     message = [NSString stringWithFormat:@"keyPath -> %@", [exp keyPath]];
556     break;
557     case NSFunctionExpressionType:
558     message = [NSString stringWithFormat:@"oprand -> %@(%@)function -> %@, argumect -> %@",
559     [exp operand], NSStringFromClass([[exp operand] class]),
560     [exp function], [exp arguments]];
561     break;
562     case NSAggregateExpressionType:
563     message = [NSString stringWithFormat:@"collection -> %@", [exp collection]];
564     break;
565     }
566    
567     fprintf(stderr, "%s\n", [message UTF8String]);
568     }
569     - (void)resolvePredicate:(id)predicate
570     {
571     if([predicate isKindOfClass:[NSCompoundPredicate class]]) {
572     NSArray *sub = [predicate subpredicates];
573     for(id p in sub) {
574     [self resolvePredicate:p];
575     }
576     } else if([predicate isKindOfClass:[NSComparisonPredicate class]]) {
577     id left = [predicate leftExpression];
578     id right = [predicate rightExpression];
579     SEL sel = Nil;
580     if([predicate predicateOperatorType] == NSCustomSelectorPredicateOperatorType) {
581     sel = [predicate customSelector];
582     }
583     fprintf(stderr, "left ->\t");
584     [self resolveExpression:left];
585     if(sel) {
586     fprintf(stderr, "%s\n", [[NSString stringWithFormat:@"SEL -> %@", NSStringFromSelector(sel)] UTF8String]);
587     } else {
588     fprintf(stderr, "%s\n", [[NSString stringWithFormat:@"type -> %d, opt -> %d, mod -> %d", [predicate predicateOperatorType], [predicate options], [predicate comparisonPredicateModifier]] UTF8String]);
589     }
590     fprintf(stderr, "right ->\t");
591     [self resolveExpression:right];
592     fprintf(stderr, "end resolve.\n");
593     }
594     }
595    
596 masaki 123 - (void)setPredicate:(id)predicate
597     {
598 masaki 150 NSLog(@"predicate -> (%@) %@", NSStringFromClass([predicate class]), predicate);
599     [self resolvePredicate:predicate];
600 masaki 123
601 masaki 150
602 masaki 125 id hoge = [self buildRowsFromPredicate:predicate];
603     id new = [NSArray arrayWithObject:hoge];
604    
605     [self willChangeValueForKey:XspfMREDPredicateRowsKey];
606     [predicateRows release];
607     predicateRows = [new retain];
608     [self didChangeValueForKey:XspfMREDPredicateRowsKey];
609 masaki 146 // [ruleEditor reloadCriteria];
610 masaki 123 }
611 masaki 125 - (void)setPredicateRows:(id)p
612     {
613 masaki 147 // NSLog(@"new -> %@", p);
614 masaki 125 [predicateRows release];
615     predicateRows = [p retain];
616     }
617    
618     #pragma mark#### NSRleEditor Delegate ####
619 masaki 152
620 masaki 124 - (NSInteger)ruleEditor:(NSRuleEditor *)editor
621     numberOfChildrenForCriterion:(id)criterion
622     withRowType:(NSRuleEditorRowType)rowType
623     {
624     NSInteger result = 0;
625    
626 masaki 143 if(rowType == NSRuleEditorRowTypeCompound) {
627     return [compound numberOfChildrenForChild:criterion];
628     }
629    
630 masaki 124 if(!criterion) {
631 masaki 152 result = [simples count];
632 masaki 143 } else {
633 masaki 152 result = [criterion numberOfChildren];
634 masaki 124 }
635    
636 masaki 152 // NSLog(@"numner\tcriterion -> %@, type -> %d, result -> %d", criterion, rowType, result);
637 masaki 124
638     return result;
639     }
640    
641     - (id)ruleEditor:(NSRuleEditor *)editor
642     child:(NSInteger)index
643     forCriterion:(id)criterion
644     withRowType:(NSRuleEditorRowType)rowType
645     {
646     id result = nil;
647    
648 masaki 143 if(rowType == NSRuleEditorRowTypeCompound) {
649     return [compound childForChild:criterion atIndex:index];
650     }
651    
652 masaki 124 if(!criterion) {
653 masaki 152 result = [simples objectAtIndex:index];
654 masaki 143 } else {
655 masaki 152 result = [criterion childAtIndex:index];
656 masaki 124 }
657    
658 masaki 152 // NSLog(@"child\tindex -> %d, criterion -> %@, type -> %d, result -> %@", index, criterion, rowType, result);
659 masaki 124
660     return result;
661     }
662     - (id)ruleEditor:(NSRuleEditor *)editor
663     displayValueForCriterion:(id)criterion
664     inRow:(NSInteger)row
665     {
666     id result = nil;
667 masaki 143
668     NSRuleEditorRowType rowType = [editor rowTypeForRow:row];
669     if(rowType == NSRuleEditorRowTypeCompound) {
670     return [compound displayValueForChild:criterion];
671     }
672    
673     if(!criterion) {
674     //
675     } else {
676 masaki 152 result = [criterion displayValueForRuleEditor:editor inRow:row];
677 masaki 143 }
678    
679    
680 masaki 152 // NSLog(@"display\tcriterion -> %@, row -> %d, result -> %@", criterion, row, result);
681 masaki 143
682 masaki 124 return result;
683     }
684     - (NSDictionary *)ruleEditor:(NSRuleEditor *)editor
685     predicatePartsForCriterion:(id)criterion
686     withDisplayValue:(id)displayValue
687     inRow:(NSInteger)row
688     {
689     id result = nil;
690    
691 masaki 143 NSRuleEditorRowType rowType = [editor rowTypeForRow:row];
692     if(rowType == NSRuleEditorRowTypeCompound) {
693     return [compound predicateForChild:criterion withDisplayValue:displayValue];
694     }
695    
696 masaki 152 result = [criterion predicatePartsWithDisplayValue:displayValue forRuleEditor:editor inRow:row];
697     NSLog(@"predicate\tresult -> %@", result);
698 masaki 143
699 masaki 152 // NSLog(@"predicate\tcriterion -> %@, value -> %@, row -> %d, result -> %@", criterion, displayValue, row, result);
700 masaki 143
701 masaki 124 return result;
702     }
703     - (void)ruleEditorRowsDidChange:(NSNotification *)notification
704     {
705     //
706     }
707 masaki 150 @end
708 masaki 124
709 masaki 150 @implementation NSString (XspfMTest)
710     - (NSArray *)rangeOfToday
711     {
712     NSCalendar *aCalendar = [NSCalendar currentCalendar];
713     NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0.0];
714     NSDateComponents *nowComp = [aCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
715     fromDate:now];
716     NSDate *startOfToday = [aCalendar dateFromComponents:nowComp];
717    
718     id result = [NSArray arrayWithObjects:startOfToday, now, nil];
719     return result;
720     }
721     - (NSArray *)rangeOfYesterday
722     {
723    
724     NSCalendar *aCalendar = [NSCalendar currentCalendar];
725     NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0.0];
726     NSDateComponents *nowComp = [aCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
727     fromDate:now];
728     NSDate *startOfToday = [aCalendar dateFromComponents:nowComp];
729    
730     NSDateComponents *comp = [[NSDateComponents alloc] init];
731     [comp setDay:-1];
732     NSDate *startOfYesterday = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
733    
734     id result = [NSArray arrayWithObjects:startOfYesterday, startOfToday, nil];
735     return result;
736     }
737     - (NSArray *)rangeOfThisWeek
738     {
739     NSCalendar *aCalendar = [NSCalendar currentCalendar];
740     NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0.0];
741     NSDateComponents *nowComp = [aCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit
742     fromDate:now];
743     NSDate *startOfToday = [aCalendar dateFromComponents:nowComp];
744    
745     NSDateComponents *comp = [[NSDateComponents alloc] init];
746    
747     [comp setWeekday:-[nowComp weekday]+1];
748     NSDate *startOfThisWeek = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
749    
750     id result = [NSArray arrayWithObjects:startOfThisWeek, now, nil];
751     return result;
752     }
753     - (NSArray *)rangeOfLastWeek
754     {
755     NSCalendar *aCalendar = [NSCalendar currentCalendar];
756     NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0.0];
757     NSDateComponents *nowComp = [aCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit
758     fromDate:now];
759     NSDate *startOfToday = [aCalendar dateFromComponents:nowComp];
760    
761     NSDateComponents *comp = [[NSDateComponents alloc] init];
762     [comp setWeekday:-[nowComp weekday]+1];
763     NSDate *startOfThisWeek = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
764    
765     [comp setWeekday:-[nowComp weekday]+1];
766     [comp setWeek:-1];
767     NSDate *startOfLastWeek = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
768    
769     id result = [NSArray arrayWithObjects:startOfLastWeek, startOfThisWeek, nil];
770     return result;
771     }
772     - (NSArray *)dateRangeFromVariable:(NSString *)date
773     {
774     NSLog(@"In function argument is %@", date);
775    
776     NSCalendar *aCalendar = [NSCalendar currentCalendar];
777     NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0.0];
778     NSDateComponents *nowComp = [aCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit
779     fromDate:now];
780     NSDate *startOfToday = [aCalendar dateFromComponents:nowComp];
781    
782     NSDateComponents *comp = [[NSDateComponents alloc] init];
783     [comp setDay:-1];
784     NSDate *startOfYesterday = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
785    
786     [comp setDay:0];
787     [comp setWeekday:-[nowComp weekday]+1];
788     NSDate *startOfThisWeek = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
789    
790     [comp setWeekday:-[nowComp weekday]+1];
791     [comp setWeek:-1];
792     NSDate *startOfLastWeek = [aCalendar dateByAddingComponents:comp toDate:startOfToday options:0];
793    
794     NSLog(@"now -> %@\ntoday -> %@\nyesterday -> %@\nthisweek -> %@\nlastweek -> %@",
795     now, startOfToday, startOfYesterday, startOfThisWeek, startOfLastWeek);
796    
797     id result = [NSArray arrayWithObjects:now, startOfToday, nil];
798     return result;
799     }
800 masaki 120 @end

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