From eb2bb24c193ac2822b2f7a64737b8d4c4dd87f54 Mon Sep 17 00:00:00 2001 From: Johan Stille Date: Mon, 24 Sep 2012 12:08:31 +0200 Subject: [PATCH 1/3] Added support for CPNumberFormatterPercentStyle in CPNumberFormatter. --- Foundation/CPNumberFormatter.j | 11 +++++++++++ Tests/Foundation/CPNumberFormatterTest.j | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index 1fafb89699..e83f1647ca 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -90,6 +90,11 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; - (CPString)stringFromNumber:(CPNumber)number { + if (_numberStyle == CPNumberFormatterPercentStyle) + { + number *= 100.0; + } + var dcmn = [number isKindOfClass:CPDecimalNumber] ? number : [[CPDecimalNumber alloc] _initWithJSNumber:number]; // TODO Add locale support. @@ -97,6 +102,7 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; { case CPNumberFormatterCurrencyStyle: case CPNumberFormatterDecimalStyle: + case CPNumberFormatterPercentStyle: UPDATE_NUMBER_HANDLER_IF_NECESSARY(); dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:_numberHandler]; @@ -133,6 +139,11 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; else string = _currencyCode + string; } + + if (_numberStyle == CPNumberFormatterPercentStyle) + { + string += "%"; + } return string; default: diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 13775a26e0..3b6a6cc3cd 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -143,6 +143,23 @@ [self assert:@"SEK0.02" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.015"]]]; } +- (void)testPercentStyle +{ + var numberFormatter = [CPNumberFormatter new]; + [numberFormatter setNumberStyle:CPNumberFormatterPercentStyle]; + + [self assert:@"1%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.01"]]]; + [self assert:@"100%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.0"]]]; + [self assert:@"150%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.5"]]]; + + [numberFormatter setMinimumFractionDigits:1]; + [numberFormatter setMaximumFractionDigits:1]; + + [self assert:@"1.0%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.01"]]]; + [self assert:@"100.2%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.002"]]]; + [self assert:@"150.7%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.507"]]]; +} + - (void)testSetGeneratesDecimalNumbers_ { var numberFormatter = [CPNumberFormatter new]; From 632fba9dd50215c3ce1c254840708285beea6bf5 Mon Sep 17 00:00:00 2001 From: Johan Stille Date: Mon, 24 Sep 2012 13:17:24 +0200 Subject: [PATCH 2/3] Null check when laying out columns in CPTableView. --- AppKit/CPTableView.j | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 482feca58e..d74d937f7b 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -3376,12 +3376,14 @@ Your delegate can implement this method to avoid subclassing the tableview to ad rowIndex = 0, rowsCount = rowArray.length; - for (; rowIndex < rowsCount; ++rowIndex) - { - var row = rowArray[rowIndex], - dataView = dataViewsForTableColumn[row]; - - [dataView setFrame:[self frameOfDataViewAtColumn:column row:row]]; + if (dataViewsForTableColumn) { + for (; rowIndex < rowsCount; ++rowIndex) + { + var row = rowArray[rowIndex], + dataView = dataViewsForTableColumn[row]; + + [dataView setFrame:[self frameOfDataViewAtColumn:column row:row]]; + } } } } From 02a885eb0910e908c5347fb1bee6c5656738897f Mon Sep 17 00:00:00 2001 From: Johan Stille Date: Mon, 24 Sep 2012 14:22:39 +0200 Subject: [PATCH 3/3] Added test for initially hidden table column fix. --- Tests/AppKit/CPTableViewTest.j | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Tests/AppKit/CPTableViewTest.j b/Tests/AppKit/CPTableViewTest.j index a65de663fe..eb03f1955a 100644 --- a/Tests/AppKit/CPTableViewTest.j +++ b/Tests/AppKit/CPTableViewTest.j @@ -267,6 +267,41 @@ [contentBindingTable reloadData]; } +- (void)testInitiallyHiddenColumns +{ + var table = [[CPTableView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)], + tableColumn1 = [[CPTableColumn alloc] initWithIdentifier:@"A"], + tableColumn2 = [[CPTableColumn alloc] initWithIdentifier:@"B"], + delegate = [ContentBindingTableDelegate new]; + + [delegate setTester:self]; + [table setDelegate:delegate]; + + [delegate setTableEntries:[[@"A1", @"B1"], [@"A2", @"B2"], [@"A3", @"B3"]]]; + [table bind:@"content" toObject:delegate withKeyPath:@"tableEntries" options:nil]; + + [[theWindow contentView] addSubview:table]; + + [tableColumn1 setHidden:YES]; + + [tableColumn1 setWidth:50.0]; + [tableColumn2 setWidth:100.0]; + + [table addTableColumn:tableColumn1]; + [table addTableColumn:tableColumn2]; + + [table reloadData]; + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + + [self assertTrue:[table bounds].size.width > 100 && [table bounds].size.width < 200]; + + [tableColumn1 setHidden:NO]; + [tableColumn1 setWidth:100.0]; + + [self assertTrue:[table bounds].size.width >= 200]; +} + @end @implementation FirstResponderConfigurableTableView : CPTableView