Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMRule.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 350 - (hide annotations) (download)
Sun May 16 02:50:00 2010 UTC (13 years, 11 months ago) by masakih
File size: 22136 byte(s)
著作権表示、免責表示を追加。
1 masaki 120 //
2 masakih 348 // XspfMRule.m
3 masaki 120 // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/29.
6     //
7    
8 masakih 350 /*
9     Copyright (c) 2009-2010, masakih
10     All rights reserved.
11     ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。
12    
13     1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
14     2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
15     3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、コントリビューターの名前を使用してはならない。
16     本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。
17     -------------------------------------------------------------------
18     Copyright (c) 2009-2010, masakih
19     All rights reserved.
20    
21     Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
22    
23     1, Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
24     2, Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
25     3, The names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
26     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29 masakih 348 #import "XspfMRule.h"
30 masaki 170 #import "XspfMRule_private.h"
31 masaki 120
32 masaki 243 #import "XspfMLabelField.h"
33     #import "XspfMLabelCell.h"
34 masaki 120
35 masaki 243
36 masaki 152 @implementation XspfMRule (XspfMAccessor)
37     - (void)setChildren:(NSArray *)newChildren
38 masaki 120 {
39 masaki 158 if(!newChildren) newChildren = [NSMutableArray array];
40 masaki 152
41     [children autorelease];
42 masaki 158 children = [[NSMutableArray alloc] initWithArray:newChildren copyItems:YES];
43 masaki 120 }
44 masaki 152 - (void)addChild:(XspfMRule *)child
45     {
46     [children addObject:child];
47     }
48     - (void)setPredicateParts:(NSDictionary *)parts
49     {
50     [predicateHints autorelease];
51     predicateHints = [parts mutableCopy];
52     }
53     - (void)setExpression:(id)expression forKey:(id)key
54     {
55     [predicateHints setObject:expression forKey:key];
56     }
57     - (void)setValue:(NSString *)newValue
58     {
59 masaki 153 if([_value isEqualToString:newValue]) return;
60 masaki 152
61 masaki 153 [_value autorelease];
62     _value = [newValue copy];
63 masaki 152 }
64 masaki 153 - (NSString *)value { return _value; }
65 masaki 143 @end
66 masaki 152
67     @implementation XspfMRule
68     @dynamic value;
69    
70     - (NSInteger)numberOfChildren
71 masaki 120 {
72 masaki 152 return [children count];
73 masaki 120 }
74 masaki 152 - (id)childAtIndex:(NSInteger)index
75 masaki 120 {
76 masaki 152 return [children objectAtIndex:index];
77     }
78     - (id)displayValueForRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
79     {
80 masaki 153 return _value;
81 masaki 152 }
82     - (NSDictionary *)predicatePartsWithDisplayValue:(id)displayValue forRuleEditor:(NSRuleEditor *)ruleEditor inRow:(NSInteger)row
83     {
84     id result = [NSMutableDictionary dictionary];
85 masaki 142
86 masaki 152 NSRuleEditorRowType rowType = [ruleEditor rowTypeForRow:row];
87     if(rowType == NSRuleEditorRowTypeCompound) {
88     return predicateHints;
89     }
90    
91     if([predicateHints valueForKey:@"XspfMIgnoreExpression"]) return nil;
92    
93 masaki 166 id operatorType = [predicateHints valueForKey:NSRuleEditorPredicateOperatorType];
94     id option = [predicateHints valueForKey:NSRuleEditorPredicateOptions];
95     id leftExp = [predicateHints valueForKey:NSRuleEditorPredicateLeftExpression];
96     id rightExp = [predicateHints valueForKey:NSRuleEditorPredicateRightExpression];
97 masaki 152 id customRightExp = [predicateHints valueForKey:@"XspfMPredicateRightExpression"];
98    
99     if(operatorType) {
100     [result setValue:operatorType forKey:NSRuleEditorPredicateOperatorType];
101     }
102     if(option) {
103     [result setValue:option forKey:NSRuleEditorPredicateOptions];
104     }
105     if(leftExp) {
106     id exp = nil;
107     if([leftExp isEqual:@"value"]) {
108     exp = [NSExpression expressionForKeyPath:displayValue];
109     } else {
110     exp = [NSExpression expressionForKeyPath:leftExp];
111     }
112     if(exp) {
113     [result setValue:exp forKey:NSRuleEditorPredicateLeftExpression];
114     }
115     }
116     if(rightExp) {
117     SEL selector = NSSelectorFromString(rightExp);
118     id exp = nil;
119     if(selector) {
120     exp = [NSExpression expressionForConstantValue:[displayValue performSelector:selector]];
121     } else {
122     exp = [NSExpression expressionForConstantValue:rightExp];
123     }
124     if(exp) {
125     [result setValue:exp forKey:NSRuleEditorPredicateRightExpression];
126     }
127     }
128     if(customRightExp) {
129     SEL selector = NSSelectorFromString(customRightExp);
130     id arg01 = [predicateHints valueForKey:@"XspfMRightExpressionArg01"];
131     id arg02 = [predicateHints valueForKey:@"XspfMRightExpressionArg02"];
132 masakih 348 if([arg01 isEqual:@"displayValues"]) {
133     arg01 = [ruleEditor displayValuesForRow:row];
134     }
135     if([arg02 isEqual:@"displayValues"]) {
136     arg02 = [ruleEditor displayValuesForRow:row];
137     }
138 masaki 152
139 masakih 348 id rhs = nil;
140 masaki 152 if(arg02 && arg01) {
141 masakih 348 rhs = [self performSelector:selector withObject:arg01 withObject:arg02];
142 masaki 152 } else if(arg01) {
143 masakih 348 rhs = [self performSelector:selector withObject:arg01];
144 masaki 152 } else {
145 masakih 348 rhs = [self performSelector:selector];
146     }
147     if(rhs) {
148 masaki 163 [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
149 masaki 152 }
150     }
151    
152 masaki 163 NSString *selName = [predicateHints valueForKey:@"XspfMCustomSelector"];
153     if(selName) {
154 masaki 154 id args = nil;
155     NSString *argSelName = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteator"];
156     if(argSelName) {
157     SEL argSel = NSSelectorFromString(argSelName);
158     id argSelArg01 = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteatorArg01"];
159     if([argSelArg01 isEqual:@"displayValues"]) {
160     argSelArg01 = [ruleEditor displayValuesForRow:row];
161     }
162     id argSelArg02 = [predicateHints valueForKey:@"XspfMCustomSelectorArgumentsCteatorArg02"];
163     if([argSelArg02 isEqual:@"displayValues"]) {
164     argSelArg02 = [ruleEditor displayValuesForRow:row];
165     }
166     if(argSelArg02) {
167     args = [self performSelector:argSel withObject:argSelArg01 withObject:argSelArg02];
168     } else if(argSelArg01) {
169     args = [self performSelector:argSel withObject:argSelArg01];
170     } else {
171     args = [self performSelector:argSel];
172     }
173     } else {
174     id arg01 = [predicateHints valueForKey:@"XspfMCustomSelectorArg01"];
175     args = [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01], nil];
176     }
177 masaki 152
178 masakih 348 id target = [NSExpression expressionForConstantValue:[[self class] functionHost]];
179 masaki 165 id rhs = [NSExpression expressionForFunction:target selectorName:selName arguments:args];
180 masaki 166 [result setValue:rhs forKey:NSRuleEditorPredicateRightExpression];
181 masaki 152 }
182    
183 masaki 187 // HMLog(HMLogLevelDebug, @"predicate\tcriterion -> %@, value -> %@, row -> %d, result -> %@", predicateHints, displayValue, row, result);
184 masaki 152
185     return result;
186 masaki 142 }
187 masaki 152
188 masaki 153 - (id)displayValue { return _value; }
189 masaki 120
190 masaki 338
191     #pragma mark#### Variables for add/change criteria of Library. ####
192 masakih 348 static NSArray *leftKeys = nil;
193     static NSArray *stringKeys = nil;
194     static NSArray *dateKeys = nil;
195     static NSArray *numberKeys = nil;
196     static BOOL useRating = NO;
197     static BOOL useLabel = NO;
198    
199     + (void)registerStringTypeKeyPaths:(NSArray *)keyPaths
200     {
201     if(stringKeys) {
202     [stringKeys release];
203     [leftKeys release];
204     leftKeys = nil;
205     }
206     stringKeys = [[NSArray arrayWithArray:keyPaths] retain];
207     }
208     + (void)registerDateTypeKeyPaths:(NSArray *)keyPaths
209     {
210     if(dateKeys) {
211     [dateKeys release];
212     [leftKeys release];
213     leftKeys = nil;
214     }
215     dateKeys = [[NSArray arrayWithArray:keyPaths] retain];
216     }
217     + (void)registerNumberTypeKeyPaths:(NSArray *)keyPaths
218     {
219     if(numberKeys) {
220     [numberKeys release];
221     [leftKeys release];
222     leftKeys = nil;
223     }
224     numberKeys = [[NSArray arrayWithArray:keyPaths] retain];
225     }
226     + (void)setUseRating:(BOOL)flag
227     {
228     if(flag && useRating || !flag && !useRating) {
229     [leftKeys release];
230     leftKeys = nil;
231     }
232     useRating = flag;
233     }
234     + (void)setUseLablel:(BOOL)flag
235     {
236     if(flag && useLabel || !flag && !useLabel) {
237     [leftKeys release];
238     leftKeys = nil;
239     }
240     useLabel = flag;
241     }
242 masaki 338 + (NSArray *)leftKeys
243     {
244     if(!leftKeys) {
245 masakih 348
246     id temp = [NSMutableArray array];
247     [temp addObjectsFromArray:stringKeys];
248     [temp addObjectsFromArray:dateKeys];
249     [temp addObjectsFromArray:numberKeys];
250     if(useRating) {
251     [temp addObject:@"rating"];
252     }
253     if(useLabel) {
254     [temp addObject:@"label"];
255     }
256     leftKeys = [[NSArray arrayWithArray:temp] retain];
257 masaki 338 }
258     return leftKeys;
259     }
260 masakih 348 static inline BOOL isDateKeyPath(NSString *keyPath)
261 masaki 338 {
262 masakih 348 return [dateKeys containsObject:keyPath];
263 masaki 338 }
264 masakih 348 + (BOOL)isDateKeyPath:(NSString *)keyPath
265 masaki 338 {
266 masakih 348 return isDateKeyPath(keyPath);
267 masaki 338 }
268     - (BOOL)isDateKeyPath:(NSString *)keyPath
269     {
270     return isDateKeyPath(keyPath);
271     }
272 masakih 348 static inline BOOL isStringKeyPath(NSString *keyPath)
273     {
274     return [stringKeys containsObject:keyPath];
275     }
276     + (BOOL)isStringKeyPath:(NSString *)keyPath
277     {
278     return isStringKeyPath(keyPath);
279     }
280 masaki 338 - (BOOL)isStringKeyPath:(NSString *)keyPath
281     {
282 masakih 348 return isStringKeyPath(keyPath);
283 masaki 338 }
284 masakih 348 static inline BOOL isNumberKeyPath(NSString *keyPath)
285     {
286     return [numberKeys containsObject:keyPath];
287     }
288     + (BOOL)isNumberKeyPath:(NSString *)keyPath
289     {
290     return isNumberKeyPath(keyPath);
291     }
292     - (BOOL)isNumberKeyPath:(NSString *)keyPath
293     {
294     return isNumberKeyPath(keyPath);
295     }
296     + (BOOL)isRateKeyPath:(NSString *)keyPath
297     {
298     return [keyPath isEqualToString:@"rating"];
299     }
300 masaki 338 - (BOOL)isRateKeyPath:(NSString *)keyPath
301     {
302     return [keyPath isEqualToString:@"rating"];
303     }
304 masakih 348 + (BOOL)isLabelKeyPath:(NSString *)keyPath
305 masaki 338 {
306     return [keyPath isEqualToString:@"label"];
307     }
308 masakih 348 - (BOOL)isLabelKeyPath:(NSString *)keyPath
309 masaki 338 {
310 masakih 348 return [keyPath isEqualToString:@"label"];
311 masaki 338 }
312    
313 masaki 164 #pragma mark == NSCopying Protocol ==
314 masaki 152 - (id)copyWithZone:(NSZone *)zone
315 masaki 142 {
316 masaki 152 XspfMRule *result = [[[self class] allocWithZone:zone] init];
317 masaki 158 [result setChildren:children];
318     [result setPredicateParts:predicateHints];
319     [result setValue:_value];
320 masaki 152
321     return result;
322 masaki 142 }
323 masaki 152
324 masaki 164 #pragma mark == NSCoding Protocol ==
325     static NSString *const XspfMRuleChildrenKey = @"XspfMRuleChildrenKey";
326     static NSString *const XspfMRulePredicateHintsKey = @"XspfMRulePredicateHintsKey";
327     static NSString *const XspfMRuleValueKey = @"XspfMRuleValueKey";
328     - (id)initWithCoder:(NSCoder *)decoder
329     {
330     self = [self init];
331    
332     [self setChildren:[decoder decodeObjectForKey:XspfMRuleChildrenKey]];
333     [self setPredicateParts:[decoder decodeObjectForKey:XspfMRulePredicateHintsKey]];
334     [self setValue:[decoder decodeObjectForKey:XspfMRuleValueKey]];
335    
336     return self;
337     }
338     - (void)encodeWithCoder:(NSCoder *)encoder
339     {
340     [encoder encodeObject:children forKey:XspfMRuleChildrenKey];
341     [encoder encodeObject:predicateHints forKey:XspfMRulePredicateHintsKey];
342     [encoder encodeObject:_value forKey:XspfMRuleValueKey];
343     }
344    
345 masaki 152 - (BOOL)isEqual:(id)other
346 masaki 120 {
347 masaki 152 if([super isEqual:other]) return YES;
348     if(![other isKindOfClass:[XspfMRule class]]) return NO;
349 masaki 120
350 masaki 152 XspfMRule *o = other;
351 masaki 153 if(![_value isEqualToString:o->_value]) return NO;
352 masaki 152 // if(![children isEqual:o->children]) return NO;
353     // if(![predicateHints isEqual:o->predicateHints]) return NO;
354    
355 masaki 120 return YES;
356     }
357 masaki 152 - (NSUInteger)hash
358     {
359 masaki 153 return _value ? [_value hash] : [super hash];
360 masaki 152 }
361    
362 masaki 120 - (id)description
363     {
364 masaki 152 return [NSString stringWithFormat:@"%@ {\n\t%@ = %@;\n\t%@ = %@;\n\t%@ = %@;}",
365     NSStringFromClass([self class]),
366 masaki 153 @"value", _value,
367 masaki 152 @"hints", predicateHints,
368     @"children", children,
369     nil];
370 masaki 120 }
371     @end
372    
373 masaki 152 @implementation XspfMRule (XspfMCreation)
374 masaki 120
375 masaki 152 - (id)init
376 masaki 120 {
377 masaki 152 [super init];
378    
379     children = [[NSMutableArray array] retain];
380     predicateHints = [[NSMutableDictionary dictionary] retain];
381    
382     return self;
383 masaki 120 }
384 masaki 152
385     - (id)initWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
386 masaki 120 {
387 masaki 152 [self init];
388 masaki 120
389 masaki 152 if([newValue isEqualToString:@"separator"]) {
390     [self release];
391     return [[XspfMSeparatorRule alloc] initSparetorRule];
392     }
393    
394 masaki 170 id fieldRule = [XspfMFieldRule fieldRuleWithValue:newValue];
395     if(fieldRule) {
396 masaki 152 [self release];
397 masaki 170 self = [fieldRule retain];
398 masaki 152 }
399    
400     [self setValue:newValue];
401     [self setChildren:newChildren];
402     [self setPredicateParts:parts];
403    
404 masaki 120 return self;
405     }
406 masaki 152 + (id)ruleWithValue:(NSString *)newValue children:(NSArray *)newChildren predicateHints:(NSDictionary *)parts
407 masaki 120 {
408 masaki 152 return [[[self alloc] initWithValue:newValue children:newChildren predicateHints:parts] autorelease];
409 masaki 120 }
410 masaki 152
411     + (NSArray *)compoundRule
412 masaki 120 {
413 masaki 152 id comp = [self ruleWithValue:@"of the following are true" children:nil predicateHints:[NSDictionary dictionary]];
414    
415     id allExp = [NSNumber numberWithUnsignedInt:NSAndPredicateType];
416     id all = [self ruleWithValue:@"All"
417     children:[NSArray arrayWithObject:comp]
418     predicateHints:[NSDictionary dictionaryWithObject:allExp forKey:NSRuleEditorPredicateCompoundType]];
419    
420     id anyExp = [NSNumber numberWithUnsignedInt:NSOrPredicateType];
421     id any = [self ruleWithValue:@"Any"
422     children:[NSArray arrayWithObject:comp]
423     predicateHints:[NSDictionary dictionaryWithObject:anyExp forKey:NSRuleEditorPredicateCompoundType]];
424    
425     return [NSArray arrayWithObjects:all, any, nil];
426 masaki 120 }
427 masaki 152
428     - (NSDictionary *)predicateHintsWithPlist:(NSDictionary *)plist
429 masaki 120 {
430 masaki 152 NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:plist];
431     [result removeObjectForKey:@"criteria"];
432     [result removeObjectForKey:@"value"];
433    
434     return result;
435 masaki 120 }
436 masaki 152
437     + (id)ruleWithPlist:(id)plist
438 masaki 120 {
439 masaki 152 return [[[self alloc] initWithPlist:plist] autorelease];
440 masaki 120 }
441 masaki 152 - (id)initWithPlist:(id)plist
442 masaki 120 {
443 masaki 152 if(![plist isKindOfClass:[NSDictionary class]]) {
444     [self init];
445     [self release];
446     return nil;
447     }
448    
449     id pValue = [plist valueForKey:@"value"];
450     id criteria = [plist valueForKey:@"criteria"];
451     id pChildren = [NSMutableArray array];
452     for(id criterion in criteria) {
453     id c = [[self class] ruleWithPlist:criterion];
454     if(c) [pChildren addObject:c];
455     }
456     id hints = [self predicateHintsWithPlist:plist];
457    
458     return [self initWithValue:pValue children:pChildren predicateHints:hints];
459 masaki 120 }
460 masaki 152
461     - (void)dealloc
462 masaki 120 {
463 masaki 152 [children release];
464     [predicateHints release];
465 masaki 153 [_value release];
466 masaki 152
467     [super dealloc];
468 masaki 120 }
469 masaki 152
470 masaki 120 @end
471    
472 masaki 153 @implementation XspfMRule (XspfMPrivate)
473 masaki 142
474 masaki 153 - (NSView *)textField
475     {
476     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
477     [[text cell] setControlSize:NSSmallControlSize];
478     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
479     [text setStringValue:@"1234567890"];
480     [text sizeToFit];
481     [text setStringValue:@""];
482    
483     return text;
484     }
485     - (NSView *)datePicker
486     {
487     id date = [[[NSDatePicker alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
488     [[date cell] setControlSize:NSSmallControlSize];
489     [date setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
490     [date setDatePickerElements:NSYearMonthDayDatePickerElementFlag];
491     [date setDrawsBackground:YES];
492     [date setDateValue:[NSDate dateWithTimeIntervalSinceNow:0.0]];
493     [date sizeToFit];
494    
495     return date;
496     }
497     - (NSView *)ratingIndicator
498     {
499     id rate = [[[NSLevelIndicator alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
500     id cell = [rate cell];
501     [cell setControlSize:NSSmallControlSize];
502     [rate setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
503     [rate setMinValue:0];
504     [rate setMaxValue:5];
505     [cell setLevelIndicatorStyle:NSRatingLevelIndicatorStyle];
506     [cell setEditable:YES];
507 masakih 346 [cell setHighlighted:YES];
508 masaki 153 [rate sizeToFit];
509    
510 masakih 346 [rate setAction:@selector(continuousHighlighted:)];
511 masakih 348 [rate setTarget:[[self class] functionHost]];
512 masakih 346
513 masaki 153 return rate;
514     }
515 masakih 346 - (void)setHighlightRate:(id)rate
516     {
517     [[rate cell] setHighlighted:YES];
518     }
519     - (IBAction)continuousHighlighted:(id)sender
520     {
521     [self performSelector:@selector(setHighlightRate:) withObject:sender afterDelay:0.0];
522     }
523 masaki 153 - (NSView *)numberField
524     {
525     id text = [[[NSTextField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
526     [[text cell] setControlSize:NSSmallControlSize];
527     [text setFont:[NSFont controlContentFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
528 masakih 348 [text setStringValue:@"1234"];
529 masaki 153 NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
530     [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
531     [formatter setMinimum:[NSNumber numberWithInt:0]];
532     [text setFormatter:formatter];
533     [text sizeToFit];
534     [text setStringValue:@"1"];
535    
536     return text;
537     }
538 masaki 243 - (NSView *)labelField
539     {
540 masakih 348 // HMLog(HMLogLevelDebug, @"Enter -> %@", NSStringFromSelector(_cmd));
541 masaki 243 id label = [[[XspfMLabelField alloc] initWithFrame:NSMakeRect(0,0,100,19)] autorelease];
542     [label sizeToFit];
543 masaki 251 [label setLabelStyle:XspfMSquareStyle];
544     [label setDrawX:YES];
545 masaki 243
546     return label;
547     }
548 masaki 153 @end
549 masaki 152 @implementation XspfMRule (XspfMExpressionBuilder)
550 masakih 348 + (id)functionHost
551     {
552     static id host = nil;
553     if(host) return host;
554     @synchronized(self) {
555     if(!host) {
556     host = [[self alloc] init];
557     }
558     }
559     return host;
560     }
561 masaki 156 - (NSArray *)twoNumberAndUnitArgs:(NSArray *)displayValues
562     {
563     id value03 = [displayValues objectAtIndex:2];
564     id arg01 = [NSNumber numberWithInt:[[value03 objectValue] intValue]];
565    
566     id value05 = [displayValues objectAtIndex:4];
567     id arg02 = [NSNumber numberWithInt:[[value05 objectValue] intValue]];
568    
569     id value06 = [displayValues objectAtIndex:5];
570     id arg03 = nil;
571 masakih 348 if([value06 isEqualToString:@"Hours"]) {
572     arg03 = [NSNumber numberWithInt:XspfMHoursUnitType];
573     } else if([value06 isEqualToString:@"Days"]) {
574 masaki 163 arg03 = [NSNumber numberWithInt:XspfMDaysUnitType];
575 masaki 156 } else if([value06 isEqualToString:@"Weeks"]) {
576 masaki 163 arg03 = [NSNumber numberWithInt:XpsfMWeeksUnitType];
577 masaki 156 } else if([value06 isEqualToString:@"Months"]) {
578 masaki 163 arg03 = [NSNumber numberWithInt:XspfMMonthsUnitType];
579 masaki 156 } else if([value06 isEqualToString:@"Years"]) {
580 masaki 163 arg03 = [NSNumber numberWithInt:XspfMYearsUnitType];
581 masaki 156 }
582    
583     if([arg01 compare:arg02] == NSOrderedDescending) {
584     id t = arg01;
585     arg01 = arg02;
586     arg02 = t;
587     }
588    
589     return [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01],
590     [NSExpression expressionForConstantValue:arg02],
591     [NSExpression expressionForConstantValue:arg03],
592     nil];
593     }
594 masaki 154 - (NSArray *)numberAndUnitArgs:(NSArray *)displayValues
595     {
596     id value03 = [displayValues objectAtIndex:2];
597     id arg01 = [NSNumber numberWithInt:[[value03 objectValue] intValue]];
598    
599     id value04 = [displayValues objectAtIndex:3];
600     id arg02 = nil;
601 masakih 348 if([value04 isEqualToString:@"Hours"]) {
602     arg02 = [NSNumber numberWithInt:XspfMHoursUnitType];
603     } else if([value04 isEqualToString:@"Days"]) {
604 masaki 163 arg02 = [NSNumber numberWithInt:XspfMDaysUnitType];
605 masaki 154 } else if([value04 isEqualToString:@"Weeks"]) {
606 masaki 163 arg02 = [NSNumber numberWithInt:XpsfMWeeksUnitType];
607 masaki 154 } else if([value04 isEqualToString:@"Months"]) {
608 masaki 163 arg02 = [NSNumber numberWithInt:XspfMMonthsUnitType];
609 masaki 154 } else if([value04 isEqualToString:@"Years"]) {
610 masaki 163 arg02 = [NSNumber numberWithInt:XspfMYearsUnitType];
611 masaki 154 }
612    
613     return [NSArray arrayWithObjects:[NSExpression expressionForConstantValue:arg01],
614     [NSExpression expressionForConstantValue:arg02], nil];
615     }
616 masaki 152 - (NSExpression *)rangeDateFromDisplayValues:(NSArray *)displayValues
617     {
618     id field01 = nil;
619     id field02 = nil;
620    
621     Class datepickerclass = [NSDatePicker class];
622     for(id v in displayValues) {
623     if([v isKindOfClass:datepickerclass]) {
624     if([v tag] == XspfMPrimaryDateFieldTag) {
625     field01 = v;
626     } else {
627     field02 = v;
628     }
629     }
630 masaki 142 }
631    
632 masaki 152 if(!field01 || !field02) return nil;
633    
634     id value01, value02;
635     value01 = [field01 dateValue]; value02 = [field02 dateValue];
636     if([value01 compare:value02] == NSOrderedDescending) {
637     id t = value02;
638     value02 = value01;
639     value01 = t;
640 masaki 142 }
641    
642 masaki 152 id expression01, expression02;
643     expression01 = [NSExpression expressionForConstantValue:value01];
644     expression02 = [NSExpression expressionForConstantValue:value02];
645    
646     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
647 masaki 142 }
648 masakih 348 - (NSExpression *)rangeNumberFromDisplayValues:(NSArray *)displayValues
649     {
650     id field01 = nil;
651     id field02 = nil;
652    
653     Class numberFieldClass = [NSTextField class];
654     for(id v in displayValues) {
655     if([v isKindOfClass:numberFieldClass]) {
656     if([v tag] == XspfMPrimaryNumberFieldTag) {
657     field01 = v;
658     } else {
659     field02 = v;
660     }
661     }
662     }
663    
664     if(!field01 || !field02) return nil;
665    
666     NSInteger value01, value02;
667     value01 = [field01 integerValue]; value02 = [field02 integerValue];
668     if(value01 > value02) {
669     NSInteger t = value02;
670     value02 = value01;
671     value01 = t;
672     }
673    
674     id expression01, expression02;
675     expression01 = [NSExpression expressionForConstantValue:[NSNumber numberWithInteger:value01]];
676     expression02 = [NSExpression expressionForConstantValue:[NSNumber numberWithInteger:value02]];
677    
678     return [NSExpression expressionForAggregate:[NSArray arrayWithObjects:expression01, expression02, nil]];
679     }
680 masaki 120 @end
681 masaki 152

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