Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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