Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 139 - (hide annotations) (download)
Sun Dec 13 01:55:56 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 9350 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     @implementation XspfMRule (XspfMAccessor)
20     - (void)setChildren:(NSArray *)newChildren
21 masaki 120 {
22 masaki 139 if(!newChildren) newChildren = [NSArray array];
23    
24     [children autorelease];
25     children = [newChildren mutableCopy];
26 masaki 120 }
27 masaki 139 - (void)addChild:(XspfMRule *)child
28 masaki 120 {
29 masaki 139 [children addObject:child];
30 masaki 120 }
31 masaki 139 - (void)setPredicateParts:(NSDictionary *)parts
32 masaki 120 {
33 masaki 139 [predicateHints autorelease];
34     predicateHints = [parts mutableCopy];
35 masaki 120 }
36 masaki 139 - (void)setExpression:(id)expression forKey:(id)key
37 masaki 122 {
38 masaki 139 [predicateHints setObject:expression forKey:key];
39     }
40     - (void)setValue:(NSString *)newValue
41     {
42     if([value isEqualToString:newValue]) return;
43 masaki 122
44 masaki 139 [value autorelease];
45     value = [newValue copy];
46 masaki 122 }
47 masaki 139 - (NSString *)value { return value; }
48 masaki 120 @end
49    
50 masaki 139 @implementation XspfMRule
51     @dynamic value;
52    
53     - (NSInteger)numberOfChildren
54 masaki 120 {
55 masaki 139 return [children count];
56 masaki 120 }
57 masaki 139 - (id)childAtIndex:(NSInteger)index
58 masaki 120 {
59 masaki 139 return [children objectAtIndex:index];
60 masaki 120 }
61 masaki 139 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
62 masaki 120 {
63 masaki 139 return value;
64 masaki 120 }
65 masaki 139 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
66 masaki 120 {
67 masaki 139 #warning MUST IMPLEMENT
68     return predicateHints;
69 masaki 120 }
70    
71 masaki 139 - (BOOL)isEqual:(id)other
72 masaki 120 {
73 masaki 139 if([super isEqual:other]) return YES;
74     if(![other isKindOfClass:[XspfMRule class]]) return NO;
75 masaki 120
76 masaki 139 XspfMRule *o = other;
77     if(![value isEqualToString:o->value]) return NO;
78     // if(![children isEqual:o->children]) return NO;
79     // if(![predicateHints isEqual:o->predicateHints]) return NO;
80    
81 masaki 120 return YES;
82     }
83 masaki 139
84 masaki 120 - (id)description
85     {
86 masaki 139 return [NSString stringWithFormat:@"%@ {\n%@ = %@,\n%@ = %@,\n%@ = %@,}",
87     NSStringFromClass([self class]),
88     @"value", value,
89     @"hints", predicateHints,
90     @"children", children,
91     nil];
92 masaki 120 }
93     @end
94    
95 masaki 139 @implementation XspfMRule (XspfMCreation)
96 masaki 120
97 masaki 139 - (id)init
98 masaki 120 {
99 masaki 139 [super init];
100    
101     children = [[NSMutableArray array] retain];
102     predicateHints = [[NSMutableDictionary dictionary] retain];
103    
104     return self;
105 masaki 120 }
106 masaki 139
107     - (id)initWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
108 masaki 120 {
109 masaki 139 [self init];
110 masaki 120
111 masaki 139 if([newValue isEqualToString:@"separator"]) {
112     [self release];
113     return [XspfMSeparatorRule separatorRule];
114     }
115    
116     NSInteger tag = 0;
117     XspfMFieldType type = XspfMUnknownType;
118     if([newValue hasPrefix:@"textField"]) {
119     type = XspfMTextFieldType;
120     } else if([newValue hasPrefix:@"dateField"]) {
121     type = XspfMDateFieldType;
122     if([newValue isEqualToString:@"dateField"]) {
123     tag = 0;
124     } else {
125     tag = 1000;
126     }
127     } else if([newValue hasPrefix:@"rateField"]) {
128     type = XspfMRateFieldType;
129     } else if([newValue hasPrefix:@"numberField"]) {
130     if([newValue isEqualToString:@"numberField"]) {
131     tag = 2000;
132     } else {
133     tag = 2100;
134     }
135     }
136     if(type != XspfMUnknownType) {
137     [self release];
138     self = [XspfMFieldRule ruleWithFieldType:type tag:tag];
139     }
140    
141     [self setValue:newValue];
142     [self setChildren:newChildren];
143     [self setPredicateParts:parts];
144    
145 masaki 120 return self;
146     }
147 masaki 139 + (id)ruleWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
148 masaki 120 {
149 masaki 139 return [[[self alloc] initWithValue:newValue children:newChildren predicateHints:parts] autorelease];
150 masaki 120 }
151 masaki 139
152     + (NSArray *)compoundRule
153 masaki 120 {
154 masaki 139 id comp = [self ruleWithValue:@"of the following are true" children:nil predicateHints:nil];
155    
156     id allExp = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
157     id all = [self ruleWithValue:@"All"
158     children:[NSArray arrayWithObject:comp]
159     predicateHints:[NSDictionary dictionaryWithObject:allExp forKey:NSRuleEditorPredicateCompoundType]];
160    
161     id anyExp = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
162     id any = [self ruleWithValue:@"All"
163     children:[NSArray arrayWithObject:comp]
164     predicateHints:[NSDictionary dictionaryWithObject:anyExp forKey:NSRuleEditorPredicateCompoundType]];
165    
166     return [NSArray arrayWithObjects:all, any, nil];
167 masaki 120 }
168 masaki 139
169     - (NSDictionary *)predicateHintsWithPlist:(NSDictionary *)plist
170 masaki 120 {
171 masaki 139 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:plist];
172     [result removeObjectForKey:@"criteria"];
173     [result removeObjectForKey:@"value"];
174    
175     return result;
176 masaki 120 }
177 masaki 139
178     + (id)ruleWithPlist:(id)plist
179 masaki 120 {
180 masaki 139 return [[[self alloc] initWithPlist:plist] autorelease];
181 masaki 120 }
182 masaki 139 - (id)initWithPlist:(id)plist
183 masaki 120 {
184 masaki 139 if(![plist isKindOfClass:[NSDictionary class]]) {
185     [self init];
186     [self release];
187     return nil;
188     }
189    
190     id pValue = [plist valueForKey:@"value"];
191     id criteria = [plist valueForKey:@"criteria"];
192     id pChildren = [NSMutableArray array];
193     for(id criterion in criteria) {
194     id c = [[self class] ruleWithPlist:criterion];
195     if(c) [pChildren addObject:c];
196     }
197     id hints = [self predicateHintsWithPlist:plist];
198    
199     return [self initWithValue:pValue children:pChildren predicateHints:hints];
200 masaki 120 }
201 masaki 139
202     - (void)dealloc
203 masaki 120 {
204 masaki 139 [children release];
205     [predicateHints release];
206     [value release];
207    
208     [super dealloc];
209 masaki 120 }
210 masaki 139
211 masaki 120 @end
212    
213 masaki 139 @implementation XspfMSeparatorRule
214     + (id)separatorRule
215 masaki 123 {
216 masaki 139 [super init];
217    
218     return self;
219 masaki 123 }
220 masaki 139 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
221 masaki 123 {
222 masaki 139 return [NSMenuItem separatorItem];
223 masaki 123 }
224 masaki 139 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
225 masaki 123 {
226 masaki 139 return nil;
227 masaki 123 }
228 masaki 139 @end
229    
230     @implementation XspfMFieldRule
231     + (id)ruleWithFieldType:(XspfMFieldType)aType
232 masaki 120 {
233 masaki 139 return [[[self alloc] initWithFieldType:aType tag:0] autorelease];
234 masaki 120 }
235 masaki 139 - (id)initWithFieldType:(XspfMFieldType)aType
236 masaki 120 {
237 masaki 139 return [self initWithFieldType:aType tag:0];
238 masaki 120 }
239 masaki 139 + (id)ruleWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
240 masaki 120 {
241 masaki 139 return [[[self alloc] initWithFieldType:aType tag:aTag] autorelease];
242 masaki 120 }
243 masaki 139 - (id)initWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
244 masaki 122 {
245 masaki 139 [super init];
246 masaki 122
247 masaki 139 type = aType;
248     tag = aTag;
249 masaki 122
250 masaki 139 return self;
251 masaki 122 }
252    
253 masaki 139 - (NSView *)textField
254 masaki 123 {
255 masaki 139 id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
256     [[text cell] setControlSize:NSSmallControlSize];
257     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
258     [text setStringValue:@"1234567890"];
259     [text sizeToFit];
260     [text setStringValue:@""];
261     [text setDelegate:self];
262    
263     return text;
264 masaki 123 }
265 masaki 120 - (NSView *)datePicker
266     {
267     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
268     [[date cell] setControlSize:NSSmallControlSize];
269     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
270     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
271     [date setDrawsBackground:YES];
272     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
273     [date sizeToFit];
274 masaki 123 [date setDelegate:self];
275 masaki 120
276     return date;
277     }
278 masaki 139 - (NSView *)ratingIndicator
279 masaki 123 {
280 masaki 139 id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
281     id cell = [rate cell];
282     [cell setControlSize:NSSmallControlSize];
283     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
284     [rate setMinValue:0];
285     [rate setMaxValue:5];
286     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
287     [cell setEditable:YES];
288     [rate sizeToFit];
289    
290     return rate;
291     }
292     - (NSView *)numberField
293     {
294     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
295     [[text cell] setControlSize:NSSmallControlSize];
296     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
297     [text setStringValue:@"123"];
298     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
299     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
300     [formatter setMinimum:[NSNumber numberWithInt:0]];
301     [text setFormatter:formatter];
302     [text sizeToFit];
303     [text setStringValue:@"1"];
304     [text setDelegate:self];
305    
306     return text;
307     }
308    
309     - (Class)fieldClass
310     {
311     Class result = Nil;
312     switch(type) {
313     case XspfMTextFieldType:
314     case XspfMNumberFieldType:
315     result = [NSTextField class];
316 masaki 123 break;
317 masaki 139 case XspfMDateFieldType:
318     result = [NSDatePicker class];
319 masaki 123 break;
320 masaki 139 case XspfMRateFieldType:
321     result = [NSLevelIndicator class];
322     break;
323 masaki 123 }
324 masaki 139 return result;
325 masaki 123 }
326 masaki 139 - (SEL)fieldCreateSelector
327 masaki 120 {
328 masaki 139 SEL result = Nil;
329     switch(type) {
330     case XspfMTextFieldType:
331     result = @selector(textField);
332     break;
333     case XspfMNumberFieldType:
334     result = @selector(numberField);
335     break;
336     case XspfMDateFieldType:
337     result = @selector(datePicker);
338     break;
339     case XspfMRateFieldType:
340     result = @selector(ratingIndicator);
341     break;
342     }
343     return result;
344 masaki 120 }
345 masaki 139
346     - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
347 masaki 120 {
348 masaki 139 if(field) return field;
349 masaki 120
350 masaki 139 id displayValues = [ruleEditor displayValuesForRow:row];
351     Class fieldCalss = [self fieldClass];
352     for(id v in displayValues) {
353     if([v isKindOfClass:fieldCalss] && [v tag] == tag) {
354     field = v;
355 masaki 120 }
356     }
357 masaki 139 if(!field) field = [[self performSelector:[self fieldCreateSelector]] retain];
358     [field setTag:tag];
359 masaki 120
360 masaki 139 return field;
361 masaki 120 }
362 masaki 139 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
363 masaki 120 {
364 masaki 139 #warning MUST IMPLEMENT
365     return nil;
366 masaki 120 }
367     @end
368 masaki 139
369    

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