mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-08-25 21:17:03 +00:00
- Test application. CPControl --------- - Moved _formatter declaration up next to value, it was in the Target-Action Support section before. - sendAction:to: should return a BOOL. - Support for CPFormatter -editingStringForObjectValue. - If a nil string is passed to -setStringValue in Cocoa, it raises an invalid parameter assertion and does nothing. - Per Cocoa, if setting a string value fails, it tries again with an empty string. - Removed a few extra blank lines. - Changed NULL to nil. CPTextField ----------- - The string value is now cached in _stringValue to avoid constant calls to the formatter. - There were several places where references to _inputElement were not wrapped with #if PLATFORM(DOM). - When resigning first responder, if there is a formatter and formatting fails, reject the resignation and keep focus. Also, if the delegate responds to control:didFailToFormatString:errorDescription:, invoke it. - _willBecomeFirstResponderByClick was not being set to NO when resigning. As a result, if you clicked in a field, tabbed to another field, and tabbed back to the original field, it would not select the text because it thought there was a mouse click. - Don't send _sendStringValue: in keyUp: if the value has not changed. Previously it would do that for non-printing keys like navigation keys. - insertNewLine: validates the string the same way resigning does. - insertNewLine: would not send textDidEndEditing: if the field had no action, but it should. - insertNewLine: should select all text (per Cocoa). - insertNewLineIgnoringFieldEditor: and insertTabIgnoringFieldEditor: were not replacing the selection, Cocoa docs say they should. - Per Cocoa, when setting an object value and there is a formatter, the value is first formatted as a string. If that fails, an object value for an empty string is attempted. CPFormatter ----------- - Fixed up the docs to match the method signatures. - Indicated with "Ref" in argument types if the argument is pass by reference. - isPartialStringValid:newEditingString:errorDescription: has a default implementation in Cocoa that nils the return values and returns YES. - Fixed the name of isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription: - isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription: has a default implementation in Cocoa that invokes isPartialStringValid:newEditingString:errorDescription:
126 lines
3.1 KiB
Plaintext
126 lines
3.1 KiB
Plaintext
/*
|
|
* AppController.j
|
|
* CPFormatterTest
|
|
*
|
|
* Created by aparajita on July 6, 2011.
|
|
* Copyright 2011, Victory-Heart Productions All rights reserved.
|
|
*/
|
|
|
|
@import <Foundation/CPFormatter.j>
|
|
|
|
|
|
@implementation DateFormatter : CPFormatter
|
|
{
|
|
CPString displayFormat;
|
|
CPString editingFormat;
|
|
BOOL emptyIsValid @accessors(getter=isEmptyValid);
|
|
}
|
|
|
|
+ (DateFormatter)formatterWithDisplayFormat:(CPString)aDisplayFormat editingFormat:(CPString)anEditingFormat emptyIsValid:(BOOL)emptyValid
|
|
{
|
|
return [[self alloc] initWithDisplayFormat:aDisplayFormat editingFormat:anEditingFormat emptyIsValid:emptyValid];
|
|
}
|
|
|
|
- (id)initWithDisplayFormat:(CPString)aDisplayFormat editingFormat:(CPString)anEditingFormat emptyIsValid:(BOOL)emptyValid
|
|
{
|
|
self = [super init];
|
|
|
|
if (self)
|
|
{
|
|
displayFormat = aDisplayFormat;
|
|
editingFormat = anEditingFormat;
|
|
emptyIsValid = emptyValid;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (CPString)stringForObjectValue:(id)anObject
|
|
{
|
|
var result;
|
|
|
|
if ([anObject isKindOfClass:[CPDate class]])
|
|
result = anObject.dateFormat(displayFormat);
|
|
else
|
|
result = nil;
|
|
|
|
console.log("stringForObjectValue:%s ==> %s", [anObject description], result);
|
|
return result;
|
|
}
|
|
|
|
- (CPString)editingStringForObjectValue:(id)anObject
|
|
{
|
|
var result;
|
|
|
|
if ([anObject isKindOfClass:[CPDate class]])
|
|
result = anObject.dateFormat(editingFormat);
|
|
else
|
|
result = nil;
|
|
|
|
console.log("editingStringForObjectValue:%s ==> %s", [anObject description], result);
|
|
return result;
|
|
}
|
|
|
|
- (BOOL)getObjectValue:(CPStringRef)anObject forString:(CPString)aString errorDescription:(CPStringRef)anError
|
|
{
|
|
var result;
|
|
|
|
if (anError)
|
|
anError(nil);
|
|
|
|
if (aString.length === 0)
|
|
{
|
|
anObject(nil);
|
|
result = emptyIsValid;
|
|
|
|
if (anError)
|
|
anError(@"Please enter a date.");
|
|
}
|
|
else
|
|
{
|
|
var date = Date.parseDate(aString, editingFormat);
|
|
|
|
anObject(date);
|
|
|
|
if (date === nil && anError)
|
|
anError(@"Invalid date format.");
|
|
|
|
result = date !== nil;
|
|
}
|
|
|
|
console.log("getObjectValue:forString:%s ==> %s", aString, result);
|
|
return result;
|
|
}
|
|
|
|
@end
|
|
|
|
var DateFormatterDisplayFormatKey = @"DateFormatterDisplayFormatKey",
|
|
DateFormatterEditingFormatKey = @"DateFormatterEditingFormatKey",
|
|
DateFormatterEmptyIsValidKey = @"DateFormatterEmptyIsValidKey";
|
|
|
|
@implementation DateFormatter (CPCoding)
|
|
|
|
- (id)initWithCoder:(CPCoder)aCoder
|
|
{
|
|
self = [super initWithCoder:aCoder];
|
|
|
|
if (self)
|
|
{
|
|
displayFormat = [aCoder decodeObjectForKey:DateFormatterDisplayFormatKey];
|
|
editingFormat = [aCoder decodeObjectForKey:DateFormatterEditingFormatKey];
|
|
emptyIsValid = [aCoder decodeObjectForKey:DateFormatterEmptyIsValidKey];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)encodeWithCoder:(CPCoder)aCoder
|
|
{
|
|
[super encodeWithCoder:aCoder];
|
|
[aCoder encodeObject:displayFormat forKey:DateFormatterDisplayFormatKey];
|
|
[aCoder encodeObject:editingFormat forKey:DateFormatterEditingFormatKey];
|
|
[aCoder encodeObject:emptyIsValid forKey:DateFormatterEmptyIsValidKey];
|
|
}
|
|
|
|
@end
|