Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 124 - (hide annotations) (download)
Sat Dec 5 13:49:53 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfMRuleEditorRow.m
File size: 12484 byte(s)
[Mod] NSRuleEditorテスト中 :-)
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 masaki 124 // if(!child) return YES;
140     // child = [self myChildFromChild:child];
141     // return child != nil;
142     return YES;
143 masaki 120 }
144     - (id)myChildFromChild:(id)child
145     {
146 masaki 124 // XspfMKeyValueHolder *holder = child;
147     // if([holder.key isEqual:self]) return holder.value;
148     // return nil;
149     return child;
150 masaki 120 }
151     - (id)childFromMyChild:(id)myChild
152     {
153 masaki 124 // return [XspfMKeyValueHolder holderWithValue:myChild forKey:self];
154     return myChild;
155 masaki 120 }
156     @end
157    
158    
159 masaki 122 static NSString *XspfMStringPredicateLeftExpression = @"left";
160     static NSString *XspfMStringPredicateRightExpression = @"field";
161     static NSString *XspfMStringPredicateIsEqualOperator = @"is";
162     static NSString *XspfMStringPredicateIsNotEqualOperator = @"is not";
163     static NSString *XspfMStringPredicateContainsOperator = @"contains";
164     static NSString *XspfMStringPredicateBeginsWithOperator = @"begins with";
165     static NSString *XspfMStringPredicateEndsWithOperator = @"ends with";
166    
167 masaki 120 @implementation XspfMStringPredicate
168 masaki 123 @synthesize fieldValue;
169     - (void)setup
170     {
171     self.fieldValue = @"";
172     }
173     - (id)textField
174     {
175     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
176     [[text cell] setControlSize:NSSmallControlSize];
177     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
178     [text setStringValue:@"0123456"];
179     [text sizeToFit];
180     [text setStringValue:self.fieldValue];
181     [text setDelegate:self];
182    
183     return text;
184     }
185     - (void)controlTextDidChange:(NSNotification *)obj
186     {
187     self.fieldValue = [[obj object] stringValue];
188     }
189 masaki 120 - (NSInteger)numberOfChildrenForChild:(id)child
190     {
191     if(!child) return 1;
192    
193     child = [self myChildFromChild:child];
194     if(!child) return 0;
195    
196 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) return 5;
197     if([child isEqualToString:XspfMStringPredicateRightExpression]) return 0;
198 masaki 120
199     return 1;
200     }
201     - (id)childForChild:(id)child atIndex:(NSInteger)index
202     {
203 masaki 122 if(!child) return [self childFromMyChild:XspfMStringPredicateLeftExpression];
204 masaki 120
205     child = [self myChildFromChild:child];
206     if(!child) return nil;
207    
208 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
209 masaki 120 switch(index) {
210     case 0:
211 masaki 122 return [self childFromMyChild:XspfMStringPredicateIsEqualOperator];
212 masaki 120 case 1:
213 masaki 122 return [self childFromMyChild:XspfMStringPredicateIsNotEqualOperator];
214 masaki 120 case 2:
215 masaki 122 return [self childFromMyChild:XspfMStringPredicateContainsOperator];
216 masaki 120 case 3:
217 masaki 122 return [self childFromMyChild:XspfMStringPredicateBeginsWithOperator];
218 masaki 120 case 4:
219 masaki 122 return [self childFromMyChild:XspfMStringPredicateEndsWithOperator];
220 masaki 120 }
221     } else {
222 masaki 122 return [self childFromMyChild:XspfMStringPredicateRightExpression];
223 masaki 120 }
224    
225     return nil;
226     }
227     - (id)displayValueForChild:(id)child
228     {
229     if(!child) return nil;
230     child = [self myChildFromChild:child];
231     if(!child) return nil;
232    
233 masaki 122 if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
234 masaki 120 if(1) {
235     return self.keyPath;
236     } else {
237     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:self.keyPath action:Nil keyEquivalent:@""] autorelease];
238     return item;
239     }
240     }
241    
242 masaki 122 if([child isEqualToString:XspfMStringPredicateRightExpression]) {
243 masaki 123 id text = [self textField];
244 masaki 120
245     return text;
246     }
247    
248     while(0){
249     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:child action:Nil keyEquivalent:@""] autorelease];
250     return item;
251     }
252    
253     return child;
254     }
255 masaki 122 - (NSDictionary *)predicateForChild:(id)child withDisplayValue:(id)value
256     {
257     NSMutableDictionary *result = nil;
258    
259     child = [self myChildFromChild:child];
260     if(!child) return nil;
261    
262     if([child isEqualToString:XspfMStringPredicateLeftExpression]) {
263     id exp = [NSExpression expressionForKeyPath:self.keyPath];
264     result = [NSDictionary dictionaryWithObject:exp forKey:NSRuleEditorPredicateLeftExpression];
265     } else if([child isEqualToString:XspfMStringPredicateRightExpression]) {
266     id exp = [NSExpression expressionForConstantValue:[value stringValue]];
267     result = [NSDictionary dictionaryWithObject:exp forKey:NSRuleEditorPredicateRightExpression];
268     } else {
269     NSPredicateOperatorType type = 9999;
270     if([child isEqualToString:XspfMStringPredicateIsEqualOperator]) {
271     type = NSEqualToPredicateOperatorType;
272     } else if([child isEqualToString:XspfMStringPredicateIsNotEqualOperator]) {
273     type = NSNotEqualToPredicateOperatorType;
274     } else if([child isEqualToString:XspfMStringPredicateContainsOperator]) {
275     type = NSContainsPredicateOperatorType;
276     } else if([child isEqualToString:XspfMStringPredicateBeginsWithOperator]) {
277     type = NSBeginsWithPredicateOperatorType;
278     } else if([child isEqualToString:XspfMStringPredicateEndsWithOperator]) {
279     type = NSEndsWithPredicateOperatorType;
280     }
281    
282     if(type < 999) {
283     result = [NSDictionary dictionaryWithObjectsAndKeys:
284     [NSNumber numberWithUnsignedInt:type],
285     NSRuleEditorPredicateOperatorType,
286     [NSNumber numberWithInt:NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption],
287     NSRuleEditorPredicateOptions,
288     nil];
289     }
290     }
291    
292     return result;
293     }
294    
295 masaki 120 @end
296    
297 masaki 122 static NSString *XspfMAbDatePredicateLeftExpression = @"left";
298     static NSString *XspfMAbDatePredicatePicker01 = @"date";
299     static NSString *XspfMAbDatePredicatePicker02 = @"beginDate";
300     static NSString *XspfMAbDatePredicatePicker03 = @"endDate";
301     static NSString *XspfMAbDatePredicateIsEqualOperator = @"is the date";
302     static NSString *XspfMAbDatePredicateLessThanOperator = @"is after the date";
303     static NSString *XspfMAbDatePredicateGreaterThanOperator = @"is before the date";
304     static NSString *XspfMAbDatePredicateBetweenOperator = @"is in the range";
305     static NSString *XspfMAbDatePredicateAndField = @"andField";
306    
307 masaki 120 @implementation XspfMAbsoluteDatePredicate
308 masaki 123 @synthesize firstValue;
309     @synthesize secondValue;
310    
311     - (void)setup
312     {
313     self.firstValue = self.secondValue = [NSDate dateWithTimeIntervalSinceNow:0.0];
314     }
315 masaki 120 - (NSView *)datePicker
316     {
317     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
318     [[date cell] setControlSize:NSSmallControlSize];
319     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
320     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
321     [date setDrawsBackground:YES];
322     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
323     [date sizeToFit];
324 masaki 123 [date setDelegate:self];
325 masaki 120
326     return date;
327     }
328 masaki 123 - (void)datePickerCell:(NSDatePickerCell *)aDatePickerCell
329     validateProposedDateValue:(NSDate **)proposedDateValue
330     timeInterval:(NSTimeInterval *)proposedTimeInterval
331     {
332     switch([aDatePickerCell tag]) {
333     case 1000:
334     self.firstValue = [aDatePickerCell dateValue];
335     break;
336     case 2000:
337     self.secondValue = [aDatePickerCell dateValue];
338     break;
339     }
340     }
341    
342 masaki 120 - (NSInteger)numberOfChildrenForChild:(id)child
343     {
344     if(!child) return 1;
345    
346     child = [self myChildFromChild:child];
347     if(!child) return 0;
348    
349 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) return 4;
350     if([child isEqualToString:XspfMAbDatePredicateBetweenOperator]) return 1;
351     if([child isEqualToString:XspfMAbDatePredicatePicker02]) return 1;
352     if([child isEqualToString:XspfMAbDatePredicateAndField]) return 1;
353     if([child isEqualToString:XspfMAbDatePredicatePicker03]) return 0;
354     if([child isEqualToString:XspfMAbDatePredicatePicker01]) return 0;
355 masaki 120
356     return 1;
357     }
358     - (id)childForChild:(id)child atIndex:(NSInteger)index
359     {
360 masaki 122 if(!child) return [self childFromMyChild:XspfMAbDatePredicateLeftExpression];
361 masaki 120
362     child = [self myChildFromChild:child];
363     if(!child) return nil;
364    
365 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) {
366 masaki 120 switch(index) {
367     case 0:
368 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateIsEqualOperator];
369 masaki 120 case 1:
370 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateLessThanOperator];
371 masaki 120 case 2:
372 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateGreaterThanOperator];
373 masaki 120 case 3:
374 masaki 122 return [self childFromMyChild:XspfMAbDatePredicateBetweenOperator];
375 masaki 120 }
376 masaki 122 } else if([child isEqualToString:XspfMAbDatePredicateBetweenOperator]) {
377     return [self childFromMyChild:XspfMAbDatePredicatePicker02];
378     } else if([child isEqualToString:XspfMAbDatePredicatePicker02]) {
379     return [self childFromMyChild:XspfMAbDatePredicateAndField];
380     } else if([child isEqualToString:XspfMAbDatePredicateAndField]) {
381     return [self childFromMyChild:XspfMAbDatePredicatePicker03];
382 masaki 120 } else {
383 masaki 122 return [self childFromMyChild:XspfMAbDatePredicatePicker01];
384 masaki 120 }
385    
386     return nil;
387     }
388     - (id)displayValueForChild:(id)child
389     {
390     if(!child) return nil;
391     child = [self myChildFromChild:child];
392     if(!child) return nil;
393    
394 masaki 122 if([child isEqualToString:XspfMAbDatePredicateLeftExpression]) {
395 masaki 120 if(1) {
396     return self.keyPath;
397     } else {
398     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:self.keyPath action:Nil keyEquivalent:@""] autorelease];
399     return item;
400     }
401     }
402    
403 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker01]) {
404 masaki 120 id date = [self datePicker];
405 masaki 123 [date setTag:1000];
406     [date setDateValue:self.firstValue];
407 masaki 120
408     return date;
409     }
410 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker02]) {
411 masaki 120 id date = [self datePicker];
412 masaki 123 [date setTag:1000];
413     [date setDateValue:self.firstValue];
414 masaki 120
415     return date;
416     }
417 masaki 122 if([child isEqualToString:XspfMAbDatePredicatePicker03]) {
418 masaki 120 id date = [self datePicker];
419 masaki 123 [date setTag:2000];
420     [date setDateValue:self.secondValue];
421 masaki 120
422     return date;
423     }
424 masaki 122 if([child isEqualToString:XspfMAbDatePredicateAndField]) {
425     return @"to";
426 masaki 120 }
427    
428     while(0){
429     NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:child action:Nil keyEquivalent:@""] autorelease];
430     return item;
431     }
432    
433     return child;
434     }
435     @end

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