Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (hide annotations) (download)
Thu Dec 17 15:36:52 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 16682 byte(s)
[New] NSPredicateからのNSRuleEditorのrowsの生成をXspfMRuleに委譲。
1 masaki 120 //
2     // XspfMRuleEditorRow.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/29.
6     // Copyright 2009 masakih. All rights reserved.
7     //
8    
9     #import "XspfMRuleEditorRow.h"
10    
11 masaki 143 @implementation XspfMCompound
12     - (NSInteger)numberOfChildrenForChild:(id)child
13 masaki 120 {
14 masaki 143 if(!child) return 2;
15     if([child isEqualToString:@"All"] || [child isEqualToString:@"Any"]) return 1;
16     return 0;
17 masaki 120 }
18 masaki 143 - (id)childForChild:(id)child atIndex:(NSInteger)index
19 masaki 120 {
20 masaki 143 if(!child) {
21     if(index == 0) return @"All";
22     if(index == 1) return @"Any";
23     }
24     return @"of the following are true";
25 masaki 120 }
26 masaki 143 - (id)displayValueForChild:(id)child
27 masaki 120 {
28 masaki 143 return child;
29 masaki 120 }
30 masaki 143 - (NSDictionary *)predicateForChild:(id)child withDisplayValue:(id)value
31 masaki 122 {
32 masaki 143 NSDictionary *result = nil;
33 masaki 122
34 masaki 143 NSUInteger type = 9999;
35     if([child isEqualToString:@"All"]) {
36     type = NSAndPredicateType;
37     } else if([child isEqualToString:@"Any"]) {
38     type = NSOrPredicateType;
39     }
40     if(type < 10) {
41     result = [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:type]
42     forKey:NSRuleEditorPredicateCompoundType];
43     }
44    
45     return result;
46 masaki 122 }
47 masaki 120 @end
48    
49 masaki 152
50     @interface XspfMRule (XspfMAccessor)
51     - (void)setChildren:(NSArray *)newChildren;
52     - (void)addChild:(XspfMRule *)child;
53     - (void)setPredicateParts:(NSDictionary *)parts;
54     - (void)setExpression:(id)expression forKey:(id)key;
55     - (void)setValue:(NSString *)newValue;
56     @end
57    
58     @interface XspfMRule (XspfMExpressionBuilder)
59     @end
60    
61     @implementation XspfMRule (XspfMAccessor)
62     - (void)setChildren:(NSArray *)newChildren
63 masaki 120 {
64 masaki 152 if(!newChildren) newChildren = [NSArray array];
65    
66     [children autorelease];
67     children = [newChildren mutableCopy];
68 masaki 120 }
69 masaki 152 - (void)addChild:(XspfMRule *)child
70     {
71     [children addObject:child];
72     }
73     - (void)setPredicateParts:(NSDictionary *)parts
74     {
75     [predicateHints autorelease];
76     predicateHints = [parts mutableCopy];
77     }
78     - (void)setExpression:(id)expression forKey:(id)key
79     {
80     [predicateHints setObject:expression forKey:key];
81     }
82     - (void)setValue:(NSString *)newValue
83     {
84 masaki 153 if([_value isEqualToString:newValue]) return;
85 masaki 152
86 masaki 153 [_value autorelease];
87     _value = [newValue copy];
88 masaki 152 }
89 masaki 153 - (NSString *)value { return _value; }
90 masaki 143 @end
91 masaki 152
92     @implementation XspfMRule
93     @dynamic value;
94    
95     - (NSInteger)numberOfChildren
96 masaki 120 {
97 masaki 152 return [children count];
98 masaki 120 }
99 masaki 152 - (id)childAtIndex:(NSInteger)index
100 masaki 120 {
101 masaki 152 return [children objectAtIndex:index];
102     }
103     - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
104     {
105 masaki 153 return _value;
106 masaki 152 }
107     #if 1
108     - (NSDictionary *)predicatePartsWithDisplayValue:(id)displayValue forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
109     {
110     id result = [NSMutableDictionary dictionary];
111 masaki 142
112 masaki 152 NSRuleEditorRowType rowType = [ruleEditor rowTypeForRow:row];
113     if(rowType == NSRuleEditorRowTypeCompound) {
114     return predicateHints;
115     }
116    
117     if([predicateHints valueForKey:@"XspfMIgnoreExpression"]) return nil;
118    
119     id operatorType = [predicateHints valueForKey:@"NSRuleEditorPredicateOperatorType"];
120     id option = [predicateHints valueForKey:@"NSRuleEditorPredicateOptions"];
121     id leftExp = [predicateHints valueForKey:@"NSRuleEditorPredicateLeftExpression"];
122     id rightExp = [predicateHints valueForKey:@"NSRuleEditorPredicateRightExpression"];
123     id customRightExp = [predicateHints valueForKey:@"XspfMPredicateRightExpression"];
124    
125     if(operatorType) {
126     [result setValue:operatorType forKey:NSRuleEditorPredicateOperatorType];
127     }
128     if(option) {
129     [result setValue:option forKey:NSRuleEditorPredicateOptions];
130     }
131     if(leftExp) {
132     id exp = nil;
133     if([leftExp isEqual:@"value"]) {
134     exp = [NSExpression expressionForKeyPath:displayValue];
135     } else {
136     exp = [NSExpression expressionForKeyPath:leftExp];
137     }
138     if(exp) {
139     [result setValue:exp forKey:NSRuleEditorPredicateLeftExpression];
140     }
141     }
142     if(rightExp) {
143     SEL selector = NSSelectorFromString(rightExp);
144     id exp = nil;
145     if(selector) {
146     exp = [NSExpression expressionForConstantValue:[displayValue performSelector:selector]];
147     } else {
148     exp = [NSExpression expressionForConstantValue:rightExp];
149     }
150     if(exp) {
151     [result setValue:exp forKey:NSRuleEditorPredicateRightExpression];
152     }
153     }
154     if(customRightExp) {
155     SEL selector = NSSelectorFromString(customRightExp);
156     id arg01 = [predicateHints valueForKey:@"XspfMRightExpressionArg01"];
157     id arg02 = [predicateHints valueForKey:@"XspfMRightExpressionArg02"];
158    
159    
160     if(arg02 && arg01) {
161     if([arg01 isEqual:@"displayValues"]) {
162     arg01 = [ruleEditor displayValuesForRow:row];
163     }
164     if([arg02 isEqual:@"displayValues"]) {
165     arg02 = [ruleEditor displayValuesForRow:row];
166     }
167     id r = [self performSelector:selector withObject:arg01 withObject:arg02];
168     [result setValue:r forKey:NSRuleEditorPredicateRightExpression];
169     } else if(arg01) {
170     if([arg01 isEqual:@"displayValues"]) {
171     arg01 = [ruleEditor displayValuesForRow:row];
172     }
173     id r = [self performSelector:selector withObject:arg01];
174     [result setValue:r forKey:NSRuleEditorPredicateRightExpression];
175     } else {
176     id r = [self performSelector:selector];
177     [result setValue:r forKey:NSRuleEditorPredicateRightExpression];
178     }
179     }
180    
181     if([predicateHints valueForKey:@"XspfMCustomSelector"]) {
182     id selName = [predicateHints valueForKey:@"XspfMCustomSelector"];
183     id arg01 = [predicateHints valueForKey:@"XspfMCustomSelectorArg"];
184     id exp = [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01], nil];
185    
186     id exp03 = [NSExpression expressionForConstantValue:@"DATE_RANGE_CREATOR"];
187     id exp02 = [NSExpression expressionForFunction:exp03 selectorName:selName arguments:exp];
188     [result setValue:exp02 forKey:@"NSRuleEditorPredicateRightExpression"];
189     }
190    
191     // NSLog(@"predicate\tcriterion -> %@, value -> %@, row -> %d, result -> %@", predicateHints, displayValue, row, result);
192    
193     return result;
194 masaki 142 }
195 masaki 152
196     #else
197     - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
198 masaki 120 {
199 masaki 152 #warning MUST IMPLEMENT
200     return predicateHints;
201 masaki 120 }
202 masaki 152 #endif
203 masaki 153 - (id)displayValue { return _value; }
204 masaki 120
205 masaki 152 - (id)copyWithZone:(NSZone *)zone
206 masaki 142 {
207 masaki 152 XspfMRule *result = [[[self class] allocWithZone:zone] init];
208     result->children = [children copy];
209     result->predicateHints = [predicateHints copy];
210 masaki 153 result->_value = [_value copy];
211 masaki 152
212     return result;
213 masaki 142 }
214 masaki 152
215     - (BOOL)isEqual:(id)other
216 masaki 120 {
217 masaki 152 if([super isEqual:other]) return YES;
218     if(![other isKindOfClass:[XspfMRule class]]) return NO;
219 masaki 120
220 masaki 152 XspfMRule *o = other;
221 masaki 153 if(![_value isEqualToString:o->_value]) return NO;
222 masaki 152 // if(![children isEqual:o->children]) return NO;
223     // if(![predicateHints isEqual:o->predicateHints]) return NO;
224    
225 masaki 120 return YES;
226     }
227 masaki 152 - (NSUInteger)hash
228     {
229 masaki 153 return _value ? [_value hash] : [super hash];
230 masaki 152 }
231    
232 masaki 120 - (id)description
233     {
234 masaki 152 return [NSString stringWithFormat:@"%@ {\n\t%@ = %@;\n\t%@ = %@;\n\t%@ = %@;}",
235     NSStringFromClass([self class]),
236 masaki 153 @"value", _value,
237 masaki 152 @"hints", predicateHints,
238     @"children", children,
239     nil];
240 masaki 120 }
241     @end
242    
243 masaki 152 @implementation XspfMRule (XspfMCreation)
244 masaki 120
245 masaki 152 - (id)init
246 masaki 120 {
247 masaki 152 [super init];
248    
249     children = [[NSMutableArray array] retain];
250     predicateHints = [[NSMutableDictionary dictionary] retain];
251    
252     return self;
253 masaki 120 }
254 masaki 152
255     - (id)initWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
256 masaki 120 {
257 masaki 152 [self init];
258 masaki 120
259 masaki 152 if([newValue isEqualToString:@"separator"]) {
260     [self release];
261     return [[XspfMSeparatorRule alloc] initSparetorRule];
262     }
263    
264     NSInteger tag = XspfMDefaultTag;
265     XspfMFieldType type = XspfMUnknownType;
266     if([newValue hasPrefix:@"textField"]) {
267     type = XspfMTextFieldType;
268     } else if([newValue hasPrefix:@"dateField"]) {
269     type = XspfMDateFieldType;
270     if([newValue isEqualToString:@"dateField"]) {
271     tag = XspfMPrimaryDateFieldTag;
272     } else {
273     tag = XspfMSeconraryDateFieldTag;
274     }
275     } else if([newValue hasPrefix:@"rateField"]) {
276     type = XspfMRateFieldType;
277     } else if([newValue hasPrefix:@"numberField"]) {
278     type = XspfMNumberFieldType;
279     if([newValue isEqualToString:@"numberField"]) {
280     tag = XspfMPrimaryNumberFieldTag;
281     } else {
282     tag = XspfMSecondaryNumberFieldTag;
283     }
284     }
285     if(type != XspfMUnknownType) {
286     [self release];
287     self = [[XspfMFieldRule alloc] initWithFieldType:type tag:tag];
288     }
289    
290     [self setValue:newValue];
291     [self setChildren:newChildren];
292     [self setPredicateParts:parts];
293    
294 masaki 120 return self;
295     }
296 masaki 152 + (id)ruleWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
297 masaki 120 {
298 masaki 152 return [[[self alloc] initWithValue:newValue children:newChildren predicateHints:parts] autorelease];
299 masaki 120 }
300 masaki 152
301     + (NSArray *)compoundRule
302 masaki 120 {
303 masaki 152 id comp = [self ruleWithValue:@"of the following are true" children:nil predicateHints:[NSDictionary dictionary]];
304    
305     id allExp = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
306     id all = [self ruleWithValue:@"All"
307     children:[NSArray arrayWithObject:comp]
308     predicateHints:[NSDictionary dictionaryWithObject:allExp forKey:NSRuleEditorPredicateCompoundType]];
309    
310     id anyExp = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
311     id any = [self ruleWithValue:@"Any"
312     children:[NSArray arrayWithObject:comp]
313     predicateHints:[NSDictionary dictionaryWithObject:anyExp forKey:NSRuleEditorPredicateCompoundType]];
314    
315     return [NSArray arrayWithObjects:all, any, nil];
316 masaki 120 }
317 masaki 152
318     - (NSDictionary *)predicateHintsWithPlist:(NSDictionary *)plist
319 masaki 120 {
320 masaki 152 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:plist];
321     [result removeObjectForKey:@"criteria"];
322     [result removeObjectForKey:@"value"];
323    
324     return result;
325 masaki 120 }
326 masaki 152
327     + (id)ruleWithPlist:(id)plist
328 masaki 120 {
329 masaki 152 return [[[self alloc] initWithPlist:plist] autorelease];
330 masaki 120 }
331 masaki 152 - (id)initWithPlist:(id)plist
332 masaki 120 {
333 masaki 152 if(![plist isKindOfClass:[NSDictionary class]]) {
334     [self init];
335     [self release];
336     return nil;
337     }
338    
339     id pValue = [plist valueForKey:@"value"];
340     id criteria = [plist valueForKey:@"criteria"];
341     id pChildren = [NSMutableArray array];
342     for(id criterion in criteria) {
343     id c = [[self class] ruleWithPlist:criterion];
344     if(c) [pChildren addObject:c];
345     }
346     id hints = [self predicateHintsWithPlist:plist];
347    
348     return [self initWithValue:pValue children:pChildren predicateHints:hints];
349 masaki 120 }
350 masaki 152
351     - (void)dealloc
352 masaki 120 {
353 masaki 152 [children release];
354     [predicateHints release];
355 masaki 153 [_value release];
356 masaki 152
357     [super dealloc];
358 masaki 120 }
359 masaki 152
360 masaki 120 @end
361    
362 masaki 153 @implementation XspfMRule (XspfMPrivate)
363 masaki 142
364 masaki 153 - (NSView *)textField
365     {
366     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
367     [[text cell] setControlSize:NSSmallControlSize];
368     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
369     [text setStringValue:@"1234567890"];
370     [text sizeToFit];
371     [text setStringValue:@""];
372     [text setDelegate:self];
373    
374     return text;
375     }
376     - (NSView *)datePicker
377     {
378     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
379     [[date cell] setControlSize:NSSmallControlSize];
380     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
381     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
382     [date setDrawsBackground:YES];
383     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
384     [date sizeToFit];
385     [date setDelegate:self];
386    
387     return date;
388     }
389     - (NSView *)ratingIndicator
390     {
391     id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
392     id cell = [rate cell];
393     [cell setControlSize:NSSmallControlSize];
394     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
395     [rate setMinValue:0];
396     [rate setMaxValue:5];
397     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
398     [cell setEditable:YES];
399     [rate sizeToFit];
400    
401     return rate;
402     }
403     - (NSView *)numberField
404     {
405     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
406     [[text cell] setControlSize:NSSmallControlSize];
407     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
408     [text setStringValue:@"123"];
409     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
410     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
411     [formatter setMinimum:[NSNumber numberWithInt:0]];
412     [text setFormatter:formatter];
413     [text sizeToFit];
414     [text setStringValue:@"1"];
415     [text setDelegate:self];
416    
417     return text;
418     }
419     @end
420    
421 masaki 152 @implementation XspfMSeparatorRule
422     + (id)separatorRule
423 masaki 123 {
424 masaki 152 return [[[self alloc] initSparetorRule] autorelease];
425 masaki 140 }
426 masaki 152 - (id)initSparetorRule
427 masaki 140 {
428 masaki 152 [super init];
429 masaki 139
430 masaki 152 return self;
431 masaki 123 }
432 masaki 152 - (id)displayValue
433 masaki 142 {
434 masaki 152 return [NSMenuItem separatorItem];
435 masaki 142 }
436 masaki 152 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
437 masaki 123 {
438 masaki 152 return [NSMenuItem separatorItem];
439 masaki 123 }
440 masaki 152 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
441 masaki 123 {
442 masaki 139 return nil;
443 masaki 123 }
444 masaki 152 @end
445    
446     @implementation XspfMFieldRule
447     + (id)ruleWithFieldType:(XspfMFieldType)aType
448 masaki 120 {
449 masaki 152 return [[[self alloc] initWithFieldType:aType tag:XspfMDefaultTag] autorelease];
450     }
451     - (id)initWithFieldType:(XspfMFieldType)aType
452     {
453     return [self initWithFieldType:aType tag:XspfMDefaultTag];
454     }
455     + (id)ruleWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
456     {
457     return [[[self alloc] initWithFieldType:aType tag:aTag] autorelease];
458     }
459     - (id)initWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
460     {
461     [super init];
462 masaki 122
463 masaki 152 type = aType;
464     tag = aTag;
465 masaki 122
466 masaki 152 return self;
467     }
468     - (id)copyWithZone:(NSZone *)zone
469     {
470     XspfMFieldRule *result = [super copyWithZone:zone];
471     result->type = type;
472     result->tag = tag;
473 masaki 142
474 masaki 152 return result;
475 masaki 142 }
476 masaki 152 - (void)dealloc
477 masaki 142 {
478 masaki 152 [field release];
479     [super dealloc];
480     }
481     - (BOOL)isEqual:(id)other
482     {
483     if(![super isEqual:other]) return NO;
484 masaki 142
485 masaki 152 XspfMFieldRule *o = other;
486     if(tag != o->tag) return NO;
487     if(type != o->type) return NO;
488 masaki 142
489 masaki 152 return YES;
490 masaki 142 }
491 masaki 122
492 masaki 152 - (Class)fieldClass
493     {
494     Class result = Nil;
495     switch(type) {
496     case XspfMTextFieldType:
497     case XspfMNumberFieldType:
498     result = [NSTextField class];
499 masaki 123 break;
500 masaki 152 case XspfMDateFieldType:
501     result = [NSDatePicker class];
502 masaki 123 break;
503 masaki 152 case XspfMRateFieldType:
504     result = [NSLevelIndicator class];
505     break;
506 masaki 123 }
507 masaki 152 return result;
508 masaki 123 }
509 masaki 152 - (SEL)fieldCreateSelector
510 masaki 120 {
511 masaki 152 SEL result = Nil;
512     switch(type) {
513     case XspfMTextFieldType:
514     result = @selector(textField);
515     break;
516     case XspfMNumberFieldType:
517     result = @selector(numberField);
518     break;
519     case XspfMDateFieldType:
520     result = @selector(datePicker);
521     break;
522     case XspfMRateFieldType:
523     result = @selector(ratingIndicator);
524     break;
525     }
526     return result;
527     }
528     - (id)displayValue
529     {
530     if(field) return field;
531 masaki 142
532 masaki 152 id res = [self performSelector:[self fieldCreateSelector]];
533     [res setTag:tag];
534 masaki 142
535 masaki 152 return res;
536 masaki 142 }
537 masaki 152 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
538 masaki 120 {
539 masaki 152 if(field) return field;
540 masaki 120
541 masaki 152 id displayValues = [ruleEditor displayValuesForRow:row];
542     Class fieldCalss = [self fieldClass];
543     for(id v in displayValues) {
544     if([v isKindOfClass:fieldCalss] && [v tag] == tag) {
545     field = [v retain];
546     break;
547 masaki 120 }
548     }
549 masaki 152 if(!field) field = [[self displayValue] retain];
550 masaki 120
551 masaki 152 return field;
552 masaki 120 }
553 masaki 152 //- (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
554     //{
555     //#warning MUST IMPLEMENT
556     // return nil;
557     //}
558     @end
559    
560     @implementation XspfMRule (XspfMExpressionBuilder)
561     - (NSExpression *)rangeUnitFromDisplayValues:(NSArray *)displayValues option:(NSNumber *)optionValue
562 masaki 120 {
563 masaki 152 NSInteger option = [optionValue integerValue];
564 masaki 142
565 masaki 152 NSString *variable = nil;
566     id value02 = [displayValues objectAtIndex:2];
567     id value03 = [displayValues objectAtIndex:3];
568     id value04 = nil, value05 = nil;
569     switch(option) {
570     case 0:
571     variable = [NSString stringWithFormat:@"%d-%@-ago", [value02 intValue], value03];
572     break;
573     case 1:
574     variable = [NSString stringWithFormat:@"%d-%@", [value02 intValue], value03];
575     break;
576     case 2:
577     variable = [NSString stringWithFormat:@"not-%d-%@", [value02 intValue], value03];
578     break;
579     case 3:
580     value04 = [displayValues objectAtIndex:4];
581     value05 = [displayValues objectAtIndex:5];
582     variable = [NSString stringWithFormat:@"%d-%@-%d-%@", [value02 intValue], value03, [value04 intValue], value05];
583     break;
584 masaki 142 }
585    
586 masaki 152 return [NSExpression expressionForVariable:variable];
587     }
588     - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
589     {
590     id field01 = nil;
591     id field02 = nil;
592    
593     Class datepickerclass = [NSDatePicker class];
594     for(id v in displayValues) {
595     if([v isKindOfClass:datepickerclass]) {
596     if([v tag] == XspfMPrimaryDateFieldTag) {
597     field01 = v;
598     } else {
599     field02 = v;
600     }
601     }
602 masaki 142 }
603    
604 masaki 152 if(!field01 || !field02) return nil;
605    
606     id value01, value02;
607     value01 = [field01 dateValue]; value02 = [field02 dateValue];
608     if([value01 compare:value02] == NSOrderedDescending) {
609     id t = value02;
610     value02 = value01;
611     value01 = t;
612 masaki 142 }
613    
614 masaki 152 id expression01, expression02;
615     expression01 = [NSExpression expressionForConstantValue:value01];
616     expression02 = [NSExpression expressionForConstantValue:value02];
617    
618     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
619 masaki 142 }
620 masaki 120 @end
621 masaki 152

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