Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 123 - (hide annotations) (download)
Mon Nov 30 13:43:48 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 12425 byte(s)
[???] RuleEditorテスト中 :-)
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     @implementation XspfMCompound
12     - (NSInteger)numberOfChildrenForChild:(id)child
13     {
14     if(!child) return 2;
15     if([child isEqualToString:@"All"] || [child isEqualToString:@"Any"]) return 1;
16     return 0;
17     }
18     - (id)childForChild:(id)child atIndex:(NSInteger)index
19     {
20     if(!child) {
21     if(index == 0) return @"All";
22     if(index == 1) return @"Any";
23     }
24     return @"of the following are true";
25     }
26     - (id)displayValueForChild:(id)child
27     {
28     return child;
29     }
30 masaki 122 - (NSDictionary *)predicateForChild:(id)child withDisplayValue:(id)value
31     {
32     NSDictionary *result = nil;
33    
34     NSUInteger type = 9999;
35     if([child isEqualToString:@"All"]) {
36     type = NSAndPredicateType;
37     } else if([child isEqualToString:@"Any"]) {
38     type = NSOrPredicateType;
39     }
40     if(type < 10) {
41     result = [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:type]
42     forKey:NSRuleEditorPredicateCompoundType];
43     }
44    
45     return result;
46     }
47 masaki 120 @end
48    
49     @interface XspfMKeyValueHolder : NSObject
50     {
51     id key;
52     id value;
53     }
54     @property (retain) id key;
55     @property (retain) id value;
56     + (id)holderWithValue:(id)value forKey:(id)key;
57     - (id)initWithValue:(id)value forKey:(id)key;
58     @end
59     @implementation XspfMKeyValueHolder
60     @synthesize key;
61     @synthesize value;
62     + (id)holderWithValue:(id)inValue forKey:(id)inKey
63     {
64     return [[[self alloc] initWithValue:inValue forKey:inKey] autorelease];
65     }
66     - (id)initWithValue:(id)inValue forKey:(id)inKey
67     {
68     [super init];
69     self.value = inValue;
70     self.key = inKey;
71    
72     return self;
73     }
74     - (void)dealloc
75     {
76     self.value = nil;
77     self.key = nil;
78     [super dealloc];
79     }
80    
81     - (NSUInteger)hash
82     {
83     NSLog(@"hash wad called.");
84     exit(-1234);
85     }
86     - (BOOL)isEqual:(id)object
87     {
88     if([super isEqual:object]) return YES;
89     XspfMKeyValueHolder *obj = object;
90     if(![self.key isEqual:obj.key]) return NO;
91     if(![self.value isEqual:obj.value]) return NO;
92    
93     return YES;
94     }
95     - (id)description
96     {
97     return [NSString stringWithFormat:@"(%@ = %@;)", self.key, self.value];
98     }
99     @end
100    
101    
102     @implementation XspfMSimple
103     @synthesize keyPath;
104    
105     - (NSInteger)numberOfChildrenForChild:(id)child {return 0;}
106     - (id)childForChild:(id)child atIndex:(NSInteger)index {return nil;}
107     - (id)displayValueForChild:(id)child {return nil;}
108 masaki 122 - (NSDictionary *)predicateForChild:(id)child withDisplayValue:(id)value {return nil;}
109 masaki 120 + (id)simpleWithKeyPath:(NSString *)inKeyPath rightType:(XspfMRightType)type operator:(NSPredicateOperatorType)operator
110     {
111     return [[[self alloc] initWithKeyPath:inKeyPath rightType:type operator:operator] autorelease];
112     }
113     - (id)initWithKeyPath:(NSString *)inKeyPath rightType:(XspfMRightType)type operator:(NSPredicateOperatorType)operator
114     {
115     [super init];
116     self.keyPath = inKeyPath;
117 masaki 123 [self setup];
118 masaki 120
119     return self;
120     }
121     - (void)dealloc
122     {
123     self.keyPath = nil;
124     [super dealloc];
125     }
126     - (NSUInteger)hash
127     {
128     return [keyPath hash];
129     }
130     - (BOOL)isEqual:(id)object
131     {
132     XspfMSimple *obj = object;
133     if([super isEqual:object]) return YES;
134     return [self.keyPath isEqualToString:obj.keyPath];
135     }
136 masaki 123 - (void)setup {}
137 masaki 120 - (BOOL)isMyChild:(id)child
138     {
139     if(!child) return YES;
140     child = [self myChildFromChild:child];
141     return child != nil;
142     }
143     - (id)myChildFromChild:(id)child
144     {
145     XspfMKeyValueHolder *holder = child;
146     if([holder.key isEqual:self]) return holder.value;
147     return nil;
148     }
149     - (id)childFromMyChild:(id)myChild
150     {
151     return [XspfMKeyValueHolder holderWithValue:myChild forKey:self];
152     }
153     @end
154    
155    
156 masaki 122 static NSString *XspfMStringPredicateLeftExpression = @"left";
157     static NSString *XspfMStringPredicateRightExpression = @"field";
158     static NSString *XspfMStringPredicateIsEqualOperator = @"is";
159     static NSString *XspfMStringPredicateIsNotEqualOperator = @"is not";
160     static NSString *XspfMStringPredicateContainsOperator = @"contains";
161     static NSString *XspfMStringPredicateBeginsWithOperator = @"begins with";
162     static NSString *XspfMStringPredicateEndsWithOperator = @"ends with";
163    
164 masaki 120 @implementation XspfMStringPredicate
165 masaki 123 @synthesize fieldValue;
166     - (void)setup
167     {
168     self.fieldValue = @"";
169     }
170     - (id)textField
171     {
172     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
173     [[text cell] setControlSize:NSSmallControlSize];
174     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
175     [text setStringValue:@"0123456"];
176     [text sizeToFit];
177     [text setStringValue:self.fieldValue];
178     [text setDelegate:self];
179    
180     return text;
181     }
182     - (void)controlTextDidChange:(NSNotification *)obj
183     {
184     self.fieldValue = [[obj object] stringValue];
185     }
186 masaki 120 - (NSInteger)numberOfChildrenForChild:(id)child
187     {
188     if(!child) return 1;
189    
190     child = [self myChildFromChild:child];
191     if(!child) return 0;
192    
193 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) return 5;
194     if([child isEqualToString:XspfMStringPredicateRightExpression]) return 0;
195 masaki 120
196     return 1;
197     }
198     - (id)childForChild:(id)child atIndex:(NSInteger)index
199     {
200 masaki 122 if(!child) return [self childFromMyChild:XspfMStringPredicateLeftExpression];
201 masaki 120
202     child = [self myChildFromChild:child];
203     if(!child) return nil;
204    
205 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
206 masaki 120 switch(index) {
207     case 0:
208 masaki 122 return [self childFromMyChild:XspfMStringPredicateIsEqualOperator];
209 masaki 120 case 1:
210 masaki 122 return [self childFromMyChild:XspfMStringPredicateIsNotEqualOperator];
211 masaki 120 case 2:
212 masaki 122 return [self childFromMyChild:XspfMStringPredicateContainsOperator];
213 masaki 120 case 3:
214 masaki 122 return [self childFromMyChild:XspfMStringPredicateBeginsWithOperator];
215 masaki 120 case 4:
216 masaki 122 return [self childFromMyChild:XspfMStringPredicateEndsWithOperator];
217 masaki 120 }
218     } else {
219 masaki 122 return [self childFromMyChild:XspfMStringPredicateRightExpression];
220 masaki 120 }
221    
222     return nil;
223     }
224     - (id)displayValueForChild:(id)child
225     {
226     if(!child) return nil;
227     child = [self myChildFromChild:child];
228     if(!child) return nil;
229    
230 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
231 masaki 120 if(1) {
232     return self.keyPath;
233     } else {
234     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:self.keyPath action:Nil keyEquivalent:@""] autorelease];
235     return item;
236     }
237     }
238    
239 masaki 122 if([child isEqualToString:XspfMStringPredicateRightExpression]) {
240 masaki 123 id text = [self textField];
241 masaki 120
242     return text;
243     }
244    
245     while(0){
246     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:child action:Nil keyEquivalent:@""] autorelease];
247     return item;
248     }
249    
250     return child;
251     }
252 masaki 122 - (NSDictionary *)predicateForChild:(id)child withDisplayValue:(id)value
253     {
254     NSMutableDictionary *result = nil;
255    
256     child = [self myChildFromChild:child];
257     if(!child) return nil;
258    
259     if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
260     id exp = [NSExpression expressionForKeyPath:self.keyPath];
261     result = [NSDictionary dictionaryWithObject:exp forKey:NSRuleEditorPredicateLeftExpression];
262     } else if([child isEqualToString:XspfMStringPredicateRightExpression]) {
263     id exp = [NSExpression expressionForConstantValue:[value stringValue]];
264     result = [NSDictionary dictionaryWithObject:exp forKey:NSRuleEditorPredicateRightExpression];
265     } else {
266     NSPredicateOperatorType type = 9999;
267     if([child isEqualToString:XspfMStringPredicateIsEqualOperator]) {
268     type = NSEqualToPredicateOperatorType;
269     } else if([child isEqualToString:XspfMStringPredicateIsNotEqualOperator]) {
270     type = NSNotEqualToPredicateOperatorType;
271     } else if([child isEqualToString:XspfMStringPredicateContainsOperator]) {
272     type = NSContainsPredicateOperatorType;
273     } else if([child isEqualToString:XspfMStringPredicateBeginsWithOperator]) {
274     type = NSBeginsWithPredicateOperatorType;
275     } else if([child isEqualToString:XspfMStringPredicateEndsWithOperator]) {
276     type = NSEndsWithPredicateOperatorType;
277     }
278    
279     if(type < 999) {
280     result = [NSDictionary dictionaryWithObjectsAndKeys:
281     [NSNumber numberWithUnsignedInt:type],
282     NSRuleEditorPredicateOperatorType,
283     [NSNumber numberWithInt:NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption],
284     NSRuleEditorPredicateOptions,
285     nil];
286     }
287     }
288    
289     return result;
290     }
291    
292 masaki 120 @end
293    
294 masaki 122 static NSString *XspfMAbDatePredicateLeftExpression = @"left";
295     static NSString *XspfMAbDatePredicatePicker01 = @"date";
296     static NSString *XspfMAbDatePredicatePicker02 = @"beginDate";
297     static NSString *XspfMAbDatePredicatePicker03 = @"endDate";
298     static NSString *XspfMAbDatePredicateIsEqualOperator = @"is the date";
299     static NSString *XspfMAbDatePredicateLessThanOperator = @"is after the date";
300     static NSString *XspfMAbDatePredicateGreaterThanOperator = @"is before the date";
301     static NSString *XspfMAbDatePredicateBetweenOperator = @"is in the range";
302     static NSString *XspfMAbDatePredicateAndField = @"andField";
303    
304 masaki 120 @implementation XspfMAbsoluteDatePredicate
305 masaki 123 @synthesize firstValue;
306     @synthesize secondValue;
307    
308     - (void)setup
309     {
310     self.firstValue = self.secondValue = [NSDate dateWithTimeIntervalSinceNow:0.0];
311     }
312 masaki 120 - (NSView *)datePicker
313     {
314     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
315     [[date cell] setControlSize:NSSmallControlSize];
316     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
317     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
318     [date setDrawsBackground:YES];
319     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
320     [date sizeToFit];
321 masaki 123 [date setDelegate:self];
322 masaki 120
323     return date;
324     }
325 masaki 123 - (void)datePickerCell:(NSDatePickerCell *)aDatePickerCell
326     validateProposedDateValue:(NSDate **)proposedDateValue
327     timeInterval:(NSTimeInterval *)proposedTimeInterval
328     {
329     switch([aDatePickerCell tag]) {
330     case 1000:
331     self.firstValue = [aDatePickerCell dateValue];
332     break;
333     case 2000:
334     self.secondValue = [aDatePickerCell dateValue];
335     break;
336     }
337     }
338    
339 masaki 120 - (NSInteger)numberOfChildrenForChild:(id)child
340     {
341     if(!child) return 1;
342    
343     child = [self myChildFromChild:child];
344     if(!child) return 0;
345    
346 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) return 4;
347     if([child isEqualToString:XspfMAbDatePredicateBetweenOperator]) return 1;
348     if([child isEqualToString:XspfMAbDatePredicatePicker02]) return 1;
349     if([child isEqualToString:XspfMAbDatePredicateAndField]) return 1;
350     if([child isEqualToString:XspfMAbDatePredicatePicker03]) return 0;
351     if([child isEqualToString:XspfMAbDatePredicatePicker01]) return 0;
352 masaki 120
353     return 1;
354     }
355     - (id)childForChild:(id)child atIndex:(NSInteger)index
356     {
357 masaki 122 if(!child) return [self childFromMyChild:XspfMAbDatePredicateLeftExpression];
358 masaki 120
359     child = [self myChildFromChild:child];
360     if(!child) return nil;
361    
362 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) {
363 masaki 120 switch(index) {
364     case 0:
365 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateIsEqualOperator];
366 masaki 120 case 1:
367 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateLessThanOperator];
368 masaki 120 case 2:
369 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateGreaterThanOperator];
370 masaki 120 case 3:
371 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateBetweenOperator];
372 masaki 120 }
373 masaki 122 } else if([child isEqualToString:XspfMAbDatePredicateBetweenOperator]) {
374     return [self childFromMyChild:XspfMAbDatePredicatePicker02];
375     } else if([child isEqualToString:XspfMAbDatePredicatePicker02]) {
376     return [self childFromMyChild:XspfMAbDatePredicateAndField];
377     } else if([child isEqualToString:XspfMAbDatePredicateAndField]) {
378     return [self childFromMyChild:XspfMAbDatePredicatePicker03];
379 masaki 120 } else {
380 masaki 122 return [self childFromMyChild:XspfMAbDatePredicatePicker01];
381 masaki 120 }
382    
383     return nil;
384     }
385     - (id)displayValueForChild:(id)child
386     {
387     if(!child) return nil;
388     child = [self myChildFromChild:child];
389     if(!child) return nil;
390    
391 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) {
392 masaki 120 if(1) {
393     return self.keyPath;
394     } else {
395     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:self.keyPath action:Nil keyEquivalent:@""] autorelease];
396     return item;
397     }
398     }
399    
400 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker01]) {
401 masaki 120 id date = [self datePicker];
402 masaki 123 [date setTag:1000];
403     [date setDateValue:self.firstValue];
404 masaki 120
405     return date;
406     }
407 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker02]) {
408 masaki 120 id date = [self datePicker];
409 masaki 123 [date setTag:1000];
410     [date setDateValue:self.firstValue];
411 masaki 120
412     return date;
413     }
414 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker03]) {
415 masaki 120 id date = [self datePicker];
416 masaki 123 [date setTag:2000];
417     [date setDateValue:self.secondValue];
418 masaki 120
419     return date;
420     }
421 masaki 122 if([child isEqualToString:XspfMAbDatePredicateAndField]) {
422     return @"to";
423 masaki 120 }
424    
425     while(0){
426     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:child action:Nil keyEquivalent:@""] autorelease];
427     return item;
428     }
429    
430     return child;
431     }
432     @end

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