Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 167 - (hide annotations) (download)
Sun Dec 20 04:04:24 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 15408 byte(s)
[Mod] XspfMCompoundクラスを削除。
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    
12 masaki 152 @interface XspfMRule (XspfMAccessor)
13     - (void)setChildren:(NSArray *)newChildren;
14     - (void)addChild:(XspfMRule *)child;
15     - (void)setPredicateParts:(NSDictionary *)parts;
16     - (void)setExpression:(id)expression forKey:(id)key;
17     - (void)setValue:(NSString *)newValue;
18     @end
19    
20     @interface XspfMRule (XspfMExpressionBuilder)
21     @end
22    
23     @implementation XspfMRule (XspfMAccessor)
24     - (void)setChildren:(NSArray *)newChildren
25 masaki 120 {
26 masaki 158 if(!newChildren) newChildren = [NSMutableArray array];
27 masaki 152
28     [children autorelease];
29 masaki 158 children = [[NSMutableArray alloc] initWithArray:newChildren copyItems:YES];
30 masaki 120 }
31 masaki 152 - (void)addChild:(XspfMRule *)child
32     {
33     [children addObject:child];
34     }
35     - (void)setPredicateParts:(NSDictionary *)parts
36     {
37     [predicateHints autorelease];
38     predicateHints = [parts mutableCopy];
39     }
40     - (void)setExpression:(id)expression forKey:(id)key
41     {
42     [predicateHints setObject:expression forKey:key];
43     }
44     - (void)setValue:(NSString *)newValue
45     {
46 masaki 153 if([_value isEqualToString:newValue]) return;
47 masaki 152
48 masaki 153 [_value autorelease];
49     _value = [newValue copy];
50 masaki 152 }
51 masaki 153 - (NSString *)value { return _value; }
52 masaki 143 @end
53 masaki 152
54     @implementation XspfMRule
55     @dynamic value;
56    
57     - (NSInteger)numberOfChildren
58 masaki 120 {
59 masaki 152 return [children count];
60 masaki 120 }
61 masaki 152 - (id)childAtIndex:(NSInteger)index
62 masaki 120 {
63 masaki 152 return [children objectAtIndex:index];
64     }
65     - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
66     {
67 masaki 153 return _value;
68 masaki 152 }
69     - (NSDictionary *)predicatePartsWithDisplayValue:(id)displayValue forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
70     {
71     id result = [NSMutableDictionary dictionary];
72 masaki 142
73 masaki 152 NSRuleEditorRowType rowType = [ruleEditor rowTypeForRow:row];
74     if(rowType == NSRuleEditorRowTypeCompound) {
75     return predicateHints;
76     }
77    
78     if([predicateHints valueForKey:@"XspfMIgnoreExpression"]) return nil;
79    
80 masaki 166 id operatorType = [predicateHints valueForKey:NSRuleEditorPredicateOperatorType];
81     id option = [predicateHints valueForKey:NSRuleEditorPredicateOptions];
82     id leftExp = [predicateHints valueForKey:NSRuleEditorPredicateLeftExpression];
83     id rightExp = [predicateHints valueForKey:NSRuleEditorPredicateRightExpression];
84 masaki 152 id customRightExp = [predicateHints valueForKey:@"XspfMPredicateRightExpression"];
85    
86     if(operatorType) {
87     [result setValue:operatorType forKey:NSRuleEditorPredicateOperatorType];
88     }
89     if(option) {
90     [result setValue:option forKey:NSRuleEditorPredicateOptions];
91     }
92     if(leftExp) {
93     id exp = nil;
94     if([leftExp isEqual:@"value"]) {
95     exp = [NSExpression expressionForKeyPath:displayValue];
96     } else {
97     exp = [NSExpression expressionForKeyPath:leftExp];
98     }
99     if(exp) {
100     [result setValue:exp forKey:NSRuleEditorPredicateLeftExpression];
101     }
102     }
103     if(rightExp) {
104     SEL selector = NSSelectorFromString(rightExp);
105     id exp = nil;
106     if(selector) {
107     exp = [NSExpression expressionForConstantValue:[displayValue performSelector:selector]];
108     } else {
109     exp = [NSExpression expressionForConstantValue:rightExp];
110     }
111     if(exp) {
112     [result setValue:exp forKey:NSRuleEditorPredicateRightExpression];
113     }
114     }
115     if(customRightExp) {
116     SEL selector = NSSelectorFromString(customRightExp);
117     id arg01 = [predicateHints valueForKey:@"XspfMRightExpressionArg01"];
118     id arg02 = [predicateHints valueForKey:@"XspfMRightExpressionArg02"];
119    
120    
121     if(arg02 && arg01) {
122     if([arg01 isEqual:@"displayValues"]) {
123     arg01 = [ruleEditor displayValuesForRow:row];
124     }
125     if([arg02 isEqual:@"displayValues"]) {
126     arg02 = [ruleEditor displayValuesForRow:row];
127     }
128 masaki 163 id rhs = [self performSelector:selector withObject:arg01 withObject:arg02];
129     [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
130 masaki 152 } else if(arg01) {
131     if([arg01 isEqual:@"displayValues"]) {
132     arg01 = [ruleEditor displayValuesForRow:row];
133     }
134 masaki 163 id rhs = [self performSelector:selector withObject:arg01];
135     [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
136 masaki 152 } else {
137 masaki 163 id rhs = [self performSelector:selector];
138     [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
139 masaki 152 }
140     }
141    
142 masaki 163 NSString *selName = [predicateHints valueForKey:@"XspfMCustomSelector"];
143     if(selName) {
144 masaki 154 id args = nil;
145     NSString *argSelName = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteator"];
146     if(argSelName) {
147     SEL argSel = NSSelectorFromString(argSelName);
148     id argSelArg01 = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteatorArg01"];
149     if([argSelArg01 isEqual:@"displayValues"]) {
150     argSelArg01 = [ruleEditor displayValuesForRow:row];
151     }
152     id argSelArg02 = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteatorArg02"];
153     if([argSelArg02 isEqual:@"displayValues"]) {
154     argSelArg02 = [ruleEditor displayValuesForRow:row];
155     }
156     if(argSelArg02) {
157     args = [self performSelector:argSel withObject:argSelArg01 withObject:argSelArg02];
158     } else if(argSelArg01) {
159     args = [self performSelector:argSel withObject:argSelArg01];
160     } else {
161     args = [self performSelector:argSel];
162     }
163     } else {
164     id arg01 = [predicateHints valueForKey:@"XspfMCustomSelectorArg01"];
165     args = [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01], nil];
166     }
167 masaki 152
168 masaki 165 id target = [NSExpression expressionForConstantValue:[[[[self class] alloc] init] autorelease]];
169     id rhs = [NSExpression expressionForFunction:target selectorName:selName arguments:args];
170 masaki 166 [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
171 masaki 152 }
172    
173     // NSLog(@"predicate\tcriterion -> %@, value -> %@, row -> %d, result -> %@", predicateHints, displayValue, row, result);
174    
175     return result;
176 masaki 142 }
177 masaki 152
178 masaki 153 - (id)displayValue { return _value; }
179 masaki 120
180 masaki 164 #pragma mark == NSCopying Protocol ==
181 masaki 152 - (id)copyWithZone:(NSZone *)zone
182 masaki 142 {
183 masaki 152 XspfMRule *result = [[[self class] allocWithZone:zone] init];
184 masaki 158 [result setChildren:children];
185     [result setPredicateParts:predicateHints];
186     [result setValue:_value];
187 masaki 152
188     return result;
189 masaki 142 }
190 masaki 152
191 masaki 164 #pragma mark == NSCoding Protocol ==
192     static NSString *const XspfMRuleChildrenKey = @"XspfMRuleChildrenKey";
193     static NSString *const XspfMRulePredicateHintsKey = @"XspfMRulePredicateHintsKey";
194     static NSString *const XspfMRuleValueKey = @"XspfMRuleValueKey";
195     - (id)initWithCoder:(NSCoder *)decoder
196     {
197     self = [self init];
198    
199     [self setChildren:[decoder decodeObjectForKey:XspfMRuleChildrenKey]];
200     [self setPredicateParts:[decoder decodeObjectForKey:XspfMRulePredicateHintsKey]];
201     [self setValue:[decoder decodeObjectForKey:XspfMRuleValueKey]];
202    
203     return self;
204     }
205     - (void)encodeWithCoder:(NSCoder *)encoder
206     {
207     [encoder encodeObject:children forKey:XspfMRuleChildrenKey];
208     [encoder encodeObject:predicateHints forKey:XspfMRulePredicateHintsKey];
209     [encoder encodeObject:_value forKey:XspfMRuleValueKey];
210     }
211    
212 masaki 152 - (BOOL)isEqual:(id)other
213 masaki 120 {
214 masaki 152 if([super isEqual:other]) return YES;
215     if(![other isKindOfClass:[XspfMRule class]]) return NO;
216 masaki 120
217 masaki 152 XspfMRule *o = other;
218 masaki 153 if(![_value isEqualToString:o->_value]) return NO;
219 masaki 152 // if(![children isEqual:o->children]) return NO;
220     // if(![predicateHints isEqual:o->predicateHints]) return NO;
221    
222 masaki 120 return YES;
223     }
224 masaki 152 - (NSUInteger)hash
225     {
226 masaki 153 return _value ? [_value hash] : [super hash];
227 masaki 152 }
228    
229 masaki 120 - (id)description
230     {
231 masaki 152 return [NSString stringWithFormat:@"%@ {\n\t%@ = %@;\n\t%@ = %@;\n\t%@ = %@;}",
232     NSStringFromClass([self class]),
233 masaki 153 @"value", _value,
234 masaki 152 @"hints", predicateHints,
235     @"children", children,
236     nil];
237 masaki 120 }
238     @end
239    
240 masaki 152 @implementation XspfMRule (XspfMCreation)
241 masaki 120
242 masaki 152 - (id)init
243 masaki 120 {
244 masaki 152 [super init];
245    
246     children = [[NSMutableArray array] retain];
247     predicateHints = [[NSMutableDictionary dictionary] retain];
248    
249     return self;
250 masaki 120 }
251 masaki 152
252     - (id)initWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
253 masaki 120 {
254 masaki 152 [self init];
255 masaki 120
256 masaki 152 if([newValue isEqualToString:@"separator"]) {
257     [self release];
258     return [[XspfMSeparatorRule alloc] initSparetorRule];
259     }
260    
261     NSInteger tag = XspfMDefaultTag;
262     XspfMFieldType type = XspfMUnknownType;
263     if([newValue hasPrefix:@"textField"]) {
264     type = XspfMTextFieldType;
265     } else if([newValue hasPrefix:@"dateField"]) {
266     type = XspfMDateFieldType;
267     if([newValue isEqualToString:@"dateField"]) {
268     tag = XspfMPrimaryDateFieldTag;
269     } else {
270     tag = XspfMSeconraryDateFieldTag;
271     }
272     } else if([newValue hasPrefix:@"rateField"]) {
273     type = XspfMRateFieldType;
274     } else if([newValue hasPrefix:@"numberField"]) {
275     type = XspfMNumberFieldType;
276     if([newValue isEqualToString:@"numberField"]) {
277     tag = XspfMPrimaryNumberFieldTag;
278     } else {
279     tag = XspfMSecondaryNumberFieldTag;
280     }
281     }
282     if(type != XspfMUnknownType) {
283     [self release];
284     self = [[XspfMFieldRule alloc] initWithFieldType:type tag:tag];
285     }
286    
287     [self setValue:newValue];
288     [self setChildren:newChildren];
289     [self setPredicateParts:parts];
290    
291 masaki 120 return self;
292     }
293 masaki 152 + (id)ruleWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
294 masaki 120 {
295 masaki 152 return [[[self alloc] initWithValue:newValue children:newChildren predicateHints:parts] autorelease];
296 masaki 120 }
297 masaki 152
298     + (NSArray *)compoundRule
299 masaki 120 {
300 masaki 152 id comp = [self ruleWithValue:@"of the following are true" children:nil predicateHints:[NSDictionary dictionary]];
301    
302     id allExp = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
303     id all = [self ruleWithValue:@"All"
304     children:[NSArray arrayWithObject:comp]
305     predicateHints:[NSDictionary dictionaryWithObject:allExp forKey:NSRuleEditorPredicateCompoundType]];
306    
307     id anyExp = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
308     id any = [self ruleWithValue:@"Any"
309     children:[NSArray arrayWithObject:comp]
310     predicateHints:[NSDictionary dictionaryWithObject:anyExp forKey:NSRuleEditorPredicateCompoundType]];
311    
312     return [NSArray arrayWithObjects:all, any, nil];
313 masaki 120 }
314 masaki 152
315     - (NSDictionary *)predicateHintsWithPlist:(NSDictionary *)plist
316 masaki 120 {
317 masaki 152 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:plist];
318     [result removeObjectForKey:@"criteria"];
319     [result removeObjectForKey:@"value"];
320    
321     return result;
322 masaki 120 }
323 masaki 152
324     + (id)ruleWithPlist:(id)plist
325 masaki 120 {
326 masaki 152 return [[[self alloc] initWithPlist:plist] autorelease];
327 masaki 120 }
328 masaki 152 - (id)initWithPlist:(id)plist
329 masaki 120 {
330 masaki 152 if(![plist isKindOfClass:[NSDictionary class]]) {
331     [self init];
332     [self release];
333     return nil;
334     }
335    
336     id pValue = [plist valueForKey:@"value"];
337     id criteria = [plist valueForKey:@"criteria"];
338     id pChildren = [NSMutableArray array];
339     for(id criterion in criteria) {
340     id c = [[self class] ruleWithPlist:criterion];
341     if(c) [pChildren addObject:c];
342     }
343     id hints = [self predicateHintsWithPlist:plist];
344    
345     return [self initWithValue:pValue children:pChildren predicateHints:hints];
346 masaki 120 }
347 masaki 152
348     - (void)dealloc
349 masaki 120 {
350 masaki 152 [children release];
351     [predicateHints release];
352 masaki 153 [_value release];
353 masaki 152
354     [super dealloc];
355 masaki 120 }
356 masaki 152
357 masaki 120 @end
358    
359 masaki 153 @implementation XspfMRule (XspfMPrivate)
360 masaki 142
361 masaki 153 - (NSView *)textField
362     {
363     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
364     [[text cell] setControlSize:NSSmallControlSize];
365     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
366     [text setStringValue:@"1234567890"];
367     [text sizeToFit];
368     [text setStringValue:@""];
369     [text setDelegate:self];
370    
371     return text;
372     }
373     - (NSView *)datePicker
374     {
375     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
376     [[date cell] setControlSize:NSSmallControlSize];
377     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
378     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
379     [date setDrawsBackground:YES];
380     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
381     [date sizeToFit];
382     [date setDelegate:self];
383    
384     return date;
385     }
386     - (NSView *)ratingIndicator
387     {
388     id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
389     id cell = [rate cell];
390     [cell setControlSize:NSSmallControlSize];
391     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
392     [rate setMinValue:0];
393     [rate setMaxValue:5];
394     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
395     [cell setEditable:YES];
396     [rate sizeToFit];
397    
398     return rate;
399     }
400     - (NSView *)numberField
401     {
402     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
403     [[text cell] setControlSize:NSSmallControlSize];
404     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
405     [text setStringValue:@"123"];
406     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
407     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
408     [formatter setMinimum:[NSNumber numberWithInt:0]];
409     [text setFormatter:formatter];
410     [text sizeToFit];
411     [text setStringValue:@"1"];
412     [text setDelegate:self];
413    
414     return text;
415     }
416     @end
417 masaki 152 @implementation XspfMRule (XspfMExpressionBuilder)
418 masaki 156 - (NSArray *)twoNumberAndUnitArgs:(NSArray *)displayValues
419     {
420     id value03 = [displayValues objectAtIndex:2];
421     id arg01 = [NSNumber numberWithInt:[[value03 objectValue] intValue]];
422    
423     id value05 = [displayValues objectAtIndex:4];
424     id arg02 = [NSNumber numberWithInt:[[value05 objectValue] intValue]];
425    
426     id value06 = [displayValues objectAtIndex:5];
427     id arg03 = nil;
428     if([value06 isEqualToString:@"Days"]) {
429 masaki 163 arg03 = [NSNumber numberWithInt:XspfMDaysUnitType];
430 masaki 156 } else if([value06 isEqualToString:@"Weeks"]) {
431 masaki 163 arg03 = [NSNumber numberWithInt:XpsfMWeeksUnitType];
432 masaki 156 } else if([value06 isEqualToString:@"Months"]) {
433 masaki 163 arg03 = [NSNumber numberWithInt:XspfMMonthsUnitType];
434 masaki 156 } else if([value06 isEqualToString:@"Years"]) {
435 masaki 163 arg03 = [NSNumber numberWithInt:XspfMYearsUnitType];
436 masaki 156 }
437    
438     if([arg01 compare:arg02] == NSOrderedDescending) {
439     id t = arg01;
440     arg01 = arg02;
441     arg02 = t;
442     }
443    
444     return [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01],
445     [NSExpression expressionForConstantValue:arg02],
446     [NSExpression expressionForConstantValue:arg03],
447     nil];
448     }
449 masaki 154 - (NSArray *)numberAndUnitArgs:(NSArray *)displayValues
450     {
451     id value03 = [displayValues objectAtIndex:2];
452     id arg01 = [NSNumber numberWithInt:[[value03 objectValue] intValue]];
453    
454     id value04 = [displayValues objectAtIndex:3];
455     id arg02 = nil;
456     if([value04 isEqualToString:@"Days"]) {
457 masaki 163 arg02 = [NSNumber numberWithInt:XspfMDaysUnitType];
458 masaki 154 } else if([value04 isEqualToString:@"Weeks"]) {
459 masaki 163 arg02 = [NSNumber numberWithInt:XpsfMWeeksUnitType];
460 masaki 154 } else if([value04 isEqualToString:@"Months"]) {
461 masaki 163 arg02 = [NSNumber numberWithInt:XspfMMonthsUnitType];
462 masaki 154 } else if([value04 isEqualToString:@"Years"]) {
463 masaki 163 arg02 = [NSNumber numberWithInt:XspfMYearsUnitType];
464 masaki 154 }
465    
466     return [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01],
467     [NSExpression expressionForConstantValue:arg02], nil];
468     }
469 masaki 152 - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
470     {
471     id field01 = nil;
472     id field02 = nil;
473    
474     Class datepickerclass = [NSDatePicker class];
475     for(id v in displayValues) {
476     if([v isKindOfClass:datepickerclass]) {
477     if([v tag] == XspfMPrimaryDateFieldTag) {
478     field01 = v;
479     } else {
480     field02 = v;
481     }
482     }
483 masaki 142 }
484    
485 masaki 152 if(!field01 || !field02) return nil;
486    
487     id value01, value02;
488     value01 = [field01 dateValue]; value02 = [field02 dateValue];
489     if([value01 compare:value02] == NSOrderedDescending) {
490     id t = value02;
491     value02 = value01;
492     value01 = t;
493 masaki 142 }
494    
495 masaki 152 id expression01, expression02;
496     expression01 = [NSExpression expressionForConstantValue:value01];
497     expression02 = [NSExpression expressionForConstantValue:value02];
498    
499     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
500 masaki 142 }
501 masaki 120 @end
502 masaki 152

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