Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.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
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 16622 byte(s)
[Test] Criterionを表すクラスを一部復活。
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     if([value isEqualToString:newValue]) return;
85    
86     [value autorelease];
87     value = [newValue copy];
88     }
89     - (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     return value;
106     }
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     - (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     result->value = [value copy];
211    
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     if(![value isEqualToString:o->value]) return NO;
222     // 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     return value ? [value hash] : [super hash];
230     }
231    
232 masaki 120 - (id)description
233     {
234 masaki 152 return [NSString stringWithFormat:@"%@ {\n\t%@ = %@;\n\t%@ = %@;\n\t%@ = %@;}",
235     NSStringFromClass([self class]),
236     @"value", value,
237     @"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     [value release];
356    
357     [super dealloc];
358 masaki 120 }
359 masaki 152
360 masaki 120 @end
361    
362 masaki 142
363 masaki 152 @implementation XspfMSeparatorRule
364     + (id)separatorRule
365 masaki 123 {
366 masaki 152 return [[[self alloc] initSparetorRule] autorelease];
367 masaki 140 }
368 masaki 152 - (id)initSparetorRule
369 masaki 140 {
370 masaki 152 [super init];
371 masaki 139
372 masaki 152 return self;
373 masaki 123 }
374 masaki 152 - (id)displayValue
375 masaki 142 {
376 masaki 152 return [NSMenuItem separatorItem];
377 masaki 142 }
378 masaki 152 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
379 masaki 123 {
380 masaki 152 return [NSMenuItem separatorItem];
381 masaki 123 }
382 masaki 152 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
383 masaki 123 {
384 masaki 139 return nil;
385 masaki 123 }
386 masaki 152 @end
387    
388     @implementation XspfMFieldRule
389     + (id)ruleWithFieldType:(XspfMFieldType)aType
390 masaki 120 {
391 masaki 152 return [[[self alloc] initWithFieldType:aType tag:XspfMDefaultTag] autorelease];
392     }
393     - (id)initWithFieldType:(XspfMFieldType)aType
394     {
395     return [self initWithFieldType:aType tag:XspfMDefaultTag];
396     }
397     + (id)ruleWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
398     {
399     return [[[self alloc] initWithFieldType:aType tag:aTag] autorelease];
400     }
401     - (id)initWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
402     {
403     [super init];
404 masaki 122
405 masaki 152 type = aType;
406     tag = aTag;
407 masaki 122
408 masaki 152 return self;
409     }
410     - (id)copyWithZone:(NSZone *)zone
411     {
412     XspfMFieldRule *result = [super copyWithZone:zone];
413     result->type = type;
414     result->tag = tag;
415 masaki 142
416 masaki 152 return result;
417 masaki 142 }
418 masaki 152 - (void)dealloc
419 masaki 142 {
420 masaki 152 [field release];
421     [super dealloc];
422     }
423     - (BOOL)isEqual:(id)other
424     {
425     if(![super isEqual:other]) return NO;
426 masaki 142
427 masaki 152 XspfMFieldRule *o = other;
428     if(tag != o->tag) return NO;
429     if(type != o->type) return NO;
430 masaki 142
431 masaki 152 return YES;
432 masaki 142 }
433 masaki 122
434 masaki 152 - (NSView *)textField
435 masaki 123 {
436 masaki 152 id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
437     [[text cell] setControlSize:NSSmallControlSize];
438     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
439     [text setStringValue:@"1234567890"];
440     [text sizeToFit];
441     [text setStringValue:@""];
442     [text setDelegate:self];
443    
444     return text;
445 masaki 123 }
446 masaki 120 - (NSView *)datePicker
447     {
448     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
449     [[date cell] setControlSize:NSSmallControlSize];
450     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
451     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
452     [date setDrawsBackground:YES];
453     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
454     [date sizeToFit];
455 masaki 123 [date setDelegate:self];
456 masaki 120
457     return date;
458     }
459 masaki 152 - (NSView *)ratingIndicator
460 masaki 123 {
461 masaki 152 id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
462     id cell = [rate cell];
463     [cell setControlSize:NSSmallControlSize];
464     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
465     [rate setMinValue:0];
466     [rate setMaxValue:5];
467     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
468     [cell setEditable:YES];
469     [rate sizeToFit];
470    
471     return rate;
472     }
473     - (NSView *)numberField
474     {
475     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
476     [[text cell] setControlSize:NSSmallControlSize];
477     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
478     [text setStringValue:@"123"];
479     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
480     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
481     [formatter setMinimum:[NSNumber numberWithInt:0]];
482     [text setFormatter:formatter];
483     [text sizeToFit];
484     [text setStringValue:@"1"];
485     [text setDelegate:self];
486    
487     return text;
488     }
489    
490     - (Class)fieldClass
491     {
492     Class result = Nil;
493     switch(type) {
494     case XspfMTextFieldType:
495     case XspfMNumberFieldType:
496     result = [NSTextField class];
497 masaki 123 break;
498 masaki 152 case XspfMDateFieldType:
499     result = [NSDatePicker class];
500 masaki 123 break;
501 masaki 152 case XspfMRateFieldType:
502     result = [NSLevelIndicator class];
503     break;
504 masaki 123 }
505 masaki 152 return result;
506 masaki 123 }
507 masaki 152 - (SEL)fieldCreateSelector
508 masaki 120 {
509 masaki 152 SEL result = Nil;
510     switch(type) {
511     case XspfMTextFieldType:
512     result = @selector(textField);
513     break;
514     case XspfMNumberFieldType:
515     result = @selector(numberField);
516     break;
517     case XspfMDateFieldType:
518     result = @selector(datePicker);
519     break;
520     case XspfMRateFieldType:
521     result = @selector(ratingIndicator);
522     break;
523     }
524     return result;
525     }
526     - (id)displayValue
527     {
528     if(field) return field;
529 masaki 142
530 masaki 152 id res = [self performSelector:[self fieldCreateSelector]];
531     [res setTag:tag];
532 masaki 142
533 masaki 152 return res;
534 masaki 142 }
535 masaki 152 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
536 masaki 120 {
537 masaki 152 if(field) return field;
538 masaki 120
539 masaki 152 id displayValues = [ruleEditor displayValuesForRow:row];
540     Class fieldCalss = [self fieldClass];
541     for(id v in displayValues) {
542     if([v isKindOfClass:fieldCalss] && [v tag] == tag) {
543     field = [v retain];
544     break;
545 masaki 120 }
546     }
547 masaki 152 if(!field) field = [[self displayValue] retain];
548 masaki 120
549 masaki 152 return field;
550 masaki 120 }
551 masaki 152 //- (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
552     //{
553     //#warning MUST IMPLEMENT
554     // return nil;
555     //}
556     @end
557    
558     @implementation XspfMRule (XspfMExpressionBuilder)
559     - (NSExpression *)rangeUnitFromDisplayValues:(NSArray *)displayValues option:(NSNumber *)optionValue
560 masaki 120 {
561 masaki 152 NSInteger option = [optionValue integerValue];
562 masaki 142
563 masaki 152 NSString *variable = nil;
564     id value02 = [displayValues objectAtIndex:2];
565     id value03 = [displayValues objectAtIndex:3];
566     id value04 = nil, value05 = nil;
567     switch(option) {
568     case 0:
569     variable = [NSString stringWithFormat:@"%d-%@-ago", [value02 intValue], value03];
570     break;
571     case 1:
572     variable = [NSString stringWithFormat:@"%d-%@", [value02 intValue], value03];
573     break;
574     case 2:
575     variable = [NSString stringWithFormat:@"not-%d-%@", [value02 intValue], value03];
576     break;
577     case 3:
578     value04 = [displayValues objectAtIndex:4];
579     value05 = [displayValues objectAtIndex:5];
580     variable = [NSString stringWithFormat:@"%d-%@-%d-%@", [value02 intValue], value03, [value04 intValue], value05];
581     break;
582 masaki 142 }
583    
584 masaki 152 return [NSExpression expressionForVariable:variable];
585     }
586     - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
587     {
588     id field01 = nil;
589     id field02 = nil;
590    
591     Class datepickerclass = [NSDatePicker class];
592     for(id v in displayValues) {
593     if([v isKindOfClass:datepickerclass]) {
594     if([v tag] == XspfMPrimaryDateFieldTag) {
595     field01 = v;
596     } else {
597     field02 = v;
598     }
599     }
600 masaki 142 }
601    
602 masaki 152 if(!field01 || !field02) return nil;
603    
604     id value01, value02;
605     value01 = [field01 dateValue]; value02 = [field02 dateValue];
606     if([value01 compare:value02] == NSOrderedDescending) {
607     id t = value02;
608     value02 = value01;
609     value01 = t;
610 masaki 142 }
611    
612 masaki 152 id expression01, expression02;
613     expression01 = [NSExpression expressionForConstantValue:value01];
614     expression02 = [NSExpression expressionForConstantValue:value02];
615    
616     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
617 masaki 142 }
618 masaki 120 @end
619 masaki 152

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