Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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