Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 140 - (hide annotations) (download)
Sun Dec 13 02:17:58 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 9504 byte(s)
[???] NSRuleEditorテスト中
criterion用クラスをfix。
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 masaki 140 return [[XspfMSeparatorRule alloc] initSparetorRule];
114 masaki 139 }
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 masaki 140 self = [[XspfMFieldRule alloc] initWithFieldType:type tag:tag];
139 masaki 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 masaki 140 [comp setPredicateParts:[NSDictionary dictionary]];
156 masaki 139
157     id allExp = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
158     id all = [self ruleWithValue:@"All"
159     children:[NSArray arrayWithObject:comp]
160     predicateHints:[NSDictionary dictionaryWithObject:allExp forKey:NSRuleEditorPredicateCompoundType]];
161    
162     id anyExp = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
163     id any = [self ruleWithValue:@"All"
164     children:[NSArray arrayWithObject:comp]
165     predicateHints:[NSDictionary dictionaryWithObject:anyExp forKey:NSRuleEditorPredicateCompoundType]];
166    
167     return [NSArray arrayWithObjects:all, any, nil];
168 masaki 120 }
169 masaki 139
170     - (NSDictionary *)predicateHintsWithPlist:(NSDictionary *)plist
171 masaki 120 {
172 masaki 139 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:plist];
173     [result removeObjectForKey:@"criteria"];
174     [result removeObjectForKey:@"value"];
175    
176     return result;
177 masaki 120 }
178 masaki 139
179     + (id)ruleWithPlist:(id)plist
180 masaki 120 {
181 masaki 139 return [[[self alloc] initWithPlist:plist] autorelease];
182 masaki 120 }
183 masaki 139 - (id)initWithPlist:(id)plist
184 masaki 120 {
185 masaki 139 if(![plist isKindOfClass:[NSDictionary class]]) {
186     [self init];
187     [self release];
188     return nil;
189     }
190    
191     id pValue = [plist valueForKey:@"value"];
192     id criteria = [plist valueForKey:@"criteria"];
193     id pChildren = [NSMutableArray array];
194     for(id criterion in criteria) {
195     id c = [[self class] ruleWithPlist:criterion];
196     if(c) [pChildren addObject:c];
197     }
198     id hints = [self predicateHintsWithPlist:plist];
199    
200     return [self initWithValue:pValue children:pChildren predicateHints:hints];
201 masaki 120 }
202 masaki 139
203     - (void)dealloc
204 masaki 120 {
205 masaki 139 [children release];
206     [predicateHints release];
207     [value release];
208    
209     [super dealloc];
210 masaki 120 }
211 masaki 139
212 masaki 120 @end
213    
214 masaki 139 @implementation XspfMSeparatorRule
215     + (id)separatorRule
216 masaki 123 {
217 masaki 140 return [[[self alloc] initSparetorRule] autorelease];
218     }
219     - (id)initSparetorRule
220     {
221 masaki 139 [super init];
222    
223     return self;
224 masaki 123 }
225 masaki 139 - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
226 masaki 123 {
227 masaki 139 return [NSMenuItem separatorItem];
228 masaki 123 }
229 masaki 139 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
230 masaki 123 {
231 masaki 139 return nil;
232 masaki 123 }
233 masaki 139 @end
234    
235     @implementation XspfMFieldRule
236     + (id)ruleWithFieldType:(XspfMFieldType)aType
237 masaki 120 {
238 masaki 139 return [[[self alloc] initWithFieldType:aType tag:0] autorelease];
239 masaki 120 }
240 masaki 139 - (id)initWithFieldType:(XspfMFieldType)aType
241 masaki 120 {
242 masaki 139 return [self initWithFieldType:aType tag:0];
243 masaki 120 }
244 masaki 139 + (id)ruleWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
245 masaki 120 {
246 masaki 139 return [[[self alloc] initWithFieldType:aType tag:aTag] autorelease];
247 masaki 120 }
248 masaki 139 - (id)initWithFieldType:(XspfMFieldType)aType tag:(NSInteger)aTag
249 masaki 122 {
250 masaki 139 [super init];
251 masaki 122
252 masaki 139 type = aType;
253     tag = aTag;
254 masaki 122
255 masaki 139 return self;
256 masaki 122 }
257    
258 masaki 139 - (NSView *)textField
259 masaki 123 {
260 masaki 139 id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
261     [[text cell] setControlSize:NSSmallControlSize];
262     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
263     [text setStringValue:@"1234567890"];
264     [text sizeToFit];
265     [text setStringValue:@""];
266     [text setDelegate:self];
267    
268     return text;
269 masaki 123 }
270 masaki 120 - (NSView *)datePicker
271     {
272     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
273     [[date cell] setControlSize:NSSmallControlSize];
274     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
275     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
276     [date setDrawsBackground:YES];
277     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
278     [date sizeToFit];
279 masaki 123 [date setDelegate:self];
280 masaki 120
281     return date;
282     }
283 masaki 139 - (NSView *)ratingIndicator
284 masaki 123 {
285 masaki 139 id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
286     id cell = [rate cell];
287     [cell setControlSize:NSSmallControlSize];
288     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
289     [rate setMinValue:0];
290     [rate setMaxValue:5];
291     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
292     [cell setEditable:YES];
293     [rate sizeToFit];
294    
295     return rate;
296     }
297     - (NSView *)numberField
298     {
299     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
300     [[text cell] setControlSize:NSSmallControlSize];
301     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
302     [text setStringValue:@"123"];
303     NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
304     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
305     [formatter setMinimum:[NSNumber numberWithInt:0]];
306     [text setFormatter:formatter];
307     [text sizeToFit];
308     [text setStringValue:@"1"];
309     [text setDelegate:self];
310    
311     return text;
312     }
313    
314     - (Class)fieldClass
315     {
316     Class result = Nil;
317     switch(type) {
318     case XspfMTextFieldType:
319     case XspfMNumberFieldType:
320     result = [NSTextField class];
321 masaki 123 break;
322 masaki 139 case XspfMDateFieldType:
323     result = [NSDatePicker class];
324 masaki 123 break;
325 masaki 139 case XspfMRateFieldType:
326     result = [NSLevelIndicator class];
327     break;
328 masaki 123 }
329 masaki 139 return result;
330 masaki 123 }
331 masaki 139 - (SEL)fieldCreateSelector
332 masaki 120 {
333 masaki 139 SEL result = Nil;
334     switch(type) {
335     case XspfMTextFieldType:
336     result = @selector(textField);
337     break;
338     case XspfMNumberFieldType:
339     result = @selector(numberField);
340     break;
341     case XspfMDateFieldType:
342     result = @selector(datePicker);
343     break;
344     case XspfMRateFieldType:
345     result = @selector(ratingIndicator);
346     break;
347     }
348     return result;
349 masaki 120 }
350 masaki 139
351     - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
352 masaki 120 {
353 masaki 139 if(field) return field;
354 masaki 120
355 masaki 139 id displayValues = [ruleEditor displayValuesForRow:row];
356     Class fieldCalss = [self fieldClass];
357     for(id v in displayValues) {
358     if([v isKindOfClass:fieldCalss] && [v tag] == tag) {
359     field = v;
360 masaki 120 }
361     }
362 masaki 139 if(!field) field = [[self performSelector:[self fieldCreateSelector]] retain];
363     [field setTag:tag];
364 masaki 120
365 masaki 139 return field;
366 masaki 120 }
367 masaki 139 - (NSDictionary *)predicatePartsWithDisplayValue:(id)value forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
368 masaki 120 {
369 masaki 139 #warning MUST IMPLEMENT
370     return nil;
371 masaki 120 }
372     @end
373 masaki 139
374    

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