Develop and Download Open Source Software

Browse Subversion Repository

Contents of /XspfManager/XspfMRuleConcreteRowsBuilders.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 592 - (show annotations) (download)
Fri Jun 15 12:39:28 2012 UTC (11 years, 9 months ago) by masakih
File size: 20467 byte(s)
[Mod] XspfMLabelシリーズをHMLabelに改名

1 //
2 // XspfMRuleConcreteRowsBuilders.m
3 // XspfManager
4 //
5 // Created by Hori,Masaki on 10/04/22.
6 //
7
8 /*
9 This source code is release under the New BSD License.
10 Copyright (c) 2010, masakih
11 All rights reserved.
12
13 ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に
14 限り、再頒布および使用が許可されます。
15
16 1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含
17 めること。
18 2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表
19 示、本条件一覧、および下記免責条項を含めること。
20 3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、
21 コントリビューターの名前を使用してはならない。
22 本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、
23 明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証
24 も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューター
25 も、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか
26 厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する
27 可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用
28 サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定
29 されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害につい
30 て、一切責任を負わないものとします。
31 -------------------------------------------------------------------
32 Copyright (c) 2010, masakih
33 All rights reserved.
34
35 Redistribution and use in source and binary forms, with or without
36 modification, are permitted provided that the following conditions
37 are met:
38
39 1, Redistributions of source code must retain the above copyright
40 notice, this list of conditions and the following disclaimer.
41 2, Redistributions in binary form must reproduce the above copyright
42 notice, this list of conditions and the following disclaimer in
43 the documentation and/or other materials provided with the
44 distribution.
45 3, The names of its contributors may be used to endorse or promote
46 products derived from this software without specific prior
47 written permission.
48 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
51 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
52 COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53 INCIDENTAL, SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
56 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
58 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59 POSSIBILITY OF SUCH DAMAGE.
60 */
61
62
63 #import "XspfMRuleRowsBuilder.h"
64 #import "XspfMRuleRowsBuilder_private.h"
65 #import "XspfMRule.h"
66 #import "XspfMRule_private.h"
67 #import "XspfMRuleRowTemplate.h"
68
69 #import "HMLabelField.h"
70
71
72 @implementation XspfMRuleCompoundPredicateRowsBuilder
73 - (id)initWithPredicate:(NSPredicate *)aPredicate
74 {
75 [super init];
76 [self setPredicate:aPredicate];
77
78 return self;
79 }
80 + (BOOL)canBuildPredicate:(NSPredicate *)predicate
81 {
82 return [predicate isKindOfClass:[NSCompoundPredicate class]] ? YES : NO;
83 }
84 - (void) build {}
85 - (id)value01
86 {
87 id value01 = nil;
88 switch([predicate compoundPredicateType]) {
89 case NSAndPredicateType:
90 value01 = @"All";
91 break;
92 case NSOrPredicateType:
93 value01 = @"Any";
94 break;
95 case NSNotPredicateType:
96 value01 = @"None";
97 break;
98 default:
99 [NSException raise:@"XspfMUnknownPredicateType" format:@"XpsfM: unknown predicate type."];
100 break;
101 }
102 return value01;
103 }
104 - (id)value02
105 {
106 return @"of the following are true";
107 }
108 - (NSNumber *)rowType
109 {
110 return [NSNumber numberWithInt:NSRuleEditorRowTypeCompound];
111 }
112 - (NSArray *)criteria
113 {
114 id compoundType = nil;
115 switch([predicate compoundPredicateType]) {
116 case NSAndPredicateType:
117 compoundType = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
118 break;
119 case NSOrPredicateType:
120 compoundType = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
121 break;
122 case NSNotPredicateType:
123 compoundType = [NSNumber numberWithUnsignedInt:NSNotPredicateType];
124 break;
125 default:
126 [NSException raise:@"XspfMUnknownPredicateType" format:@"XpsfM: unknown predicate type."];
127 break;
128 }
129 id criterion02 = [XspfMRule ruleWithValue:[self value02] children:nil predicateHints:[NSDictionary dictionary]];
130 id criterion01 = [XspfMRule ruleWithValue:[self value01]
131 children:[NSArray arrayWithObject:criterion02]
132 predicateHints:[NSDictionary dictionaryWithObject:compoundType forKey:NSRuleEditorPredicateCompoundType]];
133 return [NSArray arrayWithObjects:criterion01, criterion02, nil];
134 }
135 - (NSArray *)subrows
136 {
137 id newSubrows = [NSMutableArray array];
138 NSArray *sub = [predicate subpredicates];
139 for(id subPredicate in sub) {
140 XspfMRuleRowsBuilder *builder = [XspfMRuleRowsBuilder builderWithPredicate:subPredicate];
141 builder.rowTemplate = self.rowTemplate;
142 [builder build];
143 id row = [builder row];
144
145 [newSubrows addObject:row];
146 }
147 return newSubrows;
148 }
149 @end
150
151 #pragma mark#### XspfMRuleComparisonPredicateRowsBuilder ####
152 @implementation XspfMRuleComparisonPredicateRowsBuilder
153 - (id)initWithPredicate:(NSPredicate *)aPredicate
154 {
155 [super init];
156 [self setPredicate:aPredicate];
157
158 return self;
159 }
160 - (void)dealloc
161 {
162 [rowType release];
163 [displayValues release];
164 [criteria release];
165 [subrows release];
166
167 [super dealloc];
168 }
169 + (BOOL)canBuildPredicate:(NSPredicate *)predicate
170 {
171 return [predicate isKindOfClass:[NSComparisonPredicate class]] ? YES : NO;
172 }
173 - (void)build
174 {
175 id provisionalDisplayValue = [self provisionalDisplayValue];
176 [self buildCriteriaWithProvisionalDisplayValue:provisionalDisplayValue];
177 [self buildDisplayValuesWithProvisionalDisplayValue:provisionalDisplayValue];
178 }
179 - (NSNumber *)rowType
180 {
181 return [NSNumber numberWithInt:NSRuleEditorRowTypeSimple];
182 }
183 - (NSArray *)criteria
184 {
185 return criteria;
186 }
187 - (NSArray *)displayValues
188 {
189 return displayValues;
190 }
191 - (void)buildCriteriaWithProvisionalDisplayValue:(id)provisional
192 {
193 NSMutableArray *result = [NSMutableArray array];
194 NSInteger index = 0;
195 id allRows = [rowTemplate criteriaForKeyPath:[[predicate leftExpression] keyPath]];
196
197 do {
198 id displayValue = [provisional objectAtIndex:index];
199 XspfMRule *hitCriterion = nil;
200
201 // find XspfMRule conformed dispalyValue.
202 for(XspfMRule *criterion in allRows) {
203 id value = criterion.value;
204 if([value isEqualToString:displayValue]) {
205 hitCriterion = criterion;
206 break;
207 }
208
209 if(![displayValue isKindOfClass:[NSControl class]]) continue;
210
211 Class fieldClass = Nil;
212 NSInteger tag = 0;
213 if([value isEqualToString:@"textField"]) {
214 fieldClass = [NSTextField class];
215 } else if([value isEqualToString:@"dateField"]) {
216 fieldClass = [NSDatePicker class];
217 tag = XspfMPrimaryDateFieldTag;
218 } else if([value isEqualToString:@"dateField02"]) {
219 fieldClass = [NSDatePicker class];
220 tag = XspfMSecondaryDateFieldTag;
221 } else if([value isEqualToString:@"rateField"]) {
222 fieldClass = [NSLevelIndicator class];
223 } else if([value isEqualToString:@"numberField"]) {
224 fieldClass = [NSTextField class];
225 tag = XspfMPrimaryNumberFieldTag;
226 } else if([value isEqualToString:@"numberField02"]) {
227 fieldClass = [NSTextField class];
228 tag = XspfMSecondaryNumberFieldTag;
229 } else if([value hasPrefix:@"labelField"]) {
230 fieldClass = [HMLabelField class];
231 }
232 if(!fieldClass) continue;
233
234 if([displayValue isKindOfClass:fieldClass] && [displayValue tag] == tag) {
235 hitCriterion = criterion;
236 break;
237 }
238 }
239
240 if(hitCriterion) {
241 [result addObject:hitCriterion];
242 }
243
244 allRows = [hitCriterion valueForKey:@"children"];
245 index++;
246 } while(allRows && [allRows count] != 0);
247
248 criteria = [result retain];
249 }
250 - (void)buildDisplayValuesWithProvisionalDisplayValue:(id)provisionalDisplayValue
251 {
252 id formalDisplayValues = [NSMutableArray array];
253 NSInteger i = 0;
254 for(id criterion in criteria) {
255 id displayValue = [criterion displayValue];
256 if([displayValue isKindOfClass:[NSControl class]]) {
257 [displayValue setObjectValue:[[provisionalDisplayValue objectAtIndex:i] objectValue]];
258 }
259 [formalDisplayValues addObject:displayValue];
260 i++;
261 }
262
263 displayValues = [[NSArray arrayWithArray:formalDisplayValues] retain];
264 }
265
266 - (NSArray *)provisionalDisplayValue
267 {
268 return [super displayValues];
269 }
270
271 - (id)value01
272 {
273 return [[predicate leftExpression] keyPath];
274 }
275 - (id)value02
276 {
277 id value02 = nil;
278
279 switch([predicate predicateOperatorType]) {
280 case NSLessThanPredicateOperatorType:
281 value02 = @"is less than";
282 break;
283 case NSGreaterThanPredicateOperatorType:
284 value02 = @"is greater than";
285 break;
286 case NSEqualToPredicateOperatorType:
287 value02 = @"is";
288 break;
289 case NSNotEqualToPredicateOperatorType:
290 value02 = @"is not";
291 break;
292
293 case NSBeginsWithPredicateOperatorType:
294 value02 = @"begins with";
295 break;
296 case NSEndsWithPredicateOperatorType:
297 value02 = @"ends with";
298 break;
299 case NSContainsPredicateOperatorType:
300 value02 = @"contains";
301 break;
302
303 case NSMatchesPredicateOperatorType:
304 value02 = @"not contains";
305 break;
306
307 case NSBetweenPredicateOperatorType:
308 value02 = @"between";
309 break;
310 default:
311 [NSException raise:@"XspfMUnknownPredicateType" format:@"XpsfM: unknown predicate type."];
312 break;
313 }
314
315 return value02;
316 }
317 @end
318
319 @implementation XspfMRuleStringRowsBuilder
320 + (BOOL)canBuildPredicate:(id)predicate
321 {
322 if(![predicate isKindOfClass:[NSComparisonPredicate class]]) return NO;
323 if([XspfMRule isStringKeyPath:[[predicate leftExpression] keyPath]]) return YES;
324
325 return NO;
326 }
327 - (id)field
328 {
329 return [[XspfMRule functionHost] textField];
330 }
331 - (id)value03
332 {
333 id rightConstant = [[predicate rightExpression] constantValue];
334 id value03 = [self field];
335
336 if([predicate predicateOperatorType] == NSMatchesPredicateOperatorType) {
337 NSString *notContainREGPrefix = @"(?:(?!.*";
338 NSString *notContainREGSuffix = @").)*";
339 if([rightConstant isKindOfClass:[NSString class]] && [rightConstant hasPrefix:notContainREGPrefix] && [rightConstant hasSuffix:notContainREGSuffix]) {
340 NSScanner *scanner = [NSScanner scannerWithString:rightConstant];
341 [scanner setScanLocation:[notContainREGPrefix length]];
342 NSString *strings = nil;
343 if([scanner scanUpToString:notContainREGSuffix intoString:&strings]) {
344 rightConstant = strings;
345 }
346 }
347 }
348 [value03 setObjectValue:rightConstant];
349
350 return value03;
351 }
352 @end
353
354 @implementation XspfMRuleNumberRowsBuilder
355 + (BOOL)canBuildPredicate:(id)predicate
356 {
357 if(![predicate isKindOfClass:[NSComparisonPredicate class]]) return NO;
358 if([XspfMRule isNumberKeyPath:[[predicate leftExpression] keyPath]]) return YES;
359
360 return NO;
361 }
362 - (id)field
363 {
364 return [[XspfMRule functionHost] numberField];
365 }
366 - (id)value03
367 {
368 id value;
369 if([predicate predicateOperatorType] != NSBetweenPredicateOperatorType) {
370 value = [[predicate rightExpression] constantValue];
371 } else {
372 value = [[[[predicate rightExpression] constantValue] objectAtIndex:0] constantValue];
373 }
374 id value03 = [self field];
375 [value03 setObjectValue:value];
376 [value03 setTag:XspfMPrimaryNumberFieldTag];
377
378 return value03;
379 }
380 - (id)value04
381 {
382 if([predicate predicateOperatorType] != NSBetweenPredicateOperatorType) return nil;
383
384 return @"and";
385 }
386 - (id)value05
387 {
388 if([predicate predicateOperatorType] != NSBetweenPredicateOperatorType) return nil;
389
390 id value = [[[[predicate rightExpression] constantValue] objectAtIndex:1] constantValue];
391 id value05 = [self field];
392 [value05 setObjectValue:value];
393 [value05 setTag:XspfMSecondaryNumberFieldTag];
394
395 return value05;
396 }
397 @end
398
399 @implementation XspfMRuleRatingRowsBuilder
400 + (BOOL)canBuildPredicate:(id)predicate
401 {
402 if(![predicate isKindOfClass:[NSComparisonPredicate class]]) return NO;
403 if([XspfMRule isRateKeyPath:[[predicate leftExpression] keyPath]]) return YES;
404
405 return NO;
406 }
407 - (id)field
408 {
409 return [[XspfMRule functionHost] ratingIndicator];
410 }
411 - (id)value03
412 {
413 id value03 = [super value03];
414 [value03 setTag:XspfMDefaultTag];
415
416 return value03;
417 }
418 @end
419
420 @implementation XspfMRuleLabelRowsBuilder
421 + (BOOL)canBuildPredicate:(id)predicate
422 {
423 if(![predicate isKindOfClass:[NSComparisonPredicate class]]) return NO;
424 if([XspfMRule isLabelKeyPath:[[predicate leftExpression] keyPath]]) return YES;
425
426 return NO;
427 }
428 - (id)field
429 {
430 return [[XspfMRule functionHost] labelField];
431 }
432 - (id)value03
433 {
434 id value03 = [super value03];
435 [value03 setTag:XspfMDefaultTag];
436
437 return value03;
438 }
439 @end
440
441 @implementation XspfMRuleDateRowsBuilder
442 - (id)initWithPredicate:(NSPredicate *)aPredicate
443 {
444 [super init];
445 [self release];
446
447 Class subclasses[] = {
448 [XspfMRuleConstantDateRowsBuilder class],
449 [XspfMRuleAggregateDateRowsBuilder class],
450 [XspfMRuleFunctionDateRowsBuilder class],
451 Nil,
452 };
453
454 NSInteger i = 0;
455 while(subclasses[i]) {
456 if([subclasses[i] canBuildPredicate:aPredicate]) {
457 id obj = [[subclasses[i] alloc] initWithPredicate:aPredicate];
458 return obj;
459 }
460 i++;
461 }
462
463 NSLog(@"Could not find corresponded concrete class.");
464 return nil;
465 }
466
467 + (BOOL)canBuildPredicate:(id)predicate
468 {
469 if(![predicate isKindOfClass:[NSComparisonPredicate class]]) return NO;
470 if([XspfMRule isDateKeyPath:[[predicate leftExpression] keyPath]]) return YES;
471
472 return NO;
473 }
474 @end
475
476 @implementation XspfMRuleConstantDateRowsBuilder
477 + (BOOL)canBuildPredicate:(id)predicate
478 {
479 if([[predicate rightExpression] expressionType] == NSConstantValueExpressionType) return YES;
480 return NO;
481 }
482 - (id)field
483 {
484 return [[XspfMRule functionHost] datePicker];
485 }
486 - (id)value02
487 {
488 id value02 = nil;
489 switch([predicate predicateOperatorType]) {
490 case NSEqualToPredicateOperatorType:
491 value02 = @"is the date";
492 break;
493 case NSNotEqualToPredicateOperatorType:
494 value02 = @"is not the date";
495 break;
496 case NSGreaterThanPredicateOperatorType:
497 value02 = @"is after the date";
498 break;
499 case NSLessThanPredicateOperatorType:
500 value02 = @"is before the date";
501 break;
502 default:
503 [NSException raise:@"XspfMUnknownPredicateType" format:@"XpsfM: unknown predicate type."];
504 break;
505 }
506
507 return value02;
508 }
509 - (id)value03
510 {
511 id rightConstant = [[predicate rightExpression] constantValue];
512 id value03 = [self field];
513 [value03 setObjectValue:rightConstant];
514 [value03 setTag:XspfMPrimaryDateFieldTag];
515
516 return value03;
517 }
518 @end
519
520 @implementation XspfMRuleAggregateDateRowsBuilder
521 + (BOOL)canBuildPredicate:(id)predicate
522 {
523 if([[predicate rightExpression] expressionType] == NSAggregateExpressionType) return YES;
524 return NO;
525 }
526 - (id)field
527 {
528 return [[XspfMRule functionHost] datePicker];
529 }
530 - (id)value02
531 {
532 return @"is in the range";
533 }
534 - (id)value03
535 {
536 id value03 = [self field];
537 [value03 setTag:XspfMPrimaryDateFieldTag];
538 [value03 setObjectValue:[[[[predicate rightExpression] collection] objectAtIndex:0] constantValue]];
539
540 return value03;
541 }
542 - (id)value04
543 {
544 return @"to";
545 }
546 - (id)value05
547 {
548 id value05 = [self field];
549 [value05 setObjectValue:[[[[predicate rightExpression] collection] objectAtIndex:1] constantValue]];
550 [value05 setTag:XspfMSecondaryDateFieldTag];
551
552 return value05;
553 }
554 @end
555
556 @implementation XspfMRuleFunctionDateRowsBuilder
557 + (BOOL)canBuildPredicate:(id)predicate
558 {
559 if([[predicate rightExpression] expressionType] == NSFunctionExpressionType) return YES;
560 return NO;
561 }
562 - (id)field
563 {
564 return [[XspfMRule functionHost] numberField];
565 }
566
567 - (NSString *)displayValueForUnitType:(NSNumber *)unitValue
568 {
569 NSString *result = nil;
570
571 switch([unitValue intValue]) {
572 case XspfMHoursUnitType:
573 result = @"Hours";
574 break;
575 case XspfMDaysUnitType:
576 result = @"Days";
577 break;
578 case XpsfMWeeksUnitType:
579 result = @"Weeks";
580 break;
581 case XspfMMonthsUnitType:
582 result = @"Months";
583 break;
584 case XspfMYearsUnitType:
585 result = @"Years";
586 break;
587 default:
588 [NSException raise:@"XspfMUnknownUnitType" format:@"XpsfM: unknown unit type."];
589 break;
590 }
591
592 return result;
593 }
594
595 - (id)value02
596 {
597 id value02 = nil;
598
599 NSExpression *rightExp = [predicate rightExpression];
600 NSString *function = [rightExp function];
601
602 if([function isEqualToString:@"rangeOfToday"]) {
603 value02 = @"is today";
604 } else if([function isEqualToString:@"rangeOfYesterday"]) {
605 value02 = @"is yesterday";
606 } else if([function isEqualToString:@"rangeOfThisWeek"]) {
607 value02 = @"is this week";
608 } else if([function isEqualToString:@"rangeOfLastWeek"]) {
609 value02 = @"is last week";
610 } else if([function isEqualToString:@"dateRangeByNumber:unit:"]) {
611 value02 = @"is exactly";
612 } else if([function isEqualToString:@"dateByNumber:unit:"]) {
613 switch([predicate predicateOperatorType]) {
614 case NSGreaterThanOrEqualToPredicateOperatorType:
615 value02 = @"is in the last";
616 break;
617 case NSLessThanPredicateOperatorType:
618 value02 = @"is not in the last";
619 break;
620 default:
621 [NSException raise:@"XspfMUnknownPredicateType" format:@"XpsfM: unknown predicate type."];
622 break;
623 }
624 } else if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
625 value02 = @"is between";
626
627 }
628
629 return value02;
630 }
631 - (id)value03
632 {
633 id value03 = nil;
634 NSExpression *rightExp = [predicate rightExpression];
635 NSString *function = [rightExp function];
636
637 if([function isEqualToString:@"dateRangeByNumber:unit:"]) {
638 value03 = [self field];
639 [value03 setTag:XspfMPrimaryNumberFieldTag];
640 [value03 setObjectValue:[[[rightExp arguments] objectAtIndex:0] constantValue]];
641 } else if([function isEqualToString:@"dateByNumber:unit:"]) {
642 value03 = [self field];
643 [value03 setTag:XspfMPrimaryNumberFieldTag];
644 [value03 setObjectValue:[[[rightExp arguments] objectAtIndex:0] constantValue]];
645 } else if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
646 value03 = [self field];
647 [value03 setTag:XspfMPrimaryNumberFieldTag];
648 [value03 setObjectValue:[[[rightExp arguments] objectAtIndex:0] constantValue]];
649 }
650
651 return value03;
652 }
653 - (id)value04
654 {
655 id value04 = nil;
656
657 NSExpression *rightExp = [predicate rightExpression];
658 NSString *function = [rightExp function];
659
660 if([function isEqualToString:@"dateRangeByNumber:unit:"]) {
661 id unitValue = [[[rightExp arguments] objectAtIndex:1] constantValue];
662 value04 = [self displayValueForUnitType:unitValue];
663 } else if([function isEqualToString:@"dateByNumber:unit:"]) {
664 id unitValue = [[[rightExp arguments] objectAtIndex:1] constantValue];
665 value04 = [self displayValueForUnitType:unitValue];
666 } else if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
667 value04 = @"and";
668 }
669
670 return value04;
671 }
672 - (id)value05
673 {
674 id value05 = nil;
675
676 NSExpression *rightExp = [predicate rightExpression];
677 NSString *function = [rightExp function];
678
679 if([function isEqualToString:@"dateRangeByNumber:unit:"]) {
680 value05 = @"ago";
681 } else if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
682 value05 = [self field];
683 [value05 setTag:XspfMSecondaryNumberFieldTag];
684 [value05 setObjectValue:[[[rightExp arguments] objectAtIndex:1] constantValue]];
685 }
686
687 return value05;
688 }
689 - (id)value06
690 {
691 id value06 = nil;
692
693 NSExpression *rightExp = [predicate rightExpression];
694 NSString *function = [rightExp function];
695
696 if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
697 id unitValue = [[[rightExp arguments] objectAtIndex:2] constantValue];
698 value06 = [self displayValueForUnitType:unitValue];
699 }
700
701 return value06;
702 }
703 - (id)value07
704 {
705 id value07 = nil;
706
707 NSExpression *rightExp = [predicate rightExpression];
708 NSString *function = [rightExp function];
709
710 if([function isEqualToString:@"rangeDateByNumber:toNumber:unit:"]) {
711 value07 = @"ago";
712 }
713
714 return value07;
715 }
716
717 @end

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