Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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