From 5d4c3b9e6b0aa61c958bc72e5dfabeadd9291849 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 17 Sep 2014 20:58:05 -0400 Subject: [PATCH 001/429] Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Added properties to `CPTPlotRange` and `CPTMutablePlotRange` to read and write all range properties as `NSNumber`, `NSDecimal`, or `double`. --- documentation/changelog.markdown | 3 + framework/Source/CPTAxis.h | 10 +- framework/Source/CPTAxis.m | 101 ++++--- framework/Source/CPTAxisLabel.h | 2 +- framework/Source/CPTAxisLabel.m | 12 +- framework/Source/CPTAxisTitle.m | 4 +- framework/Source/CPTBarPlot.h | 8 +- framework/Source/CPTBarPlot.m | 141 ++++------ framework/Source/CPTDataSourceTestCase.m | 6 +- framework/Source/CPTFunctionDataSource.m | 12 +- framework/Source/CPTMutablePlotRange.h | 10 +- framework/Source/CPTMutablePlotRange.m | 124 +++++++-- framework/Source/CPTPlot.m | 4 +- framework/Source/CPTPlotRange.h | 24 +- framework/Source/CPTPlotRange.m | 253 +++++++++++++----- framework/Source/CPTPlotRangeTests.m | 148 +++++----- framework/Source/CPTPlotSpace.m | 2 +- framework/Source/CPTRangePlot.m | 2 +- framework/Source/CPTScatterPlot.h | 4 +- framework/Source/CPTScatterPlot.m | 79 ++++-- framework/Source/CPTScatterPlotTests.m | 4 +- framework/Source/CPTTradingRangePlot.m | 2 +- framework/Source/CPTXYAxis.h | 2 +- framework/Source/CPTXYAxis.m | 103 ++++--- framework/Source/CPTXYPlotSpace.m | 78 +++--- framework/Source/CPTXYPlotSpaceTests.m | 176 ++++++------ .../Source/_CPTAnimationPlotRangePeriod.m | 16 +- framework/Source/_CPTDarkGradientTheme.m | 26 +- framework/Source/_CPTPlainBlackTheme.m | 52 ++-- framework/Source/_CPTPlainWhiteTheme.m | 56 ++-- framework/Source/_CPTSlateTheme.m | 26 +- framework/Source/_CPTStocksTheme.m | 56 ++-- framework/Source/_CPTXYTheme.m | 4 +- 33 files changed, 873 insertions(+), 677 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 304391bc8..795438f46 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -20,6 +20,9 @@ To be determined. - **New**: Added support for categorical plot data. - **Changed**: Increased the deployment target to iOS 5.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. +- **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. +- **Changed**: Added properties to `CPTPlotRange` and `CPTMutablePlotRange` to read and write all range properties as `NSNumber`, `NSDecimal`, or `double`. +- **Changed**: Renamed the `CPTXYAxis.orthogonalCoordinateDecimal` property to `CPTXYAxis.orthogonalPosition`. - **Changed**: Updated `CPTImage` to automatically handle switching between Retina and non-Retina displays. - **Changed**: Changed the behavior of all axis and plot xxxWasSelected delegate methods to require both a down and up event on the same element instead of only the down event. - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index e8c312eaa..42ae02bfe 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -189,7 +189,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @{ @property (nonatomic, readwrite, copy) CPTLineStyle *axisLineStyle; @property (nonatomic, readwrite, assign) CPTCoordinate coordinate; -@property (nonatomic, readwrite, assign) NSDecimal labelingOrigin; +@property (nonatomic, readwrite, strong) NSNumber *labelingOrigin; @property (nonatomic, readwrite, assign) CPTSign tickDirection; @property (nonatomic, readwrite, copy) CPTPlotRange *visibleRange; @property (nonatomic, readwrite, copy) CPTPlotRange *visibleAxisRange; @@ -206,8 +206,8 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { @property (nonatomic, readwrite, copy) NSAttributedString *attributedTitle; @property (nonatomic, readwrite, assign) CGFloat titleRotation; @property (nonatomic, readwrite, assign) CPTSign titleDirection; -@property (nonatomic, readwrite, assign) NSDecimal titleLocation; -@property (nonatomic, readonly) NSDecimal defaultTitleLocation; +@property (nonatomic, readwrite, strong) NSNumber *titleLocation; +@property (nonatomic, readonly) NSNumber *defaultTitleLocation; /// @} /// @name Labels @@ -235,7 +235,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Major Ticks /// @{ -@property (nonatomic, readwrite, assign) NSDecimal majorIntervalLength; +@property (nonatomic, readwrite, strong) NSNumber *majorIntervalLength; @property (nonatomic, readwrite, assign) CGFloat majorTickLength; @property (nonatomic, readwrite, copy) CPTLineStyle *majorTickLineStyle; @property (nonatomic, readwrite, strong) NSSet *majorTickLocations; @@ -313,7 +313,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Coordinate Space Conversions /// @{ --(CGPoint)viewPointForCoordinateDecimalNumber:(NSDecimal)coordinateDecimalNumber; +-(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue; /// @} /// @name Grid Lines diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index f5d19bfa2..a4a931f46 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -87,9 +87,9 @@ @implementation CPTAxis **/ @synthesize coordinate; -/** @property NSDecimal labelingOrigin +/** @property NSNumber *labelingOrigin * @brief The origin used for axis labels. - * The default value is 0. It is only used when the axis labeling + * The default value is @num{0}. It is only used when the axis labeling * policy is #CPTAxisLabelingPolicyFixedInterval. The origin is * a reference point used to being labeling. Labels are added * at the origin, as well as at fixed intervals above and below @@ -186,13 +186,13 @@ @implementation CPTAxis **/ @synthesize titleDirection; -/** @property NSDecimal titleLocation +/** @property NSNumber *titleLocation * @brief The position along the axis where the axis title should be centered. * If @NAN (the default), the @ref defaultTitleLocation will be used. **/ @synthesize titleLocation; -/** @property NSDecimal defaultTitleLocation +/** @property NSNumber *defaultTitleLocation * @brief The position along the axis where the axis title should be centered * if @ref titleLocation is @NAN. **/ @@ -328,7 +328,7 @@ @implementation CPTAxis // Major ticks -/** @property NSDecimal majorIntervalLength +/** @property NSNumber *majorIntervalLength * @brief The distance between major tick marks expressed in data coordinates. **/ @synthesize majorIntervalLength; @@ -558,8 +558,8 @@ -(instancetype)initWithFrame:(CGRect)newFrame minorGridLineStyle = nil; axisLineCapMin = nil; axisLineCapMax = nil; - labelingOrigin = [[NSDecimalNumber zero] decimalValue]; - majorIntervalLength = [[NSDecimalNumber one] decimalValue]; + labelingOrigin = @0.0; + majorIntervalLength = @1.0; minorTicksPerInterval = 1; coordinate = CPTCoordinateX; labelingPolicy = CPTAxisLabelingPolicyFixedInterval; @@ -581,7 +581,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame axisTitle = nil; titleTextStyle = [[CPTTextStyle alloc] init]; titleRotation = NAN; - titleLocation = CPTDecimalNaN(); + titleLocation = @(NAN); needsRelabel = YES; labelExclusionRanges = nil; plotArea = nil; @@ -719,8 +719,8 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.minorGridLineStyle forKey:@"CPTAxis.minorGridLineStyle"]; [coder encodeObject:self.axisLineCapMin forKey:@"CPTAxis.axisLineCapMin"]; [coder encodeObject:self.axisLineCapMax forKey:@"CPTAxis.axisLineCapMax"]; - [coder encodeDecimal:self.labelingOrigin forKey:@"CPTAxis.labelingOrigin"]; - [coder encodeDecimal:self.majorIntervalLength forKey:@"CPTAxis.majorIntervalLength"]; + [coder encodeObject:self.labelingOrigin forKey:@"CPTAxis.labelingOrigin"]; + [coder encodeObject:self.majorIntervalLength forKey:@"CPTAxis.majorIntervalLength"]; [coder encodeInteger:(NSInteger)self.minorTicksPerInterval forKey:@"CPTAxis.minorTicksPerInterval"]; [coder encodeInteger:(NSInteger)self.preferredNumberOfMajorTicks forKey:@"CPTAxis.preferredNumberOfMajorTicks"]; [coder encodeInteger:self.labelingPolicy forKey:@"CPTAxis.labelingPolicy"]; @@ -739,7 +739,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeCGFloat:self.titleOffset forKey:@"CPTAxis.titleOffset"]; [coder encodeCGFloat:self.titleRotation forKey:@"CPTAxis.titleRotation"]; [coder encodeInteger:self.titleDirection forKey:@"CPTAxis.titleDirection"]; - [coder encodeDecimal:self.titleLocation forKey:@"CPTAxis.titleLocation"]; + [coder encodeObject:self.titleLocation forKey:@"CPTAxis.titleLocation"]; [coder encodeInteger:self.tickDirection forKey:@"CPTAxis.tickDirection"]; [coder encodeBool:self.needsRelabel forKey:@"CPTAxis.needsRelabel"]; [coder encodeObject:self.labelExclusionRanges forKey:@"CPTAxis.labelExclusionRanges"]; @@ -786,8 +786,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder minorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorGridLineStyle"] copy]; axisLineCapMin = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMin"] copy]; axisLineCapMax = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMax"] copy]; - labelingOrigin = [coder decodeDecimalForKey:@"CPTAxis.labelingOrigin"]; - majorIntervalLength = [coder decodeDecimalForKey:@"CPTAxis.majorIntervalLength"]; + labelingOrigin = [coder decodeObjectForKey:@"CPTAxis.labelingOrigin"]; + majorIntervalLength = [coder decodeObjectForKey:@"CPTAxis.majorIntervalLength"]; minorTicksPerInterval = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.minorTicksPerInterval"]; preferredNumberOfMajorTicks = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.preferredNumberOfMajorTicks"]; labelingPolicy = (CPTAxisLabelingPolicy)[coder decodeIntegerForKey : @"CPTAxis.labelingPolicy"]; @@ -806,7 +806,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder titleOffset = [coder decodeCGFloatForKey:@"CPTAxis.titleOffset"]; titleRotation = [coder decodeCGFloatForKey:@"CPTAxis.titleRotation"]; titleDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.titleDirection"]; - titleLocation = [coder decodeDecimalForKey:@"CPTAxis.titleLocation"]; + titleLocation = [coder decodeObjectForKey:@"CPTAxis.titleLocation"]; tickDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickDirection"]; needsRelabel = [coder decodeBoolForKey:@"CPTAxis.needsRelabel"]; labelExclusionRanges = [coder decodeObjectForKey:@"CPTAxis.labelExclusionRanges"]; @@ -879,7 +879,7 @@ -(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajo NSMutableSet *minorLocations = [NSMutableSet set]; NSDecimal zero = CPTDecimalFromInteger(0); - NSDecimal majorInterval = self.majorIntervalLength; + NSDecimal majorInterval = self.majorIntervalLength.decimalValue; if ( CPTDecimalGreaterThan(majorInterval, zero) ) { CPTMutablePlotRange *range = [[self.plotSpace plotRangeForCoordinate:self.coordinate] mutableCopy]; @@ -889,8 +889,8 @@ -(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajo [range intersectionPlotRange:theVisibleRange]; } - NSDecimal rangeMin = range.minLimit; - NSDecimal rangeMax = range.maxLimit; + NSDecimal rangeMin = range.minLimitDecimal; + NSDecimal rangeMax = range.maxLimitDecimal; NSDecimal minorInterval; NSUInteger minorTickCount = self.minorTicksPerInterval; @@ -902,9 +902,10 @@ -(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajo } // Set starting coord--should be the smallest value >= rangeMin that is a whole multiple of majorInterval away from the labelingOrigin - NSDecimal coord = CPTDecimalDivide(CPTDecimalSubtract(rangeMin, self.labelingOrigin), majorInterval); + NSDecimal origin = self.labelingOrigin.decimalValue; + NSDecimal coord = CPTDecimalDivide(CPTDecimalSubtract(rangeMin, origin), majorInterval); NSDecimalRound(&coord, &coord, 0, NSRoundUp); - coord = CPTDecimalAdd(CPTDecimalMultiply(coord, majorInterval), self.labelingOrigin); + coord = CPTDecimalAdd(CPTDecimalMultiply(coord, majorInterval), origin); // Set minor ticks between the starting point and rangeMin if ( minorTickCount > 0 ) { @@ -1024,10 +1025,10 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation NSDecimal majorInterval; if ( numTicks == 2 ) { - majorInterval = niceLength(range.length); + majorInterval = niceLength(range.lengthDecimal); } else { - majorInterval = CPTDecimalDivide( range.length, CPTDecimalFromUnsignedInteger(numTicks - 1) ); + majorInterval = CPTDecimalDivide( range.lengthDecimal, CPTDecimalFromUnsignedInteger(numTicks - 1) ); majorInterval = niceNum(majorInterval); } if ( CPTDecimalLessThan(majorInterval, zero) ) { @@ -1043,8 +1044,8 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation } // Calculate actual range limits - NSDecimal minLimit = range.minLimit; - NSDecimal maxLimit = range.maxLimit; + NSDecimal minLimit = range.minLimitDecimal; + NSDecimal maxLimit = range.maxLimitDecimal; // Determine the initial and final major indexes for the actual visible range NSDecimal initialIndex = CPTDecimalDivide(minLimit, majorInterval); @@ -1169,15 +1170,15 @@ -(void)generateEqualMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocatio if ( range.lengthDouble != 0.0 ) { NSDecimal zero = CPTDecimalFromInteger(0); - NSDecimal rangeMin = range.minLimit; - NSDecimal rangeMax = range.maxLimit; + NSDecimal rangeMin = range.minLimitDecimal; + NSDecimal rangeMax = range.maxLimitDecimal; NSUInteger majorTickCount = self.preferredNumberOfMajorTicks; if ( majorTickCount < 2 ) { majorTickCount = 2; } - NSDecimal majorInterval = CPTDecimalDivide( range.length, CPTDecimalFromUnsignedInteger(majorTickCount - 1) ); + NSDecimal majorInterval = CPTDecimalDivide( range.lengthDecimal, CPTDecimalFromUnsignedInteger(majorTickCount - 1) ); if ( CPTDecimalLessThan(majorInterval, zero) ) { majorInterval = CPTDecimalMultiply( majorInterval, CPTDecimalFromInteger(-1) ); } @@ -1475,9 +1476,7 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la CPTLayer *lastLayer = nil; for ( NSDecimalNumber *tickLocation in locations ) { - NSDecimal locationDecimal = tickLocation.decimalValue; - - if ( labeledRange && ![labeledRange contains:locationDecimal] ) { + if ( labeledRange && ![labeledRange containsNumber:tickLocation] ) { continue; } @@ -1485,7 +1484,7 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la BOOL needsNewContentLayer = NO; // reuse axis labels where possible--will prevent flicker when updating layers - blankLabel.tickLocation = locationDecimal; + blankLabel.tickLocation = tickLocation; CPTAxisLabel *oldAxisLabel = [oldAxisLabels member:blankLabel]; if ( oldAxisLabel ) { @@ -1493,7 +1492,7 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la } else { newAxisLabel = [[CPTAxisLabel alloc] initWithText:nil textStyle:nil]; - newAxisLabel.tickLocation = locationDecimal; + newAxisLabel.tickLocation = tickLocation; needsNewContentLayer = YES; } @@ -1682,19 +1681,19 @@ -(void)updateCustomTickLabels CPTSign direction = self.tickDirection; for ( CPTAxisLabel *label in self.axisLabels ) { - BOOL visible = [range contains:label.tickLocation]; + BOOL visible = [range containsNumber:label.tickLocation]; label.contentLayer.hidden = !visible; if ( visible ) { - CGPoint tickBasePoint = [self viewPointForCoordinateDecimalNumber:label.tickLocation]; + CGPoint tickBasePoint = [self viewPointForCoordinateValue:label.tickLocation]; [label positionRelativeToViewPoint:tickBasePoint forCoordinate:orthogonalCoordinate inDirection:direction]; } } for ( CPTAxisLabel *label in self.minorTickAxisLabels ) { - BOOL visible = [range contains:label.tickLocation]; + BOOL visible = [range containsNumber:label.tickLocation]; label.contentLayer.hidden = !visible; if ( visible ) { - CGPoint tickBasePoint = [self viewPointForCoordinateDecimalNumber:label.tickLocation]; + CGPoint tickBasePoint = [self viewPointForCoordinateValue:label.tickLocation]; [label positionRelativeToViewPoint:tickBasePoint forCoordinate:orthogonalCoordinate inDirection:direction]; } } @@ -1758,7 +1757,7 @@ -(void)updateMajorTickLabels } for ( CPTAxisLabel *label in self.axisLabels ) { - CGPoint tickBasePoint = [self viewPointForCoordinateDecimalNumber:label.tickLocation]; + CGPoint tickBasePoint = [self viewPointForCoordinateValue:label.tickLocation]; [label positionRelativeToViewPoint:tickBasePoint forCoordinate:orthogonalCoordinate inDirection:direction]; } } @@ -1777,7 +1776,7 @@ -(void)updateMinorTickLabels } for ( CPTAxisLabel *label in self.minorTickAxisLabels ) { - CGPoint tickBasePoint = [self viewPointForCoordinateDecimalNumber:label.tickLocation]; + CGPoint tickBasePoint = [self viewPointForCoordinateValue:label.tickLocation]; [label positionRelativeToViewPoint:tickBasePoint forCoordinate:orthogonalCoordinate inDirection:direction]; } } @@ -1785,9 +1784,9 @@ -(void)updateMinorTickLabels #pragma mark - #pragma mark Titles --(NSDecimal)defaultTitleLocation +-(NSNumber *)defaultTitleLocation { - return CPTDecimalNaN(); + return @(NAN); } /** @@ -1801,7 +1800,7 @@ -(void)updateAxisTitle direction = self.tickDirection; } - [self.axisTitle positionRelativeToViewPoint:[self viewPointForCoordinateDecimalNumber:self.titleLocation] + [self.axisTitle positionRelativeToViewPoint:[self viewPointForCoordinateValue:self.titleLocation] forCoordinate:CPTOrthogonalCoordinate(self.coordinate) inDirection:direction]; } @@ -1866,7 +1865,7 @@ -(void)removeBackgroundLimitBand:(CPTLimitBand *)limitBand } #pragma mark - -#pragma mark Responder Chain and User interaction +#pragma mark Responder Chain and User Interaction /// @name User Interaction /// @{ @@ -2370,17 +2369,17 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle } } --(void)setTitleLocation:(NSDecimal)newLocation +-(void)setTitleLocation:(NSNumber *)newLocation { - if ( NSDecimalCompare(&newLocation, &titleLocation) != NSOrderedSame ) { + if ( ![newLocation isEqualToNumber:titleLocation] ) { titleLocation = newLocation; [self updateAxisTitle]; } } --(NSDecimal)titleLocation +-(NSNumber *)titleLocation { - if ( NSDecimalIsNotANumber(&titleLocation) ) { + if ( isnan(titleLocation.doubleValue) ) { return self.defaultTitleLocation; } else { @@ -2670,18 +2669,18 @@ -(void)setAxisLineCapMax:(CPTLineCap *)newAxisLineCapMax } } --(void)setLabelingOrigin:(NSDecimal)newLabelingOrigin +-(void)setLabelingOrigin:(NSNumber *)newLabelingOrigin { - if ( !CPTDecimalEquals(labelingOrigin, newLabelingOrigin) ) { + if ( ![newLabelingOrigin isEqualToNumber:labelingOrigin] ) { labelingOrigin = newLabelingOrigin; self.needsRelabel = YES; } } --(void)setMajorIntervalLength:(NSDecimal)newIntervalLength +-(void)setMajorIntervalLength:(NSNumber *)newIntervalLength { - if ( !CPTDecimalEquals(majorIntervalLength, newIntervalLength) ) { + if ( ![newIntervalLength isEqualToNumber:majorIntervalLength] ) { majorIntervalLength = newIntervalLength; self.needsRelabel = YES; @@ -3040,10 +3039,10 @@ -(void)setHidden:(BOOL)newHidden @implementation CPTAxis(AbstractMethods) /** @brief Converts a position on the axis to drawing coordinates. - * @param coordinateDecimalNumber The axis value in data coordinate space. + * @param coordinateValue The axis value in data coordinate space. * @return The drawing coordinates of the point. **/ --(CGPoint)viewPointForCoordinateDecimalNumber:(NSDecimal)coordinateDecimalNumber +-(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue { return CGPointZero; } diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index 5637eeabb..c51a9f2d2 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -9,7 +9,7 @@ @property (nonatomic, readwrite, assign) CGFloat offset; @property (nonatomic, readwrite, assign) CGFloat rotation; @property (nonatomic, readwrite, assign) CPTAlignment alignment; -@property (nonatomic, readwrite) NSDecimal tickLocation; +@property (nonatomic, readwrite, strong) NSNumber *tickLocation; /// @name Initialization /// @{ diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index 7bad05b2f..225f19024 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -33,7 +33,7 @@ @implementation CPTAxisLabel **/ @synthesize alignment; -/** @property NSDecimal tickLocation +/** @property NSNumber *tickLocation * @brief The data coordinate of the tick location. **/ @synthesize tickLocation; @@ -69,7 +69,7 @@ -(instancetype)initWithContentLayer:(CPTLayer *)layer offset = CPTFloat(20.0); rotation = CPTFloat(0.0); alignment = CPTAlignmentCenter; - tickLocation = CPTDecimalFromInteger(0); + tickLocation = @0.0; } } else { @@ -89,7 +89,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeCGFloat:self.offset forKey:@"CPTAxisLabel.offset"]; [coder encodeCGFloat:self.rotation forKey:@"CPTAxisLabel.rotation"]; [coder encodeInteger:self.alignment forKey:@"CPTAxisLabel.alignment"]; - [coder encodeDecimal:self.tickLocation forKey:@"CPTAxisLabel.tickLocation"]; + [coder encodeObject:self.tickLocation forKey:@"CPTAxisLabel.tickLocation"]; } -(instancetype)initWithCoder:(NSCoder *)coder @@ -99,7 +99,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder offset = [coder decodeCGFloatForKey:@"CPTAxisLabel.offset"]; rotation = [coder decodeCGFloatForKey:@"CPTAxisLabel.rotation"]; alignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxisLabel.alignment"]; - tickLocation = [coder decodeDecimalForKey:@"CPTAxisLabel.tickLocation"]; + tickLocation = [coder decodeObjectForKey:@"CPTAxisLabel.tickLocation"]; } return self; } @@ -305,7 +305,7 @@ -(BOOL)isEqual:(id)object return YES; } else if ( [object isKindOfClass:[self class]] ) { - return CPTDecimalEquals(self.tickLocation, ( (CPTAxisLabel *)object ).tickLocation); + return [self.tickLocation isEqualToNumber:( (CPTAxisLabel *)object ).tickLocation]; } else { return NO; @@ -321,7 +321,7 @@ -(NSUInteger)hash NSUInteger hashValue = 0; // Equal objects must hash the same. - double tickLocationAsDouble = CPTDecimalDoubleValue(self.tickLocation); + double tickLocationAsDouble = self.tickLocation.doubleValue; if ( !isnan(tickLocationAsDouble) ) { hashValue = (NSUInteger)lrint( fmod(ABS(tickLocationAsDouble), (double)NSUIntegerMax) ); diff --git a/framework/Source/CPTAxisTitle.m b/framework/Source/CPTAxisTitle.m index d3aab919f..4b7030369 100644 --- a/framework/Source/CPTAxisTitle.m +++ b/framework/Source/CPTAxisTitle.m @@ -56,7 +56,7 @@ -(BOOL)isEqual:(id)object if ( ![self.contentLayer isEqual:otherTitle] ) { return NO; } - return CPTDecimalEquals(self.tickLocation, ( (CPTAxisLabel *)object ).tickLocation); + return [self.tickLocation isEqualToNumber:( (CPTAxisLabel *)object ).tickLocation]; } else { return NO; @@ -72,7 +72,7 @@ -(NSUInteger)hash NSUInteger hashValue = 0; // Equal objects must hash the same. - double tickLocationAsDouble = CPTDecimalDoubleValue(self.tickLocation); + double tickLocationAsDouble = self.tickLocation.doubleValue; if ( !isnan(tickLocationAsDouble) ) { hashValue = (NSUInteger)lrint( fmod(ABS(tickLocationAsDouble), (double)NSUIntegerMax) ); diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index 7b21832b7..8b6e44175 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -188,14 +188,12 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { /// @name Appearance /// @{ @property (nonatomic, readwrite, assign) BOOL barWidthsAreInViewCoordinates; -@property (nonatomic, readwrite, assign) NSDecimal barWidth; -@property (nonatomic, readwrite, assign) CGFloat barWidthScale; -@property (nonatomic, readwrite, assign) NSDecimal barOffset; -@property (nonatomic, readwrite, assign) CGFloat barOffsetScale; +@property (nonatomic, readwrite, strong) NSNumber *barWidth; +@property (nonatomic, readwrite, strong) NSNumber *barOffset; @property (nonatomic, readwrite, assign) CGFloat barCornerRadius; @property (nonatomic, readwrite, assign) CGFloat barBaseCornerRadius; @property (nonatomic, readwrite, assign) BOOL barsAreHorizontal; -@property (nonatomic, readwrite, assign) NSDecimal baseValue; +@property (nonatomic, readwrite, strong) NSNumber *baseValue; @property (nonatomic, readwrite, assign) BOOL barBasesVary; @property (nonatomic, readwrite, copy) CPTPlotRange *plotRange; /// @} diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 1e7088d66..fc33ca40e 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -89,16 +89,11 @@ @implementation CPTBarPlot **/ @synthesize barBaseCornerRadius; -/** @property NSDecimal barOffset +/** @property NSNumber *barOffset * @brief The starting offset of the first bar in location data units. - **/ -@synthesize barOffset; - -/** @property CGFloat barOffsetScale - * @brief An animatable scaling factor for the bar offset. Default is @num{1.0}. * @ingroup plotAnimationBarPlot **/ -@synthesize barOffsetScale; +@synthesize barOffset; /** @property BOOL barWidthsAreInViewCoordinates * @brief Whether the bar width and bar offset is in view coordinates, or in plot coordinates. @@ -106,7 +101,7 @@ @implementation CPTBarPlot **/ @synthesize barWidthsAreInViewCoordinates; -/** @property NSDecimal barWidth +/** @property NSNumber *barWidth * @brief The width of each bar. Either view or plot coordinates can be used. * * With plot coordinates, the bar locations are one data unit apart (e.g., 1, 2, 3, etc.), @@ -114,14 +109,9 @@ @implementation CPTBarPlot * as the gap between them. * * @see barWidthsAreInViewCoordinates - **/ -@synthesize barWidth; - -/** @property CGFloat barWidthScale - * @brief An animatable scaling factor for the bar width. Default is @num{1.0}. * @ingroup plotAnimationBarPlot **/ -@synthesize barWidthScale; +@synthesize barWidth; /** @property CPTLineStyle *lineStyle * @brief The line style for the bar outline. @@ -140,10 +130,11 @@ @implementation CPTBarPlot **/ @synthesize barsAreHorizontal; -/** @property NSDecimal baseValue +/** @property NSNumber *baseValue * @brief The coordinate value of the fixed end of the bars. * This is only used if @ref barBasesVary is @NO. Otherwise, the data source * will be queried for an appropriate value of #CPTBarPlotFieldBarBase. + * @ingroup plotAnimationBarPlot **/ @synthesize baseValue; @@ -188,7 +179,7 @@ +(instancetype)tubularBarPlotWithColor:(CPTColor *)color horizontalBars:(BOOL)ho barPlot.lineStyle = barLineStyle; barPlot.barsAreHorizontal = horizontal; - barPlot.barWidth = CPTDecimalFromDouble(0.8); + barPlot.barWidth = @0.8; barPlot.barCornerRadius = CPTFloat(2.0); CPTGradient *fillGradient = [CPTGradient gradientWithBeginningColor:color endingColor:[CPTColor blackColor]]; @@ -230,10 +221,8 @@ +(void)initialize * - @ref lineStyle = default line style * - @ref fill = solid black fill * - @ref barWidth = @num{0.5} - * - @ref barWidthScale = @num{1.0} * - @ref barWidthsAreInViewCoordinates = @NO * - @ref barOffset = @num{0.0} - * - @ref barOffsetScale = @num{1.0} * - @ref barCornerRadius = @num{0.0} * - @ref barBaseCornerRadius = @num{0.0} * - @ref baseValue = @num{0} @@ -251,14 +240,12 @@ -(instancetype)initWithFrame:(CGRect)newFrame if ( (self = [super initWithFrame:newFrame]) ) { lineStyle = [[CPTLineStyle alloc] init]; fill = [CPTFill fillWithColor:[CPTColor blackColor]]; - barWidth = CPTDecimalFromDouble(0.5); - barWidthScale = CPTFloat(1.0); + barWidth = @0.5; barWidthsAreInViewCoordinates = NO; - barOffset = CPTDecimalFromDouble(0.0); - barOffsetScale = CPTFloat(1.0); + barOffset = @0.0; barCornerRadius = CPTFloat(0.0); barBaseCornerRadius = CPTFloat(0.0); - baseValue = CPTDecimalFromInteger(0); + baseValue = @0.0; barsAreHorizontal = NO; barBasesVary = NO; plotRange = nil; @@ -282,10 +269,8 @@ -(instancetype)initWithLayer:(id)layer lineStyle = theLayer->lineStyle; fill = theLayer->fill; barWidth = theLayer->barWidth; - barWidthScale = theLayer->barWidthScale; barWidthsAreInViewCoordinates = theLayer->barWidthsAreInViewCoordinates; barOffset = theLayer->barOffset; - barOffsetScale = theLayer->barOffsetScale; barCornerRadius = theLayer->barCornerRadius; barBaseCornerRadius = theLayer->barBaseCornerRadius; baseValue = theLayer->baseValue; @@ -310,13 +295,11 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.lineStyle forKey:@"CPTBarPlot.lineStyle"]; [coder encodeObject:self.fill forKey:@"CPTBarPlot.fill"]; - [coder encodeDecimal:self.barWidth forKey:@"CPTBarPlot.barWidth"]; - [coder encodeCGFloat:self.barWidthScale forKey:@"CPTBarPlot.barWidthScale"]; - [coder encodeDecimal:self.barOffset forKey:@"CPTBarPlot.barOffset"]; - [coder encodeCGFloat:self.barOffsetScale forKey:@"CPTBarPlot.barOffsetScale"]; + [coder encodeObject:self.barWidth forKey:@"CPTBarPlot.barWidth"]; + [coder encodeObject:self.barOffset forKey:@"CPTBarPlot.barOffset"]; [coder encodeCGFloat:self.barCornerRadius forKey:@"CPTBarPlot.barCornerRadius"]; [coder encodeCGFloat:self.barBaseCornerRadius forKey:@"CPTBarPlot.barBaseCornerRadius"]; - [coder encodeDecimal:self.baseValue forKey:@"CPTBarPlot.baseValue"]; + [coder encodeObject:self.baseValue forKey:@"CPTBarPlot.baseValue"]; [coder encodeBool:self.barsAreHorizontal forKey:@"CPTBarPlot.barsAreHorizontal"]; [coder encodeBool:self.barBasesVary forKey:@"CPTBarPlot.barBasesVary"]; [coder encodeBool:self.barWidthsAreInViewCoordinates forKey:@"CPTBarPlot.barWidthsAreInViewCoordinates"]; @@ -331,13 +314,11 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super initWithCoder:coder]) ) { lineStyle = [[coder decodeObjectForKey:@"CPTBarPlot.lineStyle"] copy]; fill = [[coder decodeObjectForKey:@"CPTBarPlot.fill"] copy]; - barWidth = [coder decodeDecimalForKey:@"CPTBarPlot.barWidth"]; - barWidthScale = [coder decodeCGFloatForKey:@"CPTBarPlot.barWidthScale"]; - barOffset = [coder decodeDecimalForKey:@"CPTBarPlot.barOffset"]; - barOffsetScale = [coder decodeCGFloatForKey:@"CPTBarPlot.barOffsetScale"]; + barWidth = [coder decodeObjectForKey:@"CPTBarPlot.barWidth"]; + barOffset = [coder decodeObjectForKey:@"CPTBarPlot.barOffset"]; barCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barCornerRadius"]; barBaseCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barBaseCornerRadius"]; - baseValue = [coder decodeDecimalForKey:@"CPTBarPlot.baseValue"]; + baseValue = [coder decodeObjectForKey:@"CPTBarPlot.baseValue"]; barsAreHorizontal = [coder decodeBoolForKey:@"CPTBarPlot.barsAreHorizontal"]; barBasesVary = [coder decodeBoolForKey:@"CPTBarPlot.barBasesVary"]; barWidthsAreInViewCoordinates = [coder decodeBoolForKey:@"CPTBarPlot.barWidthsAreInViewCoordinates"]; @@ -427,10 +408,10 @@ -(void)reloadPlotDataInIndexRange:(NSRange)indexRange NSDecimal delta = CPTDecimalFromInteger(1); if ( indexRange.length > 1 ) { - delta = CPTDecimalDivide( self.plotRange.length, CPTDecimalFromUnsignedInteger(indexRange.length - 1) ); + delta = CPTDecimalDivide( self.plotRange.lengthDecimal, CPTDecimalFromUnsignedInteger(indexRange.length - 1) ); } - NSDecimal locationDecimal = self.plotRange.location; + NSDecimal locationDecimal = self.plotRange.locationDecimal; NSDecimal *dataBytes = (NSDecimal *)locationData.mutableBytes; NSDecimal *dataEnd = dataBytes + indexRange.length; while ( dataBytes < dataEnd ) { @@ -603,8 +584,8 @@ -(CGFloat)lengthInView:(NSDecimal)decimalLength else { CPTCoordinate coordinate = (self.barsAreHorizontal ? CPTCoordinateY : CPTCoordinateX); CPTXYPlotSpace *thePlotSpace = (CPTXYPlotSpace *)self.plotSpace; - NSDecimal xLocation = thePlotSpace.xRange.location; - NSDecimal yLocation = thePlotSpace.yRange.location; + NSDecimal xLocation = thePlotSpace.xRange.locationDecimal; + NSDecimal yLocation = thePlotSpace.yRange.locationDecimal; NSDecimal originPlotPoint[2]; NSDecimal displacedPlotPoint[2]; @@ -713,10 +694,10 @@ -(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord switch ( coord ) { case CPTCoordinateX: if ( self.barsAreHorizontal ) { - NSDecimal base = self.baseValue; + NSDecimal base = self.baseValue.decimalValue; if ( ![range contains:base] ) { CPTMutablePlotRange *newRange = [range mutableCopy]; - [newRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:base length:CPTDecimalFromInteger(0)]]; + [newRange unionPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:base lengthDecimal:CPTDecimalFromInteger(0)]]; range = newRange; } } @@ -724,10 +705,10 @@ -(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord case CPTCoordinateY: if ( !self.barsAreHorizontal ) { - NSDecimal base = self.baseValue; + NSDecimal base = self.baseValue.decimalValue; if ( ![range contains:base] ) { CPTMutablePlotRange *newRange = [range mutableCopy]; - [newRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:base length:CPTDecimalFromInteger(0)]]; + [newRange unionPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:base lengthDecimal:CPTDecimalFromInteger(0)]]; range = newRange; } } @@ -762,22 +743,24 @@ -(CPTPlotRange *)plotRangeEnclosingBars range = [[self plotRangeForCoordinate:CPTCoordinateX] mutableCopy]; } - NSDecimal barOffsetLength = [self lengthInPlotCoordinates:self.barOffset]; - NSDecimal barWidthLength = [self lengthInPlotCoordinates:self.barWidth]; + NSDecimal barOffsetLength = [self lengthInPlotCoordinates:self.barOffset.decimalValue]; + NSDecimal barWidthLength = [self lengthInPlotCoordinates:self.barWidth.decimalValue]; NSDecimal halfBarWidth = CPTDecimalDivide( barWidthLength, CPTDecimalFromInteger(2) ); - NSDecimal rangeLocation = range.location; - NSDecimal rangeLength = range.length; + NSDecimal rangeLocation = range.locationDecimal; + NSDecimal rangeLength = range.lengthDecimal; if ( CPTDecimalGreaterThanOrEqualTo( rangeLength, CPTDecimalFromInteger(0) ) ) { - rangeLocation = CPTDecimalSubtract(rangeLocation, halfBarWidth); - range.location = CPTDecimalAdd(rangeLocation, barOffsetLength); - range.length = CPTDecimalAdd(rangeLength, barWidthLength); + rangeLocation = CPTDecimalSubtract(rangeLocation, halfBarWidth); + + range.locationDecimal = CPTDecimalAdd(rangeLocation, barOffsetLength); + range.lengthDecimal = CPTDecimalAdd(rangeLength, barWidthLength); } else { - rangeLocation = CPTDecimalAdd(rangeLocation, halfBarWidth); - range.location = CPTDecimalSubtract(rangeLocation, barOffsetLength); - range.length = CPTDecimalSubtract(rangeLength, barWidthLength); + rangeLocation = CPTDecimalAdd(rangeLocation, halfBarWidth); + + range.locationDecimal = CPTDecimalSubtract(rangeLocation, barOffsetLength); + range.lengthDecimal = CPTDecimalSubtract(rangeLength, barWidthLength); } return range; @@ -855,7 +838,7 @@ -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint: // Base point if ( !self.barBasesVary ) { - plotPoint[dependentCoord] = CPTDecimalDoubleValue(self.baseValue); + plotPoint[dependentCoord] = self.baseValue.doubleValue; } else { plotPoint[dependentCoord] = [self cachedDoubleForField:CPTBarPlotFieldBarBase recordIndex:idx]; @@ -881,7 +864,7 @@ -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint: // Base point if ( !self.barBasesVary ) { - plotPoint[dependentCoord] = self.baseValue; + plotPoint[dependentCoord] = self.baseValue.decimalValue; } else { plotPoint[dependentCoord] = [self cachedDecimalForField:CPTBarPlotFieldBarBase recordIndex:idx]; @@ -893,7 +876,7 @@ -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint: } // Determine bar width and offset. - CGFloat barOffsetLength = [self lengthInView:self.barOffset] * self.barOffsetScale; + CGFloat barOffsetLength = [self lengthInView:self.barOffset.decimalValue]; // Offset if ( horizontalBars ) { @@ -929,7 +912,7 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin // drawing a bar and for doing hit-testing on a click/touch event BOOL horizontalBars = self.barsAreHorizontal; - CGFloat barWidthLength = [self lengthInView:self.barWidth] * self.barWidthScale; + CGFloat barWidthLength = [self lengthInView:self.barWidth.decimalValue]; CGFloat halfBarWidth = CPTFloat(0.5) * barWidthLength; CGRect barRect; @@ -1047,7 +1030,7 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin -(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint { BOOL horizontalBars = self.barsAreHorizontal; - CGFloat barWidthLength = [self lengthInView:self.barWidth] * self.barWidthScale; + CGFloat barWidthLength = [self lengthInView:self.barWidth.decimalValue]; CGFloat halfBarWidth = CPTFloat(0.5) * barWidthLength; CPTPlotArea *thePlotArea = self.plotArea; @@ -1164,8 +1147,9 @@ +(BOOL)needsDisplayForKey:(NSString *)aKey dispatch_once(&onceToken, ^{ keys = [NSSet setWithArray:@[@"barCornerRadius", @"barBaseCornerRadius", - @"barOffsetScale", - @"barWidthScale"]]; + @"barOffset", + @"barWidth", + @"baseValue"]]; }); if ( [keys containsObject:aKey] ) { @@ -1188,7 +1172,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte NSDecimal theBaseDecimalValue; if ( !self.barBasesVary ) { - theBaseDecimalValue = self.baseValue; + theBaseDecimalValue = self.baseValue.decimalValue; } else { theBaseDecimalValue = [self cachedDecimalForField:CPTBarPlotFieldBarBase recordIndex:idx]; @@ -1201,17 +1185,17 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte BOOL horizontalBars = self.barsAreHorizontal; CPTCoordinate coordinate = (horizontalBars ? CPTCoordinateX : CPTCoordinateY); CPTPlotRange *lengthRange = [self.plotSpace plotRangeForCoordinate:coordinate]; - if ( CPTDecimalLessThan( lengthRange.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalLessThan( lengthRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { positiveDirection = !positiveDirection; } NSNumber *offsetLocation; if ( self.doublePrecisionCache ) { - offsetLocation = @([location doubleValue] + [self doubleLengthInPlotCoordinates:self.barOffset] * self.barOffsetScale); + offsetLocation = @(location.doubleValue + [self doubleLengthInPlotCoordinates:self.barOffset.decimalValue]); } else { NSDecimal decimalLocation = [location decimalValue]; - NSDecimal offset = CPTDecimalMultiply( [self lengthInPlotCoordinates:self.barOffset], CPTDecimalFromCGFloat(self.barOffsetScale) ); + NSDecimal offset = [self lengthInPlotCoordinates:self.barOffset.decimalValue]; offsetLocation = [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalAdd(decimalLocation, offset)]; } @@ -1557,40 +1541,23 @@ -(void)setFill:(CPTFill *)newFill } } --(void)setBarWidth:(NSDecimal)newBarWidth +-(void)setBarWidth:(NSNumber *)newBarWidth { - if ( NSDecimalCompare(&barWidth, &newBarWidth) != NSOrderedSame ) { + if ( ![barWidth isEqualToNumber:newBarWidth] ) { barWidth = newBarWidth; [self setNeedsDisplay]; } } --(void)setBarWidthScale:(CGFloat)newBarWidthScale +-(void)setBarOffset:(NSNumber *)newBarOffset { - if ( barWidthScale != newBarWidthScale ) { - barWidthScale = newBarWidthScale; - [self setNeedsDisplay]; - } -} - --(void)setBarOffset:(NSDecimal)newBarOffset -{ - if ( NSDecimalCompare(&barOffset, &newBarOffset) != NSOrderedSame ) { + if ( ![barOffset isEqualToNumber:newBarOffset] ) { barOffset = newBarOffset; [self setNeedsDisplay]; [self repositionAllLabelAnnotations]; } } --(void)setBarOffsetScale:(CGFloat)newBarOffsetScale -{ - if ( barOffsetScale != newBarOffsetScale ) { - barOffsetScale = newBarOffsetScale; - [self setNeedsDisplay]; - [self repositionAllLabelAnnotations]; - } -} - -(void)setBarCornerRadius:(CGFloat)newCornerRadius { if ( barCornerRadius != newCornerRadius ) { @@ -1609,9 +1576,9 @@ -(void)setBarBaseCornerRadius:(CGFloat)newCornerRadius } } --(void)setBaseValue:(NSDecimal)newBaseValue +-(void)setBaseValue:(NSNumber *)newBaseValue { - if ( !CPTDecimalEquals(baseValue, newBaseValue) ) { + if ( ![baseValue isEqualToNumber:newBaseValue] ) { baseValue = newBaseValue; [self setNeedsDisplay]; [self setNeedsLayout]; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 888147649..efb1b77e0 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -76,7 +76,7 @@ -(CPTPlotRange *)yRange CPTMutablePlotRange *range = [self plotRangeForData:self.yData]; if ( self.plots.count > 1 ) { - range.length = CPTDecimalAdd( [range length], CPTDecimalFromDouble(self.plots.count) ); + range.lengthDecimal = CPTDecimalAdd( range.lengthDecimal, CPTDecimalFromUnsignedInteger(self.plots.count) ); } return range; @@ -88,8 +88,8 @@ -(CPTMutablePlotRange *)plotRangeForData:(NSArray *)dataArray double max = [[dataArray valueForKeyPath:@"@max.doubleValue"] doubleValue]; double range = max - min; - return [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromDouble(min - 0.05 * range) - length:CPTDecimalFromDouble(range + 0.1 * range)]; + return [CPTMutablePlotRange plotRangeWithLocation:@(min - 0.05 * range) + length:@(range + 0.1 * range)]; } #pragma mark - diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index 9919ad10b..b4156aeb6 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -269,8 +269,8 @@ -(void)plotSpaceChanged NSUInteger numPoints = (NSUInteger)lrint( ( ceil( (cachedRange.minLimitDouble - minLimit) / step ) ) ); NSDecimal offset = CPTDecimalFromDouble(step * numPoints); - cachedRange.location = CPTDecimalSubtract(cachedRange.location, offset); - cachedRange.length = CPTDecimalAdd(cachedRange.length, offset); + cachedRange.locationDecimal = CPTDecimalSubtract(cachedRange.locationDecimal, offset); + cachedRange.lengthDecimal = CPTDecimalAdd(cachedRange.lengthDecimal, offset); self.dataCount += numPoints; @@ -282,7 +282,7 @@ -(void)plotSpaceChanged NSUInteger numPoints = (NSUInteger)lrint( ceil( (maxLimit - cachedRange.maxLimitDouble) / step ) ); NSDecimal offset = CPTDecimalFromDouble(step * numPoints); - cachedRange.length = CPTDecimalAdd(cachedRange.length, offset); + cachedRange.lengthDecimal = CPTDecimalAdd(cachedRange.lengthDecimal, offset); self.dataCount += numPoints; @@ -295,8 +295,8 @@ -(void)plotSpaceChanged NSUInteger numPoints = (NSUInteger)lrint( ceil( (cachedRange.maxLimitDouble - maxLimit) / step ) ); NSDecimal offset = CPTDecimalFromDouble(step * numPoints); - cachedRange.location = CPTDecimalSubtract(cachedRange.location, offset); - cachedRange.length = CPTDecimalAdd(cachedRange.length, offset); + cachedRange.locationDecimal = CPTDecimalSubtract(cachedRange.locationDecimal, offset); + cachedRange.lengthDecimal = CPTDecimalAdd(cachedRange.lengthDecimal, offset); self.dataCount += numPoints; @@ -308,7 +308,7 @@ -(void)plotSpaceChanged NSUInteger numPoints = (NSUInteger)lrint( ceil( (minLimit - cachedRange.minLimitDouble) / step ) ); NSDecimal offset = CPTDecimalFromDouble(step * numPoints); - cachedRange.length = CPTDecimalAdd(cachedRange.length, offset); + cachedRange.lengthDecimal = CPTDecimalAdd(cachedRange.lengthDecimal, offset); self.dataCount += numPoints; diff --git a/framework/Source/CPTMutablePlotRange.h b/framework/Source/CPTMutablePlotRange.h index ced244d08..0735717f7 100644 --- a/framework/Source/CPTMutablePlotRange.h +++ b/framework/Source/CPTMutablePlotRange.h @@ -4,8 +4,12 @@ /// @name Range Limits /// @{ -@property (nonatomic, readwrite) NSDecimal location; -@property (nonatomic, readwrite) NSDecimal length; +@property (nonatomic, readwrite, strong) NSNumber *location; +@property (nonatomic, readwrite, strong) NSNumber *length; +@property (nonatomic, readwrite) NSDecimal locationDecimal; +@property (nonatomic, readwrite) NSDecimal lengthDecimal; +@property (nonatomic, readwrite) double locationDouble; +@property (nonatomic, readwrite) double lengthDouble; /// @} /// @name Combining Ranges @@ -22,7 +26,7 @@ /// @name Expanding/Contracting Ranges /// @{ --(void)expandRangeByFactor:(NSDecimal)factor; +-(void)expandRangeByFactor:(NSNumber *)factor; /// @} @end diff --git a/framework/Source/CPTMutablePlotRange.m b/framework/Source/CPTMutablePlotRange.m index 4e139e3c6..3e54ebf41 100644 --- a/framework/Source/CPTMutablePlotRange.m +++ b/framework/Source/CPTMutablePlotRange.m @@ -2,6 +2,17 @@ #import "CPTUtilities.h" +/// @cond +@interface CPTMutablePlotRange() + +@property (nonatomic, readwrite) BOOL inValueUpdate; + +@end + +/// @endcond + +#pragma mark - + /** @brief Defines a mutable range of plot data. * * If you need to change the plot range, you should use this class rather than the @@ -10,16 +21,44 @@ **/ @implementation CPTMutablePlotRange -/** @property location +/** @property NSNumber *location * @brief The starting value of the range. + * @see @ref locationDecimal, @ref locationDouble **/ @dynamic location; -/** @property length +/** @property NSNumber *length * @brief The length of the range. + * @see @ref lengthDecimal, @ref lengthDouble **/ @dynamic length; +/** @property NSDecimal locationDecimal + * @brief The starting value of the range. + * @see @ref location, @ref locationDouble + **/ +@dynamic locationDecimal; + +/** @property NSDecimal lengthDecimal + * @brief The length of the range. + * @see @ref length, @ref lengthDouble + **/ +@dynamic lengthDecimal; + +/** @property double locationDouble + * @brief The starting value of the range as a @double. + * @see @ref location, @ref locationDecimal + **/ +@dynamic locationDouble; + +/** @property double lengthDouble + * @brief The length of the range as a @double. + * @see @ref length, @ref lengthDecimal + **/ +@dynamic lengthDouble; + +@dynamic inValueUpdate; + #pragma mark - #pragma mark Combining ranges @@ -32,16 +71,16 @@ -(void)unionPlotRange:(CPTPlotRange *)other return; } - NSDecimal min1 = self.minLimit; - NSDecimal min2 = other.minLimit; + NSDecimal min1 = self.minLimitDecimal; + NSDecimal min2 = other.minLimitDecimal; NSDecimal minimum = CPTDecimalLessThan(min1, min2) ? min1 : min2; - NSDecimal max1 = self.maxLimit; - NSDecimal max2 = other.maxLimit; + NSDecimal max1 = self.maxLimitDecimal; + NSDecimal max2 = other.maxLimitDecimal; NSDecimal maximum = CPTDecimalGreaterThan(max1, max2) ? max1 : max2; NSDecimal newLocation, newLength; - if ( CPTDecimalGreaterThanOrEqualTo( self.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalGreaterThanOrEqualTo( self.lengthDecimal, CPTDecimalFromInteger(0) ) ) { newLocation = minimum; newLength = CPTDecimalSubtract(maximum, minimum); } @@ -50,8 +89,8 @@ -(void)unionPlotRange:(CPTPlotRange *)other newLength = CPTDecimalSubtract(minimum, maximum); } - self.location = newLocation; - self.length = newLength; + self.locationDecimal = newLocation; + self.lengthDecimal = newLength; } /** @brief Sets the messaged object to the intersection with another range. The sign of @ref length is unchanged. @@ -63,17 +102,17 @@ -(void)intersectionPlotRange:(CPTPlotRange *)other return; } - NSDecimal min1 = self.minLimit; - NSDecimal min2 = other.minLimit; + NSDecimal min1 = self.minLimitDecimal; + NSDecimal min2 = other.minLimitDecimal; NSDecimal minimum = CPTDecimalGreaterThan(min1, min2) ? min1 : min2; - NSDecimal max1 = self.maxLimit; - NSDecimal max2 = other.maxLimit; + NSDecimal max1 = self.maxLimitDecimal; + NSDecimal max2 = other.maxLimitDecimal; NSDecimal maximum = CPTDecimalLessThan(max1, max2) ? max1 : max2; if ( CPTDecimalGreaterThanOrEqualTo(maximum, minimum) ) { NSDecimal newLocation, newLength; - if ( CPTDecimalGreaterThanOrEqualTo( self.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalGreaterThanOrEqualTo( self.lengthDecimal, CPTDecimalFromInteger(0) ) ) { newLocation = minimum; newLength = CPTDecimalSubtract(maximum, minimum); } @@ -82,11 +121,11 @@ -(void)intersectionPlotRange:(CPTPlotRange *)other newLength = CPTDecimalSubtract(minimum, maximum); } - self.location = newLocation; - self.length = newLength; + self.locationDecimal = newLocation; + self.lengthDecimal = newLength; } else { - self.length = CPTDecimalFromInteger(0); + self.lengthDecimal = CPTDecimalFromInteger(0); } } @@ -97,15 +136,15 @@ -(void)intersectionPlotRange:(CPTPlotRange *)other * @param factor Factor used. A value of @num{1.0} gives no change. * Less than @num{1.0} is a contraction, and greater than @num{1.0} is expansion. **/ --(void)expandRangeByFactor:(NSDecimal)factor +-(void)expandRangeByFactor:(NSNumber *)factor { - NSDecimal oldLength = self.length; - NSDecimal newLength = CPTDecimalMultiply(oldLength, factor); + NSDecimal oldLength = self.lengthDecimal; + NSDecimal newLength = CPTDecimalMultiply(oldLength, factor.decimalValue); NSDecimal locationOffset = CPTDecimalDivide( CPTDecimalSubtract(oldLength, newLength), CPTDecimalFromInteger(2) ); - NSDecimal newLocation = CPTDecimalAdd(self.location, locationOffset); + NSDecimal newLocation = CPTDecimalAdd(self.locationDecimal, locationOffset); - self.location = newLocation; - self.length = newLength; + self.locationDecimal = newLocation; + self.lengthDecimal = newLength; } #pragma mark - @@ -119,13 +158,13 @@ -(void)shiftLocationToFitInRange:(CPTPlotRange *)otherRange { NSParameterAssert(otherRange); - switch ( [otherRange compareToNumber:[NSDecimalNumber decimalNumberWithDecimal:self.location]] ) { + switch ( [otherRange compareToDecimal:self.locationDecimal] ) { case CPTPlotRangeComparisonResultNumberBelowRange: - self.location = otherRange.minLimit; + self.locationDecimal = otherRange.minLimitDecimal; break; case CPTPlotRangeComparisonResultNumberAboveRange: - self.location = otherRange.maxLimit; + self.locationDecimal = otherRange.maxLimitDecimal; break; default: @@ -142,13 +181,13 @@ -(void)shiftEndToFitInRange:(CPTPlotRange *)otherRange { NSParameterAssert(otherRange); - switch ( [otherRange compareToNumber:[NSDecimalNumber decimalNumberWithDecimal:self.end]] ) { + switch ( [otherRange compareToDecimal:self.endDecimal] ) { case CPTPlotRangeComparisonResultNumberBelowRange: - self.location = CPTDecimalSubtract(otherRange.minLimit, self.length); + self.locationDecimal = CPTDecimalSubtract(otherRange.minLimitDecimal, self.lengthDecimal); break; case CPTPlotRangeComparisonResultNumberAboveRange: - self.location = CPTDecimalSubtract(otherRange.maxLimit, self.length); + self.locationDecimal = CPTDecimalSubtract(otherRange.maxLimitDecimal, self.lengthDecimal); break; default: @@ -157,4 +196,31 @@ -(void)shiftEndToFitInRange:(CPTPlotRange *)otherRange } } +#pragma mark - +#pragma mark Accessors + +/// @cond + +-(void)setLocation:(NSNumber *)newLocation +{ + self.inValueUpdate = YES; + + self.locationDecimal = newLocation.decimalValue; + self.locationDouble = newLocation.doubleValue; + + self.inValueUpdate = NO; +} + +-(void)setLength:(NSNumber *)newLength +{ + self.inValueUpdate = YES; + + self.lengthDecimal = newLength.decimalValue; + self.lengthDouble = newLength.doubleValue; + + self.inValueUpdate = NO; +} + +/// @endcond + @end diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index bd224917e..8b02bf8f1 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -1407,7 +1407,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum vDSP_maxvD(doubles, 1, &max, (vDSP_Length)numberOfSamples); if ( max >= min ) { - range = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(min) length:CPTDecimalFromDouble(max - min)]; + range = [CPTPlotRange plotRangeWithLocation:@(min) length:@(max - min)]; } } else { @@ -1430,7 +1430,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum } if ( CPTDecimalGreaterThanOrEqualTo(max, min) ) { - range = [CPTPlotRange plotRangeWithLocation:min length:CPTDecimalSubtract(max, min)]; + range = [CPTPlotRange plotRangeWithLocationDecimal:min lengthDecimal:CPTDecimalSubtract(max, min)]; } } } diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index 9abc34e8a..e25169b4e 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -15,16 +15,22 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { /// @name Range Limits /// @{ -@property (nonatomic, readonly) NSDecimal location; -@property (nonatomic, readonly) NSDecimal length; -@property (nonatomic, readonly) NSDecimal end; +@property (nonatomic, readonly, strong) NSNumber *location; +@property (nonatomic, readonly, strong) NSNumber *length; +@property (nonatomic, readonly, strong) NSNumber *end; +@property (nonatomic, readonly) NSDecimal locationDecimal; +@property (nonatomic, readonly) NSDecimal lengthDecimal; +@property (nonatomic, readonly) NSDecimal endDecimal; @property (nonatomic, readonly) double locationDouble; @property (nonatomic, readonly) double lengthDouble; @property (nonatomic, readonly) double endDouble; -@property (nonatomic, readonly) NSDecimal minLimit; -@property (nonatomic, readonly) NSDecimal midPoint; -@property (nonatomic, readonly) NSDecimal maxLimit; +@property (nonatomic, readonly, strong) NSNumber *minLimit; +@property (nonatomic, readonly, strong) NSNumber *midPoint; +@property (nonatomic, readonly, strong) NSNumber *maxLimit; +@property (nonatomic, readonly) NSDecimal minLimitDecimal; +@property (nonatomic, readonly) NSDecimal midPointDecimal; +@property (nonatomic, readonly) NSDecimal maxLimitDecimal; @property (nonatomic, readonly) double minLimitDouble; @property (nonatomic, readonly) double midPointDouble; @property (nonatomic, readonly) double maxLimitDouble; @@ -32,12 +38,14 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { /// @name Factory Methods /// @{ -+(instancetype)plotRangeWithLocation:(NSDecimal)loc length:(NSDecimal)len; ++(instancetype)plotRangeWithLocation:(NSNumber *)loc length:(NSNumber *)len; ++(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len; /// @} /// @name Initialization /// @{ --(instancetype)initWithLocation:(NSDecimal)loc length:(NSDecimal)len; +-(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len; +-(instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len; /// @} /// @name Checking Ranges diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index b7650e42a..57fa543b7 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -7,46 +7,67 @@ /// @cond @interface CPTPlotRange() -@property (nonatomic, readwrite) NSDecimal location; -@property (nonatomic, readwrite) NSDecimal length; +@property (nonatomic, readwrite) NSDecimal locationDecimal; +@property (nonatomic, readwrite) NSDecimal lengthDecimal; @property (nonatomic, readwrite) double locationDouble; @property (nonatomic, readwrite) double lengthDouble; +@property (nonatomic, readwrite) BOOL inValueUpdate; + @end /// @endcond +#pragma mark - + /** * @brief Defines an immutable range of plot data. **/ @implementation CPTPlotRange -/** @property NSDecimal location +/** @property NSNumber *location * @brief The starting value of the range. - * @see locationDouble + * @see @ref locationDecimal, @ref locationDouble **/ -@synthesize location; +@dynamic location; -/** @property NSDecimal length +/** @property NSNumber *length * @brief The length of the range. - * @see lengthDouble + * @see @ref lengthDecimal, @ref lengthDouble **/ -@synthesize length; +@dynamic length; -/** @property NSDecimal end; +/** @property NSNumber *end; * @brief The ending value of the range, equivalent to @ref location + @ref length. **/ @dynamic end; +/** @property NSDecimal locationDecimal + * @brief The starting value of the range. + * @see @ref location, @ref locationDouble + **/ +@synthesize locationDecimal; + +/** @property NSDecimal lengthDecimal + * @brief The length of the range. + * @see @ref length, @ref lengthDouble + **/ +@synthesize lengthDecimal; + +/** @property NSDecimal endDecimal; + * @brief The ending value of the range, equivalent to @ref locationDecimal + @ref lengthDecimal. + **/ +@dynamic endDecimal; + /** @property double locationDouble * @brief The starting value of the range as a @double. - * @see location + * @see @ref location, @ref locationDecimal **/ @synthesize locationDouble; /** @property double lengthDouble * @brief The length of the range as a @double. - * @see length + * @see @ref length, @ref lengthDecimal **/ @synthesize lengthDouble; @@ -55,36 +76,53 @@ @implementation CPTPlotRange **/ @dynamic endDouble; -/** @property NSDecimal minLimit +/** @property NSNumber *minLimit * @brief The minimum extreme value of the range. **/ @dynamic minLimit; +/** @property NSDecimal minLimitDecimal + * @brief The minimum extreme value of the range. + **/ +@dynamic minLimitDecimal; + /** @property double minLimitDouble * @brief The minimum extreme value of the range as a @double. **/ @dynamic minLimitDouble; -/** @property NSDecimal midPoint +/** @property NSNumber *midPoint * @brief The middle value of the range. **/ @dynamic midPoint; +/** @property NSDecimal midPointDecimal + * @brief The middle value of the range. + **/ +@dynamic midPointDecimal; + /** @property double midPointDouble * @brief The middle value of the range as a @double. **/ @dynamic midPointDouble; -/** @property NSDecimal maxLimit +/** @property NSNumber *maxLimit * @brief The maximum extreme value of the range. **/ @dynamic maxLimit; +/** @property NSDecimal maxLimitDecimal + * @brief The maximum extreme value of the range. + **/ +@dynamic maxLimitDecimal; + /** @property double maxLimitDouble * @brief The maximum extreme value of the range as a @double. **/ @dynamic maxLimitDouble; +@synthesize inValueUpdate; + #pragma mark - #pragma mark Init/Dealloc @@ -93,21 +131,52 @@ @implementation CPTPlotRange * @param len The length of the range. * @return A new CPTPlotRange instance initialized with the provided location and length. **/ -+(instancetype)plotRangeWithLocation:(NSDecimal)loc length:(NSDecimal)len ++(instancetype)plotRangeWithLocation:(NSNumber *)loc length:(NSNumber *)len { return [[self alloc] initWithLocation:loc length:len]; } +/** @brief Creates and returns a new CPTPlotRange instance initialized with the provided location and length. + * @param loc The starting location of the range. + * @param len The length of the range. + * @return A new CPTPlotRange instance initialized with the provided location and length. + **/ ++(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len +{ + return [[self alloc] initWithLocationDecimal:loc lengthDecimal:len]; +} + +/** @brief Initializes a newly allocated CPTPlotRange object with the provided location and length. + * @param loc The starting location of the range. + * @param len The length of the range. + * @return The initialized CPTPlotRange object. + **/ +-(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len +{ + if ( (self = [super init]) ) { + self.inValueUpdate = YES; + + self.locationDecimal = loc.decimalValue; + self.locationDouble = loc.doubleValue; + + self.lengthDecimal = len.decimalValue; + self.lengthDouble = len.doubleValue; + + self.inValueUpdate = NO; + } + return self; +} + /** @brief Initializes a newly allocated CPTPlotRange object with the provided location and length. * @param loc The starting location of the range. * @param len The length of the range. * @return The initialized CPTPlotRange object. **/ --(instancetype)initWithLocation:(NSDecimal)loc length:(NSDecimal)len +-(instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len { if ( (self = [super init]) ) { - self.location = loc; - self.length = len; + self.locationDecimal = loc; + self.lengthDecimal = len; } return self; } @@ -125,9 +194,7 @@ -(instancetype)initWithLocation:(NSDecimal)loc length:(NSDecimal)len **/ -(instancetype)init { - NSDecimal zero = CPTDecimalFromInteger(0); - - return [self initWithLocation:zero length:zero]; + return [self initWithLocation:@0.0 length:@0.0]; } /// @} @@ -137,25 +204,68 @@ -(instancetype)init /// @cond --(void)setLocation:(NSDecimal)newLocation +-(NSNumber *)location +{ + return [NSDecimalNumber decimalNumberWithDecimal:self.locationDecimal]; +} + +-(void)setLocationDecimal:(NSDecimal)newLocation { - if ( !CPTDecimalEquals(location, newLocation) ) { - location = newLocation; - self.locationDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLocation] doubleValue]; + if ( !CPTDecimalEquals(locationDecimal, newLocation) ) { + locationDecimal = newLocation; + + if ( !self.inValueUpdate ) { + self.locationDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLocation] doubleValue]; + } } } --(void)setLength:(NSDecimal)newLength +-(void)setLocationDouble:(double)newLocation { - if ( !CPTDecimalEquals(length, newLength) ) { - length = newLength; - self.lengthDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLength] doubleValue]; + if ( locationDouble != newLocation ) { + locationDouble = newLocation; + + if ( !self.inValueUpdate ) { + self.locationDecimal = @(newLocation).decimalValue; + } } } --(NSDecimal)end +-(NSNumber *)length { - return CPTDecimalAdd(self.location, self.length); + return [NSDecimalNumber decimalNumberWithDecimal:self.lengthDecimal]; +} + +-(void)setLengthDecimal:(NSDecimal)newLength +{ + if ( !CPTDecimalEquals(lengthDecimal, newLength) ) { + lengthDecimal = newLength; + + if ( !self.inValueUpdate ) { + self.lengthDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLength] doubleValue]; + } + } +} + +-(void)setLengthDouble:(double)newLength +{ + if ( lengthDouble != newLength ) { + lengthDouble = newLength; + + if ( !self.inValueUpdate ) { + self.lengthDecimal = @(newLength).decimalValue; + } + } +} + +-(NSNumber *)end +{ + return [NSDecimalNumber decimalNumberWithDecimal:self.endDecimal]; +} + +-(NSDecimal)endDecimal +{ + return CPTDecimalAdd(self.locationDecimal, self.lengthDecimal); } -(double)endDouble @@ -163,10 +273,15 @@ -(double)endDouble return self.locationDouble + self.lengthDouble; } --(NSDecimal)minLimit +-(NSNumber *)minLimit { - NSDecimal loc = self.location; - NSDecimal len = self.length; + return [NSDecimalNumber decimalNumberWithDecimal:self.minLimitDecimal]; +} + +-(NSDecimal)minLimitDecimal +{ + NSDecimal loc = self.locationDecimal; + NSDecimal len = self.lengthDecimal; if ( CPTDecimalLessThan( len, CPTDecimalFromInteger(0) ) ) { return CPTDecimalAdd(loc, len); @@ -189,9 +304,14 @@ -(double)minLimitDouble } } --(NSDecimal)midPoint +-(NSNumber *)midPoint { - return CPTDecimalAdd( self.location, CPTDecimalDivide( self.length, CPTDecimalFromInteger(2) ) ); + return [NSDecimalNumber decimalNumberWithDecimal:self.midPointDecimal]; +} + +-(NSDecimal)midPointDecimal +{ + return CPTDecimalAdd( self.locationDecimal, CPTDecimalDivide( self.lengthDecimal, CPTDecimalFromInteger(2) ) ); } -(double)midPointDouble @@ -199,10 +319,15 @@ -(double)midPointDouble return fma(self.lengthDouble, 0.5, self.locationDouble); } --(NSDecimal)maxLimit +-(NSNumber *)maxLimit +{ + return [NSDecimalNumber decimalNumberWithDecimal:self.maxLimitDecimal]; +} + +-(NSDecimal)maxLimitDecimal { - NSDecimal loc = self.location; - NSDecimal len = self.length; + NSDecimal loc = self.locationDecimal; + NSDecimal len = self.lengthDecimal; if ( CPTDecimalGreaterThan( len, CPTDecimalFromInteger(0) ) ) { return CPTDecimalAdd(loc, len); @@ -237,10 +362,10 @@ -(id)copyWithZone:(NSZone *)zone CPTPlotRange *newRange = [[CPTPlotRange allocWithZone:zone] init]; if ( newRange ) { - newRange.location = self.location; - newRange.length = self.length; - newRange.locationDouble = self.locationDouble; - newRange.lengthDouble = self.lengthDouble; + newRange.locationDecimal = self.locationDecimal; + newRange.lengthDecimal = self.lengthDecimal; + newRange.locationDouble = self.locationDouble; + newRange.lengthDouble = self.lengthDouble; } return newRange; } @@ -257,10 +382,10 @@ -(id)mutableCopyWithZone:(NSZone *)zone CPTPlotRange *newRange = [[CPTMutablePlotRange allocWithZone:zone] init]; if ( newRange ) { - newRange.location = self.location; - newRange.length = self.length; - newRange.locationDouble = self.locationDouble; - newRange.lengthDouble = self.lengthDouble; + newRange.locationDecimal = self.locationDecimal; + newRange.lengthDecimal = self.lengthDecimal; + newRange.locationDouble = self.locationDouble; + newRange.lengthDouble = self.lengthDouble; } return newRange; } @@ -274,15 +399,15 @@ -(id)mutableCopyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)encoder { - [encoder encodeDecimal:self.location forKey:@"CPTPlotRange.location"]; - [encoder encodeDecimal:self.length forKey:@"CPTPlotRange.length"]; + [encoder encodeDecimal:self.locationDecimal forKey:@"CPTPlotRange.location"]; + [encoder encodeDecimal:self.lengthDecimal forKey:@"CPTPlotRange.length"]; } -(instancetype)initWithCoder:(NSCoder *)decoder { if ( (self = [super init]) ) { - self.location = [decoder decodeDecimalForKey:@"CPTPlotRange.location"]; - self.length = [decoder decodeDecimalForKey:@"CPTPlotRange.length"]; + self.locationDecimal = [decoder decodeDecimalForKey:@"CPTPlotRange.location"]; + self.lengthDecimal = [decoder decodeDecimalForKey:@"CPTPlotRange.length"]; } return self; @@ -299,7 +424,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder **/ -(BOOL)contains:(NSDecimal)number { - return CPTDecimalGreaterThanOrEqualTo(number, self.minLimit) && CPTDecimalLessThanOrEqualTo(number, self.maxLimit); + return CPTDecimalGreaterThanOrEqualTo(number, self.minLimitDecimal) && CPTDecimalLessThanOrEqualTo(number, self.maxLimitDecimal); } /** @brief Determines whether a given number is inside the range. @@ -319,7 +444,7 @@ -(BOOL)containsNumber:(NSNumber *)number { if ( [number isKindOfClass:[NSDecimalNumber class]] ) { NSDecimal numericValue = number.decimalValue; - return CPTDecimalGreaterThanOrEqualTo(numericValue, self.minLimit) && CPTDecimalLessThanOrEqualTo(numericValue, self.maxLimit); + return CPTDecimalGreaterThanOrEqualTo(numericValue, self.minLimitDecimal) && CPTDecimalLessThanOrEqualTo(numericValue, self.maxLimitDecimal); } else { double numericValue = number.doubleValue; @@ -334,7 +459,7 @@ -(BOOL)containsNumber:(NSNumber *)number -(BOOL)isEqualToRange:(CPTPlotRange *)otherRange { if ( otherRange ) { - return CPTDecimalEquals(self.location, otherRange.location) && CPTDecimalEquals(self.length, otherRange.length); + return CPTDecimalEquals(self.locationDecimal, otherRange.locationDecimal) && CPTDecimalEquals(self.lengthDecimal, otherRange.lengthDecimal); } else { return NO; @@ -348,7 +473,7 @@ -(BOOL)isEqualToRange:(CPTPlotRange *)otherRange -(BOOL)containsRange:(CPTPlotRange *)otherRange { if ( otherRange ) { - return CPTDecimalGreaterThanOrEqualTo(otherRange.minLimit, self.minLimit) && CPTDecimalLessThanOrEqualTo(otherRange.maxLimit, self.maxLimit); + return CPTDecimalGreaterThanOrEqualTo(otherRange.minLimitDecimal, self.minLimitDecimal) && CPTDecimalLessThanOrEqualTo(otherRange.maxLimitDecimal, self.maxLimitDecimal); } else { return NO; @@ -365,12 +490,12 @@ -(BOOL)intersectsRange:(CPTPlotRange *)otherRange return NO; } - NSDecimal min1 = self.minLimit; - NSDecimal min2 = otherRange.minLimit; + NSDecimal min1 = self.minLimitDecimal; + NSDecimal min2 = otherRange.minLimitDecimal; NSDecimal minimum = CPTDecimalGreaterThan(min1, min2) ? min1 : min2; - NSDecimal max1 = self.maxLimit; - NSDecimal max2 = otherRange.maxLimit; + NSDecimal max1 = self.maxLimitDecimal; + NSDecimal max2 = otherRange.maxLimitDecimal; NSDecimal maximum = CPTDecimalLessThan(max1, max2) ? max1 : max2; return CPTDecimalGreaterThanOrEqualTo(maximum, minimum); @@ -404,7 +529,7 @@ -(CPTPlotRangeComparisonResult)compareToDecimal:(NSDecimal)number if ( [self contains:number] ) { result = CPTPlotRangeComparisonResultNumberInRange; } - else if ( CPTDecimalLessThan(number, self.minLimit) ) { + else if ( CPTDecimalLessThan(number, self.minLimitDecimal) ) { result = CPTPlotRangeComparisonResultNumberBelowRange; } else { @@ -453,8 +578,8 @@ -(BOOL)isEqual:(id)object -(NSUInteger)hash { - NSDecimalNumber *locationNumber = [NSDecimalNumber decimalNumberWithDecimal:self.location]; - NSDecimalNumber *lengthNumber = [NSDecimalNumber decimalNumberWithDecimal:self.length]; + NSDecimalNumber *locationNumber = [NSDecimalNumber decimalNumberWithDecimal:self.locationDecimal]; + NSDecimalNumber *lengthNumber = [NSDecimalNumber decimalNumberWithDecimal:self.lengthDecimal]; return locationNumber.hash + lengthNumber.hash; } @@ -468,8 +593,8 @@ -(NSUInteger)hash -(NSString *)description { - NSDecimal myLocation = self.location; - NSDecimal myLength = self.length; + NSDecimal myLocation = self.locationDecimal; + NSDecimal myLength = self.lengthDecimal; return [NSString stringWithFormat:@"<%@ {%@, %@}>", [super description], diff --git a/framework/Source/CPTPlotRangeTests.m b/framework/Source/CPTPlotRangeTests.m index 896e5648d..304405f39 100644 --- a/framework/Source/CPTPlotRangeTests.m +++ b/framework/Source/CPTPlotRangeTests.m @@ -17,7 +17,7 @@ @implementation CPTPlotRangeTests -(void)setUp { - self.plotRange = [CPTMutablePlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(2.0)]; + self.plotRange = [CPTMutablePlotRange plotRangeWithLocation:@1.0 length:@2.0]; } -(void)tearDown @@ -39,7 +39,7 @@ -(void)testContains -(void)testContainsNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; XCTAssertFalse([self.plotRange contains:CPTDecimalFromDouble(-1.001)], @"Test contains:-1.001"); XCTAssertTrue([self.plotRange contains:CPTDecimalFromDouble(-1.0)], @"Test contains:-1.0"); @@ -68,7 +68,7 @@ -(void)testContainsNumber -(void)testContainsDoubleNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; XCTAssertFalse([self.plotRange containsDouble:-1.001], @"Test contains:-1.001"); XCTAssertTrue([self.plotRange containsDouble:-1.0], @"Test contains:-1.0"); @@ -79,20 +79,20 @@ -(void)testContainsDoubleNegative -(void)testContainsRange { - CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]; + CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]; XCTAssertFalse([self.plotRange containsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(2.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; XCTAssertTrue([self.plotRange containsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) length:CPTDecimalFromDouble(1.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@2.0 length:@1.0]; XCTAssertTrue([self.plotRange containsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) length:CPTDecimalFromDouble(4.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@2.0 length:@4.0]; XCTAssertFalse([self.plotRange containsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(2.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@2.0]; XCTAssertFalse([self.plotRange containsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); } @@ -101,45 +101,45 @@ -(void)testContainsRange -(void)testUnionRange { - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:0.0 length:4.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:-1.0 length:5.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:-1.0 length:8.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:-4.0 length:11.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:-5.0 length:12.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:-5.0 length:12.0]; } -(void)testUnionRangeNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:4.0 length:-5.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:4.0 length:-5.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:7.0 length:-8.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:7.0 length:-11.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:7.0 length:-12.0]; - [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange unionPlotRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:7.0 length:-12.0]; } @@ -148,18 +148,18 @@ -(void)testUnionRangeNegative -(void)testIntersectRange { - CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]; + CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:2.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(1.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@1.0]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]; XCTAssertFalse([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:0.0]; @@ -167,18 +167,18 @@ -(void)testIntersectRange -(void)testIntersectRange2 { - CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(4.0) length:CPTDecimalFromDouble(-4.0)]; + CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:@4.0 length:@(-4.0)]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:2.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) length:CPTDecimalFromDouble(-1.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@2.0 length:@(-1.0)]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]; XCTAssertFalse([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:0.0]; @@ -186,19 +186,19 @@ -(void)testIntersectRange2 -(void)testIntersectRangeNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]; + CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:-1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(1.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@1.0]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:-1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]; XCTAssertFalse([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:1.0 length:0.0]; @@ -206,19 +206,19 @@ -(void)testIntersectRangeNegative -(void)testIntersectRangeNegative2 { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]; + CPTPlotRange *otherRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:0.0 length:-1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) length:CPTDecimalFromDouble(-4.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@2.0 length:@(-4.0)]; XCTAssertTrue([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:0.0 length:-1.0]; - otherRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]; + otherRange = [CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]; XCTAssertFalse([self.plotRange intersectsRange:otherRange], @"otherRange was {%g, %g}", otherRange.locationDouble, otherRange.lengthDouble); [self.plotRange intersectionPlotRange:otherRange]; [self checkRangeWithLocation:0.0 length:0.0]; @@ -229,89 +229,89 @@ -(void)testIntersectRangeNegative2 -(void)testShiftLocation { - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:1.0 length:2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:0.0 length:2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:5.0 length:2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:0.0 length:2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:-1.0 length:2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:1.0 length:2.0]; } -(void)testShiftLocationNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:1.0 length:-2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:0.0 length:-2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:5.0 length:-2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:0.0 length:-2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:-1.0 length:-2.0]; - [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftLocationToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:1.0 length:-2.0]; } -(void)testShiftEnd { - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:1.0 length:2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:-2.0 length:2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:3.0 length:2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:-2.0 length:2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:-3.0 length:2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:-1.0 length:2.0]; } -(void)testShiftEndNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]]; [self checkRangeWithLocation:2.0 length:-2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]]; [self checkRangeWithLocation:2.0 length:-2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(2.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@2.0]]; [self checkRangeWithLocation:7.0 length:-2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@0.0 length:@(-4.0)]]; [self checkRangeWithLocation:2.0 length:-2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@(-1.0) length:@(-4.0)]]; [self checkRangeWithLocation:1.0 length:-2.0]; - [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.0) length:CPTDecimalFromDouble(-4.0)]]; + [self.plotRange shiftEndToFitInRange:[CPTPlotRange plotRangeWithLocation:@5.0 length:@(-4.0)]]; [self checkRangeWithLocation:3.0 length:-2.0]; } @@ -320,43 +320,43 @@ -(void)testShiftEndNegative -(void)testExpandRangeHalf { - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(0.5)]; + [self.plotRange expandRangeByFactor:@0.5]; [self checkRangeWithLocation:1.5 length:1.0]; } -(void)testExpandRangeSame { - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(1.0)]; + [self.plotRange expandRangeByFactor:@1.0]; [self checkRangeWithLocation:1.0 length:2.0]; } -(void)testExpandRangeDouble { - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(2.0)]; + [self.plotRange expandRangeByFactor:@2.0]; [self checkRangeWithLocation:0.0 length:4.0]; } -(void)testExpandRangeHalfNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(0.5)]; + [self.plotRange expandRangeByFactor:@0.5]; [self checkRangeWithLocation:0.5 length:-1.0]; } -(void)testExpandRangeSameNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(1.0)]; + [self.plotRange expandRangeByFactor:@1.0]; [self checkRangeWithLocation:1.0 length:-2.0]; } -(void)testExpandRangeDoubleNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; - [self.plotRange expandRangeByFactor:CPTDecimalFromDouble(2.0)]; + [self.plotRange expandRangeByFactor:@2.0]; [self checkRangeWithLocation:2.0 length:-4.0]; } @@ -374,7 +374,7 @@ -(void)testCompareToDecimal -(void)testCompareToDecimalNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; XCTAssertEqual([self.plotRange compareToDecimal:CPTDecimalFromDouble(-1.001)], CPTPlotRangeComparisonResultNumberBelowRange, @"Test compareTo:-1.001"); XCTAssertEqual([self.plotRange compareToDecimal:CPTDecimalFromDouble(-1.0)], CPTPlotRangeComparisonResultNumberInRange, @"Test compareTo:-1.0"); @@ -394,7 +394,7 @@ -(void)testCompareToDouble -(void)testCompareToDoubleNegative { - self.plotRange.length = CPTDecimalFromDouble(-2.0); + self.plotRange.lengthDouble = -2.0; XCTAssertEqual([self.plotRange compareToDouble:-1.001], CPTPlotRangeComparisonResultNumberBelowRange, @"Test compareTo:-1.001"); XCTAssertEqual([self.plotRange compareToDouble:-1.0], CPTPlotRangeComparisonResultNumberInRange, @"Test compareTo:-1.0"); @@ -420,12 +420,12 @@ -(void)checkRangeWithLocation:(double)loc length:(double)len { NSString *errMessage; - NSDecimal newLocation = self.plotRange.location; + NSDecimal newLocation = self.plotRange.locationDecimal; errMessage = [NSString stringWithFormat:@"expected location = %g, was %@", loc, NSDecimalString(&newLocation, nil)]; XCTAssertTrue(CPTDecimalEquals( newLocation, CPTDecimalFromDouble(loc) ), @"%@", errMessage); - NSDecimal newLength = self.plotRange.length; + NSDecimal newLength = self.plotRange.lengthDecimal; errMessage = [NSString stringWithFormat:@"expected location = %g, was %@", loc, NSDecimalString(&newLength, nil)]; XCTAssertTrue(CPTDecimalEquals( newLength, CPTDecimalFromDouble(len) ), @"%@", errMessage); } diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index dcbfa3056..e533fc19b 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -608,7 +608,7 @@ -(void)scaleToFitPlots:(NSArray *)plots forCoordinate:(CPTCoordinate)coordinate // Set range if ( unionRange ) { - if ( CPTDecimalEquals( unionRange.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalEquals( unionRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { [unionRange unionPlotRange:[self plotRangeForCoordinate:coordinate]]; } [self setPlotRange:unionRange forCoordinate:coordinate]; diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 6b8759414..ab060b40a 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -998,7 +998,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte BOOL positiveDirection = YES; CPTPlotRange *yRange = [self.plotSpace plotRangeForCoordinate:CPTCoordinateY]; - if ( CPTDecimalLessThan( yRange.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalLessThan( yRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { positiveDirection = !positiveDirection; } diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 8471b4011..38b851fd8 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -220,8 +220,8 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { /// @name Appearance /// @{ -@property (nonatomic, readwrite) NSDecimal areaBaseValue; -@property (nonatomic, readwrite) NSDecimal areaBaseValue2; +@property (nonatomic, readwrite, strong) NSNumber *areaBaseValue; +@property (nonatomic, readwrite, strong) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; /// @} diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index cc72d862b..a588e1fb8 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -102,19 +102,23 @@ @implementation CPTScatterPlot **/ @synthesize areaFill2; -/** @property NSDecimal areaBaseValue +/** @property NSNumber *areaBaseValue * @brief The Y coordinate of the straight boundary of the area fill. * If not a number, the area is not filled. * * Typically set to the minimum value of the Y range, but it can be any value that gives the desired appearance. + * + * @ingroup plotBindingsScatterPlot **/ @synthesize areaBaseValue; -/** @property NSDecimal areaBaseValue2 +/** @property NSNumber *areaBaseValue2 * @brief The Y coordinate of the straight boundary of the secondary area fill. * If not a number, the area is not filled. * * Typically set to the maximum value of the Y range, but it can be any value that gives the desired appearance. + * + * @ingroup plotBindingsScatterPlot **/ @synthesize areaBaseValue2; @@ -214,8 +218,8 @@ -(instancetype)initWithFrame:(CGRect)newFrame plotSymbol = nil; areaFill = nil; areaFill2 = nil; - areaBaseValue = [[NSDecimalNumber notANumber] decimalValue]; - areaBaseValue2 = [[NSDecimalNumber notANumber] decimalValue]; + areaBaseValue = @(NAN); + areaBaseValue2 = @(NAN); plotSymbolMarginForHitDetection = CPTFloat(0.0); plotLineMarginForHitDetection = CPTFloat(4.0); interpolation = CPTScatterPlotInterpolationLinear; @@ -270,8 +274,8 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; [coder encodeObject:self.areaFill2 forKey:@"CPTScatterPlot.areaFill2"]; [coder encodeObject:self.mutableAreaFillBands forKey:@"CPTScatterPlot.mutableAreaFillBands"]; - [coder encodeDecimal:self.areaBaseValue forKey:@"CPTScatterPlot.areaBaseValue"]; - [coder encodeDecimal:self.areaBaseValue2 forKey:@"CPTScatterPlot.areaBaseValue2"]; + [coder encodeObject:self.areaBaseValue forKey:@"CPTScatterPlot.areaBaseValue"]; + [coder encodeObject:self.areaBaseValue2 forKey:@"CPTScatterPlot.areaBaseValue2"]; [coder encodeCGFloat:self.plotSymbolMarginForHitDetection forKey:@"CPTScatterPlot.plotSymbolMarginForHitDetection"]; [coder encodeCGFloat:self.plotLineMarginForHitDetection forKey:@"CPTScatterPlot.plotLineMarginForHitDetection"]; [coder encodeBool:self.allowSimultaneousSymbolAndPlotSelection forKey:@"CPTScatterPlot.allowSimultaneousSymbolAndPlotSelection"]; @@ -290,8 +294,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder areaFill = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill"] copy]; areaFill2 = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill2"] copy]; mutableAreaFillBands = [[coder decodeObjectForKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; - areaBaseValue = [coder decodeDecimalForKey:@"CPTScatterPlot.areaBaseValue"]; - areaBaseValue2 = [coder decodeDecimalForKey:@"CPTScatterPlot.areaBaseValue2"]; + areaBaseValue = [coder decodeObjectForKey:@"CPTScatterPlot.areaBaseValue"]; + areaBaseValue2 = [coder decodeObjectForKey:@"CPTScatterPlot.areaBaseValue2"]; plotSymbolMarginForHitDetection = [coder decodeCGFloatForKey:@"CPTScatterPlot.plotSymbolMarginForHitDetection"]; plotLineMarginForHitDetection = [coder decodeCGFloatForKey:@"CPTScatterPlot.plotLineMarginForHitDetection"]; allowSimultaneousSymbolAndPlotSelection = [coder decodeBoolForKey:@"CPTScatterPlot.allowSimultaneousSymbolAndPlotSelection"]; @@ -775,12 +779,12 @@ -(void)renderAsVectorInContext:(CGContextRef)context for ( NSUInteger i = 0; i < 2; i++ ) { switch ( i ) { case 0: - theAreaBaseValue = self.areaBaseValue; + theAreaBaseValue = self.areaBaseValue.decimalValue; theFill = self.areaFill; break; case 1: - theAreaBaseValue = self.areaBaseValue2; + theAreaBaseValue = self.areaBaseValue2.decimalValue; theFill = self.areaFill2; break; @@ -821,10 +825,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context CPTPlotRange *bandRange = band.range; - plotPoint[CPTCoordinateX] = bandRange.minLimit; + plotPoint[CPTCoordinateX] = bandRange.minLimitDecimal; CGPoint minPoint = [self convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; - plotPoint[CPTCoordinateX] = bandRange.maxLimit; + plotPoint[CPTCoordinateX] = bandRange.maxLimitDecimal; CGPoint maxPoint = [self convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; if ( pixelAlign ) { @@ -1224,7 +1228,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C CGContextAddPath(context, swatchPath); CGContextClip(context); - if ( CPTDecimalGreaterThanOrEqualTo(self.areaBaseValue2, self.areaBaseValue) ) { + if ( CPTDecimalGreaterThanOrEqualTo(self.areaBaseValue2.decimalValue, self.areaBaseValue.decimalValue) ) { [fill1 fillRect:CPTRectMake( CGRectGetMinX(rect), CGRectGetMinY(rect), rect.size.width, rect.size.height / CPTFloat(2.0) ) inContext:context]; [fill2 fillRect:CPTRectMake( CGRectGetMinX(rect), CGRectGetMidY(rect), rect.size.width, rect.size.height / CPTFloat(2.0) ) inContext:context]; } @@ -1274,6 +1278,31 @@ -(CGPathRef)newDataLinePath /// @endcond +#pragma mark - +#pragma mark Animation + +/// @cond + ++(BOOL)needsDisplayForKey:(NSString *)aKey +{ + static NSSet *keys = nil; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + keys = [NSSet setWithArray:@[@"areaBaseValue", + @"areaBaseValue2"]]; + }); + + if ( [keys containsObject:aKey] ) { + return YES; + } + else { + return [super needsDisplayForKey:aKey]; + } +} + +/// @endcond + #pragma mark - #pragma mark Fields @@ -1344,7 +1373,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte BOOL positiveDirection = YES; CPTPlotRange *yRange = [self.plotSpace plotRangeForCoordinate:CPTCoordinateY]; - if ( CPTDecimalLessThan( yRange.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalLessThan( yRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { positiveDirection = !positiveDirection; } @@ -1760,24 +1789,22 @@ -(NSArray *)areaFillBands return [self.mutableAreaFillBands copy]; } --(void)setAreaBaseValue:(NSDecimal)newAreaBaseValue +-(void)setAreaBaseValue:(NSNumber *)newAreaBaseValue { - if ( CPTDecimalEquals(areaBaseValue, newAreaBaseValue) ) { - return; + if ( ![newAreaBaseValue isEqualToNumber:areaBaseValue] ) { + areaBaseValue = newAreaBaseValue; + [self setNeedsDisplay]; + [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; } - areaBaseValue = newAreaBaseValue; - [self setNeedsDisplay]; - [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; } --(void)setAreaBaseValue2:(NSDecimal)newAreaBaseValue +-(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue { - if ( CPTDecimalEquals(areaBaseValue2, newAreaBaseValue) ) { - return; + if ( ![newAreaBaseValue isEqualToNumber:areaBaseValue2] ) { + areaBaseValue2 = newAreaBaseValue; + [self setNeedsDisplay]; + [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; } - areaBaseValue2 = newAreaBaseValue; - [self setNeedsDisplay]; - [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; } -(void)setXValues:(NSArray *)newValues diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index b868f3d09..7f7034780 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -25,8 +25,8 @@ -(void)setUp [self.plot setYValues:yValues]; self.plot.cachePrecision = CPTPlotCachePrecisionDouble; - CPTPlotRange *xPlotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(1)]; - CPTPlotRange *yPlotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(1)]; + CPTPlotRange *xPlotRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@1.0]; + CPTPlotRange *yPlotRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@1.0]; self.plotSpace = [[CPTXYPlotSpace alloc] init]; self.plotSpace.xRange = xPlotRange; self.plotSpace.yRange = yPlotRange; diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index ac7968856..33c796c7d 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -1171,7 +1171,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte BOOL positiveDirection = YES; CPTPlotRange *yRange = [self.plotSpace plotRangeForCoordinate:CPTCoordinateY]; - if ( CPTDecimalLessThan( yRange.length, CPTDecimalFromInteger(0) ) ) { + if ( CPTDecimalLessThan( yRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { positiveDirection = !positiveDirection; } diff --git a/framework/Source/CPTXYAxis.h b/framework/Source/CPTXYAxis.h index 5c23a3063..1dd21ea27 100644 --- a/framework/Source/CPTXYAxis.h +++ b/framework/Source/CPTXYAxis.h @@ -6,7 +6,7 @@ /// @name Positioning /// @{ -@property (nonatomic, readwrite) NSDecimal orthogonalCoordinateDecimal; +@property (nonatomic, readwrite, strong) NSNumber *orthogonalPosition; @property (nonatomic, readwrite, strong) CPTConstraints *axisConstraints; /// @} diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 2fec6f63c..c304c3f7f 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -19,7 +19,7 @@ @interface CPTXYAxis() -(void)drawTicksInContext:(CGContextRef)context atLocations:(NSSet *)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major; -(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat *)upper; --(CGPoint)viewPointForOrthogonalCoordinateDecimal:(NSDecimal)orthogonalCoord axisCoordinateDecimal:(NSDecimal)coordinateDecimalNumber; +-(CGPoint)viewPointForOrthogonalCoordinate:(NSNumber *)orthogonalCoord axisCoordinate:(NSNumber *)coordinateValue; @end @@ -32,19 +32,19 @@ -(CGPoint)viewPointForOrthogonalCoordinateDecimal:(NSDecimal)orthogonalCoord axi **/ @implementation CPTXYAxis -/** @property NSDecimal orthogonalCoordinateDecimal +/** @property NSNumber *orthogonalPosition * @brief The data coordinate value where the axis crosses the orthogonal axis. * If the @ref axisConstraints is non-nil, the constraints take priority and this property is ignored. * @see @ref axisConstraints **/ -@synthesize orthogonalCoordinateDecimal; +@synthesize orthogonalPosition; /** @property CPTConstraints *axisConstraints * @brief The constraints used when positioning relative to the plot area. * If @nil (the default), the axis is fixed relative to the plot space coordinates, - * crossing the orthogonal axis at @ref orthogonalCoordinateDecimal and moves only + * crossing the orthogonal axis at @ref orthogonalPosition and moves only * whenever the plot space ranges change. - * @see @ref orthogonalCoordinateDecimal + * @see @ref orthogonalPosition **/ @synthesize axisConstraints; @@ -57,7 +57,7 @@ @implementation CPTXYAxis /** @brief Initializes a newly allocated CPTXYAxis object with the provided frame rectangle. * * This is the designated initializer. The initialized layer will have the following properties: - * - @ref orthogonalCoordinateDecimal = @num{0} + * - @ref orthogonalPosition = @num{0} * - @ref axisConstraints = @nil * * @param newFrame The frame rectangle. @@ -66,9 +66,9 @@ @implementation CPTXYAxis -(instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { - orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); - axisConstraints = nil; - self.tickDirection = CPTSignNone; + orthogonalPosition = @0.0; + axisConstraints = nil; + self.tickDirection = CPTSignNone; } return self; } @@ -82,8 +82,8 @@ -(instancetype)initWithLayer:(id)layer if ( (self = [super initWithLayer:layer]) ) { CPTXYAxis *theLayer = (CPTXYAxis *)layer; - orthogonalCoordinateDecimal = theLayer->orthogonalCoordinateDecimal; - axisConstraints = theLayer->axisConstraints; + orthogonalPosition = theLayer->orthogonalPosition; + axisConstraints = theLayer->axisConstraints; } return self; } @@ -99,15 +99,15 @@ -(void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; - [coder encodeDecimal:self.orthogonalCoordinateDecimal forKey:@"CPTXYAxis.orthogonalCoordinateDecimal"]; + [coder encodeObject:self.orthogonalPosition forKey:@"CPTXYAxis.orthogonalPosition"]; [coder encodeObject:self.axisConstraints forKey:@"CPTXYAxis.axisConstraints"]; } -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - orthogonalCoordinateDecimal = [coder decodeDecimalForKey:@"CPTXYAxis.orthogonalCoordinateDecimal"]; - axisConstraints = [coder decodeObjectForKey:@"CPTXYAxis.axisConstraints"]; + orthogonalPosition = [coder decodeObjectForKey:@"CPTXYAxis.orthogonalPosition"]; + axisConstraints = [coder decodeObjectForKey:@"CPTXYAxis.axisConstraints"]; } return self; } @@ -127,9 +127,8 @@ -(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat * NSAssert(orthogonalRange != nil, @"The orthogonalRange was nil in orthogonalCoordinateViewLowerBound:upperBound:"); - NSDecimal zero = CPTDecimalFromInteger(0); - CGPoint lowerBoundPoint = [self viewPointForOrthogonalCoordinateDecimal:orthogonalRange.location axisCoordinateDecimal:zero]; - CGPoint upperBoundPoint = [self viewPointForOrthogonalCoordinateDecimal:orthogonalRange.end axisCoordinateDecimal:zero]; + CGPoint lowerBoundPoint = [self viewPointForOrthogonalCoordinate:orthogonalRange.location axisCoordinate:@0]; + CGPoint upperBoundPoint = [self viewPointForOrthogonalCoordinate:orthogonalRange.end axisCoordinate:@0]; switch ( self.coordinate ) { case CPTCoordinateX: @@ -149,25 +148,25 @@ -(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat * } } --(CGPoint)viewPointForOrthogonalCoordinateDecimal:(NSDecimal)orthogonalCoord axisCoordinateDecimal:(NSDecimal)coordinateDecimalNumber +-(CGPoint)viewPointForOrthogonalCoordinate:(NSNumber *)orthogonalCoord axisCoordinate:(NSNumber *)coordinateValue { CPTCoordinate myCoordinate = self.coordinate; CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(myCoordinate); NSDecimal plotPoint[2]; - plotPoint[myCoordinate] = coordinateDecimalNumber; - plotPoint[orthogonalCoordinate] = orthogonalCoord; + plotPoint[myCoordinate] = coordinateValue.decimalValue; + plotPoint[orthogonalCoordinate] = orthogonalCoord.decimalValue; CPTPlotArea *thePlotArea = self.plotArea; return [self convertPoint:[self.plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; } --(CGPoint)viewPointForCoordinateDecimalNumber:(NSDecimal)coordinateDecimalNumber +-(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue { - CGPoint point = [self viewPointForOrthogonalCoordinateDecimal:self.orthogonalCoordinateDecimal - axisCoordinateDecimal:coordinateDecimalNumber]; + CGPoint point = [self viewPointForOrthogonalCoordinate:self.orthogonalPosition + axisCoordinate:coordinateValue]; CPTConstraints *theAxisConstraints = self.axisConstraints; @@ -191,7 +190,7 @@ -(CGPoint)viewPointForCoordinateDecimalNumber:(NSDecimal)coordinateDecimalNumber } if ( isnan(point.x) || isnan(point.y) ) { - NSLog( @"[CPTXYAxis viewPointForCoordinateDecimalNumber:%@] was %@", NSDecimalString(&coordinateDecimalNumber, nil), CPTStringFromPoint(point) ); + NSLog( @"[CPTXYAxis viewPointForCoordinateValue:%@] was %@", coordinateValue, CPTStringFromPoint(point) ); if ( isnan(point.x) ) { point.x = CPTFloat(0.0); @@ -233,14 +232,12 @@ -(void)drawTicksInContext:(CGContextRef)context atLocations:(NSSet *)locations w CGContextBeginPath(context); for ( NSDecimalNumber *tickLocation in locations ) { - NSDecimal locationDecimal = tickLocation.decimalValue; - - if ( labeledRange && ![labeledRange contains:locationDecimal] ) { + if ( labeledRange && ![labeledRange containsNumber:tickLocation] ) { continue; } // Tick end points - CGPoint baseViewPoint = [self viewPointForCoordinateDecimalNumber:locationDecimal]; + CGPoint baseViewPoint = [self viewPointForCoordinateValue:tickLocation]; CGPoint startViewPoint = baseViewPoint; CGPoint endViewPoint = baseViewPoint; @@ -339,8 +336,8 @@ -(void)renderAsVectorInContext:(CGContextRef)context alignmentFunction = CPTAlignIntegralPointToUserSpace; } - CGPoint startViewPoint = alignmentFunction(context, [self viewPointForCoordinateDecimalNumber:range.location]); - CGPoint endViewPoint = alignmentFunction(context, [self viewPointForCoordinateDecimalNumber:range.end]); + CGPoint startViewPoint = alignmentFunction(context, [self viewPointForCoordinateValue:range.location]); + CGPoint endViewPoint = alignmentFunction(context, [self viewPointForCoordinateValue:range.end]); [theLineStyle setLineStyleInContext:context]; CGContextBeginPath(context); CGContextMoveToPoint(context, startViewPoint.x, startViewPoint.y); @@ -365,14 +362,12 @@ -(void)renderAsVectorInContext:(CGContextRef)context } if ( minCap ) { - NSDecimal endPoint = range.minLimit; - CGPoint viewPoint = alignmentFunction(context, [self viewPointForCoordinateDecimalNumber:endPoint]); + CGPoint viewPoint = alignmentFunction(context, [self viewPointForCoordinateValue:range.minLimit]); [minCap renderAsVectorInContext:context atPoint:viewPoint inDirection:CPTPointMake(-axisDirection.x, -axisDirection.y)]; } if ( maxCap ) { - NSDecimal endPoint = range.maxLimit; - CGPoint viewPoint = alignmentFunction(context, [self viewPointForCoordinateDecimalNumber:endPoint]); + CGPoint viewPoint = alignmentFunction(context, [self viewPointForCoordinateValue:range.maxLimit]); [maxCap renderAsVectorInContext:context atPoint:viewPoint inDirection:axisDirection]; } } @@ -425,8 +420,8 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major CPTPlotArea *thePlotArea = self.plotArea; NSDecimal startPlotPoint[2]; NSDecimal endPlotPoint[2]; - startPlotPoint[orthogonalCoordinate] = orthogonalRange.location; - endPlotPoint[orthogonalCoordinate] = orthogonalRange.end; + startPlotPoint[orthogonalCoordinate] = orthogonalRange.locationDecimal; + endPlotPoint[orthogonalCoordinate] = orthogonalRange.endDecimal; CGPoint originTransformed = [self convertPoint:self.bounds.origin fromLayer:thePlotArea]; CGFloat lineWidth = lineStyle.lineWidth; @@ -514,7 +509,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context NSDecimal zero = CPTDecimalFromInteger(0); NSSortDescriptor *sortDescriptor = nil; if ( range ) { - if ( CPTDecimalGreaterThanOrEqualTo(range.length, zero) ) { + if ( CPTDecimalGreaterThanOrEqualTo(range.lengthDecimal, zero) ) { sortDescriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES]; } else { @@ -530,7 +525,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context id null = [NSNull null]; NSDecimal lastLocation; if ( range ) { - lastLocation = range.location; + lastLocation = range.locationDecimal; } else { lastLocation = CPTDecimalNaN(); @@ -539,8 +534,8 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context NSDecimal startPlotPoint[2]; NSDecimal endPlotPoint[2]; if ( orthogonalRange ) { - startPlotPoint[orthogonalCoordinate] = orthogonalRange.location; - endPlotPoint[orthogonalCoordinate] = orthogonalRange.end; + startPlotPoint[orthogonalCoordinate] = orthogonalRange.locationDecimal; + endPlotPoint[orthogonalCoordinate] = orthogonalRange.endDecimal; } else { startPlotPoint[orthogonalCoordinate] = CPTDecimalNaN(); @@ -577,7 +572,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context // Fill space between last location and the range end NSDecimal endLocation; if ( range ) { - endLocation = range.end; + endLocation = range.endDecimal; } else { endLocation = CPTDecimalNaN(); @@ -633,8 +628,8 @@ -(void)drawBackgroundLimitsInContext:(CGContextRef)context NSDecimal startPlotPoint[2]; NSDecimal endPlotPoint[2]; - startPlotPoint[orthogonalCoordinate] = orthogonalRange.location; - endPlotPoint[orthogonalCoordinate] = orthogonalRange.end; + startPlotPoint[orthogonalCoordinate] = orthogonalRange.locationDecimal; + endPlotPoint[orthogonalCoordinate] = orthogonalRange.endDecimal; for ( CPTLimitBand *band in self.backgroundLimitBands ) { CPTFill *bandFill = band.fill; @@ -645,11 +640,11 @@ -(void)drawBackgroundLimitsInContext:(CGContextRef)context [bandRange intersectionPlotRange:range]; // Start point - startPlotPoint[selfCoordinate] = bandRange.location; + startPlotPoint[selfCoordinate] = bandRange.locationDecimal; CGPoint startViewPoint = [thePlotSpace plotAreaViewPointForPlotPoint:startPlotPoint numberOfCoordinates:2]; // End point - endPlotPoint[selfCoordinate] = bandRange.end; + endPlotPoint[selfCoordinate] = bandRange.endDecimal; CGPoint endViewPoint = [thePlotSpace plotAreaViewPointForPlotPoint:endPlotPoint numberOfCoordinates:2]; // Fill band @@ -674,8 +669,8 @@ -(void)drawBackgroundLimitsInContext:(CGContextRef)context -(NSString *)description { CPTPlotRange *range = [self.plotSpace plotRangeForCoordinate:self.coordinate]; - CGPoint startViewPoint = [self viewPointForCoordinateDecimalNumber:range.location]; - CGPoint endViewPoint = [self viewPointForCoordinateDecimalNumber:range.end]; + CGPoint startViewPoint = [self viewPointForCoordinateValue:range.location]; + CGPoint endViewPoint = [self viewPointForCoordinateValue:range.end]; return [NSString stringWithFormat:@"<%@ with range: %@ viewCoordinates: %@ to %@>", [super description], @@ -692,9 +687,9 @@ -(NSString *)description /// @cond // Center title in the plot range by default --(NSDecimal)defaultTitleLocation +-(NSNumber *)defaultTitleLocation { - NSDecimal location; + NSNumber *location; CPTPlotSpace *thePlotSpace = self.plotSpace; CPTCoordinate theCoordinate = self.coordinate; @@ -715,7 +710,7 @@ -(NSDecimal)defaultTitleLocation double end = axisRange.endDouble; if ( (loc > 0.0) && (end >= 0.0) ) { - location = CPTDecimalFromDouble( pow(10.0, ( log10(loc) + log10(end) ) / 2.0) ); + location = @( pow(10.0, ( log10(loc) + log10(end) ) / 2.0) ); } else { location = axisRange.midPoint; @@ -729,7 +724,7 @@ -(NSDecimal)defaultTitleLocation } } else { - location = CPTDecimalFromInteger(0); + location = @0; } return location; @@ -751,10 +746,10 @@ -(void)setAxisConstraints:(CPTConstraints *)newConstraints } } --(void)setOrthogonalCoordinateDecimal:(NSDecimal)newCoord +-(void)setOrthogonalPosition:(NSNumber *)newPosition { - if ( NSDecimalCompare(&orthogonalCoordinateDecimal, &newCoord) != NSOrderedSame ) { - orthogonalCoordinateDecimal = newCoord; + if ( ![newPosition isEqualToNumber:orthogonalPosition] ) { + orthogonalPosition = newPosition; [self setNeedsDisplay]; [self setNeedsLayout]; } diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 6700b5cc5..a6aceba1f 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -192,8 +192,8 @@ @implementation CPTXYPlotSpace -(instancetype)init { if ( (self = [super init]) ) { - xRange = [[CPTPlotRange alloc] initWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(1)]; - yRange = [[CPTPlotRange alloc] initWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(1)]; + xRange = [[CPTPlotRange alloc] initWithLocation:@0.0 length:@1.0]; + yRange = [[CPTPlotRange alloc] initWithLocation:@0.0 length:@1.0]; globalXRange = nil; globalYRange = nil; xScaleType = CPTScaleTypeLinear; @@ -387,17 +387,17 @@ -(void)setXRange:(CPTPlotRange *)range BOOL isScrolling = NO; if ( xRange && constrainedRange ) { - isScrolling = !CPTDecimalEquals(constrainedRange.location, xRange.location) && CPTDecimalEquals(constrainedRange.length, xRange.length); + isScrolling = !CPTDecimalEquals(constrainedRange.locationDecimal, xRange.locationDecimal) && CPTDecimalEquals(constrainedRange.lengthDecimal, xRange.lengthDecimal); if ( isScrolling && ( displacement == CPTFloat(0.0) ) ) { CPTGraph *theGraph = self.graph; CPTPlotArea *plotArea = theGraph.plotAreaFrame.plotArea; if ( plotArea ) { - NSDecimal rangeLength = constrainedRange.length; + NSDecimal rangeLength = constrainedRange.lengthDecimal; if ( !CPTDecimalEquals( rangeLength, CPTDecimalFromInteger(0) ) ) { - NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.location, xRange.location), rangeLength); + NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.locationDecimal, xRange.locationDecimal), rangeLength); displacement = plotArea.bounds.size.width * CPTDecimalCGFloatValue(diff); } @@ -451,17 +451,17 @@ -(void)setYRange:(CPTPlotRange *)range BOOL isScrolling = NO; if ( yRange && constrainedRange ) { - isScrolling = !CPTDecimalEquals(constrainedRange.location, yRange.location) && CPTDecimalEquals(constrainedRange.length, yRange.length); + isScrolling = !CPTDecimalEquals(constrainedRange.locationDecimal, yRange.locationDecimal) && CPTDecimalEquals(constrainedRange.lengthDecimal, yRange.lengthDecimal); if ( isScrolling && ( displacement == CPTFloat(0.0) ) ) { CPTGraph *theGraph = self.graph; CPTPlotArea *plotArea = theGraph.plotAreaFrame.plotArea; if ( plotArea ) { - NSDecimal rangeLength = constrainedRange.length; + NSDecimal rangeLength = constrainedRange.lengthDecimal; if ( !CPTDecimalEquals( rangeLength, CPTDecimalFromInteger(0) ) ) { - NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.location, yRange.location), rangeLength); + NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.locationDecimal, yRange.locationDecimal), rangeLength); displacement = plotArea.bounds.size.height * CPTDecimalCGFloatValue(diff); } @@ -500,7 +500,7 @@ -(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPT return nil; } - if ( CPTDecimalGreaterThanOrEqualTo(existingRange.length, globalRange.length) ) { + if ( CPTDecimalGreaterThanOrEqualTo(existingRange.lengthDecimal, globalRange.lengthDecimal) ) { return [globalRange copy]; } else { @@ -544,7 +544,7 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif BOOL hasShift = !CPTDecimalEquals(shift, zero); if ( hasShift ) { - newRange.location = CPTDecimalAdd(newRange.location, shift); + newRange.locationDecimal = CPTDecimalAdd(newRange.locationDecimal, shift); op = [CPTAnimation animate:self property:property @@ -562,8 +562,8 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif CPTPlotRange *constrainedRange = [self constrainRange:newRange toGlobalRange:globalRange]; if ( ![newRange isEqualToRange:constrainedRange] && ![globalRange containsRange:newRange] ) { - BOOL direction = ( CPTDecimalGreaterThan(shift, zero) && CPTDecimalGreaterThan(oldRange.length, zero) ) || - ( CPTDecimalLessThan(shift, zero) && CPTDecimalLessThan(oldRange.length, zero) ); + BOOL direction = ( CPTDecimalGreaterThan(shift, zero) && CPTDecimalGreaterThan(oldRange.lengthDecimal, zero) ) || + ( CPTDecimalLessThan(shift, zero) && CPTDecimalLessThan(oldRange.lengthDecimal, zero) ); // decelerate at the global range if ( hasShift ) { @@ -606,11 +606,11 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif NSDecimal newPoint[2]; [self plotPoint:newPoint numberOfCoordinates:2 forPlotAreaViewPoint:brakingPoint]; - NSDecimal brakingShift = CPTDecimalSubtract(newPoint[coordinate], direction ? globalRange.end : globalRange.location); + NSDecimal brakingShift = CPTDecimalSubtract(newPoint[coordinate], direction ? globalRange.endDecimal : globalRange.locationDecimal); [newRange shiftEndToFitInRange:globalRange]; [newRange shiftLocationToFitInRange:globalRange]; - newRange.location = CPTDecimalAdd(newRange.location, brakingShift); + newRange.locationDecimal = CPTDecimalAdd(newRange.locationDecimal, brakingShift); } } else { @@ -626,7 +626,7 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif newRange = [oldRange mutableCopy]; - newRange.location = CPTDecimalAdd(newRange.location, shift); + newRange.locationDecimal = CPTDecimalAdd(newRange.locationDecimal, shift); } if ( !isnan(brakingDelay) ) { @@ -671,7 +671,7 @@ -(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate NSDecimal point[2]; - point[coordinate] = (direction ? range.maxLimit : range.minLimit); + point[coordinate] = (direction ? range.maxLimitDecimal : range.minLimitDecimal); point[orthogonalCoordinate] = CPTDecimalFromInteger(1); CGPoint viewPoint = [self plotAreaViewPointForPlotPoint:point numberOfCoordinates:2]; @@ -756,13 +756,13 @@ -(void)scaleToFitPlots:(NSArray *)plots // Set range NSDecimal zero = CPTDecimalFromInteger(0); if ( unionXRange ) { - if ( CPTDecimalEquals(unionXRange.length, zero) ) { + if ( CPTDecimalEquals(unionXRange.lengthDecimal, zero) ) { [unionXRange unionPlotRange:self.xRange]; } self.xRange = unionXRange; } if ( unionYRange ) { - if ( CPTDecimalEquals(unionYRange.length, zero) ) { + if ( CPTDecimalEquals(unionYRange.lengthDecimal, zero) ) { [unionYRange unionPlotRange:self.yRange]; } self.yRange = unionYRange; @@ -819,7 +819,7 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPl return CPTFloat(0.0); } - NSDecimal factor = CPTDecimalDivide(CPTDecimalSubtract(plotCoord, range.location), range.length); + NSDecimal factor = CPTDecimalDivide(CPTDecimalSubtract(plotCoord, range.locationDecimal), range.lengthDecimal); if ( NSDecimalIsNotANumber(&factor) ) { factor = CPTDecimalFromInteger(0); } @@ -846,8 +846,8 @@ -(NSDecimal)plotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPT NSDecimal vLength = CPTDecimalFromDouble(viewLength); NSDecimal bLength = CPTDecimalFromDouble(boundsLength); - NSDecimal location = range.location; - NSDecimal length = range.length; + NSDecimal location = range.locationDecimal; + NSDecimal length = range.lengthDecimal; NSDecimal coordinate; NSDecimalDivide(&coordinate, &vLength, &bLength, NSRoundPlain); @@ -1182,37 +1182,37 @@ -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint CPTPlotRange *oldRangeY = self.yRange; // Lengths are scaled by the pinch gesture inverse proportional - NSDecimal newLengthX = CPTDecimalDivide(oldRangeX.length, decimalScale); - NSDecimal newLengthY = CPTDecimalDivide(oldRangeY.length, decimalScale); + NSDecimal newLengthX = CPTDecimalDivide(oldRangeX.lengthDecimal, decimalScale); + NSDecimal newLengthY = CPTDecimalDivide(oldRangeY.lengthDecimal, decimalScale); // New locations NSDecimal newLocationX; - if ( CPTDecimalGreaterThanOrEqualTo( oldRangeX.length, CPTDecimalFromInteger(0) ) ) { - NSDecimal oldFirstLengthX = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateX], oldRangeX.minLimit); // x - minX - NSDecimal newFirstLengthX = CPTDecimalDivide(oldFirstLengthX, decimalScale); // (x - minX) / scale + if ( CPTDecimalGreaterThanOrEqualTo( oldRangeX.lengthDecimal, CPTDecimalFromInteger(0) ) ) { + NSDecimal oldFirstLengthX = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateX], oldRangeX.minLimitDecimal); // x - minX + NSDecimal newFirstLengthX = CPTDecimalDivide(oldFirstLengthX, decimalScale); // (x - minX) / scale newLocationX = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateX], newFirstLengthX); } else { - NSDecimal oldSecondLengthX = CPTDecimalSubtract(oldRangeX.maxLimit, plotInteractionPoint[0]); // maxX - x - NSDecimal newSecondLengthX = CPTDecimalDivide(oldSecondLengthX, decimalScale); // (maxX - x) / scale + NSDecimal oldSecondLengthX = CPTDecimalSubtract(oldRangeX.maxLimitDecimal, plotInteractionPoint[0]); // maxX - x + NSDecimal newSecondLengthX = CPTDecimalDivide(oldSecondLengthX, decimalScale); // (maxX - x) / scale newLocationX = CPTDecimalAdd(plotInteractionPoint[CPTCoordinateX], newSecondLengthX); } NSDecimal newLocationY; - if ( CPTDecimalGreaterThanOrEqualTo( oldRangeY.length, CPTDecimalFromInteger(0) ) ) { - NSDecimal oldFirstLengthY = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateY], oldRangeY.minLimit); // y - minY - NSDecimal newFirstLengthY = CPTDecimalDivide(oldFirstLengthY, decimalScale); // (y - minY) / scale + if ( CPTDecimalGreaterThanOrEqualTo( oldRangeY.lengthDecimal, CPTDecimalFromInteger(0) ) ) { + NSDecimal oldFirstLengthY = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateY], oldRangeY.minLimitDecimal); // y - minY + NSDecimal newFirstLengthY = CPTDecimalDivide(oldFirstLengthY, decimalScale); // (y - minY) / scale newLocationY = CPTDecimalSubtract(plotInteractionPoint[CPTCoordinateY], newFirstLengthY); } else { - NSDecimal oldSecondLengthY = CPTDecimalSubtract(oldRangeY.maxLimit, plotInteractionPoint[1]); // maxY - y - NSDecimal newSecondLengthY = CPTDecimalDivide(oldSecondLengthY, decimalScale); // (maxY - y) / scale + NSDecimal oldSecondLengthY = CPTDecimalSubtract(oldRangeY.maxLimitDecimal, plotInteractionPoint[1]); // maxY - y + NSDecimal newSecondLengthY = CPTDecimalDivide(oldSecondLengthY, decimalScale); // (maxY - y) / scale newLocationY = CPTDecimalAdd(plotInteractionPoint[CPTCoordinateY], newSecondLengthY); } // New ranges - CPTPlotRange *newRangeX = [[CPTPlotRange alloc] initWithLocation:newLocationX length:newLengthX]; - CPTPlotRange *newRangeY = [[CPTPlotRange alloc] initWithLocation:newLocationY length:newLengthY]; + CPTPlotRange *newRangeX = [[CPTPlotRange alloc] initWithLocationDecimal:newLocationX lengthDecimal:newLengthX]; + CPTPlotRange *newRangeY = [[CPTPlotRange alloc] initWithLocationDecimal:newLocationY lengthDecimal:newLengthY]; BOOL oldMomentum = self.allowsMomentumX; self.allowsMomentumX = NO; @@ -1479,7 +1479,7 @@ -(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMo { CPTMutablePlotRange *newRange = [oldRange mutableCopy]; - newRange.location = CPTDecimalAdd(newRange.location, shift); + newRange.locationDecimal = CPTDecimalAdd(newRange.locationDecimal, shift); if ( globalRange ) { CPTPlotRange *constrainedRange = [self constrainRange:newRange toGlobalRange:globalRange]; @@ -1487,13 +1487,13 @@ -(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMo if ( momentum ) { if ( ![newRange isEqualToRange:constrainedRange] ) { // reduce the shift as we get farther outside the global range - NSDecimal rangeLength = newRange.length; + NSDecimal rangeLength = newRange.lengthDecimal; if ( !CPTDecimalEquals( rangeLength, CPTDecimalFromInteger(0) ) ) { - NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.location, newRange.location), rangeLength); + NSDecimal diff = CPTDecimalDivide(CPTDecimalSubtract(constrainedRange.locationDecimal, newRange.locationDecimal), rangeLength); diff = CPTDecimalMax( CPTDecimalMin( CPTDecimalMultiply( diff, CPTDecimalFromDouble(2.5) ), CPTDecimalFromInteger(1) ), CPTDecimalFromInteger(-1) ); - newRange.location = CPTDecimalSubtract( newRange.location, CPTDecimalMultiply( shift, CPTDecimalAbs(diff) ) ); + newRange.locationDecimal = CPTDecimalSubtract( newRange.locationDecimal, CPTDecimalMultiply( shift, CPTDecimalAbs(diff) ) ); *displacement = *displacement * ( CPTFloat(1.0) - ABS( CPTDecimalCGFloatValue(diff) ) ); } diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 147301918..bf37c9147 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -43,10 +43,10 @@ -(void)testViewPointForPlotPointLinear plotSpace.xScaleType = CPTScaleTypeLinear; plotSpace.yScaleType = CPTScaleTypeLinear; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; NSDecimal plotPoint[2]; plotPoint[CPTCoordinateX] = CPTDecimalFromDouble(5.0); @@ -57,10 +57,10 @@ -(void)testViewPointForPlotPointLinear XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(5.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@5.0]; viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2]; @@ -75,10 +75,10 @@ -(void)testViewPointForDoublePrecisionPlotPointLinear plotSpace.xScaleType = CPTScaleTypeLinear; plotSpace.yScaleType = CPTScaleTypeLinear; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; double plotPoint[2]; plotPoint[CPTCoordinateX] = 5.0; @@ -89,10 +89,10 @@ -(void)testViewPointForDoublePrecisionPlotPointLinear XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(5.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@5.0]; viewPoint = [plotSpace plotAreaViewPointForDoublePrecisionPlotPoint:plotPoint numberOfCoordinates:2]; @@ -110,10 +110,10 @@ -(void)testViewPointForPlotPointLog plotSpace.xScaleType = CPTScaleTypeLog; plotSpace.yScaleType = CPTScaleTypeLog; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; NSDecimal plotPoint[2]; plotPoint[CPTCoordinateX] = CPTDecimalFromDouble( sqrt(10.0) ); @@ -124,10 +124,10 @@ -(void)testViewPointForPlotPointLog XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) - length:CPTDecimalFromDouble(90.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@90.0]; viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2]; @@ -142,10 +142,10 @@ -(void)testViewPointForDoublePrecisionPlotPointLog plotSpace.xScaleType = CPTScaleTypeLog; plotSpace.yScaleType = CPTScaleTypeLog; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; double plotPoint[2]; plotPoint[CPTCoordinateX] = sqrt(10.0); @@ -156,10 +156,10 @@ -(void)testViewPointForDoublePrecisionPlotPointLog XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) - length:CPTDecimalFromDouble(90.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@90.0]; viewPoint = [plotSpace plotAreaViewPointForDoublePrecisionPlotPoint:plotPoint numberOfCoordinates:2]; @@ -177,10 +177,10 @@ -(void)testPlotPointForViewPointLinear plotSpace.xScaleType = CPTScaleTypeLinear; plotSpace.yScaleType = CPTScaleTypeLinear; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; NSDecimal plotPoint[2]; CGPoint viewPoint = CPTPointMake(50.0, 25.0); @@ -201,10 +201,10 @@ -(void)testDoublePrecisionPlotPointForViewPointLinear plotSpace.xScaleType = CPTScaleTypeLinear; plotSpace.yScaleType = CPTScaleTypeLinear; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; double plotPoint[2]; CGPoint viewPoint = CPTPointMake(50.0, 25.0); @@ -228,10 +228,10 @@ -(void)testPlotPointForViewPointLog plotSpace.xScaleType = CPTScaleTypeLog; plotSpace.yScaleType = CPTScaleTypeLog; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; NSDecimal plotPoint[2]; CGPoint viewPoint = CPTPointMake(50.0, 25.0); @@ -252,10 +252,10 @@ -(void)testDoublePrecisionPlotPointForViewPointLog plotSpace.xScaleType = CPTScaleTypeLog; plotSpace.yScaleType = CPTScaleTypeLog; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) - length:CPTDecimalFromDouble(9.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; double plotPoint[2]; CGPoint viewPoint = CPTPointMake(50.0, 25.0); @@ -284,10 +284,10 @@ -(void)testConstrainRanges1 { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) - length:CPTDecimalFromDouble(5.0)]; - CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; + CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:@2.0 + length:@5.0]; + CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; CPTPlotRange *expectedRange = existingRange; CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; @@ -300,10 +300,10 @@ -(void)testConstrainRanges2 { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(5.0)]; + CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@5.0]; CPTPlotRange *expectedRange = globalRange; CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; @@ -316,12 +316,12 @@ -(void)testConstrainRanges3 { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) - length:CPTDecimalFromDouble(8.0)]; - CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(8.0)]; + CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) + length:@8.0]; + CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@8.0]; CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange]; @@ -333,12 +333,12 @@ -(void)testConstrainRanges4 { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(3.0) - length:CPTDecimalFromDouble(8.0)]; - CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.0) - length:CPTDecimalFromDouble(8.0)]; + CPTPlotRange *existingRange = [CPTPlotRange plotRangeWithLocation:@3.0 + length:@8.0]; + CPTPlotRange *globalRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + CPTPlotRange *expectedRange = [CPTPlotRange plotRangeWithLocation:@2.0 + length:@8.0]; CPTPlotRange *constrainedRange = [plotSpace constrainRange:existingRange toGlobalRange:globalRange]; NSString *errMessage = [NSString stringWithFormat:@"constrainedRange was %@, expected %@", constrainedRange, expectedRange]; @@ -355,19 +355,19 @@ -(void)testScaleByAboutPoint1 plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) - length:CPTDecimalFromDouble(-10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@(-10.0)]; CGRect myBounds = self.graph.bounds; [plotSpace scaleBy:0.5 aboutPoint:CGPointMake( CGRectGetMidX(myBounds), CGRectGetMidY(myBounds) )]; - CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-5.0) - length:CPTDecimalFromDouble(20.0)]; - CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(15.0) - length:CPTDecimalFromDouble(-20.0)]; + CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:@(-5.0) + length:@20.0]; + CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:@15.0 + length:@(-20.0)]; NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, expectedRangeX]; XCTAssertTrue([plotSpace.xRange isEqualToRange:expectedRangeX], @"%@", errMessage); @@ -382,19 +382,19 @@ -(void)testScaleByAboutPoint2 plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) - length:CPTDecimalFromDouble(-10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@(-10.0)]; CGRect myBounds = self.graph.bounds; [plotSpace scaleBy:2.0 aboutPoint:CGPointMake( CGRectGetMidX(myBounds), CGRectGetMidY(myBounds) )]; - CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.5) - length:CPTDecimalFromDouble(5.0)]; - CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(7.5) - length:CPTDecimalFromDouble(-5.0)]; + CPTPlotRange *expectedRangeX = [CPTPlotRange plotRangeWithLocation:@2.5 + length:@5.0]; + CPTPlotRange *expectedRangeY = [CPTPlotRange plotRangeWithLocation:@7.5 + length:@(-5.0)]; NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, expectedRangeX]; XCTAssertTrue([plotSpace.xRange isEqualToRange:expectedRangeX], @"%@", errMessage); @@ -410,10 +410,10 @@ -(void)testKeyedArchivingRoundTrip { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) - length:CPTDecimalFromDouble(10.0)]; - plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(10.0) - length:CPTDecimalFromDouble(-10.0)]; + plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@(-10.0)]; CPTXYPlotSpace *newPlotSpace = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:plotSpace]]; diff --git a/framework/Source/_CPTAnimationPlotRangePeriod.m b/framework/Source/_CPTAnimationPlotRangePeriod.m index f8d10d6c4..955ffad4a 100644 --- a/framework/Source/_CPTAnimationPlotRangePeriod.m +++ b/framework/Source/_CPTAnimationPlotRangePeriod.m @@ -20,9 +20,9 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett CPTPlotRange *start = (CPTPlotRange *)self.startValue; CPTPlotRange *end = (CPTPlotRange *)self.endValue; - NSDecimal currentLoc = current.location; - NSDecimal startLoc = start.location; - NSDecimal endLoc = end.location; + NSDecimal currentLoc = current.locationDecimal; + NSDecimal startLoc = start.locationDecimal; + NSDecimal endLoc = end.locationDecimal; return ( CPTDecimalGreaterThanOrEqualTo(currentLoc, startLoc) && CPTDecimalLessThanOrEqualTo(currentLoc, endLoc) ) || ( CPTDecimalGreaterThanOrEqualTo(currentLoc, endLoc) && CPTDecimalLessThanOrEqualTo(currentLoc, startLoc) ); @@ -35,13 +35,13 @@ -(NSValue *)tweenedValueForProgress:(CGFloat)progress NSDecimal progressDecimal = CPTDecimalFromCGFloat(progress); - NSDecimal locationDiff = CPTDecimalSubtract(end.location, start.location); - NSDecimal tweenedLocation = CPTDecimalAdd( start.location, CPTDecimalMultiply(progressDecimal, locationDiff) ); + NSDecimal locationDiff = CPTDecimalSubtract(end.locationDecimal, start.locationDecimal); + NSDecimal tweenedLocation = CPTDecimalAdd( start.locationDecimal, CPTDecimalMultiply(progressDecimal, locationDiff) ); - NSDecimal lengthDiff = CPTDecimalSubtract(end.length, start.length); - NSDecimal tweenedLength = CPTDecimalAdd( start.length, CPTDecimalMultiply(progressDecimal, lengthDiff) ); + NSDecimal lengthDiff = CPTDecimalSubtract(end.lengthDecimal, start.lengthDecimal); + NSDecimal tweenedLength = CPTDecimalAdd( start.lengthDecimal, CPTDecimalMultiply(progressDecimal, lengthDiff) ); - return (NSValue *)[CPTPlotRange plotRangeWithLocation:tweenedLocation length:tweenedLength]; + return (NSValue *)[CPTPlotRange plotRangeWithLocationDecimal:tweenedLocation lengthDecimal:tweenedLength]; } @end diff --git a/framework/Source/_CPTDarkGradientTheme.m b/framework/Source/_CPTDarkGradientTheme.m index c9b84b3f1..112185fcd 100644 --- a/framework/Source/_CPTDarkGradientTheme.m +++ b/framework/Source/_CPTDarkGradientTheme.m @@ -44,19 +44,19 @@ +(NSString *)name -(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle { - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = CPTDecimalFromDouble(0.5); - axis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 4; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = CPTFloat(7.0); - axis.minorTickLength = CPTFloat(5.0); - axis.labelTextStyle = textStyle; - axis.minorTickLabelTextStyle = minorTickTextStyle; - axis.titleTextStyle = textStyle; + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = textStyle; + axis.minorTickLabelTextStyle = minorTickTextStyle; + axis.titleTextStyle = textStyle; } -(void)applyThemeToBackground:(CPTGraph *)graph diff --git a/framework/Source/_CPTPlainBlackTheme.m b/framework/Source/_CPTPlainBlackTheme.m index 9f148a795..6bc25f94a 100644 --- a/framework/Source/_CPTPlainBlackTheme.m +++ b/framework/Source/_CPTPlainBlackTheme.m @@ -68,34 +68,34 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet minorTickWhiteTextStyle.color = [CPTColor whiteColor]; minorTickWhiteTextStyle.fontSize = CPTFloat(12.0); - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = whiteTextStyle; - x.minorTickLabelTextStyle = whiteTextStyle; - x.titleTextStyle = whiteTextStyle; + x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @0.0; + x.tickDirection = CPTSignNone; + x.minorTicksPerInterval = 4; + x.majorTickLineStyle = majorLineStyle; + x.minorTickLineStyle = minorLineStyle; + x.axisLineStyle = majorLineStyle; + x.majorTickLength = CPTFloat(7.0); + x.minorTickLength = CPTFloat(5.0); + x.labelTextStyle = whiteTextStyle; + x.minorTickLabelTextStyle = whiteTextStyle; + x.titleTextStyle = whiteTextStyle; CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 4; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = whiteTextStyle; - y.minorTickLabelTextStyle = minorTickWhiteTextStyle; - y.titleTextStyle = whiteTextStyle; + y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 4; + y.orthogonalPosition = @0.0; + y.tickDirection = CPTSignNone; + y.majorTickLineStyle = majorLineStyle; + y.minorTickLineStyle = minorLineStyle; + y.axisLineStyle = majorLineStyle; + y.majorTickLength = CPTFloat(7.0); + y.minorTickLength = CPTFloat(5.0); + y.labelTextStyle = whiteTextStyle; + y.minorTickLabelTextStyle = minorTickWhiteTextStyle; + y.titleTextStyle = whiteTextStyle; } #pragma mark - diff --git a/framework/Source/_CPTPlainWhiteTheme.m b/framework/Source/_CPTPlainWhiteTheme.m index 324e2d258..fbdbf673b 100644 --- a/framework/Source/_CPTPlainWhiteTheme.m +++ b/framework/Source/_CPTPlainWhiteTheme.m @@ -61,41 +61,43 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet minorLineStyle.lineColor = [CPTColor blackColor]; minorLineStyle.lineWidth = CPTFloat(1.0); - CPTXYAxis *x = xyAxisSet.xAxis; CPTMutableTextStyle *blackTextStyle = [[CPTMutableTextStyle alloc] init]; blackTextStyle.color = [CPTColor blackColor]; blackTextStyle.fontSize = CPTFloat(14.0); + CPTMutableTextStyle *minorTickBlackTextStyle = [[CPTMutableTextStyle alloc] init]; minorTickBlackTextStyle.color = [CPTColor blackColor]; minorTickBlackTextStyle.fontSize = CPTFloat(12.0); - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = blackTextStyle; - x.minorTickLabelTextStyle = blackTextStyle; - x.titleTextStyle = blackTextStyle; + + CPTXYAxis *x = xyAxisSet.xAxis; + x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @0.0; + x.tickDirection = CPTSignNone; + x.minorTicksPerInterval = 4; + x.majorTickLineStyle = majorLineStyle; + x.minorTickLineStyle = minorLineStyle; + x.axisLineStyle = majorLineStyle; + x.majorTickLength = CPTFloat(7.0); + x.minorTickLength = CPTFloat(5.0); + x.labelTextStyle = blackTextStyle; + x.minorTickLabelTextStyle = blackTextStyle; + x.titleTextStyle = blackTextStyle; CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 4; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = blackTextStyle; - y.minorTickLabelTextStyle = minorTickBlackTextStyle; - y.titleTextStyle = blackTextStyle; + y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 4; + y.orthogonalPosition = @0.0; + y.tickDirection = CPTSignNone; + y.majorTickLineStyle = majorLineStyle; + y.minorTickLineStyle = minorLineStyle; + y.axisLineStyle = majorLineStyle; + y.majorTickLength = CPTFloat(7.0); + y.minorTickLength = CPTFloat(5.0); + y.labelTextStyle = blackTextStyle; + y.minorTickLabelTextStyle = minorTickBlackTextStyle; + y.titleTextStyle = blackTextStyle; } #pragma mark - diff --git a/framework/Source/_CPTSlateTheme.m b/framework/Source/_CPTSlateTheme.m index cee13242d..67e7afc6d 100644 --- a/framework/Source/_CPTSlateTheme.m +++ b/framework/Source/_CPTSlateTheme.m @@ -44,19 +44,19 @@ +(NSString *)name -(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle { - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = CPTDecimalFromDouble(0.5); - axis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 4; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = CPTFloat(7.0); - axis.minorTickLength = CPTFloat(5.0); - axis.labelTextStyle = textStyle; - axis.minorTickLabelTextStyle = minorTickTextStyle; - axis.titleTextStyle = textStyle; + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = textStyle; + axis.minorTickLabelTextStyle = minorTickTextStyle; + axis.titleTextStyle = textStyle; } -(void)applyThemeToBackground:(CPTGraph *)graph diff --git a/framework/Source/_CPTStocksTheme.m b/framework/Source/_CPTStocksTheme.m index 860594162..d24ced3a3 100644 --- a/framework/Source/_CPTStocksTheme.m +++ b/framework/Source/_CPTStocksTheme.m @@ -73,41 +73,43 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet minorLineStyle.lineColor = [CPTColor whiteColor]; minorLineStyle.lineWidth = CPTFloat(3.0); - CPTXYAxis *x = xyAxisSet.xAxis; CPTMutableTextStyle *whiteTextStyle = [[CPTMutableTextStyle alloc] init]; whiteTextStyle.color = [CPTColor whiteColor]; whiteTextStyle.fontSize = CPTFloat(14.0); + CPTMutableTextStyle *minorTickWhiteTextStyle = [[CPTMutableTextStyle alloc] init]; minorTickWhiteTextStyle.color = [CPTColor whiteColor]; minorTickWhiteTextStyle.fontSize = CPTFloat(12.0); - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = whiteTextStyle; - x.minorTickLabelTextStyle = minorTickWhiteTextStyle; - x.titleTextStyle = whiteTextStyle; + + CPTXYAxis *x = xyAxisSet.xAxis; + x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @0.0; + x.tickDirection = CPTSignNone; + x.minorTicksPerInterval = 4; + x.majorTickLineStyle = majorLineStyle; + x.minorTickLineStyle = minorLineStyle; + x.axisLineStyle = majorLineStyle; + x.majorTickLength = CPTFloat(7.0); + x.minorTickLength = CPTFloat(5.0); + x.labelTextStyle = whiteTextStyle; + x.minorTickLabelTextStyle = minorTickWhiteTextStyle; + x.titleTextStyle = whiteTextStyle; CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 4; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = whiteTextStyle; - y.minorTickLabelTextStyle = minorTickWhiteTextStyle; - y.titleTextStyle = whiteTextStyle; + y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 4; + y.orthogonalPosition = @0.0; + y.tickDirection = CPTSignNone; + y.majorTickLineStyle = majorLineStyle; + y.minorTickLineStyle = minorLineStyle; + y.axisLineStyle = majorLineStyle; + y.majorTickLength = CPTFloat(7.0); + y.minorTickLength = CPTFloat(5.0); + y.labelTextStyle = whiteTextStyle; + y.minorTickLabelTextStyle = minorTickWhiteTextStyle; + y.titleTextStyle = whiteTextStyle; } #pragma mark - diff --git a/framework/Source/_CPTXYTheme.m b/framework/Source/_CPTXYTheme.m index 47d7d8e4f..eef244cdb 100644 --- a/framework/Source/_CPTXYTheme.m +++ b/framework/Source/_CPTXYTheme.m @@ -39,8 +39,8 @@ -(id)newGraph graph.paddingBottom = CPTFloat(60.0); CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(1.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]; [self applyThemeToGraph:graph]; From 2615e7b8550f81eefa4c45897704c8a632e3609a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 17 Sep 2014 21:12:39 -0400 Subject: [PATCH 002/429] Updated all example apps to use the new NSNumber-based API. --- QCPlugin/CPBarPlotPlugin.m | 6 +- QCPlugin/CPScatterPlotPlugin.m | 2 +- QCPlugin/CorePlotQCPlugin.m | 20 +-- examples/AAPLot/Classes/MainViewController.m | 36 +++--- .../Classes/CPTTestApp_iPadViewController.m | 78 ++++++------ .../Classes/CPTTestAppBarChartController.m | 36 +++--- .../Classes/CPTTestAppScatterPlotController.m | 8 +- .../Classes/TestXYTheme.m | 24 ++-- .../Classes/CPTTestAppBarChartController.m | 46 +++---- .../Classes/CPTTestAppScatterPlotController.m | 38 +++--- .../CPTTestApp/Source/AxisDemoController.m | 40 +++--- .../Source/CPTPlotSymbolTestController.m | 4 +- examples/CPTTestApp/Source/Controller.m | 72 +++++------ .../Source/SelectionDemoController.m | 16 +-- examples/CorePlotGallery/src/plots/AxisDemo.m | 46 ++++--- .../src/plots/CandlestickPlot.m | 12 +- .../src/plots/ColoredBarChart.m | 26 ++-- .../CorePlotGallery/src/plots/CompositePlot.m | 72 +++++------ .../CorePlotGallery/src/plots/ControlChart.m | 8 +- .../src/plots/CurvedScatterPlot.m | 18 +-- examples/CorePlotGallery/src/plots/DatePlot.m | 16 +-- .../CorePlotGallery/src/plots/FunctionPlot.m | 10 +- .../src/plots/GradientScatterPlot.m | 36 +++--- .../src/plots/LabelingPolicyDemo.m | 118 +++++++++--------- .../CorePlotGallery/src/plots/LineCapDemo.m | 12 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 12 +- .../CorePlotGallery/src/plots/PlotSpaceDemo.m | 114 ++++++++--------- .../CorePlotGallery/src/plots/RangePlot.m | 16 +-- .../CorePlotGallery/src/plots/RealTimePlot.m | 44 +++---- .../src/plots/SimpleScatterPlot.m | 27 ++-- .../src/plots/SteppedScatterPlot.m | 6 +- .../src/plots/VerticalBarChart.m | 86 ++++++------- examples/DatePlot/Controller.m | 16 +-- examples/DropPlot/CPTPlotDocument.m | 28 ++--- examples/MinorTickLabels/Controller.m | 16 +-- examples/RangePlot/Controller.m | 16 +-- .../Classes/APYahooDataPullerGraph.m | 22 ++-- .../StockPlot/Classes/RootViewController.m | 2 +- 38 files changed, 601 insertions(+), 604 deletions(-) diff --git a/QCPlugin/CPBarPlotPlugin.m b/QCPlugin/CPBarPlotPlugin.m index fdd059f89..d8cf5f7d7 100644 --- a/QCPlugin/CPBarPlotPlugin.m +++ b/QCPlugin/CPBarPlotPlugin.m @@ -170,9 +170,9 @@ -(BOOL)configurePlots lineStyle.lineColor = [CPTColor colorWithCGColor:(CGColorRef)[self dataLineColor : index]]; lineStyle.lineWidth = [self dataLineWidth:index]; plot.lineStyle = lineStyle; - plot.baseValue = CPTDecimalFromDouble(self.inputBaseValue); - plot.barWidth = CPTDecimalFromDouble(barWidth); - plot.barOffset = CPTDecimalFromDouble(self.inputBarOffset); + plot.baseValue = @(self.inputBaseValue); + plot.barWidth = @(barWidth); + plot.barOffset = @(self.inputBarOffset); plot.barsAreHorizontal = self.inputHorizontalBars; plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:(CGColorRef)[self areaFillColor : index]]]; diff --git a/QCPlugin/CPScatterPlotPlugin.m b/QCPlugin/CPScatterPlotPlugin.m index ef9892eee..a985935d5 100644 --- a/QCPlugin/CPScatterPlotPlugin.m +++ b/QCPlugin/CPScatterPlotPlugin.m @@ -193,7 +193,7 @@ -(BOOL)configurePlots plot.plotSymbol.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:[self dataSymbolColor:index]]]; plot.plotSymbol.size = CGSizeMake(10.0, 10.0); plot.areaFill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:(CGColorRef)[self areaFillColor : index]]]; - plot.areaBaseValue = CPTDecimalFromFloat( MAX( self.inputYMin, MIN(self.inputYMax, 0.0) ) ); + plot.areaBaseValue = @( MAX( self.inputYMin, MIN(self.inputYMax, 0.0) ) ); [plot reloadData]; } diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index b2988ddea..bd95aefed 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -194,7 +194,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key if ( [key isEqualToString:@"inputXMin"] ) { return @{ QCPortAttributeNameKey: @"X Range Min", - QCPortAttributeDefaultValueKey: @ - 1.0 + QCPortAttributeDefaultValueKey: @(-1.0) }; } @@ -208,7 +208,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key if ( [key isEqualToString:@"inputYMin"] ) { return @{ QCPortAttributeNameKey: @"Y Range Min", - QCPortAttributeDefaultValueKey: @ - 1.0 + QCPortAttributeDefaultValueKey: @(-1.0) }; } @@ -364,18 +364,18 @@ -(void)createGraph // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(1.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0) length:CPTDecimalFromFloat(1.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@1.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@1.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromFloat(0.5); + x.majorIntervalLength = @0.5; x.minorTicksPerInterval = 2; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromFloat(0.5); + y.majorIntervalLength = @0.5; y.minorTicksPerInterval = 5; } } @@ -449,11 +449,11 @@ -(BOOL)configureAxis set.xAxis.labelTextStyle = textStyle; double xrange = self.inputXMax - self.inputXMin; - set.xAxis.majorIntervalLength = CPTDecimalFromDouble( xrange / (self.inputXMajorIntervals) ); + set.xAxis.majorIntervalLength = @( xrange / (self.inputXMajorIntervals) ); set.xAxis.minorTicksPerInterval = self.inputXMinorIntervals; double yrange = self.inputYMax - self.inputYMin; - set.yAxis.majorIntervalLength = CPTDecimalFromDouble( yrange / (self.inputYMajorIntervals) ); + set.yAxis.majorIntervalLength = @( yrange / (self.inputYMajorIntervals) ); set.yAxis.minorTicksPerInterval = self.inputYMinorIntervals; set.xAxis.minorTickLength = self.inputAxisMinorTickLength; @@ -757,8 +757,8 @@ -(BOOL)configureGraph // Configure the plot space and axis sets CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(self.inputXMin) length:CPTDecimalFromFloat(self.inputXMax - self.inputXMin)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(self.inputYMin) length:CPTDecimalFromFloat(self.inputYMax - self.inputYMin)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(self.inputXMin) length:@(self.inputXMax - self.inputXMin)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(self.inputYMin) length:@(self.inputYMax - self.inputYMin)]; [self configureAxis]; diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index a30966a9f..7316bdfe4 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -78,14 +78,14 @@ -(void)viewDidLoad areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(200.0); + dataSourceLinePlot.areaBaseValue = @200.0; areaColor = [CPTColor colorWithComponentRed:0.0 green:1.0 blue:0.0 alpha:0.6]; areaGradient = [CPTGradient gradientWithBeginningColor:[CPTColor clearColor] endingColor:areaColor]; areaGradient.angle = -90.0; areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill2 = areaGradientFill; - dataSourceLinePlot.areaBaseValue2 = CPTDecimalFromDouble(400.0); + dataSourceLinePlot.areaBaseValue2 = @400.0; // OHLC plot CPTMutableLineStyle *whiteLineStyle = [CPTMutableLineStyle lineStyle]; @@ -121,7 +121,7 @@ -(void)viewDidLoad [lineStyle release]; volumePlot.fill = nil; - volumePlot.barWidth = CPTDecimalFromFloat(1.0f); + volumePlot.barWidth = @1.0; volumePlot.identifier = @"Volume Plot"; volumePlot.cachePrecision = CPTPlotCachePrecisionDouble; [graph addPlot:volumePlot toPlotSpace:volumePlotSpace]; @@ -629,12 +629,12 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp NSDecimalNumber *lowDisplayLocation = [low decimalNumberBySubtracting:lengthDisplacementValue]; NSDecimalNumber *lengthDisplayLocation = [length decimalNumberByAdding:lengthDisplacementValue]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromUnsignedInteger(datapuller.financialData.count + 1)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:[lowDisplayLocation decimalValue] length:[lengthDisplayLocation decimalValue]]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(datapuller.financialData.count + 1)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:lowDisplayLocation length:lengthDisplayLocation]; CPTScatterPlot *linePlot = (CPTScatterPlot *)[graph plotWithIdentifier:@"Data Source Plot"]; - linePlot.areaBaseValue = [high decimalValue]; - linePlot.areaBaseValue2 = [low decimalValue]; + linePlot.areaBaseValue = high; + linePlot.areaBaseValue2 = low; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; @@ -652,8 +652,8 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp NSDecimalNumber *volumeLowDisplayLocation = overallVolumeLow; NSDecimalNumber *volumeLengthDisplayLocation = [volumeLength decimalNumberByAdding:volumeLengthDisplacementValue]; - volumePlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromUnsignedInteger(datapuller.financialData.count + 1)]; -// volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:[volumeLowDisplayLocation decimalValue] length:[volumeLengthDisplayLocation decimalValue]]; + volumePlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(datapuller.financialData.count + 1)]; +// volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation]; if ( animationOperation ) { [[CPTAnimation sharedInstance] removeAnimationOperation:animationOperation]; @@ -662,17 +662,17 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp animationOperation = [[CPTAnimation animate:volumePlotSpace property:@"yRange" - fromPlotRange:[CPTPlotRange plotRangeWithLocation:[volumeLowDisplayLocation decimalValue] - length:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] - toPlotRange:[CPTPlotRange plotRangeWithLocation:[volumeLowDisplayLocation decimalValue] - length:[volumeLengthDisplayLocation decimalValue]] + fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] + lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] + toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation + length:volumeLengthDisplayLocation] duration:2.5] retain]; - axisSet.xAxis.orthogonalCoordinateDecimal = [low decimalValue]; - axisSet.yAxis.majorIntervalLength = CPTDecimalFromDouble(50.0); - axisSet.yAxis.minorTicksPerInterval = 4; - axisSet.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0); - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0) length:[low decimalValue]]]; + axisSet.xAxis.orthogonalPosition = low; + axisSet.yAxis.majorIntervalLength = @50.0; + axisSet.yAxis.minorTicksPerInterval = 4; + axisSet.yAxis.orthogonalPosition = @1.0; + NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@0.0 length:low]]; axisSet.yAxis.labelExclusionRanges = exclusionRanges; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 7a0eaf3b1..a4937cfb4 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -102,27 +102,27 @@ -(void)constructScatterPlot // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(2.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.99) length:CPTDecimalFromDouble(0.02)]]; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 2; + NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(3.99) length:CPTDecimalFromDouble(0.02)]]; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @2.0; + exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]]; y.labelExclusionRanges = exclusionRanges; // Create a green plot area @@ -143,7 +143,7 @@ -(void)constructScatterPlot areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); + dataSourceLinePlot.areaBaseValue = @1.75; // Animate in the new plot, as an example dataSourceLinePlot.opacity = 0.0; @@ -177,7 +177,7 @@ -(void)constructScatterPlot areaGradient1.angle = -90.0; areaGradientFill = [CPTFill fillWithGradient:areaGradient1]; boundLinePlot.areaFill = areaGradientFill; - boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; + boundLinePlot.areaBaseValue = @0.0; // Add plot symbols CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; @@ -214,19 +214,19 @@ -(void)constructBarChart // Add plot space for horizontal bar charts CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(300.0f)]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(16.0f)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = CPTDecimalFromDouble(5.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; + x.axisLineStyle = nil; + x.majorTickLineStyle = nil; + x.minorTickLineStyle = nil; + x.majorIntervalLength = @5.0; + x.orthogonalPosition = @0.0; + x.title = @"X Axis"; + x.titleLocation = @7.5; + x.titleOffset = 55.0; // Define some custom labels for the data elements x.labelRotation = M_PI_4; @@ -237,7 +237,7 @@ -(void)constructBarChart NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = [tickLocation decimalValue]; + newLabel.tickLocation = tickLocation; newLabel.offset = x.labelOffset + x.majorTickLength; newLabel.rotation = M_PI_4; [customLabels addObject:newLabel]; @@ -246,28 +246,28 @@ -(void)constructBarChart x.axisLabels = customLabels; CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = CPTDecimalFromDouble(50.0); - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); + y.axisLineStyle = nil; + y.majorTickLineStyle = nil; + y.minorTickLineStyle = nil; + y.majorIntervalLength = @50.0; + y.orthogonalPosition = @0.0; + y.title = @"Y Axis"; + y.titleOffset = 45.0; + y.titleLocation = @150.0; // First bar plot CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; - barPlot.baseValue = CPTDecimalFromDouble(0.0); + barPlot.baseValue = @0.0; barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(-0.25f); + barPlot.barOffset = @(-0.25); barPlot.identifier = @"Bar Plot 1"; [barChart addPlot:barPlot toPlotSpace:plotSpace]; // Second bar plot barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; barPlot.dataSource = self; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.barOffset = CPTDecimalFromFloat(0.25f); + barPlot.baseValue = @0.0; + barPlot.barOffset = @0.25; barPlot.barCornerRadius = 2.0; barPlot.identifier = @"Bar Plot 2"; barPlot.delegate = self; diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m index 84d7f8104..4a9fb8961 100644 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m +++ b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m @@ -34,19 +34,19 @@ -(void)viewDidLoad // Add plot space for horizontal bar charts CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(300.0f)]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(16.0f)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = CPTDecimalFromDouble(5.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; + x.axisLineStyle = nil; + x.majorTickLineStyle = nil; + x.minorTickLineStyle = nil; + x.majorIntervalLength = @5.0; + x.orthogonalPosition = @0.0; + x.title = @"X Axis"; + x.titleLocation = CPTDecimalFromFloat(7.5f); + x.titleOffset = 55.0; // Define some custom labels for the data elements x.labelRotation = M_PI_4; @@ -66,14 +66,14 @@ -(void)viewDidLoad x.axisLabels = customLabels; CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = CPTDecimalFromDouble(50.0); - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); + y.axisLineStyle = nil; + y.majorTickLineStyle = nil; + y.minorTickLineStyle = nil; + y.majorIntervalLength = @50.0; + y.orthogonalPosition = @0.0; + y.title = @"Y Axis"; + y.titleOffset = 45.0; + y.titleLocation = CPTDecimalFromFloat(150.0f); // First bar plot CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m index 1e342226f..a069ea293 100644 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m +++ b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m @@ -38,8 +38,8 @@ -(void)viewDidLoad // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; plotSpace.allowsUserInteraction = NO; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(NUM_POINTS)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(NUM_POINTS)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; // Create a blue plot area CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; @@ -96,8 +96,8 @@ -(void)changePlotRange CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; float ylen = NUM_POINTS * (rand() / (double)RAND_MAX); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(NUM_POINTS)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(ylen)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(ylen)]; } #pragma mark - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m index 0aa127589..d6721d730 100644 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m +++ b/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m @@ -28,18 +28,18 @@ -(id)init -(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle majorGridLineStyle:majorGridLineStyle textStyle:(CPTTextStyle *)textStyle { - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = CPTDecimalFromDouble(20.0); - axis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 3; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = 5.0; - axis.minorTickLength = 3.0; - axis.labelTextStyle = textStyle; - axis.titleTextStyle = textStyle; + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @20.0; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 3; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = 5.0; + axis.minorTickLength = 3.0; + axis.labelTextStyle = textStyle; + axis.titleTextStyle = textStyle; //axis.labelFormatter = numberFormatter ; axis.majorGridLineStyle = majorGridLineStyle; axis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m index d1dda4bcc..e98cbcb44 100644 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m +++ b/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m @@ -97,19 +97,19 @@ -(void)timerFired // Add plot space for horizontal bar charts CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(300.0f)]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(16.0f)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = CPTDecimalFromDouble(5.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; + x.axisLineStyle = nil; + x.majorTickLineStyle = nil; + x.minorTickLineStyle = nil; + x.majorIntervalLength = @5.0; + x.orthogonalPosition = @0.0; + x.title = @"X Axis"; + x.titleLocation = @7.5; + x.titleOffset = 55.0; // Define some custom labels for the data elements x.labelRotation = M_PI_4; @@ -120,7 +120,7 @@ -(void)timerFired NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = [tickLocation decimalValue]; + newLabel.tickLocation = tickLocation; newLabel.offset = x.labelOffset + x.majorTickLength; newLabel.rotation = M_PI_4; [customLabels addObject:newLabel]; @@ -129,28 +129,28 @@ -(void)timerFired x.axisLabels = customLabels; CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = CPTDecimalFromDouble(50.0); - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); + y.axisLineStyle = nil; + y.majorTickLineStyle = nil; + y.minorTickLineStyle = nil; + y.majorIntervalLength = @50.0; + y.orthogonalPosition = @0.0; + y.title = @"Y Axis"; + y.titleOffset = 45.0; + y.titleLocation = @150.0; // First bar plot CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; - barPlot.baseValue = CPTDecimalFromDouble(0.0); + barPlot.baseValue = @0.0; barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(-0.25f); + barPlot.barOffset = @(-0.25); barPlot.identifier = @"Bar Plot 1"; [barChart addPlot:barPlot toPlotSpace:plotSpace]; // Second bar plot barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; barPlot.dataSource = self; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.barOffset = CPTDecimalFromFloat(0.25f); + barPlot.baseValue = @0.0; + barPlot.barOffset = @0.25; barPlot.barCornerRadius = 2.0; barPlot.identifier = @"Bar Plot 2"; [barChart addPlot:barPlot toPlotSpace:plotSpace]; diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m index b5e069be2..ea8c27187 100644 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m +++ b/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m @@ -39,27 +39,27 @@ -(void)viewDidLoad // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(2.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.99) length:CPTDecimalFromDouble(0.02)]]; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 2; + NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(3.99) length:CPTDecimalFromDouble(0.02)]]; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @2.0; + exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]]; y.labelExclusionRanges = exclusionRanges; y.delegate = self; @@ -78,7 +78,7 @@ -(void)viewDidLoad fillImage.tiled = YES; CPTFill *areaImageFill = [CPTFill fillWithImage:fillImage]; boundLinePlot.areaFill = areaImageFill; - boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; + boundLinePlot.areaBaseValue = @0.0; // Add plot symbols CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; @@ -105,7 +105,7 @@ -(void)viewDidLoad areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); + dataSourceLinePlot.areaBaseValue = @1.75; // Animate in the new plot, as an example dataSourceLinePlot.opacity = 0.0; @@ -139,8 +139,8 @@ -(void)changePlotRange // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(3.0 + 2.0 * rand() / RAND_MAX)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(3.0 + 2.0 * rand() / RAND_MAX)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(3.0 + 2.0 * rand() / RAND_MAX)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(3.0 + 2.0 * rand() / RAND_MAX)]; } #pragma mark - @@ -207,7 +207,7 @@ -(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations CPTTextLayer *newLabelLayer = [[CPTTextLayer alloc] initWithText:labelString style:theLabelTextStyle]; CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithContentLayer:newLabelLayer]; - newLabel.tickLocation = tickLocation.decimalValue; + newLabel.tickLocation = tickLocation; newLabel.offset = labelOffset; [newLabels addObject:newLabel]; diff --git a/examples/CPTTestApp/Source/AxisDemoController.m b/examples/CPTTestApp/Source/AxisDemoController.m index d90857953..7262a5ea6 100644 --- a/examples/CPTTestApp/Source/AxisDemoController.m +++ b/examples/CPTTestApp/Source/AxisDemoController.m @@ -37,8 +37,8 @@ -(void)awakeFromNib // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.5) length:CPTDecimalFromDouble(1500.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(-10.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.5 length:@1500.0]; plotSpace.yScaleType = CPTScaleTypeLog; // Line styles @@ -63,22 +63,22 @@ -(void)awakeFromNib // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.separateLayers = NO; - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.5); - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.minorTicksPerInterval = 4; - x.tickDirection = CPTSignNone; - x.axisLineStyle = axisLineStyle; - x.majorTickLength = 12.0; - x.majorTickLineStyle = axisLineStyle; - x.majorGridLineStyle = majorGridLineStyle; - x.minorTickLength = 8.0; - x.minorGridLineStyle = minorGridLineStyle; - x.title = @"X Axis"; - x.titleTextStyle = axisTitleTextStyle; - x.titleOffset = 25.0; - x.alternatingBandFills = @[[[CPTColor redColor] colorWithAlphaComponent:0.1], [[CPTColor greenColor] colorWithAlphaComponent:0.1]]; - x.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + x.separateLayers = NO; + x.orthogonalPosition = @0.5; + x.majorIntervalLength = @0.5; + x.minorTicksPerInterval = 4; + x.tickDirection = CPTSignNone; + x.axisLineStyle = axisLineStyle; + x.majorTickLength = 12.0; + x.majorTickLineStyle = axisLineStyle; + x.majorGridLineStyle = majorGridLineStyle; + x.minorTickLength = 8.0; + x.minorGridLineStyle = minorGridLineStyle; + x.title = @"X Axis"; + x.titleTextStyle = axisTitleTextStyle; + x.titleOffset = 25.0; + x.alternatingBandFills = @[[[CPTColor redColor] colorWithAlphaComponent:0.1], [[CPTColor greenColor] colorWithAlphaComponent:0.1]]; + x.labelingPolicy = CPTAxisLabelingPolicyAutomatic; // Label y with an automatic label policy. axisLineStyle.lineColor = [CPTColor greenColor]; @@ -100,8 +100,8 @@ -(void)awakeFromNib y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; CPTFill *bandFill = [CPTFill fillWithColor:[[CPTColor darkGrayColor] colorWithAlphaComponent:0.5]]; - [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(7.0) length:CPTDecimalFromDouble(1.5)] fill:bandFill]]; - [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.5) length:CPTDecimalFromDouble(3.0)] fill:bandFill]]; + [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@7.0 length:@1.5] fill:bandFill]]; + [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@1.5 length:@3.0] fill:bandFill]]; } @end diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index 2d60a6db2..56fa0002d 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -36,8 +36,8 @@ -(void)awakeFromNib // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0) length:CPTDecimalFromFloat(11.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0) length:CPTDecimalFromFloat(14.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@11.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@14.0]; CPTMutableShadow *lineShadow = [CPTMutableShadow shadow]; lineShadow.shadowOffset = CGSizeMake(3.0, -3.0); diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index abe77ed92..1c63bad18 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -130,14 +130,14 @@ -(void)setupAxes // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 2; - x.majorGridLineStyle = majorGridLineStyle; - x.minorGridLineStyle = minorGridLineStyle; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(2.99) length:CPTDecimalFromFloat(0.02)]]; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 2; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; + NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; NSMutableAttributedString *xTitle = [[NSMutableAttributedString alloc] initWithString:@"X Axis\nLine 2"]; @@ -149,20 +149,20 @@ -(void)setupAxes x.attributedTitle = xTitle; x.titleOffset = 30.0; - x.titleLocation = CPTDecimalFromDouble(3.0); + x.titleLocation = @3.0; // Label y with an automatic label policy. CPTXYAxis *y = axisSet.yAxis; y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); + y.orthogonalPosition = @2.0; y.minorTicksPerInterval = 2; y.preferredNumberOfMajorTicks = 8; y.majorGridLineStyle = majorGridLineStyle; y.minorGridLineStyle = minorGridLineStyle; y.labelOffset = 10.0; - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(3.99) length:CPTDecimalFromFloat(0.02)]]; + exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]]; y.labelExclusionRanges = exclusionRanges; NSMutableAttributedString *yTitle = [[NSMutableAttributedString alloc] initWithString:@"Y Axis\nLine 2"]; @@ -174,7 +174,7 @@ -(void)setupAxes y.attributedTitle = yTitle; y.titleOffset = 30.0; - y.titleLocation = CPTDecimalFromDouble(2.7); + y.titleLocation = @2.7; // Rotate the labels by 45 degrees, just to show it can be done. self.labelRotation = M_PI_4; @@ -183,7 +183,7 @@ -(void)setupAxes // We add constraints to this axis below CPTXYAxis *y2 = [[CPTXYAxis alloc] initWithFrame:CGRectZero]; y2.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - y2.orthogonalCoordinateDecimal = CPTDecimalFromDouble(3.0); + y2.orthogonalPosition = @3.0; y2.minorTicksPerInterval = 0; y2.preferredNumberOfMajorTicks = 4; y2.majorGridLineStyle = majorGridLineStyle; @@ -195,9 +195,9 @@ -(void)setupAxes y2.majorTickLineStyle = redLineStyle; y2.minorTickLineStyle = nil; y2.labelTextStyle = nil; - y2.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(2) length:CPTDecimalFromInteger(3)]; + y2.visibleRange = [CPTPlotRange plotRangeWithLocation:@2.0 length:@3.0]; y2.title = @"Y2 title"; - y2.titleLocation = CPTDecimalFromInteger(3); + y2.titleLocation = @3.0; // Set axes graph.axisSet.axes = @[x, y, y2]; } @@ -226,7 +226,7 @@ -(void)setupScatterPlots fillImage.tiled = YES; CPTFill *areaImageFill = [CPTFill fillWithImage:fillImage]; boundLinePlot.areaFill = areaImageFill; - boundLinePlot.areaBaseValue = [[NSDecimalNumber one] decimalValue]; + boundLinePlot.areaBaseValue = @1.0; // Add plot symbols CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; @@ -271,7 +271,7 @@ -(void)setupScatterPlots areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); + dataSourceLinePlot.areaBaseValue = @1.75; if ( !hasData ) { // Add some initial data @@ -296,12 +296,12 @@ -(void)setupScatterPlots [plotSpace scaleToFitPlots:@[boundLinePlot, dataSourceLinePlot]]; CPTPlotRange *xRange = plotSpace.xRange; CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.1)]; + [yRange expandRangeByFactor:@1.1]; plotSpace.yRange = yRange; // Restrict y range to a global range - plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(5.0)]; - plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(6.0)]; + plotSpace.globalXRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@5.0]; + plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@6.0]; // set the x and y shift to match the new ranges CGFloat length = xRange.lengthDouble; @@ -323,30 +323,30 @@ -(void)setupBarPlots // Add plot space for horizontal bar charts CPTXYPlotSpace *barPlotSpace = [[CPTXYPlotSpace alloc] init]; - barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-20.0f) length:CPTDecimalFromFloat(200.0f)]; - barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-7.0f) length:CPTDecimalFromFloat(15.0f)]; + barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-20.0) length:@200.0]; + barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-7.0) length:@15.0]; [graph addPlotSpace:barPlotSpace]; // First bar plot CPTMutableTextStyle *whiteTextStyle = [CPTMutableTextStyle textStyle]; whiteTextStyle.color = [CPTColor whiteColor]; CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:YES]; - barPlot.baseValue = CPTDecimalFromFloat(20.0f); + barPlot.baseValue = @20.0; barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(-0.25f); + barPlot.barOffset = @(-0.25); barPlot.identifier = barPlot1; - barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(7.0)]; + barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@7.0]; barPlot.labelTextStyle = whiteTextStyle; [graph addPlot:barPlot toPlotSpace:barPlotSpace]; // Second bar plot barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:YES]; barPlot.dataSource = self; - barPlot.baseValue = CPTDecimalFromFloat(20.0f); - barPlot.barOffset = CPTDecimalFromFloat(0.25f); + barPlot.baseValue = @20.0; + barPlot.barOffset = @0.25; barPlot.cornerRadius = 2.0; barPlot.identifier = barPlot2; - barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(7.0)]; + barPlot.plotRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@7.0]; barPlot.delegate = self; [graph addPlot:barPlot toPlotSpace:barPlotSpace]; } @@ -510,13 +510,13 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index symbolTextAnnotation.displacement = CGPointMake(0.0, 0.0); [graph.plotAreaFrame.plotArea addAnnotation:symbolTextAnnotation]; - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"barWidthScale"]; + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"barWidth"]; animation.duration = 0.25; animation.toValue = @0.0; animation.repeatCount = 1; animation.autoreverses = YES; animation.removedOnCompletion = YES; - [plot addAnimation:animation forKey:@"barWidthScale"]; + [plot addAnimation:animation forKey:@"barWidth"]; } #pragma mark - @@ -703,8 +703,8 @@ -(void)setXShift:(CGFloat)newShift xShift = newShift; CPTXYPlotSpace *space = (CPTXYPlotSpace *)graph.defaultPlotSpace; CPTMutablePlotRange *newRange = [space.xRange mutableCopy]; - newRange.length = CPTDecimalFromDouble(3.0 + newShift); - space.xRange = newRange; + newRange.lengthDouble = 3.0 + newShift; + space.xRange = newRange; } -(void)setYShift:(CGFloat)newShift @@ -712,8 +712,8 @@ -(void)setYShift:(CGFloat)newShift yShift = newShift; CPTXYPlotSpace *space = (CPTXYPlotSpace *)graph.defaultPlotSpace; CPTMutablePlotRange *newRange = [space.yRange mutableCopy]; - newRange.length = CPTDecimalFromDouble(2.0 + newShift); - space.yRange = newRange; + newRange.lengthDouble = 2.0 + newShift; + space.yRange = newRange; } -(void)setLabelRotation:(CGFloat)newRotation diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index d2388e479..f3000ebca 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -148,15 +148,15 @@ -(void)setupScatterPlots CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; [plotSpace scaleToFitPlots:@[dataSourceLinePlot]]; CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy]; - [xRange expandRangeByFactor:CPTDecimalFromDouble(0.75)]; + [xRange expandRangeByFactor:@0.75]; plotSpace.xRange = xRange; CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(0.75)]; + [yRange expandRangeByFactor:@0.75]; plotSpace.yRange = yRange; - CPTPlotRange *globalXRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.0) length:CPTDecimalFromDouble(10.0)]; + CPTPlotRange *globalXRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@10.0]; plotSpace.globalXRange = globalXRange; - CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-5.0) length:CPTDecimalFromDouble(10.0)]; + CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:@(-5.0) length:@10.0]; plotSpace.globalYRange = globalYRange; } @@ -208,11 +208,11 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI case CPTScatterPlotFieldX: switch ( index ) { case 0: - num = [NSDecimalNumber decimalNumberWithDecimal:thePlotSpace.globalXRange.minLimit]; + num = thePlotSpace.globalXRange.minLimit; break; case 1: - num = [NSDecimalNumber decimalNumberWithDecimal:thePlotSpace.globalXRange.maxLimit]; + num = thePlotSpace.globalXRange.maxLimit; break; case 2: @@ -235,11 +235,11 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI break; case 3: - num = [NSDecimalNumber decimalNumberWithDecimal:thePlotSpace.globalYRange.maxLimit]; + num = thePlotSpace.globalYRange.maxLimit; break; case 4: - num = [NSDecimalNumber decimalNumberWithDecimal:thePlotSpace.globalYRange.minLimit]; + num = thePlotSpace.globalYRange.minLimit; break; default: diff --git a/examples/CorePlotGallery/src/plots/AxisDemo.m b/examples/CorePlotGallery/src/plots/AxisDemo.m index d7a102d72..76d60513d 100644 --- a/examples/CorePlotGallery/src/plots/AxisDemo.m +++ b/examples/CorePlotGallery/src/plots/AxisDemo.m @@ -58,8 +58,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(-10.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.5) length:CPTDecimalFromDouble(10.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(-10.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.5 length:@10.0]; // Line styles CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle]; @@ -83,22 +83,22 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.separateLayers = NO; - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.5); - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.minorTicksPerInterval = 4; - x.tickDirection = CPTSignNone; - x.axisLineStyle = axisLineStyle; - x.majorTickLength = 12.0; - x.majorTickLineStyle = axisLineStyle; - x.majorGridLineStyle = majorGridLineStyle; - x.minorTickLength = 8.0; - x.minorGridLineStyle = minorGridLineStyle; - x.title = @"X Axis"; - x.titleTextStyle = axisTitleTextStyle; - x.titleOffset = 25.0; - x.alternatingBandFills = @[[[CPTColor redColor] colorWithAlphaComponent:0.1], [[CPTColor greenColor] colorWithAlphaComponent:0.1]]; - x.delegate = self; + x.separateLayers = NO; + x.orthogonalPosition = @0.5; + x.majorIntervalLength = @0.5; + x.minorTicksPerInterval = 4; + x.tickDirection = CPTSignNone; + x.axisLineStyle = axisLineStyle; + x.majorTickLength = 12.0; + x.majorTickLineStyle = axisLineStyle; + x.majorGridLineStyle = majorGridLineStyle; + x.minorTickLength = 8.0; + x.minorGridLineStyle = minorGridLineStyle; + x.title = @"X Axis"; + x.titleTextStyle = axisTitleTextStyle; + x.titleOffset = 25.0; + x.alternatingBandFills = @[[[CPTColor redColor] colorWithAlphaComponent:0.1], [[CPTColor greenColor] colorWithAlphaComponent:0.1]]; + x.delegate = self; // Label y with an automatic labeling policy. axisLineStyle.lineColor = [CPTColor greenColor]; @@ -121,8 +121,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme y.delegate = self; CPTFill *bandFill = [CPTFill fillWithColor:[[CPTColor darkGrayColor] colorWithAlphaComponent:0.5]]; - [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(7.0) length:CPTDecimalFromDouble(1.5)] fill:bandFill]]; - [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.5) length:CPTDecimalFromDouble(3.0)] fill:bandFill]]; + [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@7.0 length:@1.5] fill:bandFill]]; + [y addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@1.5 length:@3.0] fill:bandFill]]; // Label y2 with an equal division labeling policy. axisLineStyle.lineColor = [CPTColor orangeColor]; @@ -130,7 +130,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTXYAxis *y2 = [[[CPTXYAxis alloc] init] autorelease]; y2.coordinate = CPTCoordinateY; y2.plotSpace = plotSpace; - y2.orthogonalCoordinateDecimal = CPTDecimalFromDouble(-10.0); + y2.orthogonalPosition = @(-10.0); y2.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions; y2.separateLayers = NO; y2.preferredNumberOfMajorTicks = 6; @@ -155,9 +155,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme -(void)axis:(CPTAxis *)axis labelWasSelected:(CPTAxisLabel *)label { - NSDecimal labelLocation = label.tickLocation; - - NSLog( @"%@ label was selected at location %@", axis.title, NSDecimalString(&labelLocation, nil) ); + NSLog(@"%@ label was selected at location %@", axis.title, label.tickLocation); } @end diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index 14f8ff1c2..d06bfee7a 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -85,7 +85,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Axes CPTXYAxisSet *xyAxisSet = (id)graph.axisSet; CPTXYAxis *xAxis = xyAxisSet.xAxis; - xAxis.majorIntervalLength = CPTDecimalFromDouble(oneDay); + xAxis.majorIntervalLength = @(oneDay); xAxis.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; @@ -102,7 +102,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [lineCap release]; CPTXYAxis *yAxis = xyAxisSet.yAxis; - yAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(-0.5 * oneDay); + yAxis.orthogonalPosition = @(-0.5 * oneDay); // Line plot with gradient fill CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] initWithFrame:graph.bounds] autorelease]; @@ -117,14 +117,14 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(0.0); + dataSourceLinePlot.areaBaseValue = @0.0; areaColor = [CPTColor colorWithComponentRed:0.0 green:1.0 blue:0.0 alpha:0.6]; areaGradient = [CPTGradient gradientWithBeginningColor:[CPTColor clearColor] endingColor:areaColor]; areaGradient.angle = -90.0; areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill2 = areaGradientFill; - dataSourceLinePlot.areaBaseValue2 = CPTDecimalFromDouble(5.0); + dataSourceLinePlot.areaBaseValue2 = @5.0; CPTMutableShadow *whiteShadow = [CPTMutableShadow shadow]; whiteShadow.shadowOffset = CGSizeMake(2.0, -2.0); @@ -167,8 +167,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Set plot ranges CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-0.5 * oneDay) length:CPTDecimalFromDouble(oneDay * plotData.count)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(4)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-0.5 * oneDay) length:@(oneDay * plotData.count)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]; } -(void)dealloc diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 9a635e688..e007e0b7e 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -61,20 +61,20 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; { - x.majorIntervalLength = CPTDecimalFromInteger(1); - x.minorTicksPerInterval = 0; - x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); - x.majorGridLineStyle = majorGridLineStyle; - x.minorGridLineStyle = minorGridLineStyle; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.labelFormatter = nil; + x.majorIntervalLength = @1.0; + x.minorTicksPerInterval = 0; + x.orthogonalPosition = @0.0; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; + x.axisLineStyle = nil; + x.majorTickLineStyle = nil; + x.minorTickLineStyle = nil; + x.labelFormatter = nil; } CPTXYAxis *y = axisSet.yAxis; { - y.majorIntervalLength = CPTDecimalFromInteger(10); + y.majorIntervalLength = @10.0; y.minorTicksPerInterval = 9; y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; y.preferredNumberOfMajorTicks = 8; @@ -99,7 +99,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Create bar plot CPTBarPlot *barPlot = [[[CPTBarPlot alloc] init] autorelease]; barPlot.lineStyle = barLineStyle; - barPlot.barWidth = CPTDecimalFromFloat(0.75f); // bar is 75% of the available space + barPlot.barWidth = @0.75; // bar is 75% of the available space barPlot.barCornerRadius = 4.0; barPlot.barsAreHorizontal = NO; barPlot.dataSource = self; @@ -109,11 +109,11 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Plot space CPTMutablePlotRange *barRange = [[[barPlot plotRangeEnclosingBars] mutableCopy] autorelease]; - [barRange expandRangeByFactor:CPTDecimalFromDouble(1.05)]; + [barRange expandRangeByFactor:@1.05]; CPTXYPlotSpace *barPlotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; barPlotSpace.xRange = barRange; - barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(16.0f)]; + barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; // Add legend CPTLegend *theLegend = [CPTLegend legendWithGraph:graph]; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 1e5a2e3bd..19b47c71c 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -181,27 +181,27 @@ -(void)renderScatterPlotInLayer:(CPTGraphHostingView *)layerHostingView withThem // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)scatterPlot.defaultPlotSpace; plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(2.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.0) length:CPTDecimalFromFloat(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)scatterPlot.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(2.99) length:CPTDecimalFromFloat(0.02)]]; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 2; + NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(1.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.99) length:CPTDecimalFromFloat(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(3.99) length:CPTDecimalFromFloat(0.02)]]; + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @2.0; + exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]]; y.labelExclusionRanges = exclusionRanges; // Create a blue plot area @@ -222,7 +222,7 @@ -(void)renderScatterPlotInLayer:(CPTGraphHostingView *)layerHostingView withThem areaGradient1.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient1]; boundLinePlot.areaFill = areaGradientFill; - boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; + boundLinePlot.areaBaseValue = @0.0; boundLinePlot.delegate = self; // Add plot symbols @@ -252,7 +252,7 @@ -(void)renderScatterPlotInLayer:(CPTGraphHostingView *)layerHostingView withThem areaGradient.angle = -90.0; areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); + dataSourceLinePlot.areaBaseValue = @1.75; // Animate in the new plot, as an example dataSourceLinePlot.opacity = 1.0; @@ -299,20 +299,20 @@ -(void)renderBarPlotInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(C } CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(300.0f)]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0f) length:CPTDecimalFromFloat(17.0f)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@17.0]; if ( drawAxis ) { CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = CPTDecimalFromDouble(5.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; + x.axisLineStyle = nil; + x.majorTickLineStyle = nil; + x.minorTickLineStyle = nil; + x.majorIntervalLength = @5.0; + x.orthogonalPosition = @0.0; + x.title = @"X Axis"; + x.titleLocation = @7.5; + x.titleOffset = 55.0; // Define some custom labels for the data elements x.labelRotation = M_PI_4; @@ -323,7 +323,7 @@ -(void)renderBarPlotInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(C NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = [tickLocation decimalValue]; + newLabel.tickLocation = tickLocation; newLabel.offset = x.labelOffset + x.majorTickLength; newLabel.rotation = M_PI_4; [customLabels addObject:newLabel]; @@ -333,14 +333,14 @@ -(void)renderBarPlotInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(C x.axisLabels = customLabels; CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = CPTDecimalFromDouble(50.0); - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); + y.axisLineStyle = nil; + y.majorTickLineStyle = nil; + y.minorTickLineStyle = nil; + y.majorIntervalLength = @50.0; + y.orthogonalPosition = @0.0; + y.title = @"Y Axis"; + y.titleOffset = 45.0; + y.titleLocation = @150.0; } // First bar plot @@ -352,7 +352,7 @@ -(void)renderBarPlotInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(C // Second bar plot barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(0.25f); // 25% offset, 75% overlap + barPlot.barOffset = @0.25; // 25% offset, 75% overlap barPlot.barCornerRadius = 2.0; barPlot.identifier = @"Bar Plot 2"; barPlot.delegate = self; diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index cca3e30f6..5a9b986a2 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -176,8 +176,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTMutablePlotRange *xRange = [[plotSpace.xRange mutableCopy] autorelease]; CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; - x.orthogonalCoordinateDecimal = yRange.location; - y.orthogonalCoordinateDecimal = xRange.location; + x.orthogonalPosition = yRange.location; + y.orthogonalPosition = xRange.location; x.visibleRange = xRange; y.visibleRange = yRange; @@ -185,8 +185,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme x.gridLinesRange = yRange; y.gridLinesRange = xRange; - [xRange expandRangeByFactor:CPTDecimalFromDouble(1.05)]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.05)]; + [xRange expandRangeByFactor:@1.05]; + [yRange expandRangeByFactor:@1.05]; plotSpace.xRange = xRange; plotSpace.yRange = yRange; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 1783e4dd7..81cb33b9e 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -155,7 +155,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.1); + x.majorIntervalLength = @0.1; x.minorTicksPerInterval = 4; x.majorGridLineStyle = majorGridLineStyle; x.minorGridLineStyle = minorGridLineStyle; @@ -229,19 +229,19 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; // Expand the ranges to put some space around the plot - [xRange expandRangeByFactor:CPTDecimalFromDouble(1.2)]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.2)]; + [xRange expandRangeByFactor:@1.2]; + [yRange expandRangeByFactor:@1.2]; plotSpace.xRange = xRange; plotSpace.yRange = yRange; - [xRange expandRangeByFactor:CPTDecimalFromDouble(1.025)]; + [xRange expandRangeByFactor:@1.025]; xRange.location = plotSpace.xRange.location; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.05)]; + [yRange expandRangeByFactor:@1.05]; x.visibleAxisRange = xRange; y.visibleAxisRange = yRange; - [xRange expandRangeByFactor:CPTDecimalFromDouble(3.0)]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(3.0)]; + [xRange expandRangeByFactor:@3.0]; + [yRange expandRangeByFactor:@3.0]; plotSpace.globalXRange = xRange; plotSpace.globalYRange = yRange; @@ -328,13 +328,13 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR switch ( coordinate ) { case CPTCoordinateX: - [changedRange expandRangeByFactor:CPTDecimalFromDouble(1.025)]; + [changedRange expandRangeByFactor:@1.025]; changedRange.location = newRange.location; axisSet.xAxis.visibleAxisRange = changedRange; break; case CPTCoordinateY: - [changedRange expandRangeByFactor:CPTDecimalFromDouble(1.05)]; + [changedRange expandRangeByFactor:@1.05]; axisSet.yAxis.visibleAxisRange = changedRange; break; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index cb5e16c91..d3e44d2de 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -90,15 +90,15 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; NSTimeInterval xLow = 0.0; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xLow) length:CPTDecimalFromDouble(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromFloat(oneDay); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 0; + x.majorIntervalLength = @(oneDay); + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; @@ -107,9 +107,9 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme x.labelRotation = M_PI_4; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(oneDay); + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @(oneDay); // Create a plot that uses the data source method CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 9c9782f6d..581f4c1cb 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -74,8 +74,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(2.0 * M_PI)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-1.1) length:CPTDecimalFromDouble(2.2)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(2.0 * M_PI)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-1.1) length:@2.2]; // Grid line styles CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; @@ -93,7 +93,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(M_PI_4); + x.majorIntervalLength = @(M_PI_4); x.minorTicksPerInterval = 3; x.labelFormatter = formatter; x.majorGridLineStyle = majorGridLineStyle; @@ -196,8 +196,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme } // Restrict y range to a global range - CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-2.5) - length:CPTDecimalFromDouble(5.0)]; + CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:@(-2.5) + length:@5.0]; plotSpace.globalYRange = globalYRange; // Add legend diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 5e5aafead..996163a92 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -91,20 +91,20 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0); - x.minorTicksPerInterval = 2; - x.majorGridLineStyle = majorGridLineStyle; - x.minorGridLineStyle = minorGridLineStyle; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @1.0; + x.minorTicksPerInterval = 2; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; x.title = @"X Axis"; x.titleOffset = 30.0; - x.titleLocation = CPTDecimalFromDouble(1.25); + x.titleLocation = @1.25; // Label y with an automatic label policy. CPTXYAxis *y = axisSet.yAxis; y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0); + y.orthogonalPosition = @1.0; y.minorTicksPerInterval = 2; y.preferredNumberOfMajorTicks = 8; y.majorGridLineStyle = majorGridLineStyle; @@ -113,7 +113,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme y.title = @"Y Axis"; y.titleOffset = 30.0; - y.titleLocation = CPTDecimalFromDouble(1.0); + y.titleLocation = @1.0; // Create a plot that uses the data source method CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; @@ -133,23 +133,23 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(0.0); + dataSourceLinePlot.areaBaseValue = @0.0; // Add some fill bands CPTColor *band1Color = [CPTColor colorWithComponentRed:0.3 green:0.3 blue:1.0 alpha:0.8]; CPTGradient *band1Gradient = [CPTGradient gradientWithBeginningColor:band1Color endingColor:[CPTColor clearColor]]; band1Gradient.angle = -90.0; CPTFill *band1Fill = [CPTFill fillWithGradient:band1Gradient]; - [dataSourceLinePlot addAreaFillBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.05) - length:CPTDecimalFromDouble(0.15)] + [dataSourceLinePlot addAreaFillBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@1.05 + length:@0.15] fill:band1Fill]]; CPTColor *band2Color = [CPTColor colorWithComponentRed:1.0 green:0.3 blue:0.3 alpha:0.8]; CPTGradient *band2Gradient = [CPTGradient gradientWithBeginningColor:band2Color endingColor:[CPTColor clearColor]]; band2Gradient.angle = -90.0; CPTFill *band2Fill = [CPTFill fillWithGradient:band2Gradient]; - [dataSourceLinePlot addAreaFillBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.3) - length:CPTDecimalFromDouble(0.1)] + [dataSourceLinePlot addAreaFillBand:[CPTLimitBand limitBandWithRange:[CPTPlotRange plotRangeWithLocation:@1.3 + length:@0.1] fill:band2Fill]]; // Auto scale the plot space to fit the plot data @@ -157,14 +157,14 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [plotSpace scaleToFitPlots:@[dataSourceLinePlot]]; CPTMutablePlotRange *xRange = [[plotSpace.xRange mutableCopy] autorelease]; CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; - [xRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; + [xRange expandRangeByFactor:@1.3]; + [yRange expandRangeByFactor:@1.3]; plotSpace.xRange = xRange; plotSpace.yRange = yRange; // Restrict y range to a global range - CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) - length:CPTDecimalFromFloat(2.0f)]; + CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@2.0]; plotSpace.globalYRange = globalYRange; // Add plot symbols @@ -218,7 +218,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { - CPTPlotRange *maxRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0f) length:CPTDecimalFromFloat(6.0f)]; + CPTPlotRange *maxRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@6.0]; CPTMutablePlotRange *changedRange = [[newRange mutableCopy] autorelease]; [changedRange shiftEndToFitInRange:maxRange]; [changedRange shiftLocationToFitInRange:maxRange]; diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index 6453edc33..40b0aa44b 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -53,8 +53,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(100)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.75) length:CPTDecimalFromInteger(-5)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@5.75 length:@(-5.0)]; // Line styles CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle]; @@ -84,25 +84,25 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Axes // CPTAxisLabelingPolicyNone CPTXYAxis *axisNone = [[[CPTXYAxis alloc] init] autorelease]; - axisNone.plotSpace = graph.defaultPlotSpace; - axisNone.labelingPolicy = CPTAxisLabelingPolicyNone; - axisNone.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(1); - axisNone.tickDirection = CPTSignNone; - axisNone.axisLineStyle = axisLineStyle; - axisNone.majorTickLength = majorTickLength; - axisNone.majorTickLineStyle = majorTickLineStyle; - axisNone.minorTickLength = minorTickLength; - axisNone.minorTickLineStyle = minorTickLineStyle; - axisNone.title = @"CPTAxisLabelingPolicyNone"; - axisNone.titleTextStyle = axisTitleTextStyle; - axisNone.titleOffset = titleOffset; - axisNone.majorTickLocations = majorTickLocations; - axisNone.minorTickLocations = minorTickLocations; + axisNone.plotSpace = graph.defaultPlotSpace; + axisNone.labelingPolicy = CPTAxisLabelingPolicyNone; + axisNone.orthogonalPosition = @1.0; + axisNone.tickDirection = CPTSignNone; + axisNone.axisLineStyle = axisLineStyle; + axisNone.majorTickLength = majorTickLength; + axisNone.majorTickLineStyle = majorTickLineStyle; + axisNone.minorTickLength = minorTickLength; + axisNone.minorTickLineStyle = minorTickLineStyle; + axisNone.title = @"CPTAxisLabelingPolicyNone"; + axisNone.titleTextStyle = axisTitleTextStyle; + axisNone.titleOffset = titleOffset; + axisNone.majorTickLocations = majorTickLocations; + axisNone.minorTickLocations = minorTickLocations; NSMutableSet *newAxisLabels = [NSMutableSet set]; for ( NSUInteger i = 0; i <= 5; i++ ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"Label %lu", (unsigned long)i] textStyle:axisNone.labelTextStyle]; - newLabel.tickLocation = CPTDecimalFromUnsignedInteger(i * 20); + newLabel.tickLocation = @(i * 20); newLabel.offset = axisNone.labelOffset + axisNone.majorTickLength / 2.0; [newAxisLabels addObject:newLabel]; @@ -112,59 +112,59 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // CPTAxisLabelingPolicyLocationsProvided CPTXYAxis *axisLocationsProvided = [[[CPTXYAxis alloc] init] autorelease]; - axisLocationsProvided.plotSpace = graph.defaultPlotSpace; - axisLocationsProvided.labelingPolicy = CPTAxisLabelingPolicyLocationsProvided; - axisLocationsProvided.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(2); - axisLocationsProvided.tickDirection = CPTSignNone; - axisLocationsProvided.axisLineStyle = axisLineStyle; - axisLocationsProvided.majorTickLength = majorTickLength; - axisLocationsProvided.majorTickLineStyle = majorTickLineStyle; - axisLocationsProvided.minorTickLength = minorTickLength; - axisLocationsProvided.minorTickLineStyle = minorTickLineStyle; - axisLocationsProvided.title = @"CPTAxisLabelingPolicyLocationsProvided"; - axisLocationsProvided.titleTextStyle = axisTitleTextStyle; - axisLocationsProvided.titleOffset = titleOffset; - axisLocationsProvided.majorTickLocations = majorTickLocations; - axisLocationsProvided.minorTickLocations = minorTickLocations; + axisLocationsProvided.plotSpace = graph.defaultPlotSpace; + axisLocationsProvided.labelingPolicy = CPTAxisLabelingPolicyLocationsProvided; + axisLocationsProvided.orthogonalPosition = @2.0; + axisLocationsProvided.tickDirection = CPTSignNone; + axisLocationsProvided.axisLineStyle = axisLineStyle; + axisLocationsProvided.majorTickLength = majorTickLength; + axisLocationsProvided.majorTickLineStyle = majorTickLineStyle; + axisLocationsProvided.minorTickLength = minorTickLength; + axisLocationsProvided.minorTickLineStyle = minorTickLineStyle; + axisLocationsProvided.title = @"CPTAxisLabelingPolicyLocationsProvided"; + axisLocationsProvided.titleTextStyle = axisTitleTextStyle; + axisLocationsProvided.titleOffset = titleOffset; + axisLocationsProvided.majorTickLocations = majorTickLocations; + axisLocationsProvided.minorTickLocations = minorTickLocations; // CPTAxisLabelingPolicyFixedInterval CPTXYAxis *axisFixedInterval = [[[CPTXYAxis alloc] init] autorelease]; - axisFixedInterval.plotSpace = graph.defaultPlotSpace; - axisFixedInterval.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axisFixedInterval.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(3); - axisFixedInterval.majorIntervalLength = CPTDecimalFromDouble(25.0); - axisFixedInterval.minorTicksPerInterval = 4; - axisFixedInterval.tickDirection = CPTSignNone; - axisFixedInterval.axisLineStyle = axisLineStyle; - axisFixedInterval.majorTickLength = majorTickLength; - axisFixedInterval.majorTickLineStyle = majorTickLineStyle; - axisFixedInterval.minorTickLength = minorTickLength; - axisFixedInterval.minorTickLineStyle = minorTickLineStyle; - axisFixedInterval.title = @"CPTAxisLabelingPolicyFixedInterval"; - axisFixedInterval.titleTextStyle = axisTitleTextStyle; - axisFixedInterval.titleOffset = titleOffset; + axisFixedInterval.plotSpace = graph.defaultPlotSpace; + axisFixedInterval.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axisFixedInterval.orthogonalPosition = @3.0; + axisFixedInterval.majorIntervalLength = @25.0; + axisFixedInterval.minorTicksPerInterval = 4; + axisFixedInterval.tickDirection = CPTSignNone; + axisFixedInterval.axisLineStyle = axisLineStyle; + axisFixedInterval.majorTickLength = majorTickLength; + axisFixedInterval.majorTickLineStyle = majorTickLineStyle; + axisFixedInterval.minorTickLength = minorTickLength; + axisFixedInterval.minorTickLineStyle = minorTickLineStyle; + axisFixedInterval.title = @"CPTAxisLabelingPolicyFixedInterval"; + axisFixedInterval.titleTextStyle = axisTitleTextStyle; + axisFixedInterval.titleOffset = titleOffset; // CPTAxisLabelingPolicyAutomatic CPTXYAxis *axisAutomatic = [[[CPTXYAxis alloc] init] autorelease]; - axisAutomatic.plotSpace = graph.defaultPlotSpace; - axisAutomatic.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - axisAutomatic.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(4); - axisAutomatic.minorTicksPerInterval = 9; - axisAutomatic.tickDirection = CPTSignNone; - axisAutomatic.axisLineStyle = axisLineStyle; - axisAutomatic.majorTickLength = majorTickLength; - axisAutomatic.majorTickLineStyle = majorTickLineStyle; - axisAutomatic.minorTickLength = minorTickLength; - axisAutomatic.minorTickLineStyle = minorTickLineStyle; - axisAutomatic.title = @"CPTAxisLabelingPolicyAutomatic"; - axisAutomatic.titleTextStyle = axisTitleTextStyle; - axisAutomatic.titleOffset = titleOffset; + axisAutomatic.plotSpace = graph.defaultPlotSpace; + axisAutomatic.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + axisAutomatic.orthogonalPosition = @4.0; + axisAutomatic.minorTicksPerInterval = 9; + axisAutomatic.tickDirection = CPTSignNone; + axisAutomatic.axisLineStyle = axisLineStyle; + axisAutomatic.majorTickLength = majorTickLength; + axisAutomatic.majorTickLineStyle = majorTickLineStyle; + axisAutomatic.minorTickLength = minorTickLength; + axisAutomatic.minorTickLineStyle = minorTickLineStyle; + axisAutomatic.title = @"CPTAxisLabelingPolicyAutomatic"; + axisAutomatic.titleTextStyle = axisTitleTextStyle; + axisAutomatic.titleOffset = titleOffset; // CPTAxisLabelingPolicyEqualDivisions CPTXYAxis *axisEqualDivisions = [[[CPTXYAxis alloc] init] autorelease]; axisEqualDivisions.plotSpace = graph.defaultPlotSpace; axisEqualDivisions.labelingPolicy = CPTAxisLabelingPolicyEqualDivisions; - axisEqualDivisions.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(5); + axisEqualDivisions.orthogonalPosition = @5.0; axisEqualDivisions.preferredNumberOfMajorTicks = 7; axisEqualDivisions.minorTicksPerInterval = 4; axisEqualDivisions.tickDirection = CPTSignNone; diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index 7c04c0dc3..14757715f 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -49,8 +49,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(100)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(5.5) length:CPTDecimalFromInteger(-6)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@5.5 length:@(-6.0)]; // Line styles CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle]; @@ -67,10 +67,10 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme for ( CPTLineCapType lineCapType = CPTLineCapTypeNone; lineCapType < CPTLineCapTypeCustom; ) { CPTXYAxis *axis = [[CPTXYAxis alloc] init]; - axis.plotSpace = graph.defaultPlotSpace; - axis.labelingPolicy = CPTAxisLabelingPolicyNone; - axis.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(lineCapType / 2); - axis.axisLineStyle = axisLineStyle; + axis.plotSpace = graph.defaultPlotSpace; + axis.labelingPolicy = CPTAxisLabelingPolicyNone; + axis.orthogonalPosition = @(lineCapType / 2); + axis.axisLineStyle = axisLineStyle; lineCap.lineCapType = lineCapType++; axis.axisLineCapMin = lineCap; diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 73d639913..8b806770a 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -85,7 +85,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Axes CPTXYAxisSet *xyAxisSet = (id)graph.axisSet; CPTXYAxis *xAxis = xyAxisSet.xAxis; - xAxis.majorIntervalLength = CPTDecimalFromDouble(oneDay); + xAxis.majorIntervalLength = @(oneDay); xAxis.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; @@ -101,7 +101,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [lineCap release]; CPTXYAxis *yAxis = xyAxisSet.yAxis; - yAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(-0.5 * oneDay); + yAxis.orthogonalPosition = @(-0.5 * oneDay); // Line plot with gradient fill CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] initWithFrame:graph.bounds] autorelease]; @@ -116,14 +116,14 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(0.0); + dataSourceLinePlot.areaBaseValue = @0.0; areaColor = [CPTColor colorWithComponentRed:0.0 green:1.0 blue:0.0 alpha:0.6]; areaGradient = [CPTGradient gradientWithBeginningColor:[CPTColor clearColor] endingColor:areaColor]; areaGradient.angle = -90.0; areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill2 = areaGradientFill; - dataSourceLinePlot.areaBaseValue2 = CPTDecimalFromDouble(5.0); + dataSourceLinePlot.areaBaseValue2 = @5.0; // OHLC plot CPTMutableLineStyle *whiteLineStyle = [CPTMutableLineStyle lineStyle]; @@ -156,8 +156,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Set plot ranges CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(-0.5 * oneDay) length:CPTDecimalFromDouble(oneDay * plotData.count)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(4)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-0.5 * oneDay) length:@(oneDay * plotData.count)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@4.0]; } -(void)dealloc diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m index 89f3b3fa7..21538f907 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m @@ -70,21 +70,21 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Plot Spaces CPTXYPlotSpace *linearPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease]; - linearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(100)]; - linearPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(4.5) length:CPTDecimalFromInteger(-4)]; + linearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; + linearPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@4.5 length:@(-4.0)]; CPTXYPlotSpace *negativeLinearPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease]; - negativeLinearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(100) length:CPTDecimalFromInteger(-100)]; + negativeLinearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@100.0 length:@(-100.0)]; negativeLinearPlotSpace.yRange = linearPlotSpace.yRange; CPTXYPlotSpace *logPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease]; logPlotSpace.xScaleType = CPTScaleTypeLog; - logPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.1) length:CPTDecimalFromDouble(99.9)]; + logPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.1 length:@99.9]; logPlotSpace.yRange = linearPlotSpace.yRange; CPTXYPlotSpace *negativeLogPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease]; negativeLogPlotSpace.xScaleType = CPTScaleTypeLog; - negativeLogPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(100) length:CPTDecimalFromDouble(-99.9)]; + negativeLogPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@100.0 length:@(-99.9)]; negativeLogPlotSpace.yRange = linearPlotSpace.yRange; [graph removePlotSpace:graph.defaultPlotSpace]; @@ -96,67 +96,67 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Axes // Linear axis--positive direction CPTXYAxis *linearAxis = [[[CPTXYAxis alloc] init] autorelease]; - linearAxis.plotSpace = linearPlotSpace; - linearAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - linearAxis.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(1); - linearAxis.minorTicksPerInterval = 9; - linearAxis.tickDirection = CPTSignNone; - linearAxis.axisLineStyle = axisLineStyle; - linearAxis.majorTickLength = majorTickLength; - linearAxis.majorTickLineStyle = majorTickLineStyle; - linearAxis.minorTickLength = minorTickLength; - linearAxis.minorTickLineStyle = minorTickLineStyle; - linearAxis.title = @"Linear Plot Space—Positive Length"; - linearAxis.titleTextStyle = axisTitleTextStyle; - linearAxis.titleOffset = titleOffset; + linearAxis.plotSpace = linearPlotSpace; + linearAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + linearAxis.orthogonalPosition = @1.0; + linearAxis.minorTicksPerInterval = 9; + linearAxis.tickDirection = CPTSignNone; + linearAxis.axisLineStyle = axisLineStyle; + linearAxis.majorTickLength = majorTickLength; + linearAxis.majorTickLineStyle = majorTickLineStyle; + linearAxis.minorTickLength = minorTickLength; + linearAxis.minorTickLineStyle = minorTickLineStyle; + linearAxis.title = @"Linear Plot Space—Positive Length"; + linearAxis.titleTextStyle = axisTitleTextStyle; + linearAxis.titleOffset = titleOffset; // Linear axis--negative direction CPTXYAxis *negativeLinearAxis = [[[CPTXYAxis alloc] init] autorelease]; - negativeLinearAxis.plotSpace = negativeLinearPlotSpace; - negativeLinearAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - negativeLinearAxis.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(2); - negativeLinearAxis.minorTicksPerInterval = 9; - negativeLinearAxis.tickDirection = CPTSignNone; - negativeLinearAxis.axisLineStyle = axisLineStyle; - negativeLinearAxis.majorTickLength = majorTickLength; - negativeLinearAxis.majorTickLineStyle = majorTickLineStyle; - negativeLinearAxis.minorTickLength = minorTickLength; - negativeLinearAxis.minorTickLineStyle = minorTickLineStyle; - negativeLinearAxis.title = @"Linear Plot Space—Negative Length"; - negativeLinearAxis.titleTextStyle = axisTitleTextStyle; - negativeLinearAxis.titleOffset = titleOffset; + negativeLinearAxis.plotSpace = negativeLinearPlotSpace; + negativeLinearAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + negativeLinearAxis.orthogonalPosition = @2.0; + negativeLinearAxis.minorTicksPerInterval = 9; + negativeLinearAxis.tickDirection = CPTSignNone; + negativeLinearAxis.axisLineStyle = axisLineStyle; + negativeLinearAxis.majorTickLength = majorTickLength; + negativeLinearAxis.majorTickLineStyle = majorTickLineStyle; + negativeLinearAxis.minorTickLength = minorTickLength; + negativeLinearAxis.minorTickLineStyle = minorTickLineStyle; + negativeLinearAxis.title = @"Linear Plot Space—Negative Length"; + negativeLinearAxis.titleTextStyle = axisTitleTextStyle; + negativeLinearAxis.titleOffset = titleOffset; // Log axis--positive direction CPTXYAxis *logAxis = [[[CPTXYAxis alloc] init] autorelease]; - logAxis.plotSpace = logPlotSpace; - logAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - logAxis.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(3); - logAxis.minorTicksPerInterval = 9; - logAxis.tickDirection = CPTSignNone; - logAxis.axisLineStyle = axisLineStyle; - logAxis.majorTickLength = majorTickLength; - logAxis.majorTickLineStyle = majorTickLineStyle; - logAxis.minorTickLength = minorTickLength; - logAxis.minorTickLineStyle = minorTickLineStyle; - logAxis.title = @"Log Plot Space—Positive Length"; - logAxis.titleTextStyle = axisTitleTextStyle; - logAxis.titleOffset = titleOffset; + logAxis.plotSpace = logPlotSpace; + logAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + logAxis.orthogonalPosition = @3.0; + logAxis.minorTicksPerInterval = 9; + logAxis.tickDirection = CPTSignNone; + logAxis.axisLineStyle = axisLineStyle; + logAxis.majorTickLength = majorTickLength; + logAxis.majorTickLineStyle = majorTickLineStyle; + logAxis.minorTickLength = minorTickLength; + logAxis.minorTickLineStyle = minorTickLineStyle; + logAxis.title = @"Log Plot Space—Positive Length"; + logAxis.titleTextStyle = axisTitleTextStyle; + logAxis.titleOffset = titleOffset; // Log axis--negative direction CPTXYAxis *negativeLogAxis = [[[CPTXYAxis alloc] init] autorelease]; - negativeLogAxis.plotSpace = negativeLogPlotSpace; - negativeLogAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - negativeLogAxis.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(4); - negativeLogAxis.minorTicksPerInterval = 9; - negativeLogAxis.tickDirection = CPTSignNone; - negativeLogAxis.axisLineStyle = axisLineStyle; - negativeLogAxis.majorTickLength = majorTickLength; - negativeLogAxis.majorTickLineStyle = majorTickLineStyle; - negativeLogAxis.minorTickLength = minorTickLength; - negativeLogAxis.minorTickLineStyle = minorTickLineStyle; - negativeLogAxis.title = @"Log Plot Space—Negative Length"; - negativeLogAxis.titleTextStyle = axisTitleTextStyle; - negativeLogAxis.titleOffset = titleOffset; + negativeLogAxis.plotSpace = negativeLogPlotSpace; + negativeLogAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + negativeLogAxis.orthogonalPosition = @4.0; + negativeLogAxis.minorTicksPerInterval = 9; + negativeLogAxis.tickDirection = CPTSignNone; + negativeLogAxis.axisLineStyle = axisLineStyle; + negativeLogAxis.majorTickLength = majorTickLength; + negativeLogAxis.majorTickLineStyle = majorTickLineStyle; + negativeLogAxis.minorTickLength = minorTickLength; + negativeLogAxis.minorTickLineStyle = minorTickLineStyle; + negativeLogAxis.title = @"Log Plot Space—Negative Length"; + negativeLogAxis.titleTextStyle = axisTitleTextStyle; + negativeLogAxis.titleOffset = titleOffset; // Add axes to the graph graph.axisSet.axes = @[linearAxis, negativeLinearAxis, logAxis, negativeLogAxis]; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 65b14a168..d17c008d4 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -111,15 +111,15 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; NSTimeInterval xLow = oneDay * 0.5; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xLow) length:CPTDecimalFromDouble(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.5) length:CPTDecimalFromDouble(3.5)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.5 length:@3.5]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(oneDay); - x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(2); - x.minorTicksPerInterval = 0; + x.majorIntervalLength = @(oneDay); + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; @@ -127,9 +127,9 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme x.labelFormatter = timeFormatter; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(oneDay); + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @(oneDay); // Create a plot that uses the data source method CPTRangePlot *rangePlot = [[[CPTRangePlot alloc] init] autorelease]; diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index b94fd24cc..dbf230733 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -80,13 +80,13 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // X axis CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - x.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(0); - x.majorGridLineStyle = majorGridLineStyle; - x.minorGridLineStyle = minorGridLineStyle; - x.minorTicksPerInterval = 9; - x.title = @"X Axis"; - x.titleOffset = 35.0; + x.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + x.orthogonalPosition = @0.0; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; + x.minorTicksPerInterval = 9; + x.title = @"X Axis"; + x.titleOffset = 35.0; NSNumberFormatter *labelFormatter = [[NSNumberFormatter alloc] init]; labelFormatter.numberStyle = NSNumberFormatterNoStyle; x.labelFormatter = labelFormatter; @@ -94,15 +94,15 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Y axis CPTXYAxis *y = axisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - y.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(0); - y.majorGridLineStyle = majorGridLineStyle; - y.minorGridLineStyle = minorGridLineStyle; - y.minorTicksPerInterval = 3; - y.labelOffset = 5.0; - y.title = @"Y Axis"; - y.titleOffset = 30.0; - y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; + y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + y.orthogonalPosition = @0.0; + y.majorGridLineStyle = majorGridLineStyle; + y.minorGridLineStyle = minorGridLineStyle; + y.minorTicksPerInterval = 3; + y.labelOffset = 5.0; + y.title = @"Y Axis"; + y.titleOffset = 30.0; + y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; // Rotate the labels by 45 degrees, just to show it can be done. x.labelRotation = M_PI_4; @@ -122,8 +122,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(kMaxDataPoints - 2)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(1)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(kMaxDataPoints - 2)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@1.0]; [dataTimer invalidate]; [dataTimer release]; @@ -167,10 +167,10 @@ -(void)newData:(NSTimer *)theTimer CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)theGraph.defaultPlotSpace; NSUInteger location = (currentIndex >= kMaxDataPoints ? currentIndex - kMaxDataPoints + 2 : 0); - CPTPlotRange *oldRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger( (location > 0) ? (location - 1) : 0 ) - length:CPTDecimalFromUnsignedInteger(kMaxDataPoints - 2)]; - CPTPlotRange *newRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(location) - length:CPTDecimalFromUnsignedInteger(kMaxDataPoints - 2)]; + CPTPlotRange *oldRange = [CPTPlotRange plotRangeWithLocation:@( (location > 0) ? (location - 1) : 0 ) + length:@(kMaxDataPoints - 2)]; + CPTPlotRange *newRange = [CPTPlotRange plotRangeWithLocation:@(location) + length:@(kMaxDataPoints - 2)]; [CPTAnimation animate:plotSpace property:@"xRange" diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 338979e1c..46a3127ca 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -94,20 +94,20 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme // Label x axis with a fixed interval policy CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0); - x.minorTicksPerInterval = 2; - x.majorGridLineStyle = majorGridLineStyle; - x.minorGridLineStyle = minorGridLineStyle; + x.majorIntervalLength = @0.5; + x.orthogonalPosition = @1.0; + x.minorTicksPerInterval = 2; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; x.title = @"X Axis"; x.titleOffset = 30.0; - x.titleLocation = CPTDecimalFromDouble(1.25); + x.titleLocation = @1.25; // Label y with an automatic label policy. CPTXYAxis *y = axisSet.yAxis; y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(1.0); + y.orthogonalPosition = @1.0; y.minorTicksPerInterval = 2; y.preferredNumberOfMajorTicks = 8; y.majorGridLineStyle = majorGridLineStyle; @@ -116,10 +116,9 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme y.title = @"Y Axis"; y.titleOffset = 30.0; - y.titleLocation = CPTDecimalFromDouble(1.0); + y.titleLocation = @1.0; // Set axes - //graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil]; graph.axisSet.axes = @[x, y]; // Create a plot that uses the data source method @@ -139,14 +138,14 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [plotSpace scaleToFitPlots:@[dataSourceLinePlot]]; CPTMutablePlotRange *xRange = [[plotSpace.xRange mutableCopy] autorelease]; CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; - [xRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.3)]; + [xRange expandRangeByFactor:@1.3]; + [yRange expandRangeByFactor:@1.3]; plotSpace.xRange = xRange; plotSpace.yRange = yRange; // Restrict y range to a global range - CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) - length:CPTDecimalFromFloat(2.0f)]; + CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@2.0]; plotSpace.globalYRange = globalYRange; // Add plot symbols @@ -204,7 +203,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { - CPTPlotRange *maxRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0f) length:CPTDecimalFromFloat(6.0f)]; + CPTPlotRange *maxRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@6.0]; CPTMutablePlotRange *changedRange = [[newRange mutableCopy] autorelease]; [changedRange shiftEndToFitInRange:maxRange]; [changedRange shiftLocationToFitInRange:maxRange]; diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index 9e8a791cb..d1b171a47 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -82,18 +82,18 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme areaGradient.angle = -90.0; CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); + dataSourceLinePlot.areaBaseValue = @1.75; // Auto scale the plot space to fit the plot data // Extend the y range by 10% for neatness CPTXYPlotSpace *plotSpace = (id)graph.defaultPlotSpace; [plotSpace scaleToFitPlots:@[dataSourceLinePlot]]; CPTMutablePlotRange *yRange = [[plotSpace.yRange mutableCopy] autorelease]; - [yRange expandRangeByFactor:CPTDecimalFromDouble(1.1)]; + [yRange expandRangeByFactor:@1.1]; plotSpace.yRange = yRange; // Restrict y range to a global range - CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(6.0f)]; + CPTPlotRange *globalYRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@6.0]; plotSpace.globalYRange = globalYRange; } diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index ebf3dd8fb..7034821cd 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -71,11 +71,11 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTXYPlotSpace *barPlotSpace = [[[CPTXYPlotSpace alloc] init] autorelease]; [barPlotSpace setScaleType:CPTScaleTypeCategory forCoordinate:CPTCoordinateX]; #if HORIZONTAL - barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-10.0f) length:CPTDecimalFromFloat(120.0f)]; - barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0f) length:CPTDecimalFromFloat(11.0f)]; + barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-10.0) length:@120.0]; + barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@11.0]; #else - barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-1.0f) length:CPTDecimalFromFloat(11.0f)]; - barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-10.0f) length:CPTDecimalFromFloat(120.0f)]; + barPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-1.0) length:@11.0]; + barPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-10.0) length:@120.0]; #endif [graph addPlotSpace:barPlotSpace]; @@ -93,13 +93,13 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTXYAxis *x = axisSet.xAxis; { #if HORIZONTAL - x.majorIntervalLength = CPTDecimalFromInteger(10); - x.minorTicksPerInterval = 9; - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(-0.5); + x.majorIntervalLength = @10.0; + x.minorTicksPerInterval = 9; + x.orthogonalPosition = @(-0.5); #else - x.majorIntervalLength = CPTDecimalFromInteger(1); - x.minorTicksPerInterval = 0; - x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); + x.majorIntervalLength = @1.0; + x.minorTicksPerInterval = 0; + x.orthogonalPosition = @0.0; #endif x.majorGridLineStyle = majorGridLineStyle; x.minorGridLineStyle = minorGridLineStyle; @@ -108,19 +108,19 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme x.minorTickLineStyle = nil; x.labelOffset = 10.0; #if HORIZONTAL - x.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(100.0f)]; - x.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f) length:CPTDecimalFromFloat(10.0f)]; + x.visibleRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; + x.gridLinesRange = [CPTPlotRange plotRangeWithLocation:@(-0.5) length:@10.0]; #else - x.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f) length:CPTDecimalFromFloat(10.0f)]; - x.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(100.0f)]; + x.visibleRange = [CPTPlotRange plotRangeWithLocation:@(-0.5) length:@10.0]; + x.gridLinesRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; #endif x.title = @"X Axis"; x.titleOffset = 30.0; #if HORIZONTAL - x.titleLocation = CPTDecimalFromInteger(55); + x.titleLocation = @55.0; #else - x.titleLocation = CPTDecimalFromInteger(5); + x.titleLocation = @5.0; #endif x.plotSpace = barPlotSpace; @@ -129,13 +129,13 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme CPTXYAxis *y = axisSet.yAxis; { #if HORIZONTAL - y.majorIntervalLength = CPTDecimalFromInteger(1); - y.minorTicksPerInterval = 0; - y.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); + y.majorIntervalLength = @1.0; + y.minorTicksPerInterval = 0; + y.orthogonalPosition = @0.0; #else - y.majorIntervalLength = CPTDecimalFromInteger(10); - y.minorTicksPerInterval = 9; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(-0.5); + y.majorIntervalLength = @10.0; + y.minorTicksPerInterval = 9; + y.orthogonalPosition = @(-0.5); #endif y.preferredNumberOfMajorTicks = 8; y.majorGridLineStyle = majorGridLineStyle; @@ -146,38 +146,38 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme y.labelOffset = 10.0; y.labelRotation = M_PI_2; #if HORIZONTAL - y.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f) length:CPTDecimalFromFloat(10.0f)]; - y.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(100.0f)]; + y.visibleRange = [CPTPlotRange plotRangeWithLocation:@(-0.5) length:@10.0]; + y.gridLinesRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; #else - y.visibleRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(100.0f)]; - y.gridLinesRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(-0.5f) length:CPTDecimalFromFloat(10.0f)]; + y.visibleRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; + y.gridLinesRange = [CPTPlotRange plotRangeWithLocation:@(-0.5) length:@10.0]; #endif y.title = @"Y Axis"; y.titleOffset = 30.0; #if HORIZONTAL - y.titleLocation = CPTDecimalFromInteger(5); + y.titleLocation = @5.0; #else - y.titleLocation = CPTDecimalFromInteger(55); + y.titleLocation = @55.0; #endif y.plotSpace = barPlotSpace; } - // Set axes +// Set axes graph.axisSet.axes = @[x, y]; - // Create a bar line style +// Create a bar line style CPTMutableLineStyle *barLineStyle = [[[CPTMutableLineStyle alloc] init] autorelease]; barLineStyle.lineWidth = 1.0; barLineStyle.lineColor = [CPTColor whiteColor]; - // Create first bar plot +// Create first bar plot CPTBarPlot *barPlot = [[[CPTBarPlot alloc] init] autorelease]; barPlot.lineStyle = barLineStyle; barPlot.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:1.0 green:0.0 blue:0.5 alpha:0.5]]; barPlot.barBasesVary = YES; - barPlot.barWidth = CPTDecimalFromFloat(0.5f); // bar is 50% of the available space + barPlot.barWidth = @0.5; // bar is 50% of the available space barPlot.barCornerRadius = 10.0; #if HORIZONTAL barPlot.barsAreHorizontal = YES; @@ -195,14 +195,14 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [graph addPlot:barPlot toPlotSpace:barPlotSpace]; - // Create second bar plot +// Create second bar plot CPTBarPlot *barPlot2 = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; barPlot2.lineStyle = barLineStyle; barPlot2.fill = [CPTFill fillWithColor:[CPTColor colorWithComponentRed:0.0 green:1.0 blue:0.5 alpha:0.5]]; barPlot2.barBasesVary = YES; - barPlot2.barWidth = CPTDecimalFromFloat(1.0f); // bar is full (100%) width + barPlot2.barWidth = @1.0; // bar is full (100%) width // barPlot2.barOffset = -0.125; // shifted left by 12.5% barPlot2.barCornerRadius = 2.0; #if HORIZONTAL @@ -216,7 +216,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme [graph addPlot:barPlot2 toPlotSpace:barPlotSpace]; - // Add legend +// Add legend CPTLegend *theLegend = [CPTLegend legendWithGraph:graph]; theLegend.numberOfRows = 2; theLegend.fill = [CPTFill fillWithColor:[CPTColor colorWithGenericGray:0.15]]; @@ -270,13 +270,13 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index symbolTextAnnotation = nil; } - // Setup a style for the annotation +// Setup a style for the annotation CPTMutableTextStyle *hitAnnotationTextStyle = [CPTMutableTextStyle textStyle]; hitAnnotationTextStyle.color = [CPTColor orangeColor]; hitAnnotationTextStyle.fontSize = 16.0; hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; - // Determine point of symbol in plot coordinates +// Determine point of symbol in plot coordinates NSNumber *x = @(index); NSNumber *y = @2; //[self numberForPlot:plot field:0 recordIndex:index]; #if HORIZONTAL @@ -285,13 +285,13 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index NSArray *anchorPoint = @[x, y]; #endif - // Add annotation - // First make a string for the y value +// Add annotation +// First make a string for the y value NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease]; [formatter setMaximumFractionDigits:2]; NSString *yString = [formatter stringFromNumber:value]; - // Now add the annotation to the plot area +// Now add the annotation to the plot area CPTTextLayer *textLayer = [[[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle] autorelease]; symbolTextAnnotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:plot.plotSpace anchorPlotPoint:anchorPoint]; symbolTextAnnotation.contentLayer = textLayer; @@ -313,11 +313,11 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI id num = nil; if ( fieldEnum == CPTBarPlotFieldBarLocation ) { - // location +// location num = [NSString stringWithFormat:@"Cat %lu", (unsigned long)index]; } else if ( fieldEnum == CPTBarPlotFieldBarTip ) { - // length +// length if ( [plot.identifier isEqual:@"Bar Plot 2"] ) { num = @(index); } @@ -326,7 +326,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI } } else { - // base +// base if ( [plot.identifier isEqual:@"Bar Plot 2"] ) { num = @0; } diff --git a/examples/DatePlot/Controller.m b/examples/DatePlot/Controller.m index 639bf3501..3abd1fa84 100644 --- a/examples/DatePlot/Controller.m +++ b/examples/DatePlot/Controller.m @@ -31,15 +31,15 @@ -(void)awakeFromNib // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; NSTimeInterval xLow = 0.0; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xLow) length:CPTDecimalFromDouble(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromFloat(oneDay); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 0; + x.majorIntervalLength = @(oneDay); + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; @@ -47,9 +47,9 @@ -(void)awakeFromNib x.labelFormatter = timeFormatter; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(oneDay); + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @(oneDay); // Create a plot that uses the data source method CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 97bc4830e..688a129a9 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -57,10 +57,10 @@ -(void)windowControllerDidLoadNib:(NSWindowController *)windowController // Setup plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForXAxis) - length:CPTDecimalFromDouble(ceil( (maximumValueForXAxis - minimumValueForXAxis) / majorIntervalLengthForX ) * majorIntervalLengthForX)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForYAxis) - length:CPTDecimalFromDouble(ceil( (maximumValueForYAxis - minimumValueForYAxis) / majorIntervalLengthForY ) * majorIntervalLengthForY)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForXAxis) + length:@(ceil( (maximumValueForXAxis - minimumValueForXAxis) / majorIntervalLengthForX ) * majorIntervalLengthForX)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForYAxis) + length:@(ceil( (maximumValueForYAxis - minimumValueForYAxis) / majorIntervalLengthForY ) * majorIntervalLengthForY)]; // this allows the plot to respond to mouse events [plotSpace setDelegate:self]; @@ -70,13 +70,13 @@ -(void)windowControllerDidLoadNib:(NSWindowController *)windowController CPTXYAxis *x = axisSet.xAxis; x.minorTicksPerInterval = 9; - x.majorIntervalLength = CPTDecimalFromDouble(majorIntervalLengthForX); + x.majorIntervalLength = @(majorIntervalLengthForX); x.labelOffset = 5.0; x.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; CPTXYAxis *y = axisSet.yAxis; y.minorTicksPerInterval = 9; - y.majorIntervalLength = CPTDecimalFromDouble(majorIntervalLengthForY); + y.majorIntervalLength = @(majorIntervalLengthForY); y.labelOffset = 5.0; y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; @@ -210,10 +210,10 @@ -(IBAction)zoomIn maximumValueForYAxis = MAX(start[CPTCoordinateY], end[CPTCoordinateY]); // now adjust the plot range and axes - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForXAxis) - length:CPTDecimalFromDouble(maximumValueForXAxis - minimumValueForXAxis)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForYAxis) - length:CPTDecimalFromDouble(maximumValueForYAxis - minimumValueForYAxis)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForXAxis) + length:@(maximumValueForXAxis - minimumValueForXAxis)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForYAxis) + length:@(maximumValueForYAxis - minimumValueForYAxis)]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; @@ -249,10 +249,10 @@ -(IBAction)zoomOut // now adjust the plot range and axes CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForXAxis) - length:CPTDecimalFromDouble(ceil( (maximumValueForXAxis - minimumValueForXAxis) / majorIntervalLengthForX ) * majorIntervalLengthForX)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minimumValueForYAxis) - length:CPTDecimalFromDouble(ceil( (maximumValueForYAxis - minimumValueForYAxis) / majorIntervalLengthForY ) * majorIntervalLengthForY)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForXAxis) + length:@(ceil( (maximumValueForXAxis - minimumValueForXAxis) / majorIntervalLengthForX ) * majorIntervalLengthForX)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(minimumValueForYAxis) + length:@(ceil( (maximumValueForYAxis - minimumValueForYAxis) / majorIntervalLengthForY ) * majorIntervalLengthForY)]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; axisSet.xAxis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; axisSet.yAxis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; diff --git a/examples/MinorTickLabels/Controller.m b/examples/MinorTickLabels/Controller.m index 1ca2e39d9..d49820c05 100644 --- a/examples/MinorTickLabels/Controller.m +++ b/examples/MinorTickLabels/Controller.m @@ -31,15 +31,15 @@ -(void)awakeFromNib // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; NSTimeInterval xLow = 0.0; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xLow) length:CPTDecimalFromDouble(oneDay * 3.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 3.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromFloat(oneDay); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 3; + x.majorIntervalLength = @(oneDay); + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 3; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; @@ -55,9 +55,9 @@ -(void)awakeFromNib // x.minorTickLabelRotation = M_PI_2; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0.5 * oneDay); + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @(0.5 * oneDay); // Create a plot that uses the data source method CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; diff --git a/examples/RangePlot/Controller.m b/examples/RangePlot/Controller.m index 9a5367745..fd352462a 100644 --- a/examples/RangePlot/Controller.m +++ b/examples/RangePlot/Controller.m @@ -42,15 +42,15 @@ -(void)awakeFromNib // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; NSTimeInterval xLow = oneDay * 0.5; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(xLow) length:CPTDecimalFromDouble(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromFloat(oneDay); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 0; + x.majorIntervalLength = @(oneDay); + x.orthogonalPosition = @2.0; + x.minorTicksPerInterval = 0; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; dateFormatter.dateStyle = kCFDateFormatterShortStyle; CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; @@ -58,9 +58,9 @@ -(void)awakeFromNib x.labelFormatter = timeFormatter; CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(oneDay); + y.majorIntervalLength = @0.5; + y.minorTicksPerInterval = 5; + y.orthogonalPosition = @(oneDay); // Create a plot that uses the data source method CPTRangePlot *dataSourceLinePlot = [[[CPTRangePlot alloc] init] autorelease]; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 68d58b871..16610e378 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -42,24 +42,24 @@ -(void)reloadData NSDecimalNumber *length = [high decimalNumberBySubtracting:low]; //NSLog(@"high = %@, low = %@, length = %@", high, low, length); - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromUnsignedInteger([dataPuller.financialData count])]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:[low decimalValue] length:[length decimalValue]]; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(dataPuller.financialData.count)]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:low length:length]; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(10.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); - x.minorTicksPerInterval = 1; + x.majorIntervalLength = @10.0; + x.orthogonalPosition = @0.0; + x.minorTicksPerInterval = 1; CPTXYAxis *y = axisSet.yAxis; NSDecimal six = CPTDecimalFromInteger(6); - y.majorIntervalLength = CPTDecimalDivide([length decimalValue], six); - y.majorTickLineStyle = nil; - y.minorTicksPerInterval = 4; - y.minorTickLineStyle = nil; - y.orthogonalCoordinateDecimal = CPTDecimalFromInteger(0); - y.alternatingBandFills = @[[[CPTColor whiteColor] colorWithAlphaComponent:0.1], [NSNull null]]; + y.majorIntervalLength = [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalDivide(length.decimalValue, six)]; + y.majorTickLineStyle = nil; + y.minorTicksPerInterval = 4; + y.minorTickLineStyle = nil; + y.orthogonalPosition = @0.0; + y.alternatingBandFills = @[[[CPTColor whiteColor] colorWithAlphaComponent:0.1], [NSNull null]]; [graph reloadData]; diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index 40f906b91..093670d66 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -143,7 +143,7 @@ -(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row [nf release]; - [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%@ - %@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]]; + [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%@(-%@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]]; UIView *accessory = [cell accessoryView]; if ( [dp loadingData] ) { From dda30028368c074ae99d55b301ac9dbe6f8895c3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 20 Sep 2014 17:41:51 -0400 Subject: [PATCH 003/429] Removed the iPhone speed test example app. --- .../CPTTestApp-iPhone-SpeedTest/BarChart.xib | 348 -------------- .../project.pbxproj | 423 ----------------- .../contents.xcworkspacedata | 7 - .../CPTTestApp_iPhone_Prefix.pch | 8 - .../Classes/CPTTestAppBarChartController.h | 14 - .../Classes/CPTTestAppBarChartController.m | 136 ------ .../Classes/CPTTestAppPieChartController.h | 13 - .../Classes/CPTTestAppPieChartController.m | 94 ---- .../Classes/CPTTestAppScatterPlotController.h | 21 - .../Classes/CPTTestAppScatterPlotController.m | 180 -------- .../Classes/CPTTestApp_iPhoneAppDelegate.h | 18 - .../Classes/CPTTestApp_iPhoneAppDelegate.m | 37 -- .../Classes/TestXYTheme.h | 17 - .../Classes/TestXYTheme.m | 102 ---- .../CorePlotIcon.png | Bin 8724 -> 0 bytes .../CorePlotIcon@2x.png | Bin 20013 -> 0 bytes .../Default-568h@2x.png | Bin 18594 -> 0 bytes .../GlyphishIcons/16-line-chart.png | Bin 550 -> 0 bytes .../GlyphishIcons/17-bar-chart.png | Bin 181 -> 0 bytes .../GlyphishIcons/62-contrast.png | Bin 424 -> 0 bytes .../GlyphishIcons/Read me first - license.txt | 14 - .../CPTTestApp-iPhone-SpeedTest/Info.plist | 37 -- .../MainWindow.xib | 436 ------------------ .../CPTTestApp-iPhone-SpeedTest/PieChart.xib | 346 -------------- .../ScatterPlot.xib | 356 -------------- examples/CPTTestApp-iPhone-SpeedTest/main.m | 17 - .../contents.xcworkspacedata | 3 - 27 files changed, 2627 deletions(-) delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/BarChart.xib delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.pbxproj delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp_iPhone_Prefix.pch delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.h delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.h delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.m delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.h delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.h delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.m delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.h delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/CorePlotIcon.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/CorePlotIcon@2x.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Default-568h@2x.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/16-line-chart.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/17-bar-chart.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/62-contrast.png delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/Read me first - license.txt delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/Info.plist delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/MainWindow.xib delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/PieChart.xib delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/ScatterPlot.xib delete mode 100644 examples/CPTTestApp-iPhone-SpeedTest/main.m diff --git a/examples/CPTTestApp-iPhone-SpeedTest/BarChart.xib b/examples/CPTTestApp-iPhone-SpeedTest/BarChart.xib deleted file mode 100644 index 5e197ad1d..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/BarChart.xib +++ /dev/null @@ -1,348 +0,0 @@ - - - - 768 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 411} - - - 3 - MQA - - 2 - - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppBarChartController - UIResponder - CPTGraphHostingView - {{568, 433}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 9 - - - - YES - - CPTTestAppBarChartController - UIViewController - - IBProjectSource - Classes/CPTTestAppBarChartController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.pbxproj deleted file mode 100644 index 3eed9c44d..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ /dev/null @@ -1,423 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28216C970DB411BC00E5133A /* CPTTestAppBarChartController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */; }; - 282CCBFE0DB6C98000C4EA27 /* BarChart.xib in Resources */ = {isa = PBXBuildFile; fileRef = 282CCBFD0DB6C98000C4EA27 /* BarChart.xib */; }; - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; }; - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD73870D9D96C1002E5188 /* MainWindow.xib */; }; - 4E5EFFBC11B7DC6D00D8D6CB /* TestXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E5EFFBB11B7DC6D00D8D6CB /* TestXYTheme.m */; }; - BC74A33A10FC40C600E7E90D /* CPTTestAppPieChartController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */; }; - BC74A34110FC418D00E7E90D /* PieChart.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC74A34010FC418D00E7E90D /* PieChart.xib */; }; - BC8166CE1100DD00006D898E /* 16-line-chart.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166CC1100DD00006D898E /* 16-line-chart.png */; }; - BC8166CF1100DD00006D898E /* 17-bar-chart.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166CD1100DD00006D898E /* 17-bar-chart.png */; }; - BC8166D21100DD6F006D898E /* 62-contrast.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166D11100DD6F006D898E /* 62-contrast.png */; }; - BC9B81DA0FB893F70035D8DA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B81D90FB893F70035D8DA /* QuartzCore.framework */; }; - BC9B84360FB8B7110035D8DA /* ScatterPlot.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */; }; - BC9B843A0FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */; }; - BCB3FD660FD85732008875A4 /* CorePlotIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3FD650FD85732008875A4 /* CorePlotIcon.png */; }; - C385879A163DA26A00DBF63D /* UINavigationController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3858795163DA26A00DBF63D /* UINavigationController+LegacyRotation.m */; }; - C385879B163DA26A00DBF63D /* UITabBarController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3858797163DA26A00DBF63D /* UITabBarController+LegacyRotation.m */; }; - C385879C163DA26A00DBF63D /* UIViewController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3858799163DA26A00DBF63D /* UIViewController+LegacyRotation.m */; }; - C3BB7D6E163351BD00BC9515 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C3BB7D6D163351BD00BC9515 /* Default-568h@2x.png */; }; - C3CD284317DE9CB7008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD284217DE9CB7008EED1E /* Accelerate.framework */; }; - C3F47B6817BF98490075181F /* CorePlotIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C3F47B6717BF98490075181F /* CorePlotIcon@2x.png */; }; - F7AE270A0FFFB61E001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - BC9B83B40FB8A9BC0035D8DA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; - }; - BC9B83B60FB8A9C70035D8DA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPhoneAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestApp_iPhoneAppDelegate.m; sourceTree = ""; }; - 1D6058910D05DD3D006BFB54 /* CPTTestApp-iPhone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "CPTTestApp-iPhone.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28216C950DB411BC00E5133A /* CPTTestAppBarChartController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppBarChartController.h; sourceTree = ""; }; - 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppBarChartController.m; sourceTree = ""; }; - 282CCBFD0DB6C98000C4EA27 /* BarChart.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BarChart.xib; sourceTree = ""; }; - 288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AB4B0D9B1048005BE974 /* CPTTestApp_iPhone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPhone_Prefix.pch; sourceTree = ""; }; - 28AD73870D9D96C1002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 4E5EFFBA11B7DC6D00D8D6CB /* TestXYTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestXYTheme.h; sourceTree = ""; }; - 4E5EFFBB11B7DC6D00D8D6CB /* TestXYTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestXYTheme.m; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BC74A33810FC40C600E7E90D /* CPTTestAppPieChartController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppPieChartController.h; sourceTree = ""; }; - BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppPieChartController.m; sourceTree = ""; }; - BC74A34010FC418D00E7E90D /* PieChart.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PieChart.xib; sourceTree = ""; }; - BC8166CC1100DD00006D898E /* 16-line-chart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "16-line-chart.png"; path = "GlyphishIcons/16-line-chart.png"; sourceTree = ""; }; - BC8166CD1100DD00006D898E /* 17-bar-chart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "17-bar-chart.png"; path = "GlyphishIcons/17-bar-chart.png"; sourceTree = ""; }; - BC8166D11100DD6F006D898E /* 62-contrast.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "62-contrast.png"; path = "GlyphishIcons/62-contrast.png"; sourceTree = ""; }; - BC9B81D90FB893F70035D8DA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; - BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ScatterPlot.xib; sourceTree = ""; }; - BC9B84380FB8B76B0035D8DA /* CPTTestAppScatterPlotController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppScatterPlotController.h; sourceTree = ""; }; - BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppScatterPlotController.m; sourceTree = ""; }; - BCB3FD650FD85732008875A4 /* CorePlotIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CorePlotIcon.png; sourceTree = ""; }; - C3858794163DA26A00DBF63D /* UINavigationController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UINavigationController+LegacyRotation.h"; sourceTree = ""; }; - C3858795163DA26A00DBF63D /* UINavigationController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UINavigationController+LegacyRotation.m"; sourceTree = ""; }; - C3858796163DA26A00DBF63D /* UITabBarController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UITabBarController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UITabBarController+LegacyRotation.h"; sourceTree = ""; }; - C3858797163DA26A00DBF63D /* UITabBarController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UITabBarController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UITabBarController+LegacyRotation.m"; sourceTree = ""; }; - C3858798163DA26A00DBF63D /* UIViewController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UIViewController+LegacyRotation.h"; sourceTree = ""; }; - C3858799163DA26A00DBF63D /* UIViewController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UIViewController+LegacyRotation.m"; sourceTree = ""; }; - C3BB7D6D163351BD00BC9515 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - C3CD284217DE9CB7008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - C3F47B6717BF98490075181F /* CorePlotIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CorePlotIcon@2x.png"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, - BC9B81DA0FB893F70035D8DA /* QuartzCore.framework in Frameworks */, - F7AE270A0FFFB61E001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */, - C3CD284317DE9CB7008EED1E /* Accelerate.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 080E96DDFE201D6D7F000001 /* Classes */ = { - isa = PBXGroup; - children = ( - 4E5EFFBA11B7DC6D00D8D6CB /* TestXYTheme.h */, - 4E5EFFBB11B7DC6D00D8D6CB /* TestXYTheme.m */, - 28216C950DB411BC00E5133A /* CPTTestAppBarChartController.h */, - 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */, - 1D3623240D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.h */, - 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */, - BC74A33810FC40C600E7E90D /* CPTTestAppPieChartController.h */, - BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */, - BC9B84380FB8B76B0035D8DA /* CPTTestAppScatterPlotController.h */, - BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */, - C3858794163DA26A00DBF63D /* UINavigationController+LegacyRotation.h */, - C3858795163DA26A00DBF63D /* UINavigationController+LegacyRotation.m */, - C3858796163DA26A00DBF63D /* UITabBarController+LegacyRotation.h */, - C3858797163DA26A00DBF63D /* UITabBarController+LegacyRotation.m */, - C3858798163DA26A00DBF63D /* UIViewController+LegacyRotation.h */, - C3858799163DA26A00DBF63D /* UIViewController+LegacyRotation.m */, - ); - path = Classes; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* CPTTestApp-iPhone.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CPTTestApp-iPhone */ = { - isa = PBXGroup; - children = ( - BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */, - 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - indentWidth = 4; - name = "CPTTestApp-iPhone"; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 28A0AB4B0D9B1048005BE974 /* CPTTestApp_iPhone_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - BC8166D11100DD6F006D898E /* 62-contrast.png */, - BC8166CC1100DD00006D898E /* 16-line-chart.png */, - BC8166CD1100DD00006D898E /* 17-bar-chart.png */, - C3BB7D6D163351BD00BC9515 /* Default-568h@2x.png */, - BCB3FD650FD85732008875A4 /* CorePlotIcon.png */, - C3F47B6717BF98490075181F /* CorePlotIcon@2x.png */, - 28AD73870D9D96C1002E5188 /* MainWindow.xib */, - BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */, - 282CCBFD0DB6C98000C4EA27 /* BarChart.xib */, - BC74A34010FC418D00E7E90D /* PieChart.xib */, - 8D1107310486CEB800E47090 /* Info.plist */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - BC9B81D90FB893F70035D8DA /* QuartzCore.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765070DF74369002DB57D /* CoreGraphics.framework */, - C3CD284217DE9CB7008EED1E /* Accelerate.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - BC9B83B10FB8A9BC0035D8DA /* Products */ = { - isa = PBXGroup; - children = ( - BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* CPTTestApp-iPhone */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CPTTestApp-iPhone" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - BC9B83B70FB8A9C70035D8DA /* PBXTargetDependency */, - ); - name = "CPTTestApp-iPhone"; - productName = "CPTTestApp-iPhone"; - productReference = 1D6058910D05DD3D006BFB54 /* CPTTestApp-iPhone.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0500; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPhone" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CPTTestApp-iPhone */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = BC9B83B10FB8A9BC0035D8DA /* Products */; - ProjectRef = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* CPTTestApp-iPhone */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libCorePlot-CocoaTouch.a"; - remoteRef = BC9B83B40FB8A9BC0035D8DA /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */, - 282CCBFE0DB6C98000C4EA27 /* BarChart.xib in Resources */, - BC9B84360FB8B7110035D8DA /* ScatterPlot.xib in Resources */, - BCB3FD660FD85732008875A4 /* CorePlotIcon.png in Resources */, - BC74A34110FC418D00E7E90D /* PieChart.xib in Resources */, - BC8166CE1100DD00006D898E /* 16-line-chart.png in Resources */, - BC8166CF1100DD00006D898E /* 17-bar-chart.png in Resources */, - BC8166D21100DD6F006D898E /* 62-contrast.png in Resources */, - C3BB7D6E163351BD00BC9515 /* Default-568h@2x.png in Resources */, - C3F47B6817BF98490075181F /* CorePlotIcon@2x.png in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m in Sources */, - 28216C970DB411BC00E5133A /* CPTTestAppBarChartController.m in Sources */, - BC9B843A0FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m in Sources */, - BC74A33A10FC40C600E7E90D /* CPTTestAppPieChartController.m in Sources */, - 4E5EFFBC11B7DC6D00D8D6CB /* TestXYTheme.m in Sources */, - C385879A163DA26A00DBF63D /* UINavigationController+LegacyRotation.m in Sources */, - C385879B163DA26A00DBF63D /* UITabBarController+LegacyRotation.m in Sources */, - C385879C163DA26A00DBF63D /* UIViewController+LegacyRotation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - BC9B83B70FB8A9C70035D8DA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = BC9B83B60FB8A9C70035D8DA /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ENABLE_OBJC_ARC = YES; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CPTTestApp_iPhone_Prefix.pch; - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - LIBRARY_SEARCH_PATHS = ""; - OTHER_LDFLAGS = ( - "-all_load", - "-ObjC", - ); - PRODUCT_NAME = "CPTTestApp-iPhone"; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ENABLE_OBJC_ARC = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CPTTestApp_iPhone_Prefix.pch; - HEADER_SEARCH_PATHS = ""; - INFOPLIST_FILE = Info.plist; - LIBRARY_SEARCH_PATHS = ""; - OTHER_LDFLAGS = ( - "-all_load", - "-ObjC", - ); - PRODUCT_NAME = "CPTTestApp-iPhone"; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; - SDKROOT = iphoneos; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SYMROOT = "$(SRCROOT)/../../build"; - USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Brad Larson"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = "-ObjC"; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "500DAB97-6B23-43B6-9993-DF558595C088"; - SDKROOT = iphoneos; - SYMROOT = "$(SRCROOT)/../../build"; - USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "CPTTestApp-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPhone" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ab9bdd134..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp_iPhone_Prefix.pch b/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp_iPhone_Prefix.pch deleted file mode 100644 index 5cdc39f4d..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp_iPhone_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'CPTTestApp-iPhone' target in the 'CPTTestApp-iPhone' project -// - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.h b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.h deleted file mode 100644 index a8b7726e1..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// CPTTestAppBarChartController.h -// CPTTestApp-iPhone -// - -#import "CorePlot-CocoaTouch.h" -#import - -@interface CPTTestAppBarChartController : UIViewController -{ - CPTXYGraph *barChart; -} - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m deleted file mode 100644 index 4a9fb8961..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppBarChartController.m +++ /dev/null @@ -1,136 +0,0 @@ -// -// CPTTestAppBarChartController.m -// CPTTestApp-iPhone -// - -#import "CPTTestAppBarChartController.h" - -@implementation CPTTestAppBarChartController - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidLoad -{ - [super viewDidLoad]; - - // Create barChart from theme - barChart = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [barChart applyTheme:theme]; - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = barChart; - barChart.plotAreaFrame.masksToBorder = NO; - - barChart.paddingLeft = 70.0; - barChart.paddingTop = 20.0; - barChart.paddingRight = 20.0; - barChart.paddingBottom = 80.0; - - // Add plot space for horizontal bar charts - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; - - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = @5.0; - x.orthogonalPosition = @0.0; - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; - - // Define some custom labels for the data elements - x.labelRotation = M_PI_4; - x.labelingPolicy = CPTAxisLabelingPolicyNone; - NSArray *customTickLocations = @[@1, @5, @10, @15]; - NSArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; - for ( NSNumber *tickLocation in customTickLocations ) { - CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = [tickLocation decimalValue]; - newLabel.offset = x.labelOffset + x.majorTickLength; - newLabel.rotation = M_PI_4; - [customLabels addObject:newLabel]; - } - - x.axisLabels = customLabels; - - CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = @50.0; - y.orthogonalPosition = @0.0; - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); - - // First bar plot - CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(-0.25f); - barPlot.identifier = @"Bar Plot 1"; - [barChart addPlot:barPlot toPlotSpace:plotSpace]; - - // Second bar plot - barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; - barPlot.dataSource = self; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.barOffset = CPTDecimalFromFloat(0.25f); - barPlot.barCornerRadius = 2.0; - barPlot.identifier = @"Bar Plot 2"; - [barChart addPlot:barPlot toPlotSpace:plotSpace]; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return 16; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - NSNumber *num = nil; - - if ( [plot isKindOfClass:[CPTBarPlot class]] ) { - switch ( fieldEnum ) { - case CPTBarPlotFieldBarLocation: - num = @(index); - break; - - case CPTBarPlotFieldBarTip: - num = @( (index + 1) * (index + 1) ); - if ( [plot.identifier isEqual:@"Bar Plot 2"] ) { - num = @(num.integerValue - 10); - } - break; - } - } - - return num; -} - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.h b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.h deleted file mode 100644 index 9f90ea949..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.h +++ /dev/null @@ -1,13 +0,0 @@ -#import "CorePlot-CocoaTouch.h" -#import - -@interface CPTTestAppPieChartController : UIViewController -{ - @private - CPTXYGraph *pieChart; - NSMutableArray *dataForChart; -} - -@property (readwrite, strong, nonatomic) NSMutableArray *dataForChart; - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.m deleted file mode 100644 index 3bc3efd51..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppPieChartController.m +++ /dev/null @@ -1,94 +0,0 @@ -#import "CPTTestAppPieChartController.h" - -@implementation CPTTestAppPieChartController - -@synthesize dataForChart; - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - CPTPlot *piePlot = [pieChart plotWithIdentifier:@"Pie Chart 1"]; - CGRect plotBounds = pieChart.plotAreaFrame.bounds; - - ( (CPTPieChart *)piePlot ).pieRadius = MIN(plotBounds.size.width, plotBounds.size.height) / 2.0 - 10.0; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidLoad -{ - [super viewDidLoad]; - - // Create pieChart from theme - pieChart = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [pieChart applyTheme:theme]; - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = pieChart; - - pieChart.paddingLeft = 20.0; - pieChart.paddingTop = 20.0; - pieChart.paddingRight = 20.0; - pieChart.paddingBottom = 20.0; - - pieChart.plotAreaFrame.masksToBorder = NO; - - pieChart.axisSet = nil; - - // Add pie chart - CPTPieChart *piePlot = [[CPTPieChart alloc] init]; - piePlot.dataSource = self; - piePlot.pieRadius = 130.0; - piePlot.identifier = @"Pie Chart 1"; - piePlot.startAngle = M_PI_4; - piePlot.sliceDirection = CPTPieDirectionCounterClockwise; - [pieChart addPlot:piePlot]; - - // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithObjects:@20.0, @30.0, @60.0, nil]; - self.dataForChart = contentArray; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return [self.dataForChart count]; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - if ( index >= [self.dataForChart count] ) { - return nil; - } - - if ( fieldEnum == CPTPieChartFieldSliceWidth ) { - return (self.dataForChart)[index]; - } - else { - return @(index); - } -} - -/*-(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index; - * { - * return nil; - * }*/ - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.h b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.h deleted file mode 100644 index ec7a196e2..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// CPTTestAppScatterPlotController.h -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import "CorePlot-CocoaTouch.h" -#import - -#define NUM_POINTS 500 - -@interface CPTTestAppScatterPlotController : UIViewController -{ - CPTXYGraph *graph; - double xxx[NUM_POINTS]; - double yyy1[NUM_POINTS]; - double yyy2[NUM_POINTS]; -} - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m deleted file mode 100644 index a069ea293..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestAppScatterPlotController.m +++ /dev/null @@ -1,180 +0,0 @@ -// -// CPTTestAppScatterPlotController.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import "CPTTestAppScatterPlotController.h" -#import "TestXYTheme.h" - -#define USE_DOUBLEFASTPATH true -#define USE_ONEVALUEPATH false - -@implementation CPTTestAppScatterPlotController - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidLoad -{ - [super viewDidLoad]; - - // Create graph from a custom theme - graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [[TestXYTheme alloc] init]; - [graph applyTheme:theme]; - - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = graph; - - graph.plotAreaFrame.masksToBorder = NO; - - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.allowsUserInteraction = NO; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; - - // Create a blue plot area - CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; - boundLinePlot.identifier = @"Blue Plot"; - - CPTMutableLineStyle *lineStyle = [boundLinePlot.dataLineStyle mutableCopy]; - lineStyle.lineWidth = 1.0; - lineStyle.lineColor = [CPTColor blueColor]; - boundLinePlot.dataLineStyle = lineStyle; - - boundLinePlot.dataSource = self; - [graph addPlot:boundLinePlot]; - - // Create a green plot area - CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; - dataSourceLinePlot.identifier = @"Green Plot"; - - lineStyle = [dataSourceLinePlot.dataLineStyle mutableCopy]; - lineStyle.lineWidth = 1.0; - lineStyle.lineColor = [CPTColor greenColor]; - dataSourceLinePlot.dataLineStyle = lineStyle; - - dataSourceLinePlot.dataSource = self; - [graph addPlot:dataSourceLinePlot]; - - for ( NSUInteger i = 0; i < NUM_POINTS; i++ ) { - xxx[i] = i; - yyy1[i] = (NUM_POINTS / 3) * (rand() / (double)RAND_MAX); - yyy2[i] = (NUM_POINTS / 3) * (rand() / (double)RAND_MAX) + NUM_POINTS / 3; - } - -#define PERFORMANCE_TEST1 -#ifdef PERFORMANCE_TEST1 - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif - -#ifdef PERFORMANCE_TEST2 - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(reloadPlots) userInfo:nil repeats:YES]; -#endif -} - --(void)reloadPlots -{ - NSArray *plots = [graph allPlots]; - - for ( CPTPlot *plot in plots ) { - [plot reloadData]; - } -} - --(void)changePlotRange -{ - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - float ylen = NUM_POINTS * (rand() / (double)RAND_MAX); - - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(NUM_POINTS)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(ylen)]; -} - -#pragma mark - -#pragma mark Plot Data - --(double *)valuesForPlotWithIdentifier:(id)identifier field:(NSUInteger)fieldEnum -{ - if ( fieldEnum == 0 ) { - return xxx; - } - else { - if ( [identifier isEqualToString:@"Blue Plot"] ) { - return yyy1; - } - else { - return yyy2; - } - } -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return NUM_POINTS; -} - -#if USE_DOUBLEFASTPATH -#if USE_ONEVALUEPATH --(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)indx -{ - double *values = [self valuesForPlotWithIdentifier:[plot identifier] field:fieldEnum]; - - return values[indx]; -} - -#else --(double *)doublesForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange -{ - double *values = [self valuesForPlotWithIdentifier:[plot identifier] field:fieldEnum]; - - return values + indexRange.location; -} -#endif - -#else -#if USE_ONEVALUEPATH --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)indx -{ - NSNumber *num = nil; - double *values = [self valuesForPlotWithIdentifier:[plot identifier] field:fieldEnum]; - - if ( values ) { - num = @(values[indx]); - } - return num; -} - -#else --(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange -{ - double *values = [self valuesForPlotWithIdentifier:[plot identifier] field:fieldEnum]; - - if ( values == NULL ) { - return nil; - } - - NSMutableArray *returnArray = [NSMutableArray arrayWithCapacity:indexRange.length]; - for ( NSUInteger i = indexRange.location; i < indexRange.location + indexRange.length; i++ ) { - NSNumber *number = [[NSNumber alloc] initWithDouble:values[i]]; - [returnArray addObject:number]; - [number release]; - } - return returnArray; -} -#endif -#endif - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.h b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.h deleted file mode 100644 index 250ee5094..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// CPTTestApp_iPhoneAppDelegate.h -// CPTTestApp-iPhone -// -// Toolbar icons in the application are courtesy of Joseph Wain / glyphish.com -// See the license file in the GlyphishIcons directory for more information on these icons - -#import - -@interface CPTTestApp_iPhoneAppDelegate : NSObject { - UIWindow *window; - UITabBarController *tabBarController; -} - -@property (nonatomic, strong) IBOutlet UIWindow *window; -@property (nonatomic, strong) IBOutlet UITabBarController *tabBarController; - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.m deleted file mode 100644 index ba1add323..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/CPTTestApp_iPhoneAppDelegate.m +++ /dev/null @@ -1,37 +0,0 @@ -// -// CPTTestApp_iPhoneAppDelegate.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. - -#import "CPTTestApp_iPhoneAppDelegate.h" - -@implementation CPTTestApp_iPhoneAppDelegate - -@synthesize window; -@synthesize tabBarController; - --(void)applicationDidFinishLaunching:(UIApplication *)application -{ - if ( [self.window respondsToSelector:@selector(setRootViewController:)] ) { - self.window.rootViewController = self.tabBarController; - } - else { - [self.window addSubview:self.tabBarController.view]; - } - [self.window makeKeyAndVisible]; -} - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { - * } - */ - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { - * } - */ - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.h b/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.h deleted file mode 100644 index c20a51e5f..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// TestXYTheme.h -// CPTTestApp-iPhone -// -// Created by Joan on 03/06/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import - -#import "CorePlot-CocoaTouch.h" - -@interface TestXYTheme : CPTTheme -{ -} - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m b/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m deleted file mode 100644 index d6721d730..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/Classes/TestXYTheme.m +++ /dev/null @@ -1,102 +0,0 @@ -// -// TestXYTheme.m -// CPTTestApp-iPhone -// -// Created by Joan on 03/06/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "TestXYTheme.h" - -@implementation TestXYTheme - -+(NSString *)name -{ - return @"TestXYTheme"; -} - --(id)init -{ - if ( (self = [super init]) ) { - self.graphClass = [CPTXYGraph class]; - } - return self; -} - -#pragma mark - - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle - minorLineStyle:(CPTLineStyle *)minorLineStyle majorGridLineStyle:majorGridLineStyle textStyle:(CPTTextStyle *)textStyle -{ - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = @20.0; - axis.orthogonalPosition = @0.0; - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 3; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = 5.0; - axis.minorTickLength = 3.0; - axis.labelTextStyle = textStyle; - axis.titleTextStyle = textStyle; - //axis.labelFormatter = numberFormatter ; - axis.majorGridLineStyle = majorGridLineStyle; - axis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; -} - --(void)applyThemeToBackground:(CPTXYGraph *)graph -{ - CPTColor *endColor = [CPTColor colorWithGenericGray:0.1]; - CPTGradient *graphGradient = [CPTGradient gradientWithBeginningColor:endColor endingColor:endColor]; - - graphGradient = [graphGradient addColorStop:[CPTColor colorWithGenericGray:0.2] atPosition:0.3]; - graphGradient = [graphGradient addColorStop:[CPTColor colorWithGenericGray:0.3] atPosition:0.5]; - graphGradient = [graphGradient addColorStop:[CPTColor colorWithGenericGray:0.2] atPosition:0.6]; - graphGradient.angle = 90.0; - graph.fill = [CPTFill fillWithGradient:graphGradient]; -} - --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame -{ - CPTGradient *gradient = [CPTGradient gradientWithBeginningColor:[CPTColor colorWithGenericGray:0.1] endingColor:[CPTColor colorWithGenericGray:0.3]]; - - gradient.angle = 90.0; - plotAreaFrame.fill = [CPTFill fillWithGradient:gradient]; - - plotAreaFrame.paddingLeft = 50; - plotAreaFrame.paddingTop = 10; - plotAreaFrame.paddingRight = 20; - plotAreaFrame.paddingBottom = 30; -} - --(void)applyThemeToAxisSet:(CPTXYAxisSet *)axisSet -{ - CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; - - majorLineStyle.lineCap = kCGLineCapSquare; - majorLineStyle.lineColor = [CPTColor grayColor]; - majorLineStyle.lineWidth = 2.0; - - CPTMutableLineStyle *minorLineStyle = [CPTMutableLineStyle lineStyle]; - minorLineStyle.lineCap = kCGLineCapSquare; - minorLineStyle.lineColor = [CPTColor grayColor]; - minorLineStyle.lineWidth = 1.0; - - CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; - majorGridLineStyle.lineWidth = 0.1; - majorGridLineStyle.lineColor = [CPTColor lightGrayColor]; - - CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle]; - minorGridLineStyle.lineWidth = 0.25; - minorGridLineStyle.lineColor = [CPTColor blueColor]; - - CPTMutableTextStyle *whiteTextStyle = [[CPTMutableTextStyle alloc] init]; - whiteTextStyle.color = [CPTColor whiteColor]; - whiteTextStyle.fontSize = 14.0; - - [self applyThemeToAxis:axisSet.xAxis usingMajorLineStyle:majorLineStyle minorLineStyle:minorLineStyle majorGridLineStyle:majorGridLineStyle textStyle:whiteTextStyle]; - [self applyThemeToAxis:axisSet.yAxis usingMajorLineStyle:majorLineStyle minorLineStyle:minorLineStyle majorGridLineStyle:majorGridLineStyle textStyle:whiteTextStyle]; -} - -@end diff --git a/examples/CPTTestApp-iPhone-SpeedTest/CorePlotIcon.png b/examples/CPTTestApp-iPhone-SpeedTest/CorePlotIcon.png deleted file mode 100644 index 920d8f8f92dcc85836864c6db11c20a6df683b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8724 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 diff --git a/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/16-line-chart.png b/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/16-line-chart.png deleted file mode 100644 index 37b48e956b3b1eb8ba4ebbb0a58ba261757865d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?kEP)E?v0;Mm|*|1hJ!#_{XSeu@?|e z0b)rYHUr`qBsqH^mW8rE1Mx=mR80{tth3YTMQ6j09D6Mt?I}J&Hw-a07*qoM6N<$f~6bWumAu6 diff --git a/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/17-bar-chart.png b/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/17-bar-chart.png deleted file mode 100644 index f3fbebbc29bac8dda2e8d281558162cff5b9da33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^vOp}s!3HGR;=b(xQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jio!iz978H@B_$>#Xe2B!PH4O&{vu;JqwrydhKb3V+*8lq z?mto{6K1D+Dt$?m*R+K#U;3BDMX`Q=@KH0g#wd!XFUl%QGn7$zOQPAI+a4Q)PBzS& c#>67Q5Os|+K;)>#ZJ-qlp00i_>zopr09PG7QUCw| diff --git a/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/62-contrast.png b/examples/CPTTestApp-iPhone-SpeedTest/GlyphishIcons/62-contrast.png deleted file mode 100644 index 98ec0ad25154889c5b99bda24b32589995cf5a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmV;Z0ayNsP)v2YhDsXa1B!Idv}oQ>!26xUVZ_;0t^7wkZ78j Sl36(b0000 - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - CorePlotIcon - CFBundleIdentifier - com.SweetWilliam.CPTTestApp - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - NSMainNibFile - MainWindow - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/MainWindow.xib b/examples/CPTTestApp-iPhone-SpeedTest/MainWindow.xib deleted file mode 100644 index 97a8aead0..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/MainWindow.xib +++ /dev/null @@ -1,436 +0,0 @@ - - - - 528 - 12C60 - 2843 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1929 - - - YES - IBProxyObject - IBUICustomObject - IBUITabBar - IBUITabBarController - IBUITabBarItem - IBUIViewController - IBUIWindow - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {320, 480} - - - - 1 - MSAxIDEAA - - NO - NO - - IBCocoaTouchFramework - YES - YES - - - - - - 1 - 1 - - IBCocoaTouchFramework - NO - - Pie Chart - - Pie Chart - - NSImage - 62-contrast.png - - IBCocoaTouchFramework - - - YES - - - PieChart - - 1 - 1 - - IBCocoaTouchFramework - NO - - - YES - - Scatter Plot - - Scatter Plot - - NSImage - 16-line-chart.png - - IBCocoaTouchFramework - - - ScatterPlot - - 1 - 1 - - IBCocoaTouchFramework - NO - - - - Bar Chart - - NSImage - 17-bar-chart.png - - IBCocoaTouchFramework - - - BarChart - - 1 - 1 - - IBCocoaTouchFramework - NO - - - - - - 266 - {{129, 330}, {163, 49}} - - 3 - MCAwAA - - NO - IBCocoaTouchFramework - - - - - - YES - - - delegate - - - - 99 - - - - window - - - - 9 - - - - tabBarController - - - - 113 - - - - - YES - - 0 - - - - - - 2 - - - YES - - - - - -1 - - - File's Owner - - - 3 - - - - - 106 - - - YES - - - - - - - - - 107 - - - - - 108 - - - YES - - - - - - 109 - - - YES - - - - - - 110 - - - - - 111 - - - - - -2 - - - - - 125 - - - YES - - - - - - 126 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 106.IBPluginDependency - 107.IBPluginDependency - 108.CustomClassName - 108.IBPluginDependency - 109.CustomClassName - 109.IBPluginDependency - 110.IBPluginDependency - 111.IBPluginDependency - 125.CustomClassName - 125.IBPluginDependency - 126.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency - - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppScatterPlotController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppBarChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppPieChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestApp_iPhoneAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 126 - - - - YES - - CPTTestAppBarChartController - UIViewController - - IBProjectSource - ./Classes/CPTTestAppBarChartController.h - - - - CPTTestAppPieChartController - UIViewController - - IBProjectSource - ./Classes/CPTTestAppPieChartController.h - - - - CPTTestAppScatterPlotController - UIViewController - - IBProjectSource - ./Classes/CPTTestAppScatterPlotController.h - - - - CPTTestApp_iPhoneAppDelegate - NSObject - - YES - - YES - tabBarController - window - - - YES - UITabBarController - UIWindow - - - - YES - - YES - tabBarController - window - - - YES - - tabBarController - UITabBarController - - - window - UIWindow - - - - - IBProjectSource - ./Classes/CPTTestApp_iPhoneAppDelegate.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - 16-line-chart.png - 17-bar-chart.png - 62-contrast.png - - - YES - {30, 24} - {29, 24} - {20, 20} - - - 1929 - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/PieChart.xib b/examples/CPTTestApp-iPhone-SpeedTest/PieChart.xib deleted file mode 100644 index 0793e4bdd..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/PieChart.xib +++ /dev/null @@ -1,346 +0,0 @@ - - - - 768 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 411} - - 3 - MQA - - 2 - - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppPieChartController - UIResponder - CPTGraphHostingView - {{158, 204}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 9 - - - - YES - - CPTTestAppPieChartController - UIViewController - - IBProjectSource - Classes/CPTTestAppPieChartController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/ScatterPlot.xib b/examples/CPTTestApp-iPhone-SpeedTest/ScatterPlot.xib deleted file mode 100644 index acd2d4ba7..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/ScatterPlot.xib +++ /dev/null @@ -1,356 +0,0 @@ - - - - 528 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 460} - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 5 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppScatterPlotController - UIResponder - CPTGraphHostingView - {{430, 168}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 5 - - - - YES - - CPTTestAppScatterPlotController - UIViewController - - IBProjectSource - Classes/CPTTestAppScatterPlotController.h - - - - - YES - - CPTGraphHostingView - UIView - - IBDocumentRelativeSource - ../../framework/iPhoneOnly/CPTGraphHostingView.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - diff --git a/examples/CPTTestApp-iPhone-SpeedTest/main.m b/examples/CPTTestApp-iPhone-SpeedTest/main.m deleted file mode 100644 index 762bdbbff..000000000 --- a/examples/CPTTestApp-iPhone-SpeedTest/main.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - int retVal = UIApplicationMain(argc, argv, nil, nil); - - return retVal; - } -} diff --git a/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata b/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata index 60585fe51..58eb2fc87 100644 --- a/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata +++ b/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata @@ -42,9 +42,6 @@ - - From 3e214089a770ec8e4d0c0377d23ccf74ac0b3c13 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 21 Sep 2014 13:31:25 -0400 Subject: [PATCH 004/429] Converted the iPhone CPTTestApp from Objective-C to Swift. --- .../CPTTestApp-iPhone-Bridging-Header.h | 1 + .../project.pbxproj | 72 ++--- .../CPTTestApp_iPhone_Prefix.pch | 8 - .../Classes/BarChartController.swift | 148 +++++++++++ .../Classes/CPTTestAppBarChartController.h | 20 -- .../Classes/CPTTestAppBarChartController.m | 195 -------------- .../Classes/CPTTestAppPieChartController.h | 17 -- .../Classes/CPTTestAppPieChartController.m | 188 ------------- .../Classes/CPTTestAppScatterPlotController.h | 20 -- .../Classes/CPTTestAppScatterPlotController.m | 221 ---------------- .../Classes/CPTTestApp_iPhoneAppDelegate.h | 18 -- .../Classes/CPTTestApp_iPhoneAppDelegate.m | 37 --- .../Classes/PieChartController.swift | 102 +++++++ .../Classes/ScatterPlotController.swift | 183 +++++++++++++ .../Classes/iPhoneAppDelegate.swift | 20 ++ examples/CPTTestApp-iPhone/MainWindow.xib | 249 +++++++----------- examples/CPTTestApp-iPhone/main.m | 17 -- 17 files changed, 572 insertions(+), 944 deletions(-) create mode 100644 examples/CPTTestApp-iPhone/CPTTestApp-iPhone-Bridging-Header.h delete mode 100644 examples/CPTTestApp-iPhone/CPTTestApp_iPhone_Prefix.pch create mode 100644 examples/CPTTestApp-iPhone/Classes/BarChartController.swift delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.h delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.h delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.h delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.h delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m create mode 100644 examples/CPTTestApp-iPhone/Classes/PieChartController.swift create mode 100644 examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift create mode 100644 examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift delete mode 100644 examples/CPTTestApp-iPhone/main.m diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone-Bridging-Header.h b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone-Bridging-Header.h new file mode 100644 index 000000000..c99c8cd1b --- /dev/null +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone-Bridging-Header.h @@ -0,0 +1 @@ +#import "CorePlot-CocoaTouch.h" diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index ea27401fa..39dd36082 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -7,26 +7,22 @@ objects = { /* Begin PBXBuildFile section */ - 1D3623260D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */; }; - 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 28216C970DB411BC00E5133A /* CPTTestAppBarChartController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */; }; 282CCBFE0DB6C98000C4EA27 /* BarChart.xib in Resources */ = {isa = PBXBuildFile; fileRef = 282CCBFD0DB6C98000C4EA27 /* BarChart.xib */; }; 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765070DF74369002DB57D /* CoreGraphics.framework */; }; 28AD73880D9D96C1002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD73870D9D96C1002E5188 /* MainWindow.xib */; }; - BC74A33A10FC40C600E7E90D /* CPTTestAppPieChartController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */; }; BC74A34110FC418D00E7E90D /* PieChart.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC74A34010FC418D00E7E90D /* PieChart.xib */; }; BC8166CE1100DD00006D898E /* 16-line-chart.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166CC1100DD00006D898E /* 16-line-chart.png */; }; BC8166CF1100DD00006D898E /* 17-bar-chart.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166CD1100DD00006D898E /* 17-bar-chart.png */; }; BC8166D21100DD6F006D898E /* 62-contrast.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166D11100DD6F006D898E /* 62-contrast.png */; }; BC9B81DA0FB893F70035D8DA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B81D90FB893F70035D8DA /* QuartzCore.framework */; }; BC9B84360FB8B7110035D8DA /* ScatterPlot.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */; }; - BC9B843A0FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */; }; BCB3FD660FD85732008875A4 /* CorePlotIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3FD650FD85732008875A4 /* CorePlotIcon.png */; }; - C34B5596163C7D2C002EFA85 /* UINavigationController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C34B5591163C7D2B002EFA85 /* UINavigationController+LegacyRotation.m */; }; - C34B5597163C7D2C002EFA85 /* UITabBarController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C34B5593163C7D2C002EFA85 /* UITabBarController+LegacyRotation.m */; }; - C34B5598163C7D2C002EFA85 /* UIViewController+LegacyRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = C34B5595163C7D2C002EFA85 /* UIViewController+LegacyRotation.m */; }; + C359603719CE34FC005CDFB9 /* BarChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603319CE34FB005CDFB9 /* BarChartController.swift */; }; + C359603819CE34FC005CDFB9 /* iPhoneAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */; }; + C359603919CE34FC005CDFB9 /* PieChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603519CE34FB005CDFB9 /* PieChartController.swift */; }; + C359603A19CE34FC005CDFB9 /* ScatterPlotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */; }; C3B9F2C317BFD350003D2B6B /* CorePlotIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C3B9F2C217BFD350003D2B6B /* CorePlotIcon@2x.png */; }; C3B9F9D417503CDD001CCC50 /* BlueTexture.png in Resources */ = {isa = PBXBuildFile; fileRef = C3B9F9D317503CDD001CCC50 /* BlueTexture.png */; }; C3BB7D611633516500BC9515 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C3BB7D601633516500BC9515 /* Default-568h@2x.png */; }; @@ -53,20 +49,12 @@ /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D3623240D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPhoneAppDelegate.h; sourceTree = ""; }; - 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestApp_iPhoneAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* CPTTestApp-iPhone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "CPTTestApp-iPhone.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 28216C950DB411BC00E5133A /* CPTTestAppBarChartController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppBarChartController.h; sourceTree = ""; }; - 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppBarChartController.m; sourceTree = ""; }; 282CCBFD0DB6C98000C4EA27 /* BarChart.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BarChart.xib; sourceTree = ""; }; 288765070DF74369002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AB4B0D9B1048005BE974 /* CPTTestApp_iPhone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPhone_Prefix.pch; sourceTree = ""; }; 28AD73870D9D96C1002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BC74A33810FC40C600E7E90D /* CPTTestAppPieChartController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppPieChartController.h; sourceTree = ""; }; - BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppPieChartController.m; sourceTree = ""; }; BC74A34010FC418D00E7E90D /* PieChart.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PieChart.xib; sourceTree = ""; }; BC8166CC1100DD00006D898E /* 16-line-chart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "16-line-chart.png"; path = "GlyphishIcons/16-line-chart.png"; sourceTree = ""; }; BC8166CD1100DD00006D898E /* 17-bar-chart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "17-bar-chart.png"; path = "GlyphishIcons/17-bar-chart.png"; sourceTree = ""; }; @@ -74,15 +62,12 @@ BC9B81D90FB893F70035D8DA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ScatterPlot.xib; sourceTree = ""; }; - BC9B84380FB8B76B0035D8DA /* CPTTestAppScatterPlotController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestAppScatterPlotController.h; sourceTree = ""; }; - BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestAppScatterPlotController.m; sourceTree = ""; }; BCB3FD650FD85732008875A4 /* CorePlotIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CorePlotIcon.png; sourceTree = ""; }; - C34B5590163C7D2B002EFA85 /* UINavigationController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UINavigationController+LegacyRotation.h"; sourceTree = ""; }; - C34B5591163C7D2B002EFA85 /* UINavigationController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UINavigationController+LegacyRotation.m"; sourceTree = ""; }; - C34B5592163C7D2C002EFA85 /* UITabBarController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UITabBarController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UITabBarController+LegacyRotation.h"; sourceTree = ""; }; - C34B5593163C7D2C002EFA85 /* UITabBarController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UITabBarController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UITabBarController+LegacyRotation.m"; sourceTree = ""; }; - C34B5594163C7D2C002EFA85 /* UIViewController+LegacyRotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+LegacyRotation.h"; path = "../../iOS Rotation Utilities/UIViewController+LegacyRotation.h"; sourceTree = ""; }; - C34B5595163C7D2C002EFA85 /* UIViewController+LegacyRotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LegacyRotation.m"; path = "../../iOS Rotation Utilities/UIViewController+LegacyRotation.m"; sourceTree = ""; }; + C359603319CE34FB005CDFB9 /* BarChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarChartController.swift; sourceTree = ""; }; + C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iPhoneAppDelegate.swift; sourceTree = ""; }; + C359603519CE34FB005CDFB9 /* PieChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieChartController.swift; sourceTree = ""; }; + C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScatterPlotController.swift; sourceTree = ""; }; + C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CPTTestApp-iPhone-Bridging-Header.h"; sourceTree = ""; }; C3B9F2C217BFD350003D2B6B /* CorePlotIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CorePlotIcon@2x.png"; sourceTree = ""; }; C3B9F9D317503CDD001CCC50 /* BlueTexture.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueTexture.png; sourceTree = ""; }; C3BB7D601633516500BC9515 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; @@ -109,20 +94,10 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - 28216C950DB411BC00E5133A /* CPTTestAppBarChartController.h */, - 28216C960DB411BC00E5133A /* CPTTestAppBarChartController.m */, - 1D3623240D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.h */, - 1D3623250D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m */, - BC74A33810FC40C600E7E90D /* CPTTestAppPieChartController.h */, - BC74A33910FC40C600E7E90D /* CPTTestAppPieChartController.m */, - BC9B84380FB8B76B0035D8DA /* CPTTestAppScatterPlotController.h */, - BC9B84390FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m */, - C34B5590163C7D2B002EFA85 /* UINavigationController+LegacyRotation.h */, - C34B5591163C7D2B002EFA85 /* UINavigationController+LegacyRotation.m */, - C34B5592163C7D2C002EFA85 /* UITabBarController+LegacyRotation.h */, - C34B5593163C7D2C002EFA85 /* UITabBarController+LegacyRotation.m */, - C34B5594163C7D2C002EFA85 /* UIViewController+LegacyRotation.h */, - C34B5595163C7D2C002EFA85 /* UIViewController+LegacyRotation.m */, + C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */, + C359603319CE34FB005CDFB9 /* BarChartController.swift */, + C359603519CE34FB005CDFB9 /* PieChartController.swift */, + C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */, ); path = Classes; sourceTree = ""; @@ -154,8 +129,7 @@ 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( - 28A0AB4B0D9B1048005BE974 /* CPTTestApp_iPhone_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, + C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */, ); name = "Other Sources"; sourceTree = ""; @@ -289,14 +263,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1D60589B0D05DD56006BFB54 /* main.m in Sources */, - 1D3623260D0F684500981E51 /* CPTTestApp_iPhoneAppDelegate.m in Sources */, - 28216C970DB411BC00E5133A /* CPTTestAppBarChartController.m in Sources */, - BC9B843A0FB8B76B0035D8DA /* CPTTestAppScatterPlotController.m in Sources */, - BC74A33A10FC40C600E7E90D /* CPTTestAppPieChartController.m in Sources */, - C34B5596163C7D2C002EFA85 /* UINavigationController+LegacyRotation.m in Sources */, - C34B5597163C7D2C002EFA85 /* UITabBarController+LegacyRotation.m in Sources */, - C34B5598163C7D2C002EFA85 /* UIViewController+LegacyRotation.m in Sources */, + C359603719CE34FC005CDFB9 /* BarChartController.swift in Sources */, + C359603819CE34FC005CDFB9 /* iPhoneAppDelegate.swift in Sources */, + C359603919CE34FC005CDFB9 /* PieChartController.swift in Sources */, + C359603A19CE34FC005CDFB9 /* ScatterPlotController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -331,6 +301,7 @@ ); PRODUCT_NAME = "CPTTestApp-iPhone"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; }; name = Debug; @@ -353,6 +324,7 @@ ); PRODUCT_NAME = "CPTTestApp-iPhone"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; }; name = Release; @@ -368,7 +340,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; PROVISIONING_PROFILE = ""; @@ -391,7 +363,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; PROVISIONING_PROFILE = ""; diff --git a/examples/CPTTestApp-iPhone/CPTTestApp_iPhone_Prefix.pch b/examples/CPTTestApp-iPhone/CPTTestApp_iPhone_Prefix.pch deleted file mode 100644 index 5cdc39f4d..000000000 --- a/examples/CPTTestApp-iPhone/CPTTestApp_iPhone_Prefix.pch +++ /dev/null @@ -1,8 +0,0 @@ -// -// Prefix header for all source files of the 'CPTTestApp-iPhone' target in the 'CPTTestApp-iPhone' project -// - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift new file mode 100644 index 000000000..aa61897f7 --- /dev/null +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -0,0 +1,148 @@ +import UIKit + +class BarChartController : UIViewController, CPTBarPlotDataSource { + private var barGraph : CPTXYGraph? = nil + + // MARK: Initialization + + override func viewDidAppear(animated : Bool) + { + super.viewDidAppear(animated) + + // Create graph from theme + let newGraph = CPTXYGraph() + newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + + let hostingView = self.view as CPTGraphHostingView + hostingView.hostedGraph = barGraph + + // Border + newGraph.plotAreaFrame.borderLineStyle = nil + newGraph.plotAreaFrame.cornerRadius = 0.0 + newGraph.plotAreaFrame.masksToBorder = false + + // Paddings + newGraph.paddingLeft = 0.0 + newGraph.paddingRight = 0.0 + newGraph.paddingTop = 0.0 + newGraph.paddingBottom = 0.0 + + newGraph.plotAreaFrame.paddingLeft = 70.0 + newGraph.plotAreaFrame.paddingTop = 20.0 + newGraph.plotAreaFrame.paddingRight = 20.0 + newGraph.plotAreaFrame.paddingBottom = 80.0 + + // Graph title + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.alignment = .Center + + let lineOne = "Graph Title" + let lineTwo = "Line 2" + + let line1Font = UIFont(name: "Helvetica-Bold", size:16.0) + let line2Font = UIFont(name: "Helvetica", size:12.0) + + let graphTitle = NSMutableAttributedString(string: lineOne + "\n" + lineTwo) + + let titleRange1 = NSRange(location: 0, length: lineOne.utf16Count) + let titleRange2 = NSRange(location: lineOne.utf16Count + 1, length: lineTwo.utf16Count) + + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.whiteColor(), range:titleRange1) + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.grayColor(), range:titleRange2) + graphTitle.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSRange(location: 0, length: graphTitle.length)) + graphTitle.addAttribute(NSFontAttributeName, value:line1Font, range:titleRange1) + graphTitle.addAttribute(NSFontAttributeName, value:line2Font, range:titleRange2) + + newGraph.attributedTitle = graphTitle + + newGraph.titleDisplacement = CGPoint(x: 0.0, y:-20.0) + newGraph.titlePlotAreaFrameAnchor = .Top + + // Plot space + let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + plotSpace.yRange = CPTPlotRange(location:0.0, length:300.0) + plotSpace.xRange = CPTPlotRange(location:0.0, length:16.0) + + let axisSet = newGraph.axisSet as CPTXYAxisSet + + let x = axisSet.xAxis + x.axisLineStyle = nil + x.majorTickLineStyle = nil + x.minorTickLineStyle = nil + x.majorIntervalLength = 5.0 + x.orthogonalPosition = 0.0 + x.title = "X Axis" + x.titleLocation = 7.5 + x.titleOffset = 55.0 + + // Custom labels + x.labelRotation = CGFloat(M_PI_4) + x.labelingPolicy = .None + + let customTickLocations = [1, 5, 10, 15] + let xAxisLabels = ["Label A", "Label B", "Label C", "Label D"] + + var labelLocation = 0 + let customLabels = NSMutableSet(capacity: xAxisLabels.count) + for tickLocation in customTickLocations { + let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation++], textStyle:x.labelTextStyle) + newLabel.tickLocation = tickLocation + newLabel.offset = x.labelOffset + x.majorTickLength + newLabel.rotation = CGFloat(M_PI_4) + customLabels.addObject(newLabel) + } + + x.axisLabels = customLabels + + let y = axisSet.yAxis + y.axisLineStyle = nil + y.majorTickLineStyle = nil + y.minorTickLineStyle = nil + y.majorIntervalLength = 50.0 + y.orthogonalPosition = 0.0 + y.title = "Y Axis" + y.titleOffset = 45.0 + y.titleLocation = 150.0 + + // First bar plot + let barPlot1 = CPTBarPlot.tubularBarPlotWithColor(CPTColor.darkGrayColor(), horizontalBars:false) + barPlot1.baseValue = 0.0 + barPlot1.dataSource = self + barPlot1.barOffset = -0.2 + barPlot1.identifier = "Bar Plot 1" + newGraph.addPlot(barPlot1, toPlotSpace:plotSpace) + + // Second bar plot + let barPlot2 = CPTBarPlot.tubularBarPlotWithColor(CPTColor.blueColor(), horizontalBars:false) + barPlot2.dataSource = self + barPlot2.baseValue = 0.0 + barPlot2.barOffset = 0.25 + barPlot2.barCornerRadius = 2.0 + barPlot2.identifier = "Bar Plot 2" + newGraph.addPlot(barPlot2, toPlotSpace:plotSpace) + + self.barGraph = newGraph + } + + // MARK: - Plot Data Source Methods + + func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + { + return 16 + } + + func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + { + switch CPTBarPlotField.fromRaw(Int(field))! { + case .BarLocation: + return recordIndex as NSNumber + + case .BarTip: + let plotID = plot.identifier as String + return (plotID == "Bar Plot 2" ? recordIndex : ((recordIndex + 1) * (recordIndex + 1)) ) as NSNumber + + default: + return nil + } + } +} diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.h b/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.h deleted file mode 100644 index bea0ad541..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CPTTestAppBarChartController.h -// CPTTestApp-iPhone -// - -#import "CorePlot-CocoaTouch.h" -#import - -@interface CPTTestAppBarChartController : UIViewController -{ - @private - CPTXYGraph *barChart; - NSTimer *timer; -} - -@property (readwrite, strong, nonatomic) NSTimer *timer; - --(void)timerFired; - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m deleted file mode 100644 index e98cbcb44..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m +++ /dev/null @@ -1,195 +0,0 @@ -// -// CPTTestAppBarChartController.m -// CPTTestApp-iPhone -// - -#import "CPTTestAppBarChartController.h" - -@implementation CPTTestAppBarChartController - -@synthesize timer; - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - [self timerFired]; -#ifdef MEMORY_TEST - self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self - selector:@selector(timerFired) userInfo:nil repeats:YES]; -#endif -} - --(void)timerFired -{ -#ifdef MEMORY_TEST - static NSUInteger counter = 0; - - NSLog(@"\n----------------------------\ntimerFired: %lu", counter++); -#endif - - // Create barChart from theme - barChart = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [barChart applyTheme:theme]; - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = barChart; - - // Border - barChart.plotAreaFrame.borderLineStyle = nil; - barChart.plotAreaFrame.cornerRadius = 0.0; - barChart.plotAreaFrame.masksToBorder = NO; - - // Paddings - barChart.paddingLeft = 0.0; - barChart.paddingRight = 0.0; - barChart.paddingTop = 0.0; - barChart.paddingBottom = 0.0; - - barChart.plotAreaFrame.paddingLeft = 70.0; - barChart.plotAreaFrame.paddingTop = 20.0; - barChart.plotAreaFrame.paddingRight = 20.0; - barChart.plotAreaFrame.paddingBottom = 80.0; - - // Graph title - NSString *lineOne = @"Graph Title"; - NSString *lineTwo = @"Line 2"; - - BOOL hasAttributedStringAdditions = (&NSFontAttributeName != NULL) && - (&NSForegroundColorAttributeName != NULL) && - (&NSParagraphStyleAttributeName != NULL); - - if ( hasAttributedStringAdditions ) { - NSMutableAttributedString *graphTitle = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@", lineOne, lineTwo]]; - [graphTitle addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, lineOne.length)]; - [graphTitle addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(lineOne.length + 1, lineTwo.length)]; - NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.alignment = CPTTextAlignmentCenter; - [graphTitle addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, graphTitle.length)]; - UIFont *titleFont = [UIFont fontWithName:@"Helvetica-Bold" size:16.0]; - [graphTitle addAttribute:NSFontAttributeName value:titleFont range:NSMakeRange(0, lineOne.length)]; - titleFont = [UIFont fontWithName:@"Helvetica" size:12.0]; - [graphTitle addAttribute:NSFontAttributeName value:titleFont range:NSMakeRange(lineOne.length + 1, lineTwo.length)]; - - barChart.attributedTitle = graphTitle; - } - else { - CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle]; - titleStyle.color = [CPTColor whiteColor]; - titleStyle.fontName = @"Helvetica-Bold"; - titleStyle.fontSize = 16.0; - titleStyle.textAlignment = CPTTextAlignmentCenter; - - barChart.title = [NSString stringWithFormat:@"%@\n%@", lineOne, lineTwo]; - barChart.titleTextStyle = titleStyle; - } - - barChart.titleDisplacement = CGPointMake(0.0, -20.0); - barChart.titlePlotAreaFrameAnchor = CPTRectAnchorTop; - - // Add plot space for horizontal bar charts - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)barChart.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@300.0]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@16.0]; - - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)barChart.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = @5.0; - x.orthogonalPosition = @0.0; - x.title = @"X Axis"; - x.titleLocation = @7.5; - x.titleOffset = 55.0; - - // Define some custom labels for the data elements - x.labelRotation = M_PI_4; - x.labelingPolicy = CPTAxisLabelingPolicyNone; - NSArray *customTickLocations = @[@1, @5, @10, @15]; - NSArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; - for ( NSNumber *tickLocation in customTickLocations ) { - CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = tickLocation; - newLabel.offset = x.labelOffset + x.majorTickLength; - newLabel.rotation = M_PI_4; - [customLabels addObject:newLabel]; - } - - x.axisLabels = customLabels; - - CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = @50.0; - y.orthogonalPosition = @0.0; - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = @150.0; - - // First bar plot - CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; - barPlot.baseValue = @0.0; - barPlot.dataSource = self; - barPlot.barOffset = @(-0.25); - barPlot.identifier = @"Bar Plot 1"; - [barChart addPlot:barPlot toPlotSpace:plotSpace]; - - // Second bar plot - barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; - barPlot.dataSource = self; - barPlot.baseValue = @0.0; - barPlot.barOffset = @0.25; - barPlot.barCornerRadius = 2.0; - barPlot.identifier = @"Bar Plot 2"; - [barChart addPlot:barPlot toPlotSpace:plotSpace]; -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return 16; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - NSNumber *num = nil; - - if ( [plot isKindOfClass:[CPTBarPlot class]] ) { - switch ( fieldEnum ) { - case CPTBarPlotFieldBarLocation: - num = @(index); - break; - - case CPTBarPlotFieldBarTip: - num = @( (index + 1) * (index + 1) ); - if ( [plot.identifier isEqual:@"Bar Plot 2"] ) { - num = @(num.integerValue - 10); - } - break; - } - } - - return num; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.h b/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.h deleted file mode 100644 index b615b9c70..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.h +++ /dev/null @@ -1,17 +0,0 @@ -#import "CorePlot-CocoaTouch.h" -#import - -@interface CPTTestAppPieChartController : UIViewController -{ - @private - CPTXYGraph *pieChart; - NSMutableArray *dataForChart; - NSTimer *timer; -} - -@property (readwrite, strong, nonatomic) NSMutableArray *dataForChart; -@property (readwrite, strong, nonatomic) NSTimer *timer; - --(void)timerFired; - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m deleted file mode 100644 index d6f8eb97d..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m +++ /dev/null @@ -1,188 +0,0 @@ -#import "CPTTestAppPieChartController.h" - -@implementation CPTTestAppPieChartController - -@synthesize dataForChart; -@synthesize timer; - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - CGFloat margin = pieChart.plotAreaFrame.borderLineStyle.lineWidth + 5.0; - - CPTPieChart *piePlot = (CPTPieChart *)[pieChart plotWithIdentifier:@"Pie Chart 1"]; - CGRect plotBounds = pieChart.plotAreaFrame.bounds; - CGFloat newRadius = MIN(plotBounds.size.width, plotBounds.size.height) / 2.0 - margin; - - CGFloat y = 0.0; - - if ( plotBounds.size.width > plotBounds.size.height ) { - y = 0.5; - } - else { - y = (newRadius + margin) / plotBounds.size.height; - } - CGPoint newAnchor = CGPointMake(0.5, y); - - // Animate the change - [CATransaction begin]; - { - [CATransaction setAnimationDuration:1.0]; - [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; - - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"pieRadius"]; - animation.toValue = @(newRadius); - animation.fillMode = kCAFillModeForwards; - animation.delegate = self; - [piePlot addAnimation:animation forKey:@"pieRadius"]; - - animation = [CABasicAnimation animationWithKeyPath:@"centerAnchor"]; - animation.toValue = [NSValue valueWithBytes:&newAnchor objCType:@encode(CGPoint)]; - animation.fillMode = kCAFillModeForwards; - animation.delegate = self; - [piePlot addAnimation:animation forKey:@"centerAnchor"]; - } - [CATransaction commit]; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithObjects:@20.0, @30.0, @60.0, nil]; - - self.dataForChart = contentArray; - - [self timerFired]; -#ifdef MEMORY_TEST - self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self - selector:@selector(timerFired) userInfo:nil repeats:YES]; -#endif -} - --(void)timerFired -{ -#ifdef MEMORY_TEST - static NSUInteger counter = 0; - - NSLog(@"\n----------------------------\ntimerFired: %lu", counter++); -#endif - - // Create pieChart from theme - pieChart = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [pieChart applyTheme:theme]; - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = pieChart; - - pieChart.paddingLeft = 20.0; - pieChart.paddingTop = 20.0; - pieChart.paddingRight = 20.0; - pieChart.paddingBottom = 20.0; - - pieChart.axisSet = nil; - - CPTMutableTextStyle *whiteText = [CPTMutableTextStyle textStyle]; - whiteText.color = [CPTColor whiteColor]; - - pieChart.titleTextStyle = whiteText; - pieChart.title = @"Graph Title"; - - // Add pie chart - CPTPieChart *piePlot = [[CPTPieChart alloc] init]; - piePlot.dataSource = self; - piePlot.pieRadius = 131.0; - piePlot.identifier = @"Pie Chart 1"; - piePlot.startAngle = M_PI_4; - piePlot.sliceDirection = CPTPieDirectionCounterClockwise; - piePlot.centerAnchor = CGPointMake(0.5, 0.38); - piePlot.borderLineStyle = [CPTLineStyle lineStyle]; - piePlot.delegate = self; - [pieChart addPlot:piePlot]; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return [self.dataForChart count]; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - if ( index >= [self.dataForChart count] ) { - return nil; - } - - if ( fieldEnum == CPTPieChartFieldSliceWidth ) { - return (self.dataForChart)[index]; - } - else { - return @(index); - } -} - --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index -{ - CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%lu", (unsigned long)index]]; - CPTMutableTextStyle *textStyle = [label.textStyle mutableCopy]; - - textStyle.color = [CPTColor lightGrayColor]; - label.textStyle = textStyle; - return label; -} - --(CGFloat)radialOffsetForPieChart:(CPTPieChart *)piePlot recordIndex:(NSUInteger)index -{ - CGFloat offset = 0.0; - - if ( index == 0 ) { - offset = piePlot.pieRadius / 8.0; - } - - return offset; -} - -/*-(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index; - * { - * return nil; - * }*/ - -#pragma mark - -#pragma mark Delegate Methods - --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index -{ - pieChart.title = [NSString stringWithFormat:@"Selected index: %lu", (unsigned long)index]; -} - --(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag -{ - CPTPieChart *piePlot = (CPTPieChart *)[pieChart plotWithIdentifier:@"Pie Chart 1"]; - CABasicAnimation *basicAnimation = (CABasicAnimation *)theAnimation; - - [piePlot removeAnimationForKey:basicAnimation.keyPath]; - [piePlot setValue:basicAnimation.toValue forKey:basicAnimation.keyPath]; - [piePlot repositionAllLabelAnnotations]; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.h b/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.h deleted file mode 100644 index d72fe6889..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// CPTTestAppScatterPlotController.h -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import "CorePlot-CocoaTouch.h" -#import - -@interface CPTTestAppScatterPlotController : UIViewController -{ - CPTXYGraph *graph; - - NSMutableArray *dataForPlot; -} - -@property (readwrite, strong, nonatomic) NSMutableArray *dataForPlot; - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m deleted file mode 100644 index ea8c27187..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m +++ /dev/null @@ -1,221 +0,0 @@ -// -// CPTTestAppScatterPlotController.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import "CPTTestAppScatterPlotController.h" - -@implementation CPTTestAppScatterPlotController - -@synthesize dataForPlot; - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - return YES; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidLoad -{ - [super viewDidLoad]; - - // Create graph from theme - graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [graph applyTheme:theme]; - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.collapsesLayers = NO; // Setting to YES reduces GPU memory usage, but can slow drawing/scrolling - hostingView.hostedGraph = graph; - - graph.paddingLeft = 10.0; - graph.paddingTop = 10.0; - graph.paddingRight = 10.0; - graph.paddingBottom = 10.0; - - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; - - // Axes - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = @0.5; - x.orthogonalPosition = @2.0; - x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; - x.labelExclusionRanges = exclusionRanges; - - CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = @0.5; - y.minorTicksPerInterval = 5; - y.orthogonalPosition = @2.0; - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@3.99 length:@0.02]]; - y.labelExclusionRanges = exclusionRanges; - y.delegate = self; - - // Create a blue plot area - CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; - CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; - lineStyle.miterLimit = 1.0; - lineStyle.lineWidth = 3.0; - lineStyle.lineColor = [CPTColor blueColor]; - boundLinePlot.dataLineStyle = lineStyle; - boundLinePlot.identifier = @"Blue Plot"; - boundLinePlot.dataSource = self; - [graph addPlot:boundLinePlot]; - - CPTImage *fillImage = [CPTImage imageNamed:@"BlueTexture"]; - fillImage.tiled = YES; - CPTFill *areaImageFill = [CPTFill fillWithImage:fillImage]; - boundLinePlot.areaFill = areaImageFill; - boundLinePlot.areaBaseValue = @0.0; - - // Add plot symbols - CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; - symbolLineStyle.lineColor = [CPTColor blackColor]; - CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; - plotSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]]; - plotSymbol.lineStyle = symbolLineStyle; - plotSymbol.size = CGSizeMake(10.0, 10.0); - boundLinePlot.plotSymbol = plotSymbol; - - // Create a green plot area - CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; - lineStyle = [CPTMutableLineStyle lineStyle]; - lineStyle.lineWidth = 3.0; - lineStyle.lineColor = [CPTColor greenColor]; - lineStyle.dashPattern = @[@5.0, @5.0]; - dataSourceLinePlot.dataLineStyle = lineStyle; - dataSourceLinePlot.identifier = @"Green Plot"; - dataSourceLinePlot.dataSource = self; - - // Put an area gradient under the plot above - CPTColor *areaColor = [CPTColor colorWithComponentRed:0.3 green:1.0 blue:0.3 alpha:0.8]; - CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:areaColor endingColor:[CPTColor clearColor]]; - areaGradient.angle = -90.0; - CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; - dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = @1.75; - - // Animate in the new plot, as an example - dataSourceLinePlot.opacity = 0.0; - [graph addPlot:dataSourceLinePlot]; - - CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; - fadeInAnimation.duration = 1.0; - fadeInAnimation.removedOnCompletion = NO; - fadeInAnimation.fillMode = kCAFillModeForwards; - fadeInAnimation.toValue = @1.0; - [dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"]; - - // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; - for ( NSUInteger i = 0; i < 60; i++ ) { - NSNumber *x = @(1.0 + i * 0.05); - NSNumber *y = @(1.2 * rand() / (double)RAND_MAX + 1.2); - [contentArray addObject:@{ @"x": x, - @"y": y } - ]; - } - self.dataForPlot = contentArray; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)changePlotRange -{ - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(3.0 + 2.0 * rand() / RAND_MAX)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(3.0 + 2.0 * rand() / RAND_MAX)]; -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return [dataForPlot count]; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); - NSNumber *num = dataForPlot[index][key]; - - // Green plot gets shifted above the blue - if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { - if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); - } - } - return num; -} - -#pragma mark - -#pragma mark Axis Delegate Methods - --(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations -{ - static CPTTextStyle *positiveStyle = nil; - static CPTTextStyle *negativeStyle = nil; - static dispatch_once_t positiveOnce; - static dispatch_once_t negativeOnce; - - NSFormatter *formatter = axis.labelFormatter; - CGFloat labelOffset = axis.labelOffset; - NSDecimalNumber *zero = [NSDecimalNumber zero]; - - NSMutableSet *newLabels = [NSMutableSet set]; - - for ( NSDecimalNumber *tickLocation in locations ) { - CPTTextStyle *theLabelTextStyle; - - if ( [tickLocation isGreaterThanOrEqualTo:zero] ) { - dispatch_once(&positiveOnce, ^{ - CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; - newStyle.color = [CPTColor greenColor]; - positiveStyle = newStyle; - }); - - theLabelTextStyle = positiveStyle; - } - else { - dispatch_once(&negativeOnce, ^{ - CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; - newStyle.color = [CPTColor redColor]; - negativeStyle = newStyle; - }); - - theLabelTextStyle = negativeStyle; - } - - NSString *labelString = [formatter stringForObjectValue:tickLocation]; - CPTTextLayer *newLabelLayer = [[CPTTextLayer alloc] initWithText:labelString style:theLabelTextStyle]; - - CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithContentLayer:newLabelLayer]; - newLabel.tickLocation = tickLocation; - newLabel.offset = labelOffset; - - [newLabels addObject:newLabel]; - } - - axis.axisLabels = newLabels; - - return NO; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.h b/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.h deleted file mode 100644 index 250ee5094..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// CPTTestApp_iPhoneAppDelegate.h -// CPTTestApp-iPhone -// -// Toolbar icons in the application are courtesy of Joseph Wain / glyphish.com -// See the license file in the GlyphishIcons directory for more information on these icons - -#import - -@interface CPTTestApp_iPhoneAppDelegate : NSObject { - UIWindow *window; - UITabBarController *tabBarController; -} - -@property (nonatomic, strong) IBOutlet UIWindow *window; -@property (nonatomic, strong) IBOutlet UITabBarController *tabBarController; - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m b/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m deleted file mode 100644 index ba1add323..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m +++ /dev/null @@ -1,37 +0,0 @@ -// -// CPTTestApp_iPhoneAppDelegate.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. - -#import "CPTTestApp_iPhoneAppDelegate.h" - -@implementation CPTTestApp_iPhoneAppDelegate - -@synthesize window; -@synthesize tabBarController; - --(void)applicationDidFinishLaunching:(UIApplication *)application -{ - if ( [self.window respondsToSelector:@selector(setRootViewController:)] ) { - self.window.rootViewController = self.tabBarController; - } - else { - [self.window addSubview:self.tabBarController.view]; - } - [self.window makeKeyAndVisible]; -} - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { - * } - */ - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { - * } - */ - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift new file mode 100644 index 000000000..595533dd2 --- /dev/null +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -0,0 +1,102 @@ +import UIKit + +class PieChartController : UIViewController, CPTPieChartDataSource { + private var pieGraph : CPTXYGraph? = nil + + let dataForChart = [20.0, 30.0, 60.0] + + // MARK: Initialization + + override func viewDidAppear(animated : Bool) + { + super.viewDidAppear(animated) + + // Create graph from theme + let newGraph = CPTXYGraph() + newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + + let hostingView = self.view as CPTGraphHostingView + hostingView.hostedGraph = newGraph + + // Paddings + newGraph.paddingLeft = 20.0 + newGraph.paddingRight = 20.0 + newGraph.paddingTop = 20.0 + newGraph.paddingBottom = 20.0 + + newGraph.axisSet = nil + + let whiteText = CPTMutableTextStyle() + whiteText.color = CPTColor.whiteColor() + + newGraph.titleTextStyle = whiteText + newGraph.title = "Graph Title" + + // Add pie chart + let piePlot = CPTPieChart() + piePlot.dataSource = self + piePlot.pieRadius = 131.0 + piePlot.identifier = "Pie Chart 1" + piePlot.startAngle = CGFloat(M_PI_4) + piePlot.sliceDirection = .CounterClockwise + piePlot.centerAnchor = CGPoint(x: 0.5, y: 0.38) + piePlot.borderLineStyle = CPTLineStyle() + piePlot.delegate = self + newGraph.addPlot(piePlot) + + self.pieGraph = newGraph + } + + // MARK: - Plot Data Source Methods + + func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + { + return UInt(self.dataForChart.count) + } + + func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + { + if Int(recordIndex) > self.dataForChart.count { + return nil + } + else { + switch CPTPieChartField.fromRaw(Int(field))! { + case .SliceWidth: + return (self.dataForChart)[Int(recordIndex)] as NSNumber + + default: + return recordIndex as NSNumber + } + } + } + + func dataLabelForPlot(plot: CPTPlot!, recordIndex: UInt) -> CPTLayer! + { + let label = CPTTextLayer(text:"\(recordIndex)") + + let textStyle = label.textStyle.mutableCopy() as CPTMutableTextStyle + textStyle.color = CPTColor.lightGrayColor() + + label.textStyle = textStyle + + return label + } + + func radialOffsetForPieChart(piePlot: CPTPieChart!, recordIndex: UInt) -> CGFloat + { + var offset: CGFloat = 0.0 + + if ( recordIndex == 0 ) { + offset = piePlot.pieRadius / 8.0 + } + + return offset + } + + // MARK: - Delegate Methods + + func pieChart(plot: CPTPlot!, sliceWasSelectedAtRecordIndex recordIndex: UInt) + { + self.pieGraph?.title = "Selected index: \(recordIndex)" + } +} diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift new file mode 100644 index 000000000..3f644817e --- /dev/null +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -0,0 +1,183 @@ +import UIKit + +class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { + private var scatterGraph : CPTXYGraph? = nil + + typealias plotDataType = [CPTScatterPlotField : Double] + private var dataForPlot = [plotDataType]() + + // MARK: Initialization + + override func viewDidAppear(animated : Bool) + { + super.viewDidAppear(animated) + + // Create graph from theme + let newGraph = CPTXYGraph() + newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + + let hostingView = self.view as CPTGraphHostingView + hostingView.hostedGraph = newGraph + + // Paddings + newGraph.paddingLeft = 10.0 + newGraph.paddingRight = 10.0 + newGraph.paddingTop = 10.0 + newGraph.paddingBottom = 10.0 + + // Plot space + let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + plotSpace.allowsUserInteraction = true + plotSpace.yRange = CPTPlotRange(location:1.0, length:2.0) + plotSpace.xRange = CPTPlotRange(location:1.0, length:3.0) + + // Axes + let axisSet = newGraph.axisSet as CPTXYAxisSet + + let x = axisSet.xAxis + x.majorIntervalLength = 0.5 + x.orthogonalPosition = 2.0 + x.minorTicksPerInterval = 2 + x.labelExclusionRanges = [ + CPTPlotRange(location: 0.99, length: 0.02), + CPTPlotRange(location: 1.99, length: 0.02), + CPTPlotRange(location: 2.99, length: 0.02) + ] + + let y = axisSet.xAxis + y.majorIntervalLength = 0.5 + y.minorTicksPerInterval = 5 + y.orthogonalPosition = 2.0 + y.labelExclusionRanges = [ + CPTPlotRange(location: 0.99, length: 0.02), + CPTPlotRange(location: 1.99, length: 0.02), + CPTPlotRange(location: 3.99, length: 0.02) + ] + y.delegate = self + + // Create a blue plot area + let boundLinePlot = CPTScatterPlot() + let blueLineStyle = CPTMutableLineStyle() + blueLineStyle.miterLimit = 1.0 + blueLineStyle.lineWidth = 3.0 + blueLineStyle.lineColor = CPTColor.blueColor() + boundLinePlot.dataLineStyle = blueLineStyle + boundLinePlot.identifier = "Blue Plot" + boundLinePlot.dataSource = self + newGraph.addPlot(boundLinePlot) + + let fillImage = CPTImage(named:"BlueTexture") + fillImage.tiled = true + boundLinePlot.areaFill = CPTFill(image: fillImage) + boundLinePlot.areaBaseValue = 0.0 + + // Add plot symbols + let symbolLineStyle = CPTMutableLineStyle() + symbolLineStyle.lineColor = CPTColor.blackColor() + let plotSymbol = CPTPlotSymbol.ellipsePlotSymbol() + plotSymbol.fill = CPTFill(color: CPTColor.blueColor()) + plotSymbol.lineStyle = symbolLineStyle + plotSymbol.size = CGSize(width: 10.0, height: 10.0) + boundLinePlot.plotSymbol = plotSymbol + + // Create a green plot area + let dataSourceLinePlot = CPTScatterPlot() + let greenLineStyle = CPTMutableLineStyle() + greenLineStyle.lineWidth = 3.0 + greenLineStyle.lineColor = CPTColor.greenColor() + greenLineStyle.dashPattern = [5.0, 5.0] + dataSourceLinePlot.dataLineStyle = greenLineStyle + dataSourceLinePlot.identifier = "Green Plot" + dataSourceLinePlot.dataSource = self + + // Put an area gradient under the plot above + let areaColor = CPTColor(componentRed: 0.3, green: 1.0, blue: 0.3, alpha: 0.8) + let areaGradient = CPTGradient(beginningColor: areaColor, endingColor: CPTColor.clearColor()) + areaGradient.angle = -90.0 + let areaGradientFill = CPTFill(gradient: areaGradient) + dataSourceLinePlot.areaFill = areaGradientFill + dataSourceLinePlot.areaBaseValue = 1.75 + + // Animate in the new plot, as an example + dataSourceLinePlot.opacity = 0.0 + newGraph.addPlot(dataSourceLinePlot) + + let fadeInAnimation = CABasicAnimation(keyPath: "opacity") + fadeInAnimation.duration = 1.0 + fadeInAnimation.removedOnCompletion = false + fadeInAnimation.fillMode = kCAFillModeForwards + fadeInAnimation.toValue = 1.0 + dataSourceLinePlot.addAnimation(fadeInAnimation, forKey: "animateOpacity") + + // Add some initial data + var contentArray = [plotDataType]() + for i in 0 ..< 60 { + let x = 1.0 + Double(i) * 0.05 + let y = 1.2 * Double(arc4random()) / Double(UInt32.max) + 1.2 + let dataPoint: plotDataType = [.X: x, .Y: y] + contentArray.append(dataPoint) + } + self.dataForPlot = contentArray + + self.scatterGraph = newGraph + } + + // MARK: - Plot Data Source Methods + + func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + { + return UInt(self.dataForPlot.count) + } + + func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + { + let plotField = CPTScatterPlotField.fromRaw(Int(field)) + + if let num = self.dataForPlot[Int(recordIndex)][plotField!] { + let plotID = plot.identifier as String + if (plotField! == .Y) && (plotID == "Green Plot") { + return (num + 1.0) as NSNumber + } + else { + return num as NSNumber + } + } + else { + return nil + } + } + + // MARK: - Axis Delegate Methods + + func axis(axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool + { + let formatter = axis.labelFormatter + let labelOffset = axis.labelOffset + + let newLabels = NSMutableSet() + + for tickLocation in locations { + var labelTextStyle = axis.labelTextStyle.mutableCopy() as CPTMutableTextStyle + + if tickLocation.doubleValue >= 0.0 { + labelTextStyle.color = CPTColor.greenColor() + } + else { + labelTextStyle.color = CPTColor.redColor() + } + + let labelString = formatter.stringForObjectValue(tickLocation) + let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) + + let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) + newLabel.tickLocation = tickLocation as NSNumber + newLabel.offset = labelOffset + + newLabels.addObject(newLabel) + } + + axis.axisLabels = newLabels + + return false + } +} diff --git a/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift new file mode 100644 index 000000000..8d843868b --- /dev/null +++ b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift @@ -0,0 +1,20 @@ +import UIKit + +// Toolbar icons in the application are courtesy of Joseph Wain / glyphish.com +// See the license file in the GlyphishIcons directory for more information on these icons + +@UIApplicationMain + +class iPhoneAppDelegate : NSObject, UIApplicationDelegate, UITabBarControllerDelegate +{ + + @IBOutlet var window: UIWindow? = nil + @IBOutlet var tabBarController: UITabBarController? = nil + + func applicationDidFinishLaunching(application: UIApplication?) { + if let myWindow = self.window { + myWindow.rootViewController = self.tabBarController + myWindow.makeKeyAndVisible() + } + } +} diff --git a/examples/CPTTestApp-iPhone/MainWindow.xib b/examples/CPTTestApp-iPhone/MainWindow.xib index 68ae98bc2..20aa22cbf 100644 --- a/examples/CPTTestApp-iPhone/MainWindow.xib +++ b/examples/CPTTestApp-iPhone/MainWindow.xib @@ -1,17 +1,16 @@ - + 528 - 12C60 - 2843 - 1187.34 - 625.00 + 13F34 + 6245 + 1265.21 + 698.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1929 + 6238 - - YES + IBProxyObject IBUICustomObject IBUITabBar @@ -19,17 +18,15 @@ IBUITabBarItem IBUIViewController IBUIWindow - - - YES + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + PluginDependencyRecalculationVersion - - YES + IBFilesOwner IBCocoaTouchFramework @@ -42,30 +39,48 @@ IBCocoaTouchFramework - + 1316 - {320, 480} - - + {{0, 20}, {320, 480}} 1 MSAxIDEAA NO NO - + + + IBUISimulatedFreeformSizeMetricsSentinel + Freeform + IBCocoaTouchFramework YES YES - - + 1 1 + + IBUIScreenMetrics + IBCocoaTouchFramework + iPhone 4-inch + + YES + + + + + + {320, 568} + {568, 320} + + + 2 + IBCocoaTouchFramework NO @@ -80,15 +95,10 @@ ScatterPlot - - 1 - 1 - IBCocoaTouchFramework NO - - YES + @@ -101,10 +111,6 @@ BarChart - - 1 - 1 - IBCocoaTouchFramework NO @@ -118,37 +124,29 @@ IBCocoaTouchFramework - - YES - + PieChart - - 1 - 1 - IBCocoaTouchFramework NO - + - + 266 - {{0, 431}, {320, 49}} - - + {{0, 519}, {320, 49}} 3 MCAwAA NO IBCocoaTouchFramework + - + - - YES + delegate @@ -159,24 +157,23 @@ - window + tabBarController - + - 9 + 127 - tabBarController + window - + - 113 + 128 - + - - YES + 0 @@ -186,9 +183,7 @@ 2 - - YES - + @@ -205,13 +200,12 @@ 106 - - YES + - + @@ -222,19 +216,17 @@ 108 - - YES + - + 109 - - YES + - + @@ -255,10 +247,9 @@ 125 - - YES + - + @@ -266,105 +257,57 @@ - + - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 106.IBPluginDependency - 107.IBPluginDependency - 108.CustomClassName - 108.IBPluginDependency - 109.CustomClassName - 109.IBPluginDependency - 110.IBPluginDependency - 111.IBPluginDependency - 125.CustomClassName - 125.IBPluginDependency - 126.IBPluginDependency - 2.IBAttributePlaceholdersKey - 2.IBPluginDependency - 3.CustomClassName - 3.IBPluginDependency + + UIApplication + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CPTTestAppScatterPlotController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CPTTestAppBarChartController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CPTTestAppPieChartController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + CPTTestApp_iPhone - - YES - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppScatterPlotController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppBarChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppPieChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - YES - - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestApp_iPhoneAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - + target + iPhoneAppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + - - YES - - - + - 126 + 128 0 IBCocoaTouchFramework + NO com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - + YES 3 - - YES - - YES - 16-line-chart.png - 17-bar-chart.png - 62-contrast.png - - - YES - {30, 24} - {29, 24} - {20, 20} - - - 1929 + + {30, 24} + {29, 24} + {20, 20} + diff --git a/examples/CPTTestApp-iPhone/main.m b/examples/CPTTestApp-iPhone/main.m deleted file mode 100644 index 762bdbbff..000000000 --- a/examples/CPTTestApp-iPhone/main.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// main.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - int retVal = UIApplicationMain(argc, argv, nil, nil); - - return retVal; - } -} From b873b761737b7c42fc3ffaaf955ac549213f1ad2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 21 Sep 2014 13:32:08 -0400 Subject: [PATCH 005/429] Converted the DatePlot example app from Objective-C to Swift. --- examples/DatePlot/Controller.h | 10 - examples/DatePlot/Controller.m | 92 -- examples/DatePlot/DatePlot-Bridging-Header.h | 1 + .../DatePlot.xcodeproj/project.pbxproj | 59 +- examples/DatePlot/DatePlot.xib | 1013 ++++++----------- examples/DatePlot/DatePlot_Prefix.pch | 7 - examples/DatePlot/Source/DateController.swift | 101 ++ examples/DatePlot/Source/main.m | 14 - examples/DatePlot/Source/main.swift | 3 + 9 files changed, 513 insertions(+), 787 deletions(-) delete mode 100644 examples/DatePlot/Controller.h delete mode 100644 examples/DatePlot/Controller.m create mode 100644 examples/DatePlot/DatePlot-Bridging-Header.h delete mode 100644 examples/DatePlot/DatePlot_Prefix.pch create mode 100644 examples/DatePlot/Source/DateController.swift delete mode 100644 examples/DatePlot/Source/main.m create mode 100644 examples/DatePlot/Source/main.swift diff --git a/examples/DatePlot/Controller.h b/examples/DatePlot/Controller.h deleted file mode 100644 index 2bc57cfbe..000000000 --- a/examples/DatePlot/Controller.h +++ /dev/null @@ -1,10 +0,0 @@ -#import -#import - -@interface Controller : NSObject { - IBOutlet CPTGraphHostingView *hostView; - CPTXYGraph *graph; - NSArray *plotData; -} - -@end diff --git a/examples/DatePlot/Controller.m b/examples/DatePlot/Controller.m deleted file mode 100644 index 3abd1fa84..000000000 --- a/examples/DatePlot/Controller.m +++ /dev/null @@ -1,92 +0,0 @@ -#import "Controller.h" -#import - -@implementation Controller - --(void)dealloc -{ - [plotData release]; - [graph release]; - [super dealloc]; -} - --(void)awakeFromNib -{ - [super awakeFromNib]; - - // If you make sure your dates are calculated at noon, you shouldn't have to - // worry about daylight savings. If you use midnight, you will have to adjust - // for daylight savings time. - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - NSDate *refDate = [formatter dateFromString:@"12:00 Oct 29, 2009"]; - [formatter release]; - NSTimeInterval oneDay = 24 * 60 * 60; - - // Create graph from theme - graph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [graph applyTheme:theme]; - hostView.hostedGraph = graph; - - // Setup scatter plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - NSTimeInterval xLow = 0.0; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; - - // Axes - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = @(oneDay); - x.orthogonalPosition = @2.0; - x.minorTicksPerInterval = 0; - NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; - dateFormatter.dateStyle = kCFDateFormatterShortStyle; - CPTTimeFormatter *timeFormatter = [[[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter] autorelease]; - timeFormatter.referenceDate = refDate; - x.labelFormatter = timeFormatter; - - CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = @0.5; - y.minorTicksPerInterval = 5; - y.orthogonalPosition = @(oneDay); - - // Create a plot that uses the data source method - CPTScatterPlot *dataSourceLinePlot = [[[CPTScatterPlot alloc] init] autorelease]; - dataSourceLinePlot.identifier = @"Date Plot"; - - CPTMutableLineStyle *lineStyle = [[dataSourceLinePlot.dataLineStyle mutableCopy] autorelease]; - lineStyle.lineWidth = 3.0; - lineStyle.lineColor = [CPTColor greenColor]; - dataSourceLinePlot.dataLineStyle = lineStyle; - - dataSourceLinePlot.dataSource = self; - [graph addPlot:dataSourceLinePlot]; - - // Add some data - NSMutableArray *newData = [NSMutableArray array]; - for ( NSUInteger i = 0; i < 5; i++ ) { - NSTimeInterval x = oneDay * i; - NSNumber *y = @(1.2 * rand() / (double)RAND_MAX + 1.2); - [newData addObject: - @{ @(CPTScatterPlotFieldX): @(x), - @(CPTScatterPlotFieldY): y } - ]; - } - plotData = newData; -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return plotData.count; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - return plotData[index][@(fieldEnum)]; -} - -@end diff --git a/examples/DatePlot/DatePlot-Bridging-Header.h b/examples/DatePlot/DatePlot-Bridging-Header.h new file mode 100644 index 000000000..cde174e4f --- /dev/null +++ b/examples/DatePlot/DatePlot-Bridging-Header.h @@ -0,0 +1 @@ +#import diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index f37d29b68..2a4aa768a 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 076185040F3CB17800A89A76 /* CorePlot.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 076184C10F3CAD5900A89A76 /* CorePlot.framework */; }; + 076185040F3CB17800A89A76 /* CorePlot.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 076184C10F3CAD5900A89A76 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 0761850B0F3CB1E800A89A76 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 076184C10F3CAD5900A89A76 /* CorePlot.framework */; }; - 077382B10F3DC1FB002F10E2 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 077382B00F3DC1FB002F10E2 /* Controller.m */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; - 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 90AF4F440F36CF1800753D26 /* DatePlot.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90AF4F430F36CF1800753D26 /* DatePlot.xib */; }; BC8E737D0FC0B3CF00DF8511 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */; }; BCB3FD520FD85658008875A4 /* CorePlotIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = BCB3FD510FD85658008875A4 /* CorePlotIcon.icns */; }; + C33E19A8198330CA00182AF2 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33E19A7198330CA00182AF2 /* main.swift */; }; + C3A14440197DE35F0048F1FF /* DateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A1443F197DE35F0048F1FF /* DateController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,20 +60,19 @@ 071BCBD61079EBE00045E43D /* CorePlot.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = SOURCE_ROOT; }; 0761854B0F3CB3CB00A89A76 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CorePlot.framework; path = ../../../../framework/build/Debug/CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 077382AF0F3DC1FB002F10E2 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; - 077382B00F3DC1FB002F10E2 /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; - 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Source/main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 32CA4F630368D1EE00C91783 /* DatePlot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatePlot_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* DatePlot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DatePlot.app; sourceTree = BUILT_PRODUCTS_DIR; }; 90AF4F430F36CF1800753D26 /* DatePlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DatePlot.xib; sourceTree = ""; }; BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BCB3FD510FD85658008875A4 /* CorePlotIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = CorePlotIcon.icns; sourceTree = ""; }; + C33E19A7198330CA00182AF2 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = Source/main.swift; sourceTree = ""; }; + C3A1443E197DE35F0048F1FF /* DatePlot-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DatePlot-Bridging-Header.h"; sourceTree = ""; }; + C3A1443F197DE35F0048F1FF /* DateController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DateController.swift; path = Source/DateController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -94,7 +93,7 @@ isa = PBXGroup; children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, - 07E0DF80109C4E9500F108D2 /* UnitTests.octest */, + 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, ); name = Products; sourceTree = ""; @@ -102,8 +101,8 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( - 077382AF0F3DC1FB002F10E2 /* Controller.h */, - 077382B00F3DC1FB002F10E2 /* Controller.m */, + C3A1443E197DE35F0048F1FF /* DatePlot-Bridging-Header.h */, + C3A1443F197DE35F0048F1FF /* DateController.swift */, ); name = Classes; sourceTree = ""; @@ -142,7 +141,7 @@ children = ( 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */, 080E96DDFE201D6D7F000001 /* Classes */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, + C33E19A219832EEA00182AF2 /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, @@ -153,15 +152,6 @@ tabWidth = 4; usesTabs = 0; }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - 32CA4F630368D1EE00C91783 /* DatePlot_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main.m */, - ); - name = "Other Sources"; - sourceTree = ""; - }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( @@ -182,6 +172,14 @@ name = Frameworks; sourceTree = ""; }; + C33E19A219832EEA00182AF2 /* Other Sources */ = { + isa = PBXGroup; + children = ( + C33E19A7198330CA00182AF2 /* main.swift */, + ); + name = "Other Sources"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -212,7 +210,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = NO; - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0600; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DatePlot" */; compatibilityVersion = "Xcode 3.2"; @@ -247,10 +245,10 @@ remoteRef = 076184C00F3CAD5900A89A76 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 07E0DF80109C4E9500F108D2 /* UnitTests.octest */ = { + 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -274,8 +272,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8D11072D0486CEB800E47090 /* main.m in Sources */, - 077382B10F3DC1FB002F10E2 /* Controller.m in Sources */, + C33E19A8198330CA00182AF2 /* main.swift in Sources */, + C3A14440197DE35F0048F1FF /* DateController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -305,6 +303,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; @@ -317,7 +316,10 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_NAME = DatePlot; + SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; @@ -325,6 +327,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; @@ -333,7 +336,9 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_NAME = DatePlot; + SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; }; name = Release; }; @@ -346,7 +351,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; @@ -361,7 +366,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.10; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; }; diff --git a/examples/DatePlot/DatePlot.xib b/examples/DatePlot/DatePlot.xib index f55d70028..66db5c0f0 100644 --- a/examples/DatePlot/DatePlot.xib +++ b/examples/DatePlot/DatePlot.xib @@ -1,37 +1,28 @@ - + 1050 - 11B26 - 1617 - 1138 - 566.00 + 13F34 + 6245 + 1265.21 + 698.00 com.apple.InterfaceBuilder.CocoaPlugin - 1617 + 6245 - - YES + + NSCustomObject NSCustomView - NSWindowTemplate - NSView NSMenu NSMenuItem - NSCustomObject - - - YES + NSView + NSWindowTemplate + + com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - - - YES + + + NSApplication @@ -46,8 +37,7 @@ AMainMenu - - YES + DatePlot @@ -62,10 +52,10 @@ NSMenuMixedState submenuAction: + DatePlot - - YES + About DatePlot @@ -111,11 +101,10 @@ submenuAction: + Services - - YES - + _NSServicesMenu @@ -174,7 +163,7 @@ - + _NSAppleMenu @@ -186,10 +175,10 @@ submenuAction: + File - - YES + New @@ -216,10 +205,10 @@ submenuAction: + Open Recent - - YES + Clear Menu @@ -228,7 +217,7 @@ - + _NSRecentDocumentsMenu @@ -332,7 +321,7 @@ - + @@ -343,10 +332,10 @@ submenuAction: + Edit - - YES + Undo @@ -437,10 +426,10 @@ submenuAction: + Find - - YES + Find… @@ -490,7 +479,7 @@ - + @@ -501,10 +490,10 @@ submenuAction: + Spelling and Grammar - - YES + Show Spelling… @@ -539,7 +528,7 @@ - + @@ -550,10 +539,10 @@ submenuAction: + Substitutions - - YES + Smart Copy/Paste @@ -584,7 +573,7 @@ 3 - + @@ -595,10 +584,10 @@ submenuAction: + Speech - - YES + Start Speaking @@ -615,10 +604,10 @@ - + - + @@ -629,10 +618,10 @@ submenuAction: + Format - - YES + Font @@ -641,10 +630,10 @@ submenuAction: + Font - - YES + Show Fonts @@ -731,10 +720,10 @@ submenuAction: + Kern - - YES + Use Default @@ -767,7 +756,7 @@ - + @@ -778,10 +767,10 @@ submenuAction: + Ligature - - YES + Use Default @@ -806,7 +795,7 @@ - + @@ -817,10 +806,10 @@ submenuAction: + Baseline - - YES + Use Default @@ -861,7 +850,7 @@ - + @@ -911,7 +900,7 @@ - + _NSFontMenu @@ -923,10 +912,10 @@ submenuAction: + Text - - YES + Align Left @@ -998,10 +987,10 @@ - + - + @@ -1012,10 +1001,10 @@ submenuAction: + View - - YES + Show Toolbar @@ -1061,7 +1050,7 @@ - + @@ -1072,10 +1061,10 @@ submenuAction: + Window - - YES + Minimize @@ -1111,7 +1100,7 @@ - + _NSWindowsMenu @@ -1123,10 +1112,10 @@ submenuAction: + Help - - YES + DatePlot Help @@ -1136,10 +1125,10 @@ - + - + _NSMainMenu @@ -1155,8 +1144,7 @@ 256 - - YES + 274 @@ -1166,24 +1154,31 @@ CPTGraphHostingView - + {912, 526} - {{0, 0}, {1680, 1028}} + {{0, 0}, {1920, 1178}} {450, 272} {10000000000000, 10000000000000} YES - Controller + _TtC8DatePlot14DateController - + - - YES + + + + orderFrontStandardAboutPanel: + + + + 142 + performMiniaturize: @@ -1224,14 +1219,6 @@ 127 - - - orderFrontStandardAboutPanel: - - - - 142 - performClose: @@ -1472,46 +1459,6 @@ 370 - - - addFontTrait: - - - - 418 - - - - addFontTrait: - - - - 419 - - - - modifyFont: - - - - 420 - - - - orderFrontFontPanel: - - - - 421 - - - - modifyFont: - - - - 422 - raiseBaseline: @@ -1696,21 +1643,60 @@ 445 + + + addFontTrait: + + + + 418 + + + + addFontTrait: + + + + 419 + + + + modifyFont: + + + + 420 + + + + orderFrontFontPanel: + + + + 421 + + + + modifyFont: + + + + 422 + hostView - 521 + 522 - + - - YES + 0 - + @@ -1735,8 +1721,7 @@ 29 - - YES + @@ -1744,61 +1729,55 @@ - + MainMenu 19 - - YES + - + 56 - - YES + - + 103 - - YES + - + 1 217 - - YES + - + 83 - - YES + - + 81 - - YES + @@ -1813,7 +1792,7 @@ - + @@ -1848,10 +1827,9 @@ 124 - - YES + - + @@ -1887,10 +1865,9 @@ 125 - - YES + - + @@ -1901,8 +1878,7 @@ 205 - - YES + @@ -1916,7 +1892,7 @@ - + @@ -1967,31 +1943,28 @@ 218 - - YES + - + 216 - - YES + - + 200 - - YES + - + @@ -2012,14 +1985,13 @@ 220 - - YES + - + @@ -2050,10 +2022,9 @@ 106 - - YES + - + 2 @@ -2065,8 +2036,7 @@ 57 - - YES + @@ -2078,7 +2048,7 @@ - + @@ -2126,10 +2096,9 @@ 131 - - YES + - + @@ -2150,13 +2119,12 @@ 24 - - YES + - + @@ -2182,23 +2150,21 @@ 295 - - YES + - + 296 - - YES + - + @@ -2214,20 +2180,18 @@ 211 - - YES + - + 212 - - YES + - + @@ -2248,21 +2212,19 @@ 348 - - YES + - + 349 - - YES + - + @@ -2288,45 +2250,40 @@ 373 - - YES + - + 374 - - YES + - + 375 - - YES + - + 376 - - YES + - + 377 - - YES + @@ -2335,7 +2292,7 @@ - + @@ -2381,8 +2338,7 @@ 386 - - YES + @@ -2399,7 +2355,7 @@ - + @@ -2445,28 +2401,25 @@ 395 - - YES + - + 396 - - YES + - + 397 - - YES + - + @@ -2497,14 +2450,13 @@ 403 - - YES + - + @@ -2535,12 +2487,11 @@ 409 - - YES + - + @@ -2561,13 +2512,12 @@ 413 - - YES + - + @@ -2593,19 +2543,17 @@ 446 - - YES + - + 447 - - YES + - + @@ -2652,333 +2600,189 @@ Controller - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 103.IBPluginDependency - 106.IBPluginDependency - 111.IBPluginDependency - 112.IBPluginDependency - 124.IBPluginDependency - 125.IBPluginDependency - 126.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency - 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency - 149.IBPluginDependency - 150.IBPluginDependency - 19.IBPluginDependency - 195.IBPluginDependency - 196.IBPluginDependency - 197.IBPluginDependency - 198.IBPluginDependency - 199.IBPluginDependency - 200.IBPluginDependency - 201.IBPluginDependency - 202.IBPluginDependency - 203.IBPluginDependency - 204.IBPluginDependency - 205.IBPluginDependency - 206.IBPluginDependency - 207.IBPluginDependency - 208.IBPluginDependency - 209.IBPluginDependency - 210.IBPluginDependency - 211.IBPluginDependency - 212.IBPluginDependency - 213.IBPluginDependency - 214.IBPluginDependency - 215.IBPluginDependency - 216.IBPluginDependency - 217.IBPluginDependency - 218.IBPluginDependency - 219.IBPluginDependency - 220.IBPluginDependency - 221.IBPluginDependency - 23.IBPluginDependency - 236.IBPluginDependency - 239.IBPluginDependency - 24.IBPluginDependency - 29.IBPluginDependency - 295.IBPluginDependency - 296.IBPluginDependency - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 348.IBPluginDependency - 349.IBPluginDependency - 350.IBPluginDependency - 351.IBPluginDependency - 354.IBPluginDependency - 371.IBPluginDependency - 373.IBPluginDependency - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 387.IBPluginDependency - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 446.IBPluginDependency - 446.IBWindowTemplateEditedContentRect - 446.NSWindowTemplate.visibleAtLaunch - 447.IBPluginDependency - 5.IBPluginDependency - 506.IBPluginDependency - 507.IBPluginDependency - 510.IBPluginDependency - 512.IBPluginDependency - 513.IBPluginDependency - 514.IBPluginDependency - 519.IBPluginDependency - 520.IBPluginDependency - 56.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 72.IBPluginDependency - 73.IBPluginDependency - 74.IBPluginDependency - 75.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 79.IBPluginDependency - 80.IBPluginDependency - 81.IBPluginDependency - 82.IBPluginDependency - 83.IBPluginDependency - 92.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{78, 234}, {912, 526}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{78, 234}, {912, 526}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + - - YES - - - + - 521 + 522 - - YES + CPTGraphHostingView NSView IBProjectSource - ./Classes/CPTGraphHostingView.h + ../framework/MacOnly/CPTGraphHostingView.h - Controller + CPTGraphHostingView + UIView + + IBProjectSource + ../framework/iPhoneOnly/CPTGraphHostingView.h + + + + DateController + YES NSObject hostView - CPTLayerHostingView + CPTGraphHostingView hostView hostView - CPTLayerHostingView + CPTGraphHostingView IBProjectSource - ./Classes/Controller.h + DatePlot/Source/DateController.swift @@ -2999,103 +2803,38 @@ + + - NSDocument - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - + CPTGraphHostingView + NSView - IBProjectSource - ./Classes/NSDocument.h + IBFrameworkSource + CorePlot.framework/Headers/CPTGraphHostingView.h - + 0 IBCocoaFramework + NO com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.macosx - + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - + YES 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - + + {11, 11} + {10, 3} + diff --git a/examples/DatePlot/DatePlot_Prefix.pch b/examples/DatePlot/DatePlot_Prefix.pch deleted file mode 100644 index 1e2a5f180..000000000 --- a/examples/DatePlot/DatePlot_Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'CPTTestApp' target in the 'CPTTestApp' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift new file mode 100644 index 000000000..4f2edec50 --- /dev/null +++ b/examples/DatePlot/Source/DateController.swift @@ -0,0 +1,101 @@ +import Foundation +import Cocoa +import CorePlot + +class DateController : NSObject, CPTPlotDataSource { + private let oneDay : Double = 24 * 60 * 60; + + @IBOutlet var hostView : CPTGraphHostingView? = nil + + private var graph : CPTXYGraph? = nil + + private var plotData = [Double]() + + // MARK: - Initialization + + override func awakeFromNib() + { + self.plotData = newPlotData() + + // If you make sure your dates are calculated at noon, you shouldn't have to + // worry about daylight savings. If you use midnight, you will have to adjust + // for daylight savings time. + let refDate = NSDateFormatter().dateFromString("12:00 Oct 29, 2009") + + // Create graph + let newGraph = CPTXYGraph() + + let theme = CPTTheme(named: kCPTDarkGradientTheme) + newGraph.applyTheme(theme) + + if let host = self.hostView { + host.hostedGraph = newGraph; + } + + // Setup scatter plot space + let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + + plotSpace.xRange = CPTPlotRange(location:0.0, length:oneDay * 5.0) + plotSpace.yRange = CPTPlotRange(location:1.0, length:3.0) + + // Axes + let axisSet = newGraph.axisSet as CPTXYAxisSet + let x = axisSet.xAxis + x.majorIntervalLength = oneDay + x.orthogonalPosition = 2.0 + x.minorTicksPerInterval = 0; + let dateFormatter = NSDateFormatter() + dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle + let timeFormatter = CPTTimeFormatter(dateFormatter:dateFormatter) + timeFormatter.referenceDate = refDate; + x.labelFormatter = timeFormatter; + + let y = axisSet.yAxis + y.majorIntervalLength = 0.5 + y.minorTicksPerInterval = 5 + y.orthogonalPosition = oneDay + + // Create a plot that uses the data source method + let dataSourceLinePlot = CPTScatterPlot() + dataSourceLinePlot.identifier = "Date Plot" + + let lineStyle = dataSourceLinePlot.dataLineStyle.mutableCopy() as CPTMutableLineStyle + lineStyle.lineWidth = 3.0 + lineStyle.lineColor = CPTColor.greenColor() + dataSourceLinePlot.dataLineStyle = lineStyle + + dataSourceLinePlot.dataSource = self + newGraph.addPlot(dataSourceLinePlot) + + self.graph = newGraph + } + + func newPlotData() -> [Double] + { + var newData = [Double]() + + for i in 0 ..< 5 { + newData.append(1.2 * Double(arc4random()) / Double(UInt32.max) + 1.2) + } + + return newData + } + + // MARK: - Plot Data Source Methods + + func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + { + return UInt(self.plotData.count) + } + + func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + { + switch CPTScatterPlotField.fromRaw(Int(field))! { + case .X: + return (oneDay * Double(recordIndex)) as NSNumber + + case .Y: + return self.plotData[Int(recordIndex)] as NSNumber + } + } +} diff --git a/examples/DatePlot/Source/main.m b/examples/DatePlot/Source/main.m deleted file mode 100644 index c2de14e93..000000000 --- a/examples/DatePlot/Source/main.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// main.m -// CPTTestApp -// -// Created by Dirkjan Krijnders on 2/2/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) -{ - return NSApplicationMain(argc, (const char **)argv); -} diff --git a/examples/DatePlot/Source/main.swift b/examples/DatePlot/Source/main.swift new file mode 100644 index 000000000..242155396 --- /dev/null +++ b/examples/DatePlot/Source/main.swift @@ -0,0 +1,3 @@ +import Cocoa + +NSApplicationMain(C_ARGC, C_ARGV) From caf43f79a7f4d9db2fad053d2f65d69fe9dc413f Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Thu, 25 Sep 2014 17:13:48 -0500 Subject: [PATCH 006/429] Fix install path for framework to use @rpath instead of @loader_path/../Frameworks (@rpath should be the default for all frameworks that support 10.6 or later, as it allows the loading code to specify path information to correctly resolve the location instead of hard coding it relative to the loading binary path. This is important when you have a framework inside of an application which is using the destination framework. (ex: MyApp->MyAppGraphics.Framework->CorePlot.Framework) --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index be598424a..6cf99ccf2 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -1646,7 +1646,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "@loader_path/../Frameworks"; + INSTALL_PATH = "@rpath"; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = CorePlot; SKIP_INSTALL = YES; @@ -1667,7 +1667,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "@loader_path/../Frameworks"; + INSTALL_PATH = "@rpath"; PRODUCT_NAME = CorePlot; SKIP_INSTALL = YES; "VALID_ARCHS[sdk=*]" = "i386 x86_64"; From 7a92ecfae004eeb06a24a29d5e4afcaa64382fd2 Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Thu, 25 Sep 2014 19:03:57 -0500 Subject: [PATCH 007/429] Add options for CPTScatteredPlotInterpolationHistogram that allow skipping the first or second step in the histogram. This allows creation of a scattered line graph that combines linear and histogram styles. Modified the SimpleScatteredPlot example to demonstrate / test modified histogram use --- examples/CorePlotGallery/src/plots/SimpleScatterPlot.m | 2 ++ framework/Source/CPTScatterPlot.h | 7 +++++++ framework/Source/CPTScatterPlot.m | 8 ++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 338979e1c..173bfee7a 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -130,6 +130,8 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme lineStyle.lineWidth = 3.0; lineStyle.lineColor = [CPTColor greenColor]; dataSourceLinePlot.dataLineStyle = lineStyle; + dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationCurved; //Histogram; + dataSourceLinePlot.histogramOptions = CPTScatterPlotHistogramSkipSecondStep; dataSourceLinePlot.dataSource = self; [graph addPlot:dataSourceLinePlot]; diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 8471b4011..6b35181dc 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -34,6 +34,12 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. }; +typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { + CPTScatterPlotHistogramNormal, ///< standard histogram + CPTScatterPlotHistogramSkipFirstStep, ///< skip the first step of the histogram + CPTScatterPlotHistogramSkipSecondStep ///< skip the second step of the histogram +}; + #pragma mark - /** @@ -223,6 +229,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { @property (nonatomic, readwrite) NSDecimal areaBaseValue; @property (nonatomic, readwrite) NSDecimal areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; +@property (nonatomic, readwrite) CPTScatterPlotHistogramOptions histogramOptions; /// @} /// @name Area Fill Bands diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index cc72d862b..038594ca8 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -78,6 +78,8 @@ @implementation CPTScatterPlot **/ @synthesize interpolation; +@synthesize histogramOptions; + /** @property CPTLineStyle *dataLineStyle * @brief The line style for the data line. * If @nil, the line is not drawn. @@ -954,8 +956,10 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan case CPTScatterPlotInterpolationHistogram: { CGFloat x = (lastPoint.x + viewPoint.x) / CPTFloat(2.0); - CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); - CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); + if( CPTScatterPlotHistogramSkipFirstStep != self.histogramOptions ) + CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); + if( CPTScatterPlotHistogramSkipSecondStep != self.histogramOptions ) + CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); CGPathAddLineToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); } break; From eeb5d890476a8007362e38b3f96b09a4b873669a Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Fri, 26 Sep 2014 13:49:33 -0500 Subject: [PATCH 008/429] Fix the SimpleScatteredPlot example to demonstrate / test modified histogram use (mistake from previous commit) --- examples/CorePlotGallery/src/plots/SimpleScatterPlot.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 173bfee7a..73cc6722d 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -130,7 +130,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme lineStyle.lineWidth = 3.0; lineStyle.lineColor = [CPTColor greenColor]; dataSourceLinePlot.dataLineStyle = lineStyle; - dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationCurved; //Histogram; + dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationHistogram; dataSourceLinePlot.histogramOptions = CPTScatterPlotHistogramSkipSecondStep; dataSourceLinePlot.dataSource = self; From e592134a93977897edcf4286231cbedb68038a0c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 26 Sep 2014 14:51:40 -0400 Subject: [PATCH 009/429] Added Lane Roathe to the license. --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 9f13d4ad7..c5f564dd5 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, and Michael Merickel. +Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, and Lane Roathe. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From e31ffb93a30bdf5ad40098a526a074b563998b2f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 26 Sep 2014 14:56:59 -0400 Subject: [PATCH 010/429] Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. --- QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj | 4 +++- examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj | 8 +++++--- .../Plot_Gallery_Mac.xcodeproj/project.pbxproj | 8 +++++--- examples/DatePlot/DatePlot.xcodeproj/project.pbxproj | 8 +++++--- examples/DropPlot/DropPlot.xcodeproj/project.pbxproj | 4 +++- .../minorTickFormatter.xcodeproj/project.pbxproj | 4 +++- examples/RangePlot/RangePlot.xcodeproj/project.pbxproj | 4 +++- 7 files changed, 27 insertions(+), 13 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 3060699dc..e58645f9f 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -244,7 +244,7 @@ A8F18CF511FA634B00B2C42F /* UnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = A8F18CF411FA634B00B2C42F /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -337,6 +337,7 @@ GCC_PREFIX_HEADER = CorePlotQCPlugin_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Graphics/Quartz Composer Plug-Ins"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ""; PRODUCT_NAME = CorePlotQCPlugin; SDKROOT = macosx; @@ -357,6 +358,7 @@ GCC_PREFIX_HEADER = CorePlotQCPlugin_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Graphics/Quartz Composer Plug-Ins"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ""; PRODUCT_NAME = CorePlotQCPlugin; SDKROOT = macosx; diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index fc438a58f..775945426 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -113,7 +113,7 @@ isa = PBXGroup; children = ( 07032B6A11ABB9E000463D20 /* CorePlot.framework */, - 07032B6C11ABB9E000463D20 /* UnitTests.octest */, + 07032B6C11ABB9E000463D20 /* UnitTests.xctest */, ); name = Products; sourceTree = ""; @@ -277,10 +277,10 @@ remoteRef = 07032B6911ABB9E000463D20 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 07032B6C11ABB9E000463D20 /* UnitTests.octest */ = { + 07032B6C11ABB9E000463D20 /* UnitTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07032B6B11ABB9E000463D20 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -356,6 +356,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = CPTTestApp; }; name = Debug; @@ -373,6 +374,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = CPTTestApp; }; name = Release; diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index 9d9175076..6105550d8 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -331,7 +331,7 @@ isa = PBXGroup; children = ( 4F4892891290FFCD00EDB93F /* CorePlot.framework */, - 4F48928B1290FFCD00EDB93F /* UnitTests.octest */, + 4F48928B1290FFCD00EDB93F /* UnitTests.xctest */, ); name = Products; sourceTree = ""; @@ -400,10 +400,10 @@ remoteRef = 4F4892881290FFCD00EDB93F /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 4F48928B1290FFCD00EDB93F /* UnitTests.octest */ = { + 4F48928B1290FFCD00EDB93F /* UnitTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 4F48928A1290FFCD00EDB93F /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -508,6 +508,7 @@ GCC_PREFIX_HEADER = Plot_Gallery_Mac_Prefix.pch; INFOPLIST_FILE = "Plot_Gallery_Mac-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-all_load", @@ -531,6 +532,7 @@ GCC_PREFIX_HEADER = Plot_Gallery_Mac_Prefix.pch; INFOPLIST_FILE = "Plot_Gallery_Mac-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-all_load", diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index f37d29b68..bcf574315 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -94,7 +94,7 @@ isa = PBXGroup; children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, - 07E0DF80109C4E9500F108D2 /* UnitTests.octest */, + 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, ); name = Products; sourceTree = ""; @@ -247,10 +247,10 @@ remoteRef = 076184C00F3CAD5900A89A76 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 07E0DF80109C4E9500F108D2 /* UnitTests.octest */ = { + 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -317,6 +317,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = DatePlot; }; name = Debug; @@ -333,6 +334,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = DatePlot; }; name = Release; diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 26bf9c7df..f633af4c3 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -249,7 +249,7 @@ 07E0DFAC109C4EB500F108D2 /* UnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07E0DFAB109C4EB500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -348,6 +348,7 @@ GCC_PREFIX_HEADER = DropPlot_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = DropPlot; }; name = Debug; @@ -365,6 +366,7 @@ HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = DropPlot; }; name = Release; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index d287dde3e..fc4e33624 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -250,7 +250,7 @@ 07E0DF80109C4E9500F108D2 /* UnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -318,6 +318,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = minorTickFormatter; }; name = Debug; @@ -335,6 +336,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = minorTickFormatter; }; name = Release; diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index b873ed4c8..c7ed0ca75 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -252,7 +252,7 @@ 07E0DF80109C4E9500F108D2 /* UnitTests.octest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = UnitTests.octest; + path = UnitTests.xctest; remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -320,6 +320,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = RangePlot; }; name = Debug; @@ -337,6 +338,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; PRODUCT_NAME = RangePlot; }; name = Release; From e4b77a9116348f36dfa7390f035e53baf161f5cf Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 26 Sep 2014 14:57:09 -0400 Subject: [PATCH 011/429] Updated the change log. --- documentation/changelog.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 304391bc8..9577f8a49 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -20,6 +20,7 @@ To be determined. - **New**: Added support for categorical plot data. - **Changed**: Increased the deployment target to iOS 5.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. +- **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Updated `CPTImage` to automatically handle switching between Retina and non-Retina displays. - **Changed**: Changed the behavior of all axis and plot xxxWasSelected delegate methods to require both a down and up event on the same element instead of only the down event. - **Changed**: Miscellaneous bug fixes and cleanup. From da4ceb3c00a59d30fb70c6e2dc163d750a416cbb Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 26 Sep 2014 15:02:12 -0400 Subject: [PATCH 012/429] Removed unrelated changes to CPTScatterPlot. --- examples/CorePlotGallery/src/plots/SimpleScatterPlot.m | 2 -- framework/Source/CPTScatterPlot.h | 7 ------- framework/Source/CPTScatterPlot.m | 8 ++------ 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 173bfee7a..338979e1c 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -130,8 +130,6 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme lineStyle.lineWidth = 3.0; lineStyle.lineColor = [CPTColor greenColor]; dataSourceLinePlot.dataLineStyle = lineStyle; - dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationCurved; //Histogram; - dataSourceLinePlot.histogramOptions = CPTScatterPlotHistogramSkipSecondStep; dataSourceLinePlot.dataSource = self; [graph addPlot:dataSourceLinePlot]; diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 6b35181dc..8471b4011 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -34,12 +34,6 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. }; -typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { - CPTScatterPlotHistogramNormal, ///< standard histogram - CPTScatterPlotHistogramSkipFirstStep, ///< skip the first step of the histogram - CPTScatterPlotHistogramSkipSecondStep ///< skip the second step of the histogram -}; - #pragma mark - /** @@ -229,7 +223,6 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { @property (nonatomic, readwrite) NSDecimal areaBaseValue; @property (nonatomic, readwrite) NSDecimal areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; -@property (nonatomic, readwrite) CPTScatterPlotHistogramOptions histogramOptions; /// @} /// @name Area Fill Bands diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 038594ca8..cc72d862b 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -78,8 +78,6 @@ @implementation CPTScatterPlot **/ @synthesize interpolation; -@synthesize histogramOptions; - /** @property CPTLineStyle *dataLineStyle * @brief The line style for the data line. * If @nil, the line is not drawn. @@ -956,10 +954,8 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan case CPTScatterPlotInterpolationHistogram: { CGFloat x = (lastPoint.x + viewPoint.x) / CPTFloat(2.0); - if( CPTScatterPlotHistogramSkipFirstStep != self.histogramOptions ) - CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); - if( CPTScatterPlotHistogramSkipSecondStep != self.histogramOptions ) - CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); + CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); + CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); CGPathAddLineToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); } break; From 6ee40caac552c8002c7214a25e172f20ef4fa9d0 Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Thu, 25 Sep 2014 19:03:57 -0500 Subject: [PATCH 013/429] Add options for CPTScatteredPlotInterpolationHistogram that allow skipping the first or second step in the histogram. This allows creation of a scattered line graph that combines linear and histogram styles. Modified the SimpleScatteredPlot example to demonstrate / test modified histogram use --- framework/Source/CPTScatterPlot.h | 7 +++++++ framework/Source/CPTScatterPlot.m | 8 ++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 38b851fd8..71c8b346d 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -34,6 +34,12 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. }; +typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { + CPTScatterPlotHistogramNormal, ///< standard histogram + CPTScatterPlotHistogramSkipFirstStep, ///< skip the first step of the histogram + CPTScatterPlotHistogramSkipSecondStep ///< skip the second step of the histogram +}; + #pragma mark - /** @@ -223,6 +229,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue; @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; +@property (nonatomic, readwrite) CPTScatterPlotHistogramOptions histogramOptions; /// @} /// @name Area Fill Bands diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index a588e1fb8..f9057afbc 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -78,6 +78,8 @@ @implementation CPTScatterPlot **/ @synthesize interpolation; +@synthesize histogramOptions; + /** @property CPTLineStyle *dataLineStyle * @brief The line style for the data line. * If @nil, the line is not drawn. @@ -958,8 +960,10 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan case CPTScatterPlotInterpolationHistogram: { CGFloat x = (lastPoint.x + viewPoint.x) / CPTFloat(2.0); - CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); - CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); + if( CPTScatterPlotHistogramSkipFirstStep != self.histogramOptions ) + CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); + if( CPTScatterPlotHistogramSkipSecondStep != self.histogramOptions ) + CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); CGPathAddLineToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); } break; From c12e7372777b508cb85feec412c5216d630318c5 Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Wed, 8 Oct 2014 16:28:59 -0500 Subject: [PATCH 014/429] Cleanup histogram option naming and add setter in style with other options so changing value causes graph to be updated in view. --- framework/Source/CPTScatterPlot.h | 10 ++++++---- framework/Source/CPTScatterPlot.m | 14 +++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 71c8b346d..1bae96dfc 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -34,10 +34,12 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. }; -typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { +typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { CPTScatterPlotHistogramNormal, ///< standard histogram - CPTScatterPlotHistogramSkipFirstStep, ///< skip the first step of the histogram - CPTScatterPlotHistogramSkipSecondStep ///< skip the second step of the histogram + CPTScatterPlotHistogramSkipFirst, ///< skip the first step of the histogram + CPTScatterPlotHistogramSkipSecond, ///< skip the second step of the histogram + + CPTScatterPlotHistogramOptionCount ///< the number of histogram options available }; #pragma mark - @@ -229,7 +231,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOptions) { @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue; @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; -@property (nonatomic, readwrite) CPTScatterPlotHistogramOptions histogramOptions; +@property (nonatomic, readwrite) CPTScatterPlotHistogramOption histogramOption; /// @} /// @name Area Fill Bands diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index f9057afbc..9a1dc3191 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -78,7 +78,7 @@ @implementation CPTScatterPlot **/ @synthesize interpolation; -@synthesize histogramOptions; +@synthesize histogramOption; /** @property CPTLineStyle *dataLineStyle * @brief The line style for the data line. @@ -960,9 +960,9 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan case CPTScatterPlotInterpolationHistogram: { CGFloat x = (lastPoint.x + viewPoint.x) / CPTFloat(2.0); - if( CPTScatterPlotHistogramSkipFirstStep != self.histogramOptions ) + if( CPTScatterPlotHistogramSkipFirst != self.histogramOption ) CGPathAddLineToPoint(dataLinePath, NULL, x, lastPoint.y); - if( CPTScatterPlotHistogramSkipSecondStep != self.histogramOptions ) + if( CPTScatterPlotHistogramSkipSecond != self.histogramOption ) CGPathAddLineToPoint(dataLinePath, NULL, x, viewPoint.y); CGPathAddLineToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); } @@ -1752,6 +1752,14 @@ -(void)setInterpolation:(CPTScatterPlotInterpolation)newInterpolation } } +-(void)setHistogramOption:(CPTScatterPlotHistogramOption)newHistogramOption +{ + if ( newHistogramOption != histogramOption ) { + histogramOption = newHistogramOption; + [self setNeedsDisplay]; + } +} + -(void)setPlotSymbol:(CPTPlotSymbol *)aSymbol { if ( aSymbol != plotSymbol ) { From 419f81abf03270018d91d745661766c5c00a7c78 Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Wed, 8 Oct 2014 16:30:22 -0500 Subject: [PATCH 015/429] Update sample to reflect changes to API and add handling of a press/click in plot area to toggle between the histogram options plus linear views to show the differences. --- .../src/plots/SimpleScatterPlot.m | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index b4c9f64bd..1dbb6947f 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -9,6 +9,9 @@ #import "SimpleScatterPlot.h" @implementation SimpleScatterPlot +{ + CPTScatterPlotHistogramOption _histogramOption; +} +(void)load { @@ -20,6 +23,7 @@ -(id)init if ( (self = [super init]) ) { self.title = @"Simple Scatter Plot"; self.section = kLinePlots; + _histogramOption = CPTScatterPlotHistogramSkipSecond; } return self; @@ -130,7 +134,7 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme lineStyle.lineColor = [CPTColor greenColor]; dataSourceLinePlot.dataLineStyle = lineStyle; dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationHistogram; - dataSourceLinePlot.histogramOptions = CPTScatterPlotHistogramSkipSecondStep; + dataSourceLinePlot.histogramOption = _histogramOption; dataSourceLinePlot.dataSource = self; [graph addPlot:dataSourceLinePlot]; @@ -276,13 +280,33 @@ -(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea { - // Remove the annotation - if ( symbolTextAnnotation ) { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + if( graph ) + { + // Remove the annotation + if ( symbolTextAnnotation ) { - [graph.plotAreaFrame.plotArea removeAnnotation:symbolTextAnnotation]; - [symbolTextAnnotation release]; - symbolTextAnnotation = nil; + [graph.plotAreaFrame.plotArea removeAnnotation:symbolTextAnnotation]; + [symbolTextAnnotation release]; + symbolTextAnnotation = nil; + } + else + { + CPTScatterPlotInterpolation interpolation = CPTScatterPlotInterpolationHistogram; + + // Decrease the histogram display option, and if < 0 display linear graph + if( --_histogramOption < 0 ) + { + interpolation = CPTScatterPlotInterpolationLinear; + + // Set the histogram option to the count, as that is guaranteed to be the last available option + 1 + // (thus the next time the user clicks in the empty plot area the value will be decremented, becoming last option) + _histogramOption = CPTScatterPlotHistogramOptionCount; + } + CPTScatterPlot *dataSourceLinePlot = (CPTScatterPlot *)[graph plotWithIdentifier: @"Data Source Plot"]; + dataSourceLinePlot.interpolation = interpolation; + dataSourceLinePlot.histogramOption = _histogramOption; + } } } From 5d51b71d632cf8642e05c9257aef433f4be59933 Mon Sep 17 00:00:00 2001 From: Lane Roathe Date: Wed, 8 Oct 2014 16:35:10 -0500 Subject: [PATCH 016/429] update CPTScatterPlotHistogramOption property definition to match that for CPTScatterPlotInterpolation --- framework/Source/CPTScatterPlot.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 1bae96dfc..ea070188f 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -231,7 +231,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue; @property (nonatomic, readwrite, strong) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; -@property (nonatomic, readwrite) CPTScatterPlotHistogramOption histogramOption; +@property (nonatomic, readwrite, assign) CPTScatterPlotHistogramOption histogramOption; /// @} /// @name Area Fill Bands From 02465ebf93509f44e66d2113c434473568c0029f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 12 Oct 2014 12:29:29 -0400 Subject: [PATCH 017/429] Added the histogram option setting to the initializers. --- framework/Source/CPTScatterPlot.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 72016aaf8..69419347c 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -225,6 +225,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame plotSymbolMarginForHitDetection = CPTFloat(0.0); plotLineMarginForHitDetection = CPTFloat(4.0); interpolation = CPTScatterPlotInterpolationLinear; + histogramOption = CPTScatterPlotHistogramNormal; pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; mutableAreaFillBands = nil; @@ -252,6 +253,7 @@ -(instancetype)initWithLayer:(id)layer plotLineMarginForHitDetection = theLayer->plotLineMarginForHitDetection; allowSimultaneousSymbolAndPlotSelection = theLayer->allowSimultaneousSymbolAndPlotSelection; interpolation = theLayer->interpolation; + histogramOption = theLayer->histogramOption; mutableAreaFillBands = theLayer->mutableAreaFillBands; pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; @@ -271,6 +273,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [super encodeWithCoder:coder]; [coder encodeInteger:self.interpolation forKey:@"CPTScatterPlot.interpolation"]; + [coder encodeInteger:self.histogramOption forKey:@"CPTScatterPlot.histogramOption"]; [coder encodeObject:self.dataLineStyle forKey:@"CPTScatterPlot.dataLineStyle"]; [coder encodeObject:self.plotSymbol forKey:@"CPTScatterPlot.plotSymbol"]; [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; @@ -291,6 +294,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey : @"CPTScatterPlot.interpolation"]; + histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey : @"CPTScatterPlot.histogramOption"]; dataLineStyle = [[coder decodeObjectForKey:@"CPTScatterPlot.dataLineStyle"] copy]; plotSymbol = [[coder decodeObjectForKey:@"CPTScatterPlot.plotSymbol"] copy]; areaFill = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill"] copy]; From 8eb4e13e2199baad359ebf0cbff6f956d5d8a96b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 12 Oct 2014 12:32:44 -0400 Subject: [PATCH 018/429] Added documentation comments for the histogram options. --- framework/Source/CPTScatterPlot.h | 11 +++++++---- framework/Source/CPTScatterPlot.m | 7 ++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 024620292..31baef1c6 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -34,11 +34,14 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. }; +/** + * @brief Enumeration of scatter plot histogram style options + **/ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { - CPTScatterPlotHistogramNormal, ///< standard histogram - CPTScatterPlotHistogramSkipFirst, ///< skip the first step of the histogram - CPTScatterPlotHistogramSkipSecond, ///< skip the second step of the histogram - CPTScatterPlotHistogramOptionCount ///< the number of histogram options available + CPTScatterPlotHistogramNormal, ///< Standard histogram. + CPTScatterPlotHistogramSkipFirst, ///< Skip the first step of the histogram. + CPTScatterPlotHistogramSkipSecond, ///< Skip the second step of the histogram. + CPTScatterPlotHistogramOptionCount ///< The number of histogram options available. }; #pragma mark - diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 69419347c..681c607d5 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -74,10 +74,14 @@ @implementation CPTScatterPlot /** @property CPTScatterPlotInterpolation interpolation * @brief The interpolation algorithm used for lines between data points. - * Default is #CPTScatterPlotInterpolationLinear + * Default is #CPTScatterPlotInterpolationLinear. **/ @synthesize interpolation; +/** @property CPTScatterPlotHistogramOption histogramOption + * @brief The drawing style for a histogram plot line (@ref interpolation = #CPTScatterPlotInterpolationHistogram). + * Default is #CPTScatterPlotHistogramNormal. + **/ @synthesize histogramOption; /** @property CPTLineStyle *dataLineStyle @@ -208,6 +212,7 @@ +(void)initialize * - @ref plotLineMarginForHitDetection = @num{4.0} * - @ref allowSimultaneousSymbolAndPlotSelection = NO * - @ref interpolation = #CPTScatterPlotInterpolationLinear + * - @ref histogramOption = #CPTScatterPlotHistogramNormal * - @ref labelField = #CPTScatterPlotFieldY * * @param newFrame The frame rectangle. From a5bc360cf55a315bdfa066e9e3d7a7221213fa96 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 12 Oct 2014 12:38:48 -0400 Subject: [PATCH 019/429] Changed the default plot style in the Simple Scatter Plot demo back to "linear". --- examples/CorePlotGallery/src/plots/SimpleScatterPlot.m | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index e64a0a5a7..c28f3cf85 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -143,7 +143,6 @@ -(void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme lineStyle.lineWidth = 3.0; lineStyle.lineColor = [CPTColor greenColor]; dataSourceLinePlot.dataLineStyle = lineStyle; - dataSourceLinePlot.interpolation = CPTScatterPlotInterpolationHistogram; dataSourceLinePlot.histogramOption = self.histogramOption; dataSourceLinePlot.dataSource = self; From f076ab6aae3028947de3bc9ea28a7bed3079f2c7 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 25 Oct 2014 15:31:00 -0400 Subject: [PATCH 020/429] Updated the iPhone CPTTestApp with Xcode 6.1 changes to Swift. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 6 +++--- examples/CPTTestApp-iPhone/Classes/PieChartController.swift | 2 +- .../CPTTestApp-iPhone/Classes/ScatterPlotController.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index aa61897f7..15a9eb69b 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -50,8 +50,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.whiteColor(), range:titleRange1) graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.grayColor(), range:titleRange2) graphTitle.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSRange(location: 0, length: graphTitle.length)) - graphTitle.addAttribute(NSFontAttributeName, value:line1Font, range:titleRange1) - graphTitle.addAttribute(NSFontAttributeName, value:line2Font, range:titleRange2) + graphTitle.addAttribute(NSFontAttributeName, value:line1Font!, range:titleRange1) + graphTitle.addAttribute(NSFontAttributeName, value:line2Font!, range:titleRange2) newGraph.attributedTitle = graphTitle @@ -133,7 +133,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! { - switch CPTBarPlotField.fromRaw(Int(field))! { + switch CPTBarPlotField(rawValue: Int(field))! { case .BarLocation: return recordIndex as NSNumber diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 595533dd2..b7b396838 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -60,7 +60,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { return nil } else { - switch CPTPieChartField.fromRaw(Int(field))! { + switch CPTPieChartField(rawValue: Int(field))! { case .SliceWidth: return (self.dataForChart)[Int(recordIndex)] as NSNumber diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 3f644817e..4c58013a6 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -131,7 +131,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! { - let plotField = CPTScatterPlotField.fromRaw(Int(field)) + let plotField = CPTScatterPlotField(rawValue: Int(field)) if let num = self.dataForPlot[Int(recordIndex)][plotField!] { let plotID = plot.identifier as String From 6579eac4af9eff3280b510edcb729eb7f340bd70 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 25 Oct 2014 15:32:30 -0400 Subject: [PATCH 021/429] Updated the DatePlot example app with Xcode 6.1 changes to Swift. --- examples/DatePlot/Source/DateController.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 4f2edec50..b5c8f3ebd 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -1,6 +1,5 @@ import Foundation import Cocoa -import CorePlot class DateController : NSObject, CPTPlotDataSource { private let oneDay : Double = 24 * 60 * 60; @@ -90,7 +89,7 @@ class DateController : NSObject, CPTPlotDataSource { func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! { - switch CPTScatterPlotField.fromRaw(Int(field))! { + switch CPTScatterPlotField(rawValue: Int(field))! { case .X: return (oneDay * Double(recordIndex)) as NSNumber From 630373de1a21e8170759a04d431648eeb6c3ba5b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 9 Dec 2014 20:14:30 -0500 Subject: [PATCH 022/429] Added missing parameter names in Swift initializers. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 2 +- examples/CPTTestApp-iPhone/Classes/PieChartController.swift | 4 ++-- .../CPTTestApp-iPhone/Classes/ScatterPlotController.swift | 6 +++--- examples/DatePlot/Source/DateController.swift | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 15a9eb69b..7719f732a 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -10,7 +10,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph() + let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as CPTGraphHostingView diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index b7b396838..7f758277c 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -12,7 +12,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph() + let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as CPTGraphHostingView @@ -33,7 +33,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { newGraph.title = "Graph Title" // Add pie chart - let piePlot = CPTPieChart() + let piePlot = CPTPieChart(frame: CGRectZero) piePlot.dataSource = self piePlot.pieRadius = 131.0 piePlot.identifier = "Pie Chart 1" diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 4c58013a6..709fe3ab5 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -13,7 +13,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph() + let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as CPTGraphHostingView @@ -56,7 +56,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { y.delegate = self // Create a blue plot area - let boundLinePlot = CPTScatterPlot() + let boundLinePlot = CPTScatterPlot(frame: CGRectZero) let blueLineStyle = CPTMutableLineStyle() blueLineStyle.miterLimit = 1.0 blueLineStyle.lineWidth = 3.0 @@ -81,7 +81,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { boundLinePlot.plotSymbol = plotSymbol // Create a green plot area - let dataSourceLinePlot = CPTScatterPlot() + let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) let greenLineStyle = CPTMutableLineStyle() greenLineStyle.lineWidth = 3.0 greenLineStyle.lineColor = CPTColor.greenColor() diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index b5c8f3ebd..6e1f039a6 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -22,7 +22,7 @@ class DateController : NSObject, CPTPlotDataSource { let refDate = NSDateFormatter().dateFromString("12:00 Oct 29, 2009") // Create graph - let newGraph = CPTXYGraph() + let newGraph = CPTXYGraph(frame: CGRectZero) let theme = CPTTheme(named: kCPTDarkGradientTheme) newGraph.applyTheme(theme) @@ -55,7 +55,7 @@ class DateController : NSObject, CPTPlotDataSource { y.orthogonalPosition = oneDay // Create a plot that uses the data source method - let dataSourceLinePlot = CPTScatterPlot() + let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) dataSourceLinePlot.identifier = "Date Plot" let lineStyle = dataSourceLinePlot.dataLineStyle.mutableCopy() as CPTMutableLineStyle From f181728a917b54251f97d18b8caadaf4a560b6ed Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 9 Dec 2014 20:15:11 -0500 Subject: [PATCH 023/429] Fixed the view controller class names in the iPhone CPTTestApp. --- examples/CPTTestApp-iPhone/MainWindow.xib | 231 +++++++++++++++++++--- 1 file changed, 200 insertions(+), 31 deletions(-) diff --git a/examples/CPTTestApp-iPhone/MainWindow.xib b/examples/CPTTestApp-iPhone/MainWindow.xib index 20aa22cbf..779bb337b 100644 --- a/examples/CPTTestApp-iPhone/MainWindow.xib +++ b/examples/CPTTestApp-iPhone/MainWindow.xib @@ -2,13 +2,13 @@ 528 - 13F34 - 6245 - 1265.21 - 698.00 + 14B25 + 6254 + 1343.16 + 755.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 6238 + 6247 IBProxyObject @@ -39,10 +39,13 @@ IBCocoaTouchFramework - + 1316 {{0, 20}, {320, 480}} + + + 1 MSAxIDEAA @@ -83,65 +86,72 @@ IBCocoaTouchFramework NO - - Scatter Plot - - Scatter Plot + + Pie Chart + + Pie Chart NSImage - 16-line-chart.png + 62-contrast.png IBCocoaTouchFramework + + - ScatterPlot + PieChart IBCocoaTouchFramework NO - - - - Bar Chart + + Scatter Plot + + Scatter Plot NSImage - 17-bar-chart.png + 16-line-chart.png IBCocoaTouchFramework - BarChart + ScatterPlot IBCocoaTouchFramework NO - - Pie Chart - - Pie Chart + + + Bar Chart NSImage - 62-contrast.png + 17-bar-chart.png IBCocoaTouchFramework - - PieChart + BarChart IBCocoaTouchFramework NO + - + 266 {{0, 519}, {320, 49}} + + + 3 MCAwAA NO IBCocoaTouchFramework - + + + + @@ -266,13 +276,21 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppScatterPlotController + + CPTTestApp_iPhone + + target + ScatterPlotController com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppBarChartController + + target + BarChartController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestAppPieChartController + + target + PieChartController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -290,7 +308,158 @@ 128 - + + + + BarChartController + YES + UIViewController + + IBProjectSource + CPTTestApp-iPhone/Classes/BarChartController.swift + + + + PieChartController + YES + UIViewController + + IBProjectSource + CPTTestApp-iPhone/Classes/PieChartController.swift + + + + ScatterPlotController + YES + UIViewController + + IBProjectSource + CPTTestApp-iPhone/Classes/ScatterPlotController.swift + + + + iPhoneAppDelegate + YES + NSObject + + UITabBarController + UIWindow + + + + tabBarController + UITabBarController + + + window + UIWindow + + + + IBProjectSource + CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift + + + + + + UIApplication + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIApplication.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UIGestureRecognizer + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIGestureRecognizer.h + + + + UIResponder + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITabBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITabBar.h + + + + UITabBarController + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UITabBarItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UITabBarItem.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWindow + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWindow.h + + + + 0 IBCocoaTouchFramework NO From adbad94c7b974efcd7122f819d5df1cca53bf7a8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 9 Dec 2014 20:16:48 -0500 Subject: [PATCH 024/429] Set the "embedded content contains Swift" and "run path search paths" build settings to fix Swift builds. --- .../CPTTestApp-iPhone.xcodeproj/project.pbxproj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 875b1bf7b..6f71adb4d 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -18,12 +18,11 @@ BC8166D21100DD6F006D898E /* 62-contrast.png in Resources */ = {isa = PBXBuildFile; fileRef = BC8166D11100DD6F006D898E /* 62-contrast.png */; }; BC9B81DA0FB893F70035D8DA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B81D90FB893F70035D8DA /* QuartzCore.framework */; }; BC9B84360FB8B7110035D8DA /* ScatterPlot.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */; }; - BCB3FD660FD85732008875A4 /* CorePlotIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = BCB3FD650FD85732008875A4 /* CorePlotIcon.png */; }; + C34677B219F3345500429A85 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C34677B119F3345500429A85 /* Launch Screen.xib */; }; C359603719CE34FC005CDFB9 /* BarChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603319CE34FB005CDFB9 /* BarChartController.swift */; }; C359603819CE34FC005CDFB9 /* iPhoneAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */; }; C359603919CE34FC005CDFB9 /* PieChartController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603519CE34FB005CDFB9 /* PieChartController.swift */; }; C359603A19CE34FC005CDFB9 /* ScatterPlotController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */; }; - C34677B219F3345500429A85 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C34677B119F3345500429A85 /* Launch Screen.xib */; }; C3B9F9D417503CDD001CCC50 /* BlueTexture.png in Resources */ = {isa = PBXBuildFile; fileRef = C3B9F9D317503CDD001CCC50 /* BlueTexture.png */; }; C3CD283E17DE9C95008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD283D17DE9C95008EED1E /* Accelerate.framework */; }; C3D3936419FD671100148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3936319FD671100148319 /* Images.xcassets */; }; @@ -62,13 +61,12 @@ BC9B81D90FB893F70035D8DA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ScatterPlot.xib; sourceTree = ""; }; + C34677B119F3345500429A85 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; C359603319CE34FB005CDFB9 /* BarChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarChartController.swift; sourceTree = ""; }; C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iPhoneAppDelegate.swift; sourceTree = ""; }; C359603519CE34FB005CDFB9 /* PieChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieChartController.swift; sourceTree = ""; }; C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScatterPlotController.swift; sourceTree = ""; }; C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CPTTestApp-iPhone-Bridging-Header.h"; sourceTree = ""; }; - C34677B119F3345500429A85 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; - C3B9F2C217BFD350003D2B6B /* CorePlotIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CorePlotIcon@2x.png"; sourceTree = ""; }; C3B9F9D317503CDD001CCC50 /* BlueTexture.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueTexture.png; sourceTree = ""; }; C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD283D17DE9C95008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; @@ -340,12 +338,14 @@ ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; PROVISIONING_PROFILE = ""; @@ -364,12 +364,14 @@ ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; PROVISIONING_PROFILE = ""; From 4d6fccd04552c6bbb19408112f0f0bb3902bcb6a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 18 Jan 2015 11:35:50 -0500 Subject: [PATCH 025/429] Raised the iOS deployment target to iOS 6.0. Fixed the resulting memory management errors. --- framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj | 4 ++-- framework/Source/CPTAnimation.m | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 6833e7141..848054a39 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -1251,7 +1251,7 @@ buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-ObjC"; @@ -1268,7 +1268,7 @@ DEPLOYMENT_POSTPROCESSING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 58ce1238b..87bf3c71e 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -119,7 +119,6 @@ -(void)dealloc { [self cancelTimer]; - dispatch_release(animationQueue); dispatch_queue_t mainQueue = dispatch_get_main_queue(); for ( CPTAnimationOperation *animationOperation in animationOperations ) { @@ -456,7 +455,6 @@ -(void)cancelTimer if ( theTimer ) { dispatch_source_cancel(theTimer); - dispatch_release(theTimer); self.timer = NULL; } } From 9b82ef4538569779a11f0cbc90acb56ff426ce46 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 18 Jan 2015 11:38:14 -0500 Subject: [PATCH 026/429] Reordered the #import statements in some unit tests to conform with the style used in the rest of the Core Plot framework. --- framework/Source/CPTAxisLabelTests.m | 3 ++- framework/Source/CPTColorSpaceTests.m | 3 ++- framework/Source/CPTColorTests.m | 3 ++- framework/Source/CPTDarkGradientThemeTests.m | 1 + framework/Source/CPTDataSourceTestCase.m | 1 + framework/Source/CPTFillTests.m | 3 ++- framework/Source/CPTGradientTests.m | 3 ++- framework/Source/CPTImageTests.m | 3 ++- framework/Source/CPTLineStyleTests.m | 3 ++- framework/Source/CPTPlotSpaceTests.m | 3 ++- framework/Source/CPTTextStyleTests.m | 3 ++- framework/Source/CPTThemeTests.m | 3 ++- framework/Source/CPTTimeFormatterTests.m | 3 ++- framework/Source/CPTXYPlotSpaceTests.m | 3 ++- 14 files changed, 26 insertions(+), 12 deletions(-) diff --git a/framework/Source/CPTAxisLabelTests.m b/framework/Source/CPTAxisLabelTests.m index b3a5f85a6..22bf84e9a 100644 --- a/framework/Source/CPTAxisLabelTests.m +++ b/framework/Source/CPTAxisLabelTests.m @@ -1,5 +1,6 @@ -#import "CPTAxisLabel.h" #import "CPTAxisLabelTests.h" + +#import "CPTAxisLabel.h" #import "CPTBorderedLayer.h" #import "CPTMutableTextStyle.h" #import "CPTUtilities.h" diff --git a/framework/Source/CPTColorSpaceTests.m b/framework/Source/CPTColorSpaceTests.m index b3f49c5d7..ad7fbdab4 100644 --- a/framework/Source/CPTColorSpaceTests.m +++ b/framework/Source/CPTColorSpaceTests.m @@ -1,6 +1,7 @@ -#import "CPTColorSpace.h" #import "CPTColorSpaceTests.h" +#import "CPTColorSpace.h" + @implementation CPTColorSpaceTests #pragma mark - diff --git a/framework/Source/CPTColorTests.m b/framework/Source/CPTColorTests.m index 5ecbd569a..73a1566aa 100644 --- a/framework/Source/CPTColorTests.m +++ b/framework/Source/CPTColorTests.m @@ -1,6 +1,7 @@ -#import "CPTColor.h" #import "CPTColorTests.h" +#import "CPTColor.h" + @implementation CPTColorTests #pragma mark - diff --git a/framework/Source/CPTDarkGradientThemeTests.m b/framework/Source/CPTDarkGradientThemeTests.m index 306f20685..67dbe9801 100644 --- a/framework/Source/CPTDarkGradientThemeTests.m +++ b/framework/Source/CPTDarkGradientThemeTests.m @@ -1,4 +1,5 @@ #import "CPTDarkGradientThemeTests.h" + #import "CPTDerivedXYGraph.h" #import "_CPTDarkGradientTheme.h" diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index efb1b77e0..4ae16a358 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -1,4 +1,5 @@ #import "CPTDataSourceTestCase.h" + #import "CPTExceptions.h" #import "CPTMutablePlotRange.h" #import "CPTScatterPlot.h" diff --git a/framework/Source/CPTFillTests.m b/framework/Source/CPTFillTests.m index 918a3e907..d00a96609 100644 --- a/framework/Source/CPTFillTests.m +++ b/framework/Source/CPTFillTests.m @@ -1,6 +1,7 @@ +#import "CPTFillTests.h" + #import "CPTColor.h" #import "CPTFill.h" -#import "CPTFillTests.h" #import "CPTGradient.h" #import "CPTImage.h" #import "_CPTFillColor.h" diff --git a/framework/Source/CPTGradientTests.m b/framework/Source/CPTGradientTests.m index 5e4118c3d..48052b5eb 100644 --- a/framework/Source/CPTGradientTests.m +++ b/framework/Source/CPTGradientTests.m @@ -1,6 +1,7 @@ -#import "CPTGradient.h" #import "CPTGradientTests.h" +#import "CPTGradient.h" + @implementation CPTGradientTests #pragma mark - diff --git a/framework/Source/CPTImageTests.m b/framework/Source/CPTImageTests.m index a51fff00b..a6e8d6c9a 100644 --- a/framework/Source/CPTImageTests.m +++ b/framework/Source/CPTImageTests.m @@ -1,6 +1,7 @@ -#import "CPTImage.h" #import "CPTImageTests.h" +#import "CPTImage.h" + @implementation CPTImageTests #pragma mark - diff --git a/framework/Source/CPTLineStyleTests.m b/framework/Source/CPTLineStyleTests.m index 8367e9b30..ec90f91cc 100644 --- a/framework/Source/CPTLineStyleTests.m +++ b/framework/Source/CPTLineStyleTests.m @@ -1,6 +1,7 @@ -#import "CPTLineStyle.h" #import "CPTLineStyleTests.h" +#import "CPTLineStyle.h" + @implementation CPTLineStyleTests #pragma mark - diff --git a/framework/Source/CPTPlotSpaceTests.m b/framework/Source/CPTPlotSpaceTests.m index 90626eb64..e10faf39f 100644 --- a/framework/Source/CPTPlotSpaceTests.m +++ b/framework/Source/CPTPlotSpaceTests.m @@ -1,5 +1,6 @@ -#import "CPTPlotSpace.h" #import "CPTPlotSpaceTests.h" + +#import "CPTPlotSpace.h" #import "CPTXYGraph.h" @implementation CPTPlotSpaceTests diff --git a/framework/Source/CPTTextStyleTests.m b/framework/Source/CPTTextStyleTests.m index 47ad497e6..d2df4a71a 100644 --- a/framework/Source/CPTTextStyleTests.m +++ b/framework/Source/CPTTextStyleTests.m @@ -1,7 +1,8 @@ +#import "CPTTextStyleTests.h" + #import "CPTColor.h" #import "CPTDefinitions.h" #import "CPTTextStyle.h" -#import "CPTTextStyleTests.h" @implementation CPTTextStyleTests diff --git a/framework/Source/CPTThemeTests.m b/framework/Source/CPTThemeTests.m index d0ec220d0..9fe75004f 100644 --- a/framework/Source/CPTThemeTests.m +++ b/framework/Source/CPTThemeTests.m @@ -1,7 +1,8 @@ +#import "CPTThemeTests.h" + #import "CPTDerivedXYGraph.h" #import "CPTExceptions.h" #import "CPTTheme.h" -#import "CPTThemeTests.h" #import "_CPTDarkGradientTheme.h" #import "_CPTPlainBlackTheme.h" #import "_CPTPlainWhiteTheme.h" diff --git a/framework/Source/CPTTimeFormatterTests.m b/framework/Source/CPTTimeFormatterTests.m index 4c99a39e4..0f30f4bba 100644 --- a/framework/Source/CPTTimeFormatterTests.m +++ b/framework/Source/CPTTimeFormatterTests.m @@ -1,6 +1,7 @@ -#import "CPTTimeFormatter.h" #import "CPTTimeFormatterTests.h" +#import "CPTTimeFormatter.h" + @implementation CPTTimeFormatterTests #pragma mark - diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index bf37c9147..c2a669a93 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -1,8 +1,9 @@ +#import "CPTXYPlotSpaceTests.h" + #import "CPTPlotRange.h" #import "CPTUtilities.h" #import "CPTXYGraph.h" #import "CPTXYPlotSpace.h" -#import "CPTXYPlotSpaceTests.h" @interface CPTXYPlotSpace(testingAdditions) From 6b2b51fbf73fd322d08bcdb36454b2e2968c88fe Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Jan 2015 13:50:56 -0500 Subject: [PATCH 027/429] Import only the classes needed, not the Core Plot header, in the CPTScatterPlot unit tests. --- framework/Source/CPTScatterPlotTests.h | 4 +++- framework/Source/CPTScatterPlotTests.m | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTScatterPlotTests.h b/framework/Source/CPTScatterPlotTests.h index 04095e993..14c954c5c 100644 --- a/framework/Source/CPTScatterPlotTests.h +++ b/framework/Source/CPTScatterPlotTests.h @@ -1,5 +1,7 @@ #import "CPTTestCase.h" -#import + +@class CPTScatterPlot; +@class CPTXYPlotSpace; @interface CPTScatterPlotTests : CPTTestCase diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index 7f7034780..94e112c2a 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -1,5 +1,9 @@ #import "CPTScatterPlotTests.h" +#import "CPTPlotRange.h" +#import "CPTScatterPlot.h" +#import "CPTXYPlotSpace.h" + @interface CPTScatterPlot(Testing) -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; From 5ec21f7f929ea24b7cac762df7a94fbb1b05dee5 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Jan 2015 16:43:54 -0500 Subject: [PATCH 028/429] Combined the Mac and iOS projects and added an iOS framework target. --- documentation/changelog.markdown | 4 +- ...h.plist => CorePlot-CocoaTouch-Info.plist} | 0 .../project.pbxproj | 8 +- framework/CorePlot-CocoaTouchTests-Info.plist | 24 + framework/{Info.plist => CorePlot-Info.plist} | 2 +- framework/CorePlot-iOSTests-Info.plist | 24 + framework/CorePlot.xcodeproj/project.pbxproj | 1638 ++++++++- ...ts-Info.plist => CorePlotTests-Info.plist} | 0 framework/CorePlot_Prefix.pch | 2 +- framework/CorePlot_iOS-Info.plist | 26 + framework/CorePlot_iOS.h | 68 + framework/English.lproj/MainMenu.xib | 3098 ----------------- framework/Source/CPTColorSpaceTests.m | 14 +- framework/Source/CPTFillTests.m | 11 +- framework/Source/CPTImageTests.m | 11 +- framework/Source/CPTNumericDataTests.m | 2 +- framework/Source/CPTPlot.m | 22 +- framework/Source/CPTTimeFormatterTests.m | 3 +- framework/Source/CPTUtilities.m | 19 - framework/Source/CPTUtilitiesTests.m | 4 + framework/main-cocoatouch.m | 16 - framework/main.m | 22 - 22 files changed, 1722 insertions(+), 3296 deletions(-) rename framework/{Info-CocoaTouch.plist => CorePlot-CocoaTouch-Info.plist} (100%) create mode 100644 framework/CorePlot-CocoaTouchTests-Info.plist rename framework/{Info.plist => CorePlot-Info.plist} (94%) create mode 100644 framework/CorePlot-iOSTests-Info.plist rename framework/{UnitTests-Info.plist => CorePlotTests-Info.plist} (100%) create mode 100644 framework/CorePlot_iOS-Info.plist create mode 100644 framework/CorePlot_iOS.h delete mode 100644 framework/English.lproj/MainMenu.xib delete mode 100644 framework/main-cocoatouch.m delete mode 100644 framework/main.m diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 8cd4b3eb8..a0698f2b8 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -5,6 +5,7 @@ To be determined. ## Details +- **New**: Combined the Mac and iOS projects and added an iOS framework target. - **New**: Added hand cursors to the Mac hosting view to indicate when user interaction is enabled and when dragging is in progress. - **New**: Added two additional initialization methods to `CPTImage`. - **New**: Added a dependency on the Accelerate framework. All iOS clients must now link against this framework. @@ -20,7 +21,8 @@ To be determined. - **New**: Added support for using an Objective-C block to calculate plot values in the function datasource class. - **New**: Added support for categorical plot data. - **New**: Added histogram style options to `CPTScatterPlot`. -- **Changed**: Increased the deployment target to iOS 5.0 and Mac OS X 10.7. +- **New**: Added iOS unit tests. +- **Changed**: Increased the deployment target to iOS 6.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. diff --git a/framework/Info-CocoaTouch.plist b/framework/CorePlot-CocoaTouch-Info.plist similarity index 100% rename from framework/Info-CocoaTouch.plist rename to framework/CorePlot-CocoaTouch-Info.plist diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 848054a39..c24486036 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -277,8 +277,6 @@ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 29B97316FDCFA39411CA2CEA /* main-cocoatouch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "main-cocoatouch.m"; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Info-CocoaTouch.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-CocoaTouch.plist"; sourceTree = ""; }; BC74A2C010FC087800E7E90D /* CPTPieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPieChart.h; path = Source/CPTPieChart.h; sourceTree = ""; }; BC74A2C110FC087800E7E90D /* CPTPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPieChart.m; path = Source/CPTPieChart.m; sourceTree = ""; }; BC79F1D30FD1DC1A00510976 /* CPTGraphHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGraphHostingView.h; sourceTree = ""; }; @@ -623,7 +621,6 @@ BC89A7991024AB19009D5261 /* CorePlotProbes.d */, BC9B83C20FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h */, C3D9825016BD406600DE7977 /* CorePlot_Prefix.pch */, - 29B97316FDCFA39411CA2CEA /* main-cocoatouch.m */, C31908A3199813D400B61898 /* CorePlot.xcconfig */, C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */, ); @@ -634,7 +631,6 @@ isa = PBXGroup; children = ( 071F3CDF10FBAB9D00D0A7B6 /* License.txt */, - 8D1107310486CEB800E47090 /* Info-CocoaTouch.plist */, ); name = Resources; sourceTree = ""; @@ -1254,10 +1250,10 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1270,10 +1266,10 @@ GCC_INLINES_ARE_PRIVATE_EXTERN = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; SKIP_INSTALL = YES; STRIP_INSTALLED_PRODUCT = YES; + SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/framework/CorePlot-CocoaTouchTests-Info.plist b/framework/CorePlot-CocoaTouchTests-Info.plist new file mode 100644 index 000000000..70b39d69c --- /dev/null +++ b/framework/CorePlot-CocoaTouchTests-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/framework/Info.plist b/framework/CorePlot-Info.plist similarity index 94% rename from framework/Info.plist rename to framework/CorePlot-Info.plist index f6c280be6..9e4f56a91 100644 --- a/framework/Info.plist +++ b/framework/CorePlot-Info.plist @@ -19,7 +19,7 @@ CFBundleSignature ???? CFBundleVersion - 1.0 + $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/framework/CorePlot-iOSTests-Info.plist b/framework/CorePlot-iOSTests-Info.plist new file mode 100644 index 000000000..70b39d69c --- /dev/null +++ b/framework/CorePlot-iOSTests-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 53bb8a3d1..3db3d2617 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -7,15 +7,37 @@ objects = { /* Begin PBXAggregateTarget section */ - 9021E49E0FC5C9DC00443472 /* Documentation */ = { + 9021E49E0FC5C9DC00443472 /* Documentation-Mac */ = { isa = PBXAggregateTarget; - buildConfigurationList = 9021E4A10FC5C9FB00443472 /* Build configuration list for PBXAggregateTarget "Documentation" */; + buildConfigurationList = 9021E4A10FC5C9FB00443472 /* Build configuration list for PBXAggregateTarget "Documentation-Mac" */; buildPhases = ( 9021E49D0FC5C9DC00443472 /* ShellScript */, ); dependencies = ( ); - name = Documentation; + name = "Documentation-Mac"; + productName = Documentation; + }; + C38A09911A4618B600D45436 /* Documentation-iOS */ = { + isa = PBXAggregateTarget; + buildConfigurationList = C38A09931A4618B600D45436 /* Build configuration list for PBXAggregateTarget "Documentation-iOS" */; + buildPhases = ( + C38A09921A4618B600D45436 /* ShellScript */, + ); + dependencies = ( + ); + name = "Documentation-iOS"; + productName = Documentation; + }; + C38A09961A46193F00D45436 /* Universal Library */ = { + isa = PBXAggregateTarget; + buildConfigurationList = C38A09981A46193F00D45436 /* Build configuration list for PBXAggregateTarget "Universal Library" */; + buildPhases = ( + C38A09971A46193F00D45436 /* ShellScript */, + ); + dependencies = ( + ); + name = "Universal Library"; productName = Documentation; }; /* End PBXAggregateTarget section */ @@ -77,7 +99,6 @@ 07B69A5E12B6215000F4C16C /* CPTTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */; }; 07B69B1712B62ABB00F4C16C /* CPTMutableLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 07B69B1812B62ABB00F4C16C /* CPTMutableLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */; }; - 07BF0D660F2B70B8002FCEA7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */; }; 07BF0D720F2B718F002FCEA7 /* CPTGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */; settings = {ATTRIBUTES = (Public, ); }; }; 07BF0D730F2B718F002FCEA7 /* CPTGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */; }; 07BF0D780F2B723A002FCEA7 /* CPTPlotAreaFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D760F2B723A002FCEA7 /* CPTPlotAreaFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -122,7 +143,6 @@ 4CD7E7F00F4B4FA700F9BCBB /* NSDecimalNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7EE0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4CD7E7F10F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */; }; 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; - 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; 906156BE0F375598001B75FC /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 906156BC0F375598001B75FC /* CPTLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 906156BF0F375598001B75FC /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; 90AF4FBA0F36D39700753D26 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; @@ -153,6 +173,15 @@ C30550EE1399BE5400E0151F /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550EC1399BE5400E0151F /* CPTLegendEntry.m */; }; C318F4AD11EA188700595FF9 /* CPTLimitBand.h in Headers */ = {isa = PBXBuildFile; fileRef = C318F4AB11EA188700595FF9 /* CPTLimitBand.h */; settings = {ATTRIBUTES = (Public, ); }; }; C318F4AE11EA188700595FF9 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4AC11EA188700595FF9 /* CPTLimitBand.m */; }; + C3226A4A1A69EEDD00F77249 /* CorePlot_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3226A521A69F6DA00F77249 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A511A69F6DA00F77249 /* QuartzCore.framework */; }; + C3226A541A69F6DF00F77249 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A531A69F6DF00F77249 /* UIKit.framework */; }; + C3226A561A69F6F000F77249 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A551A69F6F000F77249 /* Accelerate.framework */; }; + C3226A581A69F6FA00F77249 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; + C3226A5C1A69F72900F77249 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A531A69F6DF00F77249 /* UIKit.framework */; }; + C3226A5D1A69F72F00F77249 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A551A69F6F000F77249 /* Accelerate.framework */; }; + C3226A5E1A69F73800F77249 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A511A69F6DA00F77249 /* QuartzCore.framework */; }; + C3226A5F1A69F75400F77249 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C3286C0015D8740100A436A8 /* _CPTMaskLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3286BFE15D8740100A436A8 /* _CPTMaskLayer.h */; settings = {ATTRIBUTES = (); }; }; C3286C0115D8740100A436A8 /* _CPTMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */; }; C32EE1B613EC4AA800038266 /* CPTShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1B413EC4AA800038266 /* CPTShadow.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -184,9 +213,336 @@ C34AFE9B1102248D0041675A /* CPTPlotArea.h in Headers */ = {isa = PBXBuildFile; fileRef = C34BF5BA10A67633007F0894 /* CPTPlotArea.h */; settings = {ATTRIBUTES = (Public, ); }; }; C34F0D58121CB3EC0020FDD3 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; C34F0D59121CB3F00020FDD3 /* CPTDataSourceTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */; }; - C365E19B1973193A0096AAE1 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C365E19A1973193A0096AAE1 /* XCTest.framework */; }; C36E89BA11EE7F97003DE309 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; + C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C3791D09191D4C4C001EC514 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */; }; + C38A09831A46185300D45436 /* CorePlot_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot_iOS.framework */; }; + C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; }; + C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; + C38A09D21A461C1300D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; + C38A09D31A461C1800D45436 /* CPTDataSourceTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */; }; + C38A09D41A461C1900D45436 /* CPTDataSourceTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */; }; + C38A09D51A461C1E00D45436 /* CorePlotProbes.d in Sources */ = {isa = PBXBuildFile; fileRef = BC89A64010239D1D009D5261 /* CorePlotProbes.d */; }; + C38A09D61A461C2B00D45436 /* CorePlotProbes.d in Sources */ = {isa = PBXBuildFile; fileRef = BC89A64010239D1D009D5261 /* CorePlotProbes.d */; }; + C38A09D81A461C5800D45436 /* CPTNumericDataType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEFC104D80C400B554F9 /* CPTNumericDataType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09D91A461C6B00D45436 /* CPTNumericDataType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFD104D80C400B554F9 /* CPTNumericDataType.m */; }; + C38A09DA1A461C6C00D45436 /* CPTNumericDataType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFD104D80C400B554F9 /* CPTNumericDataType.m */; }; + C38A09DB1A461C7D00D45436 /* CPTNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */; }; + C38A09DC1A461C7D00D45436 /* CPTNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */; }; + C38A09DD1A461C8100D45436 /* CPTMutableNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */; }; + C38A09DE1A461C8100D45436 /* CPTMutableNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */; }; + C38A09DF1A461C8500D45436 /* CPTNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3392A371225F667008DA6BD /* CPTNumericData+TypeConversion.m */; }; + C38A09E01A461C8500D45436 /* CPTNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3392A371225F667008DA6BD /* CPTNumericData+TypeConversion.m */; }; + C38A09E11A461C8800D45436 /* CPTMutableNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CAFB251229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.m */; }; + C38A09E21A461C8900D45436 /* CPTMutableNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CAFB251229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.m */; }; + C38A09E41A461CAD00D45436 /* CPTMutableNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADDC611B167AD00D36017 /* CPTMutableNumericDataTests.m */; }; + C38A09E51A461CAE00D45436 /* CPTMutableNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADDC611B167AD00D36017 /* CPTMutableNumericDataTests.m */; }; + C38A09E61A461CB200D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CB561B122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m */; }; + C38A09E71A461CB300D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CB561B122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m */; }; + C38A09E81A461CB600D45436 /* CPTNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF06104D80D400B554F9 /* CPTNumericDataTests.m */; }; + C38A09E91A461CB700D45436 /* CPTNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF06104D80D400B554F9 /* CPTNumericDataTests.m */; }; + C38A09EA1A461CBA00D45436 /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; + C38A09EB1A461CBB00D45436 /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; + C38A09EF1A461CD000D45436 /* CPTDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09F01A461CD900D45436 /* CPTDefinitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */; }; + C38A09F11A461CDA00D45436 /* CPTDefinitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */; }; + C38A09F21A461CEE00D45436 /* CPTExceptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 07321BBF0F37370D00F423D8 /* CPTExceptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09F31A461CF500D45436 /* CPTExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC00F37370D00F423D8 /* CPTExceptions.m */; }; + C38A09F41A461CF600D45436 /* CPTExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC00F37370D00F423D8 /* CPTExceptions.m */; }; + C38A09F51A461CF900D45436 /* CPTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 07321BC40F37382D00F423D8 /* CPTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09F61A461D0000D45436 /* CPTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC50F37382D00F423D8 /* CPTUtilities.m */; }; + C38A09F71A461D0100D45436 /* CPTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC50F37382D00F423D8 /* CPTUtilities.m */; }; + C38A09F81A461D0500D45436 /* CPTPlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 32484B3F0F530E8B002151AD /* CPTPlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09F91A461D0B00D45436 /* CPTPlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 32484B400F530E8B002151AD /* CPTPlotRange.m */; }; + C38A09FA1A461D0C00D45436 /* CPTPlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 32484B400F530E8B002151AD /* CPTPlotRange.m */; }; + C38A09FB1A461D0F00D45436 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09FC1A461D1300D45436 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; + C38A09FD1A461D1400D45436 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; + C38A09FE1A461D1800D45436 /* CPTFunctionDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A09FF1A461D1D00D45436 /* CPTFunctionDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */; }; + C38A0A001A461D1D00D45436 /* CPTFunctionDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */; }; + C38A0A011A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; + C38A0A021A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; + C38A0A031A461D3100D45436 /* CPTUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */; }; + C38A0A041A461D3200D45436 /* CPTUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */; }; + C38A0A051A461D3F00D45436 /* CPTLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7EA0F4B4F9600F9BCBB /* CPTLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A061A461D4400D45436 /* CPTLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EB0F4B4F9600F9BCBB /* CPTLayer.m */; }; + C38A0A071A461D4500D45436 /* CPTLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EB0F4B4F9600F9BCBB /* CPTLayer.m */; }; + C38A0A081A461D4800D45436 /* CPTBorderedLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0706223A0FDF215C0066A6C4 /* CPTBorderedLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A091A461D4D00D45436 /* CPTBorderedLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0706223B0FDF215C0066A6C4 /* CPTBorderedLayer.m */; }; + C38A0A0A1A461D4D00D45436 /* CPTBorderedLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0706223B0FDF215C0066A6C4 /* CPTBorderedLayer.m */; }; + C38A0A0B1A461D5100D45436 /* _CPTBorderLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3408C3C15FC1C3E004F1D70 /* _CPTBorderLayer.h */; }; + C38A0A0C1A461D5700D45436 /* _CPTBorderLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3408C3D15FC1C3E004F1D70 /* _CPTBorderLayer.m */; }; + C38A0A0D1A461D5800D45436 /* _CPTBorderLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3408C3D15FC1C3E004F1D70 /* _CPTBorderLayer.m */; }; + C38A0A0E1A461D5B00D45436 /* _CPTMaskLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3286BFE15D8740100A436A8 /* _CPTMaskLayer.h */; }; + C38A0A0F1A461D5E00D45436 /* _CPTMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */; }; + C38A0A101A461D5F00D45436 /* _CPTMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */; }; + C38A0A111A461D6300D45436 /* CPTResponder.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AEF1FD10BBE1F10012BEFF /* CPTResponder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A121A461D6A00D45436 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; + C38A0A131A461D6B00D45436 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; + C38A0A141A461E5000D45436 /* CPTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C2846F16584EB9006BA43C /* CPTAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A151A461E5800D45436 /* CPTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847016584EB9006BA43C /* CPTAnimation.m */; }; + C38A0A161A461E5800D45436 /* CPTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847016584EB9006BA43C /* CPTAnimation.m */; }; + C38A0A171A461E5B00D45436 /* CPTAnimationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A181A461E6000D45436 /* CPTAnimationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */; }; + C38A0A191A461E6100D45436 /* CPTAnimationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */; }; + C38A0A1A1A461E6400D45436 /* CPTAnimationPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB11165DB50300739006 /* CPTAnimationPeriod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A1B1A461E6A00D45436 /* CPTAnimationPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */; }; + C38A0A1C1A461E6B00D45436 /* CPTAnimationPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */; }; + C38A0A1D1A461E6E00D45436 /* _CPTAnimationCGFloatPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB15165DB52C00739006 /* _CPTAnimationCGFloatPeriod.h */; }; + C38A0A1E1A461E7A00D45436 /* _CPTAnimationCGFloatPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB16165DB52C00739006 /* _CPTAnimationCGFloatPeriod.m */; }; + C38A0A1F1A461E7B00D45436 /* _CPTAnimationCGFloatPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB16165DB52C00739006 /* _CPTAnimationCGFloatPeriod.m */; }; + C38A0A201A461E8800D45436 /* _CPTAnimationCGPointPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E154E8598EDE2EDEF2F /* _CPTAnimationCGPointPeriod.h */; }; + C38A0A211A461E8B00D45436 /* _CPTAnimationCGPointPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0AE447398AF62D584F9C /* _CPTAnimationCGPointPeriod.m */; }; + C38A0A221A461E8C00D45436 /* _CPTAnimationCGPointPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0AE447398AF62D584F9C /* _CPTAnimationCGPointPeriod.m */; }; + C38A0A231A461E8F00D45436 /* _CPTAnimationCGSizePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */; }; + C38A0A241A461E9200D45436 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; + C38A0A251A461E9300D45436 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; + C38A0A261A461E9600D45436 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */; }; + C38A0A271A461E9A00D45436 /* _CPTAnimationCGRectPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */; }; + C38A0A281A461E9B00D45436 /* _CPTAnimationCGRectPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */; }; + C38A0A291A461EA300D45436 /* _CPTAnimationNSDecimalPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */; }; + C38A0A2A1A461EA600D45436 /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; + C38A0A2B1A461EA600D45436 /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; + C38A0A2C1A461EAA00D45436 /* _CPTAnimationPlotRangePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E16290C226BC4BE3936 /* _CPTAnimationPlotRangePeriod.h */; }; + C38A0A2D1A461EAD00D45436 /* _CPTAnimationPlotRangePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C091B8592D9F32AC384CB /* _CPTAnimationPlotRangePeriod.m */; }; + C38A0A2E1A461EAE00D45436 /* _CPTAnimationPlotRangePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C091B8592D9F32AC384CB /* _CPTAnimationPlotRangePeriod.m */; }; + C38A0A2F1A461EB100D45436 /* _CPTAnimationTimingFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */; }; + C38A0A301A461EB500D45436 /* _CPTAnimationTimingFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */; }; + C38A0A311A461EB600D45436 /* _CPTAnimationTimingFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */; }; + C38A0A321A461EBD00D45436 /* CPTAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BB411D10177000B8DAB /* CPTAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A331A461EC200D45436 /* CPTAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB511D10177000B8DAB /* CPTAnnotation.m */; }; + C38A0A341A461EC300D45436 /* CPTAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB511D10177000B8DAB /* CPTAnnotation.m */; }; + C38A0A351A461EC800D45436 /* CPTPlotSpaceAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BAF11D1016B000B8DAB /* CPTPlotSpaceAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A361A461ECD00D45436 /* CPTPlotSpaceAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */; }; + C38A0A371A461ECD00D45436 /* CPTPlotSpaceAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */; }; + C38A0A381A461ED000D45436 /* CPTLayerAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BB911D10183000B8DAB /* CPTLayerAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A391A461ED600D45436 /* CPTLayerAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */; }; + C38A0A3A1A461ED700D45436 /* CPTLayerAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */; }; + C38A0A3B1A461EDA00D45436 /* CPTAnnotationHostLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 072161E911D1F6BD009CC871 /* CPTAnnotationHostLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A3C1A461EDF00D45436 /* CPTAnnotationHostLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */; }; + C38A0A3D1A461EE000D45436 /* CPTAnnotationHostLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */; }; + C38A0A3E1A461EE600D45436 /* CPTConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 070064E7111F2BAA003DE087 /* CPTConstraints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A3F1A461EEB00D45436 /* CPTConstraints.m in Sources */ = {isa = PBXBuildFile; fileRef = 070064E8111F2BAA003DE087 /* CPTConstraints.m */; }; + C38A0A401A461EEB00D45436 /* CPTConstraints.m in Sources */ = {isa = PBXBuildFile; fileRef = 070064E8111F2BAA003DE087 /* CPTConstraints.m */; }; + C38A0A411A461EEE00D45436 /* _CPTConstraintsFixed.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA03913E8D85800CE6DB1 /* _CPTConstraintsFixed.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A421A461EF500D45436 /* _CPTConstraintsFixed.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03A13E8D85800CE6DB1 /* _CPTConstraintsFixed.m */; }; + C38A0A431A461EF600D45436 /* _CPTConstraintsFixed.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03A13E8D85800CE6DB1 /* _CPTConstraintsFixed.m */; }; + C38A0A441A461EFA00D45436 /* _CPTConstraintsRelative.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA03B13E8D85800CE6DB1 /* _CPTConstraintsRelative.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A451A461F0100D45436 /* _CPTConstraintsRelative.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03C13E8D85800CE6DB1 /* _CPTConstraintsRelative.m */; }; + C38A0A461A461F0200D45436 /* _CPTConstraintsRelative.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03C13E8D85800CE6DB1 /* _CPTConstraintsRelative.m */; }; + C38A0A471A461F0C00D45436 /* CPTTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7E50F4B4F8200F9BCBB /* CPTTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A481A461F1100D45436 /* CPTTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7E60F4B4F8200F9BCBB /* CPTTextLayer.m */; }; + C38A0A491A461F1200D45436 /* CPTTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7E60F4B4F8200F9BCBB /* CPTTextLayer.m */; }; + C38A0A4A1A461F1500D45436 /* CPTTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69A5B12B6215000F4C16C /* CPTTextStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A4B1A461F1A00D45436 /* CPTTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */; }; + C38A0A4C1A461F1B00D45436 /* CPTTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */; }; + C38A0A4D1A461F1D00D45436 /* CPTMutableTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A4E1A461F2200D45436 /* CPTMutableTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */; }; + C38A0A4F1A461F2200D45436 /* CPTMutableTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */; }; + C38A0A501A461F3D00D45436 /* CPTTextStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */; }; + C38A0A511A461F3D00D45436 /* CPTTextStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */; }; + C38A0A551A461F9700D45436 /* CPTTextStylePlatformSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A561A461F9700D45436 /* CPTTextStylePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */; }; + C38A0A571A461F9700D45436 /* CPTTextStylePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */; }; + C38A0A5A1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */; }; + C38A0A5B1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */; }; + C38A0A5C1A4620D400D45436 /* CPTColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 079FC0B20FB975500037E990 /* CPTColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A5D1A4620D400D45436 /* CPTColorSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 079FC0BB0FB9762B0037E990 /* CPTColorSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A5E1A4620D400D45436 /* CPTGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CA112D0FAC8F85000861CE /* CPTGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A5F1A4620D400D45436 /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A601A4620D400D45436 /* CPTLineCap.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D3AD2B13DF8DCE0004EA73 /* CPTLineCap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A611A4620D400D45436 /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 906156BC0F375598001B75FC /* CPTLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A621A4620D400D45436 /* CPTMutableLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A631A4620D400D45436 /* CPTPathExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 070622300FDF1B250066A6C4 /* CPTPathExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A641A4620D400D45436 /* CPTShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1B413EC4AA800038266 /* CPTShadow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A651A4620D400D45436 /* CPTMutableShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1BF13EC4BE700038266 /* CPTMutableShadow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A661A4620E200D45436 /* CPTColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0B30FB975500037E990 /* CPTColor.m */; }; + C38A0A671A4620E200D45436 /* CPTColorSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0BC0FB9762B0037E990 /* CPTColorSpace.m */; }; + C38A0A681A4620E200D45436 /* CPTGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 07CA112E0FAC8F85000861CE /* CPTGradient.m */; }; + C38A0A691A4620E200D45436 /* CPTImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C3AFC9D00FB62969005DFFDC /* CPTImage.m */; }; + C38A0A6A1A4620E200D45436 /* CPTLineCap.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */; }; + C38A0A6B1A4620E200D45436 /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; + C38A0A6C1A4620E200D45436 /* CPTMutableLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */; }; + C38A0A6D1A4620E200D45436 /* CPTPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 070622310FDF1B250066A6C4 /* CPTPathExtensions.m */; }; + C38A0A6E1A4620E200D45436 /* CPTShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1B513EC4AA800038266 /* CPTShadow.m */; }; + C38A0A6F1A4620E200D45436 /* CPTMutableShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1C013EC4BE700038266 /* CPTMutableShadow.m */; }; + C38A0A701A4620E200D45436 /* CPTColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0B30FB975500037E990 /* CPTColor.m */; }; + C38A0A711A4620E200D45436 /* CPTColorSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0BC0FB9762B0037E990 /* CPTColorSpace.m */; }; + C38A0A721A4620E200D45436 /* CPTGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 07CA112E0FAC8F85000861CE /* CPTGradient.m */; }; + C38A0A731A4620E200D45436 /* CPTImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C3AFC9D00FB62969005DFFDC /* CPTImage.m */; }; + C38A0A741A4620E200D45436 /* CPTLineCap.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */; }; + C38A0A751A4620E200D45436 /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; + C38A0A761A4620E200D45436 /* CPTMutableLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */; }; + C38A0A771A4620E200D45436 /* CPTPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 070622310FDF1B250066A6C4 /* CPTPathExtensions.m */; }; + C38A0A781A4620E200D45436 /* CPTShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1B513EC4AA800038266 /* CPTShadow.m */; }; + C38A0A791A4620E200D45436 /* CPTMutableShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1C013EC4BE700038266 /* CPTMutableShadow.m */; }; + C38A0A7A1A4620E800D45436 /* CPTFill.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601F0FAE096C00072842 /* CPTFill.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A7B1A4620EF00D45436 /* _CPTFillColor.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601B0FAE096C00072842 /* _CPTFillColor.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A7C1A4620EF00D45436 /* _CPTFillGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601E0FAE096C00072842 /* _CPTFillGradient.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A7D1A4620EF00D45436 /* _CPTFillImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C34260180FAE096C00072842 /* _CPTFillImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A7E1A4620F700D45436 /* CPTFill.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601A0FAE096C00072842 /* CPTFill.m */; }; + C38A0A7F1A4620F700D45436 /* _CPTFillColor.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601C0FAE096C00072842 /* _CPTFillColor.m */; }; + C38A0A801A4620F700D45436 /* _CPTFillGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = C34260190FAE096C00072842 /* _CPTFillGradient.m */; }; + C38A0A811A4620F700D45436 /* _CPTFillImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601D0FAE096C00072842 /* _CPTFillImage.m */; }; + C38A0A821A4620F800D45436 /* CPTFill.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601A0FAE096C00072842 /* CPTFill.m */; }; + C38A0A831A4620F800D45436 /* _CPTFillColor.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601C0FAE096C00072842 /* _CPTFillColor.m */; }; + C38A0A841A4620F800D45436 /* _CPTFillGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = C34260190FAE096C00072842 /* _CPTFillGradient.m */; }; + C38A0A851A4620F800D45436 /* _CPTFillImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601D0FAE096C00072842 /* _CPTFillImage.m */; }; + C38A0A861A46210A00D45436 /* CPTColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AB13D2332500145DFF /* CPTColorTests.m */; }; + C38A0A871A46210A00D45436 /* CPTColorSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AE13D2337E00145DFF /* CPTColorSpaceTests.m */; }; + C38A0A881A46210A00D45436 /* CPTFillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979BA13D2347300145DFF /* CPTFillTests.m */; }; + C38A0A891A46210A00D45436 /* CPTGradientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B113D233C000145DFF /* CPTGradientTests.m */; }; + C38A0A8A1A46210A00D45436 /* CPTImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B413D2340000145DFF /* CPTImageTests.m */; }; + C38A0A8B1A46210A00D45436 /* CPTLineStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B713D2344000145DFF /* CPTLineStyleTests.m */; }; + C38A0A8C1A46210A00D45436 /* CPTColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AB13D2332500145DFF /* CPTColorTests.m */; }; + C38A0A8D1A46210A00D45436 /* CPTColorSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AE13D2337E00145DFF /* CPTColorSpaceTests.m */; }; + C38A0A8E1A46210A00D45436 /* CPTFillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979BA13D2347300145DFF /* CPTFillTests.m */; }; + C38A0A8F1A46210A00D45436 /* CPTGradientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B113D233C000145DFF /* CPTGradientTests.m */; }; + C38A0A901A46210A00D45436 /* CPTImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B413D2340000145DFF /* CPTImageTests.m */; }; + C38A0A911A46210A00D45436 /* CPTLineStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B713D2344000145DFF /* CPTLineStyleTests.m */; }; + C38A0A951A46218B00D45436 /* CPTCalendarFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = C349DCB2151AAFBF00BFD6A7 /* CPTCalendarFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A961A46218B00D45436 /* CPTTimeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A2E6FA102DF47900809BC5 /* CPTTimeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0A971A46219100D45436 /* CPTCalendarFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C349DCB3151AAFBF00BFD6A7 /* CPTCalendarFormatter.m */; }; + C38A0A981A46219100D45436 /* CPTTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A2E6FB102DF47900809BC5 /* CPTTimeFormatter.m */; }; + C38A0A991A46219200D45436 /* CPTCalendarFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C349DCB3151AAFBF00BFD6A7 /* CPTCalendarFormatter.m */; }; + C38A0A9A1A46219200D45436 /* CPTTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A2E6FB102DF47900809BC5 /* CPTTimeFormatter.m */; }; + C38A0A9B1A46219600D45436 /* CPTTimeFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A813D2328000145DFF /* CPTTimeFormatterTests.m */; }; + C38A0A9C1A46219700D45436 /* CPTTimeFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A813D2328000145DFF /* CPTTimeFormatterTests.m */; }; + C38A0A9D1A4621A500D45436 /* NSCoderExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3978E0413CE653B00A420D9 /* NSCoderExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A9E1A4621A500D45436 /* NSDecimalNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7EE0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0A9F1A4621A500D45436 /* NSNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 078F42D90FACC075006E670B /* NSNumberExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0AA01A4621AC00D45436 /* NSCoderExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3978E0513CE653B00A420D9 /* NSCoderExtensions.m */; }; + C38A0AA11A4621AC00D45436 /* NSDecimalNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */; }; + C38A0AA21A4621AC00D45436 /* NSNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 078F42DA0FACC075006E670B /* NSNumberExtensions.m */; }; + C38A0AA31A4621AD00D45436 /* NSCoderExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3978E0513CE653B00A420D9 /* NSCoderExtensions.m */; }; + C38A0AA41A4621AD00D45436 /* NSDecimalNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */; }; + C38A0AA51A4621AD00D45436 /* NSNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 078F42DA0FACC075006E670B /* NSNumberExtensions.m */; }; + C38A0AA71A46240300D45436 /* CPTGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AA81A46240300D45436 /* CPTXYGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 07983EF40F2F9A3D008C8618 /* CPTXYGraph.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AA91A46240900D45436 /* CPTGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */; }; + C38A0AAA1A46240900D45436 /* CPTXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07983EF50F2F9A3D008C8618 /* CPTXYGraph.m */; }; + C38A0AAB1A46240A00D45436 /* CPTGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */; }; + C38A0AAC1A46240A00D45436 /* CPTXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07983EF50F2F9A3D008C8618 /* CPTXYGraph.m */; }; + C38A0AAD1A46241100D45436 /* CPTPlotAreaFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D760F2B723A002FCEA7 /* CPTPlotAreaFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AAE1A46241100D45436 /* CPTPlotArea.h in Headers */ = {isa = PBXBuildFile; fileRef = C34BF5BA10A67633007F0894 /* CPTPlotArea.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AAF1A46241100D45436 /* CPTLimitBand.h in Headers */ = {isa = PBXBuildFile; fileRef = C318F4AB11EA188700595FF9 /* CPTLimitBand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AB01A46241700D45436 /* CPTPlotAreaFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */; }; + C38A0AB11A46241700D45436 /* CPTPlotArea.m in Sources */ = {isa = PBXBuildFile; fileRef = C34BF5BB10A67633007F0894 /* CPTPlotArea.m */; }; + C38A0AB21A46241700D45436 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4AC11EA188700595FF9 /* CPTLimitBand.m */; }; + C38A0AB31A46241800D45436 /* CPTPlotAreaFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */; }; + C38A0AB41A46241800D45436 /* CPTPlotArea.m in Sources */ = {isa = PBXBuildFile; fileRef = C34BF5BB10A67633007F0894 /* CPTPlotArea.m */; }; + C38A0AB51A46241800D45436 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4AC11EA188700595FF9 /* CPTLimitBand.m */; }; + C38A0AB61A4624C200D45436 /* CPTPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D7A0F2B72B0002FCEA7 /* CPTPlotSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AB71A4624C200D45436 /* CPTXYPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 0799E0970F2BB6E800790525 /* CPTXYPlotSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AB81A46250500D45436 /* CPTPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7B0F2B72B0002FCEA7 /* CPTPlotSpace.m */; }; + C38A0AB91A46250500D45436 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; + C38A0ABA1A46250600D45436 /* CPTPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7B0F2B72B0002FCEA7 /* CPTPlotSpace.m */; }; + C38A0ABB1A46250600D45436 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; + C38A0ABC1A46250B00D45436 /* CPTPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A313D2136600145DFF /* CPTPlotSpaceTests.m */; }; + C38A0ABD1A46250B00D45436 /* CPTXYPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */; }; + C38A0ABE1A46250C00D45436 /* CPTPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A313D2136600145DFF /* CPTPlotSpaceTests.m */; }; + C38A0ABF1A46250C00D45436 /* CPTXYPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */; }; + C38A0AC01A46254E00D45436 /* CPTPlotGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31DE81045EB470058520A /* CPTPlotGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0AC11A46255C00D45436 /* CPTPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC21A46255C00D45436 /* CPTBarPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0799E0930F2BB5F300790525 /* CPTBarPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC31A46255C00D45436 /* CPTPieChart.h in Headers */ = {isa = PBXBuildFile; fileRef = BC74A32E10FC402600E7E90D /* CPTPieChart.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC41A46255C00D45436 /* CPTRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C0477C12D6560900DA8047 /* CPTRangePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC51A46255C00D45436 /* CPTScatterPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC61A46255C00D45436 /* CPTTradingRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772B43710E24D5C009CD04C /* CPTTradingRangePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AC71A46256500D45436 /* CPTPlotGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31DE71045EB470058520A /* CPTPlotGroup.m */; }; + C38A0AC81A46256500D45436 /* CPTPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7F0F2B72F6002FCEA7 /* CPTPlot.m */; }; + C38A0AC91A46256500D45436 /* CPTBarPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0799E0940F2BB5F300790525 /* CPTBarPlot.m */; }; + C38A0ACA1A46256500D45436 /* CPTPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A32F10FC402600E7E90D /* CPTPieChart.m */; }; + C38A0ACB1A46256500D45436 /* CPTRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C0477B12D6560900DA8047 /* CPTRangePlot.m */; }; + C38A0ACC1A46256500D45436 /* CPTScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */; }; + C38A0ACD1A46256500D45436 /* CPTTradingRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772B43810E24D5C009CD04C /* CPTTradingRangePlot.m */; }; + C38A0ACE1A46256600D45436 /* CPTPlotGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31DE71045EB470058520A /* CPTPlotGroup.m */; }; + C38A0ACF1A46256600D45436 /* CPTPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7F0F2B72F6002FCEA7 /* CPTPlot.m */; }; + C38A0AD01A46256600D45436 /* CPTBarPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0799E0940F2BB5F300790525 /* CPTBarPlot.m */; }; + C38A0AD11A46256600D45436 /* CPTPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A32F10FC402600E7E90D /* CPTPieChart.m */; }; + C38A0AD21A46256600D45436 /* CPTRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C0477B12D6560900DA8047 /* CPTRangePlot.m */; }; + C38A0AD31A46256600D45436 /* CPTScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */; }; + C38A0AD41A46256600D45436 /* CPTTradingRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772B43810E24D5C009CD04C /* CPTTradingRangePlot.m */; }; + C38A0AD51A46256B00D45436 /* CPTPlotSymbol.h in Headers */ = {isa = PBXBuildFile; fileRef = C34AFE6911021D010041675A /* CPTPlotSymbol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AD61A46257100D45436 /* CPTPlotSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = C34AFE6A11021D010041675A /* CPTPlotSymbol.m */; }; + C38A0AD71A46257200D45436 /* CPTPlotSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = C34AFE6A11021D010041675A /* CPTPlotSymbol.m */; }; + C38A0AD81A46257600D45436 /* CPTScatterPlotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */; }; + C38A0AD91A46257700D45436 /* CPTScatterPlotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */; }; + C38A0ADA1A4625B100D45436 /* CPTGridLines.h in Headers */ = {isa = PBXBuildFile; fileRef = C32B391610AA4C78000470D4 /* CPTGridLines.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0ADB1A4625B100D45436 /* CPTGridLineGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C38DD49111A04B7A002A68E7 /* CPTGridLineGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0ADC1A4625C100D45436 /* CPTAxisLabelGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0ADD1A4625C900D45436 /* CPTAxisLabelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD23FFB0FFBE78400ADD2E2 /* CPTAxisLabelTests.m */; }; + C38A0ADE1A4625CA00D45436 /* CPTAxisLabelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD23FFB0FFBE78400ADD2E2 /* CPTAxisLabelTests.m */; }; + C38A0ADF1A4625D400D45436 /* CPTAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C480F3B818800DE45DC /* CPTAxis.m */; }; + C38A0AE01A4625D400D45436 /* CPTAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */; }; + C38A0AE11A4625D400D45436 /* CPTGridLines.m in Sources */ = {isa = PBXBuildFile; fileRef = C32B391710AA4C78000470D4 /* CPTGridLines.m */; }; + C38A0AE21A4625D400D45436 /* CPTGridLineGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */; }; + C38A0AE31A4625D400D45436 /* CPTAxisLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */; }; + C38A0AE41A4625D400D45436 /* CPTAxisTitle.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC7C3610921FDB00DAECAA /* CPTAxisTitle.m */; }; + C38A0AE51A4625D400D45436 /* CPTAxisLabelGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */; }; + C38A0AE61A4625D400D45436 /* CPTXYAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 0783DD540FBF097E006C3696 /* CPTXYAxis.m */; }; + C38A0AE71A4625D400D45436 /* CPTXYAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C420F3B816600DE45DC /* CPTXYAxisSet.m */; }; + C38A0AE81A4625D500D45436 /* CPTAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C480F3B818800DE45DC /* CPTAxis.m */; }; + C38A0AE91A4625D500D45436 /* CPTAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */; }; + C38A0AEA1A4625D500D45436 /* CPTGridLines.m in Sources */ = {isa = PBXBuildFile; fileRef = C32B391710AA4C78000470D4 /* CPTGridLines.m */; }; + C38A0AEB1A4625D500D45436 /* CPTGridLineGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */; }; + C38A0AEC1A4625D500D45436 /* CPTAxisLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */; }; + C38A0AED1A4625D500D45436 /* CPTAxisTitle.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC7C3610921FDB00DAECAA /* CPTAxisTitle.m */; }; + C38A0AEE1A4625D500D45436 /* CPTAxisLabelGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */; }; + C38A0AEF1A4625D500D45436 /* CPTXYAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 0783DD540FBF097E006C3696 /* CPTXYAxis.m */; }; + C38A0AF01A4625D500D45436 /* CPTXYAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C420F3B816600DE45DC /* CPTXYAxisSet.m */; }; + C38A0AF11A4625E800D45436 /* CPTAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = 07975C470F3B818800DE45DC /* CPTAxis.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF21A4625E800D45436 /* CPTAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D820F2B7340002FCEA7 /* CPTAxisSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF31A4625E800D45436 /* CPTAxisLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 073FB02E0FC991A3007A728E /* CPTAxisLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF41A4625E800D45436 /* CPTAxisTitle.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFC7C3510921FDB00DAECAA /* CPTAxisTitle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF51A4625E800D45436 /* CPTXYAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = 0783DD530FBF097E006C3696 /* CPTXYAxis.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF61A4625E800D45436 /* CPTXYAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 07975C410F3B816600DE45DC /* CPTXYAxisSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF71A4625F500D45436 /* CPTLegend.h in Headers */ = {isa = PBXBuildFile; fileRef = C3920AC21395B6500045F3BB /* CPTLegend.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF81A4625F500D45436 /* CPTLegendEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = C30550EB1399BE5400E0151F /* CPTLegendEntry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AF91A4625FA00D45436 /* CPTLegend.m in Sources */ = {isa = PBXBuildFile; fileRef = C3920AC31395B6500045F3BB /* CPTLegend.m */; }; + C38A0AFA1A4625FA00D45436 /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550EC1399BE5400E0151F /* CPTLegendEntry.m */; }; + C38A0AFB1A4625FB00D45436 /* CPTLegend.m in Sources */ = {isa = PBXBuildFile; fileRef = C3920AC31395B6500045F3BB /* CPTLegend.m */; }; + C38A0AFC1A4625FB00D45436 /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550EC1399BE5400E0151F /* CPTLegendEntry.m */; }; + C38A0AFD1A46260300D45436 /* CPTTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772C9250FE2F71600EC4C16 /* CPTTheme.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0AFE1A46260B00D45436 /* _CPTXYTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DA34CB107AD7710051DA02 /* _CPTXYTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0AFF1A46260B00D45436 /* _CPTDarkGradientTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772C92D0FE2F89000EC4C16 /* _CPTDarkGradientTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0B001A46260B00D45436 /* _CPTPlainBlackTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55022C10059F22005DF982 /* _CPTPlainBlackTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0B011A46260B00D45436 /* _CPTPlainWhiteTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55022E10059F22005DF982 /* _CPTPlainWhiteTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0B021A46260B00D45436 /* _CPTSlateTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FCF2C4115B54AE00E46606 /* _CPTSlateTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0B031A46260B00D45436 /* _CPTStocksTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55023010059F22005DF982 /* _CPTStocksTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38A0B041A46261700D45436 /* CPTTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C9260FE2F71600EC4C16 /* CPTTheme.m */; }; + C38A0B051A46261700D45436 /* _CPTXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */; }; + C38A0B061A46261700D45436 /* _CPTDarkGradientTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C92E0FE2F89000EC4C16 /* _CPTDarkGradientTheme.m */; }; + C38A0B071A46261700D45436 /* _CPTPlainBlackTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022D10059F22005DF982 /* _CPTPlainBlackTheme.m */; }; + C38A0B081A46261700D45436 /* _CPTPlainWhiteTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022F10059F22005DF982 /* _CPTPlainWhiteTheme.m */; }; + C38A0B091A46261700D45436 /* _CPTSlateTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FCF2C5115B54AE00E46606 /* _CPTSlateTheme.m */; }; + C38A0B0A1A46261700D45436 /* _CPTStocksTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55023110059F22005DF982 /* _CPTStocksTheme.m */; }; + C38A0B0B1A46261700D45436 /* CPTTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C9260FE2F71600EC4C16 /* CPTTheme.m */; }; + C38A0B0C1A46261700D45436 /* _CPTXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */; }; + C38A0B0D1A46261700D45436 /* _CPTDarkGradientTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C92E0FE2F89000EC4C16 /* _CPTDarkGradientTheme.m */; }; + C38A0B0E1A46261700D45436 /* _CPTPlainBlackTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022D10059F22005DF982 /* _CPTPlainBlackTheme.m */; }; + C38A0B0F1A46261700D45436 /* _CPTPlainWhiteTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022F10059F22005DF982 /* _CPTPlainWhiteTheme.m */; }; + C38A0B101A46261700D45436 /* _CPTSlateTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FCF2C5115B54AE00E46606 /* _CPTSlateTheme.m */; }; + C38A0B111A46261700D45436 /* _CPTStocksTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55023110059F22005DF982 /* _CPTStocksTheme.m */; }; + C38A0B121A46261F00D45436 /* CPTThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1620CBD100F03A100A84E77 /* CPTThemeTests.m */; }; + C38A0B131A46261F00D45436 /* CPTDarkGradientThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE6051100F27EF00895A91 /* CPTDarkGradientThemeTests.m */; }; + C38A0B141A46261F00D45436 /* CPTDerivedXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE611A100F3FB700895A91 /* CPTDerivedXYGraph.m */; }; + C38A0B151A46262000D45436 /* CPTThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1620CBD100F03A100A84E77 /* CPTThemeTests.m */; }; + C38A0B161A46262000D45436 /* CPTDarkGradientThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE6051100F27EF00895A91 /* CPTDarkGradientThemeTests.m */; }; + C38A0B171A46262000D45436 /* CPTDerivedXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE611A100F3FB700895A91 /* CPTDerivedXYGraph.m */; }; + C38A0B1E1A46264500D45436 /* CPTPlatformSpecificCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B181A46264500D45436 /* CPTPlatformSpecificCategories.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0B1F1A46264500D45436 /* CPTPlatformSpecificCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */; }; + C38A0B201A46264500D45436 /* CPTPlatformSpecificCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */; }; + C38A0B211A46264500D45436 /* CPTPlatformSpecificDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B1A1A46264500D45436 /* CPTPlatformSpecificDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0B221A46264500D45436 /* CPTPlatformSpecificDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */; }; + C38A0B231A46264500D45436 /* CPTPlatformSpecificDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */; }; + C38A0B241A46264500D45436 /* CPTPlatformSpecificFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B1C1A46264500D45436 /* CPTPlatformSpecificFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0B251A46264500D45436 /* CPTPlatformSpecificFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */; }; + C38A0B261A46264500D45436 /* CPTPlatformSpecificFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */; }; + C38A0B291A46265300D45436 /* CPTGraphHostingView.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B271A46265300D45436 /* CPTGraphHostingView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C38A0B2A1A46265300D45436 /* CPTGraphHostingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B281A46265300D45436 /* CPTGraphHostingView.m */; }; + C38A0B2B1A46265300D45436 /* CPTGraphHostingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B281A46265300D45436 /* CPTGraphHostingView.m */; }; C38DD49311A04B7A002A68E7 /* CPTGridLineGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C38DD49111A04B7A002A68E7 /* CPTGridLineGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; C38DD49411A04B7A002A68E7 /* CPTGridLineGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */; }; C3920AC41395B6500045F3BB /* CPTLegend.h in Headers */ = {isa = PBXBuildFile; fileRef = C3920AC21395B6500045F3BB /* CPTLegend.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -196,7 +552,6 @@ C3A695E5146A19BC00AF5653 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3A695E6146A19BC00AF5653 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; C3AFC9D10FB62969005DFFDC /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C3BB7D281633408200BC9515 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3BB7D1416322F7E00BC9515 /* Accelerate.framework */; settings = {ATTRIBUTES = (Required, ); }; }; C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; C3C1C0801790D3B400E8B1B7 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; C3C9CB0E165DB4D500739006 /* CPTAnimationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -218,6 +573,10 @@ C3D375F116594755003CC156 /* _CPTAnimationTimingFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */; }; C3D3AD2D13DF8DCE0004EA73 /* CPTLineCap.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D3AD2B13DF8DCE0004EA73 /* CPTLineCap.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D3AD2E13DF8DCE0004EA73 /* CPTLineCap.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */; }; + C3D414781A7D829100B6F5D6 /* CPTMutableNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EF10104D819100B554F9 /* CPTMutableNumericData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3D414791A7D829D00B6F5D6 /* CPTNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3D4147A1A7D82A500B6F5D6 /* CPTNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3D4147B1A7D82AB00B6F5D6 /* CPTMutableNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CAFB241229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D68A5B1220B27D00EB4863 /* CPTUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */; }; C3D68A5C1220B29100EB4863 /* CPTTextStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */; }; C3D68A5E1220B2AC00EB4863 /* CPTXYPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */; }; @@ -236,6 +595,15 @@ C3D979BB13D2347400145DFF /* CPTFillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979BA13D2347300145DFF /* CPTFillTests.m */; }; C3DA34CC107AD7710051DA02 /* _CPTXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */; }; C3DA34CD107AD7710051DA02 /* _CPTXYTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DA34CB107AD7710051DA02 /* _CPTXYTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C3EE4E681A6C13260098F4E6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A551A69F6F000F77249 /* Accelerate.framework */; }; + C3EE4E691A6C133D0098F4E6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A511A69F6DA00F77249 /* QuartzCore.framework */; }; + C3EE4E6A1A6C134B0098F4E6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; + C3EE4E6B1A6C13560098F4E6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A531A69F6DF00F77249 /* UIKit.framework */; }; + C3EE4E6E1A6C15890098F4E6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */; }; + C3EE4E6F1A6C15920098F4E6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3BB7D1416322F7E00BC9515 /* Accelerate.framework */; }; + C3EE4E981A6C1E890098F4E6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3EE4E971A6C1E890098F4E6 /* Cocoa.framework */; }; + C3EE4E9A1A6C1F770098F4E6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */; }; + C3EE4E9B1A6C1F8A0098F4E6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3EE4E971A6C1E890098F4E6 /* Cocoa.framework */; }; C3F31DE91045EB470058520A /* CPTPlotGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31DE71045EB470058520A /* CPTPlotGroup.m */; }; C3F31DEA1045EB470058520A /* CPTPlotGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31DE81045EB470058520A /* CPTPlotGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; C3F97F1E17A9E07C00A52FF2 /* CPTFunctionDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -252,8 +620,34 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C38A09841A46185300D45436 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C38A09771A46185200D45436; + remoteInfo = "CorePlot-iOS"; + }; + C38A09C61A4619A900D45436 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C38A09B91A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + C38A09B81A4619A900D45436 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 070064E7111F2BAA003DE087 /* CPTConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTConstraints.h; sourceTree = ""; }; 070064E8111F2BAA003DE087 /* CPTConstraints.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTConstraints.m; sourceTree = ""; }; @@ -268,7 +662,6 @@ 072161E911D1F6BD009CC871 /* CPTAnnotationHostLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnnotationHostLayer.h; sourceTree = ""; }; 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAnnotationHostLayer.m; sourceTree = ""; }; 0730F600109492D800E95162 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 0730F601109492D800E95162 /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = ""; }; 0730F64C109494D100E95162 /* CPTTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestCase.h; sourceTree = ""; }; 0730F64D109494D100E95162 /* CPTTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestCase.m; sourceTree = ""; }; 07321BBF0F37370D00F423D8 /* CPTExceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTExceptions.h; sourceTree = ""; }; @@ -344,14 +737,10 @@ 07FCF2C5115B54AE00E46606 /* _CPTSlateTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTSlateTheme.m; sourceTree = ""; }; 07FEBD60110B7E8B00E44D37 /* CPTScatterPlotTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTScatterPlotTests.h; sourceTree = ""; }; 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTScatterPlotTests.m; sourceTree = ""; }; - 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 32484B3F0F530E8B002151AD /* CPTPlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRange.h; sourceTree = ""; }; 32484B400F530E8B002151AD /* CPTPlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRange.m; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* CorePlot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot_Prefix.pch; sourceTree = ""; }; - 4C32D37C0F43B3CD00EDFE7A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 4C422A620FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYPlotSpaceTests.h; sourceTree = ""; }; 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYPlotSpaceTests.m; sourceTree = ""; }; 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CPTNumericData+TypeConversion.h"; sourceTree = ""; }; @@ -367,7 +756,6 @@ 4C97EF10104D819100B554F9 /* CPTMutableNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableNumericData.h; sourceTree = ""; }; 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableNumericData.m; sourceTree = ""; }; 4C97EF4C104D843E00B554F9 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license.txt; sourceTree = ""; }; - 4C993FF00F45EE1600DC824F /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 4C9A745D0FB24C7200918464 /* CPTDataSourceTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDataSourceTestCase.h; sourceTree = ""; }; 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDataSourceTestCase.m; sourceTree = ""; }; 4CD23FFA0FFBE78400ADD2E2 /* CPTAxisLabelTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelTests.h; sourceTree = ""; }; @@ -380,7 +768,7 @@ 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDecimalNumberExtensions.m; sourceTree = ""; }; 4CD7E9620F4B625900F9BCBB /* CPTUtilitiesTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTUtilitiesTests.h; sourceTree = ""; }; 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTUtilitiesTests.m; sourceTree = ""; }; - 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CorePlot-Info.plist"; sourceTree = ""; }; 8DC2EF5B0486A6940098B216 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9021E5690FC69B2900443472 /* doxygen.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = doxygen.config; path = ../documentation/doxygen/doxygen.config; sourceTree = SOURCE_ROOT; }; 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLineStyle.h; sourceTree = ""; }; @@ -415,6 +803,19 @@ C318F4AB11EA188700595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLimitBand.h; sourceTree = ""; }; C318F4AC11EA188700595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLimitBand.m; sourceTree = ""; }; C31908A41998168C00B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlot.xcconfig; sourceTree = ""; }; + C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; + C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; + C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = ""; }; + C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot_iOS.h; sourceTree = ""; }; + C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlotTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-iOSTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-CocoaTouchTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-CocoaTouch-Info.plist"; sourceTree = ""; }; + C3226A501A69F1A700F77249 /* CorePlot_iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot_iOS-Info.plist"; sourceTree = ""; }; + C3226A511A69F6DA00F77249 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + C3226A531A69F6DF00F77249 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + C3226A551A69F6F000F77249 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; + C3226A571A69F6FA00F77249 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; C3286BFE15D8740100A436A8 /* _CPTMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTMaskLayer.h; sourceTree = ""; }; C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTMaskLayer.m; sourceTree = ""; }; C32B391610AA4C78000470D4 /* CPTGridLines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGridLines.h; sourceTree = ""; }; @@ -443,10 +844,24 @@ C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlotWarnings.xcconfig; sourceTree = ""; }; C36468A80FE5533F0064B186 /* CPTTextStyleTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTextStyleTests.h; sourceTree = ""; }; C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextStyleTests.m; sourceTree = ""; }; - C365E19A1973193A0096AAE1 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; C36E89B811EE7F97003DE309 /* CPTPlotRangeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRangeTests.h; sourceTree = ""; }; C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRangeTests.m; sourceTree = ""; }; C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = MacOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C38A09781A46185200D45436 /* CorePlot_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CorePlot_iOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libCorePlot-CocoaTouch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CorePlot-CocoaTouchTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextStylePlatformSpecific.h; path = iPhoneOnly/CPTTextStylePlatformSpecific.h; sourceTree = SOURCE_ROOT; }; + C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTextStylePlatformSpecific.m; path = iPhoneOnly/CPTTextStylePlatformSpecific.m; sourceTree = SOURCE_ROOT; }; + C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTImagePlatformSpecific.m; path = iPhoneOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C38A0B181A46264500D45436 /* CPTPlatformSpecificCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificCategories.h; path = iPhoneOnly/CPTPlatformSpecificCategories.h; sourceTree = SOURCE_ROOT; }; + C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificCategories.m; path = iPhoneOnly/CPTPlatformSpecificCategories.m; sourceTree = SOURCE_ROOT; }; + C38A0B1A1A46264500D45436 /* CPTPlatformSpecificDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificDefines.h; path = iPhoneOnly/CPTPlatformSpecificDefines.h; sourceTree = SOURCE_ROOT; }; + C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificDefines.m; path = iPhoneOnly/CPTPlatformSpecificDefines.m; sourceTree = SOURCE_ROOT; }; + C38A0B1C1A46264500D45436 /* CPTPlatformSpecificFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificFunctions.h; path = iPhoneOnly/CPTPlatformSpecificFunctions.h; sourceTree = SOURCE_ROOT; }; + C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificFunctions.m; path = iPhoneOnly/CPTPlatformSpecificFunctions.m; sourceTree = SOURCE_ROOT; }; + C38A0B271A46265300D45436 /* CPTGraphHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGraphHostingView.h; path = iPhoneOnly/CPTGraphHostingView.h; sourceTree = SOURCE_ROOT; }; + C38A0B281A46265300D45436 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGraphHostingView.m; path = iPhoneOnly/CPTGraphHostingView.m; sourceTree = SOURCE_ROOT; }; C38DD49111A04B7A002A68E7 /* CPTGridLineGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGridLineGroup.h; sourceTree = ""; }; C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGridLineGroup.m; sourceTree = ""; }; C3920AC21395B6500045F3BB /* CPTLegend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLegend.h; sourceTree = ""; }; @@ -505,6 +920,7 @@ C3D979BA13D2347300145DFF /* CPTFillTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTFillTests.m; sourceTree = ""; }; C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTXYTheme.m; sourceTree = ""; }; C3DA34CB107AD7710051DA02 /* _CPTXYTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTXYTheme.h; sourceTree = ""; }; + C3EE4E971A6C1E890098F4E6 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; C3F31DE71045EB470058520A /* CPTPlotGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotGroup.m; sourceTree = ""; }; C3F31DE81045EB470058520A /* CPTPlotGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotGroup.h; sourceTree = ""; }; C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTFunctionDataSource.h; sourceTree = ""; }; @@ -525,8 +941,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C365E19B1973193A0096AAE1 /* XCTest.framework in Frameworks */, + C3EE4E9B1A6C1F8A0098F4E6 /* Cocoa.framework in Frameworks */, 0730F67C1094995000E95162 /* CorePlot.framework in Frameworks */, + C3EE4E9A1A6C1F770098F4E6 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -534,9 +951,52 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, - 07BF0D660F2B70B8002FCEA7 /* QuartzCore.framework in Frameworks */, - C3BB7D281633408200BC9515 /* Accelerate.framework in Frameworks */, + C3EE4E6F1A6C15920098F4E6 /* Accelerate.framework in Frameworks */, + C3EE4E981A6C1E890098F4E6 /* Cocoa.framework in Frameworks */, + C3EE4E6E1A6C15890098F4E6 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09741A46185200D45436 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C3226A5D1A69F72F00F77249 /* Accelerate.framework in Frameworks */, + C3226A5F1A69F75400F77249 /* CoreGraphics.framework in Frameworks */, + C3226A5E1A69F73800F77249 /* QuartzCore.framework in Frameworks */, + C3226A5C1A69F72900F77249 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A097F1A46185300D45436 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */, + C38A09831A46185300D45436 /* CorePlot_iOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09B71A4619A900D45436 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C3226A561A69F6F000F77249 /* Accelerate.framework in Frameworks */, + C3226A581A69F6FA00F77249 /* CoreGraphics.framework in Frameworks */, + C3226A521A69F6DA00F77249 /* QuartzCore.framework in Frameworks */, + C3226A541A69F6DF00F77249 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09C11A4619A900D45436 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C3EE4E681A6C13260098F4E6 /* Accelerate.framework in Frameworks */, + C3EE4E6A1A6C134B0098F4E6 /* CoreGraphics.framework in Frameworks */, + C3EE4E691A6C133D0098F4E6 /* QuartzCore.framework in Frameworks */, + C3EE4E6B1A6C13560098F4E6 /* UIKit.framework in Frameworks */, + C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -548,6 +1008,10 @@ children = ( 8DC2EF5B0486A6940098B216 /* CorePlot.framework */, 0730F600109492D800E95162 /* UnitTests.xctest */, + C38A09781A46185200D45436 /* CorePlot_iOS.framework */, + C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */, + C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */, + C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -603,6 +1067,7 @@ 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */, 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */, C3A959D210116FE100BF9739 /* Mac Specific */, + C38A0A521A461F5D00D45436 /* iOS Specific */, 4CC9A36C0FD98AB200CFBE5E /* Tests */, ); name = Text; @@ -846,7 +1311,7 @@ 4C99408D0F45F71100DC824F /* Testing */, 07BF0D600F2B6FE1002FCEA7 /* Source */, 07BF0D5F0F2B6FE1002FCEA7 /* Mac Specific */, - 4C32D37A0F43B3B400EDFE7A /* Test Host */, + C38A0AA61A4621BC00D45436 /* iOS Specific */, 9021E4920FC5C6DD00443472 /* Documentation */, 32C88DFF0371C24200C91783 /* Other Sources */, 089C1665FE841158C02AAC07 /* Resources */, @@ -862,8 +1327,8 @@ 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, + 1058C7B0FEA5585E11CA2CBB /* Mac */, + C39588531A6B2F6B009F9297 /* iOS */, ); name = "External Frameworks and Libraries"; sourceTree = ""; @@ -872,31 +1337,22 @@ isa = PBXGroup; children = ( 071F3CB810FBAB5900D0A7B6 /* License.txt */, - 0730F601109492D800E95162 /* UnitTests-Info.plist */, - 8DC2EF5A0486A6940098B216 /* Info.plist */, + 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */, + C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */, + C3226A501A69F1A700F77249 /* CorePlot_iOS-Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; - 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { + 1058C7B0FEA5585E11CA2CBB /* Mac */ = { isa = PBXGroup; children = ( - 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */, - 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, C3BB7D1416322F7E00BC9515 /* Accelerate.framework */, - C365E19A1973193A0096AAE1 /* XCTest.framework */, - ); - name = "Linked Frameworks"; - sourceTree = ""; - }; - 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { - isa = PBXGroup; - children = ( - 0867D6A5FE840307C02AAC07 /* AppKit.framework */, - 0867D69BFE84028FC02AAC07 /* Foundation.framework */, + C3EE4E971A6C1E890098F4E6 /* Cocoa.framework */, + 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */, ); - name = "Other Frameworks"; + name = Mac; sourceTree = ""; }; 32C88DFF0371C24200C91783 /* Other Sources */ = { @@ -904,21 +1360,14 @@ children = ( 32DBCF5E0370ADEE00C91783 /* CorePlot_Prefix.pch */, 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */, + C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */, + C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */, C31908A41998168C00B61898 /* CorePlot.xcconfig */, C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */, ); name = "Other Sources"; sourceTree = ""; }; - 4C32D37A0F43B3B400EDFE7A /* Test Host */ = { - isa = PBXGroup; - children = ( - 4C32D37C0F43B3CD00EDFE7A /* main.m */, - 4C993CEA0F45E78000DC824F /* Resources */, - ); - name = "Test Host"; - sourceTree = ""; - }; 4C7D0FB60FD5DDDA00D83C0F /* Tests */ = { isa = PBXGroup; children = ( @@ -965,17 +1414,10 @@ name = Tests; sourceTree = ""; }; - 4C993CEA0F45E78000DC824F /* Resources */ = { - isa = PBXGroup; - children = ( - 4C993FF30F45EE2F00DC824F /* MainMenu.xib */, - ); - name = Resources; - sourceTree = ""; - }; 4C99408D0F45F71100DC824F /* Testing */ = { isa = PBXGroup; children = ( + C3226A4B1A69F02900F77249 /* Resources */, 0730F64C109494D100E95162 /* CPTTestCase.h */, 0730F64D109494D100E95162 /* CPTTestCase.m */, 4C9A745D0FB24C7200918464 /* CPTDataSourceTestCase.h */, @@ -999,8 +1441,10 @@ isa = PBXGroup; children = ( 9021E5690FC69B2900443472 /* doxygen.config */, + C3226A451A69ED0900F77249 /* doxygen touch.config */, C3FF6EF00FFFA51D00AF0496 /* mainpage.h */, C3B235631009931400970270 /* doxygen-cocoa-tags.xml */, + C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */, C30E979F14B290520012204A /* DoxygenLayout.xml */, ); name = Documentation; @@ -1031,11 +1475,22 @@ C32EE1C013EC4BE700038266 /* CPTMutableShadow.m */, 0704A2100FB56B9400A09979 /* Fills */, C32DDEE2191C672700E0FE84 /* Mac Specific */, + C38A0A581A4620A700D45436 /* iOS Specific */, C3D979A613D215AD00145DFF /* Tests */, ); name = Drawing; sourceTree = ""; }; + C3226A4B1A69F02900F77249 /* Resources */ = { + isa = PBXGroup; + children = ( + C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */, + C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */, + C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; C32B391C10AA4D1E000470D4 /* XY Axes */ = { isa = PBXGroup; children = ( @@ -1084,6 +1539,39 @@ name = "Plot Symbols"; sourceTree = ""; }; + C38A0A521A461F5D00D45436 /* iOS Specific */ = { + isa = PBXGroup; + children = ( + C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */, + C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */, + ); + name = "iOS Specific"; + sourceTree = ""; + }; + C38A0A581A4620A700D45436 /* iOS Specific */ = { + isa = PBXGroup; + children = ( + C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */, + ); + name = "iOS Specific"; + sourceTree = ""; + }; + C38A0AA61A4621BC00D45436 /* iOS Specific */ = { + isa = PBXGroup; + children = ( + C38A0B1A1A46264500D45436 /* CPTPlatformSpecificDefines.h */, + C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */, + C38A0B181A46264500D45436 /* CPTPlatformSpecificCategories.h */, + C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */, + C38A0B1C1A46264500D45436 /* CPTPlatformSpecificFunctions.h */, + C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */, + C38A0B271A46265300D45436 /* CPTGraphHostingView.h */, + C38A0B281A46265300D45436 /* CPTGraphHostingView.m */, + ); + name = "iOS Specific"; + path = Source; + sourceTree = ""; + }; C3920AC11395B6170045F3BB /* Legends */ = { isa = PBXGroup; children = ( @@ -1095,6 +1583,17 @@ name = Legends; sourceTree = ""; }; + C39588531A6B2F6B009F9297 /* iOS */ = { + isa = PBXGroup; + children = ( + C3226A551A69F6F000F77249 /* Accelerate.framework */, + C3226A571A69F6FA00F77249 /* CoreGraphics.framework */, + C3226A511A69F6DA00F77249 /* QuartzCore.framework */, + C3226A531A69F6DF00F77249 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; C3A959D210116FE100BF9739 /* Mac Specific */ = { isa = PBXGroup; children = ( @@ -1299,6 +1798,107 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C38A09751A46185200D45436 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C38A0AAF1A46241100D45436 /* CPTLimitBand.h in Headers */, + C38A09EF1A461CD000D45436 /* CPTDefinitions.h in Headers */, + C38A0AD51A46256B00D45436 /* CPTPlotSymbol.h in Headers */, + C38A0AC61A46255C00D45436 /* CPTTradingRangePlot.h in Headers */, + C38A0AA71A46240300D45436 /* CPTGraph.h in Headers */, + C38A0ADA1A4625B100D45436 /* CPTGridLines.h in Headers */, + C38A0A4A1A461F1500D45436 /* CPTTextStyle.h in Headers */, + C38A09FB1A461D0F00D45436 /* CPTMutablePlotRange.h in Headers */, + C38A0AC31A46255C00D45436 /* CPTPieChart.h in Headers */, + C3D4147B1A7D82AB00B6F5D6 /* CPTMutableNumericData+TypeConversion.h in Headers */, + C38A0ADC1A4625C100D45436 /* CPTAxisLabelGroup.h in Headers */, + C38A0AB61A4624C200D45436 /* CPTPlotSpace.h in Headers */, + C38A0B291A46265300D45436 /* CPTGraphHostingView.h in Headers */, + C38A0A5D1A4620D400D45436 /* CPTColorSpace.h in Headers */, + C38A0AB71A4624C200D45436 /* CPTXYPlotSpace.h in Headers */, + C38A0A611A4620D400D45436 /* CPTLineStyle.h in Headers */, + C38A0A631A4620D400D45436 /* CPTPathExtensions.h in Headers */, + C38A0A0B1A461D5100D45436 /* _CPTBorderLayer.h in Headers */, + C3226A4A1A69EEDD00F77249 /* CorePlot_iOS.h in Headers */, + C3D414791A7D829D00B6F5D6 /* CPTNumericData.h in Headers */, + C38A0A601A4620D400D45436 /* CPTLineCap.h in Headers */, + C38A0A7C1A4620EF00D45436 /* _CPTFillGradient.h in Headers */, + C38A09D81A461C5800D45436 /* CPTNumericDataType.h in Headers */, + C38A0A1A1A461E6400D45436 /* CPTAnimationPeriod.h in Headers */, + C38A0B011A46260B00D45436 /* _CPTPlainWhiteTheme.h in Headers */, + C38A0A081A461D4800D45436 /* CPTBorderedLayer.h in Headers */, + C38A0AF21A4625E800D45436 /* CPTAxisSet.h in Headers */, + C38A0AC51A46255C00D45436 /* CPTScatterPlot.h in Headers */, + C38A0A651A4620D400D45436 /* CPTMutableShadow.h in Headers */, + C38A0B001A46260B00D45436 /* _CPTPlainBlackTheme.h in Headers */, + C38A0A291A461EA300D45436 /* _CPTAnimationNSDecimalPeriod.h in Headers */, + C38A0A951A46218B00D45436 /* CPTCalendarFormatter.h in Headers */, + C38A0A471A461F0C00D45436 /* CPTTextLayer.h in Headers */, + C38A0A111A461D6300D45436 /* CPTResponder.h in Headers */, + C38A0A051A461D3F00D45436 /* CPTLayer.h in Headers */, + C38A0AAD1A46241100D45436 /* CPTPlotAreaFrame.h in Headers */, + C38A0AF51A4625E800D45436 /* CPTXYAxis.h in Headers */, + C38A0B031A46260B00D45436 /* _CPTStocksTheme.h in Headers */, + C38A0A5F1A4620D400D45436 /* CPTImage.h in Headers */, + C38A0AFD1A46260300D45436 /* CPTTheme.h in Headers */, + C38A0B1E1A46264500D45436 /* CPTPlatformSpecificCategories.h in Headers */, + C38A0A9F1A4621A500D45436 /* NSNumberExtensions.h in Headers */, + C38A0A441A461EFA00D45436 /* _CPTConstraintsRelative.h in Headers */, + C38A0A171A461E5B00D45436 /* CPTAnimationOperation.h in Headers */, + C38A0AFF1A46260B00D45436 /* _CPTDarkGradientTheme.h in Headers */, + C38A0AC41A46255C00D45436 /* CPTRangePlot.h in Headers */, + C38A0A231A461E8F00D45436 /* _CPTAnimationCGSizePeriod.h in Headers */, + C38A0AC01A46254E00D45436 /* CPTPlotGroup.h in Headers */, + C38A0AF71A4625F500D45436 /* CPTLegend.h in Headers */, + C38A0A7D1A4620EF00D45436 /* _CPTFillImage.h in Headers */, + C38A0A261A461E9600D45436 /* _CPTAnimationCGRectPeriod.h in Headers */, + C38A0A351A461EC800D45436 /* CPTPlotSpaceAnnotation.h in Headers */, + C38A0A3E1A461EE600D45436 /* CPTConstraints.h in Headers */, + C38A0A9D1A4621A500D45436 /* NSCoderExtensions.h in Headers */, + C3D4147A1A7D82A500B6F5D6 /* CPTNumericData+TypeConversion.h in Headers */, + C38A0A7B1A4620EF00D45436 /* _CPTFillColor.h in Headers */, + C38A0AFE1A46260B00D45436 /* _CPTXYTheme.h in Headers */, + C38A0A381A461ED000D45436 /* CPTLayerAnnotation.h in Headers */, + C38A0A1D1A461E6E00D45436 /* _CPTAnimationCGFloatPeriod.h in Headers */, + C38A0AF41A4625E800D45436 /* CPTAxisTitle.h in Headers */, + C38A0B021A46260B00D45436 /* _CPTSlateTheme.h in Headers */, + C3D414781A7D829100B6F5D6 /* CPTMutableNumericData.h in Headers */, + C38A0ADB1A4625B100D45436 /* CPTGridLineGroup.h in Headers */, + C38A0A621A4620D400D45436 /* CPTMutableLineStyle.h in Headers */, + C38A0A141A461E5000D45436 /* CPTAnimation.h in Headers */, + C38A09F21A461CEE00D45436 /* CPTExceptions.h in Headers */, + C38A0AC11A46255C00D45436 /* CPTPlot.h in Headers */, + C38A0A641A4620D400D45436 /* CPTShadow.h in Headers */, + C38A0A321A461EBD00D45436 /* CPTAnnotation.h in Headers */, + C38A0A5C1A4620D400D45436 /* CPTColor.h in Headers */, + C38A0A551A461F9700D45436 /* CPTTextStylePlatformSpecific.h in Headers */, + C38A0A7A1A4620E800D45436 /* CPTFill.h in Headers */, + C38A09F81A461D0500D45436 /* CPTPlotRange.h in Headers */, + C38A0AF61A4625E800D45436 /* CPTXYAxisSet.h in Headers */, + C38A0A961A46218B00D45436 /* CPTTimeFormatter.h in Headers */, + C38A0AF81A4625F500D45436 /* CPTLegendEntry.h in Headers */, + C38A0AAE1A46241100D45436 /* CPTPlotArea.h in Headers */, + C38A0A0E1A461D5B00D45436 /* _CPTMaskLayer.h in Headers */, + C38A0A2C1A461EAA00D45436 /* _CPTAnimationPlotRangePeriod.h in Headers */, + C38A09FE1A461D1800D45436 /* CPTFunctionDataSource.h in Headers */, + C38A0A5E1A4620D400D45436 /* CPTGradient.h in Headers */, + C38A0A201A461E8800D45436 /* _CPTAnimationCGPointPeriod.h in Headers */, + C38A0A9E1A4621A500D45436 /* NSDecimalNumberExtensions.h in Headers */, + C38A0AF11A4625E800D45436 /* CPTAxis.h in Headers */, + C38A0B241A46264500D45436 /* CPTPlatformSpecificFunctions.h in Headers */, + C38A0A3B1A461EDA00D45436 /* CPTAnnotationHostLayer.h in Headers */, + C38A0AF31A4625E800D45436 /* CPTAxisLabel.h in Headers */, + C38A0A2F1A461EB100D45436 /* _CPTAnimationTimingFunctions.h in Headers */, + C38A0A4D1A461F1D00D45436 /* CPTMutableTextStyle.h in Headers */, + C38A0AA81A46240300D45436 /* CPTXYGraph.h in Headers */, + C38A0B211A46264500D45436 /* CPTPlatformSpecificDefines.h in Headers */, + C38A0AC21A46255C00D45436 /* CPTBarPlot.h in Headers */, + C38A09F51A461CF900D45436 /* CPTUtilities.h in Headers */, + C38A0A411A461EEE00D45436 /* _CPTConstraintsFixed.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -1340,6 +1940,77 @@ productReference = 8DC2EF5B0486A6940098B216 /* CorePlot.framework */; productType = "com.apple.product-type.framework"; }; + C38A09771A46185200D45436 /* CorePlot_iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOS" */; + buildPhases = ( + C38A09731A46185200D45436 /* Sources */, + C38A09741A46185200D45436 /* Frameworks */, + C38A09751A46185200D45436 /* Headers */, + C38A09761A46185200D45436 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CorePlot_iOS; + productName = "CorePlot-iOS"; + productReference = C38A09781A46185200D45436 /* CorePlot_iOS.framework */; + productType = "com.apple.product-type.framework"; + }; + C38A09811A46185300D45436 /* CorePlot_iOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOSTests" */; + buildPhases = ( + C38A097E1A46185300D45436 /* Sources */, + C38A097F1A46185300D45436 /* Frameworks */, + C38A09801A46185300D45436 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C38A09851A46185300D45436 /* PBXTargetDependency */, + ); + name = CorePlot_iOSTests; + productName = "CorePlot-iOSTests"; + productReference = C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */ = { + isa = PBXNativeTarget; + buildConfigurationList = C38A09CB1A4619A900D45436 /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouch" */; + buildPhases = ( + C38A09B61A4619A900D45436 /* Sources */, + C38A09B71A4619A900D45436 /* Frameworks */, + C38A09B81A4619A900D45436 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "CorePlot-CocoaTouch"; + productName = "CorePlot-CocoaTouch"; + productReference = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; + productType = "com.apple.product-type.library.static"; + }; + C38A09C31A4619A900D45436 /* CorePlot-CocoaTouchTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C38A09CE1A4619A900D45436 /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouchTests" */; + buildPhases = ( + C38A09C01A4619A900D45436 /* Sources */, + C38A09C11A4619A900D45436 /* Frameworks */, + C38A09C21A4619A900D45436 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C38A09C71A4619A900D45436 /* PBXTargetDependency */, + ); + name = "CorePlot-CocoaTouchTests"; + productName = "CorePlot-CocoaTouchTests"; + productReference = C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1348,6 +2019,20 @@ attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 0610; + TargetAttributes = { + C38A09771A46185200D45436 = { + CreatedOnToolsVersion = 6.1.1; + }; + C38A09811A46185300D45436 = { + CreatedOnToolsVersion = 6.1.1; + }; + C38A09B91A4619A900D45436 = { + CreatedOnToolsVersion = 6.1.1; + }; + C38A09C31A4619A900D45436 = { + CreatedOnToolsVersion = 6.1.1; + }; + }; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "CorePlot" */; compatibilityVersion = "Xcode 3.2"; @@ -1366,7 +2051,13 @@ targets = ( 8DC2EF4F0486A6940098B216 /* CorePlot */, 0730F5FF109492D800E95162 /* UnitTests */, - 9021E49E0FC5C9DC00443472 /* Documentation */, + C38A09771A46185200D45436 /* CorePlot_iOS */, + C38A09811A46185300D45436 /* CorePlot_iOSTests */, + C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */, + C38A09C31A4619A900D45436 /* CorePlot-CocoaTouchTests */, + 9021E49E0FC5C9DC00443472 /* Documentation-Mac */, + C38A09911A4618B600D45436 /* Documentation-iOS */, + C38A09961A46193F00D45436 /* Universal Library */, ); }; /* End PBXProject section */ @@ -1388,6 +2079,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C38A09761A46185200D45436 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09801A46185300D45436 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09C21A4619A900D45436 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -1417,6 +2129,32 @@ shellPath = /bin/sh; shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen.config\"' to \n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ] \nthen \n echo doxygen config file does not exist\n ${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${DOXYGEN_FOLDER}/doxygen.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/MacOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlot.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; }; + C38A09921A4618B600D45436 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"' to\n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ]\nthen\necho doxygen config file does not exist\n${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/iOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlotTouch.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotTouchDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; + }; + C38A09971A46193F00D45436 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\nUFW_TARGET=\"CorePlot-CocoaTouch\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest iphoneos SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"iphoneos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_DIR=\"${UFW_BUILD_DIR}/Release-iphoneos\"\nUFW_SIMULATOR_DIR=\"${UFW_BUILD_DIR}/Release-iphonesimulator\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-universal\"\nUFW_HEADER_DIR=\"${UFW_UNIVERSAL_DIR}/CorePlotHeaders\"\nUFW_EXE_PATH=\"libCorePlot-CocoaTouch.a\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\nlipo -create -output \"${UFW_UNIVERSAL_DIR}/${UFW_EXE_PATH}\" \"${UFW_IPHONE_DIR}/${UFW_EXE_PATH}\" \"${UFW_SIMULATOR_DIR}/${UFW_EXE_PATH}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n\n# copy header files\nmkdir -p \"${UFW_HEADER_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp \"${SOURCE_ROOT}/CorePlot-CocoaTouch.h\" \"${UFW_HEADER_DIR}\"\ncp \"${SOURCE_ROOT}/iPhoneOnly/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\ncp \"${SOURCE_ROOT}/Source/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\n\nrm \"${UFW_HEADER_DIR}/\"*Tests.*"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1553,6 +2291,270 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C38A09731A46185200D45436 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C38A0B2A1A46265300D45436 /* CPTGraphHostingView.m in Sources */, + C38A0A391A461ED600D45436 /* CPTLayerAnnotation.m in Sources */, + C38A0A061A461D4400D45436 /* CPTLayer.m in Sources */, + C38A0A981A46219100D45436 /* CPTTimeFormatter.m in Sources */, + C38A0A661A4620E200D45436 /* CPTColor.m in Sources */, + C38A0AA01A4621AC00D45436 /* NSCoderExtensions.m in Sources */, + C38A09DD1A461C8100D45436 /* CPTMutableNumericData.m in Sources */, + C38A09DF1A461C8500D45436 /* CPTNumericData+TypeConversion.m in Sources */, + C38A0B041A46261700D45436 /* CPTTheme.m in Sources */, + C38A09F01A461CD900D45436 /* CPTDefinitions.m in Sources */, + C38A0A811A4620F700D45436 /* _CPTFillImage.m in Sources */, + C38A0A361A461ECD00D45436 /* CPTPlotSpaceAnnotation.m in Sources */, + C38A0AE61A4625D400D45436 /* CPTXYAxis.m in Sources */, + C38A0AC91A46256500D45436 /* CPTBarPlot.m in Sources */, + C38A0AE41A4625D400D45436 /* CPTAxisTitle.m in Sources */, + C38A0B221A46264500D45436 /* CPTPlatformSpecificDefines.m in Sources */, + C38A0B0A1A46261700D45436 /* _CPTStocksTheme.m in Sources */, + C38A0A5A1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */, + C38A0A1E1A461E7A00D45436 /* _CPTAnimationCGFloatPeriod.m in Sources */, + C38A09F31A461CF500D45436 /* CPTExceptions.m in Sources */, + C38A0B061A46261700D45436 /* _CPTDarkGradientTheme.m in Sources */, + C38A0B071A46261700D45436 /* _CPTPlainBlackTheme.m in Sources */, + C38A09DB1A461C7D00D45436 /* CPTNumericData.m in Sources */, + C38A09D51A461C1E00D45436 /* CorePlotProbes.d in Sources */, + C38A0AE71A4625D400D45436 /* CPTXYAxisSet.m in Sources */, + C38A0AB21A46241700D45436 /* CPTLimitBand.m in Sources */, + C38A0AE11A4625D400D45436 /* CPTGridLines.m in Sources */, + C38A0A6D1A4620E200D45436 /* CPTPathExtensions.m in Sources */, + C38A0AB91A46250500D45436 /* CPTXYPlotSpace.m in Sources */, + C38A09F91A461D0B00D45436 /* CPTPlotRange.m in Sources */, + C38A0A691A4620E200D45436 /* CPTImage.m in Sources */, + C38A0AD61A46257100D45436 /* CPTPlotSymbol.m in Sources */, + C38A0AE01A4625D400D45436 /* CPTAxisSet.m in Sources */, + C38A0AC71A46256500D45436 /* CPTPlotGroup.m in Sources */, + C38A0A151A461E5800D45436 /* CPTAnimation.m in Sources */, + C38A0A2A1A461EA600D45436 /* _CPTAnimationNSDecimalPeriod.m in Sources */, + C38A0A2D1A461EAD00D45436 /* _CPTAnimationPlotRangePeriod.m in Sources */, + C38A0AB01A46241700D45436 /* CPTPlotAreaFrame.m in Sources */, + C38A0AE31A4625D400D45436 /* CPTAxisLabel.m in Sources */, + C38A0A6E1A4620E200D45436 /* CPTShadow.m in Sources */, + C38A0A211A461E8B00D45436 /* _CPTAnimationCGPointPeriod.m in Sources */, + C38A0B251A46264500D45436 /* CPTPlatformSpecificFunctions.m in Sources */, + C38A0A6F1A4620E200D45436 /* CPTMutableShadow.m in Sources */, + C38A0A271A461E9A00D45436 /* _CPTAnimationCGRectPeriod.m in Sources */, + C38A0AB81A46250500D45436 /* CPTPlotSpace.m in Sources */, + C38A0A6A1A4620E200D45436 /* CPTLineCap.m in Sources */, + C38A0ACC1A46256500D45436 /* CPTScatterPlot.m in Sources */, + C38A0B091A46261700D45436 /* _CPTSlateTheme.m in Sources */, + C38A0A1B1A461E6A00D45436 /* CPTAnimationPeriod.m in Sources */, + C38A0A561A461F9700D45436 /* CPTTextStylePlatformSpecific.m in Sources */, + C38A0A0C1A461D5700D45436 /* _CPTBorderLayer.m in Sources */, + C38A0AFA1A4625FA00D45436 /* CPTLegendEntry.m in Sources */, + C38A0ACD1A46256500D45436 /* CPTTradingRangePlot.m in Sources */, + C38A0A481A461F1100D45436 /* CPTTextLayer.m in Sources */, + C38A0A451A461F0100D45436 /* _CPTConstraintsRelative.m in Sources */, + C38A0A3C1A461EDF00D45436 /* CPTAnnotationHostLayer.m in Sources */, + C38A0A181A461E6000D45436 /* CPTAnimationOperation.m in Sources */, + C38A0A801A4620F700D45436 /* _CPTFillGradient.m in Sources */, + C38A0A0F1A461D5E00D45436 /* _CPTMaskLayer.m in Sources */, + C38A0A971A46219100D45436 /* CPTCalendarFormatter.m in Sources */, + C38A0A331A461EC200D45436 /* CPTAnnotation.m in Sources */, + C38A0A7F1A4620F700D45436 /* _CPTFillColor.m in Sources */, + C38A0A301A461EB500D45436 /* _CPTAnimationTimingFunctions.m in Sources */, + C38A0A6C1A4620E200D45436 /* CPTMutableLineStyle.m in Sources */, + C38A0AA11A4621AC00D45436 /* NSDecimalNumberExtensions.m in Sources */, + C38A0AF91A4625FA00D45436 /* CPTLegend.m in Sources */, + C38A0AE51A4625D400D45436 /* CPTAxisLabelGroup.m in Sources */, + C38A0A7E1A4620F700D45436 /* CPTFill.m in Sources */, + C38A09E11A461C8800D45436 /* CPTMutableNumericData+TypeConversion.m in Sources */, + C38A0ACB1A46256500D45436 /* CPTRangePlot.m in Sources */, + C38A0AA91A46240900D45436 /* CPTGraph.m in Sources */, + C38A09FC1A461D1300D45436 /* CPTMutablePlotRange.m in Sources */, + C38A0B081A46261700D45436 /* _CPTPlainWhiteTheme.m in Sources */, + C38A0AE21A4625D400D45436 /* CPTGridLineGroup.m in Sources */, + C38A09D91A461C6B00D45436 /* CPTNumericDataType.m in Sources */, + C38A0AC81A46256500D45436 /* CPTPlot.m in Sources */, + C38A0B1F1A46264500D45436 /* CPTPlatformSpecificCategories.m in Sources */, + C38A0A3F1A461EEB00D45436 /* CPTConstraints.m in Sources */, + C38A0A4B1A461F1A00D45436 /* CPTTextStyle.m in Sources */, + C38A09FF1A461D1D00D45436 /* CPTFunctionDataSource.m in Sources */, + C38A0AA21A4621AC00D45436 /* NSNumberExtensions.m in Sources */, + C38A0A091A461D4D00D45436 /* CPTBorderedLayer.m in Sources */, + C38A0A6B1A4620E200D45436 /* CPTLineStyle.m in Sources */, + C38A0A241A461E9200D45436 /* _CPTAnimationCGSizePeriod.m in Sources */, + C38A0ACA1A46256500D45436 /* CPTPieChart.m in Sources */, + C38A0A671A4620E200D45436 /* CPTColorSpace.m in Sources */, + C38A0A681A4620E200D45436 /* CPTGradient.m in Sources */, + C38A09F61A461D0000D45436 /* CPTUtilities.m in Sources */, + C38A0B051A46261700D45436 /* _CPTXYTheme.m in Sources */, + C38A0AAA1A46240900D45436 /* CPTXYGraph.m in Sources */, + C38A0AB11A46241700D45436 /* CPTPlotArea.m in Sources */, + C38A0A421A461EF500D45436 /* _CPTConstraintsFixed.m in Sources */, + C38A0ADF1A4625D400D45436 /* CPTAxis.m in Sources */, + C38A0A4E1A461F2200D45436 /* CPTMutableTextStyle.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A097E1A46185300D45436 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C38A09E41A461CAD00D45436 /* CPTMutableNumericDataTests.m in Sources */, + C38A0A871A46210A00D45436 /* CPTColorSpaceTests.m in Sources */, + C38A0A881A46210A00D45436 /* CPTFillTests.m in Sources */, + C38A0A031A461D3100D45436 /* CPTUtilitiesTests.m in Sources */, + C38A0A891A46210A00D45436 /* CPTGradientTests.m in Sources */, + C38A0B131A46261F00D45436 /* CPTDarkGradientThemeTests.m in Sources */, + C38A0ADD1A4625C900D45436 /* CPTAxisLabelTests.m in Sources */, + C38A0B121A46261F00D45436 /* CPTThemeTests.m in Sources */, + C38A0A861A46210A00D45436 /* CPTColorTests.m in Sources */, + C38A0ABC1A46250B00D45436 /* CPTPlotSpaceTests.m in Sources */, + C38A0A8A1A46210A00D45436 /* CPTImageTests.m in Sources */, + C38A09D31A461C1800D45436 /* CPTDataSourceTestCase.m in Sources */, + C38A09E81A461CB600D45436 /* CPTNumericDataTests.m in Sources */, + C38A0B141A46261F00D45436 /* CPTDerivedXYGraph.m in Sources */, + C38A0ABD1A46250B00D45436 /* CPTXYPlotSpaceTests.m in Sources */, + C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */, + C38A0A011A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, + C38A09EA1A461CBA00D45436 /* CPTNumericDataTypeConversionTests.m in Sources */, + C38A09E61A461CB200D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, + C38A0A8B1A46210A00D45436 /* CPTLineStyleTests.m in Sources */, + C38A0A501A461F3D00D45436 /* CPTTextStyleTests.m in Sources */, + C38A0A9B1A46219600D45436 /* CPTTimeFormatterTests.m in Sources */, + C38A0A121A461D6A00D45436 /* CPTLayerTests.m in Sources */, + C38A0AD81A46257600D45436 /* CPTScatterPlotTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09B61A4619A900D45436 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C38A0A461A461F0200D45436 /* _CPTConstraintsRelative.m in Sources */, + C38A0ABB1A46250600D45436 /* CPTXYPlotSpace.m in Sources */, + C38A0A821A4620F800D45436 /* CPTFill.m in Sources */, + C38A09F41A461CF600D45436 /* CPTExceptions.m in Sources */, + C38A0AB51A46241800D45436 /* CPTLimitBand.m in Sources */, + C38A0A841A4620F800D45436 /* _CPTFillGradient.m in Sources */, + C38A0AED1A4625D500D45436 /* CPTAxisTitle.m in Sources */, + C38A0A851A4620F800D45436 /* _CPTFillImage.m in Sources */, + C38A09FA1A461D0C00D45436 /* CPTPlotRange.m in Sources */, + C38A0AEB1A4625D500D45436 /* CPTGridLineGroup.m in Sources */, + C38A0A491A461F1200D45436 /* CPTTextLayer.m in Sources */, + C38A0B111A46261700D45436 /* _CPTStocksTheme.m in Sources */, + C38A0AD71A46257200D45436 /* CPTPlotSymbol.m in Sources */, + C38A0A0A1A461D4D00D45436 /* CPTBorderedLayer.m in Sources */, + C38A0AD11A46256600D45436 /* CPTPieChart.m in Sources */, + C38A0AB41A46241800D45436 /* CPTPlotArea.m in Sources */, + C38A0A771A4620E200D45436 /* CPTPathExtensions.m in Sources */, + C38A0AE91A4625D500D45436 /* CPTAxisSet.m in Sources */, + C38A09E21A461C8900D45436 /* CPTMutableNumericData+TypeConversion.m in Sources */, + C38A0A251A461E9300D45436 /* _CPTAnimationCGSizePeriod.m in Sources */, + C38A0B201A46264500D45436 /* CPTPlatformSpecificCategories.m in Sources */, + C38A0AEF1A4625D500D45436 /* CPTXYAxis.m in Sources */, + C38A09DA1A461C6C00D45436 /* CPTNumericDataType.m in Sources */, + C38A0AD41A46256600D45436 /* CPTTradingRangePlot.m in Sources */, + C38A0ABA1A46250600D45436 /* CPTPlotSpace.m in Sources */, + C38A0A281A461E9B00D45436 /* _CPTAnimationCGRectPeriod.m in Sources */, + C38A0AEC1A4625D500D45436 /* CPTAxisLabel.m in Sources */, + C38A0A991A46219200D45436 /* CPTCalendarFormatter.m in Sources */, + C38A0A3A1A461ED700D45436 /* CPTLayerAnnotation.m in Sources */, + C38A0B231A46264500D45436 /* CPTPlatformSpecificDefines.m in Sources */, + C38A0AD21A46256600D45436 /* CPTRangePlot.m in Sources */, + C38A0A571A461F9700D45436 /* CPTTextStylePlatformSpecific.m in Sources */, + C38A0A341A461EC300D45436 /* CPTAnnotation.m in Sources */, + C38A0AFB1A4625FB00D45436 /* CPTLegend.m in Sources */, + C38A0AA51A4621AD00D45436 /* NSNumberExtensions.m in Sources */, + C38A0A791A4620E200D45436 /* CPTMutableShadow.m in Sources */, + C38A0B0D1A46261700D45436 /* _CPTDarkGradientTheme.m in Sources */, + C38A0AE81A4625D500D45436 /* CPTAxis.m in Sources */, + C38A0AEE1A4625D500D45436 /* CPTAxisLabelGroup.m in Sources */, + C38A0AFC1A4625FB00D45436 /* CPTLegendEntry.m in Sources */, + C38A0A401A461EEB00D45436 /* CPTConstraints.m in Sources */, + C38A0A1F1A461E7B00D45436 /* _CPTAnimationCGFloatPeriod.m in Sources */, + C38A0AB31A46241800D45436 /* CPTPlotAreaFrame.m in Sources */, + C38A0B0C1A46261700D45436 /* _CPTXYTheme.m in Sources */, + C38A0A371A461ECD00D45436 /* CPTPlotSpaceAnnotation.m in Sources */, + C38A0A191A461E6100D45436 /* CPTAnimationOperation.m in Sources */, + C38A0ACF1A46256600D45436 /* CPTPlot.m in Sources */, + C38A0A101A461D5F00D45436 /* _CPTMaskLayer.m in Sources */, + C38A0ACE1A46256600D45436 /* CPTPlotGroup.m in Sources */, + C38A0A781A4620E200D45436 /* CPTShadow.m in Sources */, + C38A0B0B1A46261700D45436 /* CPTTheme.m in Sources */, + C38A0A431A461EF600D45436 /* _CPTConstraintsFixed.m in Sources */, + C38A09FD1A461D1400D45436 /* CPTMutablePlotRange.m in Sources */, + C38A09F71A461D0100D45436 /* CPTUtilities.m in Sources */, + C38A0A721A4620E200D45436 /* CPTGradient.m in Sources */, + C38A09D61A461C2B00D45436 /* CorePlotProbes.d in Sources */, + C38A0A9A1A46219200D45436 /* CPTTimeFormatter.m in Sources */, + C38A0A161A461E5800D45436 /* CPTAnimation.m in Sources */, + C38A0AAC1A46240A00D45436 /* CPTXYGraph.m in Sources */, + C38A0A751A4620E200D45436 /* CPTLineStyle.m in Sources */, + C38A09DE1A461C8100D45436 /* CPTMutableNumericData.m in Sources */, + C38A0B0E1A46261700D45436 /* _CPTPlainBlackTheme.m in Sources */, + C38A0B2B1A46265300D45436 /* CPTGraphHostingView.m in Sources */, + C38A0B261A46264500D45436 /* CPTPlatformSpecificFunctions.m in Sources */, + C38A0A1C1A461E6B00D45436 /* CPTAnimationPeriod.m in Sources */, + C38A0AA31A4621AD00D45436 /* NSCoderExtensions.m in Sources */, + C38A0AEA1A4625D500D45436 /* CPTGridLines.m in Sources */, + C38A09DC1A461C7D00D45436 /* CPTNumericData.m in Sources */, + C38A0A2E1A461EAE00D45436 /* _CPTAnimationPlotRangePeriod.m in Sources */, + C38A0B0F1A46261700D45436 /* _CPTPlainWhiteTheme.m in Sources */, + C38A0A701A4620E200D45436 /* CPTColor.m in Sources */, + C38A09F11A461CDA00D45436 /* CPTDefinitions.m in Sources */, + C38A0AAB1A46240A00D45436 /* CPTGraph.m in Sources */, + C38A0AA41A4621AD00D45436 /* NSDecimalNumberExtensions.m in Sources */, + C38A0A4F1A461F2200D45436 /* CPTMutableTextStyle.m in Sources */, + C38A0A831A4620F800D45436 /* _CPTFillColor.m in Sources */, + C38A0A761A4620E200D45436 /* CPTMutableLineStyle.m in Sources */, + C38A0A731A4620E200D45436 /* CPTImage.m in Sources */, + C38A0AF01A4625D500D45436 /* CPTXYAxisSet.m in Sources */, + C38A09E01A461C8500D45436 /* CPTNumericData+TypeConversion.m in Sources */, + C38A0A3D1A461EE000D45436 /* CPTAnnotationHostLayer.m in Sources */, + C38A0A311A461EB600D45436 /* _CPTAnimationTimingFunctions.m in Sources */, + C38A0A5B1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */, + C38A0A4C1A461F1B00D45436 /* CPTTextStyle.m in Sources */, + C38A0B101A46261700D45436 /* _CPTSlateTheme.m in Sources */, + C38A0AD31A46256600D45436 /* CPTScatterPlot.m in Sources */, + C38A0A0D1A461D5800D45436 /* _CPTBorderLayer.m in Sources */, + C38A0A711A4620E200D45436 /* CPTColorSpace.m in Sources */, + C38A0A001A461D1D00D45436 /* CPTFunctionDataSource.m in Sources */, + C38A0A221A461E8C00D45436 /* _CPTAnimationCGPointPeriod.m in Sources */, + C38A0A2B1A461EA600D45436 /* _CPTAnimationNSDecimalPeriod.m in Sources */, + C38A0A741A4620E200D45436 /* CPTLineCap.m in Sources */, + C38A0AD01A46256600D45436 /* CPTBarPlot.m in Sources */, + C38A0A071A461D4500D45436 /* CPTLayer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C38A09C01A4619A900D45436 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C38A09D41A461C1900D45436 /* CPTDataSourceTestCase.m in Sources */, + C38A0ADE1A4625CA00D45436 /* CPTAxisLabelTests.m in Sources */, + C38A09EB1A461CBB00D45436 /* CPTNumericDataTypeConversionTests.m in Sources */, + C38A0A8D1A46210A00D45436 /* CPTColorSpaceTests.m in Sources */, + C38A0A8F1A46210A00D45436 /* CPTGradientTests.m in Sources */, + C38A09D21A461C1300D45436 /* CPTTestCase.m in Sources */, + C38A0ABE1A46250C00D45436 /* CPTPlotSpaceTests.m in Sources */, + C38A0AD91A46257700D45436 /* CPTScatterPlotTests.m in Sources */, + C38A0A041A461D3200D45436 /* CPTUtilitiesTests.m in Sources */, + C38A0B151A46262000D45436 /* CPTThemeTests.m in Sources */, + C38A0A901A46210A00D45436 /* CPTImageTests.m in Sources */, + C38A0A911A46210A00D45436 /* CPTLineStyleTests.m in Sources */, + C38A0A021A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, + C38A0B171A46262000D45436 /* CPTDerivedXYGraph.m in Sources */, + C38A09E71A461CB300D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, + C38A0A8E1A46210A00D45436 /* CPTFillTests.m in Sources */, + C38A09E91A461CB700D45436 /* CPTNumericDataTests.m in Sources */, + C38A0ABF1A46250C00D45436 /* CPTXYPlotSpaceTests.m in Sources */, + C38A09E51A461CAE00D45436 /* CPTMutableNumericDataTests.m in Sources */, + C38A0B161A46262000D45436 /* CPTDarkGradientThemeTests.m in Sources */, + C38A0A131A461D6B00D45436 /* CPTLayerTests.m in Sources */, + C38A0A9C1A46219700D45436 /* CPTTimeFormatterTests.m in Sources */, + C38A0A511A461F3D00D45436 /* CPTTextStyleTests.m in Sources */, + C38A0A8C1A46210A00D45436 /* CPTColorTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -1561,6 +2563,16 @@ target = 8DC2EF4F0486A6940098B216 /* CorePlot */; targetProxy = 0730F6211094932900E95162 /* PBXContainerItemProxy */; }; + C38A09851A46185300D45436 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C38A09771A46185200D45436 /* CorePlot_iOS */; + targetProxy = C38A09841A46185300D45436 /* PBXContainerItemProxy */; + }; + C38A09C71A4619A900D45436 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */; + targetProxy = C38A09C61A4619A900D45436 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1572,24 +2584,16 @@ name = InfoPlist.strings; sourceTree = ""; }; - 4C993FF30F45EE2F00DC824F /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 4C993FF00F45EE1600DC824F /* English */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 0730F602109492D900E95162 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); @@ -1597,37 +2601,33 @@ GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; - INFOPLIST_FILE = "UnitTests-Info.plist"; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + INFOPLIST_FILE = "CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - OTHER_LDFLAGS = ( - "-framework", - Cocoa, - ); PRODUCT_NAME = UnitTests; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; }; name = Debug; }; 0730F603109492D900E95162 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", "$(DEVELOPER_FRAMEWORKS_DIR)", ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; - INFOPLIST_FILE = "UnitTests-Info.plist"; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + INFOPLIST_FILE = "CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - OTHER_LDFLAGS = ( - "-framework", - Cocoa, - ); PRODUCT_NAME = UnitTests; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; ZERO_LINK = NO; }; name = Release; @@ -1635,21 +2635,22 @@ 1DEB91AE08733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ""; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CorePlot_Prefix.pch; - INFOPLIST_FILE = Info.plist; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = CorePlot; + SDKROOT = macosx; SKIP_INSTALL = YES; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; WRAPPER_EXTENSION = framework; }; name = Debug; @@ -1657,19 +2658,21 @@ 1DEB91AF08733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ""; FRAMEWORK_VERSION = A; GCC_OPTIMIZATION_LEVEL = 3; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CorePlot_Prefix.pch; - INFOPLIST_FILE = Info.plist; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; PRODUCT_NAME = CorePlot; + SDKROOT = macosx; SKIP_INSTALL = YES; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; + VALIDATE_PRODUCT = YES; "VALID_ARCHS[sdk=*]" = "i386 x86_64"; WRAPPER_EXTENSION = framework; }; @@ -1683,26 +2686,12 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LINKER_DISPLAYS_MANGLED_NAMES = NO; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = ( - "-Weverything", - "-Wno-unused-parameter", - "-Wno-undef", - "-Wno-switch-enum", - "-Wno-float-equal", - "-Wno-padded", - "-Wno-dollar-in-identifier-extension", - "-Wno-custom-atomic-properties", - "-Wno-gnu", - "-Wno-assign-enum", - "-Wno-pedantic", - "-Wno-documentation", - ); OTHER_LDFLAGS = ""; RUN_CLANG_STATIC_ANALYZER = NO; - SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = NO; }; name = Debug; @@ -1715,25 +2704,11 @@ DEPLOYMENT_POSTPROCESSING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_PREPROCESSOR_DEFINITIONS = ""; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LINKER_DISPLAYS_MANGLED_NAMES = NO; MACOSX_DEPLOYMENT_TARGET = 10.7; - OTHER_CFLAGS = ( - "-Weverything", - "-Wno-unused-parameter", - "-Wno-undef", - "-Wno-switch-enum", - "-Wno-float-equal", - "-Wno-padded", - "-Wno-dollar-in-identifier-extension", - "-Wno-custom-atomic-properties", - "-Wno-gnu", - "-Wno-assign-enum", - "-Wno-pedantic", - "-Wno-documentation", - ); OTHER_LDFLAGS = ""; RUN_CLANG_STATIC_ANALYZER = NO; - SDKROOT = macosx; STRIP_INSTALLED_PRODUCT = YES; "VALID_ARCHS[sdk=*]" = ""; }; @@ -1765,6 +2740,385 @@ }; name = Release; }; + C38A098B1A46185300D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot_iOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALID_ARCHS = "arm64 armv7 armv7s"; + }; + name = Debug; + }; + C38A098C1A46185300D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot_iOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALIDATE_PRODUCT = YES; + VALID_ARCHS = "arm64 armv7 armv7s"; + "VALID_ARCHS[sdk=iphonesimulator*]" = "i386 x86_64"; + }; + name = Release; + }; + C38A098D1A46185300D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-framework", + XCTest, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Debug; + }; + C38A098E1A46185300D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-framework", + XCTest, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C38A09941A4618B600D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "Documentation-Mac copy"; + }; + name = Debug; + }; + C38A09951A4618B600D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "Documentation-Mac copy"; + ZERO_LINK = NO; + }; + name = Release; + }; + C38A09991A46193F00D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "Documentation-iOS copy"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + }; + name = Debug; + }; + C38A099A1A46193F00D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "Documentation-iOS copy"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + ZERO_LINK = NO; + }; + name = Release; + }; + C38A09CC1A4619A900D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; + INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + MACOSX_DEPLOYMENT_TARGET = ""; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALID_ARCHS = "arm64 armv7 armv7s"; + }; + name = Debug; + }; + C38A09CD1A4619A900D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; + INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + MACOSX_DEPLOYMENT_TARGET = ""; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALIDATE_PRODUCT = YES; + VALID_ARCHS = "arm64 armv7 armv7s"; + "VALID_ARCHS[sdk=*]" = "arm64 armv7 armv7s"; + "VALID_ARCHS[sdk=iphonesimulator*]" = "i386 x86_64"; + }; + name = Release; + }; + C38A09CF1A4619A900D45436 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-framework", + XCTest, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Debug; + }; + C38A09D01A4619A900D45436 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CorePlot_Prefix.pch; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-framework", + XCTest, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1795,7 +3149,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9021E4A10FC5C9FB00443472 /* Build configuration list for PBXAggregateTarget "Documentation" */ = { + 9021E4A10FC5C9FB00443472 /* Build configuration list for PBXAggregateTarget "Documentation-Mac" */ = { isa = XCConfigurationList; buildConfigurations = ( 9021E49F0FC5C9DD00443472 /* Debug */, @@ -1804,6 +3158,60 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A098B1A46185300D45436 /* Debug */, + C38A098C1A46185300D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A098D1A46185300D45436 /* Debug */, + C38A098E1A46185300D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C38A09931A4618B600D45436 /* Build configuration list for PBXAggregateTarget "Documentation-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A09941A4618B600D45436 /* Debug */, + C38A09951A4618B600D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C38A09981A46193F00D45436 /* Build configuration list for PBXAggregateTarget "Universal Library" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A09991A46193F00D45436 /* Debug */, + C38A099A1A46193F00D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C38A09CB1A4619A900D45436 /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A09CC1A4619A900D45436 /* Debug */, + C38A09CD1A4619A900D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C38A09CE1A4619A900D45436 /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouchTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C38A09CF1A4619A900D45436 /* Debug */, + C38A09D01A4619A900D45436 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; diff --git a/framework/UnitTests-Info.plist b/framework/CorePlotTests-Info.plist similarity index 100% rename from framework/UnitTests-Info.plist rename to framework/CorePlotTests-Info.plist diff --git a/framework/CorePlot_Prefix.pch b/framework/CorePlot_Prefix.pch index 90cccac65..b5e735ebf 100644 --- a/framework/CorePlot_Prefix.pch +++ b/framework/CorePlot_Prefix.pch @@ -1,5 +1,5 @@ // -// Prefix header for all source files of the 'CorePlot' target in the 'CorePlot' project. +// Prefix header for all source files in the 'CorePlot' project. // #ifdef __OBJC__ diff --git a/framework/CorePlot_iOS-Info.plist b/framework/CorePlot_iOS-Info.plist new file mode 100644 index 000000000..06f3d09a5 --- /dev/null +++ b/framework/CorePlot_iOS-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/framework/CorePlot_iOS.h b/framework/CorePlot_iOS.h new file mode 100644 index 000000000..0e075375d --- /dev/null +++ b/framework/CorePlot_iOS.h @@ -0,0 +1,68 @@ +#import +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/framework/English.lproj/MainMenu.xib b/framework/English.lproj/MainMenu.xib deleted file mode 100644 index d208a6d34..000000000 --- a/framework/English.lproj/MainMenu.xib +++ /dev/null @@ -1,3098 +0,0 @@ - - - - 1050 - 9G55 - 670 - 949.43 - 353.00 - - YES - - - - - YES - com.apple.InterfaceBuilderKit - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AMainMenu - - YES - - - NewApplication - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - NewApplication - - YES - - - About NewApplication - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - UHJlZmVyZW5jZXPigKY - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Services - - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 2147483647 - - - - - - Hide NewApplication - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit NewApplication - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - T3BlbuKApg - o - 1048576 - 2147483647 - - - - - - Open Recent - - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - U2F2ZSBBc+KApg - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - UHJpbnTigKY - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Find - - 2147483647 - - - submenuAction: - - Find - - YES - - - RmluZOKApg - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - U2hvdyBTcGVsbGluZ+KApg - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 2147483647 - - - - - - Check Grammar With Spelling - - 2147483647 - - - - - - - - - Substitutions - - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 2147483647 - - - - - - Stop Speaking - - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Q3VzdG9taXplIFRvb2xiYXLigKY - - 2147483647 - - - - - - - - - Window - - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bring All to Front - - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - NewApplication Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 15 - 2 - {{196, 240}, {480, 270}} - 603979776 - Window - NSWindow - - {3.40282e+38, 3.40282e+38} - - - 256 - {480, 270} - - - {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 369 - - - - hideOtherApplications: - - - - 370 - - - - unhideAllApplications: - - - - 372 - - - - addFontTrait: - - - - 420 - - - - addFontTrait: - - - - 421 - - - - modifyFont: - - - - 422 - - - - orderFrontFontPanel: - - - - 423 - - - - modifyFont: - - - - 424 - - - - raiseBaseline: - - - - 425 - - - - lowerBaseline: - - - - 426 - - - - copyFont: - - - - 427 - - - - subscript: - - - - 428 - - - - superscript: - - - - 429 - - - - tightenKerning: - - - - 430 - - - - underline: - - - - 431 - - - - orderFrontColorPanel: - - - - 432 - - - - useAllLigatures: - - - - 433 - - - - loosenKerning: - - - - 434 - - - - pasteFont: - - - - 435 - - - - unscript: - - - - 436 - - - - useStandardKerning: - - - - 437 - - - - useStandardLigatures: - - - - 438 - - - - turnOffLigatures: - - - - 439 - - - - turnOffKerning: - - - - 440 - - - - alignLeft: - - - - 441 - - - - alignJustified: - - - - 442 - - - - copyRuler: - - - - 443 - - - - alignCenter: - - - - 444 - - - - toggleRuler: - - - - 445 - - - - alignRight: - - - - 446 - - - - pasteRuler: - - - - 447 - - - - terminate: - - - - 448 - - - - - YES - - 0 - - YES - - - - - - -2 - - - RmlsZSdzIE93bmVyA - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - - - 80 - - - - - 78 - - - - - 72 - - - - - 82 - - - - - 124 - - - YES - - - - - - 77 - - - - - 73 - - - - - 79 - - - 7 - - - 112 - - - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 367 - - - YES - - - - - - 368 - - - - - 373 - - - - - 375 - - - YES - - - - - - 376 - - - YES - - - - - - - 377 - - - YES - - - - - - 378 - - - YES - - - - - - 379 - - - YES - - - - - - - - - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - - - 387 - - - - - 388 - - - YES - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - YES - - - - - - 398 - - - YES - - - - - - 399 - - - YES - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - YES - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - YES - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - YES - - - - - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBEditorWindowLastContentRect - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBEditorWindowLastContentRect - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBEditorWindowLastContentRect - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBEditorWindowLastContentRect - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBEditorWindowLastContentRect - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBEditorWindowLastContentRect - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBEditorWindowLastContentRect - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBEditorWindowLastContentRect - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBEditorWindowLastContentRect - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 367.IBEditorWindowLastContentRect - 367.IBPluginDependency - 367.IBWindowTemplateEditedContentRect - 367.NSWindowTemplate.visibleAtLaunch - 367.editorWindowContentRectSynchronizationRect - 367.windowTemplate.maxSize - 368.IBPluginDependency - 375.IBPluginDependency - 376.IBEditorWindowLastContentRect - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 387.IBPluginDependency - 388.IBEditorWindowLastContentRect - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 418.IBPluginDependency - 419.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilderKit - com.apple.InterfaceBuilderKit - com.apple.InterfaceBuilder.CocoaPlugin - - {{523, 629}, {216, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{596, 852}, {216, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{449, 589}, {132, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{509, 573}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{535, 389}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{292, 409}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{365, 632}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{535, 389}, {153, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{681, 376}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{452, 579}, {197, 73}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{525, 802}, {197, 73}} - {{106, 652}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{11, 977}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - {{402, 609}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - {{475, 832}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{535, 389}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{107, 350}, {480, 270}} - com.apple.InterfaceBuilder.CocoaPlugin - {{107, 350}, {480, 270}} - - {{11, 666}, {480, 270}} - {3.40282e+38, 3.40282e+38} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{336, 609}, {86, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{422, 369}, {178, 283}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{118, 469}, {245, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{23, 794}, {245, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{250, 449}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{323, 672}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 448 - - - - YES - - GTMLargeTypeWindow - NSPanel - - copy: - id - - - IBProjectSource - ../google-toolbox-mac-trunk/AppKit/GTMLargeTypeWindow.h - - - - NSApplication - - IBProjectSource - ../google-toolbox-mac-trunk/UnitTesting/GTMAppKit+UnitTesting.h - - - - NSControl - - - - NSMenu - - - - NSMenuItem - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/AppKit/GTMCarbonEvent.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/AppKit/GTMDelegatingTableColumn.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/Foundation/GTMHTTPServer.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/Foundation/GTMNSAppleEventDescriptor+Foundation.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/Foundation/GTMNSObject+KeyValueObserving.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/UnitTesting/GTMCALayer+UnitTesting.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/UnitTesting/GTMNSObject+BindingUnitTesting.h - - - - NSObject - - IBProjectSource - ../google-toolbox-mac-trunk/UnitTesting/GTMNSObject+UnitTesting.h - - - - NSView - - - - NSWindow - - - - - 0 - ../CorePlot.xcodeproj - 3 - - diff --git a/framework/Source/CPTColorSpaceTests.m b/framework/Source/CPTColorSpaceTests.m index ad7fbdab4..93ebc4f08 100644 --- a/framework/Source/CPTColorSpaceTests.m +++ b/framework/Source/CPTColorSpaceTests.m @@ -16,10 +16,16 @@ -(void)testKeyedArchivingRoundTrip CFDataRef iccProfile = CGColorSpaceCopyICCProfile(colorSpace.cgColorSpace); CFDataRef newIccProfile = CGColorSpaceCopyICCProfile(newColorSpace.cgColorSpace); - XCTAssertTrue([(__bridge NSData *)iccProfile isEqualToData: (__bridge NSData *)newIccProfile], @"Color spaces not equal"); - - CFRelease(iccProfile); - CFRelease(newIccProfile); + if ( iccProfile && newIccProfile ) { + XCTAssertTrue([(__bridge NSData *)iccProfile isEqualToData: (__bridge NSData *)newIccProfile], @"Color spaces not equal"); + } + + if ( iccProfile ) { + CFRelease(iccProfile); + } + if ( newIccProfile ) { + CFRelease(newIccProfile); + } } @end diff --git a/framework/Source/CPTFillTests.m b/framework/Source/CPTFillTests.m index d00a96609..c0acf4d02 100644 --- a/framework/Source/CPTFillTests.m +++ b/framework/Source/CPTFillTests.m @@ -60,10 +60,15 @@ -(void)testKeyedArchivingRoundTripImage const size_t width = 100; const size_t height = 100; - size_t bytesPerRow = (4 * width + 15) & ~15ul; + size_t bytesPerRow = (4 * width + 15) & ~15ul; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); +#else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast); - CGImageRef cgImage = CGBitmapContextCreateImage(context); +#endif + CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast); + CGImageRef cgImage = CGBitmapContextCreateImage(context); CPTImage *image = [CPTImage imageWithCGImage:cgImage]; diff --git a/framework/Source/CPTImageTests.m b/framework/Source/CPTImageTests.m index a6e8d6c9a..d17af8461 100644 --- a/framework/Source/CPTImageTests.m +++ b/framework/Source/CPTImageTests.m @@ -12,10 +12,15 @@ -(void)testKeyedArchivingRoundTrip const size_t width = 100; const size_t height = 100; - size_t bytesPerRow = (4 * width + 15) & ~15ul; + size_t bytesPerRow = (4 * width + 15) & ~15ul; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); +#else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); - CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast); - CGImageRef cgImage = CGBitmapContextCreateImage(context); +#endif + CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast); + CGImageRef cgImage = CGBitmapContextCreateImage(context); CPTImage *image = [CPTImage imageWithCGImage:cgImage]; diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 45c9a15f0..014a0658f 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -110,7 +110,7 @@ -(void)testArchivingRoundTrip dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - CPTNumericData *nd2 = [NSUnarchiver unarchiveObjectWithData:[NSArchiver archivedDataWithRootObject:nd]]; + CPTNumericData *nd2 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:nd]]; XCTAssertTrue([nd.data isEqualToData:nd2.data], @"equal data"); diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index c5aca0e99..e23848a98 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -62,6 +62,8 @@ @interface CPTPlot() @property (nonatomic, readwrite, assign) NSUInteger cachedDataCount; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; +@property (nonatomic, readonly, assign) NSUInteger numberOfRecords; + -(CPTMutableNumericData *)numericDataForNumbers:(id)numbers; -(void)setCachedDataType:(CPTNumericDataType)newDataType; -(void)updateContentAnchorForLabel:(CPTPlotSpaceAnnotation *)label; @@ -239,6 +241,8 @@ @implementation CPTPlot **/ @synthesize pointingDeviceDownLabelIndex; +@dynamic numberOfRecords; + #pragma mark - #pragma mark Init/Dealloc @@ -514,6 +518,17 @@ -(void)layoutSublayers #pragma mark - #pragma mark Data Source +/// @cond + +-(NSUInteger)numberOfRecords +{ + id theDataSource = self.dataSource; + + return [theDataSource numberOfRecordsForPlot:self]; +} + +/// @endcond + /** * @brief Marks the receiver as needing the data source reloaded before the content is next drawn. **/ @@ -530,8 +545,7 @@ -(void)reloadData [self.cachedData removeAllObjects]; self.cachedDataCount = 0; - id theDataSource = self.dataSource; - [self reloadDataInIndexRange:NSMakeRange(0, [theDataSource numberOfRecordsForPlot:self])]; + [self reloadDataInIndexRange:NSMakeRange(0, self.numberOfRecords)]; } /** @@ -549,9 +563,7 @@ -(void)reloadDataIfNeeded **/ -(void)reloadDataInIndexRange:(NSRange)indexRange { - id theDataSource = (id)self.dataSource; - - NSParameterAssert(NSMaxRange(indexRange) <= [theDataSource numberOfRecordsForPlot:self]); + NSParameterAssert(NSMaxRange(indexRange) <= self.numberOfRecords); self.dataNeedsReloading = NO; diff --git a/framework/Source/CPTTimeFormatterTests.m b/framework/Source/CPTTimeFormatterTests.m index 0f30f4bba..fbcf5b822 100644 --- a/framework/Source/CPTTimeFormatterTests.m +++ b/framework/Source/CPTTimeFormatterTests.m @@ -9,9 +9,10 @@ @implementation CPTTimeFormatterTests -(void)testKeyedArchivingRoundTrip { - NSDate *refDate = [NSDate dateWithNaturalLanguageString:@"12:00 Oct 29, 2009"]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + NSDate *refDate = [dateFormatter dateFromString:@"12:00 Oct 29, 2009"]; + dateFormatter.dateStyle = NSDateFormatterShortStyle; CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter]; diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index d7ff0d977..8107d0c51 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -806,11 +806,7 @@ CGPoint CPTAlignPointToUserSpace(CGContextRef context, CGPoint point) // Ensure that coordinates are at exactly the corner // of a device pixel. point.x = round( point.x - CPTFloat(0.5) ) + CPTFloat(0.5); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - point.y = round( point.y - CPTFloat(0.5) ) + CPTFloat(0.5); -#else point.y = ceil(point.y) - CPTFloat(0.5); -#endif // Convert the device aligned coordinate back to user space. return CGContextConvertPointToUserSpace(context, point); @@ -860,14 +856,8 @@ CGRect CPTAlignRectToUserSpace(CGContextRef context, CGRect rect) rect.size.width = round( oldOrigin.x + rect.size.width - CPTFloat(0.5) ) - rect.origin.x; rect.origin.x += CPTFloat(0.5); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - rect.origin.y = round( rect.origin.y - CPTFloat(0.5) ); - rect.size.height = round( oldOrigin.y + rect.size.height - CPTFloat(0.5) ) - rect.origin.y; - rect.origin.y += CPTFloat(0.5); -#else rect.origin.y = ceil( CGRectGetMaxY(rect) ) - CPTFloat(0.5); rect.size.height = ceil(oldOrigin.y - CPTFloat(0.5) - rect.origin.y); -#endif return CGContextConvertRectToUserSpace(context, rect); } @@ -889,11 +879,7 @@ CGPoint CPTAlignIntegralPointToUserSpace(CGContextRef context, CGPoint point) point = CGContextConvertPointToDeviceSpace(context, point); point.x = round(point.x); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - point.y = round(point.y); -#else point.y = ceil( point.y - CPTFloat(0.5) ); -#endif return CGContextConvertPointToUserSpace(context, point); } @@ -917,13 +903,8 @@ CGRect CPTAlignIntegralRectToUserSpace(CGContextRef context, CGRect rect) rect.origin.x = round(rect.origin.x); rect.size.width = round(oldOrigin.x + rect.size.width) - rect.origin.x; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - rect.origin.y = round(rect.origin.y); - rect.size.height = round(oldOrigin.y + rect.size.height) - rect.origin.y; -#else rect.origin.y = ceil( CGRectGetMaxY(rect) - CPTFloat(0.5) ); rect.size.height = ceil(oldOrigin.y - CPTFloat(0.5) - rect.origin.y); -#endif return CGContextConvertRectToUserSpace(context, rect); } diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index e722f3efb..119baa1c9 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -15,7 +15,11 @@ -(void)setUp const size_t height = 50; const size_t bitsPerComponent = 8; +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); +#else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); +#endif self.context = CGBitmapContextCreate(NULL, width, diff --git a/framework/main-cocoatouch.m b/framework/main-cocoatouch.m deleted file mode 100644 index 3ec8dc854..000000000 --- a/framework/main-cocoatouch.m +++ /dev/null @@ -1,16 +0,0 @@ -// -// main.m -// CorePlot-CocoaTouch -// -// Created by Brad Larson on 5/11/2009. - -#import - -int main(int argc, char *argv[]) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - int retVal = UIApplicationMain(argc, argv, nil, nil); - - [pool release]; - return retVal; -} diff --git a/framework/main.m b/framework/main.m deleted file mode 100644 index 60bedbdde..000000000 --- a/framework/main.m +++ /dev/null @@ -1,22 +0,0 @@ -// -// main.m -// CorePlot -// -// Created by Barry Wark on 2/11/09. -// Copyright 2009 Barry Wark. All rights reserved. -// - -#import "GTMUnitTestingUtilities.h" - -void GTMRestoreColorProfile(void); - -int main(int argc, char *argv[]) -{ - //configure environment for standard unit testing - [GTMUnitTestingUtilities setUpForUIUnitTestsIfBeingTested]; - - return NSApplicationMain(argc, (const char **)argv); - - //setUpForUIUnitTestsIfBeingTested modifies the system-wide color profile. Make sure it gets restored. - GTMRestoreColorProfile(); -} From dffc17e12a2ab1328e63c101d86d33c659baa4f4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Jan 2015 16:50:55 -0500 Subject: [PATCH 029/429] Updated all iOS example apps to use the combined Core Plot project file. Changed the Plot Gallery app to use the iOS framework. --- .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 115 ++++++++++++---- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 115 ++++++++++++---- .../project.pbxproj | 115 ++++++++++++---- .../project.pbxproj | 62 ++++++++- .../project.pbxproj | 129 +++++++++++++----- .../src/ios/ThemeTableViewController.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.h | 2 +- .../StockPlot.xcodeproj/project.pbxproj | 115 ++++++++++++---- 8 files changed, 505 insertions(+), 150 deletions(-) diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index edea0af13..cd9c39f8f 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -22,29 +22,57 @@ 289233AF0DB2D0DB0083E9F9 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 289233AB0DB2D0DB0083E9F9 /* RootViewController.m */; }; 289233B00DB2D0DB0083E9F9 /* FlipsideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 289233AD0DB2D0DB0083E9F9 /* FlipsideViewController.m */; }; AB8989470FE0309E00FDC37F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8989460FE0309E00FDC37F /* QuartzCore.framework */; }; - AB8F944A0FDEF5DC00E61485 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AB8F94490FDEF56700E61485 /* libCorePlot-CocoaTouch.a */; }; AB8F94580FDEFA1500E61485 /* APYahooDataPuller.m in Sources */ = {isa = PBXBuildFile; fileRef = AB8F94570FDEFA1500E61485 /* APYahooDataPuller.m */; }; ABA5345E0FEB40CE0046A8DA /* AAPL.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABA5345D0FEB40CE0046A8DA /* AAPL.plist */; }; C3CD283017DE9B9C008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD282F17DE9B9C008EED1E /* Accelerate.framework */; }; C3D3936C19FD6B1D00148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3936B19FD6B1D00148319 /* Images.xcassets */; }; + C3D414941A7D838200B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414911A7D836300B6F5D6 /* libCorePlot-CocoaTouch.a */; }; C3F0BA3919EC9F6300F7CB47 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C3F0BA3819EC9F6300F7CB47 /* Launch Screen.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - AB8F94480FDEF56700E61485 /* PBXContainerItemProxy */ = { + C3D414881A7D836300B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = AB8F94440FDEF56700E61485 /* CorePlot-CocoaTouch.xcodeproj */; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = CorePlot; + }; + C3D4148A1A7D836300B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0730F600109492D800E95162; + remoteInfo = UnitTests; + }; + C3D4148C1A7D836300B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3D4148E1A7D836300B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; }; - AB8F944B0FDEF5E000E61485 /* PBXContainerItemProxy */ = { + C3D414901A7D836300B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = AB8F94440FDEF56700E61485 /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3D414921A7D836300B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -63,7 +91,7 @@ 288765580DF743DE002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 289233A20DB2D0840083E9F9 /* FlipsideView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlipsideView.h; path = Classes/FlipsideView.h; sourceTree = ""; }; 289233A30DB2D0840083E9F9 /* FlipsideView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FlipsideView.m; path = Classes/FlipsideView.m; sourceTree = ""; }; - 289233A80DB2D0DB0083E9F9 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + 289233A80DB2D0DB0083E9F9 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 289233A90DB2D0DB0083E9F9 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; 289233AA0DB2D0DB0083E9F9 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 289233AB0DB2D0DB0083E9F9 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; @@ -73,13 +101,13 @@ 32CA4F630368D1EE00C91783 /* AAPLot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLot_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB8989460FE0309E00FDC37F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - AB8F94440FDEF56700E61485 /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; AB8F94560FDEFA1500E61485 /* APYahooDataPuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APYahooDataPuller.h; sourceTree = ""; }; AB8F94570FDEFA1500E61485 /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APYahooDataPuller.m; sourceTree = ""; }; ABA5345D0FEB40CE0046A8DA /* AAPL.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AAPL.plist; sourceTree = ""; }; C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD282F17DE9B9C008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936B19FD6B1D00148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AAPLot/Images.xcassets; sourceTree = ""; }; + C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; C3F0BA3819EC9F6300F7CB47 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -91,9 +119,9 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765590DF743DE002DB57D /* CoreGraphics.framework in Frameworks */, - AB8F944A0FDEF5DC00E61485 /* libCorePlot-CocoaTouch.a in Frameworks */, AB8989470FE0309E00FDC37F /* QuartzCore.framework in Frameworks */, C3CD283017DE9B9C008EED1E /* Accelerate.framework in Frameworks */, + C3D414941A7D838200B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -160,7 +188,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - AB8F94440FDEF56700E61485 /* CorePlot-CocoaTouch.xcodeproj */, + C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */, 289233A00DB2D0730083E9F9 /* Main View */, 0737034D0FE518E7006D46AD /* Data Acquisition */, 281C6CD70DB2D82200F60ACC /* Flipside View */, @@ -208,10 +236,15 @@ name = Frameworks; sourceTree = ""; }; - AB8F94450FDEF56700E61485 /* Products */ = { + C3D4147D1A7D836300B6F5D6 /* Products */ = { isa = PBXGroup; children = ( - AB8F94490FDEF56700E61485 /* libCorePlot-CocoaTouch.a */, + C3D414891A7D836300B6F5D6 /* CorePlot.framework */, + C3D4148B1A7D836300B6F5D6 /* UnitTests.xctest */, + C3D4148D1A7D836300B6F5D6 /* CorePlot_iOS.framework */, + C3D4148F1A7D836300B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414911A7D836300B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D414931A7D836300B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -230,7 +263,6 @@ buildRules = ( ); dependencies = ( - AB8F944C0FDEF5E000E61485 /* PBXTargetDependency */, ); name = AAPLot; productName = AAPLot; @@ -260,8 +292,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = AB8F94450FDEF56700E61485 /* Products */; - ProjectRef = AB8F94440FDEF56700E61485 /* CorePlot-CocoaTouch.xcodeproj */; + ProductGroup = C3D4147D1A7D836300B6F5D6 /* Products */; + ProjectRef = C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */; }, ); projectRoot = ""; @@ -272,11 +304,46 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - AB8F94490FDEF56700E61485 /* libCorePlot-CocoaTouch.a */ = { + C3D414891A7D836300B6F5D6 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3D414881A7D836300B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4148B1A7D836300B6F5D6 /* UnitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = UnitTests.xctest; + remoteRef = C3D4148A1A7D836300B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4148D1A7D836300B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D4148C1A7D836300B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4148F1A7D836300B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D4148E1A7D836300B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414911A7D836300B6F5D6 /* libCorePlot-CocoaTouch.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; - remoteRef = AB8F94480FDEF56700E61485 /* PBXContainerItemProxy */; + remoteRef = C3D414901A7D836300B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414931A7D836300B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D414921A7D836300B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -316,14 +383,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - AB8F944C0FDEF5E000E61485 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = AB8F944B0FDEF5E000E61485 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index a3532eb9e..4fcc887f7 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -15,30 +15,58 @@ 2899E5220DE3E06400AC0155 /* CPTTestApp_iPadViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* CPTTestApp_iPadViewController.xib */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 28D7ACF80DDB3853001CB0EB /* CPTTestApp_iPadViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* CPTTestApp_iPadViewController.m */; }; - BC65753F11653FC60008F594 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC65753611653F8A0008F594 /* libCorePlot-CocoaTouch.a */; }; BC65758F116549890008F594 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC65758E116549890008F594 /* QuartzCore.framework */; }; C34677AE19F3341700429A85 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C34677AD19F3341700429A85 /* Launch Screen.xib */; }; C3CD283917DE9C59008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD283817DE9C59008EED1E /* Accelerate.framework */; }; C3D3936019FD670400148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3935F19FD670400148319 /* Images.xcassets */; }; + C3D414AD1A7D844400B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414AA1A7D843800B6F5D6 /* libCorePlot-CocoaTouch.a */; }; C3F47B6E17BF99DE0075181F /* CorePlotIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = C3F47B6C17BF99DE0075181F /* CorePlotIcon.png */; }; C3F47B6F17BF99DE0075181F /* CorePlotIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C3F47B6D17BF99DE0075181F /* CorePlotIcon@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC65753511653F8A0008F594 /* PBXContainerItemProxy */ = { + C3D414A11A7D843800B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC65753011653F8A0008F594 /* CorePlot-CocoaTouch.xcodeproj */; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = CorePlot; + }; + C3D414A31A7D843800B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0730F600109492D800E95162; + remoteInfo = UnitTests; + }; + C3D414A51A7D843800B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3D414A71A7D843800B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; }; - BC65753711653FA50008F594 /* PBXContainerItemProxy */ = { + C3D414A91A7D843800B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC65753011653F8A0008F594 /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3D414AB1A7D843800B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -50,17 +78,17 @@ 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 2899E5210DE3E06400AC0155 /* CPTTestApp_iPadViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CPTTestApp_iPadViewController.xib; sourceTree = ""; }; 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; - 28D7ACF60DDB3853001CB0EB /* CPTTestApp_iPadViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPadViewController.h; sourceTree = ""; }; + 28D7ACF60DDB3853001CB0EB /* CPTTestApp_iPadViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTestApp_iPadViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 28D7ACF70DDB3853001CB0EB /* CPTTestApp_iPadViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestApp_iPadViewController.m; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* CPTTestApp_iPad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPad_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* CPTTestApp_iPad-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CPTTestApp_iPad-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - BC65753011653F8A0008F594 /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; BC65758E116549890008F594 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; C34677AD19F3341700429A85 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD283817DE9C59008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3935F19FD670400148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "CPTTestApp-iPad/Images.xcassets"; sourceTree = ""; }; + C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; C3F47B6C17BF99DE0075181F /* CorePlotIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CorePlotIcon.png; sourceTree = ""; }; C3F47B6D17BF99DE0075181F /* CorePlotIcon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "CorePlotIcon@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -73,9 +101,9 @@ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, - BC65753F11653FC60008F594 /* libCorePlot-CocoaTouch.a in Frameworks */, BC65758F116549890008F594 /* QuartzCore.framework in Frameworks */, C3CD283917DE9C59008EED1E /* Accelerate.framework in Frameworks */, + C3D414AD1A7D844400B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -104,7 +132,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - BC65753011653F8A0008F594 /* CorePlot-CocoaTouch.xcodeproj */, + C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */, 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, @@ -153,10 +181,15 @@ name = Frameworks; sourceTree = ""; }; - BC65753111653F8A0008F594 /* Products */ = { + C3D414961A7D843800B6F5D6 /* Products */ = { isa = PBXGroup; children = ( - BC65753611653F8A0008F594 /* libCorePlot-CocoaTouch.a */, + C3D414A21A7D843800B6F5D6 /* CorePlot.framework */, + C3D414A41A7D843800B6F5D6 /* UnitTests.xctest */, + C3D414A61A7D843800B6F5D6 /* CorePlot_iOS.framework */, + C3D414A81A7D843800B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414AA1A7D843800B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D414AC1A7D843800B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -175,7 +208,6 @@ buildRules = ( ); dependencies = ( - BC65753811653FA50008F594 /* PBXTargetDependency */, ); name = "CPTTestApp-iPad"; productName = "CPTTestApp-iPad"; @@ -204,8 +236,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC65753111653F8A0008F594 /* Products */; - ProjectRef = BC65753011653F8A0008F594 /* CorePlot-CocoaTouch.xcodeproj */; + ProductGroup = C3D414961A7D843800B6F5D6 /* Products */; + ProjectRef = C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */; }, ); projectRoot = ""; @@ -216,11 +248,46 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC65753611653F8A0008F594 /* libCorePlot-CocoaTouch.a */ = { + C3D414A21A7D843800B6F5D6 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3D414A11A7D843800B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414A41A7D843800B6F5D6 /* UnitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = UnitTests.xctest; + remoteRef = C3D414A31A7D843800B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414A61A7D843800B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D414A51A7D843800B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414A81A7D843800B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D414A71A7D843800B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414AA1A7D843800B6F5D6 /* libCorePlot-CocoaTouch.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; - remoteRef = BC65753511653F8A0008F594 /* PBXContainerItemProxy */; + remoteRef = C3D414A91A7D843800B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414AC1A7D843800B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D414AB1A7D843800B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -254,14 +321,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - BC65753811653FA50008F594 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = BC65753711653FA50008F594 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 6f71adb4d..cdd0017ca 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -26,24 +26,52 @@ C3B9F9D417503CDD001CCC50 /* BlueTexture.png in Resources */ = {isa = PBXBuildFile; fileRef = C3B9F9D317503CDD001CCC50 /* BlueTexture.png */; }; C3CD283E17DE9C95008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD283D17DE9C95008EED1E /* Accelerate.framework */; }; C3D3936419FD671100148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3936319FD671100148319 /* Images.xcassets */; }; - F7AE270A0FFFB61E001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */; }; + C3D414C61A7D847C00B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414C31A7D846500B6F5D6 /* libCorePlot-CocoaTouch.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - BC9B83B40FB8A9BC0035D8DA /* PBXContainerItemProxy */ = { + C3D414BA1A7D846500B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = CorePlot; + }; + C3D414BC1A7D846500B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0730F600109492D800E95162; + remoteInfo = UnitTests; + }; + C3D414BE1A7D846500B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3D414C01A7D846500B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; }; - BC9B83B60FB8A9C70035D8DA /* PBXContainerItemProxy */ = { + C3D414C21A7D846500B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3D414C41A7D846500B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -59,18 +87,18 @@ BC8166CD1100DD00006D898E /* 17-bar-chart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "17-bar-chart.png"; path = "GlyphishIcons/17-bar-chart.png"; sourceTree = ""; }; BC8166D11100DD6F006D898E /* 62-contrast.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "62-contrast.png"; path = "GlyphishIcons/62-contrast.png"; sourceTree = ""; }; BC9B81D90FB893F70035D8DA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; BC9B84350FB8B7110035D8DA /* ScatterPlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ScatterPlot.xib; sourceTree = ""; }; C34677B119F3345500429A85 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; C359603319CE34FB005CDFB9 /* BarChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarChartController.swift; sourceTree = ""; }; C359603419CE34FB005CDFB9 /* iPhoneAppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iPhoneAppDelegate.swift; sourceTree = ""; }; C359603519CE34FB005CDFB9 /* PieChartController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PieChartController.swift; sourceTree = ""; }; C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScatterPlotController.swift; sourceTree = ""; }; - C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CPTTestApp-iPhone-Bridging-Header.h"; sourceTree = ""; }; + C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "CPTTestApp-iPhone-Bridging-Header.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3B9F9D317503CDD001CCC50 /* BlueTexture.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueTexture.png; sourceTree = ""; }; C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD283D17DE9C95008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936319FD671100148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "CPTTestApp-iPhone/Images.xcassets"; sourceTree = ""; }; + C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -82,8 +110,8 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, BC9B81DA0FB893F70035D8DA /* QuartzCore.framework in Frameworks */, - F7AE270A0FFFB61E001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */, C3CD283E17DE9C95008EED1E /* Accelerate.framework in Frameworks */, + C3D414C61A7D847C00B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -112,7 +140,7 @@ 29B97314FDCFA39411CA2CEA /* CPTTestApp-iPhone */ = { isa = PBXGroup; children = ( - BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */, + C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */, 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, @@ -164,10 +192,15 @@ name = Frameworks; sourceTree = ""; }; - BC9B83B10FB8A9BC0035D8DA /* Products */ = { + C3D414AF1A7D846500B6F5D6 /* Products */ = { isa = PBXGroup; children = ( - BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */, + C3D414BB1A7D846500B6F5D6 /* CorePlot.framework */, + C3D414BD1A7D846500B6F5D6 /* UnitTests.xctest */, + C3D414BF1A7D846500B6F5D6 /* CorePlot_iOS.framework */, + C3D414C11A7D846500B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414C31A7D846500B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D414C51A7D846500B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -186,7 +219,6 @@ buildRules = ( ); dependencies = ( - BC9B83B70FB8A9C70035D8DA /* PBXTargetDependency */, ); name = "CPTTestApp-iPhone"; productName = "CPTTestApp-iPhone"; @@ -215,8 +247,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BC9B83B10FB8A9BC0035D8DA /* Products */; - ProjectRef = BC9B83B00FB8A9BC0035D8DA /* CorePlot-CocoaTouch.xcodeproj */; + ProductGroup = C3D414AF1A7D846500B6F5D6 /* Products */; + ProjectRef = C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */; }, ); projectRoot = ""; @@ -227,11 +259,46 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - BC9B83B50FB8A9BC0035D8DA /* libCorePlot-CocoaTouch.a */ = { + C3D414BB1A7D846500B6F5D6 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3D414BA1A7D846500B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414BD1A7D846500B6F5D6 /* UnitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = UnitTests.xctest; + remoteRef = C3D414BC1A7D846500B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414BF1A7D846500B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D414BE1A7D846500B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414C11A7D846500B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D414C01A7D846500B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414C31A7D846500B6F5D6 /* libCorePlot-CocoaTouch.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; - remoteRef = BC9B83B40FB8A9BC0035D8DA /* PBXContainerItemProxy */; + remoteRef = C3D414C21A7D846500B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414C51A7D846500B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D414C41A7D846500B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -270,14 +337,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - BC9B83B70FB8A9C70035D8DA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = BC9B83B60FB8A9C70035D8DA /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index 52953fd48..06c37effd 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -68,6 +68,34 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C3D4146E1A7D824700B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F35EC1D1236AE6E007C3389 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3D414701A7D824700B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F35EC1D1236AE6E007C3389 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3D414721A7D824700B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F35EC1D1236AE6E007C3389 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3D414741A7D824700B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F35EC1D1236AE6E007C3389 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -108,7 +136,7 @@ 4F22FFA312342D7C006BF615 /* VerticalBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VerticalBarChart.m; path = src/plots/VerticalBarChart.m; sourceTree = ""; }; 4F22FFAB12342DB1006BF615 /* PlotGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotGallery.h; path = src/shared/PlotGallery.h; sourceTree = ""; }; 4F22FFAC12342DB1006BF615 /* PlotGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotGallery.m; path = src/shared/PlotGallery.m; sourceTree = ""; }; - 4F22FFAD12342DB1006BF615 /* PlotItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotItem.h; path = src/shared/PlotItem.h; sourceTree = ""; }; + 4F22FFAD12342DB1006BF615 /* PlotItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = PlotItem.h; path = src/shared/PlotItem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4F22FFAE12342DB1006BF615 /* PlotItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotItem.m; path = src/shared/PlotItem.m; sourceTree = ""; }; 4F22FFE7123431D2006BF615 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 4F35EBBC12360D89007C3389 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Icon.icns; path = src/mac/Icon.icns; sourceTree = ""; }; @@ -328,6 +356,10 @@ children = ( 4F4892891290FFCD00EDB93F /* CorePlot.framework */, 4F48928B1290FFCD00EDB93F /* UnitTests.xctest */, + C3D4146F1A7D824700B6F5D6 /* CorePlot_iOS.framework */, + C3D414711A7D824700B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414731A7D824700B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D414751A7D824700B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -403,6 +435,34 @@ remoteRef = 4F48928A1290FFCD00EDB93F /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3D4146F1A7D824700B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D4146E1A7D824700B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414711A7D824700B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D414701A7D824700B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414731A7D824700B6F5D6 /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3D414721A7D824700B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414751A7D824700B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D414741A7D824700B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index a23ea54fe..97c433cd2 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 4F22FE4A123404C2006BF615 /* VerticalBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE45123404C2006BF615 /* VerticalBarChart.m */; }; 4F22FE6712340671006BF615 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE6612340671006BF615 /* main.m */; }; 4F22FE7B123406DF006BF615 /* ThemeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */; }; - 4F4892581290FAD100EDB93F /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F4892451290F96500EDB93F /* libCorePlot-CocoaTouch.a */; }; 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F5EBAC212297F2400D147E7 /* QuartzCore.framework */; }; 4F7541F3126B59A200313026 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F7541EF126B59A200313026 /* DetailViewController.m */; }; 4F8E1C6012907C1800D2035F /* DatePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C5F12907C1800D2035F /* DatePlot.m */; }; @@ -43,26 +42,55 @@ C3AC1411150EDEF300631001 /* CurvedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */; }; C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD282917DE9A7E008EED1E /* Accelerate.framework */; }; C3D2FE6919FF1D3E002CD4D6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */; }; + C3D4145F1A7D817B00B6F5D6 /* CorePlot_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */; }; C3D70BAC175EB30800F27173 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BAB175EB30800F27173 /* ImageDemo.m */; }; C3EF42F919FC753E0060791A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3EF42F819FC753E0060791A /* Images.xcassets */; }; C3F34F2A12AB25AE008FBDC3 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F2912AB25AE008FBDC3 /* DonutChart.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 4F4892441290F96500EDB93F /* PBXContainerItemProxy */ = { + C3D414531A7D817000B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 4F07461A1236B1CB0039593F /* CorePlot-CocoaTouch.xcodeproj */; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = CorePlot; + }; + C3D414551A7D817000B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0730F600109492D800E95162; + remoteInfo = UnitTests; }; - 4F4892561290FAB500EDB93F /* PBXContainerItemProxy */ = { + C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 4F07461A1236B1CB0039593F /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3D414591A7D817000B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3D4145B1A7D817000B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3D4145D1A7D817000B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -73,10 +101,9 @@ 28A0AAE50D9B0CCF005BE974 /* Plot_Gallery_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Plot_Gallery_Prefix.pch; sourceTree = ""; }; 4CBCB98814753D6F000C8951 /* CurvedScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CurvedScatterPlot.h; path = src/plots/CurvedScatterPlot.h; sourceTree = ""; }; 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 2; name = CurvedScatterPlot.m; path = src/plots/CurvedScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F07461A1236B1CB0039593F /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; 4F22FE3612340464006BF615 /* PlotGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotGallery.h; path = src/shared/PlotGallery.h; sourceTree = ""; }; 4F22FE3712340464006BF615 /* PlotGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotGallery.m; path = src/shared/PlotGallery.m; sourceTree = ""; }; - 4F22FE3812340464006BF615 /* PlotItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotItem.h; path = src/shared/PlotItem.h; sourceTree = ""; }; + 4F22FE3812340464006BF615 /* PlotItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = PlotItem.h; path = src/shared/PlotItem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4F22FE3912340464006BF615 /* PlotItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotItem.m; path = src/shared/PlotItem.m; sourceTree = ""; }; 4F22FE3C123404C2006BF615 /* CompositePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = CompositePlot.h; path = src/plots/CompositePlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4F22FE3D123404C2006BF615 /* CompositePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CompositePlot.m; path = src/plots/CompositePlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -90,7 +117,7 @@ 4F22FE45123404C2006BF615 /* VerticalBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VerticalBarChart.m; path = src/plots/VerticalBarChart.m; sourceTree = ""; }; 4F22FE6612340671006BF615 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = src/ios/main.m; sourceTree = ""; }; 4F22FE77123406DF006BF615 /* ThemeTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThemeTableViewController.h; path = src/ios/ThemeTableViewController.h; sourceTree = ""; }; - 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThemeTableViewController.m; path = src/ios/ThemeTableViewController.m; sourceTree = ""; }; + 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ThemeTableViewController.m; path = src/ios/ThemeTableViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4F5EBAC212297F2400D147E7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 4F7541EE126B59A200313026 /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailViewController.h; path = src/ios/DetailViewController.h; sourceTree = ""; }; 4F7541EF126B59A200313026 /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = DetailViewController.m; path = src/ios/DetailViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -132,6 +159,7 @@ C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD282917DE9A7E008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = img/Images.xcassets; sourceTree = ""; }; + C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; C3D70BAA175EB30800F27173 /* ImageDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImageDemo.h; path = src/plots/ImageDemo.h; sourceTree = ""; }; C3D70BAB175EB30800F27173 /* ImageDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ImageDemo.m; path = src/plots/ImageDemo.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3EF42F819FC753E0060791A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Plot Gallery-iOS/Images.xcassets"; sourceTree = ""; }; @@ -144,12 +172,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4F4892581290FAD100EDB93F /* libCorePlot-CocoaTouch.a in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */, C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */, + C3D4145F1A7D817B00B6F5D6 /* CorePlot_iOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -167,7 +195,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - 4F07461A1236B1CB0039593F /* CorePlot-CocoaTouch.xcodeproj */, + C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */, 4F22FE351234043F006BF615 /* Shared */, 4F22FE3112340417006BF615 /* iOS */, 4F5EBAFA1229818000D147E7 /* Plots */, @@ -228,14 +256,6 @@ name = Shared; sourceTree = ""; }; - 4F48923F1290F96500EDB93F /* Products */ = { - isa = PBXGroup; - children = ( - 4F4892451290F96500EDB93F /* libCorePlot-CocoaTouch.a */, - ); - name = Products; - sourceTree = ""; - }; 4F5EBAFA1229818000D147E7 /* Plots */ = { isa = PBXGroup; children = ( @@ -285,6 +305,19 @@ name = Plots; sourceTree = ""; }; + C3D414481A7D817000B6F5D6 /* Products */ = { + isa = PBXGroup; + children = ( + C3D414541A7D817000B6F5D6 /* CorePlot.framework */, + C3D414561A7D817000B6F5D6 /* UnitTests.xctest */, + C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */, + C3D4145A1A7D817000B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -299,7 +332,6 @@ buildRules = ( ); dependencies = ( - 4F4892571290FAB500EDB93F /* PBXTargetDependency */, ); name = "Plot Gallery-iOS"; productName = "Plot Gallery"; @@ -329,8 +361,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = 4F48923F1290F96500EDB93F /* Products */; - ProjectRef = 4F07461A1236B1CB0039593F /* CorePlot-CocoaTouch.xcodeproj */; + ProductGroup = C3D414481A7D817000B6F5D6 /* Products */; + ProjectRef = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; }, ); projectRoot = ""; @@ -341,11 +373,46 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - 4F4892451290F96500EDB93F /* libCorePlot-CocoaTouch.a */ = { + C3D414541A7D817000B6F5D6 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3D414531A7D817000B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414561A7D817000B6F5D6 /* UnitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = UnitTests.xctest; + remoteRef = C3D414551A7D817000B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4145A1A7D817000B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D414591A7D817000B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; - remoteRef = 4F4892441290F96500EDB93F /* PBXContainerItemProxy */; + remoteRef = C3D4145B1A7D817000B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D4145D1A7D817000B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -403,14 +470,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 4F4892571290FAB500EDB93F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = 4F4892561290FAB500EDB93F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index 935329c69..2399d41da 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -5,7 +5,7 @@ #import "ThemeTableViewController.h" -#import "CorePlot-CocoaTouch.h" +#import NSString *const kThemeTableViewControllerNoTheme = @"None"; NSString *const kThemeTableViewControllerDefaultTheme = @"Default"; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index ce18914dc..3ec475069 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -6,7 +6,7 @@ #import #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#import "CorePlot-CocoaTouch.h" +#import #import typedef CGRect CGNSRect; diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index 6606bfc71..62665d72e 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -28,24 +28,52 @@ C36157E919D79AAC0036ACDA /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C36157E819D79AAC0036ACDA /* Launch Screen.xib */; }; C3CD284817DE9D1F008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD284717DE9D1F008EED1E /* Accelerate.framework */; }; C3D3937019FD6CBF00148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3936F19FD6CBF00148319 /* Images.xcassets */; }; - F7AE27940FFFBB84001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F7AE27930FFFBB7A001F26F0 /* libCorePlot-CocoaTouch.a */; }; + C3D414DF1A7D84CC00B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414DC1A7D84BF00B6F5D6 /* libCorePlot-CocoaTouch.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - AB03631D0FEF304A007B09A9 /* PBXContainerItemProxy */ = { + C3D414D31A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = AB0363130FEF303D007B09A9 /* CorePlot-CocoaTouch.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = BC9B83460FB8A0A40035D8DA; - remoteInfo = "CorePlot-CocoaTouch"; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216; + remoteInfo = CorePlot; + }; + C3D414D51A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0730F600109492D800E95162; + remoteInfo = UnitTests; + }; + C3D414D71A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; }; - F7AE27920FFFBB7A001F26F0 /* PBXContainerItemProxy */ = { + C3D414D91A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = AB0363130FEF303D007B09A9 /* CorePlot-CocoaTouch.xcodeproj */; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; proxyType = 2; - remoteGlobalIDString = BC9B83470FB8A0A40035D8DA; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3D414DB1A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3D414DD1A7D84BF00B6F5D6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -62,14 +90,13 @@ 28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* StockPlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "StockPlot-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - AB0363130FEF303D007B09A9 /* CorePlot-CocoaTouch.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "CorePlot-CocoaTouch.xcodeproj"; path = "../../framework/CorePlot-CocoaTouch.xcodeproj"; sourceTree = SOURCE_ROOT; }; AB0364760FEF4603007B09A9 /* caution.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = caution.png; sourceTree = SOURCE_ROOT; }; AB4913C50FECC2B8008A08AB /* APYahooDataPuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = APYahooDataPuller.h; path = Classes/APYahooDataPuller.h; sourceTree = SOURCE_ROOT; }; AB4913C60FECC2B8008A08AB /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = APYahooDataPuller.m; path = Classes/APYahooDataPuller.m; sourceTree = SOURCE_ROOT; }; AB4913C70FECC2B8008A08AB /* NSDictionary+APFinancalData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+APFinancalData.m"; path = "Classes/NSDictionary+APFinancalData.m"; sourceTree = SOURCE_ROOT; }; AB6FA4A30FEB579B008DB04A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; AB6FA4DE0FEB59DB008DB04A /* NSDictionary+APFinancalData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APFinancalData.h"; sourceTree = ""; }; - AB6FA5560FEB6235008DB04A /* APYahooDataPullerGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APYahooDataPullerGraph.h; sourceTree = ""; }; + AB6FA5560FEB6235008DB04A /* APYahooDataPullerGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APYahooDataPullerGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; AB6FA5570FEB6235008DB04A /* APYahooDataPullerGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APYahooDataPullerGraph.m; sourceTree = ""; }; AB6FA5580FEB6235008DB04A /* APYahooDataPullerGraph.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = APYahooDataPullerGraph.xib; path = Classes/APYahooDataPullerGraph.xib; sourceTree = ""; }; AB6FA6090FEB6DAA008DB04A /* YHOO.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = YHOO.plist; sourceTree = SOURCE_ROOT; }; @@ -80,6 +107,7 @@ C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD284717DE9D1F008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936F19FD6CBF00148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = StockPlot/Images.xcassets; sourceTree = ""; }; + C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,12 +115,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F7AE27940FFFBB84001F26F0 /* libCorePlot-CocoaTouch.a in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, AB6FA4A40FEB579B008DB04A /* QuartzCore.framework in Frameworks */, C3CD284817DE9D1F008EED1E /* Accelerate.framework in Frameworks */, + C3D414DF1A7D84CC00B6F5D6 /* libCorePlot-CocoaTouch.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -127,7 +155,7 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( - AB0363130FEF303D007B09A9 /* CorePlot-CocoaTouch.xcodeproj */, + C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */, 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, @@ -180,10 +208,15 @@ name = Frameworks; sourceTree = ""; }; - AB0363140FEF303D007B09A9 /* Products */ = { + C3D414C81A7D84BF00B6F5D6 /* Products */ = { isa = PBXGroup; children = ( - F7AE27930FFFBB7A001F26F0 /* libCorePlot-CocoaTouch.a */, + C3D414D41A7D84BF00B6F5D6 /* CorePlot.framework */, + C3D414D61A7D84BF00B6F5D6 /* UnitTests.xctest */, + C3D414D81A7D84BF00B6F5D6 /* CorePlot_iOS.framework */, + C3D414DA1A7D84BF00B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414DC1A7D84BF00B6F5D6 /* libCorePlot-CocoaTouch.a */, + C3D414DE1A7D84BF00B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -202,7 +235,6 @@ buildRules = ( ); dependencies = ( - AB03631E0FEF304A007B09A9 /* PBXTargetDependency */, ); name = StockPlot; productName = StockPlot; @@ -232,8 +264,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = AB0363140FEF303D007B09A9 /* Products */; - ProjectRef = AB0363130FEF303D007B09A9 /* CorePlot-CocoaTouch.xcodeproj */; + ProductGroup = C3D414C81A7D84BF00B6F5D6 /* Products */; + ProjectRef = C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */; }, ); projectRoot = ""; @@ -244,11 +276,46 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - F7AE27930FFFBB7A001F26F0 /* libCorePlot-CocoaTouch.a */ = { + C3D414D41A7D84BF00B6F5D6 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3D414D31A7D84BF00B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414D61A7D84BF00B6F5D6 /* UnitTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = UnitTests.xctest; + remoteRef = C3D414D51A7D84BF00B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414D81A7D84BF00B6F5D6 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3D414D71A7D84BF00B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414DA1A7D84BF00B6F5D6 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3D414D91A7D84BF00B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414DC1A7D84BF00B6F5D6 /* libCorePlot-CocoaTouch.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; - remoteRef = F7AE27920FFFBB7A001F26F0 /* PBXContainerItemProxy */; + remoteRef = C3D414DB1A7D84BF00B6F5D6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3D414DE1A7D84BF00B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3D414DD1A7D84BF00B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -289,14 +356,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - AB03631E0FEF304A007B09A9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot-CocoaTouch"; - targetProxy = AB03631D0FEF304A007B09A9 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; From 62b1024cb61013f56041be2e9f6fa71c3ffbf543 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Jan 2015 16:58:20 -0500 Subject: [PATCH 030/429] Combined the framework header file so all clients can use the same one. --- .../src/ios/ThemeTableViewController.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.h | 2 +- framework/CorePlot.h | 75 +++++++++++++++++++ framework/CorePlot.xcodeproj/project.pbxproj | 6 +- framework/CorePlot_iOS.h | 68 ----------------- 5 files changed, 79 insertions(+), 74 deletions(-) delete mode 100644 framework/CorePlot_iOS.h diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index 2399d41da..b7a873ec1 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -5,7 +5,7 @@ #import "ThemeTableViewController.h" -#import +#import NSString *const kThemeTableViewControllerNoTheme = @"None"; NSString *const kThemeTableViewControllerDefaultTheme = @"Default"; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index 3ec475069..8a6d060ad 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -6,7 +6,7 @@ #import #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#import +#import #import typedef CGRect CGNSRect; diff --git a/framework/CorePlot.h b/framework/CorePlot.h index 2860628c2..3a7d0680e 100644 --- a/framework/CorePlot.h +++ b/framework/CorePlot.h @@ -1,3 +1,76 @@ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + +#import +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#else + #import #import @@ -66,3 +139,5 @@ #import #import #import + +#endif diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 3db3d2617..7308db2f7 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -173,7 +173,6 @@ C30550EE1399BE5400E0151F /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550EC1399BE5400E0151F /* CPTLegendEntry.m */; }; C318F4AD11EA188700595FF9 /* CPTLimitBand.h in Headers */ = {isa = PBXBuildFile; fileRef = C318F4AB11EA188700595FF9 /* CPTLimitBand.h */; settings = {ATTRIBUTES = (Public, ); }; }; C318F4AE11EA188700595FF9 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4AC11EA188700595FF9 /* CPTLimitBand.m */; }; - C3226A4A1A69EEDD00F77249 /* CorePlot_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3226A521A69F6DA00F77249 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A511A69F6DA00F77249 /* QuartzCore.framework */; }; C3226A541A69F6DF00F77249 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A531A69F6DF00F77249 /* UIKit.framework */; }; C3226A561A69F6F000F77249 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A551A69F6F000F77249 /* Accelerate.framework */; }; @@ -577,6 +576,7 @@ C3D414791A7D829D00B6F5D6 /* CPTNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D4147A1A7D82A500B6F5D6 /* CPTNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D4147B1A7D82AB00B6F5D6 /* CPTMutableNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CAFB241229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3D414E01A7D867200B6F5D6 /* CorePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3D68A5B1220B27D00EB4863 /* CPTUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */; }; C3D68A5C1220B29100EB4863 /* CPTTextStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */; }; C3D68A5E1220B2AC00EB4863 /* CPTXYPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */; }; @@ -806,7 +806,6 @@ C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = ""; }; - C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot_iOS.h; sourceTree = ""; }; C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlotTests-Info.plist"; sourceTree = SOURCE_ROOT; }; C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-iOSTests-Info.plist"; sourceTree = SOURCE_ROOT; }; C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-CocoaTouchTests-Info.plist"; sourceTree = SOURCE_ROOT; }; @@ -1360,7 +1359,6 @@ children = ( 32DBCF5E0370ADEE00C91783 /* CorePlot_Prefix.pch */, 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */, - C3226A491A69EEDD00F77249 /* CorePlot_iOS.h */, C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */, C31908A41998168C00B61898 /* CorePlot.xcconfig */, C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */, @@ -1820,7 +1818,6 @@ C38A0A611A4620D400D45436 /* CPTLineStyle.h in Headers */, C38A0A631A4620D400D45436 /* CPTPathExtensions.h in Headers */, C38A0A0B1A461D5100D45436 /* _CPTBorderLayer.h in Headers */, - C3226A4A1A69EEDD00F77249 /* CorePlot_iOS.h in Headers */, C3D414791A7D829D00B6F5D6 /* CPTNumericData.h in Headers */, C38A0A601A4620D400D45436 /* CPTLineCap.h in Headers */, C38A0A7C1A4620EF00D45436 /* _CPTFillGradient.h in Headers */, @@ -1865,6 +1862,7 @@ C38A0B021A46260B00D45436 /* _CPTSlateTheme.h in Headers */, C3D414781A7D829100B6F5D6 /* CPTMutableNumericData.h in Headers */, C38A0ADB1A4625B100D45436 /* CPTGridLineGroup.h in Headers */, + C3D414E01A7D867200B6F5D6 /* CorePlot.h in Headers */, C38A0A621A4620D400D45436 /* CPTMutableLineStyle.h in Headers */, C38A0A141A461E5000D45436 /* CPTAnimation.h in Headers */, C38A09F21A461CEE00D45436 /* CPTExceptions.h in Headers */, diff --git a/framework/CorePlot_iOS.h b/framework/CorePlot_iOS.h deleted file mode 100644 index 0e075375d..000000000 --- a/framework/CorePlot_iOS.h +++ /dev/null @@ -1,68 +0,0 @@ -#import -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import From 2d2acf7bd7fe1209fc7391fdd33c3490aa75075c Mon Sep 17 00:00:00 2001 From: Sean Holbert Date: Thu, 5 Feb 2015 23:51:36 -0800 Subject: [PATCH 031/429] Fixed issue where gestures in coreplot charts would make collection view cells no longer be selectable or highlight-able. --- framework/iPhoneOnly/CPTGraphHostingView.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index 925724714..a1c9c7d86 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -131,6 +131,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + [super touchesBegan:touches withEvent:event]; // Ignore pinch or other multitouch gestures if ( [[event allTouches] count] > 1 ) { return; @@ -158,6 +159,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { + [super touchesMoved: touches withEvent:event]; CPTGraph *theHostedGraph = self.hostedGraph; theHostedGraph.frame = self.bounds; @@ -180,6 +182,7 @@ -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + [super touchesEnded:touches withEvent:event]; CPTGraph *theHostedGraph = self.hostedGraph; theHostedGraph.frame = self.bounds; @@ -202,6 +205,7 @@ -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + [super touchesCancelled:touches withEvent:event]; BOOL handled = [self.hostedGraph pointingDeviceCancelledEvent:event]; if ( !handled ) { From 0eb88bfcdcce5f43a5aa26f30d85f1d1eac7d031 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 7 Feb 2015 15:10:55 -0500 Subject: [PATCH 032/429] Standardized code formatting. --- framework/iPhoneOnly/CPTGraphHostingView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index a1c9c7d86..7ee40fc63 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -159,7 +159,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - [super touchesMoved: touches withEvent:event]; + [super touchesMoved:touches withEvent:event]; CPTGraph *theHostedGraph = self.hostedGraph; theHostedGraph.frame = self.bounds; From 737282fbb8dd7ff74ecb0ae57cd0474bf6215210 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 7 Feb 2015 15:56:17 -0500 Subject: [PATCH 033/429] Adde Sean Holbert to the license file. --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 9a9a51b22..d6d9369cb 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, and Ingmar Stein. +Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, and Sean Holbert. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 1b27401a179ddfef67099b9d250e0293dfcebbc6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 7 Feb 2015 15:58:31 -0500 Subject: [PATCH 034/429] Standardized code formatting. --- framework/CorePlot.h | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/framework/CorePlot.h b/framework/CorePlot.h index 3a7d0680e..59b0bc9c4 100644 --- a/framework/CorePlot.h +++ b/framework/CorePlot.h @@ -24,6 +24,7 @@ #import #import #import +#import #import #import #import @@ -33,19 +34,19 @@ #import #import #import -#import #import +#import #import #import #import -#import -#import #import +#import +#import +#import #import +#import #import #import -#import -#import #import #import #import @@ -59,15 +60,14 @@ #import #import #import -#import #import #import +#import #import #import #import #import #import -#import #else @@ -95,6 +95,7 @@ #import #import #import +#import #import #import #import @@ -104,19 +105,19 @@ #import #import #import -#import #import +#import #import #import #import -#import -#import #import +#import +#import +#import #import +#import #import #import -#import -#import #import #import #import @@ -130,14 +131,12 @@ #import #import #import -#import #import #import +#import #import #import #import #import #import -#import - #endif From a5d03812b5ee980c201c67753e2b6390998565a8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 9 Feb 2015 20:08:06 -0500 Subject: [PATCH 035/429] Removed Objective-C files from the iPhone CPTTestApp that are no longer used. --- .../Classes/CPTTestAppBarChartController.m | 201 ---------------- .../Classes/CPTTestAppPieChartController.m | 214 ----------------- .../Classes/CPTTestAppScatterPlotController.m | 227 ------------------ .../Classes/CPTTestApp_iPhoneAppDelegate.m | 32 --- 4 files changed, 674 deletions(-) delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m delete mode 100644 examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m deleted file mode 100644 index 5e241b6f2..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppBarChartController.m +++ /dev/null @@ -1,201 +0,0 @@ -// -// CPTTestAppBarChartController.m -// CPTTestApp-iPhone -// - -#import "CPTTestAppBarChartController.h" - -@interface CPTTestAppBarChartController() - -@property (nonatomic, readwrite, strong) CPTXYGraph *barChart; - -@end - -#pragma mark - - -@implementation CPTTestAppBarChartController - -@synthesize timer; -@synthesize barChart; - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - [self timerFired]; -#ifdef MEMORY_TEST - self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self - selector:@selector(timerFired) userInfo:nil repeats:YES]; -#endif -} - --(void)timerFired -{ -#ifdef MEMORY_TEST - static NSUInteger counter = 0; - - NSLog(@"\n----------------------------\ntimerFired: %lu", counter++); -#endif - - // Create barChart from theme - CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [newGraph applyTheme:theme]; - self.barChart = newGraph; - - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = newGraph; - - // Border - newGraph.plotAreaFrame.borderLineStyle = nil; - newGraph.plotAreaFrame.cornerRadius = 0.0; - newGraph.plotAreaFrame.masksToBorder = NO; - - // Paddings - newGraph.paddingLeft = 0.0; - newGraph.paddingRight = 0.0; - newGraph.paddingTop = 0.0; - newGraph.paddingBottom = 0.0; - - newGraph.plotAreaFrame.paddingLeft = 70.0; - newGraph.plotAreaFrame.paddingTop = 55.0; - newGraph.plotAreaFrame.paddingRight = 20.0; - newGraph.plotAreaFrame.paddingBottom = 80.0; - - // Graph title - NSString *lineOne = @"Graph Title"; - NSString *lineTwo = @"Line 2"; - - BOOL hasAttributedStringAdditions = (&NSFontAttributeName != NULL) && - (&NSForegroundColorAttributeName != NULL) && - (&NSParagraphStyleAttributeName != NULL); - - if ( hasAttributedStringAdditions ) { - NSMutableAttributedString *graphTitle = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@", lineOne, lineTwo]]; - [graphTitle addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, lineOne.length)]; - [graphTitle addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(lineOne.length + 1, lineTwo.length)]; - NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.alignment = CPTTextAlignmentCenter; - [graphTitle addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, graphTitle.length)]; - UIFont *titleFont = [UIFont fontWithName:@"Helvetica-Bold" size:16.0]; - [graphTitle addAttribute:NSFontAttributeName value:titleFont range:NSMakeRange(0, lineOne.length)]; - titleFont = [UIFont fontWithName:@"Helvetica" size:12.0]; - [graphTitle addAttribute:NSFontAttributeName value:titleFont range:NSMakeRange(lineOne.length + 1, lineTwo.length)]; - - newGraph.attributedTitle = graphTitle; - } - else { - CPTMutableTextStyle *titleStyle = [CPTMutableTextStyle textStyle]; - titleStyle.color = [CPTColor whiteColor]; - titleStyle.fontName = @"Helvetica-Bold"; - titleStyle.fontSize = 16.0; - titleStyle.textAlignment = CPTTextAlignmentCenter; - - newGraph.title = [NSString stringWithFormat:@"%@\n%@", lineOne, lineTwo]; - newGraph.titleTextStyle = titleStyle; - } - - newGraph.titleDisplacement = CGPointMake(0.0, -20.0); - newGraph.titlePlotAreaFrameAnchor = CPTRectAnchorTop; - - // Add plot space for horizontal bar charts - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)newGraph.defaultPlotSpace; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(300.0)]; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.0) length:CPTDecimalFromDouble(16.0)]; - - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)newGraph.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.axisLineStyle = nil; - x.majorTickLineStyle = nil; - x.minorTickLineStyle = nil; - x.majorIntervalLength = CPTDecimalFromDouble(5.0); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - x.title = @"X Axis"; - x.titleLocation = CPTDecimalFromFloat(7.5f); - x.titleOffset = 55.0; - - // Define some custom labels for the data elements - x.labelRotation = CPTFloat(M_PI_4); - x.labelingPolicy = CPTAxisLabelingPolicyNone; - NSArray *customTickLocations = @[@1, @5, @10, @15]; - NSArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; - for ( NSNumber *tickLocation in customTickLocations ) { - CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; - newLabel.tickLocation = [tickLocation decimalValue]; - newLabel.offset = x.labelOffset + x.majorTickLength; - newLabel.rotation = CPTFloat(M_PI_4); - [customLabels addObject:newLabel]; - } - - x.axisLabels = customLabels; - - CPTXYAxis *y = axisSet.yAxis; - y.axisLineStyle = nil; - y.majorTickLineStyle = nil; - y.minorTickLineStyle = nil; - y.majorIntervalLength = CPTDecimalFromDouble(50.0); - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(0.0); - y.title = @"Y Axis"; - y.titleOffset = 45.0; - y.titleLocation = CPTDecimalFromFloat(150.0f); - - // First bar plot - CPTBarPlot *barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor darkGrayColor] horizontalBars:NO]; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.dataSource = self; - barPlot.barOffset = CPTDecimalFromFloat(-0.25f); - barPlot.identifier = @"Bar Plot 1"; - [newGraph addPlot:barPlot toPlotSpace:plotSpace]; - - // Second bar plot - barPlot = [CPTBarPlot tubularBarPlotWithColor:[CPTColor blueColor] horizontalBars:NO]; - barPlot.dataSource = self; - barPlot.baseValue = CPTDecimalFromDouble(0.0); - barPlot.barOffset = CPTDecimalFromFloat(0.25f); - barPlot.barCornerRadius = 2.0; - barPlot.identifier = @"Bar Plot 2"; - [newGraph addPlot:barPlot toPlotSpace:plotSpace]; -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return 16; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - NSNumber *num = nil; - - if ( [plot isKindOfClass:[CPTBarPlot class]] ) { - switch ( fieldEnum ) { - case CPTBarPlotFieldBarLocation: - num = @(index); - break; - - case CPTBarPlotFieldBarTip: - num = @( (index + 1) * (index + 1) ); - if ( [plot.identifier isEqual:@"Bar Plot 2"] ) { - num = @(num.integerValue - 10); - } - break; - } - } - - return num; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m deleted file mode 100644 index 70dbbc39e..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppPieChartController.m +++ /dev/null @@ -1,214 +0,0 @@ -#import "CPTTestAppPieChartController.h" - -@interface CPTTestAppPieChartController() - -@property (nonatomic, readwrite, strong) CPTXYGraph *pieChart; -@property (nonatomic, readonly, assign) CGFloat pieMargin; -@property (nonatomic, readonly, assign) CGFloat pieRadius; -@property (nonatomic, readonly, assign) CGPoint pieCenter; - -@end - -#pragma mark - - -@implementation CPTTestAppPieChartController - -@synthesize dataForChart; -@synthesize timer; -@synthesize pieChart; - --(CGFloat)pieMargin -{ - return self.pieChart.plotAreaFrame.borderLineStyle.lineWidth + CPTFloat(20.0); -} - --(CGFloat)pieRadius -{ - CGRect plotBounds = self.pieChart.plotAreaFrame.bounds; - - return MIN(plotBounds.size.width, plotBounds.size.height) / CPTFloat(2.0) - self.pieMargin; -} - --(CGPoint)pieCenter -{ - CGRect plotBounds = self.pieChart.plotAreaFrame.bounds; - - CGFloat y = 0.0; - - if ( plotBounds.size.width > plotBounds.size.height ) { - y = 0.45; - } - else { - y = (self.pieRadius + self.pieMargin) / plotBounds.size.height; - } - - return CGPointMake(0.5, y); -} - --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - CPTPieChart *piePlot = (CPTPieChart *)[self.pieChart plotWithIdentifier:@"Pie Chart 1"]; - CGPoint newAnchor = self.pieCenter; - - // Animate the change - [CATransaction begin]; - { - [CATransaction setAnimationDuration:0.5]; - [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; - - NSString *key = NSStringFromSelector( @selector(pieRadius) ); - - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key]; - - animation.toValue = @(self.pieRadius * 8.0 / 9.0); // leave room for the exploded slice - animation.fillMode = kCAFillModeForwards; - animation.delegate = self; - [piePlot addAnimation:animation forKey:key]; - - key = NSStringFromSelector( @selector(centerAnchor) ); - animation = [CABasicAnimation animationWithKeyPath:key]; - - animation.toValue = [NSValue valueWithBytes:&newAnchor objCType:@encode(CGPoint)]; - animation.fillMode = kCAFillModeForwards; - animation.delegate = self; - [piePlot addAnimation:animation forKey:key]; - } - [CATransaction commit]; -} - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - // Add some initial data - self.dataForChart = @[@20.0, @30.0, @60.0]; - - [self timerFired]; -#ifdef MEMORY_TEST - self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self - selector:@selector(timerFired) userInfo:nil repeats:YES]; -#endif -} - --(void)timerFired -{ -#ifdef MEMORY_TEST - static NSUInteger counter = 0; - - NSLog(@"\n----------------------------\ntimerFired: %lu", counter++); -#endif - - // Create pieChart from theme - CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [newGraph applyTheme:theme]; - self.pieChart = newGraph; - - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.hostedGraph = newGraph; - - newGraph.paddingLeft = 20.0; - newGraph.paddingTop = 20.0; - newGraph.paddingRight = 20.0; - newGraph.paddingBottom = 20.0; - - newGraph.axisSet = nil; - - CPTMutableTextStyle *whiteText = [CPTMutableTextStyle textStyle]; - whiteText.color = [CPTColor whiteColor]; - - newGraph.titleTextStyle = whiteText; - newGraph.title = @"Graph Title"; - - newGraph.titleDisplacement = CGPointMake(0.0, -5.0); - - // Add pie chart - CPTPieChart *piePlot = [[CPTPieChart alloc] init]; - piePlot.dataSource = self; - piePlot.pieRadius = 1.0; - piePlot.identifier = @"Pie Chart 1"; - piePlot.startAngle = CPTFloat(M_PI_4); - piePlot.sliceDirection = CPTPieDirectionCounterClockwise; - piePlot.borderLineStyle = [CPTLineStyle lineStyle]; - piePlot.delegate = self; - [newGraph addPlot:piePlot]; - - [newGraph layoutIfNeeded]; - [self didRotateFromInterfaceOrientation:UIInterfaceOrientationPortrait]; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview - // Release anything that's not essential, such as cached data -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return [self.dataForChart count]; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - if ( index >= [self.dataForChart count] ) { - return nil; - } - - if ( fieldEnum == CPTPieChartFieldSliceWidth ) { - return (self.dataForChart)[index]; - } - else { - return @(index); - } -} - --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index -{ - CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%lu", (unsigned long)index]]; - CPTMutableTextStyle *textStyle = [label.textStyle mutableCopy]; - - textStyle.color = [CPTColor lightGrayColor]; - label.textStyle = textStyle; - return label; -} - --(CGFloat)radialOffsetForPieChart:(CPTPieChart *)piePlot recordIndex:(NSUInteger)index -{ - CGFloat offset = 0.0; - - if ( index == 0 ) { - offset = piePlot.pieRadius / CPTFloat(8.0); - } - - return offset; -} - -#pragma mark - -#pragma mark Delegate Methods - --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index -{ - self.pieChart.title = [NSString stringWithFormat:@"Selected index: %lu", (unsigned long)index]; -} - --(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag -{ - CPTPieChart *piePlot = (CPTPieChart *)[self.pieChart plotWithIdentifier:@"Pie Chart 1"]; - CABasicAnimation *basicAnimation = (CABasicAnimation *)theAnimation; - - [piePlot removeAnimationForKey:basicAnimation.keyPath]; - [piePlot setValue:basicAnimation.toValue forKey:basicAnimation.keyPath]; - [piePlot repositionAllLabelAnnotations]; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m b/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m deleted file mode 100644 index 57426b89c..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestAppScatterPlotController.m +++ /dev/null @@ -1,227 +0,0 @@ -// -// CPTTestAppScatterPlotController.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. -// - -#import "CPTTestAppScatterPlotController.h" - -@interface CPTTestAppScatterPlotController() - -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; - -@end - -#pragma mark - - -@implementation CPTTestAppScatterPlotController - -@synthesize dataForPlot; -@synthesize graph; - -#pragma mark - -#pragma mark Initialization and teardown - --(void)viewDidLoad -{ - [super viewDidLoad]; - - // Create graph from theme - CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; - CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; - [newGraph applyTheme:theme]; - self.graph = newGraph; - - CPTGraphHostingView *hostingView = (CPTGraphHostingView *)self.view; - hostingView.collapsesLayers = NO; // Setting to YES reduces GPU memory usage, but can slow drawing/scrolling - hostingView.hostedGraph = newGraph; - - newGraph.paddingLeft = 10.0; - newGraph.paddingTop = 20.0; - newGraph.paddingRight = 10.0; - newGraph.paddingBottom = 10.0; - - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)newGraph.defaultPlotSpace; - plotSpace.allowsUserInteraction = YES; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(2.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.0) length:CPTDecimalFromDouble(3.0)]; - - // Axes - CPTXYAxisSet *axisSet = (CPTXYAxisSet *)newGraph.axisSet; - CPTXYAxis *x = axisSet.xAxis; - x.majorIntervalLength = CPTDecimalFromDouble(0.5); - x.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(2.99) length:CPTDecimalFromDouble(0.02)]]; - x.labelExclusionRanges = exclusionRanges; - - CPTXYAxis *y = axisSet.yAxis; - y.majorIntervalLength = CPTDecimalFromDouble(0.5); - y.minorTicksPerInterval = 5; - y.orthogonalCoordinateDecimal = CPTDecimalFromDouble(2.0); - exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(1.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(0.99) length:CPTDecimalFromDouble(0.02)], - [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(3.99) length:CPTDecimalFromDouble(0.02)]]; - y.labelExclusionRanges = exclusionRanges; - y.delegate = self; - - // Create a blue plot area - CPTScatterPlot *boundLinePlot = [[CPTScatterPlot alloc] init]; - CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; - lineStyle.miterLimit = 1.0; - lineStyle.lineWidth = 3.0; - lineStyle.lineColor = [CPTColor blueColor]; - boundLinePlot.dataLineStyle = lineStyle; - boundLinePlot.identifier = @"Blue Plot"; - boundLinePlot.dataSource = self; - [newGraph addPlot:boundLinePlot]; - - CPTImage *fillImage = [CPTImage imageNamed:@"BlueTexture"]; - fillImage.tiled = YES; - CPTFill *areaImageFill = [CPTFill fillWithImage:fillImage]; - boundLinePlot.areaFill = areaImageFill; - boundLinePlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue]; - - // Add plot symbols - CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; - symbolLineStyle.lineColor = [CPTColor blackColor]; - CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; - plotSymbol.fill = [CPTFill fillWithColor:[CPTColor blueColor]]; - plotSymbol.lineStyle = symbolLineStyle; - plotSymbol.size = CGSizeMake(10.0, 10.0); - boundLinePlot.plotSymbol = plotSymbol; - - // Create a green plot area - CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; - lineStyle = [CPTMutableLineStyle lineStyle]; - lineStyle.lineWidth = 3.0; - lineStyle.lineColor = [CPTColor greenColor]; - lineStyle.dashPattern = @[@5.0, @5.0]; - dataSourceLinePlot.dataLineStyle = lineStyle; - dataSourceLinePlot.identifier = @"Green Plot"; - dataSourceLinePlot.dataSource = self; - - // Put an area gradient under the plot above - CPTColor *areaColor = [CPTColor colorWithComponentRed:CPTFloat(0.3) green:CPTFloat(1.0) blue:CPTFloat(0.3) alpha:CPTFloat(0.8)]; - CPTGradient *areaGradient = [CPTGradient gradientWithBeginningColor:areaColor endingColor:[CPTColor clearColor]]; - areaGradient.angle = -90.0; - CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient]; - dataSourceLinePlot.areaFill = areaGradientFill; - dataSourceLinePlot.areaBaseValue = CPTDecimalFromDouble(1.75); - - // Animate in the new plot, as an example - dataSourceLinePlot.opacity = 0.0; - [newGraph addPlot:dataSourceLinePlot]; - - CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; - fadeInAnimation.duration = 1.0; - fadeInAnimation.removedOnCompletion = NO; - fadeInAnimation.fillMode = kCAFillModeForwards; - fadeInAnimation.toValue = @1.0; - [dataSourceLinePlot addAnimation:fadeInAnimation forKey:@"animateOpacity"]; - - // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; - for ( NSUInteger i = 0; i < 60; i++ ) { - NSNumber *xVal = @(1.0 + i * 0.05); - NSNumber *yVal = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2); - [contentArray addObject:@{ @"x": xVal, - @"y": yVal } - ]; - } - self.dataForPlot = contentArray; - -#ifdef PERFORMANCE_TEST - [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changePlotRange) userInfo:nil repeats:YES]; -#endif -} - --(void)changePlotRange -{ - // Setup plot space - CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; - - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromDouble(3.0 + 2.0 * arc4random() / UINT32_MAX)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromDouble(3.0 + 2.0 * arc4random() / UINT32_MAX)]; -} - -#pragma mark - -#pragma mark Plot Data Source Methods - --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -{ - return self.dataForPlot.count; -} - --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index -{ - NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); - NSNumber *num = self.dataForPlot[index][key]; - - // Green plot gets shifted above the blue - if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { - if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); - } - } - return num; -} - -#pragma mark - -#pragma mark Axis Delegate Methods - --(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations -{ - static CPTTextStyle *positiveStyle = nil; - static CPTTextStyle *negativeStyle = nil; - static dispatch_once_t positiveOnce = 0; - static dispatch_once_t negativeOnce = 0; - - NSFormatter *formatter = axis.labelFormatter; - CGFloat labelOffset = axis.labelOffset; - NSDecimalNumber *zero = [NSDecimalNumber zero]; - - NSMutableSet *newLabels = [NSMutableSet set]; - - for ( NSDecimalNumber *tickLocation in locations ) { - CPTTextStyle *theLabelTextStyle; - - if ( [tickLocation isGreaterThanOrEqualTo:zero] ) { - dispatch_once(&positiveOnce, ^{ - CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; - newStyle.color = [CPTColor greenColor]; - positiveStyle = newStyle; - }); - - theLabelTextStyle = positiveStyle; - } - else { - dispatch_once(&negativeOnce, ^{ - CPTMutableTextStyle *newStyle = [axis.labelTextStyle mutableCopy]; - newStyle.color = [CPTColor redColor]; - negativeStyle = newStyle; - }); - - theLabelTextStyle = negativeStyle; - } - - NSString *labelString = [formatter stringForObjectValue:tickLocation]; - CPTTextLayer *newLabelLayer = [[CPTTextLayer alloc] initWithText:labelString style:theLabelTextStyle]; - - CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithContentLayer:newLabelLayer]; - newLabel.tickLocation = tickLocation.decimalValue; - newLabel.offset = labelOffset; - - [newLabels addObject:newLabel]; - } - - axis.axisLabels = newLabels; - - return NO; -} - -@end diff --git a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m b/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m deleted file mode 100644 index 0203992bc..000000000 --- a/examples/CPTTestApp-iPhone/Classes/CPTTestApp_iPhoneAppDelegate.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// CPTTestApp_iPhoneAppDelegate.m -// CPTTestApp-iPhone -// -// Created by Brad Larson on 5/11/2009. - -#import "CPTTestApp_iPhoneAppDelegate.h" - -@implementation CPTTestApp_iPhoneAppDelegate - -@synthesize window; -@synthesize tabBarController; - --(void)applicationDidFinishLaunching:(UIApplication *)application -{ - self.window.rootViewController = self.tabBarController; - [self.window makeKeyAndVisible]; -} - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { - * } - */ - -/* - * // Optional UITabBarControllerDelegate method - * - (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed { - * } - */ - -@end From b3502acde54e83915af3baca04dc9c311b934a91 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 12 Feb 2015 20:45:03 -0500 Subject: [PATCH 036/429] Added plot space point conversion methods that take an NSArray of coordinate values. --- documentation/changelog.markdown | 1 + framework/Source/CPTPlotSpace.h | 3 + framework/Source/CPTPlotSpace.m | 29 +++++++ framework/Source/CPTXYPlotSpace.m | 109 +++++++++++++++++++++++++ framework/Source/CPTXYPlotSpaceTests.m | 106 ++++++++++++++++++++++++ 5 files changed, 248 insertions(+) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index a0698f2b8..18331fc33 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -22,6 +22,7 @@ To be determined. - **New**: Added support for categorical plot data. - **New**: Added histogram style options to `CPTScatterPlot`. - **New**: Added iOS unit tests. +- **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **Changed**: Increased the deployment target to iOS 6.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index f153f2022..7bca84db5 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -194,14 +194,17 @@ extern NSString *const CPTPlotSpaceDisplacementKey; /// @name Coordinate Space Conversions /// @{ +-(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint; -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count; -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count; +-(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point; -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event; +-(NSArray *)plotPointForEvent:(CPTNativeEvent *)event; -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event; -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index f79c864e1..e6f83565e 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -476,6 +476,17 @@ -(NSUInteger)numberOfCoordinates /// @endcond +/** @brief Converts a data point to plot area drawing coordinates. + * @param plotPoint An array of data point coordinates (as NSNumber values). + * @return The drawing coordinates of the data point. + **/ +-(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint +{ + NSParameterAssert(plotPoint.count == self.numberOfCoordinates); + + return CGPointZero; +} + /** @brief Converts a data point to plot area drawing coordinates. * @param plotPoint A c-style array of data point coordinates (as NSDecimal structs). * @param count The number of coordinate values in the @par{plotPoint} array. @@ -500,6 +511,15 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe return CGPointZero; } +/** @brief Converts a point given in plot area drawing coordinates to the data coordinate space. + * @param point The drawing coordinates of the data point. + * @return An array of data point coordinates (as NSNumber values). + **/ +-(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point +{ + return nil; +} + /** @brief Converts a point given in plot area drawing coordinates to the data coordinate space. * @param plotPoint A c-style array of data point coordinates (as NSDecimal structs). * @param count The number of coordinate values in the @par{plotPoint} array. @@ -529,6 +549,15 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event return CGPointZero; } +/** @brief Converts the interaction point of an OS event to the data coordinate space. + * @param event The event. + * @return An array of data point coordinates (as NSNumber values). + **/ +-(NSArray *)plotPointForEvent:(CPTNativeEvent *)event +{ + return nil; +} + /** @brief Converts the interaction point of an OS event to the data coordinate space. * @param plotPoint A c-style array of data point coordinates (as NSDecimal structs). * @param count The number of coordinate values in the @par{plotPoint} array. diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index d26356b61..6d9eb8713 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -910,6 +910,56 @@ -(NSUInteger)numberOfCoordinates } // Plot area view point for plot point +-(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint +{ + CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint]; + + CGSize layerSize; + CPTGraph *theGraph = self.graph; + CPTPlotArea *plotArea = theGraph.plotAreaFrame.plotArea; + + if ( plotArea ) { + layerSize = plotArea.bounds.size; + } + else { + return viewPoint; + } + + switch ( self.xScaleType ) { + case CPTScaleTypeLinear: + case CPTScaleTypeCategory: + viewPoint.x = [self viewCoordinateForViewLength:plotArea.widthDecimal linearPlotRange:self.xRange plotCoordinateValue:[plotPoint[CPTCoordinateX] decimalValue]]; + break; + + case CPTScaleTypeLog: + { + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + } + break; + + default: + [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; + } + + switch ( self.yScaleType ) { + case CPTScaleTypeLinear: + case CPTScaleTypeCategory: + viewPoint.y = [self viewCoordinateForViewLength:plotArea.heightDecimal linearPlotRange:self.yRange plotCoordinateValue:[plotPoint[CPTCoordinateY] decimalValue]]; + break; + + case CPTScaleTypeLog: + { + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + } + break; + + default: + [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; + } + + return viewPoint; +} + -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count { CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:count]; @@ -1009,6 +1059,60 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe } // Plot point for view point +-(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point +{ + NSMutableArray *plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; + + CGSize boundsSize; + CPTGraph *theGraph = self.graph; + CPTPlotArea *plotArea = theGraph.plotAreaFrame.plotArea; + + if ( plotArea ) { + boundsSize = plotArea.bounds.size; + } + else { + return @[@0, @0]; + } + + if ( !plotPoint ) { + plotPoint = [NSMutableArray arrayWithCapacity:self.numberOfCoordinates]; + } + + switch ( self.xScaleType ) { + case CPTScaleTypeLinear: + case CPTScaleTypeCategory: + plotPoint[CPTCoordinateX] = [NSDecimalNumber decimalNumberWithDecimal:[self plotCoordinateForViewLength:CPTDecimalFromCGFloat(point.x) + linearPlotRange:self.xRange + boundsLength:plotArea.widthDecimal]]; + break; + + case CPTScaleTypeLog: + plotPoint[CPTCoordinateX] = @([self doublePrecisionPlotCoordinateForViewLength:point.x logPlotRange:self.xRange boundsLength:boundsSize.width]); + break; + + default: + [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; + } + + switch ( self.yScaleType ) { + case CPTScaleTypeLinear: + case CPTScaleTypeCategory: + plotPoint[CPTCoordinateY] = [NSDecimalNumber decimalNumberWithDecimal:[self plotCoordinateForViewLength:CPTDecimalFromCGFloat(point.y) + linearPlotRange:self.yRange + boundsLength:plotArea.heightDecimal]]; + break; + + case CPTScaleTypeLog: + plotPoint[CPTCoordinateY] = @([self doublePrecisionPlotCoordinateForViewLength:point.y logPlotRange:self.yRange boundsLength:boundsSize.height]); + break; + + default: + [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; + } + + return plotPoint; +} + -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point { [super plotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:point]; @@ -1131,6 +1235,11 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event } // Plot point for event +-(NSArray *)plotPointForEvent:(CPTNativeEvent *)event +{ + return [self plotPointForPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; +} + -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event { [self plotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index c2a669a93..3266369ff 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -37,6 +37,36 @@ -(void)tearDown #pragma mark - #pragma mark View point for plot point (linear) +-(void)testViewPointForPlotPointArrayLinear +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLinear; + plotSpace.yScaleType = CPTScaleTypeLinear; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + + NSArray *plotPoint = @[@5.0, @5.0]; + + CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@5.0]; + + viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(50.0), CPTFloat(0.01), @""); +} + -(void)testViewPointForPlotPointLinear { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; @@ -104,6 +134,36 @@ -(void)testViewPointForDoublePrecisionPlotPointLinear #pragma mark - #pragma mark View point for plot point (log) +-(void)testViewPointForPlotPointArrayLog +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLog; + plotSpace.yScaleType = CPTScaleTypeLog; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + + NSArray *plotPoint = @[@( sqrt(10.0) ), @( sqrt(10.0) )]; + + CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@10.0 + length:@90.0]; + + viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(50.0), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, -CPTFloat(25.0), CPTFloat(0.01), @""); +} + -(void)testViewPointForPlotPointLog { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; @@ -171,6 +231,28 @@ -(void)testViewPointForDoublePrecisionPlotPointLog #pragma mark - #pragma mark Plot point for view point (linear) +-(void)testPlotPointArrayForViewPointLinear +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLinear; + plotSpace.yScaleType = CPTScaleTypeLinear; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 + length:@10.0]; + + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + NSArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + NSString *errMessage; + + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; + XCTAssertTrue(CPTDecimalEquals( [plotPoint[CPTCoordinateX] decimalValue], CPTDecimalFromDouble(5.0) ), @"%@", errMessage); + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", plotPoint[CPTCoordinateY]]; + XCTAssertTrue(CPTDecimalEquals( [plotPoint[CPTCoordinateY] decimalValue], CPTDecimalFromDouble(5.0) ), @"%@", errMessage); +} + -(void)testPlotPointForViewPointLinear { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; @@ -222,6 +304,30 @@ -(void)testDoublePrecisionPlotPointForViewPointLinear #pragma mark - #pragma mark Plot point for view point (log) +-(void)testPlotPointArrayForViewPointLog +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLog; + plotSpace.yScaleType = CPTScaleTypeLog; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 + length:@9.0]; + + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + NSArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + NSString *errMessage; + + [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; + XCTAssertEqual([plotPoint[CPTCoordinateX] doubleValue], sqrt(10.0), @"%@", errMessage); + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", plotPoint[CPTCoordinateY]]; + XCTAssertEqual([plotPoint[CPTCoordinateY] doubleValue], sqrt(10.0), @"%@", errMessage); +} + -(void)testPlotPointForViewPointLog { CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; From d8ac0e7cc26faf839ed111debbbe17ab30403775 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 16 Feb 2015 20:33:22 -0500 Subject: [PATCH 037/429] Updated the Swift example apps for Swift 1.2. --- .../Classes/BarChartController.swift | 12 ++++++------ .../Classes/PieChartController.swift | 4 ++-- .../Classes/ScatterPlotController.swift | 16 ++++++++-------- .../Classes/iPhoneAppDelegate.swift | 2 +- examples/DatePlot/Source/DateController.swift | 9 ++++++--- examples/DatePlot/Source/main.swift | 2 +- framework/CorePlot.xcodeproj/project.pbxproj | 8 ++++++++ 7 files changed, 32 insertions(+), 21 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 7719f732a..0f2235a88 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -13,7 +13,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) - let hostingView = self.view as CPTGraphHostingView + let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = barGraph // Border @@ -59,11 +59,11 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { newGraph.titlePlotAreaFrameAnchor = .Top // Plot space - let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + let plotSpace = newGraph.defaultPlotSpace as! CPTXYPlotSpace plotSpace.yRange = CPTPlotRange(location:0.0, length:300.0) plotSpace.xRange = CPTPlotRange(location:0.0, length:16.0) - let axisSet = newGraph.axisSet as CPTXYAxisSet + let axisSet = newGraph.axisSet as! CPTXYAxisSet let x = axisSet.xAxis x.axisLineStyle = nil @@ -83,13 +83,13 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let xAxisLabels = ["Label A", "Label B", "Label C", "Label D"] var labelLocation = 0 - let customLabels = NSMutableSet(capacity: xAxisLabels.count) + var customLabels = Set() for tickLocation in customTickLocations { let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation++], textStyle:x.labelTextStyle) newLabel.tickLocation = tickLocation newLabel.offset = x.labelOffset + x.majorTickLength newLabel.rotation = CGFloat(M_PI_4) - customLabels.addObject(newLabel) + customLabels.insert(newLabel) } x.axisLabels = customLabels @@ -138,7 +138,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { return recordIndex as NSNumber case .BarTip: - let plotID = plot.identifier as String + let plotID = plot.identifier as! String return (plotID == "Bar Plot 2" ? recordIndex : ((recordIndex + 1) * (recordIndex + 1)) ) as NSNumber default: diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 7f758277c..1d4475a2a 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -15,7 +15,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) - let hostingView = self.view as CPTGraphHostingView + let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph // Paddings @@ -74,7 +74,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { { let label = CPTTextLayer(text:"\(recordIndex)") - let textStyle = label.textStyle.mutableCopy() as CPTMutableTextStyle + let textStyle = label.textStyle.mutableCopy() as! CPTMutableTextStyle textStyle.color = CPTColor.lightGrayColor() label.textStyle = textStyle diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 709fe3ab5..be5b36858 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -16,7 +16,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { let newGraph = CPTXYGraph(frame: CGRectZero) newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) - let hostingView = self.view as CPTGraphHostingView + let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph // Paddings @@ -26,13 +26,13 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { newGraph.paddingBottom = 10.0 // Plot space - let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + let plotSpace = newGraph.defaultPlotSpace as! CPTXYPlotSpace plotSpace.allowsUserInteraction = true plotSpace.yRange = CPTPlotRange(location:1.0, length:2.0) plotSpace.xRange = CPTPlotRange(location:1.0, length:3.0) // Axes - let axisSet = newGraph.axisSet as CPTXYAxisSet + let axisSet = newGraph.axisSet as! CPTXYAxisSet let x = axisSet.xAxis x.majorIntervalLength = 0.5 @@ -134,7 +134,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { let plotField = CPTScatterPlotField(rawValue: Int(field)) if let num = self.dataForPlot[Int(recordIndex)][plotField!] { - let plotID = plot.identifier as String + let plotID = plot.identifier as! String if (plotField! == .Y) && (plotID == "Green Plot") { return (num + 1.0) as NSNumber } @@ -154,10 +154,10 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { let formatter = axis.labelFormatter let labelOffset = axis.labelOffset - let newLabels = NSMutableSet() + var newLabels = Set() for tickLocation in locations { - var labelTextStyle = axis.labelTextStyle.mutableCopy() as CPTMutableTextStyle + var labelTextStyle = axis.labelTextStyle.mutableCopy() as! CPTMutableTextStyle if tickLocation.doubleValue >= 0.0 { labelTextStyle.color = CPTColor.greenColor() @@ -170,10 +170,10 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) - newLabel.tickLocation = tickLocation as NSNumber + newLabel.tickLocation = tickLocation as! NSNumber newLabel.offset = labelOffset - newLabels.addObject(newLabel) + newLabels.insert(newLabel) } axis.axisLabels = newLabels diff --git a/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift index 8d843868b..e19b8b21d 100644 --- a/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift +++ b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift @@ -11,7 +11,7 @@ class iPhoneAppDelegate : NSObject, UIApplicationDelegate, UITabBarControllerDel @IBOutlet var window: UIWindow? = nil @IBOutlet var tabBarController: UITabBarController? = nil - func applicationDidFinishLaunching(application: UIApplication?) { + func applicationDidFinishLaunching(application: UIApplication) { if let myWindow = self.window { myWindow.rootViewController = self.tabBarController myWindow.makeKeyAndVisible() diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 6e1f039a6..825a27d2e 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -32,13 +32,13 @@ class DateController : NSObject, CPTPlotDataSource { } // Setup scatter plot space - let plotSpace = newGraph.defaultPlotSpace as CPTXYPlotSpace + let plotSpace = newGraph.defaultPlotSpace as! CPTXYPlotSpace plotSpace.xRange = CPTPlotRange(location:0.0, length:oneDay * 5.0) plotSpace.yRange = CPTPlotRange(location:1.0, length:3.0) // Axes - let axisSet = newGraph.axisSet as CPTXYAxisSet + let axisSet = newGraph.axisSet as! CPTXYAxisSet let x = axisSet.xAxis x.majorIntervalLength = oneDay x.orthogonalPosition = 2.0 @@ -54,11 +54,14 @@ class DateController : NSObject, CPTPlotDataSource { y.minorTicksPerInterval = 5 y.orthogonalPosition = oneDay + y.labelingPolicy = .None + + // Create a plot that uses the data source method let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) dataSourceLinePlot.identifier = "Date Plot" - let lineStyle = dataSourceLinePlot.dataLineStyle.mutableCopy() as CPTMutableLineStyle + let lineStyle = dataSourceLinePlot.dataLineStyle.mutableCopy() as! CPTMutableLineStyle lineStyle.lineWidth = 3.0 lineStyle.lineColor = CPTColor.greenColor() dataSourceLinePlot.dataLineStyle = lineStyle diff --git a/examples/DatePlot/Source/main.swift b/examples/DatePlot/Source/main.swift index 242155396..f43c39451 100644 --- a/examples/DatePlot/Source/main.swift +++ b/examples/DatePlot/Source/main.swift @@ -1,3 +1,3 @@ import Cocoa -NSApplicationMain(C_ARGC, C_ARGV) +NSApplicationMain(Process.argc, Process.unsafeArgv) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 4d886cc4b..be1192961 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2742,6 +2742,7 @@ }; C38A098B1A46185300D45436 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -2777,6 +2778,7 @@ }; C38A098C1A46185300D45436 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -2809,6 +2811,7 @@ }; C38A098D1A46185300D45436 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -2861,6 +2864,7 @@ }; C38A098E1A46185300D45436 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -2965,6 +2969,7 @@ }; C38A09CC1A4619A900D45436 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -2994,6 +2999,7 @@ }; C38A09CD1A4619A900D45436 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -3021,6 +3027,7 @@ }; C38A09CF1A4619A900D45436 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -3073,6 +3080,7 @@ }; C38A09D01A4619A900D45436 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; From 47b0b96a6d22b7800eb037ccd588c67759294aed Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 14 Mar 2015 09:57:31 -0400 Subject: [PATCH 038/429] Updated the deployment target in the change log and podspec. --- CorePlot.podspec | 2 +- documentation/changelog.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CorePlot.podspec b/CorePlot.podspec index 20773ffa6..4cd8e9fb8 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -18,7 +18,7 @@ Pod::Spec.new do |s| 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' - s.ios.deployment_target = '5.0' + s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.7' s.ios.header_dir = 'ios' diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 63cdd7854..708deb00e 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -24,7 +24,7 @@ To be determined. - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added `showBarBorder` property to `CPTTradingRangePlot`. -- **Changed**: Increased the deployment target to iOS 6.0 and Mac OS X 10.7. +- **Changed**: Increased the deployment target to iOS 7.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. From e3c3b8add96db3e78ff41df7690301d676227ed3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 27 Mar 2015 18:27:50 -0400 Subject: [PATCH 039/429] Updated the deployment target in the change log. --- documentation/changelog.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index b779591dd..40cbde7b5 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -25,7 +25,7 @@ To be determined. - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added `showBarBorder` property to `CPTTradingRangePlot`. -- **Changed**: Increased the deployment target to iOS 7.0 and Mac OS X 10.7. +- **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. From 2a71e254f184d9887b5e66b08613bd8605f4cb5a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 19 Apr 2015 08:46:03 -0400 Subject: [PATCH 040/429] Removed existence checks for constants that are always available on iOS 6 and later. Fixed issue #169. --- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 106 ++++++------------ 1 file changed, 35 insertions(+), 71 deletions(-) diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 7f6aef843..a12d0b6eb 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -39,36 +39,24 @@ +(instancetype)textStyleWithAttributes:(NSDictionary *)attributes CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; // Font - BOOL hasFontAttributeName = (&NSFontAttributeName != NULL); + UIFont *styleFont = attributes[NSFontAttributeName]; - if ( hasFontAttributeName ) { - UIFont *styleFont = attributes[NSFontAttributeName]; - - if ( styleFont ) { - newStyle.fontName = styleFont.fontName; - newStyle.fontSize = styleFont.pointSize; - } + if ( styleFont ) { + newStyle.fontName = styleFont.fontName; + newStyle.fontSize = styleFont.pointSize; } // Color - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); - - if ( hasColorAttributeName ) { - UIColor *styleColor = attributes[NSForegroundColorAttributeName]; - if ( styleColor ) { - newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; - } + UIColor *styleColor = attributes[NSForegroundColorAttributeName]; + if ( styleColor ) { + newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } // Text alignment and line break mode - BOOL hasParagraphAttributeName = (&NSParagraphStyleAttributeName != NULL); - - if ( hasParagraphAttributeName ) { - NSParagraphStyle *paragraphStyle = attributes[NSParagraphStyleAttributeName]; - if ( paragraphStyle ) { - newStyle.textAlignment = (CPTTextAlignment)paragraphStyle.alignment; - newStyle.lineBreakMode = paragraphStyle.lineBreakMode; - } + NSParagraphStyle *paragraphStyle = attributes[NSParagraphStyleAttributeName]; + if ( paragraphStyle ) { + newStyle.textAlignment = (CPTTextAlignment)paragraphStyle.alignment; + newStyle.lineBreakMode = paragraphStyle.lineBreakMode; } return [newStyle copy]; @@ -84,40 +72,28 @@ -(NSDictionary *)attributes NSMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; // Font - BOOL hasFontAttributeName = (&NSFontAttributeName != NULL); - - if ( hasFontAttributeName ) { - UIFont *styleFont = [UIFont fontWithName:self.fontName size:self.fontSize]; + UIFont *styleFont = [UIFont fontWithName:self.fontName size:self.fontSize]; - if ( styleFont ) { - [myAttributes setValue:styleFont - forKey:NSFontAttributeName]; - } + if ( styleFont ) { + [myAttributes setValue:styleFont + forKey:NSFontAttributeName]; } // Color - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); + UIColor *styleColor = self.color.uiColor; - if ( hasColorAttributeName ) { - UIColor *styleColor = self.color.uiColor; - - if ( styleColor ) { - [myAttributes setValue:styleColor - forKey:NSForegroundColorAttributeName]; - } + if ( styleColor ) { + [myAttributes setValue:styleColor + forKey:NSForegroundColorAttributeName]; } // Text alignment and line break mode - BOOL hasParagraphAttributeName = (&NSParagraphStyleAttributeName != NULL); + NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; + paragraphStyle.alignment = (NSTextAlignment)self.textAlignment; + paragraphStyle.lineBreakMode = self.lineBreakMode; - if ( hasParagraphAttributeName ) { - NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - paragraphStyle.alignment = (NSTextAlignment)self.textAlignment; - paragraphStyle.lineBreakMode = self.lineBreakMode; - - [myAttributes setValue:paragraphStyle - forKey:NSParagraphStyleAttributeName]; - } + [myAttributes setValue:paragraphStyle + forKey:NSParagraphStyleAttributeName]; return [myAttributes copy]; } @@ -137,38 +113,26 @@ +(instancetype)textStyleWithAttributes:(NSDictionary *)attributes CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; // Font - BOOL hasFontAttributeName = (&NSFontAttributeName != NULL); - - if ( hasFontAttributeName ) { - UIFont *styleFont = attributes[NSFontAttributeName]; + UIFont *styleFont = attributes[NSFontAttributeName]; - if ( styleFont ) { - newStyle.fontName = styleFont.fontName; - newStyle.fontSize = styleFont.pointSize; - } + if ( styleFont ) { + newStyle.fontName = styleFont.fontName; + newStyle.fontSize = styleFont.pointSize; } // Color - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); + UIColor *styleColor = attributes[NSForegroundColorAttributeName]; - if ( hasColorAttributeName ) { - UIColor *styleColor = attributes[NSForegroundColorAttributeName]; - - if ( styleColor ) { - newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; - } + if ( styleColor ) { + newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } // Text alignment and line break mode - BOOL hasParagraphAttributeName = (&NSParagraphStyleAttributeName != NULL); - - if ( hasParagraphAttributeName ) { - NSParagraphStyle *paragraphStyle = attributes[NSParagraphStyleAttributeName]; + NSParagraphStyle *paragraphStyle = attributes[NSParagraphStyleAttributeName]; - if ( paragraphStyle ) { - newStyle.textAlignment = (CPTTextAlignment)paragraphStyle.alignment; - newStyle.lineBreakMode = paragraphStyle.lineBreakMode; - } + if ( paragraphStyle ) { + newStyle.textAlignment = (CPTTextAlignment)paragraphStyle.alignment; + newStyle.lineBreakMode = paragraphStyle.lineBreakMode; } return newStyle; From 00b965df51bf4d201d73de526b79ca3cc82e8641 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 24 Apr 2015 12:04:56 -0400 Subject: [PATCH 041/429] Removed existence checks for constants that are always available on iOS 6 and later. --- .../CorePlotGallery/src/plots/FunctionPlot.m | 29 +++++++++---------- .../src/plots/SimplePieChart.m | 16 ++++------ 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index a9f4373a2..c683dcf75 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -144,29 +144,28 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:titleString attributes:textAttributes]; - if ( &NSFontAttributeName != NULL ) { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - UIFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; + UIFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; #else - NSFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; + NSFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; #endif - [title addAttribute:NSFontAttributeName - value:italicFont - range:NSMakeRange(0, 1)]; - [title addAttribute:NSFontAttributeName - value:italicFont - range:NSMakeRange(8, 1)]; + [title addAttribute:NSFontAttributeName + value:italicFont + range:NSMakeRange(0, 1)]; + [title addAttribute:NSFontAttributeName + value:italicFont + range:NSMakeRange(8, 1)]; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - UIFont *labelFont = [UIFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; + UIFont *labelFont = [UIFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; #else - NSFont *labelFont = [NSFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; + NSFont *labelFont = [NSFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; #endif - [title addAttribute:NSFontAttributeName - value:labelFont - range:NSMakeRange(0, title.length)]; - } + [title addAttribute:NSFontAttributeName + value:labelFont + range:NSMakeRange(0, title.length)]; + linePlot.attributedTitle = title; CPTMutableLineStyle *lineStyle = [linePlot.dataLineStyle mutableCopy]; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index bb114ca90..b2ebc3d9d 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -180,17 +180,13 @@ -(NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart #endif NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"Pie Slice %lu", (unsigned long)index]]; - if ( &NSForegroundColorAttributeName != NULL ) { - [title addAttribute:NSForegroundColorAttributeName - value:sliceColor - range:NSMakeRange(4, 5)]; - } + [title addAttribute:NSForegroundColorAttributeName + value:sliceColor + range:NSMakeRange(4, 5)]; - if ( &NSFontAttributeName != NULL ) { - [title addAttribute:NSFontAttributeName - value:labelFont - range:NSMakeRange(0, title.length)]; - } + [title addAttribute:NSFontAttributeName + value:labelFont + range:NSMakeRange(0, title.length)]; return title; } From 3a47567f596ce554e5d9f571ea9c50a55bb0e5ee Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 24 Apr 2015 12:05:40 -0400 Subject: [PATCH 042/429] Updated the Plot Gallery bar chart with Swift 1.2 changes. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 0f2235a88..53edec5b6 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -44,8 +44,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let graphTitle = NSMutableAttributedString(string: lineOne + "\n" + lineTwo) - let titleRange1 = NSRange(location: 0, length: lineOne.utf16Count) - let titleRange2 = NSRange(location: lineOne.utf16Count + 1, length: lineTwo.utf16Count) + let titleRange1 = NSRange(location: 0, length: count(lineOne.utf16)) + let titleRange2 = NSRange(location: count(lineOne.utf16) + 1, length: count(lineTwo.utf16)) graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.whiteColor(), range:titleRange1) graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.grayColor(), range:titleRange2) From c8e44a0a7a0bc0958b17fda4a394283cf13f30e2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 7 May 2015 20:15:22 -0400 Subject: [PATCH 043/429] Fixed a bar plot setup bug in the iPhone CPTTestApp. Fixed issue #178. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 53edec5b6..dc584578a 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -14,7 +14,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView - hostingView.hostedGraph = barGraph + hostingView.hostedGraph = newGraph // Border newGraph.plotAreaFrame.borderLineStyle = nil From f593aca89364b3dba18d88fe5c51338fb83f9cd1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 5 Jun 2015 16:31:32 -0400 Subject: [PATCH 044/429] Created a release 2.0 section in the change log. --- documentation/changelog.markdown | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 87faba306..bda233165 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,3 +1,23 @@ +# Release 2.0 (TBD) + +## Release Notes + +To be determined + +## Details +- **New**: Combined the Mac and iOS projects and added an iOS framework target. +- **New**: Added histogram style options to `CPTScatterPlot`. +- **New**: Added iOS unit tests. +- **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. +- **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. +- **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. +- **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. +- **Changed**: Added properties to `CPTPlotRange` and `CPTMutablePlotRange` to read and write all range properties as `NSNumber`, `NSDecimal`, or `double`. +- **Changed**: Renamed the `CPTXYAxis.orthogonalCoordinateDecimal` property to `CPTXYAxis.orthogonalPosition`. +- **Changed**: Miscellaneous bug fixes and cleanup. + + + # Release 1.6 (May 9, 2015) ## Release Notes @@ -5,7 +25,6 @@ This release adds support for @3x and stretchable images, plot area fill bands, new axis and plot delegate methods, and trackpad and scroll wheel gestures on the Mac. The behavior of all axis and plot xxxWasSelected delegate methods changed to require both a down and up event on the same element instead of only the down event. The deployment target has increased to iOS 5.0 and Mac OS X 10.7 and all iOS clients must now link against the Accelerate framework. ## Details -- **New**: Combined the Mac and iOS projects and added an iOS framework target. - **New**: Added hand cursors to the Mac hosting view to indicate when user interaction is enabled and when dragging is in progress. - **New**: Added two additional initialization methods to `CPTImage`. - **New**: Added a dependency on the Accelerate framework. All iOS clients must now link against this framework. @@ -21,16 +40,9 @@ This release adds support for @3x and stretchable images, plot area fill bands, - **New**: Added support for @3x images. - **New**: Added support for using an Objective-C block to calculate plot values in the function datasource class. - **New**: Added support for categorical plot data. -- **New**: Added histogram style options to `CPTScatterPlot`. -- **New**: Added iOS unit tests. -- **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added `showBarBorder` property to `CPTTradingRangePlot`. -- **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. +- **Changed**: Increased the deployment target to iOS 5.0 and Mac OS X 10.7. - **Changed**: Enabled automatic reference counting (ARC) in the framework projects. -- **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. -- **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. -- **Changed**: Added properties to `CPTPlotRange` and `CPTMutablePlotRange` to read and write all range properties as `NSNumber`, `NSDecimal`, or `double`. -- **Changed**: Renamed the `CPTXYAxis.orthogonalCoordinateDecimal` property to `CPTXYAxis.orthogonalPosition`. - **Changed**: Updated `CPTImage` to automatically handle switching between Retina and non-Retina displays. - **Changed**: Changed the behavior of all axis and plot xxxWasSelected delegate methods to require both a down and up event on the same element instead of only the down event. - **Changed**: Changed the class prefix for the Quartz Composer plug-ins from "CP" to "CPT". From d6b5fa5e19e54f527f8cdf2365587c511d98011d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 5 Jun 2015 17:03:02 -0400 Subject: [PATCH 045/429] Added nullability annotations to all property and method declarations. --- .../project.pbxproj | 62 +++++- documentation/changelog.markdown | 1 + .../Classes/BarChartController.swift | 112 +++++----- .../Classes/PieChartController.swift | 19 +- .../Classes/ScatterPlotController.swift | 96 ++++---- examples/CPTTestApp/Source/Controller.m | 30 ++- .../src/plots/CurvedScatterPlot.m | 13 +- .../src/plots/GradientScatterPlot.m | 15 +- .../CorePlotGallery/src/plots/ImageDemo.m | 13 +- .../CorePlotGallery/src/plots/RangePlot.m | 16 +- .../src/plots/SimpleScatterPlot.m | 15 +- .../src/plots/VerticalBarChart.m | 17 +- examples/DatePlot/Source/DateController.swift | 44 ++-- examples/DropPlot/CPTPlotDocument.m | 15 +- framework/CorePlot.xcodeproj/project.pbxproj | 206 +++++++++--------- framework/MacOnly/CPTGraphHostingView.h | 6 +- .../MacOnly/CPTPlatformSpecificCategories.h | 6 +- .../MacOnly/CPTPlatformSpecificFunctions.h | 8 +- framework/Source/CPTAnimation.h | 20 +- framework/Source/CPTAnimation.m | 8 +- framework/Source/CPTAnimationOperation.h | 14 +- framework/Source/CPTAnimationPeriod.h | 70 +++--- framework/Source/CPTAnnotation.h | 4 +- framework/Source/CPTAnnotationHostLayer.h | 6 +- framework/Source/CPTAnnotationHostLayer.m | 18 +- framework/Source/CPTAxis.h | 120 +++++----- framework/Source/CPTAxis.m | 20 +- framework/Source/CPTAxisLabel.h | 10 +- framework/Source/CPTAxisSet.h | 6 +- framework/Source/CPTBarPlot.h | 50 ++--- framework/Source/CPTBorderedLayer.h | 6 +- framework/Source/CPTCalendarFormatter.h | 10 +- framework/Source/CPTColor.h | 46 ++-- framework/Source/CPTColorSpace.h | 8 +- framework/Source/CPTConstraints.h | 14 +- framework/Source/CPTDefinitions.h | 33 +++ framework/Source/CPTExceptions.h | 6 +- framework/Source/CPTFill.h | 18 +- framework/Source/CPTFunctionDataSource.h | 16 +- framework/Source/CPTFunctionDataSource.m | 4 +- framework/Source/CPTGradient.h | 48 ++-- framework/Source/CPTGraph.h | 60 ++--- framework/Source/CPTGraph.m | 53 +++-- framework/Source/CPTGridLineGroup.h | 2 +- framework/Source/CPTGridLines.h | 2 +- framework/Source/CPTImage.h | 30 +-- framework/Source/CPTLayer.h | 38 ++-- framework/Source/CPTLayer.m | 4 +- framework/Source/CPTLayerAnnotation.h | 6 +- framework/Source/CPTLayerAnnotation.m | 10 +- framework/Source/CPTLegend.h | 70 +++--- framework/Source/CPTLegend.m | 7 +- framework/Source/CPTLegendEntry.h | 6 +- framework/Source/CPTLimitBand.h | 10 +- framework/Source/CPTLineCap.h | 34 +-- framework/Source/CPTLineCap.m | 4 +- framework/Source/CPTLineStyle.h | 16 +- framework/Source/CPTLineStyle.m | 8 +- framework/Source/CPTMutableLineStyle.h | 8 +- framework/Source/CPTMutableNumericData.h | 4 +- framework/Source/CPTMutableShadow.h | 2 +- framework/Source/CPTMutableTextStyle.h | 4 +- framework/Source/CPTNumericData.h | 50 ++--- framework/Source/CPTNumericData.m | 20 +- framework/Source/CPTNumericDataType.h | 4 +- framework/Source/CPTPathExtensions.h | 4 +- framework/Source/CPTPieChart.h | 36 +-- framework/Source/CPTPlot.h | 86 ++++---- framework/Source/CPTPlotArea.h | 32 +-- framework/Source/CPTPlotAreaFrame.h | 6 +- framework/Source/CPTPlotGroup.h | 6 +- framework/Source/CPTPlotRange.h | 32 +-- framework/Source/CPTPlotRange.m | 3 + framework/Source/CPTPlotSpace.h | 78 +++---- framework/Source/CPTPlotSpaceAnnotation.h | 8 +- framework/Source/CPTPlotSpaceAnnotation.m | 8 +- framework/Source/CPTPlotSymbol.h | 38 ++-- framework/Source/CPTRangePlot.h | 36 +-- framework/Source/CPTResponder.h | 10 +- framework/Source/CPTScatterPlot.h | 58 ++--- framework/Source/CPTShadow.h | 6 +- framework/Source/CPTTextLayer.h | 12 +- framework/Source/CPTTextStyle.h | 14 +- framework/Source/CPTTextStyle.m | 4 +- framework/Source/CPTTheme.h | 30 +-- framework/Source/CPTTheme.m | 2 + framework/Source/CPTTimeFormatter.h | 8 +- framework/Source/CPTTradingRangePlot.h | 62 +++--- framework/Source/CPTTradingRangePlot.m | 5 +- framework/Source/CPTUtilities.h | 4 + framework/Source/CPTXYAxis.h | 4 +- framework/Source/CPTXYAxis.m | 6 +- framework/Source/CPTXYAxisSet.h | 4 +- framework/Source/CPTXYGraph.h | 2 +- framework/Source/CPTXYPlotSpace.h | 8 +- framework/Source/CPTXYPlotSpace.m | 20 +- framework/Source/NSCoderExtensions.h | 32 +-- framework/Source/NSNumberExtensions.h | 6 +- framework/Source/_CPTBorderLayer.h | 2 +- framework/Source/_CPTConstraintsFixed.h | 8 +- framework/Source/_CPTConstraintsRelative.h | 6 +- framework/Source/_CPTFillColor.h | 8 +- framework/Source/_CPTFillColor.m | 2 +- framework/Source/_CPTFillGradient.h | 8 +- framework/Source/_CPTFillGradient.m | 2 +- framework/Source/_CPTFillImage.h | 8 +- framework/Source/_CPTFillImage.m | 2 +- framework/iPhoneOnly/CPTGraphHostingView.h | 2 +- .../CPTPlatformSpecificCategories.h | 14 +- .../iPhoneOnly/CPTPlatformSpecificFunctions.h | 4 +- 110 files changed, 1304 insertions(+), 1133 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 296f4123f..1ea1190f0 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -62,6 +62,34 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C3B925EA1ADF1CBE00C67086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3B925EC1ADF1CBE00C67086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3B925EE1ADF1CBE00C67086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3B925F01ADF1CBE00C67086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -81,7 +109,7 @@ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 16AA5C440A7EEE7300888E31 /* CorePlotQCPlugin_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CorePlotQCPlugin_Prefix.pch; sourceTree = ""; }; 16BA95400A7EB2EB001E4983 /* CorePlotQCPlugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CorePlotQCPlugin.h; sourceTree = ""; }; - 16BA95410A7EB2EB001E4983 /* CorePlotQCPlugin.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = CorePlotQCPlugin.m; sourceTree = ""; }; + 16BA95410A7EB2EB001E4983 /* CorePlotQCPlugin.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CorePlotQCPlugin.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 16BA96300A7EB9AC001E4983 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; 7238D5510DB6988600E9A42D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/Settings.xib; sourceTree = ""; }; 8D5B49B6048680CD000E48DA /* CorePlotQCPlugin.plugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CorePlotQCPlugin.plugin; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -181,6 +209,10 @@ children = ( BC21A97F1035BEAF00FED2A4 /* CorePlot.framework */, A8F18CF511FA634B00B2C42F /* UnitTests.xctest */, + C3B925EB1ADF1CBE00C67086 /* CorePlot_iOS.framework */, + C3B925ED1ADF1CBE00C67086 /* CorePlot_iOSTests.xctest */, + C3B925EF1ADF1CBE00C67086 /* libCorePlot-CocoaTouch.a */, + C3B925F11ADF1CBE00C67086 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -257,6 +289,34 @@ remoteRef = BC21A97E1035BEAF00FED2A4 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3B925EB1ADF1CBE00C67086 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3B925EA1ADF1CBE00C67086 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B925ED1ADF1CBE00C67086 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3B925EC1ADF1CBE00C67086 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B925EF1ADF1CBE00C67086 /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3B925EE1ADF1CBE00C67086 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B925F11ADF1CBE00C67086 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3B925F01ADF1CBE00C67086 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index bda233165..f21b88f8a 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -9,6 +9,7 @@ To be determined - **New**: Added histogram style options to `CPTScatterPlot`. - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. +- **New**: Added nullability annotations to all property and method declarations. - **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index dc584578a..355d0c7c7 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -16,21 +16,23 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph - // Border - newGraph.plotAreaFrame.borderLineStyle = nil - newGraph.plotAreaFrame.cornerRadius = 0.0 - newGraph.plotAreaFrame.masksToBorder = false - - // Paddings - newGraph.paddingLeft = 0.0 - newGraph.paddingRight = 0.0 - newGraph.paddingTop = 0.0 - newGraph.paddingBottom = 0.0 - - newGraph.plotAreaFrame.paddingLeft = 70.0 - newGraph.plotAreaFrame.paddingTop = 20.0 - newGraph.plotAreaFrame.paddingRight = 20.0 - newGraph.plotAreaFrame.paddingBottom = 80.0 + if let frameLayer = newGraph.plotAreaFrame { + // Border + frameLayer.borderLineStyle = nil + frameLayer.cornerRadius = 0.0 + frameLayer.masksToBorder = false + + // Paddings + newGraph.paddingLeft = 0.0 + newGraph.paddingRight = 0.0 + newGraph.paddingTop = 0.0 + newGraph.paddingBottom = 0.0 + + frameLayer.paddingLeft = 70.0 + frameLayer.paddingTop = 20.0 + frameLayer.paddingRight = 20.0 + frameLayer.paddingBottom = 80.0 + } // Graph title let paragraphStyle = NSMutableParagraphStyle() @@ -65,44 +67,46 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let axisSet = newGraph.axisSet as! CPTXYAxisSet - let x = axisSet.xAxis - x.axisLineStyle = nil - x.majorTickLineStyle = nil - x.minorTickLineStyle = nil - x.majorIntervalLength = 5.0 - x.orthogonalPosition = 0.0 - x.title = "X Axis" - x.titleLocation = 7.5 - x.titleOffset = 55.0 - - // Custom labels - x.labelRotation = CGFloat(M_PI_4) - x.labelingPolicy = .None - - let customTickLocations = [1, 5, 10, 15] - let xAxisLabels = ["Label A", "Label B", "Label C", "Label D"] - - var labelLocation = 0 - var customLabels = Set() - for tickLocation in customTickLocations { - let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation++], textStyle:x.labelTextStyle) - newLabel.tickLocation = tickLocation - newLabel.offset = x.labelOffset + x.majorTickLength - newLabel.rotation = CGFloat(M_PI_4) - customLabels.insert(newLabel) + if let x = axisSet.xAxis { + x.axisLineStyle = nil + x.majorTickLineStyle = nil + x.minorTickLineStyle = nil + x.majorIntervalLength = 5.0 + x.orthogonalPosition = 0.0 + x.title = "X Axis" + x.titleLocation = 7.5 + x.titleOffset = 55.0 + + // Custom labels + x.labelRotation = CGFloat(M_PI_4) + x.labelingPolicy = .None + + let customTickLocations = [1, 5, 10, 15] + let xAxisLabels = ["Label A", "Label B", "Label C", "Label D"] + + var labelLocation = 0 + var customLabels = Set() + for tickLocation in customTickLocations { + let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation++], textStyle:x.labelTextStyle) + newLabel.tickLocation = tickLocation + newLabel.offset = x.labelOffset + x.majorTickLength + newLabel.rotation = CGFloat(M_PI_4) + customLabels.insert(newLabel) + } + + x.axisLabels = customLabels } - x.axisLabels = customLabels - - let y = axisSet.yAxis - y.axisLineStyle = nil - y.majorTickLineStyle = nil - y.minorTickLineStyle = nil - y.majorIntervalLength = 50.0 - y.orthogonalPosition = 0.0 - y.title = "Y Axis" - y.titleOffset = 45.0 - y.titleLocation = 150.0 + if let y = axisSet.yAxis { + y.axisLineStyle = nil + y.majorTickLineStyle = nil + y.minorTickLineStyle = nil + y.majorIntervalLength = 50.0 + y.orthogonalPosition = 0.0 + y.title = "Y Axis" + y.titleOffset = 45.0 + y.titleLocation = 150.0 + } // First bar plot let barPlot1 = CPTBarPlot.tubularBarPlotWithColor(CPTColor.darkGrayColor(), horizontalBars:false) @@ -126,17 +130,17 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + func numberOfRecordsForPlot(plot: CPTPlot) -> UInt { return 16 } - func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? { switch CPTBarPlotField(rawValue: Int(field))! { case .BarLocation: return recordIndex as NSNumber - + case .BarTip: let plotID = plot.identifier as! String return (plotID == "Bar Plot 2" ? recordIndex : ((recordIndex + 1) * (recordIndex + 1)) ) as NSNumber diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 1d4475a2a..ea01894e6 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -49,12 +49,12 @@ class PieChartController : UIViewController, CPTPieChartDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + func numberOfRecordsForPlot(plot: CPTPlot) -> UInt { return UInt(self.dataForChart.count) } - func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? { if Int(recordIndex) > self.dataForChart.count { return nil @@ -70,19 +70,20 @@ class PieChartController : UIViewController, CPTPieChartDataSource { } } - func dataLabelForPlot(plot: CPTPlot!, recordIndex: UInt) -> CPTLayer! + func dataLabelForPlot(plot: CPTPlot, recordIndex: UInt) -> CPTLayer? { let label = CPTTextLayer(text:"\(recordIndex)") - let textStyle = label.textStyle.mutableCopy() as! CPTMutableTextStyle - textStyle.color = CPTColor.lightGrayColor() + if let textStyle = label.textStyle?.mutableCopy() as? CPTMutableTextStyle { + textStyle.color = CPTColor.lightGrayColor() - label.textStyle = textStyle + label.textStyle = textStyle + } return label } - func radialOffsetForPieChart(piePlot: CPTPieChart!, recordIndex: UInt) -> CGFloat + func radialOffsetForPieChart(piePlot: CPTPieChart, recordIndex: UInt) -> CGFloat { var offset: CGFloat = 0.0 @@ -94,8 +95,8 @@ class PieChartController : UIViewController, CPTPieChartDataSource { } // MARK: - Delegate Methods - - func pieChart(plot: CPTPlot!, sliceWasSelectedAtRecordIndex recordIndex: UInt) + + func pieChart(plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) { self.pieGraph?.title = "Selected index: \(recordIndex)" } diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index be5b36858..842ad29b5 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -34,26 +34,28 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // Axes let axisSet = newGraph.axisSet as! CPTXYAxisSet - let x = axisSet.xAxis - x.majorIntervalLength = 0.5 - x.orthogonalPosition = 2.0 - x.minorTicksPerInterval = 2 - x.labelExclusionRanges = [ - CPTPlotRange(location: 0.99, length: 0.02), - CPTPlotRange(location: 1.99, length: 0.02), - CPTPlotRange(location: 2.99, length: 0.02) - ] - - let y = axisSet.xAxis - y.majorIntervalLength = 0.5 - y.minorTicksPerInterval = 5 - y.orthogonalPosition = 2.0 - y.labelExclusionRanges = [ - CPTPlotRange(location: 0.99, length: 0.02), - CPTPlotRange(location: 1.99, length: 0.02), - CPTPlotRange(location: 3.99, length: 0.02) - ] - y.delegate = self + if let x = axisSet.xAxis { + x.majorIntervalLength = 0.5 + x.orthogonalPosition = 2.0 + x.minorTicksPerInterval = 2 + x.labelExclusionRanges = [ + CPTPlotRange(location: 0.99, length: 0.02), + CPTPlotRange(location: 1.99, length: 0.02), + CPTPlotRange(location: 2.99, length: 0.02) + ] + } + + if let y = axisSet.xAxis { + y.majorIntervalLength = 0.5 + y.minorTicksPerInterval = 5 + y.orthogonalPosition = 2.0 + y.labelExclusionRanges = [ + CPTPlotRange(location: 0.99, length: 0.02), + CPTPlotRange(location: 1.99, length: 0.02), + CPTPlotRange(location: 3.99, length: 0.02) + ] + y.delegate = self + } // Create a blue plot area let boundLinePlot = CPTScatterPlot(frame: CGRectZero) @@ -124,12 +126,12 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + func numberOfRecordsForPlot(plot: CPTPlot) -> UInt { return UInt(self.dataForPlot.count) } - func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? { let plotField = CPTScatterPlotField(rawValue: Int(field)) @@ -151,33 +153,35 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { func axis(axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool { - let formatter = axis.labelFormatter - let labelOffset = axis.labelOffset - - var newLabels = Set() - - for tickLocation in locations { - var labelTextStyle = axis.labelTextStyle.mutableCopy() as! CPTMutableTextStyle - - if tickLocation.doubleValue >= 0.0 { - labelTextStyle.color = CPTColor.greenColor() + if let formatter = axis.labelFormatter { + let labelOffset = axis.labelOffset + + var newLabels = Set() + + for tickLocation in locations { + if let labelTextStyle = axis.labelTextStyle?.mutableCopy() as? CPTMutableTextStyle { + + if tickLocation.doubleValue >= 0.0 { + labelTextStyle.color = CPTColor.greenColor() + } + else { + labelTextStyle.color = CPTColor.redColor() + } + + let labelString = formatter.stringForObjectValue(tickLocation) + let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) + + let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) + newLabel.tickLocation = tickLocation as? NSNumber + newLabel.offset = labelOffset + + newLabels.insert(newLabel) + } + + axis.axisLabels = newLabels } - else { - labelTextStyle.color = CPTColor.redColor() - } - - let labelString = formatter.stringForObjectValue(tickLocation) - let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) - - let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) - newLabel.tickLocation = tickLocation as! NSNumber - newLabel.offset = labelOffset - - newLabels.insert(newLabel) } - axis.axisLabels = newLabels - return false } } diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 03b73a3b5..9b2e9ad5f 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -478,12 +478,15 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area - CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:self.graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.displacement = CGPointMake(0.0, 20.0); - [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; - self.symbolTextAnnotation = annotation; + CPTPlotSpace *defaultSpace = self.graph.defaultPlotSpace; + if ( defaultSpace ) { + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.displacement = CGPointMake(0.0, 20.0); + [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; + self.symbolTextAnnotation = annotation; + } } #pragma mark - @@ -518,12 +521,15 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area - CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:self.graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.displacement = CGPointMake(0.0, 0.0); - [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; - self.symbolTextAnnotation = annotation; + CPTPlotSpace *defaultSpace = self.graph.defaultPlotSpace; + if ( defaultSpace ) { + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.displacement = CGPointMake(0.0, 0.0); + [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; + self.symbolTextAnnotation = annotation; + } CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"barWidth"]; animation.duration = 0.25; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 7c6b0d77e..103b5dbc1 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -398,11 +398,14 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS textLayer.paddingRight = 2.0; textLayer.paddingBottom = 2.0; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.contentAnchorPoint = CGPointMake(0.5, 0.0); - annotation.displacement = CGPointMake(0.0, 10.0); - [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + CPTPlotSpace *defaultSpace = graph.defaultPlotSpace; + if ( defaultSpace ) { + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.contentAnchorPoint = CGPointMake(0.5, 0.0); + annotation.displacement = CGPointMake(0.0, 10.0); + [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } -(void)scatterPlotDataLineWasSelected:(CPTScatterPlot *)plot diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 2f137d2d3..1dcbf0620 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -258,12 +258,15 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area - CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.displacement = CGPointMake(0.0, 20.0); - self.symbolTextAnnotation = annotation; - [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + CPTPlotSpace *defaultSpace = graph.defaultPlotSpace; + if ( defaultSpace ) { + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.displacement = CGPointMake(0.0, 20.0); + self.symbolTextAnnotation = annotation; + [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } #pragma mark - diff --git a/examples/CorePlotGallery/src/plots/ImageDemo.m b/examples/CorePlotGallery/src/plots/ImageDemo.m index 9c5d890a1..99e67ff52 100644 --- a/examples/CorePlotGallery/src/plots/ImageDemo.m +++ b/examples/CorePlotGallery/src/plots/ImageDemo.m @@ -91,11 +91,14 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP titleLayer.paddingTop = self.titleSize * CPTFloat(4.0); titleLayer.paddingBottom = self.titleSize * CPTFloat(0.25); - annotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:graph.plotAreaFrame.plotArea]; - annotation.rectAnchor = CPTRectAnchorBottomRight; - annotation.contentLayer = titleLayer; - annotation.contentAnchorPoint = CGPointMake(1.0, 0.0); - [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + CPTLayer *anchorLayer = graph.plotAreaFrame.plotArea; + if ( anchorLayer ) { + annotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:anchorLayer]; + annotation.rectAnchor = CPTRectAnchorBottomRight; + annotation.contentLayer = titleLayer; + annotation.contentAnchorPoint = CGPointMake(1.0, 0.0); + [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } @end diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 23808a431..dfb820045 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -99,12 +99,16 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #else CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:@"Click to Toggle Range Plot Style" style:textStyle]; #endif - CPTLayerAnnotation *instructionsAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:newGraph.plotAreaFrame.plotArea]; - instructionsAnnotation.contentLayer = textLayer; - instructionsAnnotation.rectAnchor = CPTRectAnchorBottom; - instructionsAnnotation.contentAnchorPoint = CGPointMake(0.5, 0.0); - instructionsAnnotation.displacement = CGPointMake(0.0, 10.0); - [newGraph.plotAreaFrame.plotArea addAnnotation:instructionsAnnotation]; + + CPTLayer *anchorLayer = newGraph.plotAreaFrame.plotArea; + if ( anchorLayer ) { + CPTLayerAnnotation *instructionsAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:anchorLayer]; + instructionsAnnotation.contentLayer = textLayer; + instructionsAnnotation.rectAnchor = CPTRectAnchorBottom; + instructionsAnnotation.contentAnchorPoint = CGPointMake(0.5, 0.0); + instructionsAnnotation.displacement = CGPointMake(0.0, 10.0); + [newGraph.plotAreaFrame.plotArea addAnnotation:instructionsAnnotation]; + } // Setup fill and bar style if ( !self.areaFill ) { diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index d91fb38a0..064fc8ed4 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -249,12 +249,15 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area - CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.displacement = CGPointMake(0.0, 20.0); - self.symbolTextAnnotation = annotation; - [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + CPTPlotSpace *defaultSpace = graph.defaultPlotSpace; + if ( defaultSpace ) { + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.displacement = CGPointMake(0.0, 20.0); + self.symbolTextAnnotation = annotation; + [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } -(void)scatterPlotDataLineWasSelected:(CPTScatterPlot *)plot diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index c592953a6..010f70a3b 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -272,13 +272,16 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index NSString *yString = [formatter stringFromNumber:value]; // Now add the annotation to the plot area - CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; - annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:plot.plotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = textLayer; - annotation.displacement = CGPointMake(0.0, 0.0); - self.symbolTextAnnotation = annotation; - - [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + CPTPlotSpace *space = plot.plotSpace; + if ( space ) { + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:yString style:hitAnnotationTextStyle]; + annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:space anchorPlotPoint:anchorPoint]; + annotation.contentLayer = textLayer; + annotation.displacement = CGPointMake(0.0, 0.0); + self.symbolTextAnnotation = annotation; + + [graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } #pragma mark - diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 825a27d2e..f44f10e72 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -39,32 +39,34 @@ class DateController : NSObject, CPTPlotDataSource { // Axes let axisSet = newGraph.axisSet as! CPTXYAxisSet - let x = axisSet.xAxis - x.majorIntervalLength = oneDay - x.orthogonalPosition = 2.0 - x.minorTicksPerInterval = 0; - let dateFormatter = NSDateFormatter() - dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle - let timeFormatter = CPTTimeFormatter(dateFormatter:dateFormatter) - timeFormatter.referenceDate = refDate; - x.labelFormatter = timeFormatter; - - let y = axisSet.yAxis - y.majorIntervalLength = 0.5 - y.minorTicksPerInterval = 5 - y.orthogonalPosition = oneDay + if let x = axisSet.xAxis { + x.majorIntervalLength = oneDay + x.orthogonalPosition = 2.0 + x.minorTicksPerInterval = 0; + let dateFormatter = NSDateFormatter() + dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle + let timeFormatter = CPTTimeFormatter(dateFormatter:dateFormatter) + timeFormatter.referenceDate = refDate; + x.labelFormatter = timeFormatter; + } - y.labelingPolicy = .None + if let y = axisSet.yAxis { + y.majorIntervalLength = 0.5 + y.minorTicksPerInterval = 5 + y.orthogonalPosition = oneDay + y.labelingPolicy = .None + } // Create a plot that uses the data source method let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) dataSourceLinePlot.identifier = "Date Plot" - let lineStyle = dataSourceLinePlot.dataLineStyle.mutableCopy() as! CPTMutableLineStyle - lineStyle.lineWidth = 3.0 - lineStyle.lineColor = CPTColor.greenColor() - dataSourceLinePlot.dataLineStyle = lineStyle + if let lineStyle = dataSourceLinePlot.dataLineStyle?.mutableCopy() as? CPTMutableLineStyle { + lineStyle.lineWidth = 3.0 + lineStyle.lineColor = CPTColor.greenColor() + dataSourceLinePlot.dataLineStyle = lineStyle + } dataSourceLinePlot.dataSource = self newGraph.addPlot(dataSourceLinePlot) @@ -85,12 +87,12 @@ class DateController : NSObject, CPTPlotDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot!) -> UInt + func numberOfRecordsForPlot(plot: CPTPlot) -> UInt { return UInt(self.plotData.count) } - func numberForPlot(plot: CPTPlot!, field: UInt, recordIndex: UInt) -> AnyObject! + func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? { switch CPTScatterPlotField(rawValue: Int(field))! { case .X: diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 3ddb9cd00..f21cad6ef 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -406,12 +406,15 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)e NSArray *anchorPoint = @[@(start[CPTCoordinateX]), @(start[CPTCoordinateY])]; -// now create the annotation - CPTPlotSpaceAnnotation *annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:self.graph.defaultPlotSpace anchorPlotPoint:anchorPoint]; - annotation.contentLayer = zoomRectangleLayer; - self.zoomAnnotation = annotation; - - [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; + // now create the annotation + CPTPlotSpace *defaultSpace = self.graph.defaultPlotSpace; + if ( defaultSpace ) { + CPTPlotSpaceAnnotation *annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:defaultSpace anchorPlotPoint:anchorPoint]; + annotation.contentLayer = zoomRectangleLayer; + self.zoomAnnotation = annotation; + + [self.graph.plotAreaFrame.plotArea addAnnotation:annotation]; + } } } diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 6f86876ce..44683b69d 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -649,18 +649,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 070064E7111F2BAA003DE087 /* CPTConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTConstraints.h; sourceTree = ""; }; - 070064E8111F2BAA003DE087 /* CPTConstraints.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTConstraints.m; sourceTree = ""; }; + 070064E7111F2BAA003DE087 /* CPTConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTConstraints.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 070064E8111F2BAA003DE087 /* CPTConstraints.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTConstraints.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 070622300FDF1B250066A6C4 /* CPTPathExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPathExtensions.h; sourceTree = ""; }; 070622310FDF1B250066A6C4 /* CPTPathExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPathExtensions.m; sourceTree = ""; }; 0706223A0FDF215C0066A6C4 /* CPTBorderedLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTBorderedLayer.h; sourceTree = ""; }; - 0706223B0FDF215C0066A6C4 /* CPTBorderedLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTBorderedLayer.m; sourceTree = ""; }; + 0706223B0FDF215C0066A6C4 /* CPTBorderedLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTBorderedLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 070A73DA0F5D8C910014FA84 /* CPTDecimalNumberValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTDecimalNumberValueTransformer.h; path = ../MacOnly/CPTDecimalNumberValueTransformer.h; sourceTree = ""; }; 070A73DB0F5D8C910014FA84 /* CPTDecimalNumberValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTDecimalNumberValueTransformer.m; path = ../MacOnly/CPTDecimalNumberValueTransformer.m; sourceTree = ""; }; 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot.h; sourceTree = ""; }; 071F3CB810FBAB5900D0A7B6 /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = License.txt; path = ../License.txt; sourceTree = SOURCE_ROOT; }; 072161E911D1F6BD009CC871 /* CPTAnnotationHostLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnnotationHostLayer.h; sourceTree = ""; }; - 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAnnotationHostLayer.m; sourceTree = ""; }; + 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnnotationHostLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0730F600109492D800E95162 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0730F64C109494D100E95162 /* CPTTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestCase.h; sourceTree = ""; }; 0730F64D109494D100E95162 /* CPTTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestCase.m; sourceTree = ""; }; @@ -668,85 +668,85 @@ 07321BC00F37370D00F423D8 /* CPTExceptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTExceptions.m; sourceTree = ""; }; 07321BC40F37382D00F423D8 /* CPTUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTUtilities.h; sourceTree = ""; }; 07321BC50F37382D00F423D8 /* CPTUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTUtilities.m; sourceTree = ""; }; - 073FB02E0FC991A3007A728E /* CPTAxisLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabel.h; sourceTree = ""; }; - 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisLabel.m; sourceTree = ""; }; + 073FB02E0FC991A3007A728E /* CPTAxisLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAxisLabel.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisLabel.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0772B43710E24D5C009CD04C /* CPTTradingRangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTradingRangePlot.h; sourceTree = ""; }; - 0772B43810E24D5C009CD04C /* CPTTradingRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTradingRangePlot.m; sourceTree = ""; }; - 0772C9250FE2F71600EC4C16 /* CPTTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTheme.h; sourceTree = ""; }; - 0772C9260FE2F71600EC4C16 /* CPTTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTheme.m; sourceTree = ""; }; + 0772B43810E24D5C009CD04C /* CPTTradingRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTradingRangePlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 0772C9250FE2F71600EC4C16 /* CPTTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTheme.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 0772C9260FE2F71600EC4C16 /* CPTTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTheme.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0772C92D0FE2F89000EC4C16 /* _CPTDarkGradientTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTDarkGradientTheme.h; sourceTree = ""; }; 0772C92E0FE2F89000EC4C16 /* _CPTDarkGradientTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTDarkGradientTheme.m; sourceTree = ""; }; 0783DD530FBF097E006C3696 /* CPTXYAxis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYAxis.h; sourceTree = ""; }; - 0783DD540FBF097E006C3696 /* CPTXYAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYAxis.m; sourceTree = ""; }; + 0783DD540FBF097E006C3696 /* CPTXYAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYAxis.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0789EF330FB9E90700C0A613 /* CPTPlatformSpecificDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificDefines.h; sourceTree = ""; }; 0789EF340FB9E90700C0A613 /* CPTPlatformSpecificDefines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificDefines.m; sourceTree = ""; }; 0789EF470FB9EBD600C0A613 /* CPTPlatformSpecificCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificCategories.h; sourceTree = ""; }; - 0789EF480FB9EBD600C0A613 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificCategories.m; sourceTree = ""; }; + 0789EF480FB9EBD600C0A613 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlatformSpecificCategories.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0789EF890FB9EE4700C0A613 /* CPTPlatformSpecificFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificFunctions.h; sourceTree = ""; }; 0789EF8A0FB9EE4700C0A613 /* CPTPlatformSpecificFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificFunctions.m; sourceTree = ""; }; - 078F42D90FACC075006E670B /* NSNumberExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNumberExtensions.h; sourceTree = ""; }; - 078F42DA0FACC075006E670B /* NSNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNumberExtensions.m; sourceTree = ""; }; + 078F42D90FACC075006E670B /* NSNumberExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = NSNumberExtensions.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 078F42DA0FACC075006E670B /* NSNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = NSNumberExtensions.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07975C410F3B816600DE45DC /* CPTXYAxisSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYAxisSet.h; sourceTree = ""; }; - 07975C420F3B816600DE45DC /* CPTXYAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYAxisSet.m; sourceTree = ""; }; - 07975C470F3B818800DE45DC /* CPTAxis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxis.h; sourceTree = ""; }; - 07975C480F3B818800DE45DC /* CPTAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxis.m; sourceTree = ""; }; - 07983EF40F2F9A3D008C8618 /* CPTXYGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYGraph.h; sourceTree = ""; }; - 07983EF50F2F9A3D008C8618 /* CPTXYGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYGraph.m; sourceTree = ""; }; - 0799E0930F2BB5F300790525 /* CPTBarPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTBarPlot.h; sourceTree = ""; }; - 0799E0940F2BB5F300790525 /* CPTBarPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTBarPlot.m; sourceTree = ""; }; + 07975C420F3B816600DE45DC /* CPTXYAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYAxisSet.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07975C470F3B818800DE45DC /* CPTAxis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAxis.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07975C480F3B818800DE45DC /* CPTAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxis.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07983EF40F2F9A3D008C8618 /* CPTXYGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTXYGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07983EF50F2F9A3D008C8618 /* CPTXYGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYGraph.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 0799E0930F2BB5F300790525 /* CPTBarPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTBarPlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 0799E0940F2BB5F300790525 /* CPTBarPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTBarPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0799E0970F2BB6E800790525 /* CPTXYPlotSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYPlotSpace.h; sourceTree = ""; }; - 079FC0B20FB975500037E990 /* CPTColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTColor.h; sourceTree = ""; }; - 079FC0B30FB975500037E990 /* CPTColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTColor.m; sourceTree = ""; }; - 079FC0BB0FB9762B0037E990 /* CPTColorSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTColorSpace.h; sourceTree = ""; }; - 079FC0BC0FB9762B0037E990 /* CPTColorSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTColorSpace.m; sourceTree = ""; }; - 07A2E6FA102DF47900809BC5 /* CPTTimeFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTimeFormatter.h; sourceTree = ""; }; - 07A2E6FB102DF47900809BC5 /* CPTTimeFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTimeFormatter.m; sourceTree = ""; }; + 079FC0B20FB975500037E990 /* CPTColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTColor.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 079FC0B30FB975500037E990 /* CPTColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTColor.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 079FC0BB0FB9762B0037E990 /* CPTColorSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTColorSpace.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 079FC0BC0FB9762B0037E990 /* CPTColorSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTColorSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07A2E6FA102DF47900809BC5 /* CPTTimeFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTimeFormatter.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07A2E6FB102DF47900809BC5 /* CPTTimeFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTimeFormatter.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07AEF1FD10BBE1F10012BEFF /* CPTResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTResponder.h; sourceTree = ""; }; 07B69A5B12B6215000F4C16C /* CPTTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTextStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextStyle.m; sourceTree = ""; }; + 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTextStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableLineStyle.h; sourceTree = ""; }; 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableLineStyle.m; sourceTree = ""; }; 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGraph.h; sourceTree = ""; }; - 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGraph.m; sourceTree = ""; }; + 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGraph.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D760F2B723A002FCEA7 /* CPTPlotAreaFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotAreaFrame.h; sourceTree = ""; }; - 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotAreaFrame.m; sourceTree = ""; }; - 07BF0D7A0F2B72B0002FCEA7 /* CPTPlotSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotSpace.h; sourceTree = ""; }; - 07BF0D7B0F2B72B0002FCEA7 /* CPTPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotSpace.m; sourceTree = ""; }; - 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlot.h; sourceTree = ""; }; - 07BF0D7F0F2B72F6002FCEA7 /* CPTPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlot.m; sourceTree = ""; }; + 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotAreaFrame.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07BF0D7A0F2B72B0002FCEA7 /* CPTPlotSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlotSpace.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07BF0D7B0F2B72B0002FCEA7 /* CPTPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07BF0D7F0F2B72F6002FCEA7 /* CPTPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D820F2B7340002FCEA7 /* CPTAxisSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisSet.h; sourceTree = ""; }; - 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisSet.m; sourceTree = ""; }; - 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTScatterPlot.h; sourceTree = ""; }; - 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTScatterPlot.m; sourceTree = ""; }; + 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisSet.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTScatterPlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDefinitions.h; sourceTree = ""; }; 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDefinitions.m; sourceTree = ""; }; 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableTextStyle.h; sourceTree = ""; }; 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableTextStyle.m; sourceTree = ""; }; 07C467B60FE1A96E00299939 /* CPTTextStylePlatformSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextStylePlatformSpecific.h; path = MacOnly/CPTTextStylePlatformSpecific.h; sourceTree = SOURCE_ROOT; }; 07C467B70FE1A96E00299939 /* CPTTextStylePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTTextStylePlatformSpecific.m; path = MacOnly/CPTTextStylePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 07CA112D0FAC8F85000861CE /* CPTGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGradient.h; sourceTree = ""; }; - 07CA112E0FAC8F85000861CE /* CPTGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGradient.m; sourceTree = ""; }; - 07E10BAF11D1016B000B8DAB /* CPTPlotSpaceAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotSpaceAnnotation.h; sourceTree = ""; }; - 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotSpaceAnnotation.m; sourceTree = ""; }; + 07CA112D0FAC8F85000861CE /* CPTGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTGradient.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07CA112E0FAC8F85000861CE /* CPTGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGradient.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07E10BAF11D1016B000B8DAB /* CPTPlotSpaceAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlotSpaceAnnotation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotSpaceAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07E10BB411D10177000B8DAB /* CPTAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnnotation.h; sourceTree = ""; }; - 07E10BB511D10177000B8DAB /* CPTAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAnnotation.m; sourceTree = ""; }; - 07E10BB911D10183000B8DAB /* CPTLayerAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLayerAnnotation.h; sourceTree = ""; }; - 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLayerAnnotation.m; sourceTree = ""; }; + 07E10BB511D10177000B8DAB /* CPTAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 07E10BB911D10183000B8DAB /* CPTLayerAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLayerAnnotation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLayerAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07FCF2C4115B54AE00E46606 /* _CPTSlateTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTSlateTheme.h; sourceTree = ""; }; 07FCF2C5115B54AE00E46606 /* _CPTSlateTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTSlateTheme.m; sourceTree = ""; }; 07FEBD60110B7E8B00E44D37 /* CPTScatterPlotTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTScatterPlotTests.h; sourceTree = ""; }; 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTScatterPlotTests.m; sourceTree = ""; }; 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 32484B3F0F530E8B002151AD /* CPTPlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRange.h; sourceTree = ""; }; - 32484B400F530E8B002151AD /* CPTPlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRange.m; sourceTree = ""; }; + 32484B3F0F530E8B002151AD /* CPTPlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlotRange.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 32484B400F530E8B002151AD /* CPTPlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotRange.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 32DBCF5E0370ADEE00C91783 /* CorePlot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot_Prefix.pch; sourceTree = ""; }; 4C422A620FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYPlotSpaceTests.h; sourceTree = ""; }; 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYPlotSpaceTests.m; sourceTree = ""; }; 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CPTNumericData+TypeConversion.h"; sourceTree = ""; }; 4C97EEF9104D80C400B554F9 /* CPTNumericData+TypeConversions_Generation.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = "CPTNumericData+TypeConversions_Generation.py"; sourceTree = ""; }; - 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericData.h; sourceTree = ""; }; - 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTNumericData.m; sourceTree = ""; }; + 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTNumericData.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTNumericData.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4C97EEFC104D80C400B554F9 /* CPTNumericDataType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericDataType.h; sourceTree = ""; }; 4C97EEFD104D80C400B554F9 /* CPTNumericDataType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTNumericDataType.m; sourceTree = ""; }; 4C97EF05104D80D400B554F9 /* CPTNumericDataTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericDataTests.h; sourceTree = ""; }; @@ -760,10 +760,10 @@ 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDataSourceTestCase.m; sourceTree = ""; }; 4CD23FFA0FFBE78400ADD2E2 /* CPTAxisLabelTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelTests.h; sourceTree = ""; }; 4CD23FFB0FFBE78400ADD2E2 /* CPTAxisLabelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisLabelTests.m; sourceTree = ""; }; - 4CD7E7E50F4B4F8200F9BCBB /* CPTTextLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTextLayer.h; sourceTree = ""; }; - 4CD7E7E60F4B4F8200F9BCBB /* CPTTextLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextLayer.m; sourceTree = ""; }; - 4CD7E7EA0F4B4F9600F9BCBB /* CPTLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLayer.h; sourceTree = ""; }; - 4CD7E7EB0F4B4F9600F9BCBB /* CPTLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLayer.m; sourceTree = ""; }; + 4CD7E7E50F4B4F8200F9BCBB /* CPTTextLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTextLayer.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 4CD7E7E60F4B4F8200F9BCBB /* CPTTextLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTextLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 4CD7E7EA0F4B4F9600F9BCBB /* CPTLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLayer.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 4CD7E7EB0F4B4F9600F9BCBB /* CPTLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4CD7E7EE0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDecimalNumberExtensions.h; sourceTree = ""; }; 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDecimalNumberExtensions.m; sourceTree = ""; }; 4CD7E9620F4B625900F9BCBB /* CPTUtilitiesTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTUtilitiesTests.h; sourceTree = ""; }; @@ -771,9 +771,9 @@ 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CorePlot-Info.plist"; sourceTree = ""; }; 8DC2EF5B0486A6940098B216 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9021E5690FC69B2900443472 /* doxygen.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = doxygen.config; path = ../documentation/doxygen/doxygen.config; sourceTree = SOURCE_ROOT; }; - 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLineStyle.h; sourceTree = ""; }; - 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLineStyle.m; sourceTree = ""; }; - 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYPlotSpace.m; sourceTree = ""; }; + 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationNSDecimalPeriod.m; sourceTree = ""; }; A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGSizePeriod.h; sourceTree = ""; }; A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationNSDecimalPeriod.h; sourceTree = ""; }; @@ -791,17 +791,17 @@ BC55023010059F22005DF982 /* _CPTStocksTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTStocksTheme.h; sourceTree = ""; }; BC55023110059F22005DF982 /* _CPTStocksTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTStocksTheme.m; sourceTree = ""; }; BC74A32E10FC402600E7E90D /* CPTPieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPieChart.h; sourceTree = ""; }; - BC74A32F10FC402600E7E90D /* CPTPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPieChart.m; sourceTree = ""; }; + BC74A32F10FC402600E7E90D /* CPTPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPieChart.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; BC79F1340FD1CD6600510976 /* CPTGraphHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGraphHostingView.h; sourceTree = ""; }; - BC79F1350FD1CD6600510976 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGraphHostingView.m; sourceTree = ""; }; + BC79F1350FD1CD6600510976 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGraphHostingView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; BC89A64010239D1D009D5261 /* CorePlotProbes.d */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.dtrace; name = CorePlotProbes.d; path = TestResources/CorePlotProbes.d; sourceTree = SOURCE_ROOT; }; BCFC7C3510921FDB00DAECAA /* CPTAxisTitle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisTitle.h; sourceTree = ""; }; - BCFC7C3610921FDB00DAECAA /* CPTAxisTitle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisTitle.m; sourceTree = ""; }; - C30550EB1399BE5400E0151F /* CPTLegendEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLegendEntry.h; sourceTree = ""; }; - C30550EC1399BE5400E0151F /* CPTLegendEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLegendEntry.m; sourceTree = ""; }; + BCFC7C3610921FDB00DAECAA /* CPTAxisTitle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisTitle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C30550EB1399BE5400E0151F /* CPTLegendEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLegendEntry.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C30550EC1399BE5400E0151F /* CPTLegendEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLegendEntry.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C30E979F14B290520012204A /* DoxygenLayout.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = DoxygenLayout.xml; path = ../documentation/doxygen/DoxygenLayout.xml; sourceTree = ""; }; - C318F4AB11EA188700595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLimitBand.h; sourceTree = ""; }; - C318F4AC11EA188700595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLimitBand.m; sourceTree = ""; }; + C318F4AB11EA188700595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLimitBand.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C318F4AC11EA188700595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLimitBand.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C31908A41998168C00B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlot.xcconfig; sourceTree = ""; }; C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; @@ -816,30 +816,30 @@ C3226A551A69F6F000F77249 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; C3226A571A69F6FA00F77249 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; C3286BFE15D8740100A436A8 /* _CPTMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTMaskLayer.h; sourceTree = ""; }; - C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTMaskLayer.m; sourceTree = ""; }; + C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTMaskLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C32B391610AA4C78000470D4 /* CPTGridLines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGridLines.h; sourceTree = ""; }; - C32B391710AA4C78000470D4 /* CPTGridLines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGridLines.m; sourceTree = ""; }; - C32EE1B413EC4AA800038266 /* CPTShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTShadow.h; sourceTree = ""; }; - C32EE1B513EC4AA800038266 /* CPTShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTShadow.m; sourceTree = ""; }; + C32B391710AA4C78000470D4 /* CPTGridLines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGridLines.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C32EE1B413EC4AA800038266 /* CPTShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTShadow.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C32EE1B513EC4AA800038266 /* CPTShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTShadow.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C32EE1BF13EC4BE700038266 /* CPTMutableShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableShadow.h; sourceTree = ""; }; C32EE1C013EC4BE700038266 /* CPTMutableShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableShadow.m; sourceTree = ""; }; C3392A371225F667008DA6BD /* CPTNumericData+TypeConversion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CPTNumericData+TypeConversion.m"; sourceTree = ""; }; C3408C3C15FC1C3E004F1D70 /* _CPTBorderLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTBorderLayer.h; sourceTree = ""; }; - C3408C3D15FC1C3E004F1D70 /* _CPTBorderLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTBorderLayer.m; sourceTree = ""; }; - C34260180FAE096C00072842 /* _CPTFillImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTFillImage.h; sourceTree = ""; }; - C34260190FAE096C00072842 /* _CPTFillGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTFillGradient.m; sourceTree = ""; }; - C342601A0FAE096C00072842 /* CPTFill.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTFill.m; sourceTree = ""; }; - C342601B0FAE096C00072842 /* _CPTFillColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTFillColor.h; sourceTree = ""; }; - C342601C0FAE096C00072842 /* _CPTFillColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTFillColor.m; sourceTree = ""; }; - C342601D0FAE096C00072842 /* _CPTFillImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTFillImage.m; sourceTree = ""; }; - C342601E0FAE096C00072842 /* _CPTFillGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTFillGradient.h; sourceTree = ""; }; - C342601F0FAE096C00072842 /* CPTFill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTFill.h; sourceTree = ""; }; - C349DCB2151AAFBF00BFD6A7 /* CPTCalendarFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTCalendarFormatter.h; sourceTree = ""; }; - C349DCB3151AAFBF00BFD6A7 /* CPTCalendarFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTCalendarFormatter.m; sourceTree = ""; }; - C34AFE6911021D010041675A /* CPTPlotSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotSymbol.h; sourceTree = ""; }; - C34AFE6A11021D010041675A /* CPTPlotSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotSymbol.m; sourceTree = ""; }; + C3408C3D15FC1C3E004F1D70 /* _CPTBorderLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTBorderLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C34260180FAE096C00072842 /* _CPTFillImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = _CPTFillImage.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C34260190FAE096C00072842 /* _CPTFillGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTFillGradient.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C342601A0FAE096C00072842 /* CPTFill.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTFill.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C342601B0FAE096C00072842 /* _CPTFillColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = _CPTFillColor.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C342601C0FAE096C00072842 /* _CPTFillColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTFillColor.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C342601D0FAE096C00072842 /* _CPTFillImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTFillImage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C342601E0FAE096C00072842 /* _CPTFillGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = _CPTFillGradient.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C342601F0FAE096C00072842 /* CPTFill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTFill.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C349DCB2151AAFBF00BFD6A7 /* CPTCalendarFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTCalendarFormatter.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C349DCB3151AAFBF00BFD6A7 /* CPTCalendarFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTCalendarFormatter.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C34AFE6911021D010041675A /* CPTPlotSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlotSymbol.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C34AFE6A11021D010041675A /* CPTPlotSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotSymbol.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C34BF5BA10A67633007F0894 /* CPTPlotArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotArea.h; sourceTree = ""; }; - C34BF5BB10A67633007F0894 /* CPTPlotArea.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotArea.m; sourceTree = ""; }; + C34BF5BB10A67633007F0894 /* CPTPlotArea.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotArea.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlotWarnings.xcconfig; sourceTree = ""; }; C36468A80FE5533F0064B186 /* CPTTextStyleTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTextStyleTests.h; sourceTree = ""; }; C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextStyleTests.m; sourceTree = ""; }; @@ -851,40 +851,40 @@ C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libCorePlot-CocoaTouch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CorePlot-CocoaTouchTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextStylePlatformSpecific.h; path = iPhoneOnly/CPTTextStylePlatformSpecific.h; sourceTree = SOURCE_ROOT; }; - C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTextStylePlatformSpecific.m; path = iPhoneOnly/CPTTextStylePlatformSpecific.m; sourceTree = SOURCE_ROOT; }; - C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTImagePlatformSpecific.m; path = iPhoneOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTTextStylePlatformSpecific.m; path = iPhoneOnly/CPTTextStylePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = iPhoneOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C38A0B181A46264500D45436 /* CPTPlatformSpecificCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificCategories.h; path = iPhoneOnly/CPTPlatformSpecificCategories.h; sourceTree = SOURCE_ROOT; }; - C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificCategories.m; path = iPhoneOnly/CPTPlatformSpecificCategories.m; sourceTree = SOURCE_ROOT; }; + C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTPlatformSpecificCategories.m; path = iPhoneOnly/CPTPlatformSpecificCategories.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C38A0B1A1A46264500D45436 /* CPTPlatformSpecificDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificDefines.h; path = iPhoneOnly/CPTPlatformSpecificDefines.h; sourceTree = SOURCE_ROOT; }; C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificDefines.m; path = iPhoneOnly/CPTPlatformSpecificDefines.m; sourceTree = SOURCE_ROOT; }; C38A0B1C1A46264500D45436 /* CPTPlatformSpecificFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlatformSpecificFunctions.h; path = iPhoneOnly/CPTPlatformSpecificFunctions.h; sourceTree = SOURCE_ROOT; }; C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlatformSpecificFunctions.m; path = iPhoneOnly/CPTPlatformSpecificFunctions.m; sourceTree = SOURCE_ROOT; }; C38A0B271A46265300D45436 /* CPTGraphHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGraphHostingView.h; path = iPhoneOnly/CPTGraphHostingView.h; sourceTree = SOURCE_ROOT; }; - C38A0B281A46265300D45436 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGraphHostingView.m; path = iPhoneOnly/CPTGraphHostingView.m; sourceTree = SOURCE_ROOT; }; + C38A0B281A46265300D45436 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTGraphHostingView.m; path = iPhoneOnly/CPTGraphHostingView.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C38DD49111A04B7A002A68E7 /* CPTGridLineGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGridLineGroup.h; sourceTree = ""; }; - C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGridLineGroup.m; sourceTree = ""; }; - C3920AC21395B6500045F3BB /* CPTLegend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLegend.h; sourceTree = ""; }; - C3920AC31395B6500045F3BB /* CPTLegend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLegend.m; sourceTree = ""; }; + C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGridLineGroup.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C3920AC21395B6500045F3BB /* CPTLegend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLegend.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3920AC31395B6500045F3BB /* CPTLegend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLegend.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3978E0413CE653B00A420D9 /* NSCoderExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCoderExtensions.h; sourceTree = ""; }; C3978E0513CE653B00A420D9 /* NSCoderExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCoderExtensions.m; sourceTree = ""; }; C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutablePlotRange.h; sourceTree = ""; }; C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutablePlotRange.m; sourceTree = ""; }; C3AFC9CF0FB62969005DFFDC /* CPTImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTImage.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - C3AFC9D00FB62969005DFFDC /* CPTImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTImage.m; sourceTree = ""; }; + C3AFC9D00FB62969005DFFDC /* CPTImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTImage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3B235631009931400970270 /* doxygen-cocoa-tags.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "doxygen-cocoa-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-tags.xml"; sourceTree = ""; }; C3B25EDF1AC23A7D0063CCD8 /* CorePlot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CorePlot.h; sourceTree = ""; }; C3BB7D1416322F7E00BC9515 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelGroup.h; sourceTree = ""; }; - C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisLabelGroup.m; sourceTree = ""; }; + C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisLabelGroup.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C1C07E1790D3B400E8B1B7 /* CPTLayerTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLayerTests.h; sourceTree = ""; }; C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLayerTests.m; sourceTree = ""; }; - C3C2846F16584EB9006BA43C /* CPTAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnimation.h; sourceTree = ""; }; - C3C2847016584EB9006BA43C /* CPTAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAnimation.m; sourceTree = ""; }; + C3C2846F16584EB9006BA43C /* CPTAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3C2847016584EB9006BA43C /* CPTAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationTimingFunctions.h; sourceTree = ""; }; C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationTimingFunctions.m; sourceTree = ""; }; C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnimationOperation.h; sourceTree = ""; }; - C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAnimationOperation.m; sourceTree = ""; }; - C3C9CB11165DB50300739006 /* CPTAnimationPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimationPeriod.h; sourceTree = ""; }; + C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimationOperation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C3C9CB11165DB50300739006 /* CPTAnimationPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimationPeriod.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimationPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C9CB15165DB52C00739006 /* _CPTAnimationCGFloatPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGFloatPeriod.h; sourceTree = ""; }; C3C9CB16165DB52C00739006 /* _CPTAnimationCGFloatPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationCGFloatPeriod.m; sourceTree = ""; }; @@ -894,12 +894,12 @@ C3CAFB251229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CPTMutableNumericData+TypeConversion.m"; sourceTree = ""; }; C3CB561A122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableNumericDataTypeConversionTests.h; sourceTree = ""; }; C3CB561B122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableNumericDataTypeConversionTests.m; sourceTree = ""; }; - C3CCA03913E8D85800CE6DB1 /* _CPTConstraintsFixed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTConstraintsFixed.h; sourceTree = ""; }; - C3CCA03A13E8D85800CE6DB1 /* _CPTConstraintsFixed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTConstraintsFixed.m; sourceTree = ""; }; - C3CCA03B13E8D85800CE6DB1 /* _CPTConstraintsRelative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTConstraintsRelative.h; sourceTree = ""; }; - C3CCA03C13E8D85800CE6DB1 /* _CPTConstraintsRelative.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTConstraintsRelative.m; sourceTree = ""; }; - C3D3AD2B13DF8DCE0004EA73 /* CPTLineCap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLineCap.h; sourceTree = ""; }; - C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLineCap.m; sourceTree = ""; }; + C3CCA03913E8D85800CE6DB1 /* _CPTConstraintsFixed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = _CPTConstraintsFixed.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3CCA03A13E8D85800CE6DB1 /* _CPTConstraintsFixed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTConstraintsFixed.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C3CCA03B13E8D85800CE6DB1 /* _CPTConstraintsRelative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = _CPTConstraintsRelative.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3CCA03C13E8D85800CE6DB1 /* _CPTConstraintsRelative.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTConstraintsRelative.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C3D3AD2B13DF8DCE0004EA73 /* CPTLineCap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineCap.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineCap.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3D68B83122201A700EB4863 /* CPTNumericDataTypeConversionPerformanceTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericDataTypeConversionPerformanceTests.h; sourceTree = ""; }; C3D68B84122201A700EB4863 /* CPTNumericDataTypeConversionPerformanceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTNumericDataTypeConversionPerformanceTests.m; sourceTree = ""; }; C3D979A213D2136600145DFF /* CPTPlotSpaceTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotSpaceTests.h; sourceTree = ""; }; @@ -918,15 +918,15 @@ C3D979B713D2344000145DFF /* CPTLineStyleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLineStyleTests.m; sourceTree = ""; }; C3D979B913D2347300145DFF /* CPTFillTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTFillTests.h; sourceTree = ""; }; C3D979BA13D2347300145DFF /* CPTFillTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTFillTests.m; sourceTree = ""; }; - C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTXYTheme.m; sourceTree = ""; }; + C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTXYTheme.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3DA34CB107AD7710051DA02 /* _CPTXYTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTXYTheme.h; sourceTree = ""; }; C3EE4E971A6C1E890098F4E6 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - C3F31DE71045EB470058520A /* CPTPlotGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotGroup.m; sourceTree = ""; }; + C3F31DE71045EB470058520A /* CPTPlotGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotGroup.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3F31DE81045EB470058520A /* CPTPlotGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotGroup.h; sourceTree = ""; }; - C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTFunctionDataSource.h; sourceTree = ""; }; - C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTFunctionDataSource.m; sourceTree = ""; }; + C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTFunctionDataSource.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTFunctionDataSource.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3FF6EF00FFFA51D00AF0496 /* mainpage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mainpage.h; path = Source/mainpage.h; sourceTree = ""; }; - D0C0477B12D6560900DA8047 /* CPTRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTRangePlot.m; sourceTree = ""; }; + D0C0477B12D6560900DA8047 /* CPTRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTRangePlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D0C0477C12D6560900DA8047 /* CPTRangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTRangePlot.h; sourceTree = ""; }; E1620CBC100F03A100A84E77 /* CPTThemeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTThemeTests.h; sourceTree = ""; }; E1620CBD100F03A100A84E77 /* CPTThemeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTThemeTests.m; sourceTree = ""; }; diff --git a/framework/MacOnly/CPTGraphHostingView.h b/framework/MacOnly/CPTGraphHostingView.h index 118b9a3af..429fdea08 100644 --- a/framework/MacOnly/CPTGraphHostingView.h +++ b/framework/MacOnly/CPTGraphHostingView.h @@ -6,7 +6,7 @@ /// @name Hosted graph /// @{ -@property (nonatomic, readwrite, strong) CPTGraph *hostedGraph; +@property (nonatomic, readwrite, strong, nullable) CPTGraph *hostedGraph; /// @} /// @name Printing @@ -16,8 +16,8 @@ /// @name Cursors /// @{ -@property (nonatomic, readwrite, strong) NSCursor *closedHandCursor; -@property (nonatomic, readwrite, strong) NSCursor *openHandCursor; +@property (nonatomic, readwrite, strong, nullable) NSCursor *closedHandCursor; +@property (nonatomic, readwrite, strong, nullable) NSCursor *openHandCursor; /// @} /// @name User Interaction diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.h b/framework/MacOnly/CPTPlatformSpecificCategories.h index 85d00758e..96732d478 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.h +++ b/framework/MacOnly/CPTPlatformSpecificCategories.h @@ -11,7 +11,7 @@ /// @name Images /// @{ --(CPTNativeImage *)imageOfLayer; +-(nonnull CPTNativeImage *)imageOfLayer; /// @} @end @@ -23,7 +23,7 @@ **/ @interface CPTColor(CPTPlatformSpecificColorExtensions) -@property (nonatomic, readonly) NSColor *nsColor; +@property (nonatomic, readonly, nonnull) NSColor *nsColor; @end @@ -36,7 +36,7 @@ /// @name Drawing /// @{ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context; +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.h b/framework/MacOnly/CPTPlatformSpecificFunctions.h index 0808b3f02..5812e583b 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.h +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.h @@ -8,21 +8,21 @@ extern "C" { /// @name Graphics Context Save Stack /// @{ -void CPTPushCGContext(CGContextRef context); +void CPTPushCGContext(__nonnull CGContextRef context); void CPTPopCGContext(void); /// @} /// @name Graphics Context /// @{ -CGContextRef CPTGetCurrentContext(void); +__nonnull CGContextRef CPTGetCurrentContext(void); /// @} /// @name Color Conversion /// @{ -CGColorRef CPTCreateCGColorFromNSColor(NSColor *nsColor); -CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *nsColor); +__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor); +CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor); /// @} diff --git a/framework/Source/CPTAnimation.h b/framework/Source/CPTAnimation.h index 9a6a707fa..e5455235d 100644 --- a/framework/Source/CPTAnimation.h +++ b/framework/Source/CPTAnimation.h @@ -52,27 +52,27 @@ typedef NS_ENUM (NSInteger, CPTAnimationCurve) { /** @brief @optional Informs the delegate that an animation operation started animating. * @param operation The animation operation. **/ --(void)animationDidStart:(CPTAnimationOperation *)operation; +-(void)animationDidStart:(nonnull CPTAnimationOperation *)operation; /** @brief @optional Informs the delegate that an animation operation stopped after reaching its full duration. * @param operation The animation operation. **/ --(void)animationDidFinish:(CPTAnimationOperation *)operation; +-(void)animationDidFinish:(nonnull CPTAnimationOperation *)operation; /** @brief @optional Informs the delegate that an animation operation was stopped before reaching its full duration. * @param operation The animation operation. **/ --(void)animationCancelled:(CPTAnimationOperation *)operation; +-(void)animationCancelled:(nonnull CPTAnimationOperation *)operation; /** @brief @optional Informs the delegate that the animated property is about to update. * @param operation The animation operation. **/ --(void)animationWillUpdate:(CPTAnimationOperation *)operation; +-(void)animationWillUpdate:(nonnull CPTAnimationOperation *)operation; /** @brief @optional Informs the delegate that the animated property has been updated. * @param operation The animation operation. **/ --(void)animationDidUpdate:(CPTAnimationOperation *)operation; +-(void)animationDidUpdate:(nonnull CPTAnimationOperation *)operation; /// @} @@ -94,24 +94,24 @@ typedef NS_ENUM (NSInteger, CPTAnimationCurve) { /// @name Animation Controller Instance /// @{ -+(instancetype)sharedInstance; ++(nonnull instancetype)sharedInstance; /// @} /// @name Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property period:(CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nullable id)object property:(nonnull NSString *)property period:(nullable CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; /// @} /// @name Animation Management /// @{ --(CPTAnimationOperation *)addAnimationOperation:(CPTAnimationOperation *)animationOperation; --(void)removeAnimationOperation:(CPTAnimationOperation *)animationOperation; +-(nonnull CPTAnimationOperation *)addAnimationOperation:(nonnull CPTAnimationOperation *)animationOperation; +-(void)removeAnimationOperation:(nullable CPTAnimationOperation *)animationOperation; -(void)removeAllAnimationOperations; /// @} /// @name Retrieving Animation Operations /// @{ --(CPTAnimationOperation *)operationWithIdentifier:(id)identifier; +-(nullable CPTAnimationOperation *)operationWithIdentifier:(nullable id)identifier; /// @} @end diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 9fd8ee0cc..a0c820c7e 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -16,15 +16,15 @@ @interface CPTAnimation() @property (nonatomic, readwrite, assign) CGFloat timeOffset; -@property (nonatomic, readwrite, strong) NSMutableArray *animationOperations; -@property (nonatomic, readwrite, strong) NSMutableArray *runningAnimationOperations; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *animationOperations; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *runningAnimationOperations; @property (nonatomic, readwrite) dispatch_source_t timer; @property (nonatomic, readwrite) dispatch_queue_t animationQueue; -+(SEL)setterFromProperty:(NSString *)property; ++(nonnull SEL)setterFromProperty:(nonnull NSString *)property; -(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve; --(void)updateOnMainThreadWithParameters:(NSDictionary *)parameters; +-(void)updateOnMainThreadWithParameters:(nonnull NSDictionary *)parameters; -(void)startTimer; -(void)cancelTimer; diff --git a/framework/Source/CPTAnimationOperation.h b/framework/Source/CPTAnimationOperation.h index 391410f6f..b90cb2dd0 100644 --- a/framework/Source/CPTAnimationOperation.h +++ b/framework/Source/CPTAnimationOperation.h @@ -7,20 +7,20 @@ /// @name Animation Timing /// @{ -@property (nonatomic, strong) CPTAnimationPeriod *period; +@property (nonatomic, strong, nonnull) CPTAnimationPeriod *period; @property (nonatomic, assign) CPTAnimationCurve animationCurve; /// @} /// @name Animated Property /// @{ -@property (nonatomic, strong) id boundObject; -@property (nonatomic) SEL boundGetter; -@property (nonatomic) SEL boundSetter; +@property (nonatomic, strong, nonnull) id boundObject; +@property (nonatomic, nonnull) SEL boundGetter; +@property (nonatomic, nonnull) SEL boundSetter; /// @} /// @name Delegate /// @{ -@property (nonatomic, cpt_weak_property) __cpt_weak id delegate; +@property (nonatomic, cpt_weak_property, nullable) __cpt_weak id delegate; /// @} /// @name Status @@ -30,8 +30,8 @@ /// @name Identification /// @{ -@property (nonatomic, readwrite, copy) id identifier; -@property (nonatomic, readwrite, copy) NSDictionary *userInfo; +@property (nonatomic, readwrite, copy, nullable) id identifier; +@property (nonatomic, readwrite, copy, nullable) NSDictionary *userInfo; /// @} @end diff --git a/framework/Source/CPTAnimationPeriod.h b/framework/Source/CPTAnimationPeriod.h index 14e28d78c..f0700e2c8 100644 --- a/framework/Source/CPTAnimationPeriod.h +++ b/framework/Source/CPTAnimationPeriod.h @@ -7,8 +7,8 @@ /// @name Timing Values /// @{ -@property (nonatomic, readwrite, copy) NSValue *startValue; -@property (nonatomic, readwrite, copy) NSValue *endValue; +@property (nonatomic, readwrite, copy, nonnull) NSValue *startValue; +@property (nonatomic, readwrite, copy, nonnull) NSValue *endValue; @property (nonatomic, readwrite) CGFloat duration; @property (nonatomic, readwrite) CGFloat delay; @property (nonatomic, readonly) CGFloat startOffset; @@ -16,22 +16,22 @@ /// @name Factory Methods /// @{ -+(instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -+(instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -+(instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -+(instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -+(instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -+(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; /// @} /// @name Initialization /// @{ --(instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; /// @} @end @@ -45,17 +45,17 @@ /// @name Initialization /// @{ --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter; +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter; /// @} /// @name Interpolation /// @{ --(NSValue *)tweenedValueForProgress:(CGFloat)progress; +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress; /// @} /// @name Comparison /// @{ --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter; +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter; /// @} @end @@ -66,44 +66,44 @@ /// @name CGFloat Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration; /// @} /// @name CGPoint Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration; /// @} /// @name CGSize Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration; /// @} /// @name CGRect Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration; /// @} /// @name NSDecimal Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration; /// @} /// @name CPTPlotRange Property Animation /// @{ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate; -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration; /// @} @end diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index 9d2591ed7..2c53a6d2d 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -5,8 +5,8 @@ @interface CPTAnnotation : NSObject -@property (nonatomic, readwrite, strong) CPTLayer *contentLayer; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer; +@property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer; @property (nonatomic, readwrite, assign) CGPoint contentAnchorPoint; @property (nonatomic, readwrite, assign) CGPoint displacement; @property (nonatomic, readwrite, assign) CGFloat rotation; diff --git a/framework/Source/CPTAnnotationHostLayer.h b/framework/Source/CPTAnnotationHostLayer.h index 171e93b23..127c281b0 100644 --- a/framework/Source/CPTAnnotationHostLayer.h +++ b/framework/Source/CPTAnnotationHostLayer.h @@ -4,12 +4,12 @@ @interface CPTAnnotationHostLayer : CPTLayer -@property (nonatomic, readonly) NSArray *annotations; +@property (nonatomic, readonly, nonnull) NSArray *annotations; /// @name Annotations /// @{ --(void)addAnnotation:(CPTAnnotation *)annotation; --(void)removeAnnotation:(CPTAnnotation *)annotation; +-(void)addAnnotation:(nullable CPTAnnotation *)annotation; +-(void)removeAnnotation:(nullable CPTAnnotation *)annotation; -(void)removeAllAnnotations; /// @} diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index 283ce5247..f413772a0 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -6,7 +6,7 @@ /// @cond @interface CPTAnnotationHostLayer() -@property (nonatomic, readwrite, strong) NSMutableArray *mutableAnnotations; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *mutableAnnotations; @end @@ -116,13 +116,15 @@ -(void)addAnnotation:(CPTAnnotation *)annotation **/ -(void)removeAnnotation:(CPTAnnotation *)annotation { - if ( [self.mutableAnnotations containsObject:annotation] ) { - annotation.annotationHostLayer = nil; - [self.mutableAnnotations removeObject:annotation]; - } - else { - CPTAnnotationHostLayer *hostLayer = annotation.annotationHostLayer; - [NSException raise:CPTException format:@"Tried to remove CPTAnnotation from %@. Host layer was %@.", self, hostLayer]; + if ( annotation ) { + if ( [self.mutableAnnotations containsObject:annotation] ) { + annotation.annotationHostLayer = nil; + [self.mutableAnnotations removeObject:annotation]; + } + else { + CPTAnnotationHostLayer *hostLayer = annotation.annotationHostLayer; + [NSException raise:CPTException format:@"Tried to remove CPTAnnotation from %@. Host layer was %@.", self, hostLayer]; + } } } diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index a2e7b3e84..60daae54f 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -44,13 +44,13 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @return @YES if the axis should relabel now. **/ --(BOOL)axisShouldRelabel:(CPTAxis *)axis; +-(BOOL)axisShouldRelabel:(nonnull CPTAxis *)axis; /** @brief @optional The method is called after the axis is relabeled to allow the delegate to perform any * necessary cleanup or further labeling actions. * @param axis The axis. **/ --(void)axisDidRelabel:(CPTAxis *)axis; +-(void)axisDidRelabel:(nonnull CPTAxis *)axis; /** @brief @optional This method gives the delegate a chance to create custom labels for each tick. * It can be used with any labeling policy. Returning @NO will cause the axis not @@ -59,7 +59,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param locations The locations of the major ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(NSSet *)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(nonnull NSSet *)locations; /** @brief @optional This method gives the delegate a chance to create custom labels for each minor tick. * It can be used with any labeling policy. Returning @NO will cause the axis not @@ -68,7 +68,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param locations The locations of the minor ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(NSSet *)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(nonnull NSSet *)locations; /// @} @@ -81,7 +81,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected axis label. **/ --(void)axis:(CPTAxis *)axis labelWasSelected:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis labelWasSelected:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that an axis label * @if MacOnly was both pressed and released. @endif @@ -90,7 +90,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis labelWasSelected:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis labelWasSelected:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was both pressed and released. @endif @@ -98,7 +98,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected minor tick axis label. **/ --(void)axis:(CPTAxis *)axis minorTickLabelWasSelected:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis minorTickLabelWasSelected:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was both pressed and released. @endif @@ -107,7 +107,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected minor tick axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis minorTickLabelWasSelected:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis minorTickLabelWasSelected:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that an axis label * @if MacOnly was pressed. @endif @@ -115,7 +115,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected axis label. **/ --(void)axis:(CPTAxis *)axis labelTouchDown:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis labelTouchDown:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that an axis label * @if MacOnly was pressed. @endif @@ -124,7 +124,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis labelTouchDown:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis labelTouchDown:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that an axis label * @if MacOnly was released. @endif @@ -132,7 +132,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected axis label. **/ --(void)axis:(CPTAxis *)axis labelTouchUp:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis labelTouchUp:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that an axis label * @if MacOnly was released. @endif @@ -141,7 +141,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis labelTouchUp:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis labelTouchUp:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was pressed. @endif @@ -149,7 +149,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected minor tick axis label. **/ --(void)axis:(CPTAxis *)axis minorTickTouchDown:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis minorTickTouchDown:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was pressed. @endif @@ -158,7 +158,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected minor tick axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis minorTickTouchDown:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis minorTickTouchDown:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was released. @endif @@ -166,7 +166,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param axis The axis. * @param label The selected minor tick axis label. **/ --(void)axis:(CPTAxis *)axis minorTickTouchUp:(CPTAxisLabel *)label; +-(void)axis:(nonnull CPTAxis *)axis minorTickTouchUp:(nonnull CPTAxisLabel *)label; /** @brief @optional Informs the delegate that a minor tick axis label * @if MacOnly was released. @endif @@ -175,7 +175,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param label The selected minor tick axis label. * @param event The event that triggered the selection. **/ --(void)axis:(CPTAxis *)axis minorTickTouchUp:(CPTAxisLabel *)label withEvent:(CPTNativeEvent *)event; +-(void)axis:(nonnull CPTAxis *)axis minorTickTouchUp:(nonnull CPTAxisLabel *)label withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -187,27 +187,27 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Axis /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *axisLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *axisLineStyle; @property (nonatomic, readwrite, assign) CPTCoordinate coordinate; -@property (nonatomic, readwrite, strong) NSNumber *labelingOrigin; +@property (nonatomic, readwrite, strong, nullable) NSNumber *labelingOrigin; @property (nonatomic, readwrite, assign) CPTSign tickDirection; -@property (nonatomic, readwrite, copy) CPTPlotRange *visibleRange; -@property (nonatomic, readwrite, copy) CPTPlotRange *visibleAxisRange; -@property (nonatomic, readwrite, copy) CPTLineCap *axisLineCapMin; -@property (nonatomic, readwrite, copy) CPTLineCap *axisLineCapMax; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *visibleRange; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *visibleAxisRange; +@property (nonatomic, readwrite, copy, nullable) CPTLineCap *axisLineCapMin; +@property (nonatomic, readwrite, copy, nullable) CPTLineCap *axisLineCapMax; /// @} /// @name Title /// @{ -@property (nonatomic, readwrite, copy) CPTTextStyle *titleTextStyle; -@property (nonatomic, readwrite, strong) CPTAxisTitle *axisTitle; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *titleTextStyle; +@property (nonatomic, readwrite, strong, nullable) CPTAxisTitle *axisTitle; @property (nonatomic, readwrite, assign) CGFloat titleOffset; -@property (nonatomic, readwrite, copy) NSString *title; -@property (nonatomic, readwrite, copy) NSAttributedString *attributedTitle; +@property (nonatomic, readwrite, copy, nullable) NSString *title; +@property (nonatomic, readwrite, copy, nullable) NSAttributedString *attributedTitle; @property (nonatomic, readwrite, assign) CGFloat titleRotation; @property (nonatomic, readwrite, assign) CPTSign titleDirection; -@property (nonatomic, readwrite, strong) NSNumber *titleLocation; -@property (nonatomic, readonly) NSNumber *defaultTitleLocation; +@property (nonatomic, readwrite, strong, nullable) NSNumber *titleLocation; +@property (nonatomic, readonly, nonnull) NSNumber *defaultTitleLocation; /// @} /// @name Labels @@ -219,26 +219,26 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { @property (nonatomic, readwrite, assign) CGFloat minorTickLabelRotation; @property (nonatomic, readwrite, assign) CPTAlignment labelAlignment; @property (nonatomic, readwrite, assign) CPTAlignment minorTickLabelAlignment; -@property (nonatomic, readwrite, copy) CPTTextStyle *labelTextStyle; -@property (nonatomic, readwrite, copy) CPTTextStyle *minorTickLabelTextStyle; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *labelTextStyle; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *minorTickLabelTextStyle; @property (nonatomic, readwrite, assign) CPTSign tickLabelDirection; @property (nonatomic, readwrite, assign) CPTSign minorTickLabelDirection; -@property (nonatomic, readwrite, strong) NSFormatter *labelFormatter; -@property (nonatomic, readwrite, strong) NSFormatter *minorTickLabelFormatter; -@property (nonatomic, readwrite, strong) NSSet *axisLabels; -@property (nonatomic, readwrite, strong) NSSet *minorTickAxisLabels; +@property (nonatomic, readwrite, strong, nullable) NSFormatter *labelFormatter; +@property (nonatomic, readwrite, strong, nullable) NSFormatter *minorTickLabelFormatter; +@property (nonatomic, readwrite, strong, nullable) NSSet *axisLabels; +@property (nonatomic, readwrite, strong, nullable) NSSet *minorTickAxisLabels; @property (nonatomic, readonly) BOOL needsRelabel; -@property (nonatomic, readwrite, strong) NSArray *labelExclusionRanges; -@property (nonatomic, readwrite, strong) CPTShadow *labelShadow; -@property (nonatomic, readwrite, strong) CPTShadow *minorTickLabelShadow; +@property (nonatomic, readwrite, strong, nullable) NSArray *labelExclusionRanges; +@property (nonatomic, readwrite, strong, nullable) CPTShadow *labelShadow; +@property (nonatomic, readwrite, strong, nullable) CPTShadow *minorTickLabelShadow; /// @} /// @name Major Ticks /// @{ -@property (nonatomic, readwrite, strong) NSNumber *majorIntervalLength; +@property (nonatomic, readwrite, strong, nullable) NSNumber *majorIntervalLength; @property (nonatomic, readwrite, assign) CGFloat majorTickLength; -@property (nonatomic, readwrite, copy) CPTLineStyle *majorTickLineStyle; -@property (nonatomic, readwrite, strong) NSSet *majorTickLocations; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *majorTickLineStyle; +@property (nonatomic, readwrite, strong, nullable) NSSet *majorTickLocations; @property (nonatomic, readwrite, assign) NSUInteger preferredNumberOfMajorTicks; /// @} @@ -246,35 +246,35 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @{ @property (nonatomic, readwrite, assign) NSUInteger minorTicksPerInterval; @property (nonatomic, readwrite, assign) CGFloat minorTickLength; -@property (nonatomic, readwrite, copy) CPTLineStyle *minorTickLineStyle; -@property (nonatomic, readwrite, strong) NSSet *minorTickLocations; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *minorTickLineStyle; +@property (nonatomic, readwrite, strong, nullable) NSSet *minorTickLocations; /// @} /// @name Grid Lines /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *majorGridLineStyle; -@property (nonatomic, readwrite, copy) CPTLineStyle *minorGridLineStyle; -@property (nonatomic, readwrite, copy) CPTPlotRange *gridLinesRange; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *majorGridLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *minorGridLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *gridLinesRange; /// @} /// @name Background Bands /// @{ -@property (nonatomic, readwrite, copy) NSArray *alternatingBandFills; -@property (nonatomic, readonly) NSArray *backgroundLimitBands; +@property (nonatomic, readwrite, copy, nullable) NSArray *alternatingBandFills; +@property (nonatomic, readonly, nullable) NSArray *backgroundLimitBands; /// @} /// @name Plot Space /// @{ -@property (nonatomic, readwrite, strong) CPTPlotSpace *plotSpace; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpace *plotSpace; /// @} /// @name Layers /// @{ @property (nonatomic, readwrite, assign) BOOL separateLayers; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTPlotArea *plotArea; -@property (nonatomic, readonly) __cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readonly) __cpt_weak CPTGridLines *majorGridLines; -@property (nonatomic, readonly) CPTAxisSet *axisSet; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlotArea *plotArea; +@property (nonatomic, readonly, nullable) __cpt_weak CPTGridLines *minorGridLines; +@property (nonatomic, readonly, nullable) __cpt_weak CPTGridLines *majorGridLines; +@property (nonatomic, readonly, nullable) CPTAxisSet *axisSet; /// @} /// @name Title @@ -292,14 +292,14 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Ticks /// @{ --(NSSet *)filteredMajorTickLocations:(NSSet *)allLocations; --(NSSet *)filteredMinorTickLocations:(NSSet *)allLocations; +-(nullable NSSet *)filteredMajorTickLocations:(nullable NSSet *)allLocations; +-(nullable NSSet *)filteredMinorTickLocations:(nullable NSSet *)allLocations; /// @} /// @name Background Bands /// @{ --(void)addBackgroundLimitBand:(CPTLimitBand *)limitBand; --(void)removeBackgroundLimitBand:(CPTLimitBand *)limitBand; +-(void)addBackgroundLimitBand:(nullable CPTLimitBand *)limitBand; +-(void)removeBackgroundLimitBand:(nullable CPTLimitBand *)limitBand; -(void)removeAllBackgroundLimitBands; /// @} @@ -314,18 +314,18 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Coordinate Space Conversions /// @{ --(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue; +-(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *)coordinateValue; /// @} /// @name Grid Lines /// @{ --(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major; +-(void)drawGridLinesInContext:(nonnull CGContextRef)context isMajor:(BOOL)major; /// @} /// @name Background Bands /// @{ --(void)drawBackgroundBandsInContext:(CGContextRef)context; --(void)drawBackgroundLimitsInContext:(CGContextRef)context; +-(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context; +-(void)drawBackgroundLimitsInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 2831e3cd9..e1e563b96 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -35,22 +35,22 @@ @interface CPTAxis() @property (nonatomic, readwrite, assign) BOOL needsRelabel; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTGridLines *majorGridLines; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAxisLabel *pointingDeviceDownLabel; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGridLines *minorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGridLines *majorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxisLabel *pointingDeviceDownLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; @property (nonatomic, readwrite, assign) BOOL labelFormatterChanged; @property (nonatomic, readwrite, assign) BOOL minorLabelFormatterChanged; -@property (nonatomic, readwrite, strong) NSMutableArray *mutableBackgroundLimitBands; +@property (nonatomic, readwrite, strong, nullable) NSMutableArray *mutableBackgroundLimitBands; @property (nonatomic, readonly) CGFloat tickOffset; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @property (nonatomic, readwrite, assign) BOOL labelsUpdated; --(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations; --(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations; --(void)generateEqualMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations; --(NSSet *)filteredTickLocations:(NSSet *)allLocations; --(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; +-(void)generateFixedIntervalMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; +-(void)autoGenerateMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; +-(void)generateEqualMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; +-(nullable NSSet *)filteredTickLocations:(nullable NSSet *)allLocations; +-(void)updateAxisLabelsAtLocations:(nullable NSSet *)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; -(void)updateCustomTickLabels; -(void)updateMajorTickLabelOffsets; -(void)updateMinorTickLabelOffsets; diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index e221e3b3e..64bb80a57 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -5,17 +5,17 @@ @interface CPTAxisLabel : NSObject -@property (nonatomic, readwrite, strong) CPTLayer *contentLayer; +@property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; @property (nonatomic, readwrite, assign) CGFloat offset; @property (nonatomic, readwrite, assign) CGFloat rotation; @property (nonatomic, readwrite, assign) CPTAlignment alignment; -@property (nonatomic, readwrite, strong) NSNumber *tickLocation; +@property (nonatomic, readwrite, strong, nullable) NSNumber *tickLocation; /// @name Initialization /// @{ --(instancetype)initWithText:(NSString *)newText textStyle:(CPTTextStyle *)style; --(instancetype)initWithContentLayer:(CPTLayer *)layer NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithText:(nullable NSString *)newText textStyle:(nullable CPTTextStyle *)style; +-(nonnull instancetype)initWithContentLayer:(nonnull CPTLayer *)layer NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Layout diff --git a/framework/Source/CPTAxisSet.h b/framework/Source/CPTAxisSet.h index e75cb05ae..f58c1d639 100644 --- a/framework/Source/CPTAxisSet.h +++ b/framework/Source/CPTAxisSet.h @@ -7,12 +7,12 @@ /// @name Axes /// @{ -@property (nonatomic, readwrite, strong) NSArray *axes; +@property (nonatomic, readwrite, strong, nullable) NSArray *axes; /// @} /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *borderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *borderLineStyle; /// @} /// @name Labels @@ -22,7 +22,7 @@ /// @name Axes /// @{ --(CPTAxis *)axisForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; +-(nullable CPTAxis *)axisForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; /// @} @end diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index 8b6e44175..1548f8925 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -15,11 +15,11 @@ /// @ingroup plotBindingsBarPlot /// @{ -extern NSString *const CPTBarPlotBindingBarLocations; -extern NSString *const CPTBarPlotBindingBarTips; -extern NSString *const CPTBarPlotBindingBarBases; -extern NSString *const CPTBarPlotBindingBarFills; -extern NSString *const CPTBarPlotBindingBarLineStyles; +extern NSString *__nonnull const CPTBarPlotBindingBarLocations; +extern NSString *__nonnull const CPTBarPlotBindingBarTips; +extern NSString *__nonnull const CPTBarPlotBindingBarBases; +extern NSString *__nonnull const CPTBarPlotBindingBarFills; +extern NSString *__nonnull const CPTBarPlotBindingBarLineStyles; /// @} /** @@ -47,7 +47,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of bar fills. **/ --(NSArray *)barFillsForBarPlot:(CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)barFillsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar fill for the given bar plot. * This method will not be called if @@ -58,14 +58,14 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @return The bar fill for the bar with the given index. If the data source returns @nil, the default fill is used. * If the data source returns an NSNull object, no fill is drawn. **/ --(CPTFill *)barFillForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; +-(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; /** @brief @optional Gets an array of bar line styles for the given bar plot. * @param barPlot The bar plot. * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(NSArray *)barLineStylesForBarPlot:(CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)barLineStylesForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given bar plot. * This method will not be called if @@ -76,7 +76,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @return The bar line style for the bar with the given index. If the data source returns @nil, the default line style is used. * If the data source returns an NSNull object, no line is drawn. **/ --(CPTLineStyle *)barLineStyleForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)barLineStyleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; /// @} @@ -88,14 +88,14 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param idx The data index of interest. * @return The title text for the legend entry for the point with the given index. **/ --(NSString *)legendTitleForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; +-(nullable NSString *)legendTitleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; /** @brief @optional Gets the styled legend title for the given bar plot bar. * @param barPlot The bar plot. * @param idx The data index of interest. * @return The styled title text for the legend entry for the point with the given index. **/ --(NSAttributedString *)attributedLegendTitleForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; +-(nullable NSAttributedString *)attributedLegendTitleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; /// @} @end @@ -121,7 +121,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was both pressed and released. @endif @@ -133,7 +133,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -143,7 +143,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)barPlot:(CPTBarPlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)barPlot:(nonnull CPTBarPlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -154,7 +154,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)barPlot:(CPTBarPlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)barPlot:(nonnull CPTBarPlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -164,7 +164,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)barPlot:(CPTBarPlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)barPlot:(nonnull CPTBarPlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -175,7 +175,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)barPlot:(CPTBarPlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)barPlot:(nonnull CPTBarPlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -188,30 +188,30 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { /// @name Appearance /// @{ @property (nonatomic, readwrite, assign) BOOL barWidthsAreInViewCoordinates; -@property (nonatomic, readwrite, strong) NSNumber *barWidth; -@property (nonatomic, readwrite, strong) NSNumber *barOffset; +@property (nonatomic, readwrite, strong, nullable) NSNumber *barWidth; +@property (nonatomic, readwrite, strong, nullable) NSNumber *barOffset; @property (nonatomic, readwrite, assign) CGFloat barCornerRadius; @property (nonatomic, readwrite, assign) CGFloat barBaseCornerRadius; @property (nonatomic, readwrite, assign) BOOL barsAreHorizontal; -@property (nonatomic, readwrite, strong) NSNumber *baseValue; +@property (nonatomic, readwrite, strong, nullable) NSNumber *baseValue; @property (nonatomic, readwrite, assign) BOOL barBasesVary; -@property (nonatomic, readwrite, copy) CPTPlotRange *plotRange; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *plotRange; /// @} /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *lineStyle; -@property (nonatomic, readwrite, copy) CPTFill *fill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *lineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTFill *fill; /// @} /// @name Factory Methods /// @{ -+(instancetype)tubularBarPlotWithColor:(CPTColor *)color horizontalBars:(BOOL)horizontal; ++(nonnull instancetype)tubularBarPlotWithColor:(nonnull CPTColor *)color horizontalBars:(BOOL)horizontal; /// @} /// @name Data Ranges /// @{ --(CPTPlotRange *)plotRangeEnclosingBars; +-(nullable CPTPlotRange *)plotRangeEnclosingBars; /// @} /// @name Bar Style diff --git a/framework/Source/CPTBorderedLayer.h b/framework/Source/CPTBorderedLayer.h index 9af0114ac..617d7bd79 100644 --- a/framework/Source/CPTBorderedLayer.h +++ b/framework/Source/CPTBorderedLayer.h @@ -7,8 +7,8 @@ /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *borderLineStyle; -@property (nonatomic, readwrite, copy) CPTFill *fill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *borderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTFill *fill; /// @} /// @name Layout @@ -18,7 +18,7 @@ /// @name Drawing /// @{ --(void)renderBorderedLayerAsVectorInContext:(CGContextRef)context; +-(void)renderBorderedLayerAsVectorInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTCalendarFormatter.h b/framework/Source/CPTCalendarFormatter.h index f24fd09e8..8bfa23e40 100644 --- a/framework/Source/CPTCalendarFormatter.h +++ b/framework/Source/CPTCalendarFormatter.h @@ -1,14 +1,14 @@ @interface CPTCalendarFormatter : NSNumberFormatter -@property (nonatomic, readwrite, strong) NSDateFormatter *dateFormatter; -@property (nonatomic, readwrite, copy) NSDate *referenceDate; -@property (nonatomic, readwrite, copy) NSCalendar *referenceCalendar; +@property (nonatomic, readwrite, strong, nullable) NSDateFormatter *dateFormatter; +@property (nonatomic, readwrite, copy, nullable) NSDate *referenceDate; +@property (nonatomic, readwrite, copy, nullable) NSCalendar *referenceCalendar; @property (nonatomic, readwrite, assign) NSCalendarUnit referenceCalendarUnit; /// @name Initialization /// @{ --(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTColor.h b/framework/Source/CPTColor.h index 2ddfca1da..f5872e84f 100644 --- a/framework/Source/CPTColor.h +++ b/framework/Source/CPTColor.h @@ -1,38 +1,38 @@ @interface CPTColor : NSObject -@property (nonatomic, readonly) CGColorRef cgColor; +@property (nonatomic, readonly, nonnull) CGColorRef cgColor; @property (nonatomic, readonly, getter = isOpaque) BOOL opaque; /// @name Factory Methods /// @{ -+(instancetype)clearColor; -+(instancetype)whiteColor; -+(instancetype)lightGrayColor; -+(instancetype)grayColor; -+(instancetype)darkGrayColor; -+(instancetype)blackColor; -+(instancetype)redColor; -+(instancetype)greenColor; -+(instancetype)blueColor; -+(instancetype)cyanColor; -+(instancetype)yellowColor; -+(instancetype)magentaColor; -+(instancetype)orangeColor; -+(instancetype)purpleColor; -+(instancetype)brownColor; ++(nonnull instancetype)clearColor; ++(nonnull instancetype)whiteColor; ++(nonnull instancetype)lightGrayColor; ++(nonnull instancetype)grayColor; ++(nonnull instancetype)darkGrayColor; ++(nonnull instancetype)blackColor; ++(nonnull instancetype)redColor; ++(nonnull instancetype)greenColor; ++(nonnull instancetype)blueColor; ++(nonnull instancetype)cyanColor; ++(nonnull instancetype)yellowColor; ++(nonnull instancetype)magentaColor; ++(nonnull instancetype)orangeColor; ++(nonnull instancetype)purpleColor; ++(nonnull instancetype)brownColor; -+(instancetype)colorWithCGColor:(CGColorRef)newCGColor; -+(instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; -+(instancetype)colorWithGenericGray:(CGFloat)gray; ++(nonnull instancetype)colorWithCGColor:(nonnull CGColorRef)newCGColor; ++(nonnull instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; ++(nonnull instancetype)colorWithGenericGray:(CGFloat)gray; /// @} /// @name Initialization /// @{ --(instancetype)initWithCGColor:(CGColorRef)cgColor NS_DESIGNATED_INITIALIZER; --(instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCGColor:(nonnull CGColorRef)cgColor NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; --(instancetype)colorWithAlphaComponent:(CGFloat)alpha; +-(nonnull instancetype)colorWithAlphaComponent:(CGFloat)alpha; /// @} @end diff --git a/framework/Source/CPTColorSpace.h b/framework/Source/CPTColorSpace.h index e2f52026f..fa6b1ddfb 100644 --- a/framework/Source/CPTColorSpace.h +++ b/framework/Source/CPTColorSpace.h @@ -1,16 +1,16 @@ @interface CPTColorSpace : NSObject -@property (nonatomic, readonly) CGColorSpaceRef cgColorSpace; +@property (nonatomic, readonly, nullable) CGColorSpaceRef cgColorSpace; /// @name Factory Methods /// @{ -+(instancetype)genericRGBSpace; ++(nonnull instancetype)genericRGBSpace; /// @} /// @name Initialization /// @{ --(instancetype)initWithCGColorSpace:(CGColorSpaceRef)colorSpace NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCGColorSpace:(nonnull CGColorSpaceRef)colorSpace NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTConstraints.h b/framework/Source/CPTConstraints.h index 2643af39f..c8a4b89ac 100644 --- a/framework/Source/CPTConstraints.h +++ b/framework/Source/CPTConstraints.h @@ -2,16 +2,16 @@ /// @name Factory Methods /// @{ -+(instancetype)constraintWithLowerOffset:(CGFloat)newOffset; -+(instancetype)constraintWithUpperOffset:(CGFloat)newOffset; -+(instancetype)constraintWithRelativeOffset:(CGFloat)newOffset; ++(nonnull instancetype)constraintWithLowerOffset:(CGFloat)newOffset; ++(nonnull instancetype)constraintWithUpperOffset:(CGFloat)newOffset; ++(nonnull instancetype)constraintWithRelativeOffset:(CGFloat)newOffset; /// @} /// @name Initialization /// @{ --(instancetype)initWithLowerOffset:(CGFloat)newOffset; --(instancetype)initWithUpperOffset:(CGFloat)newOffset; --(instancetype)initWithRelativeOffset:(CGFloat)newOffset; +-(nonnull instancetype)initWithLowerOffset:(CGFloat)newOffset; +-(nonnull instancetype)initWithUpperOffset:(CGFloat)newOffset; +-(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset; /// @} @end @@ -23,7 +23,7 @@ /// @name Comparison /// @{ --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint; +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint; /// @} /// @name Position diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index e97eb7ab2..1ca6a5762 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -55,6 +55,39 @@ #define cpt_deprecated __attribute__( (deprecated) ) +// Nullability + +/** + * @def cpt_nullable + * @hideinitializer + * @brief Marks a pointer declaration as nullable. + **/ + +/** + * @def cpt_nonnull + * @hideinitializer + * @brief Marks a pointer declaration as non-null. + **/ + +#if __clang__ && ( ( (__clang_major__ == 6) && (__clang_minor__ >= 1 ) ) || (__clang_major__ > 6 ) ) +// nullable symbols are already defined +#else +#define nullable +#define nonnull +#define __nullable +#define __nonnull +#endif + +// Deprecated methods + +/** + * @def cpt_deprecated + * @hideinitializer + * @brief Marks a method declaration as deprecated. + **/ + +#define cpt_deprecated __attribute__( (deprecated) ) + // Type safety defines /** diff --git a/framework/Source/CPTExceptions.h b/framework/Source/CPTExceptions.h index c7d22e30c..d62def47a 100644 --- a/framework/Source/CPTExceptions.h +++ b/framework/Source/CPTExceptions.h @@ -2,7 +2,7 @@ /// @name Custom Exception Identifiers /// @{ -extern NSString *const CPTException; -extern NSString *const CPTDataException; -extern NSString *const CPTNumericDataException; +extern NSString *__nonnull const CPTException; +extern NSString *__nonnull const CPTDataException; +extern NSString *__nonnull const CPTNumericDataException; /// @} diff --git a/framework/Source/CPTFill.h b/framework/Source/CPTFill.h index aafc1e60c..58d4a425f 100644 --- a/framework/Source/CPTFill.h +++ b/framework/Source/CPTFill.h @@ -6,16 +6,16 @@ /// @name Factory Methods /// @{ -+(instancetype)fillWithColor:(CPTColor *)aColor; -+(instancetype)fillWithGradient:(CPTGradient *)aGradient; -+(instancetype)fillWithImage:(CPTImage *)anImage; ++(nonnull instancetype)fillWithColor:(nullable CPTColor *)aColor; ++(nonnull instancetype)fillWithGradient:(nullable CPTGradient *)aGradient; ++(nonnull instancetype)fillWithImage:(nullable CPTImage *)anImage; /// @} /// @name Initialization /// @{ --(instancetype)initWithColor:(CPTColor *)aColor; --(instancetype)initWithGradient:(CPTGradient *)aGradient; --(instancetype)initWithImage:(CPTImage *)anImage; +-(nonnull instancetype)initWithColor:(nullable CPTColor *)aColor; +-(nonnull instancetype)initWithGradient:(nullable CPTGradient *)aGradient; +-(nonnull instancetype)initWithImage:(nullable CPTImage *)anImage; /// @} @end @@ -26,12 +26,12 @@ @interface CPTFill(AbstractMethods) @property (nonatomic, readonly, getter = isOpaque) BOOL opaque; -@property (nonatomic, readonly) CGColorRef cgColor; +@property (nonatomic, readonly, nullable) CGColorRef cgColor; /// @name Drawing /// @{ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillPathInContext:(CGContextRef)context; +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillPathInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTFunctionDataSource.h b/framework/Source/CPTFunctionDataSource.h index 4912d71a6..b7141b312 100644 --- a/framework/Source/CPTFunctionDataSource.h +++ b/framework/Source/CPTFunctionDataSource.h @@ -16,23 +16,23 @@ typedef double (^CPTDataSourceBlock)(double); @interface CPTFunctionDataSource : NSObject -@property (nonatomic, readonly) CPTDataSourceFunction dataSourceFunction; -@property (nonatomic, readonly) CPTDataSourceBlock dataSourceBlock; -@property (nonatomic, readonly) CPTPlot *dataPlot; +@property (nonatomic, readonly, nullable) CPTDataSourceFunction dataSourceFunction; +@property (nonatomic, readonly, nullable) CPTDataSourceBlock dataSourceBlock; +@property (nonatomic, readonly, nonnull) CPTPlot *dataPlot; @property (nonatomic, readwrite) CGFloat resolution; -@property (nonatomic, readwrite, strong) CPTPlotRange *dataRange; +@property (nonatomic, readwrite, strong, nullable) CPTPlotRange *dataRange; /// @name Factory Methods /// @{ -+(instancetype)dataSourceForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunction)function; -+(instancetype)dataSourceForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)block; ++(nonnull instancetype)dataSourceForPlot:(nonnull CPTPlot *)plot withFunction:(nonnull CPTDataSourceFunction)function; ++(nonnull instancetype)dataSourceForPlot:(nonnull CPTPlot *)plot withBlock:(nonnull CPTDataSourceBlock)block; /// @} /// @name Initialization /// @{ --(instancetype)initForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunction)function; --(instancetype)initForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)block; +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot withFunction:(nonnull CPTDataSourceFunction)function; +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot withBlock:(nonnull CPTDataSourceBlock)block; /// @} @end diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index 096927102..10681366e 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -1,5 +1,6 @@ #import "CPTFunctionDataSource.h" +#import "CPTExceptions.h" #import "CPTMutablePlotRange.h" #import "CPTNumericData.h" #import "CPTScatterPlot.h" @@ -155,7 +156,8 @@ -(instancetype)initForPlot:(CPTPlot *)plot // function and plot are required; this will fail the assertions in -initForPlot:withFunction: -(instancetype)init { - return [self initForPlot:nil withFunction:NULL]; + [NSException raise:CPTException format:@"%@ must be initialized with a function or a block.", NSStringFromClass([self class])]; + return [self initForPlot:[CPTScatterPlot layer] withFunction:sin]; } -(void)dealloc diff --git a/framework/Source/CPTGradient.h b/framework/Source/CPTGradient.h index cbc06f127..637ea858f 100644 --- a/framework/Source/CPTGradient.h +++ b/framework/Source/CPTGradient.h @@ -12,7 +12,7 @@ typedef struct _CPTGradientElement { CPTRGBAColor color; ///< Color CGFloat position; ///< Gradient position (0 ≤ @par{position} ≤ 1) - struct _CPTGradientElement *nextElement; ///< Pointer to the next CPTGradientElement in the list (last element == @NULL) + struct _CPTGradientElement *__nullable nextElement; ///< Pointer to the next CPTGradientElement in the list (last element == @NULL) } CPTGradientElement; @@ -59,46 +59,46 @@ typedef NS_ENUM (NSInteger, CPTGradientType) { /// @name Factory Methods /// @{ -+(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColor *)end; -+(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColor *)end beginningPosition:(CGFloat)beginningPosition endingPosition:(CGFloat)endingPosition; ++(nonnull instancetype)gradientWithBeginningColor:(nonnull CPTColor *)begin endingColor:(nonnull CPTColor *)end; ++(nonnull instancetype)gradientWithBeginningColor:(nonnull CPTColor *)begin endingColor:(nonnull CPTColor *)end beginningPosition:(CGFloat)beginningPosition endingPosition:(CGFloat)endingPosition; -+(instancetype)aquaSelectedGradient; -+(instancetype)aquaNormalGradient; -+(instancetype)aquaPressedGradient; ++(nonnull instancetype)aquaSelectedGradient; ++(nonnull instancetype)aquaNormalGradient; ++(nonnull instancetype)aquaPressedGradient; -+(instancetype)unifiedSelectedGradient; -+(instancetype)unifiedNormalGradient; -+(instancetype)unifiedPressedGradient; -+(instancetype)unifiedDarkGradient; ++(nonnull instancetype)unifiedSelectedGradient; ++(nonnull instancetype)unifiedNormalGradient; ++(nonnull instancetype)unifiedPressedGradient; ++(nonnull instancetype)unifiedDarkGradient; -+(instancetype)sourceListSelectedGradient; -+(instancetype)sourceListUnselectedGradient; ++(nonnull instancetype)sourceListSelectedGradient; ++(nonnull instancetype)sourceListUnselectedGradient; -+(instancetype)rainbowGradient; -+(instancetype)hydrogenSpectrumGradient; ++(nonnull instancetype)rainbowGradient; ++(nonnull instancetype)hydrogenSpectrumGradient; /// @} /// @name Modification /// @{ --(CPTGradient *)gradientWithAlphaComponent:(CGFloat)alpha; --(CPTGradient *)gradientWithBlendingMode:(CPTGradientBlendingMode)mode; +-(nonnull CPTGradient *)gradientWithAlphaComponent:(CGFloat)alpha; +-(nonnull CPTGradient *)gradientWithBlendingMode:(CPTGradientBlendingMode)mode; --(CPTGradient *)addColorStop:(CPTColor *)color atPosition:(CGFloat)position; // positions given relative to [0,1] --(CPTGradient *)removeColorStopAtIndex:(NSUInteger)idx; --(CPTGradient *)removeColorStopAtPosition:(CGFloat)position; +-(nonnull CPTGradient *)addColorStop:(nonnull CPTColor *)color atPosition:(CGFloat)position; // positions given relative to [0,1] +-(nonnull CPTGradient *)removeColorStopAtIndex:(NSUInteger)idx; +-(nonnull CPTGradient *)removeColorStopAtPosition:(CGFloat)position; /// @} /// @name Information /// @{ --(CGColorRef)newColorStopAtIndex:(NSUInteger)idx; --(CGColorRef)newColorAtPosition:(CGFloat)position; +-(nullable CGColorRef)newColorStopAtIndex:(NSUInteger)idx; +-(nonnull CGColorRef)newColorAtPosition:(CGFloat)position; /// @} /// @name Drawing /// @{ --(void)drawSwatchInRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillPathInContext:(CGContextRef)context; +-(void)drawSwatchInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillPathInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 6706461b3..f5d85f3fb 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -20,7 +20,7 @@ /** @brief Notification sent by various objects to tell the graph it should redraw itself. * @ingroup notification **/ -extern NSString *const CPTGraphNeedsRedrawNotification; +extern NSString *__nonnull const CPTGraphNeedsRedrawNotification; /** @brief Notification sent by a graph after adding a new plot space. * @ingroup notification @@ -28,7 +28,7 @@ extern NSString *const CPTGraphNeedsRedrawNotification; * The notification userInfo dictionary will include the new plot space under the * CPTGraphPlotSpaceNotificationKey key. **/ -extern NSString *const CPTGraphDidAddPlotSpaceNotification; +extern NSString *__nonnull const CPTGraphDidAddPlotSpaceNotification; /** @brief Notification sent by a graph after removing a plot space. * @ingroup notification @@ -36,13 +36,13 @@ extern NSString *const CPTGraphDidAddPlotSpaceNotification; * The notification userInfo dictionary will include the removed plot space under the * CPTGraphPlotSpaceNotificationKey key. **/ -extern NSString *const CPTGraphDidRemovePlotSpaceNotification; +extern NSString *__nonnull const CPTGraphDidRemovePlotSpaceNotification; /** @brief The userInfo dictionary key used by the CPTGraphDidAddPlotSpaceNotification * and CPTGraphDidRemovePlotSpaceNotification notifications for the plot space. * @ingroup notification **/ -extern NSString *const CPTGraphPlotSpaceNotificationKey; +extern NSString *__nonnull const CPTGraphPlotSpaceNotificationKey; /// @} @@ -64,29 +64,29 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Hosting View /// @{ -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTGraphHostingView *hostingView; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraphHostingView *hostingView; /// @} /// @name Title /// @{ -@property (nonatomic, readwrite, copy) NSString *title; -@property (nonatomic, readwrite, copy) NSAttributedString *attributedTitle; -@property (nonatomic, readwrite, copy) CPTTextStyle *titleTextStyle; +@property (nonatomic, readwrite, copy, nullable) NSString *title; +@property (nonatomic, readwrite, copy, nullable) NSAttributedString *attributedTitle; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *titleTextStyle; @property (nonatomic, readwrite, assign) CGPoint titleDisplacement; @property (nonatomic, readwrite, assign) CPTRectAnchor titlePlotAreaFrameAnchor; /// @} /// @name Layers /// @{ -@property (nonatomic, readwrite, strong) CPTAxisSet *axisSet; -@property (nonatomic, readwrite, strong) CPTPlotAreaFrame *plotAreaFrame; -@property (nonatomic, readonly) CPTPlotSpace *defaultPlotSpace; -@property (nonatomic, readwrite, strong) NSArray *topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) CPTAxisSet *axisSet; +@property (nonatomic, readwrite, strong, nullable) CPTPlotAreaFrame *plotAreaFrame; +@property (nonatomic, readonly, nullable) CPTPlotSpace *defaultPlotSpace; +@property (nonatomic, readwrite, strong, nullable) NSArray *topDownLayerOrder; /// @} /// @name Legend /// @{ -@property (nonatomic, readwrite, strong) CPTLegend *legend; +@property (nonatomic, readwrite, strong, nullable) CPTLegend *legend; @property (nonatomic, readwrite, assign) CPTRectAnchor legendAnchor; @property (nonatomic, readwrite, assign) CGPoint legendDisplacement; /// @} @@ -99,37 +99,37 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Retrieving Plots /// @{ --(NSArray *)allPlots; --(CPTPlot *)plotAtIndex:(NSUInteger)idx; --(CPTPlot *)plotWithIdentifier:(id)identifier; +-(nonnull NSArray *)allPlots; +-(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; +-(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; /// @} /// @name Adding and Removing Plots /// @{ --(void)addPlot:(CPTPlot *)plot; --(void)addPlot:(CPTPlot *)plot toPlotSpace:(CPTPlotSpace *)space; --(void)removePlot:(CPTPlot *)plot; --(void)removePlotWithIdentifier:(id)identifier; --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx; --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(CPTPlotSpace *)space; +-(void)addPlot:(nullable CPTPlot *)plot; +-(void)addPlot:(nullable CPTPlot *)plot toPlotSpace:(nullable CPTPlotSpace *)space; +-(void)removePlot:(nullable CPTPlot *)plot; +-(void)removePlotWithIdentifier:(nullable id)identifier; +-(void)insertPlot:(nullable CPTPlot *)plot atIndex:(NSUInteger)idx; +-(void)insertPlot:(nullable CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(nullable CPTPlotSpace *)space; /// @} /// @name Retrieving Plot Spaces /// @{ --(NSArray *)allPlotSpaces; --(CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx; --(CPTPlotSpace *)plotSpaceWithIdentifier:(id)identifier; +-(nonnull NSArray *)allPlotSpaces; +-(nullable CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx; +-(nullable CPTPlotSpace *)plotSpaceWithIdentifier:(nullable id)identifier; /// @} /// @name Adding and Removing Plot Spaces /// @{ --(void)addPlotSpace:(CPTPlotSpace *)space; --(void)removePlotSpace:(CPTPlotSpace *)plotSpace; +-(void)addPlotSpace:(nonnull CPTPlotSpace *)space; +-(void)removePlotSpace:(nullable CPTPlotSpace *)plotSpace; /// @} /// @name Themes /// @{ --(void)applyTheme:(CPTTheme *)theme; +-(void)applyTheme:(nullable CPTTheme *)theme; /// @} @end @@ -143,8 +143,8 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Factory Methods /// @{ --(CPTPlotSpace *)newPlotSpace; --(CPTAxisSet *)newAxisSet; +-(nullable CPTPlotSpace *)newPlotSpace; +-(nullable CPTAxisSet *)newAxisSet; /// @} @end diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 3a802167c..7bb0e106d 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -32,13 +32,13 @@ /// @cond @interface CPTGraph() -@property (nonatomic, readwrite, strong) NSMutableArray *plots; -@property (nonatomic, readwrite, strong) NSMutableArray *plotSpaces; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *plots; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *plotSpaces; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *titleAnnotation; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *legendAnnotation; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; --(void)plotSpaceMappingDidChange:(NSNotification *)notif; +-(void)plotSpaceMappingDidChange:(nonnull NSNotification *)notif; -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor; @end @@ -407,7 +407,12 @@ -(NSArray *)allPlots **/ -(CPTPlot *)plotAtIndex:(NSUInteger)idx { - return (self.plots)[idx]; + if ( idx < self.plots.count ) { + return (self.plots)[idx]; + } + else { + return nil; + } } /** @brief Gets the plot with the given identifier from the plot array. @@ -572,6 +577,8 @@ -(void)setPlotAreaFrame:(CPTPlotAreaFrame *)newArea **/ -(void)addPlotSpace:(CPTPlotSpace *)space { + NSParameterAssert(space); + [self.plotSpaces addObject:space]; space.graph = self; @@ -841,14 +848,17 @@ -(void)setTitle:(NSString *)newTitle ( (CPTTextLayer *)theTitleAnnotation.contentLayer ).text = title; } else { - CPTLayerAnnotation *newTitleAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:self.plotAreaFrame]; - CPTTextLayer *newTextLayer = [[CPTTextLayer alloc] initWithText:title style:self.titleTextStyle]; - newTitleAnnotation.contentLayer = newTextLayer; - newTitleAnnotation.displacement = self.titleDisplacement; - newTitleAnnotation.rectAnchor = self.titlePlotAreaFrameAnchor; - newTitleAnnotation.contentAnchorPoint = [self contentAnchorForRectAnchor:self.titlePlotAreaFrameAnchor]; - [self addAnnotation:newTitleAnnotation]; - self.titleAnnotation = newTitleAnnotation; + CPTPlotAreaFrame *frameLayer = self.plotAreaFrame; + if ( frameLayer ) { + CPTLayerAnnotation *newTitleAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:frameLayer]; + CPTTextLayer *newTextLayer = [[CPTTextLayer alloc] initWithText:title style:self.titleTextStyle]; + newTitleAnnotation.contentLayer = newTextLayer; + newTitleAnnotation.displacement = self.titleDisplacement; + newTitleAnnotation.rectAnchor = self.titlePlotAreaFrameAnchor; + newTitleAnnotation.contentAnchorPoint = [self contentAnchorForRectAnchor:self.titlePlotAreaFrameAnchor]; + [self addAnnotation:newTitleAnnotation]; + self.titleAnnotation = newTitleAnnotation; + } } } else { @@ -880,14 +890,17 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle ( (CPTTextLayer *)theTitleAnnotation.contentLayer ).attributedText = attributedTitle; } else { - CPTLayerAnnotation *newTitleAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:self.plotAreaFrame]; - CPTTextLayer *newTextLayer = [[CPTTextLayer alloc] initWithAttributedText:attributedTitle]; - newTitleAnnotation.contentLayer = newTextLayer; - newTitleAnnotation.displacement = self.titleDisplacement; - newTitleAnnotation.rectAnchor = self.titlePlotAreaFrameAnchor; - newTitleAnnotation.contentAnchorPoint = [self contentAnchorForRectAnchor:self.titlePlotAreaFrameAnchor]; - [self addAnnotation:newTitleAnnotation]; - self.titleAnnotation = newTitleAnnotation; + CPTPlotAreaFrame *frameLayer = self.plotAreaFrame; + if ( frameLayer ) { + CPTLayerAnnotation *newTitleAnnotation = [[CPTLayerAnnotation alloc] initWithAnchorLayer:frameLayer]; + CPTTextLayer *newTextLayer = [[CPTTextLayer alloc] initWithAttributedText:attributedTitle]; + newTitleAnnotation.contentLayer = newTextLayer; + newTitleAnnotation.displacement = self.titleDisplacement; + newTitleAnnotation.rectAnchor = self.titlePlotAreaFrameAnchor; + newTitleAnnotation.contentAnchorPoint = [self contentAnchorForRectAnchor:self.titlePlotAreaFrameAnchor]; + [self addAnnotation:newTitleAnnotation]; + self.titleAnnotation = newTitleAnnotation; + } } } else { diff --git a/framework/Source/CPTGridLineGroup.h b/framework/Source/CPTGridLineGroup.h index 3985ffe9f..e62445400 100644 --- a/framework/Source/CPTGridLineGroup.h +++ b/framework/Source/CPTGridLineGroup.h @@ -4,7 +4,7 @@ @interface CPTGridLineGroup : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTPlotArea *plotArea; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlotArea *plotArea; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTGridLines.h b/framework/Source/CPTGridLines.h index 6bd033699..100e14f2e 100644 --- a/framework/Source/CPTGridLines.h +++ b/framework/Source/CPTGridLines.h @@ -4,7 +4,7 @@ @interface CPTGridLines : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTAxis *axis; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxis *axis; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTImage.h b/framework/Source/CPTImage.h index fb9ea56b0..23e509fef 100644 --- a/framework/Source/CPTImage.h +++ b/framework/Source/CPTImage.h @@ -3,8 +3,8 @@ @interface CPTImage : NSObject -@property (nonatomic, readwrite, copy) CPTNativeImage *nativeImage; -@property (nonatomic, readwrite, assign) CGImageRef image; +@property (nonatomic, readwrite, copy, nullable) CPTNativeImage *nativeImage; +@property (nonatomic, readwrite, assign, nullable) CGImageRef image; @property (nonatomic, readwrite, assign) CGFloat scale; @property (nonatomic, readwrite, assign, getter = isTiled) BOOL tiled; @property (nonatomic, readwrite, assign) CPTEdgeInsets edgeInsets; @@ -13,26 +13,26 @@ /// @name Factory Methods /// @{ -+(instancetype)imageNamed:(NSString *)name; ++(nonnull instancetype)imageNamed:(nonnull NSString *)name; -+(instancetype)imageWithNativeImage:(CPTNativeImage *)anImage; -+(instancetype)imageWithContentsOfFile:(NSString *)path; -+(instancetype)imageWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale; -+(instancetype)imageWithCGImage:(CGImageRef)anImage; -+(instancetype)imageForPNGFile:(NSString *)path; ++(nonnull instancetype)imageWithNativeImage:(nullable CPTNativeImage *)anImage; ++(nonnull instancetype)imageWithContentsOfFile:(nonnull NSString *)path; ++(nonnull instancetype)imageWithCGImage:(nullable CGImageRef)anImage scale:(CGFloat)newScale; ++(nonnull instancetype)imageWithCGImage:(nullable CGImageRef)anImage; ++(nonnull instancetype)imageForPNGFile:(nonnull NSString *)path; /// @} /// @name Initialization /// @{ --(instancetype)initWithContentsOfFile:(NSString *)path; --(instancetype)initWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCGImage:(CGImageRef)anImage; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithContentsOfFile:(nonnull NSString *)path; +-(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage scale:(CGFloat)newScale NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing /// @{ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context; +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @end @@ -46,8 +46,8 @@ /// @name Initialization /// @{ --(instancetype)initWithNativeImage:(CPTNativeImage *)anImage; --(instancetype)initForPNGFile:(NSString *)path; +-(nonnull instancetype)initWithNativeImage:(nullable CPTNativeImage *)anImage; +-(nonnull instancetype)initForPNGFile:(nonnull NSString *)path; /// @} @end diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 27f3720d2..9ff66f9be 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -11,7 +11,7 @@ /** @brief Notification sent by all layers when the layer @link CALayer::bounds bounds @endlink change. * @ingroup notification **/ -extern NSString *const CPTLayerBoundsDidChangeNotification; +extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /// @} @@ -19,7 +19,7 @@ extern NSString *const CPTLayerBoundsDidChangeNotification; /// @name Graph /// @{ -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraph *graph; /// @} /// @name Padding @@ -34,54 +34,54 @@ extern NSString *const CPTLayerBoundsDidChangeNotification; /// @{ @property (readwrite) CGFloat contentsScale; @property (nonatomic, readonly) BOOL useFastRendering; -@property (nonatomic, readwrite, copy) CPTShadow *shadow; +@property (nonatomic, readwrite, copy, nullable) CPTShadow *shadow; @property (nonatomic, readonly) CGSize shadowMargin; /// @} /// @name Masking /// @{ @property (nonatomic, readwrite, assign) BOOL masksToBorder; -@property (nonatomic, readwrite, assign) CGPathRef outerBorderPath; -@property (nonatomic, readwrite, assign) CGPathRef innerBorderPath; -@property (nonatomic, readonly) CGPathRef maskingPath; -@property (nonatomic, readonly) CGPathRef sublayerMaskingPath; +@property (nonatomic, readwrite, assign, nullable) CGPathRef outerBorderPath; +@property (nonatomic, readwrite, assign, nullable) CGPathRef innerBorderPath; +@property (nonatomic, readonly, nullable) CGPathRef maskingPath; +@property (nonatomic, readonly, nullable) CGPathRef sublayerMaskingPath; /// @} /// @name Identification /// @{ -@property (nonatomic, readwrite, copy) id identifier; +@property (nonatomic, readwrite, copy, nullable) id identifier; /// @} /// @name Layout /// @{ -@property (nonatomic, readonly) NSSet *sublayersExcludedFromAutomaticLayout; +@property (nonatomic, readonly, nullable) NSSet *sublayersExcludedFromAutomaticLayout; /// @} /// @name Initialization /// @{ --(instancetype)initWithFrame:(CGRect)newFrame NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; --(instancetype)initWithLayer:(id)layer NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithFrame:(CGRect)newFrame NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing /// @{ --(void)renderAsVectorInContext:(CGContextRef)context; --(void)recursivelyRenderInContext:(CGContextRef)context; --(void)layoutAndRenderInContext:(CGContextRef)context; --(NSData *)dataForPDFRepresentationOfLayer; +-(void)renderAsVectorInContext:(nonnull CGContextRef)context; +-(void)recursivelyRenderInContext:(nonnull CGContextRef)context; +-(void)layoutAndRenderInContext:(nonnull CGContextRef)context; +-(nonnull NSData *)dataForPDFRepresentationOfLayer; /// @} /// @name Masking /// @{ --(void)applySublayerMaskToContext:(CGContextRef)context forSublayer:(CPTLayer *)sublayer withOffset:(CGPoint)offset; --(void)applyMaskToContext:(CGContextRef)context; +-(void)applySublayerMaskToContext:(nonnull CGContextRef)context forSublayer:(nonnull CPTLayer *)sublayer withOffset:(CGPoint)offset; +-(void)applyMaskToContext:(nonnull CGContextRef)context; /// @} /// @name Layout /// @{ -(void)pixelAlign; --(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)right bottom:(CGFloat *)bottom; +-(void)sublayerMarginLeft:(nonnull CGFloat *)left top:(nonnull CGFloat *)top right:(nonnull CGFloat *)right bottom:(nonnull CGFloat *)bottom; /// @} /// @name Information diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index f2fea38d9..d7efa9dc4 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -29,8 +29,8 @@ @interface CPTLayer() @property (nonatomic, readwrite, getter = isRenderingRecursively) BOOL renderingRecursively; @property (nonatomic, readwrite, assign) BOOL useFastRendering; --(void)applyTransform:(CATransform3D)transform toContext:(CGContextRef)context; --(NSString *)subLayersAtIndex:(NSUInteger)idx; +-(void)applyTransform:(CATransform3D)transform toContext:(nonnull CGContextRef)context; +-(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx; @end diff --git a/framework/Source/CPTLayerAnnotation.h b/framework/Source/CPTLayerAnnotation.h index 8f0eff622..d826f7b41 100644 --- a/framework/Source/CPTLayerAnnotation.h +++ b/framework/Source/CPTLayerAnnotation.h @@ -5,10 +5,10 @@ @interface CPTLayerAnnotation : CPTAnnotation -@property (nonatomic, readonly) __cpt_weak CPTLayer *anchorLayer; +@property (nonatomic, readonly, nullable) __cpt_weak CPTLayer *anchorLayer; @property (nonatomic, readwrite, assign) CPTRectAnchor rectAnchor; --(instancetype)initWithAnchorLayer:(CPTLayer *)anchorLayer NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithAnchorLayer:(nonnull CPTLayer *)anchorLayer NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index a39e3bde6..ecba13383 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -2,12 +2,13 @@ #import "CPTAnnotationHostLayer.h" #import "CPTConstraints.h" +#import "CPTExceptions.h" /// @cond @interface CPTLayerAnnotation() -@property (nonatomic, readwrite, strong) CPTConstraints *xConstraints; -@property (nonatomic, readwrite, strong) CPTConstraints *yConstraints; +@property (nonatomic, readwrite, strong, nullable) CPTConstraints *xConstraints; +@property (nonatomic, readwrite, strong, nullable) CPTConstraints *yConstraints; -(void)setConstraints; @@ -75,10 +76,11 @@ -(instancetype)initWithAnchorLayer:(CPTLayer *)newAnchorLayer /// @cond -// anchorLayer is required; this will fail the assertion in -initWithAnchorLayer: +// anchorLayer is required -(instancetype)init { - return [self initWithAnchorLayer:nil]; + [NSException raise:CPTException format:@"%@ must be initialized with an anchor layer.", NSStringFromClass([self class])]; + return [self initWithAnchorLayer:[CPTLayer layer]]; } -(void)dealloc diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index 5b5485ffc..7568a7048 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -14,17 +14,17 @@ /** @brief Notification sent by plots to tell the legend it should redraw itself. * @ingroup notification **/ -extern NSString *const CPTLegendNeedsRedrawForPlotNotification; +extern NSString *__nonnull const CPTLegendNeedsRedrawForPlotNotification; /** @brief Notification sent by plots to tell the legend it should update its layout and redraw itself. * @ingroup notification **/ -extern NSString *const CPTLegendNeedsLayoutForPlotNotification; +extern NSString *__nonnull const CPTLegendNeedsLayoutForPlotNotification; /** @brief Notification sent by plots to tell the legend it should reload all legend entries. * @ingroup notification **/ -extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; +extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; /// @} @@ -44,7 +44,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @param plot The plot. * @return The fill for the legend entry background or @nil to use the default @link CPTLegend::entryFill entryFill @endlink . **/ --(CPTFill *)legend:(CPTLegend *)legend fillForEntryAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot; +-(nullable CPTFill *)legend:(nonnull CPTLegend *)legend fillForEntryAtIndex:(NSUInteger)idx forPlot:(nonnull CPTPlot *)plot; /** @brief @optional This method gives the delegate a chance to provide a border line style for each legend entry. * @param legend The legend. @@ -52,7 +52,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @param plot The plot. * @return The line style for the legend entry border or @nil to use the default @link CPTLegend::entryBorderLineStyle entryBorderLineStyle @endlink . **/ --(CPTLineStyle *)legend:(CPTLegend *)legend lineStyleForEntryAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot; +-(nullable CPTLineStyle *)legend:(nonnull CPTLegend *)legend lineStyleForEntryAtIndex:(NSUInteger)idx forPlot:(nonnull CPTPlot *)plot; /** @brief @optional This method gives the delegate a chance to provide a custom swatch fill for each legend entry. * @param legend The legend. @@ -60,7 +60,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @param plot The plot. * @return The fill for the legend swatch or @nil to use the default @link CPTLegend::swatchFill swatchFill @endlink . **/ --(CPTFill *)legend:(CPTLegend *)legend fillForSwatchAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot; +-(nullable CPTFill *)legend:(nonnull CPTLegend *)legend fillForSwatchAtIndex:(NSUInteger)idx forPlot:(nonnull CPTPlot *)plot; /** @brief @optional This method gives the delegate a chance to provide a custom swatch border line style for each legend entry. * @param legend The legend. @@ -68,7 +68,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @param plot The plot. * @return The line style for the legend swatch border or @nil to use the default @link CPTLegend::swatchBorderLineStyle swatchBorderLineStyle @endlink . **/ --(CPTLineStyle *)legend:(CPTLegend *)legend lineStyleForSwatchAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot; +-(nullable CPTLineStyle *)legend:(nonnull CPTLegend *)legend lineStyleForSwatchAtIndex:(NSUInteger)idx forPlot:(nonnull CPTPlot *)plot; /** @brief @optional This method gives the delegate a chance to draw custom swatches for each legend entry. * @@ -82,7 +82,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @param context The graphics context to draw into. * @return @YES if the legend should draw the default swatch or @NO if the delegate handled the drawing. **/ --(BOOL)legend:(CPTLegend *)legend shouldDrawSwatchAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot inRect:(CGRect)rect inContext:(CGContextRef)context; +-(BOOL)legend:(nonnull CPTLegend *)legend shouldDrawSwatchAtIndex:(NSUInteger)idx forPlot:(nonnull CPTPlot *)plot inRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @@ -98,7 +98,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if MacOnly clicked legend entry. @endif * @if iOSOnly touched legend entry. @endif **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that the swatch or label of a legend entry * @if MacOnly was both pressed and released. @endif @@ -110,7 +110,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if iOSOnly touched legend entry. @endif * @param event The event that triggered the selection. **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that the swatch or label of a legend entry * @if MacOnly was pressed. @endif @@ -121,7 +121,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if MacOnly clicked legend entry. @endif * @if iOSOnly touched legend entry. @endif **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot touchDownAtIndex:(NSUInteger)idx; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot touchDownAtIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that the swatch or label of a legend entry * @if MacOnly was pressed. @endif @@ -133,7 +133,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if iOSOnly touched legend entry. @endif * @param event The event that triggered the selection. **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot touchDownAtIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot touchDownAtIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that the swatch or label of a legend entry * @if MacOnly was released. @endif @@ -144,7 +144,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if MacOnly clicked legend entry. @endif * @if iOSOnly touched legend entry. @endif **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot touchUpAtIndex:(NSUInteger)idx; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot touchUpAtIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that the swatch or label of a legend entry * @if MacOnly was released. @endif @@ -156,7 +156,7 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; * @if iOSOnly touched legend entry. @endif * @param event The event that triggered the selection. **/ --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot touchUpAtIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot touchUpAtIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -168,15 +168,15 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; /// @name Formatting /// @{ -@property (nonatomic, readwrite, copy) CPTTextStyle *textStyle; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *textStyle; @property (nonatomic, readwrite, assign) CGSize swatchSize; -@property (nonatomic, readwrite, copy) CPTLineStyle *swatchBorderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *swatchBorderLineStyle; @property (nonatomic, readwrite, assign) CGFloat swatchCornerRadius; -@property (nonatomic, readwrite, copy) CPTFill *swatchFill; +@property (nonatomic, readwrite, copy, nullable) CPTFill *swatchFill; -@property (nonatomic, readwrite, copy) CPTLineStyle *entryBorderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *entryBorderLineStyle; @property (nonatomic, readwrite, assign) CGFloat entryCornerRadius; -@property (nonatomic, readwrite, copy) CPTFill *entryFill; +@property (nonatomic, readwrite, copy, nullable) CPTFill *entryFill; @property (nonatomic, readwrite, assign) CGFloat entryPaddingLeft; @property (nonatomic, readwrite, assign) CGFloat entryPaddingTop; @property (nonatomic, readwrite, assign) CGFloat entryPaddingRight; @@ -190,10 +190,10 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; @property (nonatomic, readwrite, assign) NSUInteger numberOfColumns; @property (nonatomic, readwrite, assign) BOOL equalRows; @property (nonatomic, readwrite, assign) BOOL equalColumns; -@property (nonatomic, readwrite, copy) NSArray *rowHeights; -@property (nonatomic, readonly) NSArray *rowHeightsThatFit; -@property (nonatomic, readwrite, copy) NSArray *columnWidths; -@property (nonatomic, readonly) NSArray *columnWidthsThatFit; +@property (nonatomic, readwrite, copy, nullable) NSArray *rowHeights; +@property (nonatomic, readonly, nullable) NSArray *rowHeightsThatFit; +@property (nonatomic, readwrite, copy, nullable) NSArray *columnWidths; +@property (nonatomic, readonly, nullable) NSArray *columnWidthsThatFit; @property (nonatomic, readwrite, assign) CGFloat columnMargin; @property (nonatomic, readwrite, assign) CGFloat rowMargin; @property (nonatomic, readwrite, assign) CGFloat titleOffset; @@ -201,26 +201,26 @@ extern NSString *const CPTLegendNeedsReloadEntriesForPlotNotification; /// @name Factory Methods /// @{ -+(instancetype)legendWithPlots:(NSArray *)newPlots; -+(instancetype)legendWithGraph:(CPTGraph *)graph; ++(nonnull instancetype)legendWithPlots:(nullable NSArray *)newPlots; ++(nonnull instancetype)legendWithGraph:(nullable CPTGraph *)graph; /// @} /// @name Initialization /// @{ --(instancetype)initWithPlots:(NSArray *)newPlots; --(instancetype)initWithGraph:(CPTGraph *)graph; +-(nonnull instancetype)initWithPlots:(nullable NSArray *)newPlots; +-(nonnull instancetype)initWithGraph:(nullable CPTGraph *)graph; /// @} /// @name Plots /// @{ --(NSArray *)allPlots; --(CPTPlot *)plotAtIndex:(NSUInteger)idx; --(CPTPlot *)plotWithIdentifier:(id)identifier; - --(void)addPlot:(CPTPlot *)plot; --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx; --(void)removePlot:(CPTPlot *)plot; --(void)removePlotWithIdentifier:(id)identifier; +-(nonnull NSArray *)allPlots; +-(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; +-(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; + +-(void)addPlot:(nonnull CPTPlot *)plot; +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx; +-(void)removePlot:(nonnull CPTPlot *)plot; +-(void)removePlotWithIdentifier:(nullable id)identifier; /// @} /// @name Layout diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 0b68e560c..30cfe80f2 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -842,7 +842,12 @@ -(NSArray *)allPlots **/ -(CPTPlot *)plotAtIndex:(NSUInteger)idx { - return (self.plots)[idx]; + if ( idx < self.plots.count ) { + return (self.plots)[idx]; + } + else { + return nil; + } } /** @brief Gets the plot with the given identifier from the plot array. diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index c3a01aa9c..59f12edb7 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -7,13 +7,13 @@ /// @name Plot Info /// @{ -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTPlot *plot; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlot *plot; @property (nonatomic, readwrite, assign) NSUInteger index; /// @} /// @name Formatting /// @{ -@property (nonatomic, readwrite, strong) CPTTextStyle *textStyle; +@property (nonatomic, readwrite, strong, nullable) CPTTextStyle *textStyle; /// @} /// @name Layout @@ -25,7 +25,7 @@ /// @name Drawing /// @{ --(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFloat)scale; +-(void)drawTitleInRect:(CGRect)rect inContext:(nonnull CGContextRef)context scale:(CGFloat)scale; /// @} @end diff --git a/framework/Source/CPTLimitBand.h b/framework/Source/CPTLimitBand.h index 88413d184..7e601bb25 100644 --- a/framework/Source/CPTLimitBand.h +++ b/framework/Source/CPTLimitBand.h @@ -3,18 +3,18 @@ @interface CPTLimitBand : NSObject -@property (nonatomic, readwrite, strong) CPTPlotRange *range; -@property (nonatomic, readwrite, strong) CPTFill *fill; +@property (nonatomic, readwrite, strong, nullable) CPTPlotRange *range; +@property (nonatomic, readwrite, strong, nullable) CPTFill *fill; /// @name Factory Methods /// @{ -+(instancetype)limitBandWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill; ++(nonnull instancetype)limitBandWithRange:(nullable CPTPlotRange *)newRange fill:(nullable CPTFill *)newFill; /// @} /// @name Initialization /// @{ --(instancetype)initWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithRange:(nullable CPTPlotRange *)newRange fill:(nullable CPTFill *)newFill NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTLineCap.h b/framework/Source/CPTLineCap.h index 98411d5be..b1ab81115 100644 --- a/framework/Source/CPTLineCap.h +++ b/framework/Source/CPTLineCap.h @@ -26,31 +26,31 @@ typedef NS_ENUM (NSInteger, CPTLineCapType) { @property (nonatomic, readwrite, assign) CGSize size; @property (nonatomic, readwrite, assign) CPTLineCapType lineCapType; -@property (nonatomic, readwrite, strong) CPTLineStyle *lineStyle; -@property (nonatomic, readwrite, strong) CPTFill *fill; -@property (nonatomic, readwrite, assign) CGPathRef customLineCapPath; +@property (nonatomic, readwrite, strong, nullable) CPTLineStyle *lineStyle; +@property (nonatomic, readwrite, strong, nullable) CPTFill *fill; +@property (nonatomic, readwrite, assign, nullable) CGPathRef customLineCapPath; @property (nonatomic, readwrite, assign) BOOL usesEvenOddClipRule; /// @name Factory Methods /// @{ -+(instancetype)lineCap; -+(instancetype)openArrowPlotLineCap; -+(instancetype)solidArrowPlotLineCap; -+(instancetype)sweptArrowPlotLineCap; -+(instancetype)rectanglePlotLineCap; -+(instancetype)ellipsePlotLineCap; -+(instancetype)diamondPlotLineCap; -+(instancetype)pentagonPlotLineCap; -+(instancetype)hexagonPlotLineCap; -+(instancetype)barPlotLineCap; -+(instancetype)crossPlotLineCap; -+(instancetype)snowPlotLineCap; -+(instancetype)customLineCapWithPath:(CGPathRef)aPath; ++(nonnull instancetype)lineCap; ++(nonnull instancetype)openArrowPlotLineCap; ++(nonnull instancetype)solidArrowPlotLineCap; ++(nonnull instancetype)sweptArrowPlotLineCap; ++(nonnull instancetype)rectanglePlotLineCap; ++(nonnull instancetype)ellipsePlotLineCap; ++(nonnull instancetype)diamondPlotLineCap; ++(nonnull instancetype)pentagonPlotLineCap; ++(nonnull instancetype)hexagonPlotLineCap; ++(nonnull instancetype)barPlotLineCap; ++(nonnull instancetype)crossPlotLineCap; ++(nonnull instancetype)snowPlotLineCap; ++(nonnull instancetype)customLineCapWithPath:(nullable CGPathRef)aPath; /// @} /// @name Drawing /// @{ --(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center inDirection:(CGPoint)direction; +-(void)renderAsVectorInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center inDirection:(CGPoint)direction; /// @} @end diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index d69309600..f7cd54995 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -9,9 +9,9 @@ /// @cond @interface CPTLineCap() -@property (nonatomic, readwrite, assign) CGPathRef cachedLineCapPath; +@property (nonatomic, readwrite, assign, nullable) CGPathRef cachedLineCapPath; --(CGPathRef)newLineCapPath; +-(nonnull CGPathRef)newLineCapPath; @end diff --git a/framework/Source/CPTLineStyle.h b/framework/Source/CPTLineStyle.h index 28579c49c..8bf9a117e 100644 --- a/framework/Source/CPTLineStyle.h +++ b/framework/Source/CPTLineStyle.h @@ -8,23 +8,23 @@ @property (nonatomic, readonly) CGLineJoin lineJoin; @property (nonatomic, readonly) CGFloat miterLimit; @property (nonatomic, readonly) CGFloat lineWidth; -@property (nonatomic, readonly) NSArray *dashPattern; +@property (nonatomic, readonly, nullable) NSArray *dashPattern; @property (nonatomic, readonly) CGFloat patternPhase; -@property (nonatomic, readonly) CPTColor *lineColor; -@property (nonatomic, readonly) CPTFill *lineFill; -@property (nonatomic, readonly) CPTGradient *lineGradient; +@property (nonatomic, readonly, nullable) CPTColor *lineColor; +@property (nonatomic, readonly, nullable) CPTFill *lineFill; +@property (nonatomic, readonly, nullable) CPTGradient *lineGradient; @property (nonatomic, readonly, getter = isOpaque) BOOL opaque; /// @name Factory Methods /// @{ -+(instancetype)lineStyle; ++(nonnull instancetype)lineStyle; /// @} /// @name Drawing /// @{ --(void)setLineStyleInContext:(CGContextRef)context; --(void)strokePathInContext:(CGContextRef)context; --(void)strokeRect:(CGRect)rect inContext:(CGContextRef)context; +-(void)setLineStyleInContext:(nonnull CGContextRef)context; +-(void)strokePathInContext:(nonnull CGContextRef)context; +-(void)strokeRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index fb465fd30..c28921079 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -15,11 +15,11 @@ @interface CPTLineStyle() @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong) NSArray *dashPattern; +@property (nonatomic, readwrite, strong, nullable) NSArray *dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; -@property (nonatomic, readwrite, strong) CPTColor *lineColor; -@property (nonatomic, readwrite, strong) CPTFill *lineFill; -@property (nonatomic, readwrite, strong) CPTGradient *lineGradient; +@property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; +@property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; +@property (nonatomic, readwrite, strong, nullable) CPTGradient *lineGradient; -(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)context; diff --git a/framework/Source/CPTMutableLineStyle.h b/framework/Source/CPTMutableLineStyle.h index 3fcd021be..565f8c300 100644 --- a/framework/Source/CPTMutableLineStyle.h +++ b/framework/Source/CPTMutableLineStyle.h @@ -8,10 +8,10 @@ @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong) NSArray *dashPattern; +@property (nonatomic, readwrite, strong, nullable) NSArray *dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; -@property (nonatomic, readwrite, strong) CPTColor *lineColor; -@property (nonatomic, readwrite, strong) CPTFill *lineFill; -@property (nonatomic, readwrite, strong) CPTGradient *lineGradient; +@property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; +@property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; +@property (nonatomic, readwrite, strong, nullable) CPTGradient *lineGradient; @end diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index cba143621..aa8e95133 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -5,12 +5,12 @@ /// @name Data Buffer /// @{ -@property (nonatomic, readonly) void *mutableBytes; +@property (nonatomic, readonly, nonnull) void *mutableBytes; /// @} /// @name Dimensions /// @{ -@property (nonatomic, readwrite, copy) NSArray *shape; +@property (nonatomic, readwrite, copy, nonnull) NSArray *shape; /// @} @end diff --git a/framework/Source/CPTMutableShadow.h b/framework/Source/CPTMutableShadow.h index c671872f7..3392da191 100644 --- a/framework/Source/CPTMutableShadow.h +++ b/framework/Source/CPTMutableShadow.h @@ -6,6 +6,6 @@ @property (nonatomic, readwrite, assign) CGSize shadowOffset; @property (nonatomic, readwrite, assign) CGFloat shadowBlurRadius; -@property (nonatomic, readwrite, strong) CPTColor *shadowColor; +@property (nonatomic, readwrite, strong, nullable) CPTColor *shadowColor; @end diff --git a/framework/Source/CPTMutableTextStyle.h b/framework/Source/CPTMutableTextStyle.h index 6bbdc23bc..471a79bb0 100644 --- a/framework/Source/CPTMutableTextStyle.h +++ b/framework/Source/CPTMutableTextStyle.h @@ -4,9 +4,9 @@ @interface CPTMutableTextStyle : CPTTextStyle -@property (readwrite, copy, nonatomic) NSString *fontName; +@property (readwrite, copy, nonatomic, nullable) NSString *fontName; @property (readwrite, assign, nonatomic) CGFloat fontSize; -@property (readwrite, copy, nonatomic) CPTColor *color; +@property (readwrite, copy, nonatomic, nullable) CPTColor *color; @property (readwrite, assign, nonatomic) CPTTextAlignment textAlignment; @property (readwrite, assign, nonatomic) NSLineBreakMode lineBreakMode; diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index dd75fcddb..9e08945da 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -4,8 +4,8 @@ /// @name Data Buffer /// @{ -@property (nonatomic, readonly, copy) NSData *data; -@property (nonatomic, readonly) const void *bytes; +@property (nonatomic, readonly, copy, nonnull) NSData *data; +@property (nonatomic, readonly, nonnull) const void *bytes; @property (nonatomic, readonly) NSUInteger length; /// @} @@ -19,7 +19,7 @@ /// @name Dimensions /// @{ -@property (nonatomic, readonly, copy) NSArray *shape; +@property (nonatomic, readonly, copy, nonnull) NSArray *shape; @property (nonatomic, readonly) NSUInteger numberOfDimensions; @property (nonatomic, readonly) NSUInteger numberOfSamples; @property (nonatomic, readonly) CPTDataOrder dataOrder; @@ -27,40 +27,40 @@ /// @name Factory Methods /// @{ -+(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray; -+(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray; -+(instancetype)numericDataWithArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray; -+(instancetype)numericDataWithArray:(NSArray *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; -+(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(instancetype)numericDataWithArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(instancetype)numericDataWithArray:(NSArray *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; /// @} /// @name Initialization /// @{ --(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray; --(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray; --(instancetype)initWithArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray; --(instancetype)initWithArray:(NSArray *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; --(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; --(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; --(instancetype)initWithArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; --(instancetype)initWithArray:(NSArray *)newData dataTypeString:(NSString *)newDataTypeString shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Samples /// @{ -(NSUInteger)sampleIndex:(NSUInteger)idx, ...; --(void *)samplePointer:(NSUInteger)sample; --(void *)samplePointerAtIndex:(NSUInteger)idx, ...; --(NSNumber *)sampleValue:(NSUInteger)sample; --(NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; --(NSArray *)sampleArray; +-(nullable void *)samplePointer:(NSUInteger)sample; +-(nullable void *)samplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable NSNumber *)sampleValue:(NSUInteger)sample; +-(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; +-(nonnull NSArray *)sampleArray; /// @} @end diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 349d14b5d..bd1dca813 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -9,12 +9,12 @@ /// @cond @interface CPTNumericData() -@property (nonatomic, readwrite, copy) NSData *data; +@property (nonatomic, readwrite, copy, nonnull) NSData *data; @property (nonatomic, readwrite, assign) CPTNumericDataType dataType; -@property (nonatomic, readwrite, copy) NSArray *shape; +@property (nonatomic, readwrite, copy, nonnull) NSArray *shape; @property (nonatomic, readwrite, assign) CPTDataOrder dataOrder; --(void)commonInitWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; -(NSData *)dataFromArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType; @@ -282,9 +282,9 @@ -(instancetype)initWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(id) initWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray +-(instancetype)initWithData:(NSData *)newData + dataTypeString:(NSString *)newDataTypeString + shape:(NSArray *)shapeArray { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -358,10 +358,10 @@ -(instancetype)initWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(id) initWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray - dataOrder:(CPTDataOrder)order +-(instancetype)initWithData:(NSData *)newData + dataTypeString:(NSString *)newDataTypeString + shape:(NSArray *)shapeArray + dataOrder:(CPTDataOrder)order { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) diff --git a/framework/Source/CPTNumericDataType.h b/framework/Source/CPTNumericDataType.h index e074342e2..51d9017bc 100644 --- a/framework/Source/CPTNumericDataType.h +++ b/framework/Source/CPTNumericDataType.h @@ -38,8 +38,8 @@ extern "C" { /// @name Data Type Utilities /// @{ CPTNumericDataType CPTDataType(CPTDataTypeFormat format, size_t sampleBytes, CFByteOrder byteOrder); -CPTNumericDataType CPTDataTypeWithDataTypeString(NSString *dataTypeString); -NSString *CPTDataTypeStringFromDataType(CPTNumericDataType dataType); +CPTNumericDataType CPTDataTypeWithDataTypeString(NSString *__nonnull dataTypeString); +NSString *__nonnull CPTDataTypeStringFromDataType(CPTNumericDataType dataType); BOOL CPTDataTypeIsSupported(CPTNumericDataType format); BOOL CPTDataTypeEqualToDataType(CPTNumericDataType dataType1, CPTNumericDataType dataType2); diff --git a/framework/Source/CPTPathExtensions.h b/framework/Source/CPTPathExtensions.h index 8229a4179..d044ea3fe 100644 --- a/framework/Source/CPTPathExtensions.h +++ b/framework/Source/CPTPathExtensions.h @@ -4,8 +4,8 @@ extern "C" { #endif -CGPathRef CreateRoundedRectPath(CGRect rect, CGFloat cornerRadius); -void AddRoundedRectPath(CGContextRef context, CGRect rect, CGFloat cornerRadius); +__nonnull CGPathRef CreateRoundedRectPath(CGRect rect, CGFloat cornerRadius); +void AddRoundedRectPath(__nonnull CGContextRef context, CGRect rect, CGFloat cornerRadius); #if __cplusplus } diff --git a/framework/Source/CPTPieChart.h b/framework/Source/CPTPieChart.h index 3c4e9fea3..38d09098b 100644 --- a/framework/Source/CPTPieChart.h +++ b/framework/Source/CPTPieChart.h @@ -11,9 +11,9 @@ /// @ingroup plotBindingsPieChart /// @{ -extern NSString *const CPTPieChartBindingPieSliceWidthValues; -extern NSString *const CPTPieChartBindingPieSliceFills; -extern NSString *const CPTPieChartBindingPieSliceRadialOffsets; +extern NSString *__nonnull const CPTPieChartBindingPieSliceWidthValues; +extern NSString *__nonnull const CPTPieChartBindingPieSliceFills; +extern NSString *__nonnull const CPTPieChartBindingPieSliceRadialOffsets; /// @} /** @@ -49,7 +49,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of pie slice fills. **/ --(NSArray *)sliceFillsForPieChart:(CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)sliceFillsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a fill for the given pie chart slice. * This method will not be called if @@ -60,7 +60,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @return The pie slice fill for the slice with the given index. If the datasource returns @nil, the default fill is used. * If the data source returns an NSNull object, no fill is drawn. **/ --(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; +-(nullable CPTFill *)sliceFillForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; /// @} @@ -72,7 +72,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of radial offsets. **/ --(NSArray *)radialOffsetsForPieChart:(CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)radialOffsetsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Offsets the slice radially from the center point. Can be used to @quote{explode} the chart. * This method will not be called if @@ -82,7 +82,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param idx The data index of interest. * @return The radial offset in view coordinates. Zero is no offset. **/ --(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; +-(CGFloat)radialOffsetForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; /// @} @@ -94,14 +94,14 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param idx The data index of interest. * @return The title text for the legend entry for the point with the given index. **/ --(NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; +-(nullable NSString *)legendTitleForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; /** @brief @optional Gets the styled legend title for the given pie chart slice. * @param pieChart The pie chart. * @param idx The data index of interest. * @return The styled title text for the legend entry for the point with the given index. **/ --(NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; +-(nullable NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)idx; /// @} @end @@ -126,7 +126,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if MacOnly clicked pie slice. @endif * @if iOSOnly touched pie slice. @endif **/ --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a pie slice * @if MacOnly was both pressed and released. @endif @@ -137,7 +137,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if iOSOnly touched pie slice. @endif * @param event The event that triggered the selection. **/ --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a pie slice * @if MacOnly was pressed. @endif @@ -147,7 +147,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if MacOnly clicked pie slice. @endif * @if iOSOnly touched pie slice. @endif **/ --(void)pieChart:(CPTPieChart *)plot sliceTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a pie slice * @if MacOnly was pressed. @endif @@ -158,7 +158,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if iOSOnly touched pie slice. @endif * @param event The event that triggered the selection. **/ --(void)pieChart:(CPTPieChart *)plot sliceTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a pie slice * @if MacOnly was released. @endif @@ -168,7 +168,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if MacOnly clicked pie slice. @endif * @if iOSOnly touched pie slice. @endif **/ --(void)pieChart:(CPTPieChart *)plot sliceTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a pie slice * @if MacOnly was released. @endif @@ -179,7 +179,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @if iOSOnly touched pie slice. @endif * @param event The event that triggered the selection. **/ --(void)pieChart:(CPTPieChart *)plot sliceTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)pieChart:(nonnull CPTPieChart *)plot sliceTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -201,8 +201,8 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *borderLineStyle; -@property (nonatomic, readwrite, copy) CPTFill *overlayFill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *borderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTFill *overlayFill; /// @} /// @name Data Labels @@ -230,7 +230,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { /// @name Factory Methods /// @{ -+(CPTColor *)defaultPieSliceColorForIndex:(NSUInteger)pieSliceIndex; ++(nonnull CPTColor *)defaultPieSliceColorForIndex:(NSUInteger)pieSliceIndex; /// @} @end diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 5f3e80151..e669eae72 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -16,7 +16,7 @@ /// @ingroup plotBindingsAllPlots /// @{ -extern NSString *const CPTPlotBindingDataLabels; +extern NSString *__nonnull const CPTPlotBindingDataLabels; /// @} /** @@ -42,7 +42,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param plot The plot. * @return The number of data points for the plot. **/ --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot; +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot; @optional @@ -59,7 +59,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return An array of data points. **/ --(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a plot data value for the given plot and field. * Implement one and only one of the optional methods in this section. @@ -74,7 +74,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param idx The data index of interest. * @return A data point. **/ --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; /** @brief @optional Gets a range of plot data for the given plot and field. * Implement one and only one of the optional methods in this section. @@ -83,7 +83,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return A retained C array of data points. **/ --(double *)doublesForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; +-(nullable double *)doublesForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a plot data value for the given plot and field. * Implement one and only one of the optional methods in this section. @@ -92,7 +92,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param idx The data index of interest. * @return A data point. **/ --(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; +-(double)doubleForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; /** @brief @optional Gets a range of plot data for the given plot and field. * Implement one and only one of the optional methods in this section. @@ -101,7 +101,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return A one-dimensional array of data points. **/ --(CPTNumericData *)dataForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; +-(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a range of plot data for all fields of the given plot simultaneously. * Implement one and only one of the optional methods in this section. @@ -117,7 +117,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return A two-dimensional array of data points. **/ --(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; /// @} @@ -129,7 +129,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return An array of data labels. **/ --(NSArray *)dataLabelsForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)dataLabelsForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a data label for the given plot. * This method will not be called if @@ -141,7 +141,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * If you return @nil, the default data label will be used. If you return an instance of NSNull, * no label will be shown for the index in question. **/ --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)idx; /// @} @@ -167,7 +167,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if MacOnly clicked data label. @endif * @if iOSOnly touched data label. @endif **/ --(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data label * @if MacOnly was both pressed and released. @endif @@ -178,7 +178,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if iOSOnly touched data label. @endif * @param event The event that triggered the selection. **/ --(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a data label * @if MacOnly was pressed. @endif @@ -188,7 +188,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if MacOnly clicked data label. @endif * @if iOSOnly touched data label. @endif **/ --(void)plot:(CPTPlot *)plot dataLabelTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)plot:(nonnull CPTPlot *)plot dataLabelTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data label * @if MacOnly was pressed. @endif @@ -199,7 +199,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if iOSOnly touched data label. @endif * @param event The event that triggered the selection. **/ --(void)plot:(CPTPlot *)plot dataLabelTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)plot:(nonnull CPTPlot *)plot dataLabelTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a data label * @if MacOnly was released. @endif @@ -209,7 +209,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if MacOnly clicked data label. @endif * @if iOSOnly touched data label. @endif **/ --(void)plot:(CPTPlot *)plot dataLabelTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)plot:(nonnull CPTPlot *)plot dataLabelTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data label * @if MacOnly was released. @endif @@ -220,7 +220,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @if iOSOnly touched data label. @endif * @param event The event that triggered the selection. **/ --(void)plot:(CPTPlot *)plot dataLabelTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)plot:(nonnull CPTPlot *)plot dataLabelTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -231,7 +231,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @brief @optional Informs the delegate that plot drawing is finished. * @param plot The plot. **/ --(void)didFinishDrawing:(CPTPlot *)plot; +-(void)didFinishDrawing:(nonnull CPTPlot *)plot; /// @} @@ -243,23 +243,23 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /// @name Data Source /// @{ -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak id dataSource; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak id dataSource; /// @} /// @name Identification /// @{ -@property (nonatomic, readwrite, copy) NSString *title; -@property (nonatomic, readwrite, copy) NSAttributedString *attributedTitle; +@property (nonatomic, readwrite, copy, nullable) NSString *title; +@property (nonatomic, readwrite, copy, nullable) NSAttributedString *attributedTitle; /// @} /// @name Plot Space /// @{ -@property (nonatomic, readwrite, strong) CPTPlotSpace *plotSpace; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpace *plotSpace; /// @} /// @name Plot Area /// @{ -@property (nonatomic, readonly) CPTPlotArea *plotArea; +@property (nonatomic, readonly, nullable) CPTPlotArea *plotArea; /// @} /// @name Data Loading @@ -284,9 +284,9 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { @property (nonatomic, readwrite, assign) CGFloat labelOffset; @property (nonatomic, readwrite, assign) CGFloat labelRotation; @property (nonatomic, readwrite, assign) NSUInteger labelField; -@property (nonatomic, readwrite, copy) CPTTextStyle *labelTextStyle; -@property (nonatomic, readwrite, strong) NSFormatter *labelFormatter; -@property (nonatomic, readwrite, strong) CPTShadow *labelShadow; +@property (nonatomic, readwrite, copy, nullable) CPTTextStyle *labelTextStyle; +@property (nonatomic, readwrite, strong, nullable) NSFormatter *labelFormatter; +@property (nonatomic, readwrite, strong, nullable) CPTShadow *labelShadow; /// @} /// @name Drawing @@ -323,38 +323,38 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /// @name Plot Data /// @{ -+(id)nilData; --(id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; ++(nonnull id)nilData; +-(nullable id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRange; /// @} /// @name Data Cache /// @{ --(CPTMutableNumericData *)cachedNumbersForField:(NSUInteger)fieldEnum; --(NSNumber *)cachedNumberForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; +-(nullable CPTMutableNumericData *)cachedNumbersForField:(NSUInteger)fieldEnum; +-(nullable NSNumber *)cachedNumberForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; -(double)cachedDoubleForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; -(NSDecimal)cachedDecimalForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx; --(NSArray *)cachedArrayForKey:(NSString *)key; --(id)cachedValueForKey:(NSString *)key recordIndex:(NSUInteger)idx; +-(nullable NSArray *)cachedArrayForKey:(nonnull NSString *)key; +-(nullable id)cachedValueForKey:(nonnull NSString *)key recordIndex:(NSUInteger)idx; --(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum; --(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NSUInteger)idx; --(void)cacheArray:(NSArray *)array forKey:(NSString *)key; --(void)cacheArray:(NSArray *)array forKey:(NSString *)key atRecordIndex:(NSUInteger)idx; +-(void)cacheNumbers:(nullable id)numbers forField:(NSUInteger)fieldEnum; +-(void)cacheNumbers:(nullable id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NSUInteger)idx; +-(void)cacheArray:(nullable NSArray *)array forKey:(nonnull NSString *)key; +-(void)cacheArray:(nullable NSArray *)array forKey:(nonnull NSString *)key atRecordIndex:(NSUInteger)idx; /// @} /// @name Plot Data Ranges /// @{ --(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum; --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord; +-(nullable CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum; +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord; /// @} /// @name Legends /// @{ -(NSUInteger)numberOfLegendEntries; --(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx; --(NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx; --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context; +-(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx; +-(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx; +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @end @@ -369,14 +369,14 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /// @name Fields /// @{ -(NSUInteger)numberOfFields; --(NSArray *)fieldIdentifiers; --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; +-(nonnull NSArray *)fieldIdentifiers; +-(nonnull NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field; /// @} /// @name Data Labels /// @{ --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx; +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx; /// @} /// @name User Interaction diff --git a/framework/Source/CPTPlotArea.h b/framework/Source/CPTPlotArea.h index 3dc01bf99..3e101ce8b 100644 --- a/framework/Source/CPTPlotArea.h +++ b/framework/Source/CPTPlotArea.h @@ -26,7 +26,7 @@ * @if iOSOnly received both the touch down and up events. @endif * @param plotArea The plot area. **/ --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea; +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea; /** @brief @optional Informs the delegate that a plot area * @if MacOnly was both pressed and released. @endif @@ -34,14 +34,14 @@ * @param plotArea The plot area. * @param event The event that triggered the selection. **/ --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea withEvent:(CPTNativeEvent *)event; +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a plot area * @if MacOnly was pressed. @endif * @if iOSOnly touch started. @endif * @param plotArea The plot area. **/ --(void)plotAreaTouchDown:(CPTPlotArea *)plotArea; +-(void)plotAreaTouchDown:(nonnull CPTPlotArea *)plotArea; /** @brief @optional Informs the delegate that a plot area * @if MacOnly was pressed. @endif @@ -49,14 +49,14 @@ * @param plotArea The plot area. * @param event The event that triggered the selection. **/ --(void)plotAreaTouchDown:(CPTPlotArea *)plotArea withEvent:(CPTNativeEvent *)event; +-(void)plotAreaTouchDown:(nonnull CPTPlotArea *)plotArea withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a plot area * @if MacOnly was released. @endif * @if iOSOnly touch ended. @endif * @param plotArea The plot area. **/ --(void)plotAreaTouchUp:(CPTPlotArea *)plotArea; +-(void)plotAreaTouchUp:(nonnull CPTPlotArea *)plotArea; /** @brief @optional Informs the delegate that a plot area * @if MacOnly was released. @endif @@ -64,7 +64,7 @@ * @param plotArea The plot area. * @param event The event that triggered the selection. **/ --(void)plotAreaTouchUp:(CPTPlotArea *)plotArea withEvent:(CPTNativeEvent *)event; +-(void)plotAreaTouchUp:(nonnull CPTPlotArea *)plotArea withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -75,23 +75,23 @@ @interface CPTPlotArea : CPTAnnotationHostLayer /// @name Layers /// @{ -@property (nonatomic, readwrite, strong) CPTGridLineGroup *minorGridLineGroup; -@property (nonatomic, readwrite, strong) CPTGridLineGroup *majorGridLineGroup; -@property (nonatomic, readwrite, strong) CPTAxisSet *axisSet; -@property (nonatomic, readwrite, strong) CPTPlotGroup *plotGroup; -@property (nonatomic, readwrite, strong) CPTAxisLabelGroup *axisLabelGroup; -@property (nonatomic, readwrite, strong) CPTAxisLabelGroup *axisTitleGroup; +@property (nonatomic, readwrite, strong, nullable) CPTGridLineGroup *minorGridLineGroup; +@property (nonatomic, readwrite, strong, nullable) CPTGridLineGroup *majorGridLineGroup; +@property (nonatomic, readwrite, strong, nullable) CPTAxisSet *axisSet; +@property (nonatomic, readwrite, strong, nullable) CPTPlotGroup *plotGroup; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelGroup *axisLabelGroup; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelGroup *axisTitleGroup; /// @} /// @name Layer Ordering /// @{ -@property (nonatomic, readwrite, strong) NSArray *topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) NSArray *topDownLayerOrder; /// @} /// @name Decorations /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *borderLineStyle; -@property (nonatomic, readwrite, copy) CPTFill *fill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *borderLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTFill *fill; /// @} /// @name Dimensions @@ -104,7 +104,7 @@ /// @{ -(void)updateAxisSetLayersForType:(CPTGraphLayerType)layerType; -(void)setAxisSetLayersForType:(CPTGraphLayerType)layerType; --(unsigned)sublayerIndexForAxis:(CPTAxis *)axis layerType:(CPTGraphLayerType)layerType; +-(unsigned)sublayerIndexForAxis:(nonnull CPTAxis *)axis layerType:(CPTGraphLayerType)layerType; /// @} @end diff --git a/framework/Source/CPTPlotAreaFrame.h b/framework/Source/CPTPlotAreaFrame.h index dfad8fd48..89067ce11 100644 --- a/framework/Source/CPTPlotAreaFrame.h +++ b/framework/Source/CPTPlotAreaFrame.h @@ -6,8 +6,8 @@ @interface CPTPlotAreaFrame : CPTBorderedLayer -@property (nonatomic, readonly) CPTPlotArea *plotArea; -@property (nonatomic, readwrite, strong) CPTAxisSet *axisSet; -@property (nonatomic, readwrite, strong) CPTPlotGroup *plotGroup; +@property (nonatomic, readonly, nullable) CPTPlotArea *plotArea; +@property (nonatomic, readwrite, strong, nullable) CPTAxisSet *axisSet; +@property (nonatomic, readwrite, strong, nullable) CPTPlotGroup *plotGroup; @end diff --git a/framework/Source/CPTPlotGroup.h b/framework/Source/CPTPlotGroup.h index 82d36724c..77d451dec 100644 --- a/framework/Source/CPTPlotGroup.h +++ b/framework/Source/CPTPlotGroup.h @@ -6,9 +6,9 @@ /// @name Adding and Removing Plots /// @{ --(void)addPlot:(CPTPlot *)plot; --(void)removePlot:(CPTPlot *)plot; --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx; +-(void)addPlot:(nonnull CPTPlot *)plot; +-(void)removePlot:(nullable CPTPlot *)plot; +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx; /// @} @end diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index 36c441e73..56f7437e2 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -15,9 +15,9 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { /// @name Range Limits /// @{ -@property (nonatomic, readonly, strong) NSNumber *location; -@property (nonatomic, readonly, strong) NSNumber *length; -@property (nonatomic, readonly, strong) NSNumber *end; +@property (nonatomic, readonly, strong, nonnull) NSNumber *location; +@property (nonatomic, readonly, strong, nonnull) NSNumber *length; +@property (nonatomic, readonly, strong, nonnull) NSNumber *end; @property (nonatomic, readonly) NSDecimal locationDecimal; @property (nonatomic, readonly) NSDecimal lengthDecimal; @property (nonatomic, readonly) NSDecimal endDecimal; @@ -25,9 +25,9 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { @property (nonatomic, readonly) double lengthDouble; @property (nonatomic, readonly) double endDouble; -@property (nonatomic, readonly, strong) NSNumber *minLimit; -@property (nonatomic, readonly, strong) NSNumber *midPoint; -@property (nonatomic, readonly, strong) NSNumber *maxLimit; +@property (nonatomic, readonly, strong, nonnull) NSNumber *minLimit; +@property (nonatomic, readonly, strong, nonnull) NSNumber *midPoint; +@property (nonatomic, readonly, strong, nonnull) NSNumber *maxLimit; @property (nonatomic, readonly) NSDecimal minLimitDecimal; @property (nonatomic, readonly) NSDecimal midPointDecimal; @property (nonatomic, readonly) NSDecimal maxLimitDecimal; @@ -38,30 +38,30 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { /// @name Factory Methods /// @{ -+(instancetype)plotRangeWithLocation:(NSNumber *)loc length:(NSNumber *)len; -+(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len; ++(nonnull instancetype)plotRangeWithLocation:(nonnull NSNumber *)loc length:(nonnull NSNumber *)len; ++(nonnull instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len; /// @} /// @name Initialization /// @{ --(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len; --(instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLocation:(nonnull NSNumber *)loc length:(nonnull NSNumber *)len; +-(nonnull instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Checking Ranges /// @{ -(BOOL)contains:(NSDecimal)number; -(BOOL)containsDouble:(double)number; --(BOOL)containsNumber:(NSNumber *)number; --(BOOL)isEqualToRange:(CPTPlotRange *)otherRange; --(BOOL)containsRange:(CPTPlotRange *)otherRange; --(BOOL)intersectsRange:(CPTPlotRange *)otherRange; +-(BOOL)containsNumber:(nullable NSNumber *)number; +-(BOOL)isEqualToRange:(nullable CPTPlotRange *)otherRange; +-(BOOL)containsRange:(nullable CPTPlotRange *)otherRange; +-(BOOL)intersectsRange:(nullable CPTPlotRange *)otherRange; /// @} /// @name Range Comparison /// @{ --(CPTPlotRangeComparisonResult)compareToNumber:(NSNumber *)number; +-(CPTPlotRangeComparisonResult)compareToNumber:(nonnull NSNumber *)number; -(CPTPlotRangeComparisonResult)compareToDecimal:(NSDecimal)number; -(CPTPlotRangeComparisonResult)compareToDouble:(double)number; /// @} diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index ab4efec32..8fd034c17 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -153,6 +153,9 @@ +(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDeci **/ -(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len { + NSParameterAssert(loc); + NSParameterAssert(len); + return [self initWithLocationDecimal:loc.decimalValue lengthDecimal:len.decimalValue]; } diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 7bca84db5..8b054dacc 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -15,7 +15,7 @@ * the plot space coordinate system and drawing coordinates changes. * @ingroup notification **/ -extern NSString *const CPTPlotSpaceCoordinateMappingDidChangeNotification; +extern NSString *__nonnull const CPTPlotSpaceCoordinateMappingDidChangeNotification; /** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate the plot coordinate affected by the mapping change. @@ -23,7 +23,7 @@ extern NSString *const CPTPlotSpaceCoordinateMappingDidChangeNotification; * The value associated with this key is the CPTCoordinate affected by the change wrapped in an instance of NSNumber. * @ingroup notification **/ -extern NSString *const CPTPlotSpaceCoordinateKey; +extern NSString *__nonnull const CPTPlotSpaceCoordinateKey; /** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate whether the mapping change is a scroll movement or other change. @@ -32,7 +32,7 @@ extern NSString *const CPTPlotSpaceCoordinateKey; * is @YES if the plot space change represents a horizontal or vertical translation, @NO otherwise. * @ingroup notification **/ -extern NSString *const CPTPlotSpaceScrollingKey; +extern NSString *__nonnull const CPTPlotSpaceScrollingKey; /** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate the displacement offset for scrolling changes in drawing coordinates. @@ -40,7 +40,7 @@ extern NSString *const CPTPlotSpaceScrollingKey; * The value associated with this key is the displacement offset wrapped in an instance of NSNumber. * @ingroup notification **/ -extern NSString *const CPTPlotSpaceDisplacementKey; +extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; /// @} @@ -61,7 +61,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return @YES if the gesture should be handled by the plot space, and @NO if not. * In either case, the delegate may choose to take extra actions, or handle the scaling itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldScaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldScaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; /// @} @@ -73,7 +73,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @param proposedDisplacementVector The proposed amount by which the plot space will shift. * @return The displacement actually applied. **/ --(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)proposedDisplacementVector; +-(CGPoint)plotSpace:(nonnull CPTPlotSpace *)space willDisplaceBy:(CGPoint)proposedDisplacementVector; /// @} @@ -86,13 +86,13 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @param coordinate The coordinate of the range. * @return The new plot range to be used. **/ --(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate; +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate; /** @brief @optional Notifies that plot space has changed a plot range. * @param space The plot space. * @param coordinate The coordinate of the range. **/ --(void)plotSpace:(CPTPlotSpace *)space didChangePlotRangeForCoordinate:(CPTCoordinate)coordinate; +-(void)plotSpace:(nonnull CPTPlotSpace *)space didChangePlotRangeForCoordinate:(CPTCoordinate)coordinate; /// @} @@ -106,7 +106,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return Whether the plot space should handle the event or not. * In either case, the delegate may choose to take extra actions, or handle the event itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point; /** @brief @optional Notifies that plot space intercepted a device dragged event. * @param space The plot space. @@ -115,7 +115,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return Whether the plot space should handle the event or not. * In either case, the delegate may choose to take extra actions, or handle the event itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point; /** @brief @optional Notifies that plot space intercepted a device cancelled event. * @param space The plot space. @@ -123,7 +123,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return Whether the plot space should handle the event or not. * In either case, the delegate may choose to take extra actions, or handle the event itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(CPTNativeEvent *)event; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Notifies that plot space intercepted a device up event. * @param space The plot space. @@ -132,7 +132,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return Whether the plot space should handle the event or not. * In either case, the delegate may choose to take extra actions, or handle the event itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #else @@ -145,7 +145,7 @@ extern NSString *const CPTPlotSpaceDisplacementKey; * @return Whether the plot space should handle the event or not. * In either case, the delegate may choose to take extra actions, or handle the event itself. **/ --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandleScrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint; +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandleScrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint; #endif /// @} @@ -156,31 +156,31 @@ extern NSString *const CPTPlotSpaceDisplacementKey; @interface CPTPlotSpace : NSObject -@property (nonatomic, readwrite, copy) id identifier; +@property (nonatomic, readwrite, copy, nullable) id identifier; @property (nonatomic, readwrite) BOOL allowsUserInteraction; @property (nonatomic, readonly) BOOL isDragging; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTGraph *graph; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak id delegate; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak id delegate; @property (nonatomic, readonly) NSUInteger numberOfCoordinates; /// @name Categorical Data /// @{ --(void)addCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate; --(void)removeCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate; --(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; --(void)setCategories:(NSArray *)newCategories forCoordinate:(CPTCoordinate)coordinate; +-(void)addCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; +-(void)removeCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; +-(void)insertCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; +-(void)setCategories:(nullable NSArray *)newCategories forCoordinate:(CPTCoordinate)coordinate; -(void)removeAllCategories; --(NSArray *)categoriesForCoordinate:(CPTCoordinate)coordinate; --(NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; --(NSUInteger)indexOfCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate; +-(nonnull NSArray *)categoriesForCoordinate:(CPTCoordinate)coordinate; +-(nullable NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; +-(NSUInteger)indexOfCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; /// @} /// @name Initialization /// @{ --(instancetype)init NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)init NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end @@ -194,25 +194,25 @@ extern NSString *const CPTPlotSpaceDisplacementKey; /// @name Coordinate Space Conversions /// @{ --(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint; --(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count; --(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count; +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSArray *)plotPoint; +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count; +-(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count; --(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point; --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; +-(nullable NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point; +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; --(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event; +-(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event; --(NSArray *)plotPointForEvent:(CPTNativeEvent *)event; --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event; --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event; +-(nullable NSArray *)plotPointForEvent:(nonnull CPTNativeEvent *)event; +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; /// @} /// @name Coordinate Range /// @{ --(void)setPlotRange:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate; --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate; +-(void)setPlotRange:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate; +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate; /// @} /// @name Scale Types @@ -223,8 +223,8 @@ extern NSString *const CPTPlotSpaceDisplacementKey; /// @name Adjusting Ranges /// @{ --(void)scaleToFitPlots:(NSArray *)plots; --(void)scaleToFitPlots:(NSArray *)plots forCoordinate:(CPTCoordinate)coordinate; +-(void)scaleToFitPlots:(nullable NSArray *)plots; +-(void)scaleToFitPlots:(nullable NSArray *)plots forCoordinate:(CPTCoordinate)coordinate; -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; /// @} diff --git a/framework/Source/CPTPlotSpaceAnnotation.h b/framework/Source/CPTPlotSpaceAnnotation.h index 0fd3f8c7a..be0ff4b5e 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.h +++ b/framework/Source/CPTPlotSpaceAnnotation.h @@ -4,10 +4,10 @@ @interface CPTPlotSpaceAnnotation : CPTAnnotation -@property (nonatomic, readwrite, copy) NSArray *anchorPlotPoint; -@property (nonatomic, readonly) CPTPlotSpace *plotSpace; +@property (nonatomic, readwrite, copy, nullable) NSArray *anchorPlotPoint; +@property (nonatomic, readonly, nonnull) CPTPlotSpace *plotSpace; --(instancetype)initWithPlotSpace:(CPTPlotSpace *)space anchorPlotPoint:(NSArray *)plotPoint NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable NSArray *)plotPoint NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 08f070221..11e6db10f 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -1,5 +1,6 @@ #import "CPTPlotSpaceAnnotation.h" +#import "CPTExceptions.h" #import "CPTPlotArea.h" #import "CPTPlotAreaFrame.h" #import "CPTPlotSpace.h" @@ -8,7 +9,7 @@ @interface CPTPlotSpaceAnnotation() -@property (nonatomic, readwrite) NSDecimal *decimalAnchor; +@property (nonatomic, readwrite, nonnull) NSDecimal *decimalAnchor; @property (nonatomic, readwrite) NSUInteger anchorCount; -(void)setContentNeedsLayout; @@ -75,10 +76,11 @@ -(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(N /// @cond -// plotSpace is required; this will fail the assertion in -initWithPlotSpace:anchorPlotPoint: +// plotSpace is required -(instancetype)init { - return [self initWithPlotSpace:nil anchorPlotPoint:nil]; + [NSException raise:CPTException format:@"%@ must be initialized with a plot space.", NSStringFromClass([self class])]; + return [self initWithPlotSpace:[[CPTPlotSpace alloc] init] anchorPlotPoint:nil]; } -(void)dealloc diff --git a/framework/Source/CPTPlotSymbol.h b/framework/Source/CPTPlotSymbol.h index 5b9933544..60701b0a9 100644 --- a/framework/Source/CPTPlotSymbol.h +++ b/framework/Source/CPTPlotSymbol.h @@ -28,33 +28,33 @@ typedef NS_ENUM (NSInteger, CPTPlotSymbolType) { @property (nonatomic, readwrite, assign) CGPoint anchorPoint; @property (nonatomic, readwrite, assign) CGSize size; @property (nonatomic, readwrite, assign) CPTPlotSymbolType symbolType; -@property (nonatomic, readwrite, strong) CPTLineStyle *lineStyle; -@property (nonatomic, readwrite, strong) CPTFill *fill; -@property (nonatomic, readwrite, copy) CPTShadow *shadow; -@property (nonatomic, readwrite, assign) CGPathRef customSymbolPath; +@property (nonatomic, readwrite, strong, nullable) CPTLineStyle *lineStyle; +@property (nonatomic, readwrite, strong, nullable) CPTFill *fill; +@property (nonatomic, readwrite, copy, nullable) CPTShadow *shadow; +@property (nonatomic, readwrite, assign, nullable) CGPathRef customSymbolPath; @property (nonatomic, readwrite, assign) BOOL usesEvenOddClipRule; /// @name Factory Methods /// @{ -+(instancetype)plotSymbol; -+(instancetype)crossPlotSymbol; -+(instancetype)ellipsePlotSymbol; -+(instancetype)rectanglePlotSymbol; -+(instancetype)plusPlotSymbol; -+(instancetype)starPlotSymbol; -+(instancetype)diamondPlotSymbol; -+(instancetype)trianglePlotSymbol; -+(instancetype)pentagonPlotSymbol; -+(instancetype)hexagonPlotSymbol; -+(instancetype)dashPlotSymbol; -+(instancetype)snowPlotSymbol; -+(instancetype)customPlotSymbolWithPath:(CGPathRef)aPath; ++(nonnull instancetype)plotSymbol; ++(nonnull instancetype)crossPlotSymbol; ++(nonnull instancetype)ellipsePlotSymbol; ++(nonnull instancetype)rectanglePlotSymbol; ++(nonnull instancetype)plusPlotSymbol; ++(nonnull instancetype)starPlotSymbol; ++(nonnull instancetype)diamondPlotSymbol; ++(nonnull instancetype)trianglePlotSymbol; ++(nonnull instancetype)pentagonPlotSymbol; ++(nonnull instancetype)hexagonPlotSymbol; ++(nonnull instancetype)dashPlotSymbol; ++(nonnull instancetype)snowPlotSymbol; ++(nonnull instancetype)customPlotSymbolWithPath:(nullable CGPathRef)aPath; /// @} /// @name Drawing /// @{ --(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale alignToPixels:(BOOL)alignToPixels; --(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale; +-(void)renderInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale alignToPixels:(BOOL)alignToPixels; +-(void)renderAsVectorInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale; /// @} @end diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index 48181d638..a15ce081e 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -7,13 +7,13 @@ /// @ingroup plotBindingsRangePlot /// @{ -extern NSString *const CPTRangePlotBindingXValues; -extern NSString *const CPTRangePlotBindingYValues; -extern NSString *const CPTRangePlotBindingHighValues; -extern NSString *const CPTRangePlotBindingLowValues; -extern NSString *const CPTRangePlotBindingLeftValues; -extern NSString *const CPTRangePlotBindingRightValues; -extern NSString *const CPTRangePlotBindingBarLineStyles; +extern NSString *__nonnull const CPTRangePlotBindingXValues; +extern NSString *__nonnull const CPTRangePlotBindingYValues; +extern NSString *__nonnull const CPTRangePlotBindingHighValues; +extern NSString *__nonnull const CPTRangePlotBindingLowValues; +extern NSString *__nonnull const CPTRangePlotBindingLeftValues; +extern NSString *__nonnull const CPTRangePlotBindingRightValues; +extern NSString *__nonnull const CPTRangePlotBindingBarLineStyles; /// @} /** @@ -44,7 +44,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(NSArray *)barLineStylesForRangePlot:(CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)barLineStylesForRangePlot:(nonnull CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given range plot. * This method will not be called if @@ -55,7 +55,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @return The bar line style for the bar with the given index. If the data source returns @nil, the default line style is used. * If the data source returns an NSNull object, no line is drawn. **/ --(CPTLineStyle *)barLineStyleForRangePlot:(CPTRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)barLineStyleForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx; /// @} @@ -81,7 +81,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)rangePlot:(CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was both pressed and released. @endif @@ -92,7 +92,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)rangePlot:(CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -102,7 +102,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)rangePlot:(CPTRangePlot *)plot rangeTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -113,7 +113,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)rangePlot:(CPTRangePlot *)plot rangeTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -123,7 +123,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)rangePlot:(CPTRangePlot *)plot rangeTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -134,7 +134,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)rangePlot:(CPTRangePlot *)plot rangeTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -146,7 +146,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { /// @name Appearance /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *barLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *barLineStyle; @property (nonatomic, readwrite) CGFloat barWidth; @property (nonatomic, readwrite) CGFloat gapHeight; @property (nonatomic, readwrite) CGFloat gapWidth; @@ -154,8 +154,8 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { /// @name Drawing /// @{ -@property (nonatomic, copy) CPTFill *areaFill; -@property (nonatomic, readwrite, copy) CPTLineStyle *areaBorderLineStyle; +@property (nonatomic, copy, nullable) CPTFill *areaFill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *areaBorderLineStyle; /// @} /// @name Bar Style diff --git a/framework/Source/CPTResponder.h b/framework/Source/CPTResponder.h index bfeac073f..0e60d5d54 100644 --- a/framework/Source/CPTResponder.h +++ b/framework/Source/CPTResponder.h @@ -16,7 +16,7 @@ * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; /** * @brief @required Informs the receiver that the user has @@ -26,7 +26,7 @@ * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; /** * @brief @required Informs the receiver that the user has moved @@ -36,7 +36,7 @@ * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint; /** * @brief @required Informs the receiver that tracking of @@ -46,7 +46,7 @@ * @param event The OS event. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event; +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #else @@ -58,7 +58,7 @@ * @param toPoint The ending coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint; +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint; #endif /// @} diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 31baef1c6..e55fa4d9b 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -11,9 +11,9 @@ /// @ingroup plotBindingsScatterPlot /// @{ -extern NSString *const CPTScatterPlotBindingXValues; -extern NSString *const CPTScatterPlotBindingYValues; -extern NSString *const CPTScatterPlotBindingPlotSymbols; +extern NSString *__nonnull const CPTScatterPlotBindingXValues; +extern NSString *__nonnull const CPTScatterPlotBindingYValues; +extern NSString *__nonnull const CPTScatterPlotBindingPlotSymbols; /// @} /** @@ -61,7 +61,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param indexRange The range of the data indexes of interest. * @return An array of plot symbols. **/ --(NSArray *)symbolsForScatterPlot:(CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)symbolsForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a single plot symbol for the given scatter plot. * This method will not be called if @@ -71,7 +71,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param idx The data index of interest. * @return The plot symbol to show for the point with the given index. **/ --(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndex:(NSUInteger)idx; /// @} @@ -97,7 +97,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if MacOnly clicked data point. @endif * @if iOSOnly touched data point. @endif **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data point * @if MacOnly was both pressed and released. @endif @@ -108,7 +108,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if iOSOnly touched data point. @endif * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a data point * @if MacOnly was pressed. @endif @@ -118,7 +118,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if MacOnly clicked data point. @endif * @if iOSOnly touched data point. @endif **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data point * @if MacOnly was pressed. @endif @@ -129,7 +129,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if iOSOnly touched data point. @endif * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a data point * @if MacOnly was released. @endif @@ -139,7 +139,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if MacOnly clicked data point. @endif * @if iOSOnly touched data point. @endif **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a data point * @if MacOnly was released. @endif @@ -150,7 +150,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if iOSOnly touched data point. @endif * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -162,7 +162,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @if iOSOnly the plot line received both the touch down and up events. @endif * @param plot The scatter plot. **/ --(void)scatterPlotDataLineWasSelected:(CPTScatterPlot *)plot; +-(void)scatterPlotDataLineWasSelected:(nonnull CPTScatterPlot *)plot; /** @brief @optional Informs the delegate that * @if MacOnly the mouse was both pressed and released on the plot line.@endif @@ -170,7 +170,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param plot The scatter plot. * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot dataLineWasSelectedWithEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot dataLineWasSelectedWithEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that * @if MacOnly the mouse was pressed @endif @@ -178,7 +178,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * while over the plot line. * @param plot The scatter plot. **/ --(void)scatterPlotDataLineTouchDown:(CPTScatterPlot *)plot; +-(void)scatterPlotDataLineTouchDown:(nonnull CPTScatterPlot *)plot; /** @brief @optional Informs the delegate that * @if MacOnly the mouse was pressed @endif @@ -187,7 +187,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param plot The scatter plot. * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot dataLineTouchDownWithEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot dataLineTouchDownWithEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that * @if MacOnly the mouse was released @endif @@ -195,7 +195,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * while over the plot line. * @param plot The scatter plot. **/ --(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot; +-(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot; /** @brief @optional Informs the delegate that * @if MacOnly the mouse was released @endif @@ -204,7 +204,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param plot The scatter plot. * @param event The event that triggered the selection. **/ --(void)scatterPlot:(CPTScatterPlot *)plot dataLineTouchUpWithEvent:(CPTNativeEvent *)event; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot dataLineTouchUpWithEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -218,7 +218,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param dataLinePath The CGPath describing the plot line that is about to be drawn. * @param context The graphics context in which the plot line will be drawn. **/ --(void)scatterPlot:(CPTScatterPlot *)plot prepareForDrawingPlotLine:(CGPathRef)dataLinePath inContext:(CGContextRef)context; +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot prepareForDrawingPlotLine:(nonnull CGPathRef)dataLinePath inContext:(nonnull CGContextRef)context; /// @} @@ -230,28 +230,28 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { /// @name Appearance /// @{ -@property (nonatomic, readwrite, strong) NSNumber *areaBaseValue; -@property (nonatomic, readwrite, strong) NSNumber *areaBaseValue2; +@property (nonatomic, readwrite, strong, nullable) NSNumber *areaBaseValue; +@property (nonatomic, readwrite, strong, nullable) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; @property (nonatomic, readwrite, assign) CPTScatterPlotHistogramOption histogramOption; /// @} /// @name Area Fill Bands /// @{ -@property (nonatomic, readonly) NSArray *areaFillBands; +@property (nonatomic, readonly, nullable) NSArray *areaFillBands; /// @} /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *dataLineStyle; -@property (nonatomic, readwrite, copy) CPTPlotSymbol *plotSymbol; -@property (nonatomic, readwrite, copy) CPTFill *areaFill; -@property (nonatomic, readwrite, copy) CPTFill *areaFill2; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *dataLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTPlotSymbol *plotSymbol; +@property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill; +@property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill2; /// @} /// @name Data Line /// @{ -@property (nonatomic, readonly) CGPathRef newDataLinePath; +@property (nonatomic, readonly, nonnull) CGPathRef newDataLinePath; /// @} /// @name User Interaction @@ -269,15 +269,15 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { /// @name Plot Symbols /// @{ --(CPTPlotSymbol *)plotSymbolForRecordIndex:(NSUInteger)idx; +-(nullable CPTPlotSymbol *)plotSymbolForRecordIndex:(NSUInteger)idx; -(void)reloadPlotSymbols; -(void)reloadPlotSymbolsInIndexRange:(NSRange)indexRange; /// @} /// @name Area Fill Bands /// @{ --(void)addAreaFillBand:(CPTLimitBand *)limitBand; --(void)removeAreaFillBand:(CPTLimitBand *)limitBand; +-(void)addAreaFillBand:(nullable CPTLimitBand *)limitBand; +-(void)removeAreaFillBand:(nullable CPTLimitBand *)limitBand; /// @} @end diff --git a/framework/Source/CPTShadow.h b/framework/Source/CPTShadow.h index 9ccc09b80..f07db0871 100644 --- a/framework/Source/CPTShadow.h +++ b/framework/Source/CPTShadow.h @@ -4,16 +4,16 @@ @property (nonatomic, readonly) CGSize shadowOffset; @property (nonatomic, readonly) CGFloat shadowBlurRadius; -@property (nonatomic, readonly) CPTColor *shadowColor; +@property (nonatomic, readonly, nullable) CPTColor *shadowColor; /// @name Factory Methods /// @{ -+(instancetype)shadow; ++(nonnull instancetype)shadow; /// @} /// @name Drawing /// @{ --(void)setShadowInContext:(CGContextRef)context; +-(void)setShadowInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTTextLayer.h b/framework/Source/CPTTextLayer.h index 5c841a2ce..9d9c85956 100644 --- a/framework/Source/CPTTextLayer.h +++ b/framework/Source/CPTTextLayer.h @@ -7,16 +7,16 @@ extern const CGFloat kCPTTextLayerMarginWidth; ///< Margin width around the text @interface CPTTextLayer : CPTBorderedLayer -@property (readwrite, copy, nonatomic) NSString *text; -@property (readwrite, strong, nonatomic) CPTTextStyle *textStyle; -@property (readwrite, copy, nonatomic) NSAttributedString *attributedText; +@property (readwrite, copy, nonatomic, nullable) NSString *text; +@property (readwrite, strong, nonatomic, nullable) CPTTextStyle *textStyle; +@property (readwrite, copy, nonatomic, nullable) NSAttributedString *attributedText; @property (readwrite, nonatomic) CGSize maximumSize; /// @name Initialization /// @{ --(instancetype)initWithText:(NSString *)newText; --(instancetype)initWithText:(NSString *)newText style:(CPTTextStyle *)newStyle; --(instancetype)initWithAttributedText:(NSAttributedString *)newText; +-(nonnull instancetype)initWithText:(nullable NSString *)newText; +-(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle; +-(nonnull instancetype)initWithAttributedText:(nullable NSAttributedString *)newText; /// @} /// @name Layout diff --git a/framework/Source/CPTTextStyle.h b/framework/Source/CPTTextStyle.h index 42d135ee9..53e58ee93 100644 --- a/framework/Source/CPTTextStyle.h +++ b/framework/Source/CPTTextStyle.h @@ -4,15 +4,15 @@ @interface CPTTextStyle : NSObject -@property (readonly, copy, nonatomic) NSString *fontName; +@property (readonly, copy, nonatomic, nullable) NSString *fontName; @property (readonly, nonatomic) CGFloat fontSize; -@property (readonly, copy, nonatomic) CPTColor *color; +@property (readonly, copy, nonatomic, nullable) CPTColor *color; @property (readonly, nonatomic) CPTTextAlignment textAlignment; @property (readonly, assign, nonatomic) NSLineBreakMode lineBreakMode; /// @name Factory Methods /// @{ -+(instancetype)textStyle; ++(nonnull instancetype)textStyle; /// @} @end @@ -24,11 +24,11 @@ **/ @interface CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -@property (readonly, nonatomic) NSDictionary *attributes; +@property (readonly, nonatomic, nonnull) NSDictionary *attributes; /// @name Factory Methods /// @{ -+(instancetype)textStyleWithAttributes:(NSDictionary *)attributes; ++(nonnull instancetype)textStyleWithAttributes:(nullable NSDictionary *)attributes; /// @} @end @@ -42,12 +42,12 @@ /// @name Measurement /// @{ --(CGSize)sizeWithTextStyle:(CPTTextStyle *)style; +-(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style; /// @} /// @name Drawing /// @{ --(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CGContextRef)context; +-(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index 94ba86d30..cebea1dc1 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -8,9 +8,9 @@ /// @cond @interface CPTTextStyle() -@property (readwrite, copy, nonatomic) NSString *fontName; +@property (readwrite, copy, nonatomic, nullable) NSString *fontName; @property (readwrite, assign, nonatomic) CGFloat fontSize; -@property (readwrite, copy, nonatomic) CPTColor *color; +@property (readwrite, copy, nonatomic, nullable) CPTColor *color; @property (readwrite, assign, nonatomic) CPTTextAlignment textAlignment; @property (readwrite, assign, nonatomic) NSLineBreakMode lineBreakMode; diff --git a/framework/Source/CPTTheme.h b/framework/Source/CPTTheme.h index f13e9e46d..48107cbd4 100644 --- a/framework/Source/CPTTheme.h +++ b/framework/Source/CPTTheme.h @@ -1,10 +1,10 @@ /// @ingroup themeNames /// @{ -extern NSString *const kCPTDarkGradientTheme; ///< A graph theme with dark gray gradient backgrounds and light gray lines. -extern NSString *const kCPTPlainBlackTheme; ///< A graph theme with black backgrounds and white lines. -extern NSString *const kCPTPlainWhiteTheme; ///< A graph theme with white backgrounds and black lines. -extern NSString *const kCPTSlateTheme; ///< A graph theme with colors that match the default iPhone navigation bar, toolbar buttons, and table views. -extern NSString *const kCPTStocksTheme; ///< A graph theme with a gradient background and white lines. +extern NSString *__nonnull const kCPTDarkGradientTheme; ///< A graph theme with dark gray gradient backgrounds and light gray lines. +extern NSString *__nonnull const kCPTPlainBlackTheme; ///< A graph theme with black backgrounds and white lines. +extern NSString *__nonnull const kCPTPlainWhiteTheme; ///< A graph theme with white backgrounds and black lines. +extern NSString *__nonnull const kCPTSlateTheme; ///< A graph theme with colors that match the default iPhone navigation bar, toolbar buttons, and table views. +extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with a gradient background and white lines. /// @} @class CPTGraph; @@ -14,19 +14,19 @@ extern NSString *const kCPTStocksTheme; ///< A graph theme with a gradient @interface CPTTheme : NSObject -@property (nonatomic, readwrite, strong) Class graphClass; +@property (nonatomic, readwrite, strong, nullable) Class graphClass; /// @name Theme Management /// @{ -+(void)registerTheme:(Class)themeClass; -+(NSArray *)themeClasses; -+(instancetype)themeNamed:(NSString *)theme; -+(NSString *)name; ++(void)registerTheme:(nonnull Class)themeClass; ++(nullable NSArray *)themeClasses; ++(nullable instancetype)themeNamed:(nullable NSString *)theme; ++(nonnull NSString *)name; /// @} /// @name Theme Usage /// @{ --(void)applyThemeToGraph:(CPTGraph *)graph; +-(void)applyThemeToGraph:(nullable CPTGraph *)graph; /// @} @end @@ -38,11 +38,11 @@ extern NSString *const kCPTStocksTheme; ///< A graph theme with a gradient /// @name Theme Usage /// @{ --(id)newGraph; +-(nullable id)newGraph; --(void)applyThemeToBackground:(CPTGraph *)graph; --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame; --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet; +-(void)applyThemeToBackground:(nullable CPTGraph *)graph; +-(void)applyThemeToPlotArea:(nullable CPTPlotAreaFrame *)plotAreaFrame; +-(void)applyThemeToAxisSet:(nullable CPTAxisSet *)axisSet; /// @} @end diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index 25a4a8a80..ba3111103 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -108,6 +108,8 @@ +(instancetype)themeNamed:(NSString *)themeName **/ +(void)registerTheme:(Class)themeClass { + NSParameterAssert(themeClass); + @synchronized(self) { if ( !themes ) { diff --git a/framework/Source/CPTTimeFormatter.h b/framework/Source/CPTTimeFormatter.h index 9ccef384e..afb81774e 100644 --- a/framework/Source/CPTTimeFormatter.h +++ b/framework/Source/CPTTimeFormatter.h @@ -2,13 +2,13 @@ @interface CPTTimeFormatter : NSNumberFormatter -@property (nonatomic, readwrite, strong) NSDateFormatter *dateFormatter; -@property (nonatomic, readwrite, copy) NSDate *referenceDate; +@property (nonatomic, readwrite, strong, nullable) NSDateFormatter *dateFormatter; +@property (nonatomic, readwrite, copy, nullable) NSDate *referenceDate; /// @name Initialization /// @{ --(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTTradingRangePlot.h b/framework/Source/CPTTradingRangePlot.h index 5bd929bff..0c2c91de1 100644 --- a/framework/Source/CPTTradingRangePlot.h +++ b/framework/Source/CPTTradingRangePlot.h @@ -9,16 +9,16 @@ /// @ingroup plotBindingsTradingRangePlot /// @{ -extern NSString *const CPTTradingRangePlotBindingXValues; -extern NSString *const CPTTradingRangePlotBindingOpenValues; -extern NSString *const CPTTradingRangePlotBindingHighValues; -extern NSString *const CPTTradingRangePlotBindingLowValues; -extern NSString *const CPTTradingRangePlotBindingCloseValues; -extern NSString *const CPTTradingRangePlotBindingIncreaseFills; -extern NSString *const CPTTradingRangePlotBindingDecreaseFills; -extern NSString *const CPTTradingRangePlotBindingLineStyles; -extern NSString *const CPTTradingRangePlotBindingIncreaseLineStyles; -extern NSString *const CPTTradingRangePlotBindingDecreaseLineStyles; +extern NSString *__nonnull const CPTTradingRangePlotBindingXValues; +extern NSString *__nonnull const CPTTradingRangePlotBindingOpenValues; +extern NSString *__nonnull const CPTTradingRangePlotBindingHighValues; +extern NSString *__nonnull const CPTTradingRangePlotBindingLowValues; +extern NSString *__nonnull const CPTTradingRangePlotBindingCloseValues; +extern NSString *__nonnull const CPTTradingRangePlotBindingIncreaseFills; +extern NSString *__nonnull const CPTTradingRangePlotBindingDecreaseFills; +extern NSString *__nonnull const CPTTradingRangePlotBindingLineStyles; +extern NSString *__nonnull const CPTTradingRangePlotBindingIncreaseLineStyles; +extern NSString *__nonnull const CPTTradingRangePlotBindingDecreaseLineStyles; /// @} /** @@ -56,7 +56,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of fills. **/ --(NSArray *)increaseFillsForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)increaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close >= open for the given plot. * This method will not be called if @@ -67,13 +67,13 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @return The bar fill for the bar with the given index. If the data source returns @nil, the default increase fill is used. * If the data source returns an NSNull object, no fill is drawn. **/ --(CPTFill *)increaseFillForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTFill *)increaseFillForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; /** @brief @optional Gets a range of fills used with a candlestick plot when close < open for the given plot. * @param plot The trading range plot. * @param indexRange The range of the data indexes of interest. **/ --(NSArray *)decreaseFillsForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)decreaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close < open for the given plot. * This method will not be called if @@ -84,7 +84,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @return The bar fill for the bar with the given index. If the data source returns @nil, the default decrease fill is used. * If the data source returns an NSNull object, no fill is drawn. **/ --(CPTFill *)decreaseFillForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTFill *)decreaseFillForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; /// @} @@ -96,7 +96,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(NSArray *)lineStylesForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)lineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to draw candlestick or OHLC symbols for the given trading range plot. * This method will not be called if @@ -107,14 +107,14 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @return The line style for the symbol with the given index. If the data source returns @nil, the default line style is used. * If the data source returns an NSNull object, no line is drawn. **/ --(CPTLineStyle *)lineStyleForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)lineStyleForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; /** @brief @optional Gets a range of line styles used to outline candlestick symbols when close >= open for the given trading range plot. * @param plot The trading range plot. * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(NSArray *)increaseLineStylesForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)increaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close >= open for the given trading range plot. * This method will not be called if @@ -125,14 +125,14 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @return The line line style for the symbol with the given index. If the data source returns @nil, the default increase line style is used. * If the data source returns an NSNull object, no line is drawn. **/ --(CPTLineStyle *)increaseLineStyleForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)increaseLineStyleForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; /** @brief @optional Gets a range of line styles used to outline candlestick symbols when close < open for the given trading range plot. * @param plot The trading range plot. * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(NSArray *)decreaseLineStylesForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)decreaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close < open for the given trading range plot. * This method will not be called if @@ -143,7 +143,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @return The line line style for the symbol with the given index. If the data source returns @nil, the default decrease line style is used. * If the data source returns an NSNull object, no line is drawn. **/ --(CPTLineStyle *)decreaseLineStyleForTradingRangePlot:(CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)decreaseLineStyleForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; /// @} @@ -169,7 +169,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was both pressed and released. @endif @@ -180,7 +180,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -190,7 +190,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was pressed. @endif @@ -201,7 +201,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barTouchDownAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -211,7 +211,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if MacOnly clicked bar. @endif * @if iOSOnly touched bar. @endif **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx; /** @brief @optional Informs the delegate that a bar * @if MacOnly was released. @endif @@ -222,7 +222,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @if iOSOnly touched bar. @endif * @param event The event that triggered the selection. **/ --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event; +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barTouchUpAtRecordIndex:(NSUInteger)idx withEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -243,11 +243,11 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { /// @name Drawing /// @{ -@property (nonatomic, readwrite, copy) CPTLineStyle *lineStyle; -@property (nonatomic, readwrite, copy) CPTLineStyle *increaseLineStyle; -@property (nonatomic, readwrite, copy) CPTLineStyle *decreaseLineStyle; -@property (nonatomic, readwrite, copy) CPTFill *increaseFill; -@property (nonatomic, readwrite, copy) CPTFill *decreaseFill; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *lineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *increaseLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyle *decreaseLineStyle; +@property (nonatomic, readwrite, copy, nullable) CPTFill *increaseFill; +@property (nonatomic, readwrite, copy, nullable) CPTFill *decreaseFill; /// @} /// @name Bar Style diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index b44ceae3b..cefd8b2e7 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -784,7 +784,10 @@ -(void)drawCandleStickInContext:(CGContextRef)context } else { theBorderLineStyle = [self lineStyleForIndex:idx]; - currentBarFill = [CPTFill fillWithColor:theBorderLineStyle.lineColor]; + CPTColor *lineColor = theBorderLineStyle.lineColor; + if ( lineColor ) { + currentBarFill = [CPTFill fillWithColor:lineColor]; + } } } diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index 90c214472..b138fb60f 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -2,6 +2,8 @@ /// @file +#pragma clang assume_nonnull begin + @class CPTLineStyle; #if __cplusplus @@ -150,3 +152,5 @@ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2 #if __cplusplus } #endif + +#pragma clang assume_nonnull end diff --git a/framework/Source/CPTXYAxis.h b/framework/Source/CPTXYAxis.h index 1dd21ea27..36cf150d2 100644 --- a/framework/Source/CPTXYAxis.h +++ b/framework/Source/CPTXYAxis.h @@ -6,8 +6,8 @@ /// @name Positioning /// @{ -@property (nonatomic, readwrite, strong) NSNumber *orthogonalPosition; -@property (nonatomic, readwrite, strong) CPTConstraints *axisConstraints; +@property (nonatomic, readwrite, strong, nullable) NSNumber *orthogonalPosition; +@property (nonatomic, readwrite, strong, nullable) CPTConstraints *axisConstraints; /// @} @end diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index c304c3f7f..9c3429a5c 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -16,10 +16,10 @@ /// @cond @interface CPTXYAxis() --(void)drawTicksInContext:(CGContextRef)context atLocations:(NSSet *)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major; +-(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable NSSet *)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major; --(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat *)upper; --(CGPoint)viewPointForOrthogonalCoordinate:(NSNumber *)orthogonalCoord axisCoordinate:(NSNumber *)coordinateValue; +-(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper; +-(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue; @end diff --git a/framework/Source/CPTXYAxisSet.h b/framework/Source/CPTXYAxisSet.h index cc760ba8d..ef7bc8d69 100644 --- a/framework/Source/CPTXYAxisSet.h +++ b/framework/Source/CPTXYAxisSet.h @@ -4,7 +4,7 @@ @interface CPTXYAxisSet : CPTAxisSet -@property (nonatomic, readonly) CPTXYAxis *xAxis; -@property (nonatomic, readonly) CPTXYAxis *yAxis; +@property (nonatomic, readonly, nullable) CPTXYAxis *xAxis; +@property (nonatomic, readonly, nullable) CPTXYAxis *yAxis; @end diff --git a/framework/Source/CPTXYGraph.h b/framework/Source/CPTXYGraph.h index 22d883a32..90bca7639 100644 --- a/framework/Source/CPTXYGraph.h +++ b/framework/Source/CPTXYGraph.h @@ -5,7 +5,7 @@ /// @name Initialization /// @{ --(instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType; +-(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType; /// @} @end diff --git a/framework/Source/CPTXYPlotSpace.h b/framework/Source/CPTXYPlotSpace.h index 6649e1738..ed084f42a 100644 --- a/framework/Source/CPTXYPlotSpace.h +++ b/framework/Source/CPTXYPlotSpace.h @@ -6,10 +6,10 @@ @interface CPTXYPlotSpace : CPTPlotSpace -@property (nonatomic, readwrite, copy) CPTPlotRange *xRange; -@property (nonatomic, readwrite, copy) CPTPlotRange *yRange; -@property (nonatomic, readwrite, copy) CPTPlotRange *globalXRange; -@property (nonatomic, readwrite, copy) CPTPlotRange *globalYRange; +@property (nonatomic, readwrite, copy, nonnull) CPTPlotRange *xRange; +@property (nonatomic, readwrite, copy, nonnull) CPTPlotRange *yRange; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *globalXRange; +@property (nonatomic, readwrite, copy, nullable) CPTPlotRange *globalYRange; @property (nonatomic, readwrite, assign) CPTScaleType xScaleType; @property (nonatomic, readwrite, assign) CPTScaleType yScaleType; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 6d9eb8713..cced59454 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -18,21 +18,21 @@ /// @cond @interface CPTXYPlotSpace() --(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord; --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; --(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength; --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; --(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPTPlotRange *)globalRange; +-(CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange; -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shift momentumTime:(CGFloat)momentumTime speed:(CGFloat)speed acceleration:(CGFloat)acceleration; --(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement; +-(CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement; --(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate)coordinate direction:(BOOL)direction; +-(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTCoordinate)coordinate direction:(BOOL)direction; CGFloat firstPositiveRoot(CGFloat a, CGFloat b, CGFloat c); @@ -41,7 +41,7 @@ -(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate @property (nonatomic, readwrite) CGPoint lastDisplacement; @property (nonatomic, readwrite) NSTimeInterval lastDragTime; @property (nonatomic, readwrite) NSTimeInterval lastDeltaTime; -@property (nonatomic, readwrite, retain) NSMutableArray *animations; +@property (nonatomic, readwrite, retain, nonnull) NSMutableArray *animations; @end diff --git a/framework/Source/NSCoderExtensions.h b/framework/Source/NSCoderExtensions.h index eab4af3f7..896d3c0c9 100644 --- a/framework/Source/NSCoderExtensions.h +++ b/framework/Source/NSCoderExtensions.h @@ -5,30 +5,30 @@ /// @name Encoding Data /// @{ --(void)encodeCGFloat:(CGFloat)number forKey:(NSString *)key; --(void)encodeCPTPoint:(CGPoint)point forKey:(NSString *)key; --(void)encodeCPTSize:(CGSize)size forKey:(NSString *)key; --(void)encodeCPTRect:(CGRect)rect forKey:(NSString *)key; +-(void)encodeCGFloat:(CGFloat)number forKey:(nonnull NSString *)key; +-(void)encodeCPTPoint:(CGPoint)point forKey:(nonnull NSString *)key; +-(void)encodeCPTSize:(CGSize)size forKey:(nonnull NSString *)key; +-(void)encodeCPTRect:(CGRect)rect forKey:(nonnull NSString *)key; --(void)encodeCGColorSpace:(CGColorSpaceRef)colorSpace forKey:(NSString *)key; --(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key; --(void)encodeCGImage:(CGImageRef)image forKey:(NSString *)key; +-(void)encodeCGColorSpace:(nullable CGColorSpaceRef)colorSpace forKey:(nonnull NSString *)key; +-(void)encodeCGPath:(nullable CGPathRef)path forKey:(nonnull NSString *)key; +-(void)encodeCGImage:(nullable CGImageRef)image forKey:(nonnull NSString *)key; --(void)encodeDecimal:(NSDecimal)number forKey:(NSString *)key; +-(void)encodeDecimal:(NSDecimal)number forKey:(nonnull NSString *)key; /// @} /// @name Decoding Data /// @{ --(CGFloat)decodeCGFloatForKey:(NSString *)key; --(CGPoint)decodeCPTPointForKey:(NSString *)key; --(CGSize)decodeCPTSizeForKey:(NSString *)key; --(CGRect)decodeCPTRectForKey:(NSString *)key; +-(CGFloat)decodeCGFloatForKey:(nonnull NSString *)key; +-(CGPoint)decodeCPTPointForKey:(nonnull NSString *)key; +-(CGSize)decodeCPTSizeForKey:(nonnull NSString *)key; +-(CGRect)decodeCPTRectForKey:(nonnull NSString *)key; --(CGColorSpaceRef)newCGColorSpaceDecodeForKey:(NSString *)key; --(CGPathRef)newCGPathDecodeForKey:(NSString *)key; --(CGImageRef)newCGImageDecodeForKey:(NSString *)key; +-(nullable CGColorSpaceRef)newCGColorSpaceDecodeForKey:(nonnull NSString *)key; +-(nullable CGPathRef)newCGPathDecodeForKey:(nonnull NSString *)key; +-(nullable CGImageRef)newCGImageDecodeForKey:(nonnull NSString *)key; --(NSDecimal)decodeDecimalForKey:(NSString *)key; +-(NSDecimal)decodeDecimalForKey:(nonnull NSString *)key; /// @} @end diff --git a/framework/Source/NSNumberExtensions.h b/framework/Source/NSNumberExtensions.h index bd1ad6b6b..06d0bb9e4 100644 --- a/framework/Source/NSNumberExtensions.h +++ b/framework/Source/NSNumberExtensions.h @@ -3,11 +3,11 @@ **/ @interface NSNumber(CPTExtensions) -+(instancetype)numberWithCGFloat:(CGFloat)number; ++(nonnull instancetype)numberWithCGFloat:(CGFloat)number; -(CGFloat)cgFloatValue; --(instancetype)initWithCGFloat:(CGFloat)number; +-(nonnull instancetype)initWithCGFloat:(CGFloat)number; --(NSDecimalNumber *)decimalNumber; +-(nonnull NSDecimalNumber *)decimalNumber; @end diff --git a/framework/Source/_CPTBorderLayer.h b/framework/Source/_CPTBorderLayer.h index 161fb09f0..120ab625c 100644 --- a/framework/Source/_CPTBorderLayer.h +++ b/framework/Source/_CPTBorderLayer.h @@ -4,6 +4,6 @@ @interface CPTBorderLayer : CPTLayer -@property (nonatomic, readwrite, strong) CPTBorderedLayer *maskedLayer; +@property (nonatomic, readwrite, strong, nullable) CPTBorderedLayer *maskedLayer; @end diff --git a/framework/Source/_CPTConstraintsFixed.h b/framework/Source/_CPTConstraintsFixed.h index 1f1439e85..a926cd2e5 100644 --- a/framework/Source/_CPTConstraintsFixed.h +++ b/framework/Source/_CPTConstraintsFixed.h @@ -4,14 +4,14 @@ /// @name Initialization /// @{ --(instancetype)initWithLowerOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; --(instancetype)initWithUpperOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLowerOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithUpperOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Comparison /// @{ --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint; +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint; /// @} /// @name Position diff --git a/framework/Source/_CPTConstraintsRelative.h b/framework/Source/_CPTConstraintsRelative.h index 3c1858819..9980999ca 100644 --- a/framework/Source/_CPTConstraintsRelative.h +++ b/framework/Source/_CPTConstraintsRelative.h @@ -4,13 +4,13 @@ /// @name Initialization /// @{ --(instancetype)initWithRelativeOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Comparison /// @{ --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint; +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint; /// @} /// @name Position diff --git a/framework/Source/_CPTFillColor.h b/framework/Source/_CPTFillColor.h index c2cdc053c..00f7a66f5 100644 --- a/framework/Source/_CPTFillColor.h +++ b/framework/Source/_CPTFillColor.h @@ -4,14 +4,14 @@ /// @name Initialization /// @{ --(instancetype)initWithColor:(CPTColor *)aColor NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithColor:(nullable CPTColor *)aColor NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing /// @{ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillPathInContext:(CGContextRef)context; +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillPathInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/_CPTFillColor.m b/framework/Source/_CPTFillColor.m index 576fb50f4..aa63358e5 100644 --- a/framework/Source/_CPTFillColor.m +++ b/framework/Source/_CPTFillColor.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillColor() -@property (nonatomic, readwrite, copy) CPTColor *fillColor; +@property (nonatomic, readwrite, copy, nullable) CPTColor *fillColor; @end diff --git a/framework/Source/_CPTFillGradient.h b/framework/Source/_CPTFillGradient.h index b13e04200..a7bb7e610 100644 --- a/framework/Source/_CPTFillGradient.h +++ b/framework/Source/_CPTFillGradient.h @@ -6,14 +6,14 @@ /// @name Initialization /// @{ --(instancetype)initWithGradient:(CPTGradient *)aGradient NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithGradient:(nullable CPTGradient *)aGradient NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing /// @{ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillPathInContext:(CGContextRef)context; +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillPathInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/_CPTFillGradient.m b/framework/Source/_CPTFillGradient.m index 7cfbc4b1e..98b44040b 100644 --- a/framework/Source/_CPTFillGradient.m +++ b/framework/Source/_CPTFillGradient.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillGradient() -@property (nonatomic, readwrite, copy) CPTGradient *fillGradient; +@property (nonatomic, readwrite, copy, nullable) CPTGradient *fillGradient; @end diff --git a/framework/Source/_CPTFillImage.h b/framework/Source/_CPTFillImage.h index f1d1f8ce9..9efe99470 100644 --- a/framework/Source/_CPTFillImage.h +++ b/framework/Source/_CPTFillImage.h @@ -6,14 +6,14 @@ /// @name Initialization /// @{ --(instancetype)initWithImage:(CPTImage *)anImage NS_DESIGNATED_INITIALIZER; --(instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithImage:(nullable CPTImage *)anImage NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing /// @{ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context; --(void)fillPathInContext:(CGContextRef)context; +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context; +-(void)fillPathInContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/Source/_CPTFillImage.m b/framework/Source/_CPTFillImage.m index 697542f2e..16a6ade4e 100644 --- a/framework/Source/_CPTFillImage.m +++ b/framework/Source/_CPTFillImage.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillImage() -@property (nonatomic, readwrite, copy) CPTImage *fillImage; +@property (nonatomic, readwrite, copy, nullable) CPTImage *fillImage; @end diff --git a/framework/iPhoneOnly/CPTGraphHostingView.h b/framework/iPhoneOnly/CPTGraphHostingView.h index 9d22f0093..b98c5784e 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.h +++ b/framework/iPhoneOnly/CPTGraphHostingView.h @@ -4,7 +4,7 @@ @interface CPTGraphHostingView : UIView -@property (nonatomic, readwrite, strong) CPTGraph *hostedGraph; +@property (nonatomic, readwrite, strong, nullable) CPTGraph *hostedGraph; @property (nonatomic, readwrite, assign) BOOL collapsesLayers; @property (nonatomic, readwrite, assign) BOOL allowPinchScaling; diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.h b/framework/iPhoneOnly/CPTPlatformSpecificCategories.h index b67d0f798..06cd3ec67 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.h @@ -9,7 +9,7 @@ **/ @interface CPTColor(CPTPlatformSpecificColorExtensions) -@property (nonatomic, readonly) UIColor *uiColor; +@property (nonatomic, readonly, nonnull) UIColor *uiColor; @end @@ -22,7 +22,7 @@ /// @name Images /// @{ --(CPTNativeImage *)imageOfLayer; +-(nullable CPTNativeImage *)imageOfLayer; /// @} @end @@ -34,10 +34,10 @@ **/ @interface NSNumber(CPTPlatformSpecificNumberExtensions) --(BOOL)isLessThan:(NSNumber *)other; --(BOOL)isLessThanOrEqualTo:(NSNumber *)other; --(BOOL)isGreaterThan:(NSNumber *)other; --(BOOL)isGreaterThanOrEqualTo:(NSNumber *)other; +-(BOOL)isLessThan:(nonnull NSNumber *)other; +-(BOOL)isLessThanOrEqualTo:(nonnull NSNumber *)other; +-(BOOL)isGreaterThan:(nonnull NSNumber *)other; +-(BOOL)isGreaterThanOrEqualTo:(nonnull NSNumber *)other; @end @@ -50,7 +50,7 @@ /// @name Drawing /// @{ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context; +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} @end diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h index caa2c3159..39b1be19c 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h @@ -6,14 +6,14 @@ extern "C" { /// @name Graphics Context Save Stack /// @{ -void CPTPushCGContext(CGContextRef context); +void CPTPushCGContext(__nonnull CGContextRef context); void CPTPopCGContext(void); /// @} /// @name Graphics Context /// @{ -CGContextRef CPTGetCurrentContext(void); +__nonnull CGContextRef CPTGetCurrentContext(void); /// @} From ef2228a081dac5e082a640e949026e5fed48bcdd Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 18 Jun 2015 07:32:05 -0400 Subject: [PATCH 046/429] More fixes for Xcode 7. --- .gitignore | 1 + QCPlugin/CorePlotQCPlugin.m | 3 +- .../project.pbxproj | 5 +- QCPlugin/Info.plist | 2 +- .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 14 +- examples/AAPLot/APYahooDataPuller.m | 23 +- examples/AAPLot/Classes/MainViewController.m | 16 +- examples/AAPLot/Info.plist | 2 +- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 9 +- .../CPTTestApp_iPad-Info.plist | 2 +- .../project.pbxproj | 2 + examples/CPTTestApp-iPhone/Info.plist | 2 +- .../CPTTestApp.xcodeproj/project.pbxproj | 2 + examples/CPTTestApp/Info.plist | 2 +- examples/CPTTestApp/Source/Controller.m | 29 +- examples/CPTTestApp/Source/main.m | 4 +- .../CorePlotGallery/Plot_Gallery-Info.plist | 2 +- .../Plot_Gallery_Mac-Info.plist | 2 +- .../project.pbxproj | 5 +- .../project.pbxproj | 20 +- .../src/ios/DetailViewController.m | 4 +- examples/CorePlotGallery/src/mac/main.m | 4 +- .../CorePlotGallery/src/plots/CompositePlot.m | 6 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +- .../DatePlot.xcodeproj/project.pbxproj | 2 + examples/DatePlot/Info.plist | 2 +- examples/DatePlot/Source/DateController.swift | 2 +- examples/DropPlot/CPTPlotDocument.m | 14 +- .../DropPlot.xcodeproj/project.pbxproj | 2 + examples/DropPlot/Info.plist | 2 +- examples/DropPlot/main.m | 4 +- examples/MinorTickLabels/Info.plist | 2 +- examples/MinorTickLabels/Source/main.m | 4 +- .../project.pbxproj | 2 + examples/RangePlot/Info.plist | 2 +- .../RangePlot.xcodeproj/project.pbxproj | 2 + examples/RangePlot/Source/main.m | 4 +- examples/StockPlot/StockPlot-Info.plist | 2 +- .../StockPlot.xcodeproj/project.pbxproj | 16 +- framework/CorePlot-CocoaTouch-Info.plist | 2 +- .../project.pbxproj | 3 +- framework/CorePlot-Info.plist | 2 +- framework/CorePlotTests-Info.plist | 2 +- framework/CorePlotWarnings.xcconfig | 2 +- framework/MacOnly/CPTGraphHostingView.m | 26 +- .../MacOnly/CPTPlatformSpecificFunctions.m | 4 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 23 +- framework/Source/CPTAnimationOperation.h | 2 +- framework/Source/CPTAnimationOperation.m | 2 +- framework/Source/CPTAnnotation.h | 2 +- framework/Source/CPTAnnotation.m | 6 +- framework/Source/CPTAnnotationHostLayer.m | 8 +- framework/Source/CPTAxis.h | 6 +- framework/Source/CPTAxis.m | 42 ++- framework/Source/CPTAxisLabel.m | 18 +- framework/Source/CPTAxisTitle.m | 10 +- framework/Source/CPTCalendarFormatter.m | 2 +- framework/Source/CPTColor.m | 9 +- framework/Source/CPTColorSpace.m | 17 + framework/Source/CPTDefinitions.h | 8 +- framework/Source/CPTFunctionDataSource.m | 2 +- framework/Source/CPTGraph.h | 2 +- framework/Source/CPTGraph.m | 25 +- framework/Source/CPTGridLineGroup.h | 2 +- framework/Source/CPTGridLineGroup.m | 2 +- framework/Source/CPTGridLines.h | 2 +- framework/Source/CPTGridLines.m | 2 +- framework/Source/CPTImage.m | 2 +- framework/Source/CPTLayer.h | 2 +- framework/Source/CPTLayer.m | 4 +- framework/Source/CPTLayerAnnotation.h | 2 +- framework/Source/CPTLayerAnnotation.m | 4 +- framework/Source/CPTLegend.m | 4 +- framework/Source/CPTLegendEntry.h | 2 +- framework/Source/CPTLegendEntry.m | 2 +- framework/Source/CPTLimitBand.m | 9 + framework/Source/CPTMutableNumericData.h | 6 + framework/Source/CPTMutableNumericData.m | 53 +++ framework/Source/CPTMutableNumericDataTests.m | 25 +- .../Source/CPTNumericData+TypeConversion.m | 312 +++++++++--------- ...TNumericData+TypeConversions_Generation.py | 10 +- framework/Source/CPTNumericData.h | 4 +- framework/Source/CPTNumericData.m | 44 ++- framework/Source/CPTNumericDataTests.m | 38 ++- framework/Source/CPTNumericDataType.m | 10 + framework/Source/CPTPathExtensions.m | 2 + framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 174 +++++----- framework/Source/CPTPlotArea.m | 34 +- framework/Source/CPTPlotAreaFrame.m | 8 +- framework/Source/CPTPlotSpace.h | 4 +- framework/Source/CPTPlotSpace.m | 4 +- framework/Source/CPTPlotSpaceAnnotation.m | 8 +- framework/Source/CPTPlotSymbol.m | 3 +- framework/Source/CPTScatterPlot.m | 16 +- framework/Source/CPTTheme.m | 11 +- framework/Source/CPTTimeFormatter.m | 7 +- framework/Source/CPTXYAxis.m | 8 +- framework/Source/CPTXYPlotSpace.m | 10 +- framework/iPhoneOnly/CPTGraphHostingView.m | 10 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 21 +- 101 files changed, 844 insertions(+), 471 deletions(-) diff --git a/.gitignore b/.gitignore index a6622068d..000599f11 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ build/* **.xccheckout **/xcuserdata/* **.xcbaseline +**.xcscmblueprint # AppCode settings **/.idea/* diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index 400a99b41..8484b9cd9 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -538,7 +538,8 @@ -(CGImageRef)newAreaFillImage:(NSUInteger)index CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); [img lockBufferRepresentationWithPixelFormat:pixelFormat colorSpace:rgbColorSpace forBounds:[img imageBounds]]; CGColorSpaceRelease(rgbColorSpace); - void *baseAddress = (void *)[img bufferBaseAddress]; + + const void *baseAddress = [img bufferBaseAddress]; NSUInteger pixelsWide = [img bufferPixelsWide]; NSUInteger pixelsHigh = [img bufferPixelsHigh]; NSUInteger bitsPerComponent = 8; diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 1ea1190f0..46a5b4825 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -246,7 +246,7 @@ 089C1669FE841209C02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0600; + LastUpgradeCheck = 0700; }; buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "CorePlotQCPlugin" */; compatibilityVersion = "Xcode 3.2"; @@ -402,6 +402,7 @@ INSTALL_PATH = "$(HOME)/Library/Graphics/Quartz Composer Plug-Ins"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CorePlotQCPlugin; SDKROOT = macosx; WRAPPER_EXTENSION = plugin; @@ -424,6 +425,7 @@ INSTALL_PATH = "$(HOME)/Library/Graphics/Quartz Composer Plug-Ins"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CorePlotQCPlugin; SDKROOT = macosx; WRAPPER_EXTENSION = plugin; @@ -436,6 +438,7 @@ baseConfigurationReference = C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; MACOSX_DEPLOYMENT_TARGET = 10.8; diff --git a/QCPlugin/Info.plist b/QCPlugin/Info.plist index 9afb37c27..27bfe3460 100644 --- a/QCPlugin/Info.plist +++ b/QCPlugin/Info.plist @@ -9,7 +9,7 @@ CFBundleGetInfoString CorePlotQCPlugin version 1.0, Copyright YourCompany. CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index cd9c39f8f..16f135539 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -275,7 +275,12 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; + TargetAttributes = { + 1D6058900D05DD3D006BFB54 = { + DevelopmentTeam = 28ZA45DE7D; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AAPLot" */; compatibilityVersion = "Xcode 3.2"; @@ -391,6 +396,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -402,6 +409,7 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = AAPLot; }; name = Debug; @@ -413,6 +421,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = AAPLot_Prefix.pch; @@ -422,6 +432,7 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = AAPLot; }; name = Release; @@ -431,6 +442,7 @@ baseConfigurationReference = C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 1d7c767dd..94bbd002c 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -290,9 +290,26 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection //see if we need to write to file NSDictionary *dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; - if ( ![[self symbol] isEqualToString:dictionaryForSymbol[@"symbol"]] || - ([[self startDate] compare:dictionaryForSymbol[@"startDate"]] != NSOrderedSame) || - ([[self endDate] compare:dictionaryForSymbol[@"endDate"]] != NSOrderedSame) ) { + + BOOL sameSymbol = NO; + NSString *dictSymbol = dictionaryForSymbol[@"symbol"]; + if ( dictSymbol ) { + sameSymbol = [[self symbol] isEqualToString:dictSymbol]; + } + + BOOL sameStart = NO; + NSDate *dictStart = dictionaryForSymbol[@"startDate"]; + if ( dictStart ) { + sameStart = ([[self startDate] compare:dictStart] != NSOrderedSame); + } + + BOOL sameEnd = NO; + NSDate *dictEnd = dictionaryForSymbol[@"endDate"]; + if ( dictEnd ) { + sameEnd = ([[self startDate] compare:dictEnd] != NSOrderedSame); + } + + if ( !sameSymbol || !sameStart || !sameEnd ) { [self writeToFile:[self pathForSymbol:self.symbol] atomically:YES]; } else { diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index decf248d6..dc286e210 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -648,13 +648,15 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp [[CPTAnimation sharedInstance] removeAnimationOperation:animationOperation]; } - animationOperation = [CPTAnimation animate:volumePlotSpace - property:@"yRange" - fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] - lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] - toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation - length:volumeLengthDisplayLocation] - duration:2.5]; + if ( volumeLowDisplayLocation && volumeLengthDisplayLocation ) { + animationOperation = [CPTAnimation animate:volumePlotSpace + property:@"yRange" + fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] + lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] + toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation + length:volumeLengthDisplayLocation] + duration:2.5]; + } axisSet.xAxis.orthogonalPosition = low; axisSet.yAxis.majorIntervalLength = @50.0; diff --git a/examples/AAPLot/Info.plist b/examples/AAPLot/Info.plist index d9611013d..4081ec7d1 100644 --- a/examples/AAPLot/Info.plist +++ b/examples/AAPLot/Info.plist @@ -11,7 +11,7 @@ CFBundleIcons~ipad CFBundleIdentifier - org.CorePlot.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index 4fcc887f7..4a581a7db 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -220,7 +220,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPad" */; compatibilityVersion = "Xcode 3.2"; @@ -329,6 +329,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -336,6 +338,7 @@ GCC_PREFIX_HEADER = CPTTestApp_iPad_Prefix.pch; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "CPTTestApp_iPad-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.CPTTestAppiPad; PRODUCT_NAME = "CPTTestApp-iPad"; }; name = Debug; @@ -347,11 +350,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CPTTestApp_iPad_Prefix.pch; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "CPTTestApp_iPad-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.CPTTestAppiPad; PRODUCT_NAME = "CPTTestApp-iPad"; VALIDATE_PRODUCT = YES; }; @@ -362,6 +368,7 @@ baseConfigurationReference = C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; diff --git a/examples/CPTTestApp-iPad/CPTTestApp_iPad-Info.plist b/examples/CPTTestApp-iPad/CPTTestApp_iPad-Info.plist index 2ec26702c..f0cf9adbd 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp_iPad-Info.plist +++ b/examples/CPTTestApp-iPad/CPTTestApp_iPad-Info.plist @@ -11,7 +11,7 @@ CFBundleIcons CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index cdd0017ca..560a5af45 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -358,6 +358,7 @@ "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.CPTTestAppiPhone; PRODUCT_NAME = "CPTTestApp-iPhone"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; @@ -383,6 +384,7 @@ "-all_load", "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.CPTTestAppiPhone; PRODUCT_NAME = "CPTTestApp-iPhone"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; diff --git a/examples/CPTTestApp-iPhone/Info.plist b/examples/CPTTestApp-iPhone/Info.plist index 59dedee60..5e25306a4 100644 --- a/examples/CPTTestApp-iPhone/Info.plist +++ b/examples/CPTTestApp-iPhone/Info.plist @@ -11,7 +11,7 @@ CFBundleIcons~ipad CFBundleIdentifier - org.CorePlot.CPTTestApp + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index b41d83569..442d60b26 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -360,6 +360,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CPTTestApp; }; name = Debug; @@ -379,6 +380,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CPTTestApp; }; name = Release; diff --git a/examples/CPTTestApp/Info.plist b/examples/CPTTestApp/Info.plist index 8bbd4d343..715a157f6 100644 --- a/examples/CPTTestApp/Info.plist +++ b/examples/CPTTestApp/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 9b2e9ad5f..1803a9a72 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -565,7 +565,11 @@ -(IBAction)exportToPDF:(id)sender if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - [dataForPDF writeToURL:[pdfSavingDialog URL] atomically:NO]; + + NSURL *url = [pdfSavingDialog URL]; + if ( url ) { + [dataForPDF writeToURL:url atomically:NO]; + } } } @@ -579,8 +583,12 @@ -(IBAction)exportToPNG:(id)sender NSImage *image = [self.graph imageOfLayer]; NSData *tiffData = [image TIFFRepresentation]; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:nil]; - [pngData writeToURL:[pngSavingDialog URL] atomically:NO]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + + NSURL *url = [pngSavingDialog URL]; + if ( url ) { + [pngData writeToURL:url atomically:NO]; + } } } @@ -598,11 +606,14 @@ -(IBAction)printDocument:(id)sender self.hostView.printRect = printRect; - NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:self.hostView printInfo:printInfo]; - [printOperation runOperationModalForWindow:self.hostView.window - delegate:self - didRunSelector:@selector(printOperationDidRun:success:contextInfo:) - contextInfo:NULL]; + NSWindow *window = self.hostView.window; + if ( window ) { + NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:self.hostView printInfo:printInfo]; + [printOperation runOperationModalForWindow:window + delegate:self + didRunSelector:@selector(printOperationDidRun:success:contextInfo:) + contextInfo:NULL]; + } } -(void)printOperationDidRun:(NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(void *)contextInfo @@ -715,7 +726,7 @@ -(IBAction)selectionDemo:(id)sender -(void)rotateObjectUsingTransform:(CATransform3D)rotationTransform { [CATransaction begin]; - [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; + [CATransaction setValue:@(YES) forKey:kCATransactionDisableActions]; self.graph.superlayer.sublayerTransform = rotationTransform; diff --git a/examples/CPTTestApp/Source/main.m b/examples/CPTTestApp/Source/main.m index f4cda46b8..e8a345f07 100644 --- a/examples/CPTTestApp/Source/main.m +++ b/examples/CPTTestApp/Source/main.m @@ -6,7 +6,7 @@ // Copyright __MyCompanyName__ 2009. All rights reserved. // -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, argv); } diff --git a/examples/CorePlotGallery/Plot_Gallery-Info.plist b/examples/CorePlotGallery/Plot_Gallery-Info.plist index a5332bddc..8c20e1104 100644 --- a/examples/CorePlotGallery/Plot_Gallery-Info.plist +++ b/examples/CorePlotGallery/Plot_Gallery-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac-Info.plist b/examples/CorePlotGallery/Plot_Gallery_Mac-Info.plist index 028dea914..b0cb1bbde 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac-Info.plist +++ b/examples/CorePlotGallery/Plot_Gallery_Mac-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index 06c37effd..02007fdea 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -393,7 +393,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_Mac" */; compatibilityVersion = "Xcode 3.2"; @@ -569,6 +569,7 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; PRODUCT_NAME = "Plot Gallery"; RUN_CLANG_STATIC_ANALYZER = YES; VALID_ARCHS = "i386 x86_64"; @@ -595,6 +596,7 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; PRODUCT_NAME = "Plot Gallery"; RUN_CLANG_STATIC_ANALYZER = YES; VALID_ARCHS = "i386 x86_64"; @@ -605,6 +607,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index 97c433cd2..8e9ffd732 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -344,7 +344,12 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; + TargetAttributes = { + 1D6058900D05DD3D006BFB54 = { + DevelopmentTeam = 28ZA45DE7D; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_iOS" */; compatibilityVersion = "Xcode 3.2"; @@ -478,6 +483,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -489,7 +496,9 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; PRODUCT_NAME = "Plot Gallery"; + PROVISIONING_PROFILE = ""; SYMROOT = "$(SRCROOT)/../../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -502,6 +511,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; @@ -511,7 +522,9 @@ "-ObjC", "-all_load", ); + PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; PRODUCT_NAME = "Plot Gallery"; + PROVISIONING_PROFILE = ""; SYMROOT = "$(SRCROOT)/../../build"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -522,7 +535,8 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -537,7 +551,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + CODE_SIGN_IDENTITY = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index cbc1adadf..f74f3afc8 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -12,7 +12,7 @@ @interface DetailViewController() -(CPTTheme *)currentTheme; -@property (nonatomic, readwrite, weak) UIPopoverController *themePopoverController; +@property (nonatomic, readwrite) UIPopoverController *themePopoverController; -(void)setupView; -(void)themeChanged:(NSNotification *)notification; @@ -136,7 +136,7 @@ -(void)themeChanged:(NSNotification *)notification -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [segue.identifier isEqualToString:@"selectTheme"] ) { - self.themePopoverController = segue.destinationViewController; + self.themePopoverController = [[UIPopoverController alloc] initWithContentViewController:segue.destinationViewController]; } } diff --git a/examples/CorePlotGallery/src/mac/main.m b/examples/CorePlotGallery/src/mac/main.m index c06df2659..90ccb7f4b 100644 --- a/examples/CorePlotGallery/src/mac/main.m +++ b/examples/CorePlotGallery/src/mac/main.m @@ -5,7 +5,7 @@ #import -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, argv); } diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 98f95fbbe..9c402892e 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -127,21 +127,21 @@ -(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)t attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:hostingView - attribute:NSLayoutAttributeLeading + attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [hostingView addConstraint:[NSLayoutConstraint constraintWithItem:barView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:hostingView - attribute:NSLayoutAttributeLeading + attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [hostingView addConstraint:[NSLayoutConstraint constraintWithItem:pieView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:hostingView - attribute:NSLayoutAttributeTrailing + attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index a633697df..5a97001d6 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -357,7 +357,7 @@ -(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:inView - attribute:NSLayoutAttributeLeading + attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [inView addConstraint:[NSLayoutConstraint constraintWithItem:hostingView @@ -371,7 +371,7 @@ -(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:inView - attribute:NSLayoutAttributeTrailing + attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; [inView addConstraint:[NSLayoutConstraint constraintWithItem:hostingView diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index b3118578d..6f964037f 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -321,6 +321,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = DatePlot; SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -343,6 +344,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = DatePlot; SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; }; diff --git a/examples/DatePlot/Info.plist b/examples/DatePlot/Info.plist index 5a2b3f434..9c8899907 100644 --- a/examples/DatePlot/Info.plist +++ b/examples/DatePlot/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index f44f10e72..5ebba13a6 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -78,7 +78,7 @@ class DateController : NSObject, CPTPlotDataSource { { var newData = [Double]() - for i in 0 ..< 5 { + for _ in 0 ..< 5 { newData.append(1.2 * Double(arc4random()) / Double(UInt32.max) + 1.2) } diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index f21cad6ef..ab9733ec8 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -316,7 +316,11 @@ -(IBAction)exportToPDF:(id)sender if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - [dataForPDF writeToURL:[pdfSavingDialog URL] atomically:NO]; + + NSURL *url = [pdfSavingDialog URL]; + if ( url ) { + [dataForPDF writeToURL:url atomically:NO]; + } } } @@ -330,8 +334,12 @@ -(IBAction)exportToPNG:(id)sender NSImage *image = [self.graph imageOfLayer]; NSData *tiffData = [image TIFFRepresentation]; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:nil]; - [pngData writeToURL:[pngSavingDialog URL] atomically:NO]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + + NSURL *url = [pngSavingDialog URL]; + if ( url ) { + [pngData writeToURL:url atomically:NO]; + } } } diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 8ea50b136..3d3b1ab9b 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -353,6 +353,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = DropPlot; }; name = Debug; @@ -373,6 +374,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = DropPlot; }; name = Release; diff --git a/examples/DropPlot/Info.plist b/examples/DropPlot/Info.plist index 2603d7b2b..08b0a1f05 100644 --- a/examples/DropPlot/Info.plist +++ b/examples/DropPlot/Info.plist @@ -30,7 +30,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/DropPlot/main.m b/examples/DropPlot/main.m index 63de8b7ce..c81924a60 100644 --- a/examples/DropPlot/main.m +++ b/examples/DropPlot/main.m @@ -8,7 +8,7 @@ #import -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, argv); } diff --git a/examples/MinorTickLabels/Info.plist b/examples/MinorTickLabels/Info.plist index c94c758c8..eba6cc145 100644 --- a/examples/MinorTickLabels/Info.plist +++ b/examples/MinorTickLabels/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/MinorTickLabels/Source/main.m b/examples/MinorTickLabels/Source/main.m index c2de14e93..50ab6acfb 100644 --- a/examples/MinorTickLabels/Source/main.m +++ b/examples/MinorTickLabels/Source/main.m @@ -8,7 +8,7 @@ #import -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, argv); } diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index 414808743..3e9dc4ff9 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -322,6 +322,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = minorTickFormatter; }; name = Debug; @@ -341,6 +342,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = minorTickFormatter; }; name = Release; diff --git a/examples/RangePlot/Info.plist b/examples/RangePlot/Info.plist index 1fe197a74..0e4f41b4a 100644 --- a/examples/RangePlot/Info.plist +++ b/examples/RangePlot/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index 0b164bec0..fc7023617 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -324,6 +324,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = RangePlot; }; name = Debug; @@ -343,6 +344,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = RangePlot; }; name = Release; diff --git a/examples/RangePlot/Source/main.m b/examples/RangePlot/Source/main.m index c2de14e93..50ab6acfb 100644 --- a/examples/RangePlot/Source/main.m +++ b/examples/RangePlot/Source/main.m @@ -8,7 +8,7 @@ #import -int main(int argc, char *argv[]) +int main(int argc, const char *argv[]) { - return NSApplicationMain(argc, (const char **)argv); + return NSApplicationMain(argc, argv); } diff --git a/examples/StockPlot/StockPlot-Info.plist b/examples/StockPlot/StockPlot-Info.plist index 07f4a3b5b..1d8d9b7be 100644 --- a/examples/StockPlot/StockPlot-Info.plist +++ b/examples/StockPlot/StockPlot-Info.plist @@ -11,7 +11,7 @@ CFBundleIcons~ipad CFBundleIdentifier - com.soundsbroken.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index 62665d72e..8b71ce1b8 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -247,7 +247,12 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; + TargetAttributes = { + 1D6058900D05DD3D006BFB54 = { + DevelopmentTeam = 28ZA45DE7D; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "StockPlot" */; compatibilityVersion = "Xcode 3.2"; @@ -364,6 +369,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -371,6 +378,7 @@ GCC_PREFIX_HEADER = StockPlot_Prefix.pch; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "StockPlot-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = StockPlot; }; name = Debug; @@ -382,11 +390,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = StockPlot_Prefix.pch; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "StockPlot-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = StockPlot; }; name = Release; @@ -396,7 +407,7 @@ baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; @@ -418,7 +429,6 @@ baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Don't Code Sign"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; diff --git a/framework/CorePlot-CocoaTouch-Info.plist b/framework/CorePlot-CocoaTouch-Info.plist index fdf834060..276e6f65b 100644 --- a/framework/CorePlot-CocoaTouch-Info.plist +++ b/framework/CorePlot-CocoaTouch-Info.plist @@ -11,7 +11,7 @@ CFBundleIconFile CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 0fe470cd6..8c60b1b89 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -1047,7 +1047,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CorePlot-CocoaTouch" */; compatibilityVersion = "Xcode 3.2"; @@ -1256,6 +1256,7 @@ isa = XCBuildConfiguration; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; diff --git a/framework/CorePlot-Info.plist b/framework/CorePlot-Info.plist index 9e4f56a91..46e9d2657 100644 --- a/framework/CorePlot-Info.plist +++ b/framework/CorePlot-Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile CFBundleIdentifier - org.coreplot.${PRODUCT_NAME:identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/CorePlotTests-Info.plist b/framework/CorePlotTests-Info.plist index b29549f07..66a5a8a22 100644 --- a/framework/CorePlotTests-Info.plist +++ b/framework/CorePlotTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - org.coreplot.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/framework/CorePlotWarnings.xcconfig b/framework/CorePlotWarnings.xcconfig index 1ca2f0ef4..f439551f7 100644 --- a/framework/CorePlotWarnings.xcconfig +++ b/framework/CorePlotWarnings.xcconfig @@ -30,4 +30,4 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES CLANG_WARN_OBJC_RECEIVER_WEAK = YES -OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive +OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-incompatible-pointer-types-discards-qualifiers diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index a4d220084..2670d1a65 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -7,15 +7,15 @@ /// @cond -static void *const CPTGraphHostingViewKVOContext = (void *)&CPTGraphHostingViewKVOContext; +static void *CPTGraphHostingViewKVOContext = (void *)&CPTGraphHostingViewKVOContext; @interface CPTGraphHostingView() @property (nonatomic, readwrite) NSPoint locationInWindow; @property (nonatomic, readwrite) CGPoint scrollOffset; --(void)plotSpaceAdded:(NSNotification *)notification; --(void)plotSpaceRemoved:(NSNotification *)notification; +-(void)plotSpaceAdded:(nonnull NSNotification *)notification; +-(void)plotSpaceRemoved:(nonnull NSNotification *)notification; -(void)plotAreaBoundsChanged; @end @@ -562,27 +562,27 @@ -(void)setHostedGraph:(CPTGraph *)newGraph hostedGraph = newGraph; - if ( hostedGraph ) { - hostedGraph.hostingView = self; + if ( newGraph ) { + newGraph.hostingView = self; [self viewDidChangeBackingProperties]; - [self.layer addSublayer:hostedGraph]; + [self.layer addSublayer:newGraph]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plotSpaceAdded:) name:CPTGraphDidAddPlotSpaceNotification - object:hostedGraph]; + object:newGraph]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plotSpaceRemoved:) name:CPTGraphDidRemovePlotSpaceNotification - object:hostedGraph]; + object:newGraph]; - [hostedGraph addObserver:self - forKeyPath:@"plotAreaFrame" - options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial - context:CPTGraphHostingViewKVOContext]; + [newGraph addObserver:self + forKeyPath:@"plotAreaFrame" + options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial + context:CPTGraphHostingViewKVOContext]; - for ( CPTPlotSpace *space in hostedGraph.allPlotSpaces ) { + for ( CPTPlotSpace *space in newGraph.allPlotSpaces ) { [space addObserver:self forKeyPath:@"isDragging" options:NSKeyValueObservingOptionNew diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index 040e37489..c2ba07e3e 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -66,7 +66,9 @@ void CPTPopCGContext(void) **/ CGContextRef CPTGetCurrentContext(void) { - return [[NSGraphicsContext currentContext] graphicsPort]; + CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; + + return context; } #pragma mark - diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index bc2782903..15ca7024a 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -87,7 +87,12 @@ -(NSDictionary *)attributes NSMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; // Font - NSFont *styleFont = [NSFont fontWithName:self.fontName size:self.fontSize]; + NSFont *styleFont = nil; + NSString *fontName = self.fontName; + + if ( fontName ) { + styleFont = [NSFont fontWithName:fontName size:self.fontSize]; + } if ( styleFont ) { [myAttributes setValue:styleFont @@ -184,7 +189,12 @@ @implementation NSString(CPTTextStyleExtensions) **/ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style { - NSFont *theFont = [NSFont fontWithName:style.fontName size:style.fontSize]; + NSFont *theFont = nil; + NSString *fontName = style.fontName; + + if ( fontName ) { + theFont = [NSFont fontWithName:fontName size:style.fontSize]; + } CGSize textSize; @@ -222,7 +232,14 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG CGContextSetFillColorWithColor(context, textColor); CPTPushCGContext(context); - NSFont *theFont = [NSFont fontWithName:style.fontName size:style.fontSize]; + + NSFont *theFont = nil; + NSString *fontName = style.fontName; + + if ( fontName ) { + theFont = [NSFont fontWithName:fontName size:style.fontSize]; + } + if ( theFont ) { NSColor *foregroundColor = style.color.nsColor; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; diff --git a/framework/Source/CPTAnimationOperation.h b/framework/Source/CPTAnimationOperation.h index b90cb2dd0..779f1940b 100644 --- a/framework/Source/CPTAnimationOperation.h +++ b/framework/Source/CPTAnimationOperation.h @@ -20,7 +20,7 @@ /// @name Delegate /// @{ -@property (nonatomic, cpt_weak_property, nullable) __cpt_weak id delegate; +@property (nonatomic, cpt_weak_property, nullable) cpt_weak id delegate; /// @} /// @name Status diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index 82e4635de..f99b29b43 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -31,7 +31,7 @@ @implementation CPTAnimationOperation **/ @synthesize boundSetter; -/** @property __cpt_weak iddelegate +/** @property cpt_weak iddelegate * @brief The animation delegate. **/ @synthesize delegate; diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index 2c53a6d2d..45d50fc55 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -6,7 +6,7 @@ @interface CPTAnnotation : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAnnotationHostLayer *annotationHostLayer; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAnnotationHostLayer *annotationHostLayer; @property (nonatomic, readwrite, assign) CGPoint contentAnchorPoint; @property (nonatomic, readwrite, assign) CGPoint displacement; @property (nonatomic, readwrite, assign) CGFloat rotation; diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 669406636..1662d9780 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -16,7 +16,7 @@ @implementation CPTAnnotation **/ @synthesize contentLayer; -/** @property __cpt_weak CPTAnnotationHostLayer *annotationHostLayer +/** @property cpt_weak CPTAnnotationHostLayer *annotationHostLayer * @brief The host layer for the annotation content. **/ @synthesize annotationHostLayer; @@ -117,9 +117,9 @@ -(void)setContentLayer:(CPTLayer *)newLayer if ( newLayer != contentLayer ) { [contentLayer removeFromSuperlayer]; contentLayer = newLayer; - if ( contentLayer ) { + if ( newLayer ) { CPTAnnotationHostLayer *hostLayer = self.annotationHostLayer; - [hostLayer addSublayer:contentLayer]; + [hostLayer addSublayer:newLayer]; } } } diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index f413772a0..5ee63b9f8 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -81,7 +81,13 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - mutableAnnotations = [[coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"] mutableCopy]; + NSArray *annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; + if ( annotations ) { + mutableAnnotations = [annotations mutableCopy]; + } + else { + mutableAnnotations = [[NSMutableArray alloc] init]; + } } return self; } diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index 60daae54f..c1d995464 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -271,9 +271,9 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Layers /// @{ @property (nonatomic, readwrite, assign) BOOL separateLayers; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlotArea *plotArea; -@property (nonatomic, readonly, nullable) __cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readonly, nullable) __cpt_weak CPTGridLines *majorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlotArea *plotArea; +@property (nonatomic, readonly, nullable) cpt_weak CPTGridLines *minorGridLines; +@property (nonatomic, readonly, nullable) cpt_weak CPTGridLines *majorGridLines; @property (nonatomic, readonly, nullable) CPTAxisSet *axisSet; /// @} diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index e1e563b96..8d1c0fae4 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -35,10 +35,10 @@ @interface CPTAxis() @property (nonatomic, readwrite, assign) BOOL needsRelabel; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGridLines *majorGridLines; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxisLabel *pointingDeviceDownLabel; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGridLines *minorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGridLines *majorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; @property (nonatomic, readwrite, assign) BOOL labelFormatterChanged; @property (nonatomic, readwrite, assign) BOOL minorLabelFormatterChanged; @property (nonatomic, readwrite, strong, nullable) NSMutableArray *mutableBackgroundLimitBands; @@ -432,17 +432,17 @@ @implementation CPTAxis **/ @synthesize separateLayers; -/** @property __cpt_weak CPTPlotArea *plotArea +/** @property cpt_weak CPTPlotArea *plotArea * @brief The plot area that the axis belongs to. **/ @synthesize plotArea; -/** @property __cpt_weak CPTGridLines *minorGridLines +/** @property cpt_weak CPTGridLines *minorGridLines * @brief The layer that draws the minor grid lines. **/ @synthesize minorGridLines; -/** @property __cpt_weak CPTGridLines *majorGridLines +/** @property cpt_weak CPTGridLines *majorGridLines * @brief The layer that draws the major grid lines. **/ @synthesize majorGridLines; @@ -453,13 +453,13 @@ @implementation CPTAxis @dynamic axisSet; /** @internal - * @property __cpt_weak CPTAxisLabel *pointingDeviceDownLabel + * @property cpt_weak CPTAxisLabel *pointingDeviceDownLabel * @brief The label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownLabel; /** @internal - * @property __cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel + * @property cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel * @brief The tick label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownTickLabel; @@ -2381,7 +2381,13 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle -(void)setTitleLocation:(NSNumber *)newLocation { - if ( ![newLocation isEqualToNumber:titleLocation] ) { + BOOL needsUpdate = YES; + + if ( newLocation ) { + needsUpdate = ![titleLocation isEqualToNumber:newLocation]; + } + + if ( needsUpdate ) { titleLocation = newLocation; [self updateAxisTitle]; } @@ -2681,7 +2687,13 @@ -(void)setAxisLineCapMax:(CPTLineCap *)newAxisLineCapMax -(void)setLabelingOrigin:(NSNumber *)newLabelingOrigin { - if ( ![newLabelingOrigin isEqualToNumber:labelingOrigin] ) { + BOOL needsUpdate = YES; + + if ( newLabelingOrigin ) { + needsUpdate = ![labelingOrigin isEqualToNumber:newLabelingOrigin]; + } + + if ( needsUpdate ) { labelingOrigin = newLabelingOrigin; self.needsRelabel = YES; @@ -2690,7 +2702,13 @@ -(void)setLabelingOrigin:(NSNumber *)newLabelingOrigin -(void)setMajorIntervalLength:(NSNumber *)newIntervalLength { - if ( ![newIntervalLength isEqualToNumber:majorIntervalLength] ) { + BOOL needsUpdate = YES; + + if ( newIntervalLength ) { + needsUpdate = ![majorIntervalLength isEqualToNumber:newIntervalLength]; + } + + if ( needsUpdate ) { majorIntervalLength = newIntervalLength; self.needsRelabel = YES; diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index c954c5603..220db2500 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -78,6 +78,15 @@ -(instancetype)initWithContentLayer:(CPTLayer *)layer return self; } +/// @cond + +-(instancetype)init +{ + return [self initWithText:nil textStyle:nil]; +} + +/// @endcond + #pragma mark - #pragma mark NSCoding Methods @@ -309,7 +318,14 @@ -(BOOL)isEqual:(id)object return YES; } else if ( [object isKindOfClass:[self class]] ) { - return [self.tickLocation isEqualToNumber:( (CPTAxisLabel *)object ).tickLocation]; + NSNumber *location = ( (CPTAxisLabel *)object ).tickLocation; + + if ( location ) { + return [self.tickLocation isEqualToNumber:location]; + } + else { + return NO; + } } else { return NO; diff --git a/framework/Source/CPTAxisTitle.m b/framework/Source/CPTAxisTitle.m index 4b7030369..ececfdc0e 100644 --- a/framework/Source/CPTAxisTitle.m +++ b/framework/Source/CPTAxisTitle.m @@ -56,7 +56,15 @@ -(BOOL)isEqual:(id)object if ( ![self.contentLayer isEqual:otherTitle] ) { return NO; } - return [self.tickLocation isEqualToNumber:( (CPTAxisLabel *)object ).tickLocation]; + + NSNumber *location = ( (CPTAxisLabel *)object ).tickLocation; + + if ( location ) { + return [self.tickLocation isEqualToNumber:location]; + } + else { + return NO; + } } else { return NO; diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index f94038157..08168baa4 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -99,7 +99,7 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super initWithCoder:coder]) ) { + if ( (self = [super init]) ) { dateFormatter = [coder decodeObjectForKey:@"CPTCalendarFormatter.dateFormatter"]; referenceDate = [[coder decodeObjectForKey:@"CPTCalendarFormatter.referenceDate"] copy]; referenceCalendar = [[coder decodeObjectForKey:@"CPTCalendarFormatter.referenceCalendar"] copy]; diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index d6645bd8c..96ff7e937 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -358,6 +358,11 @@ -(instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFl /// @cond +-(instancetype)init +{ + return [self initWithComponentRed:0.0 green:0.0 blue:0.0 alpha:0.0]; +} + -(void)dealloc { CGColorRelease(cgColor); @@ -432,7 +437,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder colorComponents[i] = [coder decodeCGFloatForKey:newKey]; } - cgColor = CGColorCreate(colorSpace, colorComponents); + CGColorRef color = CGColorCreate(colorSpace, colorComponents); + cgColor = color; + CGColorSpaceRelease(colorSpace); free(colorComponents); } diff --git a/framework/Source/CPTColorSpace.m b/framework/Source/CPTColorSpace.m index e9fbe2c3e..0f184e7cd 100644 --- a/framework/Source/CPTColorSpace.m +++ b/framework/Source/CPTColorSpace.m @@ -64,6 +64,23 @@ -(instancetype)initWithCGColorSpace:(CGColorSpaceRef)colorSpace /// @cond +-(instancetype)init +{ + CGColorSpaceRef cgSpace = NULL; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + cgSpace = CGColorSpaceCreateDeviceRGB(); +#else + cgSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); +#endif + + self = [self initWithCGColorSpace:cgSpace]; + + CGColorSpaceRelease(cgSpace); + + return self; +} + -(void)dealloc { CGColorSpaceRelease(cgColorSpace); diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 1ca6a5762..5eb3a8114 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -10,7 +10,7 @@ **/ /** - * @def __cpt_weak + * @def cpt_weak * @hideinitializer * @brief A custom definition for automatic reference counting (ARC) weak references that falls back to * __unsafe_unretained values on older platforms. @@ -34,13 +34,13 @@ #endif #if CPT_SDK_SUPPORTS_WEAK -#define __cpt_weak __weak +#define cpt_weak __weak #define cpt_weak_property weak #else #if __clang__ && (__clang_major__ >= 3) -#define __cpt_weak __unsafe_unretained +#define cpt_weak __unsafe_unretained #else -#define __cpt_weak +#define cpt_weak #endif #define cpt_weak_property assign #endif diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index 10681366e..b89c7cacd 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -10,7 +10,7 @@ /// @cond -static void *const CPTFunctionDataSourceKVOContext = (void *)&CPTFunctionDataSourceKVOContext; +static void *CPTFunctionDataSourceKVOContext = (void *)&CPTFunctionDataSourceKVOContext; @interface CPTFunctionDataSource() diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index f5d85f3fb..551cc1409 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -64,7 +64,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Hosting View /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraphHostingView *hostingView; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraphHostingView *hostingView; /// @} /// @name Title diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 7bb0e106d..33575b4c5 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -68,7 +68,7 @@ -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor; **/ @implementation CPTGraph -/** @property __cpt_weak CPTGraphHostingView *hostingView +/** @property cpt_weak CPTGraphHostingView *hostingView * @brief The hosting view that contains the graph. **/ @synthesize hostingView; @@ -312,10 +312,25 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; - plotAreaFrame = [coder decodeObjectForKey:@"CPTGraph.plotAreaFrame"]; - plots = [[coder decodeObjectForKey:@"CPTGraph.plots"] mutableCopy]; - plotSpaces = [[coder decodeObjectForKey:@"CPTGraph.plotSpaces"] mutableCopy]; + hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; + plotAreaFrame = [coder decodeObjectForKey:@"CPTGraph.plotAreaFrame"]; + + NSArray *plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; + if ( plotArray ) { + plots = [plotArray mutableCopy]; + } + else { + plots = [[NSMutableArray alloc] init]; + } + + NSArray *plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; + if ( plotSpaceArray ) { + plotSpaces = [plotSpaceArray mutableCopy]; + } + else { + plotSpaces = [[NSMutableArray alloc] init]; + } + title = [[coder decodeObjectForKey:@"CPTGraph.title"] copy]; attributedTitle = [[coder decodeObjectForKey:@"CPTGraph.attributedTitle"] copy]; titleTextStyle = [[coder decodeObjectForKey:@"CPTGraph.titleTextStyle"] copy]; diff --git a/framework/Source/CPTGridLineGroup.h b/framework/Source/CPTGridLineGroup.h index e62445400..5e28da35a 100644 --- a/framework/Source/CPTGridLineGroup.h +++ b/framework/Source/CPTGridLineGroup.h @@ -4,7 +4,7 @@ @interface CPTGridLineGroup : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlotArea *plotArea; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlotArea *plotArea; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTGridLineGroup.m b/framework/Source/CPTGridLineGroup.m index 66182b53d..cc5f18c04 100644 --- a/framework/Source/CPTGridLineGroup.m +++ b/framework/Source/CPTGridLineGroup.m @@ -12,7 +12,7 @@ **/ @implementation CPTGridLineGroup -/** @property __cpt_weak CPTPlotArea *plotArea +/** @property cpt_weak CPTPlotArea *plotArea * @brief The plot area that this grid line group belongs to. **/ @synthesize plotArea; diff --git a/framework/Source/CPTGridLines.h b/framework/Source/CPTGridLines.h index 100e14f2e..80650a0b5 100644 --- a/framework/Source/CPTGridLines.h +++ b/framework/Source/CPTGridLines.h @@ -4,7 +4,7 @@ @interface CPTGridLines : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTAxis *axis; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxis *axis; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTGridLines.m b/framework/Source/CPTGridLines.m index 2610f4d11..f96777129 100644 --- a/framework/Source/CPTGridLines.m +++ b/framework/Source/CPTGridLines.m @@ -7,7 +7,7 @@ **/ @implementation CPTGridLines -/** @property __cpt_weak CPTAxis *axis +/** @property cpt_weak CPTAxis *axis * @brief The axis. **/ @synthesize axis; diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 26baa9200..dc29db743 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -309,7 +309,7 @@ +(instancetype)imageWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale **/ +(instancetype)imageWithCGImage:(CGImageRef)anImage { - return [[self alloc] initWithCGImage:anImage]; + return [self imageWithCGImage:anImage scale:CPTFloat(1.0)]; } /** @brief Creates and returns a new CPTImage instance initialized with the contents of a PNG file. diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 9ff66f9be..81da9e0c1 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -19,7 +19,7 @@ extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /// @name Graph /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraph *graph; /// @} /// @name Padding diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index d7efa9dc4..18b7cf808 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -49,7 +49,7 @@ -(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx; **/ @implementation CPTLayer -/** @property __cpt_weak CPTGraph *graph +/** @property cpt_weak CPTGraph *graph * @brief The graph for the layer. **/ @synthesize graph; @@ -853,7 +853,7 @@ -(void)setPosition:(CGPoint)newPosition if ( COREPLOT_LAYER_POSITION_CHANGE_ENABLED() ) { CGRect currentFrame = self.frame; if ( !CGRectEqualToRect( currentFrame, CGRectIntegral(self.frame) ) ) { - COREPLOT_LAYER_POSITION_CHANGE( (char *)class_getName([self class]), + COREPLOT_LAYER_POSITION_CHANGE( (const char *)class_getName([self class]), (int)lrint( ceil(currentFrame.origin.x * 1000.0) ), (int)lrint( ceil(currentFrame.origin.y * 1000.0) ), (int)lrint( ceil(currentFrame.size.width * 1000.0) ), diff --git a/framework/Source/CPTLayerAnnotation.h b/framework/Source/CPTLayerAnnotation.h index d826f7b41..4a1b45bbd 100644 --- a/framework/Source/CPTLayerAnnotation.h +++ b/framework/Source/CPTLayerAnnotation.h @@ -5,7 +5,7 @@ @interface CPTLayerAnnotation : CPTAnnotation -@property (nonatomic, readonly, nullable) __cpt_weak CPTLayer *anchorLayer; +@property (nonatomic, readonly, nullable) cpt_weak CPTLayer *anchorLayer; @property (nonatomic, readwrite, assign) CPTRectAnchor rectAnchor; -(nonnull instancetype)initWithAnchorLayer:(nonnull CPTLayer *)anchorLayer NS_DESIGNATED_INITIALIZER; diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index ecba13383..063ba8f3d 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -26,7 +26,7 @@ -(void)setConstraints; **/ @implementation CPTLayerAnnotation -/** @property __cpt_weak CPTLayer *anchorLayer +/** @property cpt_weak CPTLayer *anchorLayer * @brief The reference layer. **/ @synthesize anchorLayer; @@ -114,7 +114,7 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super initWithCoder:coder]) ) { + if ( (self = [super init]) ) { anchorLayer = [coder decodeObjectForKey:@"CPTLayerAnnotation.anchorLayer"]; xConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.xConstraints"]; yConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.yConstraints"]; diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 30cfe80f2..bfa6fa011 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -33,7 +33,7 @@ @interface CPTLegend() @property (nonatomic, readwrite, strong) NSArray *rowHeightsThatFit; @property (nonatomic, readwrite, strong) NSArray *columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak CPTLegendEntry *pointingDeviceDownEntry; +@property (nonatomic, readwrite, cpt_weak_property) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; -(void)recalculateLayout; -(void)removeLegendEntriesForPlot:(CPTPlot *)plot; @@ -224,7 +224,7 @@ @implementation CPTLegend @synthesize layoutChanged; /** @internal - * @property __cpt_weak CPTLegendEntry *pointingDeviceDownEntry + * @property cpt_weak CPTLegendEntry *pointingDeviceDownEntry * @brief The legend entry that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownEntry; diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index 59f12edb7..69e80f218 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -7,7 +7,7 @@ /// @name Plot Info /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTPlot *plot; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlot *plot; @property (nonatomic, readwrite, assign) NSUInteger index; /// @} diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 1b8653994..380a885a8 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -23,7 +23,7 @@ @interface CPTLegendEntry() **/ @implementation CPTLegendEntry -/** @property __cpt_weak CPTPlot *plot +/** @property cpt_weak CPTPlot *plot * @brief The plot associated with this legend entry. **/ @synthesize plot; diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index a568a6dcf..5e4a17017 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -45,6 +45,15 @@ -(instancetype)initWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill return self; } +/// @cond + +-(instancetype)init +{ + return [self initWithRange:nil fill:nil]; +} + +/// @endcond + #pragma mark - #pragma mark NSCopying Methods diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index aa8e95133..6ef9fb9e2 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -13,4 +13,10 @@ @property (nonatomic, readwrite, copy, nonnull) NSArray *shape; /// @} +/// @name Samples +/// @{ +-(nullable void *)mutableSamplePointer:(NSUInteger)sample; +-(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ...; +/// @} + @end diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index e70f2c60d..0ab6c2882 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -1,5 +1,17 @@ #import "CPTMutableNumericData.h" +/// @cond +@interface CPTNumericData() + +// inherited private method +-(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; + +@end + +/// @endcond + +#pragma mark - + /** @brief An annotated NSMutableData type. * * CPTNumericData combines a mutable data buffer with information @@ -27,6 +39,47 @@ @implementation CPTMutableNumericData **/ @dynamic shape; +#pragma mark - +#pragma mark Samples + +/** @brief Gets a pointer to a given sample in the data buffer. + * @param sample The zero-based index into the sample array. The array is treated as if it only has one dimension. + * @return A pointer to the sample or @NULL if the sample index is out of bounds. + **/ +-(void *)mutableSamplePointer:(NSUInteger)sample +{ + if ( sample < self.numberOfSamples ) { + return (void *)( (char *)self.mutableBytes + sample * self.sampleBytes ); + } + else { + return NULL; + } +} + +/** @brief Gets a pointer to a given sample in the data buffer. + * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices + * (including @par{index}) should match the @ref numberOfDimensions. + * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. + **/ +-(void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... + { + NSUInteger newIndex; + + if ( self.numberOfDimensions > 1 ) { + va_list indices; + va_start(indices, idx); + + newIndex = [self sampleIndex:idx indexList:indices]; + + va_end(indices); + } + else { + newIndex = idx; + } + + return [self mutableSamplePointer:newIndex]; +} + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index a5766cb0e..67eafd056 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -8,7 +8,8 @@ @implementation CPTMutableNumericDataTests -(void)testNilShapeGivesSingleDimension { - CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:[NSMutableData dataWithLength:1 * sizeof(float)] + NSMutableData *data = [NSMutableData dataWithLength:1 * sizeof(float)]; + CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:data dataTypeString:@"=f4" shape:nil]; NSUInteger actual = nd.numberOfDimensions; @@ -25,7 +26,8 @@ -(void)testNumberOfDimensionsGivesShapeCount NSUInteger nElems = 2 * 2 * 2; - CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(float)] + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; + CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:data dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:shape]; @@ -36,7 +38,8 @@ -(void)testNilShapeCorrectElementCount { NSUInteger nElems = 13; - CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(float)] + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; + CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:data dataTypeString:@"=f4" shape:nil]; @@ -58,7 +61,9 @@ -(void)testIllegalShapeRaisesException CPTNumericData *testData = nil; - XCTAssertThrowsSpecificNamed(testData = [[CPTMutableNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(NSUInteger)] + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(NSUInteger)]; + + XCTAssertThrowsSpecificNamed(testData = [[CPTMutableNumericData alloc] initWithData:data dataType:CPTDataType( CPTUnsignedIntegerDataType, sizeof(NSUInteger), NSHostByteOrder() ) shape:shape], NSException, @@ -68,7 +73,8 @@ -(void)testIllegalShapeRaisesException -(void)testReturnsDataLength { - CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:[NSMutableData dataWithLength:10 * sizeof(float)] + NSMutableData *data = [NSMutableData dataWithLength:10 * sizeof(float)]; + CPTMutableNumericData *nd = [[CPTMutableNumericData alloc] initWithData:data dataTypeString:@"=f4" shape:nil]; @@ -210,9 +216,9 @@ -(void)testSamplePointerCorrect dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - XCTAssertEqual( ( (float *)[fd mutableBytes] ) + 4, (float *)[fd samplePointer:4], @"%p,%p", samples + 4, (float *)[fd samplePointer:4] ); - XCTAssertEqual( ( (float *)[fd mutableBytes] ), (float *)[fd samplePointer:0], @"" ); - XCTAssertEqual( ( (float *)[fd mutableBytes] ) + nElems - 1, (float *)[fd samplePointer:nElems - 1], @"" ); + XCTAssertEqual( ( (float *)[fd mutableBytes] ) + 4, (float *)[fd mutableSamplePointer:4], @"%p,%p", samples + 4, (float *)[fd mutableSamplePointer:4] ); + XCTAssertEqual( ( (float *)[fd mutableBytes] ), (float *)[fd mutableSamplePointer:0], @"" ); + XCTAssertEqual( ( (float *)[fd mutableBytes] ) + nElems - 1, (float *)[fd mutableSamplePointer:nElems - 1], @"" ); XCTAssertNil([fd samplePointer:nElems], @"too many samples"); } @@ -237,7 +243,8 @@ -(void)testSampleValueCorrect -(void)testMutableCopy { const NSUInteger nElems = 10; - CPTNumericData *nd = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(float)] + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; + CPTNumericData *nd = [[CPTNumericData alloc] initWithData:data dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; diff --git a/framework/Source/CPTNumericData+TypeConversion.m b/framework/Source/CPTNumericData+TypeConversion.m index fe9fa73ca..60b17ddc7 100644 --- a/framework/Source/CPTNumericData+TypeConversion.m +++ b/framework/Source/CPTNumericData+TypeConversion.m @@ -111,7 +111,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // int8_t -> int16_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -122,7 +122,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // int8_t -> int32_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -133,7 +133,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // int8_t -> int64_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -148,7 +148,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // int8_t -> uint8_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -159,7 +159,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // int8_t -> uint16_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -170,7 +170,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // int8_t -> uint32_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -181,7 +181,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // int8_t -> uint64_t - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -196,7 +196,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // int8_t -> float - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -207,7 +207,7 @@ case sizeof(float): case sizeof(double): { // int8_t -> double - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -222,7 +222,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // int8_t -> float complex - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -233,7 +233,7 @@ case sizeof(float complex): case sizeof(double complex): { // int8_t -> double complex - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -248,7 +248,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // int8_t -> NSDecimal - const int8_t *fromBytes = (int8_t *)sourceData.bytes; + const int8_t *fromBytes = (const int8_t *)sourceData.bytes; const int8_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -270,7 +270,7 @@ case sizeof(int16_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // int16_t -> int8_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -287,7 +287,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // int16_t -> int32_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -298,7 +298,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // int16_t -> int64_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -313,7 +313,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // int16_t -> uint8_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -324,7 +324,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // int16_t -> uint16_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -335,7 +335,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // int16_t -> uint32_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -346,7 +346,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // int16_t -> uint64_t - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -361,7 +361,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // int16_t -> float - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -372,7 +372,7 @@ case sizeof(float): case sizeof(double): { // int16_t -> double - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -387,7 +387,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // int16_t -> float complex - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -398,7 +398,7 @@ case sizeof(float complex): case sizeof(double complex): { // int16_t -> double complex - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -413,7 +413,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // int16_t -> NSDecimal - const int16_t *fromBytes = (int16_t *)sourceData.bytes; + const int16_t *fromBytes = (const int16_t *)sourceData.bytes; const int16_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -435,7 +435,7 @@ case sizeof(int32_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // int32_t -> int8_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -446,7 +446,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // int32_t -> int16_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -463,7 +463,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // int32_t -> int64_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -478,7 +478,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // int32_t -> uint8_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -489,7 +489,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // int32_t -> uint16_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -500,7 +500,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // int32_t -> uint32_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -511,7 +511,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // int32_t -> uint64_t - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -526,7 +526,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // int32_t -> float - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -537,7 +537,7 @@ case sizeof(float): case sizeof(double): { // int32_t -> double - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -552,7 +552,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // int32_t -> float complex - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -563,7 +563,7 @@ case sizeof(float complex): case sizeof(double complex): { // int32_t -> double complex - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -578,7 +578,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // int32_t -> NSDecimal - const int32_t *fromBytes = (int32_t *)sourceData.bytes; + const int32_t *fromBytes = (const int32_t *)sourceData.bytes; const int32_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -600,7 +600,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // int64_t -> int8_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -611,7 +611,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // int64_t -> int16_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -622,7 +622,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // int64_t -> int32_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -643,7 +643,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // int64_t -> uint8_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -654,7 +654,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // int64_t -> uint16_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -665,7 +665,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // int64_t -> uint32_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -676,7 +676,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // int64_t -> uint64_t - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -691,7 +691,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // int64_t -> float - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -702,7 +702,7 @@ case sizeof(float): case sizeof(double): { // int64_t -> double - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -717,7 +717,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // int64_t -> float complex - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -728,7 +728,7 @@ case sizeof(float complex): case sizeof(double complex): { // int64_t -> double complex - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -743,7 +743,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // int64_t -> NSDecimal - const int64_t *fromBytes = (int64_t *)sourceData.bytes; + const int64_t *fromBytes = (const int64_t *)sourceData.bytes; const int64_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -769,7 +769,7 @@ case sizeof(uint8_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // uint8_t -> int8_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -780,7 +780,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // uint8_t -> int16_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -791,7 +791,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // uint8_t -> int32_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -802,7 +802,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // uint8_t -> int64_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -823,7 +823,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // uint8_t -> uint16_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -834,7 +834,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // uint8_t -> uint32_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -845,7 +845,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // uint8_t -> uint64_t - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -860,7 +860,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // uint8_t -> float - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -871,7 +871,7 @@ case sizeof(float): case sizeof(double): { // uint8_t -> double - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -886,7 +886,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // uint8_t -> float complex - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -897,7 +897,7 @@ case sizeof(float complex): case sizeof(double complex): { // uint8_t -> double complex - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -912,7 +912,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // uint8_t -> NSDecimal - const uint8_t *fromBytes = (uint8_t *)sourceData.bytes; + const uint8_t *fromBytes = (const uint8_t *)sourceData.bytes; const uint8_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -934,7 +934,7 @@ case sizeof(uint16_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // uint16_t -> int8_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -945,7 +945,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // uint16_t -> int16_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -956,7 +956,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // uint16_t -> int32_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -967,7 +967,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // uint16_t -> int64_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -982,7 +982,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // uint16_t -> uint8_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -999,7 +999,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // uint16_t -> uint32_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1010,7 +1010,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // uint16_t -> uint64_t - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1025,7 +1025,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // uint16_t -> float - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1036,7 +1036,7 @@ case sizeof(float): case sizeof(double): { // uint16_t -> double - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1051,7 +1051,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // uint16_t -> float complex - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1062,7 +1062,7 @@ case sizeof(float complex): case sizeof(double complex): { // uint16_t -> double complex - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1077,7 +1077,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // uint16_t -> NSDecimal - const uint16_t *fromBytes = (uint16_t *)sourceData.bytes; + const uint16_t *fromBytes = (const uint16_t *)sourceData.bytes; const uint16_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1099,7 +1099,7 @@ case sizeof(uint32_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // uint32_t -> int8_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1110,7 +1110,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // uint32_t -> int16_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1121,7 +1121,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // uint32_t -> int32_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1132,7 +1132,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // uint32_t -> int64_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1147,7 +1147,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // uint32_t -> uint8_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1158,7 +1158,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // uint32_t -> uint16_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1175,7 +1175,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // uint32_t -> uint64_t - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1190,7 +1190,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // uint32_t -> float - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1201,7 +1201,7 @@ case sizeof(float): case sizeof(double): { // uint32_t -> double - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1216,7 +1216,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // uint32_t -> float complex - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1227,7 +1227,7 @@ case sizeof(float complex): case sizeof(double complex): { // uint32_t -> double complex - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1242,7 +1242,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // uint32_t -> NSDecimal - const uint32_t *fromBytes = (uint32_t *)sourceData.bytes; + const uint32_t *fromBytes = (const uint32_t *)sourceData.bytes; const uint32_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1264,7 +1264,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // uint64_t -> int8_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1275,7 +1275,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // uint64_t -> int16_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1286,7 +1286,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // uint64_t -> int32_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1297,7 +1297,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // uint64_t -> int64_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1312,7 +1312,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // uint64_t -> uint8_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1323,7 +1323,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // uint64_t -> uint16_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1334,7 +1334,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // uint64_t -> uint32_t - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1355,7 +1355,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // uint64_t -> float - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1366,7 +1366,7 @@ case sizeof(float): case sizeof(double): { // uint64_t -> double - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1381,7 +1381,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // uint64_t -> float complex - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1392,7 +1392,7 @@ case sizeof(float complex): case sizeof(double complex): { // uint64_t -> double complex - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1407,7 +1407,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // uint64_t -> NSDecimal - const uint64_t *fromBytes = (uint64_t *)sourceData.bytes; + const uint64_t *fromBytes = (const uint64_t *)sourceData.bytes; const uint64_t *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1433,7 +1433,7 @@ case sizeof(float): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // float -> int8_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1444,7 +1444,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // float -> int16_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1455,7 +1455,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // float -> int32_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1466,7 +1466,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // float -> int64_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1481,7 +1481,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // float -> uint8_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1492,7 +1492,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // float -> uint16_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1503,7 +1503,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // float -> uint32_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1514,7 +1514,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // float -> uint64_t - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1535,7 +1535,7 @@ case sizeof(float): case sizeof(double): { // float -> double - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1550,7 +1550,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // float -> float complex - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1561,7 +1561,7 @@ case sizeof(float complex): case sizeof(double complex): { // float -> double complex - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1576,7 +1576,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // float -> NSDecimal - const float *fromBytes = (float *)sourceData.bytes; + const float *fromBytes = (const float *)sourceData.bytes; const float *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1598,7 +1598,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // double -> int8_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1609,7 +1609,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // double -> int16_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1620,7 +1620,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // double -> int32_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1631,7 +1631,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // double -> int64_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1646,7 +1646,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // double -> uint8_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1657,7 +1657,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // double -> uint16_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1668,7 +1668,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // double -> uint32_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1679,7 +1679,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // double -> uint64_t - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1694,7 +1694,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // double -> float - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1715,7 +1715,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // double -> float complex - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1726,7 +1726,7 @@ case sizeof(float complex): case sizeof(double complex): { // double -> double complex - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1741,7 +1741,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // double -> NSDecimal - const double *fromBytes = (double *)sourceData.bytes; + const double *fromBytes = (const double *)sourceData.bytes; const double *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1767,7 +1767,7 @@ case sizeof(float complex): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // float complex -> int8_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1778,7 +1778,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // float complex -> int16_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1789,7 +1789,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // float complex -> int32_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1800,7 +1800,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // float complex -> int64_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1815,7 +1815,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // float complex -> uint8_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1826,7 +1826,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // float complex -> uint16_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1837,7 +1837,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // float complex -> uint32_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1848,7 +1848,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // float complex -> uint64_t - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1863,7 +1863,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // float complex -> float - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1874,7 +1874,7 @@ case sizeof(float): case sizeof(double): { // float complex -> double - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1895,7 +1895,7 @@ case sizeof(float complex): case sizeof(double complex): { // float complex -> double complex - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1910,7 +1910,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // float complex -> NSDecimal - const float complex *fromBytes = (float complex *)sourceData.bytes; + const float complex *fromBytes = (const float complex *)sourceData.bytes; const float complex *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1932,7 +1932,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // double complex -> int8_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1943,7 +1943,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // double complex -> int16_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1954,7 +1954,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // double complex -> int32_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1965,7 +1965,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // double complex -> int64_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1980,7 +1980,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // double complex -> uint8_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -1991,7 +1991,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // double complex -> uint16_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2002,7 +2002,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // double complex -> uint32_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2013,7 +2013,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // double complex -> uint64_t - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2028,7 +2028,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // double complex -> float - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2039,7 +2039,7 @@ case sizeof(float): case sizeof(double): { // double complex -> double - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2054,7 +2054,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // double complex -> float complex - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2075,7 +2075,7 @@ case sizeof(double complex): switch ( destDataType->sampleBytes ) { case sizeof(NSDecimal): { // double complex -> NSDecimal - const double complex *fromBytes = (double complex *)sourceData.bytes; + const double complex *fromBytes = (const double complex *)sourceData.bytes; const double complex *lastSample = fromBytes + sampleCount; NSDecimal *toBytes = (NSDecimal *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2101,7 +2101,7 @@ case sizeof(NSDecimal): switch ( destDataType->sampleBytes ) { case sizeof(int8_t): { // NSDecimal -> int8_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; int8_t *toBytes = (int8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2112,7 +2112,7 @@ case sizeof(int8_t): case sizeof(int16_t): { // NSDecimal -> int16_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; int16_t *toBytes = (int16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2123,7 +2123,7 @@ case sizeof(int16_t): case sizeof(int32_t): { // NSDecimal -> int32_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; int32_t *toBytes = (int32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2134,7 +2134,7 @@ case sizeof(int32_t): case sizeof(int64_t): { // NSDecimal -> int64_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; int64_t *toBytes = (int64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2149,7 +2149,7 @@ case sizeof(int64_t): switch ( destDataType->sampleBytes ) { case sizeof(uint8_t): { // NSDecimal -> uint8_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; uint8_t *toBytes = (uint8_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2160,7 +2160,7 @@ case sizeof(uint8_t): case sizeof(uint16_t): { // NSDecimal -> uint16_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; uint16_t *toBytes = (uint16_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2171,7 +2171,7 @@ case sizeof(uint16_t): case sizeof(uint32_t): { // NSDecimal -> uint32_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; uint32_t *toBytes = (uint32_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2182,7 +2182,7 @@ case sizeof(uint32_t): case sizeof(uint64_t): { // NSDecimal -> uint64_t - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; uint64_t *toBytes = (uint64_t *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2197,7 +2197,7 @@ case sizeof(uint64_t): switch ( destDataType->sampleBytes ) { case sizeof(float): { // NSDecimal -> float - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; float *toBytes = (float *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2208,7 +2208,7 @@ case sizeof(float): case sizeof(double): { // NSDecimal -> double - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; double *toBytes = (double *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2223,7 +2223,7 @@ case sizeof(double): switch ( destDataType->sampleBytes ) { case sizeof(float complex): { // NSDecimal -> float complex - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; float complex *toBytes = (float complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { @@ -2234,7 +2234,7 @@ case sizeof(float complex): case sizeof(double complex): { // NSDecimal -> double complex - const NSDecimal *fromBytes = (NSDecimal *)sourceData.bytes; + const NSDecimal *fromBytes = (const NSDecimal *)sourceData.bytes; const NSDecimal *lastSample = fromBytes + sampleCount; double complex *toBytes = (double complex *)destData.mutableBytes; while ( fromBytes < lastSample ) { diff --git a/framework/Source/CPTNumericData+TypeConversions_Generation.py b/framework/Source/CPTNumericData+TypeConversions_Generation.py index 02a99e0ac..1f340c706 100644 --- a/framework/Source/CPTNumericData+TypeConversions_Generation.py +++ b/framework/Source/CPTNumericData+TypeConversions_Generation.py @@ -64,13 +64,13 @@ for t in types[dt]: print "\t\t\tcase sizeof(%s):" % t if ( t == "float complex" ): - print "\t\t\t\tresult = @(*( crealf(%s *)[self samplePointer:sample]) );" % (t) + print "\t\t\t\tresult = @(*( crealf(const %s *)[self samplePointer:sample]) );" % (t) elif ( t == "double complex" ): - print "\t\t\t\tresult = @(*( creal(%s *)[self samplePointer:sample]) );" % (t) + print "\t\t\t\tresult = @(*( creal(const %s *)[self samplePointer:sample]) );" % (t) elif ( t == "NSDecimal" ): - print "\t\t\t\tresult = [NSDecimalNumber decimalNumberWithDecimal:*(%s *)[self samplePointer:sample]];" % (t) + print "\t\t\t\tresult = [NSDecimalNumber decimalNumberWithDecimal:*(const %s *)[self samplePointer:sample]];" % (t) else: - print "\t\t\t\tresult = @(*(%s *)[self samplePointer:sample]);" % (t) + print "\t\t\t\tresult = @(*(const %s *)[self samplePointer:sample]);" % (t) print "\t\t\t\tbreak;" print "\t\t}" print "\t\tbreak;" @@ -129,7 +129,7 @@ if ( t == nt ): print "\t\t\t\t\t\t\t\t\tmemcpy(destData.mutableBytes, sourceData.bytes, sampleCount * sizeof(%s));" % t else: - print "\t\t\t\t\t\t\t\t\tconst %s *fromBytes = (%s *)sourceData.bytes;" % (t, t) + print "\t\t\t\t\t\t\t\t\tconst %s *fromBytes = (const %s *)sourceData.bytes;" % (t, t) print "\t\t\t\t\t\t\t\t\tconst %s *lastSample = fromBytes + sampleCount;" % t print "\t\t\t\t\t\t\t\t\t%s *toBytes = (%s *)destData.mutableBytes;" % (nt, nt) if ( t == "NSDecimal" ): diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index 9e08945da..a5dc75ae2 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -56,8 +56,8 @@ /// @name Samples /// @{ -(NSUInteger)sampleIndex:(NSUInteger)idx, ...; --(nullable void *)samplePointer:(NSUInteger)sample; --(nullable void *)samplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable const void *)samplePointer:(NSUInteger)sample; +-(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...; -(nullable NSNumber *)sampleValue:(NSUInteger)sample; -(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; -(nonnull NSArray *)sampleArray; diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index bd1dca813..794d11db9 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -415,6 +415,13 @@ -(instancetype)initWithArray:(NSArray *)newData /// @cond +-(instancetype)init +{ + return [self initWithData:[NSData data] + dataType:CPTDataType( CPTFloatingPointDataType, sizeof(double), CFByteOrderGetCurrent() ) + shape:nil]; +} + -(void)commonInitWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(NSArray *)shapeArray @@ -608,19 +615,19 @@ -(NSNumber *)sampleValue:(NSUInteger)sample case CPTIntegerDataType: switch ( self.sampleBytes ) { case sizeof(int8_t): - result = @(*(int8_t *)[self samplePointer:sample]); + result = @(*(const int8_t *)[self samplePointer:sample]); break; case sizeof(int16_t): - result = @(*(int16_t *)[self samplePointer:sample]); + result = @(*(const int16_t *)[self samplePointer:sample]); break; case sizeof(int32_t): - result = @(*(int32_t *)[self samplePointer:sample]); + result = @(*(const int32_t *)[self samplePointer:sample]); break; case sizeof(int64_t): - result = @(*(int64_t *)[self samplePointer:sample]); + result = @(*(const int64_t *)[self samplePointer:sample]); break; } break; @@ -628,19 +635,19 @@ case sizeof(int64_t): case CPTUnsignedIntegerDataType: switch ( self.sampleBytes ) { case sizeof(uint8_t): - result = @(*(uint8_t *)[self samplePointer:sample]); + result = @(*(const uint8_t *)[self samplePointer:sample]); break; case sizeof(uint16_t): - result = @(*(uint16_t *)[self samplePointer:sample]); + result = @(*(const uint16_t *)[self samplePointer:sample]); break; case sizeof(uint32_t): - result = @(*(uint32_t *)[self samplePointer:sample]); + result = @(*(const uint32_t *)[self samplePointer:sample]); break; case sizeof(uint64_t): - result = @(*(uint64_t *)[self samplePointer:sample]); + result = @(*(const uint64_t *)[self samplePointer:sample]); break; } break; @@ -648,11 +655,11 @@ case sizeof(uint64_t): case CPTFloatingPointDataType: switch ( self.sampleBytes ) { case sizeof(float): - result = @(*(float *)[self samplePointer:sample]); + result = @(*(const float *)[self samplePointer:sample]); break; case sizeof(double): - result = @(*(double *)[self samplePointer:sample]); + result = @(*(const double *)[self samplePointer:sample]); break; } break; @@ -660,11 +667,11 @@ case sizeof(double): case CPTComplexFloatingPointDataType: switch ( self.sampleBytes ) { case sizeof(float complex): - result = @( crealf(*(float complex *)[self samplePointer:sample]) ); + result = @( crealf(*(const float complex *)[self samplePointer:sample]) ); break; case sizeof(double complex): - result = @( creal(*(double complex *)[self samplePointer:sample]) ); + result = @( creal(*(const double complex *)[self samplePointer:sample]) ); break; } break; @@ -672,7 +679,7 @@ case sizeof(double complex): case CPTDecimalDataType: switch ( self.sampleBytes ) { case sizeof(NSDecimal): - result = [NSDecimalNumber decimalNumberWithDecimal:*(NSDecimal *)[self samplePointer:sample]]; + result = [NSDecimalNumber decimalNumberWithDecimal:*(const NSDecimal *)[self samplePointer:sample]]; break; } break; @@ -716,10 +723,10 @@ -(NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ... * @param sample The zero-based index into the sample array. The array is treated as if it only has one dimension. * @return A pointer to the sample or @NULL if the sample index is out of bounds. **/ --(void *)samplePointer:(NSUInteger)sample +-(const void *)samplePointer:(NSUInteger)sample { if ( sample < self.numberOfSamples ) { - return (void *)( (char *)self.bytes + sample * self.sampleBytes ); + return (const void *)( (const char *)self.bytes + sample * self.sampleBytes ); } else { return NULL; @@ -731,7 +738,7 @@ -(void *)samplePointer:(NSUInteger)sample * (including @par{index}) should match the @ref numberOfDimensions. * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. **/ --(void *)samplePointerAtIndex:(NSUInteger)idx, ... +-(const void *)samplePointerAtIndex:(NSUInteger)idx, ... { NSUInteger newIndex; @@ -762,7 +769,10 @@ -(NSArray *)sampleArray NSMutableArray *samples = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSUInteger i = 0; i < sampleCount; i++ ) { - [samples addObject:[self sampleValue:i]]; + NSNumber *sampleValue = [self sampleValue:i]; + if ( sampleValue ) { + [samples addObject:sampleValue]; + } } NSArray *result = [NSArray arrayWithArray:samples]; diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 014a0658f..c0eaeb007 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -7,9 +7,10 @@ @implementation CPTNumericDataTests -(void)testNilShapeGivesSingleDimension { - CPTNumericData *nd = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:1 * sizeof(float)] - dataTypeString:@"=f4" - shape:nil]; + NSMutableData *data = [NSMutableData dataWithLength:1 * sizeof(float)]; + CPTNumericData *nd = [[CPTNumericData alloc] initWithData:data + dataTypeString:@"=f4" + shape:nil]; NSUInteger actual = nd.numberOfDimensions; NSUInteger expected = 1; @@ -24,9 +25,10 @@ -(void)testNumberOfDimensionsGivesShapeCount NSUInteger nElems = 2 * 2 * 2; - CPTNumericData *nd = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(float)] - dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) - shape:shape]; + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; + CPTNumericData *nd = [[CPTNumericData alloc] initWithData:data + dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) + shape:shape]; XCTAssertEqual(nd.numberOfDimensions, nd.shape.count, @"numberOfDimensions == shape.count == 3"); } @@ -35,9 +37,10 @@ -(void)testNilShapeCorrectElementCount { NSUInteger nElems = 13; - CPTNumericData *nd = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(float)] - dataTypeString:@"=f4" - shape:nil]; + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; + CPTNumericData *nd = [[CPTNumericData alloc] initWithData:data + dataTypeString:@"=f4" + shape:nil]; XCTAssertEqual(nd.numberOfDimensions, (NSUInteger)1, @"numberOfDimensions == 1"); @@ -57,7 +60,9 @@ -(void)testIllegalShapeRaisesException CPTNumericData *testData = nil; - XCTAssertThrowsSpecificNamed(testData = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:nElems * sizeof(NSUInteger)] + NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(NSUInteger)]; + + XCTAssertThrowsSpecificNamed(testData = [[CPTNumericData alloc] initWithData:data dataType:CPTDataType( CPTUnsignedIntegerDataType, sizeof(NSUInteger), NSHostByteOrder() ) shape:shape], NSException, @@ -67,9 +72,10 @@ -(void)testIllegalShapeRaisesException -(void)testReturnsDataLength { - CPTNumericData *nd = [[CPTNumericData alloc] initWithData:[NSMutableData dataWithLength:10 * sizeof(float)] - dataTypeString:@"=f4" - shape:nil]; + NSMutableData *data = [NSMutableData dataWithLength:10 * sizeof(float)]; + CPTNumericData *nd = [[CPTNumericData alloc] initWithData:data + dataTypeString:@"=f4" + shape:nil]; NSUInteger expected = 10 * sizeof(float); NSUInteger actual = [nd.data length]; @@ -237,9 +243,9 @@ -(void)testSamplePointerCorrect dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - XCTAssertEqual( ( (float *)[fd.data bytes] ) + 4, (float *)[fd samplePointer:4], @"%p,%p", samples + 4, (float *)[fd samplePointer:4] ); - XCTAssertEqual( ( (float *)[fd.data bytes] ), (float *)[fd samplePointer:0], @"" ); - XCTAssertEqual( ( (float *)[fd.data bytes] ) + nElems - 1, (float *)[fd samplePointer:nElems - 1], @"" ); + XCTAssertEqual( ( (const float *)[fd.data bytes] ) + 4, (const float *)[fd samplePointer:4], @"%p,%p", samples + 4, (const float *)[fd samplePointer:4] ); + XCTAssertEqual( ( (const float *)[fd.data bytes] ), (const float *)[fd samplePointer:0], @"" ); + XCTAssertEqual( ( (const float *)[fd.data bytes] ) + nElems - 1, (const float *)[fd samplePointer:nElems - 1], @"" ); XCTAssertNil([fd samplePointer:nElems], @"too many samples"); } diff --git a/framework/Source/CPTNumericDataType.m b/framework/Source/CPTNumericDataType.m index 8f8f98bd0..4ea9e4171 100644 --- a/framework/Source/CPTNumericDataType.m +++ b/framework/Source/CPTNumericDataType.m @@ -197,7 +197,10 @@ CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString) { CPTDataTypeFormat result = CPTUndefinedDataType; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); +#pragma clang diagnostic pop switch ( [[dataTypeString lowercaseString] characterAtIndex:1] ) { case 'f': @@ -230,16 +233,23 @@ CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString) size_t SampleBytesForDataTypeString(NSString *dataTypeString) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); NSInteger result = [[dataTypeString substringFromIndex:2] integerValue]; NSCAssert(result > 0, @"sample bytes is negative."); +#pragma clang diagnostic pop return (size_t)result; } CFByteOrder ByteOrderForDataTypeString(NSString *dataTypeString) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); +#pragma clang diagnostic pop + CFByteOrder result = CFByteOrderUnknown; switch ( [[dataTypeString lowercaseString] characterAtIndex:0] ) { diff --git a/framework/Source/CPTPathExtensions.m b/framework/Source/CPTPathExtensions.m index a5d356896..a18df58e2 100644 --- a/framework/Source/CPTPathExtensions.m +++ b/framework/Source/CPTPathExtensions.m @@ -16,6 +16,8 @@ CGPathRef CreateRoundedRectPath(CGRect rect, CGFloat cornerRadius) // CGPathCreateWithRoundedRect() is available in Mac OS X 10.9 and iOS 7 but not marked in the header file #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunreachable-code" +#pragma clang diagnostic ignored "-Wpointer-bool-conversion" + if ( CGPathCreateWithRoundedRect ) { return CGPathCreateWithRoundedRect(rect, cornerRadius, cornerRadius, NULL); } diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index e669eae72..1ebad977d 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -243,7 +243,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /// @name Data Source /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak id dataSource; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak id dataSource; /// @} /// @name Identification diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index e23848a98..85c55ad08 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -104,7 +104,7 @@ @implementation CPTPlot @dynamic dataLabels; -/** @property __cpt_weak id dataSource +/** @property cpt_weak id dataSource * @brief The data source for the plot. **/ @synthesize dataSource; @@ -590,7 +590,7 @@ -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRec [(NSMutableData *)numericData.data increaseLengthBy : length]; - int8_t *start = [numericData samplePointer:idx]; + int8_t *start = [numericData mutableSamplePointer:idx]; size_t bytesToMove = numericData.data.length - (idx + numberOfRecords) * sampleSize; if ( bytesToMove > 0 ) { memmove(start + length, start, bytesToMove); @@ -622,7 +622,7 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange if ( [data isKindOfClass:numericClass] ) { CPTMutableNumericData *numericData = (CPTMutableNumericData *)data; size_t sampleSize = numericData.sampleBytes; - int8_t *start = [numericData samplePointer:indexRange.location]; + int8_t *start = [numericData mutableSamplePointer:indexRange.location]; size_t length = sampleSize * indexRange.length; size_t bytesToMove = numericData.data.length - (indexRange.location + indexRange.length) * sampleSize; if ( bytesToMove > 0 ) { @@ -746,7 +746,13 @@ -(id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRan memcpy(fieldValues, doubleValues, sizeof(double) * indexRange.length); } else if ( [theDataSource respondsToSelector:@selector(numbersForPlot:field:recordIndexRange:)] ) { - numbers = [NSArray arrayWithArray:[theDataSource numbersForPlot:self field:fieldEnum recordIndexRange:indexRange]]; + NSArray *numberArray = [theDataSource numbersForPlot:self field:fieldEnum recordIndexRange:indexRange]; + if ( numberArray ) { + numbers = [NSArray arrayWithArray:numberArray]; + } + else { + numbers = nil; + } } else if ( [theDataSource respondsToSelector:@selector(doubleForPlot:field:recordIndex:)] ) { NSUInteger recordIndex; @@ -806,101 +812,103 @@ -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRan const NSUInteger sampleCount = data.numberOfSamples; CPTNumericDataType dataType = data.dataType; - NSArray *theShape = data.shape; - const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; - const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; + if ( (sampleCount > 0) && (data.numberOfDimensions == 2) ) { + NSArray *theShape = data.shape; + const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; + const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; - if ( (sampleCount > 0) && (fieldCount > 0) && (data.numberOfDimensions == 2) ) { - // convert data type if needed - switch ( self.cachePrecision ) { - case CPTPlotCachePrecisionAuto: - if ( self.doublePrecisionCache ) { - if ( !CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { - CPTMutableNumericData *mutableData = [data mutableCopy]; - mutableData.dataType = self.doubleDataType; - data = mutableData; + if ( fieldCount > 0 ) { + // convert data type if needed + switch ( self.cachePrecision ) { + case CPTPlotCachePrecisionAuto: + if ( self.doublePrecisionCache ) { + if ( !CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { + CPTMutableNumericData *mutableData = [data mutableCopy]; + mutableData.dataType = self.doubleDataType; + data = mutableData; + } } - } - else { + else { + if ( !CPTDataTypeEqualToDataType(dataType, self.decimalDataType) ) { + CPTMutableNumericData *mutableData = [data mutableCopy]; + mutableData.dataType = self.decimalDataType; + data = mutableData; + } + } + break; + + case CPTPlotCachePrecisionDecimal: if ( !CPTDataTypeEqualToDataType(dataType, self.decimalDataType) ) { CPTMutableNumericData *mutableData = [data mutableCopy]; mutableData.dataType = self.decimalDataType; data = mutableData; } - } - break; - - case CPTPlotCachePrecisionDecimal: - if ( !CPTDataTypeEqualToDataType(dataType, self.decimalDataType) ) { - CPTMutableNumericData *mutableData = [data mutableCopy]; - mutableData.dataType = self.decimalDataType; - data = mutableData; - } - break; + break; - case CPTPlotCachePrecisionDouble: - if ( !CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { - CPTMutableNumericData *mutableData = [data mutableCopy]; - mutableData.dataType = self.doubleDataType; - data = mutableData; - } - break; - } + case CPTPlotCachePrecisionDouble: + if ( !CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { + CPTMutableNumericData *mutableData = [data mutableCopy]; + mutableData.dataType = self.doubleDataType; + data = mutableData; + } + break; + } - // add the data to the cache - const NSUInteger bufferLength = rowCount * dataType.sampleBytes; + // add the data to the cache + const NSUInteger bufferLength = rowCount * dataType.sampleBytes; - switch ( data.dataOrder ) { - case CPTDataOrderRowsFirst: - { - const void *sourceEnd = (const int8_t *)(data.bytes) + data.length; + switch ( data.dataOrder ) { + case CPTDataOrderRowsFirst: + { + const void *sourceEnd = (const int8_t *)(data.bytes) + data.length; - for ( NSUInteger fieldNum = 0; fieldNum < fieldCount; fieldNum++ ) { - NSMutableData *tempData = [[NSMutableData alloc] initWithLength:bufferLength]; + for ( NSUInteger fieldNum = 0; fieldNum < fieldCount; fieldNum++ ) { + NSMutableData *tempData = [[NSMutableData alloc] initWithLength:bufferLength]; - if ( CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { - double *sourceData = [data samplePointerAtIndex:0, fieldNum]; - double *destData = tempData.mutableBytes; + if ( CPTDataTypeEqualToDataType(dataType, self.doubleDataType) ) { + const double *sourceData = [data samplePointerAtIndex:0, fieldNum]; + double *destData = tempData.mutableBytes; - while ( sourceData < (double *)sourceEnd ) { - *destData++ = *sourceData; - sourceData += fieldCount; + while ( sourceData < (const double *)sourceEnd ) { + *destData++ = *sourceData; + sourceData += fieldCount; + } } - } - else { - NSDecimal *sourceData = [data samplePointerAtIndex:0, fieldNum]; - NSDecimal *destData = tempData.mutableBytes; - - while ( sourceData < (NSDecimal *)sourceEnd ) { - *destData++ = *sourceData; - sourceData += fieldCount; + else { + const NSDecimal *sourceData = [data samplePointerAtIndex:0, fieldNum]; + NSDecimal *destData = tempData.mutableBytes; + + while ( sourceData < (const NSDecimal *)sourceEnd ) { + *destData++ = *sourceData; + sourceData += fieldCount; + } } - } - CPTMutableNumericData *tempNumericData = [[CPTMutableNumericData alloc] initWithData:tempData - dataType:dataType - shape:nil]; + CPTMutableNumericData *tempNumericData = [[CPTMutableNumericData alloc] initWithData:tempData + dataType:dataType + shape:nil]; - [self cacheNumbers:tempNumericData forField:fieldNum atRecordIndex:indexRange.location]; + [self cacheNumbers:tempNumericData forField:fieldNum atRecordIndex:indexRange.location]; + } + hasData = YES; } - hasData = YES; - } - break; + break; - case CPTDataOrderColumnsFirst: - for ( NSUInteger fieldNum = 0; fieldNum < fieldCount; fieldNum++ ) { - NSData *tempData = [[NSData alloc] initWithBytesNoCopy:[data samplePointerAtIndex:0, fieldNum] - length:bufferLength - freeWhenDone:NO]; + case CPTDataOrderColumnsFirst: + for ( NSUInteger fieldNum = 0; fieldNum < fieldCount; fieldNum++ ) { + const void *samples = [data samplePointerAtIndex:0, fieldNum]; + NSData *tempData = [[NSData alloc] initWithBytes:samples + length:bufferLength]; - CPTMutableNumericData *tempNumericData = [[CPTMutableNumericData alloc] initWithData:tempData - dataType:dataType - shape:nil]; + CPTMutableNumericData *tempNumericData = [[CPTMutableNumericData alloc] initWithData:tempData + dataType:dataType + shape:nil]; - [self cacheNumbers:tempNumericData forField:fieldNum atRecordIndex:indexRange.location]; - } - hasData = YES; - break; + [self cacheNumbers:tempNumericData forField:fieldNum atRecordIndex:indexRange.location]; + } + hasData = YES; + break; + } } } } @@ -1218,7 +1226,7 @@ -(double)cachedDoubleForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx switch ( numbers.dataTypeFormat ) { case CPTFloatingPointDataType: { - double *doubleNumber = (double *)[numbers samplePointer:idx]; + const double *doubleNumber = (const double *)[numbers samplePointer:idx]; if ( doubleNumber ) { return *doubleNumber; } @@ -1227,7 +1235,7 @@ -(double)cachedDoubleForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx case CPTDecimalDataType: { - NSDecimal *decimalNumber = (NSDecimal *)[numbers samplePointer:idx]; + const NSDecimal *decimalNumber = (const NSDecimal *)[numbers samplePointer:idx]; if ( decimalNumber ) { return CPTDecimalDoubleValue(*decimalNumber); } @@ -1255,7 +1263,7 @@ -(NSDecimal)cachedDecimalForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger) switch ( numbers.dataTypeFormat ) { case CPTFloatingPointDataType: { - double *doubleNumber = (double *)[numbers samplePointer:idx]; + const double *doubleNumber = (const double *)[numbers samplePointer:idx]; if ( doubleNumber ) { return CPTDecimalFromDouble(*doubleNumber); } @@ -1264,7 +1272,7 @@ -(NSDecimal)cachedDecimalForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger) case CPTDecimalDataType: { - NSDecimal *decimalNumber = (NSDecimal *)[numbers samplePointer:idx]; + const NSDecimal *decimalNumber = (const NSDecimal *)[numbers samplePointer:idx]; if ( decimalNumber ) { return *decimalNumber; } @@ -1410,7 +1418,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum NSUInteger numberOfSamples = numbers.numberOfSamples; if ( numberOfSamples > 0 ) { if ( self.doublePrecisionCache ) { - double *doubles = (double *)numbers.bytes; + const double *doubles = (const double *)numbers.bytes; double min = INFINITY; double max = -INFINITY; diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 447a5b3bb..dfd2c16f1 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -797,10 +797,10 @@ -(void)setMinorGridLineGroup:(CPTGridLineGroup *)newGridLines if ( (newGridLines != minorGridLineGroup) || self.isUpdatingLayers ) { [minorGridLineGroup removeFromSuperlayer]; minorGridLineGroup = newGridLines; - if ( minorGridLineGroup ) { - minorGridLineGroup.plotArea = self; - minorGridLineGroup.major = NO; - [self insertSublayer:minorGridLineGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeMinorGridLines]]; + if ( newGridLines ) { + newGridLines.plotArea = self; + newGridLines.major = NO; + [self insertSublayer:newGridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMinorGridLines]]; } [self setNeedsLayout]; } @@ -811,10 +811,10 @@ -(void)setMajorGridLineGroup:(CPTGridLineGroup *)newGridLines if ( (newGridLines != majorGridLineGroup) || self.isUpdatingLayers ) { [majorGridLineGroup removeFromSuperlayer]; majorGridLineGroup = newGridLines; - if ( majorGridLineGroup ) { - majorGridLineGroup.plotArea = self; - majorGridLineGroup.major = YES; - [self insertSublayer:majorGridLineGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeMajorGridLines]]; + if ( newGridLines ) { + newGridLines.plotArea = self; + newGridLines.major = YES; + [self insertSublayer:newGridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMajorGridLines]]; } [self setNeedsLayout]; } @@ -834,10 +834,10 @@ -(void)setAxisSet:(CPTAxisSet *)newAxisSet [self updateAxisSetLayersForType:CPTGraphLayerTypeAxisLabels]; [self updateAxisSetLayersForType:CPTGraphLayerTypeAxisTitles]; - if ( axisSet ) { + if ( newAxisSet ) { CPTGraph *theGraph = self.graph; - [self insertSublayer:axisSet atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLines]]; - for ( CPTAxis *axis in axisSet.axes ) { + [self insertSublayer:newAxisSet atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLines]]; + for ( CPTAxis *axis in newAxisSet.axes ) { axis.plotArea = self; axis.graph = theGraph; } @@ -851,8 +851,8 @@ -(void)setPlotGroup:(CPTPlotGroup *)newPlotGroup if ( (newPlotGroup != plotGroup) || self.isUpdatingLayers ) { [plotGroup removeFromSuperlayer]; plotGroup = newPlotGroup; - if ( plotGroup ) { - [self insertSublayer:plotGroup atIndex:[self indexForLayerType:CPTGraphLayerTypePlots]]; + if ( newPlotGroup ) { + [self insertSublayer:newPlotGroup atIndex:[self indexForLayerType:CPTGraphLayerTypePlots]]; } [self setNeedsLayout]; } @@ -863,8 +863,8 @@ -(void)setAxisLabelGroup:(CPTAxisLabelGroup *)newAxisLabelGroup if ( (newAxisLabelGroup != axisLabelGroup) || self.isUpdatingLayers ) { [axisLabelGroup removeFromSuperlayer]; axisLabelGroup = newAxisLabelGroup; - if ( axisLabelGroup ) { - [self insertSublayer:axisLabelGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLabels]]; + if ( newAxisLabelGroup ) { + [self insertSublayer:newAxisLabelGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLabels]]; } [self setNeedsLayout]; } @@ -875,8 +875,8 @@ -(void)setAxisTitleGroup:(CPTAxisLabelGroup *)newAxisTitleGroup if ( (newAxisTitleGroup != axisTitleGroup) || self.isUpdatingLayers ) { [axisTitleGroup removeFromSuperlayer]; axisTitleGroup = newAxisTitleGroup; - if ( axisTitleGroup ) { - [self insertSublayer:axisTitleGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisTitles]]; + if ( newAxisTitleGroup ) { + [self insertSublayer:newAxisTitleGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisTitles]]; } [self setNeedsLayout]; } diff --git a/framework/Source/CPTPlotAreaFrame.m b/framework/Source/CPTPlotAreaFrame.m index abd52816a..9102b3392 100644 --- a/framework/Source/CPTPlotAreaFrame.m +++ b/framework/Source/CPTPlotAreaFrame.m @@ -200,10 +200,12 @@ -(void)setPlotArea:(CPTPlotArea *)newPlotArea if ( newPlotArea != plotArea ) { [plotArea removeFromSuperlayer]; plotArea = newPlotArea; - if ( plotArea ) { - [self insertSublayer:plotArea atIndex:0]; - plotArea.graph = self.graph; + + if ( newPlotArea ) { + [self insertSublayer:newPlotArea atIndex:0]; + newPlotArea.graph = self.graph; } + [self setNeedsLayout]; } } diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 8b054dacc..d749bad3b 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -159,8 +159,8 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; @property (nonatomic, readwrite, copy, nullable) id identifier; @property (nonatomic, readwrite) BOOL allowsUserInteraction; @property (nonatomic, readonly) BOOL isDragging; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak CPTGraph *graph; -@property (nonatomic, readwrite, cpt_weak_property, nullable) __cpt_weak id delegate; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak id delegate; @property (nonatomic, readonly) NSUInteger numberOfCoordinates; diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index e6f83565e..32273efdd 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -49,12 +49,12 @@ @implementation CPTPlotSpace **/ @synthesize isDragging; -/** @property __cpt_weak CPTGraph *graph +/** @property cpt_weak CPTGraph *graph * @brief The graph of the space. **/ @synthesize graph; -/** @property __cpt_weak id delegate +/** @property cpt_weak id delegate * @brief The plot space delegate. **/ @synthesize delegate; diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 11e6db10f..0517f0cc1 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -112,9 +112,13 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super initWithCoder:coder]) ) { + if ( (self = [super init]) ) { anchorPlotPoint = [[coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.anchorPlotPoint"] copy]; - plotSpace = [coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.plotSpace"]; + + CPTPlotSpace *thePlotSpace = [coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.plotSpace"]; + if ( thePlotSpace ) { + plotSpace = thePlotSpace; + } } return self; } diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index e676008b7..516346a7b 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -489,7 +489,8 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl CGLayerRef newLayer = CGLayerCreateWithContext(context, layerSize, NULL); - [self renderAsVectorInContext:CGLayerGetContext(newLayer) + CGContextRef layerContext = CGLayerGetContext(newLayer); + [self renderAsVectorInContext:layerContext atPoint:CPTPointMake( layerSize.width * CPTFloat(0.5), layerSize.height * CPTFloat(0.5) ) scale:scale]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 681c607d5..0cb830a15 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1814,7 +1814,13 @@ -(NSArray *)areaFillBands -(void)setAreaBaseValue:(NSNumber *)newAreaBaseValue { - if ( ![newAreaBaseValue isEqualToNumber:areaBaseValue] ) { + BOOL needsUpdate = YES; + + if ( newAreaBaseValue ) { + needsUpdate = ![areaBaseValue isEqualToNumber:newAreaBaseValue]; + } + + if ( needsUpdate ) { areaBaseValue = newAreaBaseValue; [self setNeedsDisplay]; [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; @@ -1823,7 +1829,13 @@ -(void)setAreaBaseValue:(NSNumber *)newAreaBaseValue -(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue { - if ( ![newAreaBaseValue isEqualToNumber:areaBaseValue2] ) { + BOOL needsUpdate = YES; + + if ( newAreaBaseValue ) { + needsUpdate = ![areaBaseValue2 isEqualToNumber:newAreaBaseValue]; + } + + if ( needsUpdate ) { areaBaseValue2 = newAreaBaseValue; [self setNeedsDisplay]; [[NSNotificationCenter defaultCenter] postNotificationName:CPTLegendNeedsRedrawForPlotNotification object:self]; diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index ba3111103..1a735d426 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -56,7 +56,11 @@ -(instancetype)init -(void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:[[self class] name] forKey:@"CPTTheme.name"]; - [coder encodeObject:NSStringFromClass(self.graphClass) forKey:@"CPTTheme.graphClass"]; + + Class theGraphClass = self.graphClass; + if ( theGraphClass ) { + [coder encodeObject:NSStringFromClass(theGraphClass) forKey:@"CPTTheme.graphClass"]; + } } -(instancetype)initWithCoder:(NSCoder *)coder @@ -64,7 +68,10 @@ -(instancetype)initWithCoder:(NSCoder *)coder self = [CPTTheme themeNamed:[coder decodeObjectForKey:@"CPTTheme.name"]]; if ( self ) { - self.graphClass = NSClassFromString([coder decodeObjectForKey:@"CPTTheme.graphClass"]); + NSString *className = [coder decodeObjectForKey:@"CPTTheme.graphClass"]; + if ( className ) { + self.graphClass = NSClassFromString(className); + } } return self; } diff --git a/framework/Source/CPTTimeFormatter.m b/framework/Source/CPTTimeFormatter.m index 54ac80b1e..bfa12b728 100644 --- a/framework/Source/CPTTimeFormatter.m +++ b/framework/Source/CPTTimeFormatter.m @@ -77,7 +77,7 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super initWithCoder:coder]) ) { + if ( (self = [super init]) ) { dateFormatter = [coder decodeObjectForKey:@"CPTTimeFormatter.dateFormatter"]; referenceDate = [[coder decodeObjectForKey:@"CPTTimeFormatter.referenceDate"] copy]; } @@ -122,9 +122,10 @@ -(NSString *)stringForObjectValue:(id)coordinateValue if ( [coordinateValue respondsToSelector:@selector(doubleValue)] ) { NSDate *date; + NSDate *refDate = self.referenceDate; - if ( self.referenceDate ) { - date = [[NSDate alloc] initWithTimeInterval:[coordinateValue doubleValue] sinceDate:self.referenceDate]; + if ( refDate ) { + date = [[NSDate alloc] initWithTimeInterval:[coordinateValue doubleValue] sinceDate:refDate]; } else { date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:[coordinateValue doubleValue]]; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 9c3429a5c..3bccee101 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -748,7 +748,13 @@ -(void)setAxisConstraints:(CPTConstraints *)newConstraints -(void)setOrthogonalPosition:(NSNumber *)newPosition { - if ( ![newPosition isEqualToNumber:orthogonalPosition] ) { + BOOL needsUpdate = YES; + + if ( newPosition ) { + needsUpdate = ![orthogonalPosition isEqualToNumber:newPosition]; + } + + if ( needsUpdate ) { orthogonalPosition = newPosition; [self setNeedsDisplay]; [self setNeedsLayout]; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index cced59454..9494861ee 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -251,8 +251,14 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - xRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.xRange"] copy]; - yRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.yRange"] copy]; + CPTPlotRange *range = [coder decodeObjectForKey:@"CPTXYPlotSpace.xRange"]; + if ( range ) { + xRange = [range copy]; + } + range = [coder decodeObjectForKey:@"CPTXYPlotSpace.yRange"]; + if ( range ) { + yRange = [range copy]; + } globalXRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalXRange"] copy]; globalYRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalYRange"] copy]; xScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.xScaleType"]; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index f91fe1ba8..603568cc2 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -9,7 +9,7 @@ /// @cond @interface CPTGraphHostingView() -@property (nonatomic, readwrite, cpt_weak_property) __cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; +@property (nonatomic, readwrite, cpt_weak_property) cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; -(void)graphNeedsRedraw:(NSNotification *)notification; -(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer; @@ -45,7 +45,7 @@ @implementation CPTGraphHostingView /// @cond /** @internal - * @property __cpt_weak id pinchGestureRecognizer + * @property cpt_weak id pinchGestureRecognizer * @brief The pinch gesture recognizer for this view. **/ @synthesize pinchGestureRecognizer; @@ -334,9 +334,9 @@ -(void)setHostedGraph:(CPTGraph *)newLayer } } else { - if ( hostedGraph ) { - hostedGraph.frame = self.layer.bounds; - [self.layer addSublayer:hostedGraph]; + if ( newLayer ) { + newLayer.frame = self.layer.bounds; + [self.layer addSublayer:newLayer]; } } } diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index a12d0b6eb..cac150a94 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -72,7 +72,12 @@ -(NSDictionary *)attributes NSMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; // Font - UIFont *styleFont = [UIFont fontWithName:self.fontName size:self.fontSize]; + UIFont *styleFont = nil; + NSString *fontName = self.fontName; + + if ( fontName ) { + styleFont = [UIFont fontWithName:fontName size:self.fontSize]; + } if ( styleFont ) { [myAttributes setValue:styleFont @@ -168,7 +173,12 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style textSize.height = ceil(textSize.height); } else { - UIFont *theFont = [UIFont fontWithName:style.fontName size:style.fontSize]; + UIFont *theFont = nil; + NSString *fontName = style.fontName; + + if ( fontName ) { + theFont = [UIFont fontWithName:fontName size:style.fontSize]; + } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -213,7 +223,12 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; [styleColor set]; - UIFont *theFont = [UIFont fontWithName:style.fontName size:style.fontSize]; + UIFont *theFont = nil; + NSString *fontName = style.fontName; + + if ( fontName ) { + theFont = [UIFont fontWithName:fontName size:style.fontSize]; + } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" From 929bb28eb92515ec9000fa5ac7236f440f580500 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 21 Jun 2015 18:47:42 -0400 Subject: [PATCH 047/429] Fixed Xcode warnings for the launch images in the iOS example apps. --- .../LaunchImage.launchimage/Contents.json | 119 ++++++++++++++++-- .../Default-568h@2x.png | Bin 18594 -> 0 bytes .../LaunchImage.launchimage/Contents.json | 119 ++++++++++++++++-- .../Default-568h@2x.png | Bin 18594 -> 0 bytes .../LaunchImage.launchimage/Contents.json | 85 ++++++++++--- .../Default-568h@2x.png | Bin 18594 -> 0 bytes 6 files changed, 290 insertions(+), 33 deletions(-) delete mode 100644 examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png delete mode 100644 examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png delete mode 100644 examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png diff --git a/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Contents.json index f0fce5477..3dd8aa5b6 100644 --- a/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -3,32 +3,135 @@ { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", "minimum-system-version" : "7.0", "subtype" : "retina4", "scale" : "2x" }, { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" + "extent" : "full-screen", + "scale" : "1x" }, { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" + "extent" : "full-screen", + "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", "subtype" : "retina4", "scale" : "2x" }, { "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", "scale" : "2x" } ], diff --git a/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/examples/AAPLot/AAPLot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Contents.json index f0fce5477..3dd8aa5b6 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -3,32 +3,135 @@ { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", "minimum-system-version" : "7.0", "subtype" : "retina4", "scale" : "2x" }, { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" + "extent" : "full-screen", + "scale" : "1x" }, { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" + "extent" : "full-screen", + "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", "subtype" : "retina4", "scale" : "2x" }, { "orientation" : "portrait", - "idiom" : "iphone", - "minimum-system-version" : "7.0", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", "scale" : "2x" } ], diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json index 8b61e901e..3dd8aa5b6 100644 --- a/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -1,32 +1,40 @@ { "images" : [ { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" }, { + "orientation" : "landscape", "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" }, { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", - "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", + "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", "minimum-system-version" : "7.0", "subtype" : "retina4", "scale" : "2x" @@ -34,52 +42,95 @@ { "orientation" : "portrait", "idiom" : "ipad", - "extent" : "to-status-bar", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", - "extent" : "to-status-bar", + "extent" : "full-screen", + "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "subtype" : "retina4", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", "extent" : "to-status-bar", "scale" : "1x" }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "to-status-bar", - "scale" : "2x" + "scale" : "1x" }, { - "orientation" : "portrait", + "orientation" : "landscape", "idiom" : "ipad", - "minimum-system-version" : "7.0", "extent" : "full-screen", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", - "minimum-system-version" : "7.0", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", "extent" : "full-screen", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", - "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" + "extent" : "to-status-bar", + "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", - "minimum-system-version" : "7.0", "extent" : "full-screen", "scale" : "2x" } diff --git a/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u From b770da757c191c01dad21ec71583bf13aa8668a4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 21 Jun 2015 19:18:39 -0400 Subject: [PATCH 048/429] Added an @3x image to the stretchable blue rectangle image in the Plot Gallery example app. --- .../img/BlueBackground.sketch/Data | Bin 9846 -> 13192 bytes .../QuickLook/Preview.png | Bin 2042 -> 7782 bytes .../QuickLook/Thumbnail.png | Bin 39189 -> 153984 bytes .../img/BlueBackground.sketch/metadata | 2 +- .../BlueBackground.png | Bin 2109 -> 2038 bytes .../BlueBackground@2x.png | Bin 3814 -> 3784 bytes .../BlueBackground@3x.png | Bin 0 -> 6363 bytes .../BlueBackground.imageset/Contents.json | 5 +++++ 8 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground@3x.png diff --git a/examples/CorePlotGallery/img/BlueBackground.sketch/Data b/examples/CorePlotGallery/img/BlueBackground.sketch/Data index 15d53a4c6fd8cd74d7801c53e81c0429a7267e28..8d19e2be68787d17ea76c7838fdfc4f572524a19 100644 GIT binary patch delta 8457 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 Rg%CDB>5k3MYky0B_&=3kxH13$ delta 5120 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 diff --git a/examples/CorePlotGallery/img/BlueBackground.sketch/QuickLook/Preview.png b/examples/CorePlotGallery/img/BlueBackground.sketch/QuickLook/Preview.png index 8792a059838937fbf560b595331469833d567d8f..116d5faf6d884a57f501aeee8182d19b97a03927 100644 GIT binary patch literal 7782 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 literal 2042 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
d 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 literal 39189 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 length - 9846 + 13192 version 18 diff --git a/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground.png b/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground.png index 021a54e241c576a44a5b3999d683d4ee108cd260..6183e3d5c6d94f86d138fffcd4a8faf55c8660b7 100644 GIT binary patch delta 2025 zcmV4Tx062|}Ro!pfR1`mnZ(O7nKcKOW z4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj z_Ok5(v`JGz71bo9J#^YYXp{DWs&KBaQ@dTpxRI}aIp=pi?|;!XK*v{_pO}_ARv`(`K_~P;r>1*Ox?C;-F2;pN*27;R!QM9q+Ux&wbylgT10KeMtdQo=mnqksdx=&F5&oys0TJd`E>GI|#kK((J)n0eU)DVBJ zYq?3pFC)I@_!%aD74f~sTqTWoFF^8{ntPr?L_-if$s_=TxZzG%&qCb(^K zdCoqnhMa4x{ z6hi)zV+ON`xsmg3L#>3I8=9NTb3f!hwJM>{)UK+QWxX9ld>D=;G@xL^4DLEuumLit zkcSMu9e;39Qv(A`lu*=Clo*MpVGd>OdF6n^am1Jntk;<}MrqIC5$=Q>n{*R}?8oOI zDUw5En2dl--Xw34!z7E+5pr%d2c?H4INKjdmEV*< zl@;X+<-BrtTbJ8*N%&OwR`^l)PWWE<8D!y-a9Q|CxFUQbT#TL7ym&1JoWQ-+)%LMCuYy_wP6ZWs zL5D3kvu*xEYtl=GNMYO54zpQqF~pph71JP#d&LoPNE~Olm7ll=btAavwoIM=mAd9q7A z>MqdgAh7QszoH+g!S^k(^Lixn-v&7J7v5PnBH45U;A;<{`?W~chj-$$p8;Grpf}uw z@Xk*pegW`m`}gsGT^YQaZZ(?^@V@H!1YqOiX7iurW^?09^uGph$@~{t0C9K{wSVD; z000BQNkl}8G&;^!ZMG4V96qY<1Hkx(DBfr<#ufc=fB&g(9LwFvpzWft9Uu@KzVjA z?m^<@(&pp4zli)kqD}$=$bl0#oYPamYgjmZNc)G^Wo~gvTxZU({AeuWH(T=I{sY^JJ_NM zc>flfw{|dsRNgp^B+KM@ zLW@)G(*{J0k}2kk>&=Vb8Glp!Y;rxs5k!nK*NJmw^yCvT2#6@G$c^{{A_lA@g$nVQ zRm_Wt(~c)j_EW13&}d>?h4z+NPL?bKq8Oio5vhTg4K*dCyEcq6@@rCts8sOdG1TYF9$q>mq%#y>el!p`^XKN1yJto2RR%<1>s|jUKM0Vr zBU&PT9k|uS7fTlbwFmMX<_d%xX`&|)Wa_iVVrIkt{m}Xs1$I~_Zjnyw00000NkvXX Hu0mjfc3t>u delta 2097 zcmV-12+sHR54{kOBYy-WX+uL$Nkc;*P;zf(X>4Tx05}naRo`#hR1`jmZ&IWdKOk5~ zhl<6oRa0BJ8yc;~21%2p?MfD<>DVeH9(p*dx19w`~g7O0}n_%Aq@s% zd)fBDv`JHkDym6Hd+5XuAtvnwRpGmKVkc9?T=n|PIo~$m6N9yl%7qB(zDb{1JtYOPA!qk%@Qub75C2T;T?(y%k7cw{!aEIzj}+@(TO5Y zz-|>CeHr)+QOwk9wo4Sh2mAPGw+7tv9PraN1Olr9mwlWPc+tlvJx(D%369Vz>lLjC zyaqhH*k&)cVSir(7|4_1Rc;%)B4&}Zt&(AK&*3kRaknx54=$T^^z2=OSo@r%xnsBw ziQX&rRKAHn*R}K<@Jp~?uenKKe+BrD`qF#?cpp*psgiwk-seYOU#%402HpjG(Qu~= zP5WwfF?$>svC;J<>zK$RIM;P&60@WifbUlLwAf?lk$1u(mFRYq89Q?S8HyrsX^MVnpsf`{W6(5UXREr zZM&7ilpo6ux^|%%%N9z;(dj0Ct!8>>5!%=VyPg-?ke}Vs>~sbgdDuU^Ixpr19NS&g zQew8Fz<)>RL_{M_7A<1csY*MfP@XcB#Jxr~JS8&7goVS)VKE|4(h_Xlc{z{c$ApZs z7riZ_QKdV_uW-M~u~8PF3UX~a6)MwxDE0Ha zPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiSBY#iOF*IB46Cei@XmvNzKBsGIKkN=X z$_Bgm&h5TyYjpf^^Nrn$ZO1mSZpOC4_}H(pE&Od#0y|)Oik6|u@OHupcq1J>TmjQ1 z4eM{2+Oeah>iL1tBPPK=$Ue-{x#7^N{-XY=Zm3_V7u4T7YJ?d(rX+nTeJlMa zeSar?Fa1o4bXmG0{UlwLzL72kIlJ$@pC#CPuU}yk-HKgk)oY(MCsR(!d*m18l>EH> zvOF8G6uDm>lc(gp@azfp%?$k=y%=-~vuaJXdoA$<7&H$h2Au}i##F_Gt8^Aw+nR z000BjNkl>7CbqjP)qh{_WcK`- zY`=JJss_UKeSm#Muo2N#&VT+PDXq83DN?F5hvLkE0299T^^q@lqA;*wwN^!3;QI_Dp+9D^niARO-U7^YU^k}wUIjWJJWK6(pAb2?Fx)u}kvc}ZRZ1-t z$zyY5E*wF~tk2L_fbM{5Fv@;OC!YaOj`LM|D1D%auCWK~nD@eM?;_iscUJbG?b0zq zvFoO|)D#xl$9Qjs&VPbs(#e5;Sz4g9{V~=jZVkt*88GCSLHOSS3HH&j-JRQfi;P`b zpm~hk>Ay6eahDbdr>6ugz)9+P;&Tqr_iKR^#g2w&T|?3t=)*oT6M}d~^ml22aBQZ% zh(jl9c(6MR@-BHMt{sqIEs!C#p`=}qfbvWR?HJ8{XszO*mVet%Jx_+f{ms%c5-{@o zy_f{^G-wYQam=OQ8~wkqqd=Z75&DHyTL7BCIiEqv zp|Slu8d5UbNe?D50(>_Z6lDvI!wG=AsQWg@c;UfoHEqV^1!W`fgMjbyDBDncn@IZx-+39exF1(-_`kw#GbuvDpa7A4}u4Q;CiLkvQJ601!Cb z!$-uoBEQ!Ohz7uJ@q++8xF`jj#`s!UKru_CyTA)9#wzbcMqp?)QEp_A4?b&B&C=ih b{m}XsOR`T4NJ!9K00000NkvXXu0mjfv!x7m diff --git a/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground@2x.png b/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground@2x.png index ec0eb143251cc50156480b04991619268aafc160..2d1522f3dba8f4f8671c1dc51058b3bc43ef149e 100644 GIT binary patch literal 3784 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 literal 3814 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 diff --git a/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground@3x.png b/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/BlueBackground@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..255633faf3e7a435545653871bb0eca4a556957f GIT binary patch literal 6363 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 literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/Contents.json b/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/Contents.json index fb9e4394a..1bccf4969 100644 --- a/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/Contents.json +++ b/examples/CorePlotGallery/img/Images.xcassets/BlueBackground.imageset/Contents.json @@ -9,6 +9,11 @@ "idiom" : "universal", "scale" : "2x", "filename" : "BlueBackground@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "BlueBackground@3x.png" } ], "info" : { From 0fbbd85de4299a961bad49cbb3120b40fd4917d4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 2 Jul 2015 21:51:09 -0400 Subject: [PATCH 049/429] Updated project files with Xcode 7 settings. --- .../project.pbxproj | 4 +- .../DatePlot.xcodeproj/project.pbxproj | 68 ++++++++++++++++++- .../DropPlot.xcodeproj/project.pbxproj | 63 ++++++++++++++++- .../project.pbxproj | 63 ++++++++++++++++- .../RangePlot.xcodeproj/project.pbxproj | 63 ++++++++++++++++- 5 files changed, 254 insertions(+), 7 deletions(-) diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 560a5af45..30e248d7c 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -231,7 +231,8 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0500; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPhone" */; compatibilityVersion = "Xcode 3.2"; @@ -400,6 +401,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index 6f964037f..fce235d8d 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -40,6 +40,34 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C3F04DB71B44CCFD0002322A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3F04DB91B44CCFD0002322A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3F04DBB1B44CCFD0002322A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3F04DBD1B44CCFD0002322A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -95,6 +123,10 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, + C3F04DB81B44CCFD0002322A /* CorePlot_iOS.framework */, + C3F04DBA1B44CCFD0002322A /* CorePlot_iOSTests.xctest */, + C3F04DBC1B44CCFD0002322A /* libCorePlot-CocoaTouch.a */, + C3F04DBE1B44CCFD0002322A /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -212,7 +244,8 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = NO; - LastUpgradeCheck = 0600; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DatePlot" */; compatibilityVersion = "Xcode 3.2"; @@ -254,6 +287,34 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3F04DB81B44CCFD0002322A /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3F04DB71B44CCFD0002322A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3F04DBA1B44CCFD0002322A /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3F04DB91B44CCFD0002322A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3F04DBC1B44CCFD0002322A /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3F04DBB1B44CCFD0002322A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3F04DBE1B44CCFD0002322A /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3F04DBD1B44CCFD0002322A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -305,8 +366,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ENABLE_MODULES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; @@ -332,8 +393,8 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ENABLE_MODULES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -354,6 +415,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 3d3b1ab9b..9208b42e5 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -43,6 +43,34 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C3B345A71B46194500844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3B345A91B46194500844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3B345AB1B46194500844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3B345AD1B46194500844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -187,6 +215,10 @@ children = ( BC93AA970FDEFEAC00606226 /* CorePlot.framework */, 07E0DFAC109C4EB500F108D2 /* UnitTests.xctest */, + C3B345A81B46194500844218 /* CorePlot_iOS.framework */, + C3B345AA1B46194500844218 /* CorePlot_iOSTests.xctest */, + C3B345AC1B46194500844218 /* libCorePlot-CocoaTouch.a */, + C3B345AE1B46194500844218 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -220,7 +252,7 @@ 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0600; + LastUpgradeCheck = 0700; }; buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "DropPlot" */; compatibilityVersion = "Xcode 3.2"; @@ -262,6 +294,34 @@ remoteRef = BC93AA960FDEFEAC00606226 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3B345A81B46194500844218 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3B345A71B46194500844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345AA1B46194500844218 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3B345A91B46194500844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345AC1B46194500844218 /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3B345AB1B46194500844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345AE1B46194500844218 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3B345AD1B46194500844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -384,6 +444,7 @@ baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../framework/build/$(CONFIGURATION)\"/**"; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index 3e9dc4ff9..9615b2e46 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -40,6 +40,34 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C3B345B71B46195100844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3B345B91B46195100844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3B345BB1B46195100844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3B345BD1B46195100844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -96,6 +124,10 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, + C3B345B81B46195100844218 /* CorePlot_iOS.framework */, + C3B345BA1B46195100844218 /* CorePlot_iOSTests.xctest */, + C3B345BC1B46195100844218 /* libCorePlot-CocoaTouch.a */, + C3B345BE1B46195100844218 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -214,7 +246,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = NO; - LastUpgradeCheck = 0600; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "minorTickFormatter" */; compatibilityVersion = "Xcode 3.2"; @@ -256,6 +288,34 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3B345B81B46195100844218 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3B345B71B46195100844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345BA1B46195100844218 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3B345B91B46195100844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345BC1B46195100844218 /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3B345BB1B46195100844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345BE1B46195100844218 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3B345BD1B46195100844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -351,6 +411,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index fc7023617..44c7e7c37 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -41,6 +41,34 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C3B345C71B46195900844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = CorePlot_iOS; + }; + C3B345C91B46195900844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = CorePlot_iOSTests; + }; + C3B345CB1B46195900844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C3B345CD1B46195900844218 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -98,6 +126,10 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, + C3B345C81B46195900844218 /* CorePlot_iOS.framework */, + C3B345CA1B46195900844218 /* CorePlot_iOSTests.xctest */, + C3B345CC1B46195900844218 /* libCorePlot-CocoaTouch.a */, + C3B345CE1B46195900844218 /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -216,7 +248,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = NO; - LastUpgradeCheck = 0600; + LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "RangePlot" */; compatibilityVersion = "Xcode 3.2"; @@ -258,6 +290,34 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3B345C81B46195900844218 /* CorePlot_iOS.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot_iOS.framework; + remoteRef = C3B345C71B46195900844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345CA1B46195900844218 /* CorePlot_iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = CorePlot_iOSTests.xctest; + remoteRef = C3B345C91B46195900844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345CC1B46195900844218 /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C3B345CB1B46195900844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3B345CE1B46195900844218 /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C3B345CD1B46195900844218 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -353,6 +413,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { + ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; From e24d98d0d759ac8a4a00abb9f6904e47450d96af Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 4 Jul 2015 14:20:17 -0400 Subject: [PATCH 050/429] Renamed the iOS framework to "CorePlot" to match the Mac framework. --- .../project.pbxproj | 10 +-- .../src/ios/ThemeTableViewController.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.h | 4 +- framework/CorePlot.h | 71 +------------------ framework/CorePlot.xcodeproj/project.pbxproj | 64 ++++++++--------- 5 files changed, 43 insertions(+), 108 deletions(-) diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index 8e9ffd732..cbd9b7032 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -42,8 +42,8 @@ C3AC1411150EDEF300631001 /* CurvedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */; }; C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD282917DE9A7E008EED1E /* Accelerate.framework */; }; C3D2FE6919FF1D3E002CD4D6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */; }; - C3D4145F1A7D817B00B6F5D6 /* CorePlot_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */; }; C3D70BAC175EB30800F27173 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BAB175EB30800F27173 /* ImageDemo.m */; }; + C3EB3ACC1B46CC5100906482 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414541A7D817000B6F5D6 /* CorePlot.framework */; }; C3EF42F919FC753E0060791A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3EF42F819FC753E0060791A /* Images.xcassets */; }; C3F34F2A12AB25AE008FBDC3 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F2912AB25AE008FBDC3 /* DonutChart.m */; }; /* End PBXBuildFile section */ @@ -177,7 +177,7 @@ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */, C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */, - C3D4145F1A7D817B00B6F5D6 /* CorePlot_iOS.framework in Frameworks */, + C3EB3ACC1B46CC5100906482 /* CorePlot.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -310,7 +310,7 @@ children = ( C3D414541A7D817000B6F5D6 /* CorePlot.framework */, C3D414561A7D817000B6F5D6 /* UnitTests.xctest */, - C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */, + C3D414581A7D817000B6F5D6 /* CorePlot.framework */, C3D4145A1A7D817000B6F5D6 /* CorePlot_iOSTests.xctest */, C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, @@ -392,10 +392,10 @@ remoteRef = C3D414551A7D817000B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414581A7D817000B6F5D6 /* CorePlot_iOS.framework */ = { + C3D414581A7D817000B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index b7a873ec1..c34d2b242 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -5,7 +5,7 @@ #import "ThemeTableViewController.h" -#import +#import NSString *const kThemeTableViewControllerNoTheme = @"None"; NSString *const kThemeTableViewControllerDefaultTheme = @"Default"; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index 8a6d060ad..fcb795d72 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -5,8 +5,9 @@ #import +#import + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -#import #import typedef CGRect CGNSRect; @@ -14,7 +15,6 @@ typedef UIView PlotGalleryNativeView; #else -#import typedef NSRect CGNSRect; typedef NSView PlotGalleryNativeView; #endif diff --git a/framework/CorePlot.h b/framework/CorePlot.h index 59b0bc9c4..1c6a5e0fc 100644 --- a/framework/CorePlot.h +++ b/framework/CorePlot.h @@ -3,76 +3,13 @@ #import #import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - #else #import +#import +#endif + #import #import #import @@ -88,7 +25,6 @@ #import #import #import -#import #import #import #import @@ -139,4 +75,3 @@ #import #import #import -#endif diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 44683b69d..d38579f3a 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -215,7 +215,7 @@ C36E89BA11EE7F97003DE309 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C3791D09191D4C4C001EC514 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */; }; - C38A09831A46185300D45436 /* CorePlot_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot_iOS.framework */; }; + C38A09831A46185300D45436 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot.framework */; }; C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; }; C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; C38A09D21A461C1300D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; @@ -846,8 +846,8 @@ C36E89B811EE7F97003DE309 /* CPTPlotRangeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRangeTests.h; sourceTree = ""; }; C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRangeTests.m; sourceTree = ""; }; C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = MacOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C38A09781A46185200D45436 /* CorePlot_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CorePlot_iOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A09781A46185200D45436 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C38A09821A46185300D45436 /* UnitTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UnitTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libCorePlot-CocoaTouch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CorePlot-CocoaTouchTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextStylePlatformSpecific.h; path = iPhoneOnly/CPTTextStylePlatformSpecific.h; sourceTree = SOURCE_ROOT; }; @@ -973,7 +973,7 @@ buildActionMask = 2147483647; files = ( C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */, - C38A09831A46185300D45436 /* CorePlot_iOS.framework in Frameworks */, + C38A09831A46185300D45436 /* CorePlot.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1008,8 +1008,8 @@ children = ( 8DC2EF5B0486A6940098B216 /* CorePlot.framework */, 0730F600109492D800E95162 /* UnitTests.xctest */, - C38A09781A46185200D45436 /* CorePlot_iOS.framework */, - C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */, + C38A09781A46185200D45436 /* CorePlot.framework */, + C38A09821A46185300D45436 /* UnitTests iOS.xctest */, C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */, C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -1910,9 +1910,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 0730F5FF109492D800E95162 /* UnitTests */ = { + 0730F5FF109492D800E95162 /* UnitTests Mac */ = { isa = PBXNativeTarget; - buildConfigurationList = 0730F604109492D900E95162 /* Build configuration list for PBXNativeTarget "UnitTests" */; + buildConfigurationList = 0730F604109492D900E95162 /* Build configuration list for PBXNativeTarget "UnitTests Mac" */; buildPhases = ( 0730F5FB109492D800E95162 /* Resources */, 0730F5FC109492D800E95162 /* Sources */, @@ -1924,14 +1924,14 @@ dependencies = ( 0730F6221094932900E95162 /* PBXTargetDependency */, ); - name = UnitTests; + name = "UnitTests Mac"; productName = UnitTests; productReference = 0730F600109492D800E95162 /* UnitTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 8DC2EF4F0486A6940098B216 /* CorePlot */ = { + 8DC2EF4F0486A6940098B216 /* CorePlot Mac */ = { isa = PBXNativeTarget; - buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CorePlot" */; + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CorePlot Mac" */; buildPhases = ( 8DC2EF500486A6940098B216 /* Headers */, 8DC2EF520486A6940098B216 /* Resources */, @@ -1942,15 +1942,15 @@ ); dependencies = ( ); - name = CorePlot; + name = "CorePlot Mac"; productInstallPath = "$(HOME)/Library/Frameworks"; productName = CorePlot; productReference = 8DC2EF5B0486A6940098B216 /* CorePlot.framework */; productType = "com.apple.product-type.framework"; }; - C38A09771A46185200D45436 /* CorePlot_iOS */ = { + C38A09771A46185200D45436 /* CorePlot iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOS" */; + buildConfigurationList = C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot iOS" */; buildPhases = ( C38A09731A46185200D45436 /* Sources */, C38A09741A46185200D45436 /* Frameworks */, @@ -1961,14 +1961,14 @@ ); dependencies = ( ); - name = CorePlot_iOS; + name = "CorePlot iOS"; productName = "CorePlot-iOS"; - productReference = C38A09781A46185200D45436 /* CorePlot_iOS.framework */; + productReference = C38A09781A46185200D45436 /* CorePlot.framework */; productType = "com.apple.product-type.framework"; }; - C38A09811A46185300D45436 /* CorePlot_iOSTests */ = { + C38A09811A46185300D45436 /* UnitTests iOS */ = { isa = PBXNativeTarget; - buildConfigurationList = C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOSTests" */; + buildConfigurationList = C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "UnitTests iOS" */; buildPhases = ( C38A097E1A46185300D45436 /* Sources */, C38A097F1A46185300D45436 /* Frameworks */, @@ -1979,9 +1979,9 @@ dependencies = ( C38A09851A46185300D45436 /* PBXTargetDependency */, ); - name = CorePlot_iOSTests; + name = "UnitTests iOS"; productName = "CorePlot-iOSTests"; - productReference = C38A09821A46185300D45436 /* CorePlot_iOSTests.xctest */; + productReference = C38A09821A46185300D45436 /* UnitTests iOS.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */ = { @@ -2057,10 +2057,10 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 8DC2EF4F0486A6940098B216 /* CorePlot */, - 0730F5FF109492D800E95162 /* UnitTests */, - C38A09771A46185200D45436 /* CorePlot_iOS */, - C38A09811A46185300D45436 /* CorePlot_iOSTests */, + 8DC2EF4F0486A6940098B216 /* CorePlot Mac */, + 0730F5FF109492D800E95162 /* UnitTests Mac */, + C38A09771A46185200D45436 /* CorePlot iOS */, + C38A09811A46185300D45436 /* UnitTests iOS */, C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */, C38A09C31A4619A900D45436 /* CorePlot-CocoaTouchTests */, 9021E49E0FC5C9DC00443472 /* Documentation-Mac */, @@ -2568,12 +2568,12 @@ /* Begin PBXTargetDependency section */ 0730F6221094932900E95162 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 8DC2EF4F0486A6940098B216 /* CorePlot */; + target = 8DC2EF4F0486A6940098B216 /* CorePlot Mac */; targetProxy = 0730F6211094932900E95162 /* PBXContainerItemProxy */; }; C38A09851A46185300D45436 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = C38A09771A46185200D45436 /* CorePlot_iOS */; + target = C38A09771A46185200D45436 /* CorePlot iOS */; targetProxy = C38A09841A46185300D45436 /* PBXContainerItemProxy */; }; C38A09C71A4619A900D45436 /* PBXTargetDependency */ = { @@ -2779,7 +2779,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2810,7 +2810,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3142,7 +3142,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0730F604109492D900E95162 /* Build configuration list for PBXNativeTarget "UnitTests" */ = { + 0730F604109492D900E95162 /* Build configuration list for PBXNativeTarget "UnitTests Mac" */ = { isa = XCConfigurationList; buildConfigurations = ( 0730F602109492D900E95162 /* Debug */, @@ -3151,7 +3151,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CorePlot" */ = { + 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "CorePlot Mac" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB91AE08733DA50010E9CD /* Debug */, @@ -3178,7 +3178,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOS" */ = { + C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( C38A098B1A46185300D45436 /* Debug */, @@ -3187,7 +3187,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot_iOSTests" */ = { + C38A09901A46185300D45436 /* Build configuration list for PBXNativeTarget "UnitTests iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( C38A098D1A46185300D45436 /* Debug */, From 725c816f89d4730d5ff56d61e19c295d7ae874f5 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 4 Jul 2015 14:36:32 -0400 Subject: [PATCH 051/429] Fixed Xcode warnings for the launch images in the StockPlot example app. --- .../StockPlot/Images.xcassets/Contents.json | 6 +++ .../LaunchImage.launchimage/Contents.json | 45 ++++++++++++++---- .../Default-568h@2x.png | Bin 18594 -> 0 bytes 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 examples/StockPlot/StockPlot/Images.xcassets/Contents.json delete mode 100644 examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png diff --git a/examples/StockPlot/StockPlot/Images.xcassets/Contents.json b/examples/StockPlot/StockPlot/Images.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/StockPlot/StockPlot/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Contents.json b/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Contents.json index f0fce5477..e6c8ec6a6 100644 --- a/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -3,32 +3,59 @@ { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", "minimum-system-version" : "7.0", - "subtype" : "retina4", "scale" : "2x" }, { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "1x", - "orientation" : "portrait" + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "subtype" : "retina4", + "scale" : "2x" }, { + "orientation" : "portrait", "idiom" : "iphone", - "scale" : "2x", - "orientation" : "portrait" + "extent" : "full-screen", + "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "iphone", - "filename" : "Default-568h@2x.png", - "subtype" : "retina4", + "extent" : "full-screen", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", - "minimum-system-version" : "7.0", + "extent" : "full-screen", + "subtype" : "retina4", "scale" : "2x" } ], diff --git a/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/examples/StockPlot/StockPlot/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u From 7cb8f85531cfc3b1254c96a66126b514c715a520 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 4 Jul 2015 14:52:33 -0400 Subject: [PATCH 052/429] Swift 2 updates for the iPhone CPTTestApp. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 355d0c7c7..54c61d31b 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -46,8 +46,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let graphTitle = NSMutableAttributedString(string: lineOne + "\n" + lineTwo) - let titleRange1 = NSRange(location: 0, length: count(lineOne.utf16)) - let titleRange2 = NSRange(location: count(lineOne.utf16) + 1, length: count(lineTwo.utf16)) + let titleRange1 = NSRange(location: 0, length: lineOne.utf16.count) + let titleRange2 = NSRange(location: lineOne.utf16.count + 1, length: lineTwo.utf16.count) graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.whiteColor(), range:titleRange1) graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.grayColor(), range:titleRange2) From 0bc51ca14d845be4ddafaaad84e03dc7d6c03061 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jul 2015 18:47:23 -0400 Subject: [PATCH 053/429] Added code signing identities for the iOS framework. --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index d38579f3a..a224cf37d 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2759,6 +2759,8 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2795,6 +2797,8 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; From 352dbeb32b7be45464436a6a06c9bbf37b7a1193 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jul 2015 21:49:49 -0400 Subject: [PATCH 054/429] Embed the Core Plot framework in the Plot Gallery app to fix device builds. --- .../project.pbxproj | 59 +++++++++++++++++-- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index cbd9b7032..c2b8be908 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ 4F7541F3126B59A200313026 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F7541EF126B59A200313026 /* DetailViewController.m */; }; 4F8E1C6012907C1800D2035F /* DatePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C5F12907C1800D2035F /* DatePlot.m */; }; 4F8E1CA0129089D600D2035F /* SteppedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C9F129089D600D2035F /* SteppedScatterPlot.m */; }; + C317907E1B49EAF100699C5F /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot.framework */; }; + C317907F1B49EAF100699C5F /* CorePlot.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C31A40BA17ABD6910020C5C6 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C31A40B917ABD6910020C5C6 /* FunctionPlot.m */; }; C32960CB1A101AEB0086D047 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C32960CA1A101AEB0086D047 /* AppDelegate.m */; }; C3457A5317AD7C72000880F3 /* PiNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C3457A5217AD7C72000880F3 /* PiNumberFormatter.m */; }; @@ -49,6 +51,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + C317907C1B49EAC900699C5F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = C38A09771A46185200D45436; + remoteInfo = "CorePlot iOS"; + }; + C31790801B49EAF100699C5F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = C38A09771A46185200D45436; + remoteInfo = "CorePlot iOS"; + }; C3D414531A7D817000B6F5D6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; @@ -93,6 +109,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + C31790821B49EAF200699C5F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + C317907F1B49EAF100699C5F /* CorePlot.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1D6058910D05DD3D006BFB54 /* Plot Gallery.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plot Gallery.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -174,6 +204,7 @@ files = ( 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, + C317907E1B49EAF100699C5F /* CorePlot.framework in Frameworks */, 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */, C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */, @@ -311,7 +342,7 @@ C3D414541A7D817000B6F5D6 /* CorePlot.framework */, C3D414561A7D817000B6F5D6 /* UnitTests.xctest */, C3D414581A7D817000B6F5D6 /* CorePlot.framework */, - C3D4145A1A7D817000B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D4145A1A7D817000B6F5D6 /* UnitTests iOS.xctest */, C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -328,10 +359,13 @@ 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, + C31790821B49EAF200699C5F /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + C317907D1B49EAC900699C5F /* PBXTargetDependency */, + C31790811B49EAF100699C5F /* PBXTargetDependency */, ); name = "Plot Gallery-iOS"; productName = "Plot Gallery"; @@ -399,10 +433,10 @@ remoteRef = C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D4145A1A7D817000B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D4145A1A7D817000B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D414591A7D817000B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -475,6 +509,19 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + C317907D1B49EAC900699C5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CorePlot iOS"; + targetProxy = C317907C1B49EAC900699C5F /* PBXContainerItemProxy */; + }; + C31790811B49EAF100699C5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CorePlot iOS"; + targetProxy = C31790801B49EAF100699C5F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; @@ -492,6 +539,7 @@ GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework/\"/**"; INFOPLIST_FILE = "Plot_Gallery-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-all_load", @@ -511,13 +559,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework/\"/**"; INFOPLIST_FILE = "Plot_Gallery-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "-ObjC", "-all_load", From cc60b48113a74d0d3be84d7b020645ac52fa18b6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 12 Jul 2015 19:16:54 -0400 Subject: [PATCH 055/429] Fixed a file reference in the StockPlot example app. --- examples/StockPlot/StockPlot.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index 2ef3cee2e..29b2f1e75 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -95,7 +95,7 @@ AB4913C60FECC2B8008A08AB /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = APYahooDataPuller.m; path = Classes/APYahooDataPuller.m; sourceTree = SOURCE_ROOT; }; AB4913C70FECC2B8008A08AB /* NSDictionary+APFinancialData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+APFinancialData.m"; path = "Classes/NSDictionary+APFinancialData.m"; sourceTree = SOURCE_ROOT; }; AB6FA4A30FEB579B008DB04A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - AB6FA4DE0FEB59DB008DB04A /* NSDictionary+APFinancalData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APFinancalData.h"; sourceTree = ""; }; + AB6FA4DE0FEB59DB008DB04A /* NSDictionary+APFinancialData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APFinancialData.h"; sourceTree = ""; }; AB6FA5560FEB6235008DB04A /* APYahooDataPullerGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APYahooDataPullerGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; AB6FA5570FEB6235008DB04A /* APYahooDataPullerGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APYahooDataPullerGraph.m; sourceTree = ""; }; AB6FA5580FEB6235008DB04A /* APYahooDataPullerGraph.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = APYahooDataPullerGraph.xib; path = Classes/APYahooDataPullerGraph.xib; sourceTree = ""; }; @@ -298,14 +298,14 @@ C3D414D81A7D84BF00B6F5D6 /* CorePlot_iOS.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D414D71A7D84BF00B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; C3D414DA1A7D84BF00B6F5D6 /* CorePlot_iOSTests.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D414D91A7D84BF00B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; From 905ab90caf5e2ba95fdb8bc4fc30bb76fae33512 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 12 Jul 2015 19:25:52 -0400 Subject: [PATCH 056/429] Added type annotations to all arrays, sets, and dictionaries. --- QCPlugin/CPTBarPlotPlugin.m | 10 +- QCPlugin/CPTPieChartPlugin.m | 16 +-- QCPlugin/CPTScatterPlotPlugin.m | 12 +-- QCPlugin/CorePlotQCPlugin.m | 14 +-- documentation/changelog.markdown | 1 + .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 6 +- examples/AAPLot/APFinancialData.h | 4 +- examples/AAPLot/APFinancialData.m | 20 ++-- examples/AAPLot/APYahooDataPuller.h | 6 +- examples/AAPLot/APYahooDataPuller.m | 36 ++++--- examples/AAPLot/Classes/MainViewController.m | 30 +++--- .../Classes/CPTTestApp_iPadAppDelegate.m | 2 +- .../Classes/CPTTestApp_iPadViewController.h | 4 +- .../Classes/CPTTestApp_iPadViewController.m | 16 +-- examples/CPTTestApp/Source/Controller.m | 18 ++-- .../Source/SelectionDemoController.m | 4 +- .../CorePlotGallery/src/ios/AppDelegate.m | 2 +- .../src/ios/DetailViewController.m | 2 +- .../src/ios/RootViewController.m | 2 +- .../src/ios/ThemeTableViewController.m | 6 +- .../src/mac/PlotGalleryController.m | 2 +- .../src/plots/CandlestickPlot.m | 4 +- .../src/plots/ColoredBarChart.m | 8 +- .../CorePlotGallery/src/plots/CompositePlot.h | 4 +- .../CorePlotGallery/src/plots/CompositePlot.m | 16 +-- .../CorePlotGallery/src/plots/ControlChart.m | 4 +- .../src/plots/CurvedScatterPlot.m | 58 +++++------ examples/CorePlotGallery/src/plots/DatePlot.m | 4 +- .../CorePlotGallery/src/plots/DonutChart.m | 2 +- .../CorePlotGallery/src/plots/FunctionPlot.m | 6 +- .../src/plots/GradientScatterPlot.m | 8 +- .../src/plots/LabelingPolicyDemo.m | 6 +- .../CorePlotGallery/src/plots/LineCapDemo.m | 2 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 4 +- .../CorePlotGallery/src/plots/RangePlot.m | 4 +- .../CorePlotGallery/src/plots/RealTimePlot.m | 2 +- .../src/plots/SimplePieChart.m | 6 +- .../src/plots/SimpleScatterPlot.m | 8 +- .../src/plots/SteppedScatterPlot.m | 4 +- .../src/plots/VerticalBarChart.m | 4 +- .../CorePlotGallery/src/shared/PlotGallery.h | 2 +- .../CorePlotGallery/src/shared/PlotGallery.m | 4 +- .../CorePlotGallery/src/shared/PlotItem.h | 2 +- examples/DropPlot/CPTPlotDocument.m | 14 +-- examples/DropPlot/NSString+ParseCSV.h | 3 +- examples/DropPlot/NSString+ParseCSV.m | 15 +-- examples/MinorTickLabels/Controller.m | 4 +- examples/RangePlot/Controller.m | 4 +- .../StockPlot/Classes/APYahooDataPuller.h | 6 +- .../StockPlot/Classes/APYahooDataPuller.m | 46 +++++---- .../Classes/APYahooDataPullerGraph.m | 4 +- .../Classes/NSDictionary+APFinancialData.h | 4 +- .../Classes/NSDictionary+APFinancialData.m | 20 ++-- .../StockPlot/Classes/RootViewController.h | 2 +- .../StockPlot/Classes/RootViewController.m | 6 +- .../StockPlot.xcodeproj/project.pbxproj | 2 +- framework/CorePlot.xcodeproj/project.pbxproj | 2 +- framework/MacOnly/CPTGraphHostingView.m | 6 +- .../MacOnly/CPTPlatformSpecificFunctions.m | 6 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 14 +-- framework/Source/CPTAnimation.m | 26 ++--- framework/Source/CPTAnnotation.h | 13 +++ framework/Source/CPTAnnotationHostLayer.h | 5 +- framework/Source/CPTAnnotationHostLayer.m | 19 ++-- framework/Source/CPTAxis.h | 39 +++++--- framework/Source/CPTAxis.m | 97 +++++++++---------- framework/Source/CPTAxisLabel.h | 13 +++ framework/Source/CPTAxisSet.h | 4 +- framework/Source/CPTAxisSet.m | 7 +- framework/Source/CPTBarPlot.h | 8 +- framework/Source/CPTBarPlot.m | 51 +++++----- framework/Source/CPTDataSourceTestCase.h | 6 +- framework/Source/CPTDataSourceTestCase.m | 16 +-- framework/Source/CPTDefinitions.h | 40 ++++++++ framework/Source/CPTFill.h | 13 +++ framework/Source/CPTFunctionDataSource.m | 2 +- framework/Source/CPTGraph.h | 10 +- framework/Source/CPTGraph.m | 26 +++-- framework/Source/CPTLayer.h | 24 ++++- framework/Source/CPTLayer.m | 18 ++-- framework/Source/CPTLayerTests.h | 4 +- framework/Source/CPTLayerTests.m | 24 ++--- framework/Source/CPTLegend.h | 20 ++-- framework/Source/CPTLegend.m | 94 +++++++++--------- framework/Source/CPTLegendEntry.h | 13 +++ framework/Source/CPTLimitBand.h | 15 ++- framework/Source/CPTLineStyle.h | 17 +++- framework/Source/CPTLineStyle.m | 7 +- framework/Source/CPTMutableLineStyle.h | 2 +- framework/Source/CPTMutableLineStyle.m | 2 +- framework/Source/CPTMutableNumericData.h | 2 +- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTNumericData.h | 37 +++---- framework/Source/CPTNumericData.m | 79 +++++++-------- .../CPTNumericDataTypeConversionTests.m | 6 +- framework/Source/CPTPieChart.h | 6 +- framework/Source/CPTPieChart.m | 37 ++++--- framework/Source/CPTPlot.h | 16 ++- framework/Source/CPTPlot.m | 83 ++++++++-------- framework/Source/CPTPlotArea.h | 2 +- framework/Source/CPTPlotArea.m | 12 +-- framework/Source/CPTPlotRange.h | 12 +++ framework/Source/CPTPlotSpace.h | 25 +++-- framework/Source/CPTPlotSpace.m | 43 ++++---- framework/Source/CPTPlotSpaceAnnotation.h | 4 +- framework/Source/CPTPlotSpaceAnnotation.m | 8 +- framework/Source/CPTPlotSymbol.h | 11 +++ framework/Source/CPTRangePlot.h | 4 +- framework/Source/CPTRangePlot.m | 36 +++---- framework/Source/CPTScatterPlot.h | 8 +- framework/Source/CPTScatterPlot.m | 48 +++++---- framework/Source/CPTScatterPlotTests.m | 36 ++++--- framework/Source/CPTTextStyle.h | 18 +++- framework/Source/CPTTextStyle.m | 1 - framework/Source/CPTTheme.h | 2 +- framework/Source/CPTTheme.m | 4 +- framework/Source/CPTTradingRangePlot.h | 14 +-- framework/Source/CPTTradingRangePlot.m | 79 ++++++++------- framework/Source/CPTXYAxis.m | 14 +-- framework/Source/CPTXYAxisSet.m | 4 +- framework/Source/CPTXYPlotSpace.m | 18 ++-- framework/Source/CPTXYPlotSpaceTests.m | 12 +-- framework/Source/NSCoderExtensions.m | 8 +- framework/Source/_CPTBorderLayer.m | 4 +- framework/iPhoneOnly/CPTGraphHostingView.m | 8 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.h | 2 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 10 +- scripts/createrelease.py | 0 scripts/prefixer.py | 0 129 files changed, 1060 insertions(+), 823 deletions(-) mode change 100755 => 100644 scripts/createrelease.py mode change 100755 => 100644 scripts/prefixer.py diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 570d3a0b0..6ae8ae6be 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -27,7 +27,7 @@ @implementation CPTBarPlotPlugIn */ @dynamic inputBaseValue, inputBarOffset, inputBarWidth, inputHorizontalBars; -+(NSDictionary *)attributes ++(NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Bar Chart", @@ -35,7 +35,7 @@ +(NSDictionary *)attributes }; } -+(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key { // A few additional ports for the bar plot chart type ... @@ -201,14 +201,14 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; - NSDictionary *dict = [self valueForInputKey:key]; + CPTDictionary dict = [self valueForInputKey:key]; if ( !dict ) { return nil; } - NSUInteger keyCount = [[dict allKeys] count]; - NSMutableArray *array = [NSMutableArray array]; + NSUInteger keyCount = [[dict allKeys] count]; + CPTMutableNumberArray array = [NSMutableArray array]; if ( fieldEnum == CPTBarPlotFieldBarLocation ) { // Calculate horizontal position of bar - nth bar index + barWidth*plotIndex + 0.5 diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index 2874e1ae3..c38afa8f7 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -25,7 +25,7 @@ @implementation CPTPieChartPlugIn */ @dynamic inputPieRadius, inputSliceLabelOffset, inputStartAngle, inputSliceDirection; -+(NSDictionary *)attributes ++(NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Pie Chart", @@ -60,14 +60,14 @@ -(QCPlugInViewController *)createViewController return nil; } -+(NSArray *)sortedPropertyPortKeys ++(CPTStringArray)sortedPropertyPortKeys { - NSArray *pieChartPropertyPortKeys = @[@"inputPieRadius", @"inputSliceLabelOffset", @"inputStartAngle", @"inputSliceDirection", @"inputBorderColor", @"inputBorderWidth"]; + CPTStringArray pieChartPropertyPortKeys = @[@"inputPieRadius", @"inputSliceLabelOffset", @"inputStartAngle", @"inputSliceDirection", @"inputBorderColor", @"inputBorderWidth"]; return [[super sortedPropertyPortKeys] arrayByAddingObjectsFromArray:pieChartPropertyPortKeys]; } -+(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key { // A few additional ports for the pie chart type ... if ( [key isEqualToString:@"inputPieRadius"] ) { @@ -106,7 +106,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key } else if ( [key isEqualToString:@"inputBorderColor"] ) { CGColorRef grayColor = CGColorCreateGenericGray(0.0, 1.0); - NSDictionary *result = @{ + CPTDictionary result = @{ QCPortAttributeNameKey: @"Border Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(grayColor) }; @@ -114,7 +114,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key } else if ( [key isEqualToString:@"inputLabelColor"] ) { CGColorRef grayColor = CGColorCreateGenericGray(1.0, 1.0); - NSDictionary *result = @{ + CPTDictionary result = @{ QCPortAttributeNameKey: @"Label Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(grayColor) }; @@ -229,7 +229,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; - NSDictionary *dict = [self valueForInputKey:key]; + CPTDictionary dict = [self valueForInputKey:key]; if ( dict ) { return [NSDecimalNumber decimalNumberWithString:[dict[[NSString stringWithFormat:@"%lu", (unsigned long)index]] stringValue]]; @@ -264,7 +264,7 @@ -(CPTTextLayer *)sliceLabelForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUI NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:pieChart]; NSString *key = [NSString stringWithFormat:@"plotLabels%lu", (unsigned long)plotIndex]; - NSDictionary *dict = [self valueForInputKey:key]; + CPTDictionary dict = [self valueForInputKey:key]; if ( !dict ) { return nil; diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index 25880f00a..9dd7acb06 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -22,7 +22,7 @@ @implementation CPTScatterPlotPlugIn @dynamic inputXMin, inputXMax, inputYMin, inputYMax; @dynamic inputXMajorIntervals, inputYMajorIntervals, inputXMinorIntervals, inputYMinorIntervals; -+(NSDictionary *)attributes ++(NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Scatter Plot", @@ -210,8 +210,8 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; NSString *yKey = [NSString stringWithFormat:@"plotYNumbers%lu", (unsigned long)plotIndex]; - NSDictionary *xVals = [self valueForInputKey:xKey]; - NSDictionary *yVals = [self valueForInputKey:yKey]; + CPTDictionary xVals = [self valueForInputKey:xKey]; + CPTDictionary yVals = [self valueForInputKey:yKey]; if ( !xVals || !yVals ) { return 0; @@ -229,8 +229,8 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; NSString *yKey = [NSString stringWithFormat:@"plotYNumbers%lu", (unsigned long)plotIndex]; - NSDictionary *xVals = [self valueForInputKey:xKey]; - NSDictionary *yVals = [self valueForInputKey:yKey]; + CPTDictionary xVals = [self valueForInputKey:xKey]; + CPTDictionary yVals = [self valueForInputKey:yKey]; if ( !xVals || !yVals ) { return nil; @@ -239,7 +239,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return nil; } - NSDictionary *dict = (fieldEnum == CPTScatterPlotFieldX) ? xVals : yVals; + CPTDictionary dict = (fieldEnum == CPTScatterPlotFieldX) ? xVals : yVals; NSString *dictionaryKey = [NSString stringWithFormat:@"%lu", (unsigned long)index]; diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index 8484b9cd9..278179c2e 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -83,7 +83,7 @@ @implementation CorePlotQCPlugIn */ @synthesize numberOfPlots; -+(NSDictionary *)attributes ++(NSDictionary *)attributes { /* * Return a dictionary of attributes describing the plug-in (QCPlugInAttributeNameKey, QCPlugInAttributeDescriptionKey...). @@ -162,7 +162,7 @@ -(QCPlugInViewController *)createViewController #pragma mark - #pragma mark Input and output port configuration -+(NSArray *)sortedPropertyPortKeys ++(CPTStringArray)sortedPropertyPortKeys { return @[@"inputPixelsWide", @"inputPixelsHigh", @@ -186,7 +186,7 @@ +(NSArray *)sortedPropertyPortKeys @"inputAxisMinorTickWidth"]; } -+(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key { /* * Specify the optional attributes for property based ports (QCPortAttributeNameKey, QCPortAttributeDefaultValueKey...). @@ -254,7 +254,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key if ( [key isEqualToString:@"inputAxisColor"] ) { CGColorRef axisColor = CGColorCreateGenericRGB(1.0, 1.0, 1.0, 1.0); - NSDictionary *result = @{ + CPTDictionary result = @{ QCPortAttributeNameKey: @"Axis Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(axisColor) }; @@ -319,7 +319,7 @@ +(NSDictionary *)attributesForPropertyPortWithKey:(NSString *)key if ( [key isEqualToString:@"inputPlotAreaColor"] ) { CGColorRef plotAreaColor = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 0.4); - NSDictionary *result = @{ + CPTDictionary result = @{ QCPortAttributeNameKey: @"Plot Area Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(plotAreaColor) }; @@ -671,7 +671,7 @@ -(void)setNumberOfPlots:(NSUInteger)number numberOfPlots = number; } -+(NSArray *)plugInKeys ++(CPTStringArray)plugInKeys { return @[@"numberOfPlots"]; } @@ -795,7 +795,7 @@ -(BOOL)configureGraph @implementation CorePlotQCPlugIn(Execution) --(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArguments:(NSDictionary *)arguments +-(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArguments:(CPTDictionary)arguments { // Configure the plot for drawing BOOL configurationCheck = [self configureGraph]; diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index f21b88f8a..058f6e093 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -10,6 +10,7 @@ To be determined - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added nullability annotations to all property and method declarations. +- **New**: Added type annotations to all arrays, sets, and dictionaries. - **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index 16f135539..de5e897e8 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -92,7 +92,7 @@ 289233A20DB2D0840083E9F9 /* FlipsideView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlipsideView.h; path = Classes/FlipsideView.h; sourceTree = ""; }; 289233A30DB2D0840083E9F9 /* FlipsideView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FlipsideView.m; path = Classes/FlipsideView.m; sourceTree = ""; }; 289233A80DB2D0DB0083E9F9 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 289233A90DB2D0DB0083E9F9 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + 289233A90DB2D0DB0083E9F9 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 289233AA0DB2D0DB0083E9F9 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 289233AB0DB2D0DB0083E9F9 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 289233AC0DB2D0DB0083E9F9 /* FlipsideViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlipsideViewController.h; path = Classes/FlipsideViewController.h; sourceTree = ""; }; @@ -101,8 +101,8 @@ 32CA4F630368D1EE00C91783 /* AAPLot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLot_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB8989460FE0309E00FDC37F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - AB8F94560FDEFA1500E61485 /* APYahooDataPuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APYahooDataPuller.h; sourceTree = ""; }; - AB8F94570FDEFA1500E61485 /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APYahooDataPuller.m; sourceTree = ""; }; + AB8F94560FDEFA1500E61485 /* APYahooDataPuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APYahooDataPuller.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + AB8F94570FDEFA1500E61485 /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APYahooDataPuller.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ABA5345D0FEB40CE0046A8DA /* AAPL.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AAPL.plist; sourceTree = ""; }; C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD282F17DE9B9C008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; diff --git a/examples/AAPLot/APFinancialData.h b/examples/AAPLot/APFinancialData.h index 7ca481d37..6ede21860 100644 --- a/examples/AAPLot/APFinancialData.h +++ b/examples/AAPLot/APFinancialData.h @@ -1,7 +1,7 @@ -#import +#import "CorePlot-CocoaTouch.h" @interface NSDictionary(APFinancialData) -+(id)dictionaryWithCSVLine:(NSString *)csvLine; ++(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; @end diff --git a/examples/AAPLot/APFinancialData.m b/examples/AAPLot/APFinancialData.m index f274794b2..9598755e5 100644 --- a/examples/AAPLot/APFinancialData.m +++ b/examples/AAPLot/APFinancialData.m @@ -3,28 +3,28 @@ @implementation NSDictionary(APFinancialData) -+(id)dictionaryWithCSVLine:(NSString *)csvLine ++(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine { - NSArray *csvChunks = [csvLine componentsSeparatedByString:@","]; + CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; - NSMutableDictionary *csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; // Date,Open,High,Low,Close,Volume,Adj Close // 2009-06-08,143.82,144.23,139.43,143.85,33255400,143.85 - NSDate *theDate = [[NSDateFormatter csvDateFormatter] dateFromString:(NSString *)csvChunks[0]]; + NSDate *theDate = [[NSDateFormatter csvDateFormatter] dateFromString:csvChunks[0]]; csvDict[@"date"] = theDate; - NSDecimalNumber *theOpen = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[1]]; + NSDecimalNumber *theOpen = [NSDecimalNumber decimalNumberWithString:csvChunks[1]]; csvDict[@"open"] = theOpen; - NSDecimalNumber *theHigh = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[2]]; + NSDecimalNumber *theHigh = [NSDecimalNumber decimalNumberWithString:csvChunks[2]]; csvDict[@"high"] = theHigh; - NSDecimalNumber *theLow = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[3]]; + NSDecimalNumber *theLow = [NSDecimalNumber decimalNumberWithString:csvChunks[3]]; csvDict[@"low"] = theLow; - NSDecimalNumber *theClose = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[4]]; + NSDecimalNumber *theClose = [NSDecimalNumber decimalNumberWithString:csvChunks[4]]; csvDict[@"close"] = theClose; - NSDecimalNumber *theVolume = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[5]]; + NSDecimalNumber *theVolume = [NSDecimalNumber decimalNumberWithString:csvChunks[5]]; csvDict[@"volume"] = theVolume; - NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[6]]; + NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:csvChunks[6]]; csvDict[@"adjClose"] = theAdjClose; //non-mutable autoreleased dict diff --git a/examples/AAPLot/APYahooDataPuller.h b/examples/AAPLot/APYahooDataPuller.h index 7395b2af8..a0cd2c1ac 100644 --- a/examples/AAPLot/APYahooDataPuller.h +++ b/examples/AAPLot/APYahooDataPuller.h @@ -1,7 +1,9 @@ -#import +#import "APFinancialData.h" @class APYahooDataPuller; +typedef NSArray *CPTFinancialDataArray; + @protocol APYahooDataPullerDelegate @optional @@ -19,7 +21,7 @@ @property (nonatomic, readwrite, copy) NSString *targetSymbol; @property (nonatomic, readwrite, strong) NSDate *targetStartDate; @property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) NSArray *financialData; +@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; @property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; @property (nonatomic, readonly, strong) NSDecimalNumber *overallVolumeHigh; diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index e0612a481..662ba99e1 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -9,7 +9,7 @@ @interface APYahooDataPuller() @property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeHigh; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeLow; -@property (nonatomic, readwrite, strong) NSArray *financialData; +@property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; @property (nonatomic, readwrite, strong) NSMutableData *receivedData; @@ -64,9 +64,9 @@ -(void)setDelegate:(id)aDelegate } } --(NSDictionary *)plistRep +-(CPTDictionary)plistRep { - NSMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = [self symbol]; rep[@"startDate"] = [self startDate]; @@ -76,6 +76,7 @@ -(NSDictionary *)plistRep rep[@"overallVolumeHigh"] = [self overallVolumeHigh]; rep[@"overallVolumeLow"] = [self overallVolumeLow]; rep[@"financialData"] = [self financialData]; + return [NSDictionary dictionaryWithDictionary:rep]; } @@ -86,7 +87,7 @@ -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag return success; } --(id)initWithDictionary:(NSDictionary *)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(id)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { self = [super init]; if ( self != nil ) { @@ -108,7 +109,7 @@ -(id)initWithDictionary:(NSDictionary *)aDict targetSymbol:(NSString *)aSymbol t -(NSString *)pathForSymbol:(NSString *)aSymbol { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; NSString *docPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; @@ -127,29 +128,31 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } //Always returns *something* --(NSDictionary *)dictionaryForSymbol:(NSString *)aSymbol +-(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol { - NSString *path = [self faultTolerantPathForSymbol:aSymbol]; - NSMutableDictionary *localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + NSString *path = [self faultTolerantPathForSymbol:aSymbol]; + + CPTMutableDictionary localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; return localPlistDict; } -(id)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { - NSDictionary *cachedDictionary = [self dictionaryForSymbol:aSymbol]; + CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; if ( nil != cachedDictionary ) { return [self initWithDictionary:cachedDictionary targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } - NSMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = aSymbol; rep[@"startDate"] = aStartDate; rep[@"endDate"] = anEndDate; rep[@"overallHigh"] = [NSDecimalNumber notANumber]; rep[@"overallLow"] = [NSDecimalNumber notANumber]; rep[@"financialData"] = @[]; + return [self initWithDictionary:rep targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } @@ -289,7 +292,7 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection [self parseCSVAndPopulate]; //see if we need to write to file - NSDictionary *dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; + CPTDictionary dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; BOOL sameSymbol = NO; NSString *dictSymbol = dictionaryForSymbol[@"symbol"]; @@ -319,10 +322,11 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection -(void)parseCSVAndPopulate { - NSArray *csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:[csvLines count]]; - NSDictionary *currentFinancial = nil; - NSString *line = nil; + CPTStringArray csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:[csvLines count]]; + CPTDictionary currentFinancial = nil; + NSString *line = nil; self.overallHigh = [NSDecimalNumber notANumber]; self.overallLow = [NSDecimalNumber notANumber]; @@ -330,7 +334,7 @@ -(void)parseCSVAndPopulate self.overallVolumeLow = [NSDecimalNumber notANumber]; for ( NSUInteger i = 1; i < [csvLines count] - 1; i++ ) { - line = (NSString *)csvLines[i]; + line = csvLines[i]; currentFinancial = [NSDictionary dictionaryWithCSVLine:line]; [newFinancials addObject:currentFinancial]; diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index dc286e210..4b8904618 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -144,7 +144,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange { - NSArray *financialData = self.datapuller.financialData; + CPTFinancialDataArray financialData = self.datapuller.financialData; const NSUInteger financialDataCount = financialData.count; const BOOL useDoubles = plot.doublePrecisionCache; @@ -164,7 +164,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -189,7 +189,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -216,7 +216,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -241,7 +241,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -268,7 +268,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -311,7 +311,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)financialData[financialDataCount - i - 1]; + CPTDictionary fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -365,7 +365,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange { - NSArray *financialData = self.datapuller.financialData; + CPTFinancialDataArray financialData = self.datapuller.financialData; const NSUInteger financialDataCount = financialData.count; const BOOL useDoubles = plot.doublePrecisionCache; @@ -386,7 +386,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -411,7 +411,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -438,7 +438,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -463,7 +463,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -490,7 +490,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -533,7 +533,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - NSDictionary *fData = (NSDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -662,7 +662,7 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp axisSet.yAxis.majorIntervalLength = @50.0; axisSet.yAxis.minorTicksPerInterval = 4; axisSet.yAxis.orthogonalPosition = @1.0; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@0.0 length:low]]; + CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@0.0 length:low]]; axisSet.yAxis.labelExclusionRanges = exclusionRanges; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m index b8a47d016..efbdfc2ac 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m @@ -13,7 +13,7 @@ @implementation CPTTestApp_iPadAppDelegate @synthesize window; @synthesize viewController; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions { self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h index 62596a8b6..d41e34802 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h @@ -10,8 +10,8 @@ @interface CPTTestApp_iPadViewController : UIViewController -@property (nonatomic, readwrite, strong) NSArray *dataForChart; -@property (nonatomic, readwrite, strong) NSArray *dataForPlot; +@property (nonatomic, readwrite, strong) CPTNumberArray dataForChart; +@property (nonatomic, readwrite, strong) NSArray *dataForPlot; // Plot construction methods -(void)constructScatterPlot; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index f543e4afc..1e92e8e73 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -130,9 +130,9 @@ -(void)constructScatterPlot x.majorIntervalLength = @0.5; x.orthogonalPosition = @2.0; x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; @@ -208,7 +208,7 @@ -(void)constructScatterPlot boundLinePlot.plotSymbol = plotSymbol; // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; + NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 60; i++ ) { NSNumber *xVal = @(1 + i * 0.05); NSNumber *yVal = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2); @@ -254,10 +254,10 @@ -(void)constructBarChart // Define some custom labels for the data elements x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - NSArray *customTickLocations = @[@1, @5, @10, @15]; - NSArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + NSUInteger labelLocation = 0; + CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 1803a9a72..92c910ad3 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -145,9 +145,9 @@ -(void)setupAxes x.minorTicksPerInterval = 2; x.majorGridLineStyle = majorGridLineStyle; x.minorGridLineStyle = minorGridLineStyle; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; NSMutableAttributedString *xTitle = [[NSMutableAttributedString alloc] initWithString:@"X Axis\nLine 2"]; @@ -285,7 +285,7 @@ -(void)setupScatterPlots if ( !hasData ) { // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; + NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 60; i++ ) { NSNumber *x = @(1.0 + i * 0.05); NSNumber *y = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2); @@ -464,12 +464,12 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; // Determine point of symbol in plot coordinates - NSDictionary *dataPoint = (self.arrangedObjects)[index]; + NSDictionary *dataPoint = (self.arrangedObjects)[index]; NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - NSArray *anchorPoint = @[x, y]; + CPTNumberArray anchorPoint = @[x, y]; // Add annotation // First make a string for the y value @@ -510,9 +510,9 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index // Determine point of symbol in plot coordinates - NSNumber *x = @0; - NSNumber *y = [self numberForPlot:plot field:0 recordIndex:index]; - NSArray *anchorPoint = @[x, @(index)]; + NSNumber *x = @0; + NSNumber *y = [self numberForPlot:plot field:0 recordIndex:index]; + CPTNumberArray anchorPoint = @[x, @(index)]; // Add annotation // First make a string for the y value diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index 8256622c6..d6e61cd49 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -14,7 +14,7 @@ -(void)initializeData; @property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSMutableArray *dataForPlot; +@property (nonatomic, readwrite, strong) NSMutableArray *dataForPlot; @property (nonatomic, readwrite) NSUInteger selectedIndex; @end @@ -167,7 +167,7 @@ -(void)setupScatterPlots -(void)initializeData { - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; + NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 100; i++ ) { NSNumber *x = @(i * 0.05); diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index 442dfeb8f..0b50f831b 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -18,7 +18,7 @@ @implementation AppDelegate @synthesize window; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions { [[PlotGallery sharedPlotGallery] sortByTitle]; diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index 41dd18240..a38171006 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -125,7 +125,7 @@ -(void)themeSelectedWithName:(NSString *)themeName -(void)themeChanged:(NSNotification *)notification { - NSDictionary *themeInfo = notification.userInfo; + NSDictionary *themeInfo = notification.userInfo; [self themeSelectedWithName:themeInfo[PlotGalleryThemeNameKey]]; } diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index 12b7d09ec..f1857bffb 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -71,7 +71,7 @@ -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender -(void)themeChanged:(NSNotification *)notification { - NSDictionary *themeInfo = notification.userInfo; + NSDictionary *themeInfo = notification.userInfo; self.currentThemeName = themeInfo[PlotGalleryThemeNameKey]; } diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index c34d2b242..bd3e939b4 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -15,7 +15,7 @@ @interface ThemeTableViewController() -@property (nonatomic, readwrite, strong) NSMutableArray *themes; +@property (nonatomic, readwrite, strong) CPTMutableStringArray themes; @end @@ -27,7 +27,7 @@ @implementation ThemeTableViewController -(void)setupThemes { - NSMutableArray *themeList = [[NSMutableArray alloc] init]; + CPTMutableStringArray themeList = [[NSMutableArray alloc] init]; [themeList addObject:kThemeTableViewControllerDefaultTheme]; [themeList addObject:kThemeTableViewControllerNoTheme]; @@ -86,7 +86,7 @@ -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - NSDictionary *themeInfo = @{ + NSDictionary *themeInfo = @{ PlotGalleryThemeNameKey: self.themes[(NSUInteger)indexPath.row] }; diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index a0caba205..45e501afc 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -165,7 +165,7 @@ -(NSUInteger)numberOfGroupsInImageBrowser:(IKImageBrowserView *)aBrowser return [[PlotGallery sharedPlotGallery] numberOfSections]; } --(NSDictionary *)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index +-(CPTDictionary)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index { NSString *groupTitle = [[PlotGallery sharedPlotGallery] sectionTitles][index]; diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index 7591b2ad3..39acab7b3 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -10,7 +10,7 @@ @interface CandlestickPlot() @property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -40,7 +40,7 @@ -(id)init -(void)generateData { if ( !self.plotData ) { - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { NSTimeInterval x = oneDay * i; diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index b78773101..699b69b72 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -2,7 +2,7 @@ @interface ColoredBarChart() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray plotData; @end @@ -28,7 +28,7 @@ -(id)init -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + CPTMutableNumberArray contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { [contentArray addObject:@(10.0 * arc4random() / (double)UINT32_MAX + 5.0)]; } @@ -146,13 +146,13 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { - NSArray *nums = nil; + CPTNumberArray nums = nil; switch ( fieldEnum ) { case CPTBarPlotFieldBarLocation: nums = [NSMutableArray arrayWithCapacity:indexRange.length]; for ( NSUInteger i = indexRange.location; i < NSMaxRange(indexRange); i++ ) { - [(NSMutableArray *)nums addObject : @(i)]; + [(NSMutableArray < NSNumber * > *) nums addObject : @(i)]; } break; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.h b/examples/CorePlotGallery/src/plots/CompositePlot.h index 1b8f875fa..8a1ef49ec 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.h +++ b/examples/CorePlotGallery/src/plots/CompositePlot.h @@ -10,8 +10,8 @@ CPTScatterPlotDelegate, CPTBarPlotDelegate> -@property (readwrite, strong, nonatomic) NSMutableArray *dataForChart; -@property (readwrite, strong, nonatomic) NSMutableArray *dataForPlot; +@property (readwrite, strong, nonatomic) CPTMutableNumberArray dataForChart; +@property (readwrite, strong, nonatomic) NSMutableArray *dataForPlot; -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 9c402892e..02ddb3346 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -249,9 +249,9 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe x.majorIntervalLength = @0.5; x.orthogonalPosition = @2.0; x.minorTicksPerInterval = 2; - NSArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; @@ -318,7 +318,7 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe [self.scatterPlot addPlot:dataSourceLinePlot]; // Add some initial data - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; + NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 60; i++ ) { NSNumber *xVal = @(1 + i * 0.05); NSNumber *yVal = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2); @@ -358,10 +358,10 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( x.labelOffset = 2.0; x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - NSArray *customTickLocations = @[@1, @5, @10, @15]; - NSArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - NSMutableSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + NSUInteger labelLocation = 0; + CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index a224e79a8..fe494c767 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -9,7 +9,7 @@ @interface ControlChart() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray plotData; @property (nonatomic, readwrite, assign) double meanValue; @property (nonatomic, readwrite, assign) double standardError; @@ -39,7 +39,7 @@ -(id)init -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + CPTMutableNumberArray contentArray = [NSMutableArray array]; double sum = 0.0; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 103b5dbc1..e6f08fe2f 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -14,9 +14,9 @@ @interface CurvedScatterPlot() @property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *plotData; -@property (nonatomic, readwrite, strong) NSArray *plotData1; -@property (nonatomic, readwrite, strong) NSArray *plotData2; +@property (nonatomic, readwrite, strong) NSArray *> *plotData; +@property (nonatomic, readwrite, strong) NSArray *> *plotData1; +@property (nonatomic, readwrite, strong) NSArray *> *plotData2; @end @@ -60,12 +60,14 @@ -(void)killGraph -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + NSMutableArray *> *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 11; i++ ) { NSNumber *x = @(1.0 + i * 0.05); NSNumber *y = @(1.2 * arc4random() / (double)UINT32_MAX + 0.5); - [contentArray addObject:@{ @"x": x, @"y": y } + [contentArray addObject: + @{ @"x": x, + @"y": y } ]; } @@ -73,25 +75,26 @@ -(void)generateData } if ( self.plotData1 == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + NSMutableArray *> *contentArray = [NSMutableArray array]; - NSArray *dataArray = self.plotData; + NSArray *> *dataArray = self.plotData; for ( NSUInteger i = 1; i < dataArray.count; i++ ) { - NSDictionary *point1 = dataArray[i - 1]; - NSDictionary *point2 = dataArray[i]; + NSDictionary *point1 = dataArray[i - 1]; + NSDictionary *point2 = dataArray[i]; - double x1 = [(NSNumber *)point1[@"x"] doubleValue]; - double x2 = [(NSNumber *)point2[@"x"] doubleValue]; + double x1 = [point1[@"x"] doubleValue]; + double x2 = [point2[@"x"] doubleValue]; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [(NSNumber *)point1[@"y"] doubleValue]; - double y2 = [(NSNumber *)point2[@"y"] doubleValue]; + double y1 = [point1[@"y"] doubleValue]; + double y2 = [point2[@"y"] doubleValue]; double dy = y2 - y1; - [contentArray addObject:@{ @"x": @(xLoc), - @"y": @( (dy / dx) / 20.0 ) } + [contentArray addObject: + @{ @"x": @(xLoc), + @"y": @( (dy / dx) / 20.0 ) } ]; } @@ -99,25 +102,26 @@ -(void)generateData } if ( self.plotData2 == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + NSMutableArray *> *contentArray = [NSMutableArray array]; - NSArray *dataArray = self.plotData1; + NSArray *> *dataArray = self.plotData1; for ( NSUInteger i = 1; i < dataArray.count; i++ ) { - NSDictionary *point1 = dataArray[i - 1]; - NSDictionary *point2 = dataArray[i]; + NSDictionary *point1 = dataArray[i - 1]; + NSDictionary *point2 = dataArray[i]; - double x1 = [(NSNumber *)point1[@"x"] doubleValue]; - double x2 = [(NSNumber *)point2[@"x"] doubleValue]; + double x1 = [point1[@"x"] doubleValue]; + double x2 = [point2[@"x"] doubleValue]; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [(NSNumber *)point1[@"y"] doubleValue]; - double y2 = [(NSNumber *)point2[@"y"] doubleValue]; + double y1 = [point1[@"y"] doubleValue]; + double y2 = [point2[@"y"] doubleValue]; double dy = y2 - y1; - [contentArray addObject:@{ @"x": @(xLoc), - @"y": @( (dy / dx) / 20.0 ) } + [contentArray addObject: + @{ @"x": @(xLoc), + @"y": @( (dy / dx) / 20.0 ) } ]; } @@ -375,12 +379,12 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; // Determine point of symbol in plot coordinates - NSDictionary *dataPoint = self.plotData[index]; + NSDictionary *dataPoint = self.plotData[index]; NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - NSArray *anchorPoint = @[x, y]; + CPTNumberArray anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index a29667445..f6bd26127 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -7,7 +7,7 @@ @interface DatePlot() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -36,7 +36,7 @@ -(void)generateData const NSTimeInterval oneDay = 24 * 60 * 60; // Add some data - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { NSTimeInterval xVal = oneDay * i; diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index d7db670a0..21c05b332 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -5,7 +5,7 @@ @interface DonutChart() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray plotData; @end diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index c683dcf75..5579711bb 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -4,7 +4,7 @@ @interface FunctionPlot() -@property (nonatomic, readwrite, strong) NSMutableSet *dataSources; +@property (nonatomic, readwrite, strong) NSMutableSet *dataSources; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE -(UIFont *)italicFontForFont:(UIFont *)oldFont; @@ -139,7 +139,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP CPTScatterPlot *linePlot = [[CPTScatterPlot alloc] init]; linePlot.identifier = [NSString stringWithFormat:@"Function Plot %lu", (unsigned long)(plotNum + 1)]; - NSDictionary *textAttributes = x.titleTextStyle.attributes; + CPTDictionary textAttributes = x.titleTextStyle.attributes; NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:titleString attributes:textAttributes]; @@ -212,7 +212,7 @@ -(UIFont *)italicFontForFont:(UIFont *)oldFont { NSString *italicName = nil; - NSArray *fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; + CPTStringArray fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; for ( NSString *fontName in fontNames ) { NSString *upperCaseFontName = [fontName uppercaseString]; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 1dcbf0620..021917f90 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -8,7 +8,7 @@ @interface GradientScatterPlot() @property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -50,7 +50,7 @@ -(void)killGraph -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; + NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); NSNumber *y = @(1.2 * arc4random() / (double)UINT32_MAX + 0.5); @@ -244,12 +244,12 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; // Determine point of symbol in plot coordinates - NSDictionary *dataPoint = self.plotData[index]; + NSDictionary *dataPoint = self.plotData[index]; NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - NSArray *anchorPoint = @[x, y]; + CPTNumberArray anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index 658793a16..9e8cea307 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -70,9 +70,9 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP axisTitleTextStyle.fontName = @"Helvetica-Bold"; // Tick locations - NSSet *majorTickLocations = [NSSet setWithObjects:@0, @30, @50, @85, @100, nil]; + CPTNumberSet majorTickLocations = [NSSet setWithObjects:@0, @30, @50, @85, @100, nil]; - NSMutableSet *minorTickLocations = [NSMutableSet set]; + CPTMutableNumberSet minorTickLocations = [NSMutableSet set]; for ( NSUInteger loc = 0; loc <= 100; loc += 10 ) { [minorTickLocations addObject:@(loc)]; } @@ -95,7 +95,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP axisNone.majorTickLocations = majorTickLocations; axisNone.minorTickLocations = minorTickLocations; - NSMutableSet *newAxisLabels = [NSMutableSet set]; + CPTMutableAxisLabelSet newAxisLabels = [NSMutableSet set]; for ( NSUInteger i = 0; i <= 5; i++ ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"Label %lu", (unsigned long)i] textStyle:axisNone.labelTextStyle]; diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index 2eeac78da..72b0f3ef5 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -60,7 +60,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP lineCap.fill = [CPTFill fillWithColor:[CPTColor blueColor]]; // Axes - NSMutableArray *axes = [[NSMutableArray alloc] init]; + CPTMutableAxisArray axes = [[NSMutableArray alloc] init]; CPTLineCapType lineCapType = CPTLineCapTypeNone; while ( lineCapType < CPTLineCapTypeCustom ) { diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 983cf66ca..9a07730af 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -10,7 +10,7 @@ @interface OHLCPlot() @property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -40,7 +40,7 @@ -(id)init -(void)generateData { if ( !self.plotData ) { - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { NSTimeInterval x = oneDay * i; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index dfb820045..08dd23d8b 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -10,7 +10,7 @@ @interface RangePlot() @property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @property (nonatomic, readwrite, strong) CPTFill *areaFill; @property (nonatomic, readwrite, strong) CPTLineStyle *barLineStyle; @@ -44,7 +44,7 @@ -(id)init -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { NSTimeInterval x = oneDay * (i + 1.0); diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 7fdda4300..94ba1d94c 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -13,7 +13,7 @@ @interface RealTimePlot() -@property (nonatomic, readwrite, strong) NSMutableArray *plotData; +@property (nonatomic, readwrite, strong) CPTMutableNumberArray plotData; @property (nonatomic, readwrite, assign) NSUInteger currentIndex; @property (nonatomic, readwrite, strong) NSTimer *dataTimer; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index b3dee3b5a..22162f886 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -7,7 +7,7 @@ @interface SimplePieChart() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray plotData; @property (nonatomic, readwrite) NSUInteger offsetIndex; @property (nonatomic, readwrite) CGFloat sliceOffset; @@ -135,8 +135,8 @@ -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)in self.offsetIndex = NSNotFound; - NSMutableArray *newData = [[NSMutableArray alloc] init]; - NSUInteger dataCount = (NSUInteger)lrint( ceil(10.0 * arc4random() / (double)UINT32_MAX) ) + 1; + CPTMutableNumberArray newData = [[NSMutableArray alloc] init]; + NSUInteger dataCount = (NSUInteger)lrint( ceil(10.0 * arc4random() / (double)UINT32_MAX) ) + 1; for ( NSUInteger i = 1; i < dataCount; i++ ) { [newData addObject:@(100.0 * arc4random() / (double)UINT32_MAX)]; } diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index ac052922b..9d079dd7d 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -8,7 +8,7 @@ @interface SimpleScatterPlot() @property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @property (nonatomic, readwrite, assign) CPTScatterPlotHistogramOption histogramOption; @end @@ -54,7 +54,7 @@ -(void)killGraph -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + NSMutableArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); NSNumber *y = @(1.2 * arc4random() / (double)UINT32_MAX + 0.5); @@ -235,12 +235,12 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; // Determine point of symbol in plot coordinates - NSDictionary *dataPoint = self.plotData[index]; + NSDictionary *dataPoint = self.plotData[index]; NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - NSArray *anchorPoint = @[x, y]; + CPTNumberArray anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index 3a71b5646..e802b9631 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -7,7 +7,7 @@ @interface SteppedScatterPlot() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -33,7 +33,7 @@ -(id)init -(void)generateData { if ( self.plotData == nil ) { - NSMutableArray *contentArray = [NSMutableArray array]; + NSMutableArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); NSNumber *y = @(1.2 * arc4random() / (double)UINT32_MAX + 1.2); diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index 010f70a3b..a3f914165 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -221,7 +221,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP theLegend.paddingRight = textSize * CPTFloat(0.375); theLegend.paddingBottom = textSize * CPTFloat(0.375); - NSArray *plotPoint = (kUseHorizontalBars ? @[@95, @0] : @[@0, @95]); + CPTNumberArray plotPoint = (kUseHorizontalBars ? @[@95, @0] : @[@0, @95]); CPTPlotSpaceAnnotation *legendAnnotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:barPlotSpace anchorPlotPoint:plotPoint]; legendAnnotation.contentLayer = theLegend; @@ -263,7 +263,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index NSNumber *x = @(index); NSNumber *y = @2; - NSArray *anchorPoint = (kUseHorizontalBars ? @[y, x] : @[x, y]); + CPTNumberArray anchorPoint = (kUseHorizontalBars ? @[y, x] : @[x, y]); // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.h b/examples/CorePlotGallery/src/shared/PlotGallery.h index 8ff5f6135..fb70203f1 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.h +++ b/examples/CorePlotGallery/src/shared/PlotGallery.h @@ -9,7 +9,7 @@ @property (nonatomic, readonly) NSUInteger count; @property (nonatomic, readonly) NSUInteger numberOfSections; -@property (nonatomic, readonly, strong) NSArray *sectionTitles; +@property (nonatomic, readonly, strong) CPTStringArray sectionTitles; +(PlotGallery *)sharedPlotGallery; diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index bb154feaa..37cf8d419 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -7,7 +7,7 @@ @interface PlotGallery() -@property (nonatomic, readwrite, strong) NSMutableArray *plotItems; +@property (nonatomic, readwrite, strong) NSMutableArray *plotItems; @property (nonatomic, readwrite, strong) NSCountedSet *plotSections; @end @@ -105,7 +105,7 @@ -(void)sortByTitle [self.plotItems sortUsingSelector:@selector(titleCompare:)]; } --(NSArray *)sectionTitles +-(CPTStringArray)sectionTitles { return [[self.plotSections allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; } diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index fcb795d72..43ad4f566 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -32,7 +32,7 @@ extern NSString *const kFinancialPlots; @property (nonatomic, readwrite, strong) CPTGraphHostingView *defaultLayerHostingView; -@property (nonatomic, readwrite, strong) NSMutableArray *graphs; +@property (nonatomic, readwrite, strong) NSMutableArray<__kindof CPTGraph *> *graphs; @property (nonatomic, readwrite, strong) NSString *section; @property (nonatomic, readwrite, strong) NSString *title; diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index ab9733ec8..a61dabe25 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -12,7 +12,7 @@ @interface CPTPlotDocument() @property (nonatomic, readwrite, assign) double maximumValueForYAxis; @property (nonatomic, readwrite, assign) double majorIntervalLengthForX; @property (nonatomic, readwrite, assign) double majorIntervalLengthForY; -@property (nonatomic, readwrite, strong) NSArray *dataPoints; +@property (nonatomic, readwrite, strong) NSArray *dataPoints; @property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *zoomAnnotation; @property (nonatomic, readwrite, assign) CGPoint dragStart; @@ -151,7 +151,7 @@ -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *_ double minY = MAXFLOAT; double maxY = -MAXFLOAT; - NSMutableArray *newData = [[NSMutableArray alloc] init]; + NSMutableArray *newData = [[NSMutableArray alloc] init]; NSString *fileContents = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; @@ -163,13 +163,13 @@ -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *_ // Read headers from the first line of the file [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; // currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); -// NSArray *columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; +// CPTStringArray columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; // NSLog([columnHeaders objectAtIndex:0]); while ( lineEnd < length ) { [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); - NSArray *columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; + CPTStringArray columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; double xValue = [columnValues[0] doubleValue]; double yValue = [columnValues[1] doubleValue]; @@ -270,7 +270,7 @@ -(IBAction)zoomOut double maxY = -MAXFLOAT; // get the ful range min and max values - for ( NSDictionary *xyValues in self.dataPoints ) { + for ( NSDictionary *xyValues in self.dataPoints ) { double xVal = [xyValues[@"x"] doubleValue]; minX = fmin(xVal, minX); @@ -411,8 +411,8 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)e double start[2]; [self.graph.defaultPlotSpace doublePrecisionPlotPoint:start numberOfCoordinates:2 forPlotAreaViewPoint:dragStartInPlotArea]; - NSArray *anchorPoint = @[@(start[CPTCoordinateX]), - @(start[CPTCoordinateY])]; + CPTNumberArray anchorPoint = @[@(start[CPTCoordinateX]), + @(start[CPTCoordinateY])]; // now create the annotation CPTPlotSpace *defaultSpace = self.graph.defaultPlotSpace; diff --git a/examples/DropPlot/NSString+ParseCSV.h b/examples/DropPlot/NSString+ParseCSV.h index 7df3e87cd..050b88e4e 100644 --- a/examples/DropPlot/NSString+ParseCSV.h +++ b/examples/DropPlot/NSString+ParseCSV.h @@ -1,7 +1,8 @@ #import +#import @interface NSString(ParseCSV) --(NSArray *)arrayByParsingCSVLine; +-(CPTStringArray)arrayByParsingCSVLine; @end diff --git a/examples/DropPlot/NSString+ParseCSV.m b/examples/DropPlot/NSString+ParseCSV.m index d1ba330e9..d3b604b98 100644 --- a/examples/DropPlot/NSString+ParseCSV.m +++ b/examples/DropPlot/NSString+ParseCSV.m @@ -2,17 +2,18 @@ @implementation NSString(ParseCSV) --(NSArray *)arrayByParsingCSVLine +-(CPTStringArray)arrayByParsingCSVLine { - BOOL isRemoveWhitespace = YES; - NSMutableArray *theArray = [NSMutableArray array]; - NSArray *theFields = [self componentsSeparatedByString:@","]; + BOOL isRemoveWhitespace = YES; + + CPTMutableStringArray theArray = [NSMutableArray array]; + CPTStringArray theFields = [self componentsSeparatedByString:@","]; NSCharacterSet *quotedCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"\""]; - BOOL inField = NO; NSMutableString *theConcatenatedField = [NSMutableString string]; - unsigned int i; - for ( i = 0; i < [theFields count]; i++ ) { + BOOL inField = NO; + + for ( NSUInteger i = 0; i < [theFields count]; i++ ) { NSString *theField = theFields[i]; switch ( inField ) { case NO: diff --git a/examples/MinorTickLabels/Controller.m b/examples/MinorTickLabels/Controller.m index 1a98b3d8f..118873b06 100644 --- a/examples/MinorTickLabels/Controller.m +++ b/examples/MinorTickLabels/Controller.m @@ -5,7 +5,7 @@ @interface Controller() @property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; @property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @end @@ -81,7 +81,7 @@ -(void)awakeFromNib [newGraph addPlot:dataSourceLinePlot]; // Add some data - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 7; i++ ) { NSTimeInterval xVal = oneDay * i * 0.5; diff --git a/examples/RangePlot/Controller.m b/examples/RangePlot/Controller.m index 800cd2bf1..d2b16d02e 100644 --- a/examples/RangePlot/Controller.m +++ b/examples/RangePlot/Controller.m @@ -5,7 +5,7 @@ @interface Controller() @property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; @property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) NSArray *plotData; @property (nonatomic, readwrite, strong) CPTFill *areaFill; @property (nonatomic, readwrite, strong) CPTLineStyle *barLineStyle; @@ -99,7 +99,7 @@ -(void)awakeFromNib self.areaFill = [[CPTFill alloc] initWithColor:transparentGreen]; // Add some data - NSMutableArray *newData = [NSMutableArray array]; + NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { NSTimeInterval xVal = oneDay * (i + 1.0); diff --git a/examples/StockPlot/Classes/APYahooDataPuller.h b/examples/StockPlot/Classes/APYahooDataPuller.h index 1d807542f..9852aecdc 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.h +++ b/examples/StockPlot/Classes/APYahooDataPuller.h @@ -1,7 +1,9 @@ -#import +#import "NSDictionary+APFinancialData.h" @class APYahooDataPuller; +typedef NSArray *CPTFinancialDataArray; + @protocol APYahooDataPullerDelegate @optional @@ -20,7 +22,7 @@ @property (nonatomic, readwrite, copy) NSString *targetSymbol; @property (nonatomic, readwrite, strong) NSDate *targetStartDate; @property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) NSArray *financialData; +@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; @property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; @property (nonatomic, readonly, assign) BOOL loadingData; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index 90b3c11d2..e797ccf19 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -7,7 +7,7 @@ @interface APYahooDataPuller() @property (nonatomic, readwrite, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; -@property (nonatomic, readwrite, strong) NSArray *financialData; +@property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; @property (nonatomic, readwrite, strong) NSMutableData *receivedData; @@ -47,9 +47,9 @@ @implementation APYahooDataPuller @synthesize delegate; //convert any NSNumber in financial line to NSDecimalNumber --(NSDictionary *)sanitizedFinancialLine:(NSDictionary *)theFinancialLine +-(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine { - NSMutableDictionary *aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; + CPTMutableDictionary aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; for ( id key in [aFinancialLine allKeys] ) { id something = aFinancialLine[key]; @@ -67,10 +67,12 @@ -(void)setFinancialData:(NSArray *)aFinancialData if ( financialData != aFinancialData ) { NSMutableArray *mutableFinancialData = [aFinancialData mutableCopy]; - NSDictionary *financialLine = nil; - NSUInteger i = 0, count = mutableFinancialData.count; - for ( i = 0; i < count; i++ ) { - financialLine = (NSDictionary *)mutableFinancialData[i]; + CPTDictionary financialLine = nil; + + NSUInteger count = mutableFinancialData.count; + + for ( NSUInteger i = 0; i < count; i++ ) { + financialLine = (CPTDictionary)mutableFinancialData[i]; financialLine = [self sanitizedFinancialLine:financialLine]; mutableFinancialData[i] = financialLine; } @@ -82,9 +84,9 @@ -(void)setFinancialData:(NSArray *)aFinancialData } } --(NSDictionary *)plistRep +-(CPTDictionary)plistRep { - NSMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = [self symbol]; rep[@"startDate"] = [self startDate]; @@ -92,6 +94,7 @@ -(NSDictionary *)plistRep rep[@"overallHigh"] = [self overallHigh]; rep[@"overallLow"] = [self overallLow]; rep[@"financialData"] = [self financialData]; + return [NSDictionary dictionaryWithDictionary:rep]; } @@ -102,7 +105,7 @@ -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag return success; } --(id)initWithDictionary:(NSDictionary *)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(id)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { self = [super init]; if ( self != nil ) { @@ -122,7 +125,7 @@ -(id)initWithDictionary:(NSDictionary *)aDict targetSymbol:(NSString *)aSymbol t -(NSString *)pathForSymbol:(NSString *)aSymbol { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; NSString *docPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; @@ -141,29 +144,31 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } //Always returns *something* --(NSDictionary *)dictionaryForSymbol:(NSString *)aSymbol +-(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol { - NSString *path = [self faultTolerantPathForSymbol:aSymbol]; - NSMutableDictionary *localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + NSString *path = [self faultTolerantPathForSymbol:aSymbol]; + + CPTMutableDictionary localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; return localPlistDict; } -(id)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { - NSDictionary *cachedDictionary = [self dictionaryForSymbol:aSymbol]; + CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; if ( nil != cachedDictionary ) { return [self initWithDictionary:cachedDictionary targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } - NSMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = aSymbol; rep[@"startDate"] = aStartDate; rep[@"endDate"] = anEndDate; rep[@"overallHigh"] = [NSDecimalNumber notANumber]; rep[@"overallLow"] = [NSDecimalNumber notANumber]; rep[@"financialData"] = @[]; + return [self initWithDictionary:rep targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } @@ -313,10 +318,11 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection -(void)populateWithString:(NSString *)csv { - NSArray *csvLines = [csv componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:csvLines.count]; - NSDictionary *currentFinancial = nil; - NSString *line = nil; + CPTStringArray csvLines = [csv componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:csvLines.count]; + NSDictionary *currentFinancial = nil; + NSString *line = nil; self.overallHigh = [NSDecimalNumber notANumber]; self.overallLow = [NSDecimalNumber notANumber]; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 8b44c3694..c855ea68e 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -127,9 +127,9 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI num = @(index + 1); } else if ( fieldEnum == CPTScatterPlotFieldY ) { - NSArray *financialData = self.dataPuller.financialData; + CPTFinancialDataArray financialData = self.dataPuller.financialData; - NSDictionary *fData = (NSDictionary *)financialData[[financialData count] - index - 1]; + CPTDictionary fData = financialData[[financialData count] - index - 1]; num = fData[@"close"]; NSAssert([num isMemberOfClass:[NSDecimalNumber class]], @"grrr"); } diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h index 7ca481d37..6ede21860 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h @@ -1,7 +1,7 @@ -#import +#import "CorePlot-CocoaTouch.h" @interface NSDictionary(APFinancialData) -+(id)dictionaryWithCSVLine:(NSString *)csvLine; ++(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; @end diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 51f8ea553..355e1db9d 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -25,28 +25,28 @@ +(NSDateFormatter *)yahooCSVDateFormatter @implementation NSDictionary(APFinancialData) -+(id)dictionaryWithCSVLine:(NSString *)csvLine ++(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine { - NSArray *csvChunks = [csvLine componentsSeparatedByString:@","]; + CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; - NSMutableDictionary *csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; // Date,Open,High,Low,Close,Volume,Adj Close // 2009-06-08,143.82,144.23,139.43,143.85,33255400,143.85 - NSDate *theDate = [[NSDateFormatter yahooCSVDateFormatter] dateFromString:(NSString *)csvChunks[0]]; + NSDate *theDate = [[NSDateFormatter yahooCSVDateFormatter] dateFromString:csvChunks[0]]; csvDict[@"date"] = theDate; - NSDecimalNumber *theOpen = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[1]]; + NSDecimalNumber *theOpen = [NSDecimalNumber decimalNumberWithString:csvChunks[1]]; csvDict[@"open"] = theOpen; - NSDecimalNumber *theHigh = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[2]]; + NSDecimalNumber *theHigh = [NSDecimalNumber decimalNumberWithString:csvChunks[2]]; csvDict[@"high"] = theHigh; - NSDecimalNumber *theLow = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[3]]; + NSDecimalNumber *theLow = [NSDecimalNumber decimalNumberWithString:csvChunks[3]]; csvDict[@"low"] = theLow; - NSDecimalNumber *theClose = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[4]]; + NSDecimalNumber *theClose = [NSDecimalNumber decimalNumberWithString:csvChunks[4]]; csvDict[@"close"] = theClose; - NSDecimalNumber *theVolume = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[5]]; + NSDecimalNumber *theVolume = [NSDecimalNumber decimalNumberWithString:csvChunks[5]]; csvDict[@"volume"] = theVolume; - NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:(NSString *)csvChunks[6]]; + NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:csvChunks[6]]; csvDict[@"adjClose"] = theAdjClose; //non-mutable autoreleased dict diff --git a/examples/StockPlot/Classes/RootViewController.h b/examples/StockPlot/Classes/RootViewController.h index cebf53065..c1559f3ef 100644 --- a/examples/StockPlot/Classes/RootViewController.h +++ b/examples/StockPlot/Classes/RootViewController.h @@ -12,7 +12,7 @@ @interface RootViewController : UITableViewController -@property (nonatomic, readonly, strong) NSArray *symbols; +@property (nonatomic, readonly, strong) CPTStringArray symbols; -(void)addSymbol:(NSString *)aSymbol; diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index e079077aa..c2561bf62 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -12,7 +12,7 @@ @interface RootViewController() @property (nonatomic, readwrite, strong) APYahooDataPullerGraph *graph; -@property (nonatomic, readwrite, strong) NSMutableArray *stocks; +@property (nonatomic, readwrite, strong) NSMutableArray *stocks; @end @@ -187,10 +187,10 @@ -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie #pragma mark - #pragma mark accessors --(NSArray *)symbols +-(CPTStringArray)symbols { //NSLog(@"in -symbols, returned symbols = %@", symbols); - NSMutableArray *symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; + CPTMutableStringArray symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; for ( APYahooDataPuller *dp in self.stocks ) { [symbols addObject:[dp symbol]]; diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index 29b2f1e75..b1971c5ea 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -97,7 +97,7 @@ AB6FA4A30FEB579B008DB04A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; AB6FA4DE0FEB59DB008DB04A /* NSDictionary+APFinancialData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APFinancialData.h"; sourceTree = ""; }; AB6FA5560FEB6235008DB04A /* APYahooDataPullerGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APYahooDataPullerGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - AB6FA5570FEB6235008DB04A /* APYahooDataPullerGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APYahooDataPullerGraph.m; sourceTree = ""; }; + AB6FA5570FEB6235008DB04A /* APYahooDataPullerGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APYahooDataPullerGraph.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; AB6FA5580FEB6235008DB04A /* APYahooDataPullerGraph.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = APYahooDataPullerGraph.xib; path = Classes/APYahooDataPullerGraph.xib; sourceTree = ""; }; AB6FA6090FEB6DAA008DB04A /* YHOO.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = YHOO.plist; sourceTree = SOURCE_ROOT; }; AB6FA60A0FEB6DAA008DB04A /* MSFT.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = MSFT.plist; sourceTree = SOURCE_ROOT; }; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index a224cf37d..de8bd518c 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -729,7 +729,7 @@ 07CA112E0FAC8F85000861CE /* CPTGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGradient.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07E10BAF11D1016B000B8DAB /* CPTPlotSpaceAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTPlotSpaceAnnotation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotSpaceAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 07E10BB411D10177000B8DAB /* CPTAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnnotation.h; sourceTree = ""; }; + 07E10BB411D10177000B8DAB /* CPTAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnnotation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07E10BB511D10177000B8DAB /* CPTAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07E10BB911D10183000B8DAB /* CPTLayerAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLayerAnnotation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLayerAnnotation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 2670d1a65..e62e4fe1a 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -448,7 +448,7 @@ -(void)resetCursorRects **/ -(void)plotSpaceAdded:(NSNotification *)notification { - NSDictionary *userInfo = notification.userInfo; + CPTDictionary userInfo = notification.userInfo; CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; [space addObserver:self @@ -462,7 +462,7 @@ -(void)plotSpaceAdded:(NSNotification *)notification **/ -(void)plotSpaceRemoved:(NSNotification *)notification { - NSDictionary *userInfo = notification.userInfo; + CPTDictionary userInfo = notification.userInfo; CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; [space removeObserver:self forKeyPath:@"isDragging" context:CPTGraphHostingViewKVOContext]; @@ -484,7 +484,7 @@ -(void)plotAreaBoundsChanged /// @cond --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(CPTDictionary)change context:(void *)context { if ( context == CPTGraphHostingViewKVOContext ) { CPTGraph *theGraph = self.hostedGraph; diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index c2ba07e3e..d8f2c8d59 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -3,8 +3,8 @@ #pragma mark Graphics Context // linked list to store saved contexts -static NSMutableArray *pushedContexts = nil; -static dispatch_once_t contextOnceToken = 0; +static NSMutableArray *pushedContexts = nil; +static dispatch_once_t contextOnceToken = 0; static dispatch_queue_t contextQueue = NULL; static dispatch_once_t queueOnceToken = 0; @@ -29,7 +29,7 @@ void CPTPushCGContext(CGContextRef newContext) [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:newContext flipped:NO]]; } else { - [pushedContexts addObject:[NSNull null]]; + [pushedContexts addObject:(NSGraphicsContext *)[NSNull null]]; } }); } diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index 15ca7024a..b6ed84fda 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -6,7 +6,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property NSDictionary *attributes +/** @property CPTDictionary attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -32,7 +32,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(NSDictionary *)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -82,9 +82,9 @@ +(instancetype)textStyleWithAttributes:(NSDictionary *)attributes /// @cond --(NSDictionary *)attributes +-(CPTDictionary)attributes { - NSMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; + CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; // Font NSFont *styleFont = nil; @@ -127,7 +127,7 @@ @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtension /// @cond -+(instancetype)textStyleWithAttributes:(NSDictionary *)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -199,7 +199,7 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style CGSize textSize; if ( theFont ) { - NSDictionary *attributes = @{ + CPTDictionary attributes = @{ NSFontAttributeName: theFont }; @@ -246,7 +246,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG paragraphStyle.alignment = (NSTextAlignment)style.textAlignment; paragraphStyle.lineBreakMode = style.lineBreakMode; - NSDictionary *attributes = @{ + CPTDictionary attributes = @{ NSFontAttributeName: theFont, NSForegroundColorAttributeName: foregroundColor, NSParagraphStyleAttributeName: paragraphStyle diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 9d7b0adab..49956f5bd 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -13,18 +13,20 @@ static NSString *const CPTAnimationFinishedKey = @"CPTAnimationFinishedKey"; /// @cond +typedef NSMutableArray *CPTMutableAnimationArray; + @interface CPTAnimation() @property (nonatomic, readwrite, assign) CGFloat timeOffset; -@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *animationOperations; -@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *runningAnimationOperations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray animationOperations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray runningAnimationOperations; @property (nonatomic, readwrite) dispatch_source_t timer; @property (nonatomic, readwrite) dispatch_queue_t animationQueue; +(nonnull SEL)setterFromProperty:(nonnull NSString *)property; -(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve; --(void)updateOnMainThreadWithParameters:(nonnull NSDictionary *)parameters; +-(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters; -(void)startTimer; -(void)cancelTimer; @@ -59,14 +61,14 @@ @implementation CPTAnimation @synthesize defaultAnimationCurve; /** @internal - * @property NSMutableArray *animationOperations + * @property CPTMutableAnimationArray animationOperations * * @brief The list of animation operations currently running or waiting to run. **/ @synthesize animationOperations; /** @internal - * @property NSMutableArray *runningAnimationOperations + * @property CPTMutableAnimationArray runningAnimationOperations * @brief The list of running animation operations. **/ @synthesize runningAnimationOperations; @@ -260,12 +262,12 @@ -(void)update { self.timeOffset += kCPTAnimationFrameRate; - NSMutableArray *theAnimationOperations = self.animationOperations; - NSMutableArray *runningOperations = self.runningAnimationOperations; - NSMutableArray *expiredOperations = [[NSMutableArray alloc] init]; + CPTMutableAnimationArray theAnimationOperations = self.animationOperations; + CPTMutableAnimationArray runningOperations = self.runningAnimationOperations; + CPTMutableAnimationArray expiredOperations = [[NSMutableArray alloc] init]; - CGFloat currentTime = self.timeOffset; - NSArray *runModes = @[NSRunLoopCommonModes]; + CGFloat currentTime = self.timeOffset; + CPTStringArray runModes = @[NSRunLoopCommonModes]; dispatch_queue_t mainQueue = dispatch_get_main_queue(); @@ -333,7 +335,7 @@ -(void)update CGFloat progress = timingFunction(currentTime - startTime, duration); - NSDictionary *parameters = @{ + CPTDictionary parameters = @{ CPTAnimationOperationKey: animationOperation, CPTAnimationValueKey: [period tweenedValueForProgress:progress], CPTAnimationStartedKey: @(started), @@ -365,7 +367,7 @@ -(void)update } // This method must be called from the main thread. --(void)updateOnMainThreadWithParameters:(NSDictionary *)parameters +-(void)updateOnMainThreadWithParameters:(CPTDictionary)parameters { CPTAnimationOperation *animationOperation = parameters[CPTAnimationOperationKey]; diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index 45d50fc55..9bab1b560 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -1,8 +1,21 @@ #import "CPTDefinitions.h" +/// @file + +@class CPTAnnotation; @class CPTAnnotationHostLayer; @class CPTLayer; +/** + * @brief An array of annotations. + **/ +typedef NSArray<__kindof CPTAnnotation *> *CPTAnnotationArray; + +/** + * @brief A mutable array of annotations. + **/ +typedef NSMutableArray<__kindof CPTAnnotation *> *CPTMutableAnnotationArray; + @interface CPTAnnotation : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; diff --git a/framework/Source/CPTAnnotationHostLayer.h b/framework/Source/CPTAnnotationHostLayer.h index 127c281b0..56c71ce95 100644 --- a/framework/Source/CPTAnnotationHostLayer.h +++ b/framework/Source/CPTAnnotationHostLayer.h @@ -1,10 +1,9 @@ +#import "CPTAnnotation.h" #import "CPTLayer.h" -@class CPTAnnotation; - @interface CPTAnnotationHostLayer : CPTLayer -@property (nonatomic, readonly, nonnull) NSArray *annotations; +@property (nonatomic, readonly, nonnull) CPTAnnotationArray annotations; /// @name Annotations /// @{ diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index 5ee63b9f8..cbee41637 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -1,12 +1,11 @@ #import "CPTAnnotationHostLayer.h" -#import "CPTAnnotation.h" #import "CPTExceptions.h" /// @cond @interface CPTAnnotationHostLayer() -@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *mutableAnnotations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnnotationArray mutableAnnotations; @end @@ -21,7 +20,7 @@ @interface CPTAnnotationHostLayer() **/ @implementation CPTAnnotationHostLayer -/** @property NSArray *annotations +/** @property CPTAnnotationArray annotations * @brief An array of annotations attached to this layer. **/ @dynamic annotations; @@ -81,7 +80,7 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - NSArray *annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; + CPTAnnotationArray annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; if ( annotations ) { mutableAnnotations = [annotations mutableCopy]; } @@ -97,7 +96,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder #pragma mark - #pragma mark Annotations --(NSArray *)annotations +-(CPTAnnotationArray)annotations { return [self.mutableAnnotations copy]; } @@ -108,7 +107,7 @@ -(NSArray *)annotations -(void)addAnnotation:(CPTAnnotation *)annotation { if ( annotation ) { - NSMutableArray *annotationArray = self.mutableAnnotations; + CPTMutableAnnotationArray annotationArray = self.mutableAnnotations; if ( ![annotationArray containsObject:annotation] ) { [annotationArray addObject:annotation]; } @@ -139,7 +138,7 @@ -(void)removeAnnotation:(CPTAnnotation *)annotation **/ -(void)removeAllAnnotations { - NSMutableArray *allAnnotations = self.mutableAnnotations; + CPTMutableAnnotationArray allAnnotations = self.mutableAnnotations; for ( CPTAnnotation *annotation in allAnnotations ) { annotation.annotationHostLayer = nil; @@ -152,12 +151,12 @@ -(void)removeAllAnnotations /// @cond --(NSSet *)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet)sublayersExcludedFromAutomaticLayout { - NSMutableArray *annotations = self.mutableAnnotations; + CPTMutableAnnotationArray annotations = self.mutableAnnotations; if ( annotations.count > 0 ) { - NSMutableSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index c1d995464..b15f915b7 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -1,19 +1,20 @@ +#import "CPTAxisLabel.h" #import "CPTDefinitions.h" +#import "CPTFill.h" #import "CPTLayer.h" +#import "CPTLimitBand.h" +#import "CPTPlotRange.h" #import "CPTTextStyle.h" /// @file @class CPTAxis; -@class CPTAxisLabel; @class CPTAxisSet; @class CPTAxisTitle; @class CPTGridLines; -@class CPTLimitBand; @class CPTLineCap; @class CPTLineStyle; @class CPTPlotSpace; -@class CPTPlotRange; @class CPTPlotArea; @class CPTShadow; @@ -28,6 +29,16 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { CPTAxisLabelingPolicyEqualDivisions ///< Divide the plot range into equal parts. }; +/** + * @brief An array of axes. + **/ +typedef NSArray<__kindof CPTAxis *> *CPTAxisArray; + +/** + * @brief A mutable array of axes. + **/ +typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; + #pragma mark - /** @@ -59,7 +70,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param locations The locations of the major ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(nonnull NSSet *)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(nonnull CPTNumberSet)locations; /** @brief @optional This method gives the delegate a chance to create custom labels for each minor tick. * It can be used with any labeling policy. Returning @NO will cause the axis not @@ -68,7 +79,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { * @param locations The locations of the minor ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(nonnull NSSet *)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(nonnull CPTNumberSet)locations; /// @} @@ -225,10 +236,10 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { @property (nonatomic, readwrite, assign) CPTSign minorTickLabelDirection; @property (nonatomic, readwrite, strong, nullable) NSFormatter *labelFormatter; @property (nonatomic, readwrite, strong, nullable) NSFormatter *minorTickLabelFormatter; -@property (nonatomic, readwrite, strong, nullable) NSSet *axisLabels; -@property (nonatomic, readwrite, strong, nullable) NSSet *minorTickAxisLabels; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet axisLabels; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet minorTickAxisLabels; @property (nonatomic, readonly) BOOL needsRelabel; -@property (nonatomic, readwrite, strong, nullable) NSArray *labelExclusionRanges; +@property (nonatomic, readwrite, strong, nullable) CPTPlotRangeArray labelExclusionRanges; @property (nonatomic, readwrite, strong, nullable) CPTShadow *labelShadow; @property (nonatomic, readwrite, strong, nullable) CPTShadow *minorTickLabelShadow; /// @} @@ -238,7 +249,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { @property (nonatomic, readwrite, strong, nullable) NSNumber *majorIntervalLength; @property (nonatomic, readwrite, assign) CGFloat majorTickLength; @property (nonatomic, readwrite, copy, nullable) CPTLineStyle *majorTickLineStyle; -@property (nonatomic, readwrite, strong, nullable) NSSet *majorTickLocations; +@property (nonatomic, readwrite, strong, nullable) CPTNumberSet majorTickLocations; @property (nonatomic, readwrite, assign) NSUInteger preferredNumberOfMajorTicks; /// @} @@ -247,7 +258,7 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { @property (nonatomic, readwrite, assign) NSUInteger minorTicksPerInterval; @property (nonatomic, readwrite, assign) CGFloat minorTickLength; @property (nonatomic, readwrite, copy, nullable) CPTLineStyle *minorTickLineStyle; -@property (nonatomic, readwrite, strong, nullable) NSSet *minorTickLocations; +@property (nonatomic, readwrite, strong, nullable) CPTNumberSet minorTickLocations; /// @} /// @name Grid Lines @@ -259,8 +270,8 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Background Bands /// @{ -@property (nonatomic, readwrite, copy, nullable) NSArray *alternatingBandFills; -@property (nonatomic, readonly, nullable) NSArray *backgroundLimitBands; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray alternatingBandFills; +@property (nonatomic, readonly, nullable) CPTLimitBandArray backgroundLimitBands; /// @} /// @name Plot Space @@ -292,8 +303,8 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /// @name Ticks /// @{ --(nullable NSSet *)filteredMajorTickLocations:(nullable NSSet *)allLocations; --(nullable NSSet *)filteredMinorTickLocations:(nullable NSSet *)allLocations; +-(nullable CPTNumberSet)filteredMajorTickLocations:(nullable CPTNumberSet)allLocations; +-(nullable CPTNumberSet)filteredMinorTickLocations:(nullable CPTNumberSet)allLocations; /// @} /// @name Background Bands diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 4099e599f..8b9003ec2 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1,17 +1,14 @@ #import "CPTAxis.h" -#import "CPTAxisLabel.h" #import "CPTAxisLabelGroup.h" #import "CPTAxisSet.h" #import "CPTAxisTitle.h" #import "CPTColor.h" #import "CPTExceptions.h" -#import "CPTFill.h" #import "CPTGradient.h" #import "CPTGridLineGroup.h" #import "CPTGridLines.h" #import "CPTImage.h" -#import "CPTLimitBand.h" #import "CPTLineCap.h" #import "CPTLineStyle.h" #import "CPTMutablePlotRange.h" @@ -41,16 +38,16 @@ @interface CPTAxis() @property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; @property (nonatomic, readwrite, assign) BOOL labelFormatterChanged; @property (nonatomic, readwrite, assign) BOOL minorLabelFormatterChanged; -@property (nonatomic, readwrite, strong, nullable) NSMutableArray *mutableBackgroundLimitBands; +@property (nonatomic, readwrite, strong, nullable) CPTMutableLimitBandArray mutableBackgroundLimitBands; @property (nonatomic, readonly) CGFloat tickOffset; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @property (nonatomic, readwrite, assign) BOOL labelsUpdated; --(void)generateFixedIntervalMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; --(void)autoGenerateMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; --(void)generateEqualMajorTickLocations:(NSSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__nonnull __autoreleasing *)newMinorLocations; --(nullable NSSet *)filteredTickLocations:(nullable NSSet *)allLocations; --(void)updateAxisLabelsAtLocations:(nullable NSSet *)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; +-(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; +-(void)autoGenerateMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; +-(void)generateEqualMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; +-(nullable CPTNumberSet)filteredTickLocations:(nullable CPTNumberSet)allLocations; +-(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; -(void)updateCustomTickLabels; -(void)updateMajorTickLabelOffsets; -(void)updateMinorTickLabelOffsets; @@ -296,12 +293,12 @@ @implementation CPTAxis @synthesize minorLabelFormatterChanged; @dynamic tickOffset; -/** @property NSSet *axisLabels +/** @property CPTAxisLabelSet axisLabels * @brief The set of axis labels. **/ @synthesize axisLabels; -/** @property NSSet *minorTickAxisLabels +/** @property CPTAxisLabelSet minorTickAxisLabels * @brief The set of minor tick axis labels. **/ @synthesize minorTickAxisLabels; @@ -311,7 +308,7 @@ @implementation CPTAxis **/ @synthesize needsRelabel; -/** @property NSArray *labelExclusionRanges +/** @property CPTPlotRangeArray labelExclusionRanges * @brief An array of CPTPlotRange objects. Any tick marks and labels falling inside any of the ranges in the array will not be drawn. **/ @synthesize labelExclusionRanges; @@ -344,7 +341,7 @@ @implementation CPTAxis **/ @synthesize majorTickLength; -/** @property NSSet *majorTickLocations +/** @property CPTNumberSet majorTickLocations * @brief A set of axis coordinates for all major tick marks. **/ @synthesize majorTickLocations; @@ -375,7 +372,7 @@ @implementation CPTAxis **/ @synthesize minorTickLength; -/** @property NSSet *minorTickLocations +/** @property CPTNumberSet minorTickLocations * @brief A set of axis coordinates for all minor tick marks. **/ @synthesize minorTickLocations; @@ -404,7 +401,7 @@ @implementation CPTAxis // Background Bands -/** @property NSArray *alternatingBandFills +/** @property CPTFillArray alternatingBandFills * @brief An array of two or more fills to be drawn between successive major tick marks. * * When initializing the fills, provide an NSArray containing any combination of CPTFill, @@ -413,7 +410,7 @@ @implementation CPTAxis **/ @synthesize alternatingBandFills; -/** @property NSArray *backgroundLimitBands +/** @property CPTLimitBandArray backgroundLimitBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn on top of the alternating band fills. @@ -840,7 +837,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -873,10 +870,10 @@ +(BOOL)needsDisplayForKey:(NSString *)aKey * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations +-(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations { - NSMutableSet *majorLocations = [NSMutableSet set]; - NSMutableSet *minorLocations = [NSMutableSet set]; + CPTMutableNumberSet majorLocations = [NSMutableSet set]; + CPTMutableNumberSet minorLocations = [NSMutableSet set]; NSDecimal zero = CPTDecimalFromInteger(0); NSDecimal majorInterval = self.majorIntervalLength.decimalValue; @@ -953,11 +950,11 @@ -(void)generateFixedIntervalMajorTickLocations:(NSSet *__autoreleasing *)newMajo * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations +-(void)autoGenerateMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations { // Create sets for locations - NSMutableSet *majorLocations = [NSMutableSet set]; - NSMutableSet *minorLocations = [NSMutableSet set]; + CPTMutableNumberSet majorLocations = [NSMutableSet set]; + CPTMutableNumberSet minorLocations = [NSMutableSet set]; // Get plot range CPTMutablePlotRange *range = [[self.plotSpace plotRangeForCoordinate:self.coordinate] mutableCopy]; @@ -1155,10 +1152,10 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)generateEqualMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocations minorTickLocations:(NSSet *__autoreleasing *)newMinorLocations +-(void)generateEqualMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations { - NSMutableSet *majorLocations = [NSMutableSet set]; - NSMutableSet *minorLocations = [NSMutableSet set]; + CPTMutableNumberSet majorLocations = [NSMutableSet set]; + CPTMutableNumberSet minorLocations = [NSMutableSet set]; CPTMutablePlotRange *range = [[self.plotSpace plotRangeForCoordinate:self.coordinate] mutableCopy]; @@ -1314,12 +1311,12 @@ NSDecimal CPTNiceLength(NSDecimal length) * @param allLocations A set of tick locations. * @return The filtered set of tick locations. */ --(NSSet *)filteredTickLocations:(NSSet *)allLocations +-(CPTNumberSet)filteredTickLocations:(CPTNumberSet)allLocations { - NSArray *exclusionRanges = self.labelExclusionRanges; + CPTPlotRangeArray exclusionRanges = self.labelExclusionRanges; if ( exclusionRanges ) { - NSMutableSet *filteredLocations = [allLocations mutableCopy]; + CPTMutableNumberSet filteredLocations = [allLocations mutableCopy]; for ( CPTPlotRange *range in exclusionRanges ) { for ( NSNumber *location in allLocations ) { if ( [range containsNumber:location] ) { @@ -1340,7 +1337,7 @@ -(NSSet *)filteredTickLocations:(NSSet *)allLocations * @param allLocations A set of major tick locations. * @return The filtered set. **/ --(NSSet *)filteredMajorTickLocations:(NSSet *)allLocations +-(CPTNumberSet)filteredMajorTickLocations:(CPTNumberSet)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1349,7 +1346,7 @@ -(NSSet *)filteredMajorTickLocations:(NSSet *)allLocations * @param allLocations A set of minor tick locations. * @return The filtered set. **/ --(NSSet *)filteredMinorTickLocations:(NSSet *)allLocations +-(CPTNumberSet)filteredMinorTickLocations:(CPTNumberSet)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1385,7 +1382,7 @@ -(CGFloat)tickOffset * @param labeledRange A plot range used to filter the generated labels. If @nil, no filtering is done. * @param useMajorAxisLabels If @YES, label the major ticks, otherwise label the minor ticks. **/ --(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels +-(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels { CPTAlignment theLabelAlignment; CPTSign theLabelDirection; @@ -1441,7 +1438,7 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la return; } - NSDictionary *textAttributes = [theLabelTextStyle attributes]; + CPTDictionary textAttributes = [theLabelTextStyle attributes]; BOOL hasAttributedFormatter = ([theLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -1462,7 +1459,7 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la CPTPlotArea *thePlotArea = self.plotArea; [thePlotArea setAxisSetLayersForType:CPTGraphLayerTypeAxisLabels]; - NSMutableSet *oldAxisLabels; + CPTMutableAxisLabelSet oldAxisLabels; if ( useMajorAxisLabels ) { oldAxisLabels = [self.axisLabels mutableCopy]; } @@ -1470,10 +1467,10 @@ -(void)updateAxisLabelsAtLocations:(NSSet *)locations inRange:(CPTPlotRange *)la oldAxisLabels = [self.minorTickAxisLabels mutableCopy]; } - NSMutableSet *newAxisLabels = [[NSMutableSet alloc] initWithCapacity:locations.count]; - CPTAxisLabel *blankLabel = [[CPTAxisLabel alloc] initWithText:nil textStyle:nil]; - CPTAxisLabelGroup *axisLabelGroup = thePlotArea.axisLabelGroup; - CPTLayer *lastLayer = nil; + CPTMutableAxisLabelSet newAxisLabels = [[NSMutableSet alloc] initWithCapacity:locations.count]; + CPTAxisLabel *blankLabel = [[CPTAxisLabel alloc] initWithText:nil textStyle:nil]; + CPTAxisLabelGroup *axisLabelGroup = thePlotArea.axisLabelGroup; + CPTLayer *lastLayer = nil; for ( NSDecimalNumber *tickLocation in locations ) { if ( labeledRange && ![labeledRange containsNumber:tickLocation] ) { @@ -1580,8 +1577,8 @@ -(void)relabel return; } - NSSet *newMajorLocations = nil; - NSSet *newMinorLocations = nil; + CPTNumberSet newMajorLocations = nil; + CPTNumberSet newMinorLocations = nil; switch ( self.labelingPolicy ) { case CPTAxisLabelingPolicyNone: @@ -2121,7 +2118,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxisLabels:(NSSet *)newLabels +-(void)setAxisLabels:(CPTAxisLabelSet)newLabels { if ( newLabels != axisLabels ) { if ( self.labelsUpdated ) { @@ -2161,7 +2158,7 @@ -(void)setAxisLabels:(NSSet *)newLabels } } --(void)setMinorTickAxisLabels:(NSSet *)newLabels +-(void)setMinorTickAxisLabels:(CPTAxisLabelSet)newLabels { if ( newLabels != minorTickAxisLabels ) { if ( self.labelsUpdated ) { @@ -2403,7 +2400,7 @@ -(NSNumber *)titleLocation } } --(void)setLabelExclusionRanges:(NSArray *)ranges +-(void)setLabelExclusionRanges:(CPTPlotRangeArray)ranges { if ( ranges != labelExclusionRanges ) { labelExclusionRanges = ranges; @@ -2433,7 +2430,7 @@ -(void)setNeedsRelabel:(BOOL)newNeedsRelabel } } --(void)setMajorTickLocations:(NSSet *)newLocations +-(void)setMajorTickLocations:(CPTNumberSet)newLocations { if ( newLocations != majorTickLocations ) { majorTickLocations = newLocations; @@ -2450,7 +2447,7 @@ -(void)setMajorTickLocations:(NSSet *)newLocations } } --(void)setMinorTickLocations:(NSSet *)newLocations +-(void)setMinorTickLocations:(CPTNumberSet)newLocations { if ( newLocations != minorTickLocations ) { minorTickLocations = newLocations; @@ -2978,7 +2975,7 @@ -(void)setMajorGridLines:(CPTGridLines *)newGridLines } } --(void)setAlternatingBandFills:(NSArray *)newFills +-(void)setAlternatingBandFills:(CPTFillArray)newFills { if ( newFills != alternatingBandFills ) { Class nullClass = [NSNull class]; @@ -3000,9 +2997,9 @@ -(void)setAlternatingBandFills:(NSArray *)newFills Class gradientClass = [CPTGradient class]; Class imageClass = [CPTImage class]; - NSMutableArray *fillArray = [newFills mutableCopy]; - NSUInteger i = 0; - CPTFill *newFill = nil; + CPTMutableFillArray fillArray = [newFills mutableCopy]; + NSUInteger i = 0; + CPTFill *newFill = nil; for ( id obj in newFills ) { if ( [obj isKindOfClass:nullClass] || [obj isKindOfClass:fillClass] ) { @@ -3038,7 +3035,7 @@ -(void)setAlternatingBandFills:(NSArray *)newFills } } --(NSArray *)backgroundLimitBands +-(CPTLimitBandArray)backgroundLimitBands { return [self.mutableBackgroundLimitBands copy]; } diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index 64bb80a57..954ccda40 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -1,8 +1,21 @@ #import "CPTDefinitions.h" +/// @file + +@class CPTAxisLabel; @class CPTLayer; @class CPTTextStyle; +/** + * @brief A set of CPTAxisLabel objects. + **/ +typedef NSSet *CPTAxisLabelSet; + +/** + * @brief A mutable set of CPTAxisLabel objects. + **/ +typedef NSMutableSet *CPTMutableAxisLabelSet; + @interface CPTAxisLabel : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; diff --git a/framework/Source/CPTAxisSet.h b/framework/Source/CPTAxisSet.h index f58c1d639..ff41332a3 100644 --- a/framework/Source/CPTAxisSet.h +++ b/framework/Source/CPTAxisSet.h @@ -1,13 +1,13 @@ +#import "CPTAxis.h" #import "CPTLayer.h" -@class CPTAxis; @class CPTLineStyle; @interface CPTAxisSet : CPTLayer /// @name Axes /// @{ -@property (nonatomic, readwrite, strong, nullable) NSArray *axes; +@property (nonatomic, readwrite, strong, nullable) CPTAxisArray axes; /// @} /// @name Drawing diff --git a/framework/Source/CPTAxisSet.m b/framework/Source/CPTAxisSet.m index b9589a76c..55674657e 100644 --- a/framework/Source/CPTAxisSet.m +++ b/framework/Source/CPTAxisSet.m @@ -1,6 +1,5 @@ #import "CPTAxisSet.h" -#import "CPTAxis.h" #import "CPTGraph.h" #import "CPTLineStyle.h" #import "CPTPlotArea.h" @@ -10,7 +9,7 @@ **/ @implementation CPTAxisSet -/** @property NSArray *axes +/** @property CPTAxisArray axes * @brief The axes in the axis set. **/ @synthesize axes; @@ -111,7 +110,7 @@ -(void)display **/ -(void)relabelAxes { - NSArray *theAxes = self.axes; + CPTAxisArray theAxes = self.axes; [theAxes makeObjectsPerformSelector:@selector(setNeedsLayout)]; [theAxes makeObjectsPerformSelector:@selector(setNeedsRelabel)]; @@ -211,7 +210,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxes:(NSArray *)newAxes +-(void)setAxes:(CPTAxisArray)newAxes { if ( newAxes != axes ) { for ( CPTAxis *axis in axes ) { diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index 1548f8925..f274b0f17 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -1,12 +1,12 @@ #import "CPTDefinitions.h" +#import "CPTFill.h" +#import "CPTLineStyle.h" #import "CPTPlot.h" /// @file -@class CPTLineStyle; @class CPTMutableNumericData; @class CPTNumericData; -@class CPTFill; @class CPTPlotRange; @class CPTColor; @class CPTBarPlot; @@ -47,7 +47,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of bar fills. **/ --(nullable NSArray *)barFillsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray)barFillsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar fill for the given bar plot. * This method will not be called if @@ -65,7 +65,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable NSArray *)barLineStylesForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray)barLineStylesForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given bar plot. * This method will not be called if diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 26298f41d..7ae9af868 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -2,7 +2,6 @@ #import "CPTColor.h" #import "CPTExceptions.h" -#import "CPTFill.h" #import "CPTGradient.h" #import "CPTLegend.h" #import "CPTMutableLineStyle.h" @@ -37,11 +36,11 @@ /// @cond @interface CPTBarPlot() -@property (nonatomic, readwrite, copy) NSArray *barLocations; -@property (nonatomic, readwrite, copy) NSArray *barTips; -@property (nonatomic, readwrite, copy) NSArray *barBases; -@property (nonatomic, readwrite, copy) NSArray *barFills; -@property (nonatomic, readwrite, copy) NSArray *barLineStyles; +@property (nonatomic, readwrite, copy) CPTNumberArray barLocations; +@property (nonatomic, readwrite, copy) CPTNumberArray barTips; +@property (nonatomic, readwrite, copy) CPTNumberArray barBases; +@property (nonatomic, readwrite, copy) CPTFillArray barFills; +@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint:(CGPoint *)tipPoint; @@ -492,9 +491,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barFillForBarPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource barFillForBarPlot:self recordIndex:idx]; @@ -544,9 +543,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barLineStyleForBarPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource barLineStyleForBarPlot:self recordIndex:idx]; @@ -1141,7 +1140,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -1471,53 +1470,53 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(NSArray *)barTips +-(CPTNumberArray)barTips { return [[self cachedNumbersForField:CPTBarPlotFieldBarTip] sampleArray]; } --(void)setBarTips:(NSArray *)newTips +-(void)setBarTips:(CPTNumberArray)newTips { [self cacheNumbers:newTips forField:CPTBarPlotFieldBarTip]; } --(NSArray *)barBases +-(CPTNumberArray)barBases { return [[self cachedNumbersForField:CPTBarPlotFieldBarBase] sampleArray]; } --(void)setBarBases:(NSArray *)newBases +-(void)setBarBases:(CPTNumberArray)newBases { [self cacheNumbers:newBases forField:CPTBarPlotFieldBarBase]; } --(NSArray *)barLocations +-(CPTNumberArray)barLocations { return [[self cachedNumbersForField:CPTBarPlotFieldBarLocation] sampleArray]; } --(void)setBarLocations:(NSArray *)newLocations +-(void)setBarLocations:(CPTNumberArray)newLocations { [self cacheNumbers:newLocations forField:CPTBarPlotFieldBarLocation]; } --(NSArray *)barFills +-(CPTFillArray)barFills { return [self cachedArrayForKey:CPTBarPlotBindingBarFills]; } --(void)setBarFills:(NSArray *)newBarFills +-(void)setBarFills:(CPTFillArray)newBarFills { [self cacheArray:newBarFills forKey:CPTBarPlotBindingBarFills]; [self setNeedsDisplay]; } --(NSArray *)barLineStyles +-(CPTLineStyleArray)barLineStyles { return [self cachedArrayForKey:CPTBarPlotBindingBarLineStyles]; } --(void)setBarLineStyles:(NSArray *)newBarLineStyles +-(void)setBarLineStyles:(CPTLineStyleArray)newBarLineStyles { [self cacheArray:newBarLineStyles forKey:CPTBarPlotBindingBarLineStyles]; [self setNeedsDisplay]; @@ -1616,16 +1615,16 @@ -(NSUInteger)numberOfFields return 3; } --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[@(CPTBarPlotFieldBarLocation), @(CPTBarPlotFieldBarTip), @(CPTBarPlotFieldBarBase)]; } --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - NSArray *result = nil; + CPTNumberArray result = nil; switch ( coord ) { case CPTCoordinateX: diff --git a/framework/Source/CPTDataSourceTestCase.h b/framework/Source/CPTDataSourceTestCase.h index ea0f00f28..cdd05cbbb 100644 --- a/framework/Source/CPTDataSourceTestCase.h +++ b/framework/Source/CPTDataSourceTestCase.h @@ -6,12 +6,12 @@ @interface CPTDataSourceTestCase : CPTTestCase -@property (nonatomic, readwrite, copy) NSArray *xData; -@property (nonatomic, readwrite, copy) NSArray *yData; +@property (nonatomic, readwrite, copy) CPTNumberArray xData; +@property (nonatomic, readwrite, copy) CPTNumberArray yData; @property (nonatomic, readwrite, assign) NSUInteger nRecords; @property (nonatomic, readonly, strong) CPTPlotRange *xRange; @property (nonatomic, readonly, strong) CPTPlotRange *yRange; -@property (nonatomic, readwrite, strong) NSMutableArray *plots; +@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; -(void)buildData; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 4ae16a358..9f1d87e58 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -10,7 +10,7 @@ /// @cond @interface CPTDataSourceTestCase() --(CPTMutablePlotRange *)plotRangeForData:(NSArray *)dataArray; +-(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray; @end @@ -42,7 +42,7 @@ -(void)buildData { NSUInteger recordCount = self.nRecords; - NSMutableArray *arr = [NSMutableArray arrayWithCapacity:recordCount]; + CPTMutableNumberArray arr = [NSMutableArray arrayWithCapacity:recordCount]; for ( NSUInteger i = 0; i < recordCount; i++ ) { [arr insertObject:@(i) atIndex:i]; @@ -83,7 +83,7 @@ -(CPTPlotRange *)yRange return range; } --(CPTMutablePlotRange *)plotRangeForData:(NSArray *)dataArray +-(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray { double min = [[dataArray valueForKeyPath:@"@min.doubleValue"] doubleValue]; double max = [[dataArray valueForKeyPath:@"@max.doubleValue"] doubleValue]; @@ -101,11 +101,11 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return self.nRecords; } --(NSArray *)numbersForPlot:(CPTPlot *)plot - field:(NSUInteger)fieldEnum - recordIndexRange:(NSRange)indexRange +-(CPTNumberArray)numbersForPlot:(CPTPlot *)plot + field:(NSUInteger)fieldEnum + recordIndexRange:(NSRange)indexRange { - NSArray *result; + CPTNumberArray result; switch ( fieldEnum ) { case CPTScatterPlotFieldX: @@ -116,7 +116,7 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot result = [[self yData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; if ( self.plots.count > 1 ) { XCTAssertTrue([[self plots] containsObject:plot], @"Plot missing"); - NSMutableArray *shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; + CPTMutableNumberArray shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; for ( NSDecimalNumber *d in result ) { [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([[self plots] indexOfObject:plot] + 1) )]]]; } diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 5eb3a8114..516949dd5 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -235,3 +235,43 @@ typedef struct _CPTEdgeInsets { CPTEdgeInsets; extern const CPTEdgeInsets CPTEdgeInsetsZero; ///< Defines a set of stretchable image edge insets where all of the values are zero (@num{0}). + +/** + * @brief An array of numbers. + **/ +typedef NSArray *CPTNumberArray; + +/** + * @brief A mutable array of numbers. + **/ +typedef NSMutableArray *CPTMutableNumberArray; + +/** + * @brief A set of numbers. + **/ +typedef NSSet *CPTNumberSet; + +/** + * @brief A mutable set of numbers. + **/ +typedef NSMutableSet *CPTMutableNumberSet; + +/** + * @brief An array of strings. + **/ +typedef NSArray *CPTStringArray; + +/** + * @brief A mutable array of strings. + **/ +typedef NSMutableArray *CPTMutableStringArray; + +/** + * @brief An array of strings. + **/ +typedef NSDictionary *CPTDictionary; + +/** + * @brief A mutable array of strings. + **/ +typedef NSMutableDictionary *CPTMutableDictionary; diff --git a/framework/Source/CPTFill.h b/framework/Source/CPTFill.h index 58d4a425f..990f30ef9 100644 --- a/framework/Source/CPTFill.h +++ b/framework/Source/CPTFill.h @@ -1,6 +1,19 @@ +/// @file + @class CPTGradient; @class CPTImage; @class CPTColor; +@class CPTFill; + +/** + * @brief An array of fills. + **/ +typedef NSArray *CPTFillArray; + +/** + * @brief A mutable array of fills. + **/ +typedef NSMutableArray *CPTMutableFillArray; @interface CPTFill : NSObject diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index b89c7cacd..a74a6ab3d 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -330,7 +330,7 @@ -(void)plotSpaceChanged /// @cond --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ( (context == CPTFunctionDataSourceKVOContext) && [keyPath isEqualToString:@"plotSpace"] && [object isEqual:self.dataPlot] ) { CPTPlotSpace *oldSpace = change[NSKeyValueChangeOldKey]; diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 551cc1409..491c8e891 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -1,15 +1,15 @@ // Abstract class #import "CPTBorderedLayer.h" #import "CPTDefinitions.h" +#import "CPTPlot.h" +#import "CPTPlotSpace.h" /// @file @class CPTAxisSet; @class CPTGraphHostingView; @class CPTLegend; -@class CPTPlot; @class CPTPlotAreaFrame; -@class CPTPlotSpace; @class CPTTheme; @class CPTTextStyle; @class CPTLayerAnnotation; @@ -81,7 +81,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { @property (nonatomic, readwrite, strong, nullable) CPTAxisSet *axisSet; @property (nonatomic, readwrite, strong, nullable) CPTPlotAreaFrame *plotAreaFrame; @property (nonatomic, readonly, nullable) CPTPlotSpace *defaultPlotSpace; -@property (nonatomic, readwrite, strong, nullable) NSArray *topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray topDownLayerOrder; /// @} /// @name Legend @@ -99,7 +99,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Retrieving Plots /// @{ --(nonnull NSArray *)allPlots; +-(nonnull CPTPlotArray)allPlots; -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; /// @} @@ -116,7 +116,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Retrieving Plot Spaces /// @{ --(nonnull NSArray *)allPlotSpaces; +-(nonnull CPTPlotSpaceArray)allPlotSpaces; -(nullable CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx; -(nullable CPTPlotSpace *)plotSpaceWithIdentifier:(nullable id)identifier; /// @} diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 33575b4c5..c39022c06 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -7,11 +7,9 @@ #import "CPTLayerAnnotation.h" #import "CPTLegend.h" #import "CPTMutableTextStyle.h" -#import "CPTPlot.h" #import "CPTPlotArea.h" #import "CPTPlotAreaFrame.h" #import "CPTPlotGroup.h" -#import "CPTPlotSpace.h" #import "CPTTextLayer.h" #import "CPTTheme.h" #import "NSCoderExtensions.h" @@ -32,8 +30,8 @@ /// @cond @interface CPTGraph() -@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *plots; -@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *plotSpaces; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray plots; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotSpaceArray plotSpaces; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *titleAnnotation; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *legendAnnotation; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @@ -85,12 +83,12 @@ @implementation CPTGraph /// @cond -/** @property NSMutableArray *plots +/** @property CPTMutablePlotArray plots * @brief An array of all plots associated with the graph. **/ @synthesize plots; -/** @property NSMutableArray *plotSpaces +/** @property CPTMutablePlotSpaceArray plotSpaces * @brief An array of all plot spaces associated with the graph. **/ @synthesize plotSpaces; @@ -102,7 +100,7 @@ @implementation CPTGraph **/ @dynamic defaultPlotSpace; -/** @property NSArray *topDownLayerOrder +/** @property CPTNumberArray topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * @see CPTPlotArea @link CPTPlotArea::topDownLayerOrder topDownLayerOrder @endlink property. **/ @@ -315,7 +313,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; plotAreaFrame = [coder decodeObjectForKey:@"CPTGraph.plotAreaFrame"]; - NSArray *plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; + CPTPlotArray plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; if ( plotArray ) { plots = [plotArray mutableCopy]; } @@ -323,7 +321,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder plots = [[NSMutableArray alloc] init]; } - NSArray *plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; + CPTPlotSpaceArray plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; if ( plotSpaceArray ) { plotSpaces = [plotSpaceArray mutableCopy]; } @@ -370,7 +368,7 @@ -(void)layoutAndRenderInContext:(CGContextRef)context +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -411,7 +409,7 @@ -(void)reloadDataIfNeeded /** @brief All plots associated with the graph. * @return An array of all plots associated with the graph. **/ --(NSArray *)allPlots +-(CPTPlotArray)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -535,7 +533,7 @@ -(CPTPlotSpace *)defaultPlotSpace /** @brief All plot spaces associated with the graph. * @return An array of all plot spaces associated with the graph. **/ --(NSArray *)allPlotSpaces +-(CPTPlotSpaceArray)allPlotSpaces { return [NSArray arrayWithArray:self.plotSpaces]; } @@ -836,12 +834,12 @@ -(void)setPaddingBottom:(CGFloat)newPadding } } --(NSArray *)topDownLayerOrder +-(CPTNumberArray)topDownLayerOrder { return self.plotAreaFrame.plotArea.topDownLayerOrder; } --(void)setTopDownLayerOrder:(NSArray *)newArray +-(void)setTopDownLayerOrder:(CPTNumberArray)newArray { self.plotAreaFrame.plotArea.topDownLayerOrder = newArray; } diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 81da9e0c1..434d7f2e2 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -2,6 +2,8 @@ #import "CPTResponder.h" #import +/// @file + @class CPTGraph; @class CPTShadow; @@ -15,6 +17,26 @@ extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /// @} +/** + * @brief An array of CALayer objects. + **/ +typedef NSArray *CPTSublayerArray; + +/** + * @brief A mutable array of CALayer objects. + **/ +typedef NSMutableArray *CPTMutableSublayerArray; + +/** + * @brief A set of CALayer objects. + **/ +typedef NSSet *CPTSublayerSet; + +/** + * @brief A mutable set of CALayer objects. + **/ +typedef NSMutableSet *CPTMutableSublayerSet; + @interface CPTLayer : CALayer /// @name Graph @@ -54,7 +76,7 @@ extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /// @name Layout /// @{ -@property (nonatomic, readonly, nullable) NSSet *sublayersExcludedFromAutomaticLayout; +@property (nonatomic, readonly, nullable) CPTSublayerSet sublayersExcludedFromAutomaticLayout; /// @} /// @name Initialization diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index fa23d4edb..9d936c7b2 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -24,6 +24,7 @@ **/ /// @cond + @interface CPTLayer() @property (nonatomic, readwrite, getter = isRenderingRecursively) BOOL renderingRecursively; @@ -121,7 +122,7 @@ @implementation CPTLayer **/ @dynamic sublayerMaskingPath; -/** @property NSSet *sublayersExcludedFromAutomaticLayout +/** @property CPTSublayerSet sublayersExcludedFromAutomaticLayout * @brief A set of sublayers that should be excluded from the automatic sublayer layout. **/ @dynamic sublayersExcludedFromAutomaticLayout; @@ -365,7 +366,7 @@ -(void)recursivelyRenderInContext:(CGContextRef)context self.renderingRecursively = NO; // render sublayers - NSArray *sublayersCopy = [self.sublayers copy]; + CPTSublayerArray sublayersCopy = [self.sublayers copy]; for ( CALayer *currentSublayer in sublayersCopy ) { CGContextSaveGState(context); @@ -611,8 +612,9 @@ -(CGSize)shadowMargin **/ -(void)layoutSublayers { - CGRect selfBounds = self.bounds; - NSArray *mySublayers = self.sublayers; + CGRect selfBounds = self.bounds; + + CPTSublayerArray mySublayers = self.sublayers; if ( mySublayers.count > 0 ) { CGFloat leftPadding, topPadding, rightPadding, bottomPadding; @@ -631,8 +633,8 @@ -(void)layoutSublayers subLayerFrame.origin = CGPointMake( round(leftPadding), round(bottomPadding) ); subLayerFrame.size = subLayerSize; - NSSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; - Class layerClass = [CPTLayer class]; + CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in mySublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { subLayer.frame = subLayerFrame; @@ -643,7 +645,7 @@ -(void)layoutSublayers /// @} --(NSSet *)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet)sublayersExcludedFromAutomaticLayout { return nil; } @@ -667,7 +669,7 @@ -(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)ri /// @cond --(void)setSublayers:(NSArray *)sublayers +-(void)setSublayers:(CPTSublayerArray)sublayers { [super setSublayers:sublayers]; diff --git a/framework/Source/CPTLayerTests.h b/framework/Source/CPTLayerTests.h index a000a6901..3f507fdd2 100644 --- a/framework/Source/CPTLayerTests.h +++ b/framework/Source/CPTLayerTests.h @@ -1,10 +1,12 @@ #import "CPTTestCase.h" +#import "CPTDefinitions.h" + @class CPTLayer; @interface CPTLayerTests : CPTTestCase @property (nonatomic, readwrite, strong) CPTLayer *layer; -@property (nonatomic, readwrite, strong) NSArray *positions; +@property (nonatomic, readwrite, strong) CPTNumberArray positions; @end diff --git a/framework/Source/CPTLayerTests.m b/framework/Source/CPTLayerTests.m index bb2c927a0..78337db38 100644 --- a/framework/Source/CPTLayerTests.m +++ b/framework/Source/CPTLayerTests.m @@ -8,7 +8,7 @@ @interface CPTLayerTests() --(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(NSArray *)expected; +-(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray)expected; @end @@ -40,7 +40,7 @@ -(void)tearDown -(void)testPixelAlign1xLeft { - NSArray *expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; + CPTNumberArray expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CGPointZero @@ -49,7 +49,7 @@ -(void)testPixelAlign1xLeft -(void)testPixelAlign1xLeftMiddle { - NSArray *expected = @[@10.75, @10.75, @10.75, @10.75, @10.75, @10.75]; + CPTNumberArray expected = @[@10.75, @10.75, @10.75, @10.75, @10.75, @10.75]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.25, 0.25) @@ -58,7 +58,7 @@ -(void)testPixelAlign1xLeftMiddle -(void)testPixelAlign1xMiddle { - NSArray *expected = @[@10.5, @10.5, @10.5, @10.5, @10.5, @11.5]; + CPTNumberArray expected = @[@10.5, @10.5, @10.5, @10.5, @10.5, @11.5]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.5, 0.5) @@ -67,7 +67,7 @@ -(void)testPixelAlign1xMiddle -(void)testPixelAlign1xRightMiddle { - NSArray *expected = @[@10.25, @10.25, @10.25, @11.25, @11.25, @11.25]; + CPTNumberArray expected = @[@10.25, @10.25, @10.25, @11.25, @11.25, @11.25]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.75, 0.75) @@ -76,7 +76,7 @@ -(void)testPixelAlign1xRightMiddle -(void)testPixelAlign1xRight { - NSArray *expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; + CPTNumberArray expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(1.0, 1.0) @@ -87,7 +87,7 @@ -(void)testPixelAlign1xRight -(void)testPixelAlign2xLeft { - NSArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CGPointZero @@ -96,7 +96,7 @@ -(void)testPixelAlign2xLeft -(void)testPixelAlign2xLeftMiddle { - NSArray *expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; + CPTNumberArray expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.25, 0.25) @@ -105,7 +105,7 @@ -(void)testPixelAlign2xLeftMiddle -(void)testPixelAlign2xMiddle { - NSArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.5, 0.5) @@ -114,7 +114,7 @@ -(void)testPixelAlign2xMiddle -(void)testPixelAlign2xRightMiddle { - NSArray *expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; + CPTNumberArray expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.75, 0.75) @@ -123,7 +123,7 @@ -(void)testPixelAlign2xRightMiddle -(void)testPixelAlign2xRight { - NSArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(1.0, 1.0) @@ -132,7 +132,7 @@ -(void)testPixelAlign2xRight #pragma mark - Utility methods --(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(NSArray *)expectedValues +-(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray)expectedValues { NSUInteger positionCount = self.positions.count; diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index 7568a7048..dcb319f7a 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -1,11 +1,11 @@ #import "CPTBorderedLayer.h" +#import "CPTPlot.h" /// @file @class CPTFill; @class CPTLegend; @class CPTLineStyle; -@class CPTPlot; @class CPTTextStyle; /// @name Legend @@ -190,10 +190,10 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; @property (nonatomic, readwrite, assign) NSUInteger numberOfColumns; @property (nonatomic, readwrite, assign) BOOL equalRows; @property (nonatomic, readwrite, assign) BOOL equalColumns; -@property (nonatomic, readwrite, copy, nullable) NSArray *rowHeights; -@property (nonatomic, readonly, nullable) NSArray *rowHeightsThatFit; -@property (nonatomic, readwrite, copy, nullable) NSArray *columnWidths; -@property (nonatomic, readonly, nullable) NSArray *columnWidthsThatFit; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray rowHeights; +@property (nonatomic, readonly, nullable) CPTNumberArray rowHeightsThatFit; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray columnWidths; +@property (nonatomic, readonly, nullable) CPTNumberArray columnWidthsThatFit; @property (nonatomic, readwrite, assign) CGFloat columnMargin; @property (nonatomic, readwrite, assign) CGFloat rowMargin; @property (nonatomic, readwrite, assign) CGFloat titleOffset; @@ -201,19 +201,19 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; /// @name Factory Methods /// @{ -+(nonnull instancetype)legendWithPlots:(nullable NSArray *)newPlots; -+(nonnull instancetype)legendWithGraph:(nullable CPTGraph *)graph; ++(nonnull instancetype)legendWithPlots:(nullable CPTPlotArray)newPlots; ++(nonnull instancetype)legendWithGraph:(nullable __kindof CPTGraph *)graph; /// @} /// @name Initialization /// @{ --(nonnull instancetype)initWithPlots:(nullable NSArray *)newPlots; --(nonnull instancetype)initWithGraph:(nullable CPTGraph *)graph; +-(nonnull instancetype)initWithPlots:(nullable CPTPlotArray)newPlots; +-(nonnull instancetype)initWithGraph:(nullable __kindof CPTGraph *)graph; /// @} /// @name Plots /// @{ --(nonnull NSArray *)allPlots; +-(nonnull CPTPlotArray)allPlots; -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index d7d0c42a4..8a2502681 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -6,7 +6,6 @@ #import "CPTLegendEntry.h" #import "CPTLineStyle.h" #import "CPTPathExtensions.h" -#import "CPTPlot.h" #import "CPTTextStyle.h" #import "CPTUtilities.h" #import "NSCoderExtensions.h" @@ -28,10 +27,10 @@ /// @cond @interface CPTLegend() -@property (nonatomic, readwrite, strong) NSMutableArray *plots; -@property (nonatomic, readwrite, strong) NSMutableArray *legendEntries; -@property (nonatomic, readwrite, strong) NSArray *rowHeightsThatFit; -@property (nonatomic, readwrite, strong) NSArray *columnWidthsThatFit; +@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; +@property (nonatomic, readwrite, strong) CPTMutableLegendEntryArray legendEntries; +@property (nonatomic, readwrite, strong) CPTNumberArray rowHeightsThatFit; +@property (nonatomic, readwrite, strong) CPTNumberArray columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; @property (nonatomic, readwrite, cpt_weak_property) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; @@ -161,7 +160,7 @@ @implementation CPTLegend **/ @synthesize equalColumns; -/** @property NSArray *rowHeights +/** @property CPTNumberArray rowHeights * @brief The desired height of each row of legend entries, including the swatch and title. * Each element in this array should be an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). If @nil, all rows will be sized automatically. @@ -170,14 +169,14 @@ @implementation CPTLegend **/ @synthesize rowHeights; -/** @property NSArray *rowHeightsThatFit +/** @property CPTNumberArray rowHeightsThatFit * @brief The computed best-fit height of each row of legend entries, including the swatch and title. * Each element in this array is an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). **/ @synthesize rowHeightsThatFit; -/** @property NSArray *columnWidths +/** @property CPTNumberArray columnWidths * @brief The desired width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array should be an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). If @nil, all columns will be sized automatically. @@ -186,7 +185,7 @@ @implementation CPTLegend **/ @synthesize columnWidths; -/** @property NSArray *columnWidthsThatFit +/** @property CPTNumberArray columnWidthsThatFit * @brief The computed best-fit width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array is an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). @@ -208,12 +207,12 @@ @implementation CPTLegend **/ @synthesize titleOffset; -/** @property NSMutableArray *plots +/** @property CPTMutablePlotArray plots * @brief An array of all plots associated with the legend. **/ @synthesize plots; -/** @property NSMutableArray *legendEntries +/** @property CPTMutableLegendEntryArray legendEntries * @brief An array of all legend entries. **/ @synthesize legendEntries; @@ -236,7 +235,7 @@ @implementation CPTLegend * @param newPlots An array of plots. * @return A new CPTLegend instance. **/ -+(instancetype)legendWithPlots:(NSArray *)newPlots ++(instancetype)legendWithPlots:(CPTPlotArray)newPlots { return [[self alloc] initWithPlots:newPlots]; } @@ -340,7 +339,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame * @param newPlots An array of plots. * @return The initialized CPTLegend object. **/ --(instancetype)initWithPlots:(NSArray *)newPlots +-(instancetype)initWithPlots:(CPTPlotArray)newPlots { if ( (self = [self initWithFrame:CGRectZero]) ) { for ( CPTPlot *plot in newPlots ) { @@ -505,10 +504,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context } // calculate column positions - NSArray *computedColumnWidths = self.columnWidthsThatFit; - NSUInteger columnCount = computedColumnWidths.count; - CGFloat *actualColumnWidths = malloc(sizeof(CGFloat) * columnCount); - CGFloat *columnPositions = malloc(sizeof(CGFloat) * columnCount); + CPTNumberArray computedColumnWidths = self.columnWidthsThatFit; + NSUInteger columnCount = computedColumnWidths.count; + CGFloat *actualColumnWidths = malloc(sizeof(CGFloat) * columnCount); + CGFloat *columnPositions = malloc(sizeof(CGFloat) * columnCount); columnPositions[0] = self.paddingLeft; CGFloat theOffset = self.titleOffset; CGSize theSwatchSize = self.swatchSize; @@ -529,10 +528,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context } // calculate row positions - NSArray *computedRowHeights = self.rowHeightsThatFit; - NSUInteger rowCount = computedRowHeights.count; - CGFloat *actualRowHeights = malloc(sizeof(CGFloat) * rowCount); - CGFloat *rowPositions = malloc(sizeof(CGFloat) * rowCount); + CPTNumberArray computedRowHeights = self.rowHeightsThatFit; + NSUInteger rowCount = computedRowHeights.count; + CGFloat *actualRowHeights = malloc(sizeof(CGFloat) * rowCount); + CGFloat *rowPositions = malloc(sizeof(CGFloat) * rowCount); rowPositions[rowCount - 1] = self.paddingBottom; CGFloat theRowMargin = self.rowMargin; CGFloat lastRowHeight = 0.0; @@ -650,7 +649,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -724,14 +723,14 @@ -(void)recalculateLayout } // compute row heights and column widths - NSUInteger row = 0; - NSUInteger col = 0; - CGFloat *maxTitleHeight = calloc( rowCount, sizeof(CGFloat) ); - CGFloat *maxTitleWidth = calloc( columnCount, sizeof(CGFloat) ); - CGSize theSwatchSize = self.swatchSize; - NSArray *desiredRowHeights = self.rowHeights; - NSArray *desiredColumnWidths = self.columnWidths; - Class numberClass = [NSNumber class]; + NSUInteger row = 0; + NSUInteger col = 0; + CGFloat *maxTitleHeight = calloc( rowCount, sizeof(CGFloat) ); + CGFloat *maxTitleWidth = calloc( columnCount, sizeof(CGFloat) ); + CGSize theSwatchSize = self.swatchSize; + CPTNumberArray desiredRowHeights = self.rowHeights; + CPTNumberArray desiredColumnWidths = self.columnWidths; + Class numberClass = [NSNumber class]; for ( CPTLegendEntry *legendEntry in self.legendEntries ) { legendEntry.row = row; @@ -771,13 +770,13 @@ -(void)recalculateLayout } // save row heights and column widths - NSMutableArray *maxRowHeights = [[NSMutableArray alloc] initWithCapacity:rowCount]; + CPTMutableNumberArray maxRowHeights = [[NSMutableArray alloc] initWithCapacity:rowCount]; for ( NSUInteger i = 0; i < rowCount; i++ ) { [maxRowHeights addObject:@(maxTitleHeight[i])]; } self.rowHeightsThatFit = maxRowHeights; - NSMutableArray *maxColumnWidths = [[NSMutableArray alloc] initWithCapacity:columnCount]; + CPTMutableNumberArray maxColumnWidths = [[NSMutableArray alloc] initWithCapacity:columnCount]; for ( NSUInteger i = 0; i < columnCount; i++ ) { [maxColumnWidths addObject:@(maxTitleWidth[i])]; } @@ -831,7 +830,7 @@ -(void)recalculateLayout /** @brief All plots associated with the legend. * @return An array of all plots associated with the legend. **/ --(NSArray *)allPlots +-(CPTPlotArray)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -876,9 +875,9 @@ -(void)addPlot:(CPTPlot *)plot [self.plots addObject:plot]; self.layoutChanged = YES; - NSMutableArray *theLegendEntries = self.legendEntries; - CPTTextStyle *theTextStyle = self.textStyle; - NSUInteger numberOfLegendEntries = [plot numberOfLegendEntries]; + CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; + CPTTextStyle *theTextStyle = self.textStyle; + NSUInteger numberOfLegendEntries = [plot numberOfLegendEntries]; for ( NSUInteger i = 0; i < numberOfLegendEntries; i++ ) { NSString *newTitle = [plot titleForLegendEntryAtIndex:i]; if ( newTitle ) { @@ -902,11 +901,11 @@ -(void)addPlot:(CPTPlot *)plot -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx { if ( [plot isKindOfClass:[CPTPlot class]] ) { - NSMutableArray *thePlots = self.plots; + CPTMutablePlotArray thePlots = self.plots; NSAssert(idx <= thePlots.count, @"index greater than the number of plots"); - NSMutableArray *theLegendEntries = self.legendEntries; - NSUInteger legendEntryIndex = 0; + CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; + NSUInteger legendEntryIndex = 0; if ( idx == thePlots.count ) { legendEntryIndex = theLegendEntries.count; } @@ -984,8 +983,8 @@ -(void)removePlotWithIdentifier:(id)identifier **/ -(void)removeLegendEntriesForPlot:(CPTPlot *)plot { - NSMutableArray *theLegendEntries = self.legendEntries; - NSMutableArray *entriesToRemove = [[NSMutableArray alloc] init]; + CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; + CPTMutableLegendEntryArray entriesToRemove = [[NSMutableArray alloc] init]; for ( CPTLegendEntry *legendEntry in theLegendEntries ) { if ( legendEntry.plot == plot ) { @@ -1015,8 +1014,9 @@ -(void)legendNeedsLayout:(NSNotification *)notif -(void)legendNeedsReloadEntries:(NSNotification *)notif { - CPTPlot *thePlot = (CPTPlot *)notif.object; - NSMutableArray *theLegendEntries = self.legendEntries; + CPTPlot *thePlot = (CPTPlot *)notif.object; + + CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; NSUInteger legendEntryIndex = 0; @@ -1430,7 +1430,7 @@ -(void)setEqualColumns:(BOOL)newEqualColumns } } --(void)setRowHeights:(NSArray *)newRowHeights +-(void)setRowHeights:(CPTNumberArray)newRowHeights { if ( newRowHeights != rowHeights ) { rowHeights = [newRowHeights copy]; @@ -1438,7 +1438,7 @@ -(void)setRowHeights:(NSArray *)newRowHeights } } --(void)setColumnWidths:(NSArray *)newColumnWidths +-(void)setColumnWidths:(CPTNumberArray)newColumnWidths { if ( newColumnWidths != columnWidths ) { columnWidths = [newColumnWidths copy]; @@ -1527,7 +1527,7 @@ -(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle } } --(NSArray *)rowHeightsThatFit +-(CPTNumberArray)rowHeightsThatFit { if ( !rowHeightsThatFit ) { [self recalculateLayout]; @@ -1535,7 +1535,7 @@ -(NSArray *)rowHeightsThatFit return rowHeightsThatFit; } --(NSArray *)columnWidthsThatFit +-(CPTNumberArray)columnWidthsThatFit { if ( !columnWidthsThatFit ) { [self recalculateLayout]; diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index 69e80f218..f9fbe5d90 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -1,8 +1,21 @@ #import "CPTDefinitions.h" +/// @file + +@class CPTLegendEntry; @class CPTPlot; @class CPTTextStyle; +/** + * @brief An array of CPTLegendEntry objects. + **/ +typedef NSArray *CPTLegendEntryArray; + +/** + * @brief A mutable array of CPTLegendEntry objects. + **/ +typedef NSMutableArray *CPTMutableLegendEntryArray; + @interface CPTLegendEntry : NSObject /// @name Plot Info diff --git a/framework/Source/CPTLimitBand.h b/framework/Source/CPTLimitBand.h index 7e601bb25..dcda555e5 100644 --- a/framework/Source/CPTLimitBand.h +++ b/framework/Source/CPTLimitBand.h @@ -1,5 +1,18 @@ -@class CPTPlotRange; +/// @file + @class CPTFill; +@class CPTLimitBand; +@class CPTPlotRange; + +/** + * @brief An array of limit bands. + **/ +typedef NSArray *CPTLimitBandArray; + +/** + * @brief A mutable array of limit bands. + **/ +typedef NSMutableArray *CPTMutableLimitBandArray; @interface CPTLimitBand : NSObject diff --git a/framework/Source/CPTLineStyle.h b/framework/Source/CPTLineStyle.h index 8bf9a117e..d5c774633 100644 --- a/framework/Source/CPTLineStyle.h +++ b/framework/Source/CPTLineStyle.h @@ -1,6 +1,21 @@ +#import "CPTDefinitions.h" + +/// @file + @class CPTColor; @class CPTFill; @class CPTGradient; +@class CPTLineStyle; + +/** + * @brief An array of line styles. + **/ +typedef NSArray *CPTLineStyleArray; + +/** + * @brief A mutable array of line styles. + **/ +typedef NSMutableArray *CPTMutableLineStyleArray; @interface CPTLineStyle : NSObject @@ -8,7 +23,7 @@ @property (nonatomic, readonly) CGLineJoin lineJoin; @property (nonatomic, readonly) CGFloat miterLimit; @property (nonatomic, readonly) CGFloat lineWidth; -@property (nonatomic, readonly, nullable) NSArray *dashPattern; +@property (nonatomic, readonly, nullable) CPTNumberArray dashPattern; @property (nonatomic, readonly) CGFloat patternPhase; @property (nonatomic, readonly, nullable) CPTColor *lineColor; @property (nonatomic, readonly, nullable) CPTFill *lineFill; diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index c28921079..9c709ec4e 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -1,7 +1,6 @@ #import "CPTLineStyle.h" #import "CPTColor.h" -#import "CPTDefinitions.h" #import "CPTFill.h" #import "CPTGradient.h" #import "CPTMutableLineStyle.h" @@ -15,7 +14,7 @@ @interface CPTLineStyle() @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong, nullable) NSArray *dashPattern; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; @property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; @property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; @@ -64,7 +63,7 @@ @implementation CPTLineStyle **/ @synthesize lineWidth; -/** @property NSArray *dashPattern +/** @property CPTNumberArray dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @synthesize dashPattern; @@ -194,7 +193,7 @@ -(void)setLineStyleInContext:(CGContextRef)context CGContextSetMiterLimit(context, self.miterLimit); CGContextSetLineWidth(context, self.lineWidth); - NSArray *myDashPattern = self.dashPattern; + CPTNumberArray myDashPattern = self.dashPattern; NSUInteger dashCount = myDashPattern.count; if ( dashCount > 0 ) { diff --git a/framework/Source/CPTMutableLineStyle.h b/framework/Source/CPTMutableLineStyle.h index 565f8c300..a42eadb47 100644 --- a/framework/Source/CPTMutableLineStyle.h +++ b/framework/Source/CPTMutableLineStyle.h @@ -8,7 +8,7 @@ @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong, nullable) NSArray *dashPattern; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; @property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; @property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; diff --git a/framework/Source/CPTMutableLineStyle.m b/framework/Source/CPTMutableLineStyle.m index 745410c58..39b9500a8 100644 --- a/framework/Source/CPTMutableLineStyle.m +++ b/framework/Source/CPTMutableLineStyle.m @@ -29,7 +29,7 @@ @implementation CPTMutableLineStyle **/ @dynamic lineWidth; -/** @property NSArray *dashPattern +/** @property CPTNumberArray dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @dynamic dashPattern; diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index 6ef9fb9e2..51307f7e9 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -10,7 +10,7 @@ /// @name Dimensions /// @{ -@property (nonatomic, readwrite, copy, nonnull) NSArray *shape; +@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray shape; /// @} /// @name Samples diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 0ab6c2882..af1ec220f 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -29,7 +29,7 @@ @implementation CPTMutableNumericData **/ @dynamic mutableBytes; -/** @property NSArray *shape +/** @property CPTNumberArray shape * @brief The shape of the data buffer array. Set a new shape to change the size of the data buffer. * * The shape describes the dimensions of the sample array stored in diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index a5dc75ae2..83deb4292 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -1,3 +1,4 @@ +#import "CPTDefinitions.h" #import "CPTNumericDataType.h" @interface CPTNumericData : NSObject @@ -19,7 +20,7 @@ /// @name Dimensions /// @{ -@property (nonatomic, readonly, copy, nonnull) NSArray *shape; +@property (nonatomic, readonly, copy, nonnull) CPTNumberArray shape; @property (nonatomic, readonly) NSUInteger numberOfDimensions; @property (nonatomic, readonly) NSUInteger numberOfSamples; @property (nonatomic, readonly) CPTDataOrder dataOrder; @@ -27,28 +28,28 @@ /// @name Factory Methods /// @{ -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; -+(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; -+(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; /// @} /// @name Initialization /// @{ --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; --(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray; --(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; --(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; --(nonnull instancetype)initWithArray:(nonnull NSArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} @@ -60,7 +61,7 @@ -(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...; -(nullable NSNumber *)sampleValue:(NSUInteger)sample; -(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; --(nonnull NSArray *)sampleArray; +-(nonnull CPTNumberArray)sampleArray; /// @} @end diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 794d11db9..5e57367f2 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -11,12 +11,12 @@ @interface CPTNumericData() @property (nonatomic, readwrite, copy, nonnull) NSData *data; @property (nonatomic, readwrite, assign) CPTNumericDataType dataType; -@property (nonatomic, readwrite, copy, nonnull) NSArray *shape; +@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray shape; @property (nonatomic, readwrite, assign) CPTDataOrder dataOrder; --(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable NSArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; --(NSData *)dataFromArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType; +-(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType; @end @@ -81,7 +81,7 @@ @implementation CPTNumericData **/ @dynamic byteOrder; -/** @property NSArray *shape +/** @property CPTNumberArray shape * @brief The shape of the data buffer array. * * The shape describes the dimensions of the sample array stored in @@ -117,7 +117,7 @@ @implementation CPTNumericData **/ +(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [[self alloc] initWithData:newData dataType:newDataType @@ -132,7 +132,7 @@ +(instancetype)numericDataWithData:(NSData *)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [[self alloc] initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -149,9 +149,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(NSArray *)newData ++(instancetype)numericDataWithArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [[self alloc] initWithArray:newData dataType:newDataType @@ -168,9 +168,9 @@ +(instancetype)numericDataWithArray:(NSArray *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(NSArray *)newData ++(instancetype)numericDataWithArray:(CPTNumberArray)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [[self alloc] initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -186,7 +186,7 @@ +(instancetype)numericDataWithArray:(NSArray *)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData @@ -204,7 +204,7 @@ +(instancetype)numericDataWithData:(NSData *)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData @@ -224,9 +224,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(NSArray *)newData ++(instancetype)numericDataWithArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData @@ -246,9 +246,9 @@ +(instancetype)numericDataWithArray:(NSArray *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(NSArray *)newData ++(instancetype)numericDataWithArray:(CPTNumberArray)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData @@ -268,7 +268,7 @@ +(instancetype)numericDataWithArray:(NSArray *)newData **/ -(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [self initWithData:newData dataType:newDataType @@ -284,7 +284,7 @@ -(instancetype)initWithData:(NSData *)newData **/ -(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -301,9 +301,9 @@ -(instancetype)initWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(NSArray *)newData +-(instancetype)initWithArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [self initWithData:[self dataFromArray:newData dataType:newDataType] dataType:newDataType @@ -320,9 +320,9 @@ -(instancetype)initWithArray:(NSArray *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(NSArray *)newData +-(instancetype)initWithArray:(CPTNumberArray)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray { return [self initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -338,7 +338,7 @@ -(instancetype)initWithArray:(NSArray *)newData **/ -(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { if ( (self = [super init]) ) { @@ -360,7 +360,7 @@ -(instancetype)initWithData:(NSData *)newData **/ -(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithData:newData @@ -380,9 +380,9 @@ -(instancetype)initWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(NSArray *)newData +-(instancetype)initWithArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithData:[self dataFromArray:newData dataType:newDataType] @@ -402,9 +402,9 @@ -(instancetype)initWithArray:(NSArray *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(NSArray *)newData +-(instancetype)initWithArray:(CPTNumberArray)newData dataTypeString:(NSString *)newDataTypeString - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithArray:newData @@ -424,7 +424,7 @@ -(instancetype)init -(void)commonInitWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(NSArray *)shapeArray + shape:(CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); @@ -549,7 +549,7 @@ -(void)setDataType:(CPTNumericDataType)newDataType } } --(void)setShape:(NSArray *)newShape +-(void)setShape:(CPTNumberArray)newShape { if ( newShape != shape ) { shape = [newShape copy]; @@ -763,10 +763,11 @@ -(const void *)samplePointerAtIndex:(NSUInteger)idx, ... * @note NSNumber does not support complex numbers. Complex number types will be cast to * @float or @double before being wrapped in an instance of NSNumber. **/ --(NSArray *)sampleArray +-(CPTNumberArray)sampleArray { - NSUInteger sampleCount = self.numberOfSamples; - NSMutableArray *samples = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + NSUInteger sampleCount = self.numberOfSamples; + + CPTMutableNumberArray samples = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSUInteger i = 0; i < sampleCount; i++ ) { NSNumber *sampleValue = [self sampleValue:i]; @@ -775,7 +776,7 @@ -(NSArray *)sampleArray } } - NSArray *result = [NSArray arrayWithArray:samples]; + CPTNumberArray result = [NSArray arrayWithArray:samples]; return result; } @@ -794,9 +795,9 @@ -(NSArray *)sampleArray **/ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList { - NSArray *theShape = self.shape; - NSUInteger numDims = theShape.count; - NSUInteger newIndex = 0; + CPTNumberArray theShape = self.shape; + NSUInteger numDims = theShape.count; + NSUInteger newIndex = 0; if ( numDims > 1 ) { NSUInteger *dims = calloc( numDims, sizeof(NSUInteger) ); @@ -860,7 +861,7 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList return newIndex; } --(NSData *)dataFromArray:(NSArray *)newData dataType:(CPTNumericDataType)newDataType +-(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); NSParameterAssert(newDataType.dataTypeFormat != CPTUndefinedDataType); @@ -1192,7 +1193,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder if ( (self = [super init]) ) { NSData *newData; CPTNumericDataType newDataType; - NSArray *shapeArray; + CPTNumberArray shapeArray; CPTDataOrder order; if ( [decoder allowsKeyedCoding] ) { diff --git a/framework/Source/CPTNumericDataTypeConversionTests.m b/framework/Source/CPTNumericDataTypeConversionTests.m index 175737640..46f7fb1ff 100644 --- a/framework/Source/CPTNumericDataTypeConversionTests.m +++ b/framework/Source/CPTNumericDataTypeConversionTests.m @@ -226,7 +226,7 @@ -(void)testRoundTripToDoubleArray dataType:theDataType shape:nil]; - NSArray *doubleArray = [doubleData sampleArray]; + CPTNumberArray doubleArray = [doubleData sampleArray]; XCTAssertEqual(doubleArray.count, numberOfSamples, @"doubleArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:doubleArray @@ -254,7 +254,7 @@ -(void)testRoundTripToIntegerArray dataType:theDataType shape:nil]; - NSArray *integerArray = [intData sampleArray]; + CPTNumberArray integerArray = [intData sampleArray]; XCTAssertEqual(integerArray.count, numberOfSamples, @"integerArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:integerArray @@ -282,7 +282,7 @@ -(void)testRoundTripToDecimalArray dataType:theDataType shape:nil]; - NSArray *decimalArray = [decimalData sampleArray]; + CPTNumberArray decimalArray = [decimalData sampleArray]; XCTAssertEqual(decimalArray.count, numberOfSamples, @"doubleArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:decimalArray diff --git a/framework/Source/CPTPieChart.h b/framework/Source/CPTPieChart.h index 38d09098b..427f76386 100644 --- a/framework/Source/CPTPieChart.h +++ b/framework/Source/CPTPieChart.h @@ -1,10 +1,10 @@ #import "CPTDefinitions.h" +#import "CPTFill.h" #import "CPTPlot.h" /// @file @class CPTColor; -@class CPTFill; @class CPTPieChart; @class CPTTextLayer; @class CPTLineStyle; @@ -49,7 +49,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of pie slice fills. **/ --(nullable NSArray *)sliceFillsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray)sliceFillsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a fill for the given pie chart slice. * This method will not be called if @@ -72,7 +72,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of radial offsets. **/ --(nullable NSArray *)radialOffsetsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable CPTNumberArray)radialOffsetsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Offsets the slice radially from the center point. Can be used to @quote{explode} the chart. * This method will not be called if diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index cb0b336d1..7b876ddf1 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -1,7 +1,6 @@ #import "CPTPieChart.h" #import "CPTColor.h" -#import "CPTFill.h" #import "CPTLegend.h" #import "CPTLineStyle.h" #import "CPTMutableNumericData.h" @@ -33,9 +32,9 @@ /// @cond @interface CPTPieChart() -@property (nonatomic, readwrite, copy) NSArray *sliceWidths; -@property (nonatomic, readwrite, copy) NSArray *sliceFills; -@property (nonatomic, readwrite, copy) NSArray *sliceRadialOffsets; +@property (nonatomic, readwrite, copy) CPTNumberArray sliceWidths; +@property (nonatomic, readwrite, copy) CPTFillArray sliceFills; +@property (nonatomic, readwrite, copy) CPTNumberArray sliceRadialOffsets; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)updateNormalizedData; @@ -480,9 +479,9 @@ -(void)reloadSliceFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(sliceFillForPieChart:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource sliceFillForPieChart:self recordIndex:idx]; @@ -526,8 +525,8 @@ -(void)reloadRadialOffsetsInIndexRange:(NSRange)indexRange atRecordIndex:indexRange.location]; } else if ( [theDataSource respondsToSelector:@selector(radialOffsetForPieChart:recordIndex:)] ) { - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + CPTMutableNumberArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CGFloat offset = [theDataSource radialOffsetForPieChart:self recordIndex:idx]; @@ -580,8 +579,8 @@ -(void)renderAsVectorInContext:(CGContextRef)context CPTLineStyle *borderStyle = self.borderLineStyle; CPTFill *overlay = self.overlayFill; - BOOL hasNonZeroOffsets = NO; - NSArray *offsetArray = [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; + BOOL hasNonZeroOffsets = NO; + CPTNumberArray offsetArray = [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; for ( NSNumber *offset in offsetArray ) { if ( [offset cgFloatValue] != CPTFloat(0.0) ) { hasNonZeroOffsets = YES; @@ -850,7 +849,7 @@ -(CGFloat)medianAngleForPieSliceIndex:(NSUInteger)idx +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -881,7 +880,7 @@ -(NSUInteger)numberOfFields return 1; } --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[@(CPTPieChartFieldSliceWidth)]; } @@ -1354,34 +1353,34 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point /// @cond --(NSArray *)sliceWidths +-(CPTNumberArray)sliceWidths { return [[self cachedNumbersForField:CPTPieChartFieldSliceWidth] sampleArray]; } --(void)setSliceWidths:(NSArray *)newSliceWidths +-(void)setSliceWidths:(CPTNumberArray)newSliceWidths { [self cacheNumbers:newSliceWidths forField:CPTPieChartFieldSliceWidth]; [self updateNormalizedData]; } --(NSArray *)sliceFills +-(CPTFillArray)sliceFills { return [self cachedArrayForKey:CPTPieChartBindingPieSliceFills]; } --(void)setSliceFills:(NSArray *)newSliceFills +-(void)setSliceFills:(CPTFillArray)newSliceFills { [self cacheArray:newSliceFills forKey:CPTPieChartBindingPieSliceFills]; [self setNeedsDisplay]; } --(NSArray *)sliceRadialOffsets +-(CPTNumberArray)sliceRadialOffsets { return [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; } --(void)setSliceRadialOffsets:(NSArray *)newSliceRadialOffsets +-(void)setSliceRadialOffsets:(CPTNumberArray)newSliceRadialOffsets { [self cacheArray:newSliceRadialOffsets forKey:CPTPieChartBindingPieSliceRadialOffsets]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 1ebad977d..26c0a37b9 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -28,6 +28,16 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { CPTPlotCachePrecisionDecimal ///< All cached data will be converted to @ref NSDecimal. }; +/** + * @brief An array of plots. + **/ +typedef NSArray<__kindof CPTPlot *> *CPTPlotArray; + +/** + * @brief A mutable array of plots. + **/ +typedef NSMutableArray<__kindof CPTPlot *> *CPTMutablePlotArray; + #pragma mark - /** @@ -129,7 +139,7 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { * @param indexRange The range of the data indexes of interest. * @return An array of data labels. **/ --(nullable NSArray *)dataLabelsForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable NSArray *)dataLabelsForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a data label for the given plot. * This method will not be called if @@ -369,8 +379,8 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /// @name Fields /// @{ -(NSUInteger)numberOfFields; --(nonnull NSArray *)fieldIdentifiers; --(nonnull NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; +-(nonnull CPTNumberArray)fieldIdentifiers; +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field; /// @} diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index ab45c67ee..81f8566ae 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -55,8 +55,8 @@ @interface CPTPlot() @property (nonatomic, readwrite, assign) BOOL needsRelabel; @property (nonatomic, readwrite, assign) NSRange labelIndexRange; -@property (nonatomic, readwrite, strong) NSMutableArray *labelAnnotations; -@property (nonatomic, readwrite, copy) NSArray *dataLabels; +@property (nonatomic, readwrite, strong) CPTMutableAnnotationArray labelAnnotations; +@property (nonatomic, readwrite, copy) NSArray *dataLabels; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownLabelIndex; @property (nonatomic, readwrite, assign) NSUInteger cachedDataCount; @@ -484,7 +484,7 @@ -(void)drawInContext:(CGContextRef)context +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -647,7 +647,7 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange **/ -(void)reloadPlotData { - NSMutableDictionary *dataCache = self.cachedData; + NSMutableDictionary *dataCache = self.cachedData; for ( NSNumber *fieldID in self.fieldIdentifiers ) { [dataCache removeObjectForKey:fieldID]; @@ -687,9 +687,9 @@ -(void)reloadDataLabelsInIndexRange:(NSRange)indexRange atRecordIndex:indexRange.location]; } else if ( [theDataSource respondsToSelector:@selector(dataLabelForPlot:recordIndex:)] ) { - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLayer *labelLayer = [theDataSource dataLabelForPlot:self recordIndex:idx]; @@ -813,7 +813,7 @@ -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRan CPTNumericDataType dataType = data.dataType; if ( (sampleCount > 0) && (data.numberOfDimensions == 2) ) { - NSArray *theShape = data.shape; + CPTNumberArray theShape = data.shape; const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; @@ -972,13 +972,13 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum case CPTScaleTypeCategory: { - NSArray *samples = (NSArray *)numbers; + CPTStringArray samples = (CPTStringArray)numbers; if ( [samples isKindOfClass:[NSArray class]] ) { [thePlotSpace setCategories:samples forCoordinate:coordinate]; NSUInteger sampleCount = samples.count; if ( sampleCount > 0 ) { - NSMutableArray *indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + CPTMutableNumberArray indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSString *category in samples ) { [indices addObject:@([thePlotSpace indexOfCategory:category forCoordinate:coordinate])]; @@ -1068,11 +1068,11 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NS case CPTScaleTypeCategory: { - NSArray *samples = (NSArray *)numbers; + CPTStringArray samples = (CPTStringArray)numbers; if ( [samples isKindOfClass:[NSArray class]] ) { sampleCount = samples.count; if ( sampleCount > 0 ) { - NSMutableArray *indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + CPTMutableNumberArray indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSString *category in samples ) { [thePlotSpace addCategory:category forCoordinate:coordinate]; @@ -1142,10 +1142,10 @@ -(CPTMutableNumericData *)numericDataForNumbers:(id)numbers mutableNumbers = [[CPTMutableNumericData alloc] initWithData:numbers dataType:loadedDataType shape:nil]; } else if ( [numbers isKindOfClass:[NSArray class]] ) { - if ( ( (NSArray *)numbers ).count == 0 ) { + if ( ( (CPTNumberArray)numbers ).count == 0 ) { loadedDataType = self.doubleDataType; } - else if ( [( (NSArray *)numbers )[0] isKindOfClass :[NSDecimalNumber class]] ) { + else if ( [( (NSArray < NSNumber * > *)numbers )[0] isKindOfClass :[NSDecimalNumber class]] ) { loadedDataType = self.decimalDataType; } else { @@ -1170,8 +1170,8 @@ -(BOOL)doublePrecisionCache switch ( self.cachePrecision ) { case CPTPlotCachePrecisionAuto: { - NSMutableDictionary *dataCache = self.cachedData; - Class numberClass = [NSNumber class]; + NSMutableDictionary *dataCache = self.cachedData; + Class numberClass = [NSNumber class]; for ( id key in [dataCache allKeys] ) { if ( [key isKindOfClass:numberClass] ) { result = CPTDataTypeEqualToDataType([(CPTMutableNumericData *)dataCache[key] dataType], self.doubleDataType); @@ -1291,8 +1291,9 @@ -(NSDecimal)cachedDecimalForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger) -(void)setCachedDataType:(CPTNumericDataType)newDataType { - Class numberClass = [NSNumber class]; - NSMutableDictionary *dataDictionary = self.cachedData; + Class numberClass = [NSNumber class]; + + NSMutableDictionary *dataDictionary = self.cachedData; for ( id key in [dataDictionary allKeys] ) { if ( [key isKindOfClass:numberClass] ) { @@ -1484,7 +1485,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum **/ -(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord { - NSArray *fields = [self fieldIdentifiersForCoordinate:coord]; + CPTNumberArray fields = [self fieldIdentifiersForCoordinate:coord]; if ( fields.count == 0 ) { return nil; @@ -1528,7 +1529,7 @@ -(void)relabel self.needsRelabel = NO; - NSNull *nullObject = [NSNull null]; + id nullObject = [NSNull null]; Class nullClass = [NSNull class]; Class annotationClass = [CPTAnnotation class]; @@ -1536,8 +1537,8 @@ -(void)relabel NSFormatter *dataLabelFormatter = self.labelFormatter; BOOL plotProvidesLabels = dataLabelTextStyle && dataLabelFormatter; - BOOL hasCachedLabels = NO; - NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey:CPTPlotBindingDataLabels]; + BOOL hasCachedLabels = NO; + NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey : CPTPlotBindingDataLabels]; for ( CPTLayer *label in cachedLabels ) { if ( ![label isKindOfClass:nullClass] ) { hasCachedLabels = YES; @@ -1555,7 +1556,7 @@ -(void)relabel return; } - NSDictionary *textAttributes = [dataLabelTextStyle attributes]; + CPTDictionary textAttributes = [dataLabelTextStyle attributes]; BOOL hasAttributedFormatter = ([dataLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -1567,11 +1568,11 @@ -(void)relabel self.labelAnnotations = [NSMutableArray arrayWithCapacity:sampleCount]; } - CPTPlotSpace *thePlotSpace = self.plotSpace; - CGFloat theRotation = self.labelRotation; - NSMutableArray *labelArray = self.labelAnnotations; - NSUInteger oldLabelCount = labelArray.count; - id nilObject = [CPTPlot nilData]; + CPTPlotSpace *thePlotSpace = self.plotSpace; + CGFloat theRotation = self.labelRotation; + CPTMutableAnnotationArray labelArray = self.labelAnnotations; + NSUInteger oldLabelCount = labelArray.count; + id nilObject = [CPTPlot nilData]; CPTMutableNumericData *labelFieldDataCache = [self cachedNumbersForField:self.labelField]; CPTShadow *theShadow = self.labelShadow; @@ -1692,9 +1693,9 @@ -(void)updateContentAnchorForLabel:(CPTPlotSpaceAnnotation *)label **/ -(void)repositionAllLabelAnnotations { - NSArray *annotations = self.labelAnnotations; - NSUInteger labelCount = annotations.count; - Class annotationClass = [CPTAnnotation class]; + CPTAnnotationArray annotations = self.labelAnnotations; + NSUInteger labelCount = annotations.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger i = 0; i < labelCount; i++ ) { CPTPlotSpaceAnnotation *annotation = annotations[i]; @@ -1838,9 +1839,9 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:withEvent:)] ) { // Inform delegate if a label was hit - NSMutableArray *labelArray = self.labelAnnotations; - NSUInteger labelCount = labelArray.count; - Class annotationClass = [CPTAnnotation class]; + CPTMutableAnnotationArray labelArray = self.labelAnnotations; + NSUInteger labelCount = labelArray.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger idx = 0; idx < labelCount; idx++ ) { CPTPlotSpaceAnnotation *annotation = labelArray[idx]; @@ -1916,9 +1917,9 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:withEvent:)] ) { // Inform delegate if a label was hit - NSMutableArray *labelArray = self.labelAnnotations; - NSUInteger labelCount = labelArray.count; - Class annotationClass = [CPTAnnotation class]; + CPTMutableAnnotationArray labelArray = self.labelAnnotations; + NSUInteger labelCount = labelArray.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger idx = 0; idx < labelCount; idx++ ) { CPTPlotSpaceAnnotation *annotation = labelArray[idx]; @@ -1971,12 +1972,12 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(NSArray *)dataLabels +-(NSArray *)dataLabels { return [self cachedArrayForKey:CPTPlotBindingDataLabels]; } --(void)setDataLabels:(NSArray *)newDataLabels +-(void)setDataLabels:(NSArray *)newDataLabels { [self cacheArray:newDataLabels forKey:CPTPlotBindingDataLabels]; [self setNeedsRelabel]; @@ -2178,7 +2179,7 @@ -(NSUInteger)numberOfFields /** @brief Identifiers (enum values) identifying the fields. * @return Array of NSNumber objects for the various field identifiers. **/ --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[]; } @@ -2187,7 +2188,7 @@ -(NSArray *)fieldIdentifiers * @param coord The coordinate for which the corresponding field identifiers are desired. * @return Array of NSNumber objects for the field identifiers. **/ --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { return @[]; } diff --git a/framework/Source/CPTPlotArea.h b/framework/Source/CPTPlotArea.h index 3e101ce8b..e98181fa7 100644 --- a/framework/Source/CPTPlotArea.h +++ b/framework/Source/CPTPlotArea.h @@ -85,7 +85,7 @@ /// @name Layer Ordering /// @{ -@property (nonatomic, readwrite, strong, nullable) NSArray *topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray topDownLayerOrder; /// @} /// @name Decorations diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index dfd2c16f1..56ae066fa 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -74,7 +74,7 @@ @implementation CPTPlotArea **/ @synthesize axisTitleGroup; -/** @property NSArray *topDownLayerOrder +/** @property CPTNumberArray topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * * The array should reference the layers using the constants defined in #CPTGraphLayerType. @@ -288,7 +288,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context [self.fill fillRect:self.bounds inContext:context]; - NSArray *theAxes = self.axisSet.axes; + CPTAxisArray theAxes = self.axisSet.axes; for ( CPTAxis *axis in theAxes ) { [axis drawBackgroundBandsInContext:context]; @@ -353,7 +353,7 @@ -(void)layoutSublayers } } --(NSSet *)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet)sublayersExcludedFromAutomaticLayout { CPTGridLineGroup *minorGrid = self.minorGridLineGroup; CPTGridLineGroup *majorGrid = self.majorGridLineGroup; @@ -363,7 +363,7 @@ -(NSSet *)sublayersExcludedFromAutomaticLayout CPTAxisLabelGroup *titles = self.axisTitleGroup; if ( minorGrid || majorGrid || theAxisSet || thePlotGroup || labels || titles ) { - NSMutableSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } @@ -409,7 +409,7 @@ -(void)updateLayerOrder *(buLayerOrder++) = (CPTGraphLayerType)i; } - NSArray *tdLayerOrder = self.topDownLayerOrder; + CPTNumberArray tdLayerOrder = self.topDownLayerOrder; if ( tdLayerOrder ) { buLayerOrder = self.bottomUpLayerOrder; @@ -882,7 +882,7 @@ -(void)setAxisTitleGroup:(CPTAxisLabelGroup *)newAxisTitleGroup } } --(void)setTopDownLayerOrder:(NSArray *)newArray +-(void)setTopDownLayerOrder:(CPTNumberArray)newArray { if ( newArray != topDownLayerOrder ) { topDownLayerOrder = newArray; diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index 56f7437e2..ef2c1aa81 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -2,6 +2,8 @@ /// @file +@class CPTPlotRange; + /** * @brief Enumeration of possible results of a plot range comparison. **/ @@ -11,6 +13,16 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { CPTPlotRangeComparisonResultNumberAboveRange ///< Number is above the range. }; +/** + * @brief An array of plot ranges. + **/ +typedef NSArray *CPTPlotRangeArray; + +/** + * @brief A mutable array of plot ranges. + **/ +typedef NSMutableArray *CPTMutablePlotRangeArray; + @interface CPTPlotRange : NSObject /// @name Range Limits diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index d749bad3b..8dd84ec78 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -1,4 +1,5 @@ #import "CPTDefinitions.h" +#import "CPTPlot.h" #import "CPTResponder.h" @class CPTLayer; @@ -152,6 +153,16 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; @end +/** + * @brief An array of plot spaces. + **/ +typedef NSArray<__kindof CPTPlotSpace *> *CPTPlotSpaceArray; + +/** + * @brief A mutable array of plot spaces. + **/ +typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; + #pragma mark - @interface CPTPlotSpace : NSObject @@ -169,10 +180,10 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; -(void)addCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; -(void)removeCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; -(void)insertCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; --(void)setCategories:(nullable NSArray *)newCategories forCoordinate:(CPTCoordinate)coordinate; +-(void)setCategories:(nullable CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate; -(void)removeAllCategories; --(nonnull NSArray *)categoriesForCoordinate:(CPTCoordinate)coordinate; +-(nonnull CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate; -(nullable NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; -(NSUInteger)indexOfCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; /// @} @@ -194,17 +205,17 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; /// @name Coordinate Space Conversions /// @{ --(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSArray *)plotPoint; +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint; -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count; -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count; --(nullable NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point; +-(nullable CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point; -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event; --(nullable NSArray *)plotPointForEvent:(nonnull CPTNativeEvent *)event; +-(nullable CPTNumberArray)plotPointForEvent:(nonnull CPTNativeEvent *)event; -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; /// @} @@ -223,8 +234,8 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; /// @name Adjusting Ranges /// @{ --(void)scaleToFitPlots:(nullable NSArray *)plots; --(void)scaleToFitPlots:(nullable NSArray *)plots forCoordinate:(CPTCoordinate)coordinate; +-(void)scaleToFitPlots:(nullable CPTPlotArray)plots; +-(void)scaleToFitPlots:(nullable CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate; -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 32273efdd..63dd4f1d5 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -1,7 +1,6 @@ #import "CPTPlotSpace.h" #import "CPTMutablePlotRange.h" -#import "CPTPlot.h" #import "CPTUtilities.h" NSString *const CPTPlotSpaceCoordinateMappingDidChangeNotification = @"CPTPlotSpaceCoordinateMappingDidChangeNotification"; @@ -12,13 +11,15 @@ /// @cond +typedef NSMutableOrderedSet *CPTMutableCategorySet; + @interface CPTPlotSpace() -@property (nonatomic, readwrite, strong) NSMutableDictionary *categoryNames; +@property (nonatomic, readwrite, strong) NSMutableDictionary *categoryNames; @property (nonatomic, readwrite) BOOL isDragging; --(NSMutableOrderedSet *)orderedSetForCoordinate:(CPTCoordinate)coordinate; +-(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate; @end @@ -65,7 +66,7 @@ @implementation CPTPlotSpace @dynamic numberOfCoordinates; /** @internal - * @property NSMutableDictionary *categoryNames + * @property NSMutableDictionary *categoryNames * @brief The names of the data categories for each coordinate with a #CPTScaleTypeCategory scale type. * The keys are the CPTCoordinate enumeration values and the values are arrays of strings. **/ @@ -161,9 +162,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @param coordinate The axis coordinate. * @return The ordered set of categories for the given coordinate. */ --(NSMutableOrderedSet *)orderedSetForCoordinate:(CPTCoordinate)coordinate +-(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate { - NSMutableDictionary *names = self.categoryNames; + NSMutableDictionary *names = self.categoryNames; if ( !names ) { names = [[NSMutableDictionary alloc] init]; @@ -173,7 +174,7 @@ -(NSMutableOrderedSet *)orderedSetForCoordinate:(CPTCoordinate)coordinate NSNumber *cacheKey = @(coordinate); - NSMutableOrderedSet *categories = names[cacheKey]; + CPTMutableCategorySet categories = names[cacheKey]; if ( !categories ) { categories = [[NSMutableOrderedSet alloc] init]; @@ -196,7 +197,7 @@ -(void)addCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate { NSParameterAssert(category); - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; [categories addObject:category]; } @@ -210,7 +211,7 @@ -(void)removeCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina { NSParameterAssert(category); - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; [categories removeObject:category]; } @@ -228,7 +229,7 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina { NSParameterAssert(category); - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; NSParameterAssert(idx <= categories.count); @@ -240,9 +241,9 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina * @param newCategories An array of category names. * @param coordinate The axis coordinate. */ --(void)setCategories:(NSArray *)newCategories forCoordinate:(CPTCoordinate)coordinate +-(void)setCategories:(CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate { - NSMutableDictionary *names = self.categoryNames; + NSMutableDictionary *names = self.categoryNames; if ( !names ) { names = [[NSMutableDictionary alloc] init]; @@ -273,9 +274,9 @@ -(void)removeAllCategories * @param coordinate The axis coordinate. * @return An array of category names. */ --(NSArray *)categoriesForCoordinate:(CPTCoordinate)coordinate +-(CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate { - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; return [categories array]; } @@ -288,7 +289,7 @@ -(NSArray *)categoriesForCoordinate:(CPTCoordinate)coordinate */ -(NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx { - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; NSParameterAssert(idx < categories.count); @@ -305,7 +306,7 @@ -(NSUInteger)indexOfCategory:(NSString *)category forCoordinate:(CPTCoordinate)c { NSParameterAssert(category); - NSMutableOrderedSet *categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; return [categories indexOfObject:category]; } @@ -480,7 +481,7 @@ -(NSUInteger)numberOfCoordinates * @param plotPoint An array of data point coordinates (as NSNumber values). * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint { NSParameterAssert(plotPoint.count == self.numberOfCoordinates); @@ -515,7 +516,7 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe * @param point The drawing coordinates of the data point. * @return An array of data point coordinates (as NSNumber values). **/ --(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point +-(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point { return nil; } @@ -553,7 +554,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event * @param event The event. * @return An array of data point coordinates (as NSNumber values). **/ --(NSArray *)plotPointForEvent:(CPTNativeEvent *)event +-(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event { return nil; } @@ -615,7 +616,7 @@ -(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate /** @brief Scales the plot ranges so that the plots just fit in the visible space. * @param plots An array of the plots that have to fit in the visible area. **/ --(void)scaleToFitPlots:(NSArray *)plots +-(void)scaleToFitPlots:(CPTPlotArray)plots { } @@ -623,7 +624,7 @@ -(void)scaleToFitPlots:(NSArray *)plots * @param plots An array of the plots that have to fit in the visible area. * @param coordinate The axis coordinate. **/ --(void)scaleToFitPlots:(NSArray *)plots forCoordinate:(CPTCoordinate)coordinate +-(void)scaleToFitPlots:(CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate { if ( plots.count == 0 ) { return; diff --git a/framework/Source/CPTPlotSpaceAnnotation.h b/framework/Source/CPTPlotSpaceAnnotation.h index be0ff4b5e..a0fb80bec 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.h +++ b/framework/Source/CPTPlotSpaceAnnotation.h @@ -4,10 +4,10 @@ @interface CPTPlotSpaceAnnotation : CPTAnnotation -@property (nonatomic, readwrite, copy, nullable) NSArray *anchorPlotPoint; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray anchorPlotPoint; @property (nonatomic, readonly, nonnull) CPTPlotSpace *plotSpace; --(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable NSArray *)plotPoint NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable CPTNumberArray)plotPoint NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 0517f0cc1..102058d7d 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -28,7 +28,7 @@ -(void)setContentNeedsLayout; **/ @implementation CPTPlotSpaceAnnotation -/** @property NSArray *anchorPlotPoint +/** @property CPTNumberArray anchorPlotPoint * @brief An array of NSDecimalNumber objects giving the anchor plot coordinates. **/ @synthesize anchorPlotPoint; @@ -56,7 +56,7 @@ @implementation CPTPlotSpaceAnnotation * @param newPlotPoint An array of NSDecimalNumber objects giving the anchor plot coordinates. * @return The initialized CPTPlotSpaceAnnotation object. **/ --(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(NSArray *)newPlotPoint +-(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(CPTNumberArray)newPlotPoint { NSParameterAssert(newPlotSpace); @@ -140,7 +140,7 @@ -(void)positionContentLayer if ( content ) { CPTLayer *hostLayer = self.annotationHostLayer; if ( hostLayer ) { - NSArray *plotAnchor = self.anchorPlotPoint; + CPTNumberArray plotAnchor = self.anchorPlotPoint; if ( plotAnchor ) { // Get plot area point CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -175,7 +175,7 @@ -(void)positionContentLayer /// @cond --(void)setAnchorPlotPoint:(NSArray *)newPlotPoint +-(void)setAnchorPlotPoint:(CPTNumberArray)newPlotPoint { if ( anchorPlotPoint != newPlotPoint ) { anchorPlotPoint = [newPlotPoint copy]; diff --git a/framework/Source/CPTPlotSymbol.h b/framework/Source/CPTPlotSymbol.h index 60701b0a9..a78902ba8 100644 --- a/framework/Source/CPTPlotSymbol.h +++ b/framework/Source/CPTPlotSymbol.h @@ -2,6 +2,7 @@ @class CPTLineStyle; @class CPTFill; +@class CPTPlotSymbol; @class CPTShadow; /** @@ -23,6 +24,16 @@ typedef NS_ENUM (NSInteger, CPTPlotSymbolType) { CPTPlotSymbolTypeCustom ///< Custom symbol. }; +/** + * @brief An array of plot symbols. + **/ +typedef NSArray *CPTPlotSymbolArray; + +/** + * @brief A mutable array of plot symbols. + **/ +typedef NSMutableArray *CPTMutablePlotSymbolArray; + @interface CPTPlotSymbol : NSObject @property (nonatomic, readwrite, assign) CGPoint anchorPoint; diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index a15ce081e..09362a50b 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -1,7 +1,7 @@ #import "CPTDefinitions.h" +#import "CPTLineStyle.h" #import "CPTPlot.h" -@class CPTLineStyle; @class CPTFill; @class CPTRangePlot; @@ -44,7 +44,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable NSArray *)barLineStylesForRangePlot:(nonnull CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray)barLineStylesForRangePlot:(nonnull CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given range plot. * This method will not be called if diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index ccc5ef1e2..f157ccd3c 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -47,13 +47,13 @@ @interface CPTRangePlot() -@property (nonatomic, readwrite, copy) NSArray *xValues; -@property (nonatomic, readwrite, copy) NSArray *yValues; +@property (nonatomic, readwrite, copy) CPTNumberArray xValues; +@property (nonatomic, readwrite, copy) CPTNumberArray yValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *leftValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *rightValues; -@property (nonatomic, readwrite, copy) NSArray *barLineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; @@ -581,9 +581,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barLineStyleForRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource barLineStyleForRangePlot:self recordIndex:idx]; @@ -908,7 +908,7 @@ -(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -937,7 +937,7 @@ -(NSUInteger)numberOfFields return 6; } --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[@(CPTRangePlotFieldX), @(CPTRangePlotFieldY), @@ -947,9 +947,9 @@ -(NSArray *)fieldIdentifiers @(CPTRangePlotFieldRight)]; } --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - NSArray *result = nil; + CPTNumberArray result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1010,8 +1010,8 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte } NSNumber *yValue; - NSArray *yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; - NSArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; + CPTNumberArray yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; + CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { yValue = [yValuesSorted lastObject]; } @@ -1287,22 +1287,22 @@ -(void)setGapWidth:(CGFloat)newGapWidth } } --(void)setXValues:(NSArray *)newValues +-(void)setXValues:(CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldX]; } --(NSArray *)xValues +-(CPTNumberArray)xValues { return [[self cachedNumbersForField:CPTRangePlotFieldX] sampleArray]; } --(void)setYValues:(NSArray *)newValues +-(void)setYValues:(CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldY]; } --(NSArray *)yValues +-(CPTNumberArray)yValues { return [[self cachedNumbersForField:CPTRangePlotFieldY] sampleArray]; } @@ -1347,12 +1347,12 @@ -(void)setRightValues:(CPTMutableNumericData *)newValues [self cacheNumbers:newValues forField:CPTRangePlotFieldRight]; } --(NSArray *)barLineStyles +-(CPTLineStyleArray)barLineStyles { return [self cachedArrayForKey:CPTRangePlotBindingBarLineStyles]; } --(void)setBarLineStyles:(NSArray *)newLineStyles +-(void)setBarLineStyles:(CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTRangePlotBindingBarLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index e55fa4d9b..84317a202 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -1,11 +1,11 @@ #import "CPTDefinitions.h" +#import "CPTLimitBand.h" #import "CPTPlot.h" +#import "CPTPlotSymbol.h" /// @file -@class CPTLimitBand; @class CPTLineStyle; -@class CPTPlotSymbol; @class CPTScatterPlot; @class CPTFill; @@ -61,7 +61,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param indexRange The range of the data indexes of interest. * @return An array of plot symbols. **/ --(nullable NSArray *)symbolsForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTPlotSymbolArray)symbolsForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a single plot symbol for the given scatter plot. * This method will not be called if @@ -238,7 +238,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { /// @name Area Fill Bands /// @{ -@property (nonatomic, readonly, nullable) NSArray *areaFillBands; +@property (nonatomic, readonly, nullable) CPTLimitBandArray areaFillBands; /// @} /// @name Drawing diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index a9a56096d..8eaf87835 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -3,7 +3,6 @@ #import "CPTExceptions.h" #import "CPTFill.h" #import "CPTLegend.h" -#import "CPTLimitBand.h" #import "CPTLineStyle.h" #import "CPTMutableNumericData.h" #import "CPTPathExtensions.h" @@ -11,7 +10,6 @@ #import "CPTPlotRange.h" #import "CPTPlotSpace.h" #import "CPTPlotSpaceAnnotation.h" -#import "CPTPlotSymbol.h" #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" @@ -36,12 +34,12 @@ /// @cond @interface CPTScatterPlot() -@property (nonatomic, readwrite, copy) NSArray *xValues; -@property (nonatomic, readwrite, copy) NSArray *yValues; -@property (nonatomic, readwrite, strong) NSArray *plotSymbols; +@property (nonatomic, readwrite, copy) CPTNumberArray xValues; +@property (nonatomic, readwrite, copy) CPTNumberArray yValues; +@property (nonatomic, readwrite, strong) CPTPlotSymbolArray plotSymbols; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @property (nonatomic, readwrite, assign) BOOL pointingDeviceDownOnLine; -@property (nonatomic, readwrite, strong) NSMutableArray *mutableAreaFillBands; +@property (nonatomic, readwrite, strong) CPTMutableLimitBandArray mutableAreaFillBands; -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; -(void)calculateViewPoints:(CGPoint *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; @@ -168,7 +166,7 @@ @implementation CPTScatterPlot **/ @synthesize pointingDeviceDownOnLine; -/** @property NSArray *areaFillBands +/** @property CPTLimitBandArray areaFillBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn between the plot line and areaBaseValue and on top of the areaFill. @@ -376,9 +374,9 @@ -(void)reloadPlotSymbolsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(symbolForScatterPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutablePlotSymbolArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTPlotSymbol *symbol = [theDataSource symbolForScatterPlot:self recordIndex:idx]; @@ -779,9 +777,9 @@ -(void)renderAsVectorInContext:(CGContextRef)context if ( firstDrawnPointIndex != NSNotFound ) { NSRange viewIndexRange = NSMakeRange( (NSUInteger)firstDrawnPointIndex, (NSUInteger)(lastDrawnPointIndex - firstDrawnPointIndex + 1) ); - CPTPlotArea *thePlotArea = self.plotArea; - CPTLineStyle *theLineStyle = self.dataLineStyle; - NSMutableArray *fillBands = self.mutableAreaFillBands; + CPTPlotArea *thePlotArea = self.plotArea; + CPTLineStyle *theLineStyle = self.dataLineStyle; + CPTMutableLimitBandArray fillBands = self.mutableAreaFillBands; // Draw fills NSDecimal theAreaBaseValue; @@ -1300,7 +1298,7 @@ -(CGPathRef)newDataLinePath +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ @@ -1328,14 +1326,14 @@ -(NSUInteger)numberOfFields return 2; } --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[@(CPTScatterPlotFieldX), @(CPTScatterPlotFieldY)]; } --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - NSArray *result = nil; + CPTNumberArray result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1433,7 +1431,7 @@ -(void)addAreaFillBand:(CPTLimitBand *)limitBand -(void)removeAreaFillBand:(CPTLimitBand *)limitBand { if ( limitBand ) { - NSMutableArray *fillBands = self.mutableAreaFillBands; + CPTMutableLimitBandArray fillBands = self.mutableAreaFillBands; [fillBands removeObject:limitBand]; if ( fillBands.count == 0 ) { @@ -1807,7 +1805,7 @@ -(void)setAreaFill2:(CPTFill *)newFill } } --(NSArray *)areaFillBands +-(CPTLimitBandArray)areaFillBands { return [self.mutableAreaFillBands copy]; } @@ -1842,33 +1840,33 @@ -(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue } } --(void)setXValues:(NSArray *)newValues +-(void)setXValues:(CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldX]; } --(NSArray *)xValues +-(CPTNumberArray)xValues { return [[self cachedNumbersForField:CPTScatterPlotFieldX] sampleArray]; } --(void)setYValues:(NSArray *)newValues +-(void)setYValues:(CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldY]; } --(NSArray *)yValues +-(CPTNumberArray)yValues { return [[self cachedNumbersForField:CPTScatterPlotFieldY] sampleArray]; } --(void)setPlotSymbols:(NSArray *)newSymbols +-(void)setPlotSymbols:(CPTPlotSymbolArray)newSymbols { [self cacheArray:newSymbols forKey:CPTScatterPlotBindingPlotSymbols]; [self setNeedsDisplay]; } --(NSArray *)plotSymbols +-(CPTPlotSymbolArray)plotSymbols { return [self cachedArrayForKey:CPTScatterPlotBindingPlotSymbols]; } diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index 94e112c2a..aca7fc1f7 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -7,8 +7,8 @@ @interface CPTScatterPlot(Testing) -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; --(void)setXValues:(NSArray *)newValues; --(void)setYValues:(NSArray *)newValues; +-(void)setXValues:(CPTNumberArray)newValues; +-(void)setYValues:(CPTNumberArray)newValues; @end @@ -22,7 +22,7 @@ -(void)setUp double values[5] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; self.plot = [CPTScatterPlot new]; - NSMutableArray *yValues = [NSMutableArray array]; + CPTMutableNumberArray yValues = [NSMutableArray array]; for ( NSInteger i = 0; i < 5; i++ ) { [yValues addObject:@(values[i])]; } @@ -46,7 +46,8 @@ -(void)testCalculatePointsToDrawAllInRange { BOOL drawFlags[5]; double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -62,7 +63,8 @@ -(void)testCalculatePointsToDrawAllInRangeVisibleOnly { BOOL drawFlags[5]; double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -78,7 +80,8 @@ -(void)testCalculatePointsToDrawNoneInRange { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -94,7 +97,8 @@ -(void)testCalculatePointsToDrawNoneInRangeVisibleOnly { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -110,7 +114,8 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegions { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -126,7 +131,8 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegionsVisibleOnly { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -143,7 +149,8 @@ -(void)testCalculatePointsToDrawSomeInRange BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; BOOL expected[5] = { YES, YES, YES, YES, NO }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -164,7 +171,8 @@ -(void)testCalculatePointsToDrawSomeInRangeVisibleOnly { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -186,7 +194,8 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossing BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; BOOL expected[5] = { YES, YES, YES, YES, NO }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -207,7 +216,8 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossingVisibleOnly { BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; - NSMutableArray *values = [NSMutableArray array]; + + CPTMutableNumberArray values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; diff --git a/framework/Source/CPTTextStyle.h b/framework/Source/CPTTextStyle.h index 53e58ee93..fce873219 100644 --- a/framework/Source/CPTTextStyle.h +++ b/framework/Source/CPTTextStyle.h @@ -1,6 +1,18 @@ -#include "CPTTextStylePlatformSpecific.h" +#import "CPTDefinitions.h" +#import "CPTTextStylePlatformSpecific.h" @class CPTColor; +@class CPTTextStyle; + +/** + * @brief An array of text styles. + **/ +typedef NSArray *CPTTextStyleArray; + +/** + * @brief A mutable array of text styles. + **/ +typedef NSMutableArray *CPTMutableTextStyleArray; @interface CPTTextStyle : NSObject @@ -24,11 +36,11 @@ **/ @interface CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -@property (readonly, nonatomic, nonnull) NSDictionary *attributes; +@property (readonly, nonatomic, nonnull) CPTDictionary attributes; /// @name Factory Methods /// @{ -+(nonnull instancetype)textStyleWithAttributes:(nullable NSDictionary *)attributes; ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes; /// @} @end diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index cebea1dc1..9242be76e 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -1,7 +1,6 @@ #import "CPTTextStyle.h" #import "CPTColor.h" -#import "CPTDefinitions.h" #import "CPTMutableTextStyle.h" #import "NSCoderExtensions.h" diff --git a/framework/Source/CPTTheme.h b/framework/Source/CPTTheme.h index 48107cbd4..2825e914c 100644 --- a/framework/Source/CPTTheme.h +++ b/framework/Source/CPTTheme.h @@ -19,7 +19,7 @@ extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with /// @name Theme Management /// @{ +(void)registerTheme:(nonnull Class)themeClass; -+(nullable NSArray *)themeClasses; ++(nullable NSArray *)themeClasses; +(nullable instancetype)themeNamed:(nullable NSString *)theme; +(nonnull NSString *)name; /// @} diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index 1a735d426..7138d6344 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -8,7 +8,7 @@ **/ // Registered themes -static NSMutableSet *themes = nil; +static NSMutableSet *themes = nil; /** @brief Creates a CPTGraph instance formatted with a predefined style. * @@ -84,7 +84,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /** @brief List of the available theme classes, sorted by name. * @return An NSArray containing all available theme classes, sorted by name. **/ -+(NSArray *)themeClasses ++(NSArray *)themeClasses { NSSortDescriptor *nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; diff --git a/framework/Source/CPTTradingRangePlot.h b/framework/Source/CPTTradingRangePlot.h index 0c2c91de1..f9a4d4122 100644 --- a/framework/Source/CPTTradingRangePlot.h +++ b/framework/Source/CPTTradingRangePlot.h @@ -1,11 +1,11 @@ #import "CPTDefinitions.h" +#import "CPTFill.h" +#import "CPTLineStyle.h" #import "CPTPlot.h" /// @file -@class CPTLineStyle; @class CPTTradingRangePlot; -@class CPTFill; /// @ingroup plotBindingsTradingRangePlot /// @{ @@ -56,7 +56,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of fills. **/ --(nullable NSArray *)increaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray)increaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close >= open for the given plot. * This method will not be called if @@ -73,7 +73,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param plot The trading range plot. * @param indexRange The range of the data indexes of interest. **/ --(nullable NSArray *)decreaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray)decreaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close < open for the given plot. * This method will not be called if @@ -96,7 +96,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable NSArray *)lineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray)lineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to draw candlestick or OHLC symbols for the given trading range plot. * This method will not be called if @@ -114,7 +114,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable NSArray *)increaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray)increaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close >= open for the given trading range plot. * This method will not be called if @@ -132,7 +132,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable NSArray *)decreaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray)decreaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close < open for the given trading range plot. * This method will not be called if diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index cefd8b2e7..392dc1e38 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -2,7 +2,6 @@ #import "CPTColor.h" #import "CPTExceptions.h" -#import "CPTFill.h" #import "CPTLegend.h" #import "CPTLineStyle.h" #import "CPTMutableNumericData.h" @@ -48,11 +47,11 @@ @interface CPTTradingRangePlot() @property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *closeValues; -@property (nonatomic, readwrite, copy) NSArray *increaseFills; -@property (nonatomic, readwrite, copy) NSArray *decreaseFills; -@property (nonatomic, readwrite, copy) NSArray *lineStyles; -@property (nonatomic, readwrite, copy) NSArray *increaseLineStyles; -@property (nonatomic, readwrite, copy) NSArray *decreaseLineStyles; +@property (nonatomic, readwrite, copy) CPTFillArray increaseFills; +@property (nonatomic, readwrite, copy) CPTFillArray decreaseFills; +@property (nonatomic, readwrite, copy) CPTLineStyleArray lineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray increaseLineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray decreaseLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)drawCandleStickInContext:(CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; @@ -369,9 +368,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(increaseFillForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource increaseFillForTradingRangePlot:self recordIndex:idx]; @@ -397,9 +396,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(decreaseFillForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource decreaseFillForTradingRangePlot:self recordIndex:idx]; @@ -450,9 +449,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(lineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource lineStyleForTradingRangePlot:self recordIndex:idx]; @@ -478,9 +477,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(increaseLineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource increaseLineStyleForTradingRangePlot:self recordIndex:idx]; @@ -506,9 +505,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(decreaseLineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource decreaseLineStyleForTradingRangePlot:self recordIndex:idx]; @@ -1103,7 +1102,7 @@ -(CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx +(BOOL)needsDisplayForKey:(NSString *)aKey { - static NSSet *keys = nil; + static NSSet *keys = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ @@ -1133,7 +1132,7 @@ -(NSUInteger)numberOfFields return 5; } --(NSArray *)fieldIdentifiers +-(CPTNumberArray)fieldIdentifiers { return @[@(CPTTradingRangePlotFieldX), @(CPTTradingRangePlotFieldOpen), @@ -1142,9 +1141,9 @@ -(NSArray *)fieldIdentifiers @(CPTTradingRangePlotFieldLow)]; } --(NSArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - NSArray *result = nil; + CPTNumberArray result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1206,11 +1205,11 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte NSNumber *xValue = [self cachedNumberForField:CPTTradingRangePlotFieldX recordIndex:idx]; NSNumber *yValue; - NSArray *yValues = @[[self cachedNumberForField:CPTTradingRangePlotFieldOpen recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldClose recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldHigh recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; - NSArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; + CPTNumberArray yValues = @[[self cachedNumberForField:CPTTradingRangePlotFieldOpen recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldClose recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldHigh recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; + CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { yValue = [yValuesSorted lastObject]; } @@ -1759,56 +1758,56 @@ -(void)setCloseValues:(CPTMutableNumericData *)newValues [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldClose]; } --(NSArray *)increaseFills +-(CPTFillArray)increaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseFills]; } --(void)setIncreaseFills:(NSArray *)newFills +-(void)setIncreaseFills:(CPTFillArray)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingIncreaseFills]; [self setNeedsDisplay]; } --(NSArray *)decreaseFills +-(CPTFillArray)decreaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseFills]; } --(void)setDecreaseFills:(NSArray *)newFills +-(void)setDecreaseFills:(CPTFillArray)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingDecreaseFills]; [self setNeedsDisplay]; } --(NSArray *)lineStyles +-(CPTLineStyleArray)lineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingLineStyles]; } --(void)setLineStyles:(NSArray *)newLineStyles +-(void)setLineStyles:(CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingLineStyles]; [self setNeedsDisplay]; } --(NSArray *)increaseLineStyles +-(CPTLineStyleArray)increaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseLineStyles]; } --(void)setIncreaseLineStyles:(NSArray *)newLineStyles +-(void)setIncreaseLineStyles:(CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingIncreaseLineStyles]; [self setNeedsDisplay]; } --(NSArray *)decreaseLineStyles +-(CPTLineStyleArray)decreaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseLineStyles]; } --(void)setDecreaseLineStyles:(NSArray *)newLineStyles +-(void)setDecreaseLineStyles:(CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingDecreaseLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 3bccee101..c1b916e71 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -16,7 +16,7 @@ /// @cond @interface CPTXYAxis() --(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable NSSet *)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major; +-(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CPTNumberSet)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major; -(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper; -(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue; @@ -210,7 +210,7 @@ -(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue /// @cond --(void)drawTicksInContext:(CGContextRef)context atLocations:(NSSet *)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major +-(void)drawTicksInContext:(CGContextRef)context atLocations:(CPTNumberSet)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major { CPTLineStyle *lineStyle = (major ? self.majorTickLineStyle : self.minorTickLineStyle); @@ -390,7 +390,7 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major [self relabel]; CPTPlotSpace *thePlotSpace = self.plotSpace; - NSSet *locations = (major ? self.majorTickLocations : self.minorTickLocations); + CPTNumberSet locations = (major ? self.majorTickLocations : self.minorTickLocations); CPTCoordinate selfCoordinate = self.coordinate; CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(selfCoordinate); CPTMutablePlotRange *orthogonalRange = [[thePlotSpace plotRangeForCoordinate:orthogonalCoordinate] mutableCopy]; @@ -480,11 +480,11 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major -(void)drawBackgroundBandsInContext:(CGContextRef)context { - NSArray *bandArray = self.alternatingBandFills; - NSUInteger bandCount = bandArray.count; + CPTFillArray bandArray = self.alternatingBandFills; + NSUInteger bandCount = bandArray.count; if ( bandCount > 0 ) { - NSArray *locations = [self.majorTickLocations allObjects]; + CPTNumberArray locations = [self.majorTickLocations allObjects]; if ( locations.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -603,7 +603,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context -(void)drawBackgroundLimitsInContext:(CGContextRef)context { - NSArray *limitArray = self.backgroundLimitBands; + CPTLimitBandArray limitArray = self.backgroundLimitBands; if ( limitArray.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; diff --git a/framework/Source/CPTXYAxisSet.m b/framework/Source/CPTXYAxisSet.m index 3060c3666..b4aa6703a 100644 --- a/framework/Source/CPTXYAxisSet.m +++ b/framework/Source/CPTXYAxisSet.m @@ -118,8 +118,8 @@ -(void)layoutSublayers sublayerPosition = CGPointMake(-sublayerPosition.x, -sublayerPosition.y); CGRect subLayerFrame = CGRectMake(sublayerPosition.x, sublayerPosition.y, sublayerBounds.size.width, sublayerBounds.size.height); - NSSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; - Class layerClass = [CPTLayer class]; + CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in self.sublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { subLayer.frame = subLayerFrame; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index cf4f470e8..43146d42b 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -16,6 +16,8 @@ #import /// @cond +typedef NSMutableArray *CPTMutableAnimationArray; + @interface CPTXYPlotSpace() -(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord; @@ -41,7 +43,7 @@ -(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTC @property (nonatomic, readwrite) CGPoint lastDisplacement; @property (nonatomic, readwrite) NSTimeInterval lastDragTime; @property (nonatomic, readwrite) NSTimeInterval lastDeltaTime; -@property (nonatomic, readwrite, retain, nonnull) NSMutableArray *animations; +@property (nonatomic, readwrite, retain, nonnull) CPTMutableAnimationArray animations; @end @@ -519,7 +521,7 @@ -(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPT -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shift momentumTime:(CGFloat)momentumTime speed:(CGFloat)speed acceleration:(CGFloat)acceleration { - NSMutableArray *animationArray = self.animations; + CPTMutableAnimationArray animationArray = self.animations; CPTAnimationOperation *op; NSString *property = nil; @@ -737,7 +739,7 @@ -(void)setGlobalYRange:(CPTPlotRange *)newRange } } --(void)scaleToFitPlots:(NSArray *)plots +-(void)scaleToFitPlots:(CPTPlotArray)plots { if ( plots.count == 0 ) { return; @@ -916,7 +918,7 @@ -(NSUInteger)numberOfCoordinates } // Plot area view point for plot point --(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint { CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint]; @@ -1065,9 +1067,9 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe } // Plot point for view point --(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point +-(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point { - NSMutableArray *plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; + CPTMutableNumberArray plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; CGSize boundsSize; CPTGraph *theGraph = self.graph; @@ -1241,7 +1243,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event } // Plot point for event --(NSArray *)plotPointForEvent:(CPTNativeEvent *)event +-(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event { return [self plotPointForPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; } @@ -1390,7 +1392,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact self.lastDeltaTime = 0.0; // Clear any previous animations - NSMutableArray *animationArray = self.animations; + CPTMutableAnimationArray animationArray = self.animations; for ( CPTAnimationOperation *op in animationArray ) { [[CPTAnimation sharedInstance] removeAnimationOperation:op]; } diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 3266369ff..24a027353 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -49,7 +49,7 @@ -(void)testViewPointForPlotPointArrayLinear plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@10.0]; - NSArray *plotPoint = @[@5.0, @5.0]; + CPTNumberArray plotPoint = @[@5.0, @5.0]; CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; @@ -146,7 +146,7 @@ -(void)testViewPointForPlotPointArrayLog plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@9.0]; - NSArray *plotPoint = @[@( sqrt(10.0) ), @( sqrt(10.0) )]; + CPTNumberArray plotPoint = @[@( sqrt(10.0) ), @( sqrt(10.0) )]; CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; @@ -243,8 +243,8 @@ -(void)testPlotPointArrayForViewPointLinear plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@10.0]; - CGPoint viewPoint = CPTPointMake(50.0, 25.0); - NSArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + CPTNumberArray plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; NSString *errMessage; errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; @@ -316,8 +316,8 @@ -(void)testPlotPointArrayForViewPointLog plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@9.0]; - CGPoint viewPoint = CPTPointMake(50.0, 25.0); - NSArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + CPTNumberArray plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; NSString *errMessage; [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 991c07956..1bd64693c 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -89,7 +89,7 @@ -(void)encodeCGColorSpace:(CGColorSpaceRef)colorSpace forKey:(NSString *)key void CPTPathApplierFunc(void *info, const CGPathElement *element) { - NSMutableDictionary *elementData = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *elementData = [[NSMutableDictionary alloc] init]; elementData[@"type"] = @(element->type); @@ -112,7 +112,7 @@ void CPTPathApplierFunc(void *info, const CGPathElement *element) break; } - NSMutableArray *pathData = (__bridge NSMutableArray *)info; + NSMutableArray *> *pathData = (__bridge NSMutableArray *> *)info; [pathData addObject:elementData]; } @@ -124,7 +124,7 @@ void CPTPathApplierFunc(void *info, const CGPathElement *element) **/ -(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key { - NSMutableArray *pathData = [[NSMutableArray alloc] init]; + NSMutableArray *> *pathData = [[NSMutableArray alloc] init]; // walk the path and gather data for each element CGPathApply(path, (__bridge void *)(pathData), &CPTPathApplierFunc); @@ -136,7 +136,7 @@ -(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key // encode data elements for ( NSUInteger i = 0; i < dataCount; i++ ) { - NSDictionary *elementData = pathData[i]; + NSDictionary *elementData = pathData[i]; CGPathElementType type = (CGPathElementType)[elementData[@"type"] intValue]; newKey = [[NSString alloc] initWithFormat:@"%@[%lu].type", key, (unsigned long)i]; diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 33c921f98..30f9c1966 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -130,12 +130,12 @@ -(void)layoutSublayers } } --(NSSet *)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet)sublayersExcludedFromAutomaticLayout { CPTBorderedLayer *excludedLayer = self.maskedLayer; if ( excludedLayer ) { - NSMutableSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index da1bff408..42d18d311 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -129,7 +129,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { BOOL handled = NO; @@ -156,7 +156,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event } } --(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { CPTGraph *theHostedGraph = self.hostedGraph; @@ -178,7 +178,7 @@ -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event } } --(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { CPTGraph *theHostedGraph = self.hostedGraph; @@ -200,7 +200,7 @@ -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event } } --(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { BOOL handled = [self.hostedGraph pointingDeviceCancelledEvent:event]; diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index e300e44ea..2da829d3f 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -17,7 +17,7 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 @interface NSString(CPTTextStylePlatformSpecificExtensions) --(CGSize)sizeWithAttributes:(NSDictionary *)attrs; +-(CGSize)sizeWithAttributes:(CPTDictionary)attrs; @end #else diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index cac150a94..1152dae82 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -8,7 +8,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property NSDictionary *attributes +/** @property CPTDictionary attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -34,7 +34,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(NSDictionary *)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -67,9 +67,9 @@ +(instancetype)textStyleWithAttributes:(NSDictionary *)attributes /// @cond --(NSDictionary *)attributes +-(CPTDictionary)attributes { - NSMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; + CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; // Font UIFont *styleFont = nil; @@ -113,7 +113,7 @@ @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtension /// @cond -+(instancetype)textStyleWithAttributes:(NSDictionary *)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; diff --git a/scripts/createrelease.py b/scripts/createrelease.py old mode 100755 new mode 100644 diff --git a/scripts/prefixer.py b/scripts/prefixer.py old mode 100755 new mode 100644 From ab4cdc5cdacf797715bd4a864ff6769b8156a410 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 1 Aug 2015 11:51:39 -0400 Subject: [PATCH 057/429] Removed the "RunUnitTests" script from the Mac unit test target which is obsolete in Xcode 7. --- framework/CorePlot.xcodeproj/project.pbxproj | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index de8bd518c..af0633a5f 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -1917,7 +1917,6 @@ 0730F5FB109492D800E95162 /* Resources */, 0730F5FC109492D800E95162 /* Sources */, 0730F5FD109492D800E95162 /* Frameworks */, - 0730F5FE109492D800E95162 /* ShellScript */, ); buildRules = ( ); @@ -2111,19 +2110,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0730F5FE109492D800E95162 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; 9021E49D0FC5C9DC00443472 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From e61d29eb02f5da974264af52d864f1844aab32ec Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 5 Aug 2015 15:33:32 -0400 Subject: [PATCH 058/429] Added a -debugQuickLookObject() method to many Core Plot classes for debugging and Swift playground support. --- framework/CorePlot.xcodeproj/project.pbxproj | 6 ++ .../MacOnly/CPTPlatformSpecificFunctions.h | 7 ++ .../MacOnly/CPTPlatformSpecificFunctions.m | 33 ++++++++ framework/Source/CPTColor.m | 18 +++++ framework/Source/CPTDebugQuickLook.h | 26 ++++++ framework/Source/CPTDefinitions.h | 2 + framework/Source/CPTFill.m | 17 ++++ framework/Source/CPTGradient.m | 26 ++++++ framework/Source/CPTImage.m | 12 +++ framework/Source/CPTLayer.m | 13 +++ framework/Source/CPTLineCap.m | 20 +++++ framework/Source/CPTLineStyle.m | 21 +++++ framework/Source/CPTPlotRange.m | 17 ++++ framework/Source/CPTPlotSpace.m | 14 ++++ framework/Source/CPTPlotSymbol.m | 79 ++++++++++++++----- framework/Source/CPTTextStyle.m | 14 ++++ framework/Source/CPTXYPlotSpace.m | 76 ++++++++++++++++++ .../iPhoneOnly/CPTPlatformSpecificFunctions.h | 9 +++ .../iPhoneOnly/CPTPlatformSpecificFunctions.m | 25 ++++++ 19 files changed, 414 insertions(+), 21 deletions(-) create mode 100644 framework/Source/CPTDebugQuickLook.h diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index a224cf37d..6d90d1113 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -551,6 +551,8 @@ C3A695E5146A19BC00AF5653 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3A695E6146A19BC00AF5653 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; C3AFC9D10FB62969005DFFDC /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3BB93191B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; + C3BB931A1B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; C3C1C0801790D3B400E8B1B7 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; C3C9CB0E165DB4D500739006 /* CPTAnimationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -874,6 +876,7 @@ C3B235631009931400970270 /* doxygen-cocoa-tags.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "doxygen-cocoa-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-tags.xml"; sourceTree = ""; }; C3B25EDF1AC23A7D0063CCD8 /* CorePlot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CorePlot.h; sourceTree = ""; }; C3BB7D1416322F7E00BC9515 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDebugQuickLook.h; sourceTree = ""; }; C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelGroup.h; sourceTree = ""; }; C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisLabelGroup.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C1C07E1790D3B400E8B1B7 /* CPTLayerTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLayerTests.h; sourceTree = ""; }; @@ -1276,6 +1279,7 @@ C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */, C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */, C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */, + C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */, 076A775F0FBF0BFE003F6D97 /* Tests */, ); name = "Types and Functions"; @@ -1749,6 +1753,7 @@ 070622320FDF1B250066A6C4 /* CPTPathExtensions.h in Headers */, 0706223C0FDF215C0066A6C4 /* CPTBorderedLayer.h in Headers */, 07C4679B0FE1A24C00299939 /* CPTMutableTextStyle.h in Headers */, + C3BB93191B729BD200004527 /* CPTDebugQuickLook.h in Headers */, 07C467B80FE1A96E00299939 /* CPTTextStylePlatformSpecific.h in Headers */, 0772C9270FE2F71600EC4C16 /* CPTTheme.h in Headers */, 0772C92F0FE2F89000EC4C16 /* _CPTDarkGradientTheme.h in Headers */, @@ -1897,6 +1902,7 @@ C38A0B241A46264500D45436 /* CPTPlatformSpecificFunctions.h in Headers */, C38A0A3B1A461EDA00D45436 /* CPTAnnotationHostLayer.h in Headers */, C38A0AF31A4625E800D45436 /* CPTAxisLabel.h in Headers */, + C3BB931A1B729BD200004527 /* CPTDebugQuickLook.h in Headers */, C38A0A2F1A461EB100D45436 /* _CPTAnimationTimingFunctions.h in Headers */, C38A0A4D1A461F1D00D45436 /* CPTMutableTextStyle.h in Headers */, C38A0AA81A46240300D45436 /* CPTXYGraph.h in Headers */, diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.h b/framework/MacOnly/CPTPlatformSpecificFunctions.h index 5812e583b..958deae06 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.h +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.h @@ -1,4 +1,5 @@ #import "CPTDefinitions.h" +#import "CPTPlatformSpecificDefines.h" /// @file @@ -26,6 +27,12 @@ CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor); /// @} +/// @name Debugging +/// @{ +CPTNativeImage *__nonnull CPTQuickLookImage(CGRect rect, __nonnull CPTQuickLookImageBlock renderBlock); + +/// @} + #if __cplusplus } #endif diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index c2ba07e3e..28a8e9c81 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -111,3 +111,36 @@ CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *nsColor) return rgbColor; } + +#pragma mark - +#pragma mark Debugging + +CPTNativeImage * __nonnull CPTQuickLookImage(CGRect rect, __nonnull CPTQuickLookImageBlock renderBlock) +{ + NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:(NSInteger)rect.size.width + pixelsHigh:(NSInteger)rect.size.height + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:(NSInteger)rect.size.width * 4 + bitsPerPixel:32]; + + NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; + + CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + + CGContextClearRect(context, rect); + + renderBlock(context, 1.0, rect); + + CGContextFlush(context); + + NSImage *image = [[NSImage alloc] initWithSize:NSSizeFromCGSize(rect.size)]; + [image addRepresentation:layerImage]; + + return image; +} diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 96ff7e937..5e7f813d7 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -2,6 +2,7 @@ #import "CPTColorSpace.h" #import "CPTDefinitions.h" +#import "CPTPlatformSpecificCategories.h" #import "NSCoderExtensions.h" /** @brief An immutable color. @@ -515,4 +516,21 @@ -(NSUInteger)hash /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + return self.uiColor; + +#else + return self.nsColor; +#endif +} + +/// @endcond + @end diff --git a/framework/Source/CPTDebugQuickLook.h b/framework/Source/CPTDebugQuickLook.h new file mode 100644 index 000000000..3b306a33c --- /dev/null +++ b/framework/Source/CPTDebugQuickLook.h @@ -0,0 +1,26 @@ +/** + * @brief Methods used to show QuickLook previews of objects in the Xcode debugger and Swift playgrounds. + **/ +@protocol CPTDebugQuickLook + +/// @name Debugging +/// @{ + +/** + * @brief Used to show QuickLook previews of objects in the Xcode debugger and Swift playgrounds. + **/ +-(id)debugQuickLookObject; + +/// @} + +@end + +#pragma mark - + +/** @category NSObject(CPTDebugQuickLookExtension) + * @brief Debugging extensions to NSObject. + **/ +@interface NSObject(CPTDebugQuickLookExtension) { +} + +@end diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 5eb3a8114..00d4e6c78 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -235,3 +235,5 @@ typedef struct _CPTEdgeInsets { CPTEdgeInsets; extern const CPTEdgeInsets CPTEdgeInsetsZero; ///< Defines a set of stretchable image edge insets where all of the values are zero (@num{0}). + +typedef void (^CPTQuickLookImageBlock)(__nonnull CGContextRef context, CGFloat scale, CGRect bounds); ///< Render a Quick Look image into the given context. diff --git a/framework/Source/CPTFill.m b/framework/Source/CPTFill.m index 6d2ebb157..c4c63382a 100644 --- a/framework/Source/CPTFill.m +++ b/framework/Source/CPTFill.m @@ -2,6 +2,7 @@ #import "CPTColor.h" #import "CPTImage.h" +#import "CPTPlatformSpecificFunctions.h" #import "_CPTFillColor.h" #import "_CPTFillGradient.h" #import "_CPTFillImage.h" @@ -178,4 +179,20 @@ -(void)fillPathInContext:(CGContextRef)context // do nothing--subclasses override to do drawing here } +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); + + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + [self fillRect:bounds inContext:context]; + }); +} + +/// @endcond + @end diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index dbc7cb7f8..1d30027bf 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -2,6 +2,7 @@ #import "CPTColor.h" #import "CPTColorSpace.h" +#import "CPTPlatformSpecificFunctions.h" #import "CPTUtilities.h" #import "NSCoderExtensions.h" #import @@ -1623,4 +1624,29 @@ void CPTResolveHSV(CGFloat *color1, CGFloat *color2) // H value may be undefined /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); + + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + switch ( self.gradientType ) { + case CPTGradientTypeAxial: + CGContextAddRect(context, bounds); + break; + + case CPTGradientTypeRadial: + CGContextAddEllipseInRect(context, bounds); + break; + } + [self fillPathInContext:context]; + }); +} + +/// @endcond + @end diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index dc29db743..c955dc999 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -818,4 +818,16 @@ -(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context self.lastDrawnScale = contextScale; } +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + return self.nativeImage; +} + +/// @endcond + @end diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index fa23d4edb..4b76278d5 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -2,6 +2,7 @@ #import "CPTGraph.h" #import "CPTPathExtensions.h" +#import "CPTPlatformSpecificCategories.h" #import "CPTPlatformSpecificFunctions.h" #import "CPTShadow.h" #import "CPTUtilities.h" @@ -1067,4 +1068,16 @@ -(NSString *)subLayersAtIndex:(NSUInteger)idx /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + return [self imageOfLayer]; +} + +/// @endcond + @end diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index f7cd54995..2c36f0bde 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -3,6 +3,7 @@ #import "CPTDefinitions.h" #import "CPTFill.h" #import "CPTLineStyle.h" +#import "CPTPlatformSpecificFunctions.h" #import "NSCoderExtensions.h" #import @@ -578,4 +579,23 @@ -(CGPathRef)newLineCapPath /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + const CGSize symbolSize = self.size; + const CGSize halfSize = CPTSizeMake( symbolSize.width * CPTFloat(0.5), symbolSize.height * CPTFloat(0.5) ); + const CGRect rect = CGRectMake(-halfSize.width, -halfSize.height, symbolSize.width, symbolSize.height); + const CGPoint centerPoint = CGPointMake(halfSize.width, halfSize.height); + + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + [self renderAsVectorInContext:context atPoint:centerPoint inDirection:CGPointMake(1.0, 0.0)]; + }); +} + +/// @endcond + @end diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index 27c470842..220b60f1d 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -5,6 +5,8 @@ #import "CPTFill.h" #import "CPTGradient.h" #import "CPTMutableLineStyle.h" +#import "CPTPlatformSpecificFunctions.h" +#import "CPTUtilities.h" #import "NSCoderExtensions.h" #import "NSNumberExtensions.h" @@ -388,4 +390,23 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); + + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + const CGRect alignedRect = CPTAlignBorderedRectToUserSpace(context, bounds, self); + + [self setLineStyleInContext:context]; + [self strokeRect:alignedRect inContext:context]; + }); +} + +/// @endcond + @end diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index 8fd034c17..a38bde557 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -601,4 +601,21 @@ -(NSString *)description /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + NSDecimal myLocation = self.locationDecimal; + NSDecimal myLength = self.lengthDecimal; + + return [NSString stringWithFormat:@"Location: %@\nLength: %@", + NSDecimalString(&myLocation, [NSLocale currentLocale]), + NSDecimalString(&myLength, [NSLocale currentLocale])]; +} + +/// @endcond + @end diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 32273efdd..dc8e8811b 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -656,4 +656,18 @@ -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint { } +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + return [NSString stringWithFormat:@"Identifier: %@\nallowsUserInteraction: %@", + self.identifier, + self.allowsUserInteraction ? @"YES":@"NO"]; +} + +/// @endcond + @end diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index 516346a7b..f818f1d88 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -3,6 +3,7 @@ #import "CPTDefinitions.h" #import "CPTFill.h" #import "CPTLineStyle.h" +#import "CPTPlatformSpecificFunctions.h" #import "CPTShadow.h" #import "NSCoderExtensions.h" #import @@ -15,6 +16,7 @@ @interface CPTPlotSymbol() @property (nonatomic, readwrite, assign) CGFloat cachedScale; -(CGPathRef)newSymbolPath; +-(CGSize)layerSizeForScale:(CGFloat)scale; @end @@ -457,33 +459,13 @@ -(id)copyWithZone:(NSZone *)zone **/ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale alignToPixels:(BOOL)alignToPixels { - const CGFloat symbolMargin = CPTFloat(2.0); - CGPoint symbolAnchor = self.anchorPoint; - CGSize symbolSize = self.size; - CGSize shadowOffset = CGSizeZero; - CGFloat shadowRadius = CPTFloat(0.0); - CPTShadow *myShadow = self.shadow; - - if ( myShadow ) { - shadowOffset = myShadow.shadowOffset; - shadowRadius = myShadow.shadowBlurRadius; - } CGLayerRef theCachedLayer = self.cachedLayer; CGFloat theCachedScale = self.cachedScale; if ( !theCachedLayer || (theCachedScale != scale) ) { - CGSize layerSize = symbolSize; - CGFloat lineWidth = self.lineStyle.lineWidth; - - layerSize.width += (ABS(shadowOffset.width) + shadowRadius) * CPTFloat(2.0) + lineWidth; - layerSize.width *= scale; - layerSize.width += symbolMargin; - - layerSize.height += (ABS(shadowOffset.height) + shadowRadius) * CPTFloat(2.0) + lineWidth; - layerSize.height *= scale; - layerSize.height += symbolMargin; + CGSize layerSize = [self layerSizeForScale:scale]; self.anchorPoint = CPTPointMake(0.5, 0.5); @@ -508,6 +490,8 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl layerSize.height /= scale; } + CGSize symbolSize = self.size; + CGPoint origin = CPTPointMake( center.x - layerSize.width * CPTFloat(0.5) - symbolSize.width * ( symbolAnchor.x - CPTFloat(0.5) ), center.y - layerSize.height * CPTFloat(0.5) - symbolSize.height * ( symbolAnchor.y - CPTFloat(0.5) ) ); @@ -526,6 +510,33 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl } } +-(CGSize)layerSizeForScale:(CGFloat)scale +{ + const CGFloat symbolMargin = CPTFloat(2.0); + + CGSize shadowOffset = CGSizeZero; + CGFloat shadowRadius = CPTFloat(0.0); + CPTShadow *myShadow = self.shadow; + + if ( myShadow ) { + shadowOffset = myShadow.shadowOffset; + shadowRadius = myShadow.shadowBlurRadius; + } + + CGSize layerSize = self.size; + CGFloat lineWidth = self.lineStyle.lineWidth; + + layerSize.width += (ABS(shadowOffset.width) + shadowRadius) * CPTFloat(2.0) + lineWidth; + layerSize.width *= scale; + layerSize.width += symbolMargin; + + layerSize.height += (ABS(shadowOffset.height) + shadowRadius) * CPTFloat(2.0) + lineWidth; + layerSize.height *= scale; + layerSize.height += symbolMargin; + + return layerSize; +} + /** @brief Draws the plot symbol into the given graphics context centered at the provided point. * @param context The graphics context to draw into. * @param center The center point of the symbol. @@ -760,4 +771,30 @@ -(CGPathRef)newSymbolPath /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + const CGFloat screenScale = 1.0; + + CGSize layerSize = [self layerSizeForScale:screenScale]; + + CGRect rect = CGRectMake(0.0, 0.0, layerSize.width, layerSize.height); + + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + CGPoint symbolAnchor = self.anchorPoint; + + self.anchorPoint = CPTPointMake(0.5, 0.5); + + [self renderAsVectorInContext:context atPoint:CGPointMake( CGRectGetMidX(bounds), CGRectGetMidY(bounds) ) scale:scale]; + + self.anchorPoint = symbolAnchor; + }); +} + +/// @endcond + @end diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index 0f592a795..076f21979 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -182,4 +182,18 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + NSString *lorem = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; + + return [[NSAttributedString alloc] initWithString:lorem attributes:[self attributes]]; +} + +/// @endcond + @end diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index cf4f470e8..a07561907 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -4,6 +4,7 @@ #import "CPTAnimationOperation.h" #import "CPTAnimationPeriod.h" #import "CPTAxisSet.h" +#import "CPTDebugQuickLook.h" #import "CPTExceptions.h" #import "CPTGraph.h" #import "CPTGraphHostingView.h" @@ -1736,4 +1737,79 @@ -(void)animationDidFinish:(CPTAnimationOperation *)operation /// @endcond +#pragma mark - +#pragma mark Debugging + +/// @cond + +-(id)debugQuickLookObject +{ + // Plot space + NSString *plotAreaDesc = [super debugQuickLookObject]; + + // X-range + NSString *xScaleTypeDesc = nil; + + switch ( self.xScaleType ) { + case CPTScaleTypeLinear: + xScaleTypeDesc = @"CPTScaleTypeLinear"; + break; + + case CPTScaleTypeLog: + xScaleTypeDesc = @"CPTScaleTypeLog"; + break; + + case CPTScaleTypeAngular: + xScaleTypeDesc = @"CPTScaleTypeAngular"; + break; + + case CPTScaleTypeDateTime: + xScaleTypeDesc = @"CPTScaleTypeDateTime"; + break; + + case CPTScaleTypeCategory: + xScaleTypeDesc = @"CPTScaleTypeCategory"; + break; + } + + NSString *xRangeDesc = [NSString stringWithFormat:@"xRange:\n%@\nglobalXRange:\n%@\nxScaleType: %@", + [self.xRange debugQuickLookObject], + [self.globalXRange debugQuickLookObject], + xScaleTypeDesc]; + + // Y-range + NSString *yScaleTypeDesc = nil; + + switch ( self.yScaleType ) { + case CPTScaleTypeLinear: + yScaleTypeDesc = @"CPTScaleTypeLinear"; + break; + + case CPTScaleTypeLog: + yScaleTypeDesc = @"CPTScaleTypeLog"; + break; + + case CPTScaleTypeAngular: + yScaleTypeDesc = @"CPTScaleTypeAngular"; + break; + + case CPTScaleTypeDateTime: + yScaleTypeDesc = @"CPTScaleTypeDateTime"; + break; + + case CPTScaleTypeCategory: + yScaleTypeDesc = @"CPTScaleTypeCategory"; + break; + } + + NSString *yRangeDesc = [NSString stringWithFormat:@"yRange:\n%@\nglobalYRange:\n%@\nyScaleType: %@", + [self.yRange debugQuickLookObject], + [self.globalYRange debugQuickLookObject], + yScaleTypeDesc]; + + return [NSString stringWithFormat:@"%@\n\nX:\n%@\n\nY:\n%@", plotAreaDesc, xRangeDesc, yRangeDesc]; +} + +/// @endcond + @end diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h index 39b1be19c..549061976 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h @@ -1,3 +1,6 @@ +#import "CPTDefinitions.h" +#import "CPTPlatformSpecificDefines.h" + /// @file #if __cplusplus @@ -17,6 +20,12 @@ __nonnull CGContextRef CPTGetCurrentContext(void); /// @} +/// @name Debugging +/// @{ +CPTNativeImage *__nonnull CPTQuickLookImage(CGRect rect, __nonnull CPTQuickLookImageBlock renderBlock); + +/// @} + #if __cplusplus } #endif diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m index fef6900e0..182e1c86c 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m @@ -2,6 +2,9 @@ #import "CPTExceptions.h" +#pragma mark - +#pragma mark Context management + void CPTPushCGContext(CGContextRef newContext) { UIGraphicsPushContext(newContext); @@ -16,3 +19,25 @@ CGContextRef CPTGetCurrentContext(void) { return UIGraphicsGetCurrentContext(); } + +#pragma mark - +#pragma mark Debugging + +CPTNativeImage * __nonnull CPTQuickLookImage(CGRect rect, __nonnull CPTQuickLookImageBlock renderBlock) +{ + UIGraphicsBeginImageContextWithOptions(rect.size, YES, 1.0); + CGContextRef context = UIGraphicsGetCurrentContext(); + + CGContextTranslateCTM(context, 0, rect.size.height); + CGContextScaleCTM(context, 1.0, -1.0); + + CGContextSetRGBFillColor(context, 0xf6 / 255.0, 0xf5 / 255.0, 0xf6 / 255.0, 1.0); + CGContextFillRect(context, rect); + + renderBlock(context, 1.0, rect); + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} From ddd153aa89a17eaf7c31f143db4a0ffadefc20fe Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 6 Aug 2015 07:26:25 -0400 Subject: [PATCH 059/429] Fixed a compiler warning in iOS builds. Fixed issue #215. --- framework/iPhoneOnly/CPTPlatformSpecificFunctions.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m index 182e1c86c..5a22b2a23 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m @@ -31,7 +31,7 @@ CGContextRef CPTGetCurrentContext(void) CGContextTranslateCTM(context, 0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0); - CGContextSetRGBFillColor(context, 0xf6 / 255.0, 0xf5 / 255.0, 0xf6 / 255.0, 1.0); + CGContextSetRGBFillColor(context, CPTFloat(0xf6 / 255.0), CPTFloat(0xf5 / 255.0), CPTFloat(0xf6 / 255.0), 1.0); CGContextFillRect(context, rect); renderBlock(context, 1.0, rect); From 8db11e052d3fef27962887ce996c86d4a0064a83 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 10 Aug 2015 20:56:44 -0400 Subject: [PATCH 060/429] Removed the unused CPTGetCurrentContext() function. Fixed issue #216. --- framework/MacOnly/CPTPlatformSpecificFunctions.h | 6 ------ framework/MacOnly/CPTPlatformSpecificFunctions.m | 13 ------------- framework/iPhoneOnly/CPTPlatformSpecificFunctions.h | 6 ------ framework/iPhoneOnly/CPTPlatformSpecificFunctions.m | 5 ----- 4 files changed, 30 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.h b/framework/MacOnly/CPTPlatformSpecificFunctions.h index 958deae06..2f7d1b0cf 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.h +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.h @@ -14,12 +14,6 @@ void CPTPopCGContext(void); /// @} -/// @name Graphics Context -/// @{ -__nonnull CGContextRef CPTGetCurrentContext(void); - -/// @} - /// @name Color Conversion /// @{ __nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor); diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index 28a8e9c81..ad87bf9da 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -58,19 +58,6 @@ void CPTPopCGContext(void) }); } -#pragma mark - -#pragma mark Context - -/** - * @brief Get the default graphics context - **/ -CGContextRef CPTGetCurrentContext(void) -{ - CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; - - return context; -} - #pragma mark - #pragma mark Colors diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h index 549061976..178bba70c 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.h @@ -14,12 +14,6 @@ void CPTPopCGContext(void); /// @} -/// @name Graphics Context -/// @{ -__nonnull CGContextRef CPTGetCurrentContext(void); - -/// @} - /// @name Debugging /// @{ CPTNativeImage *__nonnull CPTQuickLookImage(CGRect rect, __nonnull CPTQuickLookImageBlock renderBlock); diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m index 5a22b2a23..3e7cd3677 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m @@ -15,11 +15,6 @@ void CPTPopCGContext(void) UIGraphicsPopContext(); } -CGContextRef CPTGetCurrentContext(void) -{ - return UIGraphicsGetCurrentContext(); -} - #pragma mark - #pragma mark Debugging From cc05e5975f977ed47eaaf85f575044e46ce90503 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 10 Aug 2015 21:35:04 -0400 Subject: [PATCH 061/429] Updated .xib files in the example apps to the latest file format and deployment target. --- QCPlugin/English.lproj/Settings.xib | 570 +-- .../CPTTestApp_iPadViewController.xib | 313 +- examples/CPTTestApp-iPad/MainWindow.xib | 472 +- examples/CPTTestApp-iPhone/BarChart.xib | 382 +- examples/CPTTestApp-iPhone/MainWindow.xib | 542 +- examples/CPTTestApp-iPhone/PieChart.xib | 380 +- examples/CPTTestApp-iPhone/ScatterPlot.xib | 380 +- examples/CPTTestApp/Resources/AxisDemo.xib | 306 +- examples/CPTTestApp/Resources/CPTTestApp.xib | 4488 +++-------------- .../CPTTestApp/Resources/PlotSymbolDemo.xib | 184 +- .../CPTTestApp/Resources/SelectionDemo.xib | 307 +- .../src/mac/English.lproj/MainMenu.xib | 2208 ++------ examples/DatePlot/DatePlot.xib | 3393 ++----------- .../English.lproj/CPTPlotDocument.xib | 250 +- examples/DropPlot/English.lproj/MainMenu.xib | 4178 ++------------- .../MinorTickLabels/minorTickFormatter.xib | 3655 ++------------ examples/RangePlot/RangePlot.xib | 3559 ++----------- .../Classes/APYahooDataPullerGraph.xib | 6 +- 18 files changed, 3689 insertions(+), 21884 deletions(-) diff --git a/QCPlugin/English.lproj/Settings.xib b/QCPlugin/English.lproj/Settings.xib index a2ce340ec..fa3c596e5 100644 --- a/QCPlugin/English.lproj/Settings.xib +++ b/QCPlugin/English.lproj/Settings.xib @@ -1,490 +1,80 @@ - - - - 1050 - 9J61 - 677 - 949.46 - 353.00 - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - YES - - - - YES - - QCPlugInViewController - - - FirstResponder - - - - 256 - - YES - - - 268 - {{17, 363}, {94, 14}} - - YES - - 68288064 - 272761856 - Number of Plots: - - LucidaGrande - 1.100000e+01 - 3100 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2OQA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{116, 361}, {34, 19}} - - YES - - -1804468671 - 272761856 - - - - - YES - - YES - allowsFloats - formatterBehavior - minimum - negativeFormat - numberStyle - positiveFormat - - - YES - - - - ###0 - - ###0 - - - ###0 - ###0 - - - - - - - - - - NaN - - YES - - YES - - - YES - - - - - - 0 - 0 - YES - NO - 1 - AAAAAAAAAAAAAAAAAAAAAA - - - 3 - YES - YES - YES - - . - , - NO - YES - YES - - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - - - - 268 - {{155, 359}, {15, 22}} - - YES - - 68025888 - 131072 - - - 1.000000e+02 - 1.000000e+00 - YES - YES - - - - - 36 - - YES - - - 256 - - YES - - - 268 - {{15, 14}, {234, 28}} - - YES - - 67239424 - 272760832 - Use the up and down arrows to select the number of plots. - - - - - - - - {{1, 1}, {264, 54}} - - - - {{17, 299}, {266, 56}} - - {0, 0} - - 67239424 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - - 1 - 0 - 0 - NO - - - {300, 400} - - - NSView - - NSResponder - - - NSApplication - - - YES - - - - - YES - - - view - - - - 10 - - - - value: plugIn.numberOfPlots - - - - - - value: plugIn.numberOfPlots - value - plugIn.numberOfPlots - 2 - - - 34 - - - - value: plugIn.numberOfPlots - - - - - - value: plugIn.numberOfPlots - value - plugIn.numberOfPlots - 2 - - - 35 - - - - - YES - - 0 - - YES - - - - - - -2 - - - RmlsZSdzIE93bmVyA - - - -1 - - - First Responder - - - 5 - - - YES - - - - - - - View - - - -3 - - - Application - - - 20 - - - - - 27 - - - YES - - - - - - 28 - - - - - 29 - - - YES - - - - - - 30 - - - YES - - - - - - 31 - - - YES - - - - - - 32 - - - - - 33 - - - - - 38 - - - YES - - - - - - 36 - - - YES - - - - - - 37 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 20.IBPluginDependency - 27.IBPluginDependency - 28.IBPluginDependency - 29.IBPluginDependency - 30.IBPluginDependency - 31.IBPluginDependency - 32.IBPluginDependency - 33.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 5.IBEditorWindowLastContentRect - 5.IBPluginDependency - 5.ImportedFromIB2 - 5.editorWindowContentRectSynchronizationRect - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{430, 228}, {300, 400}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{0, 1145}, {300, 400}} - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 38 - - - 0 - ../CorePlotQCPlugin.xcodeproj - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib b/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib index e2254d8ae..e100cb2b5 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib +++ b/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib @@ -1,263 +1,50 @@ - - - - 1536 - 12C60 - 2843 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1929 - - - YES - IBProxyObject - IBUIToolbar - IBUIView - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 292 - {{20, 55}, {728, 556}} - - - 3 - MQA - - IBIPadFramework - - - - 292 - {{408, 644}, {340, 340}} - - - 3 - MQA - - 2 - - - IBIPadFramework - - - - 292 - {{20, 644}, {340, 340}} - - - 3 - MQA - - - IBIPadFramework - - - - 290 - {768, 44} - - NO - NO - IBIPadFramework - 1 - - YES - - - - {{0, 20}, {768, 1004}} - - - 1 - MCAwIDAAA - darkTextColor - - - 2 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - barChartView - - - - 9 - - - - pieChartView - - - - 10 - - - - scatterPlotView - - - - 12 - - - - - YES - - 0 - - YES - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - YES - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 2.IBPluginDependency - 4.CustomClassName - 4.IBPluginDependency - 5.CustomClassName - 5.IBPluginDependency - 6.CustomClassName - 6.IBPluginDependency - 7.IBPluginDependency - - - YES - CPTTestApp_iPadViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 12 - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 1929 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPad/MainWindow.xib b/examples/CPTTestApp-iPad/MainWindow.xib index 0f4c3fd6a..9e25633e1 100644 --- a/examples/CPTTestApp-iPad/MainWindow.xib +++ b/examples/CPTTestApp-iPad/MainWindow.xib @@ -1,436 +1,36 @@ - - - - 800 - 10D540 - 760 - 1038.29 - 460.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 81 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - {768, 1024} - - - 1 - MSAxIDEAA - - NO - NO - - 2 - - IBIPadFramework - YES - - - IBIPadFramework - - - CPTTestApp_iPadViewController - - IBIPadFramework - - - - - YES - - - viewController - - - - 8 - - - - delegate - - - - 9 - - - - window - - - - 10 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - - - 6 - - - CPTTestApp_iPad App Delegate - - - 7 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 6.CustomClassName - 6.IBPluginDependency - 7.CustomClassName - 7.IBEditorWindowLastContentRect - 7.IBPluginDependency - - - YES - UIApplication - UIResponder - {{200, 57}, {783, 799}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestApp_iPadAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CPTTestApp_iPadViewController - {{512, 351}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 10 - - - - YES - - CPTTestApp_iPadAppDelegate - NSObject - - YES - - YES - viewController - window - - - YES - CPTTestApp_iPadViewController - UIWindow - - - - IBProjectSource - Classes/CPTTestApp_iPadAppDelegate.h - - - - CPTTestApp_iPadViewController - UIViewController - - IBProjectSource - Classes/CPTTestApp_iPadViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSNetServices.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPort.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSStream.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSXMLParser.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIResponder - NSObject - - - - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UITextInput.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPad.xcodeproj - 3 - 81 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPhone/BarChart.xib b/examples/CPTTestApp-iPhone/BarChart.xib index 487a42233..08a16b67e 100644 --- a/examples/CPTTestApp-iPhone/BarChart.xib +++ b/examples/CPTTestApp-iPhone/BarChart.xib @@ -1,356 +1,26 @@ - - - - 768 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 411} - - - - 3 - MQA - - 2 - - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppBarChartController - UIResponder - CPTGraphHostingView - {{568, 433}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 9 - - - - YES - - CPTGraphHostingView - UIView - - IBUserSource - - - - - CPTTestAppBarChartController - UIViewController - - IBProjectSource - Classes/CPTTestAppBarChartController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPhone/MainWindow.xib b/examples/CPTTestApp-iPhone/MainWindow.xib index 779bb337b..eb90ba470 100644 --- a/examples/CPTTestApp-iPhone/MainWindow.xib +++ b/examples/CPTTestApp-iPhone/MainWindow.xib @@ -1,482 +1,60 @@ - - - - 528 - 14B25 - 6254 - 1343.16 - 755.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 6247 - - - IBProxyObject - IBUICustomObject - IBUITabBar - IBUITabBarController - IBUITabBarItem - IBUIViewController - IBUIWindow - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - IBCocoaTouchFramework - - - - 1316 - - {{0, 20}, {320, 480}} - - - - - 1 - MSAxIDEAA - - NO - NO - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBCocoaTouchFramework - YES - YES - - - - - 1 - 1 - - - IBUIScreenMetrics - IBCocoaTouchFramework - iPhone 4-inch - - YES - - - - - - {320, 568} - {568, 320} - - - 2 - - IBCocoaTouchFramework - NO - - Pie Chart - - Pie Chart - - NSImage - 62-contrast.png - - IBCocoaTouchFramework - - - - - PieChart - IBCocoaTouchFramework - NO - - - - Scatter Plot - - Scatter Plot - - NSImage - 16-line-chart.png - - IBCocoaTouchFramework - - - ScatterPlot - IBCocoaTouchFramework - NO - - - - Bar Chart - - NSImage - 17-bar-chart.png - - IBCocoaTouchFramework - - - BarChart - IBCocoaTouchFramework - NO - - - - - - 266 - {{0, 519}, {320, 49}} - - - - - 3 - MCAwAA - - NO - IBCocoaTouchFramework - - - - - - - - - - - - delegate - - - - 99 - - - - tabBarController - - - - 127 - - - - window - - - - 128 - - - - - - 0 - - - - - - 2 - - - - - - -1 - - - File's Owner - - - 3 - - - - - 106 - - - - - - - - - - - 107 - - - - - 108 - - - - - - - - 109 - - - - - - - - 110 - - - - - 111 - - - - - -2 - - - - - 125 - - - - - - - - 126 - - - - - - - UIApplication - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - CPTTestApp_iPhone - - target - ScatterPlotController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - target - BarChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - target - PieChartController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - CPTTestApp_iPhone - - target - iPhoneAppDelegate - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 128 - - - - - BarChartController - YES - UIViewController - - IBProjectSource - CPTTestApp-iPhone/Classes/BarChartController.swift - - - - PieChartController - YES - UIViewController - - IBProjectSource - CPTTestApp-iPhone/Classes/PieChartController.swift - - - - ScatterPlotController - YES - UIViewController - - IBProjectSource - CPTTestApp-iPhone/Classes/ScatterPlotController.swift - - - - iPhoneAppDelegate - YES - NSObject - - UITabBarController - UIWindow - - - - tabBarController - UITabBarController - - - window - UIWindow - - - - IBProjectSource - CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift - - - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIGestureRecognizer - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIGestureRecognizer.h - - - - UIResponder - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITabBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITabBar.h - - - - UITabBarController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UITabBarItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UITabBarItem.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - - 0 - IBCocoaTouchFramework - NO - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {30, 24} - {29, 24} - {20, 20} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPhone/PieChart.xib b/examples/CPTTestApp-iPhone/PieChart.xib index 757532e4b..2489ea51a 100644 --- a/examples/CPTTestApp-iPhone/PieChart.xib +++ b/examples/CPTTestApp-iPhone/PieChart.xib @@ -1,354 +1,26 @@ - - - - 768 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 411} - - 3 - MQA - - 2 - - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppPieChartController - UIResponder - CPTGraphHostingView - {{158, 204}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 9 - - - - YES - - CPTGraphHostingView - UIView - - IBUserSource - - - - - CPTTestAppPieChartController - UIViewController - - IBProjectSource - Classes/CPTTestAppPieChartController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPhone/ScatterPlot.xib b/examples/CPTTestApp-iPhone/ScatterPlot.xib index df5411823..7e1ed2991 100644 --- a/examples/CPTTestApp-iPhone/ScatterPlot.xib +++ b/examples/CPTTestApp-iPhone/ScatterPlot.xib @@ -1,355 +1,25 @@ - - - - 528 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {320, 460} - - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - -1 - - - File's Owner - - - -2 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - - - YES - CPTTestAppScatterPlotController - UIResponder - CPTGraphHostingView - {{430, 168}, {320, 480}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 4 - - - - YES - - CPTGraphHostingView - UIView - - IBUserSource - - - - - CPTTestAppScatterPlotController - UIViewController - - IBProjectSource - Classes/CPTTestAppScatterPlotController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - CPTTestApp-iPhone.xcodeproj - 3 - 123 - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp/Resources/AxisDemo.xib b/examples/CPTTestApp/Resources/AxisDemo.xib index e83ef3f9f..943805a61 100644 --- a/examples/CPTTestApp/Resources/AxisDemo.xib +++ b/examples/CPTTestApp/Resources/AxisDemo.xib @@ -1,275 +1,31 @@ - - - - 1060 - 12C60 - 2844 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2844 - - - NSCustomObject - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - Controller - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{112, 543}, {777, 567}} - 1677722624 - Axis Demo - NSWindow - - - - - 274 - - {777, 567} - - - - {{0, 0}, {1920, 1178}} - {10000000000000, 10000000000000} - YES - - - AxisDemoController - - - - - - - axisDemoWindow - - - - 8 - - - - hostView - - - - 10 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - - - - - - 2 - - - Axis Demo Controller - - - 3 - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{19, 188}, {777, 567}} - - com.apple.InterfaceBuilder.CocoaPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 10 - - - - - AxisDemoController - NSObject - - hostView - CPTGraphHostingView - - - hostView - - hostView - CPTGraphHostingView - - - - IBProjectSource - ./Classes/AxisDemoController.h - - - - CPTGraphHostingView - NSView - - IBProjectSource - ./Classes/CPTGraphHostingView.h - - - - Controller - NSArrayController - - id - id - id - id - id - id - id - id - id - id - id - - - - axisDemo: - id - - - explodeLayers: - id - - - exportToPDF: - id - - - exportToPNG: - id - - - insertData: - id - - - plotSymbolDemo: - id - - - printDocument: - id - - - reassembleLayers: - id - - - reloadDataSourcePlot: - id - - - removeData: - id - - - selectionDemo: - id - - - - NSWindow - CPTGraphHostingView - NSWindow - NSWindow - - - - axisDemoWindow - NSWindow - - - hostView - CPTGraphHostingView - - - plotSymbolWindow - NSWindow - - - selectionDemoWindow - NSWindow - - - - IBProjectSource - ./Classes/Controller.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp/Resources/CPTTestApp.xib b/examples/CPTTestApp/Resources/CPTTestApp.xib index 7377c4b81..8bec09504 100644 --- a/examples/CPTTestApp/Resources/CPTTestApp.xib +++ b/examples/CPTTestApp/Resources/CPTTestApp.xib @@ -1,3733 +1,755 @@ - - - - 1060 - 12C60 - 2844 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2844 - - - NSArrayController - NSButton - NSButtonCell - NSCustomObject - NSCustomView - NSMenu - NSMenuItem - NSNumberFormatter - NSScrollView - NSScroller - NSSlider - NSSliderCell - NSSplitView - NSTableColumn - NSTableHeaderView - NSTableView - NSTextFieldCell - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AMainMenu - - - - CPTTestApp - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - CPTTestApp - - - - About CPTTestApp - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Services - - 2147483647 - - - submenuAction: - - Services - - _NSServicesMenu - - - - - YES - YES - - - 2147483647 - - - - - - Hide CPTTestApp - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit CPTTestApp - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 2147483647 - - - submenuAction: - - File - - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 2147483647 - - - submenuAction: - - Open Recent - - - - Clear Menu - - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Export to PDF... - - 2147483647 - - - - - - Export to PNG... - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 2147483647 - - - submenuAction: - - Edit - - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Find - - 2147483647 - - - submenuAction: - - Find - - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 2147483647 - - - submenuAction: - - Spelling and Grammar - - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 2147483647 - - - - - - Check Grammar With Spelling - - 2147483647 - - - - - - - - - Substitutions - - 2147483647 - - - submenuAction: - - Substitutions - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 2147483647 - - - submenuAction: - - Speech - - - - Start Speaking - - 2147483647 - - - - - - Stop Speaking - - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - - - Font - - 2147483647 - - - submenuAction: - - Font - - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 2147483647 - - - submenuAction: - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Explode Layers - e - 1572864 - 2147483647 - - - - - - Reassemble Layers - r - 1572864 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Plot Symbols Demo - - 2147483647 - - - - - - Axes Only Demo - - 2147483647 - - - - - - Point Selection Demo - - 2147483647 - - - - - - - - - Window - - 2147483647 - - - submenuAction: - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bring All to Front - - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - - - CPTTestApp Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 271 - 2 - {{68, 397}, {944, 525}} - 603979776 - Window - NSWindow - - - {450, 250} - - - 256 - - - - 292 - {{4, 4}, {30, 27}} - - YES - - -2080374784 - 134217728 - - - LucidaGrande - 13 - 1044 - - - -2033434624 - 160 - - NSImage - NSAddTemplate - - - - 400 - 75 - - NO - - - - 292 - {{40, 4}, {51, 27}} - - YES - - -2080374784 - 134217728 - Reload - - - -2033434624 - 160 - - - 400 - 75 - - NO - - - - 274 - - - - 4370 - - - - 2304 - - - - 4370 - {343, 474} - - YES - NO - YES - - - 256 - {343, 17} - - - - - - -2147483392 - {{-26, 0}, {16, 17}} - - - - - 101 - 40 - 1000 - - 75497536 - 2048 - - - LucidaGrande - 11 - 3100 - - - 3 - MC4zMzMzMzI5OQA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337641536 - -2080372736 - Text Cell - - - - - - - - - -∞ - - - #,##0.00 - +∞ - - #,##0.00 - #,##0.00 - - - - - - - - NaN - - - - 0 - 0 - YES - NO - 1 - AAAAAAAAAAAAAAAAAAAAAA - - - - 3 - YES - YES - YES - - . - , - YES - NO - YES - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - - - 3 - YES - YES - - - - 93 - 40 - 1000 - - 75497536 - 2048 - - - - - - - 337641536 - -2080372736 - Text Cell - - - - - - - - #,##0.000 - - #,##0.000 - #,##0.000 - - - - - - NaN - - - - - - 3 - YES - YES - YES - - . - , - YES - NO - YES - - - - - - 3 - YES - YES - - - - 3 - 2 - - 3 - MQA - - - 6 - System - gridColor - - 3 - MC41AA - - - 17 - -702545920 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 17}, {343, 474}} - - - - - 4 - - - - -2147483392 - {{276, 17}, {15, 238}} - - NO - - _doScroller: - 37 - 0.19473679999999999 - - - - -2147483392 - {{-100, -100}, {275, 15}} - - NO - 1 - - _doScroller: - 0.0029154519999999998 - 0.57142859999999995 - - - - 2304 - - - - {{1, 0}, {343, 17}} - - - - - 4 - - - - {345, 492} - - - 133650 - - - - - QSAAAEEgAABBmAAAQZgAAA - 0.25 - 4 - 1 - - - - 274 - - - - 274 - {559, 492} - - CPTGraphHostingView - - - {{354, 0}, {559, 492}} - - NSView - - - {{-1, 34}, {913, 492}} - - YES - - - - 289 - {{818, 7}, {96, 21}} - - YES - - -2080112384 - 0 - - - 1 - -1 - 0.0 - 0.0 - 0 - 1 - NO - NO - - NO - - - - 289 - {{917, 31}, {21, 96}} - - YES - - -2080112384 - 0 - - - 1 - -1 - 1 - 0.0 - 0 - 0 - NO - YES - - NO - - - - 289 - {{780, 0}, {32, 34}} - - YES - - -2080112384 - 0 - - - 6.2831853071795862 - 0.0 - 0.0 - 0.0 - 12 - 1 - NO - NO - 1 - - NO - - - - 292 - {{97, 4}, {99, 27}} - - YES - - -2080374784 - 134217728 - Insert Record - - - -2033434624 - 160 - - - 400 - 75 - - NO - - - - 292 - {{202, 3}, {105, 27}} - - YES - - -2080374784 - 134217728 - Delete Record - - - -2033434624 - 160 - - - 400 - 75 - - NO - - - {944, 525} - - {{0, 0}, {1920, 1178}} - {450, 272} - {10000000000000, 10000000000000} - YES - - - - x - y - - YES - - YES - YES - YES - YES - YES - - - - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - raiseBaseline: - - - - 423 - - - - lowerBaseline: - - - - 424 - - - - copyFont: - - - - 425 - - - - subscript: - - - - 426 - - - - superscript: - - - - 427 - - - - tightenKerning: - - - - 428 - - - - underline: - - - - 429 - - - - orderFrontColorPanel: - - - - 430 - - - - useAllLigatures: - - - - 431 - - - - loosenKerning: - - - - 432 - - - - pasteFont: - - - - 433 - - - - unscript: - - - - 434 - - - - useStandardKerning: - - - - 435 - - - - useStandardLigatures: - - - - 436 - - - - turnOffLigatures: - - - - 437 - - - - turnOffKerning: - - - - 438 - - - - alignLeft: - - - - 439 - - - - alignJustified: - - - - 440 - - - - copyRuler: - - - - 441 - - - - alignCenter: - - - - 442 - - - - toggleRuler: - - - - 443 - - - - alignRight: - - - - 444 - - - - pasteRuler: - - - - 445 - - - - addFontTrait: - - - - 418 - - - - addFontTrait: - - - - 419 - - - - modifyFont: - - - - 420 - - - - orderFrontFontPanel: - - - - 421 - - - - modifyFont: - - - - 422 - - - - add: - - - - 484 - - - - reloadDataSourcePlot: - - - - 498 - - - - exportToPDF: - - - - 509 - - - - exportToPNG: - - - - 511 - - - - explodeLayers: - - - - 515 - - - - reassembleLayers: - - - - 516 - - - - hostView - - - - 518 - - - - plotSymbolDemo: - - - - 530 - - - - axisDemo: - - - - 532 - - - - selectionDemo: - - - - 540 - - - - removeData: - - - - 545 - - - - insertData: - - - - 546 - - - - printDocument: - - - - 552 - - - - value: arrangedObjects.x - - - - - - value: arrangedObjects.x - value - arrangedObjects.x - - NSValueTransformerName - CPTDecimalNumberValueTransformer - - 2 - - - 500 - - - - value: arrangedObjects.y - - - - - - value: arrangedObjects.y - value - arrangedObjects.y - - NSValueTransformerName - CPTDecimalNumberValueTransformer - - 2 - - - 499 - - - - value: xShift - - - - - - value: xShift - value - xShift - 2 - - - 525 - - - - value: yShift - - - - - - value: yShift - value - yShift - 2 - - - 526 - - - - value: labelRotation - - - - - - value: labelRotation - value - labelRotation - 2 - - - 536 - - - - enabled: isEditable - - - - - - enabled: isEditable - enabled - isEditable - 2 - - - 550 - - - - enabled: isEditable - - - - - - enabled: isEditable - enabled - isEditable - 2 - - - 551 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - MainMenu - - - 19 - - - - - - - - 56 - - - - - - - - 103 - - - - - - 1 - - - 217 - - - - - - - - 83 - - - - - - - - 81 - - - - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - - - - - - 126 - - - - - 205 - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - - - - 2 - - - 111 - - - - - 57 - - - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - 373 - - - - - - - - 374 - - - - - - - - - 375 - - - - - - - - 376 - - - - - - - - 377 - - - - - - - - - - - - - - - 378 - - - - - 379 - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - - - - - - - - - - - - - - - - - - - - - 387 - - - - - 388 - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - - - - 396 - - - - - - - - 397 - - - - - - - - 398 - - - - - 399 - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - - - - - - - - 404 - - - - - 405 - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - - - - - - 410 - - - - - 411 - - - - - 412 - - - - - 413 - - - - - - - - - - - 414 - - - - - 415 - - - - - 416 - - - - - 417 - - - - - 446 - - - - - - - - 447 - - - - - - - - - - - - - - - 456 - - - XY Values Controller - - - 481 - - - - - - - - 482 - - - - - 490 - - - - - - - - - 460 - - - - - - - - - - - 464 - - - - - 462 - - - - - 461 - - - - - 463 - - - - - - - - - 466 - - - - - - - - 465 - - - - - - - - 468 - - - - - - - - 467 - - - - - - - - 493 - - - - - 496 - - - - - - - - 497 - - - - - 506 - - - 10 - - - 507 - - - 2 - - - 510 - - - 10 - - - 512 - - - - - 513 - - - - - 514 - - - - - 485 - - - - - - - - 517 - - - - - 519 - - - - - - - - 520 - - - - - 523 - - - - - - - - 524 - - - - - 527 - - - - - 528 - - - - - 529 - - - - - 533 - - - - - - - - 534 - - - - - 538 - - - - - 539 - - - - - 541 - - - - - - - - 542 - - - - - 543 - - - - - - - - 544 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{14, 274}, {944, 525}} - - com.apple.InterfaceBuilder.CocoaPlugin - Controller - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 552 - - - - - FirstResponder - - exportToPDF: - id - - - exportToPDF: - - exportToPDF: - id - - - - IBUserSource - - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {8, 8} - {11, 11} - {10, 3} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CPTDecimalNumberValueTransformer + + + + + + + + + + + + + + + + + + + + + + + + CPTDecimalNumberValueTransformer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + y + + + + + + + + + + diff --git a/examples/CPTTestApp/Resources/PlotSymbolDemo.xib b/examples/CPTTestApp/Resources/PlotSymbolDemo.xib index dcac2b389..bffdf5c16 100644 --- a/examples/CPTTestApp/Resources/PlotSymbolDemo.xib +++ b/examples/CPTTestApp/Resources/PlotSymbolDemo.xib @@ -1,153 +1,31 @@ - - - - 1060 - 12C60 - 2844 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2844 - - - NSCustomObject - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - Controller - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{112, 543}, {777, 567}} - 1677722624 - CPTPlotSymbol Demo - NSWindow - - - - - 274 - - {777, 567} - - - - {{0, 0}, {1920, 1178}} - {10000000000000, 10000000000000} - YES - - - CPTPlotSymbolTestController - - - - - - - plotSymbolWindow - - - - 7 - - - - hostView - - - - 8 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - - - - - - 2 - - - - - 3 - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{19, 188}, {777, 567}} - - com.apple.InterfaceBuilder.CocoaPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 8 - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp/Resources/SelectionDemo.xib b/examples/CPTTestApp/Resources/SelectionDemo.xib index 0a632e9bb..9dee883b9 100644 --- a/examples/CPTTestApp/Resources/SelectionDemo.xib +++ b/examples/CPTTestApp/Resources/SelectionDemo.xib @@ -1,276 +1,31 @@ - - - - 1060 - 12C60 - 2844 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2844 - - - NSCustomObject - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - Controller - - - FirstResponder - - - NSApplication - - - 15 - 2 - {{112, 543}, {777, 567}} - 1677722624 - Point Selection Demo - NSWindow - - - - - 274 - - {777, 567} - - - - - {{0, 0}, {1920, 1178}} - {10000000000000, 10000000000000} - YES - - - SelectionDemoController - - - - - - - selectionDemoWindow - - - - 8 - - - - hostView - - - - 9 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - - - - - - 2 - - - Point Selection Demo Controller - - - 3 - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{19, 188}, {777, 567}} - - com.apple.InterfaceBuilder.CocoaPlugin - CPTGraphHostingView - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 9 - - - - - CPTGraphHostingView - NSView - - IBProjectSource - ./Classes/CPTGraphHostingView.h - - - - Controller - NSArrayController - - id - id - id - id - id - id - id - id - id - id - id - - - - axisDemo: - id - - - explodeLayers: - id - - - exportToPDF: - id - - - exportToPNG: - id - - - insertData: - id - - - plotSymbolDemo: - id - - - printDocument: - id - - - reassembleLayers: - id - - - reloadDataSourcePlot: - id - - - removeData: - id - - - selectionDemo: - id - - - - NSWindow - CPTGraphHostingView - NSWindow - NSWindow - - - - axisDemoWindow - NSWindow - - - hostView - CPTGraphHostingView - - - plotSymbolWindow - NSWindow - - - selectionDemoWindow - NSWindow - - - - IBProjectSource - ./Classes/Controller.h - - - - SelectionDemoController - NSObject - - hostView - CPTGraphHostingView - - - hostView - - hostView - CPTGraphHostingView - - - - IBProjectSource - ./Classes/SelectionDemoController.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib b/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib index 564eda80f..07afc80f5 100644 --- a/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib +++ b/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib @@ -1,1908 +1,300 @@ - - - - 1060 - 11B26 - 1617 - 1138 - 566.00 - - YES - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.imagekit.ibplugin - - - YES - 1617 - 518 - - - - YES - NSToolbar - NSToolbarFlexibleSpaceItem - NSSplitView - NSMenuItem - NSMenu - NSScrollView - NSScroller - NSToolbarSpaceItem - NSPopUpButton - NSToolbarSeparatorItem - IKImageBrowserView - NSCustomObject - NSCustomView - NSView - NSWindowTemplate - NSPopUpButtonCell - NSToolbarItem - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.imagekit.ibplugin - - - YES - - YES - - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - Plot Gallery - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - Plot Gallery - - YES - - - About Plot Gallery - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Plot Gallery - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit Plot Gallery - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - Close - w - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - Plot Gallery Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 15 - 2 - {{344, 741}, {800, 600}} - 1954021376 - Plot Gallery-Mac - NSWindow - - - 362C0A69-3C26-43DD-93B4-5616D6FA9979 - - - YES - YES - YES - NO - 1 - 1 - - YES - - YES - 87A1C903-CE7F-4572-AA57-3BA4CA3E30FB - NSToolbarCustomizeToolbarItem - NSToolbarFlexibleSpaceItem - NSToolbarSeparatorItem - NSToolbarSpaceItem - - - YES - - - 87A1C903-CE7F-4572-AA57-3BA4CA3E30FB - - Theme - Theme - - - - 268 - {{0, 14}, {100, 25}} - YES - - -2076049856 - 2048 - - LucidaGrande - 13 - 1044 - - - -2038284033 - 163 - - - 400 - 75 - - YES - - OtherViews - - YES - - - - -1 - 1 - YES - YES - 2 - - - - - - {100, 25} - {150, 25} - YES - YES - 0 - YES - 0 - - - NSToolbarCustomizeToolbarItem - Customize - Customize - Customize Toolbar - - - NSImage - NSToolbarCustomizeToolbarItemImage - - - runToolbarCustomizationPalette: - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - NSToolbarFlexibleSpaceItem - - Flexible Space - - - - - - {1, 5} - {20000, 32} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - - - - - NSToolbarSeparatorItem - - Separator - - - - - - {12, 5} - {12, 1000} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - - - - - NSToolbarSpaceItem - - Space - - - - - - {32, 5} - {32, 32} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - - - - - - - YES - - - - - - - - YES - - - - - - - - - - 256 - - YES - - - 274 - - YES - - - 256 - - YES - - - 274 - - YES - - - 2304 - - YES - - - 18 - - YES - - YES - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - Apple URL pasteboard type - NSFilenamesPboardType - NSTypedFilenamesPboardType:'.SGI' - NSTypedFilenamesPboardType:'8BPS' - NSTypedFilenamesPboardType:'BMP ' - NSTypedFilenamesPboardType:'BMPf' - NSTypedFilenamesPboardType:'EPSF' - NSTypedFilenamesPboardType:'FPix' - NSTypedFilenamesPboardType:'GIFf' - NSTypedFilenamesPboardType:'ICO ' - NSTypedFilenamesPboardType:'JPEG' - NSTypedFilenamesPboardType:'PDF ' - NSTypedFilenamesPboardType:'PICT' - NSTypedFilenamesPboardType:'PNGf' - NSTypedFilenamesPboardType:'PNTG' - NSTypedFilenamesPboardType:'TIFF' - NSTypedFilenamesPboardType:'TPIC' - NSTypedFilenamesPboardType:'icns' - NSTypedFilenamesPboardType:'jp2 ' - NSTypedFilenamesPboardType:'qtif' - NSTypedFilenamesPboardType:3FR - NSTypedFilenamesPboardType:3fr - NSTypedFilenamesPboardType:ARW - NSTypedFilenamesPboardType:BMP - NSTypedFilenamesPboardType:CR2 - NSTypedFilenamesPboardType:CRW - NSTypedFilenamesPboardType:CUR - NSTypedFilenamesPboardType:DCR - NSTypedFilenamesPboardType:DNG - NSTypedFilenamesPboardType:EFX - NSTypedFilenamesPboardType:EPI - NSTypedFilenamesPboardType:EPS - NSTypedFilenamesPboardType:EPSF - NSTypedFilenamesPboardType:EPSI - NSTypedFilenamesPboardType:ERF - NSTypedFilenamesPboardType:EXR - NSTypedFilenamesPboardType:FAX - NSTypedFilenamesPboardType:FFF - NSTypedFilenamesPboardType:FPIX - NSTypedFilenamesPboardType:FPX - NSTypedFilenamesPboardType:G3 - NSTypedFilenamesPboardType:GIF - NSTypedFilenamesPboardType:HDR - NSTypedFilenamesPboardType:ICNS - NSTypedFilenamesPboardType:ICO - NSTypedFilenamesPboardType:JFAX - NSTypedFilenamesPboardType:JFX - NSTypedFilenamesPboardType:JP2 - NSTypedFilenamesPboardType:JPE - NSTypedFilenamesPboardType:JPEG - NSTypedFilenamesPboardType:JPF - NSTypedFilenamesPboardType:JPG - NSTypedFilenamesPboardType:MAC - NSTypedFilenamesPboardType:MOS - NSTypedFilenamesPboardType:MPO - NSTypedFilenamesPboardType:MRW - NSTypedFilenamesPboardType:NEF - NSTypedFilenamesPboardType:NRW - NSTypedFilenamesPboardType:ORF - NSTypedFilenamesPboardType:PCT - NSTypedFilenamesPboardType:PDF - NSTypedFilenamesPboardType:PEF - NSTypedFilenamesPboardType:PIC - NSTypedFilenamesPboardType:PICT - NSTypedFilenamesPboardType:PNG - NSTypedFilenamesPboardType:PNT - NSTypedFilenamesPboardType:PNTG - NSTypedFilenamesPboardType:PS - NSTypedFilenamesPboardType:PSD - NSTypedFilenamesPboardType:QTI - NSTypedFilenamesPboardType:QTIF - NSTypedFilenamesPboardType:RAF - NSTypedFilenamesPboardType:RAW - NSTypedFilenamesPboardType:RGB - NSTypedFilenamesPboardType:RW2 - NSTypedFilenamesPboardType:RWL - NSTypedFilenamesPboardType:SGI - NSTypedFilenamesPboardType:SR2 - NSTypedFilenamesPboardType:SRF - NSTypedFilenamesPboardType:SRW - NSTypedFilenamesPboardType:TARGA - NSTypedFilenamesPboardType:TGA - NSTypedFilenamesPboardType:TIF - NSTypedFilenamesPboardType:TIFF - NSTypedFilenamesPboardType:XBM - NSTypedFilenamesPboardType:arw - NSTypedFilenamesPboardType:bmp - NSTypedFilenamesPboardType:cr2 - NSTypedFilenamesPboardType:crw - NSTypedFilenamesPboardType:cur - NSTypedFilenamesPboardType:dcr - NSTypedFilenamesPboardType:dng - NSTypedFilenamesPboardType:efx - NSTypedFilenamesPboardType:epi - NSTypedFilenamesPboardType:eps - NSTypedFilenamesPboardType:epsf - NSTypedFilenamesPboardType:epsi - NSTypedFilenamesPboardType:erf - NSTypedFilenamesPboardType:exr - NSTypedFilenamesPboardType:fax - NSTypedFilenamesPboardType:fff - NSTypedFilenamesPboardType:fpix - NSTypedFilenamesPboardType:fpx - NSTypedFilenamesPboardType:g3 - NSTypedFilenamesPboardType:gif - NSTypedFilenamesPboardType:hdr - NSTypedFilenamesPboardType:icns - NSTypedFilenamesPboardType:ico - NSTypedFilenamesPboardType:jfax - NSTypedFilenamesPboardType:jfx - NSTypedFilenamesPboardType:jp2 - NSTypedFilenamesPboardType:jpe - NSTypedFilenamesPboardType:jpeg - NSTypedFilenamesPboardType:jpf - NSTypedFilenamesPboardType:jpg - NSTypedFilenamesPboardType:mac - NSTypedFilenamesPboardType:mos - NSTypedFilenamesPboardType:mpo - NSTypedFilenamesPboardType:mrw - NSTypedFilenamesPboardType:nef - NSTypedFilenamesPboardType:nrw - NSTypedFilenamesPboardType:orf - NSTypedFilenamesPboardType:pct - NSTypedFilenamesPboardType:pdf - NSTypedFilenamesPboardType:pef - NSTypedFilenamesPboardType:pic - NSTypedFilenamesPboardType:pict - NSTypedFilenamesPboardType:png - NSTypedFilenamesPboardType:pnt - NSTypedFilenamesPboardType:pntg - NSTypedFilenamesPboardType:ps - NSTypedFilenamesPboardType:psd - NSTypedFilenamesPboardType:qti - NSTypedFilenamesPboardType:qtif - NSTypedFilenamesPboardType:raf - NSTypedFilenamesPboardType:raw - NSTypedFilenamesPboardType:rgb - NSTypedFilenamesPboardType:rw2 - NSTypedFilenamesPboardType:rwl - NSTypedFilenamesPboardType:sgi - NSTypedFilenamesPboardType:sr2 - NSTypedFilenamesPboardType:srf - NSTypedFilenamesPboardType:srw - NSTypedFilenamesPboardType:targa - NSTypedFilenamesPboardType:tga - NSTypedFilenamesPboardType:tif - NSTypedFilenamesPboardType:tiff - NSTypedFilenamesPboardType:xbm - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - - {225, 598} - - - YES - NO - NO - NO - NO - YES - NO - NO - NO - YES - 100 - 100 - - - - - {{1, 1}, {225, 598}} - - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - 6 - - - - -2147483392 - {{126, 1}, {15, 184}} - - - - _doScroller: - 1 - 0.96363627910614014 - - - - -2147483392 - {{-100, -100}, {125, 15}} - - - 1 - - _doScroller: - 0.50602412223815918 - - - {227, 600} - - - 133650 - - - - QSAAAEEgAABCzQAAQvAAAA - - - {227, 600} - - - NSView - - - - 274 - {{237, 0}, {563, 600}} - - - PlotView - - - {800, 600} - - - YES - 3 - - - {800, 600} - - - - {{0, 0}, {2560, 1578}} - {10000000000000, 10000000000000} - PlotGallery - YES - - - Plot_Gallery_MacAppDelegate - - - NSFontManager - - - PlotGalleryController - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - paste: - - - - 226 - - - - cut: - - - - 228 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - terminate: - - - - 449 - - - - pasteAsPlainText: - - - - 486 - - - - showHelp: - - - - 493 - - - - delegate - - - - 495 - - - - window - - - - 532 - - - - imageBrowser - - - - 564 - - - - scrollView - - - - 565 - - - - splitView - - - - 566 - - - - themePopUpButton - - - - 567 - - - - hostingView - - - - 568 - - - - themeSelectionDidChange: - - - - 569 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - 78 - - - - - 77 - - - - - 73 - - - - - 205 - - - YES - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 371 - - - YES - - - - - - - 372 - - - YES - - - - - - 420 - - - - - 485 - - - - - 490 - - - YES - - - - - - 491 - - - YES - - - - - - 492 - - - - - 494 - - - - - 533 - - - YES - - - - - - - - - - 536 - - - - - 538 - - - - - 539 - - - - - 540 - - - - - 541 - - - YES - - - - - - - 542 - - - YES - - - - - - 543 - - - YES - - - - - 545 - - - YES - - - - - - - - 546 - - - - - 547 - - - - - 544 - - - - - 562 - - - YES - - - - - - 556 - - - YES - - - - - - 557 - - - YES - - - - - - 558 - - - YES - - - - - 563 - - - - - 74 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency - 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency - 149.IBPluginDependency - 150.IBPluginDependency - 19.IBPluginDependency - 197.IBPluginDependency - 198.IBPluginDependency - 199.IBPluginDependency - 202.IBPluginDependency - 203.IBPluginDependency - 205.IBPluginDependency - 206.IBPluginDependency - 207.IBPluginDependency - 215.IBPluginDependency - 217.IBPluginDependency - 23.IBPluginDependency - 236.IBPluginDependency - 239.IBPluginDependency - 24.IBPluginDependency - 29.IBPluginDependency - 295.IBPluginDependency - 296.IBPluginDependency - 297.IBPluginDependency - 298.IBPluginDependency - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 372.IBPluginDependency - 420.IBPluginDependency - 485.IBPluginDependency - 490.IBPluginDependency - 491.IBPluginDependency - 492.IBPluginDependency - 494.IBPluginDependency - 5.IBPluginDependency - 533.IBPluginDependency - 536.IBPluginDependency - 538.IBPluginDependency - 539.IBPluginDependency - 540.IBPluginDependency - 541.IBPluginDependency - 542.IBPluginDependency - 543.IBPluginDependency - 544.IBPluginDependency - 545.IBPluginDependency - 546.IBPluginDependency - 547.IBPluginDependency - 556.IBPluginDependency - 557.IBPluginDependency - 558.IBPluginDependency - 56.IBPluginDependency - 562.IBPluginDependency - 563.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 73.IBPluginDependency - 74.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 81.IBPluginDependency - 83.IBPluginDependency - 92.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{426, 688}, {800, 600}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.imagekit.ibplugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 569 - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - NSToolbarCustomizeToolbarItemImage - - - YES - {9, 8} - {7, 2} - {32, 32} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/DatePlot/DatePlot.xib b/examples/DatePlot/DatePlot.xib index 66db5c0f0..f51bd76b4 100644 --- a/examples/DatePlot/DatePlot.xib +++ b/examples/DatePlot/DatePlot.xib @@ -1,2840 +1,553 @@ - - - - 1050 - 13F34 - 6245 - 1265.21 - 698.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 6245 - - - NSCustomObject - NSCustomView - NSMenu - NSMenuItem - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AMainMenu - - - - DatePlot - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - - DatePlot - - - - About DatePlot - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Services - - 2147483647 - - - submenuAction: - - - Services - - _NSServicesMenu - - - - - YES - YES - - - 2147483647 - - - - - - Hide DatePlot - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit DatePlot - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 2147483647 - - - submenuAction: - - - File - - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 2147483647 - - - submenuAction: - - - Open Recent - - - - Clear Menu - - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Export to PDF... - - 2147483647 - - - - - - Export to PNG... - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 2147483647 - - - submenuAction: - - - Edit - - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Find - - 2147483647 - - - submenuAction: - - - Find - - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 2147483647 - - - submenuAction: - - - Spelling and Grammar - - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 2147483647 - - - - - - Check Grammar With Spelling - - 2147483647 - - - - - - - - - Substitutions - - 2147483647 - - - submenuAction: - - - Substitutions - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 2147483647 - - - submenuAction: - - - Speech - - - - Start Speaking - - 2147483647 - - - - - - Stop Speaking - - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - - Format - - - - Font - - 2147483647 - - - submenuAction: - - - Font - - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - - Kern - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - - Ligature - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - - Baseline - - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - - Text - - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 2147483647 - - - submenuAction: - - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Explode Layers - e - 1572864 - 2147483647 - - - - - - Reassemble Layers - r - 1572864 - 2147483647 - - - - - - - - - Window - - 2147483647 - - - submenuAction: - - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bring All to Front - - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - - Help - - - - DatePlot Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 13 - 2 - {{68, 396}, {912, 526}} - 603979776 - Window - NSWindow - - - {450, 250} - - - 256 - - - - 274 - {912, 526} - - - - CPTGraphHostingView - - - {912, 526} - - - - - {{0, 0}, {1920, 1178}} - {450, 272} - {10000000000000, 10000000000000} - YES - - - _TtC8DatePlot14DateController - - - - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - raiseBaseline: - - - - 423 - - - - lowerBaseline: - - - - 424 - - - - copyFont: - - - - 425 - - - - subscript: - - - - 426 - - - - superscript: - - - - 427 - - - - tightenKerning: - - - - 428 - - - - underline: - - - - 429 - - - - orderFrontColorPanel: - - - - 430 - - - - useAllLigatures: - - - - 431 - - - - loosenKerning: - - - - 432 - - - - pasteFont: - - - - 433 - - - - unscript: - - - - 434 - - - - useStandardKerning: - - - - 435 - - - - useStandardLigatures: - - - - 436 - - - - turnOffLigatures: - - - - 437 - - - - turnOffKerning: - - - - 438 - - - - alignLeft: - - - - 439 - - - - alignJustified: - - - - 440 - - - - copyRuler: - - - - 441 - - - - alignCenter: - - - - 442 - - - - toggleRuler: - - - - 443 - - - - alignRight: - - - - 444 - - - - pasteRuler: - - - - 445 - - - - addFontTrait: - - - - 418 - - - - addFontTrait: - - - - 419 - - - - modifyFont: - - - - 420 - - - - orderFrontFontPanel: - - - - 421 - - - - modifyFont: - - - - 422 - - - - hostView - - - - 522 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - MainMenu - - - 19 - - - - - - - - 56 - - - - - - - - 103 - - - - - - 1 - - - 217 - - - - - - - - 83 - - - - - - - - 81 - - - - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - - - - - - 126 - - - - - 205 - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - - - - 2 - - - 111 - - - - - 57 - - - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - 373 - - - - - - - - 374 - - - - - - - - - 375 - - - - - - - - 376 - - - - - - - - 377 - - - - - - - - - - - - - - - 378 - - - - - 379 - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - - - - - - - - - - - - - - - - - - - - - 387 - - - - - 388 - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - - - - 396 - - - - - - - - 397 - - - - - - - - 398 - - - - - 399 - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - - - - - - - - 404 - - - - - 405 - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - - - - - - 410 - - - - - 411 - - - - - 412 - - - - - 413 - - - - - - - - - - - 414 - - - - - 415 - - - - - 416 - - - - - 417 - - - - - 446 - - - - - - - - 447 - - - - - - - - 506 - - - 10 - - - 507 - - - 2 - - - 510 - - - 10 - - - 512 - - - - - 513 - - - - - 514 - - - - - 519 - - - - - 520 - - - Controller - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{78, 234}, {912, 526}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 522 - - - - - CPTGraphHostingView - NSView - - IBProjectSource - ../framework/MacOnly/CPTGraphHostingView.h - - - - CPTGraphHostingView - UIView - - IBProjectSource - ../framework/iPhoneOnly/CPTGraphHostingView.h - - - - DateController - YES - NSObject - - hostView - CPTGraphHostingView - - - hostView - - hostView - CPTGraphHostingView - - - - IBProjectSource - DatePlot/Source/DateController.swift - - - - FirstResponder - - exportToPDF: - id - - - exportToPDF: - - exportToPDF: - id - - - - IBUserSource - - - - - - - CPTGraphHostingView - NSView - - IBFrameworkSource - CorePlot.framework/Headers/CPTGraphHostingView.h - - - - - 0 - IBCocoaFramework - NO - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - {11, 11} - {10, 3} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/DropPlot/English.lproj/CPTPlotDocument.xib b/examples/DropPlot/English.lproj/CPTPlotDocument.xib index 34e4c656e..4ffc1a74c 100644 --- a/examples/DropPlot/English.lproj/CPTPlotDocument.xib +++ b/examples/DropPlot/English.lproj/CPTPlotDocument.xib @@ -1,213 +1,37 @@ - - - - 1050 - 11B26 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 1617 - - - YES - NSCustomView - NSWindowTemplate - NSView - NSCustomObject - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - - - YES - - CPTPlotDocument - - - FirstResponder - - - 15 - 2 - {{133, 173}, {561, 475}} - 1886912512 - Window - NSWindow - View - - {94, 86} - - - 256 - - YES - - - 274 - {561, 475} - - - YES - 2 - CPTGraphHostingView - - - {561, 475} - - - - {{0, 0}, {1440, 878}} - {94, 108} - {10000000000000, 10000000000000} - YES - - - NSApplication - - - - - YES - - - delegate - - - - 17 - - - - window - - - - 18 - - - - graphView - - - - 100029 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - 5 - - - YES - - - - Window - - - 6 - - - YES - - - - - - -3 - - - Application - - - 100021 - - - YES - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 100021.IBPluginDependency - 5.IBPluginDependency - 5.IBWindowTemplateEditedContentRect - 6.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{277, 382}, {561, 475}} - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 100029 - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/DropPlot/English.lproj/MainMenu.xib b/examples/DropPlot/English.lproj/MainMenu.xib index be8439b99..55467d561 100644 --- a/examples/DropPlot/English.lproj/MainMenu.xib +++ b/examples/DropPlot/English.lproj/MainMenu.xib @@ -1,3641 +1,537 @@ - - - - 1050 - 10A380 - 731 - 1025.2 - 427.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 731 - - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - YES - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - YES - - - DropPlot - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - DropPlot - - YES - - - About DropPlot - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide DropPlot - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit DropPlot - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Export to PDF... - - 2147483647 - - - - - - Export to PNG... - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - YES - - - DropPlot Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - NSFontManager - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 371 - - - - openDocument: - - - - 372 - - - - printDocument: - - - - 373 - - - - addFontTrait: - - - - 420 - - - - addFontTrait: - - - - 421 - - - - modifyFont: - - - - 422 - - - - orderFrontFontPanel: - - - - 423 - - - - modifyFont: - - - - 424 - - - - raiseBaseline: - - - - 425 - - - - lowerBaseline: - - - - 426 - - - - copyFont: - - - - 427 - - - - subscript: - - - - 428 - - - - superscript: - - - - 429 - - - - tightenKerning: - - - - 430 - - - - underline: - - - - 431 - - - - orderFrontColorPanel: - - - - 432 - - - - useAllLigatures: - - - - 433 - - - - loosenKerning: - - - - 434 - - - - pasteFont: - - - - 435 - - - - unscript: - - - - 436 - - - - useStandardKerning: - - - - 437 - - - - useStandardLigatures: - - - - 438 - - - - turnOffLigatures: - - - - 439 - - - - turnOffKerning: - - - - 440 - - - - alignLeft: - - - - 441 - - - - alignJustified: - - - - 442 - - - - copyRuler: - - - - 443 - - - - alignCenter: - - - - 444 - - - - toggleRuler: - - - - 445 - - - - alignRight: - - - - 446 - - - - pasteRuler: - - - - 447 - - - - terminate: - - - - 448 - - - - exportToPDF: - - - - 456 - - - - exportToPNG: - - - - 457 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 374 - - - YES - - - - - - 375 - - - YES - - - - - - - 376 - - - YES - - - - - - 377 - - - YES - - - - - - 378 - - - YES - - - - - - - - - - - - - 379 - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - - - 387 - - - YES - - - - - - - - - - - - - - - - - - - - - 388 - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - YES - - - - - - 397 - - - YES - - - - - - 398 - - - YES - - - - - - 399 - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - YES - - - - - - - - - - 405 - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - YES - - - - - - - - 411 - - - - - 412 - - - - - 413 - - - - - 414 - - - YES - - - - - - - - - 415 - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - 449 - - - 2 - - - 450 - - - 10 - - - 452 - - - 10 - - - - - YES - - YES - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBEditorWindowLastContentRect - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBEditorWindowLastContentRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 387.IBPluginDependency - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 418.IBPluginDependency - 449.IBPluginDependency - 449.ImportedFromIB2 - 450.IBPluginDependency - 450.ImportedFromIB2 - 452.IBPluginDependency - 452.ImportedFromIB2 - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBEditorWindowLastContentRect - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBEditorWindowLastContentRect - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {{683, 713}, {169, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{596, 852}, {216, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{522, 812}, {146, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{436, 809}, {64, 6}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {275, 83}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{197, 734}, {243, 243}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {167, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {241, 103}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{525, 802}, {197, 73}} - {{316, 736}, {428, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - - {74, 862} - {{11, 977}, {478, 20}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{475, 832}, {234, 43}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{608, 612}, {215, 63}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{328, 553}, {198, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{23, 794}, {245, 183}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - {{410, 483}, {200, 253}} - com.apple.InterfaceBuilder.CocoaPlugin - - {{155, 774}, {199, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - - YES - - - - - YES - - - YES - - - - 457 - - - - YES - - CPTPlotDocument - NSDocument - - YES - - YES - exportToPDF: - exportToPNG: - - - YES - id - id - - - - graphView - CPTLayerHostingView - - - IBProjectSource - CPTPlotDocument.h - - - - FirstResponder - - YES - - YES - exportToPDF: - exportToPNG: - - - YES - id - id - - - - IBUserSource - - - - - - YES - - NSApplication - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSApplication.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSApplicationScripting.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSColorPanel.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSHelpManager.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSPageLayout.h - - - - NSApplication - - IBFrameworkSource - AppKit.framework/Headers/NSUserInterfaceItemSearching.h - - - - NSBrowser - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSBrowser.h - - - - NSControl - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSControl.h - - - - NSDocument - NSObject - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocument.h - - - - NSDocument - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentScripting.h - - - - NSDocumentController - NSObject - - YES - - YES - clearRecentDocuments: - newDocument: - openDocument: - saveAllDocuments: - - - YES - id - id - id - id - - - - IBFrameworkSource - AppKit.framework/Headers/NSDocumentController.h - - - - NSFontManager - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontManager.h - - - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - - - NSMatrix - NSControl - - IBFrameworkSource - AppKit.framework/Headers/NSMatrix.h - - - - NSMenu - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenu.h - - - - NSMenuItem - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSMenuItem.h - - - - NSMovieView - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSMovieView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSAccessibility.h - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDictionaryController.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSDragging.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSFontPanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSKeyValueBinding.h - - - - NSObject - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSNibLoading.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSOutlineView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSPasteboard.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSSavePanel.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSTableView.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSToolbarItem.h - - - - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSView.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CIImageProvider.h - - - - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSInterfaceStyle.h - - - - NSResponder - NSObject - - IBFrameworkSource - AppKit.framework/Headers/NSResponder.h - - - - NSTableView - NSControl - - - - NSText - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSText.h - - - - NSTextView - NSText - - IBFrameworkSource - AppKit.framework/Headers/NSTextView.h - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSClipView.h - - - - NSView - - - - NSView - - IBFrameworkSource - AppKit.framework/Headers/NSRulerView.h - - - - NSView - NSResponder - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - - - - NSWindow - NSResponder - - IBFrameworkSource - AppKit.framework/Headers/NSWindow.h - - - - NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSWindowScripting.h - - - - - 0 - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../DropPlot.xcodeproj - 3 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/MinorTickLabels/minorTickFormatter.xib b/examples/MinorTickLabels/minorTickFormatter.xib index 526102e96..cf72d4d05 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xib +++ b/examples/MinorTickLabels/minorTickFormatter.xib @@ -1,3101 +1,554 @@ - - - - 1050 - 11B26 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 1617 - - - YES - NSCustomView - NSWindowTemplate - NSView - NSMenu - NSMenuItem - NSCustomObject - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AMainMenu - - YES - - - minorTickFormatter - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - minorTickFormatter - - YES - - - About minorTickFormatter - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Services - - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 2147483647 - - - - - - Hide minorTickFormatter - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit minorTickFormatter - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Export to PDF... - - 2147483647 - - - - - - Export to PNG... - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Find - - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 2147483647 - - - - - - Check Grammar With Spelling - - 2147483647 - - - - - - - - - Substitutions - - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 2147483647 - - - - - - Stop Speaking - - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Explode Layers - e - 1572864 - 2147483647 - - - - - - Reassemble Layers - r - 1572864 - 2147483647 - - - - - - - - - Window - - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bring All to Front - - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - minorTickFormatter Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 13 - 2 - {{68, 396}, {912, 526}} - 603979776 - Window - NSWindow - - - {450, 250} - - - 256 - - YES - - - 274 - {912, 526} - - - - CPTGraphHostingView - - - {912, 526} - - - - - {{0, 0}, {1680, 1028}} - {450, 272} - {10000000000000, 10000000000000} - YES - - - Controller - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - addFontTrait: - - - - 418 - - - - addFontTrait: - - - - 419 - - - - modifyFont: - - - - 420 - - - - orderFrontFontPanel: - - - - 421 - - - - modifyFont: - - - - 422 - - - - raiseBaseline: - - - - 423 - - - - lowerBaseline: - - - - 424 - - - - copyFont: - - - - 425 - - - - subscript: - - - - 426 - - - - superscript: - - - - 427 - - - - tightenKerning: - - - - 428 - - - - underline: - - - - 429 - - - - orderFrontColorPanel: - - - - 430 - - - - useAllLigatures: - - - - 431 - - - - loosenKerning: - - - - 432 - - - - pasteFont: - - - - 433 - - - - unscript: - - - - 434 - - - - useStandardKerning: - - - - 435 - - - - useStandardLigatures: - - - - 436 - - - - turnOffLigatures: - - - - 437 - - - - turnOffKerning: - - - - 438 - - - - alignLeft: - - - - 439 - - - - alignJustified: - - - - 440 - - - - copyRuler: - - - - 441 - - - - alignCenter: - - - - 442 - - - - toggleRuler: - - - - 443 - - - - alignRight: - - - - 444 - - - - pasteRuler: - - - - 445 - - - - hostView - - - - 521 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - 373 - - - YES - - - - - - 374 - - - YES - - - - - - - 375 - - - YES - - - - - - 376 - - - YES - - - - - - 377 - - - YES - - - - - - - - - - - - - 378 - - - - - 379 - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - YES - - - - - - - - - - - - - - - - - - - - - 387 - - - - - 388 - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - YES - - - - - - 396 - - - YES - - - - - - 397 - - - YES - - - - - - 398 - - - - - 399 - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - YES - - - - - - - - - - 404 - - - - - 405 - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - YES - - - - - - - - 410 - - - - - 411 - - - - - 412 - - - - - 413 - - - YES - - - - - - - - - 414 - - - - - 415 - - - - - 416 - - - - - 417 - - - - - 446 - - - YES - - - - - - 447 - - - YES - - - - - - 506 - - - 10 - - - 507 - - - 2 - - - 510 - - - 10 - - - 512 - - - - - 513 - - - - - 514 - - - - - 519 - - - - - 520 - - - Controller - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 103.IBPluginDependency - 106.IBPluginDependency - 111.IBPluginDependency - 112.IBPluginDependency - 124.IBPluginDependency - 125.IBPluginDependency - 126.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency - 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency - 149.IBPluginDependency - 150.IBPluginDependency - 19.IBPluginDependency - 195.IBPluginDependency - 196.IBPluginDependency - 197.IBPluginDependency - 198.IBPluginDependency - 199.IBPluginDependency - 200.IBPluginDependency - 201.IBPluginDependency - 202.IBPluginDependency - 203.IBPluginDependency - 204.IBPluginDependency - 205.IBPluginDependency - 206.IBPluginDependency - 207.IBPluginDependency - 208.IBPluginDependency - 209.IBPluginDependency - 210.IBPluginDependency - 211.IBPluginDependency - 212.IBPluginDependency - 213.IBPluginDependency - 214.IBPluginDependency - 215.IBPluginDependency - 216.IBPluginDependency - 217.IBPluginDependency - 218.IBPluginDependency - 219.IBPluginDependency - 220.IBPluginDependency - 221.IBPluginDependency - 23.IBPluginDependency - 236.IBPluginDependency - 239.IBPluginDependency - 24.IBPluginDependency - 29.IBPluginDependency - 295.IBPluginDependency - 296.IBPluginDependency - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 348.IBPluginDependency - 349.IBPluginDependency - 350.IBPluginDependency - 351.IBPluginDependency - 354.IBPluginDependency - 371.IBPluginDependency - 373.IBPluginDependency - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 387.IBPluginDependency - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 446.IBPluginDependency - 446.IBWindowTemplateEditedContentRect - 446.NSWindowTemplate.visibleAtLaunch - 447.IBPluginDependency - 5.IBPluginDependency - 506.IBPluginDependency - 507.IBPluginDependency - 510.IBPluginDependency - 512.IBPluginDependency - 513.IBPluginDependency - 514.IBPluginDependency - 519.IBPluginDependency - 520.IBPluginDependency - 56.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 72.IBPluginDependency - 73.IBPluginDependency - 74.IBPluginDependency - 75.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 79.IBPluginDependency - 80.IBPluginDependency - 81.IBPluginDependency - 82.IBPluginDependency - 83.IBPluginDependency - 92.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{78, 234}, {912, 526}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 521 - - - - YES - - CPTGraphHostingView - NSView - - IBProjectSource - ./Classes/CPTGraphHostingView.h - - - - Controller - NSObject - - hostView - CPTLayerHostingView - - - hostView - - hostView - CPTLayerHostingView - - - - IBProjectSource - ./Classes/Controller.h - - - - FirstResponder - - exportToPDF: - id - - - exportToPDF: - - exportToPDF: - id - - - - IBUserSource - - - - - NSDocument - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - id - id - id - id - id - id - - - - YES - - YES - printDocument: - revertDocumentToSaved: - runPageLayout: - saveDocument: - saveDocumentAs: - saveDocumentTo: - - - YES - - printDocument: - id - - - revertDocumentToSaved: - id - - - runPageLayout: - id - - - saveDocument: - id - - - saveDocumentAs: - id - - - saveDocumentTo: - id - - - - - IBProjectSource - ./Classes/NSDocument.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/RangePlot/RangePlot.xib b/examples/RangePlot/RangePlot.xib index 0e300bd10..6787210bb 100644 --- a/examples/RangePlot/RangePlot.xib +++ b/examples/RangePlot/RangePlot.xib @@ -1,3005 +1,554 @@ - - - - 1050 - 11B26 - 1617 - 1138 - 566.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 1617 - - - YES - NSCustomView - NSWindowTemplate - NSView - NSMenu - NSMenuItem - NSCustomObject - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - YES - - - - - YES - - NSApplication - - - FirstResponder - - - NSApplication - - - NSFontManager - - - AMainMenu - - YES - - - DatePlot - - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - DatePlot - - YES - - - About DatePlot - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Services - - 2147483647 - - - submenuAction: - - Services - - YES - - _NSServicesMenu - - - - - YES - YES - - - 2147483647 - - - - - - Hide DatePlot - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Quit DatePlot - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 2147483647 - - - submenuAction: - - File - - YES - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 2147483647 - - - submenuAction: - - Open Recent - - YES - - - Clear Menu - - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Export to PDF... - - 2147483647 - - - - - - Export to PNG... - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 2147483647 - - - submenuAction: - - Edit - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Find - - 2147483647 - - - submenuAction: - - Find - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 2147483647 - - - submenuAction: - - Spelling and Grammar - - YES - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 2147483647 - - - - - - Check Grammar With Spelling - - 2147483647 - - - - - - - - - Substitutions - - 2147483647 - - - submenuAction: - - Substitutions - - YES - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 2147483647 - - - - - - Stop Speaking - - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - YES - - - Font - - 2147483647 - - - submenuAction: - - Font - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - YES - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - YES - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - YES - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 2147483647 - - - submenuAction: - - View - - YES - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Explode Layers - e - 1572864 - 2147483647 - - - - - - Reassemble Layers - r - 1572864 - 2147483647 - - - - - - - - - Window - - 2147483647 - - - submenuAction: - - Window - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bring All to Front - - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - YES - - - DatePlot Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 13 - 2 - {{68, 396}, {912, 526}} - 603979776 - Window - NSWindow - - - {450, 250} - - - 256 - - YES - - - 274 - {912, 526} - - - CPTGraphHostingView - - - {912, 526} - - - - {{0, 0}, {1680, 1028}} - {450, 272} - {10000000000000, 10000000000000} - YES - - - Controller - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - terminate: - - - - 369 - - - - unhideAllApplications: - - - - 370 - - - - addFontTrait: - - - - 418 - - - - addFontTrait: - - - - 419 - - - - modifyFont: - - - - 420 - - - - orderFrontFontPanel: - - - - 421 - - - - modifyFont: - - - - 422 - - - - raiseBaseline: - - - - 423 - - - - lowerBaseline: - - - - 424 - - - - copyFont: - - - - 425 - - - - subscript: - - - - 426 - - - - superscript: - - - - 427 - - - - tightenKerning: - - - - 428 - - - - underline: - - - - 429 - - - - orderFrontColorPanel: - - - - 430 - - - - useAllLigatures: - - - - 431 - - - - loosenKerning: - - - - 432 - - - - pasteFont: - - - - 433 - - - - unscript: - - - - 434 - - - - useStandardKerning: - - - - 435 - - - - useStandardLigatures: - - - - 436 - - - - turnOffLigatures: - - - - 437 - - - - turnOffKerning: - - - - 438 - - - - alignLeft: - - - - 439 - - - - alignJustified: - - - - 440 - - - - copyRuler: - - - - 441 - - - - alignCenter: - - - - 442 - - - - toggleRuler: - - - - 443 - - - - alignRight: - - - - 444 - - - - pasteRuler: - - - - 445 - - - - hostView - - - - 521 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - 1 - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - 2 - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - 373 - - - YES - - - - - - 374 - - - YES - - - - - - - 375 - - - YES - - - - - - 376 - - - YES - - - - - - 377 - - - YES - - - - - - - - - - - - - 378 - - - - - 379 - - - - - 380 - - - - - 381 - - - - - 382 - - - - - 383 - - - - - 384 - - - - - 385 - - - - - 386 - - - YES - - - - - - - - - - - - - - - - - - - - - 387 - - - - - 388 - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - YES - - - - - - 396 - - - YES - - - - - - 397 - - - YES - - - - - - 398 - - - - - 399 - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - YES - - - - - - - - - - 404 - - - - - 405 - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - YES - - - - - - - - 410 - - - - - 411 - - - - - 412 - - - - - 413 - - - YES - - - - - - - - - 414 - - - - - 415 - - - - - 416 - - - - - 417 - - - - - 446 - - - YES - - - - - - 447 - - - YES - - - - - - 506 - - - 10 - - - 507 - - - 2 - - - 510 - - - 10 - - - 512 - - - - - 513 - - - - - 514 - - - - - 519 - - - - - 520 - - - Controller - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 103.IBPluginDependency - 106.IBPluginDependency - 111.IBPluginDependency - 112.IBPluginDependency - 124.IBPluginDependency - 125.IBPluginDependency - 126.IBPluginDependency - 129.IBPluginDependency - 130.IBPluginDependency - 131.IBPluginDependency - 134.IBPluginDependency - 136.IBPluginDependency - 143.IBPluginDependency - 144.IBPluginDependency - 145.IBPluginDependency - 149.IBPluginDependency - 150.IBPluginDependency - 19.IBPluginDependency - 195.IBPluginDependency - 196.IBPluginDependency - 197.IBPluginDependency - 198.IBPluginDependency - 199.IBPluginDependency - 200.IBPluginDependency - 201.IBPluginDependency - 202.IBPluginDependency - 203.IBPluginDependency - 204.IBPluginDependency - 205.IBPluginDependency - 206.IBPluginDependency - 207.IBPluginDependency - 208.IBPluginDependency - 209.IBPluginDependency - 210.IBPluginDependency - 211.IBPluginDependency - 212.IBPluginDependency - 213.IBPluginDependency - 214.IBPluginDependency - 215.IBPluginDependency - 216.IBPluginDependency - 217.IBPluginDependency - 218.IBPluginDependency - 219.IBPluginDependency - 220.IBPluginDependency - 221.IBPluginDependency - 23.IBPluginDependency - 236.IBPluginDependency - 239.IBPluginDependency - 24.IBPluginDependency - 29.IBPluginDependency - 295.IBPluginDependency - 296.IBPluginDependency - 297.IBPluginDependency - 298.IBPluginDependency - 346.IBPluginDependency - 348.IBPluginDependency - 349.IBPluginDependency - 350.IBPluginDependency - 351.IBPluginDependency - 354.IBPluginDependency - 371.IBPluginDependency - 373.IBPluginDependency - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 387.IBPluginDependency - 388.IBPluginDependency - 389.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 392.IBPluginDependency - 393.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBPluginDependency - 399.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 404.IBPluginDependency - 405.IBPluginDependency - 406.IBPluginDependency - 407.IBPluginDependency - 408.IBPluginDependency - 409.IBPluginDependency - 410.IBPluginDependency - 411.IBPluginDependency - 412.IBPluginDependency - 413.IBPluginDependency - 414.IBPluginDependency - 415.IBPluginDependency - 416.IBPluginDependency - 417.IBPluginDependency - 446.IBPluginDependency - 446.IBWindowTemplateEditedContentRect - 446.NSWindowTemplate.visibleAtLaunch - 447.IBPluginDependency - 5.IBPluginDependency - 506.IBPluginDependency - 507.IBPluginDependency - 510.IBPluginDependency - 512.IBPluginDependency - 513.IBPluginDependency - 514.IBPluginDependency - 519.IBPluginDependency - 520.IBPluginDependency - 56.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 72.IBPluginDependency - 73.IBPluginDependency - 74.IBPluginDependency - 75.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 79.IBPluginDependency - 80.IBPluginDependency - 81.IBPluginDependency - 82.IBPluginDependency - 83.IBPluginDependency - 92.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{78, 234}, {912, 526}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 521 - - - - YES - - FirstResponder - - exportToPDF: - id - - - exportToPDF: - - exportToPDF: - id - - - - IBUserSource - - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.xib b/examples/StockPlot/Classes/APYahooDataPullerGraph.xib index e01f8d6b5..979259557 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.xib +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.xib @@ -1,8 +1,8 @@ - + - - + + From 71a09cdff2a070db33f2b2e4c00998f16436d1ab Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 16 Aug 2015 15:15:01 -0400 Subject: [PATCH 062/429] Changed the Mac CPTGraphHostingView so it can act as either a layer hosting view or a layer backed view as required. Fixed issue #167. --- framework/MacOnly/CPTGraphHostingView.m | 33 +++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 2670d1a65..7fd148c4f 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -74,12 +74,18 @@ -(instancetype)initWithFrame:(NSRect)frame locationInWindow = NSZeroPoint; scrollOffset = CGPointZero; - CPTLayer *mainLayer = [[CPTLayer alloc] initWithFrame:NSRectToCGRect(frame)]; - self.layer = mainLayer; + if ( !self.superview.wantsLayer ) { + self.layer = [self makeBackingLayer]; + } } return self; } +-(CALayer *)makeBackingLayer +{ + return [[CPTLayer alloc] initWithFrame:NSRectToCGRect(self.bounds)]; +} + -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -189,6 +195,13 @@ -(void)drawRect:(NSRect)dirtyRect } } +/// @endcond + +#pragma mark - +#pragma mark Printing + +/// @cond + -(BOOL)knowsPageRange:(NSRangePointer)rangePointer { rangePointer->location = 1; @@ -477,6 +490,22 @@ -(void)plotAreaBoundsChanged [self.window invalidateCursorRectsForView:self]; } +-(void)viewWillMoveToSuperview:(NSView *)newSuperview +{ + if ( self.superview.wantsLayer != newSuperview.wantsLayer ) { + self.wantsLayer = NO; + self.layer = nil; + + if ( newSuperview.wantsLayer ) { + self.wantsLayer = YES; + } + else { + self.layer = [self makeBackingLayer]; + self.wantsLayer = YES; + } + } +} + /// @endcond #pragma mark - From fe08ec4498db090f3e623de4e5a614dc5cb1d7a8 Mon Sep 17 00:00:00 2001 From: Demitri Muna Date: Fri, 28 Aug 2015 03:21:58 -0400 Subject: [PATCH 063/429] Initial implementation of new CPTScaleType, CPTScaleTypeLogModulus. --- framework/Source/CPTAxis.m | 59 ++++++++++++++++ framework/Source/CPTDefinitions.h | 3 +- framework/Source/CPTPlot.m | 2 + framework/Source/CPTUtilities.h | 6 ++ framework/Source/CPTUtilities.m | 9 +++ framework/Source/CPTXYAxis.m | 9 +++ framework/Source/CPTXYPlotSpace.m | 109 ++++++++++++++++++++++++++++++ 7 files changed, 196 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 4099e599f..c0596c4e4 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -983,6 +983,10 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation } break; + case CPTScaleTypeLogModulus: + // supported scale type + break; + default: // unsupported scale type--bail out valid = NO; @@ -1139,6 +1143,61 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation } break; + case CPTScaleTypeLogModulus: + { + double minLimit = range.minLimitDouble; + double maxLimit = range.maxLimitDouble; + + // Determine interval value + if ( numTicks == 0 ) { + numTicks = 5; + } + + double interval; + + length = CPTLogModulus(maxLimit / minLimit); + + if ( fabs(length) >= numTicks ) { + interval = CPTDecimalDoubleValue( CPTNiceNum( CPTDecimalFromDouble( length / (numTicks - 1) ) ) ); + } + else { + interval = signbit(length) ? -1.0 : 1.0; + } + double intervalStep = pow( 10.0, fabs(interval) ); + + // Determine minor interval + double minorInterval = intervalStep * 0.9 * pow( 10.0, floor( CPTLogModulus(minLimit) ) ) / minorTicks; + + // Determine the initial and final major indexes for the actual visible range + NSInteger initialIndex = (NSInteger)lrint( floor( CPTLogModulus( minLimit / fabs(interval) ) ) ); // can be negative + NSInteger finalIndex = (NSInteger)lrint( ceil( CPTLogModulus( maxLimit / fabs(interval) ) ) ); // can be negative + + // Iterate through the indexes with visible ticks and build the locations sets + for ( NSInteger i = initialIndex; i <= finalIndex; i++ ) { + double pointLocation = pow(10.0, i * interval); + for ( NSUInteger j = 1; j < minorTicks; j++ ) { + double minorPointLocation = pointLocation + minorInterval * j; + if ( minorPointLocation < minLimit ) { + continue; + } + if ( minorPointLocation > maxLimit ) { + continue; + } + [minorLocations addObject:@(minorPointLocation)]; + } + minorInterval *= intervalStep; + + if ( pointLocation < minLimit ) { + continue; + } + if ( pointLocation > maxLimit ) { + continue; + } + [majorLocations addObject:@(pointLocation)]; + } + } + break; + default: break; } diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 00d4e6c78..7e8c44bcc 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -163,7 +163,8 @@ typedef NS_ENUM (NSInteger, CPTScaleType) { CPTScaleTypeLog, ///< Logarithmic axis scale CPTScaleTypeAngular, ///< Angular axis scale (not implemented) CPTScaleTypeDateTime, ///< Date/time axis scale (not implemented) - CPTScaleTypeCategory ///< Category axis scale + CPTScaleTypeCategory, ///< Category axis scale + CPTScaleTypeLogModulus ///< Log-modulus axis scale }; /** diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index ab45c67ee..893c9f347 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -941,6 +941,7 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum switch ( [thePlotSpace scaleTypeForCoordinate:coordinate] ) { case CPTScaleTypeLinear: case CPTScaleTypeLog: + case CPTScaleTypeLogModulus: { CPTMutableNumericData *mutableNumbers = [self numericDataForNumbers:numbers]; @@ -1035,6 +1036,7 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NS switch ( [thePlotSpace scaleTypeForCoordinate:coordinate] ) { case CPTScaleTypeLinear: case CPTScaleTypeLog: + case CPTScaleTypeLogModulus: { mutableNumbers = [self numericDataForNumbers:numbers]; diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index b138fb60f..d7767cee3 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -147,6 +147,12 @@ CGFloat squareOfDistanceBetweenPoints(CGPoint point1, CGPoint point2); CPTEdgeInsets CPTEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right); BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2); +/// @} + +/// @name Log Modulus Definition +/// @{ +double CPTLogModulus(double value); + /// @} #if __cplusplus diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 8107d0c51..22b30542d 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -1004,3 +1004,12 @@ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2 (insets1.bottom == insets2.bottom) && (insets1.right == insets2.right); } + +#pragma mark - +#pragma mark Log Modulus Definition + +double CPTLogModulus(double value) +{ + double sign = (value < 0) ? -1.0 : +1.0; + return sign * log10(fabs(value) + 1); +} diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 3bccee101..bbf01eb69 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -718,6 +718,15 @@ -(NSNumber *)defaultTitleLocation } break; + case CPTScaleTypeLogModulus: + { + double loc = axisRange.locationDouble; + double end = axisRange.endDouble; + + location = @( pow(10.0, ( CPTLogModulus(loc) + CPTLogModulus(end) ) / 2.0) ); + } + break; + default: location = axisRange.midPoint; break; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index a07561907..c7d8463b7 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -904,6 +904,51 @@ -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotR return pow(10.0, coordinate); } +// Log-modulus +-(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength logModulusPlotRange:(CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord +{ + if ( !range ) { + return CPTFloat(0.0); + } + + NSDecimal factor = CPTDecimalDivide(CPTDecimalSubtract(plotCoord, range.locationDecimal), range.lengthDecimal); + if ( NSDecimalIsNotANumber(&factor) ) { + factor = CPTDecimalFromInteger(0); + } + + NSDecimal viewCoordinate = CPTDecimalMultiply(viewLength, factor); + + return CPTDecimalCGFloatValue(viewCoordinate); +} + +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord +{ + if ( !range || (range.lengthDouble == 0.0) ) { + return CPTFloat(0.0); + } + + double logLoc = CPTLogModulus(range.locationDouble); + double logCoord = CPTLogModulus(plotCoord); + double logEnd = CPTLogModulus(range.endDouble); + + return viewLength * (CGFloat)( (logCoord - logLoc) / (logEnd - logLoc) ); +} + + +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength +{ + if ( boundsLength == 0.0 ) { + return 0.0; + } + + double logLoc = CPTLogModulus(range.locationDouble); + double logEnd = CPTLogModulus(range.endDouble); + double coordinate = viewLength * (logEnd - logLoc) / boundsLength + logLoc; + + return pow(10.0, coordinate); + +} + /// @endcond #pragma mark - @@ -944,6 +989,12 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint } break; + case CPTScaleTypeLogModulus: + { + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + } + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -960,6 +1011,12 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint } break; + case CPTScaleTypeLogModulus: + { + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + } + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -995,6 +1052,13 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat } break; + case CPTScaleTypeLogModulus: + { + double x = CPTDecimalDoubleValue(plotPoint[CPTCoordinateX]); + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:x]; + } + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1012,6 +1076,13 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat } break; + case CPTScaleTypeLogModulus: + { + double y = CPTDecimalDoubleValue(plotPoint[CPTCoordinateY]); + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:y]; + } + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1044,6 +1115,10 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX]]; break; + case CPTScaleTypeLogModulus: + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX]]; + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1058,6 +1133,10 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY]]; break; + case CPTScaleTypeLogModulus: + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY]]; + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1097,6 +1176,10 @@ -(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point plotPoint[CPTCoordinateX] = @([self doublePrecisionPlotCoordinateForViewLength:point.x logPlotRange:self.xRange boundsLength:boundsSize.width]); break; + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateX] = @([self doublePrecisionPlotCoordinateForViewLength:point.x logModulusPlotRange:self.xRange boundsLength:boundsSize.width]); + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1112,6 +1195,10 @@ -(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point case CPTScaleTypeLog: plotPoint[CPTCoordinateY] = @([self doublePrecisionPlotCoordinateForViewLength:point.y logPlotRange:self.yRange boundsLength:boundsSize.height]); break; + + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateY] = @([self doublePrecisionPlotCoordinateForViewLength:point.y logModulusPlotRange:self.yRange boundsLength:boundsSize.height]); + break; default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; @@ -1147,6 +1234,10 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo case CPTScaleTypeLog: plotPoint[CPTCoordinateX] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.x logPlotRange:self.xRange boundsLength:boundsSize.width]); break; + + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateX] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.x logModulusPlotRange:self.xRange boundsLength:boundsSize.width]); + break; default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; @@ -1162,6 +1253,10 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo plotPoint[CPTCoordinateY] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.y logPlotRange:self.yRange boundsLength:boundsSize.height]); break; + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateY] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.y logModulusPlotRange:self.yRange boundsLength:boundsSize.height]); + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1194,6 +1289,10 @@ -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInte plotPoint[CPTCoordinateX] = [self doublePrecisionPlotCoordinateForViewLength:point.x logPlotRange:self.xRange boundsLength:boundsSize.width]; break; + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateX] = [self doublePrecisionPlotCoordinateForViewLength:point.x logModulusPlotRange:self.xRange boundsLength:boundsSize.width]; + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1208,6 +1307,10 @@ -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInte plotPoint[CPTCoordinateY] = [self doublePrecisionPlotCoordinateForViewLength:point.y logPlotRange:self.yRange boundsLength:boundsSize.height]; break; + case CPTScaleTypeLogModulus: + plotPoint[CPTCoordinateY] = [self doublePrecisionPlotCoordinateForViewLength:point.y logModulusPlotRange:self.yRange boundsLength:boundsSize.height]; + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1758,6 +1861,9 @@ -(id)debugQuickLookObject case CPTScaleTypeLog: xScaleTypeDesc = @"CPTScaleTypeLog"; break; + + case CPTScaleTypeLogModulus: + xScaleTypeDesc = @"CPTScaleTypeLogModulus"; case CPTScaleTypeAngular: xScaleTypeDesc = @"CPTScaleTypeAngular"; @@ -1789,6 +1895,9 @@ -(id)debugQuickLookObject yScaleTypeDesc = @"CPTScaleTypeLog"; break; + case CPTScaleTypeLogModulus: + yScaleTypeDesc = @"CPTScaleTypeLogModulus"; + case CPTScaleTypeAngular: yScaleTypeDesc = @"CPTScaleTypeAngular"; break; From 71e8703b4e2c8d6830dab3225ce0306e4035683c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 28 Aug 2015 16:01:18 -0400 Subject: [PATCH 064/429] Added Demitri Muna to the license file. --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 7f200acbc..b693e8127 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, and Victor Martin Garcia. +Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, Victor Martin Garcia, and Demitri Muna. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 1f62e4ea11e3e2ad926aefe125cadd75d23c3c35 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 28 Aug 2015 16:02:51 -0400 Subject: [PATCH 065/429] Standardized code formatting. --- framework/Source/CPTAxis.m | 18 ++++++++--------- framework/Source/CPTDefinitions.h | 10 +++++----- framework/Source/CPTUtilities.h | 4 ++-- framework/Source/CPTUtilities.m | 1 + framework/Source/CPTXYAxis.m | 6 +++--- framework/Source/CPTXYPlotSpace.m | 32 +++++++++++++++---------------- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index c0596c4e4..ae86ad25a 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1147,16 +1147,16 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation { double minLimit = range.minLimitDouble; double maxLimit = range.maxLimitDouble; - + // Determine interval value if ( numTicks == 0 ) { numTicks = 5; } - + double interval; - + length = CPTLogModulus(maxLimit / minLimit); - + if ( fabs(length) >= numTicks ) { interval = CPTDecimalDoubleValue( CPTNiceNum( CPTDecimalFromDouble( length / (numTicks - 1) ) ) ); } @@ -1164,14 +1164,14 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation interval = signbit(length) ? -1.0 : 1.0; } double intervalStep = pow( 10.0, fabs(interval) ); - + // Determine minor interval double minorInterval = intervalStep * 0.9 * pow( 10.0, floor( CPTLogModulus(minLimit) ) ) / minorTicks; - + // Determine the initial and final major indexes for the actual visible range NSInteger initialIndex = (NSInteger)lrint( floor( CPTLogModulus( minLimit / fabs(interval) ) ) ); // can be negative NSInteger finalIndex = (NSInteger)lrint( ceil( CPTLogModulus( maxLimit / fabs(interval) ) ) ); // can be negative - + // Iterate through the indexes with visible ticks and build the locations sets for ( NSInteger i = initialIndex; i <= finalIndex; i++ ) { double pointLocation = pow(10.0, i * interval); @@ -1186,7 +1186,7 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation [minorLocations addObject:@(minorPointLocation)]; } minorInterval *= intervalStep; - + if ( pointLocation < minLimit ) { continue; } @@ -1196,7 +1196,7 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation [majorLocations addObject:@(pointLocation)]; } } - break; + break; default: break; diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 7e8c44bcc..39818c098 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -159,11 +159,11 @@ typedef NS_ENUM (NSInteger, CPTErrorBarType) { * @brief Enumeration of axis scale types **/ typedef NS_ENUM (NSInteger, CPTScaleType) { - CPTScaleTypeLinear, ///< Linear axis scale - CPTScaleTypeLog, ///< Logarithmic axis scale - CPTScaleTypeAngular, ///< Angular axis scale (not implemented) - CPTScaleTypeDateTime, ///< Date/time axis scale (not implemented) - CPTScaleTypeCategory, ///< Category axis scale + CPTScaleTypeLinear, ///< Linear axis scale + CPTScaleTypeLog, ///< Logarithmic axis scale + CPTScaleTypeAngular, ///< Angular axis scale (not implemented) + CPTScaleTypeDateTime, ///< Date/time axis scale (not implemented) + CPTScaleTypeCategory, ///< Category axis scale CPTScaleTypeLogModulus ///< Log-modulus axis scale }; diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index d7767cee3..502c8cfc1 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -148,11 +148,11 @@ CPTEdgeInsets CPTEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFlo BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2); /// @} - + /// @name Log Modulus Definition /// @{ double CPTLogModulus(double value); - + /// @} #if __cplusplus diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 22b30542d..56420a39f 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -1011,5 +1011,6 @@ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2 double CPTLogModulus(double value) { double sign = (value < 0) ? -1.0 : +1.0; + return sign * log10(fabs(value) + 1); } diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index bbf01eb69..52d2b74a2 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -722,11 +722,11 @@ -(NSNumber *)defaultTitleLocation { double loc = axisRange.locationDouble; double end = axisRange.endDouble; - + location = @( pow(10.0, ( CPTLogModulus(loc) + CPTLogModulus(end) ) / 2.0) ); } - break; - + break; + default: location = axisRange.midPoint; break; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index c7d8463b7..a46ba1a41 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -910,14 +910,14 @@ -(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength logModulusPlotRange: if ( !range ) { return CPTFloat(0.0); } - + NSDecimal factor = CPTDecimalDivide(CPTDecimalSubtract(plotCoord, range.locationDecimal), range.lengthDecimal); if ( NSDecimalIsNotANumber(&factor) ) { factor = CPTDecimalFromInteger(0); } - + NSDecimal viewCoordinate = CPTDecimalMultiply(viewLength, factor); - + return CPTDecimalCGFloatValue(viewCoordinate); } @@ -926,27 +926,25 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(C if ( !range || (range.lengthDouble == 0.0) ) { return CPTFloat(0.0); } - + double logLoc = CPTLogModulus(range.locationDouble); double logCoord = CPTLogModulus(plotCoord); double logEnd = CPTLogModulus(range.endDouble); - + return viewLength * (CGFloat)( (logCoord - logLoc) / (logEnd - logLoc) ); } - -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { if ( boundsLength == 0.0 ) { return 0.0; } - double logLoc = CPTLogModulus(range.locationDouble); - double logEnd = CPTLogModulus(range.endDouble); + double logLoc = CPTLogModulus(range.locationDouble); + double logEnd = CPTLogModulus(range.endDouble); double coordinate = viewLength * (logEnd - logLoc) / boundsLength + logLoc; - - return pow(10.0, coordinate); + return pow(10.0, coordinate); } /// @endcond @@ -1016,7 +1014,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSArray *)plotPoint viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; } break; - + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1057,8 +1055,8 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat double x = CPTDecimalDoubleValue(plotPoint[CPTCoordinateX]); viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:x]; } - break; - + break; + default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; } @@ -1081,7 +1079,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat double y = CPTDecimalDoubleValue(plotPoint[CPTCoordinateY]); viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:y]; } - break; + break; default: [NSException raise:CPTException format:@"Scale type not supported in CPTXYPlotSpace"]; @@ -1195,7 +1193,7 @@ -(NSArray *)plotPointForPlotAreaViewPoint:(CGPoint)point case CPTScaleTypeLog: plotPoint[CPTCoordinateY] = @([self doublePrecisionPlotCoordinateForViewLength:point.y logPlotRange:self.yRange boundsLength:boundsSize.height]); break; - + case CPTScaleTypeLogModulus: plotPoint[CPTCoordinateY] = @([self doublePrecisionPlotCoordinateForViewLength:point.y logModulusPlotRange:self.yRange boundsLength:boundsSize.height]); break; @@ -1234,7 +1232,7 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo case CPTScaleTypeLog: plotPoint[CPTCoordinateX] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.x logPlotRange:self.xRange boundsLength:boundsSize.width]); break; - + case CPTScaleTypeLogModulus: plotPoint[CPTCoordinateX] = CPTDecimalFromDouble([self doublePrecisionPlotCoordinateForViewLength:point.x logModulusPlotRange:self.xRange boundsLength:boundsSize.width]); break; @@ -1861,7 +1859,7 @@ -(id)debugQuickLookObject case CPTScaleTypeLog: xScaleTypeDesc = @"CPTScaleTypeLog"; break; - + case CPTScaleTypeLogModulus: xScaleTypeDesc = @"CPTScaleTypeLogModulus"; From a277aa77cb4d5c20a15a72e4732a95ec1d43cd0e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 29 Aug 2015 15:20:13 -0400 Subject: [PATCH 066/429] Added documentation for the CPTEdgeInsets functions. --- framework/Source/CPTUtilities.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 56420a39f..22c93ab5c 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -985,6 +985,13 @@ CGFloat squareOfDistanceBetweenPoints(CGPoint point1, CGPoint point2) #pragma mark - #pragma mark Edge Inset Utilities +/** @brief Returns a CPTEdgeInsets struct with the given insets. + * @param top The top inset. + * @param left The left inset. + * @param bottom The bottom inset. + * @param right The right inset. + * @return A CPTEdgeInsets struct with the given insets. + **/ CPTEdgeInsets CPTEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) { CPTEdgeInsets insets; @@ -997,6 +1004,11 @@ CPTEdgeInsets CPTEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFlo return insets; } +/** @brief Compares two CPTEdgeInsets structstructs. + * @param insets1 The first inset. + * @param insets2 The second inset. + * @return @YES if the two CPTEdgeInsets structs are equal. + **/ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2) { return (insets1.top == insets2.top) && From 5d501749c99a77c886f24244b17e3a25b38d1a42 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 11 Sep 2015 14:10:34 -0400 Subject: [PATCH 067/429] Fixed some problems with axis labeling and plot space conversions for the log modulus axis scale. --- documentation/changelog.markdown | 1 + framework/Source/CPTAxis.m | 122 +++++++++++++++++++----------- framework/Source/CPTUtilities.h | 1 + framework/Source/CPTUtilities.m | 32 +++++++- framework/Source/CPTXYAxis.m | 2 +- framework/Source/CPTXYPlotSpace.m | 26 ++----- 6 files changed, 117 insertions(+), 67 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index f21b88f8a..0a5402051 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -10,6 +10,7 @@ To be determined - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added nullability annotations to all property and method declarations. +- **New**: Added the log-modulus scale type. - **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index ae86ad25a..816fa618c 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1093,20 +1093,9 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation if ( (minLimit > 0.0) && (maxLimit > 0.0) ) { // Determine interval value - if ( numTicks == 0 ) { - numTicks = 5; - } - - double interval; - length = log10(maxLimit / minLimit); - if ( fabs(length) >= numTicks ) { - interval = CPTDecimalDoubleValue( CPTNiceNum( CPTDecimalFromDouble( length / (numTicks - 1) ) ) ); - } - else { - interval = signbit(length) ? -1.0 : 1.0; - } + double interval = signbit(length) ? -1.0 : 1.0; double intervalStep = pow( 10.0, fabs(interval) ); // Determine minor interval @@ -1149,51 +1138,96 @@ -(void)autoGenerateMajorTickLocations:(NSSet *__autoreleasing *)newMajorLocation double maxLimit = range.maxLimitDouble; // Determine interval value - if ( numTicks == 0 ) { - numTicks = 5; - } + double modMinLimit = CPTLogModulus(minLimit); + double modMaxLimit = CPTLogModulus(maxLimit); - double interval; + double multiplier = pow( 10.0, floor( log10(length) ) ); + multiplier = (multiplier < 1.0) ? multiplier : 1.0; - length = CPTLogModulus(maxLimit / minLimit); + double intervalStep = 10.0; - if ( fabs(length) >= numTicks ) { - interval = CPTDecimalDoubleValue( CPTNiceNum( CPTDecimalFromDouble( length / (numTicks - 1) ) ) ); - } - else { - interval = signbit(length) ? -1.0 : 1.0; - } - double intervalStep = pow( 10.0, fabs(interval) ); + // Determine the initial and final major indexes for the actual visible range + NSInteger initialIndex = (NSInteger)lrint( floor(modMinLimit / multiplier) ); // can be negative + NSInteger finalIndex = (NSInteger)lrint( ceil(modMaxLimit / multiplier) ); // can be negative - // Determine minor interval - double minorInterval = intervalStep * 0.9 * pow( 10.0, floor( CPTLogModulus(minLimit) ) ) / minorTicks; + if ( initialIndex < 0 ) { + // Determine minor interval + double minorInterval = intervalStep * 0.9 * multiplier / minorTicks; - // Determine the initial and final major indexes for the actual visible range - NSInteger initialIndex = (NSInteger)lrint( floor( CPTLogModulus( minLimit / fabs(interval) ) ) ); // can be negative - NSInteger finalIndex = (NSInteger)lrint( ceil( CPTLogModulus( maxLimit / fabs(interval) ) ) ); // can be negative + for ( NSInteger i = MIN(0, finalIndex); i >= initialIndex; i-- ) { + double pointLocation; + double sign = -multiplier; - // Iterate through the indexes with visible ticks and build the locations sets - for ( NSInteger i = initialIndex; i <= finalIndex; i++ ) { - double pointLocation = pow(10.0, i * interval); - for ( NSUInteger j = 1; j < minorTicks; j++ ) { - double minorPointLocation = pointLocation + minorInterval * j; - if ( minorPointLocation < minLimit ) { + if ( multiplier < 1.0 ) { + pointLocation = sign * pow(10.0, fabs( (double)i ) - 1.0); + } + else { + pointLocation = sign * pow( 10.0, fabs( (double)i ) ); + } + + for ( NSUInteger j = 1; j < minorTicks; j++ ) { + double minorPointLocation = pointLocation + sign * minorInterval * j; + if ( minorPointLocation < minLimit ) { + continue; + } + if ( minorPointLocation > maxLimit ) { + continue; + } + [minorLocations addObject:@(minorPointLocation)]; + } + minorInterval *= intervalStep; + + if ( i == 0 ) { + pointLocation = 0.0; + } + if ( pointLocation < minLimit ) { continue; } - if ( minorPointLocation > maxLimit ) { + if ( pointLocation > maxLimit ) { continue; } - [minorLocations addObject:@(minorPointLocation)]; + [majorLocations addObject:@(pointLocation)]; } - minorInterval *= intervalStep; + } - if ( pointLocation < minLimit ) { - continue; - } - if ( pointLocation > maxLimit ) { - continue; + if ( finalIndex >= 0 ) { + // Determine minor interval + double minorInterval = intervalStep * 0.9 * multiplier / minorTicks; + + for ( NSInteger i = MAX(0, initialIndex); i <= finalIndex; i++ ) { + double pointLocation; + double sign = multiplier; + + if ( multiplier < 1.0 ) { + pointLocation = sign * pow(10.0, fabs( (double)i ) - 1.0); + } + else { + pointLocation = sign * pow( 10.0, fabs( (double)i ) ); + } + + for ( NSUInteger j = 1; j < minorTicks; j++ ) { + double minorPointLocation = pointLocation + sign * minorInterval * j; + if ( minorPointLocation < minLimit ) { + continue; + } + if ( minorPointLocation > maxLimit ) { + continue; + } + [minorLocations addObject:@(minorPointLocation)]; + } + minorInterval *= intervalStep; + + if ( i == 0 ) { + pointLocation = 0.0; + } + if ( pointLocation < minLimit ) { + continue; + } + if ( pointLocation > maxLimit ) { + continue; + } + [majorLocations addObject:@(pointLocation)]; } - [majorLocations addObject:@(pointLocation)]; } } break; diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index 502c8cfc1..8835dc852 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -152,6 +152,7 @@ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2 /// @name Log Modulus Definition /// @{ double CPTLogModulus(double value); +double CPTInverseLogModulus(double value); /// @} diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 22c93ab5c..5b64efeeb 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -1018,11 +1018,37 @@ BOOL CPTEdgeInsetsEqualToEdgeInsets(CPTEdgeInsets insets1, CPTEdgeInsets insets2 } #pragma mark - -#pragma mark Log Modulus Definition +#pragma mark Log Modulus +/** @brief Computes the log modulus of the given value. + * @param value The value. + * @return The log modulus of the given value. + * @see A log transformation of positive and negative values for more information about the log-modulus transformation. + **/ double CPTLogModulus(double value) { - double sign = (value < 0) ? -1.0 : +1.0; + if ( value != 0.0 ) { + double sign = (signbit(value) ? -1.0 : +1.0); + + return sign * log10(fabs(value) + 1.0); + } + else { + return 0.0; + } +} + +/** @brief Computes the inverse log modulus of the given value. + * @param value The value. + * @return The inverse log modulus of the given value. + **/ +double CPTInverseLogModulus(double value) +{ + if ( value != 0.0 ) { + double sign = (signbit(value) ? -1.0 : +1.0); - return sign * log10(fabs(value) + 1); + return sign * (pow( 10.0, fabs(value) ) - 1.0); + } + else { + return 0.0; + } } diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 52d2b74a2..922f4732a 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -723,7 +723,7 @@ -(NSNumber *)defaultTitleLocation double loc = axisRange.locationDouble; double end = axisRange.endDouble; - location = @( pow(10.0, ( CPTLogModulus(loc) + CPTLogModulus(end) ) / 2.0) ); + location = @( CPTInverseLogModulus( ( CPTLogModulus(loc) + CPTLogModulus(end) ) / 2.0 ) ); } break; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index a46ba1a41..f729d2539 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -24,11 +24,15 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nulla -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; + -(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength; -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; + -(CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange; -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shift momentumTime:(CGFloat)momentumTime speed:(CGFloat)speed acceleration:(CGFloat)acceleration; -(CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement; @@ -904,26 +908,10 @@ -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotR return pow(10.0, coordinate); } -// Log-modulus --(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength logModulusPlotRange:(CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord -{ - if ( !range ) { - return CPTFloat(0.0); - } - - NSDecimal factor = CPTDecimalDivide(CPTDecimalSubtract(plotCoord, range.locationDecimal), range.lengthDecimal); - if ( NSDecimalIsNotANumber(&factor) ) { - factor = CPTDecimalFromInteger(0); - } - - NSDecimal viewCoordinate = CPTDecimalMultiply(viewLength, factor); - - return CPTDecimalCGFloatValue(viewCoordinate); -} - +// Log-modulus (only one version since there are no transcendental functions for NSDecimal) -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord { - if ( !range || (range.lengthDouble == 0.0) ) { + if ( !range ) { return CPTFloat(0.0); } @@ -944,7 +932,7 @@ -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModul double logEnd = CPTLogModulus(range.endDouble); double coordinate = viewLength * (logEnd - logLoc) / boundsLength + logLoc; - return pow(10.0, coordinate); + return CPTInverseLogModulus(coordinate); } /// @endcond From 8280ff1d7752a98cc54c89216bb7a0b37cfbd786 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 11 Sep 2015 14:11:16 -0400 Subject: [PATCH 068/429] Added the log modulus scale type to the plot space demo in the Plot Gallery app. --- .../CorePlotGallery/src/plots/PlotSpaceDemo.m | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m index f7e125bfa..f9cb8efde 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m @@ -67,7 +67,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // Plot Spaces CPTXYPlotSpace *linearPlotSpace = [[CPTXYPlotSpace alloc] init]; linearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@100.0]; - linearPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@4.5 length:@(-4.0)]; + linearPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@6.5 length:@(-6.0)]; CPTXYPlotSpace *negativeLinearPlotSpace = [[CPTXYPlotSpace alloc] init]; negativeLinearPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@100.0 length:@(-100.0)]; @@ -83,11 +83,23 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP negativeLogPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@100.0 length:@(-99.9)]; negativeLogPlotSpace.yRange = linearPlotSpace.yRange; + CPTXYPlotSpace *logModulusPlotSpace = [[CPTXYPlotSpace alloc] init]; + logModulusPlotSpace.xScaleType = CPTScaleTypeLogModulus; + logModulusPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) length:@1100.0]; + logModulusPlotSpace.yRange = linearPlotSpace.yRange; + + CPTXYPlotSpace *negativeLogModulusPlotSpace = [[CPTXYPlotSpace alloc] init]; + negativeLogModulusPlotSpace.xScaleType = CPTScaleTypeLogModulus; + negativeLogModulusPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.1 length:@(-0.2)]; + negativeLogModulusPlotSpace.yRange = linearPlotSpace.yRange; + [graph removePlotSpace:graph.defaultPlotSpace]; [graph addPlotSpace:linearPlotSpace]; [graph addPlotSpace:negativeLinearPlotSpace]; [graph addPlotSpace:logPlotSpace]; [graph addPlotSpace:negativeLogPlotSpace]; + [graph addPlotSpace:logModulusPlotSpace]; + [graph addPlotSpace:negativeLogModulusPlotSpace]; // Axes // Linear axis--positive direction @@ -111,7 +123,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP negativeLinearAxis.plotSpace = negativeLinearPlotSpace; negativeLinearAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; negativeLinearAxis.orthogonalPosition = @2.0; - negativeLinearAxis.minorTicksPerInterval = 9; + negativeLinearAxis.minorTicksPerInterval = 4; negativeLinearAxis.tickDirection = CPTSignNone; negativeLinearAxis.axisLineStyle = axisLineStyle; negativeLinearAxis.majorTickLength = majorTickLength; @@ -127,7 +139,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP logAxis.plotSpace = logPlotSpace; logAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; logAxis.orthogonalPosition = @3.0; - logAxis.minorTicksPerInterval = 9; + logAxis.minorTicksPerInterval = 8; logAxis.tickDirection = CPTSignNone; logAxis.axisLineStyle = axisLineStyle; logAxis.majorTickLength = majorTickLength; @@ -143,7 +155,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP negativeLogAxis.plotSpace = negativeLogPlotSpace; negativeLogAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; negativeLogAxis.orthogonalPosition = @4.0; - negativeLogAxis.minorTicksPerInterval = 9; + negativeLogAxis.minorTicksPerInterval = 4; negativeLogAxis.tickDirection = CPTSignNone; negativeLogAxis.axisLineStyle = axisLineStyle; negativeLogAxis.majorTickLength = majorTickLength; @@ -154,8 +166,40 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP negativeLogAxis.titleTextStyle = axisTitleTextStyle; negativeLogAxis.titleOffset = titleOffset; + // Log modulus axis--positive direction + CPTXYAxis *logModulusAxis = [[CPTXYAxis alloc] init]; + logModulusAxis.plotSpace = logModulusPlotSpace; + logModulusAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + logModulusAxis.orthogonalPosition = @5.0; + logModulusAxis.minorTicksPerInterval = 8; + logModulusAxis.tickDirection = CPTSignNone; + logModulusAxis.axisLineStyle = axisLineStyle; + logModulusAxis.majorTickLength = majorTickLength; + logModulusAxis.majorTickLineStyle = majorTickLineStyle; + logModulusAxis.minorTickLength = minorTickLength; + logModulusAxis.minorTickLineStyle = minorTickLineStyle; + logModulusAxis.title = @"Log Modulus Plot Space—Positive Length"; + logModulusAxis.titleTextStyle = axisTitleTextStyle; + logModulusAxis.titleOffset = titleOffset; + + // Log modulus axis--negative direction + CPTXYAxis *negativeLogModulusAxis = [[CPTXYAxis alloc] init]; + negativeLogModulusAxis.plotSpace = negativeLogModulusPlotSpace; + negativeLogModulusAxis.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + negativeLogModulusAxis.orthogonalPosition = @6.0; + negativeLogModulusAxis.minorTicksPerInterval = 4; + negativeLogModulusAxis.tickDirection = CPTSignNone; + negativeLogModulusAxis.axisLineStyle = axisLineStyle; + negativeLogModulusAxis.majorTickLength = majorTickLength; + negativeLogModulusAxis.majorTickLineStyle = majorTickLineStyle; + negativeLogModulusAxis.minorTickLength = minorTickLength; + negativeLogModulusAxis.minorTickLineStyle = minorTickLineStyle; + negativeLogModulusAxis.title = @"Log Modulus Plot Space—Negative Length"; + negativeLogModulusAxis.titleTextStyle = axisTitleTextStyle; + negativeLogModulusAxis.titleOffset = titleOffset; + // Add axes to the graph - graph.axisSet.axes = @[linearAxis, negativeLinearAxis, logAxis, negativeLogAxis]; + graph.axisSet.axes = @[linearAxis, negativeLinearAxis, logAxis, negativeLogAxis, logModulusAxis, negativeLogModulusAxis]; } @end From 9ee86dbdf186ba8be8642c5e36731468202fc1a9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 11 Sep 2015 14:12:23 -0400 Subject: [PATCH 069/429] Added unit tests for the log modulus axis scale and related calculations. --- framework/Source/CPTUtilitiesTests.m | 22 ++++ framework/Source/CPTXYPlotSpaceTests.m | 142 +++++++++++++++++++++++++ 2 files changed, 164 insertions(+) diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index 119baa1c9..b7fa9dc42 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -578,4 +578,26 @@ -(void)testCPTAlignIntegralRectToUserSpace XCTAssertEqual(alignedRect.size.height, CPTFloat(0.0), @"round height (19.6364, 16.00001, 20.2727, 0.0)"); } +-(void)testLogModulus +{ + XCTAssertEqual(CPTLogModulus(0.0), 0.0, @"CPTLogModulus(0.0)"); + + XCTAssertEqual(CPTLogModulus(10.0), log10(11.0), @"CPTLogModulus(10.0)"); + XCTAssertEqual(CPTLogModulus(-10.0), -log10(11.0), @"CPTLogModulus(-10.0)"); + + XCTAssertEqual(CPTLogModulus(100.0), log10(101.0), @"CPTLogModulus(100.0)"); + XCTAssertEqual(CPTLogModulus(-100.0), -log10(101.0), @"CPTLogModulus(-100.0)"); +} + +-(void)testInverseLogModulus +{ + XCTAssertEqual(CPTInverseLogModulus(0.0), 0.0, @"CPTInverseLogModulus(0.0)"); + + XCTAssertEqualWithAccuracy(CPTInverseLogModulus( log10(11.0) ), 10.0, 1.0e-7, @"CPTInverseLogModulus(log10(11.0))"); + XCTAssertEqualWithAccuracy(CPTInverseLogModulus( -log10(11.0) ), -10.0, 1.0e-7, @"CPTInverseLogModulus(-log10(11.0))"); + + XCTAssertEqualWithAccuracy(CPTInverseLogModulus( log10(101.0) ), 100.0, 1.0e-7, @"CPTInverseLogModulus(log10(101.0))"); + XCTAssertEqualWithAccuracy(CPTInverseLogModulus( -log10(101.0) ), -100.0, 1.0e-7, @"CPTInverseLogModulus(-log10(101.0))"); +} + @end diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 3266369ff..9140f1bd0 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -228,6 +228,73 @@ -(void)testViewPointForDoublePrecisionPlotPointLog XCTAssertEqualWithAccuracy(viewPoint.y, -CPTFloat(25.0), CPTFloat(0.01), @""); } +#pragma mark - +#pragma mark View point for plot point (log modulus) + +-(void)testViewPointForPlotPointArrayLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + NSArray *plotPoint = @[@9.0, @0.0]; + + CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(74.95), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); +} + +-(void)testViewPointForPlotPointLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + NSDecimal plotPoint[2]; + plotPoint[CPTCoordinateX] = CPTDecimalFromInteger(9); + plotPoint[CPTCoordinateY] = CPTDecimalFromInteger(0); + + CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(74.95), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); +} + +-(void)testViewPointForDoublePrecisionPlotPointLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + double plotPoint[2]; + plotPoint[CPTCoordinateX] = 9.0; + plotPoint[CPTCoordinateY] = 0.0; + + CGPoint viewPoint = [plotSpace plotAreaViewPointForDoublePrecisionPlotPoint:plotPoint numberOfCoordinates:2]; + + XCTAssertEqualWithAccuracy(viewPoint.x, CPTFloat(74.95), CPTFloat(0.01), @""); + XCTAssertEqualWithAccuracy(viewPoint.y, CPTFloat(25.0), CPTFloat(0.01), @""); +} + #pragma mark - #pragma mark Plot point for view point (linear) @@ -376,6 +443,81 @@ -(void)testDoublePrecisionPlotPointForViewPointLog XCTAssertEqual(plotPoint[CPTCoordinateY], sqrt(10.0), @"%@", errMessage); } +#pragma mark - +#pragma mark Plot point for view point (log modulus) + +-(void)testPlotPointArrayForViewPointLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + CGPoint viewPoint = CPTPointMake(74.95, 25.0); + NSArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + NSString *errMessage; + + [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; + XCTAssertEqualWithAccuracy([plotPoint[CPTCoordinateX] doubleValue], CPTInverseLogModulus(1.0), CPTFloat(0.01), @"%@", errMessage); + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", plotPoint[CPTCoordinateY]]; + XCTAssertEqual([plotPoint[CPTCoordinateY] doubleValue], 0.0, @"%@", errMessage); +} + +-(void)testPlotPointForViewPointLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + NSDecimal plotPoint[2]; + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + NSString *errMessage; + + [plotSpace plotPoint:plotPoint numberOfCoordinates:2 forPlotAreaViewPoint:viewPoint]; + + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", NSDecimalString(&plotPoint[CPTCoordinateX], nil)]; + XCTAssertTrue(CPTDecimalEquals( plotPoint[CPTCoordinateX], CPTDecimalFromInteger(0) ), @"%@", errMessage); + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", NSDecimalString(&plotPoint[CPTCoordinateY], nil)]; + XCTAssertTrue(CPTDecimalEquals( plotPoint[CPTCoordinateY], CPTDecimalFromInteger(0) ), @"%@", errMessage); +} + +-(void)testDoublePrecisionPlotPointForViewPointLogModulus +{ + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; + + plotSpace.xScaleType = CPTScaleTypeLogModulus; + plotSpace.yScaleType = CPTScaleTypeLogModulus; + + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@(-100.0) + length:@200.0]; + + double plotPoint[2]; + CGPoint viewPoint = CPTPointMake(74.95, 25.0); + NSString *errMessage; + + [plotSpace doublePrecisionPlotPoint:plotPoint numberOfCoordinates:2 forPlotAreaViewPoint:viewPoint]; + + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %g", plotPoint[CPTCoordinateX]]; + XCTAssertEqualWithAccuracy(plotPoint[CPTCoordinateX], CPTInverseLogModulus(1.0), CPTFloat(0.01), @"%@", errMessage); + errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %g", plotPoint[CPTCoordinateY]]; + XCTAssertEqual(plotPoint[CPTCoordinateY], 0.0, @"%@", errMessage); +} + #pragma mark - #pragma mark Constrain ranges From b7ca2f3cb01fc2a143e719c2c5fbd5a98a115bad Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 11 Sep 2015 14:24:20 -0400 Subject: [PATCH 070/429] Added missing break statements in -debugQuickLookObject. --- framework/Source/CPTXYPlotSpace.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index f729d2539..7217a0de4 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -1850,6 +1850,7 @@ -(id)debugQuickLookObject case CPTScaleTypeLogModulus: xScaleTypeDesc = @"CPTScaleTypeLogModulus"; + break; case CPTScaleTypeAngular: xScaleTypeDesc = @"CPTScaleTypeAngular"; @@ -1883,6 +1884,7 @@ -(id)debugQuickLookObject case CPTScaleTypeLogModulus: yScaleTypeDesc = @"CPTScaleTypeLogModulus"; + break; case CPTScaleTypeAngular: yScaleTypeDesc = @"CPTScaleTypeAngular"; From 86dcb3d0788da5538c447d30948da7a5ea4ef899 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 12 Sep 2015 18:48:37 -0400 Subject: [PATCH 071/429] Added the iOS framework to the release script. --- framework/CorePlot.xcodeproj/project.pbxproj | 8 ++++++-- scripts/README Creating a release package.md | 2 +- scripts/createrelease.py | 10 ++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 6d90d1113..3388af718 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2803,8 +2803,8 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2996,6 +2996,8 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -3026,6 +3028,8 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 0ba3e8c78..158b830d4 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -5,7 +5,7 @@ Follow these steps to create a Core Plot release and post it to GitHub: 1. Ensure the following tools are installed on your development machine:
    -
  • Xcode 5
  • +
  • Xcode 7
  • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.9.1 or later, installed in /Applications
  • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.34.0 or later
diff --git a/scripts/createrelease.py b/scripts/createrelease.py index 9b41bc119..be1044bbc 100755 --- a/scripts/createrelease.py +++ b/scripts/createrelease.py @@ -63,13 +63,19 @@ def RunXcode(project, target): # Build Mac Framework chdir('framework') -RunXcode('CorePlot.xcodeproj', 'CorePlot') +RunXcode('CorePlot.xcodeproj', 'CorePlot Mac') macProductsDir = join(projectRoot, 'build/Release') macFramework = join(macProductsDir, 'CorePlot.framework') copytree(macFramework, join(macosDir, 'CorePlot.framework'), symlinks=True) +# Build iOS Framework +RunXcode('CorePlot.xcodeproj', 'CorePlot iOS') +iOSProductsDir = join(projectRoot, 'build/Release') +iOSFramework = join(iOSProductsDir, 'CorePlot.framework') +copytree(iOSFramework, join(iosDir, 'CorePlot.framework'), symlinks=True) + # Build iOS Static Library -RunXcode('CorePlot-CocoaTouch.xcodeproj', 'Universal Library') +RunXcode('CorePlot.xcodeproj', 'Universal Library') iOSLibFile = join(join(projectRoot, 'build/Release-universal'), 'libCorePlot-CocoaTouch.a') copy(iOSLibFile, iosDir) iOSHeaderFile = join(join(projectRoot, 'build/Release-universal'), 'CorePlotHeaders') From 9698ad07c0911883a252f58dbf1c8e429464ddd2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Sep 2015 19:24:41 -0400 Subject: [PATCH 072/429] Fixed text drawing on OS X 10.11 (El Capitan). Fixed issue #210. --- framework/MacOnly/CPTPlatformSpecificFunctions.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index c2ba07e3e..705a0aa1a 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -24,13 +24,16 @@ void CPTPushCGContext(CGContextRef newContext) dispatch_sync(contextQueue, ^{ NSGraphicsContext *currentContext = [NSGraphicsContext currentContext]; - if ( newContext && currentContext ) { + if ( currentContext ) { [pushedContexts addObject:currentContext]; - [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:newContext flipped:NO]]; } else { [pushedContexts addObject:[NSNull null]]; } + + if ( newContext ) { + [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:newContext flipped:NO]]; + } }); } @@ -53,6 +56,10 @@ void CPTPopCGContext(void) if ( [lastContext isKindOfClass:[NSGraphicsContext class]] ) { [NSGraphicsContext setCurrentContext:lastContext]; } + else { + [NSGraphicsContext setCurrentContext:nil]; + } + [pushedContexts removeLastObject]; } }); From 6c512e6a35a31113386601d372d36a8ef3c1605d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 25 Sep 2015 10:50:59 -0400 Subject: [PATCH 073/429] Automatically resolve git merge conflicts in Xcode project.pbxproj files. --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..8e45d030f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pbxproj merge=union From e1b972be10b1ad856fe3f8f675ece1cde071ea2f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 26 Sep 2015 14:37:31 -0400 Subject: [PATCH 074/429] Enabled some new compiler and static analyzer warnings. --- framework/CorePlotWarnings.xcconfig | 44 ++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/framework/CorePlotWarnings.xcconfig b/framework/CorePlotWarnings.xcconfig index f439551f7..e58ab0d36 100644 --- a/framework/CorePlotWarnings.xcconfig +++ b/framework/CorePlotWarnings.xcconfig @@ -4,6 +4,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES GCC_WARN_SHADOW = YES GCC_WARN_64_TO_32_BIT_CONVERSION = YES CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES +GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES GCC_WARN_ABOUT_RETURN_TYPE = YES GCC_WARN_MISSING_PARENTHESES = YES @@ -11,12 +12,15 @@ GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES GCC_WARN_ABOUT_MISSING_NEWLINE = YES GCC_WARN_SIGN_COMPARE = YES +CLANG_WARN_EMPTY_BODY = YES CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES -GCC_WARN_UNINITIALIZED_AUTOS = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE GCC_WARN_UNUSED_FUNCTION = YES GCC_WARN_UNUSED_LABEL = YES GCC_WARN_UNUSED_VALUE = YES GCC_WARN_UNUSED_VARIABLE = YES +CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE +GCC_WARN_UNUSED_PARAMETER = YES GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES CLANG_WARN_ASSIGN_ENUM = YES @@ -29,5 +33,43 @@ CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES CLANG_WARN_OBJC_RECEIVER_WEAK = YES +GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES +GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES +CLANG_WARN_BOOL_CONVERSION = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_INT_CONVERSION = YES +CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES +GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES +GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES +GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES +GCC_WARN_UNKNOWN_PRAGMAS = YES +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES +CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = NO +GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES +GCC_WARN_STRICT_SELECTOR_MATCH = NO +CLANG_WARN_OBJC_ROOT_CLASS = YES +CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES + +ENABLE_STRICT_OBJC_MSGSEND = YES + +CLANG_ANALYZER_DEADCODE_DEADSTORES = YES +CLANG_ANALYZER_MEMORY_MANAGEMENT = YES +CLANG_ANALYZER_GCD = YES +CLANG_ANALYZER_OBJC_ATSYNC = YES +CLANG_ANALYZER_OBJC_NSCFERROR = YES +CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES = YES +CLANG_ANALYZER_OBJC_COLLECTIONS = YES +CLANG_ANALYZER_OBJC_UNUSED_IVARS = YES +CLANG_ANALYZER_OBJC_SELF_INIT = YES +CLANG_ANALYZER_OBJC_RETAIN_COUNT = YES +CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES +CLANG_ANALYZER_SECURITY_KEYCHAIN_API = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-incompatible-pointer-types-discards-qualifiers From 88d538f0bf255d7ed388068fd90e7d1fa886efab Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 26 Sep 2015 14:38:39 -0400 Subject: [PATCH 075/429] Fixed a compiler warning in CPTLineStyle. --- framework/Source/CPTLineStyle.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index 0f2074fa6..c4263415a 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -302,7 +302,8 @@ -(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)co CGPathRef path = CGContextCopyPath(context); CGContextBeginPath(context); - for ( CGFloat width = startWidth; width > CPTFloat(0.0); width -= step ) { + CGFloat width = startWidth; + while ( width > CPTFloat(0.0) ) { CGContextSetLineWidth(context, width); CGColorRef gradientColor = [gradient newColorAtPosition:CPTFloat(1.0) - width / startWidth]; @@ -311,6 +312,8 @@ -(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)co CGContextAddPath(context, path); CGContextStrokePath(context); + + width -= step; } CGPathRelease(path); From 9f699581352ab26a81a3810a1681e0e3f4d79a07 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 26 Sep 2015 14:39:15 -0400 Subject: [PATCH 076/429] Enabled the standard Core Plot warnings in all of the example apps. --- .../project.pbxproj | 16 ++--- .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 16 ++--- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 16 ++--- .../project.pbxproj | 16 ++--- .../CPTTestApp.xcodeproj/project.pbxproj | 64 ++++++++++++++++++- .../project.pbxproj | 16 ++--- .../project.pbxproj | 4 +- .../DatePlot.xcodeproj/project.pbxproj | 16 ++--- .../DropPlot.xcodeproj/project.pbxproj | 16 ++--- .../project.pbxproj | 16 ++--- .../RangePlot.xcodeproj/project.pbxproj | 16 ++--- .../StockPlot.xcodeproj/project.pbxproj | 12 ++-- 12 files changed, 142 insertions(+), 82 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index b7fdaaa44..28cf3a510 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -209,8 +209,8 @@ children = ( BC21A97F1035BEAF00FED2A4 /* CorePlot.framework */, A8F18CF511FA634B00B2C42F /* UnitTests.xctest */, - C3B925EB1ADF1CBE00C67086 /* CorePlot_iOS.framework */, - C3B925ED1ADF1CBE00C67086 /* CorePlot_iOSTests.xctest */, + C3B925EB1ADF1CBE00C67086 /* CorePlot.framework */, + C3B925ED1ADF1CBE00C67086 /* UnitTests iOS.xctest */, C3B925EF1ADF1CBE00C67086 /* libCorePlot-CocoaTouch.a */, C3B925F11ADF1CBE00C67086 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -289,17 +289,17 @@ remoteRef = BC21A97E1035BEAF00FED2A4 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B925EB1ADF1CBE00C67086 /* CorePlot_iOS.framework */ = { + C3B925EB1ADF1CBE00C67086 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3B925EA1ADF1CBE00C67086 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B925ED1ADF1CBE00C67086 /* CorePlot_iOSTests.xctest */ = { + C3B925ED1ADF1CBE00C67086 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3B925EC1ADF1CBE00C67086 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -387,6 +387,7 @@ /* Begin XCBuildConfiguration section */ 1DEB913B08733D840010E9CD /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */; buildSettings = { ADDITIONAL_SDKS = ""; CLANG_ENABLE_OBJC_ARC = YES; @@ -411,6 +412,7 @@ }; 1DEB913C08733D840010E9CD /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */; buildSettings = { ADDITIONAL_SDKS = ""; CLANG_ENABLE_OBJC_ARC = YES; @@ -433,7 +435,6 @@ }; 1DEB913F08733D840010E9CD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; @@ -446,7 +447,6 @@ }; 1DEB914008733D840010E9CD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index de5e897e8..43faa0509 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -241,8 +241,8 @@ children = ( C3D414891A7D836300B6F5D6 /* CorePlot.framework */, C3D4148B1A7D836300B6F5D6 /* UnitTests.xctest */, - C3D4148D1A7D836300B6F5D6 /* CorePlot_iOS.framework */, - C3D4148F1A7D836300B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D4148D1A7D836300B6F5D6 /* CorePlot.framework */, + C3D4148F1A7D836300B6F5D6 /* UnitTests iOS.xctest */, C3D414911A7D836300B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D414931A7D836300B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -323,17 +323,17 @@ remoteRef = C3D4148A1A7D836300B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D4148D1A7D836300B6F5D6 /* CorePlot_iOS.framework */ = { + C3D4148D1A7D836300B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D4148C1A7D836300B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D4148F1A7D836300B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D4148F1A7D836300B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D4148E1A7D836300B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -391,6 +391,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -416,6 +417,7 @@ }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -439,7 +441,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; @@ -457,7 +458,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index 4a581a7db..19d935d12 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -186,8 +186,8 @@ children = ( C3D414A21A7D843800B6F5D6 /* CorePlot.framework */, C3D414A41A7D843800B6F5D6 /* UnitTests.xctest */, - C3D414A61A7D843800B6F5D6 /* CorePlot_iOS.framework */, - C3D414A81A7D843800B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414A61A7D843800B6F5D6 /* CorePlot.framework */, + C3D414A81A7D843800B6F5D6 /* UnitTests iOS.xctest */, C3D414AA1A7D843800B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D414AC1A7D843800B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -262,17 +262,17 @@ remoteRef = C3D414A31A7D843800B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414A61A7D843800B6F5D6 /* CorePlot_iOS.framework */ = { + C3D414A61A7D843800B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D414A51A7D843800B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414A81A7D843800B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D414A81A7D843800B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D414A71A7D843800B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -324,6 +324,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -345,6 +346,7 @@ }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -365,7 +367,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; @@ -388,7 +389,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 30e248d7c..32267f186 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -197,8 +197,8 @@ children = ( C3D414BB1A7D846500B6F5D6 /* CorePlot.framework */, C3D414BD1A7D846500B6F5D6 /* UnitTests.xctest */, - C3D414BF1A7D846500B6F5D6 /* CorePlot_iOS.framework */, - C3D414C11A7D846500B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414BF1A7D846500B6F5D6 /* CorePlot.framework */, + C3D414C11A7D846500B6F5D6 /* UnitTests iOS.xctest */, C3D414C31A7D846500B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D414C51A7D846500B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -274,17 +274,17 @@ remoteRef = C3D414BC1A7D846500B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414BF1A7D846500B6F5D6 /* CorePlot_iOS.framework */ = { + C3D414BF1A7D846500B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D414BE1A7D846500B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414C11A7D846500B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D414C11A7D846500B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D414C01A7D846500B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -341,6 +341,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -369,6 +370,7 @@ }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -395,7 +397,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -422,7 +423,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CODE_SIGN_IDENTITY = "iPhone Distribution"; diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index 14b7ee536..5b33b6d51 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -48,6 +48,34 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C371E4D01BB714EC00AC18DB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09781A46185200D45436; + remoteInfo = "CorePlot iOS"; + }; + C371E4D21BB714EC00AC18DB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09821A46185300D45436; + remoteInfo = "UnitTests iOS"; + }; + C371E4D41BB714EC00AC18DB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09BA1A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouch"; + }; + C371E4D61BB714EC00AC18DB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C38A09C41A4619A900D45436; + remoteInfo = "CorePlot-CocoaTouchTests"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -115,6 +143,10 @@ children = ( 07032B6A11ABB9E000463D20 /* CorePlot.framework */, 07032B6C11ABB9E000463D20 /* UnitTests.xctest */, + C371E4D11BB714EC00AC18DB /* CorePlot.framework */, + C371E4D31BB714EC00AC18DB /* UnitTests iOS.xctest */, + C371E4D51BB714EC00AC18DB /* libCorePlot-CocoaTouch.a */, + C371E4D71BB714EC00AC18DB /* CorePlot-CocoaTouchTests.xctest */, ); name = Products; sourceTree = ""; @@ -286,6 +318,34 @@ remoteRef = 07032B6B11ABB9E000463D20 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C371E4D11BB714EC00AC18DB /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C371E4D01BB714EC00AC18DB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C371E4D31BB714EC00AC18DB /* UnitTests iOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests iOS.xctest"; + remoteRef = C371E4D21BB714EC00AC18DB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C371E4D51BB714EC00AC18DB /* libCorePlot-CocoaTouch.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libCorePlot-CocoaTouch.a"; + remoteRef = C371E4D41BB714EC00AC18DB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C371E4D71BB714EC00AC18DB /* CorePlot-CocoaTouchTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "CorePlot-CocoaTouchTests.xctest"; + remoteRef = C371E4D61BB714EC00AC18DB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -343,6 +403,7 @@ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -366,6 +427,7 @@ }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -386,7 +448,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; @@ -403,7 +464,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index 28d44e5cf..cb13e841e 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -356,8 +356,8 @@ children = ( 4F4892891290FFCD00EDB93F /* CorePlot.framework */, 4F48928B1290FFCD00EDB93F /* UnitTests.xctest */, - C3D4146F1A7D824700B6F5D6 /* CorePlot_iOS.framework */, - C3D414711A7D824700B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D4146F1A7D824700B6F5D6 /* CorePlot.framework */, + C3D414711A7D824700B6F5D6 /* UnitTests iOS.xctest */, C3D414731A7D824700B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D414751A7D824700B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -435,17 +435,17 @@ remoteRef = 4F48928A1290FFCD00EDB93F /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D4146F1A7D824700B6F5D6 /* CorePlot_iOS.framework */ = { + C3D4146F1A7D824700B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3D4146E1A7D824700B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414711A7D824700B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D414711A7D824700B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3D414701A7D824700B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -550,6 +550,7 @@ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -577,6 +578,7 @@ }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -603,7 +605,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -624,7 +625,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index c2b8be908..ca64dd1c6 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -525,6 +525,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -554,6 +555,7 @@ }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -582,7 +584,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; ENABLE_TESTABILITY = YES; @@ -598,7 +599,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index 380cce142..45c1c2087 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -123,8 +123,8 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, - C3F04DB81B44CCFD0002322A /* CorePlot_iOS.framework */, - C3F04DBA1B44CCFD0002322A /* CorePlot_iOSTests.xctest */, + C3F04DB81B44CCFD0002322A /* CorePlot.framework */, + C3F04DBA1B44CCFD0002322A /* UnitTests iOS.xctest */, C3F04DBC1B44CCFD0002322A /* libCorePlot-CocoaTouch.a */, C3F04DBE1B44CCFD0002322A /* CorePlot-CocoaTouchTests.xctest */, ); @@ -287,17 +287,17 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3F04DB81B44CCFD0002322A /* CorePlot_iOS.framework */ = { + C3F04DB81B44CCFD0002322A /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3F04DB71B44CCFD0002322A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3F04DBA1B44CCFD0002322A /* CorePlot_iOSTests.xctest */ = { + C3F04DBA1B44CCFD0002322A /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3F04DB91B44CCFD0002322A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -364,6 +364,7 @@ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -390,6 +391,7 @@ }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -412,7 +414,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; @@ -430,7 +431,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { GCC_C_LANGUAGE_STANDARD = c99; GCC_PREPROCESSOR_DEFINITIONS = ""; diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 2a474ec61..1f23532df 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -215,8 +215,8 @@ children = ( BC93AA970FDEFEAC00606226 /* CorePlot.framework */, 07E0DFAC109C4EB500F108D2 /* UnitTests.xctest */, - C3B345A81B46194500844218 /* CorePlot_iOS.framework */, - C3B345AA1B46194500844218 /* CorePlot_iOSTests.xctest */, + C3B345A81B46194500844218 /* CorePlot.framework */, + C3B345AA1B46194500844218 /* UnitTests iOS.xctest */, C3B345AC1B46194500844218 /* libCorePlot-CocoaTouch.a */, C3B345AE1B46194500844218 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -294,17 +294,17 @@ remoteRef = BC93AA960FDEFEAC00606226 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345A81B46194500844218 /* CorePlot_iOS.framework */ = { + C3B345A81B46194500844218 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3B345A71B46194500844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345AA1B46194500844218 /* CorePlot_iOSTests.xctest */ = { + C3B345AA1B46194500844218 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3B345A91B46194500844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -398,6 +398,7 @@ /* Begin XCBuildConfiguration section */ C05733C808A9546B00998B17 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -419,6 +420,7 @@ }; C05733C908A9546B00998B17 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -439,7 +441,6 @@ }; C05733CC08A9546B00998B17 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; @@ -458,7 +459,6 @@ }; C05733CD08A9546B00998B17 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index d88b1f2d3..e86adfcd8 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -124,8 +124,8 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, - C3B345B81B46195100844218 /* CorePlot_iOS.framework */, - C3B345BA1B46195100844218 /* CorePlot_iOSTests.xctest */, + C3B345B81B46195100844218 /* CorePlot.framework */, + C3B345BA1B46195100844218 /* UnitTests iOS.xctest */, C3B345BC1B46195100844218 /* libCorePlot-CocoaTouch.a */, C3B345BE1B46195100844218 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -288,17 +288,17 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345B81B46195100844218 /* CorePlot_iOS.framework */ = { + C3B345B81B46195100844218 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3B345B71B46195100844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345BA1B46195100844218 /* CorePlot_iOSTests.xctest */ = { + C3B345BA1B46195100844218 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3B345B91B46195100844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -365,6 +365,7 @@ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -388,6 +389,7 @@ }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -408,7 +410,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; @@ -426,7 +427,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { GCC_C_LANGUAGE_STANDARD = c99; GCC_PREPROCESSOR_DEFINITIONS = ""; diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index 972be9e61..ca14f5aae 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -126,8 +126,8 @@ children = ( 076184C10F3CAD5900A89A76 /* CorePlot.framework */, 07E0DF80109C4E9500F108D2 /* UnitTests.xctest */, - C3B345C81B46195900844218 /* CorePlot_iOS.framework */, - C3B345CA1B46195900844218 /* CorePlot_iOSTests.xctest */, + C3B345C81B46195900844218 /* CorePlot.framework */, + C3B345CA1B46195900844218 /* UnitTests iOS.xctest */, C3B345CC1B46195900844218 /* libCorePlot-CocoaTouch.a */, C3B345CE1B46195900844218 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -290,17 +290,17 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345C81B46195900844218 /* CorePlot_iOS.framework */ = { + C3B345C81B46195900844218 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; - path = CorePlot_iOS.framework; + path = CorePlot.framework; remoteRef = C3B345C71B46195900844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3B345CA1B46195900844218 /* CorePlot_iOSTests.xctest */ = { + C3B345CA1B46195900844218 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; - path = CorePlot_iOSTests.xctest; + path = "UnitTests iOS.xctest"; remoteRef = C3B345C91B46195900844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -367,6 +367,7 @@ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -390,6 +391,7 @@ }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -410,7 +412,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; @@ -428,7 +429,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { GCC_C_LANGUAGE_STANDARD = c99; GCC_PREPROCESSOR_DEFINITIONS = ""; diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index b1971c5ea..b81d6fd11 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -213,8 +213,8 @@ children = ( C3D414D41A7D84BF00B6F5D6 /* CorePlot.framework */, C3D414D61A7D84BF00B6F5D6 /* UnitTests.xctest */, - C3D414D81A7D84BF00B6F5D6 /* CorePlot_iOS.framework */, - C3D414DA1A7D84BF00B6F5D6 /* CorePlot_iOSTests.xctest */, + C3D414D81A7D84BF00B6F5D6 /* CorePlot.framework */, + C3D414DA1A7D84BF00B6F5D6 /* UnitTests iOS.xctest */, C3D414DC1A7D84BF00B6F5D6 /* libCorePlot-CocoaTouch.a */, C3D414DE1A7D84BF00B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, ); @@ -295,14 +295,14 @@ remoteRef = C3D414D51A7D84BF00B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414D81A7D84BF00B6F5D6 /* CorePlot_iOS.framework */ = { + C3D414D81A7D84BF00B6F5D6 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; path = CorePlot.framework; remoteRef = C3D414D71A7D84BF00B6F5D6 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - C3D414DA1A7D84BF00B6F5D6 /* CorePlot_iOSTests.xctest */ = { + C3D414DA1A7D84BF00B6F5D6 /* UnitTests iOS.xctest */ = { isa = PBXReferenceProxy; fileType = wrapper.cfbundle; path = "UnitTests iOS.xctest"; @@ -364,6 +364,7 @@ /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -385,6 +386,7 @@ }; 1D6058950D05DD3E006BFB54 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -404,7 +406,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; @@ -426,7 +427,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; From 880beddd2e583205c4fc4722e39430ff4f1d4e40 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 26 Sep 2015 15:36:54 -0400 Subject: [PATCH 077/429] Fixed a memory management error in CPTUtilitiesTests. --- framework/Source/CPTUtilitiesTests.m | 35 +++++++++++++++++++++------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index b7fa9dc42..75726a79e 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -21,20 +21,22 @@ -(void)setUp CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); #endif - self.context = CGBitmapContextCreate(NULL, - width, - height, - bitsPerComponent, - width * bitsPerComponent * 4, - colorSpace, - (CGBitmapInfo)kCGImageAlphaNoneSkipLast); + CGContextRef testContext = CGBitmapContextCreate(NULL, + width, + height, + bitsPerComponent, + width * bitsPerComponent * 4, + colorSpace, + (CGBitmapInfo)kCGImageAlphaNoneSkipLast); + self.context = testContext; + + CGContextRelease(testContext); CGColorSpaceRelease(colorSpace); } -(void)tearDown { - CGContextRelease(self.context); self.context = NULL; } @@ -600,4 +602,21 @@ -(void)testInverseLogModulus XCTAssertEqualWithAccuracy(CPTInverseLogModulus( -log10(101.0) ), -100.0, 1.0e-7, @"CPTInverseLogModulus(-log10(101.0))"); } +/// @endcond + +#pragma mark - +#pragma mark Accessors + +/// @cond + +-(void)setContext:(CGContextRef)newContext +{ + if ( context != newContext ) { + CGContextRetain(newContext); + CGContextRelease(context); + + context = newContext; + } +} + @end From bf945574d14a357ec747cb1e94ce8707adf6a8ad Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Sep 2015 20:24:31 -0400 Subject: [PATCH 078/429] Created separate xcconfig files for debug and release configurations. Removed build settings that override the defaults set in the config files. --- .../project.pbxproj | 2 +- .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 2 +- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 2 +- .../project.pbxproj | 2 +- .../CPTTestApp.xcodeproj/project.pbxproj | 2 +- .../project.pbxproj | 2 +- .../project.pbxproj | 2 +- .../DatePlot.xcodeproj/project.pbxproj | 2 +- .../DropPlot.xcodeproj/project.pbxproj | 3 +- .../project.pbxproj | 2 +- .../RangePlot.xcodeproj/project.pbxproj | 2 +- .../StockPlot.xcodeproj/project.pbxproj | 2 +- .../project.pbxproj | 31 +-- framework/CorePlot.xcconfig | 9 - framework/CorePlot.xcodeproj/project.pbxproj | 221 ++++-------------- framework/xcconfig/CorePlot.xcconfig | 25 ++ framework/xcconfig/CorePlotDebug.xcconfig | 7 + framework/xcconfig/CorePlotRelease.xcconfig | 7 + .../{ => xcconfig}/CorePlotWarnings.xcconfig | 1 - 19 files changed, 98 insertions(+), 228 deletions(-) delete mode 100644 framework/CorePlot.xcconfig create mode 100644 framework/xcconfig/CorePlot.xcconfig create mode 100644 framework/xcconfig/CorePlotDebug.xcconfig create mode 100644 framework/xcconfig/CorePlotRelease.xcconfig rename framework/{ => xcconfig}/CorePlotWarnings.xcconfig (98%) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 28cf3a510..c0faaf4df 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -121,7 +121,7 @@ A8FC1815102CBADE00CF2266 /* CPTScatterPlotPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTScatterPlotPlugin.m; sourceTree = ""; }; A8FC1817102CBAEA00CF2266 /* CPTBarPlotPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTBarPlotPlugin.h; sourceTree = ""; }; A8FC1818102CBAEA00CF2266 /* CPTBarPlotPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTBarPlotPlugin.m; sourceTree = ""; }; - C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3C8CFF619E9504C007E0BCB /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index 43faa0509..caef8976d 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -104,7 +104,7 @@ AB8F94560FDEFA1500E61485 /* APYahooDataPuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APYahooDataPuller.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; AB8F94570FDEFA1500E61485 /* APYahooDataPuller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APYahooDataPuller.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ABA5345D0FEB40CE0046A8DA /* AAPL.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AAPL.plist; sourceTree = ""; }; - C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3CA9B5819E1F79B008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD282F17DE9B9C008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936B19FD6B1D00148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AAPLot/Images.xcassets; sourceTree = ""; }; C3D4147C1A7D836300B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index 19d935d12..6267f298b 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -85,7 +85,7 @@ 8D1107310486CEB800E47090 /* CPTTestApp_iPad-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CPTTestApp_iPad-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; BC65758E116549890008F594 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; C34677AD19F3341700429A85 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; - C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C36E7CC519DE1C1F00EDEACB /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD283817DE9C59008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3935F19FD670400148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "CPTTestApp-iPad/Images.xcassets"; sourceTree = ""; }; C3D414951A7D843800B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 32267f186..4d4aea1dd 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -95,7 +95,7 @@ C359603619CE34FB005CDFB9 /* ScatterPlotController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScatterPlotController.swift; sourceTree = ""; }; C359603B19CE352A005CDFB9 /* CPTTestApp-iPhone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "CPTTestApp-iPhone-Bridging-Header.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3B9F9D317503CDD001CCC50 /* BlueTexture.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BlueTexture.png; sourceTree = ""; }; - C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3C3CBDE19EA125D00A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD283D17DE9C95008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936319FD671100148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "CPTTestApp-iPhone/Images.xcassets"; sourceTree = ""; }; C3D414AE1A7D846500B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index 5b33b6d51..ed3708f2f 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -120,7 +120,7 @@ C38017DC124132020052B00D /* SelectionDemo.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SelectionDemo.xib; path = Resources/SelectionDemo.xib; sourceTree = ""; }; C38017DF124132610052B00D /* SelectionDemoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SelectionDemoController.h; path = Source/SelectionDemoController.h; sourceTree = ""; }; C38017E0124132610052B00D /* SelectionDemoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SelectionDemoController.m; path = Source/SelectionDemoController.m; sourceTree = ""; }; - C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3880C3919DCD6A000ED0618 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3D3935B19FD653300148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = CPTTestApp/Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index cb13e841e..349d83792 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -172,7 +172,7 @@ C3A14BEB13AEB7E700D103EA /* RangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RangePlot.m; path = src/plots/RangePlot.m; sourceTree = ""; }; C3A31A5414DF782A00734AB7 /* ColoredBarChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColoredBarChart.h; path = src/plots/ColoredBarChart.h; sourceTree = ""; }; C3A31A5514DF782A00734AB7 /* ColoredBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ColoredBarChart.m; path = src/plots/ColoredBarChart.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3D2FE6219FF1D03002CD4D6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = img/Images.xcassets; sourceTree = ""; }; C3D70BA4175EB29E00F27173 /* ImageDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImageDemo.h; path = src/plots/ImageDemo.h; sourceTree = ""; }; C3D70BA5175EB29E00F27173 /* ImageDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ImageDemo.m; path = src/plots/ImageDemo.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index ca64dd1c6..137fde5d2 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -186,7 +186,7 @@ C3A14C1413AEE7CC00D103EA /* RangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RangePlot.m; path = src/plots/RangePlot.m; sourceTree = ""; }; C3A31A5714DF783500734AB7 /* ColoredBarChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColoredBarChart.h; path = src/plots/ColoredBarChart.h; sourceTree = ""; }; C3A31A5814DF783500734AB7 /* ColoredBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ColoredBarChart.m; path = src/plots/ColoredBarChart.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD282917DE9A7E008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = img/Images.xcassets; sourceTree = ""; }; C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index 45c1c2087..dba45ca8d 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -100,7 +100,7 @@ C33E19A7198330CA00182AF2 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = Source/main.swift; sourceTree = ""; }; C3A1443E197DE35F0048F1FF /* DatePlot-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DatePlot-Bridging-Header.h"; sourceTree = ""; }; C3A1443F197DE35F0048F1FF /* DateController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DateController.swift; path = Source/DateController.swift; sourceTree = ""; }; - C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3D3937319FD6E3500148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DatePlot/Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 1f23532df..b0831599d 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -107,7 +107,7 @@ BC93AAF40FDF3F0200606226 /* NSString+ParseCSV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+ParseCSV.h"; sourceTree = ""; }; BC93AAF50FDF3F0200606226 /* NSString+ParseCSV.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+ParseCSV.m"; sourceTree = ""; }; C3D3937719FD705000148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DropPlot/Images.xcassets; sourceTree = ""; }; - C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -444,7 +444,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ENABLE_TESTABILITY = YES; - FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../framework/build/$(CONFIGURATION)\"/**"; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_TREAT_WARNINGS_AS_ERRORS = YES; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index e86adfcd8..affdc166e 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -101,7 +101,7 @@ 8D1107320486CEB800E47090 /* minorTickFormatter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = minorTickFormatter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 90AF4F430F36CF1800753D26 /* minorTickFormatter.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = minorTickFormatter.xib; sourceTree = ""; }; BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3D3937B19FD732200148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = minorTickFormatter/Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index ca14f5aae..02922ac22 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -102,7 +102,7 @@ 8D1107320486CEB800E47090 /* RangePlot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RangePlot.app; sourceTree = BUILT_PRODUCTS_DIR; }; 90AF4F430F36CF1800753D26 /* RangePlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RangePlot.xib; sourceTree = ""; }; BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3D3938119FD786F00148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RangePlot/Images.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index b81d6fd11..0fa908096 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -104,7 +104,7 @@ AB6FA60B0FEB6DAA008DB04A /* GOOG.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = GOOG.plist; sourceTree = SOURCE_ROOT; }; AB6FA60C0FEB6DAA008DB04A /* AAPL.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AAPL.plist; sourceTree = SOURCE_ROOT; }; C36157E819D79AAC0036ACDA /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; - C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/CorePlotWarnings.xcconfig; sourceTree = ""; }; + C3CA9B5B19E203B2008DF7A3 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3CD284717DE9D1F008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3D3936F19FD6CBF00148319 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = StockPlot/Images.xcassets; sourceTree = ""; }; C3D414C71A7D84BF00B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 8c60b1b89..84e62f117 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -337,6 +337,8 @@ BCC7EA421006BF5700B39451 /* _CPTPlainWhiteTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTPlainWhiteTheme.m; path = Source/_CPTPlainWhiteTheme.m; sourceTree = ""; }; BCC7EA431006BF5700B39451 /* _CPTStocksTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTStocksTheme.h; path = Source/_CPTStocksTheme.h; sourceTree = ""; }; BCC7EA441006BF5700B39451 /* _CPTStocksTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTStocksTheme.m; path = Source/_CPTStocksTheme.m; sourceTree = ""; }; + C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotDebug.xcconfig; path = xcconfig/CorePlotDebug.xcconfig; sourceTree = ""; }; + C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotRelease.xcconfig; path = xcconfig/CorePlotRelease.xcconfig; sourceTree = ""; }; C304565213F4AC9A004D04BC /* _CPTDarkGradientTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTDarkGradientTheme.h; path = Source/_CPTDarkGradientTheme.h; sourceTree = ""; }; C30550E71399BE2000E0151F /* CPTLegendEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLegendEntry.h; path = Source/CPTLegendEntry.h; sourceTree = ""; }; C30550E81399BE2000E0151F /* CPTLegendEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLegendEntry.m; path = Source/CPTLegendEntry.m; sourceTree = ""; }; @@ -345,7 +347,7 @@ C30E97A014B290650012204A /* DoxygenLayout.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = DoxygenLayout.xml; path = ../documentation/doxygen/DoxygenLayout.xml; sourceTree = ""; }; C318F4BF11EA18A400595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLimitBand.h; path = Source/CPTLimitBand.h; sourceTree = ""; }; C318F4C011EA18A400595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLimitBand.m; path = Source/CPTLimitBand.m; sourceTree = ""; }; - C31908A3199813D400B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlot.xcconfig; sourceTree = ""; }; + C31908A3199813D400B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlot.xcconfig; path = xcconfig/CorePlot.xcconfig; sourceTree = ""; }; C31A40BD17ABD6C60020C5C6 /* CPTFunctionDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTFunctionDataSource.h; path = Source/CPTFunctionDataSource.h; sourceTree = ""; }; C31A40BE17ABD6C60020C5C6 /* CPTFunctionDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTFunctionDataSource.m; path = Source/CPTFunctionDataSource.m; sourceTree = ""; }; C3286C0515D8769800A436A8 /* _CPTMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTMaskLayer.h; path = Source/_CPTMaskLayer.h; sourceTree = ""; }; @@ -361,7 +363,7 @@ C3436C5013F4AC6000739AC2 /* _CPTSlateTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTSlateTheme.h; path = Source/_CPTSlateTheme.h; sourceTree = ""; }; C349DCAE151AAFAB00BFD6A7 /* CPTCalendarFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTCalendarFormatter.h; path = Source/CPTCalendarFormatter.h; sourceTree = ""; }; C349DCAF151AAFAB00BFD6A7 /* CPTCalendarFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTCalendarFormatter.m; path = Source/CPTCalendarFormatter.m; sourceTree = ""; }; - C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlotWarnings.xcconfig; sourceTree = ""; }; + C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C3566B8C10EED17400FB3866 /* doxygen touch.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = SOURCE_ROOT; }; C3566B8D10EED17400FB3866 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = SOURCE_ROOT; }; C3566B8E10EED1B000FB3866 /* mainpage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mainpage.h; path = Source/mainpage.h; sourceTree = ""; }; @@ -623,6 +625,8 @@ BC89A7991024AB19009D5261 /* CorePlotProbes.d */, BC9B83C20FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h */, C3D9825016BD406600DE7977 /* CorePlot_Prefix.pch */, + C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */, + C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */, C31908A3199813D400B61898 /* CorePlot.xcconfig */, C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */, ); @@ -1220,16 +1224,12 @@ }; BC9B83480FB8A0A50035D8DA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A3199813D400B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_SYMBOL_SEPARATION = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - OTHER_CPTLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; PRODUCT_NAME = "CorePlot-CocoaTouch"; PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; }; @@ -1237,34 +1237,23 @@ }; BC9B83490FB8A0A50035D8DA /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A3199813D400B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_SYMBOL_SEPARATION = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - OTHER_CPTLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; PRODUCT_NAME = "CorePlot-CocoaTouch"; PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; - ZERO_LINK = NO; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; - ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - SKIP_INSTALL = YES; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1273,14 +1262,10 @@ isa = XCBuildConfiguration; buildSettings = { DEPLOYMENT_POSTPROCESSING = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; SDKROOT = iphoneos; - SKIP_INSTALL = YES; - STRIP_INSTALLED_PRODUCT = YES; - SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/framework/CorePlot.xcconfig b/framework/CorePlot.xcconfig deleted file mode 100644 index 6eb1e454f..000000000 --- a/framework/CorePlot.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -#include "CorePlotWarnings.xcconfig" - -SYMROOT = $(PROJECT_DIR)/../build -COPY_PHASE_STRIP = YES -STRIP_STYLE = debugging -SEPARATE_STRIP = YES -GCC_C_LANGUAGE_STANDARD = c99 -DEAD_CODE_STRIPPING = YES -CLANG_ENABLE_OBJC_ARC = YES diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index afe3bd3f8..095bb22de 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -804,7 +804,7 @@ C30E979F14B290520012204A /* DoxygenLayout.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = DoxygenLayout.xml; path = ../documentation/doxygen/DoxygenLayout.xml; sourceTree = ""; }; C318F4AB11EA188700595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLimitBand.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C318F4AC11EA188700595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLimitBand.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C31908A41998168C00B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlot.xcconfig; sourceTree = ""; }; + C31908A41998168C00B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlot.xcconfig; path = xcconfig/CorePlot.xcconfig; sourceTree = ""; }; C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = ""; }; @@ -842,7 +842,7 @@ C34AFE6A11021D010041675A /* CPTPlotSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotSymbol.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C34BF5BA10A67633007F0894 /* CPTPlotArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotArea.h; sourceTree = ""; }; C34BF5BB10A67633007F0894 /* CPTPlotArea.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotArea.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CorePlotWarnings.xcconfig; sourceTree = ""; }; + C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; C36468A80FE5533F0064B186 /* CPTTextStyleTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTextStyleTests.h; sourceTree = ""; }; C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextStyleTests.m; sourceTree = ""; }; C36E89B811EE7F97003DE309 /* CPTPlotRangeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRangeTests.h; sourceTree = ""; }; @@ -891,6 +891,8 @@ C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimationPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C9CB15165DB52C00739006 /* _CPTAnimationCGFloatPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGFloatPeriod.h; sourceTree = ""; }; C3C9CB16165DB52C00739006 /* _CPTAnimationCGFloatPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationCGFloatPeriod.m; sourceTree = ""; }; + C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotDebug.xcconfig; path = xcconfig/CorePlotDebug.xcconfig; sourceTree = ""; }; + C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotRelease.xcconfig; path = xcconfig/CorePlotRelease.xcconfig; sourceTree = ""; }; C3CADDC511B167AD00D36017 /* CPTMutableNumericDataTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableNumericDataTests.h; sourceTree = ""; }; C3CADDC611B167AD00D36017 /* CPTMutableNumericDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableNumericDataTests.m; sourceTree = ""; }; C3CAFB241229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CPTMutableNumericData+TypeConversion.h"; sourceTree = ""; }; @@ -1366,6 +1368,8 @@ 32DBCF5E0370ADEE00C91783 /* CorePlot_Prefix.pch */, 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */, C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */, + C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */, + C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */, C31908A41998168C00B61898 /* CorePlot.xcconfig */, C34F570D19D8CE5500446248 /* CorePlotWarnings.xcconfig */, ); @@ -2033,6 +2037,9 @@ BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 0610; TargetAttributes = { + 8DC2EF4F0486A6940098B216 = { + DevelopmentTeam = 28ZA45DE7D; + }; C38A09771A46185200D45436 = { CreatedOnToolsVersion = 6.1.1; }; @@ -2589,70 +2596,46 @@ /* Begin XCBuildConfiguration section */ 0730F602109492D900E95162 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = UnitTests; SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; }; name = Debug; }; 0730F603109492D900E95162 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; + MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = UnitTests; SDKROOT = macosx; - USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; ZERO_LINK = NO; }; name = Release; }; 1DEB91AE08733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - ONLY_ACTIVE_ARCH = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = CorePlot; SDKROOT = macosx; - SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; WRAPPER_EXTENSION = framework; }; @@ -2660,24 +2643,18 @@ }; 1DEB91AF08733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = CorePlot; SDKROOT = macosx; - SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; - VALIDATE_PRODUCT = YES; - "VALID_ARCHS[sdk=*]" = "i386 x86_64"; WRAPPER_EXTENSION = framework; }; name = Release; @@ -2685,36 +2662,12 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - LINKER_DISPLAYS_MANGLED_NAMES = NO; - MACOSX_DEPLOYMENT_TARGET = 10.7; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ""; - RUN_CLANG_STATIC_ANALYZER = NO; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Debug; }; 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_POSTPROCESSING = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREPROCESSOR_DEFINITIONS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - LINKER_DISPLAYS_MANGLED_NAMES = NO; - MACOSX_DEPLOYMENT_TARGET = 10.7; - OTHER_LDFLAGS = ""; - RUN_CLANG_STATIC_ANALYZER = NO; - STRIP_INSTALLED_PRODUCT = YES; - SYMROOT = "$(PROJECT_DIR)/../build"; - "VALID_ARCHS[sdk=*]" = ""; }; name = Release; }; @@ -2724,7 +2677,6 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; - GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = Documentation; @@ -2746,23 +2698,17 @@ }; C38A098B1A46185300D45436 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -2775,32 +2721,25 @@ MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Debug; }; C38A098C1A46185300D45436 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "$(SRCROOT)/CorePlot_iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -2808,41 +2747,28 @@ MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "arm64 armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = "i386 x86_64"; }; name = Release; }; C38A098D1A46185300D45436 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -2851,71 +2777,50 @@ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-framework", - XCTest, - ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Debug; }; C38A098E1A46185300D45436 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-framework", - XCTest, - ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALIDATE_PRODUCT = YES; }; name = Release; }; @@ -2925,7 +2830,6 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; - GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Documentation-Mac copy"; @@ -2951,7 +2855,6 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; - GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Documentation-iOS copy"; @@ -2977,18 +2880,12 @@ }; C38A09CC1A4619A900D45436 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -2996,73 +2893,54 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACOSX_DEPLOYMENT_TARGET = ""; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALID_ARCHS = "arm64 armv7 armv7s"; }; name = Debug; }; C38A09CD1A4619A900D45436 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=*]" = "iPhone Developer"; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACOSX_DEPLOYMENT_TARGET = ""; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "arm64 armv7 armv7s"; - "VALID_ARCHS[sdk=*]" = "arm64 armv7 armv7s"; - "VALID_ARCHS[sdk=iphonesimulator*]" = "i386 x86_64"; }; name = Release; }; C38A09CF1A4619A900D45436 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -3071,71 +2949,50 @@ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-framework", - XCTest, - ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Debug; }; C38A09D01A4619A900D45436 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C31908A41998168C00B61898 /* CorePlot.xcconfig */; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = CorePlot_Prefix.pch; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-framework", - XCTest, - ); PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; - VALIDATE_PRODUCT = YES; }; name = Release; }; diff --git a/framework/xcconfig/CorePlot.xcconfig b/framework/xcconfig/CorePlot.xcconfig new file mode 100644 index 000000000..44cbeb3c3 --- /dev/null +++ b/framework/xcconfig/CorePlot.xcconfig @@ -0,0 +1,25 @@ +#include "CorePlotWarnings.xcconfig" + +ARCHS = $(ARCHS_STANDARD) +VALID_ARCHS[sdk=iphoneos*] = arm64 armv7 armv7s +VALID_ARCHS[sdk=iphonesimulator*] = i386 x86_64 +VALID_ARCHS[sdk=macosx*] = i386 x86_64 + +SYMROOT = $(PROJECT_DIR)/../build +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym +COMBINE_HIDPI_IMAGES = YES +COPY_PHASE_STRIP = YES +STRIP_STYLE = debugging +SEPARATE_STRIP = YES +SKIP_INSTALL = YES +GCC_C_LANGUAGE_STANDARD = c99 +GCC_DYNAMIC_NO_PIC = NO +GCC_PRECOMPILE_PREFIX_HEADER = YES +GCC_PREFIX_HEADER = CorePlot_Prefix.pch +DEAD_CODE_STRIPPING = YES +CLANG_ENABLE_OBJC_ARC = YES +LINKER_DISPLAYS_MANGLED_NAMES = NO +RUN_CLANG_STATIC_ANALYZER = YES +CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION = deep +CLANG_STATIC_ANALYZER_MODE = shallow +OTHER_LDFLAGS = -ObjC diff --git a/framework/xcconfig/CorePlotDebug.xcconfig b/framework/xcconfig/CorePlotDebug.xcconfig new file mode 100644 index 000000000..3f9fd3ea8 --- /dev/null +++ b/framework/xcconfig/CorePlotDebug.xcconfig @@ -0,0 +1,7 @@ +#include "CorePlot.xcconfig" + +ONLY_ACTIVE_ARCH = YES +VALIDATE_PRODUCT = NO +DEPLOYMENT_POSTPROCESSING = NO +STRIP_INSTALLED_PRODUCT = NO +GCC_OPTIMIZATION_LEVEL = 0 diff --git a/framework/xcconfig/CorePlotRelease.xcconfig b/framework/xcconfig/CorePlotRelease.xcconfig new file mode 100644 index 000000000..37ae757b0 --- /dev/null +++ b/framework/xcconfig/CorePlotRelease.xcconfig @@ -0,0 +1,7 @@ +#include "CorePlot.xcconfig" + +ONLY_ACTIVE_ARCH = NO +VALIDATE_PRODUCT = YES +DEPLOYMENT_POSTPROCESSING = YES +STRIP_INSTALLED_PRODUCT = YES +GCC_OPTIMIZATION_LEVEL = s diff --git a/framework/CorePlotWarnings.xcconfig b/framework/xcconfig/CorePlotWarnings.xcconfig similarity index 98% rename from framework/CorePlotWarnings.xcconfig rename to framework/xcconfig/CorePlotWarnings.xcconfig index e58ab0d36..6b596ba98 100644 --- a/framework/CorePlotWarnings.xcconfig +++ b/framework/xcconfig/CorePlotWarnings.xcconfig @@ -21,7 +21,6 @@ GCC_WARN_UNUSED_VALUE = YES GCC_WARN_UNUSED_VARIABLE = YES CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE GCC_WARN_UNUSED_PARAMETER = YES -GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES CLANG_WARN_ASSIGN_ENUM = YES CLANG_WARN__DUPLICATE_METHOD_MATCH = YES From c8731e6ea3327e3793df803edce4ba4fa06c546c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Sep 2015 20:33:18 -0400 Subject: [PATCH 079/429] Shared the Mac and iOS framework schemes for Carthage compatibility. --- .../xcschemes/CorePlot Mac.xcscheme | 82 +++++++++++++ .../xcschemes/CorePlot iOS.xcscheme | 114 ++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot iOS.xcscheme diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme new file mode 100644 index 000000000..0303058a1 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot iOS.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot iOS.xcscheme new file mode 100644 index 000000000..3a99c4c25 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot iOS.xcscheme @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b6dad611659a4ede940f71eb79f6165b8bbb4da1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Sep 2015 21:00:34 -0400 Subject: [PATCH 080/429] Fixed a bad link in the project readme file. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7f06d994..74e9d9dfe 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Core Plot is a 2D plotting framework for Mac OS X and iOS. It is highly customiz # Getting Started -See the [High Level Design Overview](https://github.com/core-plot/core-plot/wiki/High-Level-Design-Overview) wiki for an overview of Core Plot's architecture and the [Using Core Plot in an Application](http://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications) wiki for information on how to use Core Plot in your own application. +See the [High Level Design Overview](https://github.com/core-plot/core-plot/wiki/High-Level-Design-Overview) wiki for an overview of Core Plot's architecture and the [Using Core Plot in an Application](https://github.com/core-plot/core-plot/wiki/Using-Core-Plot-in-an-Application) wiki for information on how to use Core Plot in your own application. # Documentation From 7905c4a7240839ed84c03b29592fbaae082453b5 Mon Sep 17 00:00:00 2001 From: Jerome Morissard Date: Tue, 29 Sep 2015 10:12:47 +0200 Subject: [PATCH 081/429] FIX:iOS5 support. NSForegroundColorAttributeName -> iOS6 --- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 53da4765c..6a099cc89 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -260,8 +260,12 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG context:nil]; } else { - UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; - [styleColor set]; + BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); + + if (hasColorAttributeName) { + UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; + [styleColor set]; + } UIFont *theFont = nil; NSString *fontName = style.fontName; @@ -279,9 +283,14 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG #pragma clang diagnostic pop } #else - UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; - [styleColor set]; + + BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); + if (hasColorAttributeName) { + UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; + [styleColor set]; + } + UIFont *theFont = [UIFont fontWithName:style.fontName size:style.fontSize]; [self drawInRect:rect From e20e9e10b2aee515bcbb41e2723af7741168c32d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 2 Oct 2015 19:40:23 -0400 Subject: [PATCH 082/429] Updated Travis builds to use Xcode 7. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 067d42d10..5702ae579 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: objective-c +osx_image: xcode7 env: SDK:iphonesimulator From d8b20de869c7765c589aeb2cb4fe7dc2ac5efb24 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 2 Oct 2015 20:51:53 -0400 Subject: [PATCH 083/429] Updated documentation to use Doxygen 1.8.10 and GraphViz 2.36.0. --- documentation/doxygen/doxygen touch.config | 56 ++++++++++++++------ documentation/doxygen/doxygen.config | 56 ++++++++++++++------ scripts/README Creating a release package.md | 4 +- 3 files changed, 80 insertions(+), 36 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 9d62214e5..a510a9239 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.9.1 +# Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -362,6 +362,13 @@ IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent @@ -774,7 +781,7 @@ WARN_LOGFILE = # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with -# spaces. +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = "$(SOURCE_ROOT)/CorePlot-CocoaTouch.h" \ @@ -792,12 +799,17 @@ INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, +# *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = @@ -1174,8 +1186,9 @@ HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO @@ -1649,9 +1662,12 @@ COMPACT_LATEX = NO PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. To get the times font for -# instance you can specify -# EXTRA_PACKAGES=times +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2255,7 +2271,8 @@ INCLUDED_BY_GRAPH = YES # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2266,7 +2283,8 @@ CALL_GRAPH = NO # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2289,11 +2307,15 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, jpg, gif and svg. +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 6324933d5..297937e81 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.9.1 +# Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -362,6 +362,13 @@ IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent @@ -774,7 +781,7 @@ WARN_LOGFILE = # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with -# spaces. +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = "$(SOURCE_ROOT)/CorePlot.h" \ @@ -792,12 +799,17 @@ INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, +# *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = @@ -1174,8 +1186,9 @@ HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO @@ -1649,9 +1662,12 @@ COMPACT_LATEX = NO PAPER_TYPE = letter # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names -# that should be included in the LaTeX output. To get the times font for -# instance you can specify -# EXTRA_PACKAGES=times +# that should be included in the LaTeX output. The package can be specified just +# by its name or with the correct syntax as to be used with the LaTeX +# \usepackage command. To get the times font for instance you can specify : +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} +# To use the option intlimits with the amsmath package you can specify: +# EXTRA_PACKAGES=[intlimits]{amsmath} # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2253,7 +2269,8 @@ INCLUDED_BY_GRAPH = YES # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2264,7 +2281,8 @@ CALL_GRAPH = NO # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2287,11 +2305,15 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# http://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, jpg, gif and svg. +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 0ba3e8c78..49a2d9717 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -6,8 +6,8 @@ Follow these steps to create a Core Plot release and post it to GitHub:
  • Xcode 5
  • -
  • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.9.1 or later, installed in /Applications
  • -
  • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.34.0 or later
  • +
  • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.10 or later, installed in /Applications
  • +
  • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.36.0 or later
2. Ensure the [change log](https://github.com/core-plot/core-plot/blob/master/documentation/changelog.markdown) and [podspec](https://github.com/core-plot/core-plot/blob/master/CorePlot.podspec) are up-to-date and committed to the Git repository. From 22b0d240ec48090facc7444c51fc86315c374290 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 3 Oct 2015 16:43:36 -0400 Subject: [PATCH 084/429] Removed some unused #defines. --- framework/Source/CPTDefinitions.h | 33 ------------------------------- 1 file changed, 33 deletions(-) diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 7564f3149..6ca6a5350 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -55,39 +55,6 @@ #define cpt_deprecated __attribute__( (deprecated) ) -// Nullability - -/** - * @def cpt_nullable - * @hideinitializer - * @brief Marks a pointer declaration as nullable. - **/ - -/** - * @def cpt_nonnull - * @hideinitializer - * @brief Marks a pointer declaration as non-null. - **/ - -#if __clang__ && ( ( (__clang_major__ == 6) && (__clang_minor__ >= 1 ) ) || (__clang_major__ > 6 ) ) -// nullable symbols are already defined -#else -#define nullable -#define nonnull -#define __nullable -#define __nonnull -#endif - -// Deprecated methods - -/** - * @def cpt_deprecated - * @hideinitializer - * @brief Marks a method declaration as deprecated. - **/ - -#define cpt_deprecated __attribute__( (deprecated) ) - // Type safety defines /** From 8509d67838bb1342f8a8f1a08e6977b39c6a14ff Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 3 Oct 2015 16:44:18 -0400 Subject: [PATCH 085/429] Added NSMutableDictionary and NSMutableSet to the Doxygen tags files. --- documentation/doxygen/doxygen-cocoa-tags.xml | 18 ++++++++++++++++++ .../doxygen/doxygen-cocoa-touch-tags.xml | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/documentation/doxygen/doxygen-cocoa-tags.xml b/documentation/doxygen/doxygen-cocoa-tags.xml index 956632492..e34cb8fe6 100644 --- a/documentation/doxygen/doxygen-cocoa-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-tags.xml @@ -258,6 +258,15 @@ NSFastEnumeration-p NSMutableCopying-p + + NSMutableDictionary + https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html + NSObject + NSCoding-p + NSCopying-p + NSFastEnumeration-p + NSMutableCopying-p + NSEvent https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html @@ -511,6 +520,15 @@ NSFastEnumeration-p NSMutableCopying-p + + NSMutableSet + https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableSet_Class/Reference/Reference.html + NSObject + NSCoding-p + NSCopying-p + NSFastEnumeration-p + NSMutableCopying-p + NSString https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html diff --git a/documentation/doxygen/doxygen-cocoa-touch-tags.xml b/documentation/doxygen/doxygen-cocoa-touch-tags.xml index 7b10f8fa8..46faf7b7d 100644 --- a/documentation/doxygen/doxygen-cocoa-touch-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-touch-tags.xml @@ -241,6 +241,15 @@ NSFastEnumeration-p NSMutableCopying-p + + NSMutableDictionary + https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html + NSObject + NSCoding-p + NSCopying-p + NSFastEnumeration-p + NSMutableCopying-p + UIEvent https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIEvent_Class/Reference/Reference.html @@ -440,6 +449,15 @@ NSFastEnumeration-p NSMutableCopying-p + + NSMutableSet + https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableSet_Class/Reference/Reference.html + NSObject + NSCoding-p + NSCopying-p + NSFastEnumeration-p + NSMutableCopying-p + UIResponder https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/cl/UIResponder From 9dd4623a7ec67bda71623eacf504a521b9317de3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 12:59:42 -0400 Subject: [PATCH 086/429] Standardized code formatting. --- framework/iPhoneOnly/CPTTextStylePlatformSpecific.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 6a099cc89..f3deccf7b 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -262,7 +262,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG else { BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); - if (hasColorAttributeName) { + if ( hasColorAttributeName ) { UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; [styleColor set]; } @@ -283,14 +283,13 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG #pragma clang diagnostic pop } #else - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); - if (hasColorAttributeName) { + if ( hasColorAttributeName ) { UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; [styleColor set]; } - + UIFont *theFont = [UIFont fontWithName:style.fontName size:style.fontSize]; [self drawInRect:rect From 54b570b5e503cd20ca3b292b80d98033afe88e34 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:00:53 -0400 Subject: [PATCH 087/429] =?UTF-8?q?Added=20J=C3=A9r=C3=B4me=20Morissard=20?= =?UTF-8?q?to=20the=20license.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 3706aaebe..81664507f 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Ingmar Stein, and Victor Martin Garcia. +Copyright (c) 2014, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Ingmar Stein, Victor Martin Garcia, and Jérôme Morissard. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From a56e05e1a915192360b19eef2ce1b9ab2cc6c954 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:11:21 -0400 Subject: [PATCH 088/429] Updated the documentation targets in the release script. --- scripts/createrelease.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/createrelease.py b/scripts/createrelease.py index be1044bbc..0e13224ed 100644 --- a/scripts/createrelease.py +++ b/scripts/createrelease.py @@ -82,8 +82,8 @@ def RunXcode(project, target): copytree(iOSHeaderFile, join(iosDir, 'CorePlotHeaders')) # Build Docs -RunXcode('CorePlot.xcodeproj', 'Documentation') -RunXcode('CorePlot-CocoaTouch.xcodeproj', 'Documentation') +RunXcode('CorePlot.xcodeproj', 'Documentation-Mac') +RunXcode('CorePlot.xcodeproj', 'Documentation-iOS') # Copy Docs docDir = join(releaseRootDir, 'Documentation') From d33096d94bae3e83a514edad06dd18d10818df10 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:12:21 -0400 Subject: [PATCH 089/429] Set the build directory for each project file to fix the iOS Universal Library build script. --- framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj | 2 ++ framework/CorePlot.xcodeproj/project.pbxproj | 2 ++ 2 files changed, 4 insertions(+) diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 84e62f117..1d740a8ad 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -1254,6 +1254,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; SDKROOT = iphoneos; + SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1266,6 +1267,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACH_O_TYPE = staticlib; SDKROOT = iphoneos; + SYMROOT = "$(PROJECT_DIR)/../build"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 095bb22de..0311633f5 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2662,12 +2662,14 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Debug; }; 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Release; }; From 801236f7e51ffee561906b8fb425bd91e768e560 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:13:58 -0400 Subject: [PATCH 090/429] Set version 2.0 in the podspec file. --- CorePlot-latest.podspec | 2 +- CorePlot.podspec | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index aeb90c6d0..fc7348565 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -18,7 +18,7 @@ Pod::Spec.new do |s| 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' - s.ios.deployment_target = '8.0' + s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.7' s.ios.header_dir = 'ios' diff --git a/CorePlot.podspec b/CorePlot.podspec index 5d9e4064b..38a5f8cfc 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CorePlot' - s.version = '1.6' + s.version = '2.0' s.license = 'BSD' s.summary = 'Cocoa plotting framework for Mac OS X and iOS.' s.homepage = 'https://github.com/core-plot' @@ -12,13 +12,13 @@ Pod::Spec.new do |s| 'Eric Skroch' => 'eskroch@mac.com', 'Barry Wark' => 'barrywark@gmail.com' } - s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_1.6'} + s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.0'} s.description = 'Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' - s.ios.deployment_target = '8.0' + s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.7' s.ios.header_dir = 'ios' From 2024afb417782a19d2331edc2e96033922348423 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:23:30 -0400 Subject: [PATCH 091/429] Updated the compatibility version of all Xcode project files to the latest format (Xcode 6.3). --- QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj | 4 ++-- examples/AAPLot/AAPLot.xcodeproj/project.pbxproj | 4 ++-- .../CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj | 4 ++-- .../CPTTestApp-iPhone.xcodeproj/project.pbxproj | 4 ++-- examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj | 4 ++-- .../Plot_Gallery_Mac.xcodeproj/project.pbxproj | 4 ++-- .../Plot_Gallery_iOS.xcodeproj/project.pbxproj | 4 ++-- examples/DatePlot/DatePlot.xcodeproj/project.pbxproj | 4 ++-- examples/DropPlot/DropPlot.xcodeproj/project.pbxproj | 4 ++-- .../minorTickFormatter.xcodeproj/project.pbxproj | 4 ++-- examples/RangePlot/RangePlot.xcodeproj/project.pbxproj | 4 ++-- examples/StockPlot/StockPlot.xcodeproj/project.pbxproj | 4 ++-- framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj | 4 ++-- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index c0faaf4df..4f7d5cf2e 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXAggregateTarget section */ @@ -249,7 +249,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "CorePlotQCPlugin" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj index caef8976d..c1936d1b5 100644 --- a/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj +++ b/examples/AAPLot/AAPLot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -283,7 +283,7 @@ }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AAPLot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index 6267f298b..a41fbd14c 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -223,7 +223,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPad" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 4d4aea1dd..cb532b83c 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -235,7 +235,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPhone" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index ed3708f2f..2671da8c5 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -279,7 +279,7 @@ LastUpgradeCheck = 0610; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj index 349d83792..2f0634de1 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -396,7 +396,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_Mac" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj index 137fde5d2..605153b69 100644 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -386,7 +386,7 @@ }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_iOS" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index dba45ca8d..704f45dc6 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -248,7 +248,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DatePlot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index b0831599d..a07cd5882 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -255,7 +255,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "DropPlot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index affdc166e..b49d4a8cf 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -249,7 +249,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "minorTickFormatter" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index 02922ac22..6256f4431 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -251,7 +251,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "RangePlot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj index 0fa908096..759fa8d7b 100644 --- a/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj +++ b/examples/StockPlot/StockPlot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ @@ -255,7 +255,7 @@ }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "StockPlot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj index 1d740a8ad..993f75e21 100644 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXAggregateTarget section */ @@ -1054,7 +1054,7 @@ LastUpgradeCheck = 0700; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CorePlot-CocoaTouch" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 0311633f5..486fef0cf 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXAggregateTarget section */ @@ -2055,7 +2055,7 @@ }; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "CorePlot" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( From 686e30ef9e7b7cb63f5ae8f2b0b40b18622671af Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:25:54 -0400 Subject: [PATCH 092/429] Added release notes for release 2.0. --- documentation/changelog.markdown | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 146be563e..48b9f5b5f 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,18 +1,23 @@ -# Release 2.0 (TBD) +# Release 2.0 (October 4, 2015) ## Release Notes -To be determined +This release contains changes that will break apps built against earlier Core Plot +versions. For a cleaner public API and ease of use from Swift, all public properties and methods that take `NSDecimal` values have been changed to take `NSNumber` values instead. See the [Release 2.0 API Changes](https://github.com/core-plot/core-plot/wiki/Core-Plot-API-Changes-Between-Versions-1.x-and-2.x) wiki page for a detailed list of the API changes. + +The Mac and iOS projects have been combined into one project file. The `CorePlot-CocoaTouch.xcodeproj` project file is deprecated and will be removed in a future release. There is now an iOS framework target in addition to the static library in the `CorePlot.xcodeproj` project file. + +The deployment target has increased to iOS 6.0 for the static library and iOS 8.0 for the framework. The Mac deployment target remains OS X 10.7. ## Details -- **New**: Combined the Mac and iOS projects and added an iOS framework target. +- **New**: Combined the Mac and iOS projects and added an iOS framework target. The `CorePlot-CocoaTouch.xcodeproj` project file is deprecated. - **New**: Added histogram style options to `CPTScatterPlot`. - **New**: Added iOS unit tests. - **New**: Added plot space point conversion methods that take an `NSArray` of coordinate values. - **New**: Added nullability annotations to all property and method declarations. - **New**: Added type annotations to all arrays, sets, and dictionaries. - **New**: Added the log-modulus scale type. -- **Changed**: Increased the deployment target to iOS 8.0 and Mac OS X 10.7. +- **Changed**: Increased the deployment target to iOS 6.0 and Mac OS X 10.7. The iOS framework requires iOS 8 or higher. - **Changed**: Changed the Installation Directory for the Mac framework to "@rpath" and updated the Runpath Search Path in each Mac example app. - **Changed**: Changed all public properties and methods that take `NSDecimal` values to take `NSNumber` values instead. Use `NSDecimalNumber` to maintain full decimal precision. - **Changed**: Added properties to `CPTPlotRange` and `CPTMutablePlotRange` to read and write all range properties as `NSNumber`, `NSDecimal`, or `double`. From 591f4ba0a846410d0ec56b484b50e3fa4e62a426 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 13:37:11 -0400 Subject: [PATCH 093/429] Removed some availability checks that are no longer needed in iOS 6+. --- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 7393c2d71..1152dae82 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -220,12 +220,8 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG context:nil]; } else { - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); - - if ( hasColorAttributeName ) { - UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; - [styleColor set]; - } + UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; + [styleColor set]; UIFont *theFont = nil; NSString *fontName = style.fontName; @@ -243,12 +239,8 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG #pragma clang diagnostic pop } #else - BOOL hasColorAttributeName = (&NSForegroundColorAttributeName != NULL); - - if ( hasColorAttributeName ) { - UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; - [styleColor set]; - } + UIColor *styleColor = style.attributes[NSForegroundColorAttributeName]; + [styleColor set]; UIFont *theFont = [UIFont fontWithName:style.fontName size:style.fontSize]; From 7b876f24703212c6484083e3496c4644924c53a6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 4 Oct 2015 15:10:31 -0400 Subject: [PATCH 094/429] Added universal build target for the iOS framework. --- framework/CorePlot.xcodeproj/project.pbxproj | 63 ++++++++++++++++++++ scripts/createrelease.py | 4 +- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 486fef0cf..111fa5afa 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -40,6 +40,17 @@ name = "Universal Library"; productName = Documentation; }; + C3A5467F1BC1A817005C1BBC /* Universal iOS Framework */ = { + isa = PBXAggregateTarget; + buildConfigurationList = C3A546811BC1A817005C1BBC /* Build configuration list for PBXAggregateTarget "Universal iOS Framework" */; + buildPhases = ( + C3A546801BC1A817005C1BBC /* ShellScript */, + ); + dependencies = ( + ); + name = "Universal iOS Framework"; + productName = Documentation; + }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ @@ -2078,6 +2089,7 @@ 9021E49E0FC5C9DC00443472 /* Documentation-Mac */, C38A09911A4618B600D45436 /* Documentation-iOS */, C38A09961A46193F00D45436 /* Universal Library */, + C3A5467F1BC1A817005C1BBC /* Universal iOS Framework */, ); }; /* End PBXProject section */ @@ -2162,6 +2174,19 @@ shellPath = /bin/sh; shellScript = "\nUFW_TARGET=\"CorePlot-CocoaTouch\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest iphoneos SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"iphoneos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_DIR=\"${UFW_BUILD_DIR}/Release-iphoneos\"\nUFW_SIMULATOR_DIR=\"${UFW_BUILD_DIR}/Release-iphonesimulator\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-universal\"\nUFW_HEADER_DIR=\"${UFW_UNIVERSAL_DIR}/CorePlotHeaders\"\nUFW_EXE_PATH=\"libCorePlot-CocoaTouch.a\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\nlipo -create -output \"${UFW_UNIVERSAL_DIR}/${UFW_EXE_PATH}\" \"${UFW_IPHONE_DIR}/${UFW_EXE_PATH}\" \"${UFW_SIMULATOR_DIR}/${UFW_EXE_PATH}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n\n# copy header files\nmkdir -p \"${UFW_HEADER_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp \"${SOURCE_ROOT}/CorePlot-CocoaTouch.h\" \"${UFW_HEADER_DIR}\"\ncp \"${SOURCE_ROOT}/iPhoneOnly/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\ncp \"${SOURCE_ROOT}/Source/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\n\nrm \"${UFW_HEADER_DIR}/\"*Tests.*"; }; + C3A546801BC1A817005C1BBC /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\nUFW_TARGET=\"CorePlot iOS\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest iphoneos SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"iphoneos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nFRAMEWORK_NAME=\"${PROJECT_NAME}\"\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_PATH=\"${UFW_BUILD_DIR}/Release-iphoneos/${FRAMEWORK_NAME}.framework\"\nUFW_SIMULATOR_PATH=\"${UFW_BUILD_DIR}/Release-iphonesimulator/${FRAMEWORK_NAME}.framework\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-iphoneuniversal\"\nUFW_FRAMEWORK=\"${UFW_UNIVERSAL_DIR}/${FRAMEWORK_NAME}.framework\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp -r \"${UFW_IPHONE_PATH}/.\" \"${UFW_FRAMEWORK}\"\n\nlipo -create -output \"${UFW_FRAMEWORK}/${FRAMEWORK_NAME}\" \"${UFW_SIMULATOR_PATH}/${FRAMEWORK_NAME}\" \"${UFW_IPHONE_PATH}/${FRAMEWORK_NAME}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2998,6 +3023,35 @@ }; name = Release; }; + C3A546821BC1A817005C1BBC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + }; + name = Debug; + }; + C3A546831BC1A817005C1BBC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + ZERO_LINK = NO; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -3091,6 +3145,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C3A546811BC1A817005C1BBC /* Build configuration list for PBXAggregateTarget "Universal iOS Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C3A546821BC1A817005C1BBC /* Debug */, + C3A546831BC1A817005C1BBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; diff --git a/scripts/createrelease.py b/scripts/createrelease.py index 0e13224ed..5e76c5ee2 100644 --- a/scripts/createrelease.py +++ b/scripts/createrelease.py @@ -69,8 +69,8 @@ def RunXcode(project, target): copytree(macFramework, join(macosDir, 'CorePlot.framework'), symlinks=True) # Build iOS Framework -RunXcode('CorePlot.xcodeproj', 'CorePlot iOS') -iOSProductsDir = join(projectRoot, 'build/Release') +RunXcode('CorePlot.xcodeproj', 'Universal iOS Framework') +iOSProductsDir = join(projectRoot, 'build/Release-iphoneuniversal') iOSFramework = join(iOSProductsDir, 'CorePlot.framework') copytree(iOSFramework, join(iosDir, 'CorePlot.framework'), symlinks=True) From 2cf49aee5f2fecd691a13e4862b181c37423eb28 Mon Sep 17 00:00:00 2001 From: Jesse Squires Date: Sun, 4 Oct 2015 18:51:37 -0700 Subject: [PATCH 095/429] Add status badges to README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 74e9d9dfe..e3e3703ef 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +# Core Plot + +*Cocoa plotting framework for Mac OS X and iOS.* + +[![Build Status](https://secure.travis-ci.org/core-plot/core-plot.svg)](http://travis-ci.org/core-plot/core-plot) [![Version Status](https://img.shields.io/cocoapods/v/CorePlot.svg)](https://cocoapods.org/pods/CorePlot) [![license MIT](https://img.shields.io/cocoapods/l/CorePlot.svg)](http://opensource.org/licenses/BSD-3-Clause) [![Platform](https://img.shields.io/cocoapods/p/CorePlot.svg)](http://core-plot.github.io) + # Introduction Core Plot is a 2D plotting framework for Mac OS X and iOS. It is highly customizable and capable of drawing many types of plots. See the [Example Graphs](https://github.com/core-plot/core-plot/wiki/Example-Graphs) wiki page and the [example applications](https://github.com/core-plot/core-plot/tree/master/examples) for examples of some of its capabilities. From b2becb1f025ae6a53ff3f2b826ceb1a715a78564 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:35:02 -0400 Subject: [PATCH 096/429] Renamed the info.plist for the iOS framework to use a consistent naming scheme. --- .../{CorePlot_iOS-Info.plist => CorePlot-iOS-Info.plist} | 0 framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename framework/{CorePlot_iOS-Info.plist => CorePlot-iOS-Info.plist} (100%) diff --git a/framework/CorePlot_iOS-Info.plist b/framework/CorePlot-iOS-Info.plist similarity index 100% rename from framework/CorePlot_iOS-Info.plist rename to framework/CorePlot-iOS-Info.plist diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 111fa5afa..c8c184cd9 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2741,7 +2741,7 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot_iOS-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2767,7 +2767,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot_iOS-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; From a05796830e0b9adf40c388c882884bd4a398c437 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:47:54 -0400 Subject: [PATCH 097/429] Moved all info.plist files into the Info folder. --- framework/CorePlot.xcodeproj/project.pbxproj | 36 +++++++++---------- .../{ => Info}/CorePlot-CocoaTouch-Info.plist | 0 .../CorePlot-CocoaTouchTests-Info.plist | 0 framework/{ => Info}/CorePlot-Info.plist | 0 framework/{ => Info}/CorePlot-iOS-Info.plist | 0 .../{ => Info}/CorePlot-iOSTests-Info.plist | 0 framework/{ => Info}/CorePlotTests-Info.plist | 0 7 files changed, 18 insertions(+), 18 deletions(-) rename framework/{ => Info}/CorePlot-CocoaTouch-Info.plist (100%) rename framework/{ => Info}/CorePlot-CocoaTouchTests-Info.plist (100%) rename framework/{ => Info}/CorePlot-Info.plist (100%) rename framework/{ => Info}/CorePlot-iOS-Info.plist (100%) rename framework/{ => Info}/CorePlot-iOSTests-Info.plist (100%) rename framework/{ => Info}/CorePlotTests-Info.plist (100%) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index c8c184cd9..255fd99f2 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -781,7 +781,7 @@ 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDecimalNumberExtensions.m; sourceTree = ""; }; 4CD7E9620F4B625900F9BCBB /* CPTUtilitiesTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTUtilitiesTests.h; sourceTree = ""; }; 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTUtilitiesTests.m; sourceTree = ""; }; - 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CorePlot-Info.plist"; sourceTree = ""; }; + 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "CorePlot-Info.plist"; path = "Info/CorePlot-Info.plist"; sourceTree = ""; }; 8DC2EF5B0486A6940098B216 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9021E5690FC69B2900443472 /* doxygen.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = doxygen.config; path = ../documentation/doxygen/doxygen.config; sourceTree = SOURCE_ROOT; }; 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -819,11 +819,11 @@ C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = ""; }; - C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlotTests-Info.plist"; sourceTree = SOURCE_ROOT; }; - C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-iOSTests-Info.plist"; sourceTree = SOURCE_ROOT; }; - C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-CocoaTouchTests-Info.plist"; sourceTree = SOURCE_ROOT; }; - C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot-CocoaTouch-Info.plist"; sourceTree = ""; }; - C3226A501A69F1A700F77249 /* CorePlot_iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlot_iOS-Info.plist"; sourceTree = ""; }; + C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlotTests-Info.plist"; path = "Info/CorePlotTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-iOSTests-Info.plist"; path = "Info/CorePlot-iOSTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-CocoaTouchTests-Info.plist"; path = "Info/CorePlot-CocoaTouchTests-Info.plist"; sourceTree = SOURCE_ROOT; }; + C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-CocoaTouch-Info.plist"; path = "Info/CorePlot-CocoaTouch-Info.plist"; sourceTree = ""; }; + C3226A501A69F1A700F77249 /* CorePlot-iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-iOS-Info.plist"; path = "Info/CorePlot-iOS-Info.plist"; sourceTree = ""; }; C3226A511A69F6DA00F77249 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; C3226A531A69F6DF00F77249 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; C3226A551A69F6F000F77249 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; @@ -2625,7 +2625,7 @@ buildSettings = { COPY_PHASE_STRIP = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; - INFOPLIST_FILE = "CorePlotTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = UnitTests; @@ -2639,7 +2639,7 @@ buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; - INFOPLIST_FILE = "CorePlotTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = UnitTests; @@ -2656,7 +2656,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = CorePlot; @@ -2674,7 +2674,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = CorePlot; @@ -2741,7 +2741,7 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot-iOS-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2767,7 +2767,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; - INFOPLIST_FILE = "$(SRCROOT)/CorePlot-iOS-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2806,7 +2806,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOSTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -2840,7 +2840,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "CorePlot-iOSTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOSTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; @@ -2918,7 +2918,7 @@ "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; - INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACOSX_DEPLOYMENT_TARGET = ""; @@ -2939,7 +2939,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; - INFOPLIST_FILE = "CorePlot-CocoaTouch-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MACOSX_DEPLOYMENT_TARGET = ""; @@ -2978,7 +2978,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouchTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -3012,7 +3012,7 @@ GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "CorePlot-CocoaTouchTests-Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouchTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; diff --git a/framework/CorePlot-CocoaTouch-Info.plist b/framework/Info/CorePlot-CocoaTouch-Info.plist similarity index 100% rename from framework/CorePlot-CocoaTouch-Info.plist rename to framework/Info/CorePlot-CocoaTouch-Info.plist diff --git a/framework/CorePlot-CocoaTouchTests-Info.plist b/framework/Info/CorePlot-CocoaTouchTests-Info.plist similarity index 100% rename from framework/CorePlot-CocoaTouchTests-Info.plist rename to framework/Info/CorePlot-CocoaTouchTests-Info.plist diff --git a/framework/CorePlot-Info.plist b/framework/Info/CorePlot-Info.plist similarity index 100% rename from framework/CorePlot-Info.plist rename to framework/Info/CorePlot-Info.plist diff --git a/framework/CorePlot-iOS-Info.plist b/framework/Info/CorePlot-iOS-Info.plist similarity index 100% rename from framework/CorePlot-iOS-Info.plist rename to framework/Info/CorePlot-iOS-Info.plist diff --git a/framework/CorePlot-iOSTests-Info.plist b/framework/Info/CorePlot-iOSTests-Info.plist similarity index 100% rename from framework/CorePlot-iOSTests-Info.plist rename to framework/Info/CorePlot-iOSTests-Info.plist diff --git a/framework/CorePlotTests-Info.plist b/framework/Info/CorePlotTests-Info.plist similarity index 100% rename from framework/CorePlotTests-Info.plist rename to framework/Info/CorePlotTests-Info.plist From bd277a97743aa54524dc01942d19fcc340cdd73e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:55:19 -0400 Subject: [PATCH 098/429] Updated the Core Plot project file with Xcode 7.1 recommended settings. --- framework/CorePlot.xcodeproj/project.pbxproj | 11 +++++++++-- .../xcshareddata/xcschemes/CorePlot Mac.xcscheme | 2 +- .../xcshareddata/xcschemes/CorePlot iOS.xcscheme | 2 +- framework/Info/CorePlot-CocoaTouchTests-Info.plist | 2 +- framework/Info/CorePlot-iOS-Info.plist | 2 +- framework/Info/CorePlot-iOSTests-Info.plist | 2 +- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 255fd99f2..7e867ec69 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -1357,7 +1357,7 @@ 071F3CB810FBAB5900D0A7B6 /* License.txt */, 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */, C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */, - C3226A501A69F1A700F77249 /* CorePlot_iOS-Info.plist */, + C3226A501A69F1A700F77249 /* CorePlot-iOS-Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; @@ -2046,7 +2046,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0710; TargetAttributes = { 8DC2EF4F0486A6940098B216 = { DevelopmentTeam = 28ZA45DE7D; @@ -2687,6 +2687,7 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ENABLE_TESTABILITY = YES; SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Debug; @@ -2746,6 +2747,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2772,6 +2774,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2810,6 +2813,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2844,6 +2848,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2982,6 +2987,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3016,6 +3022,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme index 0303058a1..e61c6a977 100644 --- a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme @@ -1,6 +1,6 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/Info/CorePlot-iOS-Info.plist b/framework/Info/CorePlot-iOS-Info.plist index 06f3d09a5..d3de8eefb 100644 --- a/framework/Info/CorePlot-iOS-Info.plist +++ b/framework/Info/CorePlot-iOS-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/Info/CorePlot-iOSTests-Info.plist b/framework/Info/CorePlot-iOSTests-Info.plist index 70b39d69c..ba72822e8 100644 --- a/framework/Info/CorePlot-iOSTests-Info.plist +++ b/framework/Info/CorePlot-iOSTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 65daff44666b2fa88283e17168cf71c137044c0d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:57:50 -0400 Subject: [PATCH 099/429] Removed the deprecated iOS static library project. Use the CorePlot project for all platforms. --- .../project.pbxproj | 1339 ----------------- .../contents.xcworkspacedata | 7 - 2 files changed, 1346 deletions(-) delete mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj delete mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj b/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj deleted file mode 100644 index 993f75e21..000000000 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1339 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 47; - objects = { - -/* Begin PBXAggregateTarget section */ - 0799D97A137318CF0026072C /* Universal Library */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 0799D97D137318CF0026072C /* Build configuration list for PBXAggregateTarget "Universal Library" */; - buildPhases = ( - 0799D97F137318D80026072C /* ShellScript */, - ); - dependencies = ( - ); - name = "Universal Library"; - productName = "Universal Library"; - }; - C3566B8010EED04900FB3866 /* Documentation */ = { - isa = PBXAggregateTarget; - buildConfigurationList = C3566B8410EED06800FB3866 /* Build configuration list for PBXAggregateTarget "Documentation" */; - buildPhases = ( - C3566B7F10EED04900FB3866 /* ShellScript */, - ); - dependencies = ( - ); - name = Documentation; - productName = Documentation; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 070CB82A0FC9DE4B00F3152B /* CPTGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82990FB89E610035D8DA /* CPTGradient.m */; }; - 070CB82B0FC9DE5500F3152B /* CPTImage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B829B0FB89E610035D8DA /* CPTImage.m */; }; - 070CB82C0FC9DE5600F3152B /* CPTLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82700FB89E610035D8DA /* CPTLayer.m */; }; - 070CB82D0FC9DE5700F3152B /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B829D0FB89E610035D8DA /* CPTLineStyle.m */; }; - 070CB8340FC9DEA800F3152B /* CPTColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CB8300FC9DEA800F3152B /* CPTColor.h */; settings = {ATTRIBUTES = (); }; }; - 070CB8350FC9DEA800F3152B /* CPTColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 070CB8310FC9DEA800F3152B /* CPTColor.m */; }; - 070CB8360FC9DEA800F3152B /* CPTColorSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CB8320FC9DEA800F3152B /* CPTColorSpace.h */; settings = {ATTRIBUTES = (); }; }; - 070CB8370FC9DEA800F3152B /* CPTColorSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 070CB8330FC9DEA800F3152B /* CPTColorSpace.m */; }; - 070CB8430FC9DED400F3152B /* CPTAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CB8390FC9DED400F3152B /* CPTAxis.h */; settings = {ATTRIBUTES = (); }; }; - 070CB8440FC9DED400F3152B /* CPTAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 070CB83A0FC9DED400F3152B /* CPTAxis.m */; }; - 070CB8470FC9DED400F3152B /* CPTAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CB83D0FC9DED400F3152B /* CPTAxisSet.h */; settings = {ATTRIBUTES = (); }; }; - 070CB8480FC9DED400F3152B /* CPTAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 070CB83E0FC9DED400F3152B /* CPTAxisSet.m */; }; - 070CB85E0FC9DF4700F3152B /* CPTTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B829F0FB89E610035D8DA /* CPTTextLayer.m */; }; - 0718DE4D11D1EDBA00AF4851 /* CPTAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0718DE4511D1EDBA00AF4851 /* CPTAnnotation.h */; settings = {ATTRIBUTES = (); }; }; - 0718DE4E11D1EDBA00AF4851 /* CPTAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0718DE4611D1EDBA00AF4851 /* CPTAnnotation.m */; }; - 0718DE4F11D1EDBA00AF4851 /* CPTAnnotationHostLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0718DE4711D1EDBA00AF4851 /* CPTAnnotationHostLayer.h */; settings = {ATTRIBUTES = (); }; }; - 0718DE5011D1EDBA00AF4851 /* CPTAnnotationHostLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0718DE4811D1EDBA00AF4851 /* CPTAnnotationHostLayer.m */; }; - 0718DE5111D1EDBA00AF4851 /* CPTLayerAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0718DE4911D1EDBA00AF4851 /* CPTLayerAnnotation.h */; settings = {ATTRIBUTES = (); }; }; - 0718DE5211D1EDBA00AF4851 /* CPTLayerAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0718DE4A11D1EDBA00AF4851 /* CPTLayerAnnotation.m */; }; - 0718DE5311D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0718DE4B11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.h */; settings = {ATTRIBUTES = (); }; }; - 0718DE5411D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0718DE4C11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.m */; }; - 072E3F9F0FE2FF7300ACF62F /* CPTTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 072E3F9B0FE2FF7300ACF62F /* CPTTheme.h */; settings = {ATTRIBUTES = (); }; }; - 072E3FA00FE2FF7300ACF62F /* CPTTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 072E3F9C0FE2FF7300ACF62F /* CPTTheme.m */; }; - 074D7BC50FD6B65F006011BC /* CPTXYPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 074D7BC30FD6B65E006011BC /* CPTXYPlotSpace.h */; settings = {ATTRIBUTES = (); }; }; - 074D7BC60FD6B65F006011BC /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 074D7BC40FD6B65F006011BC /* CPTXYPlotSpace.m */; }; - 074FADF9112024C500394B90 /* CPTConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 074FADF7112024C500394B90 /* CPTConstraints.h */; settings = {ATTRIBUTES = (); }; }; - 074FADFA112024C500394B90 /* CPTConstraints.m in Sources */ = {isa = PBXBuildFile; fileRef = 074FADF8112024C500394B90 /* CPTConstraints.m */; }; - 0772B4F310E26A12009CD04C /* CPTTradingRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772B4F110E26A12009CD04C /* CPTTradingRangePlot.h */; settings = {ATTRIBUTES = (); }; }; - 0772B4F410E26A12009CD04C /* CPTTradingRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772B4F210E26A12009CD04C /* CPTTradingRangePlot.m */; }; - 077F28550FE18048000BCA52 /* CPTBorderedLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 077F28510FE18048000BCA52 /* CPTBorderedLayer.h */; settings = {ATTRIBUTES = (); }; }; - 077F28560FE18048000BCA52 /* CPTBorderedLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 077F28520FE18048000BCA52 /* CPTBorderedLayer.m */; }; - 077F28570FE18048000BCA52 /* CPTPathExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 077F28530FE18048000BCA52 /* CPTPathExtensions.h */; settings = {ATTRIBUTES = (); }; }; - 077F28580FE18048000BCA52 /* CPTPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 077F28540FE18048000BCA52 /* CPTPathExtensions.m */; }; - 0789EFBE0FB9F97F00C0A613 /* CPTPlatformSpecificCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = 0789EFB80FB9F97F00C0A613 /* CPTPlatformSpecificCategories.h */; settings = {ATTRIBUTES = (); }; }; - 0789EFBF0FB9F97F00C0A613 /* CPTPlatformSpecificCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = 0789EFB90FB9F97F00C0A613 /* CPTPlatformSpecificCategories.m */; }; - 0789EFC00FB9F97F00C0A613 /* CPTPlatformSpecificDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0789EFBA0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.h */; settings = {ATTRIBUTES = (); }; }; - 0789EFC10FB9F97F00C0A613 /* CPTPlatformSpecificDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = 0789EFBB0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.m */; }; - 0789EFC20FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 0789EFBC0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.h */; settings = {ATTRIBUTES = (); }; }; - 0789EFC30FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0789EFBD0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.m */; }; - 07A2E71E102DFAD300809BC5 /* CPTTimeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A2E71C102DFAD300809BC5 /* CPTTimeFormatter.h */; settings = {ATTRIBUTES = (); }; }; - 07A2E71F102DFAD300809BC5 /* CPTTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A2E71D102DFAD300809BC5 /* CPTTimeFormatter.m */; }; - 07A5E24C104E47E900B7AB80 /* CPTTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B829E0FB89E610035D8DA /* CPTTextLayer.h */; settings = {ATTRIBUTES = (); }; }; - 07A62FB50FE2234900CD765C /* CPTTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A62FB30FE2234900CD765C /* CPTTextStyle.h */; settings = {ATTRIBUTES = (); }; }; - 07A62FB60FE2234900CD765C /* CPTTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A62FB40FE2234900CD765C /* CPTTextStyle.m */; }; - 07AEF30310BBF99A0012BEFF /* CPTResponder.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AEF30110BBF99A0012BEFF /* CPTResponder.h */; settings = {ATTRIBUTES = (); }; }; - 07B69AB912B6281100F4C16C /* CPTMutableTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69AB712B6281100F4C16C /* CPTMutableTextStyle.h */; settings = {ATTRIBUTES = (); }; }; - 07B69ABA12B6281100F4C16C /* CPTMutableTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69AB812B6281100F4C16C /* CPTMutableTextStyle.m */; }; - 07B69B7112B62E9600F4C16C /* CPTMutableLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69B6F12B62E9600F4C16C /* CPTMutableLineStyle.h */; settings = {ATTRIBUTES = (); }; }; - 07B69B7212B62E9600F4C16C /* CPTMutableLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69B7012B62E9600F4C16C /* CPTMutableLineStyle.m */; }; - 07FCF2D4115B54DE00E46606 /* _CPTSlateTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FCF2D2115B54DE00E46606 /* _CPTSlateTheme.m */; }; - BC4FAF29100D7DF300811DD3 /* NSDecimalNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82B10FB89E610035D8DA /* NSDecimalNumberExtensions.h */; settings = {ATTRIBUTES = (); }; }; - BC74A2C210FC087800E7E90D /* CPTPieChart.h in Headers */ = {isa = PBXBuildFile; fileRef = BC74A2C010FC087800E7E90D /* CPTPieChart.h */; settings = {ATTRIBUTES = (); }; }; - BC74A2C310FC087800E7E90D /* CPTPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A2C110FC087800E7E90D /* CPTPieChart.m */; }; - BC79F1D50FD1DC1A00510976 /* CPTGraphHostingView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC79F1D30FD1DC1A00510976 /* CPTGraphHostingView.h */; settings = {ATTRIBUTES = (); }; }; - BC79F1D60FD1DC1A00510976 /* CPTGraphHostingView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC79F1D40FD1DC1A00510976 /* CPTGraphHostingView.m */; }; - BC89A79A1024AB19009D5261 /* CorePlotProbes.d in Sources */ = {isa = PBXBuildFile; fileRef = BC89A7991024AB19009D5261 /* CorePlotProbes.d */; }; - BC9B834E0FB8A1400035D8DA /* CPTPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82D30FB89E610035D8DA /* CPTPlot.m */; }; - BC9B834F0FB8A1400035D8DA /* CPTScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82D50FB89E610035D8DA /* CPTScatterPlot.m */; }; - BC9B83500FB8A1400035D8DA /* CPTBarPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82DB0FB89E610035D8DA /* CPTBarPlot.m */; }; - BC9B83510FB8A1400035D8DA /* CPTPlotSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82D10FB89E610035D8DA /* CPTPlotSymbol.m */; }; - BC9B83520FB8A1400035D8DA /* CPTPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82C70FB89E610035D8DA /* CPTPlotSpace.m */; }; - BC9B83550FB8A1400035D8DA /* CPTPlotAreaFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82C20FB89E610035D8DA /* CPTPlotAreaFrame.m */; }; - BC9B83560FB8A1400035D8DA /* CPTGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82B70FB89E610035D8DA /* CPTGraph.m */; }; - BC9B83570FB8A1400035D8DA /* CPTXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82B90FB89E610035D8DA /* CPTXYGraph.m */; }; - BC9B835A0FB8A1400035D8DA /* NSDecimalNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82B20FB89E610035D8DA /* NSDecimalNumberExtensions.m */; }; - BC9B835B0FB8A1400035D8DA /* NSNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82B40FB89E610035D8DA /* NSNumberExtensions.m */; }; - BC9B835D0FB8A1400035D8DA /* CPTDefinitions.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82A40FB89E610035D8DA /* CPTDefinitions.m */; }; - BC9B835E0FB8A1400035D8DA /* CPTExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82A60FB89E610035D8DA /* CPTExceptions.m */; }; - BC9B835F0FB8A1400035D8DA /* CPTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82A80FB89E610035D8DA /* CPTUtilities.m */; }; - BC9B83600FB8A1400035D8DA /* CPTPlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82AC0FB89E610035D8DA /* CPTPlotRange.m */; }; - BC9B83610FB8A1400035D8DA /* CPTFill.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B82890FB89E610035D8DA /* CPTFill.m */; }; - BC9B83620FB8A1400035D8DA /* _CPTFillColor.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B828B0FB89E610035D8DA /* _CPTFillColor.m */; }; - BC9B83630FB8A1400035D8DA /* _CPTFillGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B828D0FB89E610035D8DA /* _CPTFillGradient.m */; }; - BC9B83640FB8A1400035D8DA /* _CPTFillImage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC9B828F0FB89E610035D8DA /* _CPTFillImage.m */; }; - BC9B836E0FB8A1700035D8DA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC9B82690FB89BD10035D8DA /* QuartzCore.framework */; }; - BC9B836F0FB8A1700035D8DA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - BC9B83700FB8A1700035D8DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - BC9B83710FB8A1700035D8DA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; - BC9B83C30FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B83C20FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h */; settings = {ATTRIBUTES = (); }; }; - BCC7EA451006BF5700B39451 /* _CPTPlainBlackTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC7EA3F1006BF5700B39451 /* _CPTPlainBlackTheme.h */; settings = {ATTRIBUTES = (); }; }; - BCC7EA461006BF5700B39451 /* _CPTPlainBlackTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC7EA401006BF5700B39451 /* _CPTPlainBlackTheme.m */; }; - BCC7EA471006BF5700B39451 /* _CPTPlainWhiteTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC7EA411006BF5700B39451 /* _CPTPlainWhiteTheme.h */; settings = {ATTRIBUTES = (); }; }; - BCC7EA481006BF5700B39451 /* _CPTPlainWhiteTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC7EA421006BF5700B39451 /* _CPTPlainWhiteTheme.m */; }; - BCC7EA491006BF5700B39451 /* _CPTStocksTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC7EA431006BF5700B39451 /* _CPTStocksTheme.h */; settings = {ATTRIBUTES = (); }; }; - BCC7EA4A1006BF5700B39451 /* _CPTStocksTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC7EA441006BF5700B39451 /* _CPTStocksTheme.m */; }; - C304565313F4AC9A004D04BC /* _CPTDarkGradientTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C304565213F4AC9A004D04BC /* _CPTDarkGradientTheme.h */; settings = {ATTRIBUTES = (); }; }; - C30550E91399BE2000E0151F /* CPTLegendEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = C30550E71399BE2000E0151F /* CPTLegendEntry.h */; settings = {ATTRIBUTES = (); }; }; - C30550EA1399BE2000E0151F /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550E81399BE2000E0151F /* CPTLegendEntry.m */; }; - C30C85AB1047428100181766 /* CPTPlotGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C30C85A91047428100181766 /* CPTPlotGroup.h */; settings = {ATTRIBUTES = (); }; }; - C30C85AC1047428100181766 /* CPTPlotGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C30C85AA1047428100181766 /* CPTPlotGroup.m */; }; - C318F4C111EA18A400595FF9 /* CPTLimitBand.h in Headers */ = {isa = PBXBuildFile; fileRef = C318F4BF11EA18A400595FF9 /* CPTLimitBand.h */; settings = {ATTRIBUTES = (); }; }; - C318F4C211EA18A400595FF9 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4C011EA18A400595FF9 /* CPTLimitBand.m */; }; - C31A40BF17ABD6C60020C5C6 /* CPTFunctionDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C31A40BD17ABD6C60020C5C6 /* CPTFunctionDataSource.h */; }; - C31A40C017ABD6C60020C5C6 /* CPTFunctionDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C31A40BE17ABD6C60020C5C6 /* CPTFunctionDataSource.m */; }; - C3286C0715D8769800A436A8 /* _CPTMaskLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3286C0515D8769800A436A8 /* _CPTMaskLayer.h */; settings = {ATTRIBUTES = (); }; }; - C3286C0815D8769800A436A8 /* _CPTMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3286C0615D8769800A436A8 /* _CPTMaskLayer.m */; }; - C32EE1BD13EC4AF900038266 /* CPTShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1BB13EC4AF900038266 /* CPTShadow.h */; settings = {ATTRIBUTES = (); }; }; - C32EE1BE13EC4AF900038266 /* CPTShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1BC13EC4AF900038266 /* CPTShadow.m */; }; - C32EE1C813EC4C7200038266 /* CPTMutableShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1C613EC4C7200038266 /* CPTMutableShadow.h */; settings = {ATTRIBUTES = (); }; }; - C32EE1C913EC4C7200038266 /* CPTMutableShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1C713EC4C7200038266 /* CPTMutableShadow.m */; }; - C3392A361225F63B008DA6BD /* CPTNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3392A351225F63B008DA6BD /* CPTNumericData+TypeConversion.m */; }; - C3408C4615FC1CA8004F1D70 /* _CPTBorderLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3408C4415FC1CA8004F1D70 /* _CPTBorderLayer.h */; settings = {ATTRIBUTES = (); }; }; - C3408C4715FC1CA8004F1D70 /* _CPTBorderLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3408C4515FC1CA8004F1D70 /* _CPTBorderLayer.m */; }; - C3436C4F13F4AC4400739AC2 /* _CPTDarkGradientTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C3436C4E13F4AC4400739AC2 /* _CPTDarkGradientTheme.m */; }; - C3436C5113F4AC6000739AC2 /* _CPTSlateTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C3436C5013F4AC6000739AC2 /* _CPTSlateTheme.h */; settings = {ATTRIBUTES = (); }; }; - C349DCB0151AAFAB00BFD6A7 /* CPTCalendarFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = C349DCAE151AAFAB00BFD6A7 /* CPTCalendarFormatter.h */; settings = {ATTRIBUTES = (); }; }; - C349DCB1151AAFAB00BFD6A7 /* CPTCalendarFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C349DCAF151AAFAB00BFD6A7 /* CPTCalendarFormatter.m */; }; - C35A65A511025EDF00FE24BB /* CPTPlotArea.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65A311025EDF00FE24BB /* CPTPlotArea.h */; settings = {ATTRIBUTES = (); }; }; - C35A65A611025EDF00FE24BB /* CPTPlotArea.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65A411025EDF00FE24BB /* CPTPlotArea.m */; }; - C35A65B311025F8A00FE24BB /* CPTGridLines.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65B111025F8A00FE24BB /* CPTGridLines.h */; settings = {ATTRIBUTES = (); }; }; - C35A65B411025F8A00FE24BB /* CPTGridLines.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65B211025F8A00FE24BB /* CPTGridLines.m */; }; - C35A65B911025FA900FE24BB /* CPTAxisLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65B511025FA900FE24BB /* CPTAxisLabel.h */; settings = {ATTRIBUTES = (); }; }; - C35A65BA11025FA900FE24BB /* CPTAxisLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65B611025FA900FE24BB /* CPTAxisLabel.m */; }; - C35A65BB11025FA900FE24BB /* CPTAxisTitle.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65B711025FA900FE24BB /* CPTAxisTitle.h */; settings = {ATTRIBUTES = (); }; }; - C35A65BC11025FA900FE24BB /* CPTAxisTitle.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65B811025FA900FE24BB /* CPTAxisTitle.m */; }; - C35A65BF11025FB300FE24BB /* CPTAxisLabelGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65BD11025FB300FE24BB /* CPTAxisLabelGroup.h */; settings = {ATTRIBUTES = (); }; }; - C35A65C011025FB300FE24BB /* CPTAxisLabelGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65BE11025FB300FE24BB /* CPTAxisLabelGroup.m */; }; - C35A65C711025FCC00FE24BB /* CPTXYAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65C111025FCC00FE24BB /* CPTXYAxis.h */; settings = {ATTRIBUTES = (); }; }; - C35A65C811025FCC00FE24BB /* CPTXYAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65C211025FCC00FE24BB /* CPTXYAxis.m */; }; - C35A65C911025FCC00FE24BB /* CPTXYAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A65C311025FCC00FE24BB /* CPTXYAxisSet.h */; settings = {ATTRIBUTES = (); }; }; - C35A65CA11025FCC00FE24BB /* CPTXYAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A65C411025FCC00FE24BB /* CPTXYAxisSet.m */; }; - C35A66071102723E00FE24BB /* CPTTextStylePlatformSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = C35A66051102723E00FE24BB /* CPTTextStylePlatformSpecific.h */; settings = {ATTRIBUTES = (); }; }; - C35A66081102723E00FE24BB /* CPTTextStylePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C35A66061102723E00FE24BB /* CPTTextStylePlatformSpecific.m */; }; - C3791D05191D4C2F001EC514 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C3791D03191D4C2F001EC514 /* CPTImagePlatformSpecific.m */; }; - C38DD49711A04B99002A68E7 /* CPTGridLineGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C38DD49511A04B99002A68E7 /* CPTGridLineGroup.h */; settings = {ATTRIBUTES = (); }; }; - C38DD49811A04B99002A68E7 /* CPTGridLineGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C38DD49611A04B99002A68E7 /* CPTGridLineGroup.m */; }; - C3920ACF1395B7680045F3BB /* CPTLegend.h in Headers */ = {isa = PBXBuildFile; fileRef = C3920ACD1395B7680045F3BB /* CPTLegend.h */; settings = {ATTRIBUTES = (); }; }; - C3920AD01395B7680045F3BB /* CPTLegend.m in Sources */ = {isa = PBXBuildFile; fileRef = C3920ACE1395B7680045F3BB /* CPTLegend.m */; }; - C3978E1013CE65C600A420D9 /* NSCoderExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3978E0E13CE65C600A420D9 /* NSCoderExtensions.h */; settings = {ATTRIBUTES = (); }; }; - C3978E1113CE65C600A420D9 /* NSCoderExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3978E0F13CE65C600A420D9 /* NSCoderExtensions.m */; }; - C3A695E1146A196100AF5653 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695DF146A196100AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (); }; }; - C3A695E2146A196100AF5653 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E0146A196100AF5653 /* CPTMutablePlotRange.m */; }; - C3B623C0107EC9370009EF0B /* CPTBarPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82DA0FB89E610035D8DA /* CPTBarPlot.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C1107EC9400009EF0B /* CPTDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82A30FB89E610035D8DA /* CPTDefinitions.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C2107EC9430009EF0B /* CPTExceptions.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82A50FB89E610035D8DA /* CPTExceptions.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C3107EC94D0009EF0B /* CPTFill.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82880FB89E610035D8DA /* CPTFill.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C4107EC94E0009EF0B /* CPTGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82980FB89E610035D8DA /* CPTGradient.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C5107EC9500009EF0B /* CPTGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82B60FB89E610035D8DA /* CPTGraph.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C6107EC9510009EF0B /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B829A0FB89E610035D8DA /* CPTImage.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C7107EC9540009EF0B /* CPTLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B826F0FB89E610035D8DA /* CPTLayer.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C8107EC9570009EF0B /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B829C0FB89E610035D8DA /* CPTLineStyle.h */; settings = {ATTRIBUTES = (); }; }; - C3B623C9107EC95C0009EF0B /* CPTPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82D20FB89E610035D8DA /* CPTPlot.h */; settings = {ATTRIBUTES = (); }; }; - C3B623CA107EC95E0009EF0B /* CPTPlotAreaFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82C10FB89E610035D8DA /* CPTPlotAreaFrame.h */; settings = {ATTRIBUTES = (); }; }; - C3B623CB107EC9610009EF0B /* CPTPlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82AB0FB89E610035D8DA /* CPTPlotRange.h */; settings = {ATTRIBUTES = (); }; }; - C3B623CC107EC9620009EF0B /* CPTPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82C60FB89E610035D8DA /* CPTPlotSpace.h */; settings = {ATTRIBUTES = (); }; }; - C3B623CD107EC9630009EF0B /* CPTPlotSymbol.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82D00FB89E610035D8DA /* CPTPlotSymbol.h */; settings = {ATTRIBUTES = (); }; }; - C3B623CF107EC9680009EF0B /* CPTScatterPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82D40FB89E610035D8DA /* CPTScatterPlot.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D1107EC96E0009EF0B /* CPTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82A70FB89E610035D8DA /* CPTUtilities.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D2107EC9760009EF0B /* CPTXYGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82B80FB89E610035D8DA /* CPTXYGraph.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D3107EC97A0009EF0B /* NSNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B82B30FB89E610035D8DA /* NSNumberExtensions.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D4107EC9800009EF0B /* _CPTFillColor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B828A0FB89E610035D8DA /* _CPTFillColor.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D5107EC9820009EF0B /* _CPTFillGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B828C0FB89E610035D8DA /* _CPTFillGradient.h */; settings = {ATTRIBUTES = (); }; }; - C3B623D6107EC9830009EF0B /* _CPTFillImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC9B828E0FB89E610035D8DA /* _CPTFillImage.h */; settings = {ATTRIBUTES = (); }; }; - C3C68320166138E200340E39 /* CPTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C68318166138E200340E39 /* CPTAnimation.h */; }; - C3C68321166138E200340E39 /* CPTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C68319166138E200340E39 /* CPTAnimation.m */; }; - C3C68322166138E200340E39 /* CPTAnimationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6831A166138E200340E39 /* CPTAnimationOperation.h */; }; - C3C68323166138E200340E39 /* CPTAnimationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6831B166138E200340E39 /* CPTAnimationOperation.m */; }; - C3C68324166138E200340E39 /* CPTAnimationPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6831C166138E200340E39 /* CPTAnimationPeriod.h */; }; - C3C68325166138E200340E39 /* CPTAnimationPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6831D166138E200340E39 /* CPTAnimationPeriod.m */; }; - C3C68326166138E200340E39 /* _CPTAnimationTimingFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6831E166138E200340E39 /* _CPTAnimationTimingFunctions.h */; }; - C3C68327166138E200340E39 /* _CPTAnimationTimingFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6831F166138E200340E39 /* _CPTAnimationTimingFunctions.m */; }; - C3C683341661391A00340E39 /* _CPTAnimationCGFloatPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C683281661391A00340E39 /* _CPTAnimationCGFloatPeriod.h */; }; - C3C683351661391A00340E39 /* _CPTAnimationCGFloatPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C683291661391A00340E39 /* _CPTAnimationCGFloatPeriod.m */; }; - C3C683361661391A00340E39 /* _CPTAnimationCGPointPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6832A1661391A00340E39 /* _CPTAnimationCGPointPeriod.h */; }; - C3C683371661391A00340E39 /* _CPTAnimationCGPointPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6832B1661391A00340E39 /* _CPTAnimationCGPointPeriod.m */; }; - C3C683381661391A00340E39 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6832C1661391A00340E39 /* _CPTAnimationCGRectPeriod.h */; }; - C3C683391661391A00340E39 /* _CPTAnimationCGRectPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6832D1661391A00340E39 /* _CPTAnimationCGRectPeriod.m */; }; - C3C6833A1661391A00340E39 /* _CPTAnimationCGSizePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C6832E1661391A00340E39 /* _CPTAnimationCGSizePeriod.h */; }; - C3C6833B1661391A00340E39 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C6832F1661391A00340E39 /* _CPTAnimationCGSizePeriod.m */; }; - C3C6833C1661391A00340E39 /* _CPTAnimationNSDecimalPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C683301661391A00340E39 /* _CPTAnimationNSDecimalPeriod.h */; }; - C3C6833D1661391A00340E39 /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C683311661391A00340E39 /* _CPTAnimationNSDecimalPeriod.m */; }; - C3C6833E1661391A00340E39 /* _CPTAnimationPlotRangePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C683321661391A00340E39 /* _CPTAnimationPlotRangePeriod.h */; }; - C3C6833F1661391A00340E39 /* _CPTAnimationPlotRangePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C683331661391A00340E39 /* _CPTAnimationPlotRangePeriod.m */; }; - C3CAFB3B1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CAFB391229E48200F5C989 /* CPTMutableNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (); }; }; - C3CAFB3C1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CAFB3A1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.m */; }; - C3CCA04813E8D94800CE6DB1 /* _CPTConstraintsFixed.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA04413E8D94800CE6DB1 /* _CPTConstraintsFixed.h */; settings = {ATTRIBUTES = (); }; }; - C3CCA04913E8D94800CE6DB1 /* _CPTConstraintsFixed.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA04513E8D94800CE6DB1 /* _CPTConstraintsFixed.m */; }; - C3CCA04A13E8D94800CE6DB1 /* _CPTConstraintsRelative.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA04613E8D94800CE6DB1 /* _CPTConstraintsRelative.h */; settings = {ATTRIBUTES = (); }; }; - C3CCA04B13E8D94800CE6DB1 /* _CPTConstraintsRelative.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA04713E8D94800CE6DB1 /* _CPTConstraintsRelative.m */; }; - C3CD282817DE957C008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD282717DE957C008EED1E /* Accelerate.framework */; }; - C3D3AD3413DF8E9D0004EA73 /* CPTLineCap.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D3AD3213DF8E9D0004EA73 /* CPTLineCap.h */; settings = {ATTRIBUTES = (); }; }; - C3D3AD3513DF8E9D0004EA73 /* CPTLineCap.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D3AD3313DF8E9D0004EA73 /* CPTLineCap.m */; }; - C3D68B091221650C00EB4863 /* CPTMutableNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CADE3D11B188C500D36017 /* CPTMutableNumericData.h */; settings = {ATTRIBUTES = (); }; }; - C3D68B0A1221650D00EB4863 /* CPTMutableNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADE3E11B188C500D36017 /* CPTMutableNumericData.m */; }; - C3D68B0B1221650E00EB4863 /* CPTNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CADE3211B188A800D36017 /* CPTNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (); }; }; - C3D68B0D1221651200EB4863 /* CPTNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CADE3011B188A800D36017 /* CPTNumericData.h */; settings = {ATTRIBUTES = (); }; }; - C3D68B0E1221651200EB4863 /* CPTNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADE3111B188A800D36017 /* CPTNumericData.m */; }; - C3D68B0F1221651500EB4863 /* CPTNumericDataType.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CADE3911B188B600D36017 /* CPTNumericDataType.h */; settings = {ATTRIBUTES = (); }; }; - C3D68B101221651600EB4863 /* CPTNumericDataType.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADE3A11B188B600D36017 /* CPTNumericDataType.m */; }; - C3D9825116BD406600DE7977 /* CorePlot_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = C3D9825016BD406600DE7977 /* CorePlot_Prefix.pch */; }; - C40CFB94107EC1B40057E828 /* _CPTXYTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C40CFB92107EC1B40057E828 /* _CPTXYTheme.h */; settings = {ATTRIBUTES = (); }; }; - C40CFB95107EC1B40057E828 /* _CPTXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C40CFB93107EC1B40057E828 /* _CPTXYTheme.m */; }; - D0C047BF12D6568500DA8047 /* CPTRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C047BD12D6568500DA8047 /* CPTRangePlot.m */; }; - D0C047C012D6568500DA8047 /* CPTRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C047BE12D6568500DA8047 /* CPTRangePlot.h */; settings = {ATTRIBUTES = (); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 070CB8300FC9DEA800F3152B /* CPTColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTColor.h; path = Source/CPTColor.h; sourceTree = ""; }; - 070CB8310FC9DEA800F3152B /* CPTColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTColor.m; path = Source/CPTColor.m; sourceTree = ""; }; - 070CB8320FC9DEA800F3152B /* CPTColorSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTColorSpace.h; path = Source/CPTColorSpace.h; sourceTree = ""; }; - 070CB8330FC9DEA800F3152B /* CPTColorSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTColorSpace.m; path = Source/CPTColorSpace.m; sourceTree = ""; }; - 070CB8390FC9DED400F3152B /* CPTAxis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAxis.h; path = Source/CPTAxis.h; sourceTree = ""; }; - 070CB83A0FC9DED400F3152B /* CPTAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAxis.m; path = Source/CPTAxis.m; sourceTree = ""; }; - 070CB83D0FC9DED400F3152B /* CPTAxisSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAxisSet.h; path = Source/CPTAxisSet.h; sourceTree = ""; }; - 070CB83E0FC9DED400F3152B /* CPTAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAxisSet.m; path = Source/CPTAxisSet.m; sourceTree = ""; }; - 0718DE4511D1EDBA00AF4851 /* CPTAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAnnotation.h; path = Source/CPTAnnotation.h; sourceTree = ""; }; - 0718DE4611D1EDBA00AF4851 /* CPTAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAnnotation.m; path = Source/CPTAnnotation.m; sourceTree = ""; }; - 0718DE4711D1EDBA00AF4851 /* CPTAnnotationHostLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAnnotationHostLayer.h; path = Source/CPTAnnotationHostLayer.h; sourceTree = ""; }; - 0718DE4811D1EDBA00AF4851 /* CPTAnnotationHostLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAnnotationHostLayer.m; path = Source/CPTAnnotationHostLayer.m; sourceTree = ""; }; - 0718DE4911D1EDBA00AF4851 /* CPTLayerAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLayerAnnotation.h; path = Source/CPTLayerAnnotation.h; sourceTree = ""; }; - 0718DE4A11D1EDBA00AF4851 /* CPTLayerAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLayerAnnotation.m; path = Source/CPTLayerAnnotation.m; sourceTree = ""; }; - 0718DE4B11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotSpaceAnnotation.h; path = Source/CPTPlotSpaceAnnotation.h; sourceTree = ""; }; - 0718DE4C11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotSpaceAnnotation.m; path = Source/CPTPlotSpaceAnnotation.m; sourceTree = ""; }; - 071F3CDF10FBAB9D00D0A7B6 /* License.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = License.txt; path = ../License.txt; sourceTree = SOURCE_ROOT; }; - 072E3F9B0FE2FF7300ACF62F /* CPTTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTheme.h; path = Source/CPTTheme.h; sourceTree = ""; }; - 072E3F9C0FE2FF7300ACF62F /* CPTTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTheme.m; path = Source/CPTTheme.m; sourceTree = ""; }; - 074D7BC30FD6B65E006011BC /* CPTXYPlotSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTXYPlotSpace.h; path = Source/CPTXYPlotSpace.h; sourceTree = ""; }; - 074D7BC40FD6B65F006011BC /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTXYPlotSpace.m; path = Source/CPTXYPlotSpace.m; sourceTree = ""; }; - 074FADF7112024C500394B90 /* CPTConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTConstraints.h; path = Source/CPTConstraints.h; sourceTree = ""; }; - 074FADF8112024C500394B90 /* CPTConstraints.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTConstraints.m; path = Source/CPTConstraints.m; sourceTree = ""; }; - 0772B4F110E26A12009CD04C /* CPTTradingRangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTradingRangePlot.h; path = Source/CPTTradingRangePlot.h; sourceTree = ""; }; - 0772B4F210E26A12009CD04C /* CPTTradingRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTradingRangePlot.m; path = Source/CPTTradingRangePlot.m; sourceTree = ""; }; - 077F28510FE18048000BCA52 /* CPTBorderedLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTBorderedLayer.h; path = Source/CPTBorderedLayer.h; sourceTree = ""; }; - 077F28520FE18048000BCA52 /* CPTBorderedLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTBorderedLayer.m; path = Source/CPTBorderedLayer.m; sourceTree = ""; }; - 077F28530FE18048000BCA52 /* CPTPathExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPathExtensions.h; path = Source/CPTPathExtensions.h; sourceTree = ""; }; - 077F28540FE18048000BCA52 /* CPTPathExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPathExtensions.m; path = Source/CPTPathExtensions.m; sourceTree = ""; }; - 0789EFB80FB9F97F00C0A613 /* CPTPlatformSpecificCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificCategories.h; sourceTree = ""; }; - 0789EFB90FB9F97F00C0A613 /* CPTPlatformSpecificCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificCategories.m; sourceTree = ""; }; - 0789EFBA0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificDefines.h; sourceTree = ""; }; - 0789EFBB0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificDefines.m; sourceTree = ""; }; - 0789EFBC0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlatformSpecificFunctions.h; sourceTree = ""; }; - 0789EFBD0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlatformSpecificFunctions.m; sourceTree = ""; }; - 07A2E71C102DFAD300809BC5 /* CPTTimeFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTimeFormatter.h; path = Source/CPTTimeFormatter.h; sourceTree = ""; }; - 07A2E71D102DFAD300809BC5 /* CPTTimeFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTimeFormatter.m; path = Source/CPTTimeFormatter.m; sourceTree = ""; }; - 07A62FB30FE2234900CD765C /* CPTTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = CPTTextStyle.h; path = Source/CPTTextStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 07A62FB40FE2234900CD765C /* CPTTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTextStyle.m; path = Source/CPTTextStyle.m; sourceTree = ""; }; - 07AEF30110BBF99A0012BEFF /* CPTResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTResponder.h; path = Source/CPTResponder.h; sourceTree = ""; }; - 07B69AB712B6281100F4C16C /* CPTMutableTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTMutableTextStyle.h; path = Source/CPTMutableTextStyle.h; sourceTree = ""; }; - 07B69AB812B6281100F4C16C /* CPTMutableTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTMutableTextStyle.m; path = Source/CPTMutableTextStyle.m; sourceTree = ""; }; - 07B69B6F12B62E9600F4C16C /* CPTMutableLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTMutableLineStyle.h; path = Source/CPTMutableLineStyle.h; sourceTree = ""; }; - 07B69B7012B62E9600F4C16C /* CPTMutableLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTMutableLineStyle.m; path = Source/CPTMutableLineStyle.m; sourceTree = ""; }; - 07FCF2D2115B54DE00E46606 /* _CPTSlateTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTSlateTheme.m; path = Source/_CPTSlateTheme.m; sourceTree = ""; }; - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - BC74A2C010FC087800E7E90D /* CPTPieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPieChart.h; path = Source/CPTPieChart.h; sourceTree = ""; }; - BC74A2C110FC087800E7E90D /* CPTPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPieChart.m; path = Source/CPTPieChart.m; sourceTree = ""; }; - BC79F1D30FD1DC1A00510976 /* CPTGraphHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGraphHostingView.h; sourceTree = ""; }; - BC79F1D40FD1DC1A00510976 /* CPTGraphHostingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTGraphHostingView.m; sourceTree = ""; }; - BC89A7991024AB19009D5261 /* CorePlotProbes.d */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.dtrace; name = CorePlotProbes.d; path = TestResources/CorePlotProbes.d; sourceTree = ""; }; - BC9B82690FB89BD10035D8DA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - BC9B826F0FB89E610035D8DA /* CPTLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLayer.h; path = Source/CPTLayer.h; sourceTree = ""; }; - BC9B82700FB89E610035D8DA /* CPTLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLayer.m; path = Source/CPTLayer.m; sourceTree = ""; }; - BC9B82880FB89E610035D8DA /* CPTFill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTFill.h; path = Source/CPTFill.h; sourceTree = SOURCE_ROOT; }; - BC9B82890FB89E610035D8DA /* CPTFill.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTFill.m; path = Source/CPTFill.m; sourceTree = SOURCE_ROOT; }; - BC9B828A0FB89E610035D8DA /* _CPTFillColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTFillColor.h; path = Source/_CPTFillColor.h; sourceTree = SOURCE_ROOT; }; - BC9B828B0FB89E610035D8DA /* _CPTFillColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTFillColor.m; path = Source/_CPTFillColor.m; sourceTree = SOURCE_ROOT; }; - BC9B828C0FB89E610035D8DA /* _CPTFillGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTFillGradient.h; path = Source/_CPTFillGradient.h; sourceTree = SOURCE_ROOT; }; - BC9B828D0FB89E610035D8DA /* _CPTFillGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTFillGradient.m; path = Source/_CPTFillGradient.m; sourceTree = SOURCE_ROOT; }; - BC9B828E0FB89E610035D8DA /* _CPTFillImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTFillImage.h; path = Source/_CPTFillImage.h; sourceTree = SOURCE_ROOT; }; - BC9B828F0FB89E610035D8DA /* _CPTFillImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTFillImage.m; path = Source/_CPTFillImage.m; sourceTree = SOURCE_ROOT; }; - BC9B82980FB89E610035D8DA /* CPTGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGradient.h; path = Source/CPTGradient.h; sourceTree = ""; }; - BC9B82990FB89E610035D8DA /* CPTGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGradient.m; path = Source/CPTGradient.m; sourceTree = ""; }; - BC9B829A0FB89E610035D8DA /* CPTImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = CPTImage.h; path = Source/CPTImage.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - BC9B829B0FB89E610035D8DA /* CPTImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTImage.m; path = Source/CPTImage.m; sourceTree = ""; }; - BC9B829C0FB89E610035D8DA /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLineStyle.h; path = Source/CPTLineStyle.h; sourceTree = ""; }; - BC9B829D0FB89E610035D8DA /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLineStyle.m; path = Source/CPTLineStyle.m; sourceTree = ""; }; - BC9B829E0FB89E610035D8DA /* CPTTextLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextLayer.h; path = Source/CPTTextLayer.h; sourceTree = ""; }; - BC9B829F0FB89E610035D8DA /* CPTTextLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTTextLayer.m; path = Source/CPTTextLayer.m; sourceTree = ""; }; - BC9B82A30FB89E610035D8DA /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTDefinitions.h; path = Source/CPTDefinitions.h; sourceTree = SOURCE_ROOT; }; - BC9B82A40FB89E610035D8DA /* CPTDefinitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTDefinitions.m; path = Source/CPTDefinitions.m; sourceTree = SOURCE_ROOT; }; - BC9B82A50FB89E610035D8DA /* CPTExceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTExceptions.h; path = Source/CPTExceptions.h; sourceTree = SOURCE_ROOT; }; - BC9B82A60FB89E610035D8DA /* CPTExceptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTExceptions.m; path = Source/CPTExceptions.m; sourceTree = SOURCE_ROOT; }; - BC9B82A70FB89E610035D8DA /* CPTUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTUtilities.h; path = Source/CPTUtilities.h; sourceTree = SOURCE_ROOT; }; - BC9B82A80FB89E610035D8DA /* CPTUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTUtilities.m; path = Source/CPTUtilities.m; sourceTree = SOURCE_ROOT; }; - BC9B82AB0FB89E610035D8DA /* CPTPlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotRange.h; path = Source/CPTPlotRange.h; sourceTree = SOURCE_ROOT; }; - BC9B82AC0FB89E610035D8DA /* CPTPlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotRange.m; path = Source/CPTPlotRange.m; sourceTree = SOURCE_ROOT; }; - BC9B82B10FB89E610035D8DA /* NSDecimalNumberExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSDecimalNumberExtensions.h; path = Source/NSDecimalNumberExtensions.h; sourceTree = SOURCE_ROOT; }; - BC9B82B20FB89E610035D8DA /* NSDecimalNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSDecimalNumberExtensions.m; path = Source/NSDecimalNumberExtensions.m; sourceTree = SOURCE_ROOT; }; - BC9B82B30FB89E610035D8DA /* NSNumberExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSNumberExtensions.h; path = Source/NSNumberExtensions.h; sourceTree = SOURCE_ROOT; }; - BC9B82B40FB89E610035D8DA /* NSNumberExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSNumberExtensions.m; path = Source/NSNumberExtensions.m; sourceTree = SOURCE_ROOT; }; - BC9B82B60FB89E610035D8DA /* CPTGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGraph.h; path = Source/CPTGraph.h; sourceTree = SOURCE_ROOT; }; - BC9B82B70FB89E610035D8DA /* CPTGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGraph.m; path = Source/CPTGraph.m; sourceTree = SOURCE_ROOT; }; - BC9B82B80FB89E610035D8DA /* CPTXYGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTXYGraph.h; path = Source/CPTXYGraph.h; sourceTree = SOURCE_ROOT; }; - BC9B82B90FB89E610035D8DA /* CPTXYGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTXYGraph.m; path = Source/CPTXYGraph.m; sourceTree = SOURCE_ROOT; }; - BC9B82C10FB89E610035D8DA /* CPTPlotAreaFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotAreaFrame.h; path = Source/CPTPlotAreaFrame.h; sourceTree = ""; }; - BC9B82C20FB89E610035D8DA /* CPTPlotAreaFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotAreaFrame.m; path = Source/CPTPlotAreaFrame.m; sourceTree = ""; }; - BC9B82C60FB89E610035D8DA /* CPTPlotSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotSpace.h; path = Source/CPTPlotSpace.h; sourceTree = SOURCE_ROOT; }; - BC9B82C70FB89E610035D8DA /* CPTPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotSpace.m; path = Source/CPTPlotSpace.m; sourceTree = SOURCE_ROOT; }; - BC9B82D00FB89E610035D8DA /* CPTPlotSymbol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotSymbol.h; path = Source/CPTPlotSymbol.h; sourceTree = SOURCE_ROOT; }; - BC9B82D10FB89E610035D8DA /* CPTPlotSymbol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotSymbol.m; path = Source/CPTPlotSymbol.m; sourceTree = SOURCE_ROOT; }; - BC9B82D20FB89E610035D8DA /* CPTPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlot.h; path = Source/CPTPlot.h; sourceTree = SOURCE_ROOT; }; - BC9B82D30FB89E610035D8DA /* CPTPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlot.m; path = Source/CPTPlot.m; sourceTree = SOURCE_ROOT; }; - BC9B82D40FB89E610035D8DA /* CPTScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTScatterPlot.h; path = Source/CPTScatterPlot.h; sourceTree = SOURCE_ROOT; }; - BC9B82D50FB89E610035D8DA /* CPTScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTScatterPlot.m; path = Source/CPTScatterPlot.m; sourceTree = SOURCE_ROOT; }; - BC9B82DA0FB89E610035D8DA /* CPTBarPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTBarPlot.h; path = Source/CPTBarPlot.h; sourceTree = SOURCE_ROOT; }; - BC9B82DB0FB89E610035D8DA /* CPTBarPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTBarPlot.m; path = Source/CPTBarPlot.m; sourceTree = SOURCE_ROOT; }; - BC9B83470FB8A0A40035D8DA /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libCorePlot-CocoaTouch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - BC9B83C20FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = SOURCE_ROOT; }; - BCC7EA3F1006BF5700B39451 /* _CPTPlainBlackTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTPlainBlackTheme.h; path = Source/_CPTPlainBlackTheme.h; sourceTree = ""; }; - BCC7EA401006BF5700B39451 /* _CPTPlainBlackTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTPlainBlackTheme.m; path = Source/_CPTPlainBlackTheme.m; sourceTree = ""; }; - BCC7EA411006BF5700B39451 /* _CPTPlainWhiteTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTPlainWhiteTheme.h; path = Source/_CPTPlainWhiteTheme.h; sourceTree = ""; }; - BCC7EA421006BF5700B39451 /* _CPTPlainWhiteTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTPlainWhiteTheme.m; path = Source/_CPTPlainWhiteTheme.m; sourceTree = ""; }; - BCC7EA431006BF5700B39451 /* _CPTStocksTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTStocksTheme.h; path = Source/_CPTStocksTheme.h; sourceTree = ""; }; - BCC7EA441006BF5700B39451 /* _CPTStocksTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTStocksTheme.m; path = Source/_CPTStocksTheme.m; sourceTree = ""; }; - C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotDebug.xcconfig; path = xcconfig/CorePlotDebug.xcconfig; sourceTree = ""; }; - C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotRelease.xcconfig; path = xcconfig/CorePlotRelease.xcconfig; sourceTree = ""; }; - C304565213F4AC9A004D04BC /* _CPTDarkGradientTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTDarkGradientTheme.h; path = Source/_CPTDarkGradientTheme.h; sourceTree = ""; }; - C30550E71399BE2000E0151F /* CPTLegendEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLegendEntry.h; path = Source/CPTLegendEntry.h; sourceTree = ""; }; - C30550E81399BE2000E0151F /* CPTLegendEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLegendEntry.m; path = Source/CPTLegendEntry.m; sourceTree = ""; }; - C30C85A91047428100181766 /* CPTPlotGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotGroup.h; path = Source/CPTPlotGroup.h; sourceTree = ""; }; - C30C85AA1047428100181766 /* CPTPlotGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotGroup.m; path = Source/CPTPlotGroup.m; sourceTree = ""; }; - C30E97A014B290650012204A /* DoxygenLayout.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = DoxygenLayout.xml; path = ../documentation/doxygen/DoxygenLayout.xml; sourceTree = ""; }; - C318F4BF11EA18A400595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLimitBand.h; path = Source/CPTLimitBand.h; sourceTree = ""; }; - C318F4C011EA18A400595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLimitBand.m; path = Source/CPTLimitBand.m; sourceTree = ""; }; - C31908A3199813D400B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlot.xcconfig; path = xcconfig/CorePlot.xcconfig; sourceTree = ""; }; - C31A40BD17ABD6C60020C5C6 /* CPTFunctionDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTFunctionDataSource.h; path = Source/CPTFunctionDataSource.h; sourceTree = ""; }; - C31A40BE17ABD6C60020C5C6 /* CPTFunctionDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTFunctionDataSource.m; path = Source/CPTFunctionDataSource.m; sourceTree = ""; }; - C3286C0515D8769800A436A8 /* _CPTMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTMaskLayer.h; path = Source/_CPTMaskLayer.h; sourceTree = ""; }; - C3286C0615D8769800A436A8 /* _CPTMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTMaskLayer.m; path = Source/_CPTMaskLayer.m; sourceTree = ""; }; - C32EE1BB13EC4AF900038266 /* CPTShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTShadow.h; path = Source/CPTShadow.h; sourceTree = ""; }; - C32EE1BC13EC4AF900038266 /* CPTShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTShadow.m; path = Source/CPTShadow.m; sourceTree = ""; }; - C32EE1C613EC4C7200038266 /* CPTMutableShadow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTMutableShadow.h; path = Source/CPTMutableShadow.h; sourceTree = ""; }; - C32EE1C713EC4C7200038266 /* CPTMutableShadow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTMutableShadow.m; path = Source/CPTMutableShadow.m; sourceTree = ""; }; - C3392A351225F63B008DA6BD /* CPTNumericData+TypeConversion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CPTNumericData+TypeConversion.m"; path = "Source/CPTNumericData+TypeConversion.m"; sourceTree = ""; }; - C3408C4415FC1CA8004F1D70 /* _CPTBorderLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTBorderLayer.h; path = Source/_CPTBorderLayer.h; sourceTree = ""; }; - C3408C4515FC1CA8004F1D70 /* _CPTBorderLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTBorderLayer.m; path = Source/_CPTBorderLayer.m; sourceTree = ""; }; - C3436C4E13F4AC4400739AC2 /* _CPTDarkGradientTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTDarkGradientTheme.m; path = Source/_CPTDarkGradientTheme.m; sourceTree = ""; }; - C3436C5013F4AC6000739AC2 /* _CPTSlateTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTSlateTheme.h; path = Source/_CPTSlateTheme.h; sourceTree = ""; }; - C349DCAE151AAFAB00BFD6A7 /* CPTCalendarFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTCalendarFormatter.h; path = Source/CPTCalendarFormatter.h; sourceTree = ""; }; - C349DCAF151AAFAB00BFD6A7 /* CPTCalendarFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTCalendarFormatter.m; path = Source/CPTCalendarFormatter.m; sourceTree = ""; }; - C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; - C3566B8C10EED17400FB3866 /* doxygen touch.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = SOURCE_ROOT; }; - C3566B8D10EED17400FB3866 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = SOURCE_ROOT; }; - C3566B8E10EED1B000FB3866 /* mainpage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mainpage.h; path = Source/mainpage.h; sourceTree = ""; }; - C35A65A311025EDF00FE24BB /* CPTPlotArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTPlotArea.h; path = Source/CPTPlotArea.h; sourceTree = ""; }; - C35A65A411025EDF00FE24BB /* CPTPlotArea.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTPlotArea.m; path = Source/CPTPlotArea.m; sourceTree = ""; }; - C35A65B111025F8A00FE24BB /* CPTGridLines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGridLines.h; path = Source/CPTGridLines.h; sourceTree = ""; }; - C35A65B211025F8A00FE24BB /* CPTGridLines.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGridLines.m; path = Source/CPTGridLines.m; sourceTree = ""; }; - C35A65B511025FA900FE24BB /* CPTAxisLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAxisLabel.h; path = Source/CPTAxisLabel.h; sourceTree = ""; }; - C35A65B611025FA900FE24BB /* CPTAxisLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAxisLabel.m; path = Source/CPTAxisLabel.m; sourceTree = ""; }; - C35A65B711025FA900FE24BB /* CPTAxisTitle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAxisTitle.h; path = Source/CPTAxisTitle.h; sourceTree = ""; }; - C35A65B811025FA900FE24BB /* CPTAxisTitle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAxisTitle.m; path = Source/CPTAxisTitle.m; sourceTree = ""; }; - C35A65BD11025FB300FE24BB /* CPTAxisLabelGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAxisLabelGroup.h; path = Source/CPTAxisLabelGroup.h; sourceTree = ""; }; - C35A65BE11025FB300FE24BB /* CPTAxisLabelGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAxisLabelGroup.m; path = Source/CPTAxisLabelGroup.m; sourceTree = ""; }; - C35A65C111025FCC00FE24BB /* CPTXYAxis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTXYAxis.h; path = Source/CPTXYAxis.h; sourceTree = ""; }; - C35A65C211025FCC00FE24BB /* CPTXYAxis.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTXYAxis.m; path = Source/CPTXYAxis.m; sourceTree = ""; }; - C35A65C311025FCC00FE24BB /* CPTXYAxisSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTXYAxisSet.h; path = Source/CPTXYAxisSet.h; sourceTree = ""; }; - C35A65C411025FCC00FE24BB /* CPTXYAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTXYAxisSet.m; path = Source/CPTXYAxisSet.m; sourceTree = ""; }; - C35A66051102723E00FE24BB /* CPTTextStylePlatformSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTTextStylePlatformSpecific.h; path = iPhoneOnly/CPTTextStylePlatformSpecific.h; sourceTree = ""; }; - C35A66061102723E00FE24BB /* CPTTextStylePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTTextStylePlatformSpecific.m; path = iPhoneOnly/CPTTextStylePlatformSpecific.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3791D03191D4C2F001EC514 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = iPhoneOnly/CPTImagePlatformSpecific.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C38DD49511A04B99002A68E7 /* CPTGridLineGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTGridLineGroup.h; path = Source/CPTGridLineGroup.h; sourceTree = ""; }; - C38DD49611A04B99002A68E7 /* CPTGridLineGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTGridLineGroup.m; path = Source/CPTGridLineGroup.m; sourceTree = ""; }; - C3920ACD1395B7680045F3BB /* CPTLegend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLegend.h; path = Source/CPTLegend.h; sourceTree = ""; }; - C3920ACE1395B7680045F3BB /* CPTLegend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLegend.m; path = Source/CPTLegend.m; sourceTree = ""; }; - C3978E0E13CE65C600A420D9 /* NSCoderExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCoderExtensions.h; path = Source/NSCoderExtensions.h; sourceTree = ""; }; - C3978E0F13CE65C600A420D9 /* NSCoderExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSCoderExtensions.m; path = Source/NSCoderExtensions.m; sourceTree = ""; }; - C3A695DF146A196100AF5653 /* CPTMutablePlotRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTMutablePlotRange.h; path = Source/CPTMutablePlotRange.h; sourceTree = ""; }; - C3A695E0146A196100AF5653 /* CPTMutablePlotRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTMutablePlotRange.m; path = Source/CPTMutablePlotRange.m; sourceTree = ""; }; - C3B25EE11AC23A930063CCD8 /* CorePlot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CorePlot.h; sourceTree = ""; }; - C3C68318166138E200340E39 /* CPTAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAnimation.h; path = Source/CPTAnimation.h; sourceTree = ""; }; - C3C68319166138E200340E39 /* CPTAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAnimation.m; path = Source/CPTAnimation.m; sourceTree = ""; }; - C3C6831A166138E200340E39 /* CPTAnimationOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAnimationOperation.h; path = Source/CPTAnimationOperation.h; sourceTree = ""; }; - C3C6831B166138E200340E39 /* CPTAnimationOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAnimationOperation.m; path = Source/CPTAnimationOperation.m; sourceTree = ""; }; - C3C6831C166138E200340E39 /* CPTAnimationPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTAnimationPeriod.h; path = Source/CPTAnimationPeriod.h; sourceTree = ""; }; - C3C6831D166138E200340E39 /* CPTAnimationPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTAnimationPeriod.m; path = Source/CPTAnimationPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3C6831E166138E200340E39 /* _CPTAnimationTimingFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationTimingFunctions.h; path = Source/_CPTAnimationTimingFunctions.h; sourceTree = ""; }; - C3C6831F166138E200340E39 /* _CPTAnimationTimingFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationTimingFunctions.m; path = Source/_CPTAnimationTimingFunctions.m; sourceTree = ""; }; - C3C683281661391A00340E39 /* _CPTAnimationCGFloatPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationCGFloatPeriod.h; path = Source/_CPTAnimationCGFloatPeriod.h; sourceTree = ""; }; - C3C683291661391A00340E39 /* _CPTAnimationCGFloatPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationCGFloatPeriod.m; path = Source/_CPTAnimationCGFloatPeriod.m; sourceTree = ""; }; - C3C6832A1661391A00340E39 /* _CPTAnimationCGPointPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationCGPointPeriod.h; path = Source/_CPTAnimationCGPointPeriod.h; sourceTree = ""; }; - C3C6832B1661391A00340E39 /* _CPTAnimationCGPointPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationCGPointPeriod.m; path = Source/_CPTAnimationCGPointPeriod.m; sourceTree = ""; }; - C3C6832C1661391A00340E39 /* _CPTAnimationCGRectPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationCGRectPeriod.h; path = Source/_CPTAnimationCGRectPeriod.h; sourceTree = ""; }; - C3C6832D1661391A00340E39 /* _CPTAnimationCGRectPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationCGRectPeriod.m; path = Source/_CPTAnimationCGRectPeriod.m; sourceTree = ""; }; - C3C6832E1661391A00340E39 /* _CPTAnimationCGSizePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationCGSizePeriod.h; path = Source/_CPTAnimationCGSizePeriod.h; sourceTree = ""; }; - C3C6832F1661391A00340E39 /* _CPTAnimationCGSizePeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationCGSizePeriod.m; path = Source/_CPTAnimationCGSizePeriod.m; sourceTree = ""; }; - C3C683301661391A00340E39 /* _CPTAnimationNSDecimalPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationNSDecimalPeriod.h; path = Source/_CPTAnimationNSDecimalPeriod.h; sourceTree = ""; }; - C3C683311661391A00340E39 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationNSDecimalPeriod.m; path = Source/_CPTAnimationNSDecimalPeriod.m; sourceTree = ""; }; - C3C683321661391A00340E39 /* _CPTAnimationPlotRangePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTAnimationPlotRangePeriod.h; path = Source/_CPTAnimationPlotRangePeriod.h; sourceTree = ""; }; - C3C683331661391A00340E39 /* _CPTAnimationPlotRangePeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTAnimationPlotRangePeriod.m; path = Source/_CPTAnimationPlotRangePeriod.m; sourceTree = ""; }; - C3CADE2F11B1886B00D36017 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = license.txt; path = Source/license.txt; sourceTree = ""; }; - C3CADE3011B188A800D36017 /* CPTNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTNumericData.h; path = Source/CPTNumericData.h; sourceTree = ""; }; - C3CADE3111B188A800D36017 /* CPTNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTNumericData.m; path = Source/CPTNumericData.m; sourceTree = ""; }; - C3CADE3211B188A800D36017 /* CPTNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CPTNumericData+TypeConversion.h"; path = "Source/CPTNumericData+TypeConversion.h"; sourceTree = ""; }; - C3CADE3411B188A800D36017 /* CPTNumericData+TypeConversions_Generation.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = "CPTNumericData+TypeConversions_Generation.py"; path = "Source/CPTNumericData+TypeConversions_Generation.py"; sourceTree = ""; }; - C3CADE3911B188B600D36017 /* CPTNumericDataType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTNumericDataType.h; path = Source/CPTNumericDataType.h; sourceTree = ""; }; - C3CADE3A11B188B600D36017 /* CPTNumericDataType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTNumericDataType.m; path = Source/CPTNumericDataType.m; sourceTree = ""; }; - C3CADE3D11B188C500D36017 /* CPTMutableNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTMutableNumericData.h; path = Source/CPTMutableNumericData.h; sourceTree = ""; }; - C3CADE3E11B188C500D36017 /* CPTMutableNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTMutableNumericData.m; path = Source/CPTMutableNumericData.m; sourceTree = ""; }; - C3CAFB391229E48200F5C989 /* CPTMutableNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CPTMutableNumericData+TypeConversion.h"; path = "Source/CPTMutableNumericData+TypeConversion.h"; sourceTree = ""; }; - C3CAFB3A1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CPTMutableNumericData+TypeConversion.m"; path = "Source/CPTMutableNumericData+TypeConversion.m"; sourceTree = ""; }; - C3CCA04413E8D94800CE6DB1 /* _CPTConstraintsFixed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTConstraintsFixed.h; path = Source/_CPTConstraintsFixed.h; sourceTree = ""; }; - C3CCA04513E8D94800CE6DB1 /* _CPTConstraintsFixed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTConstraintsFixed.m; path = Source/_CPTConstraintsFixed.m; sourceTree = ""; }; - C3CCA04613E8D94800CE6DB1 /* _CPTConstraintsRelative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTConstraintsRelative.h; path = Source/_CPTConstraintsRelative.h; sourceTree = ""; }; - C3CCA04713E8D94800CE6DB1 /* _CPTConstraintsRelative.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTConstraintsRelative.m; path = Source/_CPTConstraintsRelative.m; sourceTree = ""; }; - C3CD282717DE957C008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - C3D3AD3213DF8E9D0004EA73 /* CPTLineCap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTLineCap.h; path = Source/CPTLineCap.h; sourceTree = ""; }; - C3D3AD3313DF8E9D0004EA73 /* CPTLineCap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTLineCap.m; path = Source/CPTLineCap.m; sourceTree = ""; }; - C3D9825016BD406600DE7977 /* CorePlot_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CorePlot_Prefix.pch; sourceTree = ""; }; - C40CFB92107EC1B40057E828 /* _CPTXYTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = _CPTXYTheme.h; path = Source/_CPTXYTheme.h; sourceTree = ""; }; - C40CFB93107EC1B40057E828 /* _CPTXYTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = _CPTXYTheme.m; path = Source/_CPTXYTheme.m; sourceTree = ""; }; - D0C047BD12D6568500DA8047 /* CPTRangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CPTRangePlot.m; path = Source/CPTRangePlot.m; sourceTree = ""; }; - D0C047BE12D6568500DA8047 /* CPTRangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPTRangePlot.h; path = Source/CPTRangePlot.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - BC9B83450FB8A0A40035D8DA /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - BC9B836E0FB8A1700035D8DA /* QuartzCore.framework in Frameworks */, - BC9B836F0FB8A1700035D8DA /* UIKit.framework in Frameworks */, - BC9B83700FB8A1700035D8DA /* Foundation.framework in Frameworks */, - BC9B83710FB8A1700035D8DA /* CoreGraphics.framework in Frameworks */, - C3CD282817DE957C008EED1E /* Accelerate.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 070CB80F0FC9DDD500F3152B /* Drawing */ = { - isa = PBXGroup; - children = ( - 070CB8300FC9DEA800F3152B /* CPTColor.h */, - 070CB8310FC9DEA800F3152B /* CPTColor.m */, - 070CB8320FC9DEA800F3152B /* CPTColorSpace.h */, - 070CB8330FC9DEA800F3152B /* CPTColorSpace.m */, - BC9B82980FB89E610035D8DA /* CPTGradient.h */, - BC9B82990FB89E610035D8DA /* CPTGradient.m */, - BC9B829A0FB89E610035D8DA /* CPTImage.h */, - BC9B829B0FB89E610035D8DA /* CPTImage.m */, - C3D3AD3213DF8E9D0004EA73 /* CPTLineCap.h */, - C3D3AD3313DF8E9D0004EA73 /* CPTLineCap.m */, - BC9B829C0FB89E610035D8DA /* CPTLineStyle.h */, - BC9B829D0FB89E610035D8DA /* CPTLineStyle.m */, - 07B69B6F12B62E9600F4C16C /* CPTMutableLineStyle.h */, - 07B69B7012B62E9600F4C16C /* CPTMutableLineStyle.m */, - 077F28530FE18048000BCA52 /* CPTPathExtensions.h */, - 077F28540FE18048000BCA52 /* CPTPathExtensions.m */, - C32EE1BB13EC4AF900038266 /* CPTShadow.h */, - C32EE1BC13EC4AF900038266 /* CPTShadow.m */, - C32EE1C613EC4C7200038266 /* CPTMutableShadow.h */, - C32EE1C713EC4C7200038266 /* CPTMutableShadow.m */, - BC9B82870FB89E610035D8DA /* Fills */, - C32DDEE3191C674600E0FE84 /* iPhone Specific */, - ); - name = Drawing; - sourceTree = ""; - }; - 070CB8100FC9DDED00F3152B /* Text */ = { - isa = PBXGroup; - children = ( - BC9B829E0FB89E610035D8DA /* CPTTextLayer.h */, - BC9B829F0FB89E610035D8DA /* CPTTextLayer.m */, - 07A62FB30FE2234900CD765C /* CPTTextStyle.h */, - 07A62FB40FE2234900CD765C /* CPTTextStyle.m */, - 07B69AB712B6281100F4C16C /* CPTMutableTextStyle.h */, - 07B69AB812B6281100F4C16C /* CPTMutableTextStyle.m */, - C35A6602110271EB00FE24BB /* iPhone Specific */, - ); - name = Text; - sourceTree = ""; - }; - 070CB8380FC9DEB900F3152B /* Axes */ = { - isa = PBXGroup; - children = ( - 070CB8390FC9DED400F3152B /* CPTAxis.h */, - 070CB83A0FC9DED400F3152B /* CPTAxis.m */, - 070CB83D0FC9DED400F3152B /* CPTAxisSet.h */, - 070CB83E0FC9DED400F3152B /* CPTAxisSet.m */, - C35A65B111025F8A00FE24BB /* CPTGridLines.h */, - C35A65B211025F8A00FE24BB /* CPTGridLines.m */, - C38DD49511A04B99002A68E7 /* CPTGridLineGroup.h */, - C38DD49611A04B99002A68E7 /* CPTGridLineGroup.m */, - C35A65A811025F2000FE24BB /* Labels */, - C35A65A911025F2B00FE24BB /* XY Axes */, - ); - name = Axes; - sourceTree = ""; - }; - 0718DE4411D1ED7D00AF4851 /* Annotations */ = { - isa = PBXGroup; - children = ( - 0718DE4511D1EDBA00AF4851 /* CPTAnnotation.h */, - 0718DE4611D1EDBA00AF4851 /* CPTAnnotation.m */, - 0718DE4711D1EDBA00AF4851 /* CPTAnnotationHostLayer.h */, - 0718DE4811D1EDBA00AF4851 /* CPTAnnotationHostLayer.m */, - 0718DE4911D1EDBA00AF4851 /* CPTLayerAnnotation.h */, - 0718DE4A11D1EDBA00AF4851 /* CPTLayerAnnotation.m */, - 0718DE4B11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.h */, - 0718DE4C11D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.m */, - ); - name = Annotations; - sourceTree = ""; - }; - 072E3F980FE2FF3E00ACF62F /* Themes */ = { - isa = PBXGroup; - children = ( - 072E3F9B0FE2FF7300ACF62F /* CPTTheme.h */, - 072E3F9C0FE2FF7300ACF62F /* CPTTheme.m */, - C40CFB92107EC1B40057E828 /* _CPTXYTheme.h */, - C40CFB93107EC1B40057E828 /* _CPTXYTheme.m */, - C304565213F4AC9A004D04BC /* _CPTDarkGradientTheme.h */, - C3436C4E13F4AC4400739AC2 /* _CPTDarkGradientTheme.m */, - BCC7EA3F1006BF5700B39451 /* _CPTPlainBlackTheme.h */, - BCC7EA401006BF5700B39451 /* _CPTPlainBlackTheme.m */, - BCC7EA411006BF5700B39451 /* _CPTPlainWhiteTheme.h */, - BCC7EA421006BF5700B39451 /* _CPTPlainWhiteTheme.m */, - C3436C5013F4AC6000739AC2 /* _CPTSlateTheme.h */, - 07FCF2D2115B54DE00E46606 /* _CPTSlateTheme.m */, - BCC7EA431006BF5700B39451 /* _CPTStocksTheme.h */, - BCC7EA441006BF5700B39451 /* _CPTStocksTheme.m */, - ); - name = Themes; - sourceTree = ""; - }; - 077F28500FE18011000BCA52 /* Layers */ = { - isa = PBXGroup; - children = ( - BC9B826F0FB89E610035D8DA /* CPTLayer.h */, - BC9B82700FB89E610035D8DA /* CPTLayer.m */, - 077F28510FE18048000BCA52 /* CPTBorderedLayer.h */, - 077F28520FE18048000BCA52 /* CPTBorderedLayer.m */, - C3408C4415FC1CA8004F1D70 /* _CPTBorderLayer.h */, - C3408C4515FC1CA8004F1D70 /* _CPTBorderLayer.m */, - C3286C0515D8769800A436A8 /* _CPTMaskLayer.h */, - C3286C0615D8769800A436A8 /* _CPTMaskLayer.m */, - 07AEF30110BBF99A0012BEFF /* CPTResponder.h */, - ); - name = Layers; - sourceTree = ""; - }; - 0789EFB70FB9F97F00C0A613 /* iPhone Specific */ = { - isa = PBXGroup; - children = ( - 0789EFBA0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.h */, - 0789EFBB0FB9F97F00C0A613 /* CPTPlatformSpecificDefines.m */, - 0789EFB80FB9F97F00C0A613 /* CPTPlatformSpecificCategories.h */, - 0789EFB90FB9F97F00C0A613 /* CPTPlatformSpecificCategories.m */, - 0789EFBC0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.h */, - 0789EFBD0FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.m */, - BC79F1D30FD1DC1A00510976 /* CPTGraphHostingView.h */, - BC79F1D40FD1DC1A00510976 /* CPTGraphHostingView.m */, - ); - name = "iPhone Specific"; - path = iPhoneOnly; - sourceTree = ""; - }; - 07A2E717102DF9A500809BC5 /* Formatters */ = { - isa = PBXGroup; - children = ( - C349DCAE151AAFAB00BFD6A7 /* CPTCalendarFormatter.h */, - C349DCAF151AAFAB00BFD6A7 /* CPTCalendarFormatter.m */, - 07A2E71C102DFAD300809BC5 /* CPTTimeFormatter.h */, - 07A2E71D102DFAD300809BC5 /* CPTTimeFormatter.m */, - ); - name = Formatters; - sourceTree = ""; - }; - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - BC9B83470FB8A0A40035D8DA /* libCorePlot-CocoaTouch.a */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - BC9B82520FB89B420035D8DA /* Source */, - 0789EFB70FB9F97F00C0A613 /* iPhone Specific */, - C3566B8610EED12700FB3866 /* Documentation */, - C3B25EE01AC23A930063CCD8 /* CocoaPods */, - 29B97315FDCFA39411CA2CEA /* Other Sources */, - 29B97317FDCFA39411CA2CEA /* Resources */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - indentWidth = 4; - name = CustomTemplate; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 29B97315FDCFA39411CA2CEA /* Other Sources */ = { - isa = PBXGroup; - children = ( - BC89A7991024AB19009D5261 /* CorePlotProbes.d */, - BC9B83C20FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h */, - C3D9825016BD406600DE7977 /* CorePlot_Prefix.pch */, - C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */, - C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */, - C31908A3199813D400B61898 /* CorePlot.xcconfig */, - C34F570C19D8CE4300446248 /* CorePlotWarnings.xcconfig */, - ); - name = "Other Sources"; - sourceTree = ""; - }; - 29B97317FDCFA39411CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 071F3CDF10FBAB9D00D0A7B6 /* License.txt */, - ); - name = Resources; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - BC9B82690FB89BD10035D8DA /* QuartzCore.framework */, - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 288765A40DF7441C002DB57D /* CoreGraphics.framework */, - C3CD282717DE957C008EED1E /* Accelerate.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - BC9B82520FB89B420035D8DA /* Source */ = { - isa = PBXGroup; - children = ( - C3CADE2911B1885200D36017 /* Numeric Data */, - BC9B82A20FB89E610035D8DA /* Types and Functions */, - 077F28500FE18011000BCA52 /* Layers */, - C3C68316166138B500340E39 /* Animation */, - 0718DE4411D1ED7D00AF4851 /* Annotations */, - C3B623A9107EC5460009EF0B /* Layout */, - 070CB8100FC9DDED00F3152B /* Text */, - 070CB80F0FC9DDD500F3152B /* Drawing */, - 07A2E717102DF9A500809BC5 /* Formatters */, - BC9B82B00FB89E610035D8DA /* Categories */, - BC9B82B50FB89E610035D8DA /* Graphs */, - BC9B82C00FB89E610035D8DA /* Plot Areas */, - BC9B82C50FB89E610035D8DA /* Spaces */, - BC9B82CE0FB89E610035D8DA /* Plots */, - 070CB8380FC9DEB900F3152B /* Axes */, - C3920ACC1395B7410045F3BB /* Legends */, - 072E3F980FE2FF3E00ACF62F /* Themes */, - ); - name = Source; - sourceTree = ""; - }; - BC9B82870FB89E610035D8DA /* Fills */ = { - isa = PBXGroup; - children = ( - BC9B82880FB89E610035D8DA /* CPTFill.h */, - BC9B82890FB89E610035D8DA /* CPTFill.m */, - BC9B828A0FB89E610035D8DA /* _CPTFillColor.h */, - BC9B828B0FB89E610035D8DA /* _CPTFillColor.m */, - BC9B828C0FB89E610035D8DA /* _CPTFillGradient.h */, - BC9B828D0FB89E610035D8DA /* _CPTFillGradient.m */, - BC9B828E0FB89E610035D8DA /* _CPTFillImage.h */, - BC9B828F0FB89E610035D8DA /* _CPTFillImage.m */, - ); - name = Fills; - sourceTree = ""; - }; - BC9B82A20FB89E610035D8DA /* Types and Functions */ = { - isa = PBXGroup; - children = ( - BC9B82A30FB89E610035D8DA /* CPTDefinitions.h */, - BC9B82A40FB89E610035D8DA /* CPTDefinitions.m */, - BC9B82A50FB89E610035D8DA /* CPTExceptions.h */, - BC9B82A60FB89E610035D8DA /* CPTExceptions.m */, - BC9B82A70FB89E610035D8DA /* CPTUtilities.h */, - BC9B82A80FB89E610035D8DA /* CPTUtilities.m */, - BC9B82AB0FB89E610035D8DA /* CPTPlotRange.h */, - BC9B82AC0FB89E610035D8DA /* CPTPlotRange.m */, - C3A695DF146A196100AF5653 /* CPTMutablePlotRange.h */, - C3A695E0146A196100AF5653 /* CPTMutablePlotRange.m */, - C31A40BD17ABD6C60020C5C6 /* CPTFunctionDataSource.h */, - C31A40BE17ABD6C60020C5C6 /* CPTFunctionDataSource.m */, - ); - name = "Types and Functions"; - sourceTree = SOURCE_ROOT; - }; - BC9B82B00FB89E610035D8DA /* Categories */ = { - isa = PBXGroup; - children = ( - C3978E0E13CE65C600A420D9 /* NSCoderExtensions.h */, - C3978E0F13CE65C600A420D9 /* NSCoderExtensions.m */, - BC9B82B10FB89E610035D8DA /* NSDecimalNumberExtensions.h */, - BC9B82B20FB89E610035D8DA /* NSDecimalNumberExtensions.m */, - BC9B82B30FB89E610035D8DA /* NSNumberExtensions.h */, - BC9B82B40FB89E610035D8DA /* NSNumberExtensions.m */, - ); - name = Categories; - sourceTree = SOURCE_ROOT; - }; - BC9B82B50FB89E610035D8DA /* Graphs */ = { - isa = PBXGroup; - children = ( - BC9B82B60FB89E610035D8DA /* CPTGraph.h */, - BC9B82B70FB89E610035D8DA /* CPTGraph.m */, - BC9B82B80FB89E610035D8DA /* CPTXYGraph.h */, - BC9B82B90FB89E610035D8DA /* CPTXYGraph.m */, - ); - name = Graphs; - sourceTree = ""; - }; - BC9B82C00FB89E610035D8DA /* Plot Areas */ = { - isa = PBXGroup; - children = ( - BC9B82C10FB89E610035D8DA /* CPTPlotAreaFrame.h */, - BC9B82C20FB89E610035D8DA /* CPTPlotAreaFrame.m */, - C35A65A311025EDF00FE24BB /* CPTPlotArea.h */, - C35A65A411025EDF00FE24BB /* CPTPlotArea.m */, - C318F4BF11EA18A400595FF9 /* CPTLimitBand.h */, - C318F4C011EA18A400595FF9 /* CPTLimitBand.m */, - ); - name = "Plot Areas"; - sourceTree = SOURCE_ROOT; - }; - BC9B82C50FB89E610035D8DA /* Spaces */ = { - isa = PBXGroup; - children = ( - BC9B82C60FB89E610035D8DA /* CPTPlotSpace.h */, - BC9B82C70FB89E610035D8DA /* CPTPlotSpace.m */, - 074D7BC30FD6B65E006011BC /* CPTXYPlotSpace.h */, - 074D7BC40FD6B65F006011BC /* CPTXYPlotSpace.m */, - ); - name = Spaces; - sourceTree = SOURCE_ROOT; - }; - BC9B82CE0FB89E610035D8DA /* Plots */ = { - isa = PBXGroup; - children = ( - C30C85A91047428100181766 /* CPTPlotGroup.h */, - C30C85AA1047428100181766 /* CPTPlotGroup.m */, - BC9B82D20FB89E610035D8DA /* CPTPlot.h */, - BC9B82D30FB89E610035D8DA /* CPTPlot.m */, - BC9B82DA0FB89E610035D8DA /* CPTBarPlot.h */, - BC9B82DB0FB89E610035D8DA /* CPTBarPlot.m */, - BC74A2C010FC087800E7E90D /* CPTPieChart.h */, - BC74A2C110FC087800E7E90D /* CPTPieChart.m */, - D0C047BE12D6568500DA8047 /* CPTRangePlot.h */, - D0C047BD12D6568500DA8047 /* CPTRangePlot.m */, - BC9B82D40FB89E610035D8DA /* CPTScatterPlot.h */, - BC9B82D50FB89E610035D8DA /* CPTScatterPlot.m */, - 0772B4F110E26A12009CD04C /* CPTTradingRangePlot.h */, - 0772B4F210E26A12009CD04C /* CPTTradingRangePlot.m */, - BC9B82CF0FB89E610035D8DA /* Plot Symbols */, - ); - name = Plots; - sourceTree = SOURCE_ROOT; - }; - BC9B82CF0FB89E610035D8DA /* Plot Symbols */ = { - isa = PBXGroup; - children = ( - BC9B82D00FB89E610035D8DA /* CPTPlotSymbol.h */, - BC9B82D10FB89E610035D8DA /* CPTPlotSymbol.m */, - ); - name = "Plot Symbols"; - sourceTree = SOURCE_ROOT; - }; - C32DDEE3191C674600E0FE84 /* iPhone Specific */ = { - isa = PBXGroup; - children = ( - C3791D03191D4C2F001EC514 /* CPTImagePlatformSpecific.m */, - ); - name = "iPhone Specific"; - sourceTree = ""; - }; - C3566B8610EED12700FB3866 /* Documentation */ = { - isa = PBXGroup; - children = ( - C3566B8C10EED17400FB3866 /* doxygen touch.config */, - C3566B8E10EED1B000FB3866 /* mainpage.h */, - C3566B8D10EED17400FB3866 /* doxygen-cocoa-touch-tags.xml */, - C30E97A014B290650012204A /* DoxygenLayout.xml */, - ); - name = Documentation; - sourceTree = ""; - }; - C35A65A811025F2000FE24BB /* Labels */ = { - isa = PBXGroup; - children = ( - C35A65B511025FA900FE24BB /* CPTAxisLabel.h */, - C35A65B611025FA900FE24BB /* CPTAxisLabel.m */, - C35A65B711025FA900FE24BB /* CPTAxisTitle.h */, - C35A65B811025FA900FE24BB /* CPTAxisTitle.m */, - C35A65BD11025FB300FE24BB /* CPTAxisLabelGroup.h */, - C35A65BE11025FB300FE24BB /* CPTAxisLabelGroup.m */, - ); - name = Labels; - sourceTree = ""; - }; - C35A65A911025F2B00FE24BB /* XY Axes */ = { - isa = PBXGroup; - children = ( - C35A65C111025FCC00FE24BB /* CPTXYAxis.h */, - C35A65C211025FCC00FE24BB /* CPTXYAxis.m */, - C35A65C311025FCC00FE24BB /* CPTXYAxisSet.h */, - C35A65C411025FCC00FE24BB /* CPTXYAxisSet.m */, - ); - name = "XY Axes"; - sourceTree = ""; - }; - C35A6602110271EB00FE24BB /* iPhone Specific */ = { - isa = PBXGroup; - children = ( - C35A66051102723E00FE24BB /* CPTTextStylePlatformSpecific.h */, - C35A66061102723E00FE24BB /* CPTTextStylePlatformSpecific.m */, - ); - name = "iPhone Specific"; - sourceTree = ""; - }; - C3920ACC1395B7410045F3BB /* Legends */ = { - isa = PBXGroup; - children = ( - C3920ACD1395B7680045F3BB /* CPTLegend.h */, - C3920ACE1395B7680045F3BB /* CPTLegend.m */, - C30550E71399BE2000E0151F /* CPTLegendEntry.h */, - C30550E81399BE2000E0151F /* CPTLegendEntry.m */, - ); - name = Legends; - sourceTree = ""; - }; - C3B25EE01AC23A930063CCD8 /* CocoaPods */ = { - isa = PBXGroup; - children = ( - C3B25EE11AC23A930063CCD8 /* CorePlot.h */, - ); - path = CocoaPods; - sourceTree = ""; - }; - C3B623A9107EC5460009EF0B /* Layout */ = { - isa = PBXGroup; - children = ( - 074FADF7112024C500394B90 /* CPTConstraints.h */, - 074FADF8112024C500394B90 /* CPTConstraints.m */, - C3CCA04413E8D94800CE6DB1 /* _CPTConstraintsFixed.h */, - C3CCA04513E8D94800CE6DB1 /* _CPTConstraintsFixed.m */, - C3CCA04613E8D94800CE6DB1 /* _CPTConstraintsRelative.h */, - C3CCA04713E8D94800CE6DB1 /* _CPTConstraintsRelative.m */, - ); - name = Layout; - sourceTree = ""; - }; - C3C68316166138B500340E39 /* Animation */ = { - isa = PBXGroup; - children = ( - C3C68318166138E200340E39 /* CPTAnimation.h */, - C3C68319166138E200340E39 /* CPTAnimation.m */, - C3C6831A166138E200340E39 /* CPTAnimationOperation.h */, - C3C6831B166138E200340E39 /* CPTAnimationOperation.m */, - C3C6831C166138E200340E39 /* CPTAnimationPeriod.h */, - C3C6831D166138E200340E39 /* CPTAnimationPeriod.m */, - C3C683281661391A00340E39 /* _CPTAnimationCGFloatPeriod.h */, - C3C683291661391A00340E39 /* _CPTAnimationCGFloatPeriod.m */, - C3C6832A1661391A00340E39 /* _CPTAnimationCGPointPeriod.h */, - C3C6832B1661391A00340E39 /* _CPTAnimationCGPointPeriod.m */, - C3C6832C1661391A00340E39 /* _CPTAnimationCGRectPeriod.h */, - C3C6832D1661391A00340E39 /* _CPTAnimationCGRectPeriod.m */, - C3C6832E1661391A00340E39 /* _CPTAnimationCGSizePeriod.h */, - C3C6832F1661391A00340E39 /* _CPTAnimationCGSizePeriod.m */, - C3C683301661391A00340E39 /* _CPTAnimationNSDecimalPeriod.h */, - C3C683311661391A00340E39 /* _CPTAnimationNSDecimalPeriod.m */, - C3C683321661391A00340E39 /* _CPTAnimationPlotRangePeriod.h */, - C3C683331661391A00340E39 /* _CPTAnimationPlotRangePeriod.m */, - C3C6831E166138E200340E39 /* _CPTAnimationTimingFunctions.h */, - C3C6831F166138E200340E39 /* _CPTAnimationTimingFunctions.m */, - ); - name = Animation; - sourceTree = ""; - }; - C3CADE2911B1885200D36017 /* Numeric Data */ = { - isa = PBXGroup; - children = ( - C3CADE2F11B1886B00D36017 /* license.txt */, - C3CADE3911B188B600D36017 /* CPTNumericDataType.h */, - C3CADE3A11B188B600D36017 /* CPTNumericDataType.m */, - C3CADE3011B188A800D36017 /* CPTNumericData.h */, - C3CADE3111B188A800D36017 /* CPTNumericData.m */, - C3CADE3D11B188C500D36017 /* CPTMutableNumericData.h */, - C3CADE3E11B188C500D36017 /* CPTMutableNumericData.m */, - C3CADE3211B188A800D36017 /* CPTNumericData+TypeConversion.h */, - C3392A351225F63B008DA6BD /* CPTNumericData+TypeConversion.m */, - C3CAFB391229E48200F5C989 /* CPTMutableNumericData+TypeConversion.h */, - C3CAFB3A1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.m */, - C3CADE3411B188A800D36017 /* CPTNumericData+TypeConversions_Generation.py */, - ); - name = "Numeric Data"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - BC9B83430FB8A0A40035D8DA /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - BC9B83C30FB8AC4B0035D8DA /* CorePlot-CocoaTouch.h in Headers */, - 070CB8430FC9DED400F3152B /* CPTAxis.h in Headers */, - 070CB8470FC9DED400F3152B /* CPTAxisSet.h in Headers */, - 070CB8340FC9DEA800F3152B /* CPTColor.h in Headers */, - 070CB8360FC9DEA800F3152B /* CPTColorSpace.h in Headers */, - 0789EFC00FB9F97F00C0A613 /* CPTPlatformSpecificDefines.h in Headers */, - 0789EFBE0FB9F97F00C0A613 /* CPTPlatformSpecificCategories.h in Headers */, - 0789EFC20FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.h in Headers */, - BC79F1D50FD1DC1A00510976 /* CPTGraphHostingView.h in Headers */, - 074D7BC50FD6B65F006011BC /* CPTXYPlotSpace.h in Headers */, - 077F28550FE18048000BCA52 /* CPTBorderedLayer.h in Headers */, - 077F28570FE18048000BCA52 /* CPTPathExtensions.h in Headers */, - 07A62FB50FE2234900CD765C /* CPTTextStyle.h in Headers */, - 072E3F9F0FE2FF7300ACF62F /* CPTTheme.h in Headers */, - 07A2E71E102DFAD300809BC5 /* CPTTimeFormatter.h in Headers */, - 07A5E24C104E47E900B7AB80 /* CPTTextLayer.h in Headers */, - C3B623C0107EC9370009EF0B /* CPTBarPlot.h in Headers */, - BC74A2C210FC087800E7E90D /* CPTPieChart.h in Headers */, - C3B623C1107EC9400009EF0B /* CPTDefinitions.h in Headers */, - C3B623C2107EC9430009EF0B /* CPTExceptions.h in Headers */, - C3B623C3107EC94D0009EF0B /* CPTFill.h in Headers */, - C3B623C4107EC94E0009EF0B /* CPTGradient.h in Headers */, - C3B623C5107EC9500009EF0B /* CPTGraph.h in Headers */, - C3B623C6107EC9510009EF0B /* CPTImage.h in Headers */, - C3B623C7107EC9540009EF0B /* CPTLayer.h in Headers */, - C3B623C8107EC9570009EF0B /* CPTLineStyle.h in Headers */, - C3B623C9107EC95C0009EF0B /* CPTPlot.h in Headers */, - C3B623CA107EC95E0009EF0B /* CPTPlotAreaFrame.h in Headers */, - C3B623CB107EC9610009EF0B /* CPTPlotRange.h in Headers */, - C3B623CC107EC9620009EF0B /* CPTPlotSpace.h in Headers */, - C3B623CD107EC9630009EF0B /* CPTPlotSymbol.h in Headers */, - C3B623CF107EC9680009EF0B /* CPTScatterPlot.h in Headers */, - C3B623D1107EC96E0009EF0B /* CPTUtilities.h in Headers */, - C3B623D2107EC9760009EF0B /* CPTXYGraph.h in Headers */, - 07AEF30310BBF99A0012BEFF /* CPTResponder.h in Headers */, - 0772B4F310E26A12009CD04C /* CPTTradingRangePlot.h in Headers */, - 074FADF9112024C500394B90 /* CPTConstraints.h in Headers */, - C35A65A511025EDF00FE24BB /* CPTPlotArea.h in Headers */, - C35A65B911025FA900FE24BB /* CPTAxisLabel.h in Headers */, - C35A65BB11025FA900FE24BB /* CPTAxisTitle.h in Headers */, - C35A65C711025FCC00FE24BB /* CPTXYAxis.h in Headers */, - C35A65C911025FCC00FE24BB /* CPTXYAxisSet.h in Headers */, - 0718DE4D11D1EDBA00AF4851 /* CPTAnnotation.h in Headers */, - 0718DE4F11D1EDBA00AF4851 /* CPTAnnotationHostLayer.h in Headers */, - 0718DE5111D1EDBA00AF4851 /* CPTLayerAnnotation.h in Headers */, - 0718DE5311D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.h in Headers */, - C318F4C111EA18A400595FF9 /* CPTLimitBand.h in Headers */, - C3D68B091221650C00EB4863 /* CPTMutableNumericData.h in Headers */, - C3D68B0B1221650E00EB4863 /* CPTNumericData+TypeConversion.h in Headers */, - C3D68B0D1221651200EB4863 /* CPTNumericData.h in Headers */, - C3D68B0F1221651500EB4863 /* CPTNumericDataType.h in Headers */, - C3CAFB3B1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.h in Headers */, - 07B69AB912B6281100F4C16C /* CPTMutableTextStyle.h in Headers */, - 07B69B7112B62E9600F4C16C /* CPTMutableLineStyle.h in Headers */, - D0C047C012D6568500DA8047 /* CPTRangePlot.h in Headers */, - C3920ACF1395B7680045F3BB /* CPTLegend.h in Headers */, - C30550E91399BE2000E0151F /* CPTLegendEntry.h in Headers */, - C3D3AD3413DF8E9D0004EA73 /* CPTLineCap.h in Headers */, - C32EE1BD13EC4AF900038266 /* CPTShadow.h in Headers */, - C32EE1C813EC4C7200038266 /* CPTMutableShadow.h in Headers */, - C3A695E1146A196100AF5653 /* CPTMutablePlotRange.h in Headers */, - C349DCB0151AAFAB00BFD6A7 /* CPTCalendarFormatter.h in Headers */, - C35A66071102723E00FE24BB /* CPTTextStylePlatformSpecific.h in Headers */, - C3286C0715D8769800A436A8 /* _CPTMaskLayer.h in Headers */, - C3408C4615FC1CA8004F1D70 /* _CPTBorderLayer.h in Headers */, - BCC7EA451006BF5700B39451 /* _CPTPlainBlackTheme.h in Headers */, - BCC7EA471006BF5700B39451 /* _CPTPlainWhiteTheme.h in Headers */, - BCC7EA491006BF5700B39451 /* _CPTStocksTheme.h in Headers */, - C40CFB94107EC1B40057E828 /* _CPTXYTheme.h in Headers */, - C3B623D4107EC9800009EF0B /* _CPTFillColor.h in Headers */, - C3B623D5107EC9820009EF0B /* _CPTFillGradient.h in Headers */, - C3B623D6107EC9830009EF0B /* _CPTFillImage.h in Headers */, - C3CCA04813E8D94800CE6DB1 /* _CPTConstraintsFixed.h in Headers */, - C3CCA04A13E8D94800CE6DB1 /* _CPTConstraintsRelative.h in Headers */, - C3436C5113F4AC6000739AC2 /* _CPTSlateTheme.h in Headers */, - C304565313F4AC9A004D04BC /* _CPTDarkGradientTheme.h in Headers */, - C35A65BF11025FB300FE24BB /* CPTAxisLabelGroup.h in Headers */, - C38DD49711A04B99002A68E7 /* CPTGridLineGroup.h in Headers */, - C35A65B311025F8A00FE24BB /* CPTGridLines.h in Headers */, - C30C85AB1047428100181766 /* CPTPlotGroup.h in Headers */, - C3978E1013CE65C600A420D9 /* NSCoderExtensions.h in Headers */, - BC4FAF29100D7DF300811DD3 /* NSDecimalNumberExtensions.h in Headers */, - C3B623D3107EC97A0009EF0B /* NSNumberExtensions.h in Headers */, - C3C68320166138E200340E39 /* CPTAnimation.h in Headers */, - C3C68322166138E200340E39 /* CPTAnimationOperation.h in Headers */, - C3C68324166138E200340E39 /* CPTAnimationPeriod.h in Headers */, - C3C68326166138E200340E39 /* _CPTAnimationTimingFunctions.h in Headers */, - C3C683341661391A00340E39 /* _CPTAnimationCGFloatPeriod.h in Headers */, - C3C683361661391A00340E39 /* _CPTAnimationCGPointPeriod.h in Headers */, - C3C683381661391A00340E39 /* _CPTAnimationCGRectPeriod.h in Headers */, - C3C6833A1661391A00340E39 /* _CPTAnimationCGSizePeriod.h in Headers */, - C3C6833C1661391A00340E39 /* _CPTAnimationNSDecimalPeriod.h in Headers */, - C3C6833E1661391A00340E39 /* _CPTAnimationPlotRangePeriod.h in Headers */, - C3D9825116BD406600DE7977 /* CorePlot_Prefix.pch in Headers */, - C31A40BF17ABD6C60020C5C6 /* CPTFunctionDataSource.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - BC9B83460FB8A0A40035D8DA /* CorePlot-CocoaTouch */ = { - isa = PBXNativeTarget; - buildConfigurationList = BC9B834A0FB8A0AA0035D8DA /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouch" */; - buildPhases = ( - BC9B83430FB8A0A40035D8DA /* Headers */, - BC9B83440FB8A0A40035D8DA /* Sources */, - BC9B83450FB8A0A40035D8DA /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "CorePlot-CocoaTouch"; - productName = "CorePlot-CocoaTouch"; - productReference = BC9B83470FB8A0A40035D8DA /* libCorePlot-CocoaTouch.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0700; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CorePlot-CocoaTouch" */; - compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - BC9B83460FB8A0A40035D8DA /* CorePlot-CocoaTouch */, - C3566B8010EED04900FB3866 /* Documentation */, - 0799D97A137318CF0026072C /* Universal Library */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXShellScriptBuildPhase section */ - 0799D97F137318D80026072C /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\nUFW_TARGET=${PROJECT}\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest iphoneos SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"iphoneos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_DIR=\"${UFW_BUILD_DIR}/Release-iphoneos\"\nUFW_SIMULATOR_DIR=\"${UFW_BUILD_DIR}/Release-iphonesimulator\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-universal\"\nUFW_HEADER_DIR=\"${UFW_UNIVERSAL_DIR}/CorePlotHeaders\"\nUFW_EXE_PATH=\"lib${PROJECT}.a\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot-CocoaTouch.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot-CocoaTouch.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\nlipo -create -output \"${UFW_UNIVERSAL_DIR}/${UFW_EXE_PATH}\" \"${UFW_IPHONE_DIR}/${UFW_EXE_PATH}\" \"${UFW_SIMULATOR_DIR}/${UFW_EXE_PATH}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n\n# copy header files\nmkdir -p \"${UFW_HEADER_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp \"${SOURCE_ROOT}/CorePlot-CocoaTouch.h\" \"${UFW_HEADER_DIR}\"\ncp \"${SOURCE_ROOT}/iPhoneOnly/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\ncp \"${SOURCE_ROOT}/Source/\"[!_]*.h \"${UFW_HEADER_DIR}/\"\n\nrm \"${UFW_HEADER_DIR}/\"*Tests.*"; - }; - C3566B7F10EED04900FB3866 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"' to \n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ]\nthen\n echo doxygen config file does not exist\n ${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/iOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlotTouch.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotTouchDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - BC9B83440FB8A0A40035D8DA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BC9B834E0FB8A1400035D8DA /* CPTPlot.m in Sources */, - BC9B834F0FB8A1400035D8DA /* CPTScatterPlot.m in Sources */, - BC9B83500FB8A1400035D8DA /* CPTBarPlot.m in Sources */, - BC9B83510FB8A1400035D8DA /* CPTPlotSymbol.m in Sources */, - BC9B83520FB8A1400035D8DA /* CPTPlotSpace.m in Sources */, - BC9B83550FB8A1400035D8DA /* CPTPlotAreaFrame.m in Sources */, - BC9B83560FB8A1400035D8DA /* CPTGraph.m in Sources */, - BC9B83570FB8A1400035D8DA /* CPTXYGraph.m in Sources */, - BC9B835A0FB8A1400035D8DA /* NSDecimalNumberExtensions.m in Sources */, - BC9B835B0FB8A1400035D8DA /* NSNumberExtensions.m in Sources */, - BC9B835D0FB8A1400035D8DA /* CPTDefinitions.m in Sources */, - BC9B835E0FB8A1400035D8DA /* CPTExceptions.m in Sources */, - BC9B835F0FB8A1400035D8DA /* CPTUtilities.m in Sources */, - BC9B83600FB8A1400035D8DA /* CPTPlotRange.m in Sources */, - BC9B83610FB8A1400035D8DA /* CPTFill.m in Sources */, - BC9B83620FB8A1400035D8DA /* _CPTFillColor.m in Sources */, - BC9B83630FB8A1400035D8DA /* _CPTFillGradient.m in Sources */, - BC9B83640FB8A1400035D8DA /* _CPTFillImage.m in Sources */, - C3791D05191D4C2F001EC514 /* CPTImagePlatformSpecific.m in Sources */, - 0789EFBF0FB9F97F00C0A613 /* CPTPlatformSpecificCategories.m in Sources */, - 0789EFC10FB9F97F00C0A613 /* CPTPlatformSpecificDefines.m in Sources */, - 0789EFC30FB9F97F00C0A613 /* CPTPlatformSpecificFunctions.m in Sources */, - 070CB82A0FC9DE4B00F3152B /* CPTGradient.m in Sources */, - 070CB82B0FC9DE5500F3152B /* CPTImage.m in Sources */, - 070CB82C0FC9DE5600F3152B /* CPTLayer.m in Sources */, - 070CB82D0FC9DE5700F3152B /* CPTLineStyle.m in Sources */, - 070CB8350FC9DEA800F3152B /* CPTColor.m in Sources */, - 070CB8370FC9DEA800F3152B /* CPTColorSpace.m in Sources */, - 070CB8440FC9DED400F3152B /* CPTAxis.m in Sources */, - 070CB8480FC9DED400F3152B /* CPTAxisSet.m in Sources */, - 070CB85E0FC9DF4700F3152B /* CPTTextLayer.m in Sources */, - BC79F1D60FD1DC1A00510976 /* CPTGraphHostingView.m in Sources */, - 074D7BC60FD6B65F006011BC /* CPTXYPlotSpace.m in Sources */, - 077F28560FE18048000BCA52 /* CPTBorderedLayer.m in Sources */, - 077F28580FE18048000BCA52 /* CPTPathExtensions.m in Sources */, - 07A62FB60FE2234900CD765C /* CPTTextStyle.m in Sources */, - 072E3FA00FE2FF7300ACF62F /* CPTTheme.m in Sources */, - BCC7EA461006BF5700B39451 /* _CPTPlainBlackTheme.m in Sources */, - BCC7EA481006BF5700B39451 /* _CPTPlainWhiteTheme.m in Sources */, - BCC7EA4A1006BF5700B39451 /* _CPTStocksTheme.m in Sources */, - BC89A79A1024AB19009D5261 /* CorePlotProbes.d in Sources */, - 07A2E71F102DFAD300809BC5 /* CPTTimeFormatter.m in Sources */, - C30C85AC1047428100181766 /* CPTPlotGroup.m in Sources */, - C40CFB95107EC1B40057E828 /* _CPTXYTheme.m in Sources */, - 0772B4F410E26A12009CD04C /* CPTTradingRangePlot.m in Sources */, - BC74A2C310FC087800E7E90D /* CPTPieChart.m in Sources */, - 074FADFA112024C500394B90 /* CPTConstraints.m in Sources */, - 07FCF2D4115B54DE00E46606 /* _CPTSlateTheme.m in Sources */, - C35A65A611025EDF00FE24BB /* CPTPlotArea.m in Sources */, - C35A65B411025F8A00FE24BB /* CPTGridLines.m in Sources */, - C35A65BA11025FA900FE24BB /* CPTAxisLabel.m in Sources */, - C35A65BC11025FA900FE24BB /* CPTAxisTitle.m in Sources */, - C35A65C011025FB300FE24BB /* CPTAxisLabelGroup.m in Sources */, - C35A65C811025FCC00FE24BB /* CPTXYAxis.m in Sources */, - C35A65CA11025FCC00FE24BB /* CPTXYAxisSet.m in Sources */, - C35A66081102723E00FE24BB /* CPTTextStylePlatformSpecific.m in Sources */, - C38DD49811A04B99002A68E7 /* CPTGridLineGroup.m in Sources */, - 0718DE4E11D1EDBA00AF4851 /* CPTAnnotation.m in Sources */, - 0718DE5011D1EDBA00AF4851 /* CPTAnnotationHostLayer.m in Sources */, - 0718DE5211D1EDBA00AF4851 /* CPTLayerAnnotation.m in Sources */, - 0718DE5411D1EDBA00AF4851 /* CPTPlotSpaceAnnotation.m in Sources */, - C318F4C211EA18A400595FF9 /* CPTLimitBand.m in Sources */, - C3D68B0A1221650D00EB4863 /* CPTMutableNumericData.m in Sources */, - C3D68B0E1221651200EB4863 /* CPTNumericData.m in Sources */, - C3D68B101221651600EB4863 /* CPTNumericDataType.m in Sources */, - C3392A361225F63B008DA6BD /* CPTNumericData+TypeConversion.m in Sources */, - C3CAFB3C1229E48200F5C989 /* CPTMutableNumericData+TypeConversion.m in Sources */, - 07B69ABA12B6281100F4C16C /* CPTMutableTextStyle.m in Sources */, - 07B69B7212B62E9600F4C16C /* CPTMutableLineStyle.m in Sources */, - D0C047BF12D6568500DA8047 /* CPTRangePlot.m in Sources */, - C3920AD01395B7680045F3BB /* CPTLegend.m in Sources */, - C30550EA1399BE2000E0151F /* CPTLegendEntry.m in Sources */, - C3978E1113CE65C600A420D9 /* NSCoderExtensions.m in Sources */, - C3D3AD3513DF8E9D0004EA73 /* CPTLineCap.m in Sources */, - C3CCA04913E8D94800CE6DB1 /* _CPTConstraintsFixed.m in Sources */, - C3CCA04B13E8D94800CE6DB1 /* _CPTConstraintsRelative.m in Sources */, - C32EE1BE13EC4AF900038266 /* CPTShadow.m in Sources */, - C32EE1C913EC4C7200038266 /* CPTMutableShadow.m in Sources */, - C3436C4F13F4AC4400739AC2 /* _CPTDarkGradientTheme.m in Sources */, - C3A695E2146A196100AF5653 /* CPTMutablePlotRange.m in Sources */, - C349DCB1151AAFAB00BFD6A7 /* CPTCalendarFormatter.m in Sources */, - C3286C0815D8769800A436A8 /* _CPTMaskLayer.m in Sources */, - C3408C4715FC1CA8004F1D70 /* _CPTBorderLayer.m in Sources */, - C3C68321166138E200340E39 /* CPTAnimation.m in Sources */, - C3C68323166138E200340E39 /* CPTAnimationOperation.m in Sources */, - C3C68325166138E200340E39 /* CPTAnimationPeriod.m in Sources */, - C3C68327166138E200340E39 /* _CPTAnimationTimingFunctions.m in Sources */, - C3C683351661391A00340E39 /* _CPTAnimationCGFloatPeriod.m in Sources */, - C3C683371661391A00340E39 /* _CPTAnimationCGPointPeriod.m in Sources */, - C3C683391661391A00340E39 /* _CPTAnimationCGRectPeriod.m in Sources */, - C3C6833B1661391A00340E39 /* _CPTAnimationCGSizePeriod.m in Sources */, - C3C6833D1661391A00340E39 /* _CPTAnimationNSDecimalPeriod.m in Sources */, - C3C6833F1661391A00340E39 /* _CPTAnimationPlotRangePeriod.m in Sources */, - C31A40C017ABD6C60020C5C6 /* CPTFunctionDataSource.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 0799D97B137318CF0026072C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = UniversalLibrary; - }; - name = Debug; - }; - 0799D97C137318CF0026072C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = UniversalLibrary; - }; - name = Release; - }; - BC9B83480FB8A0A50035D8DA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C302230B1BB8B49700514011 /* CorePlotDebug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_SYMBOL_SEPARATION = YES; - INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - PRODUCT_NAME = "CorePlot-CocoaTouch"; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; - }; - name = Debug; - }; - BC9B83490FB8A0A50035D8DA /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C302230C1BB8B49700514011 /* CorePlotRelease.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - GCC_ENABLE_SYMBOL_SEPARATION = YES; - INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - PRODUCT_NAME = "CorePlot-CocoaTouch"; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MACH_O_TYPE = staticlib; - SDKROOT = iphoneos; - SYMROOT = "$(PROJECT_DIR)/../build"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEPLOYMENT_POSTPROCESSING = YES; - GCC_INLINES_ARE_PRIVATE_EXTERN = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MACH_O_TYPE = staticlib; - SDKROOT = iphoneos; - SYMROOT = "$(PROJECT_DIR)/../build"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - C3566B8110EED04A00FB3866 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - PRODUCT_NAME = Documentation; - }; - name = Debug; - }; - C3566B8210EED04A00FB3866 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; - PRODUCT_NAME = Documentation; - ZERO_LINK = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0799D97D137318CF0026072C /* Build configuration list for PBXAggregateTarget "Universal Library" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0799D97B137318CF0026072C /* Debug */, - 0799D97C137318CF0026072C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BC9B834A0FB8A0AA0035D8DA /* Build configuration list for PBXNativeTarget "CorePlot-CocoaTouch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BC9B83480FB8A0A50035D8DA /* Debug */, - BC9B83490FB8A0A50035D8DA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CorePlot-CocoaTouch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C3566B8410EED06800FB3866 /* Build configuration list for PBXAggregateTarget "Documentation" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C3566B8110EED04A00FB3866 /* Debug */, - C3566B8210EED04A00FB3866 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/framework/CorePlot-CocoaTouch.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 8937881b3..000000000 --- a/framework/CorePlot-CocoaTouch.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From d373e5d609568a65eafbea026da40c8992ab85b6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 15:23:07 -0400 Subject: [PATCH 100/429] Changed deprecated target conditional TARGET_IPHONE_SIMULATOR symbol to TARGET_OS_SIMULATOR. --- documentation/doxygen/doxygen touch.config | 2 +- examples/CorePlotGallery/src/plots/CandlestickPlot.m | 2 +- examples/CorePlotGallery/src/plots/ColoredBarChart.m | 2 +- examples/CorePlotGallery/src/plots/CompositePlot.m | 10 +++++----- examples/CorePlotGallery/src/plots/ControlChart.m | 2 +- .../CorePlotGallery/src/plots/CurvedScatterPlot.m | 2 +- examples/CorePlotGallery/src/plots/DatePlot.m | 2 +- examples/CorePlotGallery/src/plots/DonutChart.m | 2 +- examples/CorePlotGallery/src/plots/FunctionPlot.m | 10 +++++----- .../CorePlotGallery/src/plots/GradientScatterPlot.m | 2 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 2 +- examples/CorePlotGallery/src/plots/RangePlot.m | 4 ++-- examples/CorePlotGallery/src/plots/RealTimePlot.m | 2 +- examples/CorePlotGallery/src/plots/SimplePieChart.m | 4 ++-- .../CorePlotGallery/src/plots/SimpleScatterPlot.m | 2 +- .../CorePlotGallery/src/plots/SteppedScatterPlot.m | 2 +- .../CorePlotGallery/src/plots/VerticalBarChart.m | 2 +- examples/CorePlotGallery/src/shared/PlotItem.h | 4 ++-- examples/CorePlotGallery/src/shared/PlotItem.m | 12 ++++++------ framework/CocoaPods/CorePlot.h | 2 +- framework/CorePlot.h | 2 +- framework/CorePlot_Prefix.pch | 2 +- framework/Source/CPTBarPlot.m | 2 +- framework/Source/CPTColor.m | 2 +- framework/Source/CPTColorSpace.m | 4 ++-- framework/Source/CPTFillTests.m | 2 +- framework/Source/CPTGradient.m | 4 ++-- framework/Source/CPTGraph.m | 2 +- framework/Source/CPTImage.m | 4 ++-- framework/Source/CPTImageTests.m | 2 +- framework/Source/CPTLayer.m | 2 +- framework/Source/CPTLegendEntry.m | 6 +++--- framework/Source/CPTPieChart.m | 2 +- framework/Source/CPTPlot.m | 4 ++-- framework/Source/CPTPlotSpace.h | 2 +- framework/Source/CPTPlotSpace.m | 2 +- framework/Source/CPTRangePlot.m | 2 +- framework/Source/CPTResponder.h | 2 +- framework/Source/CPTScatterPlot.m | 2 +- framework/Source/CPTTextLayer.m | 8 ++++---- framework/Source/CPTTradingRangePlot.m | 2 +- framework/Source/CPTUtilitiesTests.m | 2 +- framework/Source/CPTXYPlotSpace.m | 4 ++-- framework/Source/NSCoderExtensions.m | 4 ++-- framework/iPhoneOnly/CPTTextStylePlatformSpecific.h | 2 +- 45 files changed, 72 insertions(+), 72 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index a510a9239..4f4b127fe 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2042,7 +2042,7 @@ INCLUDE_FILE_PATTERNS = # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = TARGET_OS_IPHONE, \ - TARGET_IPHONE_SIMULATOR, \ + TARGET_OS_SIMULATOR, \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type" \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index d52cba84d..2729cd7b5 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -69,7 +69,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // for daylight savings time. NSDate *refDate = [NSDate dateWithTimeIntervalSinceReferenceDate:oneDay / 2.0]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 546302a25..188cdee00 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -38,7 +38,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index e886e7ff2..15e318092 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -53,7 +53,7 @@ -(instancetype)init #pragma mark - #pragma mark Plot construction methods -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -(void)setFrameSize:(NSSize)newSize @@ -87,7 +87,7 @@ -(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)t CPTGraphHostingView *barView = [[CPTGraphHostingView alloc] init]; CPTGraphHostingView *pieView = [[CPTGraphHostingView alloc] init]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE for ( UIView *view in @[scatterView, barView, pieView] ) { view.translatesAutoresizingMaskIntoConstraints = NO; [hostingView addSubview:view]; @@ -224,7 +224,7 @@ -(void)killGraph -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme { // Create graph from theme -#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR CGRect bounds = self.scatterPlotView.bounds; #else CGRect bounds = NSRectToCGRect(self.scatterPlotView.bounds); @@ -330,7 +330,7 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); @@ -398,7 +398,7 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( -(void)renderPieChartInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE [hostingView layoutIfNeeded]; CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index c98248e49..e7ae2eee9 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -65,7 +65,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index d962f902c..f01c390f2 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -131,7 +131,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index a55090831..46b22165a 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -73,7 +73,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP NSTimeInterval oneDay = 24 * 60 * 60; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index aefde8567..f4288de77 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -37,7 +37,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 0adea48f8..1b01cc51d 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -6,7 +6,7 @@ @interface FunctionPlot() @property (nonatomic, readwrite, strong) NSMutableSet *dataSources; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -(UIFont *)italicFontForFont:(UIFont *)oldFont; #else -(NSFont *)italicFontForFont:(NSFont *)oldFont; @@ -50,7 +50,7 @@ -(void)killGraph -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); @@ -144,7 +144,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:titleString attributes:textAttributes]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE UIFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; #else NSFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; @@ -157,7 +157,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP value:italicFont range:NSMakeRange(8, 1)]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE UIFont *labelFont = [UIFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; #else NSFont *labelFont = [NSFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; @@ -207,7 +207,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP graph.legendDisplacement = CGPointMake( 0.0, self.titleSize * CPTFloat(1.25) ); } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -(UIFont *)italicFontForFont:(UIFont *)oldFont { NSString *italicName = nil; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index e54109f59..bb3075dea 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -63,7 +63,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 415d757f0..53a591f1e 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -69,7 +69,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // for daylight savings time. NSDate *refDate = [NSDate dateWithTimeIntervalSinceReferenceDate:oneDay / 2.0]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 175d887f8..8b75149d0 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -75,7 +75,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // for daylight savings time. NSDate *refDate = [NSDate dateWithTimeIntervalSinceReferenceDate:oneDay / 2.0]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); @@ -94,7 +94,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP textStyle.fontName = @"Helvetica"; textStyle.fontSize = self.titleSize * CPTFloat(0.5); -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:@"Touch to Toggle Range Plot Style" style:textStyle]; #else CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:@"Click to Toggle Range Plot Style" style:textStyle]; diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 85ff7bb6a..fb55db37b 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -59,7 +59,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 6bb29fd2c..dbe5d8f70 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -45,7 +45,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); @@ -189,7 +189,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI -(NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE UIColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].uiColor; UIFont *labelFont = [UIFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; #else diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 98450bab8..3fa95c55f 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -67,7 +67,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index 1aa277843..ad3e78436 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -46,7 +46,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index ac6cb517f..24e115782 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -52,7 +52,7 @@ -(void)generateData -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else CGRect bounds = NSRectToCGRect(hostingView.bounds); diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index 43ad4f566..bb9983876 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -7,7 +7,7 @@ #import -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #import typedef CGRect CGNSRect; @@ -42,7 +42,7 @@ extern NSString *const kFinancialPlots; -(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated; -(CPTNativeImage *)image; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -(void)setFrameSize:(NSSize)size; #endif diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 15254b415..c1e227253 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -7,7 +7,7 @@ #import -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else // For IKImageBrowser #import @@ -121,7 +121,7 @@ -(CGFloat)titleSize { CGFloat size; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE switch ( UI_USER_INTERFACE_IDIOM() ) { case UIUserInterfaceIdiomPad: size = 24.0; @@ -238,7 +238,7 @@ -(void)formatAllGraphs } } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -(UIImage *)image { @@ -336,7 +336,7 @@ -(void)applyTheme:(CPTTheme *)theme toGraph:(CPTGraph *)graph withDefault:(CPTTh } } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -(void)setFrameSize:(NSSize)size { @@ -351,7 +351,7 @@ -(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme [inView addSubview:hostingView]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE hostingView.translatesAutoresizingMaskIntoConstraints = NO; [inView addConstraint:[NSLayoutConstraint constraintWithItem:hostingView attribute:NSLayoutAttributeLeft @@ -409,7 +409,7 @@ -(void)reloadData #pragma mark - #pragma mark IKImageBrowserItem methods -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -(NSString *)imageUID diff --git a/framework/CocoaPods/CorePlot.h b/framework/CocoaPods/CorePlot.h index 93a0fbd03..4e179d028 100644 --- a/framework/CocoaPods/CorePlot.h +++ b/framework/CocoaPods/CorePlot.h @@ -1,4 +1,4 @@ -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #import #import #else diff --git a/framework/CorePlot.h b/framework/CorePlot.h index 1c6a5e0fc..58b4f85a3 100644 --- a/framework/CorePlot.h +++ b/framework/CorePlot.h @@ -1,4 +1,4 @@ -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #import #import diff --git a/framework/CorePlot_Prefix.pch b/framework/CorePlot_Prefix.pch index b5e735ebf..47e2dd492 100644 --- a/framework/CorePlot_Prefix.pch +++ b/framework/CorePlot_Prefix.pch @@ -7,7 +7,7 @@ #import - #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #import #import #else diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 7ae9af868..b7d0fcd42 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -195,7 +195,7 @@ +(instancetype)tubularBarPlotWithColor:(CPTColor *)color horizontalBars:(BOOL)ho /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 5e7f813d7..8ea4e9951 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -523,7 +523,7 @@ -(NSUInteger)hash -(id)debugQuickLookObject { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE return self.uiColor; #else diff --git a/framework/Source/CPTColorSpace.m b/framework/Source/CPTColorSpace.m index 0f184e7cd..b6c51d2d6 100644 --- a/framework/Source/CPTColorSpace.m +++ b/framework/Source/CPTColorSpace.m @@ -32,7 +32,7 @@ +(instancetype)genericRGBSpace dispatch_once(&onceToken, ^{ CGColorSpaceRef cgSpace = NULL; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE cgSpace = CGColorSpaceCreateDeviceRGB(); #else cgSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); @@ -68,7 +68,7 @@ -(instancetype)init { CGColorSpaceRef cgSpace = NULL; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE cgSpace = CGColorSpaceCreateDeviceRGB(); #else cgSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); diff --git a/framework/Source/CPTFillTests.m b/framework/Source/CPTFillTests.m index c0acf4d02..34491a096 100644 --- a/framework/Source/CPTFillTests.m +++ b/framework/Source/CPTFillTests.m @@ -62,7 +62,7 @@ -(void)testKeyedArchivingRoundTripImage size_t bytesPerRow = (4 * width + 15) & ~15ul; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); #else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 1d30027bf..8203063e8 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -765,7 +765,7 @@ -(CGColorRef)newColorStopAtIndex:(NSUInteger)idx CPTGradientElement *element = [self elementAtIndex:idx]; if ( element != NULL ) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGFloat colorComponents[4] = { element->color.red, element->color.green, element->color.blue, element->color.alpha }; return CGColorCreate(self.colorspace.cgColorSpace, colorComponents); @@ -802,7 +802,7 @@ -(CGColorRef)newColorAtPosition:(CGFloat)position break; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGFloat colorComponents[4] = { components[0], components[1], components[2], components[3] }; gradientColor = CGColorCreate(self.colorspace.cgColorSpace, colorComponents); #else diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index c39022c06..e8477f88f 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -1225,7 +1225,7 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event } } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index c955dc999..9f936fddd 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -509,7 +509,7 @@ -(CPTNativeImage *)nativeImage if ( !nativeImage ) { CGImageRef imageRef = self.image; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGFloat theScale = self.scale; if ( imageRef && ( theScale > CPTFloat(0.0) ) ) { @@ -719,7 +719,7 @@ -(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context CPTNativeImage *theNativeImage = self.nativeImage; if ( theNativeImage ) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE theImage = theNativeImage.CGImage; self.scale = theNativeImage.scale; #else diff --git a/framework/Source/CPTImageTests.m b/framework/Source/CPTImageTests.m index d17af8461..652ac8138 100644 --- a/framework/Source/CPTImageTests.m +++ b/framework/Source/CPTImageTests.m @@ -14,7 +14,7 @@ -(void)testKeyedArchivingRoundTrip size_t bytesPerRow = (4 * width + 15) & ~15ul; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); #else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 56a67032e..e3bed66e1 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -480,7 +480,7 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event return NO; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 380a885a8..df18d41fd 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -131,7 +131,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder **/ -(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFloat)scale { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGContextSaveGState(context); CGContextTranslateCTM(context, CPTFloat(0.0), rect.origin.y); CGContextScaleCTM( context, CPTFloat(1.0), CPTFloat(-1.0) ); @@ -170,7 +170,7 @@ -(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFlo inContext:context]; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGContextRestoreGState(context); #endif } @@ -201,7 +201,7 @@ -(CGSize)titleSize NSAttributedString *styledTitle = self.attributedTitle; if ( (styledTitle.length > 0) && [styledTitle respondsToSelector:@selector(size)] ) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE theTitleSize = styledTitle.size; #else theTitleSize = NSSizeToCGSize(styledTitle.size); diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 7b876ddf1..d46ceb81f 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -171,7 +171,7 @@ +(CPTColor *)defaultPieSliceColorForIndex:(NSUInteger)pieSliceIndex /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 79aa418bd..c6b9404dc 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -248,7 +248,7 @@ @implementation CPTPlot /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { @@ -446,7 +446,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder #pragma mark - #pragma mark Bindings -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /// @cond diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 8dd84ec78..c89643179 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -135,7 +135,7 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; **/ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** @brief @optional Notifies that plot space intercepted a scroll wheel event. diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 5099be368..79ad01a28 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -429,7 +429,7 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event return handledByDelegate; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index f157ccd3c..614613af7 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -137,7 +137,7 @@ @implementation CPTRangePlot /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { diff --git a/framework/Source/CPTResponder.h b/framework/Source/CPTResponder.h index 0e60d5d54..6b56832ff 100644 --- a/framework/Source/CPTResponder.h +++ b/framework/Source/CPTResponder.h @@ -48,7 +48,7 @@ **/ -(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 8eaf87835..92006d02e 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -180,7 +180,7 @@ @implementation CPTScatterPlot /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index 05412a560..a85f44cb0 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -302,7 +302,7 @@ -(CGSize)sizeThatFits if ( myText.length > 0 ) { NSAttributedString *styledText = self.attributedText; if ( (styledText.length > 0) && [styledText respondsToSelector:@selector(size)] ) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE textSize = styledText.size; #else textSize = NSSizeToCGSize(styledText.size); @@ -367,7 +367,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context if ( myText.length > 0 ) { [super renderAsVectorInContext:context]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGContextSaveGState(context); CGContextTranslateCTM(context, CPTFloat(0.0), self.bounds.size.height); CGContextScaleCTM( context, CPTFloat(1.0), CPTFloat(-1.0) ); @@ -375,7 +375,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context CGRect newBounds = CGRectInset(self.bounds, kCPTTextLayerMarginWidth, kCPTTextLayerMarginWidth); newBounds.origin.x += self.paddingLeft; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE newBounds.origin.y += self.paddingTop; #else newBounds.origin.y += self.paddingBottom; @@ -394,7 +394,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context inContext:context]; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGContextRestoreGState(context); #endif } diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 392dc1e38..a7fd09919 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -158,7 +158,7 @@ @implementation CPTTradingRangePlot /// @cond -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else +(void)initialize { diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index 75726a79e..4eb054a8a 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -15,7 +15,7 @@ -(void)setUp const size_t height = 50; const size_t bitsPerComponent = 8; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); #else CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 4896b0827..64df962cd 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -1314,7 +1314,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event CPTPlotArea *thePlotArea = theGraph.plotAreaFrame.plotArea; if ( theHostingView && thePlotArea ) { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGPoint interactionPoint = [[[event touchesForView:theHostingView] anyObject] locationInView:theHostingView]; if ( theHostingView.collapsesLayers ) { interactionPoint.y = theHostingView.frame.size.height - interactionPoint.y; @@ -1713,7 +1713,7 @@ -(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMo return newRange; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 1bd64693c..bee576cd8 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -74,7 +74,7 @@ -(void)encodeCPTRect:(CGRect)rect forKey:(NSString *)key **/ -(void)encodeCGColorSpace:(CGColorSpaceRef)colorSpace forKey:(NSString *)key { -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE NSLog(@"Color space encoding is not supported on iOS. Decoding will return a generic RGB color space."); #else if ( colorSpace ) { @@ -330,7 +330,7 @@ -(CGColorSpaceRef)newCGColorSpaceDecodeForKey:(NSString *)key { CGColorSpaceRef colorSpace = NULL; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE NSLog(@"Color space decoding is not supported on iOS. Using generic RGB color space."); colorSpace = CGColorSpaceCreateDeviceRGB(); #else diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index 2da829d3f..eae3bbdbc 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -13,7 +13,7 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { // @cond // for iOS SDK compatibility -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 @interface NSString(CPTTextStylePlatformSpecificExtensions) From 15e1ab67c1e5c6808eb79fe3a09012dfb4994d40 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 10 Oct 2015 14:53:41 -0400 Subject: [PATCH 101/429] Moved some compiler settings to the xcconf files. --- framework/CorePlot.xcodeproj/project.pbxproj | 102 ------------------- framework/xcconfig/CorePlotDebug.xcconfig | 3 + framework/xcconfig/CorePlotRelease.xcconfig | 2 + 3 files changed, 5 insertions(+), 102 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 7e867ec69..f3dc5b385 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2623,8 +2623,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.7; @@ -2637,14 +2635,11 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - COPY_PHASE_STRIP = YES; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_NAME = UnitTests; SDKROOT = macosx; - ZERO_LINK = NO; }; name = Release; }; @@ -2759,16 +2754,11 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -2786,29 +2776,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOSTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2825,25 +2793,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOSTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2914,15 +2864,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; @@ -2939,11 +2881,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; @@ -2960,29 +2898,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouchTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -2999,25 +2915,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-CocoaTouchTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; diff --git a/framework/xcconfig/CorePlotDebug.xcconfig b/framework/xcconfig/CorePlotDebug.xcconfig index 3f9fd3ea8..b4bcbc7e7 100644 --- a/framework/xcconfig/CorePlotDebug.xcconfig +++ b/framework/xcconfig/CorePlotDebug.xcconfig @@ -5,3 +5,6 @@ VALIDATE_PRODUCT = NO DEPLOYMENT_POSTPROCESSING = NO STRIP_INSTALLED_PRODUCT = NO GCC_OPTIMIZATION_LEVEL = 0 +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) +ENABLE_NS_ASSERTIONS = YES +COPY_PHASE_STRIP = NO diff --git a/framework/xcconfig/CorePlotRelease.xcconfig b/framework/xcconfig/CorePlotRelease.xcconfig index 37ae757b0..8d9600513 100644 --- a/framework/xcconfig/CorePlotRelease.xcconfig +++ b/framework/xcconfig/CorePlotRelease.xcconfig @@ -5,3 +5,5 @@ VALIDATE_PRODUCT = YES DEPLOYMENT_POSTPROCESSING = YES STRIP_INSTALLED_PRODUCT = YES GCC_OPTIMIZATION_LEVEL = s +ENABLE_NS_ASSERTIONS = NO +COPY_PHASE_STRIP = YES From 673b5ac9b0fedc7319006855cc386eec1219617a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 14:36:51 -0400 Subject: [PATCH 102/429] Removed an unused class from the Plot Gallery example app. --- .../CorePlotGallery/src/ios/PlotHostView.h | 15 -------- .../CorePlotGallery/src/ios/PlotHostView.m | 35 ------------------- 2 files changed, 50 deletions(-) delete mode 100644 examples/CorePlotGallery/src/ios/PlotHostView.h delete mode 100644 examples/CorePlotGallery/src/ios/PlotHostView.m diff --git a/examples/CorePlotGallery/src/ios/PlotHostView.h b/examples/CorePlotGallery/src/ios/PlotHostView.h deleted file mode 100644 index ad2183f95..000000000 --- a/examples/CorePlotGallery/src/ios/PlotHostView.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// PlotHostView.h -// Plot Gallery -// -// Created by Jeff Buck on 9/4/10. -// Copyright 2010 Jeff Buck. All rights reserved. -// - -#import - -@interface PlotHostView : UIView -{ -} - -@end diff --git a/examples/CorePlotGallery/src/ios/PlotHostView.m b/examples/CorePlotGallery/src/ios/PlotHostView.m deleted file mode 100644 index f3e27fecf..000000000 --- a/examples/CorePlotGallery/src/ios/PlotHostView.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// PlotHostView.m -// Plot Gallery -// -// Created by Jeff Buck on 9/4/10. -// Copyright 2010 Jeff Buck. All rights reserved. -// - -#import "PlotHostView.h" - -@implementation PlotHostView - --(id)initWithFrame:(CGRect)frame -{ - if ( (self = [super initWithFrame:frame]) ) { - } - return self; -} - --(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - NSLog(@"PlotHostView:didRotateFromInterfaceOrientation:"); -} - --(void)dealloc -{ - [super dealloc]; -} - -@end From d1a30e3281984c6a3a72c738fe8af3891d09722b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 14:38:17 -0400 Subject: [PATCH 103/429] Changed #include to #import in the Core Plot prefix header. --- framework/CorePlot_Prefix.pch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CorePlot_Prefix.pch b/framework/CorePlot_Prefix.pch index b5e735ebf..7f17851fe 100644 --- a/framework/CorePlot_Prefix.pch +++ b/framework/CorePlot_Prefix.pch @@ -3,7 +3,7 @@ // #ifdef __OBJC__ - #include + #import #import From 5934e46c62f6ad7b569e1cca137d5a4ae0dbc38f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 15:01:25 -0400 Subject: [PATCH 104/429] Updated the readme file for the Plot Gallery example app and converted it to Markdown syntax. --- examples/CorePlotGallery/README | 43 ------------------------------ examples/CorePlotGallery/README.md | 17 ++++++++++++ 2 files changed, 17 insertions(+), 43 deletions(-) delete mode 100644 examples/CorePlotGallery/README create mode 100644 examples/CorePlotGallery/README.md diff --git a/examples/CorePlotGallery/README b/examples/CorePlotGallery/README deleted file mode 100644 index 7bdc3c740..000000000 --- a/examples/CorePlotGallery/README +++ /dev/null @@ -1,43 +0,0 @@ -A gallery of Core Plot examples for Mac OS X and iPad. -iPhone support is on the todo list. - -There are currently a few generic examples in the -plots group of the Xcode projects, but the hope is -to provide small simple examples that illustrate -a simple task in core-plot (creating a floating -axis, for example). - -To add a new plot: - -1. Create a new class that derives from PlotItem - -2. Add a - + (void)load - class method to register the class via the - [super registerPlotItem:self]; - message. - This makes it show up in the tableview/imageview. - -3. If you are only generating a single plot, override - the renderInLayer:withTheme method to create your - graphs. Make sure you add your CPTGraph object to - the graphs array. - -4. Add any delegate methods you need for handling - labels or user interaction. - -If your view consists of multiple plots, you also -need to override the - renderInView:withTheme -method to set up your CPTLayers. You should also -override the - setFrameSize: -on the Mac and - didRotateFromInterfaceOrientation: -on iOS to handle resizing and device rotation. See -the CompositePlot.[hm] files for an example of -creating multiple plots. - -If you are just generating a single plot, the -resizing and rotation handling are done for you. - diff --git a/examples/CorePlotGallery/README.md b/examples/CorePlotGallery/README.md new file mode 100644 index 000000000..7b78d6b3b --- /dev/null +++ b/examples/CorePlotGallery/README.md @@ -0,0 +1,17 @@ +A gallery of Core Plot examples for Mac OS X and iOS. The iOS app is a universal app that supports both iPhone and iPad. + +To add a new plot demo: + +1. Create a new subclass of the `PlotItem` class. + +2. Add a `+(void)load` class method to register the class via the `[super registerPlotItem:self];` message. This makes it show up in the tableview/imageview. + +3. Set the `title` and `section` in the `-init` method. The `title` is used as the label in the list of plots, grouped alphabetically under the `section`. + +4. Override the `-renderInGraphHostingView:withTheme:animated:` method to set up the plot demo. Add the graph hosting view(s) for the demo as sublayers of the hosting view parameter. If the plot demo includes more than one graph, your `PlotItem` subclass is responsible for the layout of the graphs. Use autolayout on iOS and calculate the layout manually on the Mac. Be sure to implement the `-setFrameSize:` method on the Mac and update the layout there, too. See the `CompositePlot` class for an example of creating multiple graphs in a plot demo. + +5. Call the `-addGraph:toHostingView:` method to add each graph to its hosting view and to the master list of graphs. + +6. Implement the `-killGraph` method to release temporary data or views created in the `-renderInGraphHostingView:withTheme:animated:` method. + +7. Add any delegate methods you need for handling labels or user interaction and datasource methods to provide plot data. From 11647e885f4d5e8f056bf8241cf6458628b4a454 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 15:16:18 -0400 Subject: [PATCH 105/429] Merged the Mac and iOS versions of the Plot Gallery example app into a single Xcode project. --- .travis.yml | 4 +- .../contents.xcworkspacedata | 5 +- .../LaunchImage.launchimage/Contents.json | 142 ---- .../project.pbxproj | 379 ++++++++++- .../contents.xcworkspacedata | 0 .../Plot_Gallery_Mac_Prefix.pch | 7 - .../CorePlotGallery/Plot_Gallery_Prefix.pch | 14 +- ...Info.plist => Plot_Gallery_iOS-Info.plist} | 2 + .../project.pbxproj | 638 ------------------ .../contents.xcworkspacedata | 7 - .../CorePlotGallery/src/ios/Launch Screen.xib | 10 +- .../CorePlotGallery/src/ios/Main.storyboard | 30 +- 12 files changed, 389 insertions(+), 849 deletions(-) delete mode 100644 examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json rename examples/CorePlotGallery/{Plot_Gallery_Mac.xcodeproj => Plot_Gallery.xcodeproj}/project.pbxproj (63%) rename examples/CorePlotGallery/{Plot_Gallery_Mac.xcodeproj => Plot_Gallery.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) delete mode 100644 examples/CorePlotGallery/Plot_Gallery_Mac_Prefix.pch rename examples/CorePlotGallery/{Plot_Gallery-Info.plist => Plot_Gallery_iOS-Info.plist} (95%) delete mode 100644 examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj delete mode 100644 examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/.travis.yml b/.travis.yml index 5702ae579..455a6ef7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ script: xcodebuild -project framework/CorePlot-CocoaTouch.xcodeproj -target Core script: xcodebuild -project framework/CorePlot.xcodeproj -target UnitTests -configuration Release # Mac examples -script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery_Mac.xcodeproj -target "Plot Gallery-Mac" -configuration Release +script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery.xcodeproj -target "Plot Gallery-Mac" -configuration Release script: xcodebuild -project examples/CPTTestApp/CPTTestApp.xcodeproj -target CPTTestApp -configuration Release script: xcodebuild -project examples/DatePlot/DatePlot.xcodeproj -target DatePlot -configuration Release script: xcodebuild -project examples/DropPlot/DropPlot.xcodeproj -target DropPlot -configuration Release @@ -21,7 +21,7 @@ script: xcodebuild -project examples/MinorTickLabels/minorTickFormatter.xcodepro script: xcodebuild -project examples/RangePlot/RangePlot.xcodeproj -target RangePlot -configuration Release # iOS examples -script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj -target "Plot Gallery-iOS" -sdk ${SDK} -configuration Release +script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery.xcodeproj -target "Plot Gallery-iOS" -sdk ${SDK} -configuration Release script: xcodebuild -project examples/AAPLot/AAPLot.xcodeproj -target AAPLot -sdk ${SDK} -configuration Release script: xcodebuild -project examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj -target CPTTestApp-iPad -sdk ${SDK} -configuration Release script: xcodebuild -project examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj -target CPTTestApp-iPhone -sdk ${SDK} -configuration Release diff --git a/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata b/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata index 58eb2fc87..df38f3d5a 100644 --- a/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata +++ b/examples/CorePlotExamples.xcworkspace/contents.xcworkspacedata @@ -5,10 +5,7 @@ location = "group:CorePlotGallery" name = "Plot Gallery"> - - + location = "group:Plot_Gallery.xcodeproj"> -#endif diff --git a/examples/CorePlotGallery/Plot_Gallery_Prefix.pch b/examples/CorePlotGallery/Plot_Gallery_Prefix.pch index 81f53cd17..919ef2bfe 100644 --- a/examples/CorePlotGallery/Plot_Gallery_Prefix.pch +++ b/examples/CorePlotGallery/Plot_Gallery_Prefix.pch @@ -1,9 +1,13 @@ // -// Prefix header for all source files of the 'Plot Gallery' target in the 'Plot Gallery' project +// Prefix header for all source files in the 'Plot Gallery' project // -#import - #ifdef __OBJC__ - #import - #import + #import + + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + #import + #import + #else + #import + #endif #endif diff --git a/examples/CorePlotGallery/Plot_Gallery-Info.plist b/examples/CorePlotGallery/Plot_Gallery_iOS-Info.plist similarity index 95% rename from examples/CorePlotGallery/Plot_Gallery-Info.plist rename to examples/CorePlotGallery/Plot_Gallery_iOS-Info.plist index 8c20e1104..2c91ece38 100644 --- a/examples/CorePlotGallery/Plot_Gallery-Info.plist +++ b/examples/CorePlotGallery/Plot_Gallery_iOS-Info.plist @@ -16,6 +16,8 @@ ${PRODUCT_NAME} CFBundlePackageType APPL + CFBundleShortVersionString + 1.0 CFBundleSignature ???? CFBundleVersion diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj deleted file mode 100644 index 605153b69..000000000 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,638 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 47; - objects = { - -/* Begin PBXBuildFile section */ - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; - 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; }; - 4F22FE3A12340464006BF615 /* PlotGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE3712340464006BF615 /* PlotGallery.m */; }; - 4F22FE3B12340464006BF615 /* PlotItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE3912340464006BF615 /* PlotItem.m */; }; - 4F22FE46123404C2006BF615 /* CompositePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE3D123404C2006BF615 /* CompositePlot.m */; }; - 4F22FE47123404C2006BF615 /* GradientScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE3F123404C2006BF615 /* GradientScatterPlot.m */; }; - 4F22FE48123404C2006BF615 /* SimplePieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE41123404C2006BF615 /* SimplePieChart.m */; }; - 4F22FE49123404C2006BF615 /* SimpleScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE43123404C2006BF615 /* SimpleScatterPlot.m */; }; - 4F22FE4A123404C2006BF615 /* VerticalBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE45123404C2006BF615 /* VerticalBarChart.m */; }; - 4F22FE6712340671006BF615 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE6612340671006BF615 /* main.m */; }; - 4F22FE7B123406DF006BF615 /* ThemeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */; }; - 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F5EBAC212297F2400D147E7 /* QuartzCore.framework */; }; - 4F7541F3126B59A200313026 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F7541EF126B59A200313026 /* DetailViewController.m */; }; - 4F8E1C6012907C1800D2035F /* DatePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C5F12907C1800D2035F /* DatePlot.m */; }; - 4F8E1CA0129089D600D2035F /* SteppedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C9F129089D600D2035F /* SteppedScatterPlot.m */; }; - C317907E1B49EAF100699C5F /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot.framework */; }; - C317907F1B49EAF100699C5F /* CorePlot.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414581A7D817000B6F5D6 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - C31A40BA17ABD6910020C5C6 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C31A40B917ABD6910020C5C6 /* FunctionPlot.m */; }; - C32960CB1A101AEB0086D047 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C32960CA1A101AEB0086D047 /* AppDelegate.m */; }; - C3457A5317AD7C72000880F3 /* PiNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C3457A5217AD7C72000880F3 /* PiNumberFormatter.m */; }; - C354C0D413C7CDA900DA8822 /* RealTimePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C354C0D313C7CDA900DA8822 /* RealTimePlot.m */; }; - C35597A21437E09300B41DA7 /* ControlChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C35597A11437E09300B41DA7 /* ControlChart.m */; }; - C360E1C913B18ABC007994B6 /* OHLCPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1C813B18ABC007994B6 /* OHLCPlot.m */; }; - C360E1DA13B18B24007994B6 /* AxisDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1D913B18B24007994B6 /* AxisDemo.m */; }; - C360E1EE13B18CCC007994B6 /* CandlestickPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1ED13B18CCC007994B6 /* CandlestickPlot.m */; }; - C36157B919D790E10036ACDA /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C36157B819D790E10036ACDA /* Launch Screen.xib */; }; - C367249F13E103AC0070F47A /* LineCapDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C367249E13E103AC0070F47A /* LineCapDemo.m */; }; - C37995991A1912A400F7378C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C37995981A1912A400F7378C /* Main.storyboard */; }; - C3858C641A17A0E5004BC750 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3858C631A17A0E5004BC750 /* RootViewController.m */; }; - C39C4E3B13BFE19200CD9194 /* PlotSpaceDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E3A13BFE19200CD9194 /* PlotSpaceDemo.m */; }; - C39C4E3E13BFE19E00CD9194 /* LabelingPolicyDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E3D13BFE19E00CD9194 /* LabelingPolicyDemo.m */; }; - C3A14C1513AEE7CC00D103EA /* RangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A14C1413AEE7CC00D103EA /* RangePlot.m */; }; - C3A31A5914DF783500734AB7 /* ColoredBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A31A5814DF783500734AB7 /* ColoredBarChart.m */; }; - C3AC1411150EDEF300631001 /* CurvedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */; }; - C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3CD282917DE9A7E008EED1E /* Accelerate.framework */; }; - C3D2FE6919FF1D3E002CD4D6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */; }; - C3D70BAC175EB30800F27173 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BAB175EB30800F27173 /* ImageDemo.m */; }; - C3EB3ACC1B46CC5100906482 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D414541A7D817000B6F5D6 /* CorePlot.framework */; }; - C3EF42F919FC753E0060791A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3EF42F819FC753E0060791A /* Images.xcassets */; }; - C3F34F2A12AB25AE008FBDC3 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F2912AB25AE008FBDC3 /* DonutChart.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - C317907C1B49EAC900699C5F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = C38A09771A46185200D45436; - remoteInfo = "CorePlot iOS"; - }; - C31790801B49EAF100699C5F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = C38A09771A46185200D45436; - remoteInfo = "CorePlot iOS"; - }; - C3D414531A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8DC2EF5B0486A6940098B216; - remoteInfo = CorePlot; - }; - C3D414551A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 0730F600109492D800E95162; - remoteInfo = UnitTests; - }; - C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C38A09781A46185200D45436; - remoteInfo = CorePlot_iOS; - }; - C3D414591A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C38A09821A46185300D45436; - remoteInfo = CorePlot_iOSTests; - }; - C3D4145B1A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C38A09BA1A4619A900D45436; - remoteInfo = "CorePlot-CocoaTouch"; - }; - C3D4145D1A7D817000B6F5D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C38A09C41A4619A900D45436; - remoteInfo = "CorePlot-CocoaTouchTests"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - C31790821B49EAF200699C5F /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - C317907F1B49EAF100699C5F /* CorePlot.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 1D6058910D05DD3D006BFB54 /* Plot Gallery.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plot Gallery.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 28A0AAE50D9B0CCF005BE974 /* Plot_Gallery_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Plot_Gallery_Prefix.pch; sourceTree = ""; }; - 4CBCB98814753D6F000C8951 /* CurvedScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CurvedScatterPlot.h; path = src/plots/CurvedScatterPlot.h; sourceTree = ""; }; - 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 2; name = CurvedScatterPlot.m; path = src/plots/CurvedScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F22FE3612340464006BF615 /* PlotGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotGallery.h; path = src/shared/PlotGallery.h; sourceTree = ""; }; - 4F22FE3712340464006BF615 /* PlotGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotGallery.m; path = src/shared/PlotGallery.m; sourceTree = ""; }; - 4F22FE3812340464006BF615 /* PlotItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = PlotItem.h; path = src/shared/PlotItem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 4F22FE3912340464006BF615 /* PlotItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotItem.m; path = src/shared/PlotItem.m; sourceTree = ""; }; - 4F22FE3C123404C2006BF615 /* CompositePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = CompositePlot.h; path = src/plots/CompositePlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 4F22FE3D123404C2006BF615 /* CompositePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CompositePlot.m; path = src/plots/CompositePlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F22FE3E123404C2006BF615 /* GradientScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GradientScatterPlot.h; path = src/plots/GradientScatterPlot.h; sourceTree = ""; }; - 4F22FE3F123404C2006BF615 /* GradientScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = GradientScatterPlot.m; path = src/plots/GradientScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F22FE40123404C2006BF615 /* SimplePieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimplePieChart.h; path = src/plots/SimplePieChart.h; sourceTree = ""; }; - 4F22FE41123404C2006BF615 /* SimplePieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimplePieChart.m; path = src/plots/SimplePieChart.m; sourceTree = ""; }; - 4F22FE42123404C2006BF615 /* SimpleScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleScatterPlot.h; path = src/plots/SimpleScatterPlot.h; sourceTree = ""; }; - 4F22FE43123404C2006BF615 /* SimpleScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleScatterPlot.m; path = src/plots/SimpleScatterPlot.m; sourceTree = ""; }; - 4F22FE44123404C2006BF615 /* VerticalBarChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VerticalBarChart.h; path = src/plots/VerticalBarChart.h; sourceTree = ""; }; - 4F22FE45123404C2006BF615 /* VerticalBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VerticalBarChart.m; path = src/plots/VerticalBarChart.m; sourceTree = ""; }; - 4F22FE6612340671006BF615 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = src/ios/main.m; sourceTree = ""; }; - 4F22FE77123406DF006BF615 /* ThemeTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThemeTableViewController.h; path = src/ios/ThemeTableViewController.h; sourceTree = ""; }; - 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ThemeTableViewController.m; path = src/ios/ThemeTableViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F5EBAC212297F2400D147E7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 4F7541EE126B59A200313026 /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailViewController.h; path = src/ios/DetailViewController.h; sourceTree = ""; }; - 4F7541EF126B59A200313026 /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = DetailViewController.m; path = src/ios/DetailViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F8E1C5E12907C1800D2035F /* DatePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DatePlot.h; path = src/plots/DatePlot.h; sourceTree = ""; }; - 4F8E1C5F12907C1800D2035F /* DatePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = DatePlot.m; path = src/plots/DatePlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 4F8E1C9E129089D600D2035F /* SteppedScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SteppedScatterPlot.h; path = src/plots/SteppedScatterPlot.h; sourceTree = ""; }; - 4F8E1C9F129089D600D2035F /* SteppedScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SteppedScatterPlot.m; path = src/plots/SteppedScatterPlot.m; sourceTree = ""; }; - 8D1107310486CEB800E47090 /* Plot_Gallery-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Plot_Gallery-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; - C31A40B817ABD6910020C5C6 /* FunctionPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FunctionPlot.h; path = src/plots/FunctionPlot.h; sourceTree = ""; }; - C31A40B917ABD6910020C5C6 /* FunctionPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = FunctionPlot.m; path = src/plots/FunctionPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C32960C91A101AEB0086D047 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = src/ios/AppDelegate.h; sourceTree = ""; }; - C32960CA1A101AEB0086D047 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = AppDelegate.m; path = src/ios/AppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3457A5117AD7C72000880F3 /* PiNumberFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PiNumberFormatter.h; path = src/shared/PiNumberFormatter.h; sourceTree = ""; }; - C3457A5217AD7C72000880F3 /* PiNumberFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PiNumberFormatter.m; path = src/shared/PiNumberFormatter.m; sourceTree = ""; }; - C354C0D213C7CDA900DA8822 /* RealTimePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RealTimePlot.h; path = src/plots/RealTimePlot.h; sourceTree = ""; }; - C354C0D313C7CDA900DA8822 /* RealTimePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RealTimePlot.m; path = src/plots/RealTimePlot.m; sourceTree = ""; }; - C35597A01437E09300B41DA7 /* ControlChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ControlChart.h; path = src/plots/ControlChart.h; sourceTree = ""; }; - C35597A11437E09300B41DA7 /* ControlChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ControlChart.m; path = src/plots/ControlChart.m; sourceTree = ""; }; - C360E1C713B18ABC007994B6 /* OHLCPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OHLCPlot.h; path = src/plots/OHLCPlot.h; sourceTree = ""; }; - C360E1C813B18ABC007994B6 /* OHLCPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OHLCPlot.m; path = src/plots/OHLCPlot.m; sourceTree = ""; }; - C360E1D813B18B24007994B6 /* AxisDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AxisDemo.h; path = src/plots/AxisDemo.h; sourceTree = ""; }; - C360E1D913B18B24007994B6 /* AxisDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = AxisDemo.m; path = src/plots/AxisDemo.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C360E1EC13B18CCC007994B6 /* CandlestickPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CandlestickPlot.h; path = src/plots/CandlestickPlot.h; sourceTree = ""; }; - C360E1ED13B18CCC007994B6 /* CandlestickPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CandlestickPlot.m; path = src/plots/CandlestickPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C36157B819D790E10036ACDA /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "Launch Screen.xib"; path = "src/ios/Launch Screen.xib"; sourceTree = ""; }; - C367249D13E103AC0070F47A /* LineCapDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LineCapDemo.h; path = src/plots/LineCapDemo.h; sourceTree = ""; }; - C367249E13E103AC0070F47A /* LineCapDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LineCapDemo.m; path = src/plots/LineCapDemo.m; sourceTree = ""; }; - C37995981A1912A400F7378C /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = src/ios/Main.storyboard; sourceTree = ""; }; - C3858C621A17A0E5004BC750 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = RootViewController.h; path = src/ios/RootViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - C3858C631A17A0E5004BC750 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = RootViewController.m; path = src/ios/RootViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C39C4E3913BFE19200CD9194 /* PlotSpaceDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlotSpaceDemo.h; path = src/plots/PlotSpaceDemo.h; sourceTree = ""; }; - C39C4E3A13BFE19200CD9194 /* PlotSpaceDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PlotSpaceDemo.m; path = src/plots/PlotSpaceDemo.m; sourceTree = ""; }; - C39C4E3C13BFE19E00CD9194 /* LabelingPolicyDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LabelingPolicyDemo.h; path = src/plots/LabelingPolicyDemo.h; sourceTree = ""; }; - C39C4E3D13BFE19E00CD9194 /* LabelingPolicyDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = LabelingPolicyDemo.m; path = src/plots/LabelingPolicyDemo.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3A14C1313AEE7CC00D103EA /* RangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RangePlot.h; path = src/plots/RangePlot.h; sourceTree = ""; }; - C3A14C1413AEE7CC00D103EA /* RangePlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RangePlot.m; path = src/plots/RangePlot.m; sourceTree = ""; }; - C3A31A5714DF783500734AB7 /* ColoredBarChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ColoredBarChart.h; path = src/plots/ColoredBarChart.h; sourceTree = ""; }; - C3A31A5814DF783500734AB7 /* ColoredBarChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ColoredBarChart.m; path = src/plots/ColoredBarChart.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; - C3CD282917DE9A7E008EED1E /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = img/Images.xcassets; sourceTree = ""; }; - C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CorePlot.xcodeproj; path = ../../framework/CorePlot.xcodeproj; sourceTree = ""; }; - C3D70BAA175EB30800F27173 /* ImageDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImageDemo.h; path = src/plots/ImageDemo.h; sourceTree = ""; }; - C3D70BAB175EB30800F27173 /* ImageDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = ImageDemo.m; path = src/plots/ImageDemo.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3EF42F819FC753E0060791A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Plot Gallery-iOS/Images.xcassets"; sourceTree = ""; }; - C3F34F2812AB25AE008FBDC3 /* DonutChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DonutChart.h; path = src/plots/DonutChart.h; sourceTree = ""; }; - C3F34F2912AB25AE008FBDC3 /* DonutChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = DonutChart.m; path = src/plots/DonutChart.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, - 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, - C317907E1B49EAF100699C5F /* CorePlot.framework in Frameworks */, - 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, - 4F5EBAC312297F2400D147E7 /* QuartzCore.framework in Frameworks */, - C3CD282A17DE9A7E008EED1E /* Accelerate.framework in Frameworks */, - C3EB3ACC1B46CC5100906482 /* CorePlot.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19C28FACFE9D520D11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 1D6058910D05DD3D006BFB54 /* Plot Gallery.app */, - ); - name = Products; - sourceTree = ""; - }; - 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { - isa = PBXGroup; - children = ( - C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */, - 4F22FE351234043F006BF615 /* Shared */, - 4F22FE3112340417006BF615 /* iOS */, - 4F5EBAFA1229818000D147E7 /* Plots */, - 29B97323FDCFA39411CA2CEA /* Frameworks */, - 19C28FACFE9D520D11CA2CBB /* Products */, - ); - indentWidth = 4; - name = CustomTemplate; - sourceTree = ""; - tabWidth = 4; - usesTabs = 0; - }; - 29B97323FDCFA39411CA2CEA /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, - 1D30AB110D05D00D00671497 /* Foundation.framework */, - 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */, - 4F5EBAC212297F2400D147E7 /* QuartzCore.framework */, - C3CD282917DE9A7E008EED1E /* Accelerate.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4F22FE3112340417006BF615 /* iOS */ = { - isa = PBXGroup; - children = ( - C3EF42F819FC753E0060791A /* Images.xcassets */, - C32960C91A101AEB0086D047 /* AppDelegate.h */, - C32960CA1A101AEB0086D047 /* AppDelegate.m */, - 4F7541EE126B59A200313026 /* DetailViewController.h */, - 4F7541EF126B59A200313026 /* DetailViewController.m */, - C3858C621A17A0E5004BC750 /* RootViewController.h */, - C3858C631A17A0E5004BC750 /* RootViewController.m */, - 28A0AAE50D9B0CCF005BE974 /* Plot_Gallery_Prefix.pch */, - 8D1107310486CEB800E47090 /* Plot_Gallery-Info.plist */, - 4F22FE6612340671006BF615 /* main.m */, - 4F22FE77123406DF006BF615 /* ThemeTableViewController.h */, - 4F22FE78123406DF006BF615 /* ThemeTableViewController.m */, - C37995981A1912A400F7378C /* Main.storyboard */, - C36157B819D790E10036ACDA /* Launch Screen.xib */, - ); - name = iOS; - sourceTree = ""; - }; - 4F22FE351234043F006BF615 /* Shared */ = { - isa = PBXGroup; - children = ( - C3D2FE6819FF1D3E002CD4D6 /* Images.xcassets */, - 4F22FE3812340464006BF615 /* PlotItem.h */, - 4F22FE3912340464006BF615 /* PlotItem.m */, - 4F22FE3612340464006BF615 /* PlotGallery.h */, - 4F22FE3712340464006BF615 /* PlotGallery.m */, - C3457A5117AD7C72000880F3 /* PiNumberFormatter.h */, - C3457A5217AD7C72000880F3 /* PiNumberFormatter.m */, - C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */, - ); - name = Shared; - sourceTree = ""; - }; - 4F5EBAFA1229818000D147E7 /* Plots */ = { - isa = PBXGroup; - children = ( - C360E1D813B18B24007994B6 /* AxisDemo.h */, - C360E1D913B18B24007994B6 /* AxisDemo.m */, - C360E1EC13B18CCC007994B6 /* CandlestickPlot.h */, - C360E1ED13B18CCC007994B6 /* CandlestickPlot.m */, - C3A31A5714DF783500734AB7 /* ColoredBarChart.h */, - C3A31A5814DF783500734AB7 /* ColoredBarChart.m */, - 4F22FE3C123404C2006BF615 /* CompositePlot.h */, - 4F22FE3D123404C2006BF615 /* CompositePlot.m */, - C35597A01437E09300B41DA7 /* ControlChart.h */, - C35597A11437E09300B41DA7 /* ControlChart.m */, - 4CBCB98814753D6F000C8951 /* CurvedScatterPlot.h */, - 4CBCB98914753D6F000C8951 /* CurvedScatterPlot.m */, - 4F8E1C5E12907C1800D2035F /* DatePlot.h */, - 4F8E1C5F12907C1800D2035F /* DatePlot.m */, - C3F34F2812AB25AE008FBDC3 /* DonutChart.h */, - C3F34F2912AB25AE008FBDC3 /* DonutChart.m */, - C31A40B817ABD6910020C5C6 /* FunctionPlot.h */, - C31A40B917ABD6910020C5C6 /* FunctionPlot.m */, - 4F22FE3E123404C2006BF615 /* GradientScatterPlot.h */, - 4F22FE3F123404C2006BF615 /* GradientScatterPlot.m */, - C3D70BAA175EB30800F27173 /* ImageDemo.h */, - C3D70BAB175EB30800F27173 /* ImageDemo.m */, - C39C4E3C13BFE19E00CD9194 /* LabelingPolicyDemo.h */, - C39C4E3D13BFE19E00CD9194 /* LabelingPolicyDemo.m */, - C367249D13E103AC0070F47A /* LineCapDemo.h */, - C367249E13E103AC0070F47A /* LineCapDemo.m */, - C360E1C713B18ABC007994B6 /* OHLCPlot.h */, - C360E1C813B18ABC007994B6 /* OHLCPlot.m */, - C39C4E3913BFE19200CD9194 /* PlotSpaceDemo.h */, - C39C4E3A13BFE19200CD9194 /* PlotSpaceDemo.m */, - C3A14C1313AEE7CC00D103EA /* RangePlot.h */, - C3A14C1413AEE7CC00D103EA /* RangePlot.m */, - C354C0D213C7CDA900DA8822 /* RealTimePlot.h */, - C354C0D313C7CDA900DA8822 /* RealTimePlot.m */, - 4F22FE40123404C2006BF615 /* SimplePieChart.h */, - 4F22FE41123404C2006BF615 /* SimplePieChart.m */, - 4F22FE42123404C2006BF615 /* SimpleScatterPlot.h */, - 4F22FE43123404C2006BF615 /* SimpleScatterPlot.m */, - 4F8E1C9E129089D600D2035F /* SteppedScatterPlot.h */, - 4F8E1C9F129089D600D2035F /* SteppedScatterPlot.m */, - 4F22FE44123404C2006BF615 /* VerticalBarChart.h */, - 4F22FE45123404C2006BF615 /* VerticalBarChart.m */, - ); - name = Plots; - sourceTree = ""; - }; - C3D414481A7D817000B6F5D6 /* Products */ = { - isa = PBXGroup; - children = ( - C3D414541A7D817000B6F5D6 /* CorePlot.framework */, - C3D414561A7D817000B6F5D6 /* UnitTests.xctest */, - C3D414581A7D817000B6F5D6 /* CorePlot.framework */, - C3D4145A1A7D817000B6F5D6 /* UnitTests iOS.xctest */, - C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */, - C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1D6058900D05DD3D006BFB54 /* Plot Gallery-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Plot Gallery-iOS" */; - buildPhases = ( - 1D60588D0D05DD3D006BFB54 /* Resources */, - 1D60588E0D05DD3D006BFB54 /* Sources */, - 1D60588F0D05DD3D006BFB54 /* Frameworks */, - C31790821B49EAF200699C5F /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - C317907D1B49EAC900699C5F /* PBXTargetDependency */, - C31790811B49EAF100699C5F /* PBXTargetDependency */, - ); - name = "Plot Gallery-iOS"; - productName = "Plot Gallery"; - productReference = 1D6058910D05DD3D006BFB54 /* Plot Gallery.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 29B97313FDCFA39411CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0700; - TargetAttributes = { - 1D6058900D05DD3D006BFB54 = { - DevelopmentTeam = 28ZA45DE7D; - }; - }; - }; - buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_iOS" */; - compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - en, - ); - mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = C3D414481A7D817000B6F5D6 /* Products */; - ProjectRef = C3D414471A7D817000B6F5D6 /* CorePlot.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 1D6058900D05DD3D006BFB54 /* Plot Gallery-iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - C3D414541A7D817000B6F5D6 /* CorePlot.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = CorePlot.framework; - remoteRef = C3D414531A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C3D414561A7D817000B6F5D6 /* UnitTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.xctest; - remoteRef = C3D414551A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C3D414581A7D817000B6F5D6 /* CorePlot.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = CorePlot.framework; - remoteRef = C3D414571A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C3D4145A1A7D817000B6F5D6 /* UnitTests iOS.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "UnitTests iOS.xctest"; - remoteRef = C3D414591A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C3D4145C1A7D817000B6F5D6 /* libCorePlot-CocoaTouch.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libCorePlot-CocoaTouch.a"; - remoteRef = C3D4145B1A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - C3D4145E1A7D817000B6F5D6 /* CorePlot-CocoaTouchTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "CorePlot-CocoaTouchTests.xctest"; - remoteRef = C3D4145D1A7D817000B6F5D6 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 1D60588D0D05DD3D006BFB54 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C36157B919D790E10036ACDA /* Launch Screen.xib in Resources */, - C3D2FE6919FF1D3E002CD4D6 /* Images.xcassets in Resources */, - C3EF42F919FC753E0060791A /* Images.xcassets in Resources */, - C37995991A1912A400F7378C /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1D60588E0D05DD3D006BFB54 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F22FE3A12340464006BF615 /* PlotGallery.m in Sources */, - C3858C641A17A0E5004BC750 /* RootViewController.m in Sources */, - 4F22FE3B12340464006BF615 /* PlotItem.m in Sources */, - 4F22FE46123404C2006BF615 /* CompositePlot.m in Sources */, - 4F22FE47123404C2006BF615 /* GradientScatterPlot.m in Sources */, - 4F22FE48123404C2006BF615 /* SimplePieChart.m in Sources */, - 4F22FE49123404C2006BF615 /* SimpleScatterPlot.m in Sources */, - 4F22FE4A123404C2006BF615 /* VerticalBarChart.m in Sources */, - 4F22FE6712340671006BF615 /* main.m in Sources */, - 4F22FE7B123406DF006BF615 /* ThemeTableViewController.m in Sources */, - 4F7541F3126B59A200313026 /* DetailViewController.m in Sources */, - 4F8E1C6012907C1800D2035F /* DatePlot.m in Sources */, - 4F8E1CA0129089D600D2035F /* SteppedScatterPlot.m in Sources */, - C3F34F2A12AB25AE008FBDC3 /* DonutChart.m in Sources */, - C3A14C1513AEE7CC00D103EA /* RangePlot.m in Sources */, - C360E1C913B18ABC007994B6 /* OHLCPlot.m in Sources */, - C360E1DA13B18B24007994B6 /* AxisDemo.m in Sources */, - C360E1EE13B18CCC007994B6 /* CandlestickPlot.m in Sources */, - C39C4E3B13BFE19200CD9194 /* PlotSpaceDemo.m in Sources */, - C39C4E3E13BFE19E00CD9194 /* LabelingPolicyDemo.m in Sources */, - C354C0D413C7CDA900DA8822 /* RealTimePlot.m in Sources */, - C32960CB1A101AEB0086D047 /* AppDelegate.m in Sources */, - C367249F13E103AC0070F47A /* LineCapDemo.m in Sources */, - C35597A21437E09300B41DA7 /* ControlChart.m in Sources */, - C3A31A5914DF783500734AB7 /* ColoredBarChart.m in Sources */, - C3AC1411150EDEF300631001 /* CurvedScatterPlot.m in Sources */, - C31A40BA17ABD6910020C5C6 /* FunctionPlot.m in Sources */, - C3D70BAC175EB30800F27173 /* ImageDemo.m in Sources */, - C3457A5317AD7C72000880F3 /* PiNumberFormatter.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - C317907D1B49EAC900699C5F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot iOS"; - targetProxy = C317907C1B49EAC900699C5F /* PBXContainerItemProxy */; - }; - C31790811B49EAF100699C5F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "CorePlot iOS"; - targetProxy = C31790801B49EAF100699C5F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D6058940D05DD3E006BFB54 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; - HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework/\"/**"; - INFOPLIST_FILE = "Plot_Gallery-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; - PRODUCT_NAME = "Plot Gallery"; - PROVISIONING_PROFILE = ""; - SYMROOT = "$(SRCROOT)/../../build"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1D6058950D05DD3E006BFB54 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C3C0DF2419D86B3A00631CAD /* CorePlotWarnings.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ENABLE_OBJC_ARC = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; - HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework/\"/**"; - INFOPLIST_FILE = "Plot_Gallery-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.CorePlot.PlotGallery; - PRODUCT_NAME = "Plot Gallery"; - PROVISIONING_PROFILE = ""; - SYMROOT = "$(SRCROOT)/../../build"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - C01FCF4F08A954540054247B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = 2; - }; - name = Debug; - }; - C01FCF5008A954540054247B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = 2; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Plot Gallery-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1D6058940D05DD3E006BFB54 /* Debug */, - 1D6058950D05DD3E006BFB54 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Plot_Gallery_iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C01FCF4F08A954540054247B /* Debug */, - C01FCF5008A954540054247B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; -} diff --git a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 28edda14c..000000000 --- a/examples/CorePlotGallery/Plot_Gallery_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/CorePlotGallery/src/ios/Launch Screen.xib b/examples/CorePlotGallery/src/ios/Launch Screen.xib index 7f22f14f7..3f2f3dbc8 100644 --- a/examples/CorePlotGallery/src/ios/Launch Screen.xib +++ b/examples/CorePlotGallery/src/ios/Launch Screen.xib @@ -1,8 +1,8 @@ - + - + @@ -12,13 +12,15 @@ - + diff --git a/examples/CorePlotGallery/src/ios/Main.storyboard b/examples/CorePlotGallery/src/ios/Main.storyboard index ed627f0c5..391428c19 100644 --- a/examples/CorePlotGallery/src/ios/Main.storyboard +++ b/examples/CorePlotGallery/src/ios/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -11,6 +12,7 @@ + @@ -34,9 +36,11 @@ + + @@ -71,21 +75,28 @@ + + + + + @@ -120,24 +131,28 @@ + - + - + + + @@ -162,6 +177,7 @@ + From 9c58b276a4632102535bc27a68543a1daee3c0b9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 16:02:39 -0400 Subject: [PATCH 106/429] Updated the framework and unit test builds in the Travis config file to include all platforms. --- .travis.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 455a6ef7e..f728a741b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,11 +6,14 @@ env: SDK:iphoneos # Framework builds -script: xcodebuild -project framework/CorePlot.xcodeproj -target CorePlot -configuration Release -script: xcodebuild -project framework/CorePlot-CocoaTouch.xcodeproj -target CorePlot-CocoaTouch -sdk ${SDK} -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot Mac" -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot iOS" -sdk ${SDK} -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot-CocoaTouch" -sdk ${SDK} -configuration Release # Unit tests -script: xcodebuild -project framework/CorePlot.xcodeproj -target UnitTests -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "UnitTests Mac" -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "UnitTests iOS" -sdk ${SDK} -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot-CocoaTouchTests" -sdk ${SDK} -configuration Release # Mac examples script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery.xcodeproj -target "Plot Gallery-Mac" -configuration Release From 8d2f70ccb3d444f2d3cd479df3d78c290eee4434 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 18:47:31 -0400 Subject: [PATCH 107/429] Removed an unused property from the iOS detail view controller in the Plot Gallery example app. --- examples/CorePlotGallery/src/ios/DetailViewController.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index 715fe7878..67351a6ad 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -12,8 +12,6 @@ @interface DetailViewController() -(CPTTheme *)currentTheme; -@property (nonatomic, readwrite) UIPopoverController *themePopoverController; - -(void)setupView; -(void)themeChanged:(NSNotification *)notification; @@ -27,7 +25,6 @@ @implementation DetailViewController @synthesize hostingView; @synthesize themeBarButton; @synthesize currentThemeName; -@synthesize themePopoverController; #pragma mark - #pragma mark Initialization and Memory Management From 0d21a07f3f977a0e94b6656c266cb07b3fc33d78 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 14 Oct 2015 18:27:37 -0400 Subject: [PATCH 108/429] Added App Transport Security exceptions for the AAPLot and StockPlot example apps. --- .../AppIcon.appiconset/Contents.json | 10 ++++++++++ examples/AAPLot/Info.plist | 13 +++++++++++++ examples/StockPlot/StockPlot-Info.plist | 13 +++++++++++++ 3 files changed, 36 insertions(+) diff --git a/examples/AAPLot/AAPLot/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/AAPLot/AAPLot/Images.xcassets/AppIcon.appiconset/Contents.json index 340f2376e..219a768e8 100644 --- a/examples/AAPLot/AAPLot/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/AAPLot/AAPLot/Images.xcassets/AppIcon.appiconset/Contents.json @@ -12,12 +12,22 @@ "filename" : "Icon-Small@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-Spotlight-40@2x.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "size" : "57x57", "idiom" : "iphone", diff --git a/examples/AAPLot/Info.plist b/examples/AAPLot/Info.plist index 4081ec7d1..63610f927 100644 --- a/examples/AAPLot/Info.plist +++ b/examples/AAPLot/Info.plist @@ -24,6 +24,19 @@ 1.0 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSExceptionDomains + + ichart.yahoo.com + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + + + NSMainNibFile MainWindow UILaunchStoryboardName diff --git a/examples/StockPlot/StockPlot-Info.plist b/examples/StockPlot/StockPlot-Info.plist index 1d8d9b7be..eea88268d 100644 --- a/examples/StockPlot/StockPlot-Info.plist +++ b/examples/StockPlot/StockPlot-Info.plist @@ -24,6 +24,19 @@ 1.0 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSExceptionDomains + + ichart.yahoo.com + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + + + NSMainNibFile MainWindow UILaunchStoryboardName From 3044875081d40ad1bf9c30c34d66b28c3e483124 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 14 Oct 2015 18:49:31 -0400 Subject: [PATCH 109/429] Added tvOS support and framework target. Fixed issue #227. --- CorePlot-latest.podspec | 8 +- CorePlot.podspec | 12 +- README.md | 4 +- documentation/changelog.markdown | 12 + documentation/doxygen/doxygen touch.config | 1 + framework/CorePlot.xcodeproj/project.pbxproj | 710 +++++++++++++++++- .../xcschemes/CorePlot tvOS.xcscheme | 114 +++ framework/CorePlot_Prefix.pch | 2 +- framework/Info/CorePlot-tvOS-Info.plist | 26 + framework/Info/CorePlot-tvOSTests-Info.plist | 24 + framework/iPhoneOnly/CPTGraphHostingView.m | 28 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 17 + framework/xcconfig/CorePlot.xcconfig | 2 + scripts/createrelease.py | 8 + 14 files changed, 948 insertions(+), 20 deletions(-) create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot tvOS.xcscheme create mode 100644 framework/Info/CorePlot-tvOS-Info.plist create mode 100644 framework/Info/CorePlot-tvOSTests-Info.plist diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index fc7348565..6ce5d8917 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = 'CorePlot' s.version = '99.99.99' s.license = 'BSD' - s.summary = 'Cocoa plotting framework for Mac OS X and iOS.' + s.summary = 'Cocoa plotting framework for Mac OS X, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' s.social_media_url = 'https://twitter.com/CorePlot' s.documentation_url = 'http://core-plot.github.io' @@ -14,19 +14,22 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/core-plot/core-plot.git' } - s.description = 'Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization ' \ + s.description = 'Core Plot is a plotting framework for OS X, iOS, and tvOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.7' + s.tvos.deployment_target = '9.0' s.ios.header_dir = 'ios' s.osx.header_dir = 'osx' + s.tvos.header_dir = 'tvos' s.source_files = 'framework/Source/*.{h,m}', 'framework/CocoaPods/*.h', 'framework/TestResources/CorePlotProbes.d' s.exclude_files = '**/*{TestCase,Tests}.{h,m}', '**/mainpage.h' s.ios.source_files = 'framework/CorePlot-CocoaTouch.h', 'framework/iPhoneOnly/*.{h,m}' + s.tvos.source_files = 'framework/iPhoneOnly/*.{h,m}' s.osx.source_files = 'framework/MacOnly/*.{h,m}' s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' @@ -35,5 +38,6 @@ Pod::Spec.new do |s| s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' + s.tvos.frameworks = 'UIKit', 'Foundation' s.osx.frameworks = 'Cocoa' end \ No newline at end of file diff --git a/CorePlot.podspec b/CorePlot.podspec index 38a5f8cfc..93bde4784 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -1,8 +1,8 @@ Pod::Spec.new do |s| s.name = 'CorePlot' - s.version = '2.0' + s.version = '2.1' s.license = 'BSD' - s.summary = 'Cocoa plotting framework for Mac OS X and iOS.' + s.summary = 'Cocoa plotting framework for Mac OS X, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' s.social_media_url = 'https://twitter.com/CorePlot' s.documentation_url = 'http://core-plot.github.io' @@ -12,21 +12,24 @@ Pod::Spec.new do |s| 'Eric Skroch' => 'eskroch@mac.com', 'Barry Wark' => 'barrywark@gmail.com' } - s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.0'} + s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.1'} - s.description = 'Core Plot is a plotting framework for OS X and iOS. It provides 2D visualization ' \ + s.description = 'Core Plot is a plotting framework for OS X, iOS, and tvOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.7' + s.tvos.deployment_target = '9.0' s.ios.header_dir = 'ios' s.osx.header_dir = 'osx' + s.tvos.header_dir = 'tvos' s.source_files = 'framework/Source/*.{h,m}', 'framework/CocoaPods/*.h', 'framework/TestResources/CorePlotProbes.d' s.exclude_files = '**/*{TestCase,Tests}.{h,m}', '**/mainpage.h' s.ios.source_files = 'framework/CorePlot-CocoaTouch.h', 'framework/iPhoneOnly/*.{h,m}' + s.tvos.source_files = 'framework/iPhoneOnly/*.{h,m}' s.osx.source_files = 'framework/MacOnly/*.{h,m}' s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' @@ -35,5 +38,6 @@ Pod::Spec.new do |s| s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' + s.tvos.frameworks = 'UIKit', 'Foundation' s.osx.frameworks = 'Cocoa' end \ No newline at end of file diff --git a/README.md b/README.md index e3e3703ef..de6887cf6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # Introduction -Core Plot is a 2D plotting framework for Mac OS X and iOS. It is highly customizable and capable of drawing many types of plots. See the [Example Graphs](https://github.com/core-plot/core-plot/wiki/Example-Graphs) wiki page and the [example applications](https://github.com/core-plot/core-plot/tree/master/examples) for examples of some of its capabilities. +Core Plot is a 2D plotting framework for Mac OS X, iOS, and tvOS. It is highly customizable and capable of drawing many types of plots. See the [Example Graphs](https://github.com/core-plot/core-plot/wiki/Example-Graphs) wiki page and the [example applications](https://github.com/core-plot/core-plot/tree/master/examples) for examples of some of its capabilities. # Getting Started @@ -18,7 +18,7 @@ Documentation of the Core Plot API and high-level architecture can be found in t * [Change log](https://github.com/core-plot/core-plot/blob/master/documentation/changelog.markdown) * [API documentation](http://core-plot.github.io/MacOS/index.html) for Mac - * [API documentation](http://core-plot.github.io/iOS/index.html) for iOS + * [API documentation](http://core-plot.github.io/iOS/index.html) for iOS and tvOS * API documentation built with [Doxygen](http://www.doxygen.org/) and installed locally in Xcode (see the [instructions](https://github.com/core-plot/core-plot/blob/master/READMEs/README%20for%20Docs%20Install.md) in the **READMEs** folder for details) * [Project Wiki](https://github.com/core-plot/core-plot/wiki) on GitHub * [Documentation](https://github.com/core-plot/core-plot/tree/master/documentation) folder in the code repository diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 48b9f5b5f..794990de7 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,3 +1,15 @@ +# Release 2.1 (TBD) + +## Release Notes + +To be determined. + +## Details +- **New**: Added a tvOS framework. +- **Changed**: Miscellaneous bug fixes and cleanup. + + + # Release 2.0 (October 4, 2015) ## Release Notes diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 4f4b127fe..5f11092ea 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2042,6 +2042,7 @@ INCLUDE_FILE_PATTERNS = # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = TARGET_OS_IPHONE, \ + TARGET_OS_TV, \ TARGET_OS_SIMULATOR, \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type" \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index f3dc5b385..c4a1de99f 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -18,6 +18,17 @@ name = "Documentation-Mac"; productName = Documentation; }; + C37EA5C41BC83E900091C8F7 /* Universal tvOS Framework */ = { + isa = PBXAggregateTarget; + buildConfigurationList = C37EA5C61BC83E900091C8F7 /* Build configuration list for PBXAggregateTarget "Universal tvOS Framework" */; + buildPhases = ( + C37EA5C51BC83E900091C8F7 /* ShellScript */, + ); + dependencies = ( + ); + name = "Universal tvOS Framework"; + productName = Documentation; + }; C38A09911A4618B600D45436 /* Documentation-iOS */ = { isa = PBXAggregateTarget; buildConfigurationList = C38A09931A4618B600D45436 /* Build configuration list for PBXAggregateTarget "Documentation-iOS" */; @@ -226,6 +237,224 @@ C36E89BA11EE7F97003DE309 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C3791D09191D4C4C001EC514 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */; }; + C37EA5CB1BC83F2A0091C8F7 /* CPTGraphHostingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B281A46265300D45436 /* CPTGraphHostingView.m */; }; + C37EA5CC1BC83F2A0091C8F7 /* CPTLayerAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */; }; + C37EA5CD1BC83F2A0091C8F7 /* CPTLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EB0F4B4F9600F9BCBB /* CPTLayer.m */; }; + C37EA5CE1BC83F2A0091C8F7 /* CPTTimeFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A2E6FB102DF47900809BC5 /* CPTTimeFormatter.m */; }; + C37EA5CF1BC83F2A0091C8F7 /* CPTColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0B30FB975500037E990 /* CPTColor.m */; }; + C37EA5D01BC83F2A0091C8F7 /* NSCoderExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3978E0513CE653B00A420D9 /* NSCoderExtensions.m */; }; + C37EA5D11BC83F2A0091C8F7 /* CPTMutableNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */; }; + C37EA5D21BC83F2A0091C8F7 /* CPTNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3392A371225F667008DA6BD /* CPTNumericData+TypeConversion.m */; }; + C37EA5D31BC83F2A0091C8F7 /* CPTTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C9260FE2F71600EC4C16 /* CPTTheme.m */; }; + C37EA5D41BC83F2A0091C8F7 /* CPTDefinitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */; }; + C37EA5D51BC83F2A0091C8F7 /* _CPTFillImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601D0FAE096C00072842 /* _CPTFillImage.m */; }; + C37EA5D61BC83F2A0091C8F7 /* CPTPlotSpaceAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB011D1016B000B8DAB /* CPTPlotSpaceAnnotation.m */; }; + C37EA5D71BC83F2A0091C8F7 /* CPTXYAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 0783DD540FBF097E006C3696 /* CPTXYAxis.m */; }; + C37EA5D81BC83F2A0091C8F7 /* CPTBarPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0799E0940F2BB5F300790525 /* CPTBarPlot.m */; }; + C37EA5D91BC83F2A0091C8F7 /* CPTAxisTitle.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC7C3610921FDB00DAECAA /* CPTAxisTitle.m */; }; + C37EA5DA1BC83F2A0091C8F7 /* CPTPlatformSpecificDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1B1A46264500D45436 /* CPTPlatformSpecificDefines.m */; }; + C37EA5DB1BC83F2A0091C8F7 /* _CPTStocksTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55023110059F22005DF982 /* _CPTStocksTheme.m */; }; + C37EA5DC1BC83F2A0091C8F7 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A591A4620B800D45436 /* CPTImagePlatformSpecific.m */; }; + C37EA5DD1BC83F2A0091C8F7 /* _CPTAnimationCGFloatPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB16165DB52C00739006 /* _CPTAnimationCGFloatPeriod.m */; }; + C37EA5DE1BC83F2A0091C8F7 /* CPTExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC00F37370D00F423D8 /* CPTExceptions.m */; }; + C37EA5DF1BC83F2A0091C8F7 /* _CPTDarkGradientTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772C92E0FE2F89000EC4C16 /* _CPTDarkGradientTheme.m */; }; + C37EA5E01BC83F2A0091C8F7 /* _CPTPlainBlackTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022D10059F22005DF982 /* _CPTPlainBlackTheme.m */; }; + C37EA5E11BC83F2A0091C8F7 /* CPTNumericData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */; }; + C37EA5E21BC83F2A0091C8F7 /* CorePlotProbes.d in Sources */ = {isa = PBXBuildFile; fileRef = BC89A64010239D1D009D5261 /* CorePlotProbes.d */; }; + C37EA5E31BC83F2A0091C8F7 /* CPTXYAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C420F3B816600DE45DC /* CPTXYAxisSet.m */; }; + C37EA5E41BC83F2A0091C8F7 /* CPTLimitBand.m in Sources */ = {isa = PBXBuildFile; fileRef = C318F4AC11EA188700595FF9 /* CPTLimitBand.m */; }; + C37EA5E51BC83F2A0091C8F7 /* CPTGridLines.m in Sources */ = {isa = PBXBuildFile; fileRef = C32B391710AA4C78000470D4 /* CPTGridLines.m */; }; + C37EA5E61BC83F2A0091C8F7 /* CPTPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 070622310FDF1B250066A6C4 /* CPTPathExtensions.m */; }; + C37EA5E71BC83F2A0091C8F7 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; + C37EA5E81BC83F2A0091C8F7 /* CPTPlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 32484B400F530E8B002151AD /* CPTPlotRange.m */; }; + C37EA5E91BC83F2A0091C8F7 /* CPTImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C3AFC9D00FB62969005DFFDC /* CPTImage.m */; }; + C37EA5EA1BC83F2A0091C8F7 /* CPTPlotSymbol.m in Sources */ = {isa = PBXBuildFile; fileRef = C34AFE6A11021D010041675A /* CPTPlotSymbol.m */; }; + C37EA5EB1BC83F2A0091C8F7 /* CPTAxisSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */; }; + C37EA5EC1BC83F2A0091C8F7 /* CPTPlotGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31DE71045EB470058520A /* CPTPlotGroup.m */; }; + C37EA5ED1BC83F2A0091C8F7 /* CPTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847016584EB9006BA43C /* CPTAnimation.m */; }; + C37EA5EE1BC83F2A0091C8F7 /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; + C37EA5EF1BC83F2A0091C8F7 /* _CPTAnimationPlotRangePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C091B8592D9F32AC384CB /* _CPTAnimationPlotRangePeriod.m */; }; + C37EA5F01BC83F2A0091C8F7 /* CPTPlotAreaFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */; }; + C37EA5F11BC83F2A0091C8F7 /* CPTAxisLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */; }; + C37EA5F21BC83F2A0091C8F7 /* CPTShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1B513EC4AA800038266 /* CPTShadow.m */; }; + C37EA5F31BC83F2A0091C8F7 /* _CPTAnimationCGPointPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0AE447398AF62D584F9C /* _CPTAnimationCGPointPeriod.m */; }; + C37EA5F41BC83F2A0091C8F7 /* CPTPlatformSpecificFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B1D1A46264500D45436 /* CPTPlatformSpecificFunctions.m */; }; + C37EA5F51BC83F2A0091C8F7 /* CPTMutableShadow.m in Sources */ = {isa = PBXBuildFile; fileRef = C32EE1C013EC4BE700038266 /* CPTMutableShadow.m */; }; + C37EA5F61BC83F2A0091C8F7 /* _CPTAnimationCGRectPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */; }; + C37EA5F71BC83F2A0091C8F7 /* CPTPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7B0F2B72B0002FCEA7 /* CPTPlotSpace.m */; }; + C37EA5F81BC83F2A0091C8F7 /* CPTLineCap.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D3AD2C13DF8DCE0004EA73 /* CPTLineCap.m */; }; + C37EA5F91BC83F2A0091C8F7 /* CPTScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */; }; + C37EA5FA1BC83F2A0091C8F7 /* _CPTSlateTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FCF2C5115B54AE00E46606 /* _CPTSlateTheme.m */; }; + C37EA5FB1BC83F2A0091C8F7 /* CPTAnimationPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */; }; + C37EA5FC1BC83F2A0091C8F7 /* CPTTextStylePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0A541A461F9700D45436 /* CPTTextStylePlatformSpecific.m */; }; + C37EA5FD1BC83F2A0091C8F7 /* _CPTBorderLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3408C3D15FC1C3E004F1D70 /* _CPTBorderLayer.m */; }; + C37EA5FE1BC83F2A0091C8F7 /* CPTLegendEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = C30550EC1399BE5400E0151F /* CPTLegendEntry.m */; }; + C37EA5FF1BC83F2A0091C8F7 /* CPTTradingRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 0772B43810E24D5C009CD04C /* CPTTradingRangePlot.m */; }; + C37EA6001BC83F2A0091C8F7 /* CPTTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7E60F4B4F8200F9BCBB /* CPTTextLayer.m */; }; + C37EA6011BC83F2A0091C8F7 /* _CPTConstraintsRelative.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03C13E8D85800CE6DB1 /* _CPTConstraintsRelative.m */; }; + C37EA6021BC83F2A0091C8F7 /* CPTAnnotationHostLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 072161EA11D1F6BD009CC871 /* CPTAnnotationHostLayer.m */; }; + C37EA6031BC83F2A0091C8F7 /* CPTAnimationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */; }; + C37EA6041BC83F2A0091C8F7 /* _CPTFillGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = C34260190FAE096C00072842 /* _CPTFillGradient.m */; }; + C37EA6051BC83F2A0091C8F7 /* _CPTMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C3286BFF15D8740100A436A8 /* _CPTMaskLayer.m */; }; + C37EA6061BC83F2A0091C8F7 /* CPTCalendarFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C349DCB3151AAFBF00BFD6A7 /* CPTCalendarFormatter.m */; }; + C37EA6071BC83F2A0091C8F7 /* CPTAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BB511D10177000B8DAB /* CPTAnnotation.m */; }; + C37EA6081BC83F2A0091C8F7 /* _CPTFillColor.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601C0FAE096C00072842 /* _CPTFillColor.m */; }; + C37EA6091BC83F2A0091C8F7 /* _CPTAnimationTimingFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */; }; + C37EA60A1BC83F2A0091C8F7 /* CPTMutableLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */; }; + C37EA60B1BC83F2A0091C8F7 /* NSDecimalNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E7EF0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.m */; }; + C37EA60C1BC83F2A0091C8F7 /* CPTLegend.m in Sources */ = {isa = PBXBuildFile; fileRef = C3920AC31395B6500045F3BB /* CPTLegend.m */; }; + C37EA60D1BC83F2A0091C8F7 /* CPTAxisLabelGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */; }; + C37EA60E1BC83F2A0091C8F7 /* CPTFill.m in Sources */ = {isa = PBXBuildFile; fileRef = C342601A0FAE096C00072842 /* CPTFill.m */; }; + C37EA60F1BC83F2A0091C8F7 /* CPTMutableNumericData+TypeConversion.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CAFB251229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.m */; }; + C37EA6101BC83F2A0091C8F7 /* CPTRangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = D0C0477B12D6560900DA8047 /* CPTRangePlot.m */; }; + C37EA6111BC83F2A0091C8F7 /* CPTGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */; }; + C37EA6121BC83F2A0091C8F7 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; + C37EA6131BC83F2A0091C8F7 /* _CPTPlainWhiteTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = BC55022F10059F22005DF982 /* _CPTPlainWhiteTheme.m */; }; + C37EA6141BC83F2A0091C8F7 /* CPTGridLineGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C38DD49211A04B7A002A68E7 /* CPTGridLineGroup.m */; }; + C37EA6151BC83F2A0091C8F7 /* CPTNumericDataType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EEFD104D80C400B554F9 /* CPTNumericDataType.m */; }; + C37EA6161BC83F2A0091C8F7 /* CPTPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 07BF0D7F0F2B72F6002FCEA7 /* CPTPlot.m */; }; + C37EA6171BC83F2A0091C8F7 /* CPTPlatformSpecificCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B191A46264500D45436 /* CPTPlatformSpecificCategories.m */; }; + C37EA6181BC83F2A0091C8F7 /* CPTConstraints.m in Sources */ = {isa = PBXBuildFile; fileRef = 070064E8111F2BAA003DE087 /* CPTConstraints.m */; }; + C37EA6191BC83F2A0091C8F7 /* CPTTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */; }; + C37EA61A1BC83F2A0091C8F7 /* CPTFunctionDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1D17A9E07B00A52FF2 /* CPTFunctionDataSource.m */; }; + C37EA61B1BC83F2A0091C8F7 /* NSNumberExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 078F42DA0FACC075006E670B /* NSNumberExtensions.m */; }; + C37EA61C1BC83F2A0091C8F7 /* CPTBorderedLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0706223B0FDF215C0066A6C4 /* CPTBorderedLayer.m */; }; + C37EA61D1BC83F2A0091C8F7 /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; + C37EA61E1BC83F2A0091C8F7 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; + C37EA61F1BC83F2A0091C8F7 /* CPTPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74A32F10FC402600E7E90D /* CPTPieChart.m */; }; + C37EA6201BC83F2A0091C8F7 /* CPTColorSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 079FC0BC0FB9762B0037E990 /* CPTColorSpace.m */; }; + C37EA6211BC83F2A0091C8F7 /* CPTGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 07CA112E0FAC8F85000861CE /* CPTGradient.m */; }; + C37EA6221BC83F2A0091C8F7 /* CPTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 07321BC50F37382D00F423D8 /* CPTUtilities.m */; }; + C37EA6231BC83F2A0091C8F7 /* _CPTXYTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DA34CA107AD7710051DA02 /* _CPTXYTheme.m */; }; + C37EA6241BC83F2A0091C8F7 /* CPTXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 07983EF50F2F9A3D008C8618 /* CPTXYGraph.m */; }; + C37EA6251BC83F2A0091C8F7 /* CPTPlotArea.m in Sources */ = {isa = PBXBuildFile; fileRef = C34BF5BB10A67633007F0894 /* CPTPlotArea.m */; }; + C37EA6261BC83F2A0091C8F7 /* _CPTConstraintsFixed.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CCA03A13E8D85800CE6DB1 /* _CPTConstraintsFixed.m */; }; + C37EA6271BC83F2A0091C8F7 /* CPTAxis.m in Sources */ = {isa = PBXBuildFile; fileRef = 07975C480F3B818800DE45DC /* CPTAxis.m */; }; + C37EA6281BC83F2A0091C8F7 /* CPTMutableTextStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */; }; + C37EA62A1BC83F2A0091C8F7 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A551A69F6F000F77249 /* Accelerate.framework */; }; + C37EA62B1BC83F2A0091C8F7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; + C37EA62C1BC83F2A0091C8F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A511A69F6DA00F77249 /* QuartzCore.framework */; }; + C37EA62D1BC83F2A0091C8F7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A531A69F6DF00F77249 /* UIKit.framework */; }; + C37EA62F1BC83F2A0091C8F7 /* CPTLimitBand.h in Headers */ = {isa = PBXBuildFile; fileRef = C318F4AB11EA188700595FF9 /* CPTLimitBand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6301BC83F2A0091C8F7 /* CPTDefinitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6311BC83F2A0091C8F7 /* CPTPlotSymbol.h in Headers */ = {isa = PBXBuildFile; fileRef = C34AFE6911021D010041675A /* CPTPlotSymbol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6321BC83F2A0091C8F7 /* CPTTradingRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772B43710E24D5C009CD04C /* CPTTradingRangePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6331BC83F2A0091C8F7 /* CPTGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6341BC83F2A0091C8F7 /* CPTGridLines.h in Headers */ = {isa = PBXBuildFile; fileRef = C32B391610AA4C78000470D4 /* CPTGridLines.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6351BC83F2A0091C8F7 /* CPTTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69A5B12B6215000F4C16C /* CPTTextStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6361BC83F2A0091C8F7 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6371BC83F2A0091C8F7 /* CPTPieChart.h in Headers */ = {isa = PBXBuildFile; fileRef = BC74A32E10FC402600E7E90D /* CPTPieChart.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6381BC83F2A0091C8F7 /* CPTMutableNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CAFB241229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6391BC83F2A0091C8F7 /* CPTAxisLabelGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA63A1BC83F2A0091C8F7 /* CPTPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D7A0F2B72B0002FCEA7 /* CPTPlotSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA63B1BC83F2A0091C8F7 /* CPTGraphHostingView.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B271A46265300D45436 /* CPTGraphHostingView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA63C1BC83F2A0091C8F7 /* CPTColorSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 079FC0BB0FB9762B0037E990 /* CPTColorSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA63D1BC83F2A0091C8F7 /* CPTXYPlotSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 0799E0970F2BB6E800790525 /* CPTXYPlotSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA63E1BC83F2A0091C8F7 /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 906156BC0F375598001B75FC /* CPTLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA63F1BC83F2A0091C8F7 /* CPTPathExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 070622300FDF1B250066A6C4 /* CPTPathExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6401BC83F2A0091C8F7 /* _CPTBorderLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3408C3C15FC1C3E004F1D70 /* _CPTBorderLayer.h */; }; + C37EA6411BC83F2A0091C8F7 /* CPTNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6421BC83F2A0091C8F7 /* CPTLineCap.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D3AD2B13DF8DCE0004EA73 /* CPTLineCap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6431BC83F2A0091C8F7 /* _CPTFillGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601E0FAE096C00072842 /* _CPTFillGradient.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6441BC83F2A0091C8F7 /* CPTNumericDataType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEFC104D80C400B554F9 /* CPTNumericDataType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6451BC83F2A0091C8F7 /* CPTAnimationPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB11165DB50300739006 /* CPTAnimationPeriod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6461BC83F2A0091C8F7 /* _CPTPlainWhiteTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55022E10059F22005DF982 /* _CPTPlainWhiteTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6471BC83F2A0091C8F7 /* CPTBorderedLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0706223A0FDF215C0066A6C4 /* CPTBorderedLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6481BC83F2A0091C8F7 /* CPTAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D820F2B7340002FCEA7 /* CPTAxisSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6491BC83F2A0091C8F7 /* CPTScatterPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA64A1BC83F2A0091C8F7 /* CPTMutableShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1BF13EC4BE700038266 /* CPTMutableShadow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA64B1BC83F2A0091C8F7 /* _CPTPlainBlackTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55022C10059F22005DF982 /* _CPTPlainBlackTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA64C1BC83F2A0091C8F7 /* _CPTAnimationNSDecimalPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */; }; + C37EA64D1BC83F2A0091C8F7 /* CPTCalendarFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = C349DCB2151AAFBF00BFD6A7 /* CPTCalendarFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA64E1BC83F2A0091C8F7 /* CPTTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7E50F4B4F8200F9BCBB /* CPTTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA64F1BC83F2A0091C8F7 /* CPTResponder.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AEF1FD10BBE1F10012BEFF /* CPTResponder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6501BC83F2A0091C8F7 /* CPTLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7EA0F4B4F9600F9BCBB /* CPTLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6511BC83F2A0091C8F7 /* CPTPlotAreaFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D760F2B723A002FCEA7 /* CPTPlotAreaFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6521BC83F2A0091C8F7 /* CPTXYAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = 0783DD530FBF097E006C3696 /* CPTXYAxis.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6531BC83F2A0091C8F7 /* _CPTStocksTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = BC55023010059F22005DF982 /* _CPTStocksTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6541BC83F2A0091C8F7 /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6551BC83F2A0091C8F7 /* CPTTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772C9250FE2F71600EC4C16 /* CPTTheme.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6561BC83F2A0091C8F7 /* CPTPlatformSpecificCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B181A46264500D45436 /* CPTPlatformSpecificCategories.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6571BC83F2A0091C8F7 /* NSNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 078F42D90FACC075006E670B /* NSNumberExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6581BC83F2A0091C8F7 /* _CPTConstraintsRelative.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA03B13E8D85800CE6DB1 /* _CPTConstraintsRelative.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6591BC83F2A0091C8F7 /* CPTAnimationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA65A1BC83F2A0091C8F7 /* _CPTDarkGradientTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 0772C92D0FE2F89000EC4C16 /* _CPTDarkGradientTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA65B1BC83F2A0091C8F7 /* CPTRangePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = D0C0477C12D6560900DA8047 /* CPTRangePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA65C1BC83F2A0091C8F7 /* _CPTAnimationCGSizePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */; }; + C37EA65D1BC83F2A0091C8F7 /* CPTPlotGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31DE81045EB470058520A /* CPTPlotGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA65E1BC83F2A0091C8F7 /* CPTLegend.h in Headers */ = {isa = PBXBuildFile; fileRef = C3920AC21395B6500045F3BB /* CPTLegend.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA65F1BC83F2A0091C8F7 /* _CPTFillImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C34260180FAE096C00072842 /* _CPTFillImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6601BC83F2A0091C8F7 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */; }; + C37EA6611BC83F2A0091C8F7 /* CPTPlotSpaceAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BAF11D1016B000B8DAB /* CPTPlotSpaceAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6621BC83F2A0091C8F7 /* CPTConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 070064E7111F2BAA003DE087 /* CPTConstraints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6631BC83F2A0091C8F7 /* NSCoderExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3978E0413CE653B00A420D9 /* NSCoderExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6641BC83F2A0091C8F7 /* CPTNumericData+TypeConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6651BC83F2A0091C8F7 /* _CPTFillColor.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601B0FAE096C00072842 /* _CPTFillColor.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6661BC83F2A0091C8F7 /* _CPTXYTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DA34CB107AD7710051DA02 /* _CPTXYTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6671BC83F2A0091C8F7 /* CPTLayerAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BB911D10183000B8DAB /* CPTLayerAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6681BC83F2A0091C8F7 /* _CPTAnimationCGFloatPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C9CB15165DB52C00739006 /* _CPTAnimationCGFloatPeriod.h */; }; + C37EA6691BC83F2A0091C8F7 /* CPTAxisTitle.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFC7C3510921FDB00DAECAA /* CPTAxisTitle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA66A1BC83F2A0091C8F7 /* _CPTSlateTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 07FCF2C4115B54AE00E46606 /* _CPTSlateTheme.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA66B1BC83F2A0091C8F7 /* CPTMutableNumericData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C97EF10104D819100B554F9 /* CPTMutableNumericData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA66C1BC83F2A0091C8F7 /* CPTGridLineGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = C38DD49111A04B7A002A68E7 /* CPTGridLineGroup.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA66D1BC83F2A0091C8F7 /* CorePlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 070CF7AE0F3CA7AB0001FFF4 /* CorePlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA66E1BC83F2A0091C8F7 /* CPTMutableLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA66F1BC83F2A0091C8F7 /* CPTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C2846F16584EB9006BA43C /* CPTAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6701BC83F2A0091C8F7 /* CPTExceptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 07321BBF0F37370D00F423D8 /* CPTExceptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6711BC83F2A0091C8F7 /* CPTPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6721BC83F2A0091C8F7 /* CPTShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = C32EE1B413EC4AA800038266 /* CPTShadow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6731BC83F2A0091C8F7 /* CPTAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 07E10BB411D10177000B8DAB /* CPTAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6741BC83F2A0091C8F7 /* CPTColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 079FC0B20FB975500037E990 /* CPTColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6751BC83F2A0091C8F7 /* CPTTextStylePlatformSpecific.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0A531A461F9700D45436 /* CPTTextStylePlatformSpecific.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6761BC83F2A0091C8F7 /* CPTFill.h in Headers */ = {isa = PBXBuildFile; fileRef = C342601F0FAE096C00072842 /* CPTFill.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6771BC83F2A0091C8F7 /* CPTPlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 32484B3F0F530E8B002151AD /* CPTPlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6781BC83F2A0091C8F7 /* CPTXYAxisSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 07975C410F3B816600DE45DC /* CPTXYAxisSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6791BC83F2A0091C8F7 /* CPTTimeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A2E6FA102DF47900809BC5 /* CPTTimeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA67A1BC83F2A0091C8F7 /* CPTLegendEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = C30550EB1399BE5400E0151F /* CPTLegendEntry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA67B1BC83F2A0091C8F7 /* CPTPlotArea.h in Headers */ = {isa = PBXBuildFile; fileRef = C34BF5BA10A67633007F0894 /* CPTPlotArea.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA67C1BC83F2A0091C8F7 /* _CPTMaskLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3286BFE15D8740100A436A8 /* _CPTMaskLayer.h */; }; + C37EA67D1BC83F2A0091C8F7 /* _CPTAnimationPlotRangePeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E16290C226BC4BE3936 /* _CPTAnimationPlotRangePeriod.h */; }; + C37EA67E1BC83F2A0091C8F7 /* CPTFunctionDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F97F1C17A9E07B00A52FF2 /* CPTFunctionDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA67F1BC83F2A0091C8F7 /* CPTGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CA112D0FAC8F85000861CE /* CPTGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6801BC83F2A0091C8F7 /* _CPTAnimationCGPointPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E154E8598EDE2EDEF2F /* _CPTAnimationCGPointPeriod.h */; }; + C37EA6811BC83F2A0091C8F7 /* NSDecimalNumberExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CD7E7EE0F4B4FA700F9BCBB /* NSDecimalNumberExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6821BC83F2A0091C8F7 /* CPTAxis.h in Headers */ = {isa = PBXBuildFile; fileRef = 07975C470F3B818800DE45DC /* CPTAxis.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6831BC83F2A0091C8F7 /* CPTPlatformSpecificFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B1C1A46264500D45436 /* CPTPlatformSpecificFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6841BC83F2A0091C8F7 /* CPTAnnotationHostLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 072161E911D1F6BD009CC871 /* CPTAnnotationHostLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6851BC83F2A0091C8F7 /* CPTAxisLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 073FB02E0FC991A3007A728E /* CPTAxisLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6861BC83F2A0091C8F7 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; + C37EA6871BC83F2A0091C8F7 /* _CPTAnimationTimingFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */; }; + C37EA6881BC83F2A0091C8F7 /* CPTMutableTextStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA6891BC83F2A0091C8F7 /* CPTXYGraph.h in Headers */ = {isa = PBXBuildFile; fileRef = 07983EF40F2F9A3D008C8618 /* CPTXYGraph.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA68A1BC83F2A0091C8F7 /* CPTPlatformSpecificDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = C38A0B1A1A46264500D45436 /* CPTPlatformSpecificDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA68B1BC83F2A0091C8F7 /* CPTBarPlot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0799E0930F2BB5F300790525 /* CPTBarPlot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA68C1BC83F2A0091C8F7 /* CPTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 07321BC40F37382D00F423D8 /* CPTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C37EA68D1BC83F2A0091C8F7 /* _CPTConstraintsFixed.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CCA03913E8D85800CE6DB1 /* _CPTConstraintsFixed.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C37EA6981BC83F2D0091C8F7 /* CPTMutableNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CADDC611B167AD00D36017 /* CPTMutableNumericDataTests.m */; }; + C37EA6991BC83F2D0091C8F7 /* CPTColorSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AE13D2337E00145DFF /* CPTColorSpaceTests.m */; }; + C37EA69A1BC83F2D0091C8F7 /* CPTFillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979BA13D2347300145DFF /* CPTFillTests.m */; }; + C37EA69B1BC83F2D0091C8F7 /* CPTUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */; }; + C37EA69C1BC83F2D0091C8F7 /* CPTGradientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B113D233C000145DFF /* CPTGradientTests.m */; }; + C37EA69D1BC83F2D0091C8F7 /* CPTDarkGradientThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE6051100F27EF00895A91 /* CPTDarkGradientThemeTests.m */; }; + C37EA69E1BC83F2D0091C8F7 /* CPTAxisLabelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD23FFB0FFBE78400ADD2E2 /* CPTAxisLabelTests.m */; }; + C37EA69F1BC83F2D0091C8F7 /* CPTThemeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E1620CBD100F03A100A84E77 /* CPTThemeTests.m */; }; + C37EA6A01BC83F2D0091C8F7 /* CPTColorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979AB13D2332500145DFF /* CPTColorTests.m */; }; + C37EA6A11BC83F2D0091C8F7 /* CPTPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A313D2136600145DFF /* CPTPlotSpaceTests.m */; }; + C37EA6A21BC83F2D0091C8F7 /* CPTImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B413D2340000145DFF /* CPTImageTests.m */; }; + C37EA6A31BC83F2D0091C8F7 /* CPTDataSourceTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */; }; + C37EA6A41BC83F2D0091C8F7 /* CPTNumericDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF06104D80D400B554F9 /* CPTNumericDataTests.m */; }; + C37EA6A51BC83F2D0091C8F7 /* CPTDerivedXYGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FE611A100F3FB700895A91 /* CPTDerivedXYGraph.m */; }; + C37EA6A61BC83F2D0091C8F7 /* CPTXYPlotSpaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */; }; + C37EA6A71BC83F2D0091C8F7 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; + C37EA6A81BC83F2D0091C8F7 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; + C37EA6A91BC83F2D0091C8F7 /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; + C37EA6AA1BC83F2D0091C8F7 /* CPTMutableNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3CB561B122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m */; }; + C37EA6AB1BC83F2D0091C8F7 /* CPTLineStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979B713D2344000145DFF /* CPTLineStyleTests.m */; }; + C37EA6AC1BC83F2D0091C8F7 /* CPTTextStyleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */; }; + C37EA6AD1BC83F2D0091C8F7 /* CPTTimeFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D979A813D2328000145DFF /* CPTTimeFormatterTests.m */; }; + C37EA6AE1BC83F2D0091C8F7 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; + C37EA6AF1BC83F2D0091C8F7 /* CPTScatterPlotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */; }; + C37EA6B11BC83F2D0091C8F7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C38A09831A46185300D45436 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot.framework */; }; C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; }; C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; @@ -562,6 +791,7 @@ C3A695E5146A19BC00AF5653 /* CPTMutablePlotRange.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A695E3146A19BC00AF5653 /* CPTMutablePlotRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3A695E6146A19BC00AF5653 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; C3AFC9D10FB62969005DFFDC /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C3B4D4971BC9983300450C37 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */; }; C3BB93191B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; C3BB931A1B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; @@ -647,6 +877,13 @@ remoteGlobalIDString = C38A09B91A4619A900D45436; remoteInfo = "CorePlot-CocoaTouch"; }; + C3B4D4951BC997F600450C37 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C37EA5C91BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -859,6 +1096,10 @@ C36E89B811EE7F97003DE309 /* CPTPlotRangeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRangeTests.h; sourceTree = ""; }; C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRangeTests.m; sourceTree = ""; }; C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = MacOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C37EA6931BC83F2A0091C8F7 /* CorePlot-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-tvOS-Info.plist"; path = "/Users/eskroch/Projects/Core Plot/framework/Info/CorePlot-tvOS-Info.plist"; sourceTree = ""; }; + C37EA6B71BC83F2D0091C8F7 /* UnitTests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UnitTests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C37EA6B81BC83F2E0091C8F7 /* CorePlot-tvOSTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-tvOSTests-Info.plist"; path = "/Users/eskroch/Projects/Core Plot/framework/Info/CorePlot-tvOSTests-Info.plist"; sourceTree = ""; }; C38A09781A46185200D45436 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C38A09821A46185300D45436 /* UnitTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "UnitTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libCorePlot-CocoaTouch.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -973,6 +1214,26 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C37EA6291BC83F2A0091C8F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C37EA62A1BC83F2A0091C8F7 /* Accelerate.framework in Frameworks */, + C37EA62B1BC83F2A0091C8F7 /* CoreGraphics.framework in Frameworks */, + C37EA62C1BC83F2A0091C8F7 /* QuartzCore.framework in Frameworks */, + C37EA62D1BC83F2A0091C8F7 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C37EA6B01BC83F2D0091C8F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C37EA6B11BC83F2D0091C8F7 /* CoreGraphics.framework in Frameworks */, + C3B4D4971BC9983300450C37 /* CorePlot.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C38A09741A46185200D45436 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1028,6 +1289,8 @@ C38A09821A46185300D45436 /* UnitTests iOS.xctest */, C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */, C38A09C41A4619A900D45436 /* CorePlot-CocoaTouchTests.xctest */, + C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */, + C37EA6B71BC83F2D0091C8F7 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -1358,6 +1621,7 @@ 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */, C3226A4F1A69F18C00F77249 /* CorePlot-CocoaTouch-Info.plist */, C3226A501A69F1A700F77249 /* CorePlot-iOS-Info.plist */, + C37EA6931BC83F2A0091C8F7 /* CorePlot-tvOS-Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; @@ -1506,6 +1770,7 @@ C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */, C3226A4D1A69F09A00F77249 /* CorePlot-iOSTests-Info.plist */, C3226A4E1A69F0AA00F77249 /* CorePlot-CocoaTouchTests-Info.plist */, + C37EA6B81BC83F2E0091C8F7 /* CorePlot-tvOSTests-Info.plist */, ); name = Resources; sourceTree = ""; @@ -1826,6 +2091,108 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C37EA62E1BC83F2A0091C8F7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C37EA62F1BC83F2A0091C8F7 /* CPTLimitBand.h in Headers */, + C37EA6301BC83F2A0091C8F7 /* CPTDefinitions.h in Headers */, + C37EA6311BC83F2A0091C8F7 /* CPTPlotSymbol.h in Headers */, + C37EA6321BC83F2A0091C8F7 /* CPTTradingRangePlot.h in Headers */, + C37EA6331BC83F2A0091C8F7 /* CPTGraph.h in Headers */, + C37EA6341BC83F2A0091C8F7 /* CPTGridLines.h in Headers */, + C37EA6351BC83F2A0091C8F7 /* CPTTextStyle.h in Headers */, + C37EA6361BC83F2A0091C8F7 /* CPTMutablePlotRange.h in Headers */, + C37EA6371BC83F2A0091C8F7 /* CPTPieChart.h in Headers */, + C37EA6381BC83F2A0091C8F7 /* CPTMutableNumericData+TypeConversion.h in Headers */, + C37EA6391BC83F2A0091C8F7 /* CPTAxisLabelGroup.h in Headers */, + C37EA63A1BC83F2A0091C8F7 /* CPTPlotSpace.h in Headers */, + C37EA63B1BC83F2A0091C8F7 /* CPTGraphHostingView.h in Headers */, + C37EA63C1BC83F2A0091C8F7 /* CPTColorSpace.h in Headers */, + C37EA63D1BC83F2A0091C8F7 /* CPTXYPlotSpace.h in Headers */, + C37EA63E1BC83F2A0091C8F7 /* CPTLineStyle.h in Headers */, + C37EA63F1BC83F2A0091C8F7 /* CPTPathExtensions.h in Headers */, + C37EA6401BC83F2A0091C8F7 /* _CPTBorderLayer.h in Headers */, + C37EA6411BC83F2A0091C8F7 /* CPTNumericData.h in Headers */, + C37EA6421BC83F2A0091C8F7 /* CPTLineCap.h in Headers */, + C37EA6431BC83F2A0091C8F7 /* _CPTFillGradient.h in Headers */, + C37EA6441BC83F2A0091C8F7 /* CPTNumericDataType.h in Headers */, + C37EA6451BC83F2A0091C8F7 /* CPTAnimationPeriod.h in Headers */, + C37EA6461BC83F2A0091C8F7 /* _CPTPlainWhiteTheme.h in Headers */, + C37EA6471BC83F2A0091C8F7 /* CPTBorderedLayer.h in Headers */, + C37EA6481BC83F2A0091C8F7 /* CPTAxisSet.h in Headers */, + C37EA6491BC83F2A0091C8F7 /* CPTScatterPlot.h in Headers */, + C37EA64A1BC83F2A0091C8F7 /* CPTMutableShadow.h in Headers */, + C37EA64B1BC83F2A0091C8F7 /* _CPTPlainBlackTheme.h in Headers */, + C37EA64C1BC83F2A0091C8F7 /* _CPTAnimationNSDecimalPeriod.h in Headers */, + C37EA64D1BC83F2A0091C8F7 /* CPTCalendarFormatter.h in Headers */, + C37EA64E1BC83F2A0091C8F7 /* CPTTextLayer.h in Headers */, + C37EA64F1BC83F2A0091C8F7 /* CPTResponder.h in Headers */, + C37EA6501BC83F2A0091C8F7 /* CPTLayer.h in Headers */, + C37EA6511BC83F2A0091C8F7 /* CPTPlotAreaFrame.h in Headers */, + C37EA6521BC83F2A0091C8F7 /* CPTXYAxis.h in Headers */, + C37EA6531BC83F2A0091C8F7 /* _CPTStocksTheme.h in Headers */, + C37EA6541BC83F2A0091C8F7 /* CPTImage.h in Headers */, + C37EA6551BC83F2A0091C8F7 /* CPTTheme.h in Headers */, + C37EA6561BC83F2A0091C8F7 /* CPTPlatformSpecificCategories.h in Headers */, + C37EA6571BC83F2A0091C8F7 /* NSNumberExtensions.h in Headers */, + C37EA6581BC83F2A0091C8F7 /* _CPTConstraintsRelative.h in Headers */, + C37EA6591BC83F2A0091C8F7 /* CPTAnimationOperation.h in Headers */, + C37EA65A1BC83F2A0091C8F7 /* _CPTDarkGradientTheme.h in Headers */, + C37EA65B1BC83F2A0091C8F7 /* CPTRangePlot.h in Headers */, + C37EA65C1BC83F2A0091C8F7 /* _CPTAnimationCGSizePeriod.h in Headers */, + C37EA65D1BC83F2A0091C8F7 /* CPTPlotGroup.h in Headers */, + C37EA65E1BC83F2A0091C8F7 /* CPTLegend.h in Headers */, + C37EA65F1BC83F2A0091C8F7 /* _CPTFillImage.h in Headers */, + C37EA6601BC83F2A0091C8F7 /* _CPTAnimationCGRectPeriod.h in Headers */, + C37EA6611BC83F2A0091C8F7 /* CPTPlotSpaceAnnotation.h in Headers */, + C37EA6621BC83F2A0091C8F7 /* CPTConstraints.h in Headers */, + C37EA6631BC83F2A0091C8F7 /* NSCoderExtensions.h in Headers */, + C37EA6641BC83F2A0091C8F7 /* CPTNumericData+TypeConversion.h in Headers */, + C37EA6651BC83F2A0091C8F7 /* _CPTFillColor.h in Headers */, + C37EA6661BC83F2A0091C8F7 /* _CPTXYTheme.h in Headers */, + C37EA6671BC83F2A0091C8F7 /* CPTLayerAnnotation.h in Headers */, + C37EA6681BC83F2A0091C8F7 /* _CPTAnimationCGFloatPeriod.h in Headers */, + C37EA6691BC83F2A0091C8F7 /* CPTAxisTitle.h in Headers */, + C37EA66A1BC83F2A0091C8F7 /* _CPTSlateTheme.h in Headers */, + C37EA66B1BC83F2A0091C8F7 /* CPTMutableNumericData.h in Headers */, + C37EA66C1BC83F2A0091C8F7 /* CPTGridLineGroup.h in Headers */, + C37EA66D1BC83F2A0091C8F7 /* CorePlot.h in Headers */, + C37EA66E1BC83F2A0091C8F7 /* CPTMutableLineStyle.h in Headers */, + C37EA66F1BC83F2A0091C8F7 /* CPTAnimation.h in Headers */, + C37EA6701BC83F2A0091C8F7 /* CPTExceptions.h in Headers */, + C37EA6711BC83F2A0091C8F7 /* CPTPlot.h in Headers */, + C37EA6721BC83F2A0091C8F7 /* CPTShadow.h in Headers */, + C37EA6731BC83F2A0091C8F7 /* CPTAnnotation.h in Headers */, + C37EA6741BC83F2A0091C8F7 /* CPTColor.h in Headers */, + C37EA6751BC83F2A0091C8F7 /* CPTTextStylePlatformSpecific.h in Headers */, + C37EA6761BC83F2A0091C8F7 /* CPTFill.h in Headers */, + C37EA6771BC83F2A0091C8F7 /* CPTPlotRange.h in Headers */, + C37EA6781BC83F2A0091C8F7 /* CPTXYAxisSet.h in Headers */, + C37EA6791BC83F2A0091C8F7 /* CPTTimeFormatter.h in Headers */, + C37EA67A1BC83F2A0091C8F7 /* CPTLegendEntry.h in Headers */, + C37EA67B1BC83F2A0091C8F7 /* CPTPlotArea.h in Headers */, + C37EA67C1BC83F2A0091C8F7 /* _CPTMaskLayer.h in Headers */, + C37EA67D1BC83F2A0091C8F7 /* _CPTAnimationPlotRangePeriod.h in Headers */, + C37EA67E1BC83F2A0091C8F7 /* CPTFunctionDataSource.h in Headers */, + C37EA67F1BC83F2A0091C8F7 /* CPTGradient.h in Headers */, + C37EA6801BC83F2A0091C8F7 /* _CPTAnimationCGPointPeriod.h in Headers */, + C37EA6811BC83F2A0091C8F7 /* NSDecimalNumberExtensions.h in Headers */, + C37EA6821BC83F2A0091C8F7 /* CPTAxis.h in Headers */, + C37EA6831BC83F2A0091C8F7 /* CPTPlatformSpecificFunctions.h in Headers */, + C37EA6841BC83F2A0091C8F7 /* CPTAnnotationHostLayer.h in Headers */, + C37EA6851BC83F2A0091C8F7 /* CPTAxisLabel.h in Headers */, + C37EA6861BC83F2A0091C8F7 /* CPTDebugQuickLook.h in Headers */, + C37EA6871BC83F2A0091C8F7 /* _CPTAnimationTimingFunctions.h in Headers */, + C37EA6881BC83F2A0091C8F7 /* CPTMutableTextStyle.h in Headers */, + C37EA6891BC83F2A0091C8F7 /* CPTXYGraph.h in Headers */, + C37EA68A1BC83F2A0091C8F7 /* CPTPlatformSpecificDefines.h in Headers */, + C37EA68B1BC83F2A0091C8F7 /* CPTBarPlot.h in Headers */, + C37EA68C1BC83F2A0091C8F7 /* CPTUtilities.h in Headers */, + C37EA68D1BC83F2A0091C8F7 /* _CPTConstraintsFixed.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C38A09751A46185200D45436 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1968,6 +2335,42 @@ productReference = 8DC2EF5B0486A6940098B216 /* CorePlot.framework */; productType = "com.apple.product-type.framework"; }; + C37EA5C91BC83F2A0091C8F7 /* CorePlot tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = C37EA68F1BC83F2A0091C8F7 /* Build configuration list for PBXNativeTarget "CorePlot tvOS" */; + buildPhases = ( + C37EA5CA1BC83F2A0091C8F7 /* Sources */, + C37EA6291BC83F2A0091C8F7 /* Frameworks */, + C37EA62E1BC83F2A0091C8F7 /* Headers */, + C37EA68E1BC83F2A0091C8F7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "CorePlot tvOS"; + productName = "CorePlot-iOS"; + productReference = C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */; + productType = "com.apple.product-type.framework"; + }; + C37EA6941BC83F2D0091C8F7 /* UnitTests tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = C37EA6B41BC83F2D0091C8F7 /* Build configuration list for PBXNativeTarget "UnitTests tvOS" */; + buildPhases = ( + C37EA6971BC83F2D0091C8F7 /* Sources */, + C37EA6B01BC83F2D0091C8F7 /* Frameworks */, + C37EA6B31BC83F2D0091C8F7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C3B4D4961BC997F600450C37 /* PBXTargetDependency */, + ); + name = "UnitTests tvOS"; + productName = "CorePlot-iOSTests"; + productReference = C37EA6B71BC83F2D0091C8F7 /* UnitTests tvOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; C38A09771A46185200D45436 /* CorePlot iOS */ = { isa = PBXNativeTarget; buildConfigurationList = C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot iOS" */; @@ -2086,10 +2489,13 @@ C38A09811A46185300D45436 /* UnitTests iOS */, C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */, C38A09C31A4619A900D45436 /* CorePlot-CocoaTouchTests */, + C37EA5C91BC83F2A0091C8F7 /* CorePlot tvOS */, + C37EA6941BC83F2D0091C8F7 /* UnitTests tvOS */, 9021E49E0FC5C9DC00443472 /* Documentation-Mac */, C38A09911A4618B600D45436 /* Documentation-iOS */, C38A09961A46193F00D45436 /* Universal Library */, C3A5467F1BC1A817005C1BBC /* Universal iOS Framework */, + C37EA5C41BC83E900091C8F7 /* Universal tvOS Framework */, ); }; /* End PBXProject section */ @@ -2111,6 +2517,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C37EA68E1BC83F2A0091C8F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C37EA6B31BC83F2D0091C8F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; C38A09761A46185200D45436 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2148,6 +2568,19 @@ shellPath = /bin/sh; shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen.config\"' to \n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ] \nthen \n echo doxygen config file does not exist\n ${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${DOXYGEN_FOLDER}/doxygen.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/MacOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlot.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; }; + C37EA5C51BC83E900091C8F7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\nUFW_TARGET=\"CorePlot tvOS\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest tvOS SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"tvos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nFRAMEWORK_NAME=\"${PROJECT_NAME}\"\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_PATH=\"${UFW_BUILD_DIR}/Release-tvos/${FRAMEWORK_NAME}.framework\"\nUFW_SIMULATOR_PATH=\"${UFW_BUILD_DIR}/Release-tvsimulator/${FRAMEWORK_NAME}.framework\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-tvuniversal\"\nUFW_FRAMEWORK=\"${UFW_UNIVERSAL_DIR}/${FRAMEWORK_NAME}.framework\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp -r \"${UFW_IPHONE_PATH}/.\" \"${UFW_FRAMEWORK}\"\n\nlipo -create -output \"${UFW_FRAMEWORK}/${FRAMEWORK_NAME}\" \"${UFW_SIMULATOR_PATH}/${FRAMEWORK_NAME}\" \"${UFW_IPHONE_PATH}/${FRAMEWORK_NAME}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n"; + }; C38A09921A4618B600D45436 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -2323,6 +2756,138 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C37EA5CA1BC83F2A0091C8F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C37EA5CB1BC83F2A0091C8F7 /* CPTGraphHostingView.m in Sources */, + C37EA5CC1BC83F2A0091C8F7 /* CPTLayerAnnotation.m in Sources */, + C37EA5CD1BC83F2A0091C8F7 /* CPTLayer.m in Sources */, + C37EA5CE1BC83F2A0091C8F7 /* CPTTimeFormatter.m in Sources */, + C37EA5CF1BC83F2A0091C8F7 /* CPTColor.m in Sources */, + C37EA5D01BC83F2A0091C8F7 /* NSCoderExtensions.m in Sources */, + C37EA5D11BC83F2A0091C8F7 /* CPTMutableNumericData.m in Sources */, + C37EA5D21BC83F2A0091C8F7 /* CPTNumericData+TypeConversion.m in Sources */, + C37EA5D31BC83F2A0091C8F7 /* CPTTheme.m in Sources */, + C37EA5D41BC83F2A0091C8F7 /* CPTDefinitions.m in Sources */, + C37EA5D51BC83F2A0091C8F7 /* _CPTFillImage.m in Sources */, + C37EA5D61BC83F2A0091C8F7 /* CPTPlotSpaceAnnotation.m in Sources */, + C37EA5D71BC83F2A0091C8F7 /* CPTXYAxis.m in Sources */, + C37EA5D81BC83F2A0091C8F7 /* CPTBarPlot.m in Sources */, + C37EA5D91BC83F2A0091C8F7 /* CPTAxisTitle.m in Sources */, + C37EA5DA1BC83F2A0091C8F7 /* CPTPlatformSpecificDefines.m in Sources */, + C37EA5DB1BC83F2A0091C8F7 /* _CPTStocksTheme.m in Sources */, + C37EA5DC1BC83F2A0091C8F7 /* CPTImagePlatformSpecific.m in Sources */, + C37EA5DD1BC83F2A0091C8F7 /* _CPTAnimationCGFloatPeriod.m in Sources */, + C37EA5DE1BC83F2A0091C8F7 /* CPTExceptions.m in Sources */, + C37EA5DF1BC83F2A0091C8F7 /* _CPTDarkGradientTheme.m in Sources */, + C37EA5E01BC83F2A0091C8F7 /* _CPTPlainBlackTheme.m in Sources */, + C37EA5E11BC83F2A0091C8F7 /* CPTNumericData.m in Sources */, + C37EA5E21BC83F2A0091C8F7 /* CorePlotProbes.d in Sources */, + C37EA5E31BC83F2A0091C8F7 /* CPTXYAxisSet.m in Sources */, + C37EA5E41BC83F2A0091C8F7 /* CPTLimitBand.m in Sources */, + C37EA5E51BC83F2A0091C8F7 /* CPTGridLines.m in Sources */, + C37EA5E61BC83F2A0091C8F7 /* CPTPathExtensions.m in Sources */, + C37EA5E71BC83F2A0091C8F7 /* CPTXYPlotSpace.m in Sources */, + C37EA5E81BC83F2A0091C8F7 /* CPTPlotRange.m in Sources */, + C37EA5E91BC83F2A0091C8F7 /* CPTImage.m in Sources */, + C37EA5EA1BC83F2A0091C8F7 /* CPTPlotSymbol.m in Sources */, + C37EA5EB1BC83F2A0091C8F7 /* CPTAxisSet.m in Sources */, + C37EA5EC1BC83F2A0091C8F7 /* CPTPlotGroup.m in Sources */, + C37EA5ED1BC83F2A0091C8F7 /* CPTAnimation.m in Sources */, + C37EA5EE1BC83F2A0091C8F7 /* _CPTAnimationNSDecimalPeriod.m in Sources */, + C37EA5EF1BC83F2A0091C8F7 /* _CPTAnimationPlotRangePeriod.m in Sources */, + C37EA5F01BC83F2A0091C8F7 /* CPTPlotAreaFrame.m in Sources */, + C37EA5F11BC83F2A0091C8F7 /* CPTAxisLabel.m in Sources */, + C37EA5F21BC83F2A0091C8F7 /* CPTShadow.m in Sources */, + C37EA5F31BC83F2A0091C8F7 /* _CPTAnimationCGPointPeriod.m in Sources */, + C37EA5F41BC83F2A0091C8F7 /* CPTPlatformSpecificFunctions.m in Sources */, + C37EA5F51BC83F2A0091C8F7 /* CPTMutableShadow.m in Sources */, + C37EA5F61BC83F2A0091C8F7 /* _CPTAnimationCGRectPeriod.m in Sources */, + C37EA5F71BC83F2A0091C8F7 /* CPTPlotSpace.m in Sources */, + C37EA5F81BC83F2A0091C8F7 /* CPTLineCap.m in Sources */, + C37EA5F91BC83F2A0091C8F7 /* CPTScatterPlot.m in Sources */, + C37EA5FA1BC83F2A0091C8F7 /* _CPTSlateTheme.m in Sources */, + C37EA5FB1BC83F2A0091C8F7 /* CPTAnimationPeriod.m in Sources */, + C37EA5FC1BC83F2A0091C8F7 /* CPTTextStylePlatformSpecific.m in Sources */, + C37EA5FD1BC83F2A0091C8F7 /* _CPTBorderLayer.m in Sources */, + C37EA5FE1BC83F2A0091C8F7 /* CPTLegendEntry.m in Sources */, + C37EA5FF1BC83F2A0091C8F7 /* CPTTradingRangePlot.m in Sources */, + C37EA6001BC83F2A0091C8F7 /* CPTTextLayer.m in Sources */, + C37EA6011BC83F2A0091C8F7 /* _CPTConstraintsRelative.m in Sources */, + C37EA6021BC83F2A0091C8F7 /* CPTAnnotationHostLayer.m in Sources */, + C37EA6031BC83F2A0091C8F7 /* CPTAnimationOperation.m in Sources */, + C37EA6041BC83F2A0091C8F7 /* _CPTFillGradient.m in Sources */, + C37EA6051BC83F2A0091C8F7 /* _CPTMaskLayer.m in Sources */, + C37EA6061BC83F2A0091C8F7 /* CPTCalendarFormatter.m in Sources */, + C37EA6071BC83F2A0091C8F7 /* CPTAnnotation.m in Sources */, + C37EA6081BC83F2A0091C8F7 /* _CPTFillColor.m in Sources */, + C37EA6091BC83F2A0091C8F7 /* _CPTAnimationTimingFunctions.m in Sources */, + C37EA60A1BC83F2A0091C8F7 /* CPTMutableLineStyle.m in Sources */, + C37EA60B1BC83F2A0091C8F7 /* NSDecimalNumberExtensions.m in Sources */, + C37EA60C1BC83F2A0091C8F7 /* CPTLegend.m in Sources */, + C37EA60D1BC83F2A0091C8F7 /* CPTAxisLabelGroup.m in Sources */, + C37EA60E1BC83F2A0091C8F7 /* CPTFill.m in Sources */, + C37EA60F1BC83F2A0091C8F7 /* CPTMutableNumericData+TypeConversion.m in Sources */, + C37EA6101BC83F2A0091C8F7 /* CPTRangePlot.m in Sources */, + C37EA6111BC83F2A0091C8F7 /* CPTGraph.m in Sources */, + C37EA6121BC83F2A0091C8F7 /* CPTMutablePlotRange.m in Sources */, + C37EA6131BC83F2A0091C8F7 /* _CPTPlainWhiteTheme.m in Sources */, + C37EA6141BC83F2A0091C8F7 /* CPTGridLineGroup.m in Sources */, + C37EA6151BC83F2A0091C8F7 /* CPTNumericDataType.m in Sources */, + C37EA6161BC83F2A0091C8F7 /* CPTPlot.m in Sources */, + C37EA6171BC83F2A0091C8F7 /* CPTPlatformSpecificCategories.m in Sources */, + C37EA6181BC83F2A0091C8F7 /* CPTConstraints.m in Sources */, + C37EA6191BC83F2A0091C8F7 /* CPTTextStyle.m in Sources */, + C37EA61A1BC83F2A0091C8F7 /* CPTFunctionDataSource.m in Sources */, + C37EA61B1BC83F2A0091C8F7 /* NSNumberExtensions.m in Sources */, + C37EA61C1BC83F2A0091C8F7 /* CPTBorderedLayer.m in Sources */, + C37EA61D1BC83F2A0091C8F7 /* CPTLineStyle.m in Sources */, + C37EA61E1BC83F2A0091C8F7 /* _CPTAnimationCGSizePeriod.m in Sources */, + C37EA61F1BC83F2A0091C8F7 /* CPTPieChart.m in Sources */, + C37EA6201BC83F2A0091C8F7 /* CPTColorSpace.m in Sources */, + C37EA6211BC83F2A0091C8F7 /* CPTGradient.m in Sources */, + C37EA6221BC83F2A0091C8F7 /* CPTUtilities.m in Sources */, + C37EA6231BC83F2A0091C8F7 /* _CPTXYTheme.m in Sources */, + C37EA6241BC83F2A0091C8F7 /* CPTXYGraph.m in Sources */, + C37EA6251BC83F2A0091C8F7 /* CPTPlotArea.m in Sources */, + C37EA6261BC83F2A0091C8F7 /* _CPTConstraintsFixed.m in Sources */, + C37EA6271BC83F2A0091C8F7 /* CPTAxis.m in Sources */, + C37EA6281BC83F2A0091C8F7 /* CPTMutableTextStyle.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C37EA6971BC83F2D0091C8F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C37EA6981BC83F2D0091C8F7 /* CPTMutableNumericDataTests.m in Sources */, + C37EA6991BC83F2D0091C8F7 /* CPTColorSpaceTests.m in Sources */, + C37EA69A1BC83F2D0091C8F7 /* CPTFillTests.m in Sources */, + C37EA69B1BC83F2D0091C8F7 /* CPTUtilitiesTests.m in Sources */, + C37EA69C1BC83F2D0091C8F7 /* CPTGradientTests.m in Sources */, + C37EA69D1BC83F2D0091C8F7 /* CPTDarkGradientThemeTests.m in Sources */, + C37EA69E1BC83F2D0091C8F7 /* CPTAxisLabelTests.m in Sources */, + C37EA69F1BC83F2D0091C8F7 /* CPTThemeTests.m in Sources */, + C37EA6A01BC83F2D0091C8F7 /* CPTColorTests.m in Sources */, + C37EA6A11BC83F2D0091C8F7 /* CPTPlotSpaceTests.m in Sources */, + C37EA6A21BC83F2D0091C8F7 /* CPTImageTests.m in Sources */, + C37EA6A31BC83F2D0091C8F7 /* CPTDataSourceTestCase.m in Sources */, + C37EA6A41BC83F2D0091C8F7 /* CPTNumericDataTests.m in Sources */, + C37EA6A51BC83F2D0091C8F7 /* CPTDerivedXYGraph.m in Sources */, + C37EA6A61BC83F2D0091C8F7 /* CPTXYPlotSpaceTests.m in Sources */, + C37EA6A71BC83F2D0091C8F7 /* CPTTestCase.m in Sources */, + C37EA6A81BC83F2D0091C8F7 /* CPTPlotRangeTests.m in Sources */, + C37EA6A91BC83F2D0091C8F7 /* CPTNumericDataTypeConversionTests.m in Sources */, + C37EA6AA1BC83F2D0091C8F7 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, + C37EA6AB1BC83F2D0091C8F7 /* CPTLineStyleTests.m in Sources */, + C37EA6AC1BC83F2D0091C8F7 /* CPTTextStyleTests.m in Sources */, + C37EA6AD1BC83F2D0091C8F7 /* CPTTimeFormatterTests.m in Sources */, + C37EA6AE1BC83F2D0091C8F7 /* CPTLayerTests.m in Sources */, + C37EA6AF1BC83F2D0091C8F7 /* CPTScatterPlotTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C38A09731A46185200D45436 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2605,6 +3170,11 @@ target = C38A09B91A4619A900D45436 /* CorePlot-CocoaTouch */; targetProxy = C38A09C61A4619A900D45436 /* PBXContainerItemProxy */; }; + C3B4D4961BC997F600450C37 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C37EA5C91BC83F2A0091C8F7 /* CorePlot tvOS */; + targetProxy = C3B4D4951BC997F600450C37 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -2683,6 +3253,7 @@ isa = XCBuildConfiguration; buildSettings = { ENABLE_TESTABILITY = YES; + ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Debug; @@ -2719,24 +3290,118 @@ }; name = Release; }; + C37EA5C71BC83E900091C8F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + }; + name = Debug; + }; + C37EA5C81BC83E900091C8F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + ZERO_LINK = NO; + }; + name = Release; + }; + C37EA6901BC83F2A0091C8F7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = CorePlot; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Debug; + }; + C37EA6911BC83F2A0091C8F7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = CorePlot; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Release; + }; + C37EA6B51BC83F2D0091C8F7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-tvOSTests-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Debug; + }; + C37EA6B61BC83F2D0091C8F7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-tvOSTests-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; + }; + name = Release; + }; C38A098B1A46185300D45436 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -2996,6 +3661,33 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C37EA5C61BC83E900091C8F7 /* Build configuration list for PBXAggregateTarget "Universal tvOS Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C37EA5C71BC83E900091C8F7 /* Debug */, + C37EA5C81BC83E900091C8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C37EA68F1BC83F2A0091C8F7 /* Build configuration list for PBXNativeTarget "CorePlot tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C37EA6901BC83F2A0091C8F7 /* Debug */, + C37EA6911BC83F2A0091C8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C37EA6B41BC83F2D0091C8F7 /* Build configuration list for PBXNativeTarget "UnitTests tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C37EA6B51BC83F2D0091C8F7 /* Debug */, + C37EA6B61BC83F2D0091C8F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; C38A098F1A46185300D45436 /* Build configuration list for PBXNativeTarget "CorePlot iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot tvOS.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot tvOS.xcscheme new file mode 100644 index 000000000..1a7678dd1 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot tvOS.xcscheme @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot_Prefix.pch b/framework/CorePlot_Prefix.pch index a02317766..650702d34 100644 --- a/framework/CorePlot_Prefix.pch +++ b/framework/CorePlot_Prefix.pch @@ -7,7 +7,7 @@ #import - #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE + #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE || TARGET_OS_TV #import #import #else diff --git a/framework/Info/CorePlot-tvOS-Info.plist b/framework/Info/CorePlot-tvOS-Info.plist new file mode 100644 index 000000000..d3de8eefb --- /dev/null +++ b/framework/Info/CorePlot-tvOS-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/framework/Info/CorePlot-tvOSTests-Info.plist b/framework/Info/CorePlot-tvOSTests-Info.plist new file mode 100644 index 000000000..ba72822e8 --- /dev/null +++ b/framework/Info/CorePlot-tvOSTests-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index 42d18d311..df3c81bc6 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -9,10 +9,13 @@ /// @cond @interface CPTGraphHostingView() +#if (TARGET_OS_SIMULATOR || TARGET_OS_IPHONE) && !TARGET_OS_TV @property (nonatomic, readwrite, cpt_weak_property) cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; --(void)graphNeedsRedraw:(NSNotification *)notification; -(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer; +#endif + +-(void)graphNeedsRedraw:(NSNotification *)notification; @end @@ -44,11 +47,15 @@ @implementation CPTGraphHostingView /// @cond +#if (TARGET_OS_SIMULATOR || TARGET_OS_IPHONE) && !TARGET_OS_TV + /** @internal - * @property cpt_weak id pinchGestureRecognizer + * @property cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer * @brief The pinch gesture recognizer for this view. + * @since Not available on tvOS. **/ @synthesize pinchGestureRecognizer; +#endif /// @endcond @@ -216,6 +223,7 @@ -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event /// @cond +#if (TARGET_OS_SIMULATOR || TARGET_OS_IPHONE) && !TARGET_OS_TV -(void)setAllowPinchScaling:(BOOL)allowScaling { if ( allowPinchScaling != allowScaling ) { @@ -265,6 +273,22 @@ -(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer pinchRecognizer.scale = 1.0; } +#endif + +/// @endcond + +#pragma mark - +#pragma mark TV Focus + +/// @cond + +#if TARGET_OS_TV + +-(BOOL)canBecomeFocused +{ + return YES; +} +#endif /// @endcond diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 1152dae82..e4e21ba15 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -162,6 +162,15 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style { CGSize textSize; +#if TARGET_OS_SIMULATOR || TARGET_OS_TV + CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) + options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + attributes:style.attributes + context:nil]; + textSize = rect.size; + textSize.width = ceil(textSize.width); + textSize.height = ceil(textSize.height); +#else // -boundingRectWithSize:options:attributes:context: is available in iOS 7.0 and later if ( [self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)] ) { CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) @@ -185,6 +194,7 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style textSize = [self sizeWithFont:theFont constrainedToSize:CPTSizeMake(10000.0, 10000.0)]; #pragma clang diagnostic pop } +#endif return textSize; } @@ -211,6 +221,12 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG CPTPushCGContext(context); +#if TARGET_OS_SIMULATOR || TARGET_OS_TV + [self drawWithRect:rect + options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + attributes:style.attributes + context:nil]; +#else #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 // -drawWithRect:options:attributes:context: method is available in iOS 7.0 and later if ( [self respondsToSelector:@selector(drawWithRect:options:attributes:context:)] ) { @@ -248,6 +264,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG withFont:theFont lineBreakMode:style.lineBreakMode alignment:(NSTextAlignment)style.textAlignment]; +#endif #endif CGContextRestoreGState(context); diff --git a/framework/xcconfig/CorePlot.xcconfig b/framework/xcconfig/CorePlot.xcconfig index 44cbeb3c3..faddc888b 100644 --- a/framework/xcconfig/CorePlot.xcconfig +++ b/framework/xcconfig/CorePlot.xcconfig @@ -4,6 +4,8 @@ ARCHS = $(ARCHS_STANDARD) VALID_ARCHS[sdk=iphoneos*] = arm64 armv7 armv7s VALID_ARCHS[sdk=iphonesimulator*] = i386 x86_64 VALID_ARCHS[sdk=macosx*] = i386 x86_64 +VALID_ARCHS[sdk=appletvos*] = arm64 +VALID_ARCHS[sdk=appletvsimulator*] = i386 x86_64 SYMROOT = $(PROJECT_DIR)/../build DEBUG_INFORMATION_FORMAT = dwarf-with-dsym diff --git a/scripts/createrelease.py b/scripts/createrelease.py index 5e76c5ee2..c9c588187 100644 --- a/scripts/createrelease.py +++ b/scripts/createrelease.py @@ -58,8 +58,10 @@ def RunXcode(project, target): binariesDir = join(releaseRootDir, 'Binaries') macosDir = join(binariesDir, 'MacOS') iosDir = join(binariesDir, 'iOS') +tvosDir = join(binariesDir, 'tvOS') makedirs(macosDir) mkdir(iosDir) +mkdir(tvosDir) # Build Mac Framework chdir('framework') @@ -81,6 +83,12 @@ def RunXcode(project, target): iOSHeaderFile = join(join(projectRoot, 'build/Release-universal'), 'CorePlotHeaders') copytree(iOSHeaderFile, join(iosDir, 'CorePlotHeaders')) +# Build tvOS Framework +RunXcode('CorePlot.xcodeproj', 'Universal tvOS Framework') +tvOSProductsDir = join(projectRoot, 'build/Release-tvuniversal') +tvOSFramework = join(tvOSProductsDir, 'CorePlot.framework') +copytree(tvOSFramework, join(tvosDir, 'CorePlot.framework'), symlinks=True) + # Build Docs RunXcode('CorePlot.xcodeproj', 'Documentation-Mac') RunXcode('CorePlot.xcodeproj', 'Documentation-iOS') From 5e176671df117a7deff407823eb722a944cdca4f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 14 Oct 2015 18:50:20 -0400 Subject: [PATCH 110/429] Added a tvOS version to the Plot Gallery example app. --- .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Large.imagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Small.imagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 26 ++ .../Top Shelf Image.imageset/Contents.json | 13 + .../Top Shelf Image.imageset/PlotGallery.png | Bin 0 -> 191272 bytes .../Assets.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 15 + .../PlotGallery.imageset/Contents.json | 21 + .../PlotGallery.imageset/PlotGallery.png | Bin 0 -> 191272 bytes .../first.imageset/Contents.json | 12 + .../Assets.xcassets/first.imageset/first.pdf | Bin 0 -> 2465 bytes .../second.imageset/Contents.json | 12 + .../second.imageset/second.pdf | Bin 0 -> 2423 bytes .../Plot_Gallery.xcodeproj/project.pbxproj | 386 ++++++++++++++++-- .../CorePlotGallery/Plot_Gallery_Prefix.pch | 2 +- .../Plot_Gallery_tvOS-Info.plist | 32 ++ .../CorePlotGallery/src/ios/Main.storyboard | 12 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +- .../CorePlotGallery/src/tvOS/AppDelegateTV.h | 7 + .../CorePlotGallery/src/tvOS/AppDelegateTV.m | 16 + .../src/tvOS/DetailViewControllerTV.h | 17 + .../src/tvOS/DetailViewControllerTV.m | 120 ++++++ .../CorePlotGallery/src/tvOS/Main.storyboard | 162 ++++++++ .../src/tvOS/RootViewControllerTV.h | 10 + .../src/tvOS/RootViewControllerTV.m | 125 ++++++ .../src/tvOS/ThemeTableViewControllerTV.h | 16 + .../src/tvOS/ThemeTableViewControllerTV.m | 100 +++++ examples/CorePlotGallery/src/tvOS/main.m | 9 + 40 files changed, 1216 insertions(+), 49 deletions(-) create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf create mode 100644 examples/CorePlotGallery/Plot_Gallery_tvOS-Info.plist create mode 100644 examples/CorePlotGallery/src/tvOS/AppDelegateTV.h create mode 100644 examples/CorePlotGallery/src/tvOS/AppDelegateTV.m create mode 100644 examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.h create mode 100644 examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m create mode 100644 examples/CorePlotGallery/src/tvOS/Main.storyboard create mode 100644 examples/CorePlotGallery/src/tvOS/RootViewControllerTV.h create mode 100644 examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m create mode 100644 examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.h create mode 100644 examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m create mode 100644 examples/CorePlotGallery/src/tvOS/main.m diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json new file mode 100644 index 000000000..8bf75d9f5 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json new file mode 100644 index 000000000..8bf75d9f5 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100644 index 000000000..0564959fb --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100644 index 000000000..6a3dcfa52 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,26 @@ +{ + "assets" : [ + { + "size" : "1280x768", + "idiom" : "tv", + "filename" : "App Icon - Large.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "400x240", + "idiom" : "tv", + "filename" : "App Icon - Small.imagestack", + "role" : "primary-app-icon" + }, + { + "size" : "1920x720", + "idiom" : "tv", + "filename" : "Top Shelf Image.imageset", + "role" : "top-shelf-image" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100644 index 000000000..c7df87c17 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "tv", + "filename" : "PlotGallery.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png new file mode 100644 index 0000000000000000000000000000000000000000..1bde034e43c9ed26136e6b737453d188b13f65ac GIT binary patch literal 191272 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

>bX`t*EGjdcJtI}t0s!snPldIh zMINfpxSIeMW$o;~{Gp&&WdK2JGC%T&BXN>t=FFKm1A@(E3h*|qws z8Fm5P=if!pIdpPA-SE5^orr;Z*y`lF9N!c5iP`y9OQ zp#l0V_ADr;+YHHcv;7PNYLf9HZFu6(fnW_XZvT_?xc(C;YMtAD27QZTc6}VD6={R% ze=Ip!icI;xlD3`pjb(5>Zn;te;>kX=G})2SY)ckh`rm$R$*Dx4$*~S{?rmUpG22fS zpmgI%9)Bg9WOu#DqWisOjJUC%%KtgpC0KDg)YzER5 z6(dyQuk@`+k&GXF;tz+*hapOe_Wre(E*PSOU~7Q6GSd|b?bFe0YoJ5^B^Nvr0F$;f zz%U}h7S1*Q%DYhV$QQ14p+GiJl>PSG@8y?Y)>kP*i_o~Btwg(tRdWm)0OYfR^#$5i zf`dTXiH z+0j5jiZbWa5<4hiy{0O@O$J_4u_0>750v*#pLe}3EUh*g&_T9(c$P?sN0P$}Ce$fU z6bdw47Yepb;Fc#`-f;BMN8>Js^Ups&pBgqZPMIZXR(O6%{JR?Ikx_rS?ZhF z>YFb{Ond*XzJ04nhPv6*Kxf*|@`~X_+wjE06xtd7EBtn8s?>Nn6t+S2Up68rPql?B zS*cq=tM0ry>xm}tuwutXtGxy~j+2Wa5p!k{auFOCh6rh_s;buHXr|+0c3LIxEj4RkWJs$tN%P-%VBP&CZ%B@+E8Sp7aQ%CpU;c2LMhE}pMbgKx?)Iq%pj2%1n;)^f7`s%9} zE?kIN1e{F6_I@ z)|Oq)*nRiifAgE)y!z^^IFW&qDZe@YH_*A8Zn>$lV#ueTdH3Ecv*)3Uysa@F#4yF; zR)@NZsHL|*e}C$ZJD&Kp3T>-aey$S#^sCi4WOU6n_bUHnWu4it=3cKCy9CITlCEGD zw9!f%ZTPXuJJ{8Ro3T3NA8)Q=69w<#s7|K(THTm!HPbBxjwc85v^^xUzRb5Y+n#&p ztMqoD(2^WqquwipRFB}$UIcCQ)Py-=3iy}AliWt9X@lE_H!UeVrvV0V#qc+nEVNg^ z!3XVd5xrsueKnFibuP%4aL8tV+ewZ*;|)~ytKTlt@=P@H5btdXhs$fiwNw1`03!?r z6W~FH6atV;c=D1G1Pq}`((G?8ve+C6elPJ4;xJ}@xj6u15DQF}f4~2mBo!#uA+|xl z?|=V$>{G)j21d)VcG_vD{rAUN0NY@C|GDR$b6mat7efIUG~#&oT@s^>PD)`W{LC}Y z#O-Xj^B|uI+Mif9EO&??iUIu@MmtYgK`3G;^`|n>5Q#QnS2%VO#goH=)*>QO$fW2h zMobk#$ccV|FL_2iD}P6k-1>tv>naIVSB;7B8*GSxg&TaE;^Jzgi@gXq_=h3F;fEiN z6>)rnVxC6#QiU@5o%iE8r(Y=R7nsz ziiZ1!8*acB5GfS#UbS-7_rLdj92dlJ4Fd?;EMklgfOGQ6C*$g9JU$2bsb`+rX2Len z)@W^Y?H&hBQ|UtvJRoz+|5l%W0k>2c&mOx^I_SXNh7K7pXKur7w?DRQIhK;8p`dmQ zNIUPe-2wYg0W9sww2!`g_PJNhg#ZKu65${CyRQu_-FiO}i8p&zH%lk~hvpC?k)BNLnc)AbbwI;XNkVAxZ@onwq%Rd`D z>;5a~pC7Y3Vj3uH03$tG&UQr^8JOb(@KI?kUem_iOnQ9R*>YNGqL9_b(&%9$0{3&4 ze-W#o%^-~qaM+*7iOB*Ck!9Bjh?&$q+l3=cI3gTpeGZybRWrT{T|kauI`n{V2Fnr% z;Wx{1B@qu7hyiS%C4W!?drX+Bmg58u#IREhY$t+yoPW?HvXrzKftVG8|4Ls29<5@G z@fZP|c;bow`q#glC^>&|!fN>N;aHy*UstP?gK9cNvXTN47pIBP1=yg8OZD-Mg)R5^ z_QihtJYr#$#?I5BPERc1%njX26qe$EZ|CKYS9E76dP`cZicJ|@e2B0#r@(9+~Y;*tp_hUK%KDY%B zBZf#Ma>^;EP*}+{9ZKE!+Z$;Wp~-VjCvf(_Fgkb{$pKE|8#fwx60Jdr^|!*e#I9Cp z9wHz`n0DpQ7;X!Ng2e)}P;m0%>1Uqadh4y9e)gFa%a`M7ftzl=$&7|+w)ft9Z|)p> zl;70YR9;?=k;JrVAF1>~zVKfm?%jAM@4|Ji4*-*M+- z=yfFGRSXVI>^OY*z!@{Y7O_D}+);JVe%g^W8Jl3ngZkL|a}~TkcdF+1$~%1Z%5(7P z@28usVS1qb^jQ^Ewc{$O)R>~(wiDc8`%g%OCV!z03srg|98Jm5Rh|#*q9hEbIyi_u z`!|u?(N;(vB2XvCnW?fCt)gio?7o~>?C3yIPKxM%F?_p=Wue(a1YyDyqK<5NG3A0C z0M$6OolMpFeQR`3CjgPVmc9l`AweIzsJ)&_-(s2(fW%n&xTNd?H6?&RQV&i-1`uMC zpHu$)VTX>L5UKNKGf!bXk9t^{EUI zu-2f|-->Y`O<)+|qfp-`tQRHePo01M8rE}_-a$sQ#prk7U$Xph2LPTj5^9*OiA17_ zL@Jhw2YrDXZ@hWXpv`azx1E+j6Wc{`I1tlL*vx2hf<6iN@XLu=)4$WOkru@jXQ!#; zMkqp)=bVNbdP40C$Ha?>@P}$qg>`JwoMP=yzz12ymBNhIz;rsS=g&LKe_o;3XLrv& z`@Hh<@Q@*cQ3Z1IMjtJBr3{`JEBy4QKgEI(UY$T$TzTb9%BoWd&(R08^zUDdD@S8( zZATul?{(Mz?Vfuc!)WNux2DaS@yL#oCcgjSbVx{Y4u-ebV(?veKlRqz(_9I4t^JHf z7AfnO$~x9XjeOF$b@Y|08hiwjoJi1&B!KW!qWn$%DIyczH?zH?@lM0lXcHR zX>g;7VLAT2@4z~c^3-u1Zo_i}%neCIQYEHs!WipmZ?J2%}0y6{-H87L*%@JK) zlb}IWZyV_v{YXZj_R^#A6s>>Il#9ZL(S|e8#0Z|o#|J;Imy&YrD0TYiL}|083BVC) z(Sg6t5MKa0<3;d`C6hykm~$38z#XYrv3Mo>7vU!-UCv0C`KLLwd^!OnGPV zrXf#bY;s?^tI=&*aHg3K;J_>j_;5#?8v)tL>Y+=2d|#;4R77ZuZ(Z+Sf$=V3T9`kG zC5Ekv-mNmbI9y=r^o#27eIfsnRCwD+%ahT_{d(tVd7qvAIGJLUX&3d!_pwT2tAT2x zGYbWV22GfB67t^7JOgfPst<*oe!!j4j@pQUM_|dfT3PnP0 zx%n3C8Zk%kW5-VZ+r>NVc7Rf`%t^SZp|>-#t^|7$8g~w*-W*6{(4-X1e3;o zg$-n!A#;1lfwM(Cv;k-1+e7S)FiH_Bc!0;Dl?q0QMWO;Vw(VT_iWptHV%)B zaQfD5=*oOl8XSO>Gmy?nNG6UfQHr!*fo&d^;JPcsKrCWFY(eX!z0vsZ<44V8lfh_I z+6UW1|G{pxv(G+TwpF7uz;!N|OTag!M%XX_e@?AviTyYkn5HV$!ERW3z}&eFi`O5% zD)Ow#?8XP62b)oXz6|BRn=P$7&v9Xzr<$S+=Fp zS?5xyW3c9Z%PqHH5*q^o9MH$bm$;k}fw5Q&cPBUvnS=dZ_=^b=Qt8^(TNU`Do*Ux1DR4OOy&1%E@-qCn}+B>uj@7KoGNi$i?6P z{`Xmq!BLd=rUyTo?tA!e!nkpTcm~&cboOJmihn?!=nKUi+LhV+PjFa@xxy~v76Bg>A7>Uvj2Kv7--jAWY}U#%9k!q0a5YWiY5qwB+|S`};ywy>80#e9 zmOnN7J=^}{95S=rNT=$0-QbO0MK>a#CVKidLq08w8JIOmIyz7*jv$nD^0 zQmEBL1OJ(tP1AOf`of^yL}|&0N&wivM=V65xO$Mz{xoADyqP#01dEKB)&}OECctS6 zYL)Wz7iRKp>_32c{PD*n2%FCGMF0RG07*naR0pmA;E~*X%--{Hrdw}TfnP#iBx2tP z<-HPf;Hvoy6+T4yCgKq;<^OxX&{KXd9)~3q7%Gz9k$)LZNPE8JO+!_Y_=Jj}J+CW5 zXpN6hp25t)x(aJPD`6+}2jiP2%x!vb;rFmqy2eL4g?ruD$3*!8Z%&LQ2ngKMF;RDA z$4K#yfBYlXdT{6z!v)PB#to3Uc79g?T1KfnOSR5a(LK3R1j6Oj;o2Q7tFp88x5Bq{ zElB{w$L{thTqr~AHU**tS*_euD5>Vyq>8{y58e8#aQ&!$*vXi3OPzD(KdtJ$Dk~=h z(r-!o2IQlU`tjLk{dB+Y<51;7_9Xo@+n=qr8a;m87LPvmBK#o%%dYqlW`U{|`)65m zD2qR+x!cch#gORA2bFg_s>KwU(jz3(4 zUn}-gY$%gVRVa@n*B11x1Si~XkC_+>8A2tKF&GcnJ zATtL@fShcE0g6s3OVX_J>?9OnfVkpRbXrDqibj}X^LZ2VyfCd@v@s?z-y^I_Mz4_)Nhf^ouXPsE-erQF;&N>DCkZDkKyMbQRn( zfVRduQN^!Np7(3Z&lnJX%;$--3>^`&Fom%mm%s9TD4aCL_jKibO=1t5N#BQP1x1U1 zBMJjs15QLLcZ4&)T+y)Bzh1X$N6Ku`b`cM8<>)ZakWc{?oO*bx&9!Pt-**H^fha`g^tBSR%{LMsk$lAqM zC6Z0L{W>9y|bcWhG_yzyqi5ywkP-0s-rW>(4&ups9#5WXPa1 zes%csFT9J>E+P=vWOCZ54%#0q@b&FKnWk#m{)bi^VA6{)PorXI_U%6bp<4f?77%%c zI8U9BKXc~dty}G96{gQ2cKrAX8R4h*?6nE3U~&`Z!KK=AlJU54D z0C9i{r>^n62zUb(yps$~s0L1Px+r3m4FiE+tK{1QDy|CnR+!S*0P+v}KO&YYRo_80 ze$ob46HeXbCj&;ZRQ=Py2@eQz6qP&;UDZxun{4kFOb``q8%?=W0IoW~X;mEsmmp1? zIC1ji$=FKw>oMCdJN|(3@4k5b6D={?tqgPPt+(Q73|yimPM6(&OX5P_ zM4YX-&ek)4vY%NMrq?v=mPCpMg;jd}rMNW1M3Rgphju4}!C*keuQLh-#8~a|mkI^z zQ0Tfa+jKxOasBd^_ZF{za&gnaD^}ojl3P{TtqL1X(XqiUyBr6A*R1>~nQTHv>gsB6 ze&G+lKmMZ+|Ezz9ANGA@^TgwSwEzCQ0r>ROSr=Y(`|o~x{Pd3={qX&VaB=vB7u_IY zDQKJeT&(@!QNo0<^|*>mRxMR3vSZl#M_vEPv^|Ig?xJkcEM5MHg7y2mEuH6mCzU9Z|hxP?4oB!={CX_J{vq z6N47zn=c#O60|Dwd@ph4BFig4l(_QF0~;>Gs(|k_2?3hTskq&~PO$iclm@afb8&M0 zQB?NH1p#0S5kX_#KvKH|*~T%GV@$F(F8@@Z7<6Gaq58?eRp|3pg&`TSLQGsy{p8W1v+13Hs;6Qk>1yj!NB*xScY%MgrGm z;`$?fA`xd1aUyZfoH_XP#}YM;-J1kc>B@+@R3(m6-feld#t4kxuM&5u@T*EqXl#3| zG4_w`M*S6+TADX(;__x(&8g$G-;!vwO$t~W-&4dbaQfK zI54}*Ipuwn57ItLx=kELG~cJFQ0`Eb=c&v*^jik~2`bv4tkYEBc*j$sU_S78m7d<( z@}j?HtJQ1P4H$&{l5w>^Km76O7~sGkN{bhx@EbOC@cJfH{PpDPC^JIEXaJ#xo*OM- zj(-NDfy$aK=~5$>?RTR6RCrwl1*#xte_L{RIDjws-ZFGp8auCf;<3(}E#l3WZIyrC z>KK=7W`~UOd+7a_o;SK811S7PgT_GO(g%lq4Nd)@xYuQWtibII z|9ho(Wo);>{sx@*xa5*ccHI4zZ&zG=Rh}6Z|5U(!1THMl@GjcvvRy|)RasnTUw%+=D{!y z#e~y?`|Pt1W-K)E?+lPUK-%S?MQcM2+g;TkUjtu}sSx^bDD^p2tc zjz1wdv3S9v100QPN6e=q1jXO9g&8L;&9(-zlm*A6BWwq}OZh+`Dm701ZlKMv?(*%( zjgE(>TcHCOIE(E7@w>xeZ0(_f5Xt1qq!;D?;y+&7V&ZidU%}Tt()k74Mz_V{#f!g< z@3r+rkBWGH`RfOqqOl7iU;f4P$LncPs(~`=3B^+8XJSXf!YRoYUcf$*+i$;JSK;lq z-~Rpg>Ejp%mlgeVw*kS8MbVc=(3(zc1i%_3q+`zQbr zF@Gil`Rjy)j&|DI36IR11TmU!HZ_oC9uwGHpgxuC-Mv9;%*Xt&o#*hlb zHw>dWt{2_3KW<8qk4S^uOeyHl0jrM#fvC%f!ATtKv9#R|+W zl+N%*$6OiPlO=#<`wwtBp!@Z=oQ4Qgr+Dnu-Tbwr4^W|}Rpkm*b7TF$NhlN_jSt-V zgJY*PflslbU~dMbWTmnQC)jP*fGIcRZWC&MST-zh%8p20>`kiutnlOOl!eLX!U)h++9eRhA9IA9q31b7;8h|qgg&f@2dC;T4c%rn6u-8p%VmP%v zR6O%No}}DcK%CKzLShJ(*tSdj+QcgSrpU8{$I)F`~2!0NI14m!Cz?^SF z{LAKfzt6~>%GlygA3sl>ws_m4ze&c-hRRd=l+NWU|rT9AHEWx_E=|}+-Z>^ z8XJi?fByV`uzC6Amj@3Xj4LTIhGB&Z#i}ZNcCL^}!DWpU2!t*id-n0tcP_ zi|Z>cE(@Nc)I1fxLyJ^yUF?-$$Yo@JEHdhXBS!aeO)#BH3(ny{4hinGocZCqTskJ{O z9Lb0ly9RU+Q1H#h_Qv49%)7`D={8vVCr*07@LounMM(F}*}_slKGhaFViYlEst~1D zj4@rnvj{RckdZ;5@qxnx-m7NLn)%6E$G5lsu1h)nmUj-x1CQllStNsNi^%4m=nbhE zt%0%4i(%~S1YaNz!-+UH=#a77TS6dLp3%uMK==+Fj$u3Kfyhmfe_ZEDEePgKvh&Y* zS=?wIizB$*??~mFq{46cy)UT91l1f=k!{1)^L_j8fQMhf*+!IqSpZLyV@B88mfR0t z&mT;SD0&OnvwZ1m0|)l&Q(N6-{i&v#*g10<+@sQIL+LuY3IOk2?Y;Nj*oBIHi(h{E zWi-C^>L?Zt`m=6E%gfHI3C!d)M0M$F0W}JOC6lZF)q$Dy6{o7?n{?HZZCHPFR}{D~ zhS`Uanm#PACqdh zW`HKxs1iuDC)RvN3y&ZwYE z+_L(QL@}!fJFB#;!=%5W|8zx4Gp}uN&g!|Zu*IwoPupIR-_tbG0V`O510ZKvAKRBh*}^g=>_ z-FAvtFFG6yh+*E z?xg-;zDz0f3a~xR2^{L_oYCV0M4QRxp@$yALW30;efvYd&ik@5U_(mT-{Tcf7+u!Yuot-9}kP@&Y$myNhA-nIrYE6!lp{u1NGOlfXU** zxiQ_5L~BxJI8YDJZIsmh_^tAO{l|r^M|jGu40hOhwr~IK;LlluW&hh0+8@dk1itCF zpZ0>RilsVT8B0}w)LvZQRltuuCAv#;3LQ0(Dx=YVIXf1clf6CxOp7ZRDM+&-fD9jW z-oO|4c`E3`9(c^U1kt0U(-mH7AA8HtAyFj@4LD5k4U!>UBH>{Qlx*^$?;VG8Mi9}0 zVfJNLwzuZk;v`Bif=+*!CV5d@E(!`Jp%5twu)QgYAhR!p6g0Us?IeJ?Y4H#FdA?E^ zQnI$>*b3jYf_dpFPwddX{PN2eELd>$)mMWiq>GdKxXl;682oW3&m)gK0{?V6yfX5T z^QF6_E_{i{iyA@^s1!CC`QLQ&eal;xsMZfv@?E@v`t09sDt~V8!2|cnL?20|5~L*E z&>!WSrD*$-iY6!ZDfCzrf{GbDqaY^|G3TF1v>ko)FZ%SU@s;hrbS*|*qP9!=l%L5D z*%1xV)wWnGepQtH&HB}S%vK09Ttl4pN#W3lel)8nX-m>UK z14IE^10usxuAe3)v2-V1F$>HHn`Mz(xgc^tdFaHPCW5MTOD(au2V`T^xCS*&bNHc zB(6Cbw0Qk3_hadrO*e)JyudV+sYGz+<0h#8 zMfHayL#CMika)jS?Ps+$Uvi`}(vjP)p8C@q$444TM0q~*dRpnPBSTim0{vGd9co~c znVhk&)v`T$@Q2FNh^aZP-QXi{q*Hsf+VArAw9(`H8K2*de2n5pO}6xlGn&c9YQdVsta4X)(F zHNZFDd^2(_$>5>-Yp=alPSWGHe>gEjSln`o$~e=%)*nLt22)A`Bf2JHh+W9q#05d{ zdqe)XH)zeOuTl;4J@1;SEh)4s%s+MO#&czdNX4dtasM=0fF>}rPSE}s< zY%Gl=_bQdwjf&Tt_@14<_chLSkLgdqw?-*B*3pM|M0O>gYvWjEW#jpfH%Vj*1io|&aXOHpkP^Q1V-u`6S-gNo*c~DqV)D0qO-fcJd>8{gX^FOhA^;j9bYyJpBzAGtlo;Ae*o!8iSAD#5v4w=^IcN(ZH}_=okLEk@ z9|kOn4S@3{b%r<>CnHdXB`!Pxz}A5Hmtt!+G*E~ps1r-f)uzjTH63bT)64ry&~?#q zyEbgZwGH03f9k2H;Hasox#Ef|uwK4=-Hs~tTRYfy&w#S`3KoYJy9PGA{97Z-RNz<2 zI^M~R^A|qWi3lyoxp-=}HIUE0*Na;h|7U+}oN5k`t!Ak3Oy%3YId*#@*{@`NHx?qU3OGp8uCm^d zJZe!e(5?EbXIonn!@8EkL~3_CqVHo@5oop1K#%h;%_ig^0R7>XQ*0!cD=XXS;si$=s8*>q8H-Jh_!}1k1wL0vBBEB#CY?`Nv|-%KDX=kt`gzh(eha zu{C3z;$JrbjksjDWJ6~T1E&{85Bw$`Ur%DnHNs?m6ktgZ0~E*P-{%WgR&UX_|HS&u zCd2Mm7gD}HOr&N-^tRHzJ@V7sKt7Qe_Bjc+%R~M}k}sW2$||)gV%y_;s=eHri0y=G z90GJZqv(7%nZ{1uk14Upb~YkZ`DcJMYg3N=9ZV{t9_L@0O{6P;&X@K_kT#S&s|s_H zwZv1_?L!SH@$s3AFAuY4Ja}=%ZWhb^3sLu2!)Pdg1jOc)vemAmbb&37#biJ>znjxn>T7T_#aUqY+)hXdBo*bf7J;UqDe2cgU z;L;UGH%G*FukcT43uOY3h_swyx351gMG`th?>o)Eo<8sCCyJW0D@va_53-o$TU7p4 z{x4XnkgKy!VY_?a4=I*oa<(hl?6{Kv$7m_21wljLEP?oOhpQX0hurbRAU-z%a!cu4 z8C3&PR0goQ-R6f=qd@}sul3vIf+j#TsBm(*zI5iWUB+x3 z?gjl1`M*}a>uq*Y=QqcC_v0ov-<@=&4weWZ|JzP6^<@1GIkN~VgXxM+o0V~FrDWs5 zwa{JEA8rGg$R^(YIPI-4?6k3)R{L4&@2v&dNcL#!G$-#R^XHV#+u0L zU3c9zefspu%2HP=CQqJ>OA!_|DS%8vYuJa$k1 zT&A`Ni~JE`a=O9*>wmU7WHp~~0$$Wa*@D_%YjqLIrFx6nE4pKwOojgwVw;#jg2Enw zMGPjra9f~#?kU=vH|Wz4p#!78umx~dWumFA@+0cnt^vW(P7UPyBS=h?-hgI<4_p$K z(~4<8M2Q|30BqL}d{Pii6>wa(DX!xrfDt4WAj1d|1ZCqII68_(u<@Az;RitkaJn|& za1N*FoB$N+L=-xvt&;$t+17y22g4M~2616*emc#66+ZsNq_=ZQfD{z4cncsw;{WWk z&*FH(O*h>Hrz}w+^vpBQ96fq;LqkKcxWK`Q23&#A*w}=bgNrY|7*8LSm5=gPeCDlI z_^IX_YpjpH6Y>w04=8%@FMeBDsJ~r0x{L&nvO`G$u*=I)15$}R{qanfB4|uZH03Xz zvL>kI4*)p+z*Z`8ci|I>U@TnEsT9!vva(Q3Ev`-qV;UJYdTvTZ*w#RY{Hsh|=rU(y z({Fj?Mq~?*MB_ZmZoBPv-+lMpfB*f${PovgkLxjTGxTe(z4o)8{S2H7{{SepLb?Y} zZA=^?C^irzNCWx)tKw7bD4y5x3G%m1E)d$MRthJncupwOYwk zt!7&T2t8sos{jBX07*naR1gjsCu=bR!uArcYQL=jc0qI~e`4%A*8cQ{{Eaq*1%iU> zX8TEBdd`Auau?!r!}9T|LGr0H=?UT{?D36iiGMd~?h@zj8cW5R;qM&rwTfM$8;5;E0N z$Ib!36|+RaRA1R9haH80TpV#S23ZtEkU@uGo1pM7K4Lq_Holnz(I7)CaFYQTk%S|H znSxEUSIYINv&WR5jm$I-13y9HmLml zxa_v?)@xRuuF_x9zD4XyKwdDfkhll_{6?Z?*kQX1{ChuBDY{7_k=nuId4?!DT`6G5 zR-AyvVC}Cl@q!93RM9wc_1(-^KgXD_5?>91^Awpbxk&>#u+P zE7qr6nj>ku^v7X7M-JK(fJ-J4-9#YRS!GcEH%X~<{(89nqV3uqskJ4CR|GL)$T4O) zngL+AHI5mMTJ~H~=38cjI*e`t`tMZ6tp3=o+;^n@c7=Zo5%}2G`s7v>fe)ozis>gp zweFcXX1T+^QEx<0AA3}SuG;b= z{B?AUD(oZs`bZw#C2+O!j>eJwK6N;{gDW+2g^0-FVFH?>3&@Sy+w#Xapsw%8*673W z*d57a6wW}PJX9^?17^kGhd9+4aj~tP20lRWU+()Xf+dS8yd$%Vh!^t5bp6PYBR~H5 zV~ok1Dnld^$(mKs$7rKIP8Nip38`Zfv0L*P17blww5MjmQD0Yx<~AR2qGI+wn!Ht| z&m@%e#s7Ti@3=Kf_+PVTO?i1a?%TfRnrkpV0RN4RjdCRh)I&%Lrc0d)q~^3IrcNT3 zDHAi65Tv(}?DM_JeweZ{rQz_8SOB}LKlr>!Qw!Oc+@d`2iOGq;I)g6$*Ccngkv;Dd zBb}E&qW1v*S&m&CXlE9~5Tk^$ZGePYFkU_lCu(=)pQWr5b}^L2FqkuN43JQ z+0%TczPZY=pdPw#V%ejuA22tX)sA@M@IKa;Yo*d;b_9PsJm^6GO}cM)1q_pK9M7h6)*aSH+_zL}zM5>H~mQr5HA27GIYATuDs zE7skbIA)?IeleV4_@;j`*raKuB@z?67>-HP#4-I%n#FL6;hX-&V4z!V=l z%k0#aNk@CS@bhtS*=Z+@7B?g8&aEhKt zJ0Ln{>XqqlGAEc~!(Rg?j)qsn_po8ld)O6QjQ<|cAJ2R{q4e1Nd})3FxcFDe-R;m4 zE=2D|{+S80OwF`R{!Q4#H~ovjCQUPL56GXBG-;Y?730Umci~j|<~2!w%m?zN)Qah6 zF@JYiJ4ah9>1l=nwa(-xpMSmsZK+ZN@$d?E*aWSGM8p|7yZF~mlLwPejo<=u4m~2W z#K}cMn)IX8*;dNlYu%O_1$-cjof|91rO`AX!J1tSM6>rQex8>u@t}X2B@O5x4d@^Z zNDwj2^AiBfAJE{0UE&Y8LYc`DO*>x<2$5WzO_G1-8fKNU2gtfOG$8pZX1mbfL_xy{ z02`*=Bl{P|<9Gs$f%f6^AwoUHyFa>x(n&3*Z&heIA@qKR>X1`XP4uf1?g^t|)V zyX2BfPCM;13BnG9Wi5BgJP@YQgVtFg{{kkMt+t}2T34AUiQ4r8L0Kde)$P#E)osMK z`3KOa>|)%)${Y?3_Pq<&WZ?|U{`*XwWl&pRn8tB;C{Wxf#fw8BxKpf@;#%C@Q>3^R zDDG~>-GaNjYjJl?via}K&g}Q(PLi9s=bZPE-(@ukQNUdRb?4ozQgz1-#-OMgZsfRZ zMGQ*65ngKU#&&$DdmUJPgc=Qb-+zIT@L_5+C&AUG+1Tacr!myc4fd_!OsFHp?TM@uj2OIQN&xY^@zRPx_OUvJC}k zk;r@8trQIEpBt5m9x0nCzG#WVo3G-$?8%Kpny#T&<0Z(yu3Dr~pVLa0Er`+T`) zrg&;nRe7di+<|bTZCHM0zS=2XmfEE-@0Ss}Ik}zjKqv19cZJMmB21PN$%T3_j*kyoEp_jr~{`$mu%V`&D_7m#|X_n$2@6Nvi zqv7>tda0*_FWkwv|70XGhle8CSu~5UY?b+O8d%a(mr0?&6{+*)omS_~PNh9yIsB}R|BVA0ET znQ6XfS9)9@gB=k03%!c|7k;SdlQxFYUp;!W(*(Ux#D_qsEY%tAZDQweOH)70O)<{a5 zx8EkHcBB(ktQA-aHinMBeW-8MTFQlgH#z=_ag;2b{T8+s+ zFG(e~*L-88GbB6t5Wv+MK|yjuW^==H!C=$j*B7r(6aLq*KMOOx7IsRe$qq6eKhiRB(cVIq_m@*{W|;5!d!?|AZEG; zj1wzS`Y9bQmZvwBNc5w@^3V53c$SP;D9SZ|g_o>raJ5D){OSP{ib?3fV?%mEpJ36d%>g0U~;Aao*cQgEEM{f8sL{xc2@@(%B)> ziP!&yXEHe)cwhRPC#-mn4#8^>pV)%EXudzkLee55pv zlyzbvFk2Cf$9ieD_J%F6?gV46_}#y=a2q~y>3`fB{iAZ1pX>cO?@V}q&1Qd;@awbY z=qr6hLL(w``H{qEvjKl($PT^<#Y#2BmwqVyKButV2})FY;ofz_^Jf*ma@v|#D!GoQ z-KbQVpSfxrf=sy`zENm@4qF3$GJzp^6MTR)gpL5-l48UUt=b|5w4i z7TSyMR%9`9y=vt*7P-xvm9GRHC|jAfqC}v~v8o}*m_%~VDBLG)GQRpmX3WOTK$JV> zUk0a(bk4Ajb2@Xz1Mh`M#%rB`7|c|S>dRz>rSvD-+xVsM-)_n~uHLkF%OPg-5t%KL zA*fiA6#NC2|IW~i;f?D7U1#=GnaOj-s%6gZyvLX~oOl#sSEpEe~=c<`2OI*dfHCT`kY;&-W!6ZsRKvI zR%F1qVIL)ToOHO5g!lK~+1D<5Rbv0x@CP?{u>NuXZS%_5DQlmVjP{vH+mvCqS(dK( z@zUsrj^LSM0sJxGmeqqr!D0af37NhW- zol57!WDeNr&->BgFh>fO;F4_duM}dh7}YCSj#wCYspv>8DA;RMDLZGK=T%6TC*fvt zxNT;XBWfVqTi5bhPW|{!B$7 z-x7`M;@tXb$xvriX}rb+_x&#TC!K8gDTDscvEzLBmE1CXboA|p&ku!}+qQH$CcsOwa9C zqzajd(Ob!3XdDKVtszkQeFo)Qo|t>zsxEb;tiupHmRBy|j={1jK({+U~P89}G(61{QkON-yp#z52(pWG0|BRPJbwtL>~)8-$CW1y`qW&j_b z`v;i0lyQ;x-H9k2R4iM2QI`4x|6zz0iYqjdLq7~&&s!PlkuD@Z9$lIhbM0@Bu?e)+ z=qv}&UiN-_El4D;QPGTt4u;fco_XUA(>+uD1~Hl57z^l;w}Y*XpucuhLV!8Up>hXL z4-Q6bLJi~TIrOT1w7RI|sQ#R7NBJ;_ADLWyw)eq%{g07ay)aStQ!;7RAY-KA{EpRK33*Jz_4cq#TOYB-OSh zcc<&W*a0L;aW6y7aXO+fBptaKxB+?9hP@g46y#atI;vQrN{es~;UQ77R*czN&046u zAPu1}(bXjC85BG?kq=FMMbZPrhRjnFzZD3*86lzLR5)I<8lO1Px|S zZqgGLWZXE~8WbRuw2`F7!+k5$pq8bJ`=)*PLE2#!S%20lJjNKCNPNN2+ET+%>WZ1hw?F)KJ?8{FJf9A1bsfnA(UtP5)Zej z)B9{#ATc%8pvzAvyT$kQy!jGlp9lT+cC)^BrArupcrC}kGbP8Y@LE6IAj)C7;jEnO45CK7ACmjoGV)vg^CASpAs z8s3v*2sa@pa)2lYOw;tD>mfSzS~c;}K$PF-`YO@Sp|-Dt2dNrL$6)bj{uIDrW`i74 ziuONy20{y`+P{2Sp4Tujnu+5kCr?v{9pJ%`8xJF*{&{XH>B-37zl=q8phnLkZF2cP zoxY1z>bJfGpW^G0ZGFv_DF07+Rzk86XrwCY+At~-li<;MCpdDbgGr!!&Ig0Yng64X zkv&d731V`>H%OfsV@jqdGZ(3{!MbH_V;nV7luP-Yl%#2>;}5H^feX33-3~d_oz#)} zv``IZD|V*Q%!>#cnb#2B937Fz6(_Pxeg2)qm5Vb;;pL&wy~VRku`?8PJ3B zX$Y`rP}K5A6G#|1FfrNAI5I3eZq`M3pw%aCIlc~_+FNZV7M30rIyPUjUcMa7X)U-{ zR8$%<+{=|H`11;wT#mtHO_fazX@B9u+1Gt(!XUR?0;042pT_+4h;-l)wY(Q ztz*)V7}Y^6;3sUL=-Ua&NMw=^zN79@o#(Vp z*2CoV@`^Nl04xD|3Ht@6zxqx9uX-3^WO}&`Wc27sB8m?ez0_-Od@XYc=UBaD4ILGK3af6uQbcXyG!Ov4L34omvN6 zSiB?6kG$rbgKF$)DnJu;frC-dm^4e&pfI@sAbG)B$6>ZFlS+EXV;pR_?fKcc8<#_W z<=#Rrgq-8+A^5Q`*kT&5f^eQsXlaVfkMV}~2lh0=O3302zT~T5fxSdW%@S9~o;3MX*?$cW= zRiUJjJ(b@QA;xvX4nO0ecoLc+px-10!;15$v&1J9au9kV_q1Hh_PvOaCk|>9)YK0m z56fn?W*o>iUWLc^o1A}-U&F|R^!eVJM-5HE`Np?ckqJ0)twA(+_=+m=!K;qEuTRWN z)I0#7%gvh~`1&Jx2kS3V(~J-)T+yS#L@^{CVDBmQPz7|j3gBaZ>%ee0tpq>}&Fm*jDN#{xBA-TB&c?+1oA2aSr z7Yd;0wt?y6=Whr<_xCY>&<`^%|w^yvQc>v7xKB9I?1Qz=wP?MMg? z8aAINmjwEx^Kpqy7(d-ei!9|_?*dstSJhVr`mPTH3EA1%iK=4HFlFTJp&1n89z`bR zC*H?zvm|rU1lo*e$ckeQiw#z&{Y4b6Mhx<#rYGC-#Z1$BvaO2UWS1jTn#QE?mO_fa zK3!4&tm4gy^b$&({!RLV>ly%*f@pD>w1XTlG&z*+U){{01nX*dS2#r*iSv1$gow=4cS|LwQ zr{7B!sYL->K6R}OwS_xpo7uL^jmNOk{7v5tm$Ci(`!@E|P_^JtyuVOPkJX2|oVS~7 z-;0t{Nw~SlvNYs-YMiteC9vE3@LosYDHpO<$#BmVYaqR(bxj1xq`xjS1zPahPqVuzFXc9*=`9sMFVSO>d(Bth_N zcugwGqP^!Y-DUu?R&pT zB26^bap!q;Ig_~>SVOByOvhob=E5V#w`H@nbr$9NzuS-njaT#PF62D$WyX<0nKCzo zODe?8`;Ojijwj^8|L2l`ai^0ME`D2>M_OeNb^396WD<@^`2@v#KN1{vTeMff^p38X zeklbrgu-r8++c@T3MN30KmqDsrd{aOFdjC&V$1={bofE%FZd%pl!v#DscU8)*zC^$u}`X|ujo;ts) za8JU!)X6(92m)P_UHeEX&6!8zlBq0D)Qk*m^<(mtM86amy-eEz5^*Lj3qFFc=;Jun zy#XCWHFw_8aHZL&M5g*sPs5hJa;*y3KZ8Wsox|Wok|V5EK@wb21z$EpQ5uwe^LF^K zHvhS^`4K~_UDZui+A+e}+Hu1^W(70-G-vm=U$tr~;Gv!u?P&-A3A~guOGnakft|Ah zp864C-Dg0^ZAq2~+1^|P-wL8+cPC%DC)=8%>v@#_i*T-Ic-40-gIVAN&tfy#q?#Uh zZg(BYN~z@ocudUaxqWR0uTlVB;67=EQ!C{Idal(e6o(I{FN{`BQC7 z`~WMK8;rc%@K`(lk7zV;k#CbO=A0zF4>Zb3(@}clXwXFJE*v>08JJ%#b4cCNetuZf zXl@``TRUxkcIfM4PgAa5)Gi9X=s6y}19Q3@jYY&r9FcN#InmQ)XHw?L=C9hMmX}{$kU(Ri)qN_ZF*tqaMBYtOUv~*r|-|y2PkfuX&9Vs(yz0EODQ{UcTE4)+)bf zNSnxUoTbLlAjNL@lD;NpJCs)MA+`F+8s`Al4NC=1g)~sH%}@-2bC1gTt9X3sRKs<< zYGorBSJ3VBd&Vkx1i<2;dBtMW(V_KZH;UtFET{VQ6$~<}fg5{-Tf7I=)>^MNy!YC` zhwAFy(Ge8Rl}u!cb#}I*uQ41UDl0Z7wdTrS<02=8@&Q^Q1>cl&YQ^t!@=Q*vIZV0`hoj1Qqs2z=(67dDbXX zK3+jG?EbB+f=eAROj{hWxEZMb9+I*F-7Z2o|0%XvSRK88G-8?{g{o5~_vz(_@dk3* zPe&H8st=e&1j1B^?kv|Rhra-vyPh);4-+kd0(LNSS`RNWVui|g%0w1)jJ|aqxJrgm zdMvXyuh%UZ`tAf5<-D#RMi0>RKp2;~DQ^vzug?xL90xs0y*Mj*nlGcz-yNVXw1K$4 zFDje|m%-6s<+eaAf{E;M3voq}%1+el&zsf;-`xax5ZNDfpST(Ls~F+=4Uj)W*7*%q z)?&`0ZdW%cwKWJVy;@APa4&?_KJyk>b9Qi|Mw*&kG#*7a;D!z{dShCBX=#{`!Z)en zg+p4b!-wW&@+wBFfG87}IDaTSOJ4)6tc<~J?=aSGufIhQ>AnrmWjzsSMWJU)Xt_Q| z588fu**6yEp$0~ZyHF0x$!YQ{f66&gRedbqJd;Z}JVc$eDr+xx*KiV%o*2q<-#=A~ z72K_lqV@|<4|Wzm9pX%N1OttpcjBt_o6ZIl?Cnzw-$0nec8{^1RFR)3=87AqG9${o zMn}>s7OVWt`cT^5GrwAkaF+dAyPQ@70=H1WcMQt}1u_elnfa_7JaTM2$a zCt?`bDR60!>p74(#(M2`QUuqiokU{%{-sxbkRg zQ(R%4=DDhr z{`2G6))qKB?(_4>L;3y$d^j;^lIh>*?A zfR2vDF%!2>I+wCr>&u&OyaRHJs4T4XSr^cB2xrCby@pbeoWcL|0yM2Uj@!0=!tzB2 z)>bCWxcK{A>mV7>yERUONIw)+tbT8%TZaW{^76J(V?r4y=egoP;Y(m+?O4Xt=4Owj zUcM@&jMOd152)Qhu(mYUdvCijRDA)}0QCC4L^+HlFI z(QpeVM(hHOwtNdTmtbFHwq@@SA(qaTj{Vtgw$|+Z55Z_+fuP|cis&u4~GdGL^9il(Xvs$((S+(zSdf>PCr^N{_)c(%-^&Q1eTj7o!c z45*J!8%>Pc`Rc;yV&}}#k`&YEEkFZmd!IR%`Jf}xa4J+nDc;Oqm9^^BK!$!uAI8zI zU8b!04U?FyJCx^pPIyeWHKkzN3@WuBUQRd?G?KMy`<2yOeu}BvEZ`@ixbu4|>Y zb5G%eVPm#CC;M|BvENr6c!&+B>UN-mA{2XjV=L4`r;N`fUrDynNa%PMII2v+5&ZzW z)|Vvuurfdwl`luwZ? zz?>{jZZzdf_+Ump(O|hlvYeib2%lp9dU^MaNbTfd#r^9gUpADs2XwUSFvoV~@LoFe zYgz&qj4JG%K4qiA>5rxQ26!(+Iw{7bQ&@fVo9T}31P!SDW z?pOK|?n0makV!hmDSL?2M?1-$Wh5NZEQu7_bA$-C9R)RV_J)ip4fRw-(Y-ln*QVI3 z?Wtwy`j!Phu$ALhSSDM88d#1}OdI_T+~b;QJ?9xdF-09$mSsJ6nAeaCnftr&^;I6c z<-Q~%N9oQ$QCuEAiK9iC6IJ*U-I>g-RkQhadVVf}DHD07i-rHkqe0Kf(`Xp=quoN|`q6cH! zzYv`=--IjE7>~D+E_N;&YE7ucL^=ofq9f#NFYFM{WXF^df_mF%5l?VsRqi!qSPqAcd55wpGs{ zePc^6pcf(Ex{p|g2#rB%UGNx&N%`I^c1zQl8!RZIxsm@NK7OOg4bi~+ZYIw{IK2Cl zsOX<}KQMfcdR`Ml5>Xigp$pksu#5Yn3Z>~*?@$Aot*qqgdBg#*_J{KeZ8MIH;FtUs zS~8jsOcWkW;kfvC3>ABbGE8E^+p?K-sw_GtdU{{p?$dNnRP7Ds?%wP1EgAgv@z6AQ zU&wwhV7C6V@XXy_1l6pl*=S#uDDj+Ib8zUp1} zw|__T<%P5nn~6JeG(WIBE!d{EMeJ}bO*g1%D$3eJ<`xQxR*hpd@YG~j0<0#igw@No z5Q^h|7gTi}2ry@Q9l&C(?vvm9r4hu~7gtv?Cc9oQUYkK+Y+SYmf#MmH7=%IW?(P^) zza303BNCC7K-d5h@^HLm_l>+^@!`c6eM(p&RTFCxKlzAF+zMVXa3<~M6f|m_f#Hh9 zi4lHPIGl5_z9t3PRYr-LM9_1xu-nBIXj%Cr(bWTww~F2J1C5f{b>~COBDE`1$QBz| zu0mqs?e2Ok;F=KZXLr&dQnrqm4j!s+1@(Keldi2y{)D96r=34 z{EMm}B()C*fYuM2)(0HukofI&K>f~YL85P0Io#=h+i}OBI97Q+qeY;>%!CBc-M*w^ z%Kc|O*|)5h9Q9zH^hvD~0M=Fc4)%!OB_@OdrX1X3U9-l^w!$ArHfix(?GO6H--=_FF^?TO82 zHO`=7&SoPxG!NMTw2tayM%La(d0|JJ zVW{2>+M--7xk*9O8DadH1p2$fFdFO?JoCoyZ%)vlCmqYImZddZv18E1@;QzBVVyPbJzXf@E@af6=#1#@HJJ1T(~jiGrL@P!{-G+#;q8##780N zJX4SNIn^j#F?k6#RKXZw`m6oaD*DY6kEi)$0Yb91yHc^#J)2PRl+(tah zr=eIn+WBj81VFN&pMc@>qdzu_Y`|Hy>{Lst#Z#n`7c`PjiT` zU4W1|(y$hkg?|}`$A3^xD7LUlIH^)_C+@^@IP}L}IvH9F=f(bR+#YpjK;}|GjzX%oDfQL-%}3BBe^hvrlj#9gB5j(S0wskvh6E z*=ujO>3>_b)ipmc^U2N`8J zGsK-pl(~mkEmIA;6_LA;U_!-Uc{cb@dKjy~Y}td~7<_PWa50g##o4N3G0N2OH7&&?2f4B~_{-n6H_O$(~O8F-c(uK*{ z@zyf{{9gAjZE#S*hh4H+cdIkpL+pE-8_UD}3v4MLc@)9(U)c~r0Tj$zzbyRd#Gv)~ zN!`(w8RwJj(hkJNy4&)d@@N117us=uBygD*+e6=;*Lm4~xeA-Jy!|IE)r9O$OW_V2 zmekS(0vh|i3{reF##7!(wf5^qvP7?1OH6An6lPcA@!`DYE4L7vboFX!758UJi;;R+ ziW5ps{ir)l*(aPG{~K4D208UYZ@$!2D~;D`N{9afkd{=}zwowxM;JOa6Y=>Qk?!fNwK^{?Ao!cLTmoP zZC(5APC`_yo4XE03I8hPi)8~iC9j~#kw1R`PvU;xqZAiVApv%@^x!S_B;rQG@z2pSVOt0<0kzS=zg2TqG=f5?Jc)N_s18mFJz3Pq80K&-n3#N zwyBfrFLEVQwGbRuzJ9HkHUW1UkaZ(OK0f2}E9p10?xx7>UL4~fbGFw>Q~TRaXwKsL zTbux=!OIJ*Ap5obq775^9d*EyiE`l86OBvk_t|hgA~=N}XaSY`dRcZr@|09#FL80)IQP_|)5bdg_!?T8 zAGPi6{~l>MnQR}yYTzY}T;Wjt^S$8xiv!?0oi87B0MtrQcYz-ctR_>ztucr@Hd9x< zO}{~>Vhs9{zbSnL7TCeop}k+M2nPYXKrdoFaWF1NC?t^-dT|j$F0$ld_r2-__uF5< zU^R=f!{0TpnYN+3e~Z(@v8SkU>hw9^6hC_m9oqS9RoZNk8Pt|G6L*%DxmQ_R_nc#S z?1O*NkOe7NhKM{O5u^!Odjgk4$=%ccdU9eIh-X;209^ z$Y%|T50d4*{_n_pRqZXtV~AM@8CW$rOzEZ_DMB@DT#^(e4%FIO)amb0u_A_S?aJfOy=qjb99;xO z^rtMRaxGQ}g9Px3-CDfy_>+hqDL5JX;rYV*lPtLQs5!(>A`GkG0U-}lT&gLdhkW@< ziMv)6zTs$JgwB-JW|*#W{6GFOZcbaqdXtmU1qBp&2VW<=kw>Sl+q9v*bM(Jdokz=V zy?x4+ThL!vbYnU&)dElrjs2CGs2H0&=zslw;gKpI_tNHm+U0R!y=LFcZj7y&Q!GQ! ze)fW|OuM}qsm)arv;4PtGjdVF=MH-btFks6e$4Yf5!k#niHqR#U$WOas|zTx9&F? zwQN^+(j$n5LTlpbNmH;w5BgdoBx`heXMOHfi`Oo6TdZ)cB=GH8^;HbHi@C0i#D5_1 zh4OfOF3~o}zS3VI#tzL;{7^;m9`guV@kzvf*=fDOdTnv>xS4!#6zca+_tRKV^;z^$ z3YnUC){ZgGl*HYuwW9m{($SAqj-ln(%iTXB7Lu=9fax+L)oqNy670!oGn*^h^5@6U z$E49WJKc?(+9irfPje(ym&5)8EB9aj)`$r!XMcCw1Y>f(jRZ$QJIqJs?y-5SfA<5Z zZGkX01q^O(WQwr^3$(QFgp%(*Zo%+eBzo~Cwx38p3GA8&KOcIJ?5ATM2E)r!@DzFI zFegK-k~U9OaFB)17eaR|0mL}sc*Snqx8ixcfkq$Nht5KXu*`d5)r`MeD3#3eZk22g3}=~KyMbg>F)kGt||0+eAR25JMDO`r#HJ_xEmT|=X(MYbt=o$e zJtRO=2rbP)K2&o%4?QiJYlAS77n{k1uV_j>RLUrL8UMw|Dyl*K<2~uGRZ}m9qmaV` z-cG0(q%B>!|0S48K|uJ{$z<+jYkk%Vi2taeMRHb6(Ij^(@LFTj+3>UPeaFvDS9@Dl z0X-(tJl||}8xWt5jzAY#v`}#9`c>x3>Jq-5z1NXw;PW_GS`Am~xHty5o#(+y`z|5Hgu8I&baZ*4b9mWK=!iAF>4HA_5AF!k`b_~%~4PxWxD_Ssi$*aUKL z(tRVVy7VP+9A(PqcRx8f2aIp7WHFf;!cH@SeS=!z&;3i>S0X|419k@?@F@L6C#2t0 zb~cU1wj5znS{s?nekW#XGFDp)oL7Ets@w9Lyra}J=0TxKz=F^&9GwXJ-_l1h^e%Pk z{#fH*9*v0oC5e$a=~$vH%CiNRk9jDRS$Kq*WP%)Wr4nWvXFkx|d*B#Zjk2xDK{|bdxqsX~ zkf9gu%9Yt_?bH-9E`6>n)fRe5y#v}UsB%1n$KM50kMi{82k0{T8#K<>c_?%t!V&JT zLB$qa@1;k%nGYn{QtU+=2`CGi zC=%iC_pRwNn9LYmuK@N zuGRddSAAkD>Pt zG=O)DP&z-=dU};K;dct%89Rvhywi-SbSU*-cmxpULzOeu$vV&+xil#I7AW>!m%6)U z!CgK#bP=e&K2;f?b%2dXe0c7-)u?8#GSh-rttbEW0KmcnIafl8yVA3}Qb=eaERCFS;wp?^LR4Uxa(uYwcUYA15o0LfG`z?V@|xrr zEtSOrCFcjG2||sMgV4?R`xe{;T(-JA>0ES0tif^(rf6s2$Ll5c+!}`@BVeu~ zMMew6jDpL3wGtjo$H8w=OyZnD#(aDYpHBHDZI!9fsG;m28RfJdea?TbY=pl^E9CFY zhw-r3Iym_N?{gAg{tmOD9?B`Tmxh)`3R5>gL7n+>UF_R zW=~+wz)CDd2`$2LLJ6v8)bpLIe46I0%8Ezo#6WS{EVldmGbaKHe7z)@_sHoQlR-5* zi0%h**k*GqKNts#<#z2!%TT?<@X5OfvNXP}Qex{B_K!dcd7>nWx>5`kYE0#Q;W(d;>u4exs7qrOUOun5CK zzu>J`;8xpna@eG(TxXMp|5@q=>|82tha?nlkc%qt{=UkS;%O7y?EPX5zIc!GNrJaz z)*+I8aE(hNuHi>ty(Augv`R_RAJPn}h-Q;Qs%@5xT|GwOBDOV|UzwlWPbYCs{}C(1 zbV7ZwV$z!W>Fez|1lIYUVi()wxO^FDTO{@nzlw_b2M4cUSl}PI^_@!eAaE{}oZk)3 zCnGxSs6@j;r1xbd*}5;IUuaL%@$$;HSL@mF2J;&g3NlyQ7ekFsm=<^y$Ycs*G(Hg> zVX*>{s_PZPwBm|bIcpfXG@2i`q;t1@MxNwXhjQrD@DgnnfPd$)lnWmuebxs7iDgRO z{1RJTy=Bq0(8EmE)en>N!D_qzPs+a9^ z^4E%paAA`5H$-=fy%)`j`?Wpk!x{ygaN8OJ@#+P~~GN1wVD7O2bu z#9J0DdKXNwCSkfKqXk7?@QT%VIUjo3;fnhC%D$oWi#OY{@bzn$fY<~bTw#3TR3WbL zQSPPRp@`SUF3g1B_d{ka44{xTOGswnBWxcQq*5nrd-2jnql)zXVtQHO+$ns{Cz_vr zEaCy6Uy$2rHqgrv9NgRSrC@z|A;^2HVYa(wS~L6_lHmj!Qcb-ChXyK{RZU7)LL1*# z8mBI70kwcnb_g4uW~Xnft3Go@sjm6_!c5mglWwpLhXEAUWJuPLF7$SC!l$R2^|jf< zYV!(hb2+oJxB_#MQuuAUntt;-z>IFt=wU6R7Fzm+eS$~VG>2k21PolIi#Sugqbhjm z?xK+^&7)sDP6?@Hzxh*sdK0t|f5e7!x$(^EKJ{NMu{zjOsdIS)7AVmr$y*!PjCssR}B=K8= zt*x!I=J{J2i;!d7T=evSKu&(O*%Zh81zbG=?YMb{ zv*++;c#o+i-g~BnW_`ZQ&!2IyUj#F1EV-9C;BTMKgL|IG%%7e zre26gk>@2bsDo5WzJBnR->XNJ6p!z@~1ns1@<~E8J;&qwmR*(XaOkgi^n}1tkS9%S8wOwYe@l}@YP}-KmV^aF8 zICcXZLdFbuE4b{qGMxzWuNBt4FZ*TV1q!vFuZo(dhP*_*zt3CSTL3=2qv(PbiZf^t z8YGbBM4qbR`DFxXGEeNqJ;Rn-m9#c3gL8JpjRf+vm9#b0n2s$!?m~sjn)#RDjvLZn z-d|rT0-wJEcS$UTJ_938dyj>NLYsTM{JYG#3%MA&G4W)MU6w3Eav}_;v%bxEm zi+OBquFx2Ky6+AFz*S2C@BzWD>+`y3rwOjj?pxw0o<#fnU@&!|x2Q9)6w3!mIH!K^ zUf~#Qx{g!ETx~EmO3}Ivo*I%KRFO^p_y@N6C7y$g%wcwM*@sP{sj2e9qPJHl3`S9d{G_r&>ohrHFTW*TKw-c- zG27AK>{Htr!`a@Z!nV3@L@WM#s+ToG6d)pV`V|%)9uEu*Vg_Qfi#Sl|T8=tbi=D)D zQCjl)7jx9}Z>Iu8E?VftXlmc~*|00F^+S@v@bi5AxEL_0nXRbJhs^5IBcwvLObhMS zfeF7Br+oqg+P`!Q;`pGE^vlYVCqGgz$)NUxe8_{jhv@nD$|2h>J+vEPsbtw|^}$UC zr=Y5iaDoLBUn6c8uzL#d%xp*umNNL;i0SKs1dT5*d+k?0NrD=P707!2>4I`Q=baQw z*?ianCa(icVf9sGygrEX^9m;+!K3A@dK25xZ3CxC{?zzwR0kN_go-jan*MyDx`-M~ z-IY9I6RF&mgVE>ly`Y!2yyF;Vmiq#=%eBROXd|HAHdV_PMp^lzZRiboKBRVE|NC*d z{f*nku5JV#cg`={Jf;5MyQ0c8G!E0Cr!#&+d)xzHHWaS|jo{qhtjLG(P! zB{9HppCgk>qca(_Y_}UHgz{@4fx?5%(GwK|97f38B zP8@=_mcYu_&huI_xkG3vu!-~bpBV?HDvsdZFd9mJP->{It7_Qp ztzoro7a1H~L+H_(T2`LKAo}*HH3R*FDfiRFmLrGwj*&7EDKAC1_yLjpEbmH+s4@)5 z0aY=A9A4HW8b4m4F#O+SW~*q#=}?_$dl}p2#f4$B`RtqhR#EybB})gL)W7TzMrN~P zP;~G_RZPxVXD4+$?5%Hgdz|;nZw=Q)fCP^orS`o=XmPOum^|SdVW?$PAiR9Xp8_b& zAGz=uAh#NFZ@&!TwUON$Vk|mAjykmDVEngD2$c|LwB+a5zn567FDx<81Zwa$K{&S+}J4mHrnGAwye4)8%TKYcaRY_#hsp5$8 zv-IZ)?uzP)GRpnWg|t;+GUD;Hb>liPL2p7(9`N=_2QA^xfQsq=c>xZS2)N{RD3H37 z5(G>1`;p!`6NkJp-^*hu(v&ZVoc$f!qSrrItA0@DGtOu!1kVdAA*6(!z zULyR%4}=voYMHmVsMK6KB;pWsC-MGgyq>^$ybP1K>x-!*mfNq;k#eXT-y4BUu!b_l zHe5`D#b$?hUG$Mc;Sj$8bFz}H}K zR&a2uK2E$s`30q>Zp!>3GIbc1$ur0~YxQwPNVad$>ZlQ#xvWf1x|bjChNOUA;-mx&^un6S?$le^XX)o= zrdjTle0c3*Lcbi>7s~y2;UqDoHY~l;OvGT(?>j9{JN%WA$*d>W64(z=wg94YMzo(_ zakoAcag%AVea+N`QrrA1?w*`JyFWELoe226^yDU(zS&ssiY+^b(%n?}CFzJ3yIwLS ztq19kQ*wkF-7{w&!JBHr@Lr7O@GQW%EF678fb9~fL4!zz9Ao;fP#>7kfAhq3qdQ8& zf;^%_4UARLVB_PYuE@Bmd7&L{pOI5+CtJuwZ~ zbz@oJEfz!Wl!^SG|#J}36O`0!2 zYGHd0>qAEI364fuE28L<2}wh`vY`3MS^^VB*h*g3@D~0pB~hUhVYcQsvm0T09J#u@ zu4yP2HDuy65MVJ8fR~H+6GTw3V&41eNT+EE#y8 zbNmz(2RgU;hl;~54M_>L=e`chu_CbytJC)LiF6N}Aa&sy-$TBkzwRF&I>} zg)S#p>lk@M86vHrl>2JnwUoHu^A}I%NzS-X*vTYaj)YQ${I~f^NAge8lwsIe4b>x} zhnuhH$uUId9bsYOh6SC2lFN6Bkhepy9Fm6VhrLiQ4PvAyF4_W0*n^%LNErBrJCH;= z+VTwB7fbOd&)8#uxt7*Q8em^7g9 zt^^NB#V0(MPChW4x}PCB3Hj3uY6NPiJ3;E%s(F!nSy-j!M}N4mI;>=}@B=!Ol2@AR zX>lFA`1~aFz8WSCTq}qiP9mZ^#{glK`cg6QWGPj7;a1w3FBwF z5}Kf3tgu!DCfhi?%s(3GX^@^#CTz&Zl zKP_f1R+#XQFVz2SND928OIcmyj1&C4+S*ViEt=sDcC@p*xK#Fmr_8AzF)uz@ovUkHJ%Rx# zZQA#QPAsg(W_rLHtN#!a1_lP5oekq+rTfnZve|LkP?hao($KC`5Nu~7as0g>cG9hI zw4yp{m5H%aOZ!!BQBG!9h0>Le0uu5bRkl-O{rn5KHwoqP`}D1MA7S>@(S}r;M@2ar z0xDuO!nJOtQ+bb6kA|!*l>Gkv%vQ=Ec>>MurNS%&680yjOMV><+VZ58>-@aD)~N?) zd6++8Op+)}K~6Tbwx5iJRGNlw0G=inozeov@6u<7PIOToAYBWw@}Qel##j50?twY6 z00{Z4(Q&|*y{Ka@E^7h9)3_GD(uF6~urhqI-ZSa~)@QGKP%d^XGt`!+QL|W?lC-4` zbZA;sGpB5(scB|5W@lIKC>)auc;5^uF#Wm-eTBGw-U3Ol;mWrSy|e39ocu?31gd;$*LaI*c1B3RF6689qTty-V5ue+axY=Ok+57KY&V4fo8m_HpU8G~Ib%ou z4|87`6-TsniMwkD2-3JW5&{JGprP^LPLSXl+@-PLp5PW70txQ!!JXhF&`5$a#rx*T znl-cLn}4(FPuIP-s;jH3?mg%1efBXGP`@{gKp{MLpt`NT4czCUzMHVHefyT_*uf_-#kVyU7Wa@E&5!x3t%K zEsv800W!}@zw>kdzvR>hk%74w@d{NDy{tGPnXFI0Zmh%Vd9$jxkz;n33i&_?v?n5yQ?88V;#+UT;M^ z_CKfU8YQX+zm9$%{Qd)%=l8vpMIk_6oX_AO5`HuMtHJBh(ZctZvsA~F;d1?K$#Fp~ zmF6)Le-Jw6xj^34{Cv0v*)N^2O4WH#W7_*XNu3}la#M!5fI0nV)V`#E3^CzQK4b!Y z4hMu3)mqw_UMCUtHxInCt=2d=PjieA835E-?27J-i;MeRRrQH;C(Ct^Ai(b)e#t!T z7_rK0`?@`VOshEX;?nwVHZK_4oYxK8g93c|{H4^Jrc)0}7_~`ve_B;ScylgBxMtCQ z!{WyqI#oTUEsri%TlOtVyCg9gh^)J!-T|_=0xKopmI&xkia)hqVT4C_CW8)2Vo&bn zEm*p#dKB!-NXlTQC_QyVd=zlzmxJHNw0mD#Y+pixpYc5!ni0XrZsRc)su~?TB5{5Y zRP_kcQ1goMh6Bj_5tO;8vRCQ8Fq&VfU1hGH8P{3#BTeez(Cu4g&S~FZ8U7a;oLD#& zUtca%J!5jFwUml(p5eel%3|Geo!v~0mI3kM9l|s*>!!JKB0~~UB4@YnJv%&j--`h{ z?GLeEZ)T$7`5RPzAFeITgy5zp;d?(H$a);2CU)>rGG!*K@mPc1?6UWxk=YF+z&yhg(6f zM@Zq}g+oYa6Nsk|BVIRGw>Je@XyVODDLr>+EEY0=AO1$h_mTL^v-jS{0sRj5o7f8R zpx{P~tweETu#6zfW&Hs2pP zBecy*P}dpe{8+l&yvL`PgipQ`%NKiKqWG2@YWn%}QL1J@_ro%*+>+|-7mu;0@BL;T zP5UEjB^lG+QT%Vmb9IdGq=#Vx%lAq~5}D$V3T4~uIk3W}pb9fpu7`iKNjT~tG#%^x zp6SY);#&sM&2kOe7cgZEDL$n4h@ZW2h#9>hWr}LA`HI5Qh*!-%iMt53JyLnoJdTw; z?2jn!ncKEkKNja6J?i7Su)d@^d{mJA^=^( zTfPNK5Eg}F_=lyF$!;T*f*oYt>M*4fnAPDML`tAHUmax zhX`RC2XM^$WdF(IcQC0k;(whh3!MG zKq*r?zfDd1{qW7kEzNI%jMMu)tI2?~6*?~V-w(ddk_`BS;o;$4k#BU;o>5Hm7JKiL zG(5vP{Uu&qbE^I2^K2i9z?VB$m8i5=$&yu04negv3sZP9cy(ZV#;b#S{OX+efWjM; zMmMD@@uVdtwH)4}qDI`DzT~o*4}hWh{pHOcJ2otL!IfW-#A@00$IrTN!agI=F(u0; zo;4+Ox=)G?8 zb1oi^5^k@u4yD>wc8vqj&~9G7Kd!9!(vwELuG{8wAMTF&Yy9i_r}NYMc)ZXP@xIll zZ;_vRWGqVevUTqPC0Pvzhtm}VN0H&E(4TZj1g$TS7JeFp)YYL|!7=g*b+r$ZWtErRcxk0-#E%j9H#RsnG39(!9hw;Odi5|#Ut5Ky z))CTx73MIJ6wsuRoeMcn0z{aYRHrPk;{uio1$+|-%)@^FuJU!yN4UP(K2mEaOBd0? zDZEOX_VB%bR()Ag`??)rysUo8$#50s`ul5~FYYvgYpNja?`Mq;)2 z%5iD;8)dnUhmG+#bXeC8TA1-{b30GI9JUsqwqM z;hTH9WABGa?so))osI_l^4|ZZQ#;@mRV0hWe}j`>QX*fa8CYd6Fu(jNVGK7G=ja3G zssh&g9|;_9ITxDIfTEU}+@Yu$X_HnxxtSQjvKKW{L*#Y+t|uMw0lM23qMNouC@Jrs zT}EW7woetkNo>CUqg1;^JA7sT>{4DkC^?##Wa!E!b^ii2W1ij&w1VOLsMe7oWT5=B zKwIK7)d_fm6GgFDw#SWI(?2Uz>@PJc1Gd z8hXJA;|A=4LuxB(Y8J_&#w}6oG8yAsnFjG+TM#A%A`J1{_wNUW@{@O(L6IA=XckTz zIIJlp(R4_uT*1aVIuKSmp4>l#r~lg0bqPDio^K;xr<(UZX8!r}2V*3)j|Fk!Ipj@e z7bW{*XYL98#=kbm8aNP9a-7Ob(c}ZHQ!EX_gJ1}9-Y_v$yTbVQW?x00u3jiPTMvi|QM7ZVpq1Gb+^ThD8a5B%rGi8P0sUWD+)Mq(Hx#U&M!Rm)J> zz;)+l(Sd18yE!uI4C2gsA|8<(<(2$D_h`u# zb;`=I_?oeik11KRtgMXjb@4U8)Z+So=mZlma_jV#l9>T%KknIv8YCtDV^2g{%CTvrVN$#89uXclL7t3YliZ#xjS_@TQ z>wwuW7i`GyxzZIcmMsjgxY}Dx?3>sU8xN9w$?p%+0glEM8aM8%>87c06~LCZ;Ud(I zQauSUQ&2LyxfVR68H2@vd|A&s*q*g>e21b@dk1mNxH1?GEMAa2smRk7s2FAc{ApI!Q`|V{Q6i)xX zw_ZS+unSmd2Srw^4{da>=CV%)x)@ity!@UKaBI(k-D-ifWRaT+b&!qqy^Q zl0`&HQ&-yHuU-GO`;T*?gB2(%HQUG300%-´g_&;~EKQB$n5Olk9ZGFu8LvelO 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 YA$p7weq8J$39zZD{PV0#$vW(R0C&H<_y7O^ literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 000000000..29d94c787 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "orientation" : "landscape", + "idiom" : "tv", + "extent" : "full-screen", + "minimum-system-version" : "9.0", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json new file mode 100644 index 000000000..b18c20292 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "PlotGallery.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png new file mode 100644 index 0000000000000000000000000000000000000000..1bde034e43c9ed26136e6b737453d188b13f65ac GIT binary patch literal 191272 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

>bX`t*EGjdcJtI}t0s!snPldIh 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´g_&;~EKQB$n5Olk9ZGFu8LvelO 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 YA$p7weq8J$39zZD{PV0#$vW(R0C&H<_y7O^ literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json new file mode 100644 index 000000000..33a745102 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "first.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d911dea647d55983671ead4d08b6f6b3600715 GIT binary patch literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json new file mode 100644 index 000000000..03bd9c927 --- /dev/null +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "second.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf new file mode 100644 index 0000000000000000000000000000000000000000..401614e288b4b160471c2776bed6f09762af3e1c GIT binary patch literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT - #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #import #import #else diff --git a/examples/CorePlotGallery/Plot_Gallery_tvOS-Info.plist b/examples/CorePlotGallery/Plot_Gallery_tvOS-Info.plist new file mode 100644 index 000000000..4f338601b --- /dev/null +++ b/examples/CorePlotGallery/Plot_Gallery_tvOS-Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + + diff --git a/examples/CorePlotGallery/src/ios/Main.storyboard b/examples/CorePlotGallery/src/ios/Main.storyboard index 391428c19..f77129ad0 100644 --- a/examples/CorePlotGallery/src/ios/Main.storyboard +++ b/examples/CorePlotGallery/src/ios/Main.storyboard @@ -1,15 +1,15 @@ - + - + - + - + @@ -171,10 +171,10 @@ - + - + diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index c1e227253..2135189a3 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -121,7 +121,9 @@ -(CGFloat)titleSize { CGFloat size; -#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE +#if TARGET_OS_TV + size = 36.0; +#elif TARGET_OS_SIMULATOR || TARGET_OS_IPHONE switch ( UI_USER_INTERFACE_IDIOM() ) { case UIUserInterfaceIdiomPad: size = 24.0; diff --git a/examples/CorePlotGallery/src/tvOS/AppDelegateTV.h b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.h new file mode 100644 index 000000000..45bd5ecd6 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.h @@ -0,0 +1,7 @@ +#import + +@interface AppDelegateTV : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m new file mode 100644 index 000000000..c793498f1 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m @@ -0,0 +1,16 @@ +#import "AppDelegateTV.h" + +#import "PlotGallery.h" + +@implementation AppDelegateTV + +@synthesize window; + +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + [[PlotGallery sharedPlotGallery] sortByTitle]; + + return YES; +} + +@end diff --git a/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.h b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.h new file mode 100644 index 000000000..89181d3de --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.h @@ -0,0 +1,17 @@ +// +// DetailViewControllerTV.h +// CorePlotGallery +// + +@class PlotItem; + +@interface DetailViewControllerTV : UIViewController + +@property (nonatomic, strong) PlotItem *detailItem; +@property (nonatomic, copy) NSString *currentThemeName; + +@property (nonatomic, strong) IBOutlet UIView *hostingView; + +-(void)themeSelectedWithName:(NSString *)themeName; + +@end diff --git a/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m new file mode 100644 index 000000000..d46a9bbe8 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m @@ -0,0 +1,120 @@ +// +// DetailViewControllerTV +// CorePlotGallery +// + +#import "DetailViewControllerTV.h" + +#import "PlotItem.h" +#import "ThemeTableViewControllerTV.h" + +@interface DetailViewControllerTV() + +-(CPTTheme *)currentTheme; + +-(void)setupView; +-(void)themeChanged:(NSNotification *)notification; + +@end + +#pragma mark - + +@implementation DetailViewControllerTV + +@synthesize detailItem; +@synthesize hostingView; +@synthesize currentThemeName; + +#pragma mark - +#pragma mark Initialization and Memory Management + +-(void)setupView +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(themeChanged:) + name:PlotGalleryThemeDidChangeNotification + object:nil]; + + [self.detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; +} + +-(void)awakeFromNib +{ + [self setupView]; +} + +-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) { + [self setupView]; + } + + return self; +} + +-(void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark Managing the detail item + +-(void)setDetailItem:(PlotItem *)newDetailItem +{ + if ( detailItem != newDetailItem ) { + [detailItem killGraph]; + + detailItem = newDetailItem; + + if ( self.hostingView ) { + [detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + } + } +} + +#pragma mark - +#pragma mark View lifecycle + +-(void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + [self setupView]; +} + +#pragma mark - +#pragma mark Theme Selection + +-(CPTTheme *)currentTheme +{ + CPTTheme *theme; + + if ( [self.currentThemeName isEqualToString:kThemeTableViewControllerNoTheme] ) { + theme = (id)[NSNull null]; + } + else if ( [self.currentThemeName isEqualToString:kThemeTableViewControllerDefaultTheme] ) { + theme = nil; + } + else { + theme = [CPTTheme themeNamed:self.currentThemeName]; + } + + return theme; +} + +-(void)themeSelectedWithName:(NSString *)themeName +{ + self.currentThemeName = themeName; + + [self.detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; +} + +-(void)themeChanged:(NSNotification *)notification +{ + NSDictionary *themeInfo = notification.userInfo; + + [self themeSelectedWithName:themeInfo[PlotGalleryThemeNameKey]]; +} + +@end diff --git a/examples/CorePlotGallery/src/tvOS/Main.storyboard b/examples/CorePlotGallery/src/tvOS/Main.storyboard new file mode 100644 index 000000000..6c7f86385 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/Main.storyboard @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.h b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.h new file mode 100644 index 000000000..fe614078b --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.h @@ -0,0 +1,10 @@ +// +// RootViewControllerTV.h +// CorePlotGallery +// + +@interface RootViewControllerTV : UITableViewController + +@property (nonatomic, strong) IBOutlet UIBarButtonItem *themeBarButton; + +@end diff --git a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m new file mode 100644 index 000000000..03b0f1721 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m @@ -0,0 +1,125 @@ +// +// RootViewControllerTV.m +// CorePlotGallery +// + +#import "RootViewControllerTV.h" + +#import "DetailViewControllerTV.h" +#import "ThemeTableViewControllerTV.h" + +#import "PlotGallery.h" +#import "PlotItem.h" + +@interface RootViewControllerTV() + +@property (nonatomic, copy) NSString *currentThemeName; + +-(void)themeChanged:(NSNotification *)notification; + +@end + +#pragma mark - + +@implementation RootViewControllerTV + +@synthesize themeBarButton; +@synthesize currentThemeName; + +-(void)viewDidLoad +{ + [super viewDidLoad]; + + self.clearsSelectionOnViewWillAppear = NO; + + self.currentThemeName = kThemeTableViewControllerDefaultTheme; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(themeChanged:) + name:PlotGalleryThemeDidChangeNotification + object:nil]; +} + +-(void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark Segues + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ + if ( [segue.identifier isEqualToString:@"showDetail"] ) { + DetailViewControllerTV *controller = (DetailViewControllerTV *)segue.destinationViewController; + + controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; + + controller.currentThemeName = self.currentThemeName; + + NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; + + PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectInSection:[indexPath indexAtPosition:0] + atIndex:[indexPath indexAtPosition:1]]; + + controller.detailItem = plotItem; + } +} + +#pragma mark - +#pragma mark Theme Selection + +-(void)setCurrentThemeName:(NSString *)newThemeName +{ + if ( newThemeName != currentThemeName ) { + currentThemeName = [newThemeName copy]; + + self.themeBarButton.title = newThemeName; + } +} + +-(void)themeChanged:(NSNotification *)notification +{ + NSDictionary *themeInfo = notification.userInfo; + + self.currentThemeName = themeInfo[PlotGalleryThemeNameKey]; +} + +#pragma mark - +#pragma mark Table view data source + +-(NSInteger)numberOfSectionsInTableView:(UITableView *)tv +{ + return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfSections]; +} + +-(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section +{ + return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection : (NSUInteger)section]; +} + +-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *cellId = @"PlotCell"; + + UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellId]; + + if ( cell == nil ) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; + cell.accessoryType = UITableViewCellAccessoryNone; + } + + PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectInSection:[indexPath indexAtPosition:0] + atIndex:[indexPath indexAtPosition:1]]; + cell.imageView.image = [plotItem image]; + cell.textLabel.text = plotItem.title; + + return cell; +} + +-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +{ + return [[PlotGallery sharedPlotGallery] sectionTitles][(NSUInteger)section]; +} + +@end diff --git a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.h b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.h new file mode 100644 index 000000000..7aff4646e --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.h @@ -0,0 +1,16 @@ +// +// ThemeTableViewControllerTV.h +// CorePlotGallery +// + +extern NSString *const kThemeTableViewControllerNoTheme; +extern NSString *const kThemeTableViewControllerDefaultTheme; + +extern NSString *const PlotGalleryThemeDidChangeNotification; +extern NSString *const PlotGalleryThemeNameKey; + +#pragma mark - + +@interface ThemeTableViewControllerTV : UITableViewController + +@end diff --git a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m new file mode 100644 index 000000000..fdbb63e84 --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m @@ -0,0 +1,100 @@ +// +// ThemeTableViewControllerTV.m +// CorePlotGallery +// + +#import "ThemeTableViewControllerTV.h" + +#import + +NSString *const kThemeTableViewControllerNoTheme = @"None"; +NSString *const kThemeTableViewControllerDefaultTheme = @"Default"; + +NSString *const PlotGalleryThemeDidChangeNotification = @"PlotGalleryThemeDidChangeNotification"; +NSString *const PlotGalleryThemeNameKey = @"PlotGalleryThemeNameKey"; + +@interface ThemeTableViewControllerTV() + +@property (nonatomic, readwrite, strong) CPTMutableStringArray themes; + +@end + +#pragma mark - + +@implementation ThemeTableViewControllerTV + +@synthesize themes; + +-(void)setupThemes +{ + CPTMutableStringArray themeList = [[NSMutableArray alloc] init]; + + [themeList addObject:kThemeTableViewControllerDefaultTheme]; + [themeList addObject:kThemeTableViewControllerNoTheme]; + + for ( Class themeClass in [CPTTheme themeClasses] ) { + [themeList addObject:[themeClass name]]; + } + + self.themes = themeList; +} + +-(void)awakeFromNib +{ + [self setupThemes]; +} + +-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) { + [self setupThemes]; + } + + return self; +} + +#pragma mark - +#pragma mark Table view data source + +-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + +-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return (NSInteger)self.themes.count; +} + +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"ThemeCell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + + if ( cell == nil ) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; + } + + cell.textLabel.text = self.themes[(NSUInteger)indexPath.row]; + + return cell; +} + +#pragma mark - +#pragma mark Table view delegate + +-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSDictionary *themeInfo = @{ + PlotGalleryThemeNameKey: self.themes[(NSUInteger)indexPath.row] + }; + + [[NSNotificationCenter defaultCenter] postNotificationName:PlotGalleryThemeDidChangeNotification + object:self + userInfo:themeInfo]; + + [self dismissViewControllerAnimated:YES completion:nil]; +} + +@end diff --git a/examples/CorePlotGallery/src/tvOS/main.m b/examples/CorePlotGallery/src/tvOS/main.m new file mode 100644 index 000000000..cee796cdf --- /dev/null +++ b/examples/CorePlotGallery/src/tvOS/main.m @@ -0,0 +1,9 @@ +#import "AppDelegateTV.h" +#import + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain( argc, argv, nil, NSStringFromClass([AppDelegateTV class]) ); + } +} From 28dfa1bebeb2f34d859bbde80927fa5cf02e5d9e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 23 Oct 2015 16:51:34 -0400 Subject: [PATCH 111/429] Added a menu item to export icons and images for the tvOS Plot Gallery app in the Mac Plot Gallery app. --- .../src/mac/English.lproj/MainMenu.xib | 27 ++++- .../src/mac/PlotGalleryController.m | 108 ++++++++++++++++++ 2 files changed, 130 insertions(+), 5 deletions(-) diff --git a/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib b/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib index 07afc80f5..a0a26dbcb 100644 --- a/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib +++ b/examples/CorePlotGallery/src/mac/English.lproj/MainMenu.xib @@ -1,9 +1,9 @@ - + - - + + @@ -12,7 +12,7 @@ - +

@@ -75,6 +75,13 @@ + + + + + + + @@ -222,33 +229,42 @@ + + + + + + + @@ -261,9 +277,10 @@ + - + diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 45e501afc..a8904e4f4 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -133,6 +133,114 @@ -(IBAction)themeSelectionDidChange:(id)sender [self.plotItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; } +#pragma mark - +#pragma mark Export Images + +-(void)exportTVImageWithSize:(CGSize)size toURL:(NSURL *)url showPlots:(BOOL)showPlots showBackground:(BOOL)showBackground +{ + if ( url ) { + CGRect imageFrame = CGRectMake(0.0, 0.0, size.width, size.height); + + NSView *imageView = [[NSView alloc] initWithFrame:NSRectFromCGRect(imageFrame)]; + [imageView setWantsLayer:YES]; + + [self.plotItem renderInView:imageView withTheme:nil animated:NO]; + + if ( !showBackground ) { + for ( CPTGraphHostingView *view in imageView.subviews ) { + CPTGraph *graph = view.hostedGraph; + + graph.fill = [CPTFill fillWithColor:[CPTColor clearColor]]; + graph.axisSet = nil; + + graph.plotAreaFrame.fill = [CPTFill fillWithColor:[CPTColor clearColor]]; + graph.plotAreaFrame.borderLineStyle = nil; + + graph.plotAreaFrame.plotArea.fill = [CPTFill fillWithColor:[CPTColor clearColor]]; + graph.plotAreaFrame.plotArea.borderLineStyle = nil; + } + } + + if ( !showPlots ) { + for ( CPTGraphHostingView *view in imageView.subviews ) { + for ( CPTPlot *plot in view.hostedGraph.allPlots ) { + plot.hidden = YES; + } + } + } + + CGSize boundsSize = imageFrame.size; + + NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:(NSInteger)boundsSize.width + pixelsHigh:(NSInteger)boundsSize.height + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bytesPerRow:(NSInteger)boundsSize.width * 4 + bitsPerPixel:32]; + + NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; + CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + + CGContextClearRect( context, CGRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); + CGContextSetAllowsAntialiasing(context, true); + CGContextSetShouldSmoothFonts(context, false); + [imageView.layer renderInContext:context]; + CGContextFlush(context); + + NSImage *image = [[NSImage alloc] initWithSize:NSSizeFromCGSize(boundsSize)]; + [image addRepresentation:layerImage]; + + NSData *tiffData = [image TIFFRepresentation]; + NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + + [pngData writeToURL:url atomically:NO]; + } +} + +-(IBAction)exportTVImagesToPNG:(id)sender +{ + NSOpenPanel *pngSavingDialog = [NSOpenPanel openPanel]; + + pngSavingDialog.canChooseFiles = NO; + pngSavingDialog.canChooseDirectories = YES; + pngSavingDialog.allowsMultipleSelection = NO; + + if ( [pngSavingDialog runModal] == NSOKButton ) { + NSURL *url = [pngSavingDialog URL]; + if ( url ) { + // top image + CGSize topShelfSize = CGSizeMake(1920.0, 720.0); + + NSURL *topURL = [NSURL URLWithString:@"PlotGalleryTopShelf.png" relativeToURL:url]; + [self exportTVImageWithSize:topShelfSize toURL:topURL showPlots:YES showBackground:YES]; + + // large icon image + CGSize largeIconSize = CGSizeMake(1280.0, 768.0); + + NSURL *largeBackURL = [NSURL URLWithString:@"PlotGalleryLargeIconBack.png" relativeToURL:url]; + [self exportTVImageWithSize:largeIconSize toURL:largeBackURL showPlots:NO showBackground:YES]; + + NSURL *largeFrontURL = [NSURL URLWithString:@"PlotGalleryLargeIconFront.png" relativeToURL:url]; + [self exportTVImageWithSize:largeIconSize toURL:largeFrontURL showPlots:YES showBackground:NO]; + + // small icon image + CGSize smallIconSize = CGSizeMake(400.0, 240.0); + + NSURL *smallBackURL = [NSURL URLWithString:@"PlotGallerySmallIconBack.png" relativeToURL:url]; + [self exportTVImageWithSize:smallIconSize toURL:smallBackURL showPlots:NO showBackground:YES]; + + NSURL *smallFrontURL = [NSURL URLWithString:@"PlotGallerySmallIconFront.png" relativeToURL:url]; + [self exportTVImageWithSize:smallIconSize toURL:smallFrontURL showPlots:YES showBackground:NO]; + } + } +} + #pragma mark - #pragma mark PlotItem Property From 8920e5f1db2d31fe480e4d60feb4049c33402250 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 23 Oct 2015 16:52:20 -0400 Subject: [PATCH 112/429] Added a launch image, application icons, and a top shelf image to the tvOS Plot Gallery app. --- .../Content.imageset/Contents.json | 1 + .../PlotGalleryLargeIconBack.png | Bin 0 -> 210847 bytes .../App Icon - Large.imagestack/Contents.json | 5 +---- .../Content.imageset/Contents.json | 1 + .../PlotGalleryLargeIconFront.png | Bin 0 -> 216055 bytes .../Content.imageset/Contents.json | 12 ---------- .../Middle.imagestacklayer/Contents.json | 6 ----- .../Content.imageset/Contents.json | 1 + .../PlotGallerySmallIconBack.png | Bin 0 -> 34385 bytes .../App Icon - Small.imagestack/Contents.json | 5 +---- .../Content.imageset/Contents.json | 1 + .../PlotGallerySmallIconFront.png | Bin 0 -> 36155 bytes .../Content.imageset/Contents.json | 12 ---------- .../Middle.imagestacklayer/Contents.json | 6 ----- .../Top Shelf Image.imageset/Contents.json | 2 +- .../Top Shelf Image.imageset/PlotGallery.png | Bin 191272 -> 0 bytes .../PlotGalleryTopShelf.png | Bin 0 -> 443187 bytes .../LaunchImage.launchimage/Contents.json | 1 + .../LaunchImage.launchimage/LaunchImage.png | Bin 0 -> 37274 bytes .../PlotGallery.imageset/Contents.json | 21 ------------------ .../PlotGallery.imageset/PlotGallery.png | Bin 191272 -> 0 bytes .../first.imageset/Contents.json | 12 ---------- .../Assets.xcassets/first.imageset/first.pdf | Bin 2465 -> 0 bytes .../second.imageset/Contents.json | 12 ---------- .../second.imageset/second.pdf | Bin 2423 -> 0 bytes 25 files changed, 8 insertions(+), 90 deletions(-) create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/PlotGalleryLargeIconBack.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/PlotGalleryLargeIconFront.png delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/PlotGallerySmallIconBack.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/PlotGallerySmallIconFront.png delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGalleryTopShelf.png create mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/LaunchImage.png delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json delete mode 100644 examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json index 0564959fb..f0e3ac4e2 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "PlotGalleryLargeIconBack.png", "scale" : "1x" } ], diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/PlotGalleryLargeIconBack.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/PlotGalleryLargeIconBack.png new file mode 100644 index 0000000000000000000000000000000000000000..cb50a05bc735a0aa13c51af1ea91a5945349384e GIT binary patch literal 210847 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

A%Nn&Ub= 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 literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json index 8bf75d9f5..cf8282aa5 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -3,9 +3,6 @@ { "filename" : "Front.imagestacklayer" }, - { - "filename" : "Middle.imagestacklayer" - }, { "filename" : "Back.imagestacklayer" } @@ -14,4 +11,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json index 0564959fb..59bfa5a6d 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "PlotGallerySmallIconFront.png", "scale" : "1x" } ], diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/PlotGallerySmallIconFront.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/PlotGallerySmallIconFront.png new file mode 100644 index 0000000000000000000000000000000000000000..51a34de0f1c83727ae3c97c1bd242b2623af9d7f GIT binary patch literal 36155 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≶3Z*??@G#=pcuOpv|6Vg1Mi_oJW|sGAIrZqe_~vY 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 H_e=gC6mGn+ literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json deleted file mode 100644 index 0564959fb..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "tv", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json index c7df87c17..9c2fa6a7e 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "tv", - "filename" : "PlotGallery.png", + "filename" : "PlotGalleryTopShelf.png", "scale" : "1x" } ], diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGallery.png deleted file mode 100644 index 1bde034e43c9ed26136e6b737453d188b13f65ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191272 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

>bX`t*EGjdcJtI}t0s!snPldIh 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´g_&;~EKQB$n5Olk9ZGFu8LvelO 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 YA$p7weq8J$39zZD{PV0#$vW(R0C&H<_y7O^ diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGalleryTopShelf.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/PlotGalleryTopShelf.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9cef263be74b190e0a3872f81f768412cab9e2 GIT binary patch literal 443187 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%0DfUT=#~v%> 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

0lK4`xaZ5ob*P*ewO?Ce?w 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 zΜ{?G(ITpK5*Jx8R>4=MVk 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 literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json index 29d94c787..93e7c5fb0 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -3,6 +3,7 @@ { "orientation" : "landscape", "idiom" : "tv", + "filename" : "LaunchImage.png", "extent" : "full-screen", "minimum-system-version" : "9.0", "scale" : "1x" diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/LaunchImage.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/LaunchImage.launchimage/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ba363b2243965c029b3733915c42f189a89002 GIT binary patch literal 37274 zcmeI)!B5jr9Ki86F`!ct6Au!jNi$=Nhqc`p%9?EvHiadEWX@#V7*MovU1wXeaswqX z-Z*$d6HGkmfwM>b2aJhlZyq%9Um&sV29ya`Jn&sY*8bk_*Vp&5e?sH1IvtS!7*RYyW@Z9>mwe02-iD06=Pxn2|*4{)-r@JbDeTr9a zDJfZ14l8nvrTy1CP!)_ES*Cl&5oN(hr!3rz&O7G(9o43+MPq5DRCo14T1|~4Q))6j zTut55QmU3o<&>VB{S}7QMO&}CmR+^1Mq$SA^oAMSO2cxdQyCqPlm@HN9@vKNZ*Q=P z1%IM{V!ioA%WT=Y;{^F5-TY{*H@~7gR%1DM{G+Df7Si34o^Wr~?EZM+_HIoy*jrFL ztRNbU6a+tm7VcB6WSDw0TuUmOR&&asL%pR%t6|v>TlED!*s-uA66(zkCz_2+q>dh# zC^FP7%_+fYj-2ieoiOU#Da8F>b=P4b{&MU33nA`^a%rsU#r}L-3!tvP+xc+m=6bxZ z|NM|T_jxtO1)IQ0KmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=JDCQ;^Y{yS)JT zuYXz}(DnfZC_n)UPPT$iSGA3p-xg@-r?vCr{e?8=;bfl&T0+qmi=JR8KmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>tl|5NaKZev}D!Dr>tSd|V8$JT*?b{`xz4jT$kfC3bt00k&O!HH3@HgM|A Wrik6xYAb%f6;ZxBUD_U>d;S;hP?QP) literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json deleted file mode 100644 index b18c20292..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "PlotGallery.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/PlotGallery.imageset/PlotGallery.png deleted file mode 100644 index 1bde034e43c9ed26136e6b737453d188b13f65ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191272 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

>bX`t*EGjdcJtI}t0s!snPldIh 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´g_&;~EKQB$n5Olk9ZGFu8LvelO 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 YA$p7weq8J$39zZD{PV0#$vW(R0C&H<_y7O^ diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json deleted file mode 100644 index 33a745102..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "first.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf deleted file mode 100644 index 47d911dea647d55983671ead4d08b6f6b3600715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json deleted file mode 100644 index 03bd9c927..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "second.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf deleted file mode 100644 index 401614e288b4b160471c2776bed6f09762af3e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT Date: Fri, 30 Oct 2015 21:42:21 -0400 Subject: [PATCH 113/429] Fixed the tvOS SDK names in the tvOS frame work build script and the release build script. --- framework/CorePlot.xcodeproj/project.pbxproj | 10 +++++----- scripts/createrelease.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index c4a1de99f..9a6763a2b 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2579,7 +2579,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\nUFW_TARGET=\"CorePlot tvOS\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest tvOS SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"tvos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nFRAMEWORK_NAME=\"${PROJECT_NAME}\"\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_PATH=\"${UFW_BUILD_DIR}/Release-tvos/${FRAMEWORK_NAME}.framework\"\nUFW_SIMULATOR_PATH=\"${UFW_BUILD_DIR}/Release-tvsimulator/${FRAMEWORK_NAME}.framework\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-tvuniversal\"\nUFW_FRAMEWORK=\"${UFW_UNIVERSAL_DIR}/${FRAMEWORK_NAME}.framework\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphoneos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk iphonesimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp -r \"${UFW_IPHONE_PATH}/.\" \"${UFW_FRAMEWORK}\"\n\nlipo -create -output \"${UFW_FRAMEWORK}/${FRAMEWORK_NAME}\" \"${UFW_SIMULATOR_PATH}/${FRAMEWORK_NAME}\" \"${UFW_IPHONE_PATH}/${FRAMEWORK_NAME}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n"; + shellScript = "\nUFW_TARGET=\"CorePlot tvOS\"\nUFW_BUILD_DIR=\"${BUILD_DIR}\"\n\nif [ -z ${SDK_NAME} ]; then\n# Use the latest tvOS SDK available\nUFW_GREP_RESULT=$(xcodebuild -showsdks | grep -o \"appletvos.*$\")\nwhile read -r line; do\nUFW_SDK_VERSION=\"${line}\"\ndone <<< \"${UFW_GREP_RESULT}\"\nelse\n# Use the SDK specified by XCode\nUFW_SDK_VERSION=\"${SDK_NAME}\"\nfi\n\nFRAMEWORK_NAME=\"${PROJECT_NAME}\"\nUFW_SDK_VERSION=$(echo \"${UFW_SDK_VERSION}\" | grep -o \"[0-9].*$\")\nUFW_IPHONE_PATH=\"${UFW_BUILD_DIR}/Release-appletvos/${FRAMEWORK_NAME}.framework\"\nUFW_SIMULATOR_PATH=\"${UFW_BUILD_DIR}/Release-appletvsimulator/${FRAMEWORK_NAME}.framework\"\nUFW_UNIVERSAL_DIR=\"${UFW_BUILD_DIR}/Release-appletvuniversal\"\nUFW_FRAMEWORK=\"${UFW_UNIVERSAL_DIR}/${FRAMEWORK_NAME}.framework\"\n\n# Build Framework\n\nrm -rf \"${UFW_UNIVERSAL_DIR}\"\n\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk appletvos${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\nxcodebuild -target \"${UFW_TARGET}\" -project CorePlot.xcodeproj -configuration Release -sdk appletvsimulator${UFW_SDK_VERSION} clean build\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: xcodebuild failed\"; exit 1; fi\n\nmkdir -p \"${UFW_UNIVERSAL_DIR}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: mkdir failed\"; exit 1; fi\n\ncp -r \"${UFW_IPHONE_PATH}/.\" \"${UFW_FRAMEWORK}\"\n\nlipo -create -output \"${UFW_FRAMEWORK}/${FRAMEWORK_NAME}\" \"${UFW_SIMULATOR_PATH}/${FRAMEWORK_NAME}\" \"${UFW_IPHONE_PATH}/${FRAMEWORK_NAME}\"\nif [ \"$?\" != \"0\" ]; then echo >&2 \"Error: lipo failed\"; exit 1; fi\n"; }; C38A09921A4618B600D45436 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -3299,8 +3299,8 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; }; name = Debug; }; @@ -3313,8 +3313,8 @@ DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; ZERO_LINK = NO; }; name = Release; diff --git a/scripts/createrelease.py b/scripts/createrelease.py index c9c588187..7a1e13076 100644 --- a/scripts/createrelease.py +++ b/scripts/createrelease.py @@ -85,7 +85,7 @@ def RunXcode(project, target): # Build tvOS Framework RunXcode('CorePlot.xcodeproj', 'Universal tvOS Framework') -tvOSProductsDir = join(projectRoot, 'build/Release-tvuniversal') +tvOSProductsDir = join(projectRoot, 'build/Release-appletvuniversal') tvOSFramework = join(tvOSProductsDir, 'CorePlot.framework') copytree(tvOSFramework, join(tvosDir, 'CorePlot.framework'), symlinks=True) From be745a4be78ce829f15cb6b1af478784c4a268e8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 30 Oct 2015 21:42:52 -0400 Subject: [PATCH 114/429] Added the tvOS targets to the Travis build file. --- .travis.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f728a741b..927fa9fa8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,24 @@ language: objective-c -osx_image: xcode7 +osx_image: xcode7.1 -env: +ios_env: SDK:iphonesimulator SDK:iphoneos +tvos_env: + TVSDK:appletvsimulator + TVSDK:appletvos + # Framework builds script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot Mac" -configuration Release script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot iOS" -sdk ${SDK} -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot tvOS" -sdk ${TVSDK} -configuration Release script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot-CocoaTouch" -sdk ${SDK} -configuration Release # Unit tests script: xcodebuild -project framework/CorePlot.xcodeproj -target "UnitTests Mac" -configuration Release script: xcodebuild -project framework/CorePlot.xcodeproj -target "UnitTests iOS" -sdk ${SDK} -configuration Release +script: xcodebuild -project framework/CorePlot.xcodeproj -target "UnitTests tvOS" -sdk ${TVSDK} -configuration Release script: xcodebuild -project framework/CorePlot.xcodeproj -target "CorePlot-CocoaTouchTests" -sdk ${SDK} -configuration Release # Mac examples @@ -31,5 +37,8 @@ script: xcodebuild -project examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodepr script: xcodebuild -project examples/CPTTestApp-iPhone-SpeedTest/CPTTestApp-iPhone.xcodeproj -CPTTestApp-iPhone AAPLot -sdk ${SDK} -configuration Release script: xcodebuild -project examples/StockPlot/StockPlot.xcodeproj -target StockPlot -sdk ${SDK} -configuration Release +# tvOS examples +script: xcodebuild -project examples/CorePlotGallery/Plot_Gallery.xcodeproj -target "Plot Gallery-tvOS" -sdk ${TVSDK} -configuration Release + # Quartz Composer plugin script: xcodebuild -project QCPlugin/CorePlotQCPlugin.xcodeproj -target CorePlotQCPlugin -configuration Release From 109c37dc02b699929c8570ae2acf20e4828a82e1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Oct 2015 19:37:47 -0400 Subject: [PATCH 115/429] Changed the annotated type definitions to exclude the pointer star ("*"). --- QCPlugin/CPTBarPlotPlugin.m | 8 +- QCPlugin/CPTPieChartPlugin.m | 18 ++--- QCPlugin/CPTScatterPlotPlugin.m | 10 +-- QCPlugin/CorePlotQCPlugin.m | 14 ++-- documentation/changelog.markdown | 1 + examples/AAPLot/APFinancialData.h | 2 +- examples/AAPLot/APFinancialData.m | 6 +- examples/AAPLot/APYahooDataPuller.h | 2 +- examples/AAPLot/APYahooDataPuller.m | 22 +++--- examples/AAPLot/Classes/MainViewController.m | 24 +++--- .../Classes/CPTTestApp_iPadAppDelegate.m | 2 +- .../Classes/CPTTestApp_iPadViewController.h | 2 +- .../Classes/CPTTestApp_iPadViewController.m | 4 +- .../CPTTestApp.xcodeproj/project.pbxproj | 33 +++++++- examples/CPTTestApp/Source/Controller.m | 8 +- .../CorePlotGallery/src/ios/AppDelegate.m | 2 +- .../src/ios/ThemeTableViewController.m | 4 +- .../src/mac/PlotGalleryController.m | 2 +- .../src/plots/ColoredBarChart.m | 6 +- .../CorePlotGallery/src/plots/CompositePlot.h | 2 +- .../CorePlotGallery/src/plots/CompositePlot.m | 4 +- .../CorePlotGallery/src/plots/ControlChart.m | 4 +- .../src/plots/CurvedScatterPlot.m | 2 +- .../CorePlotGallery/src/plots/DonutChart.m | 2 +- .../CorePlotGallery/src/plots/FunctionPlot.m | 4 +- .../src/plots/GradientScatterPlot.m | 2 +- .../src/plots/LabelingPolicyDemo.m | 4 +- .../CorePlotGallery/src/plots/RealTimePlot.m | 2 +- .../src/plots/SimplePieChart.m | 6 +- .../src/plots/SimpleScatterPlot.m | 2 +- .../src/plots/VerticalBarChart.m | 4 +- .../CorePlotGallery/src/shared/PlotGallery.h | 2 +- .../CorePlotGallery/src/shared/PlotGallery.m | 2 +- .../src/tvOS/ThemeTableViewControllerTV.m | 4 +- examples/DropPlot/CPTPlotDocument.m | 8 +- examples/DropPlot/NSString+ParseCSV.h | 2 +- examples/DropPlot/NSString+ParseCSV.m | 6 +- .../StockPlot/Classes/APYahooDataPuller.h | 2 +- .../StockPlot/Classes/APYahooDataPuller.m | 26 +++---- .../Classes/APYahooDataPullerGraph.m | 2 +- .../Classes/NSDictionary+APFinancialData.h | 2 +- .../Classes/NSDictionary+APFinancialData.m | 6 +- .../StockPlot/Classes/RootViewController.h | 2 +- .../StockPlot/Classes/RootViewController.m | 4 +- framework/CorePlot.xcodeproj/project.pbxproj | 12 +-- framework/MacOnly/CPTGraphHostingView.m | 10 +-- .../MacOnly/CPTTextStylePlatformSpecific.m | 14 ++-- framework/Source/CPTAnimation.m | 10 +-- framework/Source/CPTAxis.h | 12 +-- framework/Source/CPTAxis.m | 56 +++++++------- framework/Source/CPTBarPlot.m | 24 +++--- framework/Source/CPTDataSourceTestCase.h | 4 +- framework/Source/CPTDataSourceTestCase.m | 16 ++-- framework/Source/CPTDefinitions.h | 16 ++-- framework/Source/CPTGraph.h | 2 +- framework/Source/CPTGraph.m | 6 +- framework/Source/CPTLayerTests.h | 2 +- framework/Source/CPTLayerTests.m | 24 +++--- framework/Source/CPTLegend.h | 8 +- framework/Source/CPTLegend.m | 56 +++++++------- framework/Source/CPTLineStyle.h | 2 +- framework/Source/CPTLineStyle.m | 6 +- framework/Source/CPTMutableLineStyle.h | 2 +- framework/Source/CPTMutableLineStyle.m | 2 +- framework/Source/CPTMutableNumericData.h | 2 +- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTNumericData.h | 36 ++++----- framework/Source/CPTNumericData.m | 76 +++++++++---------- .../CPTNumericDataTypeConversionTests.m | 6 +- framework/Source/CPTPieChart.h | 2 +- framework/Source/CPTPieChart.m | 22 +++--- framework/Source/CPTPlot.h | 4 +- framework/Source/CPTPlot.m | 24 +++--- framework/Source/CPTPlotArea.h | 2 +- framework/Source/CPTPlotArea.m | 6 +- framework/Source/CPTPlotSpace.h | 10 +-- framework/Source/CPTPlotSpace.m | 10 +-- framework/Source/CPTPlotSpaceAnnotation.h | 4 +- framework/Source/CPTPlotSpaceAnnotation.m | 8 +- framework/Source/CPTRangePlot.m | 22 +++--- framework/Source/CPTScatterPlot.m | 18 ++--- framework/Source/CPTScatterPlotTests.m | 26 +++---- framework/Source/CPTTextStyle.h | 4 +- framework/Source/CPTTradingRangePlot.m | 16 ++-- framework/Source/CPTXYAxis.m | 8 +- framework/Source/CPTXYPlotSpace.m | 8 +- framework/Source/CPTXYPlotSpaceTests.m | 12 +-- .../iPhoneOnly/CPTTextStylePlatformSpecific.h | 2 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 10 +-- 89 files changed, 466 insertions(+), 434 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 6ae8ae6be..244fc0763 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -35,7 +35,7 @@ @implementation CPTBarPlotPlugIn }; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary *)attributesForPropertyPortWithKey:(NSString *)key { // A few additional ports for the bar plot chart type ... @@ -201,14 +201,14 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; - CPTDictionary dict = [self valueForInputKey:key]; + CPTDictionary *dict = [self valueForInputKey:key]; if ( !dict ) { return nil; } - NSUInteger keyCount = [[dict allKeys] count]; - CPTMutableNumberArray array = [NSMutableArray array]; + NSUInteger keyCount = [[dict allKeys] count]; + CPTMutableNumberArray *array = [NSMutableArray array]; if ( fieldEnum == CPTBarPlotFieldBarLocation ) { // Calculate horizontal position of bar - nth bar index + barWidth*plotIndex + 0.5 diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index c38afa8f7..e49268ce4 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -60,14 +60,14 @@ -(QCPlugInViewController *)createViewController return nil; } -+(CPTStringArray)sortedPropertyPortKeys ++(CPTStringArray *)sortedPropertyPortKeys { - CPTStringArray pieChartPropertyPortKeys = @[@"inputPieRadius", @"inputSliceLabelOffset", @"inputStartAngle", @"inputSliceDirection", @"inputBorderColor", @"inputBorderWidth"]; + CPTStringArray *pieChartPropertyPortKeys = @[@"inputPieRadius", @"inputSliceLabelOffset", @"inputStartAngle", @"inputSliceDirection", @"inputBorderColor", @"inputBorderWidth"]; return [[super sortedPropertyPortKeys] arrayByAddingObjectsFromArray:pieChartPropertyPortKeys]; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary *)attributesForPropertyPortWithKey:(NSString *)key { // A few additional ports for the pie chart type ... if ( [key isEqualToString:@"inputPieRadius"] ) { @@ -105,16 +105,16 @@ +(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key }; } else if ( [key isEqualToString:@"inputBorderColor"] ) { - CGColorRef grayColor = CGColorCreateGenericGray(0.0, 1.0); - CPTDictionary result = @{ + CGColorRef grayColor = CGColorCreateGenericGray(0.0, 1.0); + CPTDictionary *result = @{ QCPortAttributeNameKey: @"Border Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(grayColor) }; return result; } else if ( [key isEqualToString:@"inputLabelColor"] ) { - CGColorRef grayColor = CGColorCreateGenericGray(1.0, 1.0); - CPTDictionary result = @{ + CGColorRef grayColor = CGColorCreateGenericGray(1.0, 1.0); + CPTDictionary *result = @{ QCPortAttributeNameKey: @"Label Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(grayColor) }; @@ -229,7 +229,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; - CPTDictionary dict = [self valueForInputKey:key]; + CPTDictionary *dict = [self valueForInputKey:key]; if ( dict ) { return [NSDecimalNumber decimalNumberWithString:[dict[[NSString stringWithFormat:@"%lu", (unsigned long)index]] stringValue]]; @@ -264,7 +264,7 @@ -(CPTTextLayer *)sliceLabelForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUI NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:pieChart]; NSString *key = [NSString stringWithFormat:@"plotLabels%lu", (unsigned long)plotIndex]; - CPTDictionary dict = [self valueForInputKey:key]; + CPTDictionary *dict = [self valueForInputKey:key]; if ( !dict ) { return nil; diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index 9dd7acb06..558dca9e2 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -210,8 +210,8 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; NSString *yKey = [NSString stringWithFormat:@"plotYNumbers%lu", (unsigned long)plotIndex]; - CPTDictionary xVals = [self valueForInputKey:xKey]; - CPTDictionary yVals = [self valueForInputKey:yKey]; + CPTDictionary *xVals = [self valueForInputKey:xKey]; + CPTDictionary *yVals = [self valueForInputKey:yKey]; if ( !xVals || !yVals ) { return 0; @@ -229,8 +229,8 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; NSString *yKey = [NSString stringWithFormat:@"plotYNumbers%lu", (unsigned long)plotIndex]; - CPTDictionary xVals = [self valueForInputKey:xKey]; - CPTDictionary yVals = [self valueForInputKey:yKey]; + CPTDictionary *xVals = [self valueForInputKey:xKey]; + CPTDictionary *yVals = [self valueForInputKey:yKey]; if ( !xVals || !yVals ) { return nil; @@ -239,7 +239,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return nil; } - CPTDictionary dict = (fieldEnum == CPTScatterPlotFieldX) ? xVals : yVals; + CPTDictionary *dict = (fieldEnum == CPTScatterPlotFieldX) ? xVals : yVals; NSString *dictionaryKey = [NSString stringWithFormat:@"%lu", (unsigned long)index]; diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index 043e6b292..7fa54bbdd 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -162,7 +162,7 @@ -(QCPlugInViewController *)createViewController #pragma mark - #pragma mark Input and output port configuration -+(CPTStringArray)sortedPropertyPortKeys ++(CPTStringArray *)sortedPropertyPortKeys { return @[@"inputPixelsWide", @"inputPixelsHigh", @@ -186,7 +186,7 @@ +(CPTStringArray)sortedPropertyPortKeys @"inputAxisMinorTickWidth"]; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(CPTDictionary *)attributesForPropertyPortWithKey:(NSString *)key { /* * Specify the optional attributes for property based ports (QCPortAttributeNameKey, QCPortAttributeDefaultValueKey...). @@ -253,8 +253,8 @@ +(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key } if ( [key isEqualToString:@"inputAxisColor"] ) { - CGColorRef axisColor = CGColorCreateGenericRGB(1.0, 1.0, 1.0, 1.0); - CPTDictionary result = @{ + CGColorRef axisColor = CGColorCreateGenericRGB(1.0, 1.0, 1.0, 1.0); + CPTDictionary *result = @{ QCPortAttributeNameKey: @"Axis Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(axisColor) }; @@ -319,7 +319,7 @@ +(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key if ( [key isEqualToString:@"inputPlotAreaColor"] ) { CGColorRef plotAreaColor = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 0.4); - CPTDictionary result = @{ + CPTDictionary *result = @{ QCPortAttributeNameKey: @"Plot Area Color", QCPortAttributeDefaultValueKey: CFBridgingRelease(plotAreaColor) }; @@ -671,7 +671,7 @@ -(void)setNumberOfPlots:(NSUInteger)number numberOfPlots = number; } -+(CPTStringArray)plugInKeys ++(CPTStringArray *)plugInKeys { return @[@"numberOfPlots"]; } @@ -795,7 +795,7 @@ -(BOOL)configureGraph @implementation CorePlotQCPlugIn(Execution) --(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArguments:(CPTDictionary)arguments +-(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArguments:(CPTDictionary *)arguments { // Configure the plot for drawing BOOL configurationCheck = [self configureGraph]; diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 794990de7..55b137b4b 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -6,6 +6,7 @@ To be determined. ## Details - **New**: Added a tvOS framework. +- **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/examples/AAPLot/APFinancialData.h b/examples/AAPLot/APFinancialData.h index 6ede21860..f0d7506c9 100644 --- a/examples/AAPLot/APFinancialData.h +++ b/examples/AAPLot/APFinancialData.h @@ -2,6 +2,6 @@ @interface NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; ++(CPTDictionary *)dictionaryWithCSVLine:(NSString *)csvLine; @end diff --git a/examples/AAPLot/APFinancialData.m b/examples/AAPLot/APFinancialData.m index 9598755e5..97cb6d45b 100644 --- a/examples/AAPLot/APFinancialData.m +++ b/examples/AAPLot/APFinancialData.m @@ -3,11 +3,11 @@ @implementation NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine ++(CPTDictionary *)dictionaryWithCSVLine:(NSString *)csvLine { - CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; + CPTStringArray *csvChunks = [csvLine componentsSeparatedByString:@","]; - CPTMutableDictionary csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; // Date,Open,High,Low,Close,Volume,Adj Close // 2009-06-08,143.82,144.23,139.43,143.85,33255400,143.85 diff --git a/examples/AAPLot/APYahooDataPuller.h b/examples/AAPLot/APYahooDataPuller.h index 123d6e07c..668729264 100644 --- a/examples/AAPLot/APYahooDataPuller.h +++ b/examples/AAPLot/APYahooDataPuller.h @@ -2,7 +2,7 @@ @class APYahooDataPuller; -typedef NSArray *CPTFinancialDataArray; +typedef NSArray *CPTFinancialDataArray; @protocol APYahooDataPullerDelegate diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 4f6c5d3c2..c179a7b11 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -64,9 +64,9 @@ -(void)setDelegate:(id)aDelegate } } --(CPTDictionary)plistRep +-(CPTDictionary *)plistRep { - CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = [self symbol]; rep[@"startDate"] = [self startDate]; @@ -87,7 +87,7 @@ -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag return success; } --(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(instancetype)initWithDictionary:(CPTDictionary *)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { self = [super init]; if ( self != nil ) { @@ -109,7 +109,7 @@ -(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *) -(NSString *)pathForSymbol:(NSString *)aSymbol { - CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + CPTStringArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; NSString *docPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; @@ -128,24 +128,24 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } //Always returns *something* --(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol +-(CPTDictionary *)dictionaryForSymbol:(NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; - CPTMutableDictionary localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + CPTMutableDictionary *localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; return localPlistDict; } -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { - CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; + CPTDictionary *cachedDictionary = [self dictionaryForSymbol:aSymbol]; if ( nil != cachedDictionary ) { return [self initWithDictionary:cachedDictionary targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } - CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = aSymbol; rep[@"startDate"] = aStartDate; rep[@"endDate"] = anEndDate; @@ -292,7 +292,7 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection [self parseCSVAndPopulate]; //see if we need to write to file - CPTDictionary dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; + CPTDictionary *dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; BOOL sameSymbol = NO; NSString *dictSymbol = dictionaryForSymbol[@"symbol"]; @@ -322,10 +322,10 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection -(void)parseCSVAndPopulate { - CPTStringArray csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + CPTStringArray *csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:[csvLines count]]; - CPTDictionary currentFinancial = nil; + CPTDictionary *currentFinancial = nil; NSString *line = nil; self.overallHigh = [NSDecimalNumber notANumber]; diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index 0a648c6ab..1acb26cf8 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -164,7 +164,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -189,7 +189,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -216,7 +216,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -241,7 +241,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -268,7 +268,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa double *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -311,7 +311,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa NSDecimal *nextValue = data.mutableBytes; for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = financialData[financialDataCount - i - 1]; + CPTDictionary *fData = financialData[financialDataCount - i - 1]; NSNumber *value; for ( NSUInteger fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { @@ -386,7 +386,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -411,7 +411,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -438,7 +438,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -463,7 +463,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -490,7 +490,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -533,7 +533,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary *fData = (CPTDictionary *)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m index efbdfc2ac..055417b65 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m @@ -13,7 +13,7 @@ @implementation CPTTestApp_iPadAppDelegate @synthesize window; @synthesize viewController; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary *)launchOptions { self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h index d41e34802..259b54096 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h @@ -10,7 +10,7 @@ @interface CPTTestApp_iPadViewController : UIViewController -@property (nonatomic, readwrite, strong) CPTNumberArray dataForChart; +@property (nonatomic, readwrite, strong) CPTNumberArray *dataForChart; @property (nonatomic, readwrite, strong) NSArray *dataForPlot; // Plot construction methods diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 1e92e8e73..916c90b0a 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -254,8 +254,8 @@ -(void)constructBarChart // Define some custom labels for the data elements x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; - CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index 2671da8c5..0d33b6bef 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -76,6 +76,20 @@ remoteGlobalIDString = C38A09C41A4619A900D45436; remoteInfo = "CorePlot-CocoaTouchTests"; }; + C3CBFB691BE5874200519EE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C3CBFB6B1BE5874200519EE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -147,6 +161,8 @@ C371E4D31BB714EC00AC18DB /* UnitTests iOS.xctest */, C371E4D51BB714EC00AC18DB /* libCorePlot-CocoaTouch.a */, C371E4D71BB714EC00AC18DB /* CorePlot-CocoaTouchTests.xctest */, + C3CBFB6A1BE5874200519EE8 /* CorePlot.framework */, + C3CBFB6C1BE5874200519EE8 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -276,7 +292,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = NO; - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0710; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp" */; compatibilityVersion = "Xcode 6.3"; @@ -346,6 +362,20 @@ remoteRef = C371E4D61BB714EC00AC18DB /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3CBFB6A1BE5874200519EE8 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3CBFB691BE5874200519EE8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3CBFB6C1BE5874200519EE8 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C3CBFB6B1BE5874200519EE8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -450,6 +480,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 92c910ad3..f58fb37d2 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -469,7 +469,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - CPTNumberArray anchorPoint = @[x, y]; + CPTNumberArray *anchorPoint = @[x, y]; // Add annotation // First make a string for the y value @@ -510,9 +510,9 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index // Determine point of symbol in plot coordinates - NSNumber *x = @0; - NSNumber *y = [self numberForPlot:plot field:0 recordIndex:index]; - CPTNumberArray anchorPoint = @[x, @(index)]; + NSNumber *x = @0; + NSNumber *y = [self numberForPlot:plot field:0 recordIndex:index]; + CPTNumberArray *anchorPoint = @[x, @(index)]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index 0b50f831b..db84990ae 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -18,7 +18,7 @@ @implementation AppDelegate @synthesize window; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary *)launchOptions { [[PlotGallery sharedPlotGallery] sortByTitle]; diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index ba76fc8c3..3eec631e3 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -15,7 +15,7 @@ @interface ThemeTableViewController() -@property (nonatomic, readwrite, strong) CPTMutableStringArray themes; +@property (nonatomic, readwrite, strong) CPTMutableStringArray *themes; @end @@ -27,7 +27,7 @@ @implementation ThemeTableViewController -(void)setupThemes { - CPTMutableStringArray themeList = [[NSMutableArray alloc] init]; + CPTMutableStringArray *themeList = [[NSMutableArray alloc] init]; [themeList addObject:kThemeTableViewControllerDefaultTheme]; [themeList addObject:kThemeTableViewControllerNoTheme]; diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index a8904e4f4..0b2c581d3 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -273,7 +273,7 @@ -(NSUInteger)numberOfGroupsInImageBrowser:(IKImageBrowserView *)aBrowser return [[PlotGallery sharedPlotGallery] numberOfSections]; } --(CPTDictionary)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index +-(CPTDictionary *)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index { NSString *groupTitle = [[PlotGallery sharedPlotGallery] sectionTitles][index]; diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 188cdee00..613e37d77 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -2,7 +2,7 @@ @interface ColoredBarChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray *plotData; @end @@ -28,7 +28,7 @@ -(instancetype)init -(void)generateData { if ( self.plotData == nil ) { - CPTMutableNumberArray contentArray = [NSMutableArray array]; + CPTMutableNumberArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { [contentArray addObject:@(10.0 * arc4random() / (double)UINT32_MAX + 5.0)]; } @@ -146,7 +146,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { - CPTNumberArray nums = nil; + CPTNumberArray *nums = nil; switch ( fieldEnum ) { case CPTBarPlotFieldBarLocation: diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.h b/examples/CorePlotGallery/src/plots/CompositePlot.h index 8a1ef49ec..13d2742d3 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.h +++ b/examples/CorePlotGallery/src/plots/CompositePlot.h @@ -10,7 +10,7 @@ CPTScatterPlotDelegate, CPTBarPlotDelegate> -@property (readwrite, strong, nonatomic) CPTMutableNumberArray dataForChart; +@property (readwrite, strong, nonatomic) CPTMutableNumberArray *dataForChart; @property (readwrite, strong, nonatomic) NSMutableArray *dataForPlot; -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 15e318092..3184a4503 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -358,8 +358,8 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( x.labelOffset = 2.0; x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; - CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index e7ae2eee9..c932135a2 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -9,7 +9,7 @@ @interface ControlChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray *plotData; @property (nonatomic, readwrite, assign) double meanValue; @property (nonatomic, readwrite, assign) double standardError; @@ -39,7 +39,7 @@ -(instancetype)init -(void)generateData { if ( self.plotData == nil ) { - CPTMutableNumberArray contentArray = [NSMutableArray array]; + CPTMutableNumberArray *contentArray = [NSMutableArray array]; double sum = 0.0; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index f01c390f2..a50b33ecf 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -384,7 +384,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - CPTNumberArray anchorPoint = @[x, y]; + CPTNumberArray *anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index f4288de77..bc9b3c466 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -5,7 +5,7 @@ @interface DonutChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray *plotData; @end diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 1b01cc51d..de55b6f37 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -139,7 +139,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP CPTScatterPlot *linePlot = [[CPTScatterPlot alloc] init]; linePlot.identifier = [NSString stringWithFormat:@"Function Plot %lu", (unsigned long)(plotNum + 1)]; - CPTDictionary textAttributes = x.titleTextStyle.attributes; + CPTDictionary *textAttributes = x.titleTextStyle.attributes; NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:titleString attributes:textAttributes]; @@ -212,7 +212,7 @@ -(UIFont *)italicFontForFont:(UIFont *)oldFont { NSString *italicName = nil; - CPTStringArray fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; + CPTStringArray *fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; for ( NSString *fontName in fontNames ) { NSString *upperCaseFontName = [fontName uppercaseString]; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index bb3075dea..488caa182 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -249,7 +249,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - CPTNumberArray anchorPoint = @[x, y]; + CPTNumberArray *anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index ab2ffc431..31949c2bc 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -70,9 +70,9 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP axisTitleTextStyle.fontName = @"Helvetica-Bold"; // Tick locations - CPTNumberSet majorTickLocations = [NSSet setWithObjects:@0, @30, @50, @85, @100, nil]; + CPTNumberSet *majorTickLocations = [NSSet setWithObjects:@0, @30, @50, @85, @100, nil]; - CPTMutableNumberSet minorTickLocations = [NSMutableSet set]; + CPTMutableNumberSet *minorTickLocations = [NSMutableSet set]; for ( NSUInteger loc = 0; loc <= 100; loc += 10 ) { [minorTickLocations addObject:@(loc)]; } diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index fb55db37b..9e29b102b 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -13,7 +13,7 @@ @interface RealTimePlot() -@property (nonatomic, readwrite, strong) CPTMutableNumberArray plotData; +@property (nonatomic, readwrite, strong) CPTMutableNumberArray *plotData; @property (nonatomic, readwrite, assign) NSUInteger currentIndex; @property (nonatomic, readwrite, strong) NSTimer *dataTimer; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index dbe5d8f70..746eedff2 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -7,7 +7,7 @@ @interface SimplePieChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong) CPTNumberArray *plotData; @property (nonatomic, readwrite) NSUInteger offsetIndex; @property (nonatomic, readwrite) CGFloat sliceOffset; @@ -135,8 +135,8 @@ -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)in self.offsetIndex = NSNotFound; - CPTMutableNumberArray newData = [[NSMutableArray alloc] init]; - NSUInteger dataCount = (NSUInteger)lrint( ceil(10.0 * arc4random() / (double)UINT32_MAX) ) + 1; + CPTMutableNumberArray *newData = [[NSMutableArray alloc] init]; + NSUInteger dataCount = (NSUInteger)lrint( ceil(10.0 * arc4random() / (double)UINT32_MAX) ) + 1; for ( NSUInteger i = 1; i < dataCount; i++ ) { [newData addObject:@(100.0 * arc4random() / (double)UINT32_MAX)]; } diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 3fa95c55f..39369fb22 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -240,7 +240,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS NSNumber *x = dataPoint[@"x"]; NSNumber *y = dataPoint[@"y"]; - CPTNumberArray anchorPoint = @[x, y]; + CPTNumberArray *anchorPoint = @[x, y]; // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index 24e115782..f5f52898e 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -221,7 +221,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP theLegend.paddingRight = textSize * CPTFloat(0.375); theLegend.paddingBottom = textSize * CPTFloat(0.375); - CPTNumberArray plotPoint = (kUseHorizontalBars ? @[@95, @0] : @[@0, @95]); + CPTNumberArray *plotPoint = (kUseHorizontalBars ? @[@95, @0] : @[@0, @95]); CPTPlotSpaceAnnotation *legendAnnotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:barPlotSpace anchorPlotPoint:plotPoint]; legendAnnotation.contentLayer = theLegend; @@ -263,7 +263,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index NSNumber *x = @(index); NSNumber *y = @2; - CPTNumberArray anchorPoint = (kUseHorizontalBars ? @[y, x] : @[x, y]); + CPTNumberArray *anchorPoint = (kUseHorizontalBars ? @[y, x] : @[x, y]); // Add annotation // First make a string for the y value diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.h b/examples/CorePlotGallery/src/shared/PlotGallery.h index fb70203f1..fb6fcdbb4 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.h +++ b/examples/CorePlotGallery/src/shared/PlotGallery.h @@ -9,7 +9,7 @@ @property (nonatomic, readonly) NSUInteger count; @property (nonatomic, readonly) NSUInteger numberOfSections; -@property (nonatomic, readonly, strong) CPTStringArray sectionTitles; +@property (nonatomic, readonly, strong) CPTStringArray *sectionTitles; +(PlotGallery *)sharedPlotGallery; diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index bdf1addb5..6bd7d0abd 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -105,7 +105,7 @@ -(void)sortByTitle [self.plotItems sortUsingSelector:@selector(titleCompare:)]; } --(CPTStringArray)sectionTitles +-(CPTStringArray *)sectionTitles { return [[self.plotSections allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; } diff --git a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m index fdbb63e84..da71fe799 100644 --- a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m @@ -15,7 +15,7 @@ @interface ThemeTableViewControllerTV() -@property (nonatomic, readwrite, strong) CPTMutableStringArray themes; +@property (nonatomic, readwrite, strong) CPTMutableStringArray *themes; @end @@ -27,7 +27,7 @@ @implementation ThemeTableViewControllerTV -(void)setupThemes { - CPTMutableStringArray themeList = [[NSMutableArray alloc] init]; + CPTMutableStringArray *themeList = [[NSMutableArray alloc] init]; [themeList addObject:kThemeTableViewControllerDefaultTheme]; [themeList addObject:kThemeTableViewControllerNoTheme]; diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 96ecb9f84..21d96eb28 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -163,13 +163,13 @@ -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *_ // Read headers from the first line of the file [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; // currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); -// CPTStringArray columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; +// CPTStringArray * columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; // NSLog([columnHeaders objectAtIndex:0]); while ( lineEnd < length ) { [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); - CPTStringArray columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; + CPTStringArray *columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; double xValue = [columnValues[0] doubleValue]; double yValue = [columnValues[1] doubleValue]; @@ -411,8 +411,8 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)e double start[2]; [self.graph.defaultPlotSpace doublePrecisionPlotPoint:start numberOfCoordinates:2 forPlotAreaViewPoint:dragStartInPlotArea]; - CPTNumberArray anchorPoint = @[@(start[CPTCoordinateX]), - @(start[CPTCoordinateY])]; + CPTNumberArray *anchorPoint = @[@(start[CPTCoordinateX]), + @(start[CPTCoordinateY])]; // now create the annotation CPTPlotSpace *defaultSpace = self.graph.defaultPlotSpace; diff --git a/examples/DropPlot/NSString+ParseCSV.h b/examples/DropPlot/NSString+ParseCSV.h index 050b88e4e..2258c2636 100644 --- a/examples/DropPlot/NSString+ParseCSV.h +++ b/examples/DropPlot/NSString+ParseCSV.h @@ -3,6 +3,6 @@ @interface NSString(ParseCSV) --(CPTStringArray)arrayByParsingCSVLine; +-(CPTStringArray *)arrayByParsingCSVLine; @end diff --git a/examples/DropPlot/NSString+ParseCSV.m b/examples/DropPlot/NSString+ParseCSV.m index d3b604b98..c3d2b4b8d 100644 --- a/examples/DropPlot/NSString+ParseCSV.m +++ b/examples/DropPlot/NSString+ParseCSV.m @@ -2,12 +2,12 @@ @implementation NSString(ParseCSV) --(CPTStringArray)arrayByParsingCSVLine +-(CPTStringArray *)arrayByParsingCSVLine { BOOL isRemoveWhitespace = YES; - CPTMutableStringArray theArray = [NSMutableArray array]; - CPTStringArray theFields = [self componentsSeparatedByString:@","]; + CPTMutableStringArray *theArray = [NSMutableArray array]; + CPTStringArray *theFields = [self componentsSeparatedByString:@","]; NSCharacterSet *quotedCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"\""]; NSMutableString *theConcatenatedField = [NSMutableString string]; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.h b/examples/StockPlot/Classes/APYahooDataPuller.h index 0185dd8d0..96162db43 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.h +++ b/examples/StockPlot/Classes/APYahooDataPuller.h @@ -2,7 +2,7 @@ @class APYahooDataPuller; -typedef NSArray *CPTFinancialDataArray; +typedef NSArray *CPTFinancialDataArray; @protocol APYahooDataPullerDelegate diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index a3b6a559a..576bb536d 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -47,9 +47,9 @@ @implementation APYahooDataPuller @synthesize delegate; //convert any NSNumber in financial line to NSDecimalNumber --(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine +-(CPTDictionary *)sanitizedFinancialLine:(CPTDictionary *)theFinancialLine { - CPTMutableDictionary aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; + CPTMutableDictionary *aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; for ( id key in [aFinancialLine allKeys] ) { id something = aFinancialLine[key]; @@ -67,12 +67,12 @@ -(void)setFinancialData:(NSArray *)aFinancialData if ( financialData != aFinancialData ) { NSMutableArray *mutableFinancialData = [aFinancialData mutableCopy]; - CPTDictionary financialLine = nil; + CPTDictionary *financialLine = nil; NSUInteger count = mutableFinancialData.count; for ( NSUInteger i = 0; i < count; i++ ) { - financialLine = (CPTDictionary)mutableFinancialData[i]; + financialLine = (CPTDictionary *)mutableFinancialData[i]; financialLine = [self sanitizedFinancialLine:financialLine]; mutableFinancialData[i] = financialLine; } @@ -84,9 +84,9 @@ -(void)setFinancialData:(NSArray *)aFinancialData } } --(CPTDictionary)plistRep +-(CPTDictionary *)plistRep { - CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = [self symbol]; rep[@"startDate"] = [self startDate]; @@ -105,7 +105,7 @@ -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag return success; } --(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(instancetype)initWithDictionary:(CPTDictionary *)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { self = [super init]; if ( self != nil ) { @@ -125,7 +125,7 @@ -(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *) -(NSString *)pathForSymbol:(NSString *)aSymbol { - CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + CPTStringArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; NSString *docPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; @@ -144,24 +144,24 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } //Always returns *something* --(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol +-(CPTDictionary *)dictionaryForSymbol:(NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; - CPTMutableDictionary localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + CPTMutableDictionary *localPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; return localPlistDict; } -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate { - CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; + CPTDictionary *cachedDictionary = [self dictionaryForSymbol:aSymbol]; if ( nil != cachedDictionary ) { return [self initWithDictionary:cachedDictionary targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } - CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; rep[@"symbol"] = aSymbol; rep[@"startDate"] = aStartDate; rep[@"endDate"] = anEndDate; @@ -318,7 +318,7 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection -(void)populateWithString:(NSString *)csv { - CPTStringArray csvLines = [csv componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + CPTStringArray *csvLines = [csv componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:csvLines.count]; NSDictionary *currentFinancial = nil; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index c855ea68e..3adbef4c7 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -129,7 +129,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI else if ( fieldEnum == CPTScatterPlotFieldY ) { CPTFinancialDataArray financialData = self.dataPuller.financialData; - CPTDictionary fData = financialData[[financialData count] - index - 1]; + CPTDictionary *fData = financialData[[financialData count] - index - 1]; num = fData[@"close"]; NSAssert([num isMemberOfClass:[NSDecimalNumber class]], @"grrr"); } diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h index 6ede21860..f0d7506c9 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h @@ -2,6 +2,6 @@ @interface NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; ++(CPTDictionary *)dictionaryWithCSVLine:(NSString *)csvLine; @end diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 355e1db9d..5d1189974 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -25,11 +25,11 @@ +(NSDateFormatter *)yahooCSVDateFormatter @implementation NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine ++(CPTDictionary *)dictionaryWithCSVLine:(NSString *)csvLine { - CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; + CPTStringArray *csvChunks = [csvLine componentsSeparatedByString:@","]; - CPTMutableDictionary csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; + CPTMutableDictionary *csvDict = [NSMutableDictionary dictionaryWithCapacity:7]; // Date,Open,High,Low,Close,Volume,Adj Close // 2009-06-08,143.82,144.23,139.43,143.85,33255400,143.85 diff --git a/examples/StockPlot/Classes/RootViewController.h b/examples/StockPlot/Classes/RootViewController.h index c1559f3ef..33af63bd2 100644 --- a/examples/StockPlot/Classes/RootViewController.h +++ b/examples/StockPlot/Classes/RootViewController.h @@ -12,7 +12,7 @@ @interface RootViewController : UITableViewController -@property (nonatomic, readonly, strong) CPTStringArray symbols; +@property (nonatomic, readonly, strong) CPTStringArray *symbols; -(void)addSymbol:(NSString *)aSymbol; diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index c2561bf62..257f73b93 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -187,10 +187,10 @@ -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie #pragma mark - #pragma mark accessors --(CPTStringArray)symbols +-(CPTStringArray *)symbols { //NSLog(@"in -symbols, returned symbols = %@", symbols); - CPTMutableStringArray symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; + CPTMutableStringArray *symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; for ( APYahooDataPuller *dp in self.stocks ) { [symbols addObject:[dp symbol]]; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 9a6763a2b..7bde24845 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -957,7 +957,7 @@ 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableLineStyle.h; sourceTree = ""; }; 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableLineStyle.m; sourceTree = ""; }; 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTGraph.h; sourceTree = ""; }; + 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGraph.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D760F2B723A002FCEA7 /* CPTPlotAreaFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotAreaFrame.h; sourceTree = ""; }; 07BF0D770F2B723A002FCEA7 /* CPTPlotAreaFrame.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotAreaFrame.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -969,7 +969,7 @@ 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisSet.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTScatterPlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDefinitions.h; sourceTree = ""; }; + 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTDefinitions.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDefinitions.m; sourceTree = ""; }; 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableTextStyle.h; sourceTree = ""; }; 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableTextStyle.m; sourceTree = ""; }; @@ -1006,8 +1006,8 @@ 4C97EF10104D819100B554F9 /* CPTMutableNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableNumericData.h; sourceTree = ""; }; 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableNumericData.m; sourceTree = ""; }; 4C97EF4C104D843E00B554F9 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license.txt; sourceTree = ""; }; - 4C9A745D0FB24C7200918464 /* CPTDataSourceTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDataSourceTestCase.h; sourceTree = ""; }; - 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDataSourceTestCase.m; sourceTree = ""; }; + 4C9A745D0FB24C7200918464 /* CPTDataSourceTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTDataSourceTestCase.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTDataSourceTestCase.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4CD23FFA0FFBE78400ADD2E2 /* CPTAxisLabelTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelTests.h; sourceTree = ""; }; 4CD23FFB0FFBE78400ADD2E2 /* CPTAxisLabelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTAxisLabelTests.m; sourceTree = ""; }; 4CD7E7E50F4B4F8200F9BCBB /* CPTTextLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTextLayer.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -1131,8 +1131,8 @@ C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDebugQuickLook.h; sourceTree = ""; }; C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelGroup.h; sourceTree = ""; }; C3C032C810B8DEDC003A11B6 /* CPTAxisLabelGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisLabelGroup.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - C3C1C07E1790D3B400E8B1B7 /* CPTLayerTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTLayerTests.h; sourceTree = ""; }; - C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTLayerTests.m; sourceTree = ""; }; + C3C1C07E1790D3B400E8B1B7 /* CPTLayerTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLayerTests.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLayerTests.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C2846F16584EB9006BA43C /* CPTAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3C2847016584EB9006BA43C /* CPTAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationTimingFunctions.h; sourceTree = ""; }; diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index d34e101a7..894f22bc5 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -461,8 +461,8 @@ -(void)resetCursorRects **/ -(void)plotSpaceAdded:(NSNotification *)notification { - CPTDictionary userInfo = notification.userInfo; - CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; + CPTDictionary *userInfo = notification.userInfo; + CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; [space addObserver:self forKeyPath:@"isDragging" @@ -475,8 +475,8 @@ -(void)plotSpaceAdded:(NSNotification *)notification **/ -(void)plotSpaceRemoved:(NSNotification *)notification { - CPTDictionary userInfo = notification.userInfo; - CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; + CPTDictionary *userInfo = notification.userInfo; + CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; [space removeObserver:self forKeyPath:@"isDragging" context:CPTGraphHostingViewKVOContext]; [self.window invalidateCursorRectsForView:self]; @@ -513,7 +513,7 @@ -(void)viewWillMoveToSuperview:(NSView *)newSuperview /// @cond --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(CPTDictionary)change context:(void *)context +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(CPTDictionary *)change context:(void *)context { if ( context == CPTGraphHostingViewKVOContext ) { CPTGraph *theGraph = self.hostedGraph; diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index b6ed84fda..adead6796 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -6,7 +6,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary attributes +/** @property CPTDictionary * attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -32,7 +32,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -82,9 +82,9 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes /// @cond --(CPTDictionary)attributes +-(CPTDictionary *)attributes { - CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; + CPTMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; // Font NSFont *styleFont = nil; @@ -127,7 +127,7 @@ @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtension /// @cond -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -199,7 +199,7 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style CGSize textSize; if ( theFont ) { - CPTDictionary attributes = @{ + CPTDictionary *attributes = @{ NSFontAttributeName: theFont }; @@ -246,7 +246,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CG paragraphStyle.alignment = (NSTextAlignment)style.textAlignment; paragraphStyle.lineBreakMode = style.lineBreakMode; - CPTDictionary attributes = @{ + CPTDictionary *attributes = @{ NSFontAttributeName: theFont, NSForegroundColorAttributeName: foregroundColor, NSParagraphStyleAttributeName: paragraphStyle diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 49956f5bd..46749b088 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -26,7 +26,7 @@ @interface CPTAnimation() +(nonnull SEL)setterFromProperty:(nonnull NSString *)property; -(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve; --(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters; +-(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary *)parameters; -(void)startTimer; -(void)cancelTimer; @@ -266,8 +266,8 @@ -(void)update CPTMutableAnimationArray runningOperations = self.runningAnimationOperations; CPTMutableAnimationArray expiredOperations = [[NSMutableArray alloc] init]; - CGFloat currentTime = self.timeOffset; - CPTStringArray runModes = @[NSRunLoopCommonModes]; + CGFloat currentTime = self.timeOffset; + CPTStringArray *runModes = @[NSRunLoopCommonModes]; dispatch_queue_t mainQueue = dispatch_get_main_queue(); @@ -335,7 +335,7 @@ -(void)update CGFloat progress = timingFunction(currentTime - startTime, duration); - CPTDictionary parameters = @{ + CPTDictionary *parameters = @{ CPTAnimationOperationKey: animationOperation, CPTAnimationValueKey: [period tweenedValueForProgress:progress], CPTAnimationStartedKey: @(started), @@ -367,7 +367,7 @@ -(void)update } // This method must be called from the main thread. --(void)updateOnMainThreadWithParameters:(CPTDictionary)parameters +-(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters { CPTAnimationOperation *animationOperation = parameters[CPTAnimationOperationKey]; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index b15f915b7..9c978d4db 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -70,7 +70,7 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; * @param locations The locations of the major ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(nonnull CPTNumberSet)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateAxisLabelsAtLocations:(nonnull CPTNumberSet *)locations; /** @brief @optional This method gives the delegate a chance to create custom labels for each minor tick. * It can be used with any labeling policy. Returning @NO will cause the axis not @@ -79,7 +79,7 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; * @param locations The locations of the minor ticks. * @return @YES if the axis class should proceed with automatic labeling. **/ --(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(nonnull CPTNumberSet)locations; +-(BOOL)axis:(nonnull CPTAxis *)axis shouldUpdateMinorAxisLabelsAtLocations:(nonnull CPTNumberSet *)locations; /// @} @@ -249,7 +249,7 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; @property (nonatomic, readwrite, strong, nullable) NSNumber *majorIntervalLength; @property (nonatomic, readwrite, assign) CGFloat majorTickLength; @property (nonatomic, readwrite, copy, nullable) CPTLineStyle *majorTickLineStyle; -@property (nonatomic, readwrite, strong, nullable) CPTNumberSet majorTickLocations; +@property (nonatomic, readwrite, strong, nullable) CPTNumberSet *majorTickLocations; @property (nonatomic, readwrite, assign) NSUInteger preferredNumberOfMajorTicks; /// @} @@ -258,7 +258,7 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; @property (nonatomic, readwrite, assign) NSUInteger minorTicksPerInterval; @property (nonatomic, readwrite, assign) CGFloat minorTickLength; @property (nonatomic, readwrite, copy, nullable) CPTLineStyle *minorTickLineStyle; -@property (nonatomic, readwrite, strong, nullable) CPTNumberSet minorTickLocations; +@property (nonatomic, readwrite, strong, nullable) CPTNumberSet *minorTickLocations; /// @} /// @name Grid Lines @@ -303,8 +303,8 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; /// @name Ticks /// @{ --(nullable CPTNumberSet)filteredMajorTickLocations:(nullable CPTNumberSet)allLocations; --(nullable CPTNumberSet)filteredMinorTickLocations:(nullable CPTNumberSet)allLocations; +-(nullable CPTNumberSet *)filteredMajorTickLocations:(nullable CPTNumberSet *)allLocations; +-(nullable CPTNumberSet *)filteredMinorTickLocations:(nullable CPTNumberSet *)allLocations; /// @} /// @name Background Bands diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 1a5a18916..a5ce88dd1 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -43,11 +43,11 @@ @interface CPTAxis() @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @property (nonatomic, readwrite, assign) BOOL labelsUpdated; --(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; --(void)autoGenerateMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; --(void)generateEqualMajorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __nonnull __autoreleasing *)newMinorLocations; --(nullable CPTNumberSet)filteredTickLocations:(nullable CPTNumberSet)allLocations; --(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; +-(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMinorLocations; +-(void)autoGenerateMajorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMinorLocations; +-(void)generateEqualMajorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__nonnull __autoreleasing *)newMinorLocations; +-(nullable CPTNumberSet *)filteredTickLocations:(nullable CPTNumberSet *)allLocations; +-(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet *)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels; -(void)updateCustomTickLabels; -(void)updateMajorTickLabelOffsets; -(void)updateMinorTickLabelOffsets; @@ -341,7 +341,7 @@ @implementation CPTAxis **/ @synthesize majorTickLength; -/** @property CPTNumberSet majorTickLocations +/** @property CPTNumberSet * majorTickLocations * @brief A set of axis coordinates for all major tick marks. **/ @synthesize majorTickLocations; @@ -372,7 +372,7 @@ @implementation CPTAxis **/ @synthesize minorTickLength; -/** @property CPTNumberSet minorTickLocations +/** @property CPTNumberSet * minorTickLocations * @brief A set of axis coordinates for all minor tick marks. **/ @synthesize minorTickLocations; @@ -870,10 +870,10 @@ +(BOOL)needsDisplayForKey:(NSString *)aKey * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations +-(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet *__autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__autoreleasing *)newMinorLocations { - CPTMutableNumberSet majorLocations = [NSMutableSet set]; - CPTMutableNumberSet minorLocations = [NSMutableSet set]; + CPTMutableNumberSet *majorLocations = [NSMutableSet set]; + CPTMutableNumberSet *minorLocations = [NSMutableSet set]; NSDecimal zero = CPTDecimalFromInteger(0); NSDecimal majorInterval = self.majorIntervalLength.decimalValue; @@ -950,11 +950,11 @@ -(void)generateFixedIntervalMajorTickLocations:(CPTNumberSet __autoreleasing *)n * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)autoGenerateMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations +-(void)autoGenerateMajorTickLocations:(CPTNumberSet *__autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__autoreleasing *)newMinorLocations { // Create sets for locations - CPTMutableNumberSet majorLocations = [NSMutableSet set]; - CPTMutableNumberSet minorLocations = [NSMutableSet set]; + CPTMutableNumberSet *majorLocations = [NSMutableSet set]; + CPTMutableNumberSet *minorLocations = [NSMutableSet set]; // Get plot range CPTMutablePlotRange *range = [[self.plotSpace plotRangeForCoordinate:self.coordinate] mutableCopy]; @@ -1245,10 +1245,10 @@ -(void)autoGenerateMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLo * @param newMajorLocations A new NSSet containing the major tick locations. * @param newMinorLocations A new NSSet containing the minor tick locations. */ --(void)generateEqualMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet __autoreleasing *)newMinorLocations +-(void)generateEqualMajorTickLocations:(CPTNumberSet *__autoreleasing *)newMajorLocations minorTickLocations:(CPTNumberSet *__autoreleasing *)newMinorLocations { - CPTMutableNumberSet majorLocations = [NSMutableSet set]; - CPTMutableNumberSet minorLocations = [NSMutableSet set]; + CPTMutableNumberSet *majorLocations = [NSMutableSet set]; + CPTMutableNumberSet *minorLocations = [NSMutableSet set]; CPTMutablePlotRange *range = [[self.plotSpace plotRangeForCoordinate:self.coordinate] mutableCopy]; @@ -1404,12 +1404,12 @@ NSDecimal CPTNiceLength(NSDecimal length) * @param allLocations A set of tick locations. * @return The filtered set of tick locations. */ --(CPTNumberSet)filteredTickLocations:(CPTNumberSet)allLocations +-(CPTNumberSet *)filteredTickLocations:(CPTNumberSet *)allLocations { CPTPlotRangeArray exclusionRanges = self.labelExclusionRanges; if ( exclusionRanges ) { - CPTMutableNumberSet filteredLocations = [allLocations mutableCopy]; + CPTMutableNumberSet *filteredLocations = [allLocations mutableCopy]; for ( CPTPlotRange *range in exclusionRanges ) { for ( NSNumber *location in allLocations ) { if ( [range containsNumber:location] ) { @@ -1430,7 +1430,7 @@ -(CPTNumberSet)filteredTickLocations:(CPTNumberSet)allLocations * @param allLocations A set of major tick locations. * @return The filtered set. **/ --(CPTNumberSet)filteredMajorTickLocations:(CPTNumberSet)allLocations +-(CPTNumberSet *)filteredMajorTickLocations:(CPTNumberSet *)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1439,7 +1439,7 @@ -(CPTNumberSet)filteredMajorTickLocations:(CPTNumberSet)allLocations * @param allLocations A set of minor tick locations. * @return The filtered set. **/ --(CPTNumberSet)filteredMinorTickLocations:(CPTNumberSet)allLocations +-(CPTNumberSet *)filteredMinorTickLocations:(CPTNumberSet *)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1475,7 +1475,7 @@ -(CGFloat)tickOffset * @param labeledRange A plot range used to filter the generated labels. If @nil, no filtering is done. * @param useMajorAxisLabels If @YES, label the major ticks, otherwise label the minor ticks. **/ --(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels +-(void)updateAxisLabelsAtLocations:(CPTNumberSet *)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels { CPTAlignment theLabelAlignment; CPTSign theLabelDirection; @@ -1531,9 +1531,9 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange return; } - CPTDictionary textAttributes = [theLabelTextStyle attributes]; - BOOL hasAttributedFormatter = ([theLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] - withDefaultAttributes:textAttributes] != nil); + CPTDictionary *textAttributes = [theLabelTextStyle attributes]; + BOOL hasAttributedFormatter = ([theLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] + withDefaultAttributes:textAttributes] != nil); CPTPlotSpace *thePlotSpace = self.plotSpace; CPTCoordinate myCoordinate = self.coordinate; @@ -1670,8 +1670,8 @@ -(void)relabel return; } - CPTNumberSet newMajorLocations = nil; - CPTNumberSet newMinorLocations = nil; + CPTNumberSet *newMajorLocations = nil; + CPTNumberSet *newMinorLocations = nil; switch ( self.labelingPolicy ) { case CPTAxisLabelingPolicyNone: @@ -2523,7 +2523,7 @@ -(void)setNeedsRelabel:(BOOL)newNeedsRelabel } } --(void)setMajorTickLocations:(CPTNumberSet)newLocations +-(void)setMajorTickLocations:(CPTNumberSet *)newLocations { if ( newLocations != majorTickLocations ) { majorTickLocations = newLocations; @@ -2540,7 +2540,7 @@ -(void)setMajorTickLocations:(CPTNumberSet)newLocations } } --(void)setMinorTickLocations:(CPTNumberSet)newLocations +-(void)setMinorTickLocations:(CPTNumberSet *)newLocations { if ( newLocations != minorTickLocations ) { minorTickLocations = newLocations; diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index b7d0fcd42..de05cf64a 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -36,9 +36,9 @@ /// @cond @interface CPTBarPlot() -@property (nonatomic, readwrite, copy) CPTNumberArray barLocations; -@property (nonatomic, readwrite, copy) CPTNumberArray barTips; -@property (nonatomic, readwrite, copy) CPTNumberArray barBases; +@property (nonatomic, readwrite, copy) CPTNumberArray *barLocations; +@property (nonatomic, readwrite, copy) CPTNumberArray *barTips; +@property (nonatomic, readwrite, copy) CPTNumberArray *barBases; @property (nonatomic, readwrite, copy) CPTFillArray barFills; @property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @@ -1470,32 +1470,32 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(CPTNumberArray)barTips +-(CPTNumberArray *)barTips { return [[self cachedNumbersForField:CPTBarPlotFieldBarTip] sampleArray]; } --(void)setBarTips:(CPTNumberArray)newTips +-(void)setBarTips:(CPTNumberArray *)newTips { [self cacheNumbers:newTips forField:CPTBarPlotFieldBarTip]; } --(CPTNumberArray)barBases +-(CPTNumberArray *)barBases { return [[self cachedNumbersForField:CPTBarPlotFieldBarBase] sampleArray]; } --(void)setBarBases:(CPTNumberArray)newBases +-(void)setBarBases:(CPTNumberArray *)newBases { [self cacheNumbers:newBases forField:CPTBarPlotFieldBarBase]; } --(CPTNumberArray)barLocations +-(CPTNumberArray *)barLocations { return [[self cachedNumbersForField:CPTBarPlotFieldBarLocation] sampleArray]; } --(void)setBarLocations:(CPTNumberArray)newLocations +-(void)setBarLocations:(CPTNumberArray *)newLocations { [self cacheNumbers:newLocations forField:CPTBarPlotFieldBarLocation]; } @@ -1615,16 +1615,16 @@ -(NSUInteger)numberOfFields return 3; } --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[@(CPTBarPlotFieldBarLocation), @(CPTBarPlotFieldBarTip), @(CPTBarPlotFieldBarBase)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - CPTNumberArray result = nil; + CPTNumberArray *result = nil; switch ( coord ) { case CPTCoordinateX: diff --git a/framework/Source/CPTDataSourceTestCase.h b/framework/Source/CPTDataSourceTestCase.h index cdd05cbbb..62b7b9a40 100644 --- a/framework/Source/CPTDataSourceTestCase.h +++ b/framework/Source/CPTDataSourceTestCase.h @@ -6,8 +6,8 @@ @interface CPTDataSourceTestCase : CPTTestCase -@property (nonatomic, readwrite, copy) CPTNumberArray xData; -@property (nonatomic, readwrite, copy) CPTNumberArray yData; +@property (nonatomic, readwrite, copy) CPTNumberArray *xData; +@property (nonatomic, readwrite, copy) CPTNumberArray *yData; @property (nonatomic, readwrite, assign) NSUInteger nRecords; @property (nonatomic, readonly, strong) CPTPlotRange *xRange; @property (nonatomic, readonly, strong) CPTPlotRange *yRange; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 9f1d87e58..7ab6f8db3 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -10,7 +10,7 @@ /// @cond @interface CPTDataSourceTestCase() --(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray; +-(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray *)dataArray; @end @@ -42,7 +42,7 @@ -(void)buildData { NSUInteger recordCount = self.nRecords; - CPTMutableNumberArray arr = [NSMutableArray arrayWithCapacity:recordCount]; + CPTMutableNumberArray *arr = [NSMutableArray arrayWithCapacity:recordCount]; for ( NSUInteger i = 0; i < recordCount; i++ ) { [arr insertObject:@(i) atIndex:i]; @@ -83,7 +83,7 @@ -(CPTPlotRange *)yRange return range; } --(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray +-(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray *)dataArray { double min = [[dataArray valueForKeyPath:@"@min.doubleValue"] doubleValue]; double max = [[dataArray valueForKeyPath:@"@max.doubleValue"] doubleValue]; @@ -101,11 +101,11 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return self.nRecords; } --(CPTNumberArray)numbersForPlot:(CPTPlot *)plot - field:(NSUInteger)fieldEnum - recordIndexRange:(NSRange)indexRange +-(CPTNumberArray *)numbersForPlot:(CPTPlot *)plot + field:(NSUInteger)fieldEnum + recordIndexRange:(NSRange)indexRange { - CPTNumberArray result; + CPTNumberArray *result; switch ( fieldEnum ) { case CPTScatterPlotFieldX: @@ -116,7 +116,7 @@ -(CPTNumberArray)numbersForPlot:(CPTPlot *)plot result = [[self yData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; if ( self.plots.count > 1 ) { XCTAssertTrue([[self plots] containsObject:plot], @"Plot missing"); - CPTMutableNumberArray shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; + CPTMutableNumberArray *shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; for ( NSDecimalNumber *d in result ) { [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([[self plots] indexOfObject:plot] + 1) )]]]; } diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 6ca6a5350..ef5205c58 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -207,42 +207,42 @@ extern const CPTEdgeInsets CPTEdgeInsetsZero; ///< Defines a set of stretchable /** * @brief An array of numbers. **/ -typedef NSArray *CPTNumberArray; +typedef NSArray CPTNumberArray; /** * @brief A mutable array of numbers. **/ -typedef NSMutableArray *CPTMutableNumberArray; +typedef NSMutableArray CPTMutableNumberArray; /** * @brief A set of numbers. **/ -typedef NSSet *CPTNumberSet; +typedef NSSet CPTNumberSet; /** * @brief A mutable set of numbers. **/ -typedef NSMutableSet *CPTMutableNumberSet; +typedef NSMutableSet CPTMutableNumberSet; /** * @brief An array of strings. **/ -typedef NSArray *CPTStringArray; +typedef NSArray CPTStringArray; /** * @brief A mutable array of strings. **/ -typedef NSMutableArray *CPTMutableStringArray; +typedef NSMutableArray CPTMutableStringArray; /** * @brief An array of strings. **/ -typedef NSDictionary *CPTDictionary; +typedef NSDictionary CPTDictionary; /** * @brief A mutable array of strings. **/ -typedef NSMutableDictionary *CPTMutableDictionary; +typedef NSMutableDictionary CPTMutableDictionary; /** * @brief Render a Quick Look image into the given context. diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 491c8e891..80ac78178 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -81,7 +81,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { @property (nonatomic, readwrite, strong, nullable) CPTAxisSet *axisSet; @property (nonatomic, readwrite, strong, nullable) CPTPlotAreaFrame *plotAreaFrame; @property (nonatomic, readonly, nullable) CPTPlotSpace *defaultPlotSpace; -@property (nonatomic, readwrite, strong, nullable) CPTNumberArray topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray *topDownLayerOrder; /// @} /// @name Legend diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index e8477f88f..a238541fb 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -100,7 +100,7 @@ @implementation CPTGraph **/ @dynamic defaultPlotSpace; -/** @property CPTNumberArray topDownLayerOrder +/** @property CPTNumberArray * topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * @see CPTPlotArea @link CPTPlotArea::topDownLayerOrder topDownLayerOrder @endlink property. **/ @@ -834,12 +834,12 @@ -(void)setPaddingBottom:(CGFloat)newPadding } } --(CPTNumberArray)topDownLayerOrder +-(CPTNumberArray *)topDownLayerOrder { return self.plotAreaFrame.plotArea.topDownLayerOrder; } --(void)setTopDownLayerOrder:(CPTNumberArray)newArray +-(void)setTopDownLayerOrder:(CPTNumberArray *)newArray { self.plotAreaFrame.plotArea.topDownLayerOrder = newArray; } diff --git a/framework/Source/CPTLayerTests.h b/framework/Source/CPTLayerTests.h index 3f507fdd2..acf2094b3 100644 --- a/framework/Source/CPTLayerTests.h +++ b/framework/Source/CPTLayerTests.h @@ -7,6 +7,6 @@ @interface CPTLayerTests : CPTTestCase @property (nonatomic, readwrite, strong) CPTLayer *layer; -@property (nonatomic, readwrite, strong) CPTNumberArray positions; +@property (nonatomic, readwrite, strong) CPTNumberArray *positions; @end diff --git a/framework/Source/CPTLayerTests.m b/framework/Source/CPTLayerTests.m index 78337db38..ad279c43c 100644 --- a/framework/Source/CPTLayerTests.m +++ b/framework/Source/CPTLayerTests.m @@ -8,7 +8,7 @@ @interface CPTLayerTests() --(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray)expected; +-(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray *)expected; @end @@ -40,7 +40,7 @@ -(void)tearDown -(void)testPixelAlign1xLeft { - CPTNumberArray expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; + CPTNumberArray *expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CGPointZero @@ -49,7 +49,7 @@ -(void)testPixelAlign1xLeft -(void)testPixelAlign1xLeftMiddle { - CPTNumberArray expected = @[@10.75, @10.75, @10.75, @10.75, @10.75, @10.75]; + CPTNumberArray *expected = @[@10.75, @10.75, @10.75, @10.75, @10.75, @10.75]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.25, 0.25) @@ -58,7 +58,7 @@ -(void)testPixelAlign1xLeftMiddle -(void)testPixelAlign1xMiddle { - CPTNumberArray expected = @[@10.5, @10.5, @10.5, @10.5, @10.5, @11.5]; + CPTNumberArray *expected = @[@10.5, @10.5, @10.5, @10.5, @10.5, @11.5]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.5, 0.5) @@ -67,7 +67,7 @@ -(void)testPixelAlign1xMiddle -(void)testPixelAlign1xRightMiddle { - CPTNumberArray expected = @[@10.25, @10.25, @10.25, @11.25, @11.25, @11.25]; + CPTNumberArray *expected = @[@10.25, @10.25, @10.25, @11.25, @11.25, @11.25]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(0.75, 0.75) @@ -76,7 +76,7 @@ -(void)testPixelAlign1xRightMiddle -(void)testPixelAlign1xRight { - CPTNumberArray expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; + CPTNumberArray *expected = @[@10.0, @10.0, @11.0, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(1.0) anchorPoint:CPTPointMake(1.0, 1.0) @@ -87,7 +87,7 @@ -(void)testPixelAlign1xRight -(void)testPixelAlign2xLeft { - CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CGPointZero @@ -96,7 +96,7 @@ -(void)testPixelAlign2xLeft -(void)testPixelAlign2xLeftMiddle { - CPTNumberArray expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; + CPTNumberArray *expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.25, 0.25) @@ -105,7 +105,7 @@ -(void)testPixelAlign2xLeftMiddle -(void)testPixelAlign2xMiddle { - CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.5, 0.5) @@ -114,7 +114,7 @@ -(void)testPixelAlign2xMiddle -(void)testPixelAlign2xRightMiddle { - CPTNumberArray expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; + CPTNumberArray *expected = @[@10.25, @10.25, @10.75, @10.75, @10.75, @11.25]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(0.75, 0.75) @@ -123,7 +123,7 @@ -(void)testPixelAlign2xRightMiddle -(void)testPixelAlign2xRight { - CPTNumberArray expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; + CPTNumberArray *expected = @[@10.5, @10.5, @10.5, @11.0, @11.0, @11.0]; [self testPositionsWithScale:CPTFloat(2.0) anchorPoint:CPTPointMake(1.0, 1.0) @@ -132,7 +132,7 @@ -(void)testPixelAlign2xRight #pragma mark - Utility methods --(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray)expectedValues +-(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expected:(CPTNumberArray *)expectedValues { NSUInteger positionCount = self.positions.count; diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index dcb319f7a..1e864f751 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -190,10 +190,10 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; @property (nonatomic, readwrite, assign) NSUInteger numberOfColumns; @property (nonatomic, readwrite, assign) BOOL equalRows; @property (nonatomic, readwrite, assign) BOOL equalColumns; -@property (nonatomic, readwrite, copy, nullable) CPTNumberArray rowHeights; -@property (nonatomic, readonly, nullable) CPTNumberArray rowHeightsThatFit; -@property (nonatomic, readwrite, copy, nullable) CPTNumberArray columnWidths; -@property (nonatomic, readonly, nullable) CPTNumberArray columnWidthsThatFit; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray *rowHeights; +@property (nonatomic, readonly, nullable) CPTNumberArray *rowHeightsThatFit; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray *columnWidths; +@property (nonatomic, readonly, nullable) CPTNumberArray *columnWidthsThatFit; @property (nonatomic, readwrite, assign) CGFloat columnMargin; @property (nonatomic, readwrite, assign) CGFloat rowMargin; @property (nonatomic, readwrite, assign) CGFloat titleOffset; diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 8a2502681..1a21ac1e7 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -29,8 +29,8 @@ @interface CPTLegend() @property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; @property (nonatomic, readwrite, strong) CPTMutableLegendEntryArray legendEntries; -@property (nonatomic, readwrite, strong) CPTNumberArray rowHeightsThatFit; -@property (nonatomic, readwrite, strong) CPTNumberArray columnWidthsThatFit; +@property (nonatomic, readwrite, strong) CPTNumberArray *rowHeightsThatFit; +@property (nonatomic, readwrite, strong) CPTNumberArray *columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; @property (nonatomic, readwrite, cpt_weak_property) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; @@ -160,7 +160,7 @@ @implementation CPTLegend **/ @synthesize equalColumns; -/** @property CPTNumberArray rowHeights +/** @property CPTNumberArray * rowHeights * @brief The desired height of each row of legend entries, including the swatch and title. * Each element in this array should be an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). If @nil, all rows will be sized automatically. @@ -169,14 +169,14 @@ @implementation CPTLegend **/ @synthesize rowHeights; -/** @property CPTNumberArray rowHeightsThatFit +/** @property CPTNumberArray * rowHeightsThatFit * @brief The computed best-fit height of each row of legend entries, including the swatch and title. * Each element in this array is an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). **/ @synthesize rowHeightsThatFit; -/** @property CPTNumberArray columnWidths +/** @property CPTNumberArray * columnWidths * @brief The desired width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array should be an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). If @nil, all columns will be sized automatically. @@ -185,7 +185,7 @@ @implementation CPTLegend **/ @synthesize columnWidths; -/** @property CPTNumberArray columnWidthsThatFit +/** @property CPTNumberArray * columnWidthsThatFit * @brief The computed best-fit width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array is an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). @@ -504,10 +504,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context } // calculate column positions - CPTNumberArray computedColumnWidths = self.columnWidthsThatFit; - NSUInteger columnCount = computedColumnWidths.count; - CGFloat *actualColumnWidths = malloc(sizeof(CGFloat) * columnCount); - CGFloat *columnPositions = malloc(sizeof(CGFloat) * columnCount); + CPTNumberArray *computedColumnWidths = self.columnWidthsThatFit; + NSUInteger columnCount = computedColumnWidths.count; + CGFloat *actualColumnWidths = malloc(sizeof(CGFloat) * columnCount); + CGFloat *columnPositions = malloc(sizeof(CGFloat) * columnCount); columnPositions[0] = self.paddingLeft; CGFloat theOffset = self.titleOffset; CGSize theSwatchSize = self.swatchSize; @@ -528,10 +528,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context } // calculate row positions - CPTNumberArray computedRowHeights = self.rowHeightsThatFit; - NSUInteger rowCount = computedRowHeights.count; - CGFloat *actualRowHeights = malloc(sizeof(CGFloat) * rowCount); - CGFloat *rowPositions = malloc(sizeof(CGFloat) * rowCount); + CPTNumberArray *computedRowHeights = self.rowHeightsThatFit; + NSUInteger rowCount = computedRowHeights.count; + CGFloat *actualRowHeights = malloc(sizeof(CGFloat) * rowCount); + CGFloat *rowPositions = malloc(sizeof(CGFloat) * rowCount); rowPositions[rowCount - 1] = self.paddingBottom; CGFloat theRowMargin = self.rowMargin; CGFloat lastRowHeight = 0.0; @@ -723,14 +723,14 @@ -(void)recalculateLayout } // compute row heights and column widths - NSUInteger row = 0; - NSUInteger col = 0; - CGFloat *maxTitleHeight = calloc( rowCount, sizeof(CGFloat) ); - CGFloat *maxTitleWidth = calloc( columnCount, sizeof(CGFloat) ); - CGSize theSwatchSize = self.swatchSize; - CPTNumberArray desiredRowHeights = self.rowHeights; - CPTNumberArray desiredColumnWidths = self.columnWidths; - Class numberClass = [NSNumber class]; + NSUInteger row = 0; + NSUInteger col = 0; + CGFloat *maxTitleHeight = calloc( rowCount, sizeof(CGFloat) ); + CGFloat *maxTitleWidth = calloc( columnCount, sizeof(CGFloat) ); + CGSize theSwatchSize = self.swatchSize; + CPTNumberArray *desiredRowHeights = self.rowHeights; + CPTNumberArray *desiredColumnWidths = self.columnWidths; + Class numberClass = [NSNumber class]; for ( CPTLegendEntry *legendEntry in self.legendEntries ) { legendEntry.row = row; @@ -770,13 +770,13 @@ -(void)recalculateLayout } // save row heights and column widths - CPTMutableNumberArray maxRowHeights = [[NSMutableArray alloc] initWithCapacity:rowCount]; + CPTMutableNumberArray *maxRowHeights = [[NSMutableArray alloc] initWithCapacity:rowCount]; for ( NSUInteger i = 0; i < rowCount; i++ ) { [maxRowHeights addObject:@(maxTitleHeight[i])]; } self.rowHeightsThatFit = maxRowHeights; - CPTMutableNumberArray maxColumnWidths = [[NSMutableArray alloc] initWithCapacity:columnCount]; + CPTMutableNumberArray *maxColumnWidths = [[NSMutableArray alloc] initWithCapacity:columnCount]; for ( NSUInteger i = 0; i < columnCount; i++ ) { [maxColumnWidths addObject:@(maxTitleWidth[i])]; } @@ -1430,7 +1430,7 @@ -(void)setEqualColumns:(BOOL)newEqualColumns } } --(void)setRowHeights:(CPTNumberArray)newRowHeights +-(void)setRowHeights:(CPTNumberArray *)newRowHeights { if ( newRowHeights != rowHeights ) { rowHeights = [newRowHeights copy]; @@ -1438,7 +1438,7 @@ -(void)setRowHeights:(CPTNumberArray)newRowHeights } } --(void)setColumnWidths:(CPTNumberArray)newColumnWidths +-(void)setColumnWidths:(CPTNumberArray *)newColumnWidths { if ( newColumnWidths != columnWidths ) { columnWidths = [newColumnWidths copy]; @@ -1527,7 +1527,7 @@ -(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle } } --(CPTNumberArray)rowHeightsThatFit +-(CPTNumberArray *)rowHeightsThatFit { if ( !rowHeightsThatFit ) { [self recalculateLayout]; @@ -1535,7 +1535,7 @@ -(CPTNumberArray)rowHeightsThatFit return rowHeightsThatFit; } --(CPTNumberArray)columnWidthsThatFit +-(CPTNumberArray *)columnWidthsThatFit { if ( !columnWidthsThatFit ) { [self recalculateLayout]; diff --git a/framework/Source/CPTLineStyle.h b/framework/Source/CPTLineStyle.h index bb9534d16..bd3d48dbf 100644 --- a/framework/Source/CPTLineStyle.h +++ b/framework/Source/CPTLineStyle.h @@ -23,7 +23,7 @@ typedef NSMutableArray *CPTMutableLineStyleArray; @property (nonatomic, readonly) CGLineJoin lineJoin; @property (nonatomic, readonly) CGFloat miterLimit; @property (nonatomic, readonly) CGFloat lineWidth; -@property (nonatomic, readonly, nullable) CPTNumberArray dashPattern; +@property (nonatomic, readonly, nullable) CPTNumberArray *dashPattern; @property (nonatomic, readonly) CGFloat patternPhase; @property (nonatomic, readonly, nullable) CPTColor *lineColor; @property (nonatomic, readonly, nullable) CPTFill *lineFill; diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index c4263415a..86f2988b3 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -16,7 +16,7 @@ @interface CPTLineStyle() @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong, nullable) CPTNumberArray dashPattern; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray *dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; @property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; @property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; @@ -65,7 +65,7 @@ @implementation CPTLineStyle **/ @synthesize lineWidth; -/** @property CPTNumberArray dashPattern +/** @property CPTNumberArray * dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @synthesize dashPattern; @@ -219,7 +219,7 @@ -(void)setLineStyleInContext:(CGContextRef)context CGContextSetMiterLimit(context, self.miterLimit); CGContextSetLineWidth(context, self.lineWidth); - CPTNumberArray myDashPattern = self.dashPattern; + CPTNumberArray *myDashPattern = self.dashPattern; NSUInteger dashCount = myDashPattern.count; if ( dashCount > 0 ) { diff --git a/framework/Source/CPTMutableLineStyle.h b/framework/Source/CPTMutableLineStyle.h index a42eadb47..0d69bb453 100644 --- a/framework/Source/CPTMutableLineStyle.h +++ b/framework/Source/CPTMutableLineStyle.h @@ -8,7 +8,7 @@ @property (nonatomic, readwrite, assign) CGLineJoin lineJoin; @property (nonatomic, readwrite, assign) CGFloat miterLimit; @property (nonatomic, readwrite, assign) CGFloat lineWidth; -@property (nonatomic, readwrite, strong, nullable) CPTNumberArray dashPattern; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray *dashPattern; @property (nonatomic, readwrite, assign) CGFloat patternPhase; @property (nonatomic, readwrite, strong, nullable) CPTColor *lineColor; @property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; diff --git a/framework/Source/CPTMutableLineStyle.m b/framework/Source/CPTMutableLineStyle.m index 39b9500a8..3f01815b1 100644 --- a/framework/Source/CPTMutableLineStyle.m +++ b/framework/Source/CPTMutableLineStyle.m @@ -29,7 +29,7 @@ @implementation CPTMutableLineStyle **/ @dynamic lineWidth; -/** @property CPTNumberArray dashPattern +/** @property CPTNumberArray * dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @dynamic dashPattern; diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index 51307f7e9..8464ede0e 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -10,7 +10,7 @@ /// @name Dimensions /// @{ -@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray shape; +@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray *shape; /// @} /// @name Samples diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index af1ec220f..9b0546494 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -29,7 +29,7 @@ @implementation CPTMutableNumericData **/ @dynamic mutableBytes; -/** @property CPTNumberArray shape +/** @property CPTNumberArray * shape * @brief The shape of the data buffer array. Set a new shape to change the size of the data buffer. * * The shape describes the dimensions of the sample array stored in diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index 83deb4292..f42a87299 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -20,7 +20,7 @@ /// @name Dimensions /// @{ -@property (nonatomic, readonly, copy, nonnull) CPTNumberArray shape; +@property (nonatomic, readonly, copy, nonnull) CPTNumberArray *shape; @property (nonatomic, readonly) NSUInteger numberOfDimensions; @property (nonatomic, readonly) NSUInteger numberOfSamples; @property (nonatomic, readonly) CPTDataOrder dataOrder; @@ -28,28 +28,28 @@ /// @name Factory Methods /// @{ -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; -+(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; -+(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -+(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; /// @} /// @name Initialization /// @{ --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; --(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray; --(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; --(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; --(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithData:(nonnull NSData *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray *)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} @@ -61,7 +61,7 @@ -(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...; -(nullable NSNumber *)sampleValue:(NSUInteger)sample; -(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; --(nonnull CPTNumberArray)sampleArray; +-(nonnull CPTNumberArray *)sampleArray; /// @} @end diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 5e57367f2..e6b61a873 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -11,12 +11,12 @@ @interface CPTNumericData() @property (nonatomic, readwrite, copy, nonnull) NSData *data; @property (nonatomic, readwrite, assign) CPTNumericDataType dataType; -@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray shape; +@property (nonatomic, readwrite, copy, nonnull) CPTNumberArray *shape; @property (nonatomic, readwrite, assign) CPTDataOrder dataOrder; --(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; +-(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order; -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; --(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType; +-(NSData *)dataFromArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType; @end @@ -81,7 +81,7 @@ @implementation CPTNumericData **/ @dynamic byteOrder; -/** @property CPTNumberArray shape +/** @property CPTNumberArray * shape * @brief The shape of the data buffer array. * * The shape describes the dimensions of the sample array stored in @@ -117,7 +117,7 @@ @implementation CPTNumericData **/ +(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [[self alloc] initWithData:newData dataType:newDataType @@ -132,7 +132,7 @@ +(instancetype)numericDataWithData:(NSData *)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [[self alloc] initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -149,9 +149,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData ++(instancetype)numericDataWithArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [[self alloc] initWithArray:newData dataType:newDataType @@ -168,9 +168,9 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData ++(instancetype)numericDataWithArray:(CPTNumberArray *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [[self alloc] initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -186,7 +186,7 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData @@ -204,7 +204,7 @@ +(instancetype)numericDataWithData:(NSData *)newData **/ +(instancetype)numericDataWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData @@ -224,9 +224,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData ++(instancetype)numericDataWithArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData @@ -246,9 +246,9 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData ++(instancetype)numericDataWithArray:(CPTNumberArray *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData @@ -268,7 +268,7 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData **/ -(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [self initWithData:newData dataType:newDataType @@ -284,7 +284,7 @@ -(instancetype)initWithData:(NSData *)newData **/ -(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -301,9 +301,9 @@ -(instancetype)initWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData +-(instancetype)initWithArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [self initWithData:[self dataFromArray:newData dataType:newDataType] dataType:newDataType @@ -320,9 +320,9 @@ -(instancetype)initWithArray:(CPTNumberArray)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData +-(instancetype)initWithArray:(CPTNumberArray *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray { return [self initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -338,7 +338,7 @@ -(instancetype)initWithArray:(CPTNumberArray)newData **/ -(instancetype)initWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { if ( (self = [super init]) ) { @@ -360,7 +360,7 @@ -(instancetype)initWithData:(NSData *)newData **/ -(instancetype)initWithData:(NSData *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithData:newData @@ -380,9 +380,9 @@ -(instancetype)initWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData +-(instancetype)initWithArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithData:[self dataFromArray:newData dataType:newDataType] @@ -402,9 +402,9 @@ -(instancetype)initWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData +-(instancetype)initWithArray:(CPTNumberArray *)newData dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { return [self initWithArray:newData @@ -424,7 +424,7 @@ -(instancetype)init -(void)commonInitWithData:(NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(CPTNumberArray *)shapeArray dataOrder:(CPTDataOrder)order { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); @@ -549,7 +549,7 @@ -(void)setDataType:(CPTNumericDataType)newDataType } } --(void)setShape:(CPTNumberArray)newShape +-(void)setShape:(CPTNumberArray *)newShape { if ( newShape != shape ) { shape = [newShape copy]; @@ -763,11 +763,11 @@ -(const void *)samplePointerAtIndex:(NSUInteger)idx, ... * @note NSNumber does not support complex numbers. Complex number types will be cast to * @float or @double before being wrapped in an instance of NSNumber. **/ --(CPTNumberArray)sampleArray +-(CPTNumberArray *)sampleArray { NSUInteger sampleCount = self.numberOfSamples; - CPTMutableNumberArray samples = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + CPTMutableNumberArray *samples = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSUInteger i = 0; i < sampleCount; i++ ) { NSNumber *sampleValue = [self sampleValue:i]; @@ -776,7 +776,7 @@ -(CPTNumberArray)sampleArray } } - CPTNumberArray result = [NSArray arrayWithArray:samples]; + CPTNumberArray *result = [NSArray arrayWithArray:samples]; return result; } @@ -795,9 +795,9 @@ -(CPTNumberArray)sampleArray **/ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList { - CPTNumberArray theShape = self.shape; - NSUInteger numDims = theShape.count; - NSUInteger newIndex = 0; + CPTNumberArray *theShape = self.shape; + NSUInteger numDims = theShape.count; + NSUInteger newIndex = 0; if ( numDims > 1 ) { NSUInteger *dims = calloc( numDims, sizeof(NSUInteger) ); @@ -861,7 +861,7 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList return newIndex; } --(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType +-(NSData *)dataFromArray:(CPTNumberArray *)newData dataType:(CPTNumericDataType)newDataType { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); NSParameterAssert(newDataType.dataTypeFormat != CPTUndefinedDataType); @@ -1193,7 +1193,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder if ( (self = [super init]) ) { NSData *newData; CPTNumericDataType newDataType; - CPTNumberArray shapeArray; + CPTNumberArray *shapeArray; CPTDataOrder order; if ( [decoder allowsKeyedCoding] ) { diff --git a/framework/Source/CPTNumericDataTypeConversionTests.m b/framework/Source/CPTNumericDataTypeConversionTests.m index 46f7fb1ff..72e4589f4 100644 --- a/framework/Source/CPTNumericDataTypeConversionTests.m +++ b/framework/Source/CPTNumericDataTypeConversionTests.m @@ -226,7 +226,7 @@ -(void)testRoundTripToDoubleArray dataType:theDataType shape:nil]; - CPTNumberArray doubleArray = [doubleData sampleArray]; + CPTNumberArray *doubleArray = [doubleData sampleArray]; XCTAssertEqual(doubleArray.count, numberOfSamples, @"doubleArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:doubleArray @@ -254,7 +254,7 @@ -(void)testRoundTripToIntegerArray dataType:theDataType shape:nil]; - CPTNumberArray integerArray = [intData sampleArray]; + CPTNumberArray *integerArray = [intData sampleArray]; XCTAssertEqual(integerArray.count, numberOfSamples, @"integerArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:integerArray @@ -282,7 +282,7 @@ -(void)testRoundTripToDecimalArray dataType:theDataType shape:nil]; - CPTNumberArray decimalArray = [decimalData sampleArray]; + CPTNumberArray *decimalArray = [decimalData sampleArray]; XCTAssertEqual(decimalArray.count, numberOfSamples, @"doubleArray size"); CPTNumericData *roundTripData = [[CPTNumericData alloc] initWithArray:decimalArray diff --git a/framework/Source/CPTPieChart.h b/framework/Source/CPTPieChart.h index 427f76386..6b9242d8f 100644 --- a/framework/Source/CPTPieChart.h +++ b/framework/Source/CPTPieChart.h @@ -72,7 +72,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of radial offsets. **/ --(nullable CPTNumberArray)radialOffsetsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable CPTNumberArray *)radialOffsetsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Offsets the slice radially from the center point. Can be used to @quote{explode} the chart. * This method will not be called if diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index d46ceb81f..feebac78f 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -32,9 +32,9 @@ /// @cond @interface CPTPieChart() -@property (nonatomic, readwrite, copy) CPTNumberArray sliceWidths; +@property (nonatomic, readwrite, copy) CPTNumberArray *sliceWidths; @property (nonatomic, readwrite, copy) CPTFillArray sliceFills; -@property (nonatomic, readwrite, copy) CPTNumberArray sliceRadialOffsets; +@property (nonatomic, readwrite, copy) CPTNumberArray *sliceRadialOffsets; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)updateNormalizedData; @@ -525,8 +525,8 @@ -(void)reloadRadialOffsetsInIndexRange:(NSRange)indexRange atRecordIndex:indexRange.location]; } else if ( [theDataSource respondsToSelector:@selector(radialOffsetForPieChart:recordIndex:)] ) { - CPTMutableNumberArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + CPTMutableNumberArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CGFloat offset = [theDataSource radialOffsetForPieChart:self recordIndex:idx]; @@ -579,8 +579,8 @@ -(void)renderAsVectorInContext:(CGContextRef)context CPTLineStyle *borderStyle = self.borderLineStyle; CPTFill *overlay = self.overlayFill; - BOOL hasNonZeroOffsets = NO; - CPTNumberArray offsetArray = [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; + BOOL hasNonZeroOffsets = NO; + CPTNumberArray *offsetArray = [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; for ( NSNumber *offset in offsetArray ) { if ( [offset cgFloatValue] != CPTFloat(0.0) ) { hasNonZeroOffsets = YES; @@ -880,7 +880,7 @@ -(NSUInteger)numberOfFields return 1; } --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[@(CPTPieChartFieldSliceWidth)]; } @@ -1353,12 +1353,12 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point /// @cond --(CPTNumberArray)sliceWidths +-(CPTNumberArray *)sliceWidths { return [[self cachedNumbersForField:CPTPieChartFieldSliceWidth] sampleArray]; } --(void)setSliceWidths:(CPTNumberArray)newSliceWidths +-(void)setSliceWidths:(CPTNumberArray *)newSliceWidths { [self cacheNumbers:newSliceWidths forField:CPTPieChartFieldSliceWidth]; [self updateNormalizedData]; @@ -1375,12 +1375,12 @@ -(void)setSliceFills:(CPTFillArray)newSliceFills [self setNeedsDisplay]; } --(CPTNumberArray)sliceRadialOffsets +-(CPTNumberArray *)sliceRadialOffsets { return [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; } --(void)setSliceRadialOffsets:(CPTNumberArray)newSliceRadialOffsets +-(void)setSliceRadialOffsets:(CPTNumberArray *)newSliceRadialOffsets { [self cacheArray:newSliceRadialOffsets forKey:CPTPieChartBindingPieSliceRadialOffsets]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 26c0a37b9..fca7deb66 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -379,8 +379,8 @@ typedef NSMutableArray<__kindof CPTPlot *> *CPTMutablePlotArray; /// @name Fields /// @{ -(NSUInteger)numberOfFields; --(nonnull CPTNumberArray)fieldIdentifiers; --(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; +-(nonnull CPTNumberArray *)fieldIdentifiers; +-(nonnull CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord; -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field; /// @} diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index c6b9404dc..f88805873 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -813,7 +813,7 @@ -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRan CPTNumericDataType dataType = data.dataType; if ( (sampleCount > 0) && (data.numberOfDimensions == 2) ) { - CPTNumberArray theShape = data.shape; + CPTNumberArray *theShape = data.shape; const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; @@ -973,13 +973,13 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum case CPTScaleTypeCategory: { - CPTStringArray samples = (CPTStringArray)numbers; + CPTStringArray *samples = (CPTStringArray *)numbers; if ( [samples isKindOfClass:[NSArray class]] ) { [thePlotSpace setCategories:samples forCoordinate:coordinate]; NSUInteger sampleCount = samples.count; if ( sampleCount > 0 ) { - CPTMutableNumberArray indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + CPTMutableNumberArray *indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSString *category in samples ) { [indices addObject:@([thePlotSpace indexOfCategory:category forCoordinate:coordinate])]; @@ -1070,11 +1070,11 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NS case CPTScaleTypeCategory: { - CPTStringArray samples = (CPTStringArray)numbers; + CPTStringArray *samples = (CPTStringArray *)numbers; if ( [samples isKindOfClass:[NSArray class]] ) { sampleCount = samples.count; if ( sampleCount > 0 ) { - CPTMutableNumberArray indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; + CPTMutableNumberArray *indices = [[NSMutableArray alloc] initWithCapacity:sampleCount]; for ( NSString *category in samples ) { [thePlotSpace addCategory:category forCoordinate:coordinate]; @@ -1144,7 +1144,7 @@ -(CPTMutableNumericData *)numericDataForNumbers:(id)numbers mutableNumbers = [[CPTMutableNumericData alloc] initWithData:numbers dataType:loadedDataType shape:nil]; } else if ( [numbers isKindOfClass:[NSArray class]] ) { - if ( ( (CPTNumberArray)numbers ).count == 0 ) { + if ( ( (CPTNumberArray *)numbers ).count == 0 ) { loadedDataType = self.doubleDataType; } else if ( [( (NSArray < NSNumber * > *)numbers )[0] isKindOfClass :[NSDecimalNumber class]] ) { @@ -1487,7 +1487,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum **/ -(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord { - CPTNumberArray fields = [self fieldIdentifiersForCoordinate:coord]; + CPTNumberArray *fields = [self fieldIdentifiersForCoordinate:coord]; if ( fields.count == 0 ) { return nil; @@ -1558,9 +1558,9 @@ -(void)relabel return; } - CPTDictionary textAttributes = [dataLabelTextStyle attributes]; - BOOL hasAttributedFormatter = ([dataLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] - withDefaultAttributes:textAttributes] != nil); + CPTDictionary *textAttributes = [dataLabelTextStyle attributes]; + BOOL hasAttributedFormatter = ([dataLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] + withDefaultAttributes:textAttributes] != nil); NSUInteger sampleCount = self.cachedDataCount; NSRange indexRange = self.labelIndexRange; @@ -2181,7 +2181,7 @@ -(NSUInteger)numberOfFields /** @brief Identifiers (enum values) identifying the fields. * @return Array of NSNumber objects for the various field identifiers. **/ --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[]; } @@ -2190,7 +2190,7 @@ -(CPTNumberArray)fieldIdentifiers * @param coord The coordinate for which the corresponding field identifiers are desired. * @return Array of NSNumber objects for the field identifiers. **/ --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { return @[]; } diff --git a/framework/Source/CPTPlotArea.h b/framework/Source/CPTPlotArea.h index e98181fa7..b606caa2c 100644 --- a/framework/Source/CPTPlotArea.h +++ b/framework/Source/CPTPlotArea.h @@ -85,7 +85,7 @@ /// @name Layer Ordering /// @{ -@property (nonatomic, readwrite, strong, nullable) CPTNumberArray topDownLayerOrder; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray *topDownLayerOrder; /// @} /// @name Decorations diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 56ae066fa..0fd0c6460 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -74,7 +74,7 @@ @implementation CPTPlotArea **/ @synthesize axisTitleGroup; -/** @property CPTNumberArray topDownLayerOrder +/** @property CPTNumberArray * topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * * The array should reference the layers using the constants defined in #CPTGraphLayerType. @@ -409,7 +409,7 @@ -(void)updateLayerOrder *(buLayerOrder++) = (CPTGraphLayerType)i; } - CPTNumberArray tdLayerOrder = self.topDownLayerOrder; + CPTNumberArray *tdLayerOrder = self.topDownLayerOrder; if ( tdLayerOrder ) { buLayerOrder = self.bottomUpLayerOrder; @@ -882,7 +882,7 @@ -(void)setAxisTitleGroup:(CPTAxisLabelGroup *)newAxisTitleGroup } } --(void)setTopDownLayerOrder:(CPTNumberArray)newArray +-(void)setTopDownLayerOrder:(CPTNumberArray *)newArray { if ( newArray != topDownLayerOrder ) { topDownLayerOrder = newArray; diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index c89643179..14fd14b99 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -180,10 +180,10 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; -(void)addCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; -(void)removeCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; -(void)insertCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; --(void)setCategories:(nullable CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate; +-(void)setCategories:(nullable CPTStringArray *)newCategories forCoordinate:(CPTCoordinate)coordinate; -(void)removeAllCategories; --(nonnull CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate; +-(nonnull CPTStringArray *)categoriesForCoordinate:(CPTCoordinate)coordinate; -(nullable NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx; -(NSUInteger)indexOfCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate; /// @} @@ -205,17 +205,17 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; /// @name Coordinate Space Conversions /// @{ --(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint; +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray *)plotPoint; -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count; -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count; --(nullable CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point; +-(nullable CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint)point; -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point; -(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event; --(nullable CPTNumberArray)plotPointForEvent:(nonnull CPTNativeEvent *)event; +-(nullable CPTNumberArray *)plotPointForEvent:(nonnull CPTNativeEvent *)event; -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 79ad01a28..1016d7c22 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -241,7 +241,7 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina * @param newCategories An array of category names. * @param coordinate The axis coordinate. */ --(void)setCategories:(CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate +-(void)setCategories:(CPTStringArray *)newCategories forCoordinate:(CPTCoordinate)coordinate { NSMutableDictionary *names = self.categoryNames; @@ -274,7 +274,7 @@ -(void)removeAllCategories * @param coordinate The axis coordinate. * @return An array of category names. */ --(CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate +-(CPTStringArray *)categoriesForCoordinate:(CPTCoordinate)coordinate { CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; @@ -481,7 +481,7 @@ -(NSUInteger)numberOfCoordinates * @param plotPoint An array of data point coordinates (as NSNumber values). * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray *)plotPoint { NSParameterAssert(plotPoint.count == self.numberOfCoordinates); @@ -516,7 +516,7 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe * @param point The drawing coordinates of the data point. * @return An array of data point coordinates (as NSNumber values). **/ --(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point +-(CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint)point { return nil; } @@ -554,7 +554,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event * @param event The event. * @return An array of data point coordinates (as NSNumber values). **/ --(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event +-(CPTNumberArray *)plotPointForEvent:(CPTNativeEvent *)event { return nil; } diff --git a/framework/Source/CPTPlotSpaceAnnotation.h b/framework/Source/CPTPlotSpaceAnnotation.h index a0fb80bec..6e6f9cf88 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.h +++ b/framework/Source/CPTPlotSpaceAnnotation.h @@ -4,10 +4,10 @@ @interface CPTPlotSpaceAnnotation : CPTAnnotation -@property (nonatomic, readwrite, copy, nullable) CPTNumberArray anchorPlotPoint; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray *anchorPlotPoint; @property (nonatomic, readonly, nonnull) CPTPlotSpace *plotSpace; --(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable CPTNumberArray)plotPoint NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable CPTNumberArray *)plotPoint NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; @end diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 102058d7d..ed0c3d6db 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -28,7 +28,7 @@ -(void)setContentNeedsLayout; **/ @implementation CPTPlotSpaceAnnotation -/** @property CPTNumberArray anchorPlotPoint +/** @property CPTNumberArray * anchorPlotPoint * @brief An array of NSDecimalNumber objects giving the anchor plot coordinates. **/ @synthesize anchorPlotPoint; @@ -56,7 +56,7 @@ @implementation CPTPlotSpaceAnnotation * @param newPlotPoint An array of NSDecimalNumber objects giving the anchor plot coordinates. * @return The initialized CPTPlotSpaceAnnotation object. **/ --(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(CPTNumberArray)newPlotPoint +-(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(CPTNumberArray *)newPlotPoint { NSParameterAssert(newPlotSpace); @@ -140,7 +140,7 @@ -(void)positionContentLayer if ( content ) { CPTLayer *hostLayer = self.annotationHostLayer; if ( hostLayer ) { - CPTNumberArray plotAnchor = self.anchorPlotPoint; + CPTNumberArray *plotAnchor = self.anchorPlotPoint; if ( plotAnchor ) { // Get plot area point CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -175,7 +175,7 @@ -(void)positionContentLayer /// @cond --(void)setAnchorPlotPoint:(CPTNumberArray)newPlotPoint +-(void)setAnchorPlotPoint:(CPTNumberArray *)newPlotPoint { if ( anchorPlotPoint != newPlotPoint ) { anchorPlotPoint = [newPlotPoint copy]; diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 614613af7..5f15f0fde 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -47,8 +47,8 @@ @interface CPTRangePlot() -@property (nonatomic, readwrite, copy) CPTNumberArray xValues; -@property (nonatomic, readwrite, copy) CPTNumberArray yValues; +@property (nonatomic, readwrite, copy) CPTNumberArray *xValues; +@property (nonatomic, readwrite, copy) CPTNumberArray *yValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *leftValues; @@ -937,7 +937,7 @@ -(NSUInteger)numberOfFields return 6; } --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[@(CPTRangePlotFieldX), @(CPTRangePlotFieldY), @@ -947,9 +947,9 @@ -(CPTNumberArray)fieldIdentifiers @(CPTRangePlotFieldRight)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - CPTNumberArray result = nil; + CPTNumberArray *result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1010,8 +1010,8 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte } NSNumber *yValue; - CPTNumberArray yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; - CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; + CPTNumberArray *yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; + CPTNumberArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { yValue = [yValuesSorted lastObject]; } @@ -1287,22 +1287,22 @@ -(void)setGapWidth:(CGFloat)newGapWidth } } --(void)setXValues:(CPTNumberArray)newValues +-(void)setXValues:(CPTNumberArray *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldX]; } --(CPTNumberArray)xValues +-(CPTNumberArray *)xValues { return [[self cachedNumbersForField:CPTRangePlotFieldX] sampleArray]; } --(void)setYValues:(CPTNumberArray)newValues +-(void)setYValues:(CPTNumberArray *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldY]; } --(CPTNumberArray)yValues +-(CPTNumberArray *)yValues { return [[self cachedNumbersForField:CPTRangePlotFieldY] sampleArray]; } diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 92006d02e..957163bf7 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -34,8 +34,8 @@ /// @cond @interface CPTScatterPlot() -@property (nonatomic, readwrite, copy) CPTNumberArray xValues; -@property (nonatomic, readwrite, copy) CPTNumberArray yValues; +@property (nonatomic, readwrite, copy) CPTNumberArray *xValues; +@property (nonatomic, readwrite, copy) CPTNumberArray *yValues; @property (nonatomic, readwrite, strong) CPTPlotSymbolArray plotSymbols; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @property (nonatomic, readwrite, assign) BOOL pointingDeviceDownOnLine; @@ -1326,14 +1326,14 @@ -(NSUInteger)numberOfFields return 2; } --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[@(CPTScatterPlotFieldX), @(CPTScatterPlotFieldY)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - CPTNumberArray result = nil; + CPTNumberArray *result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1840,22 +1840,22 @@ -(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue } } --(void)setXValues:(CPTNumberArray)newValues +-(void)setXValues:(CPTNumberArray *)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldX]; } --(CPTNumberArray)xValues +-(CPTNumberArray *)xValues { return [[self cachedNumbersForField:CPTScatterPlotFieldX] sampleArray]; } --(void)setYValues:(CPTNumberArray)newValues +-(void)setYValues:(CPTNumberArray *)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldY]; } --(CPTNumberArray)yValues +-(CPTNumberArray *)yValues { return [[self cachedNumbersForField:CPTScatterPlotFieldY] sampleArray]; } diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index aca7fc1f7..d50adb3e6 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -7,8 +7,8 @@ @interface CPTScatterPlot(Testing) -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; --(void)setXValues:(CPTNumberArray)newValues; --(void)setYValues:(CPTNumberArray)newValues; +-(void)setXValues:(CPTNumberArray *)newValues; +-(void)setYValues:(CPTNumberArray *)newValues; @end @@ -22,7 +22,7 @@ -(void)setUp double values[5] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; self.plot = [CPTScatterPlot new]; - CPTMutableNumberArray yValues = [NSMutableArray array]; + CPTMutableNumberArray *yValues = [NSMutableArray array]; for ( NSInteger i = 0; i < 5; i++ ) { [yValues addObject:@(values[i])]; } @@ -47,7 +47,7 @@ -(void)testCalculatePointsToDrawAllInRange BOOL drawFlags[5]; double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -64,7 +64,7 @@ -(void)testCalculatePointsToDrawAllInRangeVisibleOnly BOOL drawFlags[5]; double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -81,7 +81,7 @@ -(void)testCalculatePointsToDrawNoneInRange BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -98,7 +98,7 @@ -(void)testCalculatePointsToDrawNoneInRangeVisibleOnly BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -115,7 +115,7 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegions BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -132,7 +132,7 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegionsVisibleOnly BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -150,7 +150,7 @@ -(void)testCalculatePointsToDrawSomeInRange double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; BOOL expected[5] = { YES, YES, YES, YES, NO }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -172,7 +172,7 @@ -(void)testCalculatePointsToDrawSomeInRangeVisibleOnly BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -195,7 +195,7 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossing double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; BOOL expected[5] = { YES, YES, YES, YES, NO }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; @@ -217,7 +217,7 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossingVisibleOnly BOOL drawFlags[5]; double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; - CPTMutableNumberArray values = [NSMutableArray array]; + CPTMutableNumberArray *values = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; diff --git a/framework/Source/CPTTextStyle.h b/framework/Source/CPTTextStyle.h index 01605fe22..807d7b215 100644 --- a/framework/Source/CPTTextStyle.h +++ b/framework/Source/CPTTextStyle.h @@ -37,11 +37,11 @@ typedef NSMutableArray *CPTMutableTextStyleArray; **/ @interface CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -@property (readonly, nonatomic, nonnull) CPTDictionary attributes; +@property (readonly, nonatomic, nonnull) CPTDictionary *attributes; /// @name Factory Methods /// @{ -+(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes; ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary *)attributes; /// @} @end diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index a7fd09919..9aa381409 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -1132,7 +1132,7 @@ -(NSUInteger)numberOfFields return 5; } --(CPTNumberArray)fieldIdentifiers +-(CPTNumberArray *)fieldIdentifiers { return @[@(CPTTradingRangePlotFieldX), @(CPTTradingRangePlotFieldOpen), @@ -1141,9 +1141,9 @@ -(CPTNumberArray)fieldIdentifiers @(CPTTradingRangePlotFieldLow)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { - CPTNumberArray result = nil; + CPTNumberArray *result = nil; switch ( coord ) { case CPTCoordinateX: @@ -1205,11 +1205,11 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte NSNumber *xValue = [self cachedNumberForField:CPTTradingRangePlotFieldX recordIndex:idx]; NSNumber *yValue; - CPTNumberArray yValues = @[[self cachedNumberForField:CPTTradingRangePlotFieldOpen recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldClose recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldHigh recordIndex:idx], - [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; - CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; + CPTNumberArray *yValues = @[[self cachedNumberForField:CPTTradingRangePlotFieldOpen recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldClose recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldHigh recordIndex:idx], + [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; + CPTNumberArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { yValue = [yValuesSorted lastObject]; } diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 92e8bdaee..0b7afedbc 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -16,7 +16,7 @@ /// @cond @interface CPTXYAxis() --(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CPTNumberSet)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major; +-(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CPTNumberSet *)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major; -(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper; -(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue; @@ -210,7 +210,7 @@ -(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue /// @cond --(void)drawTicksInContext:(CGContextRef)context atLocations:(CPTNumberSet)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major +-(void)drawTicksInContext:(CGContextRef)context atLocations:(CPTNumberSet *)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major { CPTLineStyle *lineStyle = (major ? self.majorTickLineStyle : self.minorTickLineStyle); @@ -390,7 +390,7 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major [self relabel]; CPTPlotSpace *thePlotSpace = self.plotSpace; - CPTNumberSet locations = (major ? self.majorTickLocations : self.minorTickLocations); + CPTNumberSet *locations = (major ? self.majorTickLocations : self.minorTickLocations); CPTCoordinate selfCoordinate = self.coordinate; CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(selfCoordinate); CPTMutablePlotRange *orthogonalRange = [[thePlotSpace plotRangeForCoordinate:orthogonalCoordinate] mutableCopy]; @@ -484,7 +484,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context NSUInteger bandCount = bandArray.count; if ( bandCount > 0 ) { - CPTNumberArray locations = [self.majorTickLocations allObjects]; + CPTNumberArray *locations = [self.majorTickLocations allObjects]; if ( locations.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 64df962cd..b6829379c 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -950,7 +950,7 @@ -(NSUInteger)numberOfCoordinates } // Plot area view point for plot point --(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray *)plotPoint { CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint]; @@ -1133,9 +1133,9 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe } // Plot point for view point --(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point +-(CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint)point { - CPTMutableNumberArray plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; + CPTMutableNumberArray *plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; CGSize boundsSize; CPTGraph *theGraph = self.graph; @@ -1333,7 +1333,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event } // Plot point for event --(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event +-(CPTNumberArray *)plotPointForEvent:(CPTNativeEvent *)event { return [self plotPointForPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; } diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 2d8656831..99977ce06 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -49,7 +49,7 @@ -(void)testViewPointForPlotPointArrayLinear plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@10.0]; - CPTNumberArray plotPoint = @[@5.0, @5.0]; + CPTNumberArray *plotPoint = @[@5.0, @5.0]; CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; @@ -146,7 +146,7 @@ -(void)testViewPointForPlotPointArrayLog plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@9.0]; - CPTNumberArray plotPoint = @[@( sqrt(10.0) ), @( sqrt(10.0) )]; + CPTNumberArray *plotPoint = @[@( sqrt(10.0) ), @( sqrt(10.0) )]; CGPoint viewPoint = [plotSpace plotAreaViewPointForPlotPoint:plotPoint]; @@ -310,8 +310,8 @@ -(void)testPlotPointArrayForViewPointLinear plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@10.0]; - CGPoint viewPoint = CPTPointMake(50.0, 25.0); - CPTNumberArray plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + CPTNumberArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; NSString *errMessage; errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; @@ -383,8 +383,8 @@ -(void)testPlotPointArrayForViewPointLog plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@9.0]; - CGPoint viewPoint = CPTPointMake(50.0, 25.0); - CPTNumberArray plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; + CGPoint viewPoint = CPTPointMake(50.0, 25.0); + CPTNumberArray *plotPoint = [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; NSString *errMessage; [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index eae3bbdbc..c6104b5bd 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -17,7 +17,7 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 @interface NSString(CPTTextStylePlatformSpecificExtensions) --(CGSize)sizeWithAttributes:(CPTDictionary)attrs; +-(CGSize)sizeWithAttributes:(CPTDictionary *)attrs; @end #else diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index e4e21ba15..d4cd9e156 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -8,7 +8,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary attributes +/** @property CPTDictionary * attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -34,7 +34,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -67,9 +67,9 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes /// @cond --(CPTDictionary)attributes +-(CPTDictionary *)attributes { - CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; + CPTMutableDictionary *myAttributes = [NSMutableDictionary dictionary]; // Font UIFont *styleFont = nil; @@ -113,7 +113,7 @@ @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtension /// @cond -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; From be849f0c6ea4a263d908fd87eb4c5f0322062adb Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Oct 2015 19:55:22 -0400 Subject: [PATCH 116/429] Set the title for the root navigation controller in the Plot Gallery app. --- examples/CorePlotGallery/src/ios/Launch Screen.xib | 4 ++-- examples/CorePlotGallery/src/ios/Main.storyboard | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/CorePlotGallery/src/ios/Launch Screen.xib b/examples/CorePlotGallery/src/ios/Launch Screen.xib index 3f2f3dbc8..a932c3b64 100644 --- a/examples/CorePlotGallery/src/ios/Launch Screen.xib +++ b/examples/CorePlotGallery/src/ios/Launch Screen.xib @@ -1,8 +1,8 @@ - + - + diff --git a/examples/CorePlotGallery/src/ios/Main.storyboard b/examples/CorePlotGallery/src/ios/Main.storyboard index f77129ad0..99440a43b 100644 --- a/examples/CorePlotGallery/src/ios/Main.storyboard +++ b/examples/CorePlotGallery/src/ios/Main.storyboard @@ -1,15 +1,15 @@ - + - + - + - + From e0dab57652870c667aaa5c5d6c967f17e866261d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 31 Oct 2015 20:17:07 -0400 Subject: [PATCH 117/429] Changed more annotated type definitions to exclude the pointer star ("*"). --- examples/AAPLot/APYahooDataPuller.h | 4 +- examples/AAPLot/APYahooDataPuller.m | 2 +- examples/AAPLot/Classes/MainViewController.m | 10 ++-- .../Classes/CPTTestApp_iPadViewController.m | 14 ++--- examples/CPTTestApp/Source/Controller.m | 6 +- .../CorePlotGallery/src/plots/CompositePlot.m | 14 ++--- .../src/plots/LabelingPolicyDemo.m | 2 +- .../CorePlotGallery/src/plots/LineCapDemo.m | 2 +- .../DropPlot.xcodeproj/project.pbxproj | 32 +++++++++- .../StockPlot/Classes/APYahooDataPuller.h | 4 +- .../StockPlot/Classes/APYahooDataPuller.m | 2 +- .../Classes/APYahooDataPullerGraph.m | 2 +- framework/CorePlot.xcodeproj/project.pbxproj | 4 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 2 +- framework/Source/CPTAnimation.m | 16 ++--- framework/Source/CPTAnnotation.h | 5 +- framework/Source/CPTAnnotationHostLayer.h | 2 +- framework/Source/CPTAnnotationHostLayer.m | 18 +++--- framework/Source/CPTAxis.h | 14 ++--- framework/Source/CPTAxis.m | 44 +++++++------- framework/Source/CPTAxisLabel.h | 4 +- framework/Source/CPTAxisSet.h | 2 +- framework/Source/CPTAxisSet.m | 6 +- framework/Source/CPTBarPlot.h | 4 +- framework/Source/CPTBarPlot.m | 24 ++++---- framework/Source/CPTDataSourceTestCase.h | 2 +- framework/Source/CPTFill.h | 4 +- framework/Source/CPTGraph.h | 4 +- framework/Source/CPTGraph.m | 18 +++--- framework/Source/CPTLayer.h | 10 ++-- framework/Source/CPTLayer.m | 14 ++--- framework/Source/CPTLegend.h | 6 +- framework/Source/CPTLegend.m | 40 ++++++------- framework/Source/CPTLegendEntry.h | 4 +- framework/Source/CPTLimitBand.h | 4 +- framework/Source/CPTLineStyle.h | 4 +- framework/Source/CPTLineStyle.m | 2 +- framework/Source/CPTMutableLineStyle.m | 2 +- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTNumericData.m | 2 +- framework/Source/CPTPieChart.h | 2 +- framework/Source/CPTPieChart.m | 12 ++-- framework/Source/CPTPlot.h | 4 +- framework/Source/CPTPlot.m | 30 +++++----- framework/Source/CPTPlotArea.m | 8 +-- framework/Source/CPTPlotRange.h | 4 +- framework/Source/CPTPlotSpace.h | 8 +-- framework/Source/CPTPlotSpace.m | 30 +++++----- framework/Source/CPTPlotSpaceAnnotation.m | 2 +- framework/Source/CPTPlotSymbol.h | 4 +- framework/Source/CPTRangePlot.h | 2 +- framework/Source/CPTRangePlot.m | 12 ++-- framework/Source/CPTScatterPlot.h | 4 +- framework/Source/CPTScatterPlot.m | 26 ++++---- framework/Source/CPTTextStyle.h | 4 +- framework/Source/CPTTradingRangePlot.h | 10 ++-- framework/Source/CPTTradingRangePlot.m | 60 +++++++++---------- framework/Source/CPTXYAxis.m | 6 +- framework/Source/CPTXYAxisSet.m | 4 +- framework/Source/CPTXYPlotSpace.m | 10 ++-- framework/Source/_CPTBorderLayer.m | 4 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 2 +- 62 files changed, 318 insertions(+), 287 deletions(-) diff --git a/examples/AAPLot/APYahooDataPuller.h b/examples/AAPLot/APYahooDataPuller.h index 668729264..a8978cba6 100644 --- a/examples/AAPLot/APYahooDataPuller.h +++ b/examples/AAPLot/APYahooDataPuller.h @@ -2,7 +2,7 @@ @class APYahooDataPuller; -typedef NSArray *CPTFinancialDataArray; +typedef NSArray CPTFinancialDataArray; @protocol APYahooDataPullerDelegate @@ -21,7 +21,7 @@ typedef NSArray *CPTFinancialDataArray; @property (nonatomic, readwrite, copy) NSString *targetSymbol; @property (nonatomic, readwrite, strong) NSDate *targetStartDate; @property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; +@property (nonatomic, readonly, strong) CPTFinancialDataArray *financialData; @property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; @property (nonatomic, readonly, strong) NSDecimalNumber *overallVolumeHigh; diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index c179a7b11..15dd6754b 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -9,7 +9,7 @@ @interface APYahooDataPuller() @property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeHigh; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeLow; -@property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; +@property (nonatomic, readwrite, strong) CPTFinancialDataArray *financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; @property (nonatomic, readwrite, strong) NSMutableData *receivedData; diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index 1acb26cf8..aa7b7cddb 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -144,8 +144,8 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange { - CPTFinancialDataArray financialData = self.datapuller.financialData; - const NSUInteger financialDataCount = financialData.count; + CPTFinancialDataArray *financialData = self.datapuller.financialData; + const NSUInteger financialDataCount = financialData.count; const BOOL useDoubles = plot.doublePrecisionCache; @@ -365,8 +365,8 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange { - CPTFinancialDataArray financialData = self.datapuller.financialData; - const NSUInteger financialDataCount = financialData.count; + CPTFinancialDataArray *financialData = self.datapuller.financialData; + const NSUInteger financialDataCount = financialData.count; const BOOL useDoubles = plot.doublePrecisionCache; @@ -662,7 +662,7 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp axisSet.yAxis.majorIntervalLength = @50.0; axisSet.yAxis.minorTicksPerInterval = 4; axisSet.yAxis.orthogonalPosition = @1.0; - CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@0.0 length:low]]; + CPTPlotRangeArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@0.0 length:low]]; axisSet.yAxis.labelExclusionRanges = exclusionRanges; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 916c90b0a..f27a097d5 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -130,9 +130,9 @@ -(void)constructScatterPlot x.majorIntervalLength = @0.5; x.orthogonalPosition = @2.0; x.minorTicksPerInterval = 2; - CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; @@ -254,10 +254,10 @@ -(void)constructBarChart // Define some custom labels for the data elements x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; - CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + NSUInteger labelLocation = 0; + CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index f58fb37d2..0beafe343 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -145,9 +145,9 @@ -(void)setupAxes x.minorTicksPerInterval = 2; x.majorGridLineStyle = majorGridLineStyle; x.minorGridLineStyle = minorGridLineStyle; - CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; NSMutableAttributedString *xTitle = [[NSMutableAttributedString alloc] initWithString:@"X Axis\nLine 2"]; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 3184a4503..9a6b8dcc2 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -249,9 +249,9 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe x.majorIntervalLength = @0.5; x.orthogonalPosition = @2.0; x.minorTicksPerInterval = 2; - CPTPlotRangeArray exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], - [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; + CPTPlotRangeArray *exclusionRanges = @[[CPTPlotRange plotRangeWithLocation:@1.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@0.99 length:@0.02], + [CPTPlotRange plotRangeWithLocation:@2.99 length:@0.02]]; x.labelExclusionRanges = exclusionRanges; CPTXYAxis *y = axisSet.yAxis; @@ -358,10 +358,10 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( x.labelOffset = 2.0; x.labelRotation = CPTFloat(M_PI_4); x.labelingPolicy = CPTAxisLabelingPolicyNone; - CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; - CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; - NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; + CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; + NSUInteger labelLocation = 0; + CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index 31949c2bc..fc6e88ff6 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -95,7 +95,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP axisNone.majorTickLocations = majorTickLocations; axisNone.minorTickLocations = minorTickLocations; - CPTMutableAxisLabelSet newAxisLabels = [NSMutableSet set]; + CPTMutableAxisLabelSet *newAxisLabels = [NSMutableSet set]; for ( NSUInteger i = 0; i <= 5; i++ ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:[NSString stringWithFormat:@"Label %lu", (unsigned long)i] textStyle:axisNone.labelTextStyle]; diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index e00880c24..e26c38871 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -60,7 +60,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP lineCap.fill = [CPTFill fillWithColor:[CPTColor blueColor]]; // Axes - CPTMutableAxisArray axes = [[NSMutableArray alloc] init]; + CPTMutableAxisArray *axes = [[NSMutableArray alloc] init]; CPTLineCapType lineCapType = CPTLineCapTypeNone; while ( lineCapType < CPTLineCapTypeCustom ) { diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index a07cd5882..120ce9e78 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -71,6 +71,20 @@ remoteGlobalIDString = C38A09C41A4619A900D45436; remoteInfo = "CorePlot-CocoaTouchTests"; }; + C3CBFB791BE590A300519EE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C3CBFB7B1BE590A300519EE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BC93AA7C0FDEFEAC00606226 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -93,7 +107,7 @@ 13E42FBA07B3F13500E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 1DDD58290DA1D0D100B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/CPTPlotDocument.xib; sourceTree = ""; }; 1DDD582B0DA1D0D100B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; - 2A37F4ACFDCFA73011CA2CEA /* CPTPlotDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotDocument.m; sourceTree = ""; }; + 2A37F4ACFDCFA73011CA2CEA /* CPTPlotDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTPlotDocument.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 2A37F4AEFDCFA73011CA2CEA /* CPTPlotDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotDocument.h; sourceTree = ""; }; 2A37F4B0FDCFA73011CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 2A37F4BAFDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = ""; }; @@ -219,6 +233,8 @@ C3B345AA1B46194500844218 /* UnitTests iOS.xctest */, C3B345AC1B46194500844218 /* libCorePlot-CocoaTouch.a */, C3B345AE1B46194500844218 /* CorePlot-CocoaTouchTests.xctest */, + C3CBFB7A1BE590A300519EE8 /* CorePlot.framework */, + C3CBFB7C1BE590A300519EE8 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -322,6 +338,20 @@ remoteRef = C3B345AD1B46194500844218 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C3CBFB7A1BE590A300519EE8 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C3CBFB791BE590A300519EE8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C3CBFB7C1BE590A300519EE8 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C3CBFB7B1BE590A300519EE8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ diff --git a/examples/StockPlot/Classes/APYahooDataPuller.h b/examples/StockPlot/Classes/APYahooDataPuller.h index 96162db43..4c6cc0676 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.h +++ b/examples/StockPlot/Classes/APYahooDataPuller.h @@ -2,7 +2,7 @@ @class APYahooDataPuller; -typedef NSArray *CPTFinancialDataArray; +typedef NSArray CPTFinancialDataArray; @protocol APYahooDataPullerDelegate @@ -22,7 +22,7 @@ typedef NSArray *CPTFinancialDataArray; @property (nonatomic, readwrite, copy) NSString *targetSymbol; @property (nonatomic, readwrite, strong) NSDate *targetStartDate; @property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; +@property (nonatomic, readonly, strong) CPTFinancialDataArray *financialData; @property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; @property (nonatomic, readonly, assign) BOOL loadingData; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index 576bb536d..ea06c417d 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -7,7 +7,7 @@ @interface APYahooDataPuller() @property (nonatomic, readwrite, strong) NSDecimalNumber *overallHigh; @property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; -@property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; +@property (nonatomic, readwrite, strong) CPTFinancialDataArray *financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; @property (nonatomic, readwrite, strong) NSMutableData *receivedData; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 3adbef4c7..531942439 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -127,7 +127,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI num = @(index + 1); } else if ( fieldEnum == CPTScatterPlotFieldY ) { - CPTFinancialDataArray financialData = self.dataPuller.financialData; + CPTFinancialDataArray *financialData = self.dataPuller.financialData; CPTDictionary *fData = financialData[[financialData count] - index - 1]; num = fData[@"close"]; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 7bde24845..e36f23a1e 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -955,7 +955,7 @@ 07B69A5B12B6215000F4C16C /* CPTTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTextStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07B69A5C12B6215000F4C16C /* CPTTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTextStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07B69B1512B62ABB00F4C16C /* CPTMutableLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableLineStyle.h; sourceTree = ""; }; - 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableLineStyle.m; sourceTree = ""; }; + 07B69B1612B62ABB00F4C16C /* CPTMutableLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTMutableLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D630F2B70B8002FCEA7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 07BF0D700F2B718F002FCEA7 /* CPTGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTGraph.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0D710F2B718F002FCEA7 /* CPTGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTGraph.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -1004,7 +1004,7 @@ 4C97EF07104D80D400B554F9 /* CPTNumericDataTypeConversionTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericDataTypeConversionTests.h; sourceTree = ""; }; 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTNumericDataTypeConversionTests.m; sourceTree = ""; }; 4C97EF10104D819100B554F9 /* CPTMutableNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableNumericData.h; sourceTree = ""; }; - 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableNumericData.m; sourceTree = ""; }; + 4C97EF11104D819100B554F9 /* CPTMutableNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTMutableNumericData.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4C97EF4C104D843E00B554F9 /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license.txt; sourceTree = ""; }; 4C9A745D0FB24C7200918464 /* CPTDataSourceTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTDataSourceTestCase.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTDataSourceTestCase.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index adead6796..0c2248b1f 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -6,7 +6,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary * attributes +/** @property CPTDictionary *attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 46749b088..45e43b968 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -13,13 +13,13 @@ static NSString *const CPTAnimationFinishedKey = @"CPTAnimationFinishedKey"; /// @cond -typedef NSMutableArray *CPTMutableAnimationArray; +typedef NSMutableArray CPTMutableAnimationArray; @interface CPTAnimation() @property (nonatomic, readwrite, assign) CGFloat timeOffset; -@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray animationOperations; -@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray runningAnimationOperations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray *animationOperations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray *runningAnimationOperations; @property (nonatomic, readwrite) dispatch_source_t timer; @property (nonatomic, readwrite) dispatch_queue_t animationQueue; @@ -61,14 +61,14 @@ @implementation CPTAnimation @synthesize defaultAnimationCurve; /** @internal - * @property CPTMutableAnimationArray animationOperations + * @property CPTMutableAnimationArray *animationOperations * * @brief The list of animation operations currently running or waiting to run. **/ @synthesize animationOperations; /** @internal - * @property CPTMutableAnimationArray runningAnimationOperations + * @property CPTMutableAnimationArray *runningAnimationOperations * @brief The list of running animation operations. **/ @synthesize runningAnimationOperations; @@ -262,9 +262,9 @@ -(void)update { self.timeOffset += kCPTAnimationFrameRate; - CPTMutableAnimationArray theAnimationOperations = self.animationOperations; - CPTMutableAnimationArray runningOperations = self.runningAnimationOperations; - CPTMutableAnimationArray expiredOperations = [[NSMutableArray alloc] init]; + CPTMutableAnimationArray *theAnimationOperations = self.animationOperations; + CPTMutableAnimationArray *runningOperations = self.runningAnimationOperations; + CPTMutableAnimationArray *expiredOperations = [[NSMutableArray alloc] init]; CGFloat currentTime = self.timeOffset; CPTStringArray *runModes = @[NSRunLoopCommonModes]; diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index 9bab1b560..c137e66ee 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -9,12 +9,13 @@ /** * @brief An array of annotations. **/ -typedef NSArray<__kindof CPTAnnotation *> *CPTAnnotationArray; +typedef NSArray<__kindof CPTAnnotation *> CPTAnnotationArray; /** * @brief A mutable array of annotations. **/ -typedef NSMutableArray<__kindof CPTAnnotation *> *CPTMutableAnnotationArray; +typedef NSMutableArray<__kindof CPTAnnotation *> CPTMutableAnnotationArray +; @interface CPTAnnotation : NSObject diff --git a/framework/Source/CPTAnnotationHostLayer.h b/framework/Source/CPTAnnotationHostLayer.h index 56c71ce95..a8217fa32 100644 --- a/framework/Source/CPTAnnotationHostLayer.h +++ b/framework/Source/CPTAnnotationHostLayer.h @@ -3,7 +3,7 @@ @interface CPTAnnotationHostLayer : CPTLayer -@property (nonatomic, readonly, nonnull) CPTAnnotationArray annotations; +@property (nonatomic, readonly, nonnull) CPTAnnotationArray *annotations; /// @name Annotations /// @{ diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index cbee41637..b2d4129ca 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -5,7 +5,7 @@ /// @cond @interface CPTAnnotationHostLayer() -@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnnotationArray mutableAnnotations; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableAnnotationArray *mutableAnnotations; @end @@ -20,7 +20,7 @@ @interface CPTAnnotationHostLayer() **/ @implementation CPTAnnotationHostLayer -/** @property CPTAnnotationArray annotations +/** @property CPTAnnotationArray *annotations * @brief An array of annotations attached to this layer. **/ @dynamic annotations; @@ -80,7 +80,7 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - CPTAnnotationArray annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; + CPTAnnotationArray *annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; if ( annotations ) { mutableAnnotations = [annotations mutableCopy]; } @@ -96,7 +96,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder #pragma mark - #pragma mark Annotations --(CPTAnnotationArray)annotations +-(CPTAnnotationArray *)annotations { return [self.mutableAnnotations copy]; } @@ -107,7 +107,7 @@ -(CPTAnnotationArray)annotations -(void)addAnnotation:(CPTAnnotation *)annotation { if ( annotation ) { - CPTMutableAnnotationArray annotationArray = self.mutableAnnotations; + CPTMutableAnnotationArray *annotationArray = self.mutableAnnotations; if ( ![annotationArray containsObject:annotation] ) { [annotationArray addObject:annotation]; } @@ -138,7 +138,7 @@ -(void)removeAnnotation:(CPTAnnotation *)annotation **/ -(void)removeAllAnnotations { - CPTMutableAnnotationArray allAnnotations = self.mutableAnnotations; + CPTMutableAnnotationArray *allAnnotations = self.mutableAnnotations; for ( CPTAnnotation *annotation in allAnnotations ) { annotation.annotationHostLayer = nil; @@ -151,12 +151,12 @@ -(void)removeAllAnnotations /// @cond --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout { - CPTMutableAnnotationArray annotations = self.mutableAnnotations; + CPTMutableAnnotationArray *annotations = self.mutableAnnotations; if ( annotations.count > 0 ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index 9c978d4db..3209b2859 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -32,12 +32,12 @@ typedef NS_ENUM (NSInteger, CPTAxisLabelingPolicy) { /** * @brief An array of axes. **/ -typedef NSArray<__kindof CPTAxis *> *CPTAxisArray; +typedef NSArray<__kindof CPTAxis *> CPTAxisArray; /** * @brief A mutable array of axes. **/ -typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; +typedef NSMutableArray<__kindof CPTAxis *> CPTMutableAxisArray; #pragma mark - @@ -236,10 +236,10 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; @property (nonatomic, readwrite, assign) CPTSign minorTickLabelDirection; @property (nonatomic, readwrite, strong, nullable) NSFormatter *labelFormatter; @property (nonatomic, readwrite, strong, nullable) NSFormatter *minorTickLabelFormatter; -@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet axisLabels; -@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet minorTickAxisLabels; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet *axisLabels; +@property (nonatomic, readwrite, strong, nullable) CPTAxisLabelSet *minorTickAxisLabels; @property (nonatomic, readonly) BOOL needsRelabel; -@property (nonatomic, readwrite, strong, nullable) CPTPlotRangeArray labelExclusionRanges; +@property (nonatomic, readwrite, strong, nullable) CPTPlotRangeArray *labelExclusionRanges; @property (nonatomic, readwrite, strong, nullable) CPTShadow *labelShadow; @property (nonatomic, readwrite, strong, nullable) CPTShadow *minorTickLabelShadow; /// @} @@ -270,8 +270,8 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; /// @name Background Bands /// @{ -@property (nonatomic, readwrite, copy, nullable) CPTFillArray alternatingBandFills; -@property (nonatomic, readonly, nullable) CPTLimitBandArray backgroundLimitBands; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray *alternatingBandFills; +@property (nonatomic, readonly, nullable) CPTLimitBandArray *backgroundLimitBands; /// @} /// @name Plot Space diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index a5ce88dd1..b93c8d7c0 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -38,7 +38,7 @@ @interface CPTAxis() @property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; @property (nonatomic, readwrite, assign) BOOL labelFormatterChanged; @property (nonatomic, readwrite, assign) BOOL minorLabelFormatterChanged; -@property (nonatomic, readwrite, strong, nullable) CPTMutableLimitBandArray mutableBackgroundLimitBands; +@property (nonatomic, readwrite, strong, nullable) CPTMutableLimitBandArray *mutableBackgroundLimitBands; @property (nonatomic, readonly) CGFloat tickOffset; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @property (nonatomic, readwrite, assign) BOOL labelsUpdated; @@ -293,12 +293,12 @@ @implementation CPTAxis @synthesize minorLabelFormatterChanged; @dynamic tickOffset; -/** @property CPTAxisLabelSet axisLabels +/** @property CPTAxisLabelSet *axisLabels * @brief The set of axis labels. **/ @synthesize axisLabels; -/** @property CPTAxisLabelSet minorTickAxisLabels +/** @property CPTAxisLabelSet *minorTickAxisLabels * @brief The set of minor tick axis labels. **/ @synthesize minorTickAxisLabels; @@ -308,7 +308,7 @@ @implementation CPTAxis **/ @synthesize needsRelabel; -/** @property CPTPlotRangeArray labelExclusionRanges +/** @property CPTPlotRangeArray *labelExclusionRanges * @brief An array of CPTPlotRange objects. Any tick marks and labels falling inside any of the ranges in the array will not be drawn. **/ @synthesize labelExclusionRanges; @@ -341,7 +341,7 @@ @implementation CPTAxis **/ @synthesize majorTickLength; -/** @property CPTNumberSet * majorTickLocations +/** @property CPTNumberSet *majorTickLocations * @brief A set of axis coordinates for all major tick marks. **/ @synthesize majorTickLocations; @@ -372,7 +372,7 @@ @implementation CPTAxis **/ @synthesize minorTickLength; -/** @property CPTNumberSet * minorTickLocations +/** @property CPTNumberSet *minorTickLocations * @brief A set of axis coordinates for all minor tick marks. **/ @synthesize minorTickLocations; @@ -401,7 +401,7 @@ @implementation CPTAxis // Background Bands -/** @property CPTFillArray alternatingBandFills +/** @property CPTFillArray *alternatingBandFills * @brief An array of two or more fills to be drawn between successive major tick marks. * * When initializing the fills, provide an NSArray containing any combination of CPTFill, @@ -410,7 +410,7 @@ @implementation CPTAxis **/ @synthesize alternatingBandFills; -/** @property CPTLimitBandArray backgroundLimitBands +/** @property CPTLimitBandArray *backgroundLimitBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn on top of the alternating band fills. @@ -1406,7 +1406,7 @@ NSDecimal CPTNiceLength(NSDecimal length) */ -(CPTNumberSet *)filteredTickLocations:(CPTNumberSet *)allLocations { - CPTPlotRangeArray exclusionRanges = self.labelExclusionRanges; + CPTPlotRangeArray *exclusionRanges = self.labelExclusionRanges; if ( exclusionRanges ) { CPTMutableNumberSet *filteredLocations = [allLocations mutableCopy]; @@ -1552,7 +1552,7 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet *)locations inRange:(CPTPlotRan CPTPlotArea *thePlotArea = self.plotArea; [thePlotArea setAxisSetLayersForType:CPTGraphLayerTypeAxisLabels]; - CPTMutableAxisLabelSet oldAxisLabels; + CPTMutableAxisLabelSet *oldAxisLabels; if ( useMajorAxisLabels ) { oldAxisLabels = [self.axisLabels mutableCopy]; } @@ -1560,10 +1560,10 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet *)locations inRange:(CPTPlotRan oldAxisLabels = [self.minorTickAxisLabels mutableCopy]; } - CPTMutableAxisLabelSet newAxisLabels = [[NSMutableSet alloc] initWithCapacity:locations.count]; - CPTAxisLabel *blankLabel = [[CPTAxisLabel alloc] initWithText:nil textStyle:nil]; - CPTAxisLabelGroup *axisLabelGroup = thePlotArea.axisLabelGroup; - CPTLayer *lastLayer = nil; + CPTMutableAxisLabelSet *newAxisLabels = [[NSMutableSet alloc] initWithCapacity:locations.count]; + CPTAxisLabel *blankLabel = [[CPTAxisLabel alloc] initWithText:nil textStyle:nil]; + CPTAxisLabelGroup *axisLabelGroup = thePlotArea.axisLabelGroup; + CPTLayer *lastLayer = nil; for ( NSDecimalNumber *tickLocation in locations ) { if ( labeledRange && ![labeledRange containsNumber:tickLocation] ) { @@ -2211,7 +2211,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxisLabels:(CPTAxisLabelSet)newLabels +-(void)setAxisLabels:(CPTAxisLabelSet *)newLabels { if ( newLabels != axisLabels ) { if ( self.labelsUpdated ) { @@ -2251,7 +2251,7 @@ -(void)setAxisLabels:(CPTAxisLabelSet)newLabels } } --(void)setMinorTickAxisLabels:(CPTAxisLabelSet)newLabels +-(void)setMinorTickAxisLabels:(CPTAxisLabelSet *)newLabels { if ( newLabels != minorTickAxisLabels ) { if ( self.labelsUpdated ) { @@ -2493,7 +2493,7 @@ -(NSNumber *)titleLocation } } --(void)setLabelExclusionRanges:(CPTPlotRangeArray)ranges +-(void)setLabelExclusionRanges:(CPTPlotRangeArray *)ranges { if ( ranges != labelExclusionRanges ) { labelExclusionRanges = ranges; @@ -3068,7 +3068,7 @@ -(void)setMajorGridLines:(CPTGridLines *)newGridLines } } --(void)setAlternatingBandFills:(CPTFillArray)newFills +-(void)setAlternatingBandFills:(CPTFillArray *)newFills { if ( newFills != alternatingBandFills ) { Class nullClass = [NSNull class]; @@ -3090,9 +3090,9 @@ -(void)setAlternatingBandFills:(CPTFillArray)newFills Class gradientClass = [CPTGradient class]; Class imageClass = [CPTImage class]; - CPTMutableFillArray fillArray = [newFills mutableCopy]; - NSUInteger i = 0; - CPTFill *newFill = nil; + CPTMutableFillArray *fillArray = [newFills mutableCopy]; + NSUInteger i = 0; + CPTFill *newFill = nil; for ( id obj in newFills ) { if ( [obj isKindOfClass:nullClass] || [obj isKindOfClass:fillClass] ) { @@ -3128,7 +3128,7 @@ -(void)setAlternatingBandFills:(CPTFillArray)newFills } } --(CPTLimitBandArray)backgroundLimitBands +-(CPTLimitBandArray *)backgroundLimitBands { return [self.mutableBackgroundLimitBands copy]; } diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index 954ccda40..981e3d07c 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -9,12 +9,12 @@ /** * @brief A set of CPTAxisLabel objects. **/ -typedef NSSet *CPTAxisLabelSet; +typedef NSSet CPTAxisLabelSet; /** * @brief A mutable set of CPTAxisLabel objects. **/ -typedef NSMutableSet *CPTMutableAxisLabelSet; +typedef NSMutableSet CPTMutableAxisLabelSet; @interface CPTAxisLabel : NSObject diff --git a/framework/Source/CPTAxisSet.h b/framework/Source/CPTAxisSet.h index ff41332a3..93bf35cda 100644 --- a/framework/Source/CPTAxisSet.h +++ b/framework/Source/CPTAxisSet.h @@ -7,7 +7,7 @@ /// @name Axes /// @{ -@property (nonatomic, readwrite, strong, nullable) CPTAxisArray axes; +@property (nonatomic, readwrite, strong, nullable) CPTAxisArray *axes; /// @} /// @name Drawing diff --git a/framework/Source/CPTAxisSet.m b/framework/Source/CPTAxisSet.m index 55674657e..09b46da3b 100644 --- a/framework/Source/CPTAxisSet.m +++ b/framework/Source/CPTAxisSet.m @@ -9,7 +9,7 @@ **/ @implementation CPTAxisSet -/** @property CPTAxisArray axes +/** @property CPTAxisArray *axes * @brief The axes in the axis set. **/ @synthesize axes; @@ -110,7 +110,7 @@ -(void)display **/ -(void)relabelAxes { - CPTAxisArray theAxes = self.axes; + CPTAxisArray *theAxes = self.axes; [theAxes makeObjectsPerformSelector:@selector(setNeedsLayout)]; [theAxes makeObjectsPerformSelector:@selector(setNeedsRelabel)]; @@ -210,7 +210,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxes:(CPTAxisArray)newAxes +-(void)setAxes:(CPTAxisArray *)newAxes { if ( newAxes != axes ) { for ( CPTAxis *axis in axes ) { diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index f274b0f17..3e7f7ff0c 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -47,7 +47,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of bar fills. **/ --(nullable CPTFillArray)barFillsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray *)barFillsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar fill for the given bar plot. * This method will not be called if @@ -65,7 +65,7 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable CPTLineStyleArray)barLineStylesForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray *)barLineStylesForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given bar plot. * This method will not be called if diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index de05cf64a..74313d0bd 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -39,8 +39,8 @@ @interface CPTBarPlot() @property (nonatomic, readwrite, copy) CPTNumberArray *barLocations; @property (nonatomic, readwrite, copy) CPTNumberArray *barTips; @property (nonatomic, readwrite, copy) CPTNumberArray *barBases; -@property (nonatomic, readwrite, copy) CPTFillArray barFills; -@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; +@property (nonatomic, readwrite, copy) CPTFillArray *barFills; +@property (nonatomic, readwrite, copy) CPTLineStyleArray *barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint:(CGPoint *)tipPoint; @@ -491,9 +491,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barFillForBarPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource barFillForBarPlot:self recordIndex:idx]; @@ -543,9 +543,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barLineStyleForBarPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource barLineStyleForBarPlot:self recordIndex:idx]; @@ -1500,23 +1500,23 @@ -(void)setBarLocations:(CPTNumberArray *)newLocations [self cacheNumbers:newLocations forField:CPTBarPlotFieldBarLocation]; } --(CPTFillArray)barFills +-(CPTFillArray *)barFills { return [self cachedArrayForKey:CPTBarPlotBindingBarFills]; } --(void)setBarFills:(CPTFillArray)newBarFills +-(void)setBarFills:(CPTFillArray *)newBarFills { [self cacheArray:newBarFills forKey:CPTBarPlotBindingBarFills]; [self setNeedsDisplay]; } --(CPTLineStyleArray)barLineStyles +-(CPTLineStyleArray *)barLineStyles { return [self cachedArrayForKey:CPTBarPlotBindingBarLineStyles]; } --(void)setBarLineStyles:(CPTLineStyleArray)newBarLineStyles +-(void)setBarLineStyles:(CPTLineStyleArray *)newBarLineStyles { [self cacheArray:newBarLineStyles forKey:CPTBarPlotBindingBarLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTDataSourceTestCase.h b/framework/Source/CPTDataSourceTestCase.h index 62b7b9a40..2f64b1a61 100644 --- a/framework/Source/CPTDataSourceTestCase.h +++ b/framework/Source/CPTDataSourceTestCase.h @@ -11,7 +11,7 @@ @property (nonatomic, readwrite, assign) NSUInteger nRecords; @property (nonatomic, readonly, strong) CPTPlotRange *xRange; @property (nonatomic, readonly, strong) CPTPlotRange *yRange; -@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; +@property (nonatomic, readwrite, strong) CPTMutablePlotArray *plots; -(void)buildData; diff --git a/framework/Source/CPTFill.h b/framework/Source/CPTFill.h index 990f30ef9..04a8b44fd 100644 --- a/framework/Source/CPTFill.h +++ b/framework/Source/CPTFill.h @@ -8,12 +8,12 @@ /** * @brief An array of fills. **/ -typedef NSArray *CPTFillArray; +typedef NSArray CPTFillArray; /** * @brief A mutable array of fills. **/ -typedef NSMutableArray *CPTMutableFillArray; +typedef NSMutableArray CPTMutableFillArray; @interface CPTFill : NSObject diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 80ac78178..5fb430f5f 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -99,7 +99,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Retrieving Plots /// @{ --(nonnull CPTPlotArray)allPlots; +-(nonnull CPTPlotArray *)allPlots; -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; /// @} @@ -116,7 +116,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Retrieving Plot Spaces /// @{ --(nonnull CPTPlotSpaceArray)allPlotSpaces; +-(nonnull CPTPlotSpaceArray *)allPlotSpaces; -(nullable CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx; -(nullable CPTPlotSpace *)plotSpaceWithIdentifier:(nullable id)identifier; /// @} diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index a238541fb..50ed2901e 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -30,8 +30,8 @@ /// @cond @interface CPTGraph() -@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray plots; -@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotSpaceArray plotSpaces; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray *plots; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotSpaceArray *plotSpaces; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *titleAnnotation; @property (nonatomic, readwrite, strong) CPTLayerAnnotation *legendAnnotation; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; @@ -83,12 +83,12 @@ @implementation CPTGraph /// @cond -/** @property CPTMutablePlotArray plots +/** @property CPTMutablePlotArray *plots * @brief An array of all plots associated with the graph. **/ @synthesize plots; -/** @property CPTMutablePlotSpaceArray plotSpaces +/** @property CPTMutablePlotSpaceArray *plotSpaces * @brief An array of all plot spaces associated with the graph. **/ @synthesize plotSpaces; @@ -100,7 +100,7 @@ @implementation CPTGraph **/ @dynamic defaultPlotSpace; -/** @property CPTNumberArray * topDownLayerOrder +/** @property CPTNumberArray *topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * @see CPTPlotArea @link CPTPlotArea::topDownLayerOrder topDownLayerOrder @endlink property. **/ @@ -313,7 +313,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; plotAreaFrame = [coder decodeObjectForKey:@"CPTGraph.plotAreaFrame"]; - CPTPlotArray plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; + CPTPlotArray *plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; if ( plotArray ) { plots = [plotArray mutableCopy]; } @@ -321,7 +321,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder plots = [[NSMutableArray alloc] init]; } - CPTPlotSpaceArray plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; + CPTPlotSpaceArray *plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; if ( plotSpaceArray ) { plotSpaces = [plotSpaceArray mutableCopy]; } @@ -409,7 +409,7 @@ -(void)reloadDataIfNeeded /** @brief All plots associated with the graph. * @return An array of all plots associated with the graph. **/ --(CPTPlotArray)allPlots +-(CPTPlotArray *)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -533,7 +533,7 @@ -(CPTPlotSpace *)defaultPlotSpace /** @brief All plot spaces associated with the graph. * @return An array of all plot spaces associated with the graph. **/ --(CPTPlotSpaceArray)allPlotSpaces +-(CPTPlotSpaceArray *)allPlotSpaces { return [NSArray arrayWithArray:self.plotSpaces]; } diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 434d7f2e2..701c11350 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -20,22 +20,22 @@ extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /** * @brief An array of CALayer objects. **/ -typedef NSArray *CPTSublayerArray; +typedef NSArray CPTSublayerArray; /** * @brief A mutable array of CALayer objects. **/ -typedef NSMutableArray *CPTMutableSublayerArray; +typedef NSMutableArray CPTMutableSublayerArray; /** * @brief A set of CALayer objects. **/ -typedef NSSet *CPTSublayerSet; +typedef NSSet CPTSublayerSet; /** * @brief A mutable set of CALayer objects. **/ -typedef NSMutableSet *CPTMutableSublayerSet; +typedef NSMutableSet CPTMutableSublayerSet; @interface CPTLayer : CALayer @@ -76,7 +76,7 @@ typedef NSMutableSet *CPTMutableSublayerSet; /// @name Layout /// @{ -@property (nonatomic, readonly, nullable) CPTSublayerSet sublayersExcludedFromAutomaticLayout; +@property (nonatomic, readonly, nullable) CPTSublayerSet *sublayersExcludedFromAutomaticLayout; /// @} /// @name Initialization diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index e3bed66e1..9ffa20897 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -123,7 +123,7 @@ @implementation CPTLayer **/ @dynamic sublayerMaskingPath; -/** @property CPTSublayerSet sublayersExcludedFromAutomaticLayout +/** @property CPTSublayerSet *sublayersExcludedFromAutomaticLayout * @brief A set of sublayers that should be excluded from the automatic sublayer layout. **/ @dynamic sublayersExcludedFromAutomaticLayout; @@ -367,7 +367,7 @@ -(void)recursivelyRenderInContext:(CGContextRef)context self.renderingRecursively = NO; // render sublayers - CPTSublayerArray sublayersCopy = [self.sublayers copy]; + CPTSublayerArray *sublayersCopy = [self.sublayers copy]; for ( CALayer *currentSublayer in sublayersCopy ) { CGContextSaveGState(context); @@ -615,7 +615,7 @@ -(void)layoutSublayers { CGRect selfBounds = self.bounds; - CPTSublayerArray mySublayers = self.sublayers; + CPTSublayerArray *mySublayers = self.sublayers; if ( mySublayers.count > 0 ) { CGFloat leftPadding, topPadding, rightPadding, bottomPadding; @@ -634,8 +634,8 @@ -(void)layoutSublayers subLayerFrame.origin = CGPointMake( round(leftPadding), round(bottomPadding) ); subLayerFrame.size = subLayerSize; - CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; - Class layerClass = [CPTLayer class]; + CPTSublayerSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in mySublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { subLayer.frame = subLayerFrame; @@ -646,7 +646,7 @@ -(void)layoutSublayers /// @} --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout { return nil; } @@ -670,7 +670,7 @@ -(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)ri /// @cond --(void)setSublayers:(CPTSublayerArray)sublayers +-(void)setSublayers:(CPTSublayerArray *)sublayers { [super setSublayers:sublayers]; diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index 1e864f751..b309a1641 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -201,19 +201,19 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; /// @name Factory Methods /// @{ -+(nonnull instancetype)legendWithPlots:(nullable CPTPlotArray)newPlots; ++(nonnull instancetype)legendWithPlots:(nullable CPTPlotArray *)newPlots; +(nonnull instancetype)legendWithGraph:(nullable __kindof CPTGraph *)graph; /// @} /// @name Initialization /// @{ --(nonnull instancetype)initWithPlots:(nullable CPTPlotArray)newPlots; +-(nonnull instancetype)initWithPlots:(nullable CPTPlotArray *)newPlots; -(nonnull instancetype)initWithGraph:(nullable __kindof CPTGraph *)graph; /// @} /// @name Plots /// @{ --(nonnull CPTPlotArray)allPlots; +-(nonnull CPTPlotArray *)allPlots; -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx; -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier; diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 1a21ac1e7..55afc4230 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -27,8 +27,8 @@ /// @cond @interface CPTLegend() -@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; -@property (nonatomic, readwrite, strong) CPTMutableLegendEntryArray legendEntries; +@property (nonatomic, readwrite, strong) CPTMutablePlotArray *plots; +@property (nonatomic, readwrite, strong) CPTMutableLegendEntryArray *legendEntries; @property (nonatomic, readwrite, strong) CPTNumberArray *rowHeightsThatFit; @property (nonatomic, readwrite, strong) CPTNumberArray *columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; @@ -160,7 +160,7 @@ @implementation CPTLegend **/ @synthesize equalColumns; -/** @property CPTNumberArray * rowHeights +/** @property CPTNumberArray *rowHeights * @brief The desired height of each row of legend entries, including the swatch and title. * Each element in this array should be an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). If @nil, all rows will be sized automatically. @@ -169,14 +169,14 @@ @implementation CPTLegend **/ @synthesize rowHeights; -/** @property CPTNumberArray * rowHeightsThatFit +/** @property CPTNumberArray *rowHeightsThatFit * @brief The computed best-fit height of each row of legend entries, including the swatch and title. * Each element in this array is an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). **/ @synthesize rowHeightsThatFit; -/** @property CPTNumberArray * columnWidths +/** @property CPTNumberArray *columnWidths * @brief The desired width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array should be an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). If @nil, all columns will be sized automatically. @@ -185,7 +185,7 @@ @implementation CPTLegend **/ @synthesize columnWidths; -/** @property CPTNumberArray * columnWidthsThatFit +/** @property CPTNumberArray *columnWidthsThatFit * @brief The computed best-fit width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array is an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). @@ -207,12 +207,12 @@ @implementation CPTLegend **/ @synthesize titleOffset; -/** @property CPTMutablePlotArray plots +/** @property CPTMutablePlotArray *plots * @brief An array of all plots associated with the legend. **/ @synthesize plots; -/** @property CPTMutableLegendEntryArray legendEntries +/** @property CPTMutableLegendEntryArray *legendEntries * @brief An array of all legend entries. **/ @synthesize legendEntries; @@ -235,7 +235,7 @@ @implementation CPTLegend * @param newPlots An array of plots. * @return A new CPTLegend instance. **/ -+(instancetype)legendWithPlots:(CPTPlotArray)newPlots ++(instancetype)legendWithPlots:(CPTPlotArray *)newPlots { return [[self alloc] initWithPlots:newPlots]; } @@ -339,7 +339,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame * @param newPlots An array of plots. * @return The initialized CPTLegend object. **/ --(instancetype)initWithPlots:(CPTPlotArray)newPlots +-(instancetype)initWithPlots:(CPTPlotArray *)newPlots { if ( (self = [self initWithFrame:CGRectZero]) ) { for ( CPTPlot *plot in newPlots ) { @@ -830,7 +830,7 @@ -(void)recalculateLayout /** @brief All plots associated with the legend. * @return An array of all plots associated with the legend. **/ --(CPTPlotArray)allPlots +-(CPTPlotArray *)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -875,9 +875,9 @@ -(void)addPlot:(CPTPlot *)plot [self.plots addObject:plot]; self.layoutChanged = YES; - CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; - CPTTextStyle *theTextStyle = self.textStyle; - NSUInteger numberOfLegendEntries = [plot numberOfLegendEntries]; + CPTMutableLegendEntryArray *theLegendEntries = self.legendEntries; + CPTTextStyle *theTextStyle = self.textStyle; + NSUInteger numberOfLegendEntries = [plot numberOfLegendEntries]; for ( NSUInteger i = 0; i < numberOfLegendEntries; i++ ) { NSString *newTitle = [plot titleForLegendEntryAtIndex:i]; if ( newTitle ) { @@ -901,11 +901,11 @@ -(void)addPlot:(CPTPlot *)plot -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx { if ( [plot isKindOfClass:[CPTPlot class]] ) { - CPTMutablePlotArray thePlots = self.plots; + CPTMutablePlotArray *thePlots = self.plots; NSAssert(idx <= thePlots.count, @"index greater than the number of plots"); - CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; - NSUInteger legendEntryIndex = 0; + CPTMutableLegendEntryArray *theLegendEntries = self.legendEntries; + NSUInteger legendEntryIndex = 0; if ( idx == thePlots.count ) { legendEntryIndex = theLegendEntries.count; } @@ -983,8 +983,8 @@ -(void)removePlotWithIdentifier:(id)identifier **/ -(void)removeLegendEntriesForPlot:(CPTPlot *)plot { - CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; - CPTMutableLegendEntryArray entriesToRemove = [[NSMutableArray alloc] init]; + CPTMutableLegendEntryArray *theLegendEntries = self.legendEntries; + CPTMutableLegendEntryArray *entriesToRemove = [[NSMutableArray alloc] init]; for ( CPTLegendEntry *legendEntry in theLegendEntries ) { if ( legendEntry.plot == plot ) { @@ -1016,7 +1016,7 @@ -(void)legendNeedsReloadEntries:(NSNotification *)notif { CPTPlot *thePlot = (CPTPlot *)notif.object; - CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; + CPTMutableLegendEntryArray *theLegendEntries = self.legendEntries; NSUInteger legendEntryIndex = 0; diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index f9fbe5d90..661e00936 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -9,12 +9,12 @@ /** * @brief An array of CPTLegendEntry objects. **/ -typedef NSArray *CPTLegendEntryArray; +typedef NSArray CPTLegendEntryArray; /** * @brief A mutable array of CPTLegendEntry objects. **/ -typedef NSMutableArray *CPTMutableLegendEntryArray; +typedef NSMutableArray CPTMutableLegendEntryArray; @interface CPTLegendEntry : NSObject diff --git a/framework/Source/CPTLimitBand.h b/framework/Source/CPTLimitBand.h index dcda555e5..143917626 100644 --- a/framework/Source/CPTLimitBand.h +++ b/framework/Source/CPTLimitBand.h @@ -7,12 +7,12 @@ /** * @brief An array of limit bands. **/ -typedef NSArray *CPTLimitBandArray; +typedef NSArray CPTLimitBandArray; /** * @brief A mutable array of limit bands. **/ -typedef NSMutableArray *CPTMutableLimitBandArray; +typedef NSMutableArray CPTMutableLimitBandArray; @interface CPTLimitBand : NSObject diff --git a/framework/Source/CPTLineStyle.h b/framework/Source/CPTLineStyle.h index bd3d48dbf..c0ac10bd1 100644 --- a/framework/Source/CPTLineStyle.h +++ b/framework/Source/CPTLineStyle.h @@ -10,12 +10,12 @@ /** * @brief An array of line styles. **/ -typedef NSArray *CPTLineStyleArray; +typedef NSArray CPTLineStyleArray; /** * @brief A mutable array of line styles. **/ -typedef NSMutableArray *CPTMutableLineStyleArray; +typedef NSMutableArray CPTMutableLineStyleArray; @interface CPTLineStyle : NSObject diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index 86f2988b3..465127d19 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -65,7 +65,7 @@ @implementation CPTLineStyle **/ @synthesize lineWidth; -/** @property CPTNumberArray * dashPattern +/** @property CPTNumberArray *dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @synthesize dashPattern; diff --git a/framework/Source/CPTMutableLineStyle.m b/framework/Source/CPTMutableLineStyle.m index 3f01815b1..e751b6631 100644 --- a/framework/Source/CPTMutableLineStyle.m +++ b/framework/Source/CPTMutableLineStyle.m @@ -29,7 +29,7 @@ @implementation CPTMutableLineStyle **/ @dynamic lineWidth; -/** @property CPTNumberArray * dashPattern +/** @property CPTNumberArray *dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @dynamic dashPattern; diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 9b0546494..366b92bd4 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -29,7 +29,7 @@ @implementation CPTMutableNumericData **/ @dynamic mutableBytes; -/** @property CPTNumberArray * shape +/** @property CPTNumberArray *shape * @brief The shape of the data buffer array. Set a new shape to change the size of the data buffer. * * The shape describes the dimensions of the sample array stored in diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index e6b61a873..3c29c81f9 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -81,7 +81,7 @@ @implementation CPTNumericData **/ @dynamic byteOrder; -/** @property CPTNumberArray * shape +/** @property CPTNumberArray *shape * @brief The shape of the data buffer array. * * The shape describes the dimensions of the sample array stored in diff --git a/framework/Source/CPTPieChart.h b/framework/Source/CPTPieChart.h index 6b9242d8f..1ff0d9587 100644 --- a/framework/Source/CPTPieChart.h +++ b/framework/Source/CPTPieChart.h @@ -49,7 +49,7 @@ typedef NS_ENUM (NSInteger, CPTPieDirection) { * @param indexRange The range of the data indexes of interest. * @return An array of pie slice fills. **/ --(nullable CPTFillArray)sliceFillsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray *)sliceFillsForPieChart:(nonnull CPTPieChart *)pieChart recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a fill for the given pie chart slice. * This method will not be called if diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index feebac78f..4afdaa4fa 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -33,7 +33,7 @@ @interface CPTPieChart() @property (nonatomic, readwrite, copy) CPTNumberArray *sliceWidths; -@property (nonatomic, readwrite, copy) CPTFillArray sliceFills; +@property (nonatomic, readwrite, copy) CPTFillArray *sliceFills; @property (nonatomic, readwrite, copy) CPTNumberArray *sliceRadialOffsets; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @@ -479,9 +479,9 @@ -(void)reloadSliceFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(sliceFillForPieChart:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource sliceFillForPieChart:self recordIndex:idx]; @@ -1364,12 +1364,12 @@ -(void)setSliceWidths:(CPTNumberArray *)newSliceWidths [self updateNormalizedData]; } --(CPTFillArray)sliceFills +-(CPTFillArray *)sliceFills { return [self cachedArrayForKey:CPTPieChartBindingPieSliceFills]; } --(void)setSliceFills:(CPTFillArray)newSliceFills +-(void)setSliceFills:(CPTFillArray *)newSliceFills { [self cacheArray:newSliceFills forKey:CPTPieChartBindingPieSliceFills]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index fca7deb66..9e8f3598b 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -31,12 +31,12 @@ typedef NS_ENUM (NSInteger, CPTPlotCachePrecision) { /** * @brief An array of plots. **/ -typedef NSArray<__kindof CPTPlot *> *CPTPlotArray; +typedef NSArray<__kindof CPTPlot *> CPTPlotArray; /** * @brief A mutable array of plots. **/ -typedef NSMutableArray<__kindof CPTPlot *> *CPTMutablePlotArray; +typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; #pragma mark - diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index f88805873..d946cd666 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -55,7 +55,7 @@ @interface CPTPlot() @property (nonatomic, readwrite, assign) BOOL needsRelabel; @property (nonatomic, readwrite, assign) NSRange labelIndexRange; -@property (nonatomic, readwrite, strong) CPTMutableAnnotationArray labelAnnotations; +@property (nonatomic, readwrite, strong) CPTMutableAnnotationArray *labelAnnotations; @property (nonatomic, readwrite, copy) NSArray *dataLabels; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownLabelIndex; @@ -1570,11 +1570,11 @@ -(void)relabel self.labelAnnotations = [NSMutableArray arrayWithCapacity:sampleCount]; } - CPTPlotSpace *thePlotSpace = self.plotSpace; - CGFloat theRotation = self.labelRotation; - CPTMutableAnnotationArray labelArray = self.labelAnnotations; - NSUInteger oldLabelCount = labelArray.count; - id nilObject = [CPTPlot nilData]; + CPTPlotSpace *thePlotSpace = self.plotSpace; + CGFloat theRotation = self.labelRotation; + CPTMutableAnnotationArray *labelArray = self.labelAnnotations; + NSUInteger oldLabelCount = labelArray.count; + id nilObject = [CPTPlot nilData]; CPTMutableNumericData *labelFieldDataCache = [self cachedNumbersForField:self.labelField]; CPTShadow *theShadow = self.labelShadow; @@ -1695,9 +1695,9 @@ -(void)updateContentAnchorForLabel:(CPTPlotSpaceAnnotation *)label **/ -(void)repositionAllLabelAnnotations { - CPTAnnotationArray annotations = self.labelAnnotations; - NSUInteger labelCount = annotations.count; - Class annotationClass = [CPTAnnotation class]; + CPTAnnotationArray *annotations = self.labelAnnotations; + NSUInteger labelCount = annotations.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger i = 0; i < labelCount; i++ ) { CPTPlotSpaceAnnotation *annotation = annotations[i]; @@ -1841,9 +1841,9 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:withEvent:)] ) { // Inform delegate if a label was hit - CPTMutableAnnotationArray labelArray = self.labelAnnotations; - NSUInteger labelCount = labelArray.count; - Class annotationClass = [CPTAnnotation class]; + CPTMutableAnnotationArray *labelArray = self.labelAnnotations; + NSUInteger labelCount = labelArray.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger idx = 0; idx < labelCount; idx++ ) { CPTPlotSpaceAnnotation *annotation = labelArray[idx]; @@ -1919,9 +1919,9 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:withEvent:)] ) { // Inform delegate if a label was hit - CPTMutableAnnotationArray labelArray = self.labelAnnotations; - NSUInteger labelCount = labelArray.count; - Class annotationClass = [CPTAnnotation class]; + CPTMutableAnnotationArray *labelArray = self.labelAnnotations; + NSUInteger labelCount = labelArray.count; + Class annotationClass = [CPTAnnotation class]; for ( NSUInteger idx = 0; idx < labelCount; idx++ ) { CPTPlotSpaceAnnotation *annotation = labelArray[idx]; diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 0fd0c6460..2ce7bdf86 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -74,7 +74,7 @@ @implementation CPTPlotArea **/ @synthesize axisTitleGroup; -/** @property CPTNumberArray * topDownLayerOrder +/** @property CPTNumberArray *topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * * The array should reference the layers using the constants defined in #CPTGraphLayerType. @@ -288,7 +288,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context [self.fill fillRect:self.bounds inContext:context]; - CPTAxisArray theAxes = self.axisSet.axes; + CPTAxisArray *theAxes = self.axisSet.axes; for ( CPTAxis *axis in theAxes ) { [axis drawBackgroundBandsInContext:context]; @@ -353,7 +353,7 @@ -(void)layoutSublayers } } --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout { CPTGridLineGroup *minorGrid = self.minorGridLineGroup; CPTGridLineGroup *majorGrid = self.majorGridLineGroup; @@ -363,7 +363,7 @@ -(CPTSublayerSet)sublayersExcludedFromAutomaticLayout CPTAxisLabelGroup *titles = self.axisTitleGroup; if ( minorGrid || majorGrid || theAxisSet || thePlotGroup || labels || titles ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index ef2c1aa81..284750f64 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -16,12 +16,12 @@ typedef NS_ENUM (NSInteger, CPTPlotRangeComparisonResult) { /** * @brief An array of plot ranges. **/ -typedef NSArray *CPTPlotRangeArray; +typedef NSArray CPTPlotRangeArray; /** * @brief A mutable array of plot ranges. **/ -typedef NSMutableArray *CPTMutablePlotRangeArray; +typedef NSMutableArray CPTMutablePlotRangeArray; @interface CPTPlotRange : NSObject diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 14fd14b99..ecd1a7502 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -156,12 +156,12 @@ extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; /** * @brief An array of plot spaces. **/ -typedef NSArray<__kindof CPTPlotSpace *> *CPTPlotSpaceArray; +typedef NSArray<__kindof CPTPlotSpace *> CPTPlotSpaceArray; /** * @brief A mutable array of plot spaces. **/ -typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; +typedef NSMutableArray<__kindof CPTPlotSpace *> CPTMutablePlotSpaceArray; #pragma mark - @@ -234,8 +234,8 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; /// @name Adjusting Ranges /// @{ --(void)scaleToFitPlots:(nullable CPTPlotArray)plots; --(void)scaleToFitPlots:(nullable CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate; +-(void)scaleToFitPlots:(nullable CPTPlotArray *)plots; +-(void)scaleToFitPlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordinate)coordinate; -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 1016d7c22..2850fa363 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -11,15 +11,15 @@ /// @cond -typedef NSMutableOrderedSet *CPTMutableCategorySet; +typedef NSMutableOrderedSet CPTMutableCategorySet; @interface CPTPlotSpace() -@property (nonatomic, readwrite, strong) NSMutableDictionary *categoryNames; +@property (nonatomic, readwrite, strong) NSMutableDictionary *categoryNames; @property (nonatomic, readwrite) BOOL isDragging; --(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate; +-(CPTMutableCategorySet *)orderedSetForCoordinate:(CPTCoordinate)coordinate; @end @@ -162,9 +162,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @param coordinate The axis coordinate. * @return The ordered set of categories for the given coordinate. */ --(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate +-(CPTMutableCategorySet *)orderedSetForCoordinate:(CPTCoordinate)coordinate { - NSMutableDictionary *names = self.categoryNames; + NSMutableDictionary *names = self.categoryNames; if ( !names ) { names = [[NSMutableDictionary alloc] init]; @@ -174,7 +174,7 @@ -(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate NSNumber *cacheKey = @(coordinate); - CPTMutableCategorySet categories = names[cacheKey]; + CPTMutableCategorySet *categories = names[cacheKey]; if ( !categories ) { categories = [[NSMutableOrderedSet alloc] init]; @@ -197,7 +197,7 @@ -(void)addCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate { NSParameterAssert(category); - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; [categories addObject:category]; } @@ -211,7 +211,7 @@ -(void)removeCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina { NSParameterAssert(category); - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; [categories removeObject:category]; } @@ -229,7 +229,7 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina { NSParameterAssert(category); - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; NSParameterAssert(idx <= categories.count); @@ -243,7 +243,7 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina */ -(void)setCategories:(CPTStringArray *)newCategories forCoordinate:(CPTCoordinate)coordinate { - NSMutableDictionary *names = self.categoryNames; + NSMutableDictionary *names = self.categoryNames; if ( !names ) { names = [[NSMutableDictionary alloc] init]; @@ -276,7 +276,7 @@ -(void)removeAllCategories */ -(CPTStringArray *)categoriesForCoordinate:(CPTCoordinate)coordinate { - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; return [categories array]; } @@ -289,7 +289,7 @@ -(CPTStringArray *)categoriesForCoordinate:(CPTCoordinate)coordinate */ -(NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx { - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; NSParameterAssert(idx < categories.count); @@ -306,7 +306,7 @@ -(NSUInteger)indexOfCategory:(NSString *)category forCoordinate:(CPTCoordinate)c { NSParameterAssert(category); - CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; + CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; return [categories indexOfObject:category]; } @@ -616,7 +616,7 @@ -(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate /** @brief Scales the plot ranges so that the plots just fit in the visible space. * @param plots An array of the plots that have to fit in the visible area. **/ --(void)scaleToFitPlots:(CPTPlotArray)plots +-(void)scaleToFitPlots:(CPTPlotArray *)plots { } @@ -624,7 +624,7 @@ -(void)scaleToFitPlots:(CPTPlotArray)plots * @param plots An array of the plots that have to fit in the visible area. * @param coordinate The axis coordinate. **/ --(void)scaleToFitPlots:(CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate +-(void)scaleToFitPlots:(CPTPlotArray *)plots forCoordinate:(CPTCoordinate)coordinate { if ( plots.count == 0 ) { return; diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index ed0c3d6db..123894876 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -28,7 +28,7 @@ -(void)setContentNeedsLayout; **/ @implementation CPTPlotSpaceAnnotation -/** @property CPTNumberArray * anchorPlotPoint +/** @property CPTNumberArray *anchorPlotPoint * @brief An array of NSDecimalNumber objects giving the anchor plot coordinates. **/ @synthesize anchorPlotPoint; diff --git a/framework/Source/CPTPlotSymbol.h b/framework/Source/CPTPlotSymbol.h index a78902ba8..5b6e88128 100644 --- a/framework/Source/CPTPlotSymbol.h +++ b/framework/Source/CPTPlotSymbol.h @@ -27,12 +27,12 @@ typedef NS_ENUM (NSInteger, CPTPlotSymbolType) { /** * @brief An array of plot symbols. **/ -typedef NSArray *CPTPlotSymbolArray; +typedef NSArray CPTPlotSymbolArray; /** * @brief A mutable array of plot symbols. **/ -typedef NSMutableArray *CPTMutablePlotSymbolArray; +typedef NSMutableArray CPTMutablePlotSymbolArray; @interface CPTPlotSymbol : NSObject diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index 09362a50b..e8a0cb07e 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -44,7 +44,7 @@ typedef NS_ENUM (NSInteger, CPTRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable CPTLineStyleArray)barLineStylesForRangePlot:(nonnull CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray *)barLineStylesForRangePlot:(nonnull CPTRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a bar line style for the given range plot. * This method will not be called if diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 5f15f0fde..cdc5612a9 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -53,7 +53,7 @@ @interface CPTRangePlot() @property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *leftValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *rightValues; -@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray *barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; @@ -581,9 +581,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(barLineStyleForRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource barLineStyleForRangePlot:self recordIndex:idx]; @@ -1347,12 +1347,12 @@ -(void)setRightValues:(CPTMutableNumericData *)newValues [self cacheNumbers:newValues forField:CPTRangePlotFieldRight]; } --(CPTLineStyleArray)barLineStyles +-(CPTLineStyleArray *)barLineStyles { return [self cachedArrayForKey:CPTRangePlotBindingBarLineStyles]; } --(void)setBarLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setBarLineStyles:(CPTLineStyleArray *)newLineStyles { [self cacheArray:newLineStyles forKey:CPTRangePlotBindingBarLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 84317a202..4d22cb67b 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -61,7 +61,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { * @param indexRange The range of the data indexes of interest. * @return An array of plot symbols. **/ --(nullable CPTPlotSymbolArray)symbolsForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTPlotSymbolArray *)symbolsForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a single plot symbol for the given scatter plot. * This method will not be called if @@ -238,7 +238,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { /// @name Area Fill Bands /// @{ -@property (nonatomic, readonly, nullable) CPTLimitBandArray areaFillBands; +@property (nonatomic, readonly, nullable) CPTLimitBandArray *areaFillBands; /// @} /// @name Drawing diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 957163bf7..a6da6cd85 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -36,10 +36,10 @@ @interface CPTScatterPlot() @property (nonatomic, readwrite, copy) CPTNumberArray *xValues; @property (nonatomic, readwrite, copy) CPTNumberArray *yValues; -@property (nonatomic, readwrite, strong) CPTPlotSymbolArray plotSymbols; +@property (nonatomic, readwrite, strong) CPTPlotSymbolArray *plotSymbols; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @property (nonatomic, readwrite, assign) BOOL pointingDeviceDownOnLine; -@property (nonatomic, readwrite, strong) CPTMutableLimitBandArray mutableAreaFillBands; +@property (nonatomic, readwrite, strong) CPTMutableLimitBandArray *mutableAreaFillBands; -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; -(void)calculateViewPoints:(CGPoint *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; @@ -166,7 +166,7 @@ @implementation CPTScatterPlot **/ @synthesize pointingDeviceDownOnLine; -/** @property CPTLimitBandArray areaFillBands +/** @property CPTLimitBandArray *areaFillBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn between the plot line and areaBaseValue and on top of the areaFill. @@ -374,9 +374,9 @@ -(void)reloadPlotSymbolsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(symbolForScatterPlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutablePlotSymbolArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutablePlotSymbolArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTPlotSymbol *symbol = [theDataSource symbolForScatterPlot:self recordIndex:idx]; @@ -777,9 +777,9 @@ -(void)renderAsVectorInContext:(CGContextRef)context if ( firstDrawnPointIndex != NSNotFound ) { NSRange viewIndexRange = NSMakeRange( (NSUInteger)firstDrawnPointIndex, (NSUInteger)(lastDrawnPointIndex - firstDrawnPointIndex + 1) ); - CPTPlotArea *thePlotArea = self.plotArea; - CPTLineStyle *theLineStyle = self.dataLineStyle; - CPTMutableLimitBandArray fillBands = self.mutableAreaFillBands; + CPTPlotArea *thePlotArea = self.plotArea; + CPTLineStyle *theLineStyle = self.dataLineStyle; + CPTMutableLimitBandArray *fillBands = self.mutableAreaFillBands; // Draw fills NSDecimal theAreaBaseValue; @@ -1431,7 +1431,7 @@ -(void)addAreaFillBand:(CPTLimitBand *)limitBand -(void)removeAreaFillBand:(CPTLimitBand *)limitBand { if ( limitBand ) { - CPTMutableLimitBandArray fillBands = self.mutableAreaFillBands; + CPTMutableLimitBandArray *fillBands = self.mutableAreaFillBands; [fillBands removeObject:limitBand]; if ( fillBands.count == 0 ) { @@ -1805,7 +1805,7 @@ -(void)setAreaFill2:(CPTFill *)newFill } } --(CPTLimitBandArray)areaFillBands +-(CPTLimitBandArray *)areaFillBands { return [self.mutableAreaFillBands copy]; } @@ -1860,13 +1860,13 @@ -(CPTNumberArray *)yValues return [[self cachedNumbersForField:CPTScatterPlotFieldY] sampleArray]; } --(void)setPlotSymbols:(CPTPlotSymbolArray)newSymbols +-(void)setPlotSymbols:(CPTPlotSymbolArray *)newSymbols { [self cacheArray:newSymbols forKey:CPTScatterPlotBindingPlotSymbols]; [self setNeedsDisplay]; } --(CPTPlotSymbolArray)plotSymbols +-(CPTPlotSymbolArray *)plotSymbols { return [self cachedArrayForKey:CPTScatterPlotBindingPlotSymbols]; } diff --git a/framework/Source/CPTTextStyle.h b/framework/Source/CPTTextStyle.h index 807d7b215..cb4ec09a4 100644 --- a/framework/Source/CPTTextStyle.h +++ b/framework/Source/CPTTextStyle.h @@ -7,12 +7,12 @@ /** * @brief An array of text styles. **/ -typedef NSArray *CPTTextStyleArray; +typedef NSArray CPTTextStyleArray; /** * @brief A mutable array of text styles. **/ -typedef NSMutableArray *CPTMutableTextStyleArray; +typedef NSMutableArray CPTMutableTextStyleArray; @interface CPTTextStyle : NSObject diff --git a/framework/Source/CPTTradingRangePlot.h b/framework/Source/CPTTradingRangePlot.h index f9a4d4122..513d8ccaf 100644 --- a/framework/Source/CPTTradingRangePlot.h +++ b/framework/Source/CPTTradingRangePlot.h @@ -56,7 +56,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of fills. **/ --(nullable CPTFillArray)increaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray *)increaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close >= open for the given plot. * This method will not be called if @@ -73,7 +73,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param plot The trading range plot. * @param indexRange The range of the data indexes of interest. **/ --(nullable CPTFillArray)decreaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTFillArray *)decreaseFillsForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the fill used with a candlestick plot when close < open for the given plot. * This method will not be called if @@ -96,7 +96,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable CPTLineStyleArray)lineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray *)lineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to draw candlestick or OHLC symbols for the given trading range plot. * This method will not be called if @@ -114,7 +114,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable CPTLineStyleArray)increaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray *)increaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close >= open for the given trading range plot. * This method will not be called if @@ -132,7 +132,7 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { * @param indexRange The range of the data indexes of interest. * @return An array of line styles. **/ --(nullable CPTLineStyleArray)decreaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLineStyleArray *)decreaseLineStylesForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets the line style used to outline candlestick symbols when close < open for the given trading range plot. * This method will not be called if diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 9aa381409..b4e54f4a7 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -47,11 +47,11 @@ @interface CPTTradingRangePlot() @property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; @property (nonatomic, readwrite, copy) CPTMutableNumericData *closeValues; -@property (nonatomic, readwrite, copy) CPTFillArray increaseFills; -@property (nonatomic, readwrite, copy) CPTFillArray decreaseFills; -@property (nonatomic, readwrite, copy) CPTLineStyleArray lineStyles; -@property (nonatomic, readwrite, copy) CPTLineStyleArray increaseLineStyles; -@property (nonatomic, readwrite, copy) CPTLineStyleArray decreaseLineStyles; +@property (nonatomic, readwrite, copy) CPTFillArray *increaseFills; +@property (nonatomic, readwrite, copy) CPTFillArray *decreaseFills; +@property (nonatomic, readwrite, copy) CPTLineStyleArray *lineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray *increaseLineStyles; +@property (nonatomic, readwrite, copy) CPTLineStyleArray *decreaseLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)drawCandleStickInContext:(CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; @@ -368,9 +368,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(increaseFillForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource increaseFillForTradingRangePlot:self recordIndex:idx]; @@ -396,9 +396,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(decreaseFillForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableFillArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableFillArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTFill *dataSourceFill = [theDataSource decreaseFillForTradingRangePlot:self recordIndex:idx]; @@ -449,9 +449,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(lineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource lineStyleForTradingRangePlot:self recordIndex:idx]; @@ -477,9 +477,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(increaseLineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource increaseLineStyleForTradingRangePlot:self recordIndex:idx]; @@ -505,9 +505,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange else if ( [theDataSource respondsToSelector:@selector(decreaseLineStyleForTradingRangePlot:recordIndex:)] ) { needsLegendUpdate = YES; - id nilObject = [CPTPlot nilData]; - CPTMutableLineStyleArray array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLineStyleArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLineStyle *dataSourceLineStyle = [theDataSource decreaseLineStyleForTradingRangePlot:self recordIndex:idx]; @@ -1758,56 +1758,56 @@ -(void)setCloseValues:(CPTMutableNumericData *)newValues [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldClose]; } --(CPTFillArray)increaseFills +-(CPTFillArray *)increaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseFills]; } --(void)setIncreaseFills:(CPTFillArray)newFills +-(void)setIncreaseFills:(CPTFillArray *)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingIncreaseFills]; [self setNeedsDisplay]; } --(CPTFillArray)decreaseFills +-(CPTFillArray *)decreaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseFills]; } --(void)setDecreaseFills:(CPTFillArray)newFills +-(void)setDecreaseFills:(CPTFillArray *)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingDecreaseFills]; [self setNeedsDisplay]; } --(CPTLineStyleArray)lineStyles +-(CPTLineStyleArray *)lineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingLineStyles]; } --(void)setLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setLineStyles:(CPTLineStyleArray *)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingLineStyles]; [self setNeedsDisplay]; } --(CPTLineStyleArray)increaseLineStyles +-(CPTLineStyleArray *)increaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseLineStyles]; } --(void)setIncreaseLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setIncreaseLineStyles:(CPTLineStyleArray *)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingIncreaseLineStyles]; [self setNeedsDisplay]; } --(CPTLineStyleArray)decreaseLineStyles +-(CPTLineStyleArray *)decreaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseLineStyles]; } --(void)setDecreaseLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setDecreaseLineStyles:(CPTLineStyleArray *)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingDecreaseLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 0b7afedbc..a1f375b30 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -480,8 +480,8 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major -(void)drawBackgroundBandsInContext:(CGContextRef)context { - CPTFillArray bandArray = self.alternatingBandFills; - NSUInteger bandCount = bandArray.count; + CPTFillArray *bandArray = self.alternatingBandFills; + NSUInteger bandCount = bandArray.count; if ( bandCount > 0 ) { CPTNumberArray *locations = [self.majorTickLocations allObjects]; @@ -603,7 +603,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context -(void)drawBackgroundLimitsInContext:(CGContextRef)context { - CPTLimitBandArray limitArray = self.backgroundLimitBands; + CPTLimitBandArray *limitArray = self.backgroundLimitBands; if ( limitArray.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; diff --git a/framework/Source/CPTXYAxisSet.m b/framework/Source/CPTXYAxisSet.m index b4aa6703a..de5a91da3 100644 --- a/framework/Source/CPTXYAxisSet.m +++ b/framework/Source/CPTXYAxisSet.m @@ -118,8 +118,8 @@ -(void)layoutSublayers sublayerPosition = CGPointMake(-sublayerPosition.x, -sublayerPosition.y); CGRect subLayerFrame = CGRectMake(sublayerPosition.x, sublayerPosition.y, sublayerBounds.size.width, sublayerBounds.size.height); - CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; - Class layerClass = [CPTLayer class]; + CPTSublayerSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in self.sublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { subLayer.frame = subLayerFrame; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index b6829379c..69932d6e6 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -17,7 +17,7 @@ #import /// @cond -typedef NSMutableArray *CPTMutableAnimationArray; +typedef NSMutableArray CPTMutableAnimationArray; @interface CPTXYPlotSpace() @@ -48,7 +48,7 @@ -(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTC @property (nonatomic, readwrite) CGPoint lastDisplacement; @property (nonatomic, readwrite) NSTimeInterval lastDragTime; @property (nonatomic, readwrite) NSTimeInterval lastDeltaTime; -@property (nonatomic, readwrite, retain, nonnull) CPTMutableAnimationArray animations; +@property (nonatomic, readwrite, retain, nonnull) CPTMutableAnimationArray *animations; @end @@ -526,7 +526,7 @@ -(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPT -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shift momentumTime:(CGFloat)momentumTime speed:(CGFloat)speed acceleration:(CGFloat)acceleration { - CPTMutableAnimationArray animationArray = self.animations; + CPTMutableAnimationArray *animationArray = self.animations; CPTAnimationOperation *op; NSString *property = nil; @@ -744,7 +744,7 @@ -(void)setGlobalYRange:(CPTPlotRange *)newRange } } --(void)scaleToFitPlots:(CPTPlotArray)plots +-(void)scaleToFitPlots:(CPTPlotArray *)plots { if ( plots.count == 0 ) { return; @@ -1482,7 +1482,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact self.lastDeltaTime = 0.0; // Clear any previous animations - CPTMutableAnimationArray animationArray = self.animations; + CPTMutableAnimationArray *animationArray = self.animations; for ( CPTAnimationOperation *op in animationArray ) { [[CPTAnimation sharedInstance] removeAnimationOperation:op]; } diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 30f9c1966..516410849 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -130,12 +130,12 @@ -(void)layoutSublayers } } --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout { CPTBorderedLayer *excludedLayer = self.maskedLayer; if ( excludedLayer ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index d4cd9e156..f54e409cc 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -8,7 +8,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary * attributes +/** @property CPTDictionary *attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: From 24f219ef0917a293a892d5846d7a5b05d1423d72 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 1 Nov 2015 17:51:08 -0500 Subject: [PATCH 118/429] Fixed the header search path with CocoaPods. Fixed issue #204. --- CorePlot-latest.podspec | 3 ++- CorePlot.podspec | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index fc7348565..2fbbabe37 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -31,7 +31,8 @@ Pod::Spec.new do |s| s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' s.requires_arc = true - s.xcconfig = { 'ALWAYS_SEARCH_USER_PATHS' => 'YES' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' diff --git a/CorePlot.podspec b/CorePlot.podspec index 38a5f8cfc..e6a9ec56b 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -31,7 +31,8 @@ Pod::Spec.new do |s| s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' s.requires_arc = true - s.xcconfig = { 'ALWAYS_SEARCH_USER_PATHS' => 'YES' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' From d01faf3a5c5f9d32bd861407db916f3b8da25c65 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 1 Nov 2015 17:53:38 -0500 Subject: [PATCH 119/429] Added the tvOS header search path to the podspec. --- CorePlot-latest.podspec | 5 +++-- CorePlot.podspec | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index 1b3769ddf..fd53452e8 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -34,8 +34,9 @@ Pod::Spec.new do |s| s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' s.requires_arc = true - s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } - s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.tvos.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/tvos"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' diff --git a/CorePlot.podspec b/CorePlot.podspec index 477b76ba2..e99091b65 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -34,8 +34,9 @@ Pod::Spec.new do |s| s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' s.requires_arc = true - s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } - s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.tvos.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/tvos"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' From c1f585d7cc89dcbdafe1e3966654a6c96f0fae0a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 2 Nov 2015 19:07:39 -0500 Subject: [PATCH 120/429] Set the deployment target for the universal iOS static library and framework targets. Fixed issue #235 and issue #240. --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 111fa5afa..6659281a1 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2884,6 +2884,7 @@ DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "Documentation-iOS copy"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -2898,6 +2899,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "Documentation-iOS copy"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -3031,6 +3033,7 @@ DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -3045,6 +3048,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; From 86b79b77af8d6f9e88b4c6131a9c46fabf887457 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 2 Nov 2015 20:00:11 -0500 Subject: [PATCH 121/429] Set the deployment target for the universal tvOS framework. --- framework/CorePlot.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 62129d59a..a8be7f837 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3255,6 +3255,7 @@ ENABLE_TESTABILITY = YES; ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -3262,6 +3263,7 @@ isa = XCBuildConfiguration; buildSettings = { SYMROOT = "$(PROJECT_DIR)/../build"; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; From ca0ab9f4d4d5b371de6cabcb242961f80b4d63d9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 9 Nov 2015 20:37:23 -0500 Subject: [PATCH 122/429] Import the target macro definitions in the framework header files to fix build errors in the iOS framework. --- framework/CocoaPods/CorePlot.h | 2 ++ framework/CorePlot.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/framework/CocoaPods/CorePlot.h b/framework/CocoaPods/CorePlot.h index 93a0fbd03..3a7b2c66a 100644 --- a/framework/CocoaPods/CorePlot.h +++ b/framework/CocoaPods/CorePlot.h @@ -1,3 +1,5 @@ +#import "TargetConditionals.h" + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #import #import diff --git a/framework/CorePlot.h b/framework/CorePlot.h index 1c6a5e0fc..aaa221bb3 100644 --- a/framework/CorePlot.h +++ b/framework/CorePlot.h @@ -1,3 +1,5 @@ +#import "TargetConditionals.h" + #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #import From 96466dbf38f43485d9eec9c3bf5df505b0d35424 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 10 Nov 2015 19:49:47 -0500 Subject: [PATCH 123/429] Shared all Xcode build schemes. --- .../xcschemes/Build & Copy.xcscheme | 71 +++++++++++ .../xcschemes/CorePlotQCPlugin.xcscheme | 71 +++++++++++ .../xcshareddata/xcschemes/AAPLot.xcscheme | 91 ++++++++++++++ .../xcschemes/CPTTestApp-iPad.xcscheme | 91 ++++++++++++++ .../xcschemes/CPTTestApp-iPhone.xcscheme | 91 ++++++++++++++ .../xcschemes/CPTTestApp.xcscheme | 91 ++++++++++++++ .../xcschemes/Plot Gallery-Mac.xcscheme | 91 ++++++++++++++ .../xcschemes/Plot Gallery-iOS.xcscheme | 92 ++++++++++++++ .../xcshareddata/xcschemes/DatePlot.xcscheme | 91 ++++++++++++++ .../xcshareddata/xcschemes/DropPlot.xcscheme | 91 ++++++++++++++ .../xcschemes/minorTickFormatter.xcscheme | 91 ++++++++++++++ .../xcshareddata/xcschemes/RangePlot.xcscheme | 91 ++++++++++++++ .../xcshareddata/xcschemes/StockPlot.xcscheme | 91 ++++++++++++++ .../xcschemes/CorePlot-CocoaTouch.xcscheme | 80 ++++++++++++ .../xcschemes/Documentation.xcscheme | 80 ++++++++++++ .../xcschemes/Universal Library.xcscheme | 80 ++++++++++++ .../xcschemes/CorePlot-CocoaTouch.xcscheme | 114 ++++++++++++++++++ .../xcschemes/Documentation-Mac.xcscheme | 71 +++++++++++ .../xcschemes/Documentation-iOS.xcscheme | 80 ++++++++++++ .../xcschemes/Universal Library.xcscheme | 80 ++++++++++++ .../Universal iOS Framework.xcscheme | 80 ++++++++++++ 21 files changed, 1809 insertions(+) create mode 100644 QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme create mode 100644 QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme create mode 100644 examples/AAPLot/AAPLot.xcodeproj/xcshareddata/xcschemes/AAPLot.xcscheme create mode 100644 examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme create mode 100644 examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme create mode 100644 examples/CPTTestApp/CPTTestApp.xcodeproj/xcshareddata/xcschemes/CPTTestApp.xcscheme create mode 100644 examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme create mode 100644 examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme create mode 100644 examples/DatePlot/DatePlot.xcodeproj/xcshareddata/xcschemes/DatePlot.xcscheme create mode 100644 examples/DropPlot/DropPlot.xcodeproj/xcshareddata/xcschemes/DropPlot.xcscheme create mode 100644 examples/MinorTickLabels/minorTickFormatter.xcodeproj/xcshareddata/xcschemes/minorTickFormatter.xcscheme create mode 100644 examples/RangePlot/RangePlot.xcodeproj/xcshareddata/xcschemes/RangePlot.xcscheme create mode 100644 examples/StockPlot/StockPlot.xcodeproj/xcshareddata/xcschemes/StockPlot.xcscheme create mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme create mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme create mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-Mac.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-iOS.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme create mode 100644 framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal iOS Framework.xcscheme diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme new file mode 100644 index 000000000..b9c994259 --- /dev/null +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme new file mode 100644 index 000000000..967ef1f15 --- /dev/null +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AAPLot/AAPLot.xcodeproj/xcshareddata/xcschemes/AAPLot.xcscheme b/examples/AAPLot/AAPLot.xcodeproj/xcshareddata/xcschemes/AAPLot.xcscheme new file mode 100644 index 000000000..d820a8d1b --- /dev/null +++ b/examples/AAPLot/AAPLot.xcodeproj/xcshareddata/xcschemes/AAPLot.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme new file mode 100644 index 000000000..ebab23278 --- /dev/null +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme new file mode 100644 index 000000000..2c41e49c6 --- /dev/null +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/xcshareddata/xcschemes/CPTTestApp.xcscheme b/examples/CPTTestApp/CPTTestApp.xcodeproj/xcshareddata/xcschemes/CPTTestApp.xcscheme new file mode 100644 index 000000000..43f0c0cea --- /dev/null +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/xcshareddata/xcschemes/CPTTestApp.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme new file mode 100644 index 000000000..7f90b9db6 --- /dev/null +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme new file mode 100644 index 000000000..66c1f2095 --- /dev/null +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/DatePlot/DatePlot.xcodeproj/xcshareddata/xcschemes/DatePlot.xcscheme b/examples/DatePlot/DatePlot.xcodeproj/xcshareddata/xcschemes/DatePlot.xcscheme new file mode 100644 index 000000000..0c7616ed3 --- /dev/null +++ b/examples/DatePlot/DatePlot.xcodeproj/xcshareddata/xcschemes/DatePlot.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/DropPlot/DropPlot.xcodeproj/xcshareddata/xcschemes/DropPlot.xcscheme b/examples/DropPlot/DropPlot.xcodeproj/xcshareddata/xcschemes/DropPlot.xcscheme new file mode 100644 index 000000000..d21cc1802 --- /dev/null +++ b/examples/DropPlot/DropPlot.xcodeproj/xcshareddata/xcschemes/DropPlot.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/xcshareddata/xcschemes/minorTickFormatter.xcscheme b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/xcshareddata/xcschemes/minorTickFormatter.xcscheme new file mode 100644 index 000000000..15abd38c8 --- /dev/null +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/xcshareddata/xcschemes/minorTickFormatter.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/RangePlot/RangePlot.xcodeproj/xcshareddata/xcschemes/RangePlot.xcscheme b/examples/RangePlot/RangePlot.xcodeproj/xcshareddata/xcschemes/RangePlot.xcscheme new file mode 100644 index 000000000..c6ef1898b --- /dev/null +++ b/examples/RangePlot/RangePlot.xcodeproj/xcshareddata/xcschemes/RangePlot.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/StockPlot/StockPlot.xcodeproj/xcshareddata/xcschemes/StockPlot.xcscheme b/examples/StockPlot/StockPlot.xcodeproj/xcshareddata/xcschemes/StockPlot.xcscheme new file mode 100644 index 000000000..5f15206f7 --- /dev/null +++ b/examples/StockPlot/StockPlot.xcodeproj/xcshareddata/xcschemes/StockPlot.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme new file mode 100644 index 000000000..fd055e090 --- /dev/null +++ b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme new file mode 100644 index 000000000..ee433f2a3 --- /dev/null +++ b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme new file mode 100644 index 000000000..1df3e4a8e --- /dev/null +++ b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme new file mode 100644 index 000000000..7b59cd122 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-Mac.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-Mac.xcscheme new file mode 100644 index 000000000..b996d6198 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-Mac.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-iOS.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-iOS.xcscheme new file mode 100644 index 000000000..332c468bc --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Documentation-iOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme new file mode 100644 index 000000000..5490171bb --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal iOS Framework.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal iOS Framework.xcscheme new file mode 100644 index 000000000..7759604a9 --- /dev/null +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/Universal iOS Framework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7b10f6e5604504c087358b3e70b91f20dbe1e509 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 10 Nov 2015 19:53:31 -0500 Subject: [PATCH 124/429] Shared the Xcode build scheme for the tvOS version of the Plot Gallery example app. --- .../xcschemes/Plot Gallery-tvOS.xcscheme | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-tvOS.xcscheme diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-tvOS.xcscheme b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-tvOS.xcscheme new file mode 100644 index 000000000..fea48692b --- /dev/null +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-tvOS.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 114de15e2866f7d1a9aad82f60da628380876880 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 10 Nov 2015 21:22:25 -0500 Subject: [PATCH 125/429] Fixed framework builds when using CocoaPods. Fixed issue #243. --- CorePlot-latest.podspec | 7 ++++--- CorePlot.podspec | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index 2fbbabe37..827707f25 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -30,9 +30,10 @@ Pod::Spec.new do |s| s.osx.source_files = 'framework/MacOnly/*.{h,m}' s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' - s.requires_arc = true - s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } - s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.requires_arc = true + s.xcconfig = { 'ALWAYS_SEARCH_USER_PATHS' => 'YES' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Private/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Private/CorePlot/osx"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' diff --git a/CorePlot.podspec b/CorePlot.podspec index e6a9ec56b..31062b9ce 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -30,9 +30,10 @@ Pod::Spec.new do |s| s.osx.source_files = 'framework/MacOnly/*.{h,m}' s.private_header_files = '**/_*.h', '**/CorePlotProbes.h' - s.requires_arc = true - s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/ios"' } - s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Public/CorePlot/osx"' } + s.requires_arc = true + s.xcconfig = { 'ALWAYS_SEARCH_USER_PATHS' => 'YES' } + s.ios.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Private/CorePlot/ios"' } + s.osx.xcconfig = { 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/Headers/Private/CorePlot/osx"' } s.frameworks = 'QuartzCore', 'Accelerate' s.ios.frameworks = 'UIKit', 'Foundation' From 70b7f3e9930b2b6582982dc4e4955a7a0502b834 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 16 Nov 2015 21:05:12 -0500 Subject: [PATCH 126/429] Removed hard-coded sizes and added layout constraints in the iPad CPTTestApp to fix layout issues on iPad Pro. --- .../CPTTestApp_iPadViewController.xib | 49 ++++++++++--------- .../Classes/CPTTestApp_iPadViewController.m | 24 --------- 2 files changed, 27 insertions(+), 46 deletions(-) diff --git a/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib b/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib index e100cb2b5..03311ea1e 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib +++ b/examples/CPTTestApp-iPad/CPTTestApp_iPadViewController.xib @@ -1,8 +1,8 @@ - + - + @@ -15,36 +15,41 @@ - + - - - + + + - - - + + + - - - + + + - - - - - + + + + + + + + + + + + + + + - - - - - diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 1e92e8e73..813ed5be3 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -76,30 +76,6 @@ -(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag [self.piePlot performSelector:@selector(reloadData) withObject:nil afterDelay:0.4]; } --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation -{ - if ( UIInterfaceOrientationIsLandscape(fromInterfaceOrientation) ) { - // Move the plots into place for portrait - self.scatterPlotView.frame = CGRectMake(20.0, 55.0, 728.0, 556.0); - self.barChartView.frame = CGRectMake(20.0, 644.0, 340.0, 340.0); - self.pieChartView.frame = CGRectMake(408.0, 644.0, 340.0, 340.0); - } - else { - // Move the plots into place for landscape - self.scatterPlotView.frame = CGRectMake(20.0, 51.0, 628.0, 677.0); - self.barChartView.frame = CGRectMake(684.0, 51.0, 320.0, 320.0); - self.pieChartView.frame = CGRectMake(684.0, 408.0, 320.0, 320.0); - } -} - --(void)didReceiveMemoryWarning -{ - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - #pragma mark - #pragma mark Plot construction methods From f9016bc82a0906c9b24f1bf32cc747095387a5a9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 12:39:41 -0500 Subject: [PATCH 127/429] Added an option to anchor alternating band fills to a specific starting value. Fixed issue #26. --- documentation/changelog.markdown | 1 + .../src/plots/CurvedScatterPlot.m | 2 + framework/Source/CPTAxis.h | 1 + framework/Source/CPTAxis.m | 14 +++ framework/Source/CPTXYAxis.m | 107 +++++++++++++++++- 5 files changed, 122 insertions(+), 3 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 55b137b4b..6a0a31d07 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -6,6 +6,7 @@ To be determined. ## Details - **New**: Added a tvOS framework. +- **New**: Added an option to anchor alternating band fills to a specific starting value. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index a50b33ecf..f37e94c7a 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -197,6 +197,8 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP y.minorGridLineStyle = minorGridLineStyle; y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; y.labelOffset = self.titleSize * CPTFloat(0.25); + y.alternatingBandFills = @[[[CPTColor whiteColor] colorWithAlphaComponent:0.1], [NSNull null]]; + y.alternatingBandAnchor = @0.0; lineCap.lineStyle = y.axisLineStyle; lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index 3209b2859..c22c287ae 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -271,6 +271,7 @@ typedef NSMutableArray<__kindof CPTAxis *> CPTMutableAxisArray; /// @name Background Bands /// @{ @property (nonatomic, readwrite, copy, nullable) CPTFillArray *alternatingBandFills; +@property (nonatomic, readwrite, strong, nullable) NSNumber *alternatingBandAnchor; @property (nonatomic, readonly, nullable) CPTLimitBandArray *backgroundLimitBands; /// @} diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index b93c8d7c0..12a79912e 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -410,6 +410,15 @@ @implementation CPTAxis **/ @synthesize alternatingBandFills; +/** @property NSNumber *alternatingBandAnchor + * @brief The starting location of the first band fill. + * + * If @nil (the default), the first fill is drawn between the bottom left corner of the plot area + * and the first major tick location inside the plot area. If the anchor falls between two + * major tick locations, the first band fill wiil be drawn between those locations. + **/ +@synthesize alternatingBandAnchor; + /** @property CPTLimitBandArray *backgroundLimitBands * @brief An array of CPTLimitBand objects. * @@ -521,6 +530,7 @@ @implementation CPTAxis * - @ref labelShadow = @nil * - @ref minorTickLabelShadow = @nil * - @ref alternatingBandFills = @nil + * - @ref alternatingBandAnchor = @nil * - @ref minorGridLines = @nil * - @ref majorGridLines = @nil * - @ref needsDisplayOnBoundsChange = @YES @@ -589,6 +599,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame visibleAxisRange = nil; gridLinesRange = nil; alternatingBandFills = nil; + alternatingBandAnchor = nil; mutableBackgroundLimitBands = nil; minorGridLines = nil; majorGridLines = nil; @@ -662,6 +673,7 @@ -(instancetype)initWithLayer:(id)layer visibleAxisRange = theLayer->visibleAxisRange; gridLinesRange = theLayer->gridLinesRange; alternatingBandFills = theLayer->alternatingBandFills; + alternatingBandAnchor = theLayer->alternatingBandAnchor; mutableBackgroundLimitBands = theLayer->mutableBackgroundLimitBands; minorGridLines = theLayer->minorGridLines; majorGridLines = theLayer->majorGridLines; @@ -744,6 +756,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.visibleAxisRange forKey:@"CPTAxis.visibleAxisRange"]; [coder encodeObject:self.gridLinesRange forKey:@"CPTAxis.gridLinesRange"]; [coder encodeObject:self.alternatingBandFills forKey:@"CPTAxis.alternatingBandFills"]; + [coder encodeObject:self.alternatingBandAnchor forKey:@"CPTAxis.alternatingBandAnchor"]; [coder encodeObject:self.mutableBackgroundLimitBands forKey:@"CPTAxis.mutableBackgroundLimitBands"]; [coder encodeBool:self.separateLayers forKey:@"CPTAxis.separateLayers"]; [coder encodeObject:self.labelShadow forKey:@"CPTAxis.labelShadow"]; @@ -811,6 +824,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder visibleAxisRange = [[coder decodeObjectForKey:@"CPTAxis.visibleAxisRange"] copy]; gridLinesRange = [[coder decodeObjectForKey:@"CPTAxis.gridLinesRange"] copy]; alternatingBandFills = [[coder decodeObjectForKey:@"CPTAxis.alternatingBandFills"] copy]; + alternatingBandAnchor = [coder decodeObjectForKey:@"CPTAxis.alternatingBandAnchor"]; mutableBackgroundLimitBands = [[coder decodeObjectForKey:@"CPTAxis.mutableBackgroundLimitBands"] mutableCopy]; separateLayers = [coder decodeBoolForKey:@"CPTAxis.separateLayers"]; labelShadow = [coder decodeObjectForKey:@"CPTAxis.labelShadow"]; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index a1f375b30..67034fd3e 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -21,6 +21,8 @@ -(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CP -(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper; -(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue; +-(NSUInteger)initialBandIndexForSortedLocations:(nonnull CPTNumberArray *)sortedLocations inRange:(nonnull CPTMutablePlotRange *)range; + @end /// @endcond @@ -478,6 +480,103 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major /// @cond +-(NSUInteger)initialBandIndexForSortedLocations:(CPTNumberArray *)sortedLocations inRange:(CPTMutablePlotRange *)range +{ + NSUInteger bandIndex = 0; + + NSNumber *bandAnchor = self.alternatingBandAnchor; + NSUInteger bandCount = self.alternatingBandFills.count; + + if ( bandAnchor && (bandCount > 0) ) { + NSDecimal anchor = bandAnchor.decimalValue; + + CPTPlotRange *theVisibleRange = self.visibleRange; + if ( theVisibleRange ) { + [range intersectionPlotRange:theVisibleRange]; + } + + NSDecimal rangeStart; + if ( range.lengthDouble >= 0.0 ) { + rangeStart = range.minLimitDecimal; + } + else { + rangeStart = range.maxLimitDecimal; + } + + NSDecimal origin = self.labelingOrigin.decimalValue; + NSDecimal offset = CPTDecimalSubtract(anchor, origin); + NSDecimalRound(&offset, &offset, 0, NSRoundDown); + + const NSDecimal zero = CPTDecimalFromInteger(0); + + // Set starting coord--should be the smallest value >= rangeMin that is a whole multiple of majorInterval away from the alternatingBandAnchor + NSDecimal coord = zero; + NSDecimal majorInterval = zero; + + switch ( self.labelingPolicy ) { + case CPTAxisLabelingPolicyAutomatic: + case CPTAxisLabelingPolicyEqualDivisions: + if ( sortedLocations.count > 1 ) { + if ( range.lengthDouble >= 0.0 ) { + majorInterval = CPTDecimalSubtract(sortedLocations[1].decimalValue, sortedLocations[0].decimalValue); + } + else { + majorInterval = CPTDecimalSubtract(sortedLocations[0].decimalValue, sortedLocations[1].decimalValue); + } + } + break; + + case CPTAxisLabelingPolicyFixedInterval: + { + majorInterval = self.majorIntervalLength.decimalValue; + } + break; + + case CPTAxisLabelingPolicyLocationsProvided: + case CPTAxisLabelingPolicyNone: + { + // user provided tick locations; they're not guaranteed to be evenly spaced, but band drawing always starts with the first location + if ( range.lengthDouble >= 0.0 ) { + for ( NSNumber *location in sortedLocations ) { + if ( CPTDecimalLessThan(anchor, location.decimalValue) ) { + break; + } + + bandIndex++; + } + } + else { + for ( NSNumber *location in sortedLocations ) { + if ( CPTDecimalGreaterThanOrEqualTo(anchor, location.decimalValue) ) { + break; + } + + bandIndex++; + } + } + + bandIndex = bandIndex % bandCount; + } + break; + } + + if ( !CPTDecimalEquals(majorInterval, zero) ) { + coord = CPTDecimalDivide(CPTDecimalSubtract(rangeStart, origin), majorInterval); + NSDecimalRound(&coord, &coord, 0, NSRoundUp); + NSInteger stepCount = CPTDecimalIntegerValue(coord) + CPTDecimalIntegerValue(offset) + 1; + + if ( stepCount >= 0 ) { + bandIndex = (NSUInteger)(stepCount % (NSInteger)bandCount); + } + else { + bandIndex = (NSUInteger)(-stepCount % (NSInteger)bandCount); + } + } + } + + return bandIndex; +} + -(void)drawBackgroundBandsInContext:(CGContextRef)context { CPTFillArray *bandArray = self.alternatingBandFills; @@ -506,7 +605,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context [orthogonalRange intersectionPlotRange:theGridLineRange]; } - NSDecimal zero = CPTDecimalFromInteger(0); + const NSDecimal zero = CPTDecimalFromInteger(0); NSSortDescriptor *sortDescriptor = nil; if ( range ) { if ( CPTDecimalGreaterThanOrEqualTo(range.lengthDecimal, zero) ) { @@ -521,8 +620,10 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context } locations = [locations sortedArrayUsingDescriptors:@[sortDescriptor]]; - NSUInteger bandIndex = 0; - id null = [NSNull null]; + NSUInteger bandIndex = [self initialBandIndexForSortedLocations:locations inRange:range]; + + const id null = [NSNull null]; + NSDecimal lastLocation; if ( range ) { lastLocation = range.locationDecimal; From 7dc7634e4407b358a292a62a782e60238b9b8a08 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 15:11:43 -0500 Subject: [PATCH 128/429] Updated to Xcode 7.1 recommended project settings. --- framework/CorePlot-CocoaTouchTests-Info.plist | 2 +- framework/CorePlot-iOSTests-Info.plist | 2 +- framework/CorePlot.xcodeproj/project.pbxproj | 10 +++++++++- .../xcshareddata/xcschemes/CorePlot Mac.xcscheme | 2 +- .../xcshareddata/xcschemes/CorePlot iOS.xcscheme | 2 +- framework/CorePlot_iOS-Info.plist | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/framework/CorePlot-CocoaTouchTests-Info.plist b/framework/CorePlot-CocoaTouchTests-Info.plist index 70b39d69c..ba72822e8 100644 --- a/framework/CorePlot-CocoaTouchTests-Info.plist +++ b/framework/CorePlot-CocoaTouchTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/CorePlot-iOSTests-Info.plist b/framework/CorePlot-iOSTests-Info.plist index 70b39d69c..ba72822e8 100644 --- a/framework/CorePlot-iOSTests-Info.plist +++ b/framework/CorePlot-iOSTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 6659281a1..23ee79bc7 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2046,7 +2046,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0710; TargetAttributes = { 8DC2EF4F0486A6940098B216 = { DevelopmentTeam = 28ZA45DE7D; @@ -2687,6 +2687,8 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ENABLE_TESTABILITY = YES; + ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Debug; @@ -2746,6 +2748,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2772,6 +2775,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2810,6 +2814,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2844,6 +2849,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -2984,6 +2990,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3018,6 +3025,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme index 0303058a1..e61c6a977 100644 --- a/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme +++ b/framework/CorePlot.xcodeproj/xcshareddata/xcschemes/CorePlot Mac.xcscheme @@ -1,6 +1,6 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.CorePlot.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 8ae516d6c76e9996cd62bf95d62edb6a281e9d97 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 17:05:26 -0500 Subject: [PATCH 129/429] Updated all framework and test classes to modern Objective-C syntax. --- framework/MacOnly/CPTGraphHostingView.m | 10 +++--- .../MacOnly/CPTPlatformSpecificCategories.m | 2 +- .../MacOnly/CPTPlatformSpecificFunctions.h | 2 +- .../MacOnly/CPTPlatformSpecificFunctions.m | 2 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 8 ++--- framework/Source/CPTAnimation.m | 12 +++---- framework/Source/CPTAnimationOperation.m | 2 +- framework/Source/CPTAnimationPeriod.m | 2 +- framework/Source/CPTAnnotation.m | 8 ++--- framework/Source/CPTAnnotationHostLayer.m | 4 +-- framework/Source/CPTAxis.m | 8 ++--- framework/Source/CPTAxisLabel.m | 2 +- framework/Source/CPTBarPlot.m | 4 +-- framework/Source/CPTBorderedLayer.m | 28 +++++++-------- framework/Source/CPTDarkGradientThemeTests.m | 2 +- framework/Source/CPTDataSourceTestCase.m | 10 +++--- framework/Source/CPTGradient.h | 4 +-- framework/Source/CPTGradient.m | 4 +-- framework/Source/CPTGraph.m | 12 +++---- framework/Source/CPTImage.m | 2 +- framework/Source/CPTLayer.m | 18 +++++----- framework/Source/CPTLegend.m | 16 ++++----- framework/Source/CPTLimitBand.m | 6 ++-- framework/Source/CPTMutableNumericData.h | 4 +-- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTMutableNumericDataTests.m | 24 ++++++------- ...CPTMutableNumericDataTypeConversionTests.m | 24 ++++++------- framework/Source/CPTNumericData.h | 4 +-- framework/Source/CPTNumericData.m | 12 +++---- framework/Source/CPTNumericDataTests.m | 30 ++++++++-------- framework/Source/CPTNumericDataType.m | 6 ++-- .../CPTNumericDataTypeConversionTests.m | 30 ++++++++-------- framework/Source/CPTPathExtensions.h | 5 +++ framework/Source/CPTPieChart.m | 2 +- framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 24 ++++++------- framework/Source/CPTPlotArea.m | 12 +++---- framework/Source/CPTPlotAreaFrame.m | 2 +- framework/Source/CPTPlotGroup.m | 2 +- framework/Source/CPTPlotRange.m | 6 ++-- framework/Source/CPTPlotSpace.m | 2 +- framework/Source/CPTPlotSpaceAnnotation.m | 2 +- framework/Source/CPTRangePlot.m | 2 +- framework/Source/CPTScatterPlot.m | 2 +- framework/Source/CPTTextLayer.h | 5 ++- framework/Source/CPTTextLayer.m | 12 +++---- framework/Source/CPTTextStyle.m | 2 +- framework/Source/CPTThemeTests.m | 4 +-- framework/Source/CPTTradingRangePlot.m | 2 +- framework/Source/CPTUtilities.m | 34 +++++++++---------- framework/Source/CPTUtilitiesTests.m | 8 ++--- framework/Source/CPTXYAxis.m | 8 ++--- framework/Source/CPTXYAxisSet.m | 2 +- framework/Source/CPTXYGraph.h | 5 ++- framework/Source/CPTXYPlotSpace.m | 14 ++++---- framework/Source/NSCoderExtensions.m | 4 +-- framework/Source/NSNumberExtensions.m | 4 +-- framework/Source/_CPTAnimationCGFloatPeriod.m | 4 +-- framework/Source/_CPTAnimationCGPointPeriod.m | 4 +-- framework/Source/_CPTAnimationCGRectPeriod.m | 4 +-- framework/Source/_CPTAnimationCGSizePeriod.m | 4 +-- .../Source/_CPTAnimationNSDecimalPeriod.m | 12 +++---- framework/Source/_CPTBorderLayer.m | 6 ++-- framework/iPhoneOnly/CPTGraphHostingView.m | 6 ++-- 64 files changed, 261 insertions(+), 250 deletions(-) diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 894f22bc5..5f18e0ddb 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -187,7 +187,7 @@ -(void)drawRect:(NSRect)dirtyRect // render CPTLayers recursively into the graphics context used for printing // (thanks to Brad for the tip: http://stackoverflow.com/a/2791305/132867 ) - CGContextRef context = [graphicsContext graphicsPort]; + CGContextRef context = graphicsContext.graphicsPort; [self.hostedGraph recursivelyRenderInContext:context]; [graphicsContext restoreGraphicsState]; @@ -235,7 +235,7 @@ -(void)mouseDown:(NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseDown = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseDown = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseDown toLayer:theGraph]; handled = [theGraph pointingDeviceDownEvent:theEvent atPoint:pointInHostedGraph]; } @@ -251,7 +251,7 @@ -(void)mouseDragged:(NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseDrag = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseDrag = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseDrag toLayer:theGraph]; handled = [theGraph pointingDeviceDraggedEvent:theEvent atPoint:pointInHostedGraph]; } @@ -267,7 +267,7 @@ -(void)mouseUp:(NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseUp = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseUp = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseUp toLayer:theGraph]; handled = [theGraph pointingDeviceUpEvent:theEvent atPoint:pointInHostedGraph]; } @@ -290,7 +290,7 @@ -(void)magnifyWithEvent:(NSEvent *)event BOOL handled = NO; if ( theGraph && self.allowPinchScaling ) { - CGPoint pointOfMagnification = NSPointToCGPoint([self convertPoint:[event locationInWindow] fromView:nil]); + CGPoint pointOfMagnification = NSPointToCGPoint([self convertPoint:event.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMagnification toLayer:theGraph]; CGPoint pointInPlotArea = [theGraph convertPoint:pointInHostedGraph toLayer:theGraph.plotAreaFrame.plotArea]; diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index f53be1a3a..1a83ef606 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -25,7 +25,7 @@ -(CPTNativeImage *)imageOfLayer bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect( context, CPTRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.h b/framework/MacOnly/CPTPlatformSpecificFunctions.h index 2f7d1b0cf..66fc3580a 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.h +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.h @@ -16,7 +16,7 @@ void CPTPopCGContext(void); /// @name Color Conversion /// @{ -__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor); +__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor) CF_RETURNS_RETAINED; CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor); /// @} diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index 2951f7cdc..d5a5162dc 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -125,7 +125,7 @@ CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *nsColor) NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect(context, rect); diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index 0c2248b1f..700f5b266 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -52,12 +52,12 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } else { - const NSInteger numberOfComponents = [styleColor numberOfComponents]; + const NSInteger numberOfComponents = styleColor.numberOfComponents; CGFloat *components = calloc( (size_t)numberOfComponents, sizeof(CGFloat) ); [styleColor getComponents:components]; - CGColorSpaceRef colorSpace = [[styleColor colorSpace] CGColorSpace]; + CGColorSpaceRef colorSpace = styleColor.colorSpace.CGColorSpace; CGColorRef styleCGColor = CGColorCreate(colorSpace, components); newStyle.color = [CPTColor colorWithCGColor:styleCGColor]; @@ -147,12 +147,12 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary *)attributes newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } else { - const NSInteger numberOfComponents = [styleColor numberOfComponents]; + const NSInteger numberOfComponents = styleColor.numberOfComponents; CGFloat *components = calloc( (size_t)numberOfComponents, sizeof(CGFloat) ); [styleColor getComponents:components]; - CGColorSpaceRef colorSpace = [[styleColor colorSpace] CGColorSpace]; + CGColorSpaceRef colorSpace = styleColor.colorSpace.CGColorSpace; CGColorRef styleCGColor = CGColorCreate(colorSpace, components); newStyle.color = [CPTColor colorWithCGColor:styleCGColor]; diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 45e43b968..ac8d365cb 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -187,7 +187,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property perio +(SEL)setterFromProperty:(NSString *)property { return NSSelectorFromString([NSString stringWithFormat:@"set%@:", [property stringByReplacingCharactersInRange:NSMakeRange(0, 1) - withString:[[property substringToIndex:1] capitalizedString]]]); + withString:[property substringToIndex:1].capitalizedString]]); } /// @endcond @@ -247,7 +247,7 @@ -(void)removeAllAnimationOperations -(CPTAnimationOperation *)operationWithIdentifier:(id)identifier { for ( CPTAnimationOperation *operation in self.animationOperations ) { - if ( [[operation identifier] isEqual:identifier] ) { + if ( [operation.identifier isEqual:identifier] ) { return operation; } } @@ -397,7 +397,7 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters id tweenedValue = parameters[CPTAnimationValueKey]; if ( [tweenedValue isKindOfClass:[NSDecimalNumber class]] ) { - NSDecimal buffer = [(NSDecimalNumber *)tweenedValue decimalValue]; + NSDecimal buffer = ( (NSDecimalNumber *)tweenedValue ).decimalValue; typedef void (*SetterType)(id, SEL, NSDecimal); SetterType setterMethod = (SetterType)[boundObject methodForSelector : boundSetter]; @@ -410,8 +410,8 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters NSGetSizeAndAlignment(value.objCType, &bufferSize, NULL); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundSetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundSetter]; + invocation.target = boundObject; + invocation.selector = boundSetter; void *buffer = malloc(bufferSize); [value getValue:buffer]; @@ -633,7 +633,7 @@ -(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve) -(NSString *)description { return [NSString stringWithFormat:@"<%@ timeOffset: %g; %lu active and %lu running operations>", - [super description], + super.description, self.timeOffset, (unsigned long)self.animationOperations.count, (unsigned long)self.runningAnimationOperations.count]; diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index f99b29b43..f10e31070 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -95,7 +95,7 @@ -(instancetype)init -(NSString *)description { - return [NSString stringWithFormat:@"<%@ animate %@ %@ with period %@>", [super description], self.boundObject, NSStringFromSelector(self.boundGetter), self.period]; + return [NSString stringWithFormat:@"<%@ animate %@ %@ with period %@>", super.description, self.boundObject, NSStringFromSelector(self.boundGetter), self.period]; } /// @endcond diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index fd94a212c..0588f6bfc 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -436,7 +436,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett -(NSString *)description { - return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", [super description], self.startValue, self.endValue, self.duration, self.delay]; + return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", super.description, self.startValue, self.endValue, self.duration, self.delay]; } /// @endcond diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 1662d9780..2b1772b31 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -102,7 +102,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder -(NSString *)description { - return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; + return [NSString stringWithFormat:@"<%@ {%@}>", super.description, self.contentLayer]; } /// @endcond @@ -141,7 +141,7 @@ -(void)setDisplacement:(CGPoint)newDisplacement { if ( !CGPointEqualToPoint(newDisplacement, displacement) ) { displacement = newDisplacement; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } @@ -149,7 +149,7 @@ -(void)setContentAnchorPoint:(CGPoint)newAnchorPoint { if ( !CGPointEqualToPoint(newAnchorPoint, contentAnchorPoint) ) { contentAnchorPoint = newAnchorPoint; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } @@ -157,7 +157,7 @@ -(void)setRotation:(CGFloat)newRotation { if ( newRotation != rotation ) { rotation = newRotation; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index b2d4129ca..14dfe73a7 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -156,7 +156,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout CPTMutableAnnotationArray *annotations = self.mutableAnnotations; if ( annotations.count > 0 ) { - CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; @@ -172,7 +172,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 12a79912e..265e881a4 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1545,7 +1545,7 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet *)locations inRange:(CPTPlotRan return; } - CPTDictionary *textAttributes = [theLabelTextStyle attributes]; + CPTDictionary *textAttributes = theLabelTextStyle.attributes; BOOL hasAttributedFormatter = ([theLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -2314,7 +2314,7 @@ -(void)setLabelTextStyle:(CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.axisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *)contentLayer setTextStyle : labelTextStyle]; + ( (CPTTextLayer *)contentLayer ).textStyle = labelTextStyle; } } @@ -2331,7 +2331,7 @@ -(void)setMinorTickLabelTextStyle:(CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.minorTickAxisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *)contentLayer setTextStyle : minorTickLabelTextStyle]; + ( (CPTTextLayer *)contentLayer ).textStyle = minorTickLabelTextStyle; } } @@ -3157,7 +3157,7 @@ -(CPTAxisSet *)axisSet -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; [self setNeedsRelabel]; } } diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index 220db2500..9e1edfe9f 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -296,7 +296,7 @@ -(void)positionBetweenViewPoint:(CGPoint)firstPoint andViewPoint:(CGPoint)second -(NSString *)description { - return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; + return [NSString stringWithFormat:@"<%@ {%@}>", super.description, self.contentLayer]; } /// @endcond diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 74313d0bd..c4d3dc293 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -1180,7 +1180,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte NSNumber *location = [self cachedNumberForField:CPTBarPlotFieldBarLocation recordIndex:idx]; NSNumber *length = [self cachedNumberForField:CPTBarPlotFieldBarTip recordIndex:idx]; - BOOL positiveDirection = CPTDecimalGreaterThanOrEqualTo([length decimalValue], theBaseDecimalValue); + BOOL positiveDirection = CPTDecimalGreaterThanOrEqualTo(length.decimalValue, theBaseDecimalValue); BOOL horizontalBars = self.barsAreHorizontal; CPTCoordinate coordinate = (horizontalBars ? CPTCoordinateX : CPTCoordinateY); CPTPlotRange *lengthRange = [self.plotSpace plotRangeForCoordinate:coordinate]; @@ -1193,7 +1193,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte offsetLocation = @(location.doubleValue + [self doubleLengthInPlotCoordinates:self.barOffset.decimalValue]); } else { - NSDecimal decimalLocation = [location decimalValue]; + NSDecimal decimalLocation = location.decimalValue; NSDecimal offset = [self lengthInPlotCoordinates:self.barOffset.decimalValue]; offsetLocation = [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalAdd(decimalLocation, offset)]; } diff --git a/framework/Source/CPTBorderedLayer.m b/framework/Source/CPTBorderedLayer.m index 63910ba72..62a318aaa 100644 --- a/framework/Source/CPTBorderedLayer.m +++ b/framework/Source/CPTBorderedLayer.m @@ -365,7 +365,7 @@ -(void)setCornerRadius:(CGFloat)newRadius -(void)setMasksToBorder:(BOOL)newMasksToBorder { if ( newMasksToBorder != self.masksToBorder ) { - [super setMasksToBorder:newMasksToBorder]; + super.masksToBorder = newMasksToBorder; if ( newMasksToBorder ) { CPTMaskLayer *maskLayer = [[CPTMaskLayer alloc] initWithFrame:self.bounds]; @@ -438,57 +438,57 @@ -(CPTLayer *)borderLayer -(void)setBounds:(CGRect)newBounds { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setBounds:newBounds]; + self.borderLayer.bounds = newBounds; } else { - [super setBounds:newBounds]; + super.bounds = newBounds; } } -(void)setPosition:(CGPoint)newPosition { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setPosition:newPosition]; + self.borderLayer.position = newPosition; } else { - [super setPosition:newPosition]; + super.position = newPosition; } } -(void)setAnchorPoint:(CGPoint)newAnchorPoint { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setAnchorPoint:newAnchorPoint]; + self.borderLayer.anchorPoint = newAnchorPoint; } else { - [super setAnchorPoint:newAnchorPoint]; + super.anchorPoint = newAnchorPoint; } } -(void)setHidden:(BOOL)newHidden { if ( self.masksToBorder ) { - [self.borderLayer setHidden:newHidden]; + self.borderLayer.hidden = newHidden; } else { - [super setHidden:newHidden]; + super.hidden = newHidden; } } -(void)setTransform:(CATransform3D)newTransform { if ( self.masksToBorder ) { - [self.borderLayer setTransform:newTransform]; + self.borderLayer.transform = newTransform; } else { - [super setTransform:newTransform]; + super.transform = newTransform; } } -(void)setShadow:(CPTShadow *)newShadow { if ( newShadow != self.shadow ) { - [super setShadow:newShadow]; + super.shadow = newShadow; if ( self.masksToBorder ) { self.borderLayer.shadow = newShadow; @@ -499,10 +499,10 @@ -(void)setShadow:(CPTShadow *)newShadow -(void)setBackgroundColor:(CGColorRef)newColor { if ( self.masksToBorder ) { - [self.borderLayer setBackgroundColor:newColor]; + self.borderLayer.backgroundColor = newColor; } else { - [super setBackgroundColor:newColor]; + super.backgroundColor = newColor; } } diff --git a/framework/Source/CPTDarkGradientThemeTests.m b/framework/Source/CPTDarkGradientThemeTests.m index 67dbe9801..0f215c53f 100644 --- a/framework/Source/CPTDarkGradientThemeTests.m +++ b/framework/Source/CPTDarkGradientThemeTests.m @@ -22,7 +22,7 @@ -(void)testNewThemeSetGraphClassReturnedClassShouldBeOfCorrectType // Arrange _CPTDarkGradientTheme *theme = [[_CPTDarkGradientTheme alloc] init]; - [theme setGraphClass:[CPTDerivedXYGraph class]]; + theme.graphClass = [CPTDerivedXYGraph class]; // Act CPTGraph *graph = [theme newGraph]; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 7ab6f8db3..e8c0e618b 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -35,7 +35,7 @@ -(void)tearDown { self.xData = nil; self.yData = nil; - [[self plots] removeAllObjects]; + [self.plots removeAllObjects]; } -(void)buildData @@ -62,7 +62,7 @@ -(void)addPlot:(CPTPlot *)newPlot self.plots = [NSMutableArray array]; } - [[self plots] addObject:newPlot]; + [self.plots addObject:newPlot]; } -(CPTPlotRange *)xRange @@ -109,16 +109,16 @@ -(CPTNumberArray *)numbersForPlot:(CPTPlot *)plot switch ( fieldEnum ) { case CPTScatterPlotFieldX: - result = [[self xData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; + result = [self.xData objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; break; case CPTScatterPlotFieldY: - result = [[self yData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; + result = [self.yData objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; if ( self.plots.count > 1 ) { XCTAssertTrue([[self plots] containsObject:plot], @"Plot missing"); CPTMutableNumberArray *shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; for ( NSDecimalNumber *d in result ) { - [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([[self plots] indexOfObject:plot] + 1) )]]]; + [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([self.plots indexOfObject:plot] + 1) )]]]; } result = shiftedResult; diff --git a/framework/Source/CPTGradient.h b/framework/Source/CPTGradient.h index 637ea858f..84b839e2d 100644 --- a/framework/Source/CPTGradient.h +++ b/framework/Source/CPTGradient.h @@ -90,8 +90,8 @@ typedef NS_ENUM (NSInteger, CPTGradientType) { /// @name Information /// @{ --(nullable CGColorRef)newColorStopAtIndex:(NSUInteger)idx; --(nonnull CGColorRef)newColorAtPosition:(CGFloat)position; +-(nullable CGColorRef)newColorStopAtIndex:(NSUInteger)idx CF_RETURNS_RETAINED; +-(nonnull CGColorRef)newColorAtPosition:(CGFloat)position CF_RETURNS_RETAINED; /// @} /// @name Drawing diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 8203063e8..9b0348409 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -21,7 +21,7 @@ -(void)addElement:(CPTGradientElement *)newElement; -(CGShadingRef)newAxialGradientInRect:(CGRect)rect; -(CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(CGContextRef)context; --(CPTGradientElement *)elementAtIndex:(NSUInteger)idx; +-(CPTGradientElement *)elementAtIndex:(NSUInteger)idx NS_RETURNS_INNER_POINTER; -(NSUInteger)elementCount; -(CPTGradientElement)removeElementAtIndex:(NSUInteger)idx; @@ -182,7 +182,7 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)coder { - if ( [coder allowsKeyedCoding] ) { + if ( coder.allowsKeyedCoding ) { NSUInteger count = 0; CPTGradientElement *currentElement = self.elementList; while ( currentElement != NULL ) { diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 50ed2901e..46fdbcf52 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -435,7 +435,7 @@ -(CPTPlot *)plotAtIndex:(NSUInteger)idx -(CPTPlot *)plotWithIdentifier:(id)identifier { for ( CPTPlot *plot in self.plots ) { - if ( [[plot identifier] isEqual:identifier] ) { + if ( [plot.identifier isEqual:identifier] ) { return plot; } } @@ -554,7 +554,7 @@ -(CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx -(CPTPlotSpace *)plotSpaceWithIdentifier:(id)identifier { for ( CPTPlotSpace *plotSpace in self.plotSpaces ) { - if ( [[plotSpace identifier] isEqual:identifier] ) { + if ( [plotSpace.identifier isEqual:identifier] ) { return plotSpace; } } @@ -805,7 +805,7 @@ -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -813,7 +813,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -821,7 +821,7 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -829,7 +829,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; + super.paddingBottom = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 9f936fddd..209a05ae2 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -536,7 +536,7 @@ -(CPTNativeImage *)nativeImage bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:imageRep]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextDrawImage(context, CPTRectMake(0.0, 0.0, imageSize.width, imageSize.height), imageRef); diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 9ffa20897..1f8b34efb 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -634,7 +634,7 @@ -(void)layoutSublayers subLayerFrame.origin = CGPointMake( round(leftPadding), round(bottomPadding) ); subLayerFrame.size = subLayerSize; - CPTSublayerSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + CPTSublayerSet *excludedSublayers = self.sublayersExcludedFromAutomaticLayout; Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in mySublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { @@ -672,7 +672,7 @@ -(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)ri -(void)setSublayers:(CPTSublayerArray *)sublayers { - [super setSublayers:sublayers]; + super.sublayers = sublayers; Class layerClass = [CPTLayer class]; CGFloat scale = self.contentsScale; @@ -852,7 +852,7 @@ -(void)setNeedsDisplay -(void)setPosition:(CGPoint)newPosition { - [super setPosition:newPosition]; + super.position = newPosition; if ( COREPLOT_LAYER_POSITION_CHANGE_ENABLED() ) { CGRect currentFrame = self.frame; if ( !CGRectEqualToRect( currentFrame, CGRectIntegral(self.frame) ) ) { @@ -868,7 +868,7 @@ -(void)setPosition:(CGPoint)newPosition -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; if ( !newHidden ) { [self setNeedsDisplay]; } @@ -959,7 +959,7 @@ -(void)setBounds:(CGRect)newBounds newBounds.size.height += sizeOffset.height * CPTFloat(2.0); } - [super setBounds:newBounds]; + super.bounds = newBounds; self.outerBorderPath = NULL; self.innerBorderPath = NULL; @@ -1006,7 +1006,7 @@ -(void)setAnchorPoint:(CGPoint)newAnchorPoint } } - [super setAnchorPoint:newAnchorPoint]; + super.anchorPoint = newAnchorPoint; } -(void)setCornerRadius:(CGFloat)newRadius @@ -1030,7 +1030,7 @@ -(void)setCornerRadius:(CGFloat)newRadius -(NSString *)description { - return [NSString stringWithFormat:@"<%@ bounds: %@>", [super description], CPTStringFromRect(self.bounds)]; + return [NSString stringWithFormat:@"<%@ bounds: %@>", super.description, CPTStringFromRect(self.bounds)]; } /// @endcond @@ -1052,7 +1052,7 @@ -(NSString *)subLayersAtIndex:(NSUInteger)idx for ( NSUInteger i = 0; i < idx; i++ ) { [result appendString:@". "]; } - [result appendString:[self description]]; + [result appendString:self.description]; for ( CPTLayer *sublayer in self.sublayers ) { [result appendString:@"\n"]; @@ -1061,7 +1061,7 @@ -(NSString *)subLayersAtIndex:(NSUInteger)idx [result appendString:[sublayer subLayersAtIndex:idx + 1]]; } else { - [result appendString:[sublayer description]]; + [result appendString:sublayer.description]; } } diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 55afc4230..ec8e55a66 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -856,7 +856,7 @@ -(CPTPlot *)plotAtIndex:(NSUInteger)idx -(CPTPlot *)plotWithIdentifier:(id)identifier { for ( CPTPlot *plot in self.plots ) { - if ( [[plot identifier] isEqual:identifier] ) { + if ( [plot.identifier isEqual:identifier] ) { return plot; } } @@ -1272,7 +1272,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio -(NSString *)description { - return [NSString stringWithFormat:@"<%@ for plots %@>", [super description], self.plots]; + return [NSString stringWithFormat:@"<%@ for plots %@>", super.description, self.plots]; } /// @endcond @@ -1485,7 +1485,7 @@ -(void)setLayoutChanged:(BOOL)newLayoutChanged -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; self.layoutChanged = YES; } } @@ -1493,7 +1493,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; self.layoutChanged = YES; } } @@ -1501,7 +1501,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; self.layoutChanged = YES; } } @@ -1509,8 +1509,8 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; - self.layoutChanged = YES; + super.paddingBottom = newPadding; + self.layoutChanged = YES; } } @@ -1519,7 +1519,7 @@ -(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle CPTLineStyle *oldLineStyle = self.borderLineStyle; if ( newLineStyle != oldLineStyle ) { - [super setBorderLineStyle:newLineStyle]; + super.borderLineStyle = newLineStyle; if ( newLineStyle.lineWidth != oldLineStyle.lineWidth ) { self.layoutChanged = YES; diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index 5e4a17017..491126929 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -79,7 +79,7 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)encoder { - if ( [encoder allowsKeyedCoding] ) { + if ( encoder.allowsKeyedCoding ) { [encoder encodeObject:self.range forKey:@"CPTLimitBand.range"]; [encoder encodeObject:self.fill forKey:@"CPTLimitBand.fill"]; } @@ -98,7 +98,7 @@ -(void)encodeWithCoder:(NSCoder *)encoder -(instancetype)initWithCoder:(NSCoder *)decoder { if ( (self = [super init]) ) { - if ( [decoder allowsKeyedCoding] ) { + if ( decoder.allowsKeyedCoding ) { range = [decoder decodeObjectForKey:@"CPTLimitBand.range"]; fill = [decoder decodeObjectForKey:@"CPTLimitBand.fill"]; } @@ -117,7 +117,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder -(NSString *)description { - return [NSString stringWithFormat:@"<%@ with range: %@ and fill: %@>", [super description], self.range, self.fill]; + return [NSString stringWithFormat:@"<%@ with range: %@ and fill: %@>", super.description, self.range, self.fill]; } /// @endcond diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index 8464ede0e..6f1768b33 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -15,8 +15,8 @@ /// @name Samples /// @{ --(nullable void *)mutableSamplePointer:(NSUInteger)sample; --(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable void *)mutableSamplePointer:(NSUInteger)sample NS_RETURNS_INNER_POINTER; +-(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ...NS_RETURNS_INNER_POINTER; /// @} @end diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 366b92bd4..5255b82b1 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -87,7 +87,7 @@ -(void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... -(void *)mutableBytes { - return [(NSMutableData *)self.data mutableBytes]; + return ( (NSMutableData *)self.data ).mutableBytes; } /// @endcond diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index 67eafd056..774419104 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -16,7 +16,7 @@ -(void)testNilShapeGivesSingleDimension NSUInteger expected = 1; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); - expected = [nd.shape count]; + expected = nd.shape.count; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); } @@ -47,7 +47,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= [num unsignedIntValue]; + prod *= num.unsignedIntValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); @@ -79,7 +79,7 @@ -(void)testReturnsDataLength shape:nil]; NSUInteger expected = 10 * sizeof(float); - NSUInteger actual = [nd length]; + NSUInteger actual = nd.length; XCTAssertEqual(expected, actual, @"data length"); } @@ -88,7 +88,7 @@ -(void)testBytesEqualDataBytes { NSUInteger nElements = 10; NSMutableData *data = [NSMutableData dataWithLength:nElements * sizeof(NSInteger)]; - NSInteger *intData = (NSInteger *)[data mutableBytes]; + NSInteger *intData = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < nElements; i++ ) { intData[i] = (NSInteger)i; @@ -106,7 +106,7 @@ -(void)testArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -133,7 +133,7 @@ -(void)testNumberOfSamplesCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -147,7 +147,7 @@ -(void)testNumberOfSamplesCorrectForDataType nElems = 10; data = [NSMutableData dataWithLength:nElems * sizeof(char)]; - char *charSamples = (char *)[data mutableBytes]; + char *charSamples = (char *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { charSamples[i] = (char)lrint(sin(i) * 100.0); } @@ -163,7 +163,7 @@ -(void)testDataTypeAccessorsCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -182,7 +182,7 @@ -(void)testConvertTypeConvertsType { NSUInteger numberOfSamples = 10; NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -196,7 +196,7 @@ -(void)testConvertTypeConvertsType sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); } @@ -206,7 +206,7 @@ -(void)testSamplePointerCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -226,7 +226,7 @@ -(void)testSampleValueCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); diff --git a/framework/Source/CPTMutableNumericDataTypeConversionTests.m b/framework/Source/CPTMutableNumericDataTypeConversionTests.m index 1f825e4c8..b84644905 100644 --- a/framework/Source/CPTMutableNumericDataTypeConversionTests.m +++ b/framework/Source/CPTMutableNumericDataTypeConversionTests.m @@ -11,7 +11,7 @@ @implementation CPTMutableNumericDataTypeConversionTests -(void)testFloatToDoubleInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -23,7 +23,7 @@ -(void)testFloatToDoubleInPlaceConversion numericData.sampleBytes = sizeof(double); - const double *doubleSamples = (const double *)[numericData.data bytes]; + const double *doubleSamples = (const double *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); } @@ -32,7 +32,7 @@ -(void)testFloatToDoubleInPlaceConversion -(void)testDoubleToFloatInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -44,7 +44,7 @@ -(void)testDoubleToFloatInPlaceConversion numericData.sampleBytes = sizeof(float); - const float *floatSamples = (const float *)[numericData.data bytes]; + const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); } @@ -53,7 +53,7 @@ -(void)testDoubleToFloatInPlaceConversion -(void)testFloatToIntegerInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i) * 1000.0f; @@ -65,7 +65,7 @@ -(void)testFloatToIntegerInPlaceConversion numericData.dataType = CPTDataType( CPTIntegerDataType, sizeof(NSInteger), NSHostByteOrder() ); - const NSInteger *intSamples = (const NSInteger *)[numericData.data bytes]; + const NSInteger *intSamples = (const NSInteger *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); } @@ -74,7 +74,7 @@ -(void)testFloatToIntegerInPlaceConversion -(void)testIntegerToFloatInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -86,7 +86,7 @@ -(void)testIntegerToFloatInPlaceConversion numericData.dataType = CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ); - const float *floatSamples = (const float *)[numericData.data bytes]; + const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); } @@ -95,7 +95,7 @@ -(void)testIntegerToFloatInPlaceConversion -(void)testDecimalToDoubleInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); @@ -107,7 +107,7 @@ -(void)testDecimalToDoubleInPlaceConversion numericData.dataType = CPTDataType( CPTFloatingPointDataType, sizeof(double), NSHostByteOrder() ); - const double *doubleSamples = (const double *)[numericData.data bytes]; + const double *doubleSamples = (const double *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqual(CPTDecimalDoubleValue(samples[i]), doubleSamples[i], @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(samples[i]), doubleSamples[i]); } @@ -116,7 +116,7 @@ -(void)testDecimalToDoubleInPlaceConversion -(void)testDoubleToDecimalInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -128,7 +128,7 @@ -(void)testDoubleToDecimalInPlaceConversion numericData.dataType = CPTDataType( CPTDecimalDataType, sizeof(NSDecimal), NSHostByteOrder() ); - const NSDecimal *decimalSamples = (const NSDecimal *)[numericData.data bytes]; + const NSDecimal *decimalSamples = (const NSDecimal *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(CPTDecimalEquals( decimalSamples[i], CPTDecimalFromDouble(samples[i]) ), @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(decimalSamples[i]), samples[i]); } diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index f42a87299..99fe3ead8 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -57,8 +57,8 @@ /// @name Samples /// @{ -(NSUInteger)sampleIndex:(NSUInteger)idx, ...; --(nullable const void *)samplePointer:(NSUInteger)sample; --(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable const void *)samplePointer:(NSUInteger)sample NS_RETURNS_INNER_POINTER; +-(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...NS_RETURNS_INNER_POINTER; -(nullable NSNumber *)sampleValue:(NSUInteger)sample; -(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; -(nonnull CPTNumberArray *)sampleArray; diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 3c29c81f9..9ffdb475e 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -439,7 +439,7 @@ -(void)commonInitWithData:(NSData *)newData else { NSUInteger prod = 1; for ( NSNumber *cNum in shapeArray ) { - prod *= [cNum unsignedIntegerValue]; + prod *= cNum.unsignedIntegerValue; } if ( prod != self.numberOfSamples ) { @@ -559,7 +559,7 @@ -(void)setShape:(CPTNumberArray *)newShape if ( [myData isKindOfClass:[NSMutableData class]] ) { NSUInteger sampleCount = 1; for ( NSNumber *num in shape ) { - sampleCount *= [num unsignedIntegerValue]; + sampleCount *= num.unsignedIntegerValue; } myData.length = sampleCount * self.sampleBytes; @@ -810,7 +810,7 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList if ( argIndex > 0 ) { indices[argIndex] = va_arg(indexList, NSUInteger); } - dims[argIndex] = [dim unsignedIntegerValue]; + dims[argIndex] = dim.unsignedIntegerValue; if ( indices[argIndex] >= dims[argIndex] ) { free(dims); @@ -1102,7 +1102,7 @@ -(NSString *)description NSUInteger sampleCount = self.numberOfSamples; NSMutableString *descriptionString = [NSMutableString stringWithCapacity:sampleCount * 3]; - [descriptionString appendFormat:@"<%@ [", [super description]]; + [descriptionString appendFormat:@"<%@ [", super.description]; for ( NSUInteger i = 0; i < sampleCount; i++ ) { if ( i > 0 ) { [descriptionString appendFormat:@","]; @@ -1156,7 +1156,7 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)encoder { - if ( [encoder allowsKeyedCoding] ) { + if ( encoder.allowsKeyedCoding ) { [encoder encodeObject:self.data forKey:@"CPTNumericData.data"]; CPTNumericDataType selfDataType = self.dataType; @@ -1196,7 +1196,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder CPTNumberArray *shapeArray; CPTDataOrder order; - if ( [decoder allowsKeyedCoding] ) { + if ( decoder.allowsKeyedCoding ) { newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey: @"CPTNumericData.dataType.dataTypeFormat"], diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index c0eaeb007..37231e0b3 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -15,7 +15,7 @@ -(void)testNilShapeGivesSingleDimension NSUInteger expected = 1; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); - expected = [nd.shape count]; + expected = nd.shape.count; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); } @@ -46,7 +46,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= [num unsignedIntValue]; + prod *= num.unsignedIntValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); @@ -78,7 +78,7 @@ -(void)testReturnsDataLength shape:nil]; NSUInteger expected = 10 * sizeof(float); - NSUInteger actual = [nd.data length]; + NSUInteger actual = nd.data.length; XCTAssertEqual(expected, actual, @"data length"); } @@ -87,7 +87,7 @@ -(void)testBytesEqualDataBytes { NSUInteger nElements = 10; NSMutableData *data = [NSMutableData dataWithLength:nElements * sizeof(NSInteger)]; - NSInteger *intData = (NSInteger *)[data mutableBytes]; + NSInteger *intData = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < nElements; i++ ) { intData[i] = (NSInteger)i; @@ -106,7 +106,7 @@ -(void)testArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -133,7 +133,7 @@ -(void)testKeyedArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -160,7 +160,7 @@ -(void)testNumberOfSamplesCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -174,7 +174,7 @@ -(void)testNumberOfSamplesCorrectForDataType nElems = 10; data = [NSMutableData dataWithLength:nElems * sizeof(char)]; - char *charSamples = (char *)[data mutableBytes]; + char *charSamples = (char *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { charSamples[i] = (char)lrint(sin(i) * 100.0); } @@ -190,7 +190,7 @@ -(void)testDataTypeAccessorsCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -209,7 +209,7 @@ -(void)testConvertTypeConvertsType { NSUInteger numberOfSamples = 10; NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -223,7 +223,7 @@ -(void)testConvertTypeConvertsType sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); } @@ -233,7 +233,7 @@ -(void)testSamplePointerCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -253,7 +253,7 @@ -(void)testSampleValueCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -273,7 +273,7 @@ -(void)testSampleIndexRowsFirstOrder const NSUInteger cols = 4; NSMutableData *data = [NSMutableData dataWithLength:rows * cols * sizeof(NSUInteger)]; - NSUInteger *samples = (NSUInteger *)[data mutableBytes]; + NSUInteger *samples = (NSUInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < rows * cols; i++ ) { samples[i] = i; @@ -300,7 +300,7 @@ -(void)testSampleIndexColumnsFirstOrder const NSUInteger cols = 4; NSMutableData *data = [NSMutableData dataWithLength:rows * cols * sizeof(NSUInteger)]; - NSUInteger *samples = (NSUInteger *)[data mutableBytes]; + NSUInteger *samples = (NSUInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < rows * cols; i++ ) { samples[i] = i; diff --git a/framework/Source/CPTNumericDataType.m b/framework/Source/CPTNumericDataType.m index 4ea9e4171..0384a87b4 100644 --- a/framework/Source/CPTNumericDataType.m +++ b/framework/Source/CPTNumericDataType.m @@ -202,7 +202,7 @@ CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString) NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); #pragma clang diagnostic pop - switch ( [[dataTypeString lowercaseString] characterAtIndex:1] ) { + switch ( [dataTypeString.lowercaseString characterAtIndex:1] ) { case 'f': result = CPTFloatingPointDataType; break; @@ -236,7 +236,7 @@ size_t SampleBytesForDataTypeString(NSString *dataTypeString) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); - NSInteger result = [[dataTypeString substringFromIndex:2] integerValue]; + NSInteger result = [dataTypeString substringFromIndex:2].integerValue; NSCAssert(result > 0, @"sample bytes is negative."); #pragma clang diagnostic pop @@ -252,7 +252,7 @@ CFByteOrder ByteOrderForDataTypeString(NSString *dataTypeString) CFByteOrder result = CFByteOrderUnknown; - switch ( [[dataTypeString lowercaseString] characterAtIndex:0] ) { + switch ( [dataTypeString.lowercaseString characterAtIndex:0] ) { case '=': result = CFByteOrderGetCurrent(); break; diff --git a/framework/Source/CPTNumericDataTypeConversionTests.m b/framework/Source/CPTNumericDataTypeConversionTests.m index 72e4589f4..440a83ba4 100644 --- a/framework/Source/CPTNumericDataTypeConversionTests.m +++ b/framework/Source/CPTNumericDataTypeConversionTests.m @@ -11,7 +11,7 @@ @implementation CPTNumericDataTypeConversionTests -(void)testFloatToDoubleConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -25,7 +25,7 @@ -(void)testFloatToDoubleConversion sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); } @@ -34,7 +34,7 @@ -(void)testFloatToDoubleConversion -(void)testDoubleToFloatConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -48,7 +48,7 @@ -(void)testDoubleToFloatConversion sampleBytes:sizeof(float) byteOrder:NSHostByteOrder()]; - const float *floatSamples = (const float *)[fd.data bytes]; + const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); } @@ -57,7 +57,7 @@ -(void)testDoubleToFloatConversion -(void)testFloatToIntegerConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i) * 1000.0f; @@ -71,7 +71,7 @@ -(void)testFloatToIntegerConversion sampleBytes:sizeof(NSInteger) byteOrder:NSHostByteOrder()]; - const NSInteger *intSamples = (const NSInteger *)[intData.data bytes]; + const NSInteger *intSamples = (const NSInteger *)intData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); } @@ -80,7 +80,7 @@ -(void)testFloatToIntegerConversion -(void)testIntegerToFloatConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -94,7 +94,7 @@ -(void)testIntegerToFloatConversion sampleBytes:sizeof(float) byteOrder:NSHostByteOrder()]; - const float *floatSamples = (const float *)[fd.data bytes]; + const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); } @@ -133,7 +133,7 @@ -(void)testTypeConversionSwapsByteOrderInteger -(void)testDecimalToDoubleConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); @@ -147,7 +147,7 @@ -(void)testDecimalToDoubleConversion sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[doubleData.data bytes]; + const double *doubleSamples = (const double *)doubleData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqual(CPTDecimalDoubleValue(samples[i]), doubleSamples[i], @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(samples[i]), doubleSamples[i]); } @@ -156,7 +156,7 @@ -(void)testDecimalToDoubleConversion -(void)testDoubleToDecimalConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -170,7 +170,7 @@ -(void)testDoubleToDecimalConversion sampleBytes:sizeof(NSDecimal) byteOrder:NSHostByteOrder()]; - const NSDecimal *decimalSamples = (const NSDecimal *)[decimalData.data bytes]; + const NSDecimal *decimalSamples = (const NSDecimal *)decimalData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(CPTDecimalEquals( decimalSamples[i], CPTDecimalFromDouble(samples[i]) ), @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(decimalSamples[i]), samples[i]); } @@ -215,7 +215,7 @@ -(void)testTypeConversionSwapsByteOrderDouble -(void)testRoundTripToDoubleArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -243,7 +243,7 @@ -(void)testRoundTripToDoubleArray -(void)testRoundTripToIntegerArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -271,7 +271,7 @@ -(void)testRoundTripToIntegerArray -(void)testRoundTripToDecimalArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); diff --git a/framework/Source/CPTPathExtensions.h b/framework/Source/CPTPathExtensions.h index a3722a615..c47bfcf5a 100644 --- a/framework/Source/CPTPathExtensions.h +++ b/framework/Source/CPTPathExtensions.h @@ -4,7 +4,12 @@ extern "C" { #endif +CF_IMPLICIT_BRIDGING_ENABLED + __nonnull CGPathRef CPTCreateRoundedRectPath(CGRect rect, CGFloat cornerRadius); + +CF_IMPLICIT_BRIDGING_DISABLED + void CPTAddRoundedRectPath(__nonnull CGContextRef context, CGRect rect, CGFloat cornerRadius); #if __cplusplus diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 4afdaa4fa..c4e1c58a5 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -1460,7 +1460,7 @@ -(void)setLabelRotationRelativeToRadius:(BOOL)newLabelRotationRelativeToRadius -(void)setLabelRotation:(CGFloat)newRotation { if ( newRotation != self.labelRotation ) { - [super setLabelRotation:newRotation]; + super.labelRotation = newRotation; if ( self.labelRotationRelativeToRadius ) { [self repositionAllLabelAnnotations]; } diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 9e8f3598b..05f7c0e99 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -93,7 +93,7 @@ typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; * @param indexRange The range of the data indexes of interest. * @return A retained C array of data points. **/ --(nullable double *)doublesForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; +-(nullable double *)doublesForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange NS_RETURNS_INNER_POINTER; /** @brief @optional Gets a plot data value for the given plot and field. * Implement one and only one of the optional methods in this section. diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index d946cd666..62e36fc70 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -582,7 +582,7 @@ -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRec NSParameterAssert(idx <= self.cachedDataCount); Class numericClass = [CPTNumericData class]; - for ( id data in [self.cachedData allValues] ) { + for ( id data in self.cachedData.allValues ) { if ( [data isKindOfClass:numericClass] ) { CPTMutableNumericData *numericData = (CPTMutableNumericData *)data; size_t sampleSize = numericData.sampleBytes; @@ -618,7 +618,7 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange NSParameterAssert(NSMaxRange(indexRange) <= self.cachedDataCount); Class numericClass = [CPTNumericData class]; - for ( id data in [self.cachedData allValues] ) { + for ( id data in self.cachedData.allValues ) { if ( [data isKindOfClass:numericClass] ) { CPTMutableNumericData *numericData = (CPTMutableNumericData *)data; size_t sampleSize = numericData.sampleBytes; @@ -757,7 +757,7 @@ -(id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRan else if ( [theDataSource respondsToSelector:@selector(doubleForPlot:field:recordIndex:)] ) { NSUInteger recordIndex; NSMutableData *fieldData = [NSMutableData dataWithLength:sizeof(double) * indexRange.length]; - double *fieldValues = [fieldData mutableBytes]; + double *fieldValues = fieldData.mutableBytes; for ( recordIndex = indexRange.location; recordIndex < indexRange.location + indexRange.length; ++recordIndex ) { double number = [theDataSource doubleForPlot:self field:fieldEnum recordIndex:recordIndex]; *fieldValues++ = number; @@ -814,8 +814,8 @@ -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRan if ( (sampleCount > 0) && (data.numberOfDimensions == 2) ) { CPTNumberArray *theShape = data.shape; - const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; - const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; + const NSUInteger rowCount = theShape[0].unsignedIntegerValue; + const NSUInteger fieldCount = theShape[1].unsignedIntegerValue; if ( fieldCount > 0 ) { // convert data type if needed @@ -1174,9 +1174,9 @@ -(BOOL)doublePrecisionCache { NSMutableDictionary *dataCache = self.cachedData; Class numberClass = [NSNumber class]; - for ( id key in [dataCache allKeys] ) { + for ( id key in dataCache.allKeys ) { if ( [key isKindOfClass:numberClass] ) { - result = CPTDataTypeEqualToDataType([(CPTMutableNumericData *)dataCache[key] dataType], self.doubleDataType); + result = CPTDataTypeEqualToDataType( ( (CPTMutableNumericData *)dataCache[key] ).dataType, self.doubleDataType ); break; } } @@ -1297,7 +1297,7 @@ -(void)setCachedDataType:(CPTNumericDataType)newDataType NSMutableDictionary *dataDictionary = self.cachedData; - for ( id key in [dataDictionary allKeys] ) { + for ( id key in dataDictionary.allKeys ) { if ( [key isKindOfClass:numberClass] ) { CPTMutableNumericData *numericData = dataDictionary[key]; numericData.dataType = newDataType; @@ -1455,8 +1455,8 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum } } else { - NSDecimal min = [[NSDecimalNumber maximumDecimalNumber] decimalValue]; - NSDecimal max = [[NSDecimalNumber minimumDecimalNumber] decimalValue]; + NSDecimal min = [NSDecimalNumber maximumDecimalNumber].decimalValue; + NSDecimal max = [NSDecimalNumber minimumDecimalNumber].decimalValue; const NSDecimal *decimals = (const NSDecimal *)numbers.bytes; const NSDecimal *lastSample = decimals + numberOfSamples; @@ -1558,7 +1558,7 @@ -(void)relabel return; } - CPTDictionary *textAttributes = [dataLabelTextStyle attributes]; + CPTDictionary *textAttributes = dataLabelTextStyle.attributes; BOOL hasAttributedFormatter = ([dataLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -2154,7 +2154,7 @@ -(void)setAlignsPointsToPixels:(BOOL)newAlignsPointsToPixels -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; [self setNeedsRelabel]; } } diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 2ce7bdf86..8c7edcad1 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -363,7 +363,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout CPTAxisLabelGroup *titles = self.axisTitleGroup; if ( minorGrid || majorGrid || theAxisSet || thePlotGroup || labels || titles ) { - CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } @@ -390,7 +390,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } @@ -413,8 +413,8 @@ -(void)updateLayerOrder if ( tdLayerOrder ) { buLayerOrder = self.bottomUpLayerOrder; - for ( NSUInteger layerIndex = 0; layerIndex < [tdLayerOrder count]; layerIndex++ ) { - CPTGraphLayerType layerType = (CPTGraphLayerType)[tdLayerOrder[layerIndex] intValue]; + for ( NSUInteger layerIndex = 0; layerIndex < tdLayerOrder.count; layerIndex++ ) { + CPTGraphLayerType layerType = (CPTGraphLayerType)tdLayerOrder[layerIndex].intValue; NSUInteger i = kCPTNumberOfLayers - layerIndex - 1; while ( buLayerOrder[i] != layerType ) { if ( i == 0 ) { @@ -893,7 +893,7 @@ -(void)setTopDownLayerOrder:(CPTNumberArray *)newArray -(void)setGraph:(CPTGraph *)newGraph { if ( newGraph != self.graph ) { - [super setGraph:newGraph]; + super.graph = newGraph; for ( CPTAxis *axis in self.axisSet.axes ) { axis.graph = newGraph; @@ -904,7 +904,7 @@ -(void)setGraph:(CPTGraph *)newGraph -(void)setBounds:(CGRect)newBounds { if ( !CGRectEqualToRect(self.bounds, newBounds) ) { - [super setBounds:newBounds]; + super.bounds = newBounds; self.widthDecimal = CPTDecimalFromCGFloat(newBounds.size.width); self.heightDecimal = CPTDecimalFromCGFloat(newBounds.size.height); diff --git a/framework/Source/CPTPlotAreaFrame.m b/framework/Source/CPTPlotAreaFrame.m index 9102b3392..244b6d442 100644 --- a/framework/Source/CPTPlotAreaFrame.m +++ b/framework/Source/CPTPlotAreaFrame.m @@ -233,7 +233,7 @@ -(void)setPlotGroup:(CPTPlotGroup *)newPlotGroup -(void)setGraph:(CPTGraph *)newGraph { if ( newGraph != self.graph ) { - [super setGraph:newGraph]; + super.graph = newGraph; self.plotArea.graph = newGraph; } diff --git a/framework/Source/CPTPlotGroup.m b/framework/Source/CPTPlotGroup.m index d80b7ab82..d7d7bc5db 100644 --- a/framework/Source/CPTPlotGroup.m +++ b/framework/Source/CPTPlotGroup.m @@ -55,7 +55,7 @@ -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx **/ -(void)removePlot:(CPTPlot *)plot { - if ( self == [plot superlayer] ) { + if ( self == plot.superlayer ) { [plot removeFromSuperlayer]; } } diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index a38bde557..a1540844b 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -208,7 +208,7 @@ -(void)setLocationDecimal:(NSDecimal)newLocation locationDecimal = newLocation; if ( !self.inValueUpdate ) { - self.locationDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLocation] doubleValue]; + self.locationDouble = [NSDecimalNumber decimalNumberWithDecimal:newLocation].doubleValue; } } } @@ -235,7 +235,7 @@ -(void)setLengthDecimal:(NSDecimal)newLength lengthDecimal = newLength; if ( !self.inValueUpdate ) { - self.lengthDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLength] doubleValue]; + self.lengthDouble = [NSDecimalNumber decimalNumberWithDecimal:newLength].doubleValue; } } } @@ -594,7 +594,7 @@ -(NSString *)description NSDecimal myLength = self.lengthDecimal; return [NSString stringWithFormat:@"<%@ {%@, %@}>", - [super description], + super.description, NSDecimalString(&myLocation, [NSLocale currentLocale]), NSDecimalString(&myLength, [NSLocale currentLocale])]; } diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 2850fa363..5645e6803 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -278,7 +278,7 @@ -(CPTStringArray *)categoriesForCoordinate:(CPTCoordinate)coordinate { CPTMutableCategorySet *categories = [self orderedSetForCoordinate:coordinate]; - return [categories array]; + return categories.array; } /** diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 123894876..c684ba0d6 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -184,7 +184,7 @@ -(void)setAnchorPlotPoint:(CPTNumberArray *)newPlotPoint NSDecimal *decimalPoint = malloc(sizeof(NSDecimal) * self.anchorCount); for ( NSUInteger i = 0; i < self.anchorCount; i++ ) { - decimalPoint[i] = [anchorPlotPoint[i] decimalValue]; + decimalPoint[i] = anchorPlotPoint[i].decimalValue; } self.decimalAnchor = decimalPoint; diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index cdc5612a9..1c05f6710 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -1013,7 +1013,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte CPTNumberArray *yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; CPTNumberArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { - yValue = [yValuesSorted lastObject]; + yValue = yValuesSorted.lastObject; } else { yValue = yValuesSorted[0]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index a6da6cd85..f3e445d13 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -810,7 +810,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context NSNumber *xValue = [xValueData sampleValue:(NSUInteger)firstDrawnPointIndex]; NSDecimal plotPoint[2]; - plotPoint[CPTCoordinateX] = [xValue decimalValue]; + plotPoint[CPTCoordinateX] = xValue.decimalValue; plotPoint[CPTCoordinateY] = theAreaBaseValue; CGPoint baseLinePoint = [self convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; if ( pixelAlign ) { diff --git a/framework/Source/CPTTextLayer.h b/framework/Source/CPTTextLayer.h index 9d9c85956..8c1d8890b 100644 --- a/framework/Source/CPTTextLayer.h +++ b/framework/Source/CPTTextLayer.h @@ -15,8 +15,11 @@ extern const CGFloat kCPTTextLayerMarginWidth; ///< Margin width around the text /// @name Initialization /// @{ -(nonnull instancetype)initWithText:(nullable NSString *)newText; --(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle; +-(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithAttributedText:(nullable NSAttributedString *)newText; + +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} /// @name Layout diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index a85f44cb0..6c01d5e71 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -249,7 +249,7 @@ -(void)setMaximumSize:(CGSize)newSize -(void)setShadow:(CPTShadow *)newShadow { if ( newShadow != self.shadow ) { - [super setShadow:newShadow]; + super.shadow = newShadow; [self sizeToFit]; } } @@ -257,7 +257,7 @@ -(void)setShadow:(CPTShadow *)newShadow -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; [self sizeToFit]; } } @@ -265,7 +265,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; [self sizeToFit]; } } @@ -273,7 +273,7 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; [self sizeToFit]; } } @@ -281,7 +281,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; + super.paddingBottom = newPadding; [self sizeToFit]; } } @@ -409,7 +409,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context -(NSString *)description { - return [NSString stringWithFormat:@"<%@ \"%@\">", [super description], self.text]; + return [NSString stringWithFormat:@"<%@ \"%@\">", super.description, self.text]; } /// @endcond diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index e1e5cb648..1f27e3307 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -190,7 +190,7 @@ -(id)debugQuickLookObject { NSString *lorem = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; - return [[NSAttributedString alloc] initWithString:lorem attributes:[self attributes]]; + return [[NSAttributedString alloc] initWithString:lorem attributes:self.attributes]; } /// @endcond diff --git a/framework/Source/CPTThemeTests.m b/framework/Source/CPTThemeTests.m index 9fe75004f..1750f90c4 100644 --- a/framework/Source/CPTThemeTests.m +++ b/framework/Source/CPTThemeTests.m @@ -15,7 +15,7 @@ -(void)testSetGraphClassUsingCPTXYGraphShouldWork { CPTTheme *theme = [[CPTTheme alloc] init]; - [theme setGraphClass:[CPTXYGraph class]]; + theme.graphClass = [CPTXYGraph class]; XCTAssertEqual([CPTXYGraph class], theme.graphClass, @"graphClass should be CPTXYGraph"); } @@ -23,7 +23,7 @@ -(void)testSetGraphUsingDerivedClassShouldWork { CPTTheme *theme = [[CPTTheme alloc] init]; - [theme setGraphClass:[CPTDerivedXYGraph class]]; + theme.graphClass = [CPTDerivedXYGraph class]; XCTAssertEqual([CPTDerivedXYGraph class], theme.graphClass, @"graphClass should be CPTDerivedXYGraph"); } diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index b4e54f4a7..c79127b4b 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -1211,7 +1211,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; CPTNumberArray *yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { - yValue = [yValuesSorted lastObject]; + yValue = yValuesSorted.lastObject; } else { yValue = yValuesSorted[0]; diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 5b64efeeb..bba994cd1 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -20,7 +20,7 @@ **/ int8_t CPTDecimalCharValue(NSDecimal decimalNumber) { - return (int8_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] charValue]; + return (int8_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].charValue; } /** @@ -30,7 +30,7 @@ int8_t CPTDecimalCharValue(NSDecimal decimalNumber) **/ int16_t CPTDecimalShortValue(NSDecimal decimalNumber) { - return (int16_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] shortValue]; + return (int16_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].shortValue; } /** @@ -40,7 +40,7 @@ int16_t CPTDecimalShortValue(NSDecimal decimalNumber) **/ int32_t CPTDecimalLongValue(NSDecimal decimalNumber) { - return (int32_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] longValue]; + return (int32_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].longValue; } /** @@ -50,7 +50,7 @@ int32_t CPTDecimalLongValue(NSDecimal decimalNumber) **/ int64_t CPTDecimalLongLongValue(NSDecimal decimalNumber) { - return (int64_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] longLongValue]; + return (int64_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].longLongValue; } /** @@ -60,7 +60,7 @@ int64_t CPTDecimalLongLongValue(NSDecimal decimalNumber) **/ int CPTDecimalIntValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] intValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].intValue; } /** @@ -70,7 +70,7 @@ int CPTDecimalIntValue(NSDecimal decimalNumber) **/ NSInteger CPTDecimalIntegerValue(NSDecimal decimalNumber) { - return (NSInteger)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] integerValue]; + return (NSInteger)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].integerValue; } /** @@ -80,7 +80,7 @@ NSInteger CPTDecimalIntegerValue(NSDecimal decimalNumber) **/ uint8_t CPTDecimalUnsignedCharValue(NSDecimal decimalNumber) { - return (uint8_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedCharValue]; + return (uint8_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].unsignedCharValue; } /** @@ -90,7 +90,7 @@ uint8_t CPTDecimalUnsignedCharValue(NSDecimal decimalNumber) **/ uint16_t CPTDecimalUnsignedShortValue(NSDecimal decimalNumber) { - return (uint16_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedShortValue]; + return (uint16_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].unsignedShortValue; } /** @@ -100,7 +100,7 @@ uint16_t CPTDecimalUnsignedShortValue(NSDecimal decimalNumber) **/ uint32_t CPTDecimalUnsignedLongValue(NSDecimal decimalNumber) { - return (uint32_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedLongValue]; + return (uint32_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].unsignedLongValue; } /** @@ -110,7 +110,7 @@ uint32_t CPTDecimalUnsignedLongValue(NSDecimal decimalNumber) **/ uint64_t CPTDecimalUnsignedLongLongValue(NSDecimal decimalNumber) { - return (uint64_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedLongLongValue]; + return (uint64_t)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].unsignedLongLongValue; } /** @@ -120,7 +120,7 @@ uint64_t CPTDecimalUnsignedLongLongValue(NSDecimal decimalNumber) **/ unsigned int CPTDecimalUnsignedIntValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedIntValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedIntValue; } /** @@ -130,7 +130,7 @@ unsigned int CPTDecimalUnsignedIntValue(NSDecimal decimalNumber) **/ NSUInteger CPTDecimalUnsignedIntegerValue(NSDecimal decimalNumber) { - return (NSUInteger)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedIntegerValue]; + return (NSUInteger)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].unsignedIntegerValue; } /** @@ -140,7 +140,7 @@ NSUInteger CPTDecimalUnsignedIntegerValue(NSDecimal decimalNumber) **/ float CPTDecimalFloatValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] floatValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].floatValue; } /** @@ -150,7 +150,7 @@ float CPTDecimalFloatValue(NSDecimal decimalNumber) **/ double CPTDecimalDoubleValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] doubleValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].doubleValue; } /** @@ -161,7 +161,7 @@ float CPTDecimalFloatValue(NSDecimal decimalNumber) CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber) { #if CGFLOAT_IS_DOUBLE - return (CGFloat)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] doubleValue]; + return (CGFloat)[NSDecimalNumber decimalNumberWithDecimal : decimalNumber].doubleValue; #else return (CGFloat)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] floatValue]; @@ -175,7 +175,7 @@ CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber) **/ NSString *CPTDecimalStringValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] stringValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].stringValue; } #pragma mark - @@ -662,7 +662,7 @@ BOOL CPTDecimalEquals(NSDecimal leftOperand, NSDecimal rightOperand) **/ NSDecimal CPTDecimalNaN(void) { - return [[NSDecimalNumber notANumber] decimalValue]; + return [NSDecimalNumber notANumber].decimalValue; } /** diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index 4eb054a8a..c11a9f418 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -88,8 +88,8 @@ -(void)testToDecimalConversion -(void)testConvertNegativeOne { - NSDecimal zero = [[NSDecimalNumber zero] decimalValue]; - NSDecimal one = [[NSDecimalNumber one] decimalValue]; + NSDecimal zero = [NSDecimalNumber zero].decimalValue; + NSDecimal one = [NSDecimalNumber one].decimalValue; NSDecimal negativeOne; NSDecimalSubtract(&negativeOne, &zero, &one, NSRoundPlain); @@ -127,7 +127,7 @@ -(void)testConvertNegativeOne -(void)testCachedZero { - NSDecimal zero = [[NSDecimalNumber zero] decimalValue]; + NSDecimal zero = [NSDecimalNumber zero].decimalValue; NSDecimal testValue; NSString *errMessage; @@ -184,7 +184,7 @@ -(void)testCachedZero -(void)testCachedOne { - NSDecimal one = [[NSDecimalNumber one] decimalValue]; + NSDecimal one = [NSDecimalNumber one].decimalValue; NSDecimal testValue; NSString *errMessage; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 67034fd3e..5646b938c 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -583,7 +583,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context NSUInteger bandCount = bandArray.count; if ( bandCount > 0 ) { - CPTNumberArray *locations = [self.majorTickLocations allObjects]; + CPTNumberArray *locations = self.majorTickLocations.allObjects; if ( locations.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -644,7 +644,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context } for ( NSDecimalNumber *location in locations ) { - NSDecimal currentLocation = [location decimalValue]; + NSDecimal currentLocation = location.decimalValue; if ( !CPTDecimalEquals(CPTDecimalSubtract(currentLocation, lastLocation), zero) ) { CPTFill *bandFill = bandArray[bandIndex++]; bandIndex %= bandCount; @@ -774,7 +774,7 @@ -(NSString *)description CGPoint endViewPoint = [self viewPointForCoordinateValue:range.end]; return [NSString stringWithFormat:@"<%@ with range: %@ viewCoordinates: %@ to %@>", - [super description], + super.description, range, CPTStringFromPoint(startViewPoint), CPTStringFromPoint(endViewPoint)]; @@ -874,7 +874,7 @@ -(void)setOrthogonalPosition:(NSNumber *)newPosition -(void)setCoordinate:(CPTCoordinate)newCoordinate { if ( self.coordinate != newCoordinate ) { - [super setCoordinate:newCoordinate]; + super.coordinate = newCoordinate; switch ( newCoordinate ) { case CPTCoordinateX: switch ( self.labelAlignment ) { diff --git a/framework/Source/CPTXYAxisSet.m b/framework/Source/CPTXYAxisSet.m index de5a91da3..a3f5af7ba 100644 --- a/framework/Source/CPTXYAxisSet.m +++ b/framework/Source/CPTXYAxisSet.m @@ -118,7 +118,7 @@ -(void)layoutSublayers sublayerPosition = CGPointMake(-sublayerPosition.x, -sublayerPosition.y); CGRect subLayerFrame = CGRectMake(sublayerPosition.x, sublayerPosition.y, sublayerBounds.size.width, sublayerBounds.size.height); - CPTSublayerSet *excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + CPTSublayerSet *excludedSublayers = self.sublayersExcludedFromAutomaticLayout; Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in self.sublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { diff --git a/framework/Source/CPTXYGraph.h b/framework/Source/CPTXYGraph.h index 90bca7639..4ee0b0d1b 100644 --- a/framework/Source/CPTXYGraph.h +++ b/framework/Source/CPTXYGraph.h @@ -5,7 +5,10 @@ /// @name Initialization /// @{ --(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType; +-(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType NS_DESIGNATED_INITIALIZER; + +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 69932d6e6..810ef4bf6 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -968,18 +968,18 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray *)plotPoint switch ( self.xScaleType ) { case CPTScaleTypeLinear: case CPTScaleTypeCategory: - viewPoint.x = [self viewCoordinateForViewLength:plotArea.widthDecimal linearPlotRange:self.xRange plotCoordinateValue:[plotPoint[CPTCoordinateX] decimalValue]]; + viewPoint.x = [self viewCoordinateForViewLength:plotArea.widthDecimal linearPlotRange:self.xRange plotCoordinateValue:plotPoint[CPTCoordinateX].decimalValue]; break; case CPTScaleTypeLog: { - viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX].doubleValue]; } break; case CPTScaleTypeLogModulus: { - viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX].doubleValue]; } break; @@ -990,18 +990,18 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray *)plotPoint switch ( self.yScaleType ) { case CPTScaleTypeLinear: case CPTScaleTypeCategory: - viewPoint.y = [self viewCoordinateForViewLength:plotArea.heightDecimal linearPlotRange:self.yRange plotCoordinateValue:[plotPoint[CPTCoordinateY] decimalValue]]; + viewPoint.y = [self viewCoordinateForViewLength:plotArea.heightDecimal linearPlotRange:self.yRange plotCoordinateValue:plotPoint[CPTCoordinateY].decimalValue]; break; case CPTScaleTypeLog: { - viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY].doubleValue]; } break; case CPTScaleTypeLogModulus: { - viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY].doubleValue]; } break; @@ -1324,7 +1324,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event plotAreaViewPoint = [theHostingView.layer convertPoint:interactionPoint toLayer:thePlotArea]; } #else - CGPoint interactionPoint = NSPointToCGPoint([theHostingView convertPoint:[event locationInWindow] fromView:nil]); + CGPoint interactionPoint = NSPointToCGPoint([theHostingView convertPoint:event.locationInWindow fromView:nil]); plotAreaViewPoint = [theHostingView.layer convertPoint:interactionPoint toLayer:thePlotArea]; #endif } diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index bee576cd8..98bfe9411 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -138,7 +138,7 @@ -(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key for ( NSUInteger i = 0; i < dataCount; i++ ) { NSDictionary *elementData = pathData[i]; - CGPathElementType type = (CGPathElementType)[elementData[@"type"] intValue]; + CGPathElementType type = (CGPathElementType)elementData[@"type"].intValue; newKey = [[NSString alloc] initWithFormat:@"%@[%lu].type", key, (unsigned long)i]; [self encodeInt:type forKey:newKey]; @@ -504,7 +504,7 @@ -(NSDecimal)decodeDecimalForKey:(NSString *)key NSNumber *number = [self decodeObjectForKey:key]; if ( [number respondsToSelector:@selector(decimalValue)] ) { - result = [number decimalValue]; + result = number.decimalValue; } else { result = CPTDecimalNaN(); diff --git a/framework/Source/NSNumberExtensions.m b/framework/Source/NSNumberExtensions.m index 3f795af9a..8e9530668 100644 --- a/framework/Source/NSNumberExtensions.m +++ b/framework/Source/NSNumberExtensions.m @@ -17,7 +17,7 @@ +(instancetype)numberWithCGFloat:(CGFloat)number -(CGFloat)cgFloatValue { #if CGFLOAT_IS_DOUBLE - return [self doubleValue]; + return self.doubleValue; #else return [self floatValue]; @@ -46,7 +46,7 @@ -(NSDecimalNumber *)decimalNumber if ( [self isMemberOfClass:[NSDecimalNumber class]] ) { return (NSDecimalNumber *)self; } - return [NSDecimalNumber decimalNumberWithDecimal:[self decimalValue]]; + return [NSDecimalNumber decimalNumberWithDecimal:self.decimalValue]; } @end diff --git a/framework/Source/_CPTAnimationCGFloatPeriod.m b/framework/Source/_CPTAnimationCGFloatPeriod.m index 9f31b267e..9b493a683 100644 --- a/framework/Source/_CPTAnimationCGFloatPeriod.m +++ b/framework/Source/_CPTAnimationCGFloatPeriod.m @@ -18,8 +18,8 @@ CGFloat CPTCurrentFloatValue(id boundObject, SEL boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGPointPeriod.m b/framework/Source/_CPTAnimationCGPointPeriod.m index b6acc22d1..2acb3ebb6 100644 --- a/framework/Source/_CPTAnimationCGPointPeriod.m +++ b/framework/Source/_CPTAnimationCGPointPeriod.m @@ -16,8 +16,8 @@ CGPoint CPTCurrentPointValue(id boundObject, SEL boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGRectPeriod.m b/framework/Source/_CPTAnimationCGRectPeriod.m index 06a861db2..6949d2f76 100644 --- a/framework/Source/_CPTAnimationCGRectPeriod.m +++ b/framework/Source/_CPTAnimationCGRectPeriod.m @@ -16,8 +16,8 @@ CGRect CPTCurrentRectValue(id boundObject, SEL boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGSizePeriod.m b/framework/Source/_CPTAnimationCGSizePeriod.m index 02784bbca..8ffc26a09 100644 --- a/framework/Source/_CPTAnimationCGSizePeriod.m +++ b/framework/Source/_CPTAnimationCGSizePeriod.m @@ -16,8 +16,8 @@ CGSize CPTCurrentSizeValue(id boundObject, SEL boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationNSDecimalPeriod.m b/framework/Source/_CPTAnimationNSDecimalPeriod.m index b6ec08820..85cbd0d6e 100644 --- a/framework/Source/_CPTAnimationNSDecimalPeriod.m +++ b/framework/Source/_CPTAnimationNSDecimalPeriod.m @@ -18,8 +18,8 @@ NSDecimal CPTCurrentDecimalValue(id boundObject, SEL boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; @@ -43,8 +43,8 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett } NSDecimal current = CPTCurrentDecimalValue(boundObject, boundGetter); - NSDecimal start = [(NSDecimalNumber *)self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *)self.endValue decimalValue]; + NSDecimal start = ( (NSDecimalNumber *)self.startValue ).decimalValue; + NSDecimal end = ( (NSDecimalNumber *)self.endValue ).decimalValue; return ( CPTDecimalGreaterThanOrEqualTo(current, start) && CPTDecimalLessThanOrEqualTo(current, end) ) || ( CPTDecimalGreaterThanOrEqualTo(current, end) && CPTDecimalLessThanOrEqualTo(current, start) ); @@ -52,8 +52,8 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett -(NSValue *)tweenedValueForProgress:(CGFloat)progress { - NSDecimal start = [(NSDecimalNumber *)self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *)self.endValue decimalValue]; + NSDecimal start = ( (NSDecimalNumber *)self.startValue ).decimalValue; + NSDecimal end = ( (NSDecimalNumber *)self.endValue ).decimalValue; NSDecimal length = CPTDecimalSubtract(end, start); NSDecimal tweenedValue = CPTDecimalAdd( start, CPTDecimalMultiply(CPTDecimalFromCGFloat(progress), length) ); diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 516410849..1cc350f12 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -135,7 +135,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout CPTBorderedLayer *excludedLayer = self.maskedLayer; if ( excludedLayer ) { - CPTMutableSublayerSet *excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet *excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } @@ -143,7 +143,7 @@ -(CPTSublayerSet *)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } @@ -165,7 +165,7 @@ -(void)setMaskedLayer:(CPTBorderedLayer *)newLayer -(void)setBounds:(CGRect)newBounds { if ( !CGRectEqualToRect(newBounds, self.bounds) ) { - [super setBounds:newBounds]; + super.bounds = newBounds; [self setNeedsLayout]; } } diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index df3c81bc6..dc317173e 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -141,7 +141,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event BOOL handled = NO; // Ignore pinch or other multitouch gestures - if ( [[event allTouches] count] == 1 ) { + if ( [event allTouches].count == 1 ) { CPTGraph *theHostedGraph = self.hostedGraph; theHostedGraph.frame = self.bounds; @@ -398,7 +398,7 @@ -(void)setCollapsesLayers:(BOOL)collapse -(void)setFrame:(CGRect)newFrame { - [super setFrame:newFrame]; + super.frame = newFrame; CPTGraph *theHostedGraph = self.hostedGraph; [theHostedGraph setNeedsLayout]; @@ -413,7 +413,7 @@ -(void)setFrame:(CGRect)newFrame -(void)setBounds:(CGRect)newBounds { - [super setBounds:newBounds]; + super.bounds = newBounds; CPTGraph *theHostedGraph = self.hostedGraph; [theHostedGraph setNeedsLayout]; From e514dc0ba9ea4b8273674dc8194306fb52b0b802 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 17:40:50 -0500 Subject: [PATCH 130/429] Updated all example apps to modern Objective-C syntax. --- QCPlugin/CPTBarPlotPlugin.m | 8 +-- QCPlugin/CPTPieChartPlugin.m | 2 +- QCPlugin/CPTScatterPlotPlugin.m | 2 +- examples/AAPLot/APYahooDataPuller.m | 48 +++++++------- examples/AAPLot/Classes/MainViewController.m | 34 +++++----- examples/AAPLot/Classes/RootViewController.m | 4 +- examples/AAPLot/NSDateFormatterExtensions.m | 2 +- .../Classes/CPTTestApp_iPadViewController.m | 6 +- .../Source/CPTPlotSymbolTestController.m | 4 +- examples/CPTTestApp/Source/Controller.m | 22 +++---- examples/CPTTestApp/Source/RotationView.m | 8 +-- .../Source/SelectionDemoController.m | 2 +- .../CorePlotGallery/src/ios/AppDelegate.m | 4 +- .../src/ios/RootViewController.m | 8 +-- .../src/mac/PlotGalleryController.m | 36 +++++------ examples/CorePlotGallery/src/mac/PlotView.h | 2 +- .../CorePlotGallery/src/plots/CompositePlot.m | 12 ++-- .../CorePlotGallery/src/plots/ControlChart.m | 4 +- .../src/plots/CurvedScatterPlot.m | 20 +++--- examples/CorePlotGallery/src/plots/DatePlot.m | 12 ++-- .../CorePlotGallery/src/plots/DonutChart.m | 2 +- .../CorePlotGallery/src/plots/FunctionPlot.m | 4 +- .../src/plots/GradientScatterPlot.m | 8 +-- .../CorePlotGallery/src/plots/RealTimePlot.m | 2 +- .../src/plots/SimplePieChart.m | 4 +- .../src/plots/SimpleScatterPlot.m | 6 +- .../src/plots/VerticalBarChart.m | 6 +- .../src/shared/PiNumberFormatter.m | 2 +- .../CorePlotGallery/src/shared/PlotGallery.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +- .../src/tvOS/RootViewControllerTV.m | 6 +- examples/DropPlot/CPTPlotDocument.m | 22 +++---- examples/DropPlot/NSString+ParseCSV.m | 2 +- .../StockPlot/Classes/APYahooDataPuller.m | 44 ++++++------- .../Classes/APYahooDataPullerGraph.m | 8 +-- .../Classes/NSDictionary+APFinancialData.m | 2 +- .../StockPlot/Classes/RootViewController.m | 62 +++++++++---------- .../StockPlot/Classes/StockPlotAppDelegate.m | 2 +- 38 files changed, 214 insertions(+), 214 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 244fc0763..57a0ec2e4 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -153,7 +153,7 @@ -(void)removePlots:(NSUInteger)count [self removeInputPortForKey:[NSString stringWithFormat:@"plotFillColor%lu", (unsigned long)(i - 1)]]; [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataLineWidth%lu", (unsigned long)(i - 1)]]; - [theGraph removePlot:[[theGraph allPlots] lastObject]]; + [theGraph removePlot:[theGraph allPlots].lastObject]; } } @@ -162,7 +162,7 @@ -(BOOL)configurePlots CPTGraph *theGraph = self.graph; // The pixel width of a single plot unit (1..2) along the x axis of the plot - double count = (double)[[theGraph allPlots] count]; + double count = (double)[theGraph allPlots].count; double unitWidth = theGraph.plotAreaFrame.bounds.size.width / (self.inputXMax - self.inputXMin); double barWidth = self.inputBarWidth * unitWidth / count; @@ -207,13 +207,13 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd return nil; } - NSUInteger keyCount = [[dict allKeys] count]; + NSUInteger keyCount = dict.allKeys.count; CPTMutableNumberArray *array = [NSMutableArray array]; if ( fieldEnum == CPTBarPlotFieldBarLocation ) { // Calculate horizontal position of bar - nth bar index + barWidth*plotIndex + 0.5 float xpos; - float plotCount = [[self.graph allPlots] count]; + float plotCount = [self.graph allPlots].count; for ( NSUInteger i = 0; i < keyCount; i++ ) { xpos = (float)i + (float)plotIndex / (plotCount); diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index e49268ce4..778014832 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -241,7 +241,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI -(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index { - CGColorRef plotFillColor = [[CPTPieChart defaultPieSliceColorForIndex:index] cgColor]; + CGColorRef plotFillColor = [CPTPieChart defaultPieSliceColorForIndex:index].cgColor; CGColorRef inputFillColor = (CGColorRef)[self areaFillColor : 0]; const CGFloat *plotColorComponents = CGColorGetComponents(plotFillColor); diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index 558dca9e2..5a78f6c8b 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -123,7 +123,7 @@ -(void)removePlots:(NSUInteger)count [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataSymbols%lu", (unsigned long)(i - 1)]]; [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataSymbolColor%lu", (unsigned long)(i - 1)]]; - [theGraph removePlot:[[theGraph allPlots] lastObject]]; + [theGraph removePlot:[theGraph allPlots].lastObject]; } } diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 15dd6754b..df9244642 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -68,14 +68,14 @@ -(CPTDictionary *)plistRep { CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; - rep[@"symbol"] = [self symbol]; - rep[@"startDate"] = [self startDate]; - rep[@"endDate"] = [self endDate]; - rep[@"overallHigh"] = [self overallHigh]; - rep[@"overallLow"] = [self overallLow]; - rep[@"overallVolumeHigh"] = [self overallVolumeHigh]; - rep[@"overallVolumeLow"] = [self overallVolumeLow]; - rep[@"financialData"] = [self financialData]; + rep[@"symbol"] = self.symbol; + rep[@"startDate"] = self.startDate; + rep[@"endDate"] = self.endDate; + rep[@"overallHigh"] = self.overallHigh; + rep[@"overallLow"] = self.overallLow; + rep[@"overallVolumeHigh"] = self.overallVolumeHigh; + rep[@"overallVolumeLow"] = self.overallVolumeLow; + rep[@"financialData"] = self.financialData; return [NSDictionary dictionaryWithDictionary:rep]; } @@ -122,7 +122,7 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { //if there isn't one in the user's documents directory, see if we ship with this data - docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; + docPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } @@ -182,15 +182,15 @@ -(NSString *)URL NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", self.targetSymbol]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + url = [url stringByAppendingFormat:@"a=%ld&", (long)compsStart.month - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)compsStart.day]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)compsStart.year]; - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + url = [url stringByAppendingFormat:@"d=%ld&", (long)compsEnd.month - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)compsEnd.day]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)compsEnd.year]; url = [url stringByAppendingString:@"g=d&"]; url = [url stringByAppendingString:@"ignore=.csv"]; @@ -257,7 +257,7 @@ -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRespons // has enough information to create the NSURLResponse // it can be called multiple times, for example in the case of a // redirect, so each time we reset the data. - [self.receivedData setLength:0]; + self.receivedData.length = 0; } -(void)cancelDownload @@ -276,7 +276,7 @@ -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro self.loadingData = NO; self.receivedData = nil; self.connection = nil; - NSLog(@"err = %@", [error localizedDescription]); + NSLog(@"err = %@", error.localizedDescription); //TODO:report err } @@ -297,19 +297,19 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection BOOL sameSymbol = NO; NSString *dictSymbol = dictionaryForSymbol[@"symbol"]; if ( dictSymbol ) { - sameSymbol = [[self symbol] isEqualToString:dictSymbol]; + sameSymbol = [self.symbol isEqualToString:dictSymbol]; } BOOL sameStart = NO; NSDate *dictStart = dictionaryForSymbol[@"startDate"]; if ( dictStart ) { - sameStart = ([[self startDate] compare:dictStart] != NSOrderedSame); + sameStart = ([self.startDate compare:dictStart] != NSOrderedSame); } BOOL sameEnd = NO; NSDate *dictEnd = dictionaryForSymbol[@"endDate"]; if ( dictEnd ) { - sameEnd = ([[self startDate] compare:dictEnd] != NSOrderedSame); + sameEnd = ([self.startDate compare:dictEnd] != NSOrderedSame); } if ( !sameSymbol || !sameStart || !sameEnd ) { @@ -324,7 +324,7 @@ -(void)parseCSVAndPopulate { CPTStringArray *csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:[csvLines count]]; + NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:csvLines.count]; CPTDictionary *currentFinancial = nil; NSString *line = nil; @@ -333,7 +333,7 @@ -(void)parseCSVAndPopulate self.overallVolumeHigh = [NSDecimalNumber notANumber]; self.overallVolumeLow = [NSDecimalNumber notANumber]; - for ( NSUInteger i = 1; i < [csvLines count] - 1; i++ ) { + for ( NSUInteger i = 1; i < csvLines.count - 1; i++ ) { line = csvLines[i]; currentFinancial = [NSDictionary dictionaryWithCSVLine:line]; [newFinancials addObject:currentFinancial]; @@ -377,7 +377,7 @@ -(void)parseCSVAndPopulate self.endDate = self.targetEndDate; self.symbol = self.targetSymbol; - [self setFinancialData:[NSArray arrayWithArray:newFinancials]]; + self.financialData = [NSArray arrayWithArray:newFinancials]; [self notifyPulledData]; } diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index aa7b7cddb..ff90fd7ad 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -19,7 +19,7 @@ @implementation MainViewController -(void)setView:(UIView *)aView { - [super setView:aView]; + super.view = aView; if ( nil == aView ) { self.graph = nil; self.graphHost = nil; @@ -119,8 +119,8 @@ -(void)viewDidLoad NSDate *start = [NSDate dateWithTimeIntervalSinceNow:-60.0 * 60.0 * 24.0 * 7.0 * 12.0]; // 12 weeks ago NSDate *end = [NSDate date]; APYahooDataPuller *dp = [[APYahooDataPuller alloc] initWithTargetSymbol:@"AAPL" targetStartDate:start targetEndDate:end]; - [self setDatapuller:dp]; - [dp setDelegate:self]; + self.datapuller = dp; + dp.delegate = self; [super viewDidLoad]; } @@ -176,7 +176,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTScatterPlotFieldY: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -201,7 +201,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTScatterPlotFieldY: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -228,7 +228,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTBarPlotFieldBarTip: value = fData[@"volume"]; NSAssert(value, @"Volume value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -253,7 +253,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTBarPlotFieldBarTip: value = fData[@"volume"]; NSAssert(value, @"Volume value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -280,25 +280,25 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTTradingRangePlotFieldOpen: value = fData[@"open"]; NSAssert(value, @"Open value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldHigh: value = fData[@"high"]; NSAssert(value, @"High value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldLow: value = fData[@"low"]; NSAssert(value, @"Low value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldClose: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -323,25 +323,25 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa case CPTTradingRangePlotFieldOpen: value = fData[@"open"]; NSAssert(value, @"Open value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldHigh: value = fData[@"high"]; NSAssert(value, @"High value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldLow: value = fData[@"low"]; NSAssert(value, @"Low value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldClose: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -651,8 +651,8 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp if ( volumeLowDisplayLocation && volumeLengthDisplayLocation ) { animationOperation = [CPTAnimation animate:volumePlotSpace property:@"yRange" - fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] - lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] + fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:volumeLowDisplayLocation.decimalValue + lengthDecimal:CPTDecimalMultiply( volumeLengthDisplayLocation.decimalValue, CPTDecimalFromInteger(10) )] toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation] duration:2.5]; diff --git a/examples/AAPLot/Classes/RootViewController.m b/examples/AAPLot/Classes/RootViewController.m index 120ecc7a2..4a6643bb5 100644 --- a/examples/AAPLot/Classes/RootViewController.m +++ b/examples/AAPLot/Classes/RootViewController.m @@ -63,10 +63,10 @@ -(IBAction)toggleView [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1]; - UIViewAnimationTransition transition = ([mainView superview] ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft); + UIViewAnimationTransition transition = (mainView.superview ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft); [UIView setAnimationTransition:transition forView:self.view cache:YES]; - if ( [mainView superview] != nil ) { + if ( mainView.superview != nil ) { [self.flipsideViewController viewWillAppear:YES]; [self.mainViewController viewWillDisappear:YES]; [mainView removeFromSuperview]; diff --git a/examples/AAPLot/NSDateFormatterExtensions.m b/examples/AAPLot/NSDateFormatterExtensions.m index 9bb5989a1..c75fe507a 100644 --- a/examples/AAPLot/NSDateFormatterExtensions.m +++ b/examples/AAPLot/NSDateFormatterExtensions.m @@ -9,7 +9,7 @@ +(NSDateFormatter *)csvDateFormatter dispatch_once(&onceToken, ^{ df = [[NSDateFormatter alloc] init]; - [df setDateFormat:@"yyyy-MM-dd"]; + df.dateFormat = @"yyyy-MM-dd"; }); return df; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index bb4a9fb26..625649d2c 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -233,7 +233,7 @@ -(void)constructBarChart CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:xAxisLabels.count]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; @@ -346,7 +346,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSNumber *num = nil; if ( [plot isKindOfClass:[CPTPieChart class]] ) { - if ( index >= [self.dataForChart count] ) { + if ( index >= self.dataForChart.count ) { return nil; } @@ -388,7 +388,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI // Green plot gets shifted above the blue if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } } diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index ec5e347ac..6b5ac8416 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -82,7 +82,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI break; case CPTScatterPlotFieldY: - num = @([(NSString *)plot.identifier integerValue]); + num = @( ( (NSString *)plot.identifier ).integerValue ); break; default: @@ -103,7 +103,7 @@ -(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUIn symbolShadow.shadowColor = [CPTColor blackColor]; CPTPlotSymbol *symbol = [[CPTPlotSymbol alloc] init]; - symbol.symbolType = (CPTPlotSymbolType)[(NSString *)plot.identifier intValue]; + symbol.symbolType = (CPTPlotSymbolType)( (NSString *)plot.identifier ).intValue; symbol.fill = [CPTFill fillWithGradient:gradientFill]; symbol.shadow = symbolShadow; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 0beafe343..dbbb16ad6 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -423,7 +423,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); num = (self.arrangedObjects)[index][key]; if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } return num; @@ -474,7 +474,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -517,7 +517,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -561,12 +561,12 @@ -(IBAction)exportToPDF:(id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; - [pdfSavingDialog setAllowedFileTypes:@[@"pdf"]]; + pdfSavingDialog.allowedFileTypes = @[@"pdf"]; if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - NSURL *url = [pdfSavingDialog URL]; + NSURL *url = pdfSavingDialog.URL; if ( url ) { [dataForPDF writeToURL:url atomically:NO]; } @@ -577,15 +577,15 @@ -(IBAction)exportToPNG:(id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; - [pngSavingDialog setAllowedFileTypes:@[@"png"]]; + pngSavingDialog.allowedFileTypes = @[@"png"]; if ( [pngSavingDialog runModal] == NSOKButton ) { NSImage *image = [self.graph imageOfLayer]; - NSData *tiffData = [image TIFFRepresentation]; + NSData *tiffData = image.TIFFRepresentation; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:@{}]; - NSURL *url = [pngSavingDialog URL]; + NSURL *url = pngSavingDialog.URL; if ( url ) { [pngData writeToURL:url atomically:NO]; } @@ -638,8 +638,8 @@ -(IBAction)explodeLayers:(id)sender RotationView *overlayView = [[RotationView alloc] initWithFrame:self.hostView.frame]; overlayView.rotationDelegate = self; overlayView.rotationTransform = perspectiveRotation; - [overlayView setAutoresizingMask:[self.hostView autoresizingMask]]; - [[self.hostView superview] addSubview:overlayView positioned:NSWindowAbove relativeTo:self.hostView]; + overlayView.autoresizingMask = self.hostView.autoresizingMask; + [self.hostView.superview addSubview:overlayView positioned:NSWindowAbove relativeTo:self.hostView]; self.overlayRotationView = overlayView; [CATransaction begin]; diff --git a/examples/CPTTestApp/Source/RotationView.m b/examples/CPTTestApp/Source/RotationView.m index 429f143a6..f7b4c314b 100644 --- a/examples/CPTTestApp/Source/RotationView.m +++ b/examples/CPTTestApp/Source/RotationView.m @@ -37,12 +37,12 @@ -(BOOL)acceptsFirstMouse:(NSEvent *)theEvent -(void)mouseDown:(NSEvent *)theEvent { - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } -(void)mouseDragged:(NSEvent *)theEvent { - NSPoint currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + NSPoint currentLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; CGFloat displacementInX = kMouseMovementScaleFactorForRotation * (currentLocation.x - self.previousLocation.x); CGFloat displacementInY = kMouseMovementScaleFactorForRotation * (self.previousLocation.y - currentLocation.y); @@ -59,12 +59,12 @@ -(void)mouseDragged:(NSEvent *)theEvent [theDelegate rotateObjectUsingTransform:newTransform]; self.rotationTransform = newTransform; - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } -(void)mouseUp:(NSEvent *)theEvent { - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } #pragma mark - diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index d6e61cd49..5b1176377 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -187,7 +187,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot NSUInteger count = 0; if ( [(NSString *)plot.identifier isEqualToString : MAIN_PLOT] ) { - count = [self.dataForPlot count]; + count = self.dataForPlot.count; } else if ( [(NSString *)plot.identifier isEqualToString : SELECTION_PLOT] ) { if ( self.selectedIndex < NSUIntegerMax ) { diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index db84990ae..2eeafaf86 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -25,7 +25,7 @@ -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(C UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; splitViewController.delegate = self; - UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; + UINavigationController *navigationController = splitViewController.viewControllers.lastObject; navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; return YES; @@ -35,7 +35,7 @@ -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(C -(BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController { - if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil) ) { + if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [( (UINavigationController *)secondaryViewController ).topViewController isKindOfClass :[DetailViewController class]] && ( ( (DetailViewController *)( (UINavigationController *)secondaryViewController ).topViewController ).detailItem == nil ) ) { // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. return YES; } diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index f1857bffb..6cfd78ec5 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -50,14 +50,14 @@ -(void)dealloc -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { - DetailViewController *controller = (DetailViewController *)[segue.destinationViewController topViewController]; + DetailViewController *controller = (DetailViewController *)(segue.destinationViewController).topViewController; controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; controller.navigationItem.leftItemsSupplementBackButton = YES; controller.currentThemeName = self.currentThemeName; - NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; + NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow; PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectInSection:[indexPath indexAtPosition:0] atIndex:[indexPath indexAtPosition:1]]; @@ -81,7 +81,7 @@ -(void)themeChanged:(NSNotification *)notification -(NSInteger)numberOfSectionsInTableView:(UITableView *)tv { - return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfSections]; + return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } -(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section @@ -110,7 +110,7 @@ -(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPa -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [[PlotGallery sharedPlotGallery] sectionTitles][(NSUInteger)section]; + return [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)section]; } @end diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 0b2c581d3..a7b0ccb32 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -53,7 +53,7 @@ -(void)awakeFromNib { [[PlotGallery sharedPlotGallery] sortByTitle]; - [self.splitView setDelegate:self]; + self.splitView.delegate = self; [self.imageBrowser setDelegate:self]; [self.imageBrowser setDataSource:self]; @@ -61,7 +61,7 @@ -(void)awakeFromNib [self.imageBrowser reloadData]; - [self.hostingView setDelegate:self]; + self.hostingView.delegate = self; [self setupThemes]; @@ -184,7 +184,7 @@ -(void)exportTVImageWithSize:(CGSize)size toURL:(NSURL *)url showPlots:(BOOL)sho bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect( context, CGRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); @@ -195,9 +195,9 @@ -(void)exportTVImageWithSize:(CGSize)size toURL:(NSURL *)url showPlots:(BOOL)sho NSImage *image = [[NSImage alloc] initWithSize:NSSizeFromCGSize(boundsSize)]; [image addRepresentation:layerImage]; - NSData *tiffData = [image TIFFRepresentation]; + NSData *tiffData = image.TIFFRepresentation; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:@{}]; [pngData writeToURL:url atomically:NO]; } @@ -212,7 +212,7 @@ -(IBAction)exportTVImagesToPNG:(id)sender pngSavingDialog.allowsMultipleSelection = NO; if ( [pngSavingDialog runModal] == NSOKButton ) { - NSURL *url = [pngSavingDialog URL]; + NSURL *url = pngSavingDialog.URL; if ( url ) { // top image CGSize topShelfSize = CGSizeMake(1920.0, 720.0); @@ -260,7 +260,7 @@ -(void)setPlotItem:(PlotItem *)item -(NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView *)browser { - return [[PlotGallery sharedPlotGallery] count]; + return [PlotGallery sharedPlotGallery].count; } -(id)imageBrowser:(IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index @@ -270,12 +270,12 @@ -(id)imageBrowser:(IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index -(NSUInteger)numberOfGroupsInImageBrowser:(IKImageBrowserView *)aBrowser { - return [[PlotGallery sharedPlotGallery] numberOfSections]; + return [PlotGallery sharedPlotGallery].numberOfSections; } -(CPTDictionary *)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index { - NSString *groupTitle = [[PlotGallery sharedPlotGallery] sectionTitles][index]; + NSString *groupTitle = [PlotGallery sharedPlotGallery].sectionTitles[index]; NSUInteger offset = 0; @@ -297,7 +297,7 @@ -(CPTDictionary *)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUI -(void)imageBrowserSelectionDidChange:(IKImageBrowserView *)browser { - NSUInteger index = [[browser selectionIndexes] firstIndex]; + NSUInteger index = [browser selectionIndexes].firstIndex; if ( index != NSNotFound ) { PlotItem *item = [[PlotGallery sharedPlotGallery] objectInSection:0 atIndex:index]; @@ -321,13 +321,13 @@ -(CGFloat)splitView:(NSSplitView *)sv constrainMaxCoordinate:(CGFloat)coord ofSu -(void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize { // Lock the LHS width - NSRect frame = [sender frame]; - NSView *lhs = [sender subviews][0]; - NSRect lhsRect = [lhs frame]; - NSView *rhs = [sender subviews][1]; - NSRect rhsRect = [rhs frame]; + NSRect frame = sender.frame; + NSView *lhs = sender.subviews[0]; + NSRect lhsRect = lhs.frame; + NSView *rhs = sender.subviews[1]; + NSRect rhsRect = rhs.frame; - CGFloat dividerThickness = [sender dividerThickness]; + CGFloat dividerThickness = sender.dividerThickness; lhsRect.size.height = frame.size.height; @@ -335,8 +335,8 @@ -(void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize rhsRect.size.height = frame.size.height; rhsRect.origin.x = lhsRect.size.width + dividerThickness; - [lhs setFrame:lhsRect]; - [rhs setFrame:rhsRect]; + lhs.frame = lhsRect; + rhs.frame = rhsRect; } @end diff --git a/examples/CorePlotGallery/src/mac/PlotView.h b/examples/CorePlotGallery/src/mac/PlotView.h index b2631d2dd..dceaee3f8 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.h +++ b/examples/CorePlotGallery/src/mac/PlotView.h @@ -11,7 +11,7 @@ @end -@interface PlotView : NSView +@interface PlotView : NSView @property (nonatomic, weak) id delegate; @end diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 9a6b8dcc2..0c92584eb 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -168,7 +168,7 @@ -(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)t constant:0.0]]; #else - NSRect viewRect = [hostingView bounds]; + NSRect viewRect = hostingView.bounds; scatterView.frame = NSMakeRect( 0.0, 0.0, @@ -187,7 +187,7 @@ -(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)t for ( NSView *view in @[scatterView, barView, pieView] ) { [view setAutoresizesSubviews:YES]; - [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; [hostingView addSubview:view]; } @@ -361,7 +361,7 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( CPTNumberArray *customTickLocations = @[@1, @5, @10, @15]; CPTStringArray *xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTMutableAxisLabelSet *customLabels = [NSMutableSet setWithCapacity:xAxisLabels.count]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; @@ -465,7 +465,7 @@ -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot { if ( [plot isKindOfClass:[CPTPieChart class]] ) { - return [self.dataForChart count]; + return self.dataForChart.count; } else if ( [plot isKindOfClass:[CPTBarPlot class]] ) { return 16; @@ -480,7 +480,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSNumber *num = nil; if ( [plot isKindOfClass:[CPTPieChart class]] ) { - if ( index >= [self.dataForChart count] ) { + if ( index >= self.dataForChart.count ) { return nil; } @@ -512,7 +512,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI // Green plot gets shifted above the blue if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } } diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index c932135a2..af01496c6 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -55,7 +55,7 @@ -(void)generateData sum = 0.0; for ( NSNumber *value in contentArray ) { - double error = [value doubleValue] - self.meanValue; + double error = value.doubleValue - self.meanValue; sum += error * error; } double stdDev = sqrt( ( 1.0 / (numberOfPoints - 1) ) * sum ); @@ -255,7 +255,7 @@ -(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:( case CPTScatterPlotFieldY: if ( plot.identifier == kDataLine ) { - number = [self.plotData[index] doubleValue]; + number = self.plotData[index].doubleValue; } else if ( plot.identifier == kCenterLine ) { number = self.meanValue; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index f37e94c7a..9e9cc99c6 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -83,13 +83,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = [point1[@"x"] doubleValue]; - double x2 = [point2[@"x"] doubleValue]; + double x1 = point1[@"x"].doubleValue; + double x2 = point2[@"x"].doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [point1[@"y"] doubleValue]; - double y2 = [point2[@"y"] doubleValue]; + double y1 = point1[@"y"].doubleValue; + double y2 = point2[@"y"].doubleValue; double dy = y2 - y1; [contentArray addObject: @@ -110,13 +110,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = [point1[@"x"] doubleValue]; - double x2 = [point2[@"x"] doubleValue]; + double x1 = point1[@"x"].doubleValue; + double x2 = point2[@"x"].doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [point1[@"y"] doubleValue]; - double y2 = [point2[@"y"] doubleValue]; + double y1 = point1[@"y"].doubleValue; + double y2 = point2[@"y"].doubleValue; double dy = y2 - y1; [contentArray addObject: @@ -391,7 +391,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -438,7 +438,7 @@ -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; if ( annotation ) { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; [graph.plotAreaFrame.plotArea removeAnnotation:annotation]; self.symbolTextAnnotation = nil; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index 46b22165a..9a21c2e77 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -60,12 +60,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // for daylight savings time. NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; - [dateComponents setMonth:10]; - [dateComponents setDay:29]; - [dateComponents setYear:2009]; - [dateComponents setHour:12]; - [dateComponents setMinute:0]; - [dateComponents setSecond:0]; + dateComponents.month = 10; + dateComponents.day = 29; + dateComponents.year = 2009; + dateComponents.hour = 12; + dateComponents.minute = 0; + dateComponents.second = 0; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index bc9b3c466..1fed4970a 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -154,7 +154,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", [self.plotData[index] floatValue]] style:whiteText]; + newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", self.plotData[index].floatValue] style:whiteText]; newLayer.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; newLayer.cornerRadius = 5.0; newLayer.paddingLeft = 3.0; diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index de55b6f37..7f6314d98 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -215,7 +215,7 @@ -(UIFont *)italicFontForFont:(UIFont *)oldFont CPTStringArray *fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; for ( NSString *fontName in fontNames ) { - NSString *upperCaseFontName = [fontName uppercaseString]; + NSString *upperCaseFontName = fontName.uppercaseString; if ( [upperCaseFontName rangeOfString:@"ITALIC"].location != NSNotFound ) { italicName = fontName; break; @@ -223,7 +223,7 @@ -(UIFont *)italicFontForFont:(UIFont *)oldFont } if ( !italicName ) { for ( NSString *fontName in fontNames ) { - NSString *upperCaseFontName = [fontName uppercaseString]; + NSString *upperCaseFontName = fontName.uppercaseString; if ( [upperCaseFontName rangeOfString:@"OBLIQUE"].location != NSNotFound ) { italicName = fontName; break; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 488caa182..6268d7a0f 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -34,7 +34,7 @@ -(instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -201,7 +201,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSNumber *num = self.plotData[index][key]; if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue]); + num = @(num.doubleValue); } return num; @@ -254,7 +254,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -278,7 +278,7 @@ -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; if ( annotation ) { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; [graph.plotAreaFrame.plotArea removeAnnotation:annotation]; self.symbolTextAnnotation = nil; diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 9e29b102b..bf7a8c2ff 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -183,7 +183,7 @@ -(void)newData:(NSTimer *)theTimer duration:CPTFloat(1.0 / kFrameRate)]; self.currentIndex++; - [self.plotData addObject:@( (1.0 - kAlpha) * [[self.plotData lastObject] doubleValue] + kAlpha * arc4random() / (double)UINT32_MAX )]; + [self.plotData addObject:@( (1.0 - kAlpha) * self.plotData.lastObject.doubleValue + kAlpha * arc4random() / (double)UINT32_MAX )]; [thePlot insertDataAtIndex:self.plotData.count - 1 numberOfRecords:1]; } } diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 746eedff2..a86556e35 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -116,7 +116,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", [self.plotData[index] floatValue]] + CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", self.plotData[index].floatValue] style:whiteText]; return newLayer; } @@ -131,7 +131,7 @@ -(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { - NSLog(@"Slice was selected at index %d. Value = %f", (int)index, [self.plotData[index] floatValue]); + NSLog(@"Slice was selected at index %d. Value = %f", (int)index, self.plotData[index].floatValue); self.offsetIndex = NSNotFound; diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 39369fb22..88b924161 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -38,7 +38,7 @@ -(instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -245,7 +245,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -280,7 +280,7 @@ -(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; if ( graph ) { // Remove the annotation diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index f5f52898e..8bd438bb5 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -33,7 +33,7 @@ -(instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -243,7 +243,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSNumber *value = [self numberForPlot:plot field:CPTBarPlotFieldBarTip recordIndex:index]; - NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, [value floatValue]); + NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, value.floatValue); CPTGraph *graph = (self.graphs)[0]; @@ -268,7 +268,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:value]; // Now add the annotation to the plot area diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index dc8aa6f7b..98ea81129 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -22,7 +22,7 @@ -(NSString *)stringForObjectValue:(id)coordinateValue NSString *string = nil; if ( [coordinateValue respondsToSelector:@selector(doubleValue)] ) { - double value = [(NSNumber *)coordinateValue doubleValue] / M_PI; + double value = ( (NSNumber *)coordinateValue ).doubleValue / M_PI; double factor = round(self.multiplier.doubleValue); if ( factor == 0.0 ) { diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index 6bd7d0abd..823b3bc10 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -107,7 +107,7 @@ -(void)sortByTitle -(CPTStringArray *)sectionTitles { - return [[self.plotSections allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + return [self.plotSections.allObjects sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; } @end diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 2135189a3..ea4e92c98 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -312,7 +312,7 @@ -(NSImage *)image bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect( context, CGRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); @@ -384,7 +384,7 @@ -(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme multiplier:1.0 constant:0.0]]; #else - [hostingView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + hostingView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; [hostingView setAutoresizesSubviews:YES]; #endif diff --git a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m index 03b0f1721..437849620 100644 --- a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m @@ -57,7 +57,7 @@ -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender controller.currentThemeName = self.currentThemeName; - NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; + NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow; PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectInSection:[indexPath indexAtPosition:0] atIndex:[indexPath indexAtPosition:1]]; @@ -90,7 +90,7 @@ -(void)themeChanged:(NSNotification *)notification -(NSInteger)numberOfSectionsInTableView:(UITableView *)tv { - return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfSections]; + return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } -(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section @@ -119,7 +119,7 @@ -(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPa -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [[PlotGallery sharedPlotGallery] sectionTitles][(NSUInteger)section]; + return [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)section]; } @end diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 21d96eb28..c97e151d4 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -95,7 +95,7 @@ -(void)windowControllerDidLoadNib:(NSWindowController *)windowController length:@(ceil( (self.maximumValueForYAxis - self.minimumValueForYAxis) / self.majorIntervalLengthForY ) * self.majorIntervalLengthForY)]; // this allows the plot to respond to mouse events - [plotSpace setDelegate:self]; + plotSpace.delegate = self; [plotSpace setAllowsUserInteraction:YES]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)newGraph.axisSet; @@ -171,8 +171,8 @@ -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *_ currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); CPTStringArray *columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; - double xValue = [columnValues[0] doubleValue]; - double yValue = [columnValues[1] doubleValue]; + double xValue = columnValues[0].doubleValue; + double yValue = columnValues[1].doubleValue; if ( xValue < minX ) { minX = xValue; } @@ -271,12 +271,12 @@ -(IBAction)zoomOut // get the ful range min and max values for ( NSDictionary *xyValues in self.dataPoints ) { - double xVal = [xyValues[@"x"] doubleValue]; + double xVal = xyValues[@"x"].doubleValue; minX = fmin(xVal, minX); maxX = fmax(xVal, maxX); - double yVal = [xyValues[@"y"] doubleValue]; + double yVal = xyValues[@"y"].doubleValue; minY = fmin(yVal, minY); maxY = fmax(yVal, maxY); @@ -312,12 +312,12 @@ -(IBAction)exportToPDF:(id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; - [pdfSavingDialog setAllowedFileTypes:@[@"pdf"]]; + pdfSavingDialog.allowedFileTypes = @[@"pdf"]; if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - NSURL *url = [pdfSavingDialog URL]; + NSURL *url = pdfSavingDialog.URL; if ( url ) { [dataForPDF writeToURL:url atomically:NO]; } @@ -328,15 +328,15 @@ -(IBAction)exportToPNG:(id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; - [pngSavingDialog setAllowedFileTypes:@[@"png"]]; + pngSavingDialog.allowedFileTypes = @[@"png"]; if ( [pngSavingDialog runModal] == NSOKButton ) { NSImage *image = [self.graph imageOfLayer]; - NSData *tiffData = [image TIFFRepresentation]; + NSData *tiffData = image.TIFFRepresentation; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:@{}]; - NSURL *url = [pngSavingDialog URL]; + NSURL *url = pngSavingDialog.URL; if ( url ) { [pngData writeToURL:url atomically:NO]; } diff --git a/examples/DropPlot/NSString+ParseCSV.m b/examples/DropPlot/NSString+ParseCSV.m index c3d2b4b8d..73839c25f 100644 --- a/examples/DropPlot/NSString+ParseCSV.m +++ b/examples/DropPlot/NSString+ParseCSV.m @@ -13,7 +13,7 @@ -(CPTStringArray *)arrayByParsingCSVLine BOOL inField = NO; - for ( NSUInteger i = 0; i < [theFields count]; i++ ) { + for ( NSUInteger i = 0; i < theFields.count; i++ ) { NSString *theField = theFields[i]; switch ( inField ) { case NO: diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index ea06c417d..851e31404 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -51,10 +51,10 @@ -(CPTDictionary *)sanitizedFinancialLine:(CPTDictionary *)theFinancialLine { CPTMutableDictionary *aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; - for ( id key in [aFinancialLine allKeys] ) { + for ( id key in aFinancialLine.allKeys ) { id something = aFinancialLine[key]; if ( [something respondsToSelector:@selector(decimalValue)] ) { - something = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *)something decimalValue]]; + something = [NSDecimalNumber decimalNumberWithDecimal:( (NSNumber *)something ).decimalValue]; aFinancialLine[key] = something; } } @@ -88,12 +88,12 @@ -(CPTDictionary *)plistRep { CPTMutableDictionary *rep = [NSMutableDictionary dictionaryWithCapacity:7]; - rep[@"symbol"] = [self symbol]; - rep[@"startDate"] = [self startDate]; - rep[@"endDate"] = [self endDate]; - rep[@"overallHigh"] = [self overallHigh]; - rep[@"overallLow"] = [self overallLow]; - rep[@"financialData"] = [self financialData]; + rep[@"symbol"] = self.symbol; + rep[@"startDate"] = self.startDate; + rep[@"endDate"] = self.endDate; + rep[@"overallHigh"] = self.overallHigh; + rep[@"overallLow"] = self.overallLow; + rep[@"financialData"] = self.financialData; return [NSDictionary dictionaryWithDictionary:rep]; } @@ -138,7 +138,7 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { //if there isn't one in the user's documents directory, see if we ship with this data - docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; + docPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } @@ -198,15 +198,15 @@ -(NSString *)URL NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", self.targetSymbol]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + url = [url stringByAppendingFormat:@"a=%ld&", (long)compsStart.month - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)compsStart.day]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)compsStart.year]; - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + url = [url stringByAppendingFormat:@"d=%ld&", (long)compsEnd.month - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)compsEnd.day]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)compsEnd.year]; url = [url stringByAppendingString:@"g=d&"]; url = [url stringByAppendingString:@"ignore=.csv"]; @@ -231,9 +231,9 @@ -(BOOL)staleData NSTimeInterval twelveHours = 60.0 * 60.0 * 12.0; return 0 >= self.financialData.count || - ![[self targetSymbol] isEqualToString:[self symbol]] || - [[self targetStartDate] timeIntervalSinceDate:[self startDate]] > twelveHours || - [[self targetEndDate] timeIntervalSinceDate:[self endDate]] > twelveHours; + ![self.targetSymbol isEqualToString:self.symbol] || + [self.targetStartDate timeIntervalSinceDate:self.startDate] > twelveHours || + [self.targetEndDate timeIntervalSinceDate:self.endDate] > twelveHours; } -(void)fetchIfNeeded @@ -276,7 +276,7 @@ -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRespons // has enough information to create the NSURLResponse // it can be called multiple times, for example in the case of a // redirect, so each time we reset the data. - [self.receivedData setLength:0]; + self.receivedData.length = 0; } -(void)cancelDownload @@ -295,7 +295,7 @@ -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro self.loadingData = NO; self.receivedData = nil; self.connection = nil; - NSLog(@"err = %@", [error localizedDescription]); + NSLog(@"err = %@", error.localizedDescription); self.connection = nil; id theDelegate = self.delegate; @@ -354,7 +354,7 @@ -(void)populateWithString:(NSString *)csv self.endDate = self.targetEndDate; self.symbol = self.targetSymbol; - [self setFinancialData:[NSArray arrayWithArray:newFinancials]]; + self.financialData = [NSArray arrayWithArray:newFinancials]; } @end diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 531942439..094ec5a52 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -78,7 +78,7 @@ -(void)reloadData [theGraph reloadData]; - [[self navigationItem] setTitle:[self.dataPuller symbol]]; + self.navigationItem.title = self.dataPuller.symbol; } -(void)viewWillAppear:(BOOL)animated @@ -129,7 +129,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI else if ( fieldEnum == CPTScatterPlotFieldY ) { CPTFinancialDataArray *financialData = self.dataPuller.financialData; - CPTDictionary *fData = financialData[[financialData count] - index - 1]; + CPTDictionary *fData = financialData[financialData.count - index - 1]; num = fData[@"close"]; NSAssert([num isMemberOfClass:[NSDecimalNumber class]], @"grrr"); } @@ -149,8 +149,8 @@ -(void)setDataPuller:(APYahooDataPuller *)aDataPuller //NSLog(@"in -setDataPuller:, old value of dataPuller: %@, changed to: %@", dataPuller, aDataPuller); if ( dataPuller != aDataPuller ) { - dataPuller = aDataPuller; - [dataPuller setDelegate:self]; + dataPuller = aDataPuller; + dataPuller.delegate = self; [self reloadData]; } } diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 5d1189974..15f7d03c3 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -15,7 +15,7 @@ +(NSDateFormatter *)yahooCSVDateFormatter dispatch_once(&onceToken, ^{ df = [[NSDateFormatter alloc] init]; - [df setDateFormat:@"yyyy-MM-dd"]; + df.dateFormat = @"yyyy-MM-dd"; }); return df; diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index 257f73b93..e019fc0f2 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -46,10 +46,10 @@ -(void)didReceiveMemoryWarning -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [[self navigationItem] setTitle:@"Stocks"]; + self.navigationItem.title = @"Stocks"; //the graph will set itself as delegate of the dataPuller when we push it, so we need to reset this. for ( APYahooDataPuller *dp in self.stocks ) { - [dp setDelegate:self]; + dp.delegate = self; } } @@ -57,11 +57,11 @@ -(void)viewWillAppear:(BOOL)animated -(void)inspectStock:(APYahooDataPuller *)aStock { - NSDecimalNumber *high = [aStock overallHigh]; - NSDecimalNumber *low = [aStock overallLow]; + NSDecimalNumber *high = aStock.overallHigh; + NSDecimalNumber *low = aStock.overallLow; - if ( [high isEqualToNumber:[NSDecimalNumber notANumber]] || [low isEqualToNumber:[NSDecimalNumber notANumber]] || ([[aStock financialData] count] <= 0) ) { - NSString *message = [NSString stringWithFormat:@"No information available for %@", [aStock symbol]]; + if ( [high isEqualToNumber:[NSDecimalNumber notANumber]] || [low isEqualToNumber:[NSDecimalNumber notANumber]] || (aStock.financialData.count <= 0) ) { + NSString *message = [NSString stringWithFormat:@"No information available for %@", aStock.symbol]; UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Alert" message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [av show]; } @@ -71,7 +71,7 @@ -(void)inspectStock:(APYahooDataPuller *)aStock self.graph = aGraph; } - [self.graph setDataPuller:aStock]; + self.graph.dataPuller = aStock; [self.navigationController pushViewController:self.graph animated:YES]; self.graph.view.frame = self.view.bounds; } @@ -101,44 +101,44 @@ -(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row { APYahooDataPuller *dp = self.stocks[row]; - [[cell textLabel] setText:[dp symbol]]; + cell.textLabel.text = dp.symbol; NSDateFormatter *df = [[NSDateFormatter alloc] init]; - [df setDateStyle:NSDateFormatterShortStyle]; + df.dateStyle = NSDateFormatterShortStyle; NSString *startString = @"(NA)"; - if ( [dp startDate] ) { - startString = [df stringFromDate:[dp startDate]]; + if ( dp.startDate ) { + startString = [df stringFromDate:dp.startDate]; } NSString *endString = @"(NA)"; - if ( [dp endDate] ) { - endString = [df stringFromDate:[dp endDate]]; + if ( dp.endDate ) { + endString = [df stringFromDate:dp.endDate]; } NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; - [nf setRoundingMode:NSNumberFormatterRoundHalfUp]; - [nf setDecimalSeparator:@"."]; - [nf setGroupingSeparator:@","]; - [nf setPositiveFormat:@"\u00A4###,##0.00"]; - [nf setNegativeFormat:@"(\u00A4###,##0.00)"]; + nf.roundingMode = NSNumberFormatterRoundHalfUp; + nf.decimalSeparator = @"."; + nf.groupingSeparator = @","; + nf.positiveFormat = @"\u00A4###,##0.00"; + nf.negativeFormat = @"(\u00A4###,##0.00)"; NSString *overallLow = @"(NA)"; - if ( ![[NSDecimalNumber notANumber] isEqual:[dp overallLow]] ) { - overallLow = [nf stringFromNumber:[dp overallLow]]; + if ( ![[NSDecimalNumber notANumber] isEqual:dp.overallLow] ) { + overallLow = [nf stringFromNumber:dp.overallLow]; } NSString *overallHigh = @"(NA)"; - if ( ![[NSDecimalNumber notANumber] isEqual:[dp overallHigh]] ) { - overallHigh = [nf stringFromNumber:[dp overallHigh]]; + if ( ![[NSDecimalNumber notANumber] isEqual:dp.overallHigh] ) { + overallHigh = [nf stringFromNumber:dp.overallHigh]; } - [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%@ - %@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]]; + cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]; - UIView *accessory = [cell accessoryView]; + UIView *accessory = cell.accessoryView; if ( dp.loadingData ) { if ( ![accessory isMemberOfClass:[UIActivityIndicatorView class]] ) { accessory = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [(UIActivityIndicatorView *)accessory setHidesWhenStopped : NO]; - [cell setAccessoryView:accessory]; + cell.accessoryView = accessory; } [(UIActivityIndicatorView *)accessory startAnimating]; } @@ -149,8 +149,8 @@ -(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row if ( dp.staleData ) { if ( ![accessory isMemberOfClass:[UIImageView class]] ) { UIImage *caution = [UIImage imageNamed:@"caution.png"]; - accessory = [[UIImageView alloc] initWithImage:caution]; - [cell setAccessoryView:accessory]; + accessory = [[UIImageView alloc] initWithImage:caution]; + cell.accessoryView = accessory; // CGRect frame = accessory.frame; //#pragma unused (frame) } @@ -193,7 +193,7 @@ -(CPTStringArray *)symbols CPTMutableStringArray *symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; for ( APYahooDataPuller *dp in self.stocks ) { - [symbols addObject:[dp symbol]]; + [symbols addObject:dp.symbol]; } return [NSArray arrayWithArray:symbols]; } @@ -226,10 +226,10 @@ -(void)addSymbol:(NSString *)aSymbol APYahooDataPuller *dp = [[APYahooDataPuller alloc] initWithTargetSymbol:aSymbol targetStartDate:start targetEndDate:end]; - [[self stocks] addObject:dp]; + [self.stocks addObject:dp]; [dp fetchIfNeeded]; - [dp setDelegate:self]; - [[self tableView] reloadData]; //TODO: should reload whole thing + dp.delegate = self; + [self.tableView reloadData]; //TODO: should reload whole thing } -(void)dealloc diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.m b/examples/StockPlot/Classes/StockPlotAppDelegate.m index aed96ab66..6157336f0 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.m +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.m @@ -19,7 +19,7 @@ @implementation StockPlotAppDelegate -(void)applicationDidFinishLaunching:(UIApplication *)application { - [[self.navigationController navigationBar] setTintColor:[UIColor blackColor]]; + self.navigationController.navigationBar.tintColor = [UIColor blackColor]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; From 8747083179a7fd5ac22b6b23f2ef2d4b7543c05a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 20:41:09 -0500 Subject: [PATCH 131/429] Added a setter method for the alternatingBandAnchor property to force the bands to redraw when the anchor changes. --- framework/Source/CPTAxis.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 265e881a4..23671baa7 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -3142,6 +3142,16 @@ -(void)setAlternatingBandFills:(CPTFillArray *)newFills } } +-(void)setAlternatingBandAnchor:(NSNumber *)newBandAnchor +{ + if ( newBandAnchor != alternatingBandAnchor ) { + alternatingBandAnchor = newBandAnchor; + + CPTPlotArea *thePlotArea = self.plotArea; + [thePlotArea setNeedsDisplay]; + } +} + -(CPTLimitBandArray *)backgroundLimitBands { return [self.mutableBackgroundLimitBands copy]; From fa40e7d365c8801979710d929cf5610938f57fb8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 26 Nov 2015 10:14:17 -0500 Subject: [PATCH 132/429] Fixed some compiler warnings in the Plot Gallery app. --- examples/CorePlotGallery/src/ios/RootViewController.m | 2 +- examples/CorePlotGallery/src/plots/CurvedScatterPlot.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index 6cfd78ec5..75389543e 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -50,7 +50,7 @@ -(void)dealloc -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { - DetailViewController *controller = (DetailViewController *)(segue.destinationViewController).topViewController; + DetailViewController *controller = (DetailViewController *)( (UINavigationController *)segue.destinationViewController ).topViewController; controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; controller.navigationItem.leftItemsSupplementBackButton = YES; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 9e9cc99c6..3fb7e03a6 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -197,7 +197,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP y.minorGridLineStyle = minorGridLineStyle; y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; y.labelOffset = self.titleSize * CPTFloat(0.25); - y.alternatingBandFills = @[[[CPTColor whiteColor] colorWithAlphaComponent:0.1], [NSNull null]]; + y.alternatingBandFills = @[[[CPTColor whiteColor] colorWithAlphaComponent:CPTFloat(0.1)], [NSNull null]]; y.alternatingBandAnchor = @0.0; lineCap.lineStyle = y.axisLineStyle; From 468fc013b83354dd7c1d5a875f90e5ff753e6b6d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 26 Nov 2015 10:24:43 -0500 Subject: [PATCH 133/429] Added a live indicator line to the "Date Plot" in the Plot Gallery app. Fixed issue #241. --- examples/CorePlotGallery/src/plots/DatePlot.m | 161 ++++++++++++++++-- 1 file changed, 151 insertions(+), 10 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index 9a21c2e77..f4d4e8442 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -5,15 +5,27 @@ #import "DatePlot.h" +typedef NSDictionary CPTPlotData; + +typedef NSArray CPTPlotDataArray; +typedef NSMutableArray CPTMutablePlotDataArray; + +static const NSUInteger kNumPoints = 10; +static const NSTimeInterval oneDay = 24 * 60 * 60; + @interface DatePlot() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong) CPTPlotDataArray *plotData; +@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *markerAnnotation; @end +#pragma mark - + @implementation DatePlot @synthesize plotData; +@synthesize markerAnnotation; +(void)load { @@ -33,12 +45,10 @@ -(instancetype)init -(void)generateData { if ( !self.plotData ) { - const NSTimeInterval oneDay = 24 * 60 * 60; - // Add some data - NSMutableArray *newData = [NSMutableArray array]; + CPTMutablePlotDataArray *newData = [NSMutableArray array]; - for ( NSUInteger i = 0; i < 5; i++ ) { + for ( NSUInteger i = 0; i < kNumPoints; i++ ) { NSTimeInterval xVal = oneDay * i; double yVal = 1.2 * arc4random() / (double)UINT32_MAX + 1.2; @@ -71,8 +81,6 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDate *refDate = [gregorian dateFromComponents:dateComponents]; - NSTimeInterval oneDay = 24 * 60 * 60; - #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; #else @@ -83,11 +91,20 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP [self addGraph:graph toHostingView:hostingView]; [self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; + graph.plotAreaFrame.paddingLeft = 36.0; + graph.plotAreaFrame.paddingTop = 12.0; + graph.plotAreaFrame.paddingRight = 12.0; + graph.plotAreaFrame.paddingBottom = 12.0; + // Setup scatter plot space CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; - NSTimeInterval xLow = 0.0; - plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@(oneDay * 5.0)]; - plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@3.0]; + + NSTimeInterval xLow = 0.0; + plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@(xLow) length:@( oneDay * (kNumPoints - 1) )]; + plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:@1.0 length:@2.0]; + + plotSpace.allowsUserInteraction = YES; + plotSpace.delegate = self; // Axes CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; @@ -107,6 +124,24 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP y.minorTicksPerInterval = 5; y.orthogonalPosition = @(oneDay); + CPTMutableLineStyle *blueLineStyle = [CPTMutableLineStyle lineStyle]; + blueLineStyle.lineColor = [CPTColor blueColor]; + blueLineStyle.lineWidth = 2.0; + + CPTXYAxis *iAxis = [[CPTXYAxis alloc] initWithFrame:CGRectZero]; + iAxis.title = nil; + iAxis.labelFormatter = nil; + iAxis.axisLineStyle = blueLineStyle; + + iAxis.coordinate = CPTCoordinateY; + iAxis.plotSpace = graph.defaultPlotSpace; + iAxis.majorTickLineStyle = nil; + iAxis.minorTickLineStyle = nil; + iAxis.orthogonalPosition = @0.0; + iAxis.hidden = YES; + + graph.axisSet.axes = @[x, y, iAxis]; + // Create a plot that uses the data source method CPTScatterPlot *dataSourceLinePlot = [[CPTScatterPlot alloc] init]; dataSourceLinePlot.identifier = @"Date Plot"; @@ -118,6 +153,29 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP dataSourceLinePlot.dataSource = self; [graph addPlot:dataSourceLinePlot]; + + // Setup a style for the annotation + CPTMutableTextStyle *hitAnnotationTextStyle = [CPTMutableTextStyle textStyle]; + hitAnnotationTextStyle.color = [CPTColor blackColor]; + hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; + hitAnnotationTextStyle.fontSize = self.titleSize * CPTFloat(0.5); + + CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:@"Annotation" style:hitAnnotationTextStyle]; + textLayer.borderLineStyle = blueLineStyle; + textLayer.fill = [CPTFill fillWithColor:[CPTColor whiteColor]]; + textLayer.cornerRadius = 3.0; + textLayer.paddingLeft = 2.0; + textLayer.paddingTop = 2.0; + textLayer.paddingRight = 2.0; + textLayer.paddingBottom = 2.0; + textLayer.hidden = YES; + + CPTPlotSpaceAnnotation *annotation = [[CPTPlotSpaceAnnotation alloc] initWithPlotSpace:plotSpace anchorPlotPoint:@[@0, @0]]; + annotation.contentLayer = textLayer; + + [graph addAnnotation:annotation]; + + self.markerAnnotation = annotation; } #pragma mark - @@ -133,4 +191,87 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return self.plotData[index][@(fieldEnum)]; } +#pragma mark - +#pragma mark Plot Space Delegate Methods + +-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement +{ + return CPTPointMake(0.0, 0.0); +} + +-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +{ + CPTPlotRange *updatedRange = nil; + + CPTXYPlotSpace *xySpace = (CPTXYPlotSpace *)space; + + switch ( coordinate ) { + case CPTCoordinateX: + updatedRange = xySpace.xRange; + break; + + case CPTCoordinateY: + updatedRange = xySpace.yRange; + break; + + default: + break; + } + + return updatedRange; +} + +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point +{ + CPTXYPlotSpace *xySpace = (CPTXYPlotSpace *)space; + + CPTGraph *graph = space.graph; + + CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; + + CPTAxisArray *axes = axisSet.axes; + CPTXYAxis *iAxis = axes.lastObject; + + CPTNumberArray *plotPoint = [space plotPointForEvent:event]; + + CPTPlotSpaceAnnotation *annotation = self.markerAnnotation; + + CPTTextLayer *textLayer = (CPTTextLayer *)annotation.contentLayer; + + NSNumber *xNumber = plotPoint[CPTCoordinateX]; + + if ( [xySpace.xRange containsNumber:xNumber] ) { + NSUInteger x = (NSUInteger)lround(xNumber.doubleValue / oneDay); + + xNumber = @(x * oneDay); + + NSString *dateValue = [axisSet.xAxis.labelFormatter stringForObjectValue:xNumber]; + NSNumber *plotValue = self.plotData[x][@(CPTCoordinateY)]; + + textLayer.text = [NSString stringWithFormat:@"%@ → %@", dateValue, [NSString stringWithFormat:@"%1.3f", plotValue.doubleValue]]; + textLayer.hidden = NO; + + annotation.anchorPlotPoint = @[xNumber, xySpace.yRange.maxLimit]; + + iAxis.orthogonalPosition = xNumber; + iAxis.hidden = NO; + } + else { + textLayer.hidden = YES; + iAxis.hidden = YES; + } + + return NO; +} + +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point +{ + return [self plotSpace:space shouldHandlePointingDeviceDownEvent:event atPoint:point]; +} + +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point +{ + return NO; +} + @end From dadc96a0de2707f60b1edf342eff956cf6bab9ec Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 28 Nov 2015 14:42:07 -0500 Subject: [PATCH 134/429] Assume NSCoder will always support keyed coding (most classes didn't check anyway). --- framework/Source/CPTGradient.m | 39 +++++++++++------------ framework/Source/CPTLimitBand.m | 20 +++--------- framework/Source/CPTNumericData.m | 53 ++++++++----------------------- 3 files changed, 35 insertions(+), 77 deletions(-) diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 9b0348409..51248e477 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -182,29 +182,26 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)coder { - if ( coder.allowsKeyedCoding ) { - NSUInteger count = 0; - CPTGradientElement *currentElement = self.elementList; - while ( currentElement != NULL ) { - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.red)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.green)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.blue)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.alpha)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->position)]; + NSUInteger count = 0; - count++; - currentElement = currentElement->nextElement; - } - [coder encodeInteger:(NSInteger)count forKey:@"CPTGradient.elementCount"]; - [coder encodeInteger:self.blendingMode forKey:@"CPTGradient.blendingMode"]; - [coder encodeCGFloat:self.angle forKey:@"CPTGradient.angle"]; - [coder encodeInteger:self.gradientType forKey:@"CPTGradient.type"]; - [coder encodeCPTPoint:self.startAnchor forKey:@"CPTPlotSymbol.startAnchor"]; - [coder encodeCPTPoint:self.endAnchor forKey:@"CPTPlotSymbol.endAnchor"]; - } - else { - [NSException raise:NSInvalidArchiveOperationException format:@"Only supports NSKeyedArchiver coders"]; + CPTGradientElement *currentElement = self.elementList; + + while ( currentElement != NULL ) { + [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.red)]; + [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.green)]; + [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.blue)]; + [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.alpha)]; + [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->position)]; + + count++; + currentElement = currentElement->nextElement; } + [coder encodeInteger:(NSInteger)count forKey:@"CPTGradient.elementCount"]; + [coder encodeInteger:self.blendingMode forKey:@"CPTGradient.blendingMode"]; + [coder encodeCGFloat:self.angle forKey:@"CPTGradient.angle"]; + [coder encodeInteger:self.gradientType forKey:@"CPTGradient.type"]; + [coder encodeCPTPoint:self.startAnchor forKey:@"CPTPlotSymbol.startAnchor"]; + [coder encodeCPTPoint:self.endAnchor forKey:@"CPTPlotSymbol.endAnchor"]; } -(instancetype)initWithCoder:(NSCoder *)coder diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index 491126929..4fd4ecba5 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -79,14 +79,8 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)encoder { - if ( encoder.allowsKeyedCoding ) { - [encoder encodeObject:self.range forKey:@"CPTLimitBand.range"]; - [encoder encodeObject:self.fill forKey:@"CPTLimitBand.fill"]; - } - else { - [encoder encodeObject:self.range]; - [encoder encodeObject:self.fill]; - } + [encoder encodeObject:self.range forKey:@"CPTLimitBand.range"]; + [encoder encodeObject:self.fill forKey:@"CPTLimitBand.fill"]; } /// @endcond @@ -98,14 +92,8 @@ -(void)encodeWithCoder:(NSCoder *)encoder -(instancetype)initWithCoder:(NSCoder *)decoder { if ( (self = [super init]) ) { - if ( decoder.allowsKeyedCoding ) { - range = [decoder decodeObjectForKey:@"CPTLimitBand.range"]; - fill = [decoder decodeObjectForKey:@"CPTLimitBand.fill"]; - } - else { - range = [decoder decodeObject]; - fill = [decoder decodeObject]; - } + range = [decoder decodeObjectForKey:@"CPTLimitBand.range"]; + fill = [decoder decodeObjectForKey:@"CPTLimitBand.fill"]; } return self; } diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 9ffdb475e..7ed88bee1 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -1156,30 +1156,15 @@ -(id)copyWithZone:(NSZone *)zone -(void)encodeWithCoder:(NSCoder *)encoder { - if ( encoder.allowsKeyedCoding ) { - [encoder encodeObject:self.data forKey:@"CPTNumericData.data"]; + [encoder encodeObject:self.data forKey:@"CPTNumericData.data"]; - CPTNumericDataType selfDataType = self.dataType; - [encoder encodeInteger:selfDataType.dataTypeFormat forKey:@"CPTNumericData.dataType.dataTypeFormat"]; - [encoder encodeInt64:(int64_t)selfDataType.sampleBytes forKey:@"CPTNumericData.dataType.sampleBytes"]; - [encoder encodeInt64:selfDataType.byteOrder forKey:@"CPTNumericData.dataType.byteOrder"]; + CPTNumericDataType selfDataType = self.dataType; + [encoder encodeInteger:selfDataType.dataTypeFormat forKey:@"CPTNumericData.dataType.dataTypeFormat"]; + [encoder encodeInt64:(int64_t)selfDataType.sampleBytes forKey:@"CPTNumericData.dataType.sampleBytes"]; + [encoder encodeInt64:selfDataType.byteOrder forKey:@"CPTNumericData.dataType.byteOrder"]; - [encoder encodeObject:self.shape forKey:@"CPTNumericData.shape"]; - [encoder encodeInteger:self.dataOrder forKey:@"CPTNumericData.dataOrder"]; - } - else { - [encoder encodeObject:self.data]; - - CPTNumericDataType selfDataType = self.dataType; - [encoder encodeValueOfObjCType:@encode(CPTDataTypeFormat) at:&(selfDataType.dataTypeFormat)]; - [encoder encodeValueOfObjCType:@encode(size_t) at:&(selfDataType.sampleBytes)]; - [encoder encodeValueOfObjCType:@encode(CFByteOrder) at:&(selfDataType.byteOrder)]; - - [encoder encodeObject:self.shape]; - - CPTDataOrder order = self.dataOrder; - [encoder encodeValueOfObjCType:@encode(CPTDataOrder) at:&order]; - } + [encoder encodeObject:self.shape forKey:@"CPTNumericData.shape"]; + [encoder encodeInteger:self.dataOrder forKey:@"CPTNumericData.dataOrder"]; } /// @endcond @@ -1196,26 +1181,14 @@ -(instancetype)initWithCoder:(NSCoder *)decoder CPTNumberArray *shapeArray; CPTDataOrder order; - if ( decoder.allowsKeyedCoding ) { - newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; + newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; - newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey: @"CPTNumericData.dataType.dataTypeFormat"], - (size_t)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.sampleBytes"], - (CFByteOrder)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.byteOrder"] ); + newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey: @"CPTNumericData.dataType.dataTypeFormat"], + (size_t)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.sampleBytes"], + (CFByteOrder)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.byteOrder"] ); - shapeArray = [decoder decodeObjectForKey:@"CPTNumericData.shape"]; - order = (CPTDataOrder)[decoder decodeIntegerForKey : @"CPTNumericData.dataOrder"]; - } - else { - newData = [decoder decodeObject]; - - [decoder decodeValueOfObjCType:@encode(CPTDataTypeFormat) at:&(newDataType.dataTypeFormat)]; - [decoder decodeValueOfObjCType:@encode(size_t) at:&(newDataType.sampleBytes)]; - [decoder decodeValueOfObjCType:@encode(CFByteOrder) at:&(newDataType.byteOrder)]; - - shapeArray = [decoder decodeObject]; - [decoder decodeValueOfObjCType:@encode(CPTDataOrder) at:&order]; - } + shapeArray = [decoder decodeObjectForKey:@"CPTNumericData.shape"]; + order = (CPTDataOrder)[decoder decodeIntegerForKey : @"CPTNumericData.dataOrder"]; [self commonInitWithData:newData dataType:newDataType shape:shapeArray dataOrder:order]; } From 53389118048942b2ffcabac6468eafdf30c04c6d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 2 Dec 2015 21:11:06 -0500 Subject: [PATCH 135/429] Add the graph as a sublayer to the view layer after changing from a layer hosting view to layer backed view or vice versa in the Mac graph hosting view. --- framework/MacOnly/CPTGraphHostingView.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 5f18e0ddb..27f8d7f5b 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -503,6 +503,11 @@ -(void)viewWillMoveToSuperview:(NSView *)newSuperview self.layer = [self makeBackingLayer]; self.wantsLayer = YES; } + + CPTGraph *theGraph = self.hostedGraph; + if ( theGraph ) { + [self.layer addSublayer:theGraph]; + } } } From 4824145e7a1bc427e143a79dd9f794644b1fede0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 4 Dec 2015 16:28:40 -0500 Subject: [PATCH 136/429] Increased the Mac deployment target to OS X 10.8. --- documentation/changelog.markdown | 1 + .../CPTTestApp.xcodeproj/project.pbxproj | 29 +++++++++++----- examples/CPTTestApp/Source/Controller.m | 12 +++++-- .../DatePlot.xcodeproj/project.pbxproj | 34 +++++++++++++++++-- .../DropPlot.xcodeproj/project.pbxproj | 4 +-- .../project.pbxproj | 34 +++++++++++++++++-- .../RangePlot.xcodeproj/project.pbxproj | 34 +++++++++++++++++-- framework/CorePlot.xcodeproj/project.pbxproj | 8 ++--- 8 files changed, 133 insertions(+), 23 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 6a0a31d07..c896f4db4 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -5,6 +5,7 @@ To be determined. ## Details +- **New**: Increased the Mac deployment target to OS X 10.8. - **New**: Added a tvOS framework. - **New**: Added an option to anchor alternating band fills to a specific starting value. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index 0d33b6bef..2fd8f020b 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -7,8 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 07032B7111ABB9F300463D20 /* CorePlot.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 07032B6A11ABB9E000463D20 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 07032B7211ABB9F700463D20 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07032B6A11ABB9E000463D20 /* CorePlot.framework */; }; 077382B10F3DC1FB002F10E2 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 077382B00F3DC1FB002F10E2 /* Controller.m */; }; 07C13BBB0FF9322A00BEE616 /* BlueTexture.png in Resources */ = {isa = PBXBuildFile; fileRef = 07C13BBA0FF9322A00BEE616 /* BlueTexture.png */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; @@ -20,6 +18,8 @@ C317AB711093E09D00B25011 /* AxisDemo.xib in Resources */ = {isa = PBXBuildFile; fileRef = C317AB701093E09D00B25011 /* AxisDemo.xib */; }; C317AB751093E17500B25011 /* AxisDemoController.m in Sources */ = {isa = PBXBuildFile; fileRef = C317AB731093E17500B25011 /* AxisDemoController.m */; }; C34D4F8E0F8ED78400969C24 /* CPTPlotSymbolTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34D4F8C0F8ED78400969C24 /* CPTPlotSymbolTestController.m */; }; + C36912D21C0B48DF000A1D61 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07032B6A11ABB9E000463D20 /* CorePlot.framework */; }; + C36912D31C0B48DF000A1D61 /* CorePlot.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 07032B6A11ABB9E000463D20 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C38017DD124132020052B00D /* SelectionDemo.xib in Resources */ = {isa = PBXBuildFile; fileRef = C38017DC124132020052B00D /* SelectionDemo.xib */; }; C38017E1124132610052B00D /* SelectionDemoController.m in Sources */ = {isa = PBXBuildFile; fileRef = C38017E0124132610052B00D /* SelectionDemoController.m */; }; C39BB9A4181C154500D95E01 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */; }; @@ -48,6 +48,13 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C36912D41C0B48DF000A1D61 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = "CorePlot Mac"; + }; C371E4D01BB714EC00AC18DB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 07032B6311ABB9E000463D20 /* CorePlot.xcodeproj */; @@ -99,7 +106,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 07032B7111ABB9F300463D20 /* CorePlot.framework in Copy Frameworks */, + C36912D31C0B48DF000A1D61 /* CorePlot.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -143,7 +150,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 07032B7211ABB9F700463D20 /* CorePlot.framework in Frameworks */, + C36912D21C0B48DF000A1D61 /* CorePlot.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, C39BB9A4181C154500D95E01 /* QuartzCore.framework in Frameworks */, ); @@ -278,6 +285,7 @@ ); dependencies = ( 07032B7411ABBA0E00463D20 /* PBXTargetDependency */, + C36912D51C0B48DF000A1D61 /* PBXTargetDependency */, ); name = CPTTestApp; productInstallPath = "$(HOME)/Applications"; @@ -417,6 +425,11 @@ name = CorePlot; targetProxy = 07032B7311ABBA0E00463D20 /* PBXContainerItemProxy */; }; + C36912D51C0B48DF000A1D61 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "CorePlot Mac"; + targetProxy = C36912D41C0B48DF000A1D61 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -449,7 +462,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CPTTestApp; }; @@ -470,7 +483,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.CorePlot.${PRODUCT_NAME:identifier}"; PRODUCT_NAME = CPTTestApp; }; @@ -486,7 +499,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(PROJECT_DIR)/../../build"; @@ -501,7 +514,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(PROJECT_DIR)/../../build"; }; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index dbbb16ad6..5ad73b523 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -693,7 +693,9 @@ +(void)recursivelyAssembleSublayersInZForLayer:(CALayer *)layer -(IBAction)plotSymbolDemo:(id)sender { if ( !self.plotSymbolWindow ) { - [NSBundle loadNibNamed:@"PlotSymbolDemo" owner:self]; + [[NSBundle mainBundle] loadNibNamed:@"PlotSymbolDemo" + owner:self + topLevelObjects:nil]; } NSWindow *window = self.plotSymbolWindow; @@ -703,7 +705,9 @@ -(IBAction)plotSymbolDemo:(id)sender -(IBAction)axisDemo:(id)sender { if ( !self.axisDemoWindow ) { - [NSBundle loadNibNamed:@"AxisDemo" owner:self]; + [[NSBundle mainBundle] loadNibNamed:@"AxisDemo" + owner:self + topLevelObjects:nil]; } NSWindow *window = self.axisDemoWindow; @@ -713,7 +717,9 @@ -(IBAction)axisDemo:(id)sender -(IBAction)selectionDemo:(id)sender { if ( !self.selectionDemoWindow ) { - [NSBundle loadNibNamed:@"SelectionDemo" owner:self]; + [[NSBundle mainBundle] loadNibNamed:@"SelectionDemo" + owner:self + topLevelObjects:nil]; } NSWindow *window = self.selectionDemoWindow; diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index 704f45dc6..0304c144d 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -40,6 +40,20 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C310CE5B1C0A3DB500C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C310CE5D1C0A3DB500C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; C3F04DB71B44CCFD0002322A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; @@ -127,6 +141,8 @@ C3F04DBA1B44CCFD0002322A /* UnitTests iOS.xctest */, C3F04DBC1B44CCFD0002322A /* libCorePlot-CocoaTouch.a */, C3F04DBE1B44CCFD0002322A /* CorePlot-CocoaTouchTests.xctest */, + C310CE5C1C0A3DB500C4FCB4 /* CorePlot.framework */, + C310CE5E1C0A3DB500C4FCB4 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -287,6 +303,20 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C310CE5C1C0A3DB500C4FCB4 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C310CE5B1C0A3DB500C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C310CE5E1C0A3DB500C4FCB4 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C310CE5D1C0A3DB500C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; C3F04DB81B44CCFD0002322A /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -422,7 +452,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; @@ -436,7 +466,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.9; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; }; diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 120ce9e78..727f095dd 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -479,7 +479,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; @@ -492,7 +492,7 @@ GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; }; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index b49d4a8cf..731cb86c0 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -40,6 +40,20 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C310CE771C0A3DF000C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C310CE791C0A3DF000C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; C3B345B71B46195100844218 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; @@ -128,6 +142,8 @@ C3B345BA1B46195100844218 /* UnitTests iOS.xctest */, C3B345BC1B46195100844218 /* libCorePlot-CocoaTouch.a */, C3B345BE1B46195100844218 /* CorePlot-CocoaTouchTests.xctest */, + C310CE781C0A3DF000C4FCB4 /* CorePlot.framework */, + C310CE7A1C0A3DF000C4FCB4 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -288,6 +304,20 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C310CE781C0A3DF000C4FCB4 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C310CE771C0A3DF000C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C310CE7A1C0A3DF000C4FCB4 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C310CE791C0A3DF000C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; C3B345B81B46195100844218 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -418,7 +448,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; @@ -432,7 +462,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; }; diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index 6256f4431..74a0540e5 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -41,6 +41,20 @@ remoteGlobalIDString = 0730F600109492D800E95162; remoteInfo = UnitTests; }; + C310CE871C0A3DF700C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C310CE891C0A3DF700C4FCB4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; C3B345C71B46195900844218 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 076184BC0F3CAD5900A89A76 /* CorePlot.xcodeproj */; @@ -130,6 +144,8 @@ C3B345CA1B46195900844218 /* UnitTests iOS.xctest */, C3B345CC1B46195900844218 /* libCorePlot-CocoaTouch.a */, C3B345CE1B46195900844218 /* CorePlot-CocoaTouchTests.xctest */, + C310CE881C0A3DF700C4FCB4 /* CorePlot.framework */, + C310CE8A1C0A3DF700C4FCB4 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -290,6 +306,20 @@ remoteRef = 07E0DF7F109C4E9500F108D2 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C310CE881C0A3DF700C4FCB4 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C310CE871C0A3DF700C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C310CE8A1C0A3DF700C4FCB4 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C310CE891C0A3DF700C4FCB4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; C3B345C81B46195900844218 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -420,7 +450,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; @@ -434,7 +464,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; }; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index a8be7f837..28fafcbb9 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3195,7 +3195,7 @@ buildSettings = { INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = UnitTests; SDKROOT = macosx; }; @@ -3207,7 +3207,7 @@ buildSettings = { INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = UnitTests; SDKROOT = macosx; }; @@ -3223,7 +3223,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = CorePlot; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; @@ -3241,7 +3241,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = CorePlot; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; From 97d05f362db427013bd7b7dc80875e0f29d87699 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 4 Dec 2015 16:29:42 -0500 Subject: [PATCH 137/429] Added support for `NSSecureCoding`. --- documentation/changelog.markdown | 1 + documentation/doxygen/doxygen-cocoa-tags.xml | 9 + .../doxygen/doxygen-cocoa-touch-tags.xml | 9 + framework/CorePlot.xcodeproj/project.pbxproj | 12 ++ framework/MacOnly/CPTGraphHostingView.h | 2 +- framework/MacOnly/CPTGraphHostingView.m | 23 ++- framework/Source/CPTAnnotation.h | 11 +- framework/Source/CPTAnnotation.m | 24 ++- framework/Source/CPTAnnotationHostLayer.m | 15 +- framework/Source/CPTAxis.m | 155 ++++++++++++------ framework/Source/CPTAxisLabel.h | 2 +- framework/Source/CPTAxisLabel.m | 18 +- framework/Source/CPTAxisSet.m | 18 +- framework/Source/CPTBarPlot.m | 36 +++- framework/Source/CPTBorderedLayer.m | 18 +- framework/Source/CPTCalendarFormatterTests.h | 5 + framework/Source/CPTCalendarFormatterTests.m | 29 ++++ framework/Source/CPTColor.h | 2 +- framework/Source/CPTColor.m | 12 ++ framework/Source/CPTColorSpace.h | 2 +- framework/Source/CPTColorSpace.m | 12 ++ framework/Source/CPTColorSpaceTests.m | 2 +- framework/Source/CPTColorTests.m | 2 +- framework/Source/CPTConstraints.h | 2 +- framework/Source/CPTConstraints.m | 12 ++ framework/Source/CPTFill.h | 2 +- framework/Source/CPTFill.m | 22 ++- framework/Source/CPTFillTests.m | 6 +- framework/Source/CPTGradient.h | 2 +- framework/Source/CPTGradient.m | 36 ++-- framework/Source/CPTGradientTests.m | 2 +- framework/Source/CPTGraph.m | 46 ++++-- framework/Source/CPTGridLineGroup.m | 17 +- framework/Source/CPTGridLines.m | 15 +- framework/Source/CPTImage.h | 2 +- framework/Source/CPTImage.m | 16 +- framework/Source/CPTImageTests.m | 2 +- framework/Source/CPTLayer.h | 2 +- framework/Source/CPTLayer.m | 21 ++- framework/Source/CPTLayerAnnotation.h | 3 + framework/Source/CPTLayerAnnotation.m | 25 ++- framework/Source/CPTLegend.m | 73 ++++++--- framework/Source/CPTLegendEntry.h | 2 +- framework/Source/CPTLegendEntry.m | 18 +- framework/Source/CPTLimitBand.h | 2 +- framework/Source/CPTLimitBand.m | 18 +- framework/Source/CPTLineCap.h | 2 +- framework/Source/CPTLineCap.m | 22 ++- framework/Source/CPTLineStyle.h | 2 +- framework/Source/CPTLineStyle.m | 32 +++- framework/Source/CPTLineStyleTests.m | 2 +- framework/Source/CPTMutableNumericDataTests.m | 2 +- framework/Source/CPTNumericData.h | 2 +- framework/Source/CPTNumericData.m | 25 ++- framework/Source/CPTNumericDataTests.m | 4 +- framework/Source/CPTPieChart.m | 30 +++- framework/Source/CPTPlot.m | 56 +++++-- framework/Source/CPTPlotArea.m | 36 +++- framework/Source/CPTPlotAreaFrame.m | 15 +- framework/Source/CPTPlotGroup.m | 15 +- framework/Source/CPTPlotRange.h | 2 +- framework/Source/CPTPlotRange.m | 12 ++ framework/Source/CPTPlotRangeTests.m | 2 +- framework/Source/CPTPlotSpace.h | 2 +- framework/Source/CPTPlotSpace.m | 25 ++- framework/Source/CPTPlotSpaceAnnotation.h | 3 + framework/Source/CPTPlotSpaceAnnotation.m | 20 ++- framework/Source/CPTPlotSpaceTests.m | 2 +- framework/Source/CPTPlotSymbol.h | 2 +- framework/Source/CPTPlotSymbol.m | 27 ++- framework/Source/CPTRangePlot.m | 27 ++- framework/Source/CPTScatterPlot.m | 37 ++++- framework/Source/CPTShadow.h | 2 +- framework/Source/CPTShadow.m | 15 +- framework/Source/CPTTestCase.h | 3 + framework/Source/CPTTestCase.m | 24 +++ framework/Source/CPTTextLayer.m | 21 ++- framework/Source/CPTTextStyle.h | 2 +- framework/Source/CPTTextStyle.m | 20 ++- framework/Source/CPTTextStyleTests.m | 2 +- framework/Source/CPTTheme.h | 2 +- framework/Source/CPTTheme.m | 18 +- framework/Source/CPTThemeTests.m | 10 ++ framework/Source/CPTTimeFormatter.h | 2 - framework/Source/CPTTimeFormatterTests.m | 2 +- framework/Source/CPTTradingRangePlot.m | 37 +++-- framework/Source/CPTXYAxis.m | 18 +- framework/Source/CPTXYGraph.m | 12 ++ framework/Source/CPTXYPlotSpace.m | 28 +++- framework/Source/CPTXYPlotSpaceTests.m | 2 +- framework/Source/NSCoderExtensions.m | 9 +- framework/Source/_CPTBorderLayer.m | 15 +- framework/Source/_CPTConstraintsFixed.m | 12 ++ framework/Source/_CPTConstraintsRelative.m | 12 ++ framework/Source/_CPTFillColor.h | 2 +- framework/Source/_CPTFillColor.m | 17 +- framework/Source/_CPTFillGradient.h | 2 +- framework/Source/_CPTFillGradient.m | 17 +- framework/Source/_CPTFillImage.h | 2 +- framework/Source/_CPTFillImage.m | 17 +- framework/iPhoneOnly/CPTGraphHostingView.h | 2 +- framework/iPhoneOnly/CPTGraphHostingView.m | 15 +- 102 files changed, 1203 insertions(+), 310 deletions(-) create mode 100644 framework/Source/CPTCalendarFormatterTests.h create mode 100644 framework/Source/CPTCalendarFormatterTests.m diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index c896f4db4..de5495331 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -8,6 +8,7 @@ To be determined. - **New**: Increased the Mac deployment target to OS X 10.8. - **New**: Added a tvOS framework. - **New**: Added an option to anchor alternating band fills to a specific starting value. +- **New**: Added support for `NSSecureCoding`. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/documentation/doxygen/doxygen-cocoa-tags.xml b/documentation/doxygen/doxygen-cocoa-tags.xml index e34cb8fe6..e004861d2 100644 --- a/documentation/doxygen/doxygen-cocoa-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-tags.xml @@ -529,6 +529,15 @@ NSFastEnumeration-p NSMutableCopying-p + + NSSecureCoding + https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSSecureCoding_Protocol_Ref/ + + BOOL + supportsSecureCoding: + //apple_ref/occ/intfcm/NSSecureCoding/supportsSecureCoding + + NSString https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html diff --git a/documentation/doxygen/doxygen-cocoa-touch-tags.xml b/documentation/doxygen/doxygen-cocoa-touch-tags.xml index 46faf7b7d..92439a53f 100644 --- a/documentation/doxygen/doxygen-cocoa-touch-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-touch-tags.xml @@ -463,6 +463,15 @@ https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/cl/UIResponder NSObject + + NSSecureCoding + https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSSecureCoding_Protocol_Ref/ + + BOOL + supportsSecureCoding: + //apple_ref/occ/intfcm/NSSecureCoding/supportsSecureCoding + + NSString https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 28fafcbb9..ed8a1ab18 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -236,6 +236,10 @@ C34F0D59121CB3F00020FDD3 /* CPTDataSourceTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9A745E0FB24C7200918464 /* CPTDataSourceTestCase.m */; }; C36E89BA11EE7F97003DE309 /* CPTPlotRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */; }; C370D5971A753F1C00AF4312 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; + C377B3BB1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */; }; + C377B3BC1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */; }; + C377B3BD1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */; }; + C377B3BE1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */; }; C3791D09191D4C4C001EC514 /* CPTImagePlatformSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */; }; C37EA5CB1BC83F2A0091C8F7 /* CPTGraphHostingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C38A0B281A46265300D45436 /* CPTGraphHostingView.m */; }; C37EA5CC1BC83F2A0091C8F7 /* CPTLayerAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 07E10BBA11D10183000B8DAB /* CPTLayerAnnotation.m */; }; @@ -1095,6 +1099,8 @@ C36468A90FE5533F0064B186 /* CPTTextStyleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTextStyleTests.m; sourceTree = ""; }; C36E89B811EE7F97003DE309 /* CPTPlotRangeTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTPlotRangeTests.h; sourceTree = ""; }; C36E89B911EE7F97003DE309 /* CPTPlotRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTPlotRangeTests.m; sourceTree = ""; }; + C377B3B91C122AA600891DF8 /* CPTCalendarFormatterTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTCalendarFormatterTests.h; sourceTree = ""; }; + C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTCalendarFormatterTests.m; sourceTree = ""; }; C3791D07191D4C4C001EC514 /* CPTImagePlatformSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CPTImagePlatformSpecific.m; path = MacOnly/CPTImagePlatformSpecific.m; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C37EA6931BC83F2A0091C8F7 /* CorePlot-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "CorePlot-tvOS-Info.plist"; path = "/Users/eskroch/Projects/Core Plot/framework/Info/CorePlot-tvOS-Info.plist"; sourceTree = ""; }; @@ -1947,6 +1953,8 @@ C3D979A513D2159400145DFF /* Tests */ = { isa = PBXGroup; children = ( + C377B3B91C122AA600891DF8 /* CPTCalendarFormatterTests.h */, + C377B3BA1C122AA600891DF8 /* CPTCalendarFormatterTests.m */, C3D979A713D2328000145DFF /* CPTTimeFormatterTests.h */, C3D979A813D2328000145DFF /* CPTTimeFormatterTests.m */, ); @@ -2648,6 +2656,7 @@ C3D979AF13D2337E00145DFF /* CPTColorSpaceTests.m in Sources */, C3D979B213D233C100145DFF /* CPTGradientTests.m in Sources */, C3D979B513D2340000145DFF /* CPTImageTests.m in Sources */, + C377B3BB1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */, C3D979B813D2344100145DFF /* CPTLineStyleTests.m in Sources */, C3D979BB13D2347400145DFF /* CPTFillTests.m in Sources */, C3C1C0801790D3B400E8B1B7 /* CPTLayerTests.m in Sources */, @@ -2882,6 +2891,7 @@ C37EA6AA1BC83F2D0091C8F7 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C37EA6AB1BC83F2D0091C8F7 /* CPTLineStyleTests.m in Sources */, C37EA6AC1BC83F2D0091C8F7 /* CPTTextStyleTests.m in Sources */, + C377B3BE1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */, C37EA6AD1BC83F2D0091C8F7 /* CPTTimeFormatterTests.m in Sources */, C37EA6AE1BC83F2D0091C8F7 /* CPTLayerTests.m in Sources */, C37EA6AF1BC83F2D0091C8F7 /* CPTScatterPlotTests.m in Sources */, @@ -3014,6 +3024,7 @@ C38A09E61A461CB200D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C38A0A8B1A46210A00D45436 /* CPTLineStyleTests.m in Sources */, C38A0A501A461F3D00D45436 /* CPTTextStyleTests.m in Sources */, + C377B3BC1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */, C38A0A9B1A46219600D45436 /* CPTTimeFormatterTests.m in Sources */, C38A0A121A461D6A00D45436 /* CPTLayerTests.m in Sources */, C38A0AD81A46257600D45436 /* CPTScatterPlotTests.m in Sources */, @@ -3146,6 +3157,7 @@ C38A09E51A461CAE00D45436 /* CPTMutableNumericDataTests.m in Sources */, C38A0B161A46262000D45436 /* CPTDarkGradientThemeTests.m in Sources */, C38A0A131A461D6B00D45436 /* CPTLayerTests.m in Sources */, + C377B3BD1C122AA600891DF8 /* CPTCalendarFormatterTests.m in Sources */, C38A0A9C1A46219700D45436 /* CPTTimeFormatterTests.m in Sources */, C38A0A511A461F3D00D45436 /* CPTTextStyleTests.m in Sources */, C38A0A8C1A46210A00D45436 /* CPTColorTests.m in Sources */, diff --git a/framework/MacOnly/CPTGraphHostingView.h b/framework/MacOnly/CPTGraphHostingView.h index 429fdea08..bf185e21a 100644 --- a/framework/MacOnly/CPTGraphHostingView.h +++ b/framework/MacOnly/CPTGraphHostingView.h @@ -2,7 +2,7 @@ @class CPTGraph; -@interface CPTGraphHostingView : NSView +@interface CPTGraphHostingView : NSView /// @name Hosted graph /// @{ diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 27f8d7f5b..5f0b8e530 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -128,11 +128,14 @@ -(instancetype)initWithCoder:(NSCoder *)coder CPTLayer *mainLayer = [[CPTLayer alloc] initWithFrame:NSRectToCGRect(self.frame)]; self.layer = mainLayer; - hostedGraph = nil; - self.hostedGraph = [coder decodeObjectForKey:@"CPTLayerHostingView.hostedGraph"]; // setup layers + hostedGraph = nil; + self.hostedGraph = [coder decodeObjectOfClass:[CPTGraph class] + forKey:@"CPTLayerHostingView.hostedGraph"]; // setup layers self.printRect = [coder decodeRectForKey:@"CPTLayerHostingView.printRect"]; - self.closedHandCursor = [coder decodeObjectForKey:@"CPTLayerHostingView.closedHandCursor"]; - self.openHandCursor = [coder decodeObjectForKey:@"CPTLayerHostingView.openHandCursor"]; + self.closedHandCursor = [coder decodeObjectOfClass:[NSCursor class] + forKey:@"CPTLayerHostingView.closedHandCursor"]; + self.openHandCursor = [coder decodeObjectOfClass:[NSCursor class] + forKey:@"CPTLayerHostingView.openHandCursor"]; if ( [coder containsValueForKey:@"CPTLayerHostingView.allowPinchScaling"] ) { self.allowPinchScaling = [coder decodeBoolForKey:@"CPTLayerHostingView.allowPinchScaling"]; @@ -149,6 +152,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index c137e66ee..59f2cbc33 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -14,10 +14,9 @@ typedef NSArray<__kindof CPTAnnotation *> CPTAnnotationArray; /** * @brief A mutable array of annotations. **/ -typedef NSMutableArray<__kindof CPTAnnotation *> CPTMutableAnnotationArray -; +typedef NSMutableArray<__kindof CPTAnnotation *> CPTMutableAnnotationArray; -@interface CPTAnnotation : NSObject +@interface CPTAnnotation : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; @property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAnnotationHostLayer *annotationHostLayer; @@ -25,6 +24,12 @@ typedef NSMutableArray<__kindof CPTAnnotation *> CPTMutableAnnotationArray @property (nonatomic, readwrite, assign) CGPoint displacement; @property (nonatomic, readwrite, assign) CGFloat rotation; +/// @name Initialization +/// @{ +-(nonnull instancetype)init NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +/// @} + @end #pragma mark - diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 2b1772b31..3c6c5ad4e 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -84,17 +84,31 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - annotationHostLayer = [coder decodeObjectForKey:@"CPTAnnotation.annotationHostLayer"]; - contentLayer = [coder decodeObjectForKey:@"CPTAnnotation.contentLayer"]; - contentAnchorPoint = [coder decodeCPTPointForKey:@"CPTAnnotation.contentAnchorPoint"]; - displacement = [coder decodeCPTPointForKey:@"CPTAnnotation.displacement"]; - rotation = [coder decodeCGFloatForKey:@"CPTAnnotation.rotation"]; + annotationHostLayer = [coder decodeObjectOfClass:[CPTAnnotationHostLayer class] + forKey:@"CPTAnnotation.annotationHostLayer"]; + contentLayer = [coder decodeObjectOfClass:[CPTLayer class] + forKey:@"CPTAnnotation.contentLayer"]; + contentAnchorPoint = [coder decodeCPTPointForKey:@"CPTAnnotation.contentAnchorPoint"]; + displacement = [coder decodeCPTPointForKey:@"CPTAnnotation.displacement"]; + rotation = [coder decodeCGFloatForKey:@"CPTAnnotation.rotation"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Description diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index 14dfe73a7..9e1c3e09e 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -80,7 +80,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - CPTAnnotationArray *annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; + CPTAnnotationArray *annotations = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTAnnotation class]]] + forKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; if ( annotations ) { mutableAnnotations = [annotations mutableCopy]; } @@ -93,6 +94,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Annotations diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 23671baa7..c798603bf 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -775,63 +775,98 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - coordinate = (CPTCoordinate)[coder decodeIntegerForKey : @"CPTAxis.coordinate"]; - plotSpace = [coder decodeObjectForKey:@"CPTAxis.plotSpace"]; - majorTickLocations = [coder decodeObjectForKey:@"CPTAxis.majorTickLocations"]; - minorTickLocations = [coder decodeObjectForKey:@"CPTAxis.minorTickLocations"]; - majorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.majorTickLength"]; - minorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLength"]; - labelOffset = [coder decodeCGFloatForKey:@"CPTAxis.labelOffset"]; - minorTickLabelOffset = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelOffset"]; - labelRotation = [coder decodeCGFloatForKey:@"CPTAxis.labelRotation"]; - minorTickLabelRotation = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelRotation"]; - labelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.labelAlignment"]; - minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelAlignment"]; - axisLineStyle = [[coder decodeObjectForKey:@"CPTAxis.axisLineStyle"] copy]; - majorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorTickLineStyle"] copy]; - minorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLineStyle"] copy]; - tickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickLabelDirection"]; - minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelDirection"]; - majorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorGridLineStyle"] copy]; - minorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorGridLineStyle"] copy]; - axisLineCapMin = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMin"] copy]; - axisLineCapMax = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMax"] copy]; - labelingOrigin = [coder decodeObjectForKey:@"CPTAxis.labelingOrigin"]; - majorIntervalLength = [coder decodeObjectForKey:@"CPTAxis.majorIntervalLength"]; + coordinate = (CPTCoordinate)[coder decodeIntegerForKey : @"CPTAxis.coordinate"]; + plotSpace = [coder decodeObjectOfClass:[CPTPlotSpace class] + forKey:@"CPTAxis.plotSpace"]; + majorTickLocations = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSSet class], [NSNumber class]]] + forKey:@"CPTAxis.majorTickLocations"]; + minorTickLocations = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSSet class], [NSNumber class]]] + forKey:@"CPTAxis.minorTickLocations"]; + majorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.majorTickLength"]; + minorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLength"]; + labelOffset = [coder decodeCGFloatForKey:@"CPTAxis.labelOffset"]; + minorTickLabelOffset = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelOffset"]; + labelRotation = [coder decodeCGFloatForKey:@"CPTAxis.labelRotation"]; + minorTickLabelRotation = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelRotation"]; + labelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.labelAlignment"]; + minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelAlignment"]; + axisLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxis.axisLineStyle"] copy]; + majorTickLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxis.majorTickLineStyle"] copy]; + minorTickLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxis.minorTickLineStyle"] copy]; + tickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickLabelDirection"]; + minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelDirection"]; + majorGridLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxis.majorGridLineStyle"] copy]; + minorGridLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxis.minorGridLineStyle"] copy]; + axisLineCapMin = [[coder decodeObjectOfClass:[CPTLineCap class] + forKey:@"CPTAxis.axisLineCapMin"] copy]; + axisLineCapMax = [[coder decodeObjectOfClass:[CPTLineCap class] + forKey:@"CPTAxis.axisLineCapMax"] copy]; + labelingOrigin = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTAxis.labelingOrigin"]; + majorIntervalLength = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTAxis.majorIntervalLength"]; minorTicksPerInterval = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.minorTicksPerInterval"]; preferredNumberOfMajorTicks = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.preferredNumberOfMajorTicks"]; labelingPolicy = (CPTAxisLabelingPolicy)[coder decodeIntegerForKey : @"CPTAxis.labelingPolicy"]; - labelTextStyle = [[coder decodeObjectForKey:@"CPTAxis.labelTextStyle"] copy]; - minorTickLabelTextStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLabelTextStyle"] copy]; - titleTextStyle = [[coder decodeObjectForKey:@"CPTAxis.titleTextStyle"] copy]; - labelFormatter = [coder decodeObjectForKey:@"CPTAxis.labelFormatter"]; - minorTickLabelFormatter = [coder decodeObjectForKey:@"CPTAxis.minorTickLabelFormatter"]; - labelFormatterChanged = [coder decodeBoolForKey:@"CPTAxis.labelFormatterChanged"]; - minorLabelFormatterChanged = [coder decodeBoolForKey:@"CPTAxis.minorLabelFormatterChanged"]; - axisLabels = [coder decodeObjectForKey:@"CPTAxis.axisLabels"]; - minorTickAxisLabels = [coder decodeObjectForKey:@"CPTAxis.minorTickAxisLabels"]; - axisTitle = [coder decodeObjectForKey:@"CPTAxis.axisTitle"]; - title = [[coder decodeObjectForKey:@"CPTAxis.title"] copy]; - attributedTitle = [[coder decodeObjectForKey:@"CPTAxis.attributedTitle"] copy]; - titleOffset = [coder decodeCGFloatForKey:@"CPTAxis.titleOffset"]; - titleRotation = [coder decodeCGFloatForKey:@"CPTAxis.titleRotation"]; - titleDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.titleDirection"]; - titleLocation = [coder decodeObjectForKey:@"CPTAxis.titleLocation"]; - tickDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickDirection"]; - needsRelabel = [coder decodeBoolForKey:@"CPTAxis.needsRelabel"]; - labelExclusionRanges = [coder decodeObjectForKey:@"CPTAxis.labelExclusionRanges"]; - visibleRange = [[coder decodeObjectForKey:@"CPTAxis.visibleRange"] copy]; - visibleAxisRange = [[coder decodeObjectForKey:@"CPTAxis.visibleAxisRange"] copy]; - gridLinesRange = [[coder decodeObjectForKey:@"CPTAxis.gridLinesRange"] copy]; - alternatingBandFills = [[coder decodeObjectForKey:@"CPTAxis.alternatingBandFills"] copy]; - alternatingBandAnchor = [coder decodeObjectForKey:@"CPTAxis.alternatingBandAnchor"]; - mutableBackgroundLimitBands = [[coder decodeObjectForKey:@"CPTAxis.mutableBackgroundLimitBands"] mutableCopy]; - separateLayers = [coder decodeBoolForKey:@"CPTAxis.separateLayers"]; - labelShadow = [coder decodeObjectForKey:@"CPTAxis.labelShadow"]; - minorTickLabelShadow = [coder decodeObjectForKey:@"CPTAxis.minorTickLabelShadow"]; - plotArea = [coder decodeObjectForKey:@"CPTAxis.plotArea"]; - minorGridLines = [coder decodeObjectForKey:@"CPTAxis.minorGridLines"]; - majorGridLines = [coder decodeObjectForKey:@"CPTAxis.majorGridLines"]; + labelTextStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTAxis.labelTextStyle"] copy]; + minorTickLabelTextStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTAxis.minorTickLabelTextStyle"] copy]; + titleTextStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTAxis.titleTextStyle"] copy]; + labelFormatter = [coder decodeObjectOfClass:[NSFormatter class] + forKey:@"CPTAxis.labelFormatter"]; + minorTickLabelFormatter = [coder decodeObjectOfClass:[NSFormatter class] + forKey:@"CPTAxis.minorTickLabelFormatter"]; + labelFormatterChanged = [coder decodeBoolForKey:@"CPTAxis.labelFormatterChanged"]; + minorLabelFormatterChanged = [coder decodeBoolForKey:@"CPTAxis.minorLabelFormatterChanged"]; + axisLabels = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSSet class], [CPTAxisLabel class]]] + forKey:@"CPTAxis.axisLabels"]; + minorTickAxisLabels = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSSet class], [CPTAxisLabel class]]] + forKey:@"CPTAxis.minorTickAxisLabels"]; + axisTitle = [coder decodeObjectOfClass:[NSString class] + forKey:@"CPTAxis.axisTitle"]; + title = [[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTAxis.title"] copy]; + attributedTitle = [[coder decodeObjectOfClass:[NSAttributedString class] + forKey:@"CPTAxis.attributedTitle"] copy]; + titleOffset = [coder decodeCGFloatForKey:@"CPTAxis.titleOffset"]; + titleRotation = [coder decodeCGFloatForKey:@"CPTAxis.titleRotation"]; + titleDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.titleDirection"]; + titleLocation = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTAxis.titleLocation"]; + tickDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickDirection"]; + needsRelabel = [coder decodeBoolForKey:@"CPTAxis.needsRelabel"]; + labelExclusionRanges = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTPlotRange class]]] + forKey:@"CPTAxis.labelExclusionRanges"]; + visibleRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTAxis.visibleRange"] copy]; + visibleAxisRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTAxis.visibleAxisRange"] copy]; + gridLinesRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTAxis.gridLinesRange"] copy]; + alternatingBandFills = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTFill class]]] + forKey:@"CPTAxis.alternatingBandFills"] copy]; + alternatingBandAnchor = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTAxis.alternatingBandAnchor"]; + mutableBackgroundLimitBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] + forKey:@"CPTAxis.mutableBackgroundLimitBands"] mutableCopy]; + separateLayers = [coder decodeBoolForKey:@"CPTAxis.separateLayers"]; + labelShadow = [coder decodeObjectOfClass:[CPTShadow class] + forKey:@"CPTAxis.labelShadow"]; + minorTickLabelShadow = [coder decodeObjectOfClass:[CPTShadow class] + forKey:@"CPTAxis.minorTickLabelShadow"]; + plotArea = [coder decodeObjectOfClass:[CPTPlotArea class] + forKey:@"CPTAxis.plotArea"]; + minorGridLines = [coder decodeObjectOfClass:[CPTGridLines class] + forKey:@"CPTAxis.minorGridLines"]; + majorGridLines = [coder decodeObjectOfClass:[CPTGridLines class] + forKey:@"CPTAxis.majorGridLines"]; pointingDeviceDownLabel = nil; pointingDeviceDownTickLabel = nil; @@ -844,6 +879,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Animation diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index 981e3d07c..393109197 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -16,7 +16,7 @@ typedef NSSet CPTAxisLabelSet; **/ typedef NSMutableSet CPTMutableAxisLabelSet; -@interface CPTAxisLabel : NSObject +@interface CPTAxisLabel : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; @property (nonatomic, readwrite, assign) CGFloat offset; diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index 9e1edfe9f..24a6ed570 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -110,15 +110,29 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - contentLayer = [coder decodeObjectForKey:@"CPTAxisLabel.contentLayer"]; + contentLayer = [coder decodeObjectOfClass:[CPTLayer class] + forKey:@"CPTAxisLabel.contentLayer"]; offset = [coder decodeCGFloatForKey:@"CPTAxisLabel.offset"]; rotation = [coder decodeCGFloatForKey:@"CPTAxisLabel.rotation"]; alignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxisLabel.alignment"]; - tickLocation = [coder decodeObjectForKey:@"CPTAxisLabel.tickLocation"]; + tickLocation = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTAxisLabel.tickLocation"]; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Layout diff --git a/framework/Source/CPTAxisSet.m b/framework/Source/CPTAxisSet.m index 09b46da3b..73c4f214d 100644 --- a/framework/Source/CPTAxisSet.m +++ b/framework/Source/CPTAxisSet.m @@ -80,14 +80,28 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - axes = [[coder decodeObjectForKey:@"CPTAxisSet.axes"] copy]; - borderLineStyle = [[coder decodeObjectForKey:@"CPTAxisSet.borderLineStyle"] copy]; + axes = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTAxis class]]] + forKey:@"CPTAxisSet.axes"] copy]; + borderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTAxisSet.borderLineStyle"] copy]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index c4d3dc293..89099e16f 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -311,24 +311,42 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - lineStyle = [[coder decodeObjectForKey:@"CPTBarPlot.lineStyle"] copy]; - fill = [[coder decodeObjectForKey:@"CPTBarPlot.fill"] copy]; - barWidth = [coder decodeObjectForKey:@"CPTBarPlot.barWidth"]; - barOffset = [coder decodeObjectForKey:@"CPTBarPlot.barOffset"]; - barCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barCornerRadius"]; - barBaseCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barBaseCornerRadius"]; - baseValue = [coder decodeObjectForKey:@"CPTBarPlot.baseValue"]; + lineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTBarPlot.lineStyle"] copy]; + fill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTBarPlot.fill"] copy]; + barWidth = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTBarPlot.barWidth"]; + barOffset = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTBarPlot.barOffset"]; + barCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barCornerRadius"]; + barBaseCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barBaseCornerRadius"]; + baseValue = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTBarPlot.baseValue"]; barsAreHorizontal = [coder decodeBoolForKey:@"CPTBarPlot.barsAreHorizontal"]; barBasesVary = [coder decodeBoolForKey:@"CPTBarPlot.barBasesVary"]; barWidthsAreInViewCoordinates = [coder decodeBoolForKey:@"CPTBarPlot.barWidthsAreInViewCoordinates"]; - plotRange = [[coder decodeObjectForKey:@"CPTBarPlot.plotRange"] copy]; - pointingDeviceDownIndex = NSNotFound; + plotRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTBarPlot.plotRange"] copy]; + pointingDeviceDownIndex = NSNotFound; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Data Loading diff --git a/framework/Source/CPTBorderedLayer.m b/framework/Source/CPTBorderedLayer.m index 62a318aaa..3e0846ef6 100644 --- a/framework/Source/CPTBorderedLayer.m +++ b/framework/Source/CPTBorderedLayer.m @@ -115,8 +115,10 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - borderLineStyle = [[coder decodeObjectForKey:@"CPTBorderedLayer.borderLineStyle"] copy]; - fill = [[coder decodeObjectForKey:@"CPTBorderedLayer.fill"] copy]; + borderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTBorderedLayer.borderLineStyle"] copy]; + fill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTBorderedLayer.fill"] copy]; inLayout = NO; } @@ -125,6 +127,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTCalendarFormatterTests.h b/framework/Source/CPTCalendarFormatterTests.h new file mode 100644 index 000000000..21b6d4c2e --- /dev/null +++ b/framework/Source/CPTCalendarFormatterTests.h @@ -0,0 +1,5 @@ +#import "CPTTestCase.h" + +@interface CPTCalendarFormatterTests : CPTTestCase + +@end diff --git a/framework/Source/CPTCalendarFormatterTests.m b/framework/Source/CPTCalendarFormatterTests.m new file mode 100644 index 000000000..ce3a609d5 --- /dev/null +++ b/framework/Source/CPTCalendarFormatterTests.m @@ -0,0 +1,29 @@ +#import "CPTCalendarFormatterTests.h" + +#import "CPTCalendarFormatter.h" + +@implementation CPTCalendarFormatterTests + +#pragma mark - +#pragma mark NSCoding Methods + +-(void)testKeyedArchivingRoundTrip +{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + + NSDate *refDate = [dateFormatter dateFromString:@"12:00 Oct 29, 2009"]; + + dateFormatter.dateStyle = NSDateFormatterShortStyle; + + CPTCalendarFormatter *calendarFormatter = [[CPTCalendarFormatter alloc] initWithDateFormatter:dateFormatter]; + calendarFormatter.referenceDate = refDate; + + CPTCalendarFormatter *newCalendarFormatter = [self archiveRoundTrip:calendarFormatter]; + + XCTAssertEqualObjects(calendarFormatter.dateFormatter.dateFormat, newCalendarFormatter.dateFormatter.dateFormat, @"Date formatter not equal"); + XCTAssertEqualObjects(calendarFormatter.referenceDate, newCalendarFormatter.referenceDate, @"Reference date not equal"); + XCTAssertEqualObjects(calendarFormatter.referenceCalendar, newCalendarFormatter.referenceCalendar, @"Reference calendar not equal"); + XCTAssertEqual(calendarFormatter.referenceCalendarUnit, newCalendarFormatter.referenceCalendarUnit, @"Reference calendar unit not equal"); +} + +@end diff --git a/framework/Source/CPTColor.h b/framework/Source/CPTColor.h index f5872e84f..c16c23978 100644 --- a/framework/Source/CPTColor.h +++ b/framework/Source/CPTColor.h @@ -1,4 +1,4 @@ -@interface CPTColor : NSObject +@interface CPTColor : NSObject @property (nonatomic, readonly, nonnull) CGColorRef cgColor; @property (nonatomic, readonly, getter = isOpaque) BOOL opaque; diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 8ea4e9951..a731a259b 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -447,6 +447,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark NSCopying Methods diff --git a/framework/Source/CPTColorSpace.h b/framework/Source/CPTColorSpace.h index fa6b1ddfb..03a829e5e 100644 --- a/framework/Source/CPTColorSpace.h +++ b/framework/Source/CPTColorSpace.h @@ -1,4 +1,4 @@ -@interface CPTColorSpace : NSObject +@interface CPTColorSpace : NSObject @property (nonatomic, readonly, nullable) CGColorSpaceRef cgColorSpace; diff --git a/framework/Source/CPTColorSpace.m b/framework/Source/CPTColorSpace.m index b6c51d2d6..b5d4937c0 100644 --- a/framework/Source/CPTColorSpace.m +++ b/framework/Source/CPTColorSpace.m @@ -112,4 +112,16 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/CPTColorSpaceTests.m b/framework/Source/CPTColorSpaceTests.m index 93ebc4f08..280cc479d 100644 --- a/framework/Source/CPTColorSpaceTests.m +++ b/framework/Source/CPTColorSpaceTests.m @@ -11,7 +11,7 @@ -(void)testKeyedArchivingRoundTrip { CPTColorSpace *colorSpace = [CPTColorSpace genericRGBSpace]; - CPTColorSpace *newColorSpace = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:colorSpace]]; + CPTColorSpace *newColorSpace = [self archiveRoundTrip:colorSpace]; CFDataRef iccProfile = CGColorSpaceCopyICCProfile(colorSpace.cgColorSpace); CFDataRef newIccProfile = CGColorSpaceCopyICCProfile(newColorSpace.cgColorSpace); diff --git a/framework/Source/CPTColorTests.m b/framework/Source/CPTColorTests.m index 73a1566aa..e2b0840a4 100644 --- a/framework/Source/CPTColorTests.m +++ b/framework/Source/CPTColorTests.m @@ -11,7 +11,7 @@ -(void)testKeyedArchivingRoundTrip { CPTColor *color = [CPTColor redColor]; - CPTColor *newColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:color]]; + CPTColor *newColor = [self archiveRoundTrip:color]; XCTAssertEqualObjects(color, newColor, @"Colors not equal"); } diff --git a/framework/Source/CPTConstraints.h b/framework/Source/CPTConstraints.h index c8a4b89ac..d6bf75bd3 100644 --- a/framework/Source/CPTConstraints.h +++ b/framework/Source/CPTConstraints.h @@ -1,4 +1,4 @@ -@interface CPTConstraints : NSObject +@interface CPTConstraints : NSObject /// @name Factory Methods /// @{ diff --git a/framework/Source/CPTConstraints.m b/framework/Source/CPTConstraints.m index 261148c33..10af5ff6f 100644 --- a/framework/Source/CPTConstraints.m +++ b/framework/Source/CPTConstraints.m @@ -129,6 +129,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end #pragma mark - diff --git a/framework/Source/CPTFill.h b/framework/Source/CPTFill.h index 04a8b44fd..cf50aa7ca 100644 --- a/framework/Source/CPTFill.h +++ b/framework/Source/CPTFill.h @@ -15,7 +15,7 @@ typedef NSArray CPTFillArray; **/ typedef NSMutableArray CPTMutableFillArray; -@interface CPTFill : NSObject +@interface CPTFill : NSObject /// @name Factory Methods /// @{ diff --git a/framework/Source/CPTFill.m b/framework/Source/CPTFill.m index c4c63382a..10b27441c 100644 --- a/framework/Source/CPTFill.m +++ b/framework/Source/CPTFill.m @@ -1,6 +1,7 @@ #import "CPTFill.h" #import "CPTColor.h" +#import "CPTGradient.h" #import "CPTImage.h" #import "CPTPlatformSpecificFunctions.h" #import "_CPTFillColor.h" @@ -104,18 +105,21 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { - id fill = [coder decodeObjectForKey:@"_CPTFillColor.fillColor"]; + id fill = [coder decodeObjectOfClass:[CPTColor class] + forKey:@"_CPTFillColor.fillColor"]; if ( fill ) { return [self initWithColor:fill]; } - id gradient = [coder decodeObjectForKey:@"_CPTFillGradient.fillGradient"]; + id gradient = [coder decodeObjectOfClass:[CPTGradient class] + forKey:@"_CPTFillGradient.fillGradient"]; if ( gradient ) { return [self initWithGradient:gradient]; } - id image = [coder decodeObjectForKey:@"_CPTFillImage.fillImage"]; + id image = [coder decodeObjectOfClass:[CPTImage class] + forKey:@"_CPTFillImage.fillImage"]; if ( image ) { return [self initWithImage:image]; } @@ -125,6 +129,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end #pragma mark - diff --git a/framework/Source/CPTFillTests.m b/framework/Source/CPTFillTests.m index 34491a096..2103e0b2d 100644 --- a/framework/Source/CPTFillTests.m +++ b/framework/Source/CPTFillTests.m @@ -41,7 +41,7 @@ -(void)testKeyedArchivingRoundTripColor { _CPTFillColor *fill = (_CPTFillColor *)[CPTFill fillWithColor:[CPTColor redColor]]; - _CPTFillColor *newFill = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:fill]]; + _CPTFillColor *newFill = [self archiveRoundTrip:fill toClass:[CPTFill class]]; XCTAssertEqualObjects(fill.fillColor, newFill.fillColor, @"Fill with color not equal"); } @@ -50,7 +50,7 @@ -(void)testKeyedArchivingRoundTripGradient { _CPTFillGradient *fill = (_CPTFillGradient *)[CPTFill fillWithGradient:[CPTGradient rainbowGradient]]; - _CPTFillGradient *newFill = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:fill]]; + _CPTFillGradient *newFill = [self archiveRoundTrip:fill toClass:[CPTFill class]]; XCTAssertEqualObjects(fill.fillGradient, newFill.fillGradient, @"Fill with gradient not equal"); } @@ -80,7 +80,7 @@ -(void)testKeyedArchivingRoundTripImage _CPTFillImage *fill = (_CPTFillImage *)[CPTFill fillWithImage:image]; - _CPTFillImage *newFill = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:fill]]; + _CPTFillImage *newFill = [self archiveRoundTrip:fill toClass:[CPTFill class]]; XCTAssertEqualObjects(fill.fillImage, newFill.fillImage, @"Fill with image not equal"); } diff --git a/framework/Source/CPTGradient.h b/framework/Source/CPTGradient.h index 84b839e2d..c096bf189 100644 --- a/framework/Source/CPTGradient.h +++ b/framework/Source/CPTGradient.h @@ -36,7 +36,7 @@ typedef NS_ENUM (NSInteger, CPTGradientType) { @class CPTColorSpace; @class CPTColor; -@interface CPTGradient : NSObject +@interface CPTGradient : NSObject @property (nonatomic, readonly, getter = isOpaque) BOOL opaque; diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 51248e477..7dab267b4 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -187,15 +187,16 @@ -(void)encodeWithCoder:(NSCoder *)coder CPTGradientElement *currentElement = self.elementList; while ( currentElement != NULL ) { - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.red)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.green)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.blue)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->color.alpha)]; - [coder encodeValueOfObjCType:@encode(CGFloat) at:&(currentElement->position)]; + [coder encodeCGFloat:currentElement->color.red forKey:[NSString stringWithFormat:@"red%lu", (unsigned long)count]]; + [coder encodeCGFloat:currentElement->color.green forKey:[NSString stringWithFormat:@"green%lu", (unsigned long)count]]; + [coder encodeCGFloat:currentElement->color.blue forKey:[NSString stringWithFormat:@"blue%lu", (unsigned long)count]]; + [coder encodeCGFloat:currentElement->color.alpha forKey:[NSString stringWithFormat:@"alpha%lu", (unsigned long)count]]; + [coder encodeCGFloat:currentElement->position forKey:[NSString stringWithFormat:@"position%lu", (unsigned long)count]]; count++; currentElement = currentElement->nextElement; } + [coder encodeInteger:(NSInteger)count forKey:@"CPTGradient.elementCount"]; [coder encodeInteger:self.blendingMode forKey:@"CPTGradient.blendingMode"]; [coder encodeCGFloat:self.angle forKey:@"CPTGradient.angle"]; @@ -217,16 +218,15 @@ -(instancetype)initWithCoder:(NSCoder *)coder NSUInteger count = (NSUInteger)[coder decodeIntegerForKey : @"CPTGradient.elementCount"]; - while ( count != 0 ) { + for ( NSUInteger i = 0; i < count; i++ ) { CPTGradientElement newElement; - [coder decodeValueOfObjCType:@encode(CGFloat) at:&(newElement.color.red)]; - [coder decodeValueOfObjCType:@encode(CGFloat) at:&(newElement.color.green)]; - [coder decodeValueOfObjCType:@encode(CGFloat) at:&(newElement.color.blue)]; - [coder decodeValueOfObjCType:@encode(CGFloat) at:&(newElement.color.alpha)]; - [coder decodeValueOfObjCType:@encode(CGFloat) at:&(newElement.position)]; + newElement.color.red = [coder decodeCGFloatForKey:[NSString stringWithFormat:@"red%lu", (unsigned long)i]]; + newElement.color.green = [coder decodeCGFloatForKey:[NSString stringWithFormat:@"green%lu", (unsigned long)i]]; + newElement.color.blue = [coder decodeCGFloatForKey:[NSString stringWithFormat:@"blue%lu", (unsigned long)i]]; + newElement.color.alpha = [coder decodeCGFloatForKey:[NSString stringWithFormat:@"alpha%lu", (unsigned long)i]]; + newElement.position = [coder decodeCGFloatForKey:[NSString stringWithFormat:@"position%lu", (unsigned long)i]]; - count--; [self addElement:&newElement]; } } @@ -235,6 +235,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Factory Methods diff --git a/framework/Source/CPTGradientTests.m b/framework/Source/CPTGradientTests.m index 48052b5eb..12fb1d2e3 100644 --- a/framework/Source/CPTGradientTests.m +++ b/framework/Source/CPTGradientTests.m @@ -11,7 +11,7 @@ -(void)testKeyedArchivingRoundTrip { CPTGradient *gradient = [CPTGradient rainbowGradient]; - CPTGradient *newGradient = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:gradient]]; + CPTGradient *newGradient = [self archiveRoundTrip:gradient]; XCTAssertEqualObjects(gradient, newGradient, @"Gradients not equal"); } diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 46fdbcf52..305e0177c 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -310,10 +310,13 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; - plotAreaFrame = [coder decodeObjectForKey:@"CPTGraph.plotAreaFrame"]; + hostingView = [coder decodeObjectOfClass:[CPTGraphHostingView class] + forKey:@"CPTGraph.hostingView"]; + plotAreaFrame = [coder decodeObjectOfClass:[CPTPlotAreaFrame class] + forKey:@"CPTGraph.plotAreaFrame"]; - CPTPlotArray *plotArray = [coder decodeObjectForKey:@"CPTGraph.plots"]; + CPTPlotArray *plotArray = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTPlot class]]] + forKey:@"CPTGraph.plots"]; if ( plotArray ) { plots = [plotArray mutableCopy]; } @@ -321,7 +324,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder plots = [[NSMutableArray alloc] init]; } - CPTPlotSpaceArray *plotSpaceArray = [coder decodeObjectForKey:@"CPTGraph.plotSpaces"]; + CPTPlotSpaceArray *plotSpaceArray = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTPlotSpace class]]] + forKey:@"CPTGraph.plotSpaces"]; if ( plotSpaceArray ) { plotSpaces = [plotSpaceArray mutableCopy]; } @@ -329,16 +333,22 @@ -(instancetype)initWithCoder:(NSCoder *)coder plotSpaces = [[NSMutableArray alloc] init]; } - title = [[coder decodeObjectForKey:@"CPTGraph.title"] copy]; - attributedTitle = [[coder decodeObjectForKey:@"CPTGraph.attributedTitle"] copy]; - titleTextStyle = [[coder decodeObjectForKey:@"CPTGraph.titleTextStyle"] copy]; + title = [[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTGraph.title"] copy]; + attributedTitle = [[coder decodeObjectOfClass:[NSAttributedString class] + forKey:@"CPTGraph.attributedTitle"] copy]; + titleTextStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTGraph.titleTextStyle"] copy]; titlePlotAreaFrameAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTGraph.titlePlotAreaFrameAnchor"]; titleDisplacement = [coder decodeCPTPointForKey:@"CPTGraph.titleDisplacement"]; - titleAnnotation = [coder decodeObjectForKey:@"CPTGraph.titleAnnotation"]; - legend = [coder decodeObjectForKey:@"CPTGraph.legend"]; - legendAnnotation = [coder decodeObjectForKey:@"CPTGraph.legendAnnotation"]; - legendAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTGraph.legendAnchor"]; - legendDisplacement = [coder decodeCPTPointForKey:@"CPTGraph.legendDisplacement"]; + titleAnnotation = [coder decodeObjectOfClass:[CPTLayerAnnotation class] + forKey:@"CPTGraph.titleAnnotation"]; + legend = [coder decodeObjectOfClass:[CPTLegend class] + forKey:@"CPTGraph.legend"]; + legendAnnotation = [coder decodeObjectOfClass:[CPTLayerAnnotation class] + forKey:@"CPTGraph.legendAnnotation"]; + legendAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTGraph.legendAnchor"]; + legendDisplacement = [coder decodeCPTPointForKey:@"CPTGraph.legendDisplacement"]; inTitleUpdate = NO; } @@ -347,6 +357,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTGridLineGroup.m b/framework/Source/CPTGridLineGroup.m index cc5f18c04..77fbc3547 100644 --- a/framework/Source/CPTGridLineGroup.m +++ b/framework/Source/CPTGridLineGroup.m @@ -82,14 +82,27 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - plotArea = [coder decodeObjectForKey:@"CPTGridLineGroup.plotArea"]; - major = [coder decodeBoolForKey:@"CPTGridLineGroup.major"]; + plotArea = [coder decodeObjectOfClass:[CPTPlotArea class] + forKey:@"CPTGridLineGroup.plotArea"]; + major = [coder decodeBoolForKey:@"CPTGridLineGroup.major"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTGridLines.m b/framework/Source/CPTGridLines.m index f96777129..32d538262 100644 --- a/framework/Source/CPTGridLines.m +++ b/framework/Source/CPTGridLines.m @@ -77,7 +77,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - axis = [coder decodeObjectForKey:@"CPTGridLines.axis"]; + axis = [coder decodeObjectOfClass:[CPTAxis class] + forKey:@"CPTGridLines.axis"]; major = [coder decodeBoolForKey:@"CPTGridLines.major"]; } return self; @@ -85,6 +86,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTImage.h b/framework/Source/CPTImage.h index 23e509fef..bd2d953b7 100644 --- a/framework/Source/CPTImage.h +++ b/framework/Source/CPTImage.h @@ -1,7 +1,7 @@ #import "CPTDefinitions.h" #import "CPTPlatformSpecificDefines.h" -@interface CPTImage : NSObject +@interface CPTImage : NSObject @property (nonatomic, readwrite, copy, nullable) CPTNativeImage *nativeImage; @property (nonatomic, readwrite, assign, nullable) CGImageRef image; diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 209a05ae2..3d11dee1d 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -1,5 +1,6 @@ #import "CPTImage.h" +#import "CPTPlatformSpecificDefines.h" #import "CPTUtilities.h" #import "NSCoderExtensions.h" @@ -215,7 +216,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - nativeImage = [[coder decodeObjectForKey:@"CPTImage.nativeImage"] copy]; + nativeImage = [[coder decodeObjectOfClass:[CPTNativeImage class] + forKey:@"CPTImage.nativeImage"] copy]; image = [coder newCGImageDecodeForKey:@"CPTImage.image"]; scale = [coder decodeCGFloatForKey:@"CPTImage.scale"]; tiled = [coder decodeBoolForKey:@"CPTImage.tiled"]; @@ -230,6 +232,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark NSCopying Methods diff --git a/framework/Source/CPTImageTests.m b/framework/Source/CPTImageTests.m index 652ac8138..b106c54f2 100644 --- a/framework/Source/CPTImageTests.m +++ b/framework/Source/CPTImageTests.m @@ -30,7 +30,7 @@ -(void)testKeyedArchivingRoundTrip CGColorSpaceRelease(colorSpace); CGImageRelease(cgImage); - CPTImage *newImage = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:image]]; + CPTImage *newImage = [self archiveRoundTrip:image]; XCTAssertEqualObjects(image, newImage, @"Images not equal"); } diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 701c11350..e9f0da5c8 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -37,7 +37,7 @@ typedef NSSet CPTSublayerSet; **/ typedef NSMutableSet CPTMutableSublayerSet; -@interface CPTLayer : CALayer +@interface CPTLayer : CALayer /// @name Graph /// @{ diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 1f8b34efb..9ec9acc6b 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -275,9 +275,12 @@ -(instancetype)initWithCoder:(NSCoder *)coder paddingRight = [coder decodeCGFloatForKey:@"CPTLayer.paddingRight"]; paddingBottom = [coder decodeCGFloatForKey:@"CPTLayer.paddingBottom"]; masksToBorder = [coder decodeBoolForKey:@"CPTLayer.masksToBorder"]; - shadow = [[coder decodeObjectForKey:@"CPTLayer.shadow"] copy]; - graph = [coder decodeObjectForKey:@"CPTLayer.graph"]; - identifier = [[coder decodeObjectForKey:@"CPTLayer.identifier"] copy]; + shadow = [[coder decodeObjectOfClass:[CPTShadow class] + forKey:@"CPTLayer.shadow"] copy]; + graph = [coder decodeObjectOfClass:[CPTGraph class] + forKey:@"CPTLayer.graph"]; + identifier = [[coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTLayer.identifier"] copy]; renderingRecursively = NO; outerBorderPath = NULL; @@ -286,6 +289,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Animation diff --git a/framework/Source/CPTLayerAnnotation.h b/framework/Source/CPTLayerAnnotation.h index 4a1b45bbd..f8adeed59 100644 --- a/framework/Source/CPTLayerAnnotation.h +++ b/framework/Source/CPTLayerAnnotation.h @@ -8,7 +8,10 @@ @property (nonatomic, readonly, nullable) cpt_weak CPTLayer *anchorLayer; @property (nonatomic, readwrite, assign) CPTRectAnchor rectAnchor; +/// @name Initialization +/// @{ -(nonnull instancetype)initWithAnchorLayer:(nonnull CPTLayer *)anchorLayer NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +/// @} @end diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index 063ba8f3d..f982f7f22 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -114,11 +114,14 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super init]) ) { - anchorLayer = [coder decodeObjectForKey:@"CPTLayerAnnotation.anchorLayer"]; - xConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.xConstraints"]; - yConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.yConstraints"]; - rectAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTLayerAnnotation.rectAnchor"]; + if ( (self = [super initWithCoder:coder]) ) { + anchorLayer = [coder decodeObjectOfClass:[CPTLayer class] + forKey:@"CPTLayerAnnotation.anchorLayer"]; + xConstraints = [coder decodeObjectOfClass:[CPTConstraints class] + forKey:@"CPTLayerAnnotation.xConstraints"]; + yConstraints = [coder decodeObjectOfClass:[CPTConstraints class] + forKey:@"CPTLayerAnnotation.yConstraints"]; + rectAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTLayerAnnotation.rectAnchor"]; } return self; } @@ -160,6 +163,18 @@ -(void)positionContentLayer /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Constraints diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index ec8e55a66..aecc3fc5f 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -452,32 +452,43 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - plots = [[coder decodeObjectForKey:@"CPTLegend.plots"] mutableCopy]; - legendEntries = [[coder decodeObjectForKey:@"CPTLegend.legendEntries"] mutableCopy]; - layoutChanged = [coder decodeBoolForKey:@"CPTLegend.layoutChanged"]; - textStyle = [[coder decodeObjectForKey:@"CPTLegend.textStyle"] copy]; + plots = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTPlot class]]] + forKey:@"CPTLegend.plots"] mutableCopy]; + legendEntries = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLegendEntry class]]] + forKey:@"CPTLegend.legendEntries"] mutableCopy]; + layoutChanged = [coder decodeBoolForKey:@"CPTLegend.layoutChanged"]; + textStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTLegend.textStyle"] copy]; swatchSize = [coder decodeCPTSizeForKey:@"CPTLegend.swatchSize"]; - swatchBorderLineStyle = [[coder decodeObjectForKey:@"CPTLegend.swatchBorderLineStyle"] copy]; - swatchCornerRadius = [coder decodeCGFloatForKey:@"CPTLegend.swatchCornerRadius"]; - swatchFill = [[coder decodeObjectForKey:@"CPTLegend.swatchFill"] copy]; - entryBorderLineStyle = [[coder decodeObjectForKey:@"CPTLegend.entryBorderLineStyle"] copy]; - entryCornerRadius = [coder decodeCGFloatForKey:@"CPTLegend.entryCornerRadius"]; - entryFill = [[coder decodeObjectForKey:@"CPTLegend.entryFill"] copy]; - entryPaddingLeft = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingLeft"]; - entryPaddingTop = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingTop"]; - entryPaddingRight = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingRight"]; - entryPaddingBottom = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingBottom"]; - numberOfRows = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfRows"]; - numberOfColumns = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfColumns"]; - equalRows = [coder decodeBoolForKey:@"CPTLegend.equalRows"]; - equalColumns = [coder decodeBoolForKey:@"CPTLegend.equalColumns"]; - rowHeights = [[coder decodeObjectForKey:@"CPTLegend.rowHeights"] copy]; - rowHeightsThatFit = [coder decodeObjectForKey:@"CPTLegend.rowHeightsThatFit"]; - columnWidths = [[coder decodeObjectForKey:@"CPTLegend.columnWidths"] copy]; - columnWidthsThatFit = [coder decodeObjectForKey:@"CPTLegend.columnWidthsThatFit"]; - columnMargin = [coder decodeCGFloatForKey:@"CPTLegend.columnMargin"]; - rowMargin = [coder decodeCGFloatForKey:@"CPTLegend.rowMargin"]; - titleOffset = [coder decodeCGFloatForKey:@"CPTLegend.titleOffset"]; + swatchBorderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTLegend.swatchBorderLineStyle"] copy]; + swatchCornerRadius = [coder decodeCGFloatForKey:@"CPTLegend.swatchCornerRadius"]; + swatchFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTLegend.swatchFill"] copy]; + entryBorderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTLegend.entryBorderLineStyle"] copy]; + entryCornerRadius = [coder decodeCGFloatForKey:@"CPTLegend.entryCornerRadius"]; + entryFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTLegend.entryFill"] copy]; + entryPaddingLeft = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingLeft"]; + entryPaddingTop = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingTop"]; + entryPaddingRight = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingRight"]; + entryPaddingBottom = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingBottom"]; + numberOfRows = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfRows"]; + numberOfColumns = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfColumns"]; + equalRows = [coder decodeBoolForKey:@"CPTLegend.equalRows"]; + equalColumns = [coder decodeBoolForKey:@"CPTLegend.equalColumns"]; + rowHeights = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTLegend.rowHeights"] copy]; + rowHeightsThatFit = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTLegend.rowHeightsThatFit"]; + columnWidths = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTLegend.columnWidths"] copy]; + columnWidthsThatFit = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTLegend.columnWidthsThatFit"]; + columnMargin = [coder decodeCGFloatForKey:@"CPTLegend.columnMargin"]; + rowMargin = [coder decodeCGFloatForKey:@"CPTLegend.rowMargin"]; + titleOffset = [coder decodeCGFloatForKey:@"CPTLegend.titleOffset"]; pointingDeviceDownEntry = nil; } @@ -486,6 +497,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index 661e00936..6ca51f48f 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -16,7 +16,7 @@ typedef NSArray CPTLegendEntryArray; **/ typedef NSMutableArray CPTMutableLegendEntryArray; -@interface CPTLegendEntry : NSObject +@interface CPTLegendEntry : NSObject /// @name Plot Info /// @{ diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index df18d41fd..74302a308 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -110,17 +110,31 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - plot = [coder decodeObjectForKey:@"CPTLegendEntry.plot"]; + plot = [coder decodeObjectOfClass:[CPTPlot class] + forKey:@"CPTLegendEntry.plot"]; index = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.index"]; row = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.row"]; column = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.column"]; - textStyle = [coder decodeObjectForKey:@"CPTLegendEntry.textStyle"]; + textStyle = [coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTLegendEntry.textStyle"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTLimitBand.h b/framework/Source/CPTLimitBand.h index 143917626..81cfade5a 100644 --- a/framework/Source/CPTLimitBand.h +++ b/framework/Source/CPTLimitBand.h @@ -14,7 +14,7 @@ typedef NSArray CPTLimitBandArray; **/ typedef NSMutableArray CPTMutableLimitBandArray; -@interface CPTLimitBand : NSObject +@interface CPTLimitBand : NSObject @property (nonatomic, readwrite, strong, nullable) CPTPlotRange *range; @property (nonatomic, readwrite, strong, nullable) CPTFill *fill; diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index 4fd4ecba5..18e89145b 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -92,12 +92,26 @@ -(void)encodeWithCoder:(NSCoder *)encoder -(instancetype)initWithCoder:(NSCoder *)decoder { if ( (self = [super init]) ) { - range = [decoder decodeObjectForKey:@"CPTLimitBand.range"]; - fill = [decoder decodeObjectForKey:@"CPTLimitBand.fill"]; + range = [decoder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTLimitBand.range"]; + fill = [decoder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTLimitBand.fill"]; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Description diff --git a/framework/Source/CPTLineCap.h b/framework/Source/CPTLineCap.h index b1ab81115..e6c0605ac 100644 --- a/framework/Source/CPTLineCap.h +++ b/framework/Source/CPTLineCap.h @@ -22,7 +22,7 @@ typedef NS_ENUM (NSInteger, CPTLineCapType) { CPTLineCapTypeCustom ///< Custom line cap. }; -@interface CPTLineCap : NSObject +@interface CPTLineCap : NSObject @property (nonatomic, readwrite, assign) CGSize size; @property (nonatomic, readwrite, assign) CPTLineCapType lineCapType; diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index 2c36f0bde..a954e0c0e 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -125,10 +125,12 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - size = [coder decodeCPTSizeForKey:@"CPTLineCap.size"]; - lineCapType = (CPTLineCapType)[coder decodeIntegerForKey : @"CPTLineCap.lineCapType"]; - lineStyle = [coder decodeObjectForKey:@"CPTLineCap.lineStyle"]; - fill = [coder decodeObjectForKey:@"CPTLineCap.fill"]; + size = [coder decodeCPTSizeForKey:@"CPTLineCap.size"]; + lineCapType = (CPTLineCapType)[coder decodeIntegerForKey : @"CPTLineCap.lineCapType"]; + lineStyle = [coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTLineCap.lineStyle"]; + fill = [coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTLineCap.fill"]; customLineCapPath = [coder newCGPathDecodeForKey:@"CPTLineCap.customLineCapPath"]; usesEvenOddClipRule = [coder decodeBoolForKey:@"CPTLineCap.usesEvenOddClipRule"]; @@ -139,6 +141,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/CPTLineStyle.h b/framework/Source/CPTLineStyle.h index c0ac10bd1..2b5c687b7 100644 --- a/framework/Source/CPTLineStyle.h +++ b/framework/Source/CPTLineStyle.h @@ -17,7 +17,7 @@ typedef NSArray CPTLineStyleArray; **/ typedef NSMutableArray CPTMutableLineStyleArray; -@interface CPTLineStyle : NSObject +@interface CPTLineStyle : NSObject @property (nonatomic, readonly) CGLineCap lineCap; @property (nonatomic, readonly) CGLineJoin lineJoin; diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index 465127d19..74f52e92f 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -191,21 +191,37 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - lineCap = (CGLineCap)[coder decodeIntForKey : @"CPTLineStyle.lineCap"]; - lineJoin = (CGLineJoin)[coder decodeIntForKey : @"CPTLineStyle.lineJoin"]; - miterLimit = [coder decodeCGFloatForKey:@"CPTLineStyle.miterLimit"]; - lineWidth = [coder decodeCGFloatForKey:@"CPTLineStyle.lineWidth"]; - dashPattern = [coder decodeObjectForKey:@"CPTLineStyle.dashPattern"]; + lineCap = (CGLineCap)[coder decodeIntForKey : @"CPTLineStyle.lineCap"]; + lineJoin = (CGLineJoin)[coder decodeIntForKey : @"CPTLineStyle.lineJoin"]; + miterLimit = [coder decodeCGFloatForKey:@"CPTLineStyle.miterLimit"]; + lineWidth = [coder decodeCGFloatForKey:@"CPTLineStyle.lineWidth"]; + dashPattern = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTLineStyle.dashPattern"]; patternPhase = [coder decodeCGFloatForKey:@"CPTLineStyle.patternPhase"]; - lineColor = [coder decodeObjectForKey:@"CPTLineStyle.lineColor"]; - lineFill = [coder decodeObjectForKey:@"CPTLineStyle.lineFill"]; - lineGradient = [coder decodeObjectForKey:@"CPTLineStyle.lineGradient"]; + lineColor = [coder decodeObjectOfClass:[CPTColor class] + forKey:@"CPTLineStyle.lineColor"]; + lineFill = [coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTLineStyle.lineFill"]; + lineGradient = [coder decodeObjectOfClass:[CPTGradient class] + forKey:@"CPTLineStyle.lineGradient"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTLineStyleTests.m b/framework/Source/CPTLineStyleTests.m index ec90f91cc..89772788a 100644 --- a/framework/Source/CPTLineStyleTests.m +++ b/framework/Source/CPTLineStyleTests.m @@ -11,7 +11,7 @@ -(void)testKeyedArchivingRoundTrip { CPTLineStyle *lineStyle = [CPTLineStyle lineStyle]; - CPTLineStyle *newLineStyle = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:lineStyle]]; + CPTLineStyle *newLineStyle = [self archiveRoundTrip:lineStyle]; XCTAssertEqual(newLineStyle.lineCap, lineStyle.lineCap, @"Line cap not equal"); XCTAssertEqual(newLineStyle.lineJoin, lineStyle.lineJoin, @"Line join not equal"); diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index 774419104..09ebdbc58 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -116,7 +116,7 @@ -(void)testArchivingRoundTrip dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - CPTMutableNumericData *nd2 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:nd]]; + CPTMutableNumericData *nd2 = [self archiveRoundTrip:nd]; XCTAssertTrue([nd.data isEqualToData:nd2.data], @"equal data"); diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index 99fe3ead8..d0dbcb3f7 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -1,7 +1,7 @@ #import "CPTDefinitions.h" #import "CPTNumericDataType.h" -@interface CPTNumericData : NSObject +@interface CPTNumericData : NSObject /// @name Data Buffer /// @{ diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 7ed88bee1..df444d407 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -1135,7 +1135,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @endcond #pragma mark - -#pragma mark NSCoding Methods +#pragma mark NSCopying Methods /// @cond @@ -1150,7 +1150,7 @@ -(id)copyWithZone:(NSZone *)zone /// @endcond #pragma mark - -#pragma mark NSCopying Methods +#pragma mark NSCoding Methods /// @cond @@ -1181,14 +1181,17 @@ -(instancetype)initWithCoder:(NSCoder *)decoder CPTNumberArray *shapeArray; CPTDataOrder order; - newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; + newData = [decoder decodeObjectOfClass:[NSData class] + forKey:@"CPTNumericData.data"]; newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey: @"CPTNumericData.dataType.dataTypeFormat"], (size_t)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.sampleBytes"], (CFByteOrder)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.byteOrder"] ); - shapeArray = [decoder decodeObjectForKey:@"CPTNumericData.shape"]; - order = (CPTDataOrder)[decoder decodeIntegerForKey : @"CPTNumericData.dataOrder"]; + shapeArray = [decoder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTNumericData.shape"]; + + order = (CPTDataOrder)[decoder decodeIntegerForKey : @"CPTNumericData.dataOrder"]; [self commonInitWithData:newData dataType:newDataType shape:shapeArray dataOrder:order]; } @@ -1196,4 +1199,16 @@ -(instancetype)initWithCoder:(NSCoder *)decoder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 37231e0b3..654334db0 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -116,7 +116,7 @@ -(void)testArchivingRoundTrip dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - CPTNumericData *nd2 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:nd]]; + CPTNumericData *nd2 = [self archiveRoundTrip:nd]; XCTAssertTrue([nd.data isEqualToData:nd2.data], @"equal data"); @@ -143,7 +143,7 @@ -(void)testKeyedArchivingRoundTrip dataType:CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ) shape:nil]; - CPTNumericData *nd2 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:nd]]; + CPTNumericData *nd2 = [self archiveRoundTrip:nd]; XCTAssertTrue([nd.data isEqualToData:nd2.data], @"equal data"); diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index c4e1c58a5..718cfaecd 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -277,14 +277,16 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - pieRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieRadius"]; - pieInnerRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieInnerRadius"]; - startAngle = [coder decodeCGFloatForKey:@"CPTPieChart.startAngle"]; - endAngle = [coder decodeCGFloatForKey:@"CPTPieChart.endAngle"]; - sliceDirection = (CPTPieDirection)[coder decodeIntegerForKey : @"CPTPieChart.sliceDirection"]; - centerAnchor = [coder decodeCPTPointForKey:@"CPTPieChart.centerAnchor"]; - borderLineStyle = [[coder decodeObjectForKey:@"CPTPieChart.borderLineStyle"] copy]; - overlayFill = [[coder decodeObjectForKey:@"CPTPieChart.overlayFill"] copy]; + pieRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieRadius"]; + pieInnerRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieInnerRadius"]; + startAngle = [coder decodeCGFloatForKey:@"CPTPieChart.startAngle"]; + endAngle = [coder decodeCGFloatForKey:@"CPTPieChart.endAngle"]; + sliceDirection = (CPTPieDirection)[coder decodeIntegerForKey : @"CPTPieChart.sliceDirection"]; + centerAnchor = [coder decodeCPTPointForKey:@"CPTPieChart.centerAnchor"]; + borderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTPieChart.borderLineStyle"] copy]; + overlayFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTPieChart.overlayFill"] copy]; labelRotationRelativeToRadius = [coder decodeBoolForKey:@"CPTPieChart.labelRotationRelativeToRadius"]; pointingDeviceDownIndex = NSNotFound; } @@ -293,6 +295,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Data Loading diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 62e36fc70..4e2905df8 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -405,29 +405,39 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - dataSource = [coder decodeObjectForKey:@"CPTPlot.dataSource"]; - title = [[coder decodeObjectForKey:@"CPTPlot.title"] copy]; - attributedTitle = [[coder decodeObjectForKey:@"CPTPlot.attributedTitle"] copy]; - plotSpace = [coder decodeObjectForKey:@"CPTPlot.plotSpace"]; - cachePrecision = (CPTPlotCachePrecision)[coder decodeIntegerForKey : @"CPTPlot.cachePrecision"]; - needsRelabel = [coder decodeBoolForKey:@"CPTPlot.needsRelabel"]; - adjustLabelAnchors = [coder decodeBoolForKey:@"CPTPlot.adjustLabelAnchors"]; - showLabels = [coder decodeBoolForKey:@"CPTPlot.showLabels"]; - labelOffset = [coder decodeCGFloatForKey:@"CPTPlot.labelOffset"]; - labelRotation = [coder decodeCGFloatForKey:@"CPTPlot.labelRotation"]; - labelField = (NSUInteger)[coder decodeIntegerForKey : @"CPTPlot.labelField"]; - labelTextStyle = [[coder decodeObjectForKey:@"CPTPlot.labelTextStyle"] copy]; - labelFormatter = [coder decodeObjectForKey:@"CPTPlot.labelFormatter"]; - labelShadow = [coder decodeObjectForKey:@"CPTPlot.labelShadow"]; - labelIndexRange = [[coder decodeObjectForKey:@"CPTPlot.labelIndexRange"] rangeValue]; - labelAnnotations = [[coder decodeObjectForKey:@"CPTPlot.labelAnnotations"] mutableCopy]; + dataSource = [coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTPlot.dataSource"]; + title = [[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTPlot.title"] copy]; + attributedTitle = [[coder decodeObjectOfClass:[NSAttributedString class] + forKey:@"CPTPlot.attributedTitle"] copy]; + plotSpace = [coder decodeObjectOfClass:[CPTPlotSpace class] + forKey:@"CPTPlot.plotSpace"]; + cachePrecision = (CPTPlotCachePrecision)[coder decodeIntegerForKey : @"CPTPlot.cachePrecision"]; + needsRelabel = [coder decodeBoolForKey:@"CPTPlot.needsRelabel"]; + adjustLabelAnchors = [coder decodeBoolForKey:@"CPTPlot.adjustLabelAnchors"]; + showLabels = [coder decodeBoolForKey:@"CPTPlot.showLabels"]; + labelOffset = [coder decodeCGFloatForKey:@"CPTPlot.labelOffset"]; + labelRotation = [coder decodeCGFloatForKey:@"CPTPlot.labelRotation"]; + labelField = (NSUInteger)[coder decodeIntegerForKey : @"CPTPlot.labelField"]; + labelTextStyle = [[coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTPlot.labelTextStyle"] copy]; + labelFormatter = [coder decodeObjectOfClass:[NSFormatter class] + forKey:@"CPTPlot.labelFormatter"]; + labelShadow = [coder decodeObjectOfClass:[CPTShadow class] + forKey:@"CPTPlot.labelShadow"]; + labelIndexRange = [[coder decodeObjectOfClass:[NSValue class] + forKey:@"CPTPlot.labelIndexRange"] rangeValue]; + labelAnnotations = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTAnnotation class]]] + forKey:@"CPTPlot.labelAnnotations"] mutableCopy]; alignsPointsToPixels = [coder decodeBoolForKey:@"CPTPlot.alignsPointsToPixels"]; drawLegendSwatchDecoration = [coder decodeBoolForKey:@"CPTPlot.drawLegendSwatchDecoration"]; // support old archives if ( [coder containsValueForKey:@"CPTPlot.identifier"] ) { - self.identifier = [coder decodeObjectForKey:@"CPTPlot.identifier"]; + self.identifier = [coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTPlot.identifier"]; } // init other properties @@ -443,6 +453,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Bindings diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 8c7edcad1..f25af1e04 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -239,14 +239,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - minorGridLineGroup = [coder decodeObjectForKey:@"CPTPlotArea.minorGridLineGroup"]; - majorGridLineGroup = [coder decodeObjectForKey:@"CPTPlotArea.majorGridLineGroup"]; - axisSet = [coder decodeObjectForKey:@"CPTPlotArea.axisSet"]; - plotGroup = [coder decodeObjectForKey:@"CPTPlotArea.plotGroup"]; - axisLabelGroup = [coder decodeObjectForKey:@"CPTPlotArea.axisLabelGroup"]; - axisTitleGroup = [coder decodeObjectForKey:@"CPTPlotArea.axisTitleGroup"]; - fill = [[coder decodeObjectForKey:@"CPTPlotArea.fill"] copy]; - topDownLayerOrder = [coder decodeObjectForKey:@"CPTPlotArea.topDownLayerOrder"]; + minorGridLineGroup = [coder decodeObjectOfClass:[CPTGridLineGroup class] + forKey:@"CPTPlotArea.minorGridLineGroup"]; + majorGridLineGroup = [coder decodeObjectOfClass:[CPTGridLineGroup class] + forKey:@"CPTPlotArea.majorGridLineGroup"]; + axisSet = [coder decodeObjectOfClass:[CPTAxisSet class] + forKey:@"CPTPlotArea.axisSet"]; + plotGroup = [coder decodeObjectOfClass:[CPTPlotGroup class] + forKey:@"CPTPlotArea.plotGroup"]; + axisLabelGroup = [coder decodeObjectOfClass:[CPTAxisLabelGroup class] + forKey:@"CPTPlotArea.axisLabelGroup"]; + axisTitleGroup = [coder decodeObjectOfClass:[CPTAxisLabelGroup class] + forKey:@"CPTPlotArea.axisTitleGroup"]; + fill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTPlotArea.fill"] copy]; + topDownLayerOrder = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTPlotArea.topDownLayerOrder"]; bottomUpLayerOrder = malloc( kCPTNumberOfLayers * sizeof(CPTGraphLayerType) ); [self updateLayerOrder]; @@ -262,6 +270,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTPlotAreaFrame.m b/framework/Source/CPTPlotAreaFrame.m index 244b6d442..7a29a3ef3 100644 --- a/framework/Source/CPTPlotAreaFrame.m +++ b/framework/Source/CPTPlotAreaFrame.m @@ -99,13 +99,26 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - plotArea = [coder decodeObjectForKey:@"CPTPlotAreaFrame.plotArea"]; + plotArea = [coder decodeObjectOfClass:[CPTPlotArea class] + forKey:@"CPTPlotAreaFrame.plotArea"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Event Handling diff --git a/framework/Source/CPTPlotGroup.m b/framework/Source/CPTPlotGroup.m index d7d7bc5db..fef512b86 100644 --- a/framework/Source/CPTPlotGroup.m +++ b/framework/Source/CPTPlotGroup.m @@ -17,7 +17,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super initWithCoder:coder]) ) { // support old archives if ( [coder containsValueForKey:@"CPTPlotGroup.identifier"] ) { - self.identifier = [coder decodeObjectForKey:@"CPTPlotGroup.identifier"]; + self.identifier = [coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTPlotGroup.identifier"]; } } return self; @@ -25,6 +26,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Organizing Plots diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index 284750f64..a027f417a 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -23,7 +23,7 @@ typedef NSArray CPTPlotRangeArray; **/ typedef NSMutableArray CPTMutablePlotRangeArray; -@interface CPTPlotRange : NSObject +@interface CPTPlotRange : NSObject /// @name Range Limits /// @{ diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index a1540844b..79d0966d6 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -412,6 +412,18 @@ -(instancetype)initWithCoder:(NSCoder *)decoder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Checking Containership diff --git a/framework/Source/CPTPlotRangeTests.m b/framework/Source/CPTPlotRangeTests.m index 304405f39..0701a3d48 100644 --- a/framework/Source/CPTPlotRangeTests.m +++ b/framework/Source/CPTPlotRangeTests.m @@ -408,7 +408,7 @@ -(void)testCompareToDoubleNegative -(void)testKeyedArchivingRoundTrip { - CPTPlotRange *newRange = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:self.plotRange]]; + CPTPlotRange *newRange = [self archiveRoundTrip:self.plotRange]; XCTAssertTrue([self.plotRange isEqualToRange:newRange], @"Ranges equal"); } diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index ecd1a7502..d3b3eb118 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -165,7 +165,7 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> CPTMutablePlotSpaceArray; #pragma mark - -@interface CPTPlotSpace : NSObject +@interface CPTPlotSpace : NSObject @property (nonatomic, readwrite, copy, nullable) id identifier; @property (nonatomic, readwrite) BOOL allowsUserInteraction; diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 5645e6803..045cd0791 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -1,5 +1,6 @@ #import "CPTPlotSpace.h" +#import "CPTGraph.h" #import "CPTMutablePlotRange.h" #import "CPTUtilities.h" @@ -143,17 +144,33 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - graph = [coder decodeObjectForKey:@"CPTPlotSpace.graph"]; - identifier = [[coder decodeObjectForKey:@"CPTPlotSpace.identifier"] copy]; - delegate = [coder decodeObjectForKey:@"CPTPlotSpace.delegate"]; + graph = [coder decodeObjectOfClass:[CPTGraph class] + forKey:@"CPTPlotSpace.graph"]; + identifier = [[coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTPlotSpace.identifier"] copy]; + delegate = [coder decodeObjectOfClass:[NSObject class] + forKey:@"CPTPlotSpace.delegate"]; allowsUserInteraction = [coder decodeBoolForKey:@"CPTPlotSpace.allowsUserInteraction"]; - categoryNames = [[coder decodeObjectForKey:@"CPTPlotSpace.categoryNames"] mutableCopy]; + categoryNames = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSDictionary class], [NSString class], [NSNumber class]]] + forKey:@"CPTPlotSpace.categoryNames"] mutableCopy]; isDragging = NO; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Categorical Data diff --git a/framework/Source/CPTPlotSpaceAnnotation.h b/framework/Source/CPTPlotSpaceAnnotation.h index 6e6f9cf88..5184afae0 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.h +++ b/framework/Source/CPTPlotSpaceAnnotation.h @@ -7,7 +7,10 @@ @property (nonatomic, readwrite, copy, nullable) CPTNumberArray *anchorPlotPoint; @property (nonatomic, readonly, nonnull) CPTPlotSpace *plotSpace; +/// @name Initialization +/// @{ -(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable CPTNumberArray *)plotPoint NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +/// @} @end diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index c684ba0d6..ecf81ca81 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -112,10 +112,12 @@ -(void)encodeWithCoder:(NSCoder *)coder */ -(instancetype)initWithCoder:(NSCoder *)coder { - if ( (self = [super init]) ) { - anchorPlotPoint = [[coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.anchorPlotPoint"] copy]; + if ( (self = [super initWithCoder:coder]) ) { + anchorPlotPoint = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [NSNumber class]]] + forKey:@"CPTPlotSpaceAnnotation.anchorPlotPoint"] copy]; - CPTPlotSpace *thePlotSpace = [coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.plotSpace"]; + CPTPlotSpace *thePlotSpace = [coder decodeObjectOfClass:[CPTPlotSpace class] + forKey:@"CPTPlotSpaceAnnotation.plotSpace"]; if ( thePlotSpace ) { plotSpace = thePlotSpace; } @@ -123,6 +125,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Layout diff --git a/framework/Source/CPTPlotSpaceTests.m b/framework/Source/CPTPlotSpaceTests.m index e10faf39f..226617ec5 100644 --- a/framework/Source/CPTPlotSpaceTests.m +++ b/framework/Source/CPTPlotSpaceTests.m @@ -32,7 +32,7 @@ -(void)testKeyedArchivingRoundTrip plotSpace.identifier = @"test plot space"; - CPTPlotSpace *newPlotSpace = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:plotSpace]]; + CPTPlotSpace *newPlotSpace = [self archiveRoundTrip:plotSpace]; XCTAssertEqualObjects(plotSpace.identifier, newPlotSpace.identifier, @"identifier not equal"); XCTAssertEqual(plotSpace.allowsUserInteraction, newPlotSpace.allowsUserInteraction, @"allowsUserInteraction not equal"); diff --git a/framework/Source/CPTPlotSymbol.h b/framework/Source/CPTPlotSymbol.h index 5b6e88128..36ca6d399 100644 --- a/framework/Source/CPTPlotSymbol.h +++ b/framework/Source/CPTPlotSymbol.h @@ -34,7 +34,7 @@ typedef NSArray CPTPlotSymbolArray; **/ typedef NSMutableArray CPTMutablePlotSymbolArray; -@interface CPTPlotSymbol : NSObject +@interface CPTPlotSymbol : NSObject @property (nonatomic, readwrite, assign) CGPoint anchorPoint; @property (nonatomic, readwrite, assign) CGSize size; diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index f818f1d88..eff60a191 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -152,12 +152,15 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - anchorPoint = [coder decodeCPTPointForKey:@"CPTPlotSymbol.anchorPoint"]; - size = [coder decodeCPTSizeForKey:@"CPTPlotSymbol.size"]; - symbolType = (CPTPlotSymbolType)[coder decodeIntegerForKey : @"CPTPlotSymbol.symbolType"]; - lineStyle = [coder decodeObjectForKey:@"CPTPlotSymbol.lineStyle"]; - fill = [coder decodeObjectForKey:@"CPTPlotSymbol.fill"]; - shadow = [[coder decodeObjectForKey:@"CPTPlotSymbol.shadow"] copy]; + anchorPoint = [coder decodeCPTPointForKey:@"CPTPlotSymbol.anchorPoint"]; + size = [coder decodeCPTSizeForKey:@"CPTPlotSymbol.size"]; + symbolType = (CPTPlotSymbolType)[coder decodeIntegerForKey : @"CPTPlotSymbol.symbolType"]; + lineStyle = [coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTPlotSymbol.lineStyle"]; + fill = [coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTPlotSymbol.fill"]; + shadow = [[coder decodeObjectOfClass:[CPTShadow class] + forKey:@"CPTPlotSymbol.shadow"] copy]; customSymbolPath = [coder newCGPathDecodeForKey:@"CPTPlotSymbol.customSymbolPath"]; usesEvenOddClipRule = [coder decodeBoolForKey:@"CPTPlotSymbol.usesEvenOddClipRule"]; @@ -170,6 +173,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 1c05f6710..82ae7d736 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -225,12 +225,15 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - barLineStyle = [[coder decodeObjectForKey:@"CPTRangePlot.barLineStyle"] copy]; - barWidth = [coder decodeCGFloatForKey:@"CPTRangePlot.barWidth"]; - gapHeight = [coder decodeCGFloatForKey:@"CPTRangePlot.gapHeight"]; - gapWidth = [coder decodeCGFloatForKey:@"CPTRangePlot.gapWidth"]; - areaFill = [[coder decodeObjectForKey:@"CPTRangePlot.areaFill"] copy]; - areaBorderLineStyle = [[coder decodeObjectForKey:@"CPTRangePlot.areaBorderLineStyle"] copy]; + barLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTRangePlot.barLineStyle"] copy]; + barWidth = [coder decodeCGFloatForKey:@"CPTRangePlot.barWidth"]; + gapHeight = [coder decodeCGFloatForKey:@"CPTRangePlot.gapHeight"]; + gapWidth = [coder decodeCGFloatForKey:@"CPTRangePlot.gapWidth"]; + areaFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTRangePlot.areaFill"] copy]; + areaBorderLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTRangePlot.areaBorderLineStyle"] copy]; pointingDeviceDownIndex = NSNotFound; } @@ -239,6 +242,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Determining Which Points to Draw diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index f3e445d13..4c323de05 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -296,15 +296,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey : @"CPTScatterPlot.interpolation"]; - histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey : @"CPTScatterPlot.histogramOption"]; - dataLineStyle = [[coder decodeObjectForKey:@"CPTScatterPlot.dataLineStyle"] copy]; - plotSymbol = [[coder decodeObjectForKey:@"CPTScatterPlot.plotSymbol"] copy]; - areaFill = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill"] copy]; - areaFill2 = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill2"] copy]; - mutableAreaFillBands = [[coder decodeObjectForKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; - areaBaseValue = [coder decodeObjectForKey:@"CPTScatterPlot.areaBaseValue"]; - areaBaseValue2 = [coder decodeObjectForKey:@"CPTScatterPlot.areaBaseValue2"]; + interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey : @"CPTScatterPlot.interpolation"]; + histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey : @"CPTScatterPlot.histogramOption"]; + dataLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTScatterPlot.dataLineStyle"] copy]; + plotSymbol = [[coder decodeObjectOfClass:[CPTPlotSymbol class] + forKey:@"CPTScatterPlot.plotSymbol"] copy]; + areaFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTScatterPlot.areaFill"] copy]; + areaFill2 = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTScatterPlot.areaFill2"] copy]; + mutableAreaFillBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] + forKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; + areaBaseValue = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTScatterPlot.areaBaseValue"]; + areaBaseValue2 = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTScatterPlot.areaBaseValue2"]; plotSymbolMarginForHitDetection = [coder decodeCGFloatForKey:@"CPTScatterPlot.plotSymbolMarginForHitDetection"]; plotLineMarginForHitDetection = [coder decodeCGFloatForKey:@"CPTScatterPlot.plotLineMarginForHitDetection"]; allowSimultaneousSymbolAndPlotSelection = [coder decodeBoolForKey:@"CPTScatterPlot.allowSimultaneousSymbolAndPlotSelection"]; @@ -316,6 +323,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Data Loading diff --git a/framework/Source/CPTShadow.h b/framework/Source/CPTShadow.h index f07db0871..758ba528a 100644 --- a/framework/Source/CPTShadow.h +++ b/framework/Source/CPTShadow.h @@ -1,6 +1,6 @@ @class CPTColor; -@interface CPTShadow : NSObject +@interface CPTShadow : NSObject @property (nonatomic, readonly) CGSize shadowOffset; @property (nonatomic, readonly) CGFloat shadowBlurRadius; diff --git a/framework/Source/CPTShadow.m b/framework/Source/CPTShadow.m index f3426df6f..541747541 100644 --- a/framework/Source/CPTShadow.m +++ b/framework/Source/CPTShadow.m @@ -97,13 +97,26 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super init]) ) { shadowOffset = [coder decodeCPTSizeForKey:@"CPTShadow.shadowOffset"]; shadowBlurRadius = [coder decodeCGFloatForKey:@"CPTShadow.shadowBlurRadius"]; - shadowColor = [coder decodeObjectForKey:@"CPTShadow.shadowColor"]; + shadowColor = [coder decodeObjectOfClass:[CPTColor class] + forKey:@"CPTShadow.shadowColor"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/CPTTestCase.h b/framework/Source/CPTTestCase.h index 5be665d34..b87b0c191 100644 --- a/framework/Source/CPTTestCase.h +++ b/framework/Source/CPTTestCase.h @@ -2,4 +2,7 @@ @interface CPTTestCase : XCTestCase +-(nullable id)archiveRoundTrip:(nonnull id)object toClass:(nonnull Class)archiveClass; +-(nullable id)archiveRoundTrip:(nonnull id)object; + @end diff --git a/framework/Source/CPTTestCase.m b/framework/Source/CPTTestCase.m index d1fffb5c9..9ad27ca63 100644 --- a/framework/Source/CPTTestCase.m +++ b/framework/Source/CPTTestCase.m @@ -2,4 +2,28 @@ @implementation CPTTestCase +-(id)archiveRoundTrip:(id)object +{ + return [self archiveRoundTrip:object toClass:[object class]]; +} + +-(nullable id)archiveRoundTrip:(nonnull id)object toClass:(Class)archiveClass +{ + const BOOL secure = ![archiveClass isSubclassOfClass:[NSNumberFormatter class]]; + + NSMutableData *archiveData = [[NSMutableData alloc] init]; + + NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiveData]; + + archiver.requiresSecureCoding = secure; + + [archiver encodeObject:object forKey:@"test"]; + [archiver finishEncoding]; + + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:archiveData]; + unarchiver.requiresSecureCoding = secure; + + return [unarchiver decodeObjectOfClass:archiveClass forKey:@"test"]; +} + @end diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index 6c01d5e71..22f6307bc 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -168,9 +168,12 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - textStyle = [coder decodeObjectForKey:@"CPTTextLayer.textStyle"]; - text = [[coder decodeObjectForKey:@"CPTTextLayer.text"] copy]; - attributedText = [[coder decodeObjectForKey:@"CPTTextLayer.attributedText"] copy]; + textStyle = [coder decodeObjectOfClass:[CPTTextStyle class] + forKey:@"CPTTextLayer.textStyle"]; + text = [[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTTextLayer.text"] copy]; + attributedText = [[coder decodeObjectOfClass:[NSAttributedString class] + forKey:@"CPTTextLayer.attributedText"] copy]; inTextUpdate = NO; } @@ -179,6 +182,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Accessors diff --git a/framework/Source/CPTTextStyle.h b/framework/Source/CPTTextStyle.h index cb4ec09a4..b9163364c 100644 --- a/framework/Source/CPTTextStyle.h +++ b/framework/Source/CPTTextStyle.h @@ -14,7 +14,7 @@ typedef NSArray CPTTextStyleArray; **/ typedef NSMutableArray CPTMutableTextStyleArray; -@interface CPTTextStyle : NSObject +@interface CPTTextStyle : NSObject @property (readonly, copy, nonatomic, nullable) NSString *fontName; @property (readonly, nonatomic) CGFloat fontSize; diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index 1f27e3307..248732165 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -130,9 +130,11 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - fontName = [[coder decodeObjectForKey:@"CPTTextStyle.fontName"] copy]; - fontSize = [coder decodeCGFloatForKey:@"CPTTextStyle.fontSize"]; - color = [[coder decodeObjectForKey:@"CPTTextStyle.color"] copy]; + fontName = [[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTTextStyle.fontName"] copy]; + fontSize = [coder decodeCGFloatForKey:@"CPTTextStyle.fontSize"]; + color = [[coder decodeObjectOfClass:[CPTColor class] + forKey:@"CPTTextStyle.color"] copy]; textAlignment = (CPTTextAlignment)[coder decodeIntegerForKey : @"CPTTextStyle.textAlignment"]; lineBreakMode = (NSLineBreakMode)[coder decodeIntegerForKey : @"CPTTextStyle.lineBreakMode"]; } @@ -141,6 +143,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark NSCopying Methods diff --git a/framework/Source/CPTTextStyleTests.m b/framework/Source/CPTTextStyleTests.m index d2df4a71a..5e21ddcf7 100644 --- a/framework/Source/CPTTextStyleTests.m +++ b/framework/Source/CPTTextStyleTests.m @@ -22,7 +22,7 @@ -(void)testKeyedArchivingRoundTrip { CPTTextStyle *textStyle = [CPTTextStyle textStyle]; - CPTTextStyle *newTextStyle = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:textStyle]]; + CPTTextStyle *newTextStyle = [self archiveRoundTrip:textStyle]; XCTAssertEqualObjects(newTextStyle.fontName, textStyle.fontName, @"Font names not equal"); XCTAssertEqual(newTextStyle.fontSize, textStyle.fontSize, @"Font sizes not equal"); diff --git a/framework/Source/CPTTheme.h b/framework/Source/CPTTheme.h index 2825e914c..011eccd8b 100644 --- a/framework/Source/CPTTheme.h +++ b/framework/Source/CPTTheme.h @@ -12,7 +12,7 @@ extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with @class CPTAxisSet; @class CPTMutableTextStyle; -@interface CPTTheme : NSObject +@interface CPTTheme : NSObject @property (nonatomic, readwrite, strong, nullable) Class graphClass; diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index 7138d6344..8f5f62c9c 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -65,10 +65,12 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { - self = [CPTTheme themeNamed:[coder decodeObjectForKey:@"CPTTheme.name"]]; + self = [CPTTheme themeNamed:[coder decodeObjectOfClass:[NSString class] + forKey:@"CPTTheme.name"]]; if ( self ) { - NSString *className = [coder decodeObjectForKey:@"CPTTheme.graphClass"]; + NSString *className = [coder decodeObjectOfClass:[NSString class] + forKey:@"CPTTheme.graphClass"]; if ( className ) { self.graphClass = NSClassFromString(className); } @@ -78,6 +80,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Theme management diff --git a/framework/Source/CPTThemeTests.m b/framework/Source/CPTThemeTests.m index 1750f90c4..04486cebc 100644 --- a/framework/Source/CPTThemeTests.m +++ b/framework/Source/CPTThemeTests.m @@ -52,6 +52,8 @@ -(void)testThemeNamedDarkGradientShouldReturnCPTDarkGradientTheme CPTTheme *theme = [CPTTheme themeNamed:kCPTDarkGradientTheme]; XCTAssertTrue([theme isKindOfClass:[_CPTDarkGradientTheme class]], @"Should be _CPTDarkGradientTheme"); + + [self archiveRoundTrip:theme toClass:[CPTTheme class]]; } -(void)testThemeNamedPlainBlackShouldReturnCPTPlainBlackTheme @@ -59,6 +61,8 @@ -(void)testThemeNamedPlainBlackShouldReturnCPTPlainBlackTheme CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainBlackTheme]; XCTAssertTrue([theme isKindOfClass:[_CPTPlainBlackTheme class]], @"Should be _CPTPlainBlackTheme"); + + [self archiveRoundTrip:theme toClass:[CPTTheme class]]; } -(void)testThemeNamedPlainWhiteShouldReturnCPTPlainWhiteTheme @@ -66,6 +70,8 @@ -(void)testThemeNamedPlainWhiteShouldReturnCPTPlainWhiteTheme CPTTheme *theme = [CPTTheme themeNamed:kCPTPlainWhiteTheme]; XCTAssertTrue([theme isKindOfClass:[_CPTPlainWhiteTheme class]], @"Should be _CPTPlainWhiteTheme"); + + [self archiveRoundTrip:theme toClass:[CPTTheme class]]; } -(void)testThemeNamedStocksShouldReturnCPTStocksTheme @@ -73,6 +79,8 @@ -(void)testThemeNamedStocksShouldReturnCPTStocksTheme CPTTheme *theme = [CPTTheme themeNamed:kCPTStocksTheme]; XCTAssertTrue([theme isKindOfClass:[_CPTStocksTheme class]], @"Should be _CPTStocksTheme"); + + [self archiveRoundTrip:theme toClass:[CPTTheme class]]; } -(void)testThemeNamedSlateShouldReturnCPTSlateTheme @@ -80,6 +88,8 @@ -(void)testThemeNamedSlateShouldReturnCPTSlateTheme CPTTheme *theme = [CPTTheme themeNamed:kCPTSlateTheme]; XCTAssertTrue([theme isKindOfClass:[_CPTSlateTheme class]], @"Should be _CPTSlateTheme"); + + [self archiveRoundTrip:theme toClass:[CPTTheme class]]; } @end diff --git a/framework/Source/CPTTimeFormatter.h b/framework/Source/CPTTimeFormatter.h index afb81774e..0f2682db7 100644 --- a/framework/Source/CPTTimeFormatter.h +++ b/framework/Source/CPTTimeFormatter.h @@ -1,5 +1,3 @@ -/// @file - @interface CPTTimeFormatter : NSNumberFormatter @property (nonatomic, readwrite, strong, nullable) NSDateFormatter *dateFormatter; diff --git a/framework/Source/CPTTimeFormatterTests.m b/framework/Source/CPTTimeFormatterTests.m index fbcf5b822..52d5fcfc1 100644 --- a/framework/Source/CPTTimeFormatterTests.m +++ b/framework/Source/CPTTimeFormatterTests.m @@ -18,7 +18,7 @@ -(void)testKeyedArchivingRoundTrip CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter]; timeFormatter.referenceDate = refDate; - CPTTimeFormatter *newTimeFormatter = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:timeFormatter]]; + CPTTimeFormatter *newTimeFormatter = [self archiveRoundTrip:timeFormatter]; XCTAssertEqualObjects(timeFormatter.dateFormatter.dateFormat, newTimeFormatter.dateFormatter.dateFormat, @"Date formatter not equal"); XCTAssertEqualObjects(timeFormatter.referenceDate, newTimeFormatter.referenceDate, @"Reference date not equal"); diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index c79127b4b..70472f3f8 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -275,16 +275,21 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - lineStyle = [[coder decodeObjectForKey:@"CPTTradingRangePlot.lineStyle"] copy]; - increaseLineStyle = [[coder decodeObjectForKey:@"CPTTradingRangePlot.increaseLineStyle"] copy]; - decreaseLineStyle = [[coder decodeObjectForKey:@"CPTTradingRangePlot.decreaseLineStyle"] copy]; - increaseFill = [[coder decodeObjectForKey:@"CPTTradingRangePlot.increaseFill"] copy]; - decreaseFill = [[coder decodeObjectForKey:@"CPTTradingRangePlot.decreaseFill"] copy]; - plotStyle = (CPTTradingRangePlotStyle)[coder decodeIntegerForKey : @"CPTTradingRangePlot.plotStyle"]; - barWidth = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barWidth"]; - stickLength = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.stickLength"]; - barCornerRadius = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barCornerRadius"]; - showBarBorder = [coder decodeBoolForKey:@"CPTTradingRangePlot.showBarBorder"]; + lineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTTradingRangePlot.lineStyle"] copy]; + increaseLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTTradingRangePlot.increaseLineStyle"] copy]; + decreaseLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTTradingRangePlot.decreaseLineStyle"] copy]; + increaseFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTTradingRangePlot.increaseFill"] copy]; + decreaseFill = [[coder decodeObjectOfClass:[CPTFill class] + forKey:@"CPTTradingRangePlot.decreaseFill"] copy]; + plotStyle = (CPTTradingRangePlotStyle)[coder decodeIntegerForKey : @"CPTTradingRangePlot.plotStyle"]; + barWidth = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barWidth"]; + stickLength = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.stickLength"]; + barCornerRadius = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barCornerRadius"]; + showBarBorder = [coder decodeBoolForKey:@"CPTTradingRangePlot.showBarBorder"]; pointingDeviceDownIndex = NSNotFound; } @@ -293,6 +298,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Data Loading diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 5646b938c..56798176a 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -108,14 +108,28 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - orthogonalPosition = [coder decodeObjectForKey:@"CPTXYAxis.orthogonalPosition"]; - axisConstraints = [coder decodeObjectForKey:@"CPTXYAxis.axisConstraints"]; + orthogonalPosition = [coder decodeObjectOfClass:[NSNumber class] + forKey:@"CPTXYAxis.orthogonalPosition"]; + axisConstraints = [coder decodeObjectOfClass:[CPTConstraints class] + forKey:@"CPTXYAxis.axisConstraints"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Coordinate Transforms diff --git a/framework/Source/CPTXYGraph.m b/framework/Source/CPTXYGraph.m index 242619ad2..26649c661 100644 --- a/framework/Source/CPTXYGraph.m +++ b/framework/Source/CPTXYGraph.m @@ -111,6 +111,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Factory Methods diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 810ef4bf6..fa823b4d2 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -258,18 +258,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - CPTPlotRange *range = [coder decodeObjectForKey:@"CPTXYPlotSpace.xRange"]; + CPTPlotRange *range = [coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTXYPlotSpace.xRange"]; if ( range ) { xRange = [range copy]; } - range = [coder decodeObjectForKey:@"CPTXYPlotSpace.yRange"]; + range = [coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTXYPlotSpace.yRange"]; if ( range ) { yRange = [range copy]; } - globalXRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalXRange"] copy]; - globalYRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalYRange"] copy]; - xScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.xScaleType"]; - yScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.yScaleType"]; + globalXRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTXYPlotSpace.globalXRange"] copy]; + globalYRange = [[coder decodeObjectOfClass:[CPTPlotRange class] + forKey:@"CPTXYPlotSpace.globalYRange"] copy]; + xScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.xScaleType"]; + yScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.yScaleType"]; if ( [coder containsValueForKey:@"CPTXYPlotSpace.allowsMomentum"] ) { self.allowsMomentum = [coder decodeBoolForKey:@"CPTXYPlotSpace.allowsMomentum"]; @@ -295,6 +299,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Ranges diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 99977ce06..701dc0ad7 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -664,7 +664,7 @@ -(void)testKeyedArchivingRoundTrip plotSpace.globalYRange = [CPTPlotRange plotRangeWithLocation:@10.0 length:@(-10.0)]; - CPTXYPlotSpace *newPlotSpace = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:plotSpace]]; + CPTXYPlotSpace *newPlotSpace = [self archiveRoundTrip:plotSpace]; NSString *errMessage = [NSString stringWithFormat:@"xRange was %@, expected %@", plotSpace.xRange, newPlotSpace.xRange]; XCTAssertTrue([plotSpace.xRange isEqualToRange:newPlotSpace.xRange], @"%@", errMessage); diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 98bfe9411..df9d649fd 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -334,7 +334,8 @@ -(CGColorSpaceRef)newCGColorSpaceDecodeForKey:(NSString *)key NSLog(@"Color space decoding is not supported on iOS. Using generic RGB color space."); colorSpace = CGColorSpaceCreateDeviceRGB(); #else - NSData *iccProfile = [self decodeObjectForKey:key]; + NSData *iccProfile = [self decodeObjectOfClass:[NSData class] + forKey:key]; if ( iccProfile ) { colorSpace = CGColorSpaceCreateWithICCProfile( (__bridge CFDataRef)iccProfile ); } @@ -446,7 +447,8 @@ -(CGImageRef)newCGImageDecodeForKey:(NSString *)key const CGBitmapInfo *bitmapInfo = (const void *)[self decodeBytesForKey:newKey returnedLength:&length]; newKey = [[NSString alloc] initWithFormat:@"%@.provider", key]; - CGDataProviderRef provider = CGDataProviderCreateWithCFData( (__bridge CFDataRef)[self decodeObjectForKey:newKey] ); + CGDataProviderRef provider = CGDataProviderCreateWithCFData( (__bridge CFDataRef)[self decodeObjectOfClass:[NSData class] + forKey:newKey] ); newKey = [[NSString alloc] initWithFormat:@"%@.numberOfComponents", key]; size_t numberOfComponents = (size_t)[self decodeInt64ForKey : newKey]; @@ -501,7 +503,8 @@ -(NSDecimal)decodeDecimalForKey:(NSString *)key { NSDecimal result; - NSNumber *number = [self decodeObjectForKey:key]; + NSNumber *number = [self decodeObjectOfClass:[NSDecimalNumber class] + forKey:key]; if ( [number respondsToSelector:@selector(decimalValue)] ) { result = number.decimalValue; diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 1cc350f12..296b6c0d5 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -72,13 +72,26 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - maskedLayer = [coder decodeObjectForKey:@"CPTBorderLayer.maskedLayer"]; + maskedLayer = [coder decodeObjectOfClass:[CPTBorderedLayer class] + forKey:@"CPTBorderLayer.maskedLayer"]; } return self; } /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Drawing diff --git a/framework/Source/_CPTConstraintsFixed.m b/framework/Source/_CPTConstraintsFixed.m index 5b30de626..801dbe7d5 100644 --- a/framework/Source/_CPTConstraintsFixed.m +++ b/framework/Source/_CPTConstraintsFixed.m @@ -138,4 +138,16 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/_CPTConstraintsRelative.m b/framework/Source/_CPTConstraintsRelative.m index 93019c3bc..40d71251c 100644 --- a/framework/Source/_CPTConstraintsRelative.m +++ b/framework/Source/_CPTConstraintsRelative.m @@ -115,4 +115,16 @@ -(instancetype)initWithCoder:(NSCoder *)coder return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/_CPTFillColor.h b/framework/Source/_CPTFillColor.h index 00f7a66f5..2e1b5720a 100644 --- a/framework/Source/_CPTFillColor.h +++ b/framework/Source/_CPTFillColor.h @@ -1,6 +1,6 @@ #import "CPTFill.h" -@interface _CPTFillColor : CPTFill +@interface _CPTFillColor : CPTFill /// @name Initialization /// @{ diff --git a/framework/Source/_CPTFillColor.m b/framework/Source/_CPTFillColor.m index aa63358e5..44bbe0b8a 100644 --- a/framework/Source/_CPTFillColor.m +++ b/framework/Source/_CPTFillColor.m @@ -18,7 +18,7 @@ @interface _CPTFillColor() @implementation _CPTFillColor -/** @property fillColor +/** @property CPTColor *fillColor * @brief The fill color. **/ @synthesize fillColor; @@ -120,9 +120,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - fillColor = [coder decodeObjectForKey:@"_CPTFillColor.fillColor"]; + fillColor = [coder decodeObjectOfClass:[CPTColor class] + forKey:@"_CPTFillColor.fillColor"]; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/_CPTFillGradient.h b/framework/Source/_CPTFillGradient.h index a7bb7e610..457e3c3a5 100644 --- a/framework/Source/_CPTFillGradient.h +++ b/framework/Source/_CPTFillGradient.h @@ -2,7 +2,7 @@ @class CPTGradient; -@interface _CPTFillGradient : CPTFill +@interface _CPTFillGradient : CPTFill /// @name Initialization /// @{ diff --git a/framework/Source/_CPTFillGradient.m b/framework/Source/_CPTFillGradient.m index 98b44040b..474c8fc1c 100644 --- a/framework/Source/_CPTFillGradient.m +++ b/framework/Source/_CPTFillGradient.m @@ -18,7 +18,7 @@ @interface _CPTFillGradient() @implementation _CPTFillGradient -/** @property fillGradient +/** @property CPTGradient *fillGradient * @brief The fill gradient. **/ @synthesize fillGradient; @@ -106,9 +106,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - fillGradient = [coder decodeObjectForKey:@"_CPTFillGradient.fillGradient"]; + fillGradient = [coder decodeObjectOfClass:[CPTGradient class] + forKey:@"_CPTFillGradient.fillGradient"]; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/Source/_CPTFillImage.h b/framework/Source/_CPTFillImage.h index 9efe99470..a705b5935 100644 --- a/framework/Source/_CPTFillImage.h +++ b/framework/Source/_CPTFillImage.h @@ -2,7 +2,7 @@ @class CPTImage; -@interface _CPTFillImage : CPTFill +@interface _CPTFillImage : CPTFill /// @name Initialization /// @{ diff --git a/framework/Source/_CPTFillImage.m b/framework/Source/_CPTFillImage.m index 16a6ade4e..4cf6b5efa 100644 --- a/framework/Source/_CPTFillImage.m +++ b/framework/Source/_CPTFillImage.m @@ -18,7 +18,7 @@ @interface _CPTFillImage() @implementation _CPTFillImage -/** @property fillImage +/** @property CPTImage *fillImage * @brief The fill image. **/ @synthesize fillImage; @@ -112,9 +112,22 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - fillImage = [coder decodeObjectForKey:@"_CPTFillImage.fillImage"]; + fillImage = [coder decodeObjectOfClass:[CPTImage class] + forKey:@"_CPTFillImage.fillImage"]; } return self; } +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + @end diff --git a/framework/iPhoneOnly/CPTGraphHostingView.h b/framework/iPhoneOnly/CPTGraphHostingView.h index b98c5784e..17f7ec128 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.h +++ b/framework/iPhoneOnly/CPTGraphHostingView.h @@ -2,7 +2,7 @@ @class CPTGraph; -@interface CPTGraphHostingView : UIView +@interface CPTGraphHostingView : UIView @property (nonatomic, readwrite, strong, nullable) CPTGraph *hostedGraph; @property (nonatomic, readwrite, assign) BOOL collapsesLayers; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index dc317173e..fafbca86c 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -120,7 +120,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder [self commonInit]; collapsesLayers = [coder decodeBoolForKey:@"CPTGraphHostingView.collapsesLayers"]; - self.hostedGraph = [coder decodeObjectForKey:@"CPTGraphHostingView.hostedGraph"]; // setup layers + self.hostedGraph = [coder decodeObjectOfClass:[CPTGraph class] + forKey:@"CPTGraphHostingView.hostedGraph"]; // setup layers if ( [coder containsValueForKey:@"CPTGraphHostingView.allowPinchScaling"] ) { self.allowPinchScaling = [coder decodeBoolForKey:@"CPTGraphHostingView.allowPinchScaling"]; // set gesture recognizer if needed @@ -131,6 +132,18 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @endcond +#pragma mark - +#pragma mark NSSecureCoding Methods + +/// @cond + ++(BOOL)supportsSecureCoding +{ + return YES; +} + +/// @endcond + #pragma mark - #pragma mark Touch handling From 540308154db288373ca70e136a4f6e256a86f171 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 4 Dec 2015 16:36:24 -0500 Subject: [PATCH 138/429] Changed the OS X deployment target to 10.8 in the podspec files. --- CorePlot-latest.podspec | 2 +- CorePlot.podspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index 8f61f2d52..6f7f9dfd7 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -19,7 +19,7 @@ Pod::Spec.new do |s| 'Core Data, and Cocoa Bindings.' s.ios.deployment_target = '6.0' - s.osx.deployment_target = '10.7' + s.osx.deployment_target = '10.8' s.tvos.deployment_target = '9.0' s.ios.header_dir = 'ios' diff --git a/CorePlot.podspec b/CorePlot.podspec index 431f539e6..084705347 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -19,7 +19,7 @@ Pod::Spec.new do |s| 'Core Data, and Cocoa Bindings.' s.ios.deployment_target = '6.0' - s.osx.deployment_target = '10.7' + s.osx.deployment_target = '10.8' s.tvos.deployment_target = '9.0' s.ios.header_dir = 'ios' From 52f0c30e069c1227ce8a84d30b83dfc31630d9f2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 13 Dec 2015 20:47:32 -0500 Subject: [PATCH 139/429] Added support for animating `NSNumber` properties with `CPTAnimation`. Fixed issue #250. --- documentation/changelog.markdown | 1 + examples/CPTTestApp/Source/Controller.m | 29 +++- framework/CorePlot.xcodeproj/project.pbxproj | 18 +++ framework/Source/CPTAnimation.m | 37 +++-- framework/Source/CPTAnimationPeriod.h | 10 ++ framework/Source/CPTAnimationPeriod.m | 146 +++++++++++++++++- .../Source/_CPTAnimationNSNumberPeriod.h | 5 + .../Source/_CPTAnimationNSNumberPeriod.m | 74 +++++++++ 8 files changed, 294 insertions(+), 26 deletions(-) create mode 100644 framework/Source/_CPTAnimationNSNumberPeriod.h create mode 100644 framework/Source/_CPTAnimationNSNumberPeriod.m diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index de5495331..ba591ae0d 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -8,6 +8,7 @@ To be determined. - **New**: Increased the Mac deployment target to OS X 10.8. - **New**: Added a tvOS framework. - **New**: Added an option to anchor alternating band fills to a specific starting value. +- **New**: Added support for animating `NSNumber` properties with `CPTAnimation`. - **New**: Added support for `NSSecureCoding`. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 5ad73b523..493b131e2 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -531,13 +531,28 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index self.symbolTextAnnotation = annotation; } - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"barWidth"]; - animation.duration = 0.25; - animation.toValue = @0.0; - animation.repeatCount = 1; - animation.autoreverses = YES; - animation.removedOnCompletion = YES; - [plot addAnimation:animation forKey:@"barWidth"]; + const CGFloat duration = 0.25; + NSNumber *barWidth = plot.barWidth; + + if ( barWidth ) { + [CPTAnimation animate:plot + property:@"barWidth" + fromNumber:plot.barWidth + toNumber:@0.0 + duration:duration + withDelay:0.0 + animationCurve:CPTAnimationCurveDefault + delegate:nil]; + + [CPTAnimation animate:plot + property:@"barWidth" + fromNumber:nil + toNumber:barWidth + duration:duration + withDelay:duration + animationCurve:CPTAnimationCurveDefault + delegate:nil]; + } } #pragma mark - diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index ed8a1ab18..b39dbf690 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -796,6 +796,13 @@ C3A695E6146A19BC00AF5653 /* CPTMutablePlotRange.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A695E4146A19BC00AF5653 /* CPTMutablePlotRange.m */; }; C3AFC9D10FB62969005DFFDC /* CPTImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFC9CF0FB62969005DFFDC /* CPTImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C3B4D4971BC9983300450C37 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C37EA6921BC83F2A0091C8F7 /* CorePlot.framework */; }; + C3BB3C8E1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB3C8C1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h */; }; + C3BB3C8F1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB3C8C1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h */; }; + C3BB3C901C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB3C8C1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h */; }; + C3BB3C911C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */; }; + C3BB3C921C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */; }; + C3BB3C931C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */; }; + C3BB3C941C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */; }; C3BB93191B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; C3BB931A1B729BD200004527 /* CPTDebugQuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */; }; C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C97EF08104D80D400B554F9 /* CPTNumericDataTypeConversionTests.m */; }; @@ -1133,6 +1140,8 @@ C3AFC9D00FB62969005DFFDC /* CPTImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTImage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3B235631009931400970270 /* doxygen-cocoa-tags.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = "doxygen-cocoa-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-tags.xml"; sourceTree = ""; }; C3B25EDF1AC23A7D0063CCD8 /* CorePlot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CorePlot.h; sourceTree = ""; }; + C3BB3C8C1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationNSNumberPeriod.h; sourceTree = ""; }; + C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationNSNumberPeriod.m; sourceTree = ""; }; C3BB7D1416322F7E00BC9515 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; C3BB93181B729BD200004527 /* CPTDebugQuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDebugQuickLook.h; sourceTree = ""; }; C3C032C710B8DEDC003A11B6 /* CPTAxisLabelGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAxisLabelGroup.h; sourceTree = ""; }; @@ -1942,6 +1951,8 @@ A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */, A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */, A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */, + C3BB3C8C1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h */, + C3BB3C8D1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m */, A92C0E16290C226BC4BE3936 /* _CPTAnimationPlotRangePeriod.h */, A92C091B8592D9F32AC384CB /* _CPTAnimationPlotRangePeriod.m */, C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */, @@ -2048,6 +2059,7 @@ BC55023210059F22005DF982 /* _CPTPlainBlackTheme.h in Headers */, BC55023410059F22005DF982 /* _CPTPlainWhiteTheme.h in Headers */, BC55023610059F22005DF982 /* _CPTStocksTheme.h in Headers */, + C3BB3C8E1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */, 07A2E6FC102DF47900809BC5 /* CPTTimeFormatter.h in Headers */, 4C97EEFE104D80C400B554F9 /* CPTNumericData+TypeConversion.h in Headers */, 4C97EF01104D80C400B554F9 /* CPTNumericData.h in Headers */, @@ -2109,6 +2121,7 @@ C37EA6321BC83F2A0091C8F7 /* CPTTradingRangePlot.h in Headers */, C37EA6331BC83F2A0091C8F7 /* CPTGraph.h in Headers */, C37EA6341BC83F2A0091C8F7 /* CPTGridLines.h in Headers */, + C3BB3C901C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */, C37EA6351BC83F2A0091C8F7 /* CPTTextStyle.h in Headers */, C37EA6361BC83F2A0091C8F7 /* CPTMutablePlotRange.h in Headers */, C37EA6371BC83F2A0091C8F7 /* CPTPieChart.h in Headers */, @@ -2211,6 +2224,7 @@ C38A0AC61A46255C00D45436 /* CPTTradingRangePlot.h in Headers */, C38A0AA71A46240300D45436 /* CPTGraph.h in Headers */, C38A0ADA1A4625B100D45436 /* CPTGridLines.h in Headers */, + C3BB3C8F1C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.h in Headers */, C38A0A4A1A461F1500D45436 /* CPTTextStyle.h in Headers */, C38A09FB1A461D0F00D45436 /* CPTMutablePlotRange.h in Headers */, C38A0AC31A46255C00D45436 /* CPTPieChart.h in Headers */, @@ -2742,6 +2756,7 @@ C3920AC51395B6500045F3BB /* CPTLegend.m in Sources */, C30550EE1399BE5400E0151F /* CPTLegendEntry.m in Sources */, C3978E0713CE653C00A420D9 /* NSCoderExtensions.m in Sources */, + C3BB3C911C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */, C3D3AD2E13DF8DCE0004EA73 /* CPTLineCap.m in Sources */, C3CCA03E13E8D85900CE6DB1 /* _CPTConstraintsFixed.m in Sources */, C3CCA04013E8D85900CE6DB1 /* _CPTConstraintsRelative.m in Sources */, @@ -2796,6 +2811,7 @@ C37EA5E31BC83F2A0091C8F7 /* CPTXYAxisSet.m in Sources */, C37EA5E41BC83F2A0091C8F7 /* CPTLimitBand.m in Sources */, C37EA5E51BC83F2A0091C8F7 /* CPTGridLines.m in Sources */, + C3BB3C941C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */, C37EA5E61BC83F2A0091C8F7 /* CPTPathExtensions.m in Sources */, C37EA5E71BC83F2A0091C8F7 /* CPTXYPlotSpace.m in Sources */, C37EA5E81BC83F2A0091C8F7 /* CPTPlotRange.m in Sources */, @@ -2929,6 +2945,7 @@ C38A0AE71A4625D400D45436 /* CPTXYAxisSet.m in Sources */, C38A0AB21A46241700D45436 /* CPTLimitBand.m in Sources */, C38A0AE11A4625D400D45436 /* CPTGridLines.m in Sources */, + C3BB3C921C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */, C38A0A6D1A4620E200D45436 /* CPTPathExtensions.m in Sources */, C38A0AB91A46250500D45436 /* CPTXYPlotSpace.m in Sources */, C38A09F91A461D0B00D45436 /* CPTPlotRange.m in Sources */, @@ -3062,6 +3079,7 @@ C38A0ABA1A46250600D45436 /* CPTPlotSpace.m in Sources */, C38A0A281A461E9B00D45436 /* _CPTAnimationCGRectPeriod.m in Sources */, C38A0AEC1A4625D500D45436 /* CPTAxisLabel.m in Sources */, + C3BB3C931C1661BE00B8742D /* _CPTAnimationNSNumberPeriod.m in Sources */, C38A0A991A46219200D45436 /* CPTCalendarFormatter.m in Sources */, C38A0A3A1A461ED700D45436 /* CPTLayerAnnotation.m in Sources */, C38A0B231A46264500D45436 /* CPTPlatformSpecificDefines.m in Sources */, diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index ac8d365cb..f177f690c 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -7,10 +7,11 @@ static const CGFloat kCPTAnimationFrameRate = CPTFloat(1.0 / 60.0); // 60 frames per second -static NSString *const CPTAnimationOperationKey = @"CPTAnimationOperationKey"; -static NSString *const CPTAnimationValueKey = @"CPTAnimationValueKey"; -static NSString *const CPTAnimationStartedKey = @"CPTAnimationStartedKey"; -static NSString *const CPTAnimationFinishedKey = @"CPTAnimationFinishedKey"; +static NSString *const CPTAnimationOperationKey = @"CPTAnimationOperationKey"; +static NSString *const CPTAnimationValueKey = @"CPTAnimationValueKey"; +static NSString *const CPTAnimationValueClassKey = @"CPTAnimationValueClassKey"; +static NSString *const CPTAnimationStartedKey = @"CPTAnimationStartedKey"; +static NSString *const CPTAnimationFinishedKey = @"CPTAnimationFinishedKey"; /// @cond typedef NSMutableArray CPTMutableAnimationArray; @@ -333,11 +334,13 @@ -(void)update [period setStartValueFromObject:animationOperation.boundObject propertyGetter:animationOperation.boundGetter]; } + Class valueClass = period.valueClass; CGFloat progress = timingFunction(currentTime - startTime, duration); CPTDictionary *parameters = @{ CPTAnimationOperationKey: animationOperation, CPTAnimationValueKey: [period tweenedValueForProgress:progress], + CPTAnimationValueClassKey: valueClass ? valueClass : [NSNull null], CPTAnimationStartedKey: @(started), CPTAnimationFinishedKey: @(currentTime >= endTime) }; @@ -379,6 +382,11 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters if ( !canceled ) { @try { + Class valueClass = parameters[CPTAnimationValueClassKey]; + if ( [valueClass isKindOfClass:[NSNull class]] ) { + valueClass = Nil; + } + id delegate = animationOperation.delegate; NSNumber *started = parameters[CPTAnimationStartedKey]; @@ -396,14 +404,24 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters id boundObject = animationOperation.boundObject; id tweenedValue = parameters[CPTAnimationValueKey]; - if ( [tweenedValue isKindOfClass:[NSDecimalNumber class]] ) { + if ( valueClass ) { + // object properties +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + id theObject = boundObject; + [theObject performSelector:boundSetter withObject:tweenedValue]; +#pragma clang diagnostic pop + } + else if ( [tweenedValue isKindOfClass:[NSDecimalNumber class]] ) { + // NSDecimal properties NSDecimal buffer = ( (NSDecimalNumber *)tweenedValue ).decimalValue; typedef void (*SetterType)(id, SEL, NSDecimal); SetterType setterMethod = (SetterType)[boundObject methodForSelector : boundSetter]; setterMethod(boundObject, boundSetter, buffer); } - else if ( [tweenedValue isKindOfClass:[NSValue class]] ) { + else { + // wrapped scalars and structs NSValue *value = (NSValue *)tweenedValue; NSUInteger bufferSize = 0; @@ -420,13 +438,6 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary *)parameters [invocation invoke]; } - else { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - id theObject = boundObject; - [theObject performSelector:boundSetter withObject:tweenedValue]; -#pragma clang diagnostic pop - } if ( [delegate respondsToSelector:@selector(animationDidUpdate:)] ) { [delegate animationDidUpdate:animationOperation]; diff --git a/framework/Source/CPTAnimationPeriod.h b/framework/Source/CPTAnimationPeriod.h index f0700e2c8..23afe10ec 100644 --- a/framework/Source/CPTAnimationPeriod.h +++ b/framework/Source/CPTAnimationPeriod.h @@ -9,6 +9,7 @@ /// @{ @property (nonatomic, readwrite, copy, nonnull) NSValue *startValue; @property (nonatomic, readwrite, copy, nonnull) NSValue *endValue; +@property (nonatomic, readonly, nullable) Class valueClass; @property (nonatomic, readwrite) CGFloat duration; @property (nonatomic, readwrite) CGFloat delay; @property (nonatomic, readonly) CGFloat startOffset; @@ -21,6 +22,7 @@ +(nonnull instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +(nonnull instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +(nonnull instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartNumber:(nullable NSNumber *)aStartNumber endNumber:(nonnull NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +(nonnull instancetype)periodWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; /// @} @@ -31,6 +33,7 @@ -(nonnull instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -(nonnull instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -(nonnull instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartNumber:(nullable NSNumber *)aStartNumber endNumber:(nonnull NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; -(nonnull instancetype)initWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; /// @} @@ -99,6 +102,13 @@ +(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration; /// @} +/// @name NSNumber Property Animation +/// @{ ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration; +/// @} + /// @name CPTPlotRange Property Animation /// @{ +(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index 0588f6bfc..807ac28f2 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -8,14 +8,15 @@ #import "_CPTAnimationCGRectPeriod.h" #import "_CPTAnimationCGSizePeriod.h" #import "_CPTAnimationNSDecimalPeriod.h" +#import "_CPTAnimationNSNumberPeriod.h" #import "_CPTAnimationPlotRangePeriod.h" /// @cond @interface CPTAnimationPeriod() -+(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartValue:(nullable NSValue *)aStartValue endValue:(nonnull NSValue *)anEndValue ofClass:(nullable Class)class duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartValue:(nullable NSValue *)aStartValue endValue:(nonnull NSValue *)anEndValue ofClass:(nullable Class)class duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; @property (nonatomic, readwrite) CGFloat startOffset; @@ -33,6 +34,7 @@ -(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anE * - @ref CGSize * - @ref CGRect * - @ref NSDecimal + * - @ref NSNumber * - @ref CPTPlotRange (NSValue wrapper not used) * @note The starting and ending values must be the same type. **/ @@ -50,6 +52,11 @@ @implementation CPTAnimationPeriod **/ @synthesize endValue; +/** @property Class valueClass + * @brief The Objective-C class of the animated object. If @nil, the value is a scalar or struct wrapped in an NSValue object. + **/ +@synthesize valueClass; + /** @property CGFloat duration * @brief The duration of the animation, in seconds. **/ @@ -75,13 +82,14 @@ @implementation CPTAnimationPeriod * @brief Creates and returns a new CPTAnimationPeriod instance initialized with the provided start and end values and duration. * @param aStartValue The starting value. If @nil, the animation starts from the current value of the animated property. * @param anEndValue The ending value. + * @param class The Objective-C class of the animated object. If @Nil, the value is a scalar or struct wrapped in an NSValue object. * @param aDuration The animation duration in seconds. * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue ofClass:(Class)class duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { - return [[self alloc] initWithStartValue:aStartValue endValue:anEndValue duration:aDuration withDelay:aDelay]; + return [[self alloc] initWithStartValue:aStartValue endValue:anEndValue ofClass:class duration:aDuration withDelay:aDelay]; } /// @endcond @@ -100,6 +108,7 @@ +(instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFl return [_CPTAnimationCGFloatPeriod periodWithStartValue:start endValue:@(anEnd) + ofClass:Nil duration:aDuration withDelay:aDelay]; } @@ -122,6 +131,7 @@ +(instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEnd return [_CPTAnimationCGPointPeriod periodWithStartValue:start endValue:[NSValue valueWithBytes:&anEndPoint objCType:@encode(CGPoint)] + ofClass:Nil duration:aDuration withDelay:aDelay]; } @@ -144,6 +154,7 @@ +(instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize return [_CPTAnimationCGSizePeriod periodWithStartValue:start endValue:[NSValue valueWithBytes:&anEndSize objCType:@encode(CGSize)] + ofClass:Nil duration:aDuration withDelay:aDelay]; } @@ -166,6 +177,7 @@ +(instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect return [_CPTAnimationCGRectPeriod periodWithStartValue:start endValue:[NSValue valueWithBytes:&anEndRect objCType:@encode(CGRect)] + ofClass:Nil duration:aDuration withDelay:aDelay]; } @@ -184,10 +196,28 @@ +(instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDec return [_CPTAnimationNSDecimalPeriod periodWithStartValue:start endValue:[NSDecimalNumber decimalNumberWithDecimal:anEndDecimal] + ofClass:Nil duration:aDuration withDelay:aDelay]; } +/** + * @brief Creates and returns a new CPTAnimationPeriod instance initialized with the provided start and end values and duration. + * @param aStartNumber The starting value. If @NAN or @nil, the animation starts from the current value of the animated property. + * @param anEndNumber The ending value. + * @param aDuration The animation duration in seconds. + * @param aDelay The starting delay in seconds. + * @return The initialized object. + **/ ++(instancetype)periodWithStartNumber:(NSNumber *)aStartNumber endNumber:(NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +{ + return [_CPTAnimationNSNumberPeriod periodWithStartValue:aStartNumber + endValue:anEndNumber + ofClass:[NSNumber class] + duration:aDuration + withDelay:aDelay]; +} + /** * @brief Creates and returns a new CPTAnimationPeriod instance initialized with the provided start and end plot ranges and duration. * @param aStartPlotRange The starting plot range. If @nil or any component of the range is @NAN, the animation starts from the current value of the animated property. @@ -204,6 +234,7 @@ +(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotR return [_CPTAnimationPlotRangePeriod periodWithStartValue:(NSValue *)aStartPlotRange endValue:(NSValue *)anEndPlotRange + ofClass:[CPTPlotRange class] duration:aDuration withDelay:aDelay]; } @@ -216,21 +247,24 @@ +(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotR * This is the designated initializer. The initialized object will have the following properties: * - @ref startValue = @par{aStartValue} * - @ref endValue = @par{anEndValue} + * - @ref class = @par{class} * - @ref duration = @par{aDuration} * - @ref delay = @par{aDelay} * - @ref startOffset = The animation time clock offset when this method is called. * * @param aStartValue The starting value. If @nil, the animation starts from the current value of the animated property. * @param anEndValue The ending value. + * @param class The Objective-C class of the animated object. If @Nil, the value is a scalar or struct wrapped in an NSValue object. * @param aDuration The animation duration in seconds. * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue ofClass:(Class)class duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { if ( (self = [super init]) ) { startValue = [aStartValue copy]; endValue = [anEndValue copy]; + valueClass = class; duration = aDuration; delay = aDelay; startOffset = [CPTAnimation sharedInstance].timeOffset; @@ -255,6 +289,7 @@ -(instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloa self = [[_CPTAnimationCGFloatPeriod alloc] initWithStartValue:start endValue:@(anEnd) + ofClass:Nil duration:aDuration withDelay:aDelay]; @@ -279,6 +314,7 @@ -(instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPo self = [[_CPTAnimationCGPointPeriod alloc] initWithStartValue:start endValue:[NSValue valueWithBytes:&anEndPoint objCType:@encode(CGPoint)] + ofClass:Nil duration:aDuration withDelay:aDelay]; @@ -303,6 +339,7 @@ -(instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize du self = [[_CPTAnimationCGSizePeriod alloc] initWithStartValue:start endValue:[NSValue valueWithBytes:&anEndSize objCType:@encode(CGSize)] + ofClass:Nil duration:aDuration withDelay:aDelay]; @@ -327,6 +364,7 @@ -(instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect du self = [[_CPTAnimationCGRectPeriod alloc] initWithStartValue:start endValue:[NSValue valueWithBytes:&anEndRect objCType:@encode(CGRect)] + ofClass:Nil duration:aDuration withDelay:aDelay]; @@ -347,12 +385,32 @@ -(instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecim self = [[_CPTAnimationNSDecimalPeriod alloc] initWithStartValue:start endValue:[NSDecimalNumber decimalNumberWithDecimal:anEndDecimal] + ofClass:Nil duration:aDuration withDelay:aDelay]; return self; } +/** + * @brief Initializes a newly allocated CPTAnimationPeriod object with the provided start and end values and duration. + * @param aStartNumber The starting value. If @NAN or @nil, the animation starts from the current value of the animated property. + * @param anEndNumber The ending value. + * @param aDuration The animation duration in seconds. + * @param aDelay The starting delay in seconds. + * @return The initialized object. + **/ +-(instancetype)initWithStartNumber:(NSNumber *)aStartNumber endNumber:(NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +{ + self = [[_CPTAnimationNSNumberPeriod alloc] initWithStartValue:aStartNumber + endValue:anEndNumber + ofClass:[NSNumber class] + duration:aDuration + withDelay:aDelay]; + + return self; +} + /** * @brief Initializes a newly allocated CPTAnimationPeriod object with the provided start and end plot ranges and duration. * @param aStartPlotRange The starting plot range. If @nil or any component of the range is @NAN, the animation starts from the current value of the animated property. @@ -369,6 +427,7 @@ -(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRan self = [[_CPTAnimationPlotRangePeriod alloc] initWithStartValue:(NSValue *)aStartPlotRange endValue:(NSValue *)anEndPlotRange + ofClass:[CPTPlotRange class] duration:aDuration withDelay:aDelay]; @@ -382,7 +441,7 @@ -(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRan **/ -(instancetype)init { - return [self initWithStartValue:nil endValue:nil duration:CPTFloat(0.0) withDelay:CPTFloat(0.0)]; + return [self initWithStartValue:nil endValue:@0.0 ofClass:Nil duration:CPTFloat(0.0) withDelay:CPTFloat(0.0)]; } /// @endcond @@ -822,6 +881,81 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD delegate:nil]; } +// NSNumber + +/** @brief Creates an animation operation with the given properties and adds it to the animation queue. + * @param object The object to animate. + * @param property The name of the property of @par{object} to animate. The property must have both getter and setter methods. + * @param from The starting value. If @NAN or @nil, the animation starts from the current value of the animated property. + * @param to The ending value. + * @param duration The duration of the animation. + * @param delay The starting delay of the animation in seconds. + * @param animationCurve The animation curve used to animate the new operation. + * @param delegate The animation delegate (can be @nil). + * @return The queued animation operation. + **/ ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate +{ + CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartNumber:from + endNumber:to + duration:duration + withDelay:delay]; + + return [self animate:object + property:property + period:period + animationCurve:animationCurve + delegate:delegate + ]; +} + +/** @brief Creates an animation operation with the given properties and adds it to the animation queue. + * @param object The object to animate. + * @param property The name of the property of @par{object} to animate. The property must have both getter and setter methods. + * @param from The starting value. If @NAN or @nil, the animation starts from the current value of the animated property. + * @param to The ending value. + * @param duration The duration of the animation. + * @param animationCurve The animation curve used to animate the new operation. + * @param delegate The animation delegate (can be @nil). + * @return The queued animation operation. + **/ ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate +{ + CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartNumber:from + endNumber:to + duration:duration + withDelay:CPTFloat(0.0)]; + + return [self animate:object + property:property + period:period + animationCurve:animationCurve + delegate:delegate + ]; +} + +/** @brief Creates an animation operation with the given properties and adds it to the animation queue. + * @param object The object to animate. + * @param property The name of the property of @par{object} to animate. The property must have both getter and setter methods. + * @param from The starting value. If @NAN or @nil, the animation starts from the current value of the animated property. + * @param to The ending value. + * @param duration The duration of the animation. + * @return The queued animation operation. + **/ ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromNumber:(nullable NSNumber *)from toNumber:(nonnull NSNumber *)to duration:(CGFloat)duration +{ + CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartNumber:from + endNumber:to + duration:duration + withDelay:CPTFloat(0.0)]; + + return [self animate:object + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; +} + // CPTPlotRange /** @brief Creates an animation operation with the given properties and adds it to the animation queue. diff --git a/framework/Source/_CPTAnimationNSNumberPeriod.h b/framework/Source/_CPTAnimationNSNumberPeriod.h new file mode 100644 index 000000000..dfe744ba3 --- /dev/null +++ b/framework/Source/_CPTAnimationNSNumberPeriod.h @@ -0,0 +1,5 @@ +#import "CPTAnimationPeriod.h" + +@interface _CPTAnimationNSNumberPeriod : CPTAnimationPeriod + +@end diff --git a/framework/Source/_CPTAnimationNSNumberPeriod.m b/framework/Source/_CPTAnimationNSNumberPeriod.m new file mode 100644 index 000000000..b56daddb5 --- /dev/null +++ b/framework/Source/_CPTAnimationNSNumberPeriod.m @@ -0,0 +1,74 @@ +#import "_CPTAnimationNSNumberPeriod.h" + +#import "CPTUtilities.h" + +@implementation _CPTAnimationNSNumberPeriod + +-(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +{ + typedef NSNumber *(*GetterType)(id, SEL); + GetterType getterMethod = (GetterType)[boundObject methodForSelector : boundGetter]; + + self.startValue = getterMethod(boundObject, boundGetter); +} + +-(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +{ + if ( !self.startValue ) { + [self setStartValueFromObject:boundObject propertyGetter:boundGetter]; + } + + typedef NSNumber *(*GetterType)(id, SEL); + GetterType getterMethod = (GetterType)[boundObject methodForSelector : boundGetter]; + + NSNumber *current = getterMethod(boundObject, boundGetter); + NSNumber *start = (NSNumber *)self.startValue; + NSNumber *end = (NSNumber *)self.endValue; + + Class decimalClass = [NSDecimalNumber class]; + + if ( [start isKindOfClass:decimalClass] || [end isKindOfClass:decimalClass] ) { + NSDecimal currentDecimal = current.decimalValue; + NSDecimal startDecimal = start.decimalValue; + NSDecimal endDecimal = end.decimalValue; + + return ( CPTDecimalGreaterThanOrEqualTo(currentDecimal, startDecimal) && CPTDecimalLessThanOrEqualTo(currentDecimal, endDecimal) ) || + ( CPTDecimalGreaterThanOrEqualTo(currentDecimal, endDecimal) && CPTDecimalLessThanOrEqualTo(currentDecimal, startDecimal) ); + } + else { + double currentDouble = current.doubleValue; + double startDouble = start.doubleValue; + double endDouble = end.doubleValue; + + return ( (currentDouble >= startDouble) && (currentDouble <= endDouble) ) || + ( (currentDouble >= endDouble) && (currentDouble <= startDouble) ); + } +} + +-(NSValue *)tweenedValueForProgress:(CGFloat)progress +{ + NSNumber *start = (NSNumber *)self.startValue; + NSNumber *end = (NSNumber *)self.endValue; + + Class decimalClass = [NSDecimalNumber class]; + + if ( [start isKindOfClass:decimalClass] || [end isKindOfClass:decimalClass] ) { + NSDecimal startDecimal = start.decimalValue; + NSDecimal endDecimal = end.decimalValue; + + NSDecimal length = CPTDecimalSubtract(endDecimal, startDecimal); + NSDecimal tweenedValue = CPTDecimalAdd( startDecimal, CPTDecimalMultiply(CPTDecimalFromCGFloat(progress), length) ); + + return [NSDecimalNumber decimalNumberWithDecimal:tweenedValue]; + } + else { + double startDouble = start.doubleValue; + double endDouble = end.doubleValue; + + double tweenedValue = startDouble + (double)progress * (endDouble - startDouble); + + return @(tweenedValue); + } +} + +@end From aac3d3e003c28f60f724e721e034163a444bd8fe Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 14 Jan 2016 21:53:42 -0500 Subject: [PATCH 140/429] Added iPad Pro application icons to the example apps. --- .../AppIcon.appiconset/Contents.json | 6 ++++++ .../AppIcon.appiconset/Icon-iPadPro@2x.png | Bin 0 -> 36384 bytes .../AppIcon.appiconset/Contents.json | 6 ++++++ .../AppIcon.appiconset/Icon-iPadPro@2x.png | Bin 0 -> 27492 bytes 4 files changed, 12 insertions(+) create mode 100644 examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png create mode 100644 examples/CorePlotGallery/Plot Gallery-iOS/Images.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Contents.json index 9423e2f5b..e83d7ad6a 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Contents.json @@ -59,6 +59,12 @@ "idiom" : "ipad", "filename" : "Icon-76@2x.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-iPadPro@2x.png", + "scale" : "2x" } ], "info" : { diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png b/examples/CPTTestApp-iPad/CPTTestApp-iPad/Images.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..594df78efa45a03277091682eacb616ceaea6b42 GIT binary patch literal 36384 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 literal 0 HcmV?d00001 From f07f6122096fed37aab5fd392ac08ee1bd978258 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 14 Jan 2016 21:56:14 -0500 Subject: [PATCH 141/429] Fixed Xcode 7.3 static analyzer warnings. --- .../src/plots/ColoredBarChart.m | 1 + framework/Source/CPTAnimation.h | 2 +- framework/Source/CPTAnimation.m | 19 ++++---- framework/Source/CPTAnimationOperation.h | 5 +++ framework/Source/CPTAnimationOperation.m | 45 ++++++++++++++----- framework/Source/CPTAnimationPeriod.h | 4 +- framework/Source/CPTAnimationPeriod.m | 16 ++++--- framework/Source/CPTAxis.m | 12 ++--- framework/Source/CPTColor.m | 9 ++-- framework/Source/CPTImage.m | 4 +- framework/Source/CPTPieChart.m | 3 ++ framework/Source/CPTScatterPlot.m | 1 + framework/Source/CPTXYPlotSpace.m | 2 + framework/xcconfig/CorePlotWarnings.xcconfig | 2 +- 14 files changed, 81 insertions(+), 44 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 546302a25..304fa6223 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -205,6 +205,7 @@ -(CPTFill *)barFillForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)inde break; default: + color = [CPTColor blackColor]; break; } diff --git a/framework/Source/CPTAnimation.h b/framework/Source/CPTAnimation.h index e5455235d..8d3252e23 100644 --- a/framework/Source/CPTAnimation.h +++ b/framework/Source/CPTAnimation.h @@ -99,7 +99,7 @@ typedef NS_ENUM (NSInteger, CPTAnimationCurve) { /// @name Property Animation /// @{ -+(nonnull CPTAnimationOperation *)animate:(nullable id)object property:(nonnull NSString *)property period:(nullable CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nullable CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; /// @} /// @name Animation Management diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 49956f5bd..6ccc18f32 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -165,17 +165,14 @@ +(instancetype)sharedInstance **/ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property period:(CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate { - CPTAnimationOperation *animationOperation = [[CPTAnimationOperation alloc] init]; - - animationOperation.period = period; - animationOperation.animationCurve = animationCurve; - animationOperation.delegate = delegate; - - if ( object ) { - animationOperation.boundObject = object; - animationOperation.boundGetter = NSSelectorFromString(property); - animationOperation.boundSetter = [CPTAnimation setterFromProperty:property]; - } + CPTAnimationOperation *animationOperation = + [[CPTAnimationOperation alloc] initWithAnimationPeriod:period + animationCurve:animationCurve + object:object + getter:NSSelectorFromString(property) + setter:[CPTAnimation setterFromProperty:property]]; + + animationOperation.delegate = delegate; [[CPTAnimation sharedInstance] addAnimationOperation:animationOperation]; diff --git a/framework/Source/CPTAnimationOperation.h b/framework/Source/CPTAnimationOperation.h index 779f1940b..275a316fd 100644 --- a/framework/Source/CPTAnimationOperation.h +++ b/framework/Source/CPTAnimationOperation.h @@ -34,4 +34,9 @@ @property (nonatomic, readwrite, copy, nullable) NSDictionary *userInfo; /// @} +/// @name Initialization +/// @{ +-(nonnull instancetype)initWithAnimationPeriod:(nonnull CPTAnimationPeriod *)animationPeriod animationCurve:(CPTAnimationCurve)curve object:(nonnull id)object getter:(nonnull SEL)getter setter:(nonnull SEL)setter NS_DESIGNATED_INITIALIZER; +/// @} + @end diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index f99b29b43..f323e4d2e 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -42,7 +42,7 @@ @implementation CPTAnimationOperation @synthesize canceled; /** @property id identifier - * @brief An object used to identify the layer in collections. + * @brief An object used to identify the animation operation in collections. **/ @synthesize identifier; @@ -57,26 +57,32 @@ @implementation CPTAnimationOperation /** @brief Initializes a newly allocated CPTAnimationOperation object. * * This is the designated initializer. The initialized object will have the following properties: - * - @ref period = @nil - * - @ref animationCurve = #CPTAnimationCurveDefault - * - @ref boundObject = @nil - * - @ref boundGetter = @NULL - * - @ref boundSetter = @NULL + * - @ref period = @par{animationPeriod} + * - @ref animationCurve = @par{curve} + * - @ref boundObject = @par{object} + * - @ref boundGetter = @par{getter} + * - @ref boundSetter = @par{setter} * - @ref delegate = @nil * - @ref canceled = @NO * - @ref identifier = @nil * - @ref userInfo = @nil * + * @param animationPeriod The animation period. + * @param curve The animation curve. + * @param object The object to update for each animation frame. + * @param getter The @ref boundObject getter method for the property to update for each animation frame. + * @param setter The @ref boundObject setter method for the property to update for each animation frame. + * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)initWithAnimationPeriod:(nonnull CPTAnimationPeriod *)animationPeriod animationCurve:(CPTAnimationCurve)curve object:(nonnull id)object getter:(nonnull SEL)getter setter:(nonnull SEL)setter { if ( (self = [super init]) ) { - period = nil; - animationCurve = CPTAnimationCurveDefault; - boundObject = nil; - boundGetter = NULL; - boundSetter = NULL; + period = animationPeriod; + animationCurve = curve; + boundObject = object; + boundGetter = getter; + boundSetter = setter; delegate = nil; canceled = NO; identifier = nil; @@ -88,6 +94,21 @@ -(instancetype)init /// @} +/// @cond + +-(instancetype)init +{ + NSAssert(NO, @"Must call -initWithAnimationPeriod:animationCurve:object:getter:setter: to initialize a CPTAnimationOperation."); + + return [self initWithAnimationPeriod:[[CPTAnimationPeriod alloc] init] + animationCurve:CPTAnimationCurveDefault + object:[[NSObject alloc] init] + getter:@selector(init) + setter:@selector(init)]; +} + +/// @endcond + #pragma mark - #pragma mark Description diff --git a/framework/Source/CPTAnimationPeriod.h b/framework/Source/CPTAnimationPeriod.h index f0700e2c8..4bd0fc817 100644 --- a/framework/Source/CPTAnimationPeriod.h +++ b/framework/Source/CPTAnimationPeriod.h @@ -7,8 +7,8 @@ /// @name Timing Values /// @{ -@property (nonatomic, readwrite, copy, nonnull) NSValue *startValue; -@property (nonatomic, readwrite, copy, nonnull) NSValue *endValue; +@property (nonatomic, readwrite, copy, nullable) NSValue *startValue; +@property (nonatomic, readwrite, copy, nullable) NSValue *endValue; @property (nonatomic, readwrite) CGFloat duration; @property (nonatomic, readwrite) CGFloat delay; @property (nonatomic, readonly) CGFloat startOffset; diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index fd94a212c..d8a2f44eb 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -13,9 +13,9 @@ /// @cond @interface CPTAnimationPeriod() -+(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(instancetype)periodWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(instancetype)initWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; @property (nonatomic, readwrite) CGFloat startOffset; @@ -198,11 +198,13 @@ +(instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDec **/ +(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { + CPTPlotRange *startRange = aStartPlotRange; + if ( isnan(aStartPlotRange.locationDouble) || isnan(aStartPlotRange.lengthDouble) ) { - aStartPlotRange = nil; + startRange = nil; } - return [_CPTAnimationPlotRangePeriod periodWithStartValue:(NSValue *)aStartPlotRange + return [_CPTAnimationPlotRangePeriod periodWithStartValue:(NSValue *)startRange endValue:(NSValue *)anEndPlotRange duration:aDuration withDelay:aDelay]; @@ -363,11 +365,13 @@ -(instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecim **/ -(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { + CPTPlotRange *startRange = aStartPlotRange; + if ( isnan(aStartPlotRange.locationDouble) || isnan(aStartPlotRange.lengthDouble) ) { - aStartPlotRange = nil; + startRange = nil; } - self = [[_CPTAnimationPlotRangePeriod alloc] initWithStartValue:(NSValue *)aStartPlotRange + self = [[_CPTAnimationPlotRangePeriod alloc] initWithStartValue:(NSValue *)startRange endValue:(NSValue *)anEndPlotRange duration:aDuration withDelay:aDelay]; diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 1a5a18916..03bdddef1 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1319,16 +1319,16 @@ -(void)generateEqualMajorTickLocations:(CPTNumberSet __autoreleasing *)newMajorL NSDecimal CPTNiceNum(NSDecimal x) { NSDecimal zero = CPTDecimalFromInteger(0); - NSDecimal minusOne; if ( CPTDecimalEquals(x, zero) ) { return zero; } + NSDecimal minusOne = CPTDecimalFromInteger(-1); + BOOL xIsNegative = CPTDecimalLessThan(x, zero); if ( xIsNegative ) { - minusOne = CPTDecimalFromInteger(-1); - x = CPTDecimalMultiply(x, minusOne); + x = CPTDecimalMultiply(x, minusOne); } short exponent = (short)lrint( floor( log10( CPTDecimalDoubleValue(x) ) ) ); @@ -1369,16 +1369,16 @@ NSDecimal CPTNiceNum(NSDecimal x) NSDecimal CPTNiceLength(NSDecimal length) { NSDecimal zero = CPTDecimalFromInteger(0); - NSDecimal minusOne; if ( CPTDecimalEquals(length, zero) ) { return zero; } + NSDecimal minusOne = CPTDecimalFromInteger(-1); + BOOL isNegative = CPTDecimalLessThan(length, zero); if ( isNegative ) { - minusOne = CPTDecimalFromInteger(-1); - length = CPTDecimalMultiply(length, minusOne); + length = CPTDecimalMultiply(length, minusOne); } NSDecimal roundedNumber; diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 5e7f813d7..6d7d3adaf 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -460,10 +460,13 @@ -(id)copyWithZone:(NSZone *)zone if ( myColor ) { cgColorCopy = CGColorCreateCopy(myColor); + CPTColor *colorCopy = [[[self class] allocWithZone:zone] initWithCGColor:cgColorCopy]; + CGColorRelease(cgColorCopy); + return colorCopy; + } + else { + return nil; } - CPTColor *colorCopy = [[[self class] allocWithZone:zone] initWithCGColor:cgColorCopy]; - CGColorRelease(cgColorCopy); - return colorCopy; } /// @endcond diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index c955dc999..d0e7146ea 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -563,7 +563,7 @@ -(void)setEdgeInsets:(CPTEdgeInsets)newEdgeInsets if ( !CPTEdgeInsetsEqualToEdgeInsets(edgeInsets, newEdgeInsets) ) { edgeInsets = newEdgeInsets; - CPTImageSlices imageSlices; + CPTImageSlices imageSlices = {}; for ( NSUInteger i = 0; i < 9; i++ ) { imageSlices.slice[i] = NULL; @@ -607,7 +607,7 @@ -(void)makeImageSlices CGSize centerSize = CGSizeMake(width - capLeft - capRight, height - capTop - capBottom); - CPTImageSlices imageSlices; + CPTImageSlices imageSlices = {}; for ( NSUInteger i = 0; i < 9; i++ ) { imageSlices.slice[i] = NULL; diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 7b876ddf1..79f74ae84 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -594,6 +594,9 @@ -(void)renderAsVectorInContext:(CGContextRef)context bounds = CPTRectMake( centerPoint.x - radius, centerPoint.y - radius, radius * CPTFloat(2.0), radius * CPTFloat(2.0) ); } + else { + bounds = CGRectZero; + } [borderStyle setLineStyleInContext:context]; Class fillClass = [CPTFill class]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 8eaf87835..83d7b79dd 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -798,6 +798,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context break; default: + theAreaBaseValue = CPTDecimalNaN(); break; } if ( !NSDecimalIsNotANumber(&theAreaBaseValue) ) { diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 4896b0827..1be88bc27 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -547,6 +547,8 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif break; default: + property = @""; + oldRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@0]; break; } diff --git a/framework/xcconfig/CorePlotWarnings.xcconfig b/framework/xcconfig/CorePlotWarnings.xcconfig index 6b596ba98..599c13467 100644 --- a/framework/xcconfig/CorePlotWarnings.xcconfig +++ b/framework/xcconfig/CorePlotWarnings.xcconfig @@ -71,4 +71,4 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES -OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-incompatible-pointer-types-discards-qualifiers +OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-incompatible-pointer-types-discards-qualifiers -Wno-partial-availability From b1b3eb7ed7cc80720d6cf79f28d3c15e9ccd85c4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 14 Jan 2016 21:56:40 -0500 Subject: [PATCH 142/429] Updated all project files for Xcode 7.3. --- .../xcshareddata/xcschemes/Build & Copy.xcscheme | 5 +++-- .../xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme | 5 +++-- .../xcshareddata/xcschemes/AAPLot.xcscheme | 5 +++-- .../xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme | 5 +++-- .../xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme | 5 +++-- examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj | 3 ++- .../xcshareddata/xcschemes/CPTTestApp.xcscheme | 5 +++-- .../xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme | 5 +++-- .../xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme | 5 +++-- .../xcshareddata/xcschemes/DatePlot.xcscheme | 5 +++-- .../xcshareddata/xcschemes/DropPlot.xcscheme | 5 +++-- .../xcshareddata/xcschemes/minorTickFormatter.xcscheme | 5 +++-- .../xcshareddata/xcschemes/RangePlot.xcscheme | 5 +++-- .../xcshareddata/xcschemes/StockPlot.xcscheme | 5 +++-- .../xcshareddata/xcschemes/CorePlot Mac.xcscheme | 5 +++-- .../xcshareddata/xcschemes/CorePlot iOS.xcscheme | 8 +++++--- .../xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme | 8 +++++--- .../xcshareddata/xcschemes/Documentation-Mac.xcscheme | 5 +++-- .../xcshareddata/xcschemes/Documentation-iOS.xcscheme | 5 +++-- .../xcshareddata/xcschemes/Universal Library.xcscheme | 5 +++-- .../xcschemes/Universal iOS Framework.xcscheme | 5 +++-- 21 files changed, 66 insertions(+), 43 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme index b9c994259..4b733b333 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme @@ -1,6 +1,6 @@ + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "NO" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "NO" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> + buildForAnalyzing = "YES" + hideIssues = "NO"> Date: Thu, 14 Jan 2016 22:18:06 -0500 Subject: [PATCH 143/429] Added the bundle identifier to the Mac framework. Fixed issue #259. --- framework/CorePlot.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 23ee79bc7..e98570115 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2659,6 +2659,7 @@ INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; @@ -2677,6 +2678,7 @@ INFOPLIST_FILE = "$(SRCROOT)/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; From 7325c0bcf4cef311fcbd08c7a506f7e611412ecd Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 14 Jan 2016 22:26:57 -0500 Subject: [PATCH 144/429] Fixed Xcode 7.3 static analyzer warnings. --- framework/Source/CPTXYAxis.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 56798176a..eb719279d 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -21,7 +21,7 @@ -(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CP -(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper; -(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue; --(NSUInteger)initialBandIndexForSortedLocations:(nonnull CPTNumberArray *)sortedLocations inRange:(nonnull CPTMutablePlotRange *)range; +-(NSUInteger)initialBandIndexForSortedLocations:(nonnull CPTNumberArray *)sortedLocations inRange:(nullable CPTMutablePlotRange *)range; @end From e64fb6d6709391e64d01301474877f09017daa0e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Jan 2016 20:24:41 -0500 Subject: [PATCH 145/429] Added "Current Project Version" instructions to the release build instructions. --- scripts/README Creating a release package.md | 26 +++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 66c0c8999..2ed55f5dd 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -12,27 +12,29 @@ Follow these steps to create a Core Plot release and post it to GitHub: 2. Ensure the [change log](https://github.com/core-plot/core-plot/blob/master/documentation/changelog.markdown) and [podspec](https://github.com/core-plot/core-plot/blob/master/CorePlot.podspec) are up-to-date and committed to the Git repository. -3. Using Git, ensure your local Core Plot source directory is in sync with the public repository on GitHub. +3. In the "Core Plot" project build settings, set the "Current Project Version" to the release version. Commit the change in Git. -4. Open the Terminal application and `cd` to the root directory of your local Core Plot source directory. +4. Using Git, ensure your local Core Plot source directory is in sync with the public repository on GitHub. -5. Tag the current revision with the release version: +5. Open the Terminal application and `cd` to the root directory of your local Core Plot source directory. + +6. Tag the current revision with the release version: `$ git tag release_` where **<version>** is the version number for this release. -6. Change to the **scripts** folder: +7. Change to the **scripts** folder: `$ cd scripts` -7. Run the createrelease script: +8. Run the createrelease script: `$ python createrelease.py ` -8. Review the messages printed in the Terminal window and verify that all build steps succeeded. +9. Review the messages printed in the Terminal window and verify that all build steps succeeded. -9. The release products were placed in a folder called **CorePlot_<version>** and placed on your desktop. Open this folder and verify that the following subfolders and files are present: +10. The release products were placed in a folder called **CorePlot_<version>** and placed on your desktop. Open this folder and verify that the following subfolders and files are present:

  • Binaries/iOS/
  • @@ -43,13 +45,13 @@ Follow these steps to create a Core Plot release and post it to GitHub:
  • License.txt
-10. Right-click the release folder on your desktop and select **Compress "<filename>"** from the menu. +11. Right-click the release folder on your desktop and select **Compress "<filename>"** from the menu. -11. Log into GitHub and navigate to the [Releases](https://github.com/core-plot/core-plot/releases) page. +12. Log into GitHub and navigate to the [Releases](https://github.com/core-plot/core-plot/releases) page. -12. Click **Draft a new release**. +13. Click **Draft a new release**. -13. Select the tag for the new release (`release_`). +14. Select the tag for the new release (`release_`). Enter the following: @@ -58,7 +60,7 @@ Follow these steps to create a Core Plot release and post it to GitHub:
  • Binaries: drag the Core Plot zip file on your desktop to the box
  • -14. Click **Publish release**. +15. Click **Publish release**. # Update Documentation From 485252626c17d6a76f8efc834a1ddd5d7e4a8cc9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Jan 2016 20:25:21 -0500 Subject: [PATCH 146/429] Set the current project version. Fixed issue #260. --- framework/CorePlot.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index e98570115..7000f014e 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2689,6 +2689,7 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CURRENT_PROJECT_VERSION = 2.0; ENABLE_TESTABILITY = YES; ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -2698,6 +2699,7 @@ 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CURRENT_PROJECT_VERSION = 2.0; SYMROOT = "$(PROJECT_DIR)/../build"; }; name = Release; From 0b1f36e00fff7a1aa2df6b65117a85bdbf33aafa Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Jan 2016 20:26:34 -0500 Subject: [PATCH 147/429] Updated the current project version on the release 2.1 branch. --- framework/CorePlot.xcodeproj/project.pbxproj | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index f9adb2b2b..afbd6a9bb 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3253,7 +3253,6 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.8; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; @@ -3273,7 +3272,6 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.8; MACOSX_DEPLOYMENT_TARGET = 10.7; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; @@ -3286,7 +3284,7 @@ 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CURRENT_PROJECT_VERSION = 2.0; + CURRENT_PROJECT_VERSION = 2.1; ENABLE_TESTABILITY = YES; ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -3297,7 +3295,7 @@ 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CURRENT_PROJECT_VERSION = 2.0; + CURRENT_PROJECT_VERSION = 2.1; SYMROOT = "$(PROJECT_DIR)/../build"; TVOS_DEPLOYMENT_TARGET = 9.0; }; From abdfc34000a7aaaa2063cf1631ffe903b7d93eb4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 22 Jan 2016 15:09:23 -0500 Subject: [PATCH 148/429] Call super after caching new decimal values of the plot area bounds size. Fixed issue #261. --- framework/Source/CPTPlotArea.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 56ae066fa..15cbab954 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -904,10 +904,10 @@ -(void)setGraph:(CPTGraph *)newGraph -(void)setBounds:(CGRect)newBounds { if ( !CGRectEqualToRect(self.bounds, newBounds) ) { - [super setBounds:newBounds]; - self.widthDecimal = CPTDecimalFromCGFloat(newBounds.size.width); self.heightDecimal = CPTDecimalFromCGFloat(newBounds.size.height); + + [super setBounds:newBounds]; } } From 7eff4abf0040c8f451e7f077f6272f37f83117f0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 22 Jan 2016 18:39:36 -0500 Subject: [PATCH 149/429] Added an option to draw legend swatches to the left or right side of the title. Fixed issue #218. --- documentation/changelog.markdown | 1 + .../src/plots/CandlestickPlot.m | 6 ++- framework/Source/CPTLegend.h | 11 +++++ framework/Source/CPTLegend.m | 42 ++++++++++++++++--- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index ba591ae0d..686d1ecdc 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -10,6 +10,7 @@ To be determined. - **New**: Added an option to anchor alternating band fills to a specific starting value. - **New**: Added support for animating `NSNumber` properties with `CPTAnimation`. - **New**: Added support for `NSSecureCoding`. +- **New**: Added an option to draw legend swatches to the left or right side of the title. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index 2729cd7b5..52d79dc49 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -168,8 +168,10 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP newGraph.legend.borderLineStyle = newGraph.plotAreaFrame.borderLineStyle; newGraph.legend.cornerRadius = 5.0; newGraph.legend.swatchCornerRadius = 5.0; - newGraph.legendAnchor = CPTRectAnchorBottom; - newGraph.legendDisplacement = CGPointMake( 0.0, self.titleSize * CPTFloat(3.0) ); + newGraph.legend.swatchLayout = CPTLegendSwatchLayoutRight; + + newGraph.legendAnchor = CPTRectAnchorBottom; + newGraph.legendDisplacement = CGPointMake( 0.0, self.titleSize * CPTFloat(3.0) ); // Set plot ranges CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)newGraph.defaultPlotSpace; diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index b309a1641..a15240eac 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -28,6 +28,16 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; /// @} +/** + * @brief Enumeration of legend layout options. + **/ +typedef NS_ENUM (NSInteger, CPTLegendSwatchLayout) { + CPTLegendSwatchLayoutLeft, ///< Lay out the swatch to the left side of the title. + CPTLegendSwatchLayoutRight ///< Lay out the swatch to the right side of the title. +}; + +#pragma mark - + /** * @brief Legend delegate. **/ @@ -197,6 +207,7 @@ extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; @property (nonatomic, readwrite, assign) CGFloat columnMargin; @property (nonatomic, readwrite, assign) CGFloat rowMargin; @property (nonatomic, readwrite, assign) CGFloat titleOffset; +@property (nonatomic, readwrite, assign) CPTLegendSwatchLayout swatchLayout; /// @} /// @name Factory Methods diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index aecc3fc5f..1070f5ddf 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -207,6 +207,11 @@ @implementation CPTLegend **/ @synthesize titleOffset; +/** @property CPTLegendSwatchLayout swatchLayout + * @brief Draw the legend swatch to the left or right side of the title. Default is #CPTLegendSwatchLayoutLeft. + **/ +@synthesize swatchLayout; + /** @property CPTMutablePlotArray *plots * @brief An array of all plots associated with the legend. **/ @@ -282,6 +287,7 @@ +(instancetype)legendWithGraph:(CPTGraph *)graph * - @ref columnMargin = @num{10.0} * - @ref rowMargin = @num{5.0} * - @ref titleOffset = @num{5.0} + * - @ref swatchLayout = #CPTLegendSwatchLayoutLeft * - @ref paddingLeft = @num{5.0} * - @ref paddingTop = @num{5.0} * - @ref paddingRight = @num{5.0} @@ -320,6 +326,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame columnMargin = CPTFloat(10.0); rowMargin = CPTFloat(5.0); titleOffset = CPTFloat(5.0); + swatchLayout = CPTLegendSwatchLayoutLeft; pointingDeviceDownEntry = nil; @@ -396,6 +403,7 @@ -(instancetype)initWithLayer:(id)layer columnMargin = theLayer->columnMargin; rowMargin = theLayer->rowMargin; titleOffset = theLayer->titleOffset; + swatchLayout = theLayer->swatchLayout; pointingDeviceDownEntry = theLayer->pointingDeviceDownEntry; } @@ -444,6 +452,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeCGFloat:self.columnMargin forKey:@"CPTLegend.columnMargin"]; [coder encodeCGFloat:self.rowMargin forKey:@"CPTLegend.rowMargin"]; [coder encodeCGFloat:self.titleOffset forKey:@"CPTLegend.titleOffset"]; + [coder encodeInteger:(NSInteger)self.swatchLayout forKey:@"CPTLegend.swatchLayout"]; // No need to archive these properties: // pointingDeviceDownEntry @@ -489,6 +498,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder columnMargin = [coder decodeCGFloatForKey:@"CPTLegend.columnMargin"]; rowMargin = [coder decodeCGFloatForKey:@"CPTLegend.rowMargin"]; titleOffset = [coder decodeCGFloatForKey:@"CPTLegend.titleOffset"]; + swatchLayout = (CPTLegendSwatchLayout)[coder decodeIntegerForKey : @"CPTLegend.swatchLayout"]; pointingDeviceDownEntry = nil; } @@ -627,12 +637,28 @@ -(void)renderAsVectorInContext:(CGContextRef)context [theLineStyle strokePathInContext:context]; } + // lay out swatch and title + CGFloat swatchLeft; + CGFloat titleLeft; + + switch ( self.swatchLayout ) { + case CPTLegendSwatchLayoutLeft: + swatchLeft = left + padLeft; + titleLeft = swatchLeft + theSwatchSize.width + theOffset; + break; + + case CPTLegendSwatchLayoutRight: + swatchLeft = CGRectGetMaxX(entryRect) - padRight - theSwatchSize.width; + titleLeft = left + padLeft; + break; + } + // draw swatch - left += padLeft; - CGRect swatchRect = CPTRectMake(left, + CGRect swatchRect = CPTRectMake(swatchLeft, rowPosition + (entryRect.size.height - theSwatchSize.height) * CPTFloat(0.5), theSwatchSize.width, theSwatchSize.height); + BOOL legendShouldDrawSwatch = YES; if ( delegateCanDraw ) { legendShouldDrawSwatch = [theDelegate legend:self @@ -649,9 +675,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context } // draw title - left += theSwatchSize.width + theOffset; - - [legendEntry drawTitleInRect:CPTAlignRectToUserSpace( context, CPTRectMake(left, rowPosition + padBottom, actualColumnWidths[col] + CPTFloat(1.0), actualRowHeights[row]) ) + [legendEntry drawTitleInRect:CPTAlignRectToUserSpace( context, CPTRectMake(titleLeft, rowPosition + padBottom, actualColumnWidths[col] + CPTFloat(1.0), actualRowHeights[row]) ) inContext:context scale:self.contentsScale]; } @@ -1493,6 +1517,14 @@ -(void)setTitleOffset:(CGFloat)newTitleOffset } } +-(void)setSwatchLayout:(CPTLegendSwatchLayout)newSwatchLayout +{ + if ( newSwatchLayout != swatchLayout ) { + swatchLayout = newSwatchLayout; + self.layoutChanged = YES; + } +} + -(void)setLayoutChanged:(BOOL)newLayoutChanged { if ( newLayoutChanged != layoutChanged ) { From 314cebd2552c1c49603bb16b2108eedfce2e41fc Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 6 Feb 2016 13:15:27 -0500 Subject: [PATCH 150/429] Updated the Uncrustify config file for 0.62. --- scripts/uncrustify.cfg | 62 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/scripts/uncrustify.cfg b/scripts/uncrustify.cfg index 20202e81f..af6a1fc0b 100644 --- a/scripts/uncrustify.cfg +++ b/scripts/uncrustify.cfg @@ -1,10 +1,14 @@ -# Uncrustify 0.60 +# Uncrustify 0.62 newlines = auto input_tab_size = 4 output_tab_size = 4 string_escape_char = 92 string_escape_char2 = 0 +string_replace_tab_chars = false tok_split_gte = false +disable_processing_cmt = "" +enable_processing_cmt = "" +enable_digraphs = false utf8_bom = remove utf8_byte = false utf8_force = false @@ -20,17 +24,22 @@ indent_braces_no_func = false indent_braces_no_class = false indent_braces_no_struct = false indent_brace_parent = false +indent_paren_open_brace = false indent_namespace = false +indent_namespace_single_indent = false indent_namespace_level = 0 indent_namespace_limit = 0 indent_extern = false indent_class = true indent_class_colon = false +indent_class_on_colon = false +indent_constr_colon = false indent_ctor_init_leading = 2 indent_ctor_init = 0 indent_else_if = false indent_var_def_blk = 0 indent_var_def_cont = false +indent_shift = false indent_func_def_force_col1 = false indent_func_call_param = false indent_func_def_param = false @@ -62,6 +71,14 @@ indent_align_assign = true indent_oc_block = true indent_oc_block_msg = 0 indent_oc_msg_colon = 0 +indent_oc_msg_prioritize_first_colon = true +indent_oc_block_msg_xcode_style = false +indent_oc_block_msg_from_keyword = false +indent_oc_block_msg_from_colon = false +indent_oc_block_msg_from_caret = false +indent_oc_block_msg_from_brace = false +indent_min_vbrace_open = 0 +indent_vbrace_open_on_tabstop = false sp_arith = force sp_assign = force sp_cpp_lambda_assign = ignore @@ -69,6 +86,7 @@ sp_cpp_lambda_paren = ignore sp_assign_default = force sp_before_assign = ignore sp_after_assign = ignore +sp_enum_paren = force sp_enum_assign = force sp_enum_before_assign = ignore sp_enum_after_assign = ignore @@ -86,6 +104,7 @@ sp_before_ptr_star = force sp_before_unnamed_ptr_star = force sp_between_ptr_star = remove sp_after_ptr_star = remove +sp_after_ptr_star_qualifier = remove sp_after_ptr_star_func = remove sp_ptr_star_paren = remove sp_before_ptr_star_func = force @@ -124,10 +143,15 @@ sp_before_squares = remove sp_inside_square = remove sp_after_comma = force sp_before_comma = remove +sp_after_mdatype_commas = remove +sp_before_mdatype_commas = remove +sp_between_mdatype_commas = remove sp_paren_comma = force sp_before_ellipsis = remove sp_after_class_colon = force sp_before_class_colon = force +sp_after_constr_colon = remove +sp_before_constr_colon = remove sp_before_case_colon = remove sp_after_operator = remove sp_after_operator_sym = force @@ -149,6 +173,7 @@ sp_inside_tparen = remove sp_after_tparen_close = remove sp_square_fparen = remove sp_fparen_brace = force +sp_fparen_dbrace = ignore sp_func_call_paren = remove sp_func_call_paren_empty = ignore sp_func_call_user_paren = remove @@ -202,15 +227,23 @@ sp_after_oc_block_caret = remove sp_after_oc_msg_receiver = force sp_after_oc_property = force sp_cond_colon = force +sp_cond_colon_before = ignore +sp_cond_colon_after = ignore sp_cond_question = force +sp_cond_question_before = ignore +sp_cond_question_after = ignore +sp_cond_ternary_short = ignore sp_case_label = force sp_range = ignore sp_after_for_colon = ignore sp_before_for_colon = ignore sp_extern_paren = remove -sp_cmt_cpp_start = ignore +sp_cmt_cpp_start = force +sp_cmt_cpp_doxygen = true +sp_cmt_cpp_qttr = false sp_endif_cmt = force sp_after_new = force +sp_between_new_paren = ignore sp_before_tr_emb_cmt = force sp_num_before_tr_emb_cmt = 1 sp_annotation_paren = ignore @@ -270,6 +303,7 @@ nl_getset_leave_one_liners = false nl_func_leave_one_liners = true nl_cpp_lambda_leave_one_liners = false nl_if_leave_one_liners = false +nl_while_leave_one_liners = false nl_oc_msg_leave_one_liner = false nl_start_of_file = remove nl_start_of_file_min = 0 @@ -301,6 +335,8 @@ nl_getset_brace = force nl_for_brace = remove nl_catch_brace = remove nl_brace_catch = force +nl_brace_square = ignore +nl_brace_fparen = ignore nl_while_brace = remove nl_scope_brace = ignore nl_unittest_brace = ignore @@ -310,6 +346,7 @@ nl_brace_brace = force nl_do_brace = remove nl_brace_while = force nl_switch_brace = remove +nl_synchronized_brace = remove nl_multi_line_cond = false nl_multi_line_define = false nl_before_case = true @@ -320,29 +357,31 @@ nl_namespace_brace = force nl_template_class = force nl_class_brace = force nl_class_init_args = force +nl_constr_init_args = ignore nl_func_type_name = remove nl_func_type_name_class = ignore nl_func_scope_name = remove nl_func_proto_type_name = remove nl_func_paren = remove -nl_func_def_paren = ignore +nl_func_def_paren = remove nl_func_decl_start = remove -nl_func_def_start = ignore +nl_func_def_start = remove nl_func_decl_start_single = ignore nl_func_def_start_single = ignore nl_func_decl_args = ignore nl_func_def_args = ignore -nl_func_decl_end = ignore -nl_func_def_end = ignore +nl_func_decl_end = remove +nl_func_def_end = remove nl_func_decl_end_single = ignore nl_func_def_end_single = ignore -nl_func_decl_empty = ignore -nl_func_def_empty = ignore +nl_func_decl_empty = remove +nl_func_def_empty = remove nl_oc_msg_args = false nl_fdef_brace = force nl_cpp_ldef_brace = ignore nl_return_expr = remove nl_after_semicolon = true +nl_paren_dbrace_open = ignore nl_after_brace_open = true nl_after_brace_open_cmt = false nl_after_vbrace_open = true @@ -360,11 +399,14 @@ nl_before_while = ignore nl_after_while = ignore nl_before_switch = ignore nl_after_switch = ignore +nl_before_synchronized = ignore +nl_after_synchronized = ignore nl_before_do = ignore nl_after_do = ignore nl_ds_struct_enum_cmt = false nl_ds_struct_enum_close_brace = false nl_class_colon = remove +nl_constr_colon = ignore nl_create_if_one_liner = true nl_create_for_one_liner = false nl_create_while_one_liner = false @@ -375,7 +417,9 @@ pos_compare = trail pos_conditional = trail pos_comma = trail pos_class_comma = trail +pos_constr_comma = ignore pos_class_colon = trail +pos_constr_colon = ignore code_width = 0 ls_for_split_full = true ls_func_split_full = true @@ -390,6 +434,7 @@ nl_before_block_comment = 2 nl_before_c_comment = 2 nl_before_cpp_comment = 1 nl_after_multiline_comment = false +nl_after_label_colon = false nl_after_struct = 0 nl_after_class = 0 nl_before_access_spec = 2 @@ -431,6 +476,7 @@ mod_case_brace = remove mod_remove_empty_return = true cmt_width = 0 cmt_reflow_mode = 0 +cmt_convert_tab_to_spaces = true cmt_indent_multi = true cmt_c_group = true cmt_c_nl_start = true From de2364d40c0714c91ff99ad392a0591fa89710d4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 6 Feb 2016 13:15:52 -0500 Subject: [PATCH 151/429] Formatted code with the new Uncrustify settings. --- QCPlugin/CPTBarPlotPlugin.m | 2 +- QCPlugin/CPTPieChartPlugin.m | 2 +- QCPlugin/CorePlotQCPlugin.m | 4 +- examples/AAPLot/APFinancialData.m | 2 +- examples/AAPLot/APYahooDataPuller.m | 14 +- examples/AAPLot/Classes/AAPLotAppDelegate.h | 8 +- examples/AAPLot/Classes/AAPLotAppDelegate.m | 8 +- examples/AAPLot/Classes/FlipsideView.h | 8 +- examples/AAPLot/Classes/FlipsideView.m | 8 +- .../AAPLot/Classes/FlipsideViewController.h | 8 +- .../AAPLot/Classes/FlipsideViewController.m | 8 +- examples/AAPLot/Classes/MainViewController.m | 24 +-- examples/AAPLot/Classes/RootViewController.h | 8 +- examples/AAPLot/Classes/RootViewController.m | 8 +- .../Classes/CPTTestApp_iPadAppDelegate.h | 6 +- .../Classes/CPTTestApp_iPadAppDelegate.m | 6 +- .../Classes/CPTTestApp_iPadViewController.h | 6 +- .../Classes/CPTTestApp_iPadViewController.m | 8 +- examples/CPTTestApp-iPad/main.m | 6 +- .../Source/CPTPlotSymbolTestController.m | 4 +- examples/CPTTestApp/Source/Controller.m | 4 +- examples/CPTTestApp/Source/RotationView.h | 4 +- examples/CPTTestApp/Source/RotationView.m | 4 +- .../Source/SelectionDemoController.m | 10 +- examples/CPTTestApp/Source/main.m | 8 +- .../CorePlotGallery/src/ios/AppDelegate.h | 4 +- .../CorePlotGallery/src/ios/AppDelegate.m | 6 +- .../src/ios/DetailViewController.h | 4 +- .../src/ios/DetailViewController.m | 4 +- .../src/ios/RootViewController.h | 4 +- .../src/ios/RootViewController.m | 6 +- .../src/ios/ThemeTableViewController.h | 4 +- .../src/ios/ThemeTableViewController.m | 4 +- examples/CorePlotGallery/src/ios/main.m | 4 +- .../src/mac/PlotGalleryController.h | 4 +- .../src/mac/PlotGalleryController.m | 8 +- examples/CorePlotGallery/src/mac/PlotView.h | 4 +- examples/CorePlotGallery/src/mac/PlotView.m | 4 +- .../src/mac/Plot_Gallery_MacAppDelegate.h | 4 +- .../src/mac/Plot_Gallery_MacAppDelegate.m | 4 +- examples/CorePlotGallery/src/mac/main.m | 4 +- examples/CorePlotGallery/src/plots/AxisDemo.h | 4 +- examples/CorePlotGallery/src/plots/AxisDemo.m | 4 +- .../src/plots/CandlestickPlot.h | 4 +- .../src/plots/CandlestickPlot.m | 4 +- .../src/plots/ColoredBarChart.m | 2 +- .../CorePlotGallery/src/plots/CompositePlot.h | 4 +- .../CorePlotGallery/src/plots/CompositePlot.m | 10 +- .../src/plots/CurvedScatterPlot.h | 6 +- .../src/plots/CurvedScatterPlot.m | 10 +- examples/CorePlotGallery/src/plots/DatePlot.h | 4 +- examples/CorePlotGallery/src/plots/DatePlot.m | 4 +- .../CorePlotGallery/src/plots/DonutChart.m | 4 +- .../src/plots/GradientScatterPlot.h | 4 +- .../src/plots/GradientScatterPlot.m | 4 +- .../CorePlotGallery/src/plots/ImageDemo.h | 4 +- .../CorePlotGallery/src/plots/ImageDemo.m | 4 +- .../src/plots/LabelingPolicyDemo.h | 4 +- .../src/plots/LabelingPolicyDemo.m | 4 +- .../CorePlotGallery/src/plots/LineCapDemo.h | 4 +- .../CorePlotGallery/src/plots/LineCapDemo.m | 4 +- examples/CorePlotGallery/src/plots/OHLCPlot.h | 4 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 4 +- .../CorePlotGallery/src/plots/PlotSpaceDemo.h | 4 +- .../CorePlotGallery/src/plots/PlotSpaceDemo.m | 4 +- .../CorePlotGallery/src/plots/RangePlot.h | 4 +- .../CorePlotGallery/src/plots/RangePlot.m | 4 +- .../CorePlotGallery/src/plots/RealTimePlot.h | 4 +- .../CorePlotGallery/src/plots/RealTimePlot.m | 4 +- .../src/plots/SimplePieChart.h | 4 +- .../src/plots/SimplePieChart.m | 4 +- .../src/plots/SimpleScatterPlot.h | 4 +- .../src/plots/SimpleScatterPlot.m | 4 +- .../src/plots/SteppedScatterPlot.h | 4 +- .../src/plots/SteppedScatterPlot.m | 4 +- .../src/plots/VerticalBarChart.h | 4 +- .../src/plots/VerticalBarChart.m | 4 +- .../src/shared/PiNumberFormatter.m | 8 +- .../CorePlotGallery/src/shared/PlotGallery.h | 4 +- .../CorePlotGallery/src/shared/PlotGallery.m | 4 +- .../CorePlotGallery/src/shared/PlotItem.h | 4 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +- examples/DropPlot/CPTPlotDocument.m | 8 +- examples/DropPlot/main.m | 8 +- examples/MinorTickLabels/Controller.m | 2 +- examples/MinorTickLabels/Source/main.m | 8 +- examples/RangePlot/Source/main.m | 8 +- .../StockPlot/Classes/APYahooDataPuller.m | 14 +- .../Classes/APYahooDataPullerGraph.h | 8 +- .../Classes/APYahooDataPullerGraph.m | 16 +- .../Classes/NSDictionary+APFinancialData.m | 2 +- .../StockPlot/Classes/RootViewController.h | 8 +- .../StockPlot/Classes/RootViewController.m | 26 ++-- .../StockPlot/Classes/StockPlotAppDelegate.h | 8 +- .../StockPlot/Classes/StockPlotAppDelegate.m | 8 +- examples/StockPlot/main.m | 8 +- framework/Source/CPTAnimation.m | 4 +- framework/Source/CPTAnimationPeriod.m | 144 +++++++++--------- framework/Source/CPTAxis.m | 24 +-- framework/Source/CPTAxisLabel.m | 2 +- framework/Source/CPTCalendarFormatter.m | 2 +- framework/Source/CPTColor.m | 2 +- framework/Source/CPTColorSpaceTests.m | 2 +- framework/Source/CPTDataSourceTestCase.m | 2 +- framework/Source/CPTGradient.m | 98 ++++++------ framework/Source/CPTGraph.m | 4 +- framework/Source/CPTImage.m | 2 +- framework/Source/CPTLayer.m | 4 +- framework/Source/CPTLayerAnnotation.m | 2 +- framework/Source/CPTLegend.m | 16 +- framework/Source/CPTLegendEntry.m | 6 +- framework/Source/CPTLineCap.m | 2 +- framework/Source/CPTLineStyle.m | 4 +- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTNumericData.m | 8 +- framework/Source/CPTPieChart.m | 14 +- framework/Source/CPTPlot.m | 14 +- framework/Source/CPTPlotSpace.m | 2 +- framework/Source/CPTPlotSymbol.m | 2 +- framework/Source/CPTScatterPlot.m | 4 +- framework/Source/CPTTextStyle.m | 4 +- framework/Source/CPTTradingRangePlot.m | 2 +- framework/Source/CPTXYGraph.m | 4 +- framework/Source/CPTXYPlotSpace.m | 40 ++--- framework/Source/NSCoderExtensions.m | 18 +-- .../Source/_CPTAnimationNSDecimalPeriod.m | 8 +- .../Source/_CPTAnimationPlotRangePeriod.m | 4 +- framework/Source/_CPTMaskLayer.m | 6 +- 128 files changed, 507 insertions(+), 507 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 6ae8ae6be..1153dc6e8 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -177,7 +177,7 @@ -(BOOL)configurePlots plot.barWidth = @(barWidth); plot.barOffset = @(self.inputBarOffset); plot.barsAreHorizontal = self.inputHorizontalBars; - plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:(CGColorRef)[self areaFillColor : index]]]; + plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:(CGColorRef)[self areaFillColor:index]]]; [plot reloadData]; } diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index c38afa8f7..3089cd0c1 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -242,7 +242,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI -(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index { CGColorRef plotFillColor = [[CPTPieChart defaultPieSliceColorForIndex:index] cgColor]; - CGColorRef inputFillColor = (CGColorRef)[self areaFillColor : 0]; + CGColorRef inputFillColor = (CGColorRef)[self areaFillColor:0]; const CGFloat *plotColorComponents = CGColorGetComponents(plotFillColor); const CGFloat *inputColorComponents = CGColorGetComponents(inputFillColor); diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index 043e6b292..8b34bea00 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -699,7 +699,7 @@ -(void)setSerializedValue:(id)serializedValue forKey:(NSString *)key */ if ( [key isEqualToString:@"numberOfPlots"] ) { - [self setNumberOfPlots:MAX(1, [(NSNumber *)serializedValue unsignedIntegerValue])]; + [self setNumberOfPlots:MAX(1, [(NSNumber *) serializedValue unsignedIntegerValue])]; } else { [super setSerializedValue:serializedValue forKey:key]; @@ -824,7 +824,7 @@ -(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArgu drawErrorText( bmContext, CPTRectMake(0, 0, self.inputPixelsWide, self.inputPixelsHigh) ); } - //CGContextSetAllowsAntialiasing(bitmapContext, false); + // CGContextSetAllowsAntialiasing(bitmapContext, false); CGContextFlush(bmContext); // ... and put it on the output port diff --git a/examples/AAPLot/APFinancialData.m b/examples/AAPLot/APFinancialData.m index 9598755e5..cce58345d 100644 --- a/examples/AAPLot/APFinancialData.m +++ b/examples/AAPLot/APFinancialData.m @@ -27,7 +27,7 @@ +(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:csvChunks[6]]; csvDict[@"adjClose"] = theAdjClose; - //non-mutable autoreleased dict + // non-mutable autoreleased dict return [NSDictionary dictionaryWithDictionary:csvDict]; } diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 4f6c5d3c2..555f69d7b 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -59,7 +59,7 @@ -(void)setDelegate:(id)aDelegate if ( delegate != aDelegate ) { delegate = aDelegate; if ( self.financialData.count > 0 ) { - [self notifyPulledData]; //loads cached data onto UI + [self notifyPulledData]; // loads cached data onto UI } } } @@ -121,13 +121,13 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol NSString *docPath = [self pathForSymbol:aSymbol]; if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { - //if there isn't one in the user's documents directory, see if we ship with this data + // if there isn't one in the user's documents directory, see if we ship with this data docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } -//Always returns *something* +// Always returns *something* -(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; @@ -158,7 +158,7 @@ -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate -(instancetype)init { - NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); //12 weeks ago + NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; NSDate *end = [NSDate date]; @@ -239,7 +239,7 @@ -(void)fetch self.receivedData = [NSMutableData data]; } else { - //TODO: Inform the user that the download could not be started + // TODO: Inform the user that the download could not be started self.loadingData = NO; } } @@ -277,7 +277,7 @@ -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro self.receivedData = nil; self.connection = nil; NSLog(@"err = %@", [error localizedDescription]); - //TODO:report err + // TODO:report err } -(void)connectionDidFinishLoading:(NSURLConnection *)connection @@ -291,7 +291,7 @@ -(void)connectionDidFinishLoading:(NSURLConnection *)connection self.receivedData = nil; [self parseCSVAndPopulate]; - //see if we need to write to file + // see if we need to write to file CPTDictionary dictionaryForSymbol = [self dictionaryForSymbol:self.symbol]; BOOL sameSymbol = NO; diff --git a/examples/AAPLot/Classes/AAPLotAppDelegate.h b/examples/AAPLot/Classes/AAPLotAppDelegate.h index c55b9f096..4137a735c 100644 --- a/examples/AAPLot/Classes/AAPLotAppDelegate.h +++ b/examples/AAPLot/Classes/AAPLotAppDelegate.h @@ -1,9 +1,9 @@ // -// AAPLotAppDelegate.h -// AAPLot +// AAPLotAppDelegate.h +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import diff --git a/examples/AAPLot/Classes/AAPLotAppDelegate.m b/examples/AAPLot/Classes/AAPLotAppDelegate.m index bc20eff63..403119616 100644 --- a/examples/AAPLot/Classes/AAPLotAppDelegate.m +++ b/examples/AAPLot/Classes/AAPLotAppDelegate.m @@ -1,9 +1,9 @@ // -// AAPLotAppDelegate.m -// AAPLot +// AAPLotAppDelegate.m +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import "AAPLotAppDelegate.h" diff --git a/examples/AAPLot/Classes/FlipsideView.h b/examples/AAPLot/Classes/FlipsideView.h index 9a407b402..26746ed6f 100644 --- a/examples/AAPLot/Classes/FlipsideView.h +++ b/examples/AAPLot/Classes/FlipsideView.h @@ -1,9 +1,9 @@ // -// FlipsideView.h -// AAPLot +// FlipsideView.h +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import diff --git a/examples/AAPLot/Classes/FlipsideView.m b/examples/AAPLot/Classes/FlipsideView.m index 21d8c4f55..2c582d751 100644 --- a/examples/AAPLot/Classes/FlipsideView.m +++ b/examples/AAPLot/Classes/FlipsideView.m @@ -1,9 +1,9 @@ // -// FlipsideView.m -// AAPLot +// FlipsideView.m +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import "FlipsideView.h" diff --git a/examples/AAPLot/Classes/FlipsideViewController.h b/examples/AAPLot/Classes/FlipsideViewController.h index ed84c2d55..ae62c708e 100644 --- a/examples/AAPLot/Classes/FlipsideViewController.h +++ b/examples/AAPLot/Classes/FlipsideViewController.h @@ -1,9 +1,9 @@ // -// FlipsideViewController.h -// AAPLot +// FlipsideViewController.h +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import diff --git a/examples/AAPLot/Classes/FlipsideViewController.m b/examples/AAPLot/Classes/FlipsideViewController.m index 727f8548e..3758a24b3 100644 --- a/examples/AAPLot/Classes/FlipsideViewController.m +++ b/examples/AAPLot/Classes/FlipsideViewController.m @@ -1,9 +1,9 @@ // -// FlipsideViewController.m -// AAPLot +// FlipsideViewController.m +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import "FlipsideViewController.h" diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index 0a648c6ab..0e45eed38 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -386,7 +386,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -411,7 +411,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -438,7 +438,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -463,7 +463,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -490,7 +490,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -533,7 +533,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa for ( int fieldEnum = 0; fieldEnum < numFields; fieldEnum++ ) { for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { - CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex : financialDataCount - i - 1]; + CPTDictionary fData = (CPTDictionary)[financialData objectAtIndex:financialDataCount - i - 1]; NSNumber *value; switch ( fieldEnum ) { @@ -585,7 +585,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index { - if ( ![(NSString *)plot.identifier isEqualToString : @"OHLC"] ) { + if ( ![(NSString *) plot.identifier isEqualToString:@"OHLC"] ) { return (id)[NSNull null]; // Don't show any label } else if ( index % 5 ) { @@ -642,7 +642,7 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp NSDecimalNumber *volumeLengthDisplayLocation = [volumeLength decimalNumberByAdding:volumeLengthDisplacementValue]; volumePlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(thePuller.financialData.count + 1)]; -// volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation]; +// volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation]; if ( animationOperation ) { [[CPTAnimation sharedInstance] removeAnimationOperation:animationOperation]; @@ -651,10 +651,10 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp if ( volumeLowDisplayLocation && volumeLengthDisplayLocation ) { animationOperation = [CPTAnimation animate:volumePlotSpace property:@"yRange" - fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] - lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] - toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation - length:volumeLengthDisplayLocation] + fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] + lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] + toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation + length:volumeLengthDisplayLocation] duration:2.5]; } diff --git a/examples/AAPLot/Classes/RootViewController.h b/examples/AAPLot/Classes/RootViewController.h index 57e4a4988..5cacc5b83 100644 --- a/examples/AAPLot/Classes/RootViewController.h +++ b/examples/AAPLot/Classes/RootViewController.h @@ -1,9 +1,9 @@ // -// RootViewController.h -// AAPLot +// RootViewController.h +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import diff --git a/examples/AAPLot/Classes/RootViewController.m b/examples/AAPLot/Classes/RootViewController.m index 120ecc7a2..ab9c6cce8 100644 --- a/examples/AAPLot/Classes/RootViewController.m +++ b/examples/AAPLot/Classes/RootViewController.m @@ -1,9 +1,9 @@ // -// RootViewController.m -// AAPLot +// RootViewController.m +// AAPLot // -// Created by Jonathan Saggau on 6/9/09. -// Copyright Sounds Broken inc. 2009. All rights reserved. +// Created by Jonathan Saggau on 6/9/09. +// Copyright Sounds Broken inc. 2009. All rights reserved. // #import "FlipsideViewController.h" diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h index 8ba37367e..42261c864 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h @@ -1,8 +1,8 @@ // -// CPTTestApp_iPadAppDelegate.h -// CPTTestApp-iPad +// CPTTestApp_iPadAppDelegate.h +// CPTTestApp-iPad // -// Created by Brad Larson on 4/1/2010. +// Created by Brad Larson on 4/1/2010. // #import diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m index efbdfc2ac..9f89da1a0 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m @@ -1,8 +1,8 @@ // -// CPTTestApp_iPadAppDelegate.m -// CPTTestApp-iPad +// CPTTestApp_iPadAppDelegate.m +// CPTTestApp-iPad // -// Created by Brad Larson on 4/1/2010. +// Created by Brad Larson on 4/1/2010. // #import "CPTTestApp_iPadAppDelegate.h" diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h index d41e34802..76c78dcd5 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h @@ -1,8 +1,8 @@ // -// CPTTestApp_iPadViewController.h -// CPTTestApp-iPad +// CPTTestApp_iPadViewController.h +// CPTTestApp-iPad // -// Created by Brad Larson on 4/1/2010. +// Created by Brad Larson on 4/1/2010. // #import "CorePlot-CocoaTouch.h" diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 813ed5be3..179693462 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -1,8 +1,8 @@ // -// CPTTestApp_iPadViewController.m -// CPTTestApp-iPad +// CPTTestApp_iPadViewController.m +// CPTTestApp-iPad // -// Created by Brad Larson on 4/1/2010. +// Created by Brad Larson on 4/1/2010. // #import "CPTTestApp_iPadViewController.h" @@ -386,7 +386,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); num = self.dataForPlot[index][key]; // Green plot gets shifted above the blue - if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { + if ( [(NSString *) plot.identifier isEqualToString:@"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { num = @([num doubleValue] + 1.0); } diff --git a/examples/CPTTestApp-iPad/main.m b/examples/CPTTestApp-iPad/main.m index 9ab34edf9..fa2ec758c 100644 --- a/examples/CPTTestApp-iPad/main.m +++ b/examples/CPTTestApp-iPad/main.m @@ -1,8 +1,8 @@ // -// main.m -// CPTTestApp-iPad +// main.m +// CPTTestApp-iPad // -// Created by Brad Larson on 4/1/2010. +// Created by Brad Larson on 4/1/2010. // #import diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index ec5e347ac..4dd744c97 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -82,7 +82,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI break; case CPTScatterPlotFieldY: - num = @([(NSString *)plot.identifier integerValue]); + num = @([(NSString *) plot.identifier integerValue]); break; default: @@ -103,7 +103,7 @@ -(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUIn symbolShadow.shadowColor = [CPTColor blackColor]; CPTPlotSymbol *symbol = [[CPTPlotSymbol alloc] init]; - symbol.symbolType = (CPTPlotSymbolType)[(NSString *)plot.identifier intValue]; + symbol.symbolType = (CPTPlotSymbolType)[(NSString *) plot.identifier intValue]; symbol.fill = [CPTFill fillWithGradient:gradientFill]; symbol.shadow = symbolShadow; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 92c910ad3..f6b4c1d2e 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -431,10 +431,10 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index { - if ( [(NSString *)plot.identifier isEqualToString : barPlot2] ) { + if ( [(NSString *) plot.identifier isEqualToString:barPlot2] ) { return (id)[NSNull null]; // Don't show any label } - else if ( [(NSString *)plot.identifier isEqualToString : barPlot1] && (index < 4) ) { + else if ( [(NSString *) plot.identifier isEqualToString:barPlot1] && (index < 4) ) { return (id)[NSNull null]; } else if ( index % 4 ) { diff --git a/examples/CPTTestApp/Source/RotationView.h b/examples/CPTTestApp/Source/RotationView.h index b8917b021..ab5a2912f 100644 --- a/examples/CPTTestApp/Source/RotationView.h +++ b/examples/CPTTestApp/Source/RotationView.h @@ -1,6 +1,6 @@ // -// RotationView.h -// CPTTestApp +// RotationView.h +// CPTTestApp // #import diff --git a/examples/CPTTestApp/Source/RotationView.m b/examples/CPTTestApp/Source/RotationView.m index 429f143a6..92c2405c5 100644 --- a/examples/CPTTestApp/Source/RotationView.m +++ b/examples/CPTTestApp/Source/RotationView.m @@ -1,6 +1,6 @@ // -// 3DRotationView.m -// CPTTestApp +// 3DRotationView.m +// CPTTestApp // #import "RotationView.h" diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index d6e61cd49..007cfb64b 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -186,10 +186,10 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot { NSUInteger count = 0; - if ( [(NSString *)plot.identifier isEqualToString : MAIN_PLOT] ) { + if ( [(NSString *) plot.identifier isEqualToString:MAIN_PLOT] ) { count = [self.dataForPlot count]; } - else if ( [(NSString *)plot.identifier isEqualToString : SELECTION_PLOT] ) { + else if ( [(NSString *) plot.identifier isEqualToString:SELECTION_PLOT] ) { if ( self.selectedIndex < NSUIntegerMax ) { count = 5; } @@ -202,11 +202,11 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI { NSNumber *num = nil; - if ( [(NSString *)plot.identifier isEqualToString : MAIN_PLOT] ) { + if ( [(NSString *) plot.identifier isEqualToString:MAIN_PLOT] ) { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); num = (self.dataForPlot)[index][key]; } - else if ( [(NSString *)plot.identifier isEqualToString : SELECTION_PLOT] ) { + else if ( [(NSString *) plot.identifier isEqualToString:SELECTION_PLOT] ) { CPTXYPlotSpace *thePlotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; switch ( fieldEnum ) { @@ -266,7 +266,7 @@ -(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUIn CPTPlotSymbol *symbol = (id)[NSNull null]; - if ( [(NSString *)plot.identifier isEqualToString : SELECTION_PLOT] && (index == 2) ) { + if ( [(NSString *) plot.identifier isEqualToString:SELECTION_PLOT] && (index == 2) ) { if ( !redDot ) { redDot = [[CPTPlotSymbol alloc] init]; redDot.symbolType = CPTPlotSymbolTypeEllipse; diff --git a/examples/CPTTestApp/Source/main.m b/examples/CPTTestApp/Source/main.m index e8a345f07..4177914fd 100644 --- a/examples/CPTTestApp/Source/main.m +++ b/examples/CPTTestApp/Source/main.m @@ -1,9 +1,9 @@ // -// main.m -// CPTTestApp +// main.m +// CPTTestApp // -// Created by Dirkjan Krijnders on 2/2/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Dirkjan Krijnders on 2/2/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // int main(int argc, const char *argv[]) diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.h b/examples/CorePlotGallery/src/ios/AppDelegate.h index c39b0224c..d34bfcad8 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.h +++ b/examples/CorePlotGallery/src/ios/AppDelegate.h @@ -1,6 +1,6 @@ // -// AppDelegate.h -// CorePlotGallery +// AppDelegate.h +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index 0b50f831b..9dd1fd212 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -1,6 +1,6 @@ // -// AppDelegate.m -// CorePlotGallery +// AppDelegate.m +// CorePlotGallery // #import "AppDelegate.h" @@ -35,7 +35,7 @@ -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(C -(BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController { - if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil) ) { + if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *) secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *) secondaryViewController topViewController] detailItem] == nil) ) { // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. return YES; } diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.h b/examples/CorePlotGallery/src/ios/DetailViewController.h index 5948c7918..2d13e52a2 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.h +++ b/examples/CorePlotGallery/src/ios/DetailViewController.h @@ -1,6 +1,6 @@ // -// DetailViewController.h -// CorePlotGallery +// DetailViewController.h +// CorePlotGallery // @class PlotItem; diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index 715fe7878..384ebad06 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -1,6 +1,6 @@ // -// DetailViewController.m -// CorePlotGallery +// DetailViewController.m +// CorePlotGallery // #import "DetailViewController.h" diff --git a/examples/CorePlotGallery/src/ios/RootViewController.h b/examples/CorePlotGallery/src/ios/RootViewController.h index 4b29ad39d..6318baa62 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.h +++ b/examples/CorePlotGallery/src/ios/RootViewController.h @@ -1,6 +1,6 @@ // -// RootViewController.h -// CorePlotGallery +// RootViewController.h +// CorePlotGallery // @interface RootViewController : UITableViewController diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index f1857bffb..1f729464e 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -1,6 +1,6 @@ // -// RootViewController.m -// CorePlotGallery +// RootViewController.m +// CorePlotGallery // #import "RootViewController.h" @@ -86,7 +86,7 @@ -(NSInteger)numberOfSectionsInTableView:(UITableView *)tv -(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section { - return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection : (NSUInteger)section]; + return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; } -(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.h b/examples/CorePlotGallery/src/ios/ThemeTableViewController.h index d7f28fe4e..6abdb28af 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.h +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.h @@ -1,6 +1,6 @@ // -// ThemeTableViewController.h -// CorePlotGallery +// ThemeTableViewController.h +// CorePlotGallery // extern NSString *const kThemeTableViewControllerNoTheme; diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index ba76fc8c3..ac906eb41 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -1,6 +1,6 @@ // -// ThemeTableViewController.m -// CorePlotGallery +// ThemeTableViewController.m +// CorePlotGallery // #import "ThemeTableViewController.h" diff --git a/examples/CorePlotGallery/src/ios/main.m b/examples/CorePlotGallery/src/ios/main.m index b1abaa361..da456e0b4 100644 --- a/examples/CorePlotGallery/src/ios/main.m +++ b/examples/CorePlotGallery/src/ios/main.m @@ -1,6 +1,6 @@ // -// main.m -// CorePlotGallery +// main.m +// CorePlotGallery // #import "AppDelegate.h" diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.h b/examples/CorePlotGallery/src/mac/PlotGalleryController.h index 8be0744f4..4da469a02 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.h +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.h @@ -1,6 +1,6 @@ // -// PlotGalleryController.h -// CorePlotGallery +// PlotGalleryController.h +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 45e501afc..3f2fd06b8 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -1,12 +1,12 @@ // -// PlotGalleryController.m -// CorePlotGallery +// PlotGalleryController.m +// CorePlotGallery // #import "PlotGalleryController.h" #import "dlfcn.h" -//#define EMBED_NU 1 +// #define EMBED_NU 1 static const CGFloat CPT_SPLIT_VIEW_MIN_LHS_WIDTH = 150.0; @@ -57,7 +57,7 @@ -(void)awakeFromNib [self.imageBrowser setDelegate:self]; [self.imageBrowser setDataSource:self]; - [self.imageBrowser setCellsStyleMask:IKCellsStyleShadowed | IKCellsStyleTitled]; //| IKCellsStyleSubtitled]; + [self.imageBrowser setCellsStyleMask:IKCellsStyleShadowed | IKCellsStyleTitled]; // | IKCellsStyleSubtitled]; [self.imageBrowser reloadData]; diff --git a/examples/CorePlotGallery/src/mac/PlotView.h b/examples/CorePlotGallery/src/mac/PlotView.h index b2631d2dd..dad27812e 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.h +++ b/examples/CorePlotGallery/src/mac/PlotView.h @@ -1,6 +1,6 @@ // -// PlotView.h -// CorePlotGallery +// PlotView.h +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/mac/PlotView.m b/examples/CorePlotGallery/src/mac/PlotView.m index ffadad1d3..4c32ef4c4 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.m +++ b/examples/CorePlotGallery/src/mac/PlotView.m @@ -1,6 +1,6 @@ // -// PlotView.m -// CorePlotGallery +// PlotView.m +// CorePlotGallery // #import "PlotView.h" diff --git a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h index d5a7380d6..028433349 100644 --- a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h +++ b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h @@ -1,6 +1,6 @@ // -// Plot_Gallery_MacAppDelegate.h -// CorePlotGallery +// Plot_Gallery_MacAppDelegate.h +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m index a999dc691..5807c2a7f 100644 --- a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m +++ b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m @@ -1,6 +1,6 @@ // -// Plot_Gallery_MacAppDelegate.m -// CorePlotGallery +// Plot_Gallery_MacAppDelegate.m +// CorePlotGallery // #import "Plot_Gallery_MacAppDelegate.h" diff --git a/examples/CorePlotGallery/src/mac/main.m b/examples/CorePlotGallery/src/mac/main.m index 90ccb7f4b..e0c7c6e57 100644 --- a/examples/CorePlotGallery/src/mac/main.m +++ b/examples/CorePlotGallery/src/mac/main.m @@ -1,6 +1,6 @@ // -// main.m -// CorePlotGallery +// main.m +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/plots/AxisDemo.h b/examples/CorePlotGallery/src/plots/AxisDemo.h index 46fc89979..05e4fb001 100644 --- a/examples/CorePlotGallery/src/plots/AxisDemo.h +++ b/examples/CorePlotGallery/src/plots/AxisDemo.h @@ -1,6 +1,6 @@ // -// AxisDemo.h -// Plot Gallery-Mac +// AxisDemo.h +// Plot Gallery-Mac // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/AxisDemo.m b/examples/CorePlotGallery/src/plots/AxisDemo.m index 6d64f699f..de39e41e0 100644 --- a/examples/CorePlotGallery/src/plots/AxisDemo.m +++ b/examples/CorePlotGallery/src/plots/AxisDemo.m @@ -1,6 +1,6 @@ // -// AxisDemo.m -// Plot Gallery-Mac +// AxisDemo.m +// Plot Gallery-Mac // #import "AxisDemo.h" diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.h b/examples/CorePlotGallery/src/plots/CandlestickPlot.h index 92e0c6424..a45a5246c 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.h +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.h @@ -1,6 +1,6 @@ // -// CandlestickPlot.h -// CorePlotGallery +// CandlestickPlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index d52cba84d..e60f226e6 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -1,6 +1,6 @@ // -// CandlestickPlot.m -// CorePlotGallery +// CandlestickPlot.m +// CorePlotGallery // #import "CandlestickPlot.h" diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 304fa6223..2369f8420 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -152,7 +152,7 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd case CPTBarPlotFieldBarLocation: nums = [NSMutableArray arrayWithCapacity:indexRange.length]; for ( NSUInteger i = indexRange.location; i < NSMaxRange(indexRange); i++ ) { - [(NSMutableArray < NSNumber * > *) nums addObject : @(i)]; + [(NSMutableArray < NSNumber * > *) nums addObject:@(i)]; } break; diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.h b/examples/CorePlotGallery/src/plots/CompositePlot.h index 8a1ef49ec..0edb815ec 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.h +++ b/examples/CorePlotGallery/src/plots/CompositePlot.h @@ -1,6 +1,6 @@ // -// CompositePlot.h -// CorePlotGallery +// CompositePlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index e886e7ff2..5a1446d9c 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -1,6 +1,6 @@ // -// CompositePlot.m -// CorePlotGallery +// CompositePlot.m +// CorePlotGallery // #import "CompositePlot.h" @@ -442,7 +442,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { - if ( [(NSString *)plot.identifier isEqualToString : @"Blue Plot"] ) { + if ( [(NSString *) plot.identifier isEqualToString:@"Blue Plot"] ) { self.selectedIndex = (NSInteger)index; } } @@ -510,7 +510,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI num = self.dataForPlot[index][key]; // Green plot gets shifted above the blue - if ( [(NSString *)plot.identifier isEqualToString : @"Green Plot"] ) { + if ( [(NSString *) plot.identifier isEqualToString:@"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { num = @([num doubleValue] + 1.0); } @@ -570,7 +570,7 @@ -(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUIn CPTPlotSymbol *symbol = nil; // Use the default symbol - if ( [(NSString *)plot.identifier isEqualToString : @"Blue Plot"] && ( (NSInteger)index == self.selectedIndex ) ) { + if ( [(NSString *) plot.identifier isEqualToString:@"Blue Plot"] && ( (NSInteger)index == self.selectedIndex ) ) { dispatch_once(&onceToken, ^{ redDot = [[CPTPlotSymbol alloc] init]; redDot.symbolType = CPTPlotSymbolTypeEllipse; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.h b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.h index 8073492c1..d88ebf2a3 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.h +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.h @@ -1,8 +1,8 @@ // -// CurvedScatterPlot.h -// Plot_Gallery_iOS +// CurvedScatterPlot.h +// Plot_Gallery_iOS // -// Created by Nino Ag on 23/10/11. +// Created by Nino Ag on 23/10/11. #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index d962f902c..40ddb46fa 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -1,8 +1,8 @@ // -// CurvedScatterPlot.m -// Plot_Gallery_iOS +// CurvedScatterPlot.m +// Plot_Gallery_iOS // -// Created by Nino Ag on 23/10/11. +// Created by Nino Ag on 23/10/11. #import "CurvedScatterPlot.h" @@ -232,7 +232,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP firstPlot.dataLineStyle = lineStyle; firstPlot.dataSource = self; -// [graph addPlot:firstPlot]; +// [graph addPlot:firstPlot]; // Second derivative CPTScatterPlot *secondPlot = [[CPTScatterPlot alloc] init]; @@ -241,7 +241,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP secondPlot.dataLineStyle = lineStyle; secondPlot.dataSource = self; -// [graph addPlot:secondPlot]; +// [graph addPlot:secondPlot]; // Auto scale the plot space to fit the plot data [plotSpace scaleToFitPlots:[graph allPlots]]; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.h b/examples/CorePlotGallery/src/plots/DatePlot.h index 717841aa3..bc4c14c59 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.h +++ b/examples/CorePlotGallery/src/plots/DatePlot.h @@ -1,6 +1,6 @@ // -// DatePlot.h -// Plot Gallery-Mac +// DatePlot.h +// Plot Gallery-Mac // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index a55090831..a9158a416 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -1,6 +1,6 @@ // -// DatePlot.m -// Plot Gallery-Mac +// DatePlot.m +// Plot Gallery-Mac // #import "DatePlot.h" diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index aefde8567..b5361d372 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -147,7 +147,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index CPTTextLayer *newLayer = nil; - if ( [(NSString *)plot.identifier isEqualToString : outerChartName] ) { + if ( [(NSString *) plot.identifier isEqualToString:outerChartName] ) { dispatch_once(&onceToken, ^{ whiteText = [[CPTMutableTextStyle alloc] init]; whiteText.color = [CPTColor whiteColor]; @@ -171,7 +171,7 @@ -(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUIntege { CGFloat result = 0.0; - if ( [(NSString *)pieChart.identifier isEqualToString : outerChartName] ) { + if ( [(NSString *) pieChart.identifier isEqualToString:outerChartName] ) { result = (index == 0 ? 15.0 : 0.0); } return result; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.h b/examples/CorePlotGallery/src/plots/GradientScatterPlot.h index 299b8cce3..627e9eb99 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.h +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.h @@ -1,6 +1,6 @@ // -// GradientScatterPlot.h -// CorePlotGallery +// GradientScatterPlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index e54109f59..ad6b17b8d 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -1,6 +1,6 @@ // -// GradientScatterPlot.m -// CorePlotGallery +// GradientScatterPlot.m +// CorePlotGallery // #import "GradientScatterPlot.h" diff --git a/examples/CorePlotGallery/src/plots/ImageDemo.h b/examples/CorePlotGallery/src/plots/ImageDemo.h index 714a09bd4..bc8886a20 100644 --- a/examples/CorePlotGallery/src/plots/ImageDemo.h +++ b/examples/CorePlotGallery/src/plots/ImageDemo.h @@ -1,6 +1,6 @@ // -// ImageDemo.h -// Plot Gallery +// ImageDemo.h +// Plot Gallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/ImageDemo.m b/examples/CorePlotGallery/src/plots/ImageDemo.m index c6b69b8dc..21d76d814 100644 --- a/examples/CorePlotGallery/src/plots/ImageDemo.m +++ b/examples/CorePlotGallery/src/plots/ImageDemo.m @@ -1,6 +1,6 @@ // -// ImageDemo.m -// Plot Gallery +// ImageDemo.m +// Plot Gallery // #import "ImageDemo.h" diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.h b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.h index 73cafa63d..cd498bfe3 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.h +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.h @@ -1,6 +1,6 @@ // -// LabelingPolicyDemo.h -// Plot Gallery +// LabelingPolicyDemo.h +// Plot Gallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index ab2ffc431..59d6ac9ca 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -1,6 +1,6 @@ // -// LabelingPolicyDemo.m -// Plot Gallery +// LabelingPolicyDemo.m +// Plot Gallery // #import "LabelingPolicyDemo.h" diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.h b/examples/CorePlotGallery/src/plots/LineCapDemo.h index 196e5502f..479f2f7eb 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.h +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.h @@ -1,6 +1,6 @@ // -// LineCapDemo.h -// Plot Gallery +// LineCapDemo.h +// Plot Gallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index e00880c24..e655bb54c 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -1,6 +1,6 @@ // -// LineCapDemo.m -// Plot Gallery +// LineCapDemo.m +// Plot Gallery // #import "LineCapDemo.h" diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.h b/examples/CorePlotGallery/src/plots/OHLCPlot.h index 5f25f97ef..09b366258 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.h +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.h @@ -1,6 +1,6 @@ // -// OHLCPlot.h -// CorePlotGallery +// OHLCPlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 415d757f0..9c11c0ab4 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -1,6 +1,6 @@ // -// OHLCPlot.m -// CorePlotGallery +// OHLCPlot.m +// CorePlotGallery // #import "OHLCPlot.h" diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.h b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.h index 9c11d2ba9..b384b8bea 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.h +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.h @@ -1,6 +1,6 @@ // -// PlotSpaceDemo.h -// Plot Gallery +// PlotSpaceDemo.h +// Plot Gallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m index f9cb8efde..6ec44911a 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m @@ -1,6 +1,6 @@ // -// PlotSpaceDemo.m -// Plot Gallery +// PlotSpaceDemo.m +// Plot Gallery // #import "PlotSpaceDemo.h" diff --git a/examples/CorePlotGallery/src/plots/RangePlot.h b/examples/CorePlotGallery/src/plots/RangePlot.h index 6ba3e717a..3801583da 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.h +++ b/examples/CorePlotGallery/src/plots/RangePlot.h @@ -1,6 +1,6 @@ // -// RangePlot.h -// CorePlotGallery +// RangePlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 175d887f8..9191fe76e 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -1,6 +1,6 @@ // -// RangePlot.m -// CorePlotGallery +// RangePlot.m +// CorePlotGallery // #import "RangePlot.h" diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.h b/examples/CorePlotGallery/src/plots/RealTimePlot.h index 0684082cd..deead9655 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.h +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.h @@ -1,6 +1,6 @@ // -// RealTimePlot.h -// CorePlotGallery +// RealTimePlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 85ff7bb6a..1d6a22c7d 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -1,6 +1,6 @@ // -// RealTimePlot.m -// CorePlotGallery +// RealTimePlot.m +// CorePlotGallery // #import "RealTimePlot.h" diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.h b/examples/CorePlotGallery/src/plots/SimplePieChart.h index cb35ffaf2..569890585 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.h +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.h @@ -1,6 +1,6 @@ // -// SimplePieChart.h -// CorePlotGallery +// SimplePieChart.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 6bb29fd2c..3a352d0e4 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -1,6 +1,6 @@ // -// SimplePieChart.m -// CorePlotGallery +// SimplePieChart.m +// CorePlotGallery // #import "SimplePieChart.h" diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.h b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.h index e974a12cd..9b86f8bb3 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.h +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.h @@ -1,6 +1,6 @@ // -// SimpleScatterPlot.h -// CorePlotGallery +// SimpleScatterPlot.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 98450bab8..ab5e70cec 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -1,6 +1,6 @@ // -// SimpleScatterPlot.m -// CorePlotGallery +// SimpleScatterPlot.m +// CorePlotGallery // #import "SimpleScatterPlot.h" diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.h b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.h index 6ce56f9a2..00d6bf568 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.h +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.h @@ -1,6 +1,6 @@ // -// SteppedScatterPlot.h -// Plot Gallery-Mac +// SteppedScatterPlot.h +// Plot Gallery-Mac // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index 1aa277843..f1e11c6fe 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -1,6 +1,6 @@ // -// SteppedScatterPlot.m -// Plot Gallery-Mac +// SteppedScatterPlot.m +// Plot Gallery-Mac // #import "SteppedScatterPlot.h" diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.h b/examples/CorePlotGallery/src/plots/VerticalBarChart.h index 9d4634483..7f09fff01 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.h +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.h @@ -1,6 +1,6 @@ // -// SimpleBarGraph.h -// CorePlotGallery +// SimpleBarGraph.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index ac6cb517f..114fd2b40 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -1,6 +1,6 @@ // -// SimpleBarGraph.m -// CorePlotGallery +// SimpleBarGraph.m +// CorePlotGallery // #import "VerticalBarChart.h" diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index dc8aa6f7b..da4d27215 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -22,7 +22,7 @@ -(NSString *)stringForObjectValue:(id)coordinateValue NSString *string = nil; if ( [coordinateValue respondsToSelector:@selector(doubleValue)] ) { - double value = [(NSNumber *)coordinateValue doubleValue] / M_PI; + double value = [(NSNumber *) coordinateValue doubleValue] / M_PI; double factor = round(self.multiplier.doubleValue); if ( factor == 0.0 ) { @@ -38,13 +38,13 @@ -(NSString *)stringForObjectValue:(id)coordinateValue string = @"0"; } else if ( ABS(fraction) == 1.0 ) { - string = [NSString stringWithFormat:@"%@Ï€", signbit(fraction) ? self.minusSign:@""]; + string = [NSString stringWithFormat:@"%@Ï€", signbit(fraction) ? self.minusSign : @""]; } else if ( ABS(numerator) == 1.0 ) { - string = [NSString stringWithFormat:@"%@Ï€/%g", signbit(numerator) ? self.minusSign:@"", denominator]; + string = [NSString stringWithFormat:@"%@Ï€/%g", signbit(numerator) ? self.minusSign : @"", denominator]; } else if ( ABS(numerator / divisor) == 1.0 ) { - string = [NSString stringWithFormat:@"%@Ï€/%g", signbit(numerator) ? self.minusSign:@"", denominator / divisor]; + string = [NSString stringWithFormat:@"%@Ï€/%g", signbit(numerator) ? self.minusSign : @"", denominator / divisor]; } else if ( round(fraction) == fraction ) { string = [NSString stringWithFormat:@"%g Ï€", fraction]; diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.h b/examples/CorePlotGallery/src/shared/PlotGallery.h index fb70203f1..31441d294 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.h +++ b/examples/CorePlotGallery/src/shared/PlotGallery.h @@ -1,6 +1,6 @@ // -// PlotGallery.h -// CorePlotGallery +// PlotGallery.h +// CorePlotGallery // #import "PlotItem.h" diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index bdf1addb5..491d1191d 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -1,6 +1,6 @@ // -// PlotGallery.m -// CorePlotGallery +// PlotGallery.m +// CorePlotGallery // #import "PlotGallery.h" diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index 43ad4f566..b7e7b5a24 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -1,6 +1,6 @@ // -// PlotItem.h -// CorePlotGallery +// PlotItem.h +// CorePlotGallery // #import diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 15254b415..c58b2580c 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -1,6 +1,6 @@ // -// PlotItem.m -// CorePlotGallery +// PlotItem.m +// CorePlotGallery // #import "PlotGallery.h" diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 96ecb9f84..243cfc64e 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -40,7 +40,7 @@ @implementation CPTPlotDocument @synthesize dragStart; @synthesize dragEnd; -//#define USE_NSDECIMAL +// #define USE_NSDECIMAL -(instancetype)init { @@ -162,9 +162,9 @@ -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *_ // Read headers from the first line of the file [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; -// currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); -// CPTStringArray columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; -// NSLog([columnHeaders objectAtIndex:0]); +// currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); +// CPTStringArray columnHeaders = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; +// NSLog([columnHeaders objectAtIndex:0]); while ( lineEnd < length ) { [fileContents getParagraphStart:&lineStart end:&lineEnd contentsEnd:&contentsEnd forRange:NSMakeRange(lineEnd, 0)]; diff --git a/examples/DropPlot/main.m b/examples/DropPlot/main.m index c81924a60..77a0b5c98 100644 --- a/examples/DropPlot/main.m +++ b/examples/DropPlot/main.m @@ -1,9 +1,9 @@ // -// main.m -// DropPlot +// main.m +// DropPlot // -// Created by Brad Larson on 6/9/2009. -// Copyright SonoPlot, Inc. 2009 . All rights reserved. +// Created by Brad Larson on 6/9/2009. +// Copyright SonoPlot, Inc. 2009 . All rights reserved. // #import diff --git a/examples/MinorTickLabels/Controller.m b/examples/MinorTickLabels/Controller.m index 118873b06..2b1684769 100644 --- a/examples/MinorTickLabels/Controller.m +++ b/examples/MinorTickLabels/Controller.m @@ -61,7 +61,7 @@ -(void)awakeFromNib CPTTimeFormatter *myTimeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:timeFormatter]; myTimeFormatter.referenceDate = refDate; x.minorTickLabelFormatter = myTimeFormatter; -// x.minorTickLabelRotation = M_PI_2; +// x.minorTickLabelRotation = M_PI_2; CPTXYAxis *y = axisSet.yAxis; y.majorIntervalLength = @0.5; diff --git a/examples/MinorTickLabels/Source/main.m b/examples/MinorTickLabels/Source/main.m index 50ab6acfb..c8341df20 100644 --- a/examples/MinorTickLabels/Source/main.m +++ b/examples/MinorTickLabels/Source/main.m @@ -1,9 +1,9 @@ // -// main.m -// CPTTestApp +// main.m +// CPTTestApp // -// Created by Dirkjan Krijnders on 2/2/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Dirkjan Krijnders on 2/2/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import diff --git a/examples/RangePlot/Source/main.m b/examples/RangePlot/Source/main.m index 50ab6acfb..c8341df20 100644 --- a/examples/RangePlot/Source/main.m +++ b/examples/RangePlot/Source/main.m @@ -1,9 +1,9 @@ // -// main.m -// CPTTestApp +// main.m +// CPTTestApp // -// Created by Dirkjan Krijnders on 2/2/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Dirkjan Krijnders on 2/2/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index a3b6a559a..fdf3bb3a4 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -46,7 +46,7 @@ @implementation APYahooDataPuller @synthesize delegate; -//convert any NSNumber in financial line to NSDecimalNumber +// convert any NSNumber in financial line to NSDecimalNumber -(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine { CPTMutableDictionary aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; @@ -54,7 +54,7 @@ -(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine for ( id key in [aFinancialLine allKeys] ) { id something = aFinancialLine[key]; if ( [something respondsToSelector:@selector(decimalValue)] ) { - something = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *)something decimalValue]]; + something = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *) something decimalValue]]; aFinancialLine[key] = something; } } @@ -63,7 +63,7 @@ -(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine -(void)setFinancialData:(NSArray *)aFinancialData { - //NSLog(@"in -setFinancialData:, old value of financialData: %@, changed to: %@", financialData, aFinancialData); + // NSLog(@"in -setFinancialData:, old value of financialData: %@, changed to: %@", financialData, aFinancialData); if ( financialData != aFinancialData ) { NSMutableArray *mutableFinancialData = [aFinancialData mutableCopy]; @@ -137,13 +137,13 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol NSString *docPath = [self pathForSymbol:aSymbol]; if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { - //if there isn't one in the user's documents directory, see if we ship with this data + // if there isn't one in the user's documents directory, see if we ship with this data docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } -//Always returns *something* +// Always returns *something* -(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; @@ -174,7 +174,7 @@ -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate -(instancetype)init { - NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); //12 weeks ago + NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; NSDate *end = [NSDate date]; @@ -242,7 +242,7 @@ -(void)fetchIfNeeded return; } - //Check to see if cached data is stale + // Check to see if cached data is stale if ( self.staleData ) { self.loadingData = YES; NSString *urlString = [self URL]; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.h b/examples/StockPlot/Classes/APYahooDataPullerGraph.h index f47a2770e..4e66dffb9 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.h +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.h @@ -1,9 +1,9 @@ // -// APYahooDataPullerGraph.h -// StockPlot +// APYahooDataPullerGraph.h +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright 2009 __MyCompanyName__. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. // #import "APYahooDataPuller.h" diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index c855ea68e..22dd4ad53 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -1,9 +1,9 @@ // -// APYahooDataPullerGraph.m -// StockPlot +// APYahooDataPullerGraph.m +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright 2009 __MyCompanyName__. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. // #import "APYahooDataPullerGraph.h" @@ -56,7 +56,7 @@ -(void)reloadData NSDecimalNumber *low = self.dataPuller.overallLow; NSDecimalNumber *length = [high decimalNumberBySubtracting:low]; - //NSLog(@"high = %@, low = %@, length = %@", high, low, length); + // NSLog(@"high = %@, low = %@, length = %@", high, low, length); plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(self.dataPuller.financialData.count)]; plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:low length:length]; // Axes @@ -95,12 +95,12 @@ -(void)viewDidLoad -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - // NSLog(@"willRotateToInterfaceOrientation"); + // NSLog(@"willRotateToInterfaceOrientation"); } -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { - // NSLog(@"didRotateFromInterfaceOrientation"); + // NSLog(@"didRotateFromInterfaceOrientation"); } -(void)didReceiveMemoryWarning @@ -146,7 +146,7 @@ -(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp -(void)setDataPuller:(APYahooDataPuller *)aDataPuller { - //NSLog(@"in -setDataPuller:, old value of dataPuller: %@, changed to: %@", dataPuller, aDataPuller); + // NSLog(@"in -setDataPuller:, old value of dataPuller: %@, changed to: %@", dataPuller, aDataPuller); if ( dataPuller != aDataPuller ) { dataPuller = aDataPuller; diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 355e1db9d..60f20707b 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -49,7 +49,7 @@ +(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine NSDecimalNumber *theAdjClose = [NSDecimalNumber decimalNumberWithString:csvChunks[6]]; csvDict[@"adjClose"] = theAdjClose; - //non-mutable autoreleased dict + // non-mutable autoreleased dict return [NSDictionary dictionaryWithDictionary:csvDict]; } diff --git a/examples/StockPlot/Classes/RootViewController.h b/examples/StockPlot/Classes/RootViewController.h index c1559f3ef..17517ed85 100644 --- a/examples/StockPlot/Classes/RootViewController.h +++ b/examples/StockPlot/Classes/RootViewController.h @@ -1,9 +1,9 @@ // -// RootViewController.h -// StockPlot +// RootViewController.h +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index c2561bf62..9d12f31c5 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -1,9 +1,9 @@ // -// RootViewController.m -// StockPlot +// RootViewController.m +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import "APYahooDataPuller.h" @@ -47,7 +47,7 @@ -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[self navigationItem] setTitle:@"Stocks"]; - //the graph will set itself as delegate of the dataPuller when we push it, so we need to reset this. + // the graph will set itself as delegate of the dataPuller when we push it, so we need to reset this. for ( APYahooDataPuller *dp in self.stocks ) { [dp setDelegate:self]; } @@ -137,22 +137,22 @@ -(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row if ( dp.loadingData ) { if ( ![accessory isMemberOfClass:[UIActivityIndicatorView class]] ) { accessory = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - [(UIActivityIndicatorView *)accessory setHidesWhenStopped : NO]; + [(UIActivityIndicatorView *) accessory setHidesWhenStopped:NO]; [cell setAccessoryView:accessory]; } - [(UIActivityIndicatorView *)accessory startAnimating]; + [(UIActivityIndicatorView *) accessory startAnimating]; } else { if ( [accessory isMemberOfClass:[UIActivityIndicatorView class]] ) { - [(UIActivityIndicatorView *)accessory stopAnimating]; + [(UIActivityIndicatorView *) accessory stopAnimating]; } if ( dp.staleData ) { if ( ![accessory isMemberOfClass:[UIImageView class]] ) { UIImage *caution = [UIImage imageNamed:@"caution.png"]; accessory = [[UIImageView alloc] initWithImage:caution]; [cell setAccessoryView:accessory]; -// CGRect frame = accessory.frame; -//#pragma unused (frame) +// CGRect frame = accessory.frame; +// #pragma unused (frame) } } else { @@ -189,7 +189,7 @@ -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie -(CPTStringArray)symbols { - //NSLog(@"in -symbols, returned symbols = %@", symbols); + // NSLog(@"in -symbols, returned symbols = %@", symbols); CPTMutableStringArray symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; for ( APYahooDataPuller *dp in self.stocks ) { @@ -220,7 +220,7 @@ -(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp -(void)addSymbol:(NSString *)aSymbol { - NSTimeInterval secondsAgo = -fabs(60.0 * 60.0 * 24.0 * 7.0 * 12.0); //12 weeks ago + NSTimeInterval secondsAgo = -fabs(60.0 * 60.0 * 24.0 * 7.0 * 12.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; NSDate *end = [NSDate date]; @@ -229,7 +229,7 @@ -(void)addSymbol:(NSString *)aSymbol [[self stocks] addObject:dp]; [dp fetchIfNeeded]; [dp setDelegate:self]; - [[self tableView] reloadData]; //TODO: should reload whole thing + [[self tableView] reloadData]; // TODO: should reload whole thing } -(void)dealloc diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.h b/examples/StockPlot/Classes/StockPlotAppDelegate.h index 0a3b0badf..3ded41f62 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.h +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.h @@ -1,9 +1,9 @@ // -// StockPlotAppDelegate.h -// StockPlot +// StockPlotAppDelegate.h +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // @interface StockPlotAppDelegate : NSObject diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.m b/examples/StockPlot/Classes/StockPlotAppDelegate.m index aed96ab66..69dff4698 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.m +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.m @@ -1,9 +1,9 @@ // -// StockPlotAppDelegate.m -// StockPlot +// StockPlotAppDelegate.m +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import "RootViewController.h" diff --git a/examples/StockPlot/main.m b/examples/StockPlot/main.m index 9ca0680af..3105528ad 100644 --- a/examples/StockPlot/main.m +++ b/examples/StockPlot/main.m @@ -1,9 +1,9 @@ // -// main.m -// StockPlot +// main.m +// StockPlot // -// Created by Jonathan Saggau on 6/19/09. -// Copyright __MyCompanyName__ 2009. All rights reserved. +// Created by Jonathan Saggau on 6/19/09. +// Copyright __MyCompanyName__ 2009. All rights reserved. // #import diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 6ccc18f32..a6922adea 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -394,10 +394,10 @@ -(void)updateOnMainThreadWithParameters:(CPTDictionary)parameters id tweenedValue = parameters[CPTAnimationValueKey]; if ( [tweenedValue isKindOfClass:[NSDecimalNumber class]] ) { - NSDecimal buffer = [(NSDecimalNumber *)tweenedValue decimalValue]; + NSDecimal buffer = [(NSDecimalNumber *) tweenedValue decimalValue]; typedef void (*SetterType)(id, SEL, NSDecimal); - SetterType setterMethod = (SetterType)[boundObject methodForSelector : boundSetter]; + SetterType setterMethod = (SetterType)[boundObject methodForSelector:boundSetter]; setterMethod(boundObject, boundSetter, buffer); } else if ( [tweenedValue isKindOfClass:[NSValue class]] ) { diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index d8a2f44eb..f3bcb0be0 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -472,10 +472,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -497,10 +497,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -520,10 +520,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } // CGPoint @@ -547,10 +547,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -572,10 +572,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -595,10 +595,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } // CGSize @@ -622,10 +622,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -647,10 +647,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -670,10 +670,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } // CGRect @@ -697,10 +697,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -722,10 +722,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -745,10 +745,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } // NSDecimal @@ -772,10 +772,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -797,10 +797,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -820,10 +820,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } // CPTPlotRange @@ -847,10 +847,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:delay]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -872,10 +872,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:animationCurve - delegate:delegate + property:property + period:period + animationCurve:animationCurve + delegate:delegate ]; } @@ -895,10 +895,10 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP withDelay:CPTFloat(0.0)]; return [self animate:object - property:property - period:period - animationCurve:CPTAnimationCurveDefault - delegate:nil]; + property:property + period:period + animationCurve:CPTAnimationCurveDefault + delegate:nil]; } @end diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 03bdddef1..eb95e3cd3 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -762,7 +762,7 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - coordinate = (CPTCoordinate)[coder decodeIntegerForKey : @"CPTAxis.coordinate"]; + coordinate = (CPTCoordinate)[coder decodeIntegerForKey:@"CPTAxis.coordinate"]; plotSpace = [coder decodeObjectForKey:@"CPTAxis.plotSpace"]; majorTickLocations = [coder decodeObjectForKey:@"CPTAxis.majorTickLocations"]; minorTickLocations = [coder decodeObjectForKey:@"CPTAxis.minorTickLocations"]; @@ -772,22 +772,22 @@ -(instancetype)initWithCoder:(NSCoder *)coder minorTickLabelOffset = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelOffset"]; labelRotation = [coder decodeCGFloatForKey:@"CPTAxis.labelRotation"]; minorTickLabelRotation = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelRotation"]; - labelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.labelAlignment"]; - minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelAlignment"]; + labelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.labelAlignment"]; + minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelAlignment"]; axisLineStyle = [[coder decodeObjectForKey:@"CPTAxis.axisLineStyle"] copy]; majorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorTickLineStyle"] copy]; minorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLineStyle"] copy]; - tickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickLabelDirection"]; - minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.minorTickLabelDirection"]; + tickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.tickLabelDirection"]; + minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelDirection"]; majorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorGridLineStyle"] copy]; minorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorGridLineStyle"] copy]; axisLineCapMin = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMin"] copy]; axisLineCapMax = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMax"] copy]; labelingOrigin = [coder decodeObjectForKey:@"CPTAxis.labelingOrigin"]; majorIntervalLength = [coder decodeObjectForKey:@"CPTAxis.majorIntervalLength"]; - minorTicksPerInterval = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.minorTicksPerInterval"]; - preferredNumberOfMajorTicks = (NSUInteger)[coder decodeIntegerForKey : @"CPTAxis.preferredNumberOfMajorTicks"]; - labelingPolicy = (CPTAxisLabelingPolicy)[coder decodeIntegerForKey : @"CPTAxis.labelingPolicy"]; + minorTicksPerInterval = (NSUInteger)[coder decodeIntegerForKey:@"CPTAxis.minorTicksPerInterval"]; + preferredNumberOfMajorTicks = (NSUInteger)[coder decodeIntegerForKey:@"CPTAxis.preferredNumberOfMajorTicks"]; + labelingPolicy = (CPTAxisLabelingPolicy)[coder decodeIntegerForKey:@"CPTAxis.labelingPolicy"]; labelTextStyle = [[coder decodeObjectForKey:@"CPTAxis.labelTextStyle"] copy]; minorTickLabelTextStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLabelTextStyle"] copy]; titleTextStyle = [[coder decodeObjectForKey:@"CPTAxis.titleTextStyle"] copy]; @@ -802,9 +802,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder attributedTitle = [[coder decodeObjectForKey:@"CPTAxis.attributedTitle"] copy]; titleOffset = [coder decodeCGFloatForKey:@"CPTAxis.titleOffset"]; titleRotation = [coder decodeCGFloatForKey:@"CPTAxis.titleRotation"]; - titleDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.titleDirection"]; + titleDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.titleDirection"]; titleLocation = [coder decodeObjectForKey:@"CPTAxis.titleLocation"]; - tickDirection = (CPTSign)[coder decodeIntegerForKey : @"CPTAxis.tickDirection"]; + tickDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.tickDirection"]; needsRelabel = [coder decodeBoolForKey:@"CPTAxis.needsRelabel"]; labelExclusionRanges = [coder decodeObjectForKey:@"CPTAxis.labelExclusionRanges"]; visibleRange = [[coder decodeObjectForKey:@"CPTAxis.visibleRange"] copy]; @@ -2300,7 +2300,7 @@ -(void)setLabelTextStyle:(CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.axisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *)contentLayer setTextStyle : labelTextStyle]; + [(CPTTextLayer *) contentLayer setTextStyle:labelTextStyle]; } } @@ -2317,7 +2317,7 @@ -(void)setMinorTickLabelTextStyle:(CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.minorTickAxisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *)contentLayer setTextStyle : minorTickLabelTextStyle]; + [(CPTTextLayer *) contentLayer setTextStyle:minorTickLabelTextStyle]; } } diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index 220db2500..b47870eb0 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -113,7 +113,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder contentLayer = [coder decodeObjectForKey:@"CPTAxisLabel.contentLayer"]; offset = [coder decodeCGFloatForKey:@"CPTAxisLabel.offset"]; rotation = [coder decodeCGFloatForKey:@"CPTAxisLabel.rotation"]; - alignment = (CPTAlignment)[coder decodeIntegerForKey : @"CPTAxisLabel.alignment"]; + alignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxisLabel.alignment"]; tickLocation = [coder decodeObjectForKey:@"CPTAxisLabel.tickLocation"]; } return self; diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index 08168baa4..caf9a04de 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -103,7 +103,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder dateFormatter = [coder decodeObjectForKey:@"CPTCalendarFormatter.dateFormatter"]; referenceDate = [[coder decodeObjectForKey:@"CPTCalendarFormatter.referenceDate"] copy]; referenceCalendar = [[coder decodeObjectForKey:@"CPTCalendarFormatter.referenceCalendar"] copy]; - referenceCalendarUnit = (NSCalendarUnit)[coder decodeIntegerForKey : @"CPTCalendarFormatter.referenceCalendarUnit"]; + referenceCalendarUnit = (NSCalendarUnit)[coder decodeIntegerForKey:@"CPTCalendarFormatter.referenceCalendarUnit"]; } return self; } diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 6d7d3adaf..3e9d265c1 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -429,7 +429,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super init]) ) { CGColorSpaceRef colorSpace = [coder newCGColorSpaceDecodeForKey:@"CPTColor.colorSpace"]; - size_t numberOfComponents = (size_t)[coder decodeInt64ForKey : @"CPTColor.numberOfComponents"]; + size_t numberOfComponents = (size_t)[coder decodeInt64ForKey:@"CPTColor.numberOfComponents"]; CGFloat *colorComponents = malloc( numberOfComponents * sizeof(CGFloat) ); diff --git a/framework/Source/CPTColorSpaceTests.m b/framework/Source/CPTColorSpaceTests.m index 93ebc4f08..7d3f04301 100644 --- a/framework/Source/CPTColorSpaceTests.m +++ b/framework/Source/CPTColorSpaceTests.m @@ -17,7 +17,7 @@ -(void)testKeyedArchivingRoundTrip CFDataRef newIccProfile = CGColorSpaceCopyICCProfile(newColorSpace.cgColorSpace); if ( iccProfile && newIccProfile ) { - XCTAssertTrue([(__bridge NSData *)iccProfile isEqualToData: (__bridge NSData *)newIccProfile], @"Color spaces not equal"); + XCTAssertTrue([(__bridge NSData *) iccProfile isEqualToData:(__bridge NSData *)newIccProfile], @"Color spaces not equal"); } if ( iccProfile ) { diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 9f1d87e58..a24deb7ba 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -27,7 +27,7 @@ @implementation CPTDataSourceTestCase -(void)setUp { - //check CPTDataSource conformance + // check CPTDataSource conformance XCTAssertTrue([self conformsToProtocol:@protocol(CPTPlotDataSource)], @"CPTDataSourceTestCase should conform to "); } diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 1d30027bf..f0471b91a 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -212,13 +212,13 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super init]) ) { [self commonInit]; - gradientType = (CPTGradientType)[coder decodeIntegerForKey : @"CPTGradient.type"]; + gradientType = (CPTGradientType)[coder decodeIntegerForKey:@"CPTGradient.type"]; angle = [coder decodeCGFloatForKey:@"CPTGradient.angle"]; - self.blendingMode = (CPTGradientBlendingMode)[coder decodeIntegerForKey : @"CPTGradient.blendingMode"]; + self.blendingMode = (CPTGradientBlendingMode)[coder decodeIntegerForKey:@"CPTGradient.blendingMode"]; startAnchor = [coder decodeCPTPointForKey:@"CPTPlotSymbol.startAnchor"]; endAnchor = [coder decodeCPTPointForKey:@"CPTPlotSymbol.endAnchor"]; - NSUInteger count = (NSUInteger)[coder decodeIntegerForKey : @"CPTGradient.elementCount"]; + NSUInteger count = (NSUInteger)[coder decodeIntegerForKey:@"CPTGradient.elementCount"]; while ( count != 0 ) { CPTGradientElement newElement; @@ -711,11 +711,11 @@ -(CPTGradient *)addColorStop:(CPTColor *)color atPosition:(CGFloat)position CPTGradient *newGradient = [self copy]; CPTGradientElement newGradientElement; - //put the components of color into the newGradientElement - must make sure it is a RGB color (not Gray or CMYK) + // put the components of color into the newGradientElement - must make sure it is a RGB color (not Gray or CMYK) newGradientElement.color = CPTRGBAColorFromCGColor(color.cgColor); newGradientElement.position = position; - //Pass it off to addElement to take care of adding it to the elementList + // Pass it off to addElement to take care of adding it to the elementList [newGradient addElement:&newGradientElement]; return newGradient; @@ -1032,9 +1032,9 @@ -(CGShadingRef)newAxialGradientInRect:(CGRect)rect CGFloat length; CGFloat deltaX, deltaY; - CGFloat rAngle = self.angle * CPTFloat(M_PI / 180.0); //convert the angle to radians + CGFloat rAngle = self.angle * CPTFloat(M_PI / 180.0); // convert the angle to radians - if ( fabs( tan(rAngle) ) <= CPTFloat(1.0) ) { //for range [-45,45], [135,225] + if ( fabs( tan(rAngle) ) <= CPTFloat(1.0) ) { // for range [-45,45], [135,225] x = CGRectGetWidth(rect); y = CGRectGetHeight(rect); @@ -1047,7 +1047,7 @@ -(CGShadingRef)newAxialGradientInRect:(CGRect)rect deltaX = length * cosA / CPTFloat(2.0); deltaY = length * sinA / CPTFloat(2.0); } - else { //for range [45,135], [225,315] + else { // for range [45,135], [225,315] x = CGRectGetHeight(rect); y = CGRectGetWidth(rect); @@ -1135,10 +1135,10 @@ -(void)setBlendingMode:(CPTGradientBlendingMode)mode static const CGFloat input_value_range[2] = { 0, 1 }; // range for the evaluator input static const CGFloat output_value_ranges[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }; // ranges for the evaluator output (4 returned values) - self.gradientFunction = CGFunctionCreate( (__bridge void *)(self), //the two transition colors - 1, input_value_range, //number of inputs (just fraction of progression) - 4, output_value_ranges, //number of outputs (4 - RGBa) - &evaluationCallbackInfo ); //info for using the evaluator function + self.gradientFunction = CGFunctionCreate( (__bridge void *)(self), // the two transition colors + 1, input_value_range, // number of inputs (just fraction of progression) + 4, output_value_ranges, // number of outputs (4 - RGBa) + &evaluationCallbackInfo ); // info for using the evaluator function } -(void)addElement:(CPTGradientElement *)newElement @@ -1183,7 +1183,7 @@ -(CPTGradientElement)removeElementAtIndex:(NSUInteger)idx return removedElement; } - NSUInteger count = 1; //we want to start one ahead + NSUInteger count = 1; // we want to start one ahead CPTGradientElement *currentElement = self.elementList; while ( currentElement->nextElement != NULL ) { if ( count == idx ) { @@ -1308,7 +1308,7 @@ void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; - //This grabs the first two colors in the sequence + // This grabs the first two colors in the sequence CPTGradientElement *color1 = gradient.elementList; if ( color1 == NULL ) { @@ -1318,24 +1318,24 @@ void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) CPTGradientElement *color2 = color1->nextElement; - //make sure first color and second color are on other sides of position + // make sure first color and second color are on other sides of position while ( color2 != NULL && color2->position < position ) { color1 = color2; color2 = color1->nextElement; } - //if we don't have another color then make next color the same color + // if we don't have another color then make next color the same color if ( color2 == NULL ) { color2 = color1; } - //----------FailSafe settings---------- - //color1->red = 1; color2->red = 0; - //color1->green = 1; color2->green = 0; - //color1->blue = 1; color2->blue = 0; - //color1->alpha = 1; color2->alpha = 1; - //color1->position = 0.5; - //color2->position = 0.5; - //------------------------------------- + // ----------FailSafe settings---------- + // color1->red = 1; color2->red = 0; + // color1->green = 1; color2->green = 0; + // color1->blue = 1; color2->blue = 0; + // color1->alpha = 1; color2->alpha = 1; + // color1->position = 0.5; + // color2->position = 0.5; + // ------------------------------------- if ( position <= color1->position ) { out[0] = color1->color.red; @@ -1350,7 +1350,7 @@ void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) out[3] = color2->color.alpha; } else { - //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position + // adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position position = (position - color1->position) / (color2->position - color1->position); out[0] = (color2->color.red - color1->color.red) * position + color1->color.red; @@ -1360,21 +1360,21 @@ void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) } } -// Chromatic Evaluation - -// This blends colors by their Hue, Saturation, and Value(Brightness) right now I just -// transform the RGB values stored in the CPTGradientElements to HSB, in the future I may -// streamline it to avoid transforming in and out of HSB colorspace *for later* +// Chromatic Evaluation - +// This blends colors by their Hue, Saturation, and Value(Brightness) right now I just +// transform the RGB values stored in the CPTGradientElements to HSB, in the future I may +// streamline it to avoid transforming in and out of HSB colorspace *for later* // -// For the chromatic blend we shift the hue of color1 to meet the hue of color2. To do -// this we will add to the hue's angle (if we subtract we'll be doing the inverse -// chromatic...scroll down more for that). All we need to do is keep adding to the hue -// until we wrap around the color wheel and get to color2. +// For the chromatic blend we shift the hue of color1 to meet the hue of color2. To do +// this we will add to the hue's angle (if we subtract we'll be doing the inverse +// chromatic...scroll down more for that). All we need to do is keep adding to the hue +// until we wrap around the color wheel and get to color2. void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) { CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; - //This grabs the first two colors in the sequence + // This grabs the first two colors in the sequence CPTGradientElement *color1 = gradient.elementList; if ( color1 == NULL ) { @@ -1429,7 +1429,7 @@ void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) out[3] = c2[3]; } else { - //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position + // adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position position = (position - color1->position) / (color2->position - color1->position); out[0] = (c2[0] - c1[0]) * position + c1[0]; @@ -1441,17 +1441,17 @@ void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) CPTTransformHSV_RGB(out); } -// Inverse Chromatic Evaluation - -// Inverse Chromatic is about the same story as Chromatic Blend, but here the Hue -// is strictly decreasing, that is we need to get from color1 to color2 by decreasing -// the 'angle' (i.e. 90º -> 180º would be done by subtracting 270º and getting -180º... -// which is equivalent to 180º mod 360º +// Inverse Chromatic Evaluation - +// Inverse Chromatic is about the same story as Chromatic Blend, but here the Hue +// is strictly decreasing, that is we need to get from color1 to color2 by decreasing +// the 'angle' (i.e. 90º -> 180º would be done by subtracting 270º and getting -180º... +// which is equivalent to 180º mod 360º void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) { CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; - //This grabs the first two colors in the sequence + // This grabs the first two colors in the sequence CPTGradientElement *color1 = gradient.elementList; if ( color1 == NULL ) { @@ -1464,7 +1464,7 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) CGFloat c1[4]; CGFloat c2[4]; - //make sure first color and second color are on other sides of position + // make sure first color and second color are on other sides of position while ( color2 != NULL && color2->position < position ) { color1 = color2; color2 = color1->nextElement; @@ -1489,8 +1489,8 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) CPTTransformRGB_HSV(c2); CPTResolveHSV(c1, c2); - if ( c1[0] < c2[0] ) { //if color1's hue is higher than color2's hue then - c1[0] += CPTFloat(360.0); // we need to move c2 one revolution back on the wheel + if ( c1[0] < c2[0] ) { // if color1's hue is higher than color2's hue then + c1[0] += CPTFloat(360.0); // we need to move c2 one revolution back on the wheel } if ( position <= color1->position ) { out[0] = c1[0]; @@ -1505,7 +1505,7 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) out[3] = c2[3]; } else { - //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position + // adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position position = (position - color1->position) / (color2->position - color1->position); out[0] = (c2[0] - c1[0]) * position + c1[0]; @@ -1517,7 +1517,7 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) CPTTransformHSV_RGB(out); } -void CPTTransformRGB_HSV(CGFloat *components) //H,S,B -> R,G,B +void CPTTransformRGB_HSV(CGFloat *components) // H,S,B -> R,G,B { CGFloat H = NAN, S, V; CGFloat R = components[0]; @@ -1550,10 +1550,10 @@ void CPTTransformRGB_HSV(CGFloat *components) //H,S,B -> R,G,B components[2] = V; } -void CPTTransformHSV_RGB(CGFloat *components) //H,S,B -> R,G,B +void CPTTransformHSV_RGB(CGFloat *components) // H,S,B -> R,G,B { CGFloat R = CPTFloat(0.0), G = CPTFloat(0.0), B = CPTFloat(0.0); - CGFloat H = fmod( components[0], CPTFloat(360.0) ); //map to [0,360) + CGFloat H = fmod( components[0], CPTFloat(360.0) ); // map to [0,360) CGFloat S = components[1]; CGFloat V = components[2]; @@ -1610,7 +1610,7 @@ void CPTTransformHSV_RGB(CGFloat *components) //H,S,B -> R,G,B } void CPTResolveHSV(CGFloat *color1, CGFloat *color2) // H value may be undefined (i.e. grayscale color) -{ // we want to fill it with a sensible value +{ // we want to fill it with a sensible value if ( isnan(color1[0]) && isnan(color2[0]) ) { color1[0] = color2[0] = 0; } diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index c39022c06..1a0d2317e 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -332,12 +332,12 @@ -(instancetype)initWithCoder:(NSCoder *)coder title = [[coder decodeObjectForKey:@"CPTGraph.title"] copy]; attributedTitle = [[coder decodeObjectForKey:@"CPTGraph.attributedTitle"] copy]; titleTextStyle = [[coder decodeObjectForKey:@"CPTGraph.titleTextStyle"] copy]; - titlePlotAreaFrameAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTGraph.titlePlotAreaFrameAnchor"]; + titlePlotAreaFrameAnchor = (CPTRectAnchor)[coder decodeIntegerForKey:@"CPTGraph.titlePlotAreaFrameAnchor"]; titleDisplacement = [coder decodeCPTPointForKey:@"CPTGraph.titleDisplacement"]; titleAnnotation = [coder decodeObjectForKey:@"CPTGraph.titleAnnotation"]; legend = [coder decodeObjectForKey:@"CPTGraph.legend"]; legendAnnotation = [coder decodeObjectForKey:@"CPTGraph.legendAnnotation"]; - legendAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTGraph.legendAnchor"]; + legendAnchor = (CPTRectAnchor)[coder decodeIntegerForKey:@"CPTGraph.legendAnchor"]; legendDisplacement = [coder decodeCPTPointForKey:@"CPTGraph.legendDisplacement"]; inTitleUpdate = NO; diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index d0e7146ea..9287097b5 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -428,7 +428,7 @@ -(BOOL)isEqual:(id)object CFDataRef otherProviderData = CGDataProviderCopyData(otherProvider); if ( selfProviderData && otherProviderData ) { - equalImages = [(__bridge NSData *)selfProviderData isEqualToData : (__bridge NSData *)otherProviderData]; + equalImages = [(__bridge NSData *) selfProviderData isEqualToData:(__bridge NSData *)otherProviderData]; } else { equalImages = (selfProviderData == otherProviderData); diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 56a67032e..d3af83ab5 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -379,7 +379,7 @@ -(void)recursivelyRenderInContext:(CGContextRef)context currentSublayerFrameOrigin.y - currentSublayerBounds.origin.y); [self applyTransform:self.sublayerTransform toContext:context]; if ( [currentSublayer isKindOfClass:[CPTLayer class]] ) { - [(CPTLayer *)currentSublayer recursivelyRenderInContext : context]; + [(CPTLayer *) currentSublayer recursivelyRenderInContext:context]; } else { if ( self.masksToBounds ) { @@ -783,7 +783,7 @@ -(void)applySublayerMaskToContext:(CGContextRef)context forSublayer:(CPTLayer *) CALayer *superlayer = self.superlayer; if ( [superlayer isKindOfClass:[CPTLayer class]] ) { - [(CPTLayer *)superlayer applySublayerMaskToContext : context forSublayer : self withOffset : layerOffset]; + [(CPTLayer *) superlayer applySublayerMaskToContext:context forSublayer:self withOffset:layerOffset]; } CGPathRef maskPath = self.sublayerMaskingPath; diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index 063ba8f3d..40a7d1464 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -118,7 +118,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder anchorLayer = [coder decodeObjectForKey:@"CPTLayerAnnotation.anchorLayer"]; xConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.xConstraints"]; yConstraints = [coder decodeObjectForKey:@"CPTLayerAnnotation.yConstraints"]; - rectAnchor = (CPTRectAnchor)[coder decodeIntegerForKey : @"CPTLayerAnnotation.rectAnchor"]; + rectAnchor = (CPTRectAnchor)[coder decodeIntegerForKey:@"CPTLayerAnnotation.rectAnchor"]; } return self; } diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 8a2502681..3aa266227 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -467,8 +467,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder entryPaddingTop = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingTop"]; entryPaddingRight = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingRight"]; entryPaddingBottom = [coder decodeCGFloatForKey:@"CPTLegend.entryPaddingBottom"]; - numberOfRows = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfRows"]; - numberOfColumns = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegend.numberOfColumns"]; + numberOfRows = (NSUInteger)[coder decodeIntegerForKey:@"CPTLegend.numberOfRows"]; + numberOfColumns = (NSUInteger)[coder decodeIntegerForKey:@"CPTLegend.numberOfColumns"]; equalRows = [coder decodeBoolForKey:@"CPTLegend.equalRows"]; equalColumns = [coder decodeBoolForKey:@"CPTLegend.equalColumns"]; rowHeights = [[coder decodeObjectForKey:@"CPTLegend.rowHeights"] copy]; @@ -613,10 +613,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context BOOL legendShouldDrawSwatch = YES; if ( delegateCanDraw ) { legendShouldDrawSwatch = [theDelegate legend:self - shouldDrawSwatchAtIndex:entryIndex - forPlot:entryPlot - inRect:swatchRect - inContext:context]; + shouldDrawSwatchAtIndex:entryIndex + forPlot:entryPlot + inRect:swatchRect + inContext:context]; } if ( legendShouldDrawSwatch ) { [entryPlot drawSwatchForLegend:self @@ -743,7 +743,7 @@ -(void)recalculateLayout if ( row < desiredRowHeights.count ) { id desiredRowHeight = desiredRowHeights[row]; if ( [desiredRowHeight isKindOfClass:numberClass] ) { - maxTitleHeight[row] = MAX(maxTitleHeight[row], [(NSNumber *)desiredRowHeight cgFloatValue]); + maxTitleHeight[row] = MAX(maxTitleHeight[row], [(NSNumber *) desiredRowHeight cgFloatValue]); } } } @@ -754,7 +754,7 @@ -(void)recalculateLayout if ( col < desiredColumnWidths.count ) { id desiredColumnWidth = desiredColumnWidths[col]; if ( [desiredColumnWidth isKindOfClass:numberClass] ) { - maxTitleWidth[col] = MAX(maxTitleWidth[col], [(NSNumber *)desiredColumnWidth cgFloatValue]); + maxTitleWidth[col] = MAX(maxTitleWidth[col], [(NSNumber *) desiredColumnWidth cgFloatValue]); } } } diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 380a885a8..9c0bba5f8 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -111,9 +111,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { plot = [coder decodeObjectForKey:@"CPTLegendEntry.plot"]; - index = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.index"]; - row = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.row"]; - column = (NSUInteger)[coder decodeIntegerForKey : @"CPTLegendEntry.column"]; + index = (NSUInteger)[coder decodeIntegerForKey:@"CPTLegendEntry.index"]; + row = (NSUInteger)[coder decodeIntegerForKey:@"CPTLegendEntry.row"]; + column = (NSUInteger)[coder decodeIntegerForKey:@"CPTLegendEntry.column"]; textStyle = [coder decodeObjectForKey:@"CPTLegendEntry.textStyle"]; } return self; diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index 2c36f0bde..924f1f56a 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -126,7 +126,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { size = [coder decodeCPTSizeForKey:@"CPTLineCap.size"]; - lineCapType = (CPTLineCapType)[coder decodeIntegerForKey : @"CPTLineCap.lineCapType"]; + lineCapType = (CPTLineCapType)[coder decodeIntegerForKey:@"CPTLineCap.lineCapType"]; lineStyle = [coder decodeObjectForKey:@"CPTLineCap.lineStyle"]; fill = [coder decodeObjectForKey:@"CPTLineCap.fill"]; customLineCapPath = [coder newCGPathDecodeForKey:@"CPTLineCap.customLineCapPath"]; diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index c4263415a..d289073d7 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -191,8 +191,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super init]) ) { - lineCap = (CGLineCap)[coder decodeIntForKey : @"CPTLineStyle.lineCap"]; - lineJoin = (CGLineJoin)[coder decodeIntForKey : @"CPTLineStyle.lineJoin"]; + lineCap = (CGLineCap)[coder decodeIntForKey:@"CPTLineStyle.lineCap"]; + lineJoin = (CGLineJoin)[coder decodeIntForKey:@"CPTLineStyle.lineJoin"]; miterLimit = [coder decodeCGFloatForKey:@"CPTLineStyle.miterLimit"]; lineWidth = [coder decodeCGFloatForKey:@"CPTLineStyle.lineWidth"]; dashPattern = [coder decodeObjectForKey:@"CPTLineStyle.dashPattern"]; diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index af1ec220f..371a20365 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -87,7 +87,7 @@ -(void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... -(void *)mutableBytes { - return [(NSMutableData *)self.data mutableBytes]; + return [(NSMutableData *) self.data mutableBytes]; } /// @endcond diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 5e57367f2..13fee3c4f 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -1199,12 +1199,12 @@ -(instancetype)initWithCoder:(NSCoder *)decoder if ( [decoder allowsKeyedCoding] ) { newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; - newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey: @"CPTNumericData.dataType.dataTypeFormat"], - (size_t)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.sampleBytes"], - (CFByteOrder)[decoder decodeInt64ForKey: @"CPTNumericData.dataType.byteOrder"] ); + newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey:@"CPTNumericData.dataType.dataTypeFormat"], + (size_t)[decoder decodeInt64ForKey:@"CPTNumericData.dataType.sampleBytes"], + (CFByteOrder)[decoder decodeInt64ForKey:@"CPTNumericData.dataType.byteOrder"] ); shapeArray = [decoder decodeObjectForKey:@"CPTNumericData.shape"]; - order = (CPTDataOrder)[decoder decodeIntegerForKey : @"CPTNumericData.dataOrder"]; + order = (CPTDataOrder)[decoder decodeIntegerForKey:@"CPTNumericData.dataOrder"]; } else { newData = [decoder decodeObject]; diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 79f74ae84..e18f596d1 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -281,7 +281,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder pieInnerRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieInnerRadius"]; startAngle = [coder decodeCGFloatForKey:@"CPTPieChart.startAngle"]; endAngle = [coder decodeCGFloatForKey:@"CPTPieChart.endAngle"]; - sliceDirection = (CPTPieDirection)[coder decodeIntegerForKey : @"CPTPieChart.sliceDirection"]; + sliceDirection = (CPTPieDirection)[coder decodeIntegerForKey:@"CPTPieChart.sliceDirection"]; centerAnchor = [coder decodeCPTPointForKey:@"CPTPieChart.centerAnchor"]; borderLineStyle = [[coder decodeObjectForKey:@"CPTPieChart.borderLineStyle"] copy]; overlayFill = [[coder decodeObjectForKey:@"CPTPieChart.overlayFill"] copy]; @@ -602,10 +602,10 @@ -(void)renderAsVectorInContext:(CGContextRef)context Class fillClass = [CPTFill class]; while ( currentIndex < sampleCount ) { - CGFloat currentWidth = (CGFloat)[self cachedDoubleForField : CPTPieChartFieldSliceWidthNormalized recordIndex : currentIndex]; + CGFloat currentWidth = (CGFloat)[self cachedDoubleForField:CPTPieChartFieldSliceWidthNormalized recordIndex:currentIndex]; if ( !isnan(currentWidth) ) { - CGFloat radialOffset = [(NSNumber *)offsetArray[currentIndex] cgFloatValue]; + CGFloat radialOffset = [(NSNumber *) offsetArray[currentIndex] cgFloatValue]; // draw slice CGContextSaveGState(context); @@ -912,7 +912,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte NSDecimalNumber *yValue = [[NSDecimalNumber alloc] initWithDecimal:plotPoint[CPTCoordinateY]]; label.anchorPlotPoint = @[xValue, yValue]; - CGFloat currentWidth = (CGFloat)[self cachedDoubleForField : CPTPieChartFieldSliceWidthNormalized recordIndex : idx]; + CGFloat currentWidth = (CGFloat)[self cachedDoubleForField:CPTPieChartFieldSliceWidthNormalized recordIndex:idx]; if ( self.hidden || isnan(currentWidth) ) { contentLayer.hidden = YES; } @@ -922,7 +922,7 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte CGFloat startingWidth = CPTFloat(0.0); if ( idx > 0 ) { - startingWidth = (CGFloat)[self cachedDoubleForField : CPTPieChartFieldSliceWidthSum recordIndex : idx - 1]; + startingWidth = (CGFloat)[self cachedDoubleForField:CPTPieChartFieldSliceWidthSum recordIndex:idx - 1]; } CGFloat labelAngle = [self radiansForPieSliceValue:startingWidth + currentWidth / CPTFloat(2.0)]; @@ -1242,7 +1242,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point for ( NSUInteger currentIndex = 0; currentIndex < sampleCount; currentIndex++ ) { // calculate angles for this slice - CGFloat width = (CGFloat)[self cachedDoubleForField : CPTPieChartFieldSliceWidthNormalized recordIndex : currentIndex]; + CGFloat width = (CGFloat)[self cachedDoubleForField:CPTPieChartFieldSliceWidthNormalized recordIndex:currentIndex]; if ( isnan(width) ) { continue; } @@ -1299,7 +1299,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point for ( NSUInteger currentIndex = 0; currentIndex < sampleCount; currentIndex++ ) { // calculate angles for this slice - CGFloat width = (CGFloat)[self cachedDoubleForField : CPTPieChartFieldSliceWidthNormalized recordIndex : currentIndex]; + CGFloat width = (CGFloat)[self cachedDoubleForField:CPTPieChartFieldSliceWidthNormalized recordIndex:currentIndex]; if ( isnan(width) ) { continue; } diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 79aa418bd..d021c561d 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -409,13 +409,13 @@ -(instancetype)initWithCoder:(NSCoder *)coder title = [[coder decodeObjectForKey:@"CPTPlot.title"] copy]; attributedTitle = [[coder decodeObjectForKey:@"CPTPlot.attributedTitle"] copy]; plotSpace = [coder decodeObjectForKey:@"CPTPlot.plotSpace"]; - cachePrecision = (CPTPlotCachePrecision)[coder decodeIntegerForKey : @"CPTPlot.cachePrecision"]; + cachePrecision = (CPTPlotCachePrecision)[coder decodeIntegerForKey:@"CPTPlot.cachePrecision"]; needsRelabel = [coder decodeBoolForKey:@"CPTPlot.needsRelabel"]; adjustLabelAnchors = [coder decodeBoolForKey:@"CPTPlot.adjustLabelAnchors"]; showLabels = [coder decodeBoolForKey:@"CPTPlot.showLabels"]; labelOffset = [coder decodeCGFloatForKey:@"CPTPlot.labelOffset"]; labelRotation = [coder decodeCGFloatForKey:@"CPTPlot.labelRotation"]; - labelField = (NSUInteger)[coder decodeIntegerForKey : @"CPTPlot.labelField"]; + labelField = (NSUInteger)[coder decodeIntegerForKey:@"CPTPlot.labelField"]; labelTextStyle = [[coder decodeObjectForKey:@"CPTPlot.labelTextStyle"] copy]; labelFormatter = [coder decodeObjectForKey:@"CPTPlot.labelFormatter"]; labelShadow = [coder decodeObjectForKey:@"CPTPlot.labelShadow"]; @@ -588,7 +588,7 @@ -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRec size_t sampleSize = numericData.sampleBytes; size_t length = sampleSize * numberOfRecords; - [(NSMutableData *)numericData.data increaseLengthBy : length]; + [(NSMutableData *) numericData.data increaseLengthBy:length]; int8_t *start = [numericData mutableSamplePointer:idx]; size_t bytesToMove = numericData.data.length - (idx + numberOfRecords) * sampleSize; @@ -633,7 +633,7 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange dataBuffer.length -= length; } else { - [(NSMutableArray *)data removeObjectsInRange : indexRange]; + [(NSMutableArray *) data removeObjectsInRange:indexRange]; } } @@ -1147,7 +1147,7 @@ -(CPTMutableNumericData *)numericDataForNumbers:(id)numbers if ( ( (CPTNumberArray)numbers ).count == 0 ) { loadedDataType = self.doubleDataType; } - else if ( [( (NSArray < NSNumber * > *)numbers )[0] isKindOfClass :[NSDecimalNumber class]] ) { + else if ( [( (NSArray < NSNumber * > *)numbers )[0] isKindOfClass:[NSDecimalNumber class]] ) { loadedDataType = self.decimalDataType; } else { @@ -1176,7 +1176,7 @@ -(BOOL)doublePrecisionCache Class numberClass = [NSNumber class]; for ( id key in [dataCache allKeys] ) { if ( [key isKindOfClass:numberClass] ) { - result = CPTDataTypeEqualToDataType([(CPTMutableNumericData *)dataCache[key] dataType], self.doubleDataType); + result = CPTDataTypeEqualToDataType([(CPTMutableNumericData *) dataCache[key] dataType], self.doubleDataType); break; } } @@ -1540,7 +1540,7 @@ -(void)relabel BOOL plotProvidesLabels = dataLabelTextStyle && dataLabelFormatter; BOOL hasCachedLabels = NO; - NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey : CPTPlotBindingDataLabels]; + NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey: CPTPlotBindingDataLabels]; for ( CPTLayer *label in cachedLabels ) { if ( ![label isKindOfClass:nullClass] ) { hasCachedLabels = YES; diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 5099be368..16745da1e 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -666,7 +666,7 @@ -(id)debugQuickLookObject { return [NSString stringWithFormat:@"Identifier: %@\nallowsUserInteraction: %@", self.identifier, - self.allowsUserInteraction ? @"YES":@"NO"]; + self.allowsUserInteraction ? @"YES" : @"NO"]; } /// @endcond diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index f818f1d88..af467c4b7 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -154,7 +154,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super init]) ) { anchorPoint = [coder decodeCPTPointForKey:@"CPTPlotSymbol.anchorPoint"]; size = [coder decodeCPTSizeForKey:@"CPTPlotSymbol.size"]; - symbolType = (CPTPlotSymbolType)[coder decodeIntegerForKey : @"CPTPlotSymbol.symbolType"]; + symbolType = (CPTPlotSymbolType)[coder decodeIntegerForKey:@"CPTPlotSymbol.symbolType"]; lineStyle = [coder decodeObjectForKey:@"CPTPlotSymbol.lineStyle"]; fill = [coder decodeObjectForKey:@"CPTPlotSymbol.fill"]; shadow = [[coder decodeObjectForKey:@"CPTPlotSymbol.shadow"] copy]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 83d7b79dd..6d3d975a1 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -296,8 +296,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey : @"CPTScatterPlot.interpolation"]; - histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey : @"CPTScatterPlot.histogramOption"]; + interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey:@"CPTScatterPlot.interpolation"]; + histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey:@"CPTScatterPlot.histogramOption"]; dataLineStyle = [[coder decodeObjectForKey:@"CPTScatterPlot.dataLineStyle"] copy]; plotSymbol = [[coder decodeObjectForKey:@"CPTScatterPlot.plotSymbol"] copy]; areaFill = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill"] copy]; diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index e1e5cb648..f1d05b81b 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -133,8 +133,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder fontName = [[coder decodeObjectForKey:@"CPTTextStyle.fontName"] copy]; fontSize = [coder decodeCGFloatForKey:@"CPTTextStyle.fontSize"]; color = [[coder decodeObjectForKey:@"CPTTextStyle.color"] copy]; - textAlignment = (CPTTextAlignment)[coder decodeIntegerForKey : @"CPTTextStyle.textAlignment"]; - lineBreakMode = (NSLineBreakMode)[coder decodeIntegerForKey : @"CPTTextStyle.lineBreakMode"]; + textAlignment = (CPTTextAlignment)[coder decodeIntegerForKey:@"CPTTextStyle.textAlignment"]; + lineBreakMode = (NSLineBreakMode)[coder decodeIntegerForKey:@"CPTTextStyle.lineBreakMode"]; } return self; } diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 392dc1e38..765485347 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -280,7 +280,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder decreaseLineStyle = [[coder decodeObjectForKey:@"CPTTradingRangePlot.decreaseLineStyle"] copy]; increaseFill = [[coder decodeObjectForKey:@"CPTTradingRangePlot.increaseFill"] copy]; decreaseFill = [[coder decodeObjectForKey:@"CPTTradingRangePlot.decreaseFill"] copy]; - plotStyle = (CPTTradingRangePlotStyle)[coder decodeIntegerForKey : @"CPTTradingRangePlot.plotStyle"]; + plotStyle = (CPTTradingRangePlotStyle)[coder decodeIntegerForKey:@"CPTTradingRangePlot.plotStyle"]; barWidth = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barWidth"]; stickLength = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.stickLength"]; barCornerRadius = [coder decodeCGFloatForKey:@"CPTTradingRangePlot.barCornerRadius"]; diff --git a/framework/Source/CPTXYGraph.m b/framework/Source/CPTXYGraph.m index 242619ad2..5d544b624 100644 --- a/framework/Source/CPTXYGraph.m +++ b/framework/Source/CPTXYGraph.m @@ -103,8 +103,8 @@ -(void)encodeWithCoder:(NSCoder *)coder -(instancetype)initWithCoder:(NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - xScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYGraph.xScaleType"]; - yScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYGraph.yScaleType"]; + xScaleType = (CPTScaleType)[coder decodeIntegerForKey:@"CPTXYGraph.xScaleType"]; + yScaleType = (CPTScaleType)[coder decodeIntegerForKey:@"CPTXYGraph.yScaleType"]; } return self; } diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 1be88bc27..25a113193 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -268,8 +268,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder } globalXRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalXRange"] copy]; globalYRange = [[coder decodeObjectForKey:@"CPTXYPlotSpace.globalYRange"] copy]; - xScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.xScaleType"]; - yScaleType = (CPTScaleType)[coder decodeIntegerForKey : @"CPTXYPlotSpace.yScaleType"]; + xScaleType = (CPTScaleType)[coder decodeIntegerForKey:@"CPTXYPlotSpace.xScaleType"]; + yScaleType = (CPTScaleType)[coder decodeIntegerForKey:@"CPTXYPlotSpace.yScaleType"]; if ( [coder containsValueForKey:@"CPTXYPlotSpace.allowsMomentum"] ) { self.allowsMomentum = [coder decodeBoolForKey:@"CPTXYPlotSpace.allowsMomentum"]; @@ -278,8 +278,8 @@ -(instancetype)initWithCoder:(NSCoder *)coder allowsMomentumX = [coder decodeBoolForKey:@"CPTXYPlotSpace.allowsMomentumX"]; allowsMomentumY = [coder decodeBoolForKey:@"CPTXYPlotSpace.allowsMomentumY"]; } - momentumAnimationCurve = (CPTAnimationCurve)[coder decodeIntForKey : @"CPTXYPlotSpace.momentumAnimationCurve"]; - bounceAnimationCurve = (CPTAnimationCurve)[coder decodeIntForKey : @"CPTXYPlotSpace.bounceAnimationCurve"]; + momentumAnimationCurve = (CPTAnimationCurve)[coder decodeIntForKey:@"CPTXYPlotSpace.momentumAnimationCurve"]; + bounceAnimationCurve = (CPTAnimationCurve)[coder decodeIntForKey:@"CPTXYPlotSpace.bounceAnimationCurve"]; momentumAcceleration = [coder decodeCGFloatForKey:@"CPTXYPlotSpace.momentumAcceleration"]; bounceAcceleration = [coder decodeCGFloatForKey:@"CPTXYPlotSpace.bounceAcceleration"]; minimumDisplacementToDrag = [coder decodeCGFloatForKey:@"CPTXYPlotSpace.minimumDisplacementToDrag"]; @@ -1654,18 +1654,18 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter // X range NSDecimal shiftX = CPTDecimalSubtract(lastPoint[CPTCoordinateX], newPoint[CPTCoordinateX]); CPTPlotRange *newRangeX = [self shiftRange:self.xRange - by:shiftX - usingMomentum:self.allowsMomentumX - inGlobalRange:self.globalXRange - withDisplacement:&displacement.x]; + by:shiftX + usingMomentum:self.allowsMomentumX + inGlobalRange:self.globalXRange + withDisplacement:&displacement.x]; // Y range NSDecimal shiftY = CPTDecimalSubtract(lastPoint[CPTCoordinateY], newPoint[CPTCoordinateY]); CPTPlotRange *newRangeY = [self shiftRange:self.yRange - by:shiftY - usingMomentum:self.allowsMomentumY - inGlobalRange:self.globalYRange - withDisplacement:&displacement.y]; + by:shiftY + usingMomentum:self.allowsMomentumY + inGlobalRange:self.globalYRange + withDisplacement:&displacement.y]; self.lastDragPoint = pointInPlotArea; self.lastDisplacement = displacement; @@ -1767,18 +1767,18 @@ -(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toP // X range NSDecimal shiftX = CPTDecimalSubtract(lastPoint[CPTCoordinateX], newPoint[CPTCoordinateX]); CPTPlotRange *newRangeX = [self shiftRange:self.xRange - by:shiftX - usingMomentum:NO - inGlobalRange:self.globalXRange - withDisplacement:&displacement.x]; + by:shiftX + usingMomentum:NO + inGlobalRange:self.globalXRange + withDisplacement:&displacement.x]; // Y range NSDecimal shiftY = CPTDecimalSubtract(lastPoint[CPTCoordinateY], newPoint[CPTCoordinateY]); CPTPlotRange *newRangeY = [self shiftRange:self.yRange - by:shiftY - usingMomentum:NO - inGlobalRange:self.globalYRange - withDisplacement:&displacement.y]; + by:shiftY + usingMomentum:NO + inGlobalRange:self.globalYRange + withDisplacement:&displacement.y]; self.xRange = newRangeX; self.yRange = newRangeY; diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 1bd64693c..b225174f1 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -359,12 +359,12 @@ -(CGPathRef)newCGPathDecodeForKey:(NSString *)key // decode count NSString *newKey = [[NSString alloc] initWithFormat:@"%@.count", key]; - NSUInteger count = (NSUInteger)[self decodeIntegerForKey : newKey]; + NSUInteger count = (NSUInteger)[self decodeIntegerForKey:newKey]; // decode elements for ( NSUInteger i = 0; i < count; i++ ) { newKey = [[NSString alloc] initWithFormat:@"%@[%lu].type", key, (unsigned long)i]; - CGPathElementType type = (CGPathElementType)[self decodeIntForKey : newKey]; + CGPathElementType type = (CGPathElementType)[self decodeIntForKey:newKey]; CGPoint point1 = CGPointZero; CGPoint point2 = CGPointZero; @@ -424,19 +424,19 @@ -(CGPathRef)newCGPathDecodeForKey:(NSString *)key -(CGImageRef)newCGImageDecodeForKey:(NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.width", key]; - size_t width = (size_t)[self decodeInt64ForKey : newKey]; + size_t width = (size_t)[self decodeInt64ForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.height", key]; - size_t height = (size_t)[self decodeInt64ForKey : newKey]; + size_t height = (size_t)[self decodeInt64ForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.bitsPerComponent", key]; - size_t bitsPerComponent = (size_t)[self decodeInt64ForKey : newKey]; + size_t bitsPerComponent = (size_t)[self decodeInt64ForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.bitsPerPixel", key]; - size_t bitsPerPixel = (size_t)[self decodeInt64ForKey : newKey]; + size_t bitsPerPixel = (size_t)[self decodeInt64ForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.bytesPerRow", key]; - size_t bytesPerRow = (size_t)[self decodeInt64ForKey : newKey]; + size_t bytesPerRow = (size_t)[self decodeInt64ForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.colorSpace", key]; CGColorSpaceRef colorSpace = [self newCGColorSpaceDecodeForKey:newKey]; @@ -449,7 +449,7 @@ -(CGImageRef)newCGImageDecodeForKey:(NSString *)key CGDataProviderRef provider = CGDataProviderCreateWithCFData( (__bridge CFDataRef)[self decodeObjectForKey:newKey] ); newKey = [[NSString alloc] initWithFormat:@"%@.numberOfComponents", key]; - size_t numberOfComponents = (size_t)[self decodeInt64ForKey : newKey]; + size_t numberOfComponents = (size_t)[self decodeInt64ForKey:newKey]; CGFloat *decodeArray = NULL; if ( numberOfComponents ) { @@ -468,7 +468,7 @@ -(CGImageRef)newCGImageDecodeForKey:(NSString *)key bool shouldInterpolate = [self decodeBoolForKey:newKey]; newKey = [[NSString alloc] initWithFormat:@"%@.renderingIntent", key]; - CGColorRenderingIntent intent = (CGColorRenderingIntent)[self decodeIntForKey : newKey]; + CGColorRenderingIntent intent = (CGColorRenderingIntent)[self decodeIntForKey:newKey]; CGImageRef newImage = CGImageCreate(width, height, diff --git a/framework/Source/_CPTAnimationNSDecimalPeriod.m b/framework/Source/_CPTAnimationNSDecimalPeriod.m index b6ec08820..6dc397ac8 100644 --- a/framework/Source/_CPTAnimationNSDecimalPeriod.m +++ b/framework/Source/_CPTAnimationNSDecimalPeriod.m @@ -43,8 +43,8 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett } NSDecimal current = CPTCurrentDecimalValue(boundObject, boundGetter); - NSDecimal start = [(NSDecimalNumber *)self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *)self.endValue decimalValue]; + NSDecimal start = [(NSDecimalNumber *) self.startValue decimalValue]; + NSDecimal end = [(NSDecimalNumber *) self.endValue decimalValue]; return ( CPTDecimalGreaterThanOrEqualTo(current, start) && CPTDecimalLessThanOrEqualTo(current, end) ) || ( CPTDecimalGreaterThanOrEqualTo(current, end) && CPTDecimalLessThanOrEqualTo(current, start) ); @@ -52,8 +52,8 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett -(NSValue *)tweenedValueForProgress:(CGFloat)progress { - NSDecimal start = [(NSDecimalNumber *)self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *)self.endValue decimalValue]; + NSDecimal start = [(NSDecimalNumber *) self.startValue decimalValue]; + NSDecimal end = [(NSDecimalNumber *) self.endValue decimalValue]; NSDecimal length = CPTDecimalSubtract(end, start); NSDecimal tweenedValue = CPTDecimalAdd( start, CPTDecimalMultiply(CPTDecimalFromCGFloat(progress), length) ); diff --git a/framework/Source/_CPTAnimationPlotRangePeriod.m b/framework/Source/_CPTAnimationPlotRangePeriod.m index 51ddf7955..569696a3d 100644 --- a/framework/Source/_CPTAnimationPlotRangePeriod.m +++ b/framework/Source/_CPTAnimationPlotRangePeriod.m @@ -8,7 +8,7 @@ @implementation _CPTAnimationPlotRangePeriod -(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter { typedef NSValue *(*GetterType)(id, SEL); - GetterType getterMethod = (GetterType)[boundObject methodForSelector : boundGetter]; + GetterType getterMethod = (GetterType)[boundObject methodForSelector:boundGetter]; self.startValue = getterMethod(boundObject, boundGetter); } @@ -20,7 +20,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett } typedef CPTPlotRange *(*GetterType)(id, SEL); - GetterType getterMethod = (GetterType)[boundObject methodForSelector : boundGetter]; + GetterType getterMethod = (GetterType)[boundObject methodForSelector:boundGetter]; CPTPlotRange *current = getterMethod(boundObject, boundGetter); CPTPlotRange *start = (CPTPlotRange *)self.startValue; diff --git a/framework/Source/_CPTMaskLayer.m b/framework/Source/_CPTMaskLayer.m index ffdf9bf8e..c5cd55634 100644 --- a/framework/Source/_CPTMaskLayer.m +++ b/framework/Source/_CPTMaskLayer.m @@ -10,10 +10,10 @@ @implementation CPTMaskLayer /** @brief Initializes a newly allocated CPTMaskLayer object with the provided frame rectangle. * - * This is the designated initializer. The initialized layer will have the following properties: - * - @ref needsDisplayOnBoundsChange = @YES + * This is the designated initializer. The initialized layer will have the following properties: + * - @ref needsDisplayOnBoundsChange = @YES * - * @param newFrame The frame rectangle. + * @param newFrame The frame rectangle. * @return The initialized CPTMaskLayer object. **/ -(instancetype)initWithFrame:(CGRect)newFrame From c3cfe44fc10534a6024aacc23a01b765e3ba65be Mon Sep 17 00:00:00 2001 From: gmercier Date: Mon, 15 Feb 2016 08:30:59 +0100 Subject: [PATCH 152/429] add Catmull-Rom interpolation algorithm plot drawing. Fixed issue #68. inspired by grav (https://github.com/grav/core-plot/tree/catmullrom) and nh32rg (http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections) --- framework/CorePlot.xcodeproj/project.pbxproj | 20 +++ framework/Source/CPTCatmullRomInterpolation.h | 17 +++ framework/Source/CPTCatmullRomInterpolation.m | 137 ++++++++++++++++++ framework/Source/CPTScatterPlot.h | 3 +- framework/Source/CPTScatterPlot.m | 38 ++++- 5 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 framework/Source/CPTCatmullRomInterpolation.h create mode 100644 framework/Source/CPTCatmullRomInterpolation.m diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 7000f014e..9d25b897c 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -157,6 +157,14 @@ 906156BE0F375598001B75FC /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 906156BC0F375598001B75FC /* CPTLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 906156BF0F375598001B75FC /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; 90AF4FBA0F36D39700753D26 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; + 93961BE61C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */; }; + 93961BE71C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */; }; + 93961BE91C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BEA1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BEB1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BEC1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BED1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BEE1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; A92C00498745CB844AF563E0 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */; }; A92C02A48B4FBD94D718ECF8 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; A92C02FFEE33F8D28665257B /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; @@ -787,6 +795,8 @@ 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTCatmullRomInterpolation.h; sourceTree = ""; }; + 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTCatmullRomInterpolation.m; sourceTree = ""; }; A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationNSDecimalPeriod.m; sourceTree = ""; }; A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGSizePeriod.h; sourceTree = ""; }; A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationNSDecimalPeriod.h; sourceTree = ""; }; @@ -1213,6 +1223,8 @@ 07BF0D890F2B736D002FCEA7 /* Plots */ = { isa = PBXGroup; children = ( + 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */, + 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */, C3F31DE81045EB470058520A /* CPTPlotGroup.h */, C3F31DE71045EB470058520A /* CPTPlotGroup.m */, 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */, @@ -1797,6 +1809,7 @@ 072161EB11D1F6BD009CC871 /* CPTAnnotationHostLayer.h in Headers */, C318F4AD11EA188700595FF9 /* CPTLimitBand.h in Headers */, C3CAFB261229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h in Headers */, + 93961BE61C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */, C3CCA03D13E8D85900CE6DB1 /* _CPTConstraintsFixed.h in Headers */, C3CCA03F13E8D85900CE6DB1 /* _CPTConstraintsRelative.h in Headers */, 07B69A5D12B6215000F4C16C /* CPTTextStyle.h in Headers */, @@ -1831,6 +1844,7 @@ buildActionMask = 2147483647; files = ( C38A0AAF1A46241100D45436 /* CPTLimitBand.h in Headers */, + 93961BE71C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */, C38A09EF1A461CD000D45436 /* CPTDefinitions.h in Headers */, C38A0AD51A46256B00D45436 /* CPTPlotSymbol.h in Headers */, C38A0AC61A46255C00D45436 /* CPTTradingRangePlot.h in Headers */, @@ -2208,6 +2222,7 @@ C3392A481225FB68008DA6BD /* CPTMutableNumericDataTests.m in Sources */, C3392A491225FB69008DA6BD /* CPTNumericDataTests.m in Sources */, C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */, + 93961BEA1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, C3CB561C122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C3D979A413D2136700145DFF /* CPTPlotSpaceTests.m in Sources */, C3D979A913D2328000145DFF /* CPTTimeFormatterTests.m in Sources */, @@ -2263,6 +2278,7 @@ 070622330FDF1B250066A6C4 /* CPTPathExtensions.m in Sources */, 0706223D0FDF215C0066A6C4 /* CPTBorderedLayer.m in Sources */, 07C4679C0FE1A24C00299939 /* CPTMutableTextStyle.m in Sources */, + 93961BE91C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, 07C467B90FE1A96E00299939 /* CPTTextStylePlatformSpecific.m in Sources */, 0772C9280FE2F71600EC4C16 /* CPTTheme.m in Sources */, 0772C9300FE2F89000EC4C16 /* _CPTDarkGradientTheme.m in Sources */, @@ -2411,6 +2427,7 @@ C38A0A091A461D4D00D45436 /* CPTBorderedLayer.m in Sources */, C38A0A6B1A4620E200D45436 /* CPTLineStyle.m in Sources */, C38A0A241A461E9200D45436 /* _CPTAnimationCGSizePeriod.m in Sources */, + 93961BEB1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, C38A0ACA1A46256500D45436 /* CPTPieChart.m in Sources */, C38A0A671A4620E200D45436 /* CPTColorSpace.m in Sources */, C38A0A681A4620E200D45436 /* CPTGradient.m in Sources */, @@ -2442,6 +2459,7 @@ C38A09D31A461C1800D45436 /* CPTDataSourceTestCase.m in Sources */, C38A09E81A461CB600D45436 /* CPTNumericDataTests.m in Sources */, C38A0B141A46261F00D45436 /* CPTDerivedXYGraph.m in Sources */, + 93961BEC1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, C38A0ABD1A46250B00D45436 /* CPTXYPlotSpaceTests.m in Sources */, C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */, C38A0A011A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, @@ -2543,6 +2561,7 @@ C38A0A311A461EB600D45436 /* _CPTAnimationTimingFunctions.m in Sources */, C38A0A5B1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */, C38A0A4C1A461F1B00D45436 /* CPTTextStyle.m in Sources */, + 93961BED1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, C38A0B101A46261700D45436 /* _CPTSlateTheme.m in Sources */, C38A0AD31A46256600D45436 /* CPTScatterPlot.m in Sources */, C38A0A0D1A461D5800D45436 /* _CPTBorderLayer.m in Sources */, @@ -2574,6 +2593,7 @@ C38A0A911A46210A00D45436 /* CPTLineStyleTests.m in Sources */, C38A0A021A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, C38A0B171A46262000D45436 /* CPTDerivedXYGraph.m in Sources */, + 93961BEE1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, C38A09E71A461CB300D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C38A0A8E1A46210A00D45436 /* CPTFillTests.m in Sources */, C38A09E91A461CB700D45436 /* CPTNumericDataTests.m in Sources */, diff --git a/framework/Source/CPTCatmullRomInterpolation.h b/framework/Source/CPTCatmullRomInterpolation.h new file mode 100644 index 000000000..d8445c890 --- /dev/null +++ b/framework/Source/CPTCatmullRomInterpolation.h @@ -0,0 +1,17 @@ +// +// Created by Mikkel Gravgaard on 27/11/14. +// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections +// + +#import + +typedef enum { + CatmullRomTypeUniform, + CatmullRomTypeChordal, + CatmullRomTypeCentripetal +} +CatmullRomType; + +@interface CPTCatmullRomInterpolation : NSObject ++(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity; +@end diff --git a/framework/Source/CPTCatmullRomInterpolation.m b/framework/Source/CPTCatmullRomInterpolation.m new file mode 100644 index 000000000..8c9588ed1 --- /dev/null +++ b/framework/Source/CPTCatmullRomInterpolation.m @@ -0,0 +1,137 @@ +// +// Created by Mikkel Gravgaard on 27/11/14. +// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections +// + +#import "CPTCatmullRomInterpolation.h" + +@implementation CPTCatmullRomInterpolation + ++(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity +{ + UIBezierPath __block *path = [[UIBezierPath alloc] init]; + + NSMutableArray *curve = [self interpolate:points withPointsPerSegment:granularity andType:CatmullRomTypeCentripetal]; + + CGPoint __block p0 = [curve[0] CGPointValue]; + + [path moveToPoint:p0]; + + //use this loop to draw lines between all points + for ( NSUInteger idx = 1; (idx < [curve count]); idx += 1 ) { + CGPoint c1 = [curve[idx] CGPointValue]; + + [path addLineToPoint:c1]; + } + + return path; +} + ++(NSMutableArray *)interpolate:(NSArray *)coordinates withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType +{ + NSMutableArray *vertices = [[NSMutableArray alloc] initWithArray:coordinates copyItems:YES]; + + if ( pointsPerSegment < 3 ) { + return vertices; + } + + //start point + CGPoint pt1 = [vertices[0] CGPointValue]; + CGPoint pt2 = [vertices[1] CGPointValue]; + + double dx = pt2.x - pt1.x; + double dy = pt2.y - pt1.y; + + double x1 = pt1.x - dx; + double y1 = pt1.y - dy; + + CGPoint start = CGPointMake(x1 * .5, y1); + + //end point + pt2 = [vertices[vertices.count - 1] CGPointValue]; + pt1 = [vertices[vertices.count - 2] CGPointValue]; + + dx = pt2.x - pt1.x; + dy = pt2.y - pt1.y; + + x1 = pt2.x + dx; + y1 = pt2.y + dy; + + CGPoint end = CGPointMake(x1, y1); + + [vertices insertObject:[NSValue valueWithCGPoint:start] atIndex:0]; + [vertices addObject:[NSValue valueWithCGPoint:end]]; + + NSMutableArray *result = [NSMutableArray array]; + + for ( int i = 0; i < (int)(vertices.count - 3); i++ ) { + NSMutableArray *points = [self interpolate:vertices forIndex:i withPointsPerSegment:pointsPerSegment andType:curveType]; + [result addObjectsFromArray:points]; + } + + return result; +} + ++(double)interpolate:(double *)p time:(double *)time t:(double)t +{ + double L01 = p[0] * (time[1] - t) / (time[1] - time[0]) + p[1] * (t - time[0]) / (time[1] - time[0]); + double L12 = p[1] * (time[2] - t) / (time[2] - time[1]) + p[2] * (t - time[1]) / (time[2] - time[1]); + double L23 = p[2] * (time[3] - t) / (time[3] - time[2]) + p[3] * (t - time[2]) / (time[3] - time[2]); + double L012 = L01 * (time[2] - t) / (time[2] - time[0]) + L12 * (t - time[0]) / (time[2] - time[0]); + double L123 = L12 * (time[3] - t) / (time[3] - time[1]) + L23 * (t - time[1]) / (time[3] - time[1]); + double C12 = L012 * (time[2] - t) / (time[2] - time[1]) + L123 * (t - time[1]) / (time[2] - time[1]); + + return C12; +} + ++(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType +{ + NSMutableArray *result = [NSMutableArray array]; + + double x[4]; + double y[4]; + double time[4]; + + for ( int i = 0; i < 4; i++ ) { + x[i] = [points[(NSUInteger)(index + i)] CGPointValue].x; + y[i] = [points[(NSUInteger)(index + i)] CGPointValue].y; + time[i] = i; + } + + double tstart = 1; + double tend = 2; + + if ( curveType != CatmullRomTypeUniform ) { + double total = 0; + + for ( int i = 1; i < 4; i++ ) { + double dx = x[i] - x[i - 1]; + double dy = y[i] - y[i - 1]; + + if ( curveType == CatmullRomTypeCentripetal ) { + total += pow(dx * dx + dy * dy, 0.25); + } + else { + total += pow(dx * dx + dy * dy, 0.5); + } + time[i] = total; + } + tstart = time[1]; + tend = time[2]; + } + + long segments = pointsPerSegment - 1; + + [result addObject:points[(NSUInteger)(index + 1)]]; + + for ( int i = 1; i < segments; i++ ) { + double xi = [self interpolate:x time:time t:tstart + ( i * (tend - tstart) ) / segments]; + double yi = [self interpolate:y time:time t:tstart + ( i * (tend - tstart) ) / segments]; + [result addObject:[NSValue valueWithCGPoint:CGPointMake(xi, yi)]]; + } + [result addObject:points[(NSUInteger)(index + 2)]]; + + return result; +} + +@end diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 84317a202..a5f930c6c 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -31,7 +31,8 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationLinear, ///< Linear interpolation. CPTScatterPlotInterpolationStepped, ///< Steps beginning at data point. CPTScatterPlotInterpolationHistogram, ///< Steps centered at data point. - CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. + CPTScatterPlotInterpolationCurved, ///< Bezier curve interpolation. + CPTScatterPlotInterpolationCatmullRom ///< Catmull-Rom interpolation. }; /** diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 6d3d975a1..18397749c 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -13,6 +13,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "CPTCatmullRomInterpolation.h" #import /** @defgroup plotAnimationScatterPlot Scatter Plot @@ -430,7 +431,7 @@ -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace CPTLineStyle *lineStyle = self.dataLineStyle; - if ( self.areaFill || self.areaFill2 || lineStyle.dashPattern || lineStyle.lineFill || (self.interpolation == CPTScatterPlotInterpolationCurved) ) { + if ( self.areaFill || self.areaFill2 || lineStyle.dashPattern || lineStyle.lineFill || (self.interpolation == CPTScatterPlotInterpolationCurved) || (self.interpolation == CPTScatterPlotInterpolationCatmullRom) ) { // show all points to preserve the line dash and area fills for ( NSUInteger i = 0; i < dataCount; i++ ) { pointDrawFlags[i] = YES; @@ -508,6 +509,7 @@ -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace else { switch ( theInterpolation ) { case CPTScatterPlotInterpolationCurved: + case CPTScatterPlotInterpolationCatmullRom: // Keep 2 points outside of the visible area on each side to maintain the correct curvature of the line if ( dataCount > 1 ) { if ( !nanFlags[0] && !nanFlags[1] && ( (xRangeFlags[0] != xRangeFlags[1]) || (yRangeFlags[0] != yRangeFlags[1]) ) ) { @@ -924,6 +926,9 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan if ( theInterpolation == CPTScatterPlotInterpolationCurved ) { return [self newCurvedDataLinePathForViewPoints:viewPoints indexRange:indexRange baselineYValue:baselineYValue]; } + else if ( theInterpolation == CPTScatterPlotInterpolationCatmullRom ) { + return [self newCatmullRomDataLinePathForViewPoints:viewPoints indexRange:indexRange baselineYValue:baselineYValue]; + } CGMutablePathRef dataLinePath = CGPathCreateMutable(); BOOL lastPointSkipped = YES; @@ -979,6 +984,7 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan break; case CPTScatterPlotInterpolationCurved: + case CPTScatterPlotInterpolationCatmullRom: // Curved plot lines handled separately break; } @@ -1192,6 +1198,36 @@ -(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints: } } +-(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue +{ + CGMutablePathRef dataLinePath = CGPathCreateMutable(); + NSUInteger pointsSize = indexRange.length; + + if ( pointsSize >= 2 ) { + NSMutableArray * inputPoints = [NSMutableArray array]; + + for( int i = (int)indexRange.location; i< (int)( indexRange.location + pointsSize ); i++ ){ + CGPoint p = viewPoints[i]; + CGPoint q = CGPointMake(p.x, p.y); + [inputPoints addObject:[NSValue valueWithCGPoint:q]]; + } + + UIBezierPath* bezierPath = [CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; + dataLinePath = CGPathCreateCopy(bezierPath.CGPath); + + if ( !isnan(baselineYValue) ) { + CGPoint firstPoint = viewPoints[0]; + CGPoint lastPoint = viewPoints[pointsSize - 1]; + CGPathAddLineToPoint(dataLinePath, NULL, lastPoint.x, baselineYValue); + CGPathAddLineToPoint(dataLinePath, NULL, firstPoint.x, baselineYValue); + CGPathCloseSubpath(dataLinePath); + } + } + return dataLinePath; +} + + + -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; From 41e08c83a3939752efa98191cd634a386a98c862 Mon Sep 17 00:00:00 2001 From: gmercier Date: Mon, 15 Feb 2016 16:39:31 +0100 Subject: [PATCH 153/429] try to fix travis build for issue #68 --- framework/Source/CPTScatterPlot.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 18397749c..ad0c2da61 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1,5 +1,7 @@ #import "CPTScatterPlot.h" +#import +#import #import "CPTExceptions.h" #import "CPTFill.h" #import "CPTLegend.h" @@ -14,7 +16,6 @@ #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" #import "CPTCatmullRomInterpolation.h" -#import /** @defgroup plotAnimationScatterPlot Scatter Plot * @brief Scatter plot properties that can be animated using Core Animation. From 68adfa39008479a6f194346093aed8c5872fd7b3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 15 Feb 2016 19:40:12 -0500 Subject: [PATCH 154/429] Standardized code formatting. --- framework/Source/CPTCatmullRomInterpolation.m | 66 +++++++++---------- framework/Source/CPTScatterPlot.m | 28 ++++---- 2 files changed, 46 insertions(+), 48 deletions(-) diff --git a/framework/Source/CPTCatmullRomInterpolation.m b/framework/Source/CPTCatmullRomInterpolation.m index 8c9588ed1..0bc8b1c17 100644 --- a/framework/Source/CPTCatmullRomInterpolation.m +++ b/framework/Source/CPTCatmullRomInterpolation.m @@ -10,65 +10,65 @@ @implementation CPTCatmullRomInterpolation +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity { UIBezierPath __block *path = [[UIBezierPath alloc] init]; - + NSMutableArray *curve = [self interpolate:points withPointsPerSegment:granularity andType:CatmullRomTypeCentripetal]; - + CGPoint __block p0 = [curve[0] CGPointValue]; - + [path moveToPoint:p0]; - - //use this loop to draw lines between all points + + // use this loop to draw lines between all points for ( NSUInteger idx = 1; (idx < [curve count]); idx += 1 ) { CGPoint c1 = [curve[idx] CGPointValue]; - + [path addLineToPoint:c1]; } - + return path; } +(NSMutableArray *)interpolate:(NSArray *)coordinates withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType { NSMutableArray *vertices = [[NSMutableArray alloc] initWithArray:coordinates copyItems:YES]; - + if ( pointsPerSegment < 3 ) { return vertices; } - - //start point + + // start point CGPoint pt1 = [vertices[0] CGPointValue]; CGPoint pt2 = [vertices[1] CGPointValue]; - + double dx = pt2.x - pt1.x; double dy = pt2.y - pt1.y; - + double x1 = pt1.x - dx; double y1 = pt1.y - dy; - + CGPoint start = CGPointMake(x1 * .5, y1); - - //end point + + // end point pt2 = [vertices[vertices.count - 1] CGPointValue]; pt1 = [vertices[vertices.count - 2] CGPointValue]; - + dx = pt2.x - pt1.x; dy = pt2.y - pt1.y; - + x1 = pt2.x + dx; y1 = pt2.y + dy; - + CGPoint end = CGPointMake(x1, y1); - + [vertices insertObject:[NSValue valueWithCGPoint:start] atIndex:0]; [vertices addObject:[NSValue valueWithCGPoint:end]]; - + NSMutableArray *result = [NSMutableArray array]; - + for ( int i = 0; i < (int)(vertices.count - 3); i++ ) { NSMutableArray *points = [self interpolate:vertices forIndex:i withPointsPerSegment:pointsPerSegment andType:curveType]; [result addObjectsFromArray:points]; } - + return result; } @@ -80,34 +80,34 @@ +(double)interpolate:(double *)p time:(double *)time t:(double)t double L012 = L01 * (time[2] - t) / (time[2] - time[0]) + L12 * (t - time[0]) / (time[2] - time[0]); double L123 = L12 * (time[3] - t) / (time[3] - time[1]) + L23 * (t - time[1]) / (time[3] - time[1]); double C12 = L012 * (time[2] - t) / (time[2] - time[1]) + L123 * (t - time[1]) / (time[2] - time[1]); - + return C12; } +(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType { NSMutableArray *result = [NSMutableArray array]; - + double x[4]; double y[4]; double time[4]; - + for ( int i = 0; i < 4; i++ ) { x[i] = [points[(NSUInteger)(index + i)] CGPointValue].x; y[i] = [points[(NSUInteger)(index + i)] CGPointValue].y; time[i] = i; } - + double tstart = 1; double tend = 2; - + if ( curveType != CatmullRomTypeUniform ) { double total = 0; - + for ( int i = 1; i < 4; i++ ) { double dx = x[i] - x[i - 1]; double dy = y[i] - y[i - 1]; - + if ( curveType == CatmullRomTypeCentripetal ) { total += pow(dx * dx + dy * dy, 0.25); } @@ -119,18 +119,18 @@ +(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withP tstart = time[1]; tend = time[2]; } - + long segments = pointsPerSegment - 1; - + [result addObject:points[(NSUInteger)(index + 1)]]; - + for ( int i = 1; i < segments; i++ ) { double xi = [self interpolate:x time:time t:tstart + ( i * (tend - tstart) ) / segments]; double yi = [self interpolate:y time:time t:tstart + ( i * (tend - tstart) ) / segments]; [result addObject:[NSValue valueWithCGPoint:CGPointMake(xi, yi)]]; } [result addObject:points[(NSUInteger)(index + 2)]]; - + return result; } diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index ad0c2da61..44bd28fdc 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1,7 +1,6 @@ #import "CPTScatterPlot.h" -#import -#import +#import "CPTCatmullRomInterpolation.h" #import "CPTExceptions.h" #import "CPTFill.h" #import "CPTLegend.h" @@ -15,7 +14,8 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" -#import "CPTCatmullRomInterpolation.h" +#import +#import /** @defgroup plotAnimationScatterPlot Scatter Plot * @brief Scatter plot properties that can be animated using Core Animation. @@ -1201,24 +1201,24 @@ -(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints: -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue { - CGMutablePathRef dataLinePath = CGPathCreateMutable(); - NSUInteger pointsSize = indexRange.length; - + CGMutablePathRef dataLinePath = CGPathCreateMutable(); + NSUInteger pointsSize = indexRange.length; + if ( pointsSize >= 2 ) { - NSMutableArray * inputPoints = [NSMutableArray array]; - - for( int i = (int)indexRange.location; i< (int)( indexRange.location + pointsSize ); i++ ){ + NSMutableArray *inputPoints = [NSMutableArray array]; + + for ( int i = (int)indexRange.location; i < (int)(indexRange.location + pointsSize); i++ ) { CGPoint p = viewPoints[i]; CGPoint q = CGPointMake(p.x, p.y); [inputPoints addObject:[NSValue valueWithCGPoint:q]]; } - - UIBezierPath* bezierPath = [CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; + + UIBezierPath *bezierPath = [CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; dataLinePath = CGPathCreateCopy(bezierPath.CGPath); - + if ( !isnan(baselineYValue) ) { CGPoint firstPoint = viewPoints[0]; - CGPoint lastPoint = viewPoints[pointsSize - 1]; + CGPoint lastPoint = viewPoints[pointsSize - 1]; CGPathAddLineToPoint(dataLinePath, NULL, lastPoint.x, baselineYValue); CGPathAddLineToPoint(dataLinePath, NULL, firstPoint.x, baselineYValue); CGPathCloseSubpath(dataLinePath); @@ -1227,8 +1227,6 @@ -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRa return dataLinePath; } - - -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; From 85315a5997e137ffc99de8a057e2a7fd401c7713 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 15 Feb 2016 21:03:02 -0500 Subject: [PATCH 155/429] Added CPT prefix to the CPTCatmullRomType enum. --- framework/Source/CPTCatmullRomInterpolation.h | 18 +++++++----------- framework/Source/CPTCatmullRomInterpolation.m | 16 ++++++---------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/framework/Source/CPTCatmullRomInterpolation.h b/framework/Source/CPTCatmullRomInterpolation.h index d8445c890..f99745a26 100644 --- a/framework/Source/CPTCatmullRomInterpolation.h +++ b/framework/Source/CPTCatmullRomInterpolation.h @@ -1,17 +1,13 @@ -// -// Created by Mikkel Gravgaard on 27/11/14. -// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections -// - #import -typedef enum { - CatmullRomTypeUniform, - CatmullRomTypeChordal, - CatmullRomTypeCentripetal -} -CatmullRomType; +typedef NS_ENUM (NSInteger, CPTCatmullRomType) { + CPTCatmullRomTypeUniform, + CPTCatmullRomTypeChordal, + CPTCatmullRomTypeCentripetal +}; @interface CPTCatmullRomInterpolation : NSObject + +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity; + @end diff --git a/framework/Source/CPTCatmullRomInterpolation.m b/framework/Source/CPTCatmullRomInterpolation.m index 0bc8b1c17..49ecf5396 100644 --- a/framework/Source/CPTCatmullRomInterpolation.m +++ b/framework/Source/CPTCatmullRomInterpolation.m @@ -1,8 +1,3 @@ -// -// Created by Mikkel Gravgaard on 27/11/14. -// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections -// - #import "CPTCatmullRomInterpolation.h" @implementation CPTCatmullRomInterpolation @@ -11,7 +6,7 @@ +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteg { UIBezierPath __block *path = [[UIBezierPath alloc] init]; - NSMutableArray *curve = [self interpolate:points withPointsPerSegment:granularity andType:CatmullRomTypeCentripetal]; + NSMutableArray *curve = [self interpolate:points withPointsPerSegment:granularity andType:CPTCatmullRomTypeCentripetal]; CGPoint __block p0 = [curve[0] CGPointValue]; @@ -27,7 +22,8 @@ +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteg return path; } -+(NSMutableArray *)interpolate:(NSArray *)coordinates withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType +// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections ++(NSMutableArray *)interpolate:(NSArray *)coordinates withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType { NSMutableArray *vertices = [[NSMutableArray alloc] initWithArray:coordinates copyItems:YES]; @@ -84,7 +80,7 @@ +(double)interpolate:(double *)p time:(double *)time t:(double)t return C12; } -+(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CatmullRomType)curveType ++(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType { NSMutableArray *result = [NSMutableArray array]; @@ -101,14 +97,14 @@ +(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withP double tstart = 1; double tend = 2; - if ( curveType != CatmullRomTypeUniform ) { + if ( curveType != CPTCatmullRomTypeUniform ) { double total = 0; for ( int i = 1; i < 4; i++ ) { double dx = x[i] - x[i - 1]; double dy = y[i] - y[i - 1]; - if ( curveType == CatmullRomTypeCentripetal ) { + if ( curveType == CPTCatmullRomTypeCentripetal ) { total += pow(dx * dx + dy * dy, 0.25); } else { From 26e7a446e8fbe4120d80c2d68bac24d81cace34c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 15 Feb 2016 21:14:59 -0500 Subject: [PATCH 156/429] Made the CPTCatmullRomInterpolation class private and added an underscore prefix to the name. --- framework/CorePlot.xcodeproj/project.pbxproj | 40 +++++++++---------- framework/Source/CPTScatterPlot.m | 4 +- ...lation.h => _CPTCatmullRomInterpolation.h} | 4 +- ...lation.m => _CPTCatmullRomInterpolation.m} | 4 +- 4 files changed, 25 insertions(+), 27 deletions(-) rename framework/Source/{CPTCatmullRomInterpolation.h => _CPTCatmullRomInterpolation.h} (74%) rename framework/Source/{CPTCatmullRomInterpolation.m => _CPTCatmullRomInterpolation.m} (98%) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 9d25b897c..a64c4d6b0 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -157,14 +157,14 @@ 906156BE0F375598001B75FC /* CPTLineStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 906156BC0F375598001B75FC /* CPTLineStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 906156BF0F375598001B75FC /* CPTLineStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 906156BD0F375598001B75FC /* CPTLineStyle.m */; }; 90AF4FBA0F36D39700753D26 /* CPTXYPlotSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */; }; - 93961BE61C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */; }; - 93961BE71C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */; }; - 93961BE91C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; - 93961BEA1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; - 93961BEB1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; - 93961BEC1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; - 93961BED1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; - 93961BEE1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */; }; + 93961BE61C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 93961BE71C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 93961BE91C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + 93961BEA1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + 93961BEB1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + 93961BEC1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + 93961BED1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + 93961BEE1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; A92C00498745CB844AF563E0 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */; }; A92C02A48B4FBD94D718ECF8 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; A92C02FFEE33F8D28665257B /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; @@ -795,8 +795,8 @@ 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTCatmullRomInterpolation.h; sourceTree = ""; }; - 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTCatmullRomInterpolation.m; sourceTree = ""; }; + 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTCatmullRomInterpolation.h; sourceTree = ""; }; + 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTCatmullRomInterpolation.m; sourceTree = ""; }; A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationNSDecimalPeriod.m; sourceTree = ""; }; A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGSizePeriod.h; sourceTree = ""; }; A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationNSDecimalPeriod.h; sourceTree = ""; }; @@ -1223,8 +1223,8 @@ 07BF0D890F2B736D002FCEA7 /* Plots */ = { isa = PBXGroup; children = ( - 93961BE51C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h */, - 93961BE81C71AD57002F5A58 /* CPTCatmullRomInterpolation.m */, + 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */, + 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */, C3F31DE81045EB470058520A /* CPTPlotGroup.h */, C3F31DE71045EB470058520A /* CPTPlotGroup.m */, 07BF0D7E0F2B72F6002FCEA7 /* CPTPlot.h */, @@ -1809,7 +1809,7 @@ 072161EB11D1F6BD009CC871 /* CPTAnnotationHostLayer.h in Headers */, C318F4AD11EA188700595FF9 /* CPTLimitBand.h in Headers */, C3CAFB261229E41F00F5C989 /* CPTMutableNumericData+TypeConversion.h in Headers */, - 93961BE61C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */, + 93961BE61C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */, C3CCA03D13E8D85900CE6DB1 /* _CPTConstraintsFixed.h in Headers */, C3CCA03F13E8D85900CE6DB1 /* _CPTConstraintsRelative.h in Headers */, 07B69A5D12B6215000F4C16C /* CPTTextStyle.h in Headers */, @@ -1844,7 +1844,7 @@ buildActionMask = 2147483647; files = ( C38A0AAF1A46241100D45436 /* CPTLimitBand.h in Headers */, - 93961BE71C71ACFD002F5A58 /* CPTCatmullRomInterpolation.h in Headers */, + 93961BE71C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */, C38A09EF1A461CD000D45436 /* CPTDefinitions.h in Headers */, C38A0AD51A46256B00D45436 /* CPTPlotSymbol.h in Headers */, C38A0AC61A46255C00D45436 /* CPTTradingRangePlot.h in Headers */, @@ -2222,7 +2222,7 @@ C3392A481225FB68008DA6BD /* CPTMutableNumericDataTests.m in Sources */, C3392A491225FB69008DA6BD /* CPTNumericDataTests.m in Sources */, C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */, - 93961BEA1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BEA1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C3CB561C122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C3D979A413D2136700145DFF /* CPTPlotSpaceTests.m in Sources */, C3D979A913D2328000145DFF /* CPTTimeFormatterTests.m in Sources */, @@ -2278,7 +2278,7 @@ 070622330FDF1B250066A6C4 /* CPTPathExtensions.m in Sources */, 0706223D0FDF215C0066A6C4 /* CPTBorderedLayer.m in Sources */, 07C4679C0FE1A24C00299939 /* CPTMutableTextStyle.m in Sources */, - 93961BE91C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BE91C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, 07C467B90FE1A96E00299939 /* CPTTextStylePlatformSpecific.m in Sources */, 0772C9280FE2F71600EC4C16 /* CPTTheme.m in Sources */, 0772C9300FE2F89000EC4C16 /* _CPTDarkGradientTheme.m in Sources */, @@ -2427,7 +2427,7 @@ C38A0A091A461D4D00D45436 /* CPTBorderedLayer.m in Sources */, C38A0A6B1A4620E200D45436 /* CPTLineStyle.m in Sources */, C38A0A241A461E9200D45436 /* _CPTAnimationCGSizePeriod.m in Sources */, - 93961BEB1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BEB1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A0ACA1A46256500D45436 /* CPTPieChart.m in Sources */, C38A0A671A4620E200D45436 /* CPTColorSpace.m in Sources */, C38A0A681A4620E200D45436 /* CPTGradient.m in Sources */, @@ -2459,7 +2459,7 @@ C38A09D31A461C1800D45436 /* CPTDataSourceTestCase.m in Sources */, C38A09E81A461CB600D45436 /* CPTNumericDataTests.m in Sources */, C38A0B141A46261F00D45436 /* CPTDerivedXYGraph.m in Sources */, - 93961BEC1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BEC1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A0ABD1A46250B00D45436 /* CPTXYPlotSpaceTests.m in Sources */, C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */, C38A0A011A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, @@ -2561,7 +2561,7 @@ C38A0A311A461EB600D45436 /* _CPTAnimationTimingFunctions.m in Sources */, C38A0A5B1A4620B800D45436 /* CPTImagePlatformSpecific.m in Sources */, C38A0A4C1A461F1B00D45436 /* CPTTextStyle.m in Sources */, - 93961BED1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BED1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A0B101A46261700D45436 /* _CPTSlateTheme.m in Sources */, C38A0AD31A46256600D45436 /* CPTScatterPlot.m in Sources */, C38A0A0D1A461D5800D45436 /* _CPTBorderLayer.m in Sources */, @@ -2593,7 +2593,7 @@ C38A0A911A46210A00D45436 /* CPTLineStyleTests.m in Sources */, C38A0A021A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, C38A0B171A46262000D45436 /* CPTDerivedXYGraph.m in Sources */, - 93961BEE1C71AD57002F5A58 /* CPTCatmullRomInterpolation.m in Sources */, + 93961BEE1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A09E71A461CB300D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C38A0A8E1A46210A00D45436 /* CPTFillTests.m in Sources */, C38A09E91A461CB700D45436 /* CPTNumericDataTests.m in Sources */, diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 44bd28fdc..983862742 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1,6 +1,5 @@ #import "CPTScatterPlot.h" -#import "CPTCatmullRomInterpolation.h" #import "CPTExceptions.h" #import "CPTFill.h" #import "CPTLegend.h" @@ -14,6 +13,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "_CPTCatmullRomInterpolation.h" #import #import @@ -1213,7 +1213,7 @@ -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRa [inputPoints addObject:[NSValue valueWithCGPoint:q]]; } - UIBezierPath *bezierPath = [CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; + UIBezierPath *bezierPath = [_CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; dataLinePath = CGPathCreateCopy(bezierPath.CGPath); if ( !isnan(baselineYValue) ) { diff --git a/framework/Source/CPTCatmullRomInterpolation.h b/framework/Source/_CPTCatmullRomInterpolation.h similarity index 74% rename from framework/Source/CPTCatmullRomInterpolation.h rename to framework/Source/_CPTCatmullRomInterpolation.h index f99745a26..d8a3e166f 100644 --- a/framework/Source/CPTCatmullRomInterpolation.h +++ b/framework/Source/_CPTCatmullRomInterpolation.h @@ -1,12 +1,10 @@ -#import - typedef NS_ENUM (NSInteger, CPTCatmullRomType) { CPTCatmullRomTypeUniform, CPTCatmullRomTypeChordal, CPTCatmullRomTypeCentripetal }; -@interface CPTCatmullRomInterpolation : NSObject +@interface _CPTCatmullRomInterpolation : NSObject +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity; diff --git a/framework/Source/CPTCatmullRomInterpolation.m b/framework/Source/_CPTCatmullRomInterpolation.m similarity index 98% rename from framework/Source/CPTCatmullRomInterpolation.m rename to framework/Source/_CPTCatmullRomInterpolation.m index 49ecf5396..edea7af23 100644 --- a/framework/Source/CPTCatmullRomInterpolation.m +++ b/framework/Source/_CPTCatmullRomInterpolation.m @@ -1,6 +1,6 @@ -#import "CPTCatmullRomInterpolation.h" +#import "_CPTCatmullRomInterpolation.h" -@implementation CPTCatmullRomInterpolation +@implementation _CPTCatmullRomInterpolation +(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity { From b6ad7edf9f5d0c0891d319bd2ac9cb0d098c642f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 27 Feb 2016 14:00:17 -0500 Subject: [PATCH 157/429] Added CPTValueArray and CPTMutableValueArray typedefs. --- framework/Source/CPTDefinitions.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 6ca6a5350..e4407a2bb 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -234,6 +234,16 @@ typedef NSArray *CPTStringArray; **/ typedef NSMutableArray *CPTMutableStringArray; +/** + * @brief An array of values. + **/ +typedef NSArray CPTValueArray; + +/** + * @brief A mutable array of values. + **/ +typedef NSMutableArray CPTMutableValueArray; + /** * @brief An array of strings. **/ From 6100eb56cbda6309bd512b8da8c1992ff3772253 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 27 Feb 2016 14:01:19 -0500 Subject: [PATCH 158/429] Removed iOS-only import from CPTScatterPlot. --- framework/Source/CPTScatterPlot.m | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 983862742..8056e66fa 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -14,7 +14,6 @@ #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" #import "_CPTCatmullRomInterpolation.h" -#import #import /** @defgroup plotAnimationScatterPlot Scatter Plot From e1689ac651c0de0598ff8c75149f4e80ff5b45bd Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 27 Feb 2016 14:12:40 -0500 Subject: [PATCH 159/429] Changed the Catmull-Rom interpolation method to produce a CGMutablePathRef instead of UIBezierPath for cross-platform compatibility. --- framework/Source/CPTScatterPlot.m | 20 +- .../Source/_CPTCatmullRomInterpolation.h | 2 +- .../Source/_CPTCatmullRomInterpolation.m | 179 ++++++++++-------- 3 files changed, 112 insertions(+), 89 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 8056e66fa..39e32f639 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1200,20 +1200,10 @@ -(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints: -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue { - CGMutablePathRef dataLinePath = CGPathCreateMutable(); - NSUInteger pointsSize = indexRange.length; + NSUInteger pointsSize = indexRange.length; if ( pointsSize >= 2 ) { - NSMutableArray *inputPoints = [NSMutableArray array]; - - for ( int i = (int)indexRange.location; i < (int)(indexRange.location + pointsSize); i++ ) { - CGPoint p = viewPoints[i]; - CGPoint q = CGPointMake(p.x, p.y); - [inputPoints addObject:[NSValue valueWithCGPoint:q]]; - } - - UIBezierPath *bezierPath = [_CPTCatmullRomInterpolation bezierPathFromPoints:inputPoints withGranularity:20]; - dataLinePath = CGPathCreateCopy(bezierPath.CGPath); + CGMutablePathRef dataLinePath = [_CPTCatmullRomInterpolation newPathForViewPoints:viewPoints indexRange:indexRange withGranularity:20]; if ( !isnan(baselineYValue) ) { CGPoint firstPoint = viewPoints[0]; @@ -1222,8 +1212,12 @@ -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRa CGPathAddLineToPoint(dataLinePath, NULL, firstPoint.x, baselineYValue); CGPathCloseSubpath(dataLinePath); } + + return dataLinePath; + } + else { + return CGPathCreateMutable(); } - return dataLinePath; } -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context diff --git a/framework/Source/_CPTCatmullRomInterpolation.h b/framework/Source/_CPTCatmullRomInterpolation.h index d8a3e166f..9a5b84d0f 100644 --- a/framework/Source/_CPTCatmullRomInterpolation.h +++ b/framework/Source/_CPTCatmullRomInterpolation.h @@ -6,6 +6,6 @@ typedef NS_ENUM (NSInteger, CPTCatmullRomType) { @interface _CPTCatmullRomInterpolation : NSObject -+(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity; ++(nonnull CGMutablePathRef)newPathForViewPoints:(nonnull const CGPoint *)viewPoints indexRange:(NSRange)indexRange withGranularity:(NSUInteger)granularity CF_RETURNS_RETAINED; @end diff --git a/framework/Source/_CPTCatmullRomInterpolation.m b/framework/Source/_CPTCatmullRomInterpolation.m index edea7af23..561bb3beb 100644 --- a/framework/Source/_CPTCatmullRomInterpolation.m +++ b/framework/Source/_CPTCatmullRomInterpolation.m @@ -1,108 +1,126 @@ #import "_CPTCatmullRomInterpolation.h" -@implementation _CPTCatmullRomInterpolation +#import "CPTDefinitions.h" +#import "tgmath.h" -+(UIBezierPath *)bezierPathFromPoints:(NSArray *)points withGranularity:(NSInteger)granularity -{ - UIBezierPath __block *path = [[UIBezierPath alloc] init]; +@interface _CPTCatmullRomInterpolation() - NSMutableArray *curve = [self interpolate:points withPointsPerSegment:granularity andType:CPTCatmullRomTypeCentripetal]; ++(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath; - CGPoint __block p0 = [curve[0] CGPointValue]; +CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull const time, CGFloat t); - [path moveToPoint:p0]; +@end - // use this loop to draw lines between all points - for ( NSUInteger idx = 1; (idx < [curve count]); idx += 1 ) { - CGPoint c1 = [curve[idx] CGPointValue]; +#pragma mark - - [path addLineToPoint:c1]; - } - - return path; -} +@implementation _CPTCatmullRomInterpolation // From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections -+(NSMutableArray *)interpolate:(NSArray *)coordinates withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType ++(CGMutablePathRef)newPathForViewPoints:(const CGPoint *)viewPoints indexRange:(NSRange)indexRange withGranularity:(NSUInteger)granularity { - NSMutableArray *vertices = [[NSMutableArray alloc] initWithArray:coordinates copyItems:YES]; + CGMutablePathRef dataLinePath = CGPathCreateMutable(); - if ( pointsPerSegment < 3 ) { - return vertices; - } + if ( indexRange.length > 2 ) { + if ( granularity < 3 ) { + CGPoint viewPoint = viewPoints[indexRange.location]; + CGPathMoveToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); + + for ( NSUInteger i = indexRange.location + 1; i < NSMaxRange(indexRange); i++ ) { + viewPoint = viewPoints[i]; + CGPathAddLineToPoint(dataLinePath, NULL, viewPoint.x, viewPoint.y); + } + } + else { + CPTMutableValueArray *vertices = [[NSMutableArray alloc] init]; + + NSUInteger rangeEnd = NSMaxRange(indexRange); + + for ( NSUInteger i = indexRange.location; i < rangeEnd; i++ ) { + NSValue *pointValue = [[NSValue alloc] initWithBytes:&viewPoints[i] objCType:@encode(CGPoint)]; + [vertices addObject:pointValue]; + } - // start point - CGPoint pt1 = [vertices[0] CGPointValue]; - CGPoint pt2 = [vertices[1] CGPointValue]; + // start point + CGPoint pt1 = viewPoints[indexRange.location + 0]; + CGPoint pt2 = viewPoints[indexRange.location + 1]; - double dx = pt2.x - pt1.x; - double dy = pt2.y - pt1.y; + CGFloat dx = pt2.x - pt1.x; + CGFloat dy = pt2.y - pt1.y; - double x1 = pt1.x - dx; - double y1 = pt1.y - dy; + CGFloat x1 = pt1.x - dx; + CGFloat y1 = pt1.y - dy; - CGPoint start = CGPointMake(x1 * .5, y1); + CGPoint start = CGPointMake(x1, y1); - // end point - pt2 = [vertices[vertices.count - 1] CGPointValue]; - pt1 = [vertices[vertices.count - 2] CGPointValue]; + // end point + pt2 = viewPoints[rangeEnd - 1]; + pt1 = viewPoints[rangeEnd - 2]; - dx = pt2.x - pt1.x; - dy = pt2.y - pt1.y; + dx = pt2.x - pt1.x; + dy = pt2.y - pt1.y; - x1 = pt2.x + dx; - y1 = pt2.y + dy; + x1 = pt2.x + dx; + y1 = pt2.y + dy; - CGPoint end = CGPointMake(x1, y1); + CGPoint end = CGPointMake(x1, y1); - [vertices insertObject:[NSValue valueWithCGPoint:start] atIndex:0]; - [vertices addObject:[NSValue valueWithCGPoint:end]]; + NSValue *startPointValue = [[NSValue alloc] initWithBytes:&start objCType:@encode(CGPoint)]; + [vertices insertObject:startPointValue atIndex:0]; - NSMutableArray *result = [NSMutableArray array]; + NSValue *endPointValue = [[NSValue alloc] initWithBytes:&end objCType:@encode(CGPoint)]; + [vertices addObject:endPointValue]; - for ( int i = 0; i < (int)(vertices.count - 3); i++ ) { - NSMutableArray *points = [self interpolate:vertices forIndex:i withPointsPerSegment:pointsPerSegment andType:curveType]; - [result addObjectsFromArray:points]; + for ( NSUInteger i = 0; i < (vertices.count - 3); i++ ) { + [self interpolate:vertices forIndex:i withPointsPerSegment:granularity andType:CPTCatmullRomTypeCentripetal intoPath:dataLinePath]; + } + } } + else if ( indexRange.length == 2 ) { + // only two data points; just drawn a line between them + CGPoint start = viewPoints[indexRange.location]; + CGPoint end = viewPoints[NSMaxRange(indexRange) - 1]; - return result; + CGPathMoveToPoint(dataLinePath, NULL, start.x, start.y); + CGPathAddLineToPoint(dataLinePath, NULL, end.x, end.y); + } + + return dataLinePath; } -+(double)interpolate:(double *)p time:(double *)time t:(double)t +CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull const time, CGFloat t) { - double L01 = p[0] * (time[1] - t) / (time[1] - time[0]) + p[1] * (t - time[0]) / (time[1] - time[0]); - double L12 = p[1] * (time[2] - t) / (time[2] - time[1]) + p[2] * (t - time[1]) / (time[2] - time[1]); - double L23 = p[2] * (time[3] - t) / (time[3] - time[2]) + p[3] * (t - time[2]) / (time[3] - time[2]); - double L012 = L01 * (time[2] - t) / (time[2] - time[0]) + L12 * (t - time[0]) / (time[2] - time[0]); - double L123 = L12 * (time[3] - t) / (time[3] - time[1]) + L23 * (t - time[1]) / (time[3] - time[1]); - double C12 = L012 * (time[2] - t) / (time[2] - time[1]) + L123 * (t - time[1]) / (time[2] - time[1]); + CGFloat L01 = p[0] * (time[1] - t) / (time[1] - time[0]) + p[1] * (t - time[0]) / (time[1] - time[0]); + CGFloat L12 = p[1] * (time[2] - t) / (time[2] - time[1]) + p[2] * (t - time[1]) / (time[2] - time[1]); + CGFloat L23 = p[2] * (time[3] - t) / (time[3] - time[2]) + p[3] * (t - time[2]) / (time[3] - time[2]); + CGFloat L012 = L01 * (time[2] - t) / (time[2] - time[0]) + L12 * (t - time[0]) / (time[2] - time[0]); + CGFloat L123 = L12 * (time[3] - t) / (time[3] - time[1]) + L23 * (t - time[1]) / (time[3] - time[1]); + CGFloat C12 = L012 * (time[2] - t) / (time[2] - time[1]) + L123 * (t - time[1]) / (time[2] - time[1]); return C12; } -+(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withPointsPerSegment:(NSInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType ++(void)interpolate:(CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath { - NSMutableArray *result = [NSMutableArray array]; + CGFloat x[4]; + CGFloat y[4]; + CGFloat time[4]; + + for ( NSUInteger i = 0; i < 4; i++ ) { + CGPoint point; + [points[index + i] getValue:&point]; - double x[4]; - double y[4]; - double time[4]; + x[i] = point.x; + y[i] = point.y; - for ( int i = 0; i < 4; i++ ) { - x[i] = [points[(NSUInteger)(index + i)] CGPointValue].x; - y[i] = [points[(NSUInteger)(index + i)] CGPointValue].y; time[i] = i; } - double tstart = 1; - double tend = 2; - if ( curveType != CPTCatmullRomTypeUniform ) { - double total = 0; + CGFloat total = 0.0; - for ( int i = 1; i < 4; i++ ) { - double dx = x[i] - x[i - 1]; - double dy = y[i] - y[i - 1]; + for ( NSUInteger i = 1; i < 4; i++ ) { + CGFloat dx = x[i] - x[i - 1]; + CGFloat dy = y[i] - y[i - 1]; if ( curveType == CPTCatmullRomTypeCentripetal ) { total += pow(dx * dx + dy * dy, 0.25); @@ -112,22 +130,33 @@ +(NSMutableArray *)interpolate:(NSArray *)points forIndex:(NSInteger)index withP } time[i] = total; } - tstart = time[1]; - tend = time[2]; } - long segments = pointsPerSegment - 1; + CGFloat tstart = time[1]; + CGFloat tend = time[2]; - [result addObject:points[(NSUInteger)(index + 1)]]; + NSUInteger segments = pointsPerSegment - 1; - for ( int i = 1; i < segments; i++ ) { - double xi = [self interpolate:x time:time t:tstart + ( i * (tend - tstart) ) / segments]; - double yi = [self interpolate:y time:time t:tstart + ( i * (tend - tstart) ) / segments]; - [result addObject:[NSValue valueWithCGPoint:CGPointMake(xi, yi)]]; + if ( index == 0 ) { + CGPoint point1; + [points[index + 1] getValue:&point1]; + + CGPathMoveToPoint(dataLinePath, NULL, point1.x, point1.y); + } + + for ( NSUInteger i = 1; i < segments; i++ ) { + CGFloat t = tstart + ( i * (tend - tstart) ) / segments; + + CGFloat xi = interpolate(x, time, t); + CGFloat yi = interpolate(y, time, t); + + CGPathAddLineToPoint(dataLinePath, NULL, xi, yi); } - [result addObject:points[(NSUInteger)(index + 2)]]; - return result; + CGPoint point2; + [points[index + 2] getValue:&point2]; + + CGPathAddLineToPoint(dataLinePath, NULL, point2.x, point2.y); } @end From 5a4ee8bd0ee42e83be060ebcf7a02b67f68c8084 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 27 Feb 2016 20:50:45 -0500 Subject: [PATCH 160/429] Updated the change log to include a note about an option to use the Catmull-Rom algorithm to draw curved scatter plot lines. --- documentation/changelog.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 686d1ecdc..9bb4ec802 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -11,6 +11,7 @@ To be determined. - **New**: Added support for animating `NSNumber` properties with `CPTAnimation`. - **New**: Added support for `NSSecureCoding`. - **New**: Added an option to draw legend swatches to the left or right side of the title. +- **New**: Added an option to use the Catmull-Rom algorithm to draw curved scatter plot lines. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. From ac50a0bb2aeaa5df843205440c5ef0416cb27bb3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 27 Feb 2016 21:20:36 -0500 Subject: [PATCH 161/429] Added documentation comments to the _CPTCatmullRomInterpolation class. --- .../Source/_CPTCatmullRomInterpolation.h | 12 +++++-- .../Source/_CPTCatmullRomInterpolation.m | 31 ++++++++++++++++++- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/framework/Source/_CPTCatmullRomInterpolation.h b/framework/Source/_CPTCatmullRomInterpolation.h index 9a5b84d0f..d534b643c 100644 --- a/framework/Source/_CPTCatmullRomInterpolation.h +++ b/framework/Source/_CPTCatmullRomInterpolation.h @@ -1,7 +1,13 @@ +/// @file + +/** + * @brief The type of knot parameterization to use for Catmull-Rom curve generation. + * @see See the [Wikipedia article](https://en.wikipedia.org/wiki/Centripetal_Catmull–Rom_spline) on Catmull-Rom splines for details. + **/ typedef NS_ENUM (NSInteger, CPTCatmullRomType) { - CPTCatmullRomTypeUniform, - CPTCatmullRomTypeChordal, - CPTCatmullRomTypeCentripetal + CPTCatmullRomTypeUniform, ///< Uniform parameterization. + CPTCatmullRomTypeChordal, ///< Chordal parameterization. + CPTCatmullRomTypeCentripetal ///< Centripetal parameterization. }; @interface _CPTCatmullRomInterpolation : NSObject diff --git a/framework/Source/_CPTCatmullRomInterpolation.m b/framework/Source/_CPTCatmullRomInterpolation.m index 561bb3beb..f54397a6e 100644 --- a/framework/Source/_CPTCatmullRomInterpolation.m +++ b/framework/Source/_CPTCatmullRomInterpolation.m @@ -3,6 +3,7 @@ #import "CPTDefinitions.h" #import "tgmath.h" +/// @cond @interface _CPTCatmullRomInterpolation() +(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath; @@ -11,13 +12,26 @@ +(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index wi @end +/// @endcond + #pragma mark - +/** @internal + * @brief Creates Catmull-Rom spline path for drawing curved scatter plot lines. + * @see See the [Wikipedia article](https://en.wikipedia.org/wiki/Centripetal_Catmull–Rom_spline) on Catmull-Rom splines for details. + **/ @implementation _CPTCatmullRomInterpolation -// From this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections +/** @internal + * @brief Creates a Catmull-Rom spline path through the given view points in the given index range. + * @param viewPoints A c-style array of CGPoint structures representing view points. + * @param indexRange The range of indices into the @par{viewPoints} array to use when creating the spline path. + * @param granularity The number of smoothed points to interpolate between each view point. + * @return A Catmull-Rom spline path through the given view points in the given index range. + **/ +(CGMutablePathRef)newPathForViewPoints:(const CGPoint *)viewPoints indexRange:(NSRange)indexRange withGranularity:(NSUInteger)granularity { + // Based on code from this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections CGMutablePathRef dataLinePath = CGPathCreateMutable(); if ( indexRange.length > 2 ) { @@ -87,6 +101,13 @@ +(CGMutablePathRef)newPathForViewPoints:(const CGPoint *)viewPoints indexRange:( return dataLinePath; } +/** @internal + * @brief Computes the interpolated spline value at the given control point. + * @param p A four (4) element array of data values. + * @param time A four (4) element array of knot positions. + * @param t The control parameter. + * @return The interpolated value. + **/ CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull const time, CGFloat t) { CGFloat L01 = p[0] * (time[1] - t) / (time[1] - time[0]) + p[1] * (t - time[0]) / (time[1] - time[0]); @@ -99,6 +120,14 @@ CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull c return C12; } +/** @internal + * @brief + * @param points A c-style array of CGPoint structures representing view points. + * @param index The starting index of the group of control points. + * @param pointsPerSegment The number of smoothed points to interpolate between each view point. + * @param curveType The type of knot parameterization. + * @param dataLinePath The path to receive the spline segments. + **/ +(void)interpolate:(CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath { CGFloat x[4]; From 20f85561107b2f3f1ceb8ebe1183aa846c0a3c80 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 28 Feb 2016 15:23:24 -0500 Subject: [PATCH 162/429] Added a property to control the smoothness of curved scatterplot lines using the Catmull-Rom algorithm. --- framework/Source/CPTScatterPlot.h | 1 + framework/Source/CPTScatterPlot.m | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index ce70738fd..e6e4a1b83 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -248,6 +248,7 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { @property (nonatomic, readwrite, copy, nullable) CPTPlotSymbol *plotSymbol; @property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill; @property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill2; +@property (nonatomic, readwrite) NSUInteger curvedLineGranularity; /// @} /// @name Data Line diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index f02380c4b..75b6e65e6 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -107,6 +107,11 @@ @implementation CPTScatterPlot **/ @synthesize areaFill2; +/** @property NSUInteger curvedLineGranularity + * @brief The number of smoothed points to interpolate between each view point when drawing a curved line with @ref interpolation of #CPTScatterPlotInterpolationCatmullRom. + **/ +@synthesize curvedLineGranularity; + /** @property NSNumber *areaBaseValue * @brief The Y coordinate of the straight boundary of the area fill. * If not a number, the area is not filled. @@ -205,6 +210,7 @@ +(void)initialize * - @ref plotSymbol = @nil * - @ref areaFill = @nil * - @ref areaFill2 = @nil + * - @ref curvedLineGranularity = @num{20} * - @ref areaBaseValue = @NAN * - @ref areaBaseValue2 = @NAN * - @ref plotSymbolMarginForHitDetection = @num{0.0} @@ -224,6 +230,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame plotSymbol = nil; areaFill = nil; areaFill2 = nil; + curvedLineGranularity = 20; areaBaseValue = @(NAN); areaBaseValue2 = @(NAN); plotSymbolMarginForHitDetection = CPTFloat(0.0); @@ -251,6 +258,7 @@ -(instancetype)initWithLayer:(id)layer plotSymbol = theLayer->plotSymbol; areaFill = theLayer->areaFill; areaFill2 = theLayer->areaFill2; + curvedLineGranularity = theLayer->curvedLineGranularity; areaBaseValue = theLayer->areaBaseValue; areaBaseValue2 = theLayer->areaBaseValue2; plotSymbolMarginForHitDetection = theLayer->plotSymbolMarginForHitDetection; @@ -282,6 +290,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.plotSymbol forKey:@"CPTScatterPlot.plotSymbol"]; [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; [coder encodeObject:self.areaFill2 forKey:@"CPTScatterPlot.areaFill2"]; + [coder encodeInteger:(NSInteger)self.curvedLineGranularity forKey:@"CPTScatterPlot.curvedLineGranularity"]; [coder encodeObject:self.mutableAreaFillBands forKey:@"CPTScatterPlot.mutableAreaFillBands"]; [coder encodeObject:self.areaBaseValue forKey:@"CPTScatterPlot.areaBaseValue"]; [coder encodeObject:self.areaBaseValue2 forKey:@"CPTScatterPlot.areaBaseValue2"]; @@ -307,8 +316,9 @@ -(instancetype)initWithCoder:(NSCoder *)coder forKey:@"CPTScatterPlot.areaFill"] copy]; areaFill2 = [[coder decodeObjectOfClass:[CPTFill class] forKey:@"CPTScatterPlot.areaFill2"] copy]; - mutableAreaFillBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] - forKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; + curvedLineGranularity = (NSUInteger)[coder decodeIntegerForKey:@"CPTScatterPlot.curvedLineGranularity"]; + mutableAreaFillBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] + forKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; areaBaseValue = [coder decodeObjectOfClass:[NSNumber class] forKey:@"CPTScatterPlot.areaBaseValue"]; areaBaseValue2 = [coder decodeObjectOfClass:[NSNumber class] @@ -1222,7 +1232,7 @@ -(CGPathRef)newCatmullRomDataLinePathForViewPoints:(CGPoint *)viewPoints indexRa NSUInteger pointsSize = indexRange.length; if ( pointsSize >= 2 ) { - CGMutablePathRef dataLinePath = [_CPTCatmullRomInterpolation newPathForViewPoints:viewPoints indexRange:indexRange withGranularity:20]; + CGMutablePathRef dataLinePath = [_CPTCatmullRomInterpolation newPathForViewPoints:viewPoints indexRange:indexRange withGranularity:self.curvedLineGranularity]; if ( !isnan(baselineYValue) ) { CGPoint firstPoint = viewPoints[0]; From d3d399f05b74a72fa3a5da862b32bfc58f9d2f81 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 6 Mar 2016 15:35:07 -0500 Subject: [PATCH 163/429] Fixed invalid complex NAN values in CPTNumericData. --- .../Source/CPTNumericData+TypeConversions_Generation.py | 6 +++--- framework/Source/CPTNumericData.m | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/Source/CPTNumericData+TypeConversions_Generation.py b/framework/Source/CPTNumericData+TypeConversions_Generation.py index 1f340c706..1bad205f8 100644 --- a/framework/Source/CPTNumericData+TypeConversions_Generation.py +++ b/framework/Source/CPTNumericData+TypeConversions_Generation.py @@ -46,9 +46,9 @@ "uint32_t" : "0", "uint64_t" : "0", "float" : "NAN", - "double" : "NAN", - "float complex" : "NAN", - "double complex" : "NAN", + "double" : "(double)NAN", + "float complex" : "CMPLXF(NAN, NAN)", + "double complex" : "CMPLX(NAN, NAN)", "NSDecimal" : "CPTDecimalNaN()" } diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 13fee3c4f..89fa45e77 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -1021,7 +1021,7 @@ case sizeof(double): *toBytes++ = (double)[sample doubleValue]; } else { - *toBytes++ = NAN; + *toBytes++ = (double)NAN; } } } @@ -1039,7 +1039,7 @@ case sizeof(float complex): *toBytes++ = (float complex)[sample floatValue]; } else { - *toBytes++ = NAN; + *toBytes++ = CMPLXF(NAN, NAN); } } } @@ -1053,7 +1053,7 @@ case sizeof(double complex): *toBytes++ = (double complex)[sample doubleValue]; } else { - *toBytes++ = NAN; + *toBytes++ = CMPLX(NAN, NAN); } } } From 1fad9285d5fb03187a209c4667e0a1aa47bb4cae Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 6 Mar 2016 15:36:57 -0500 Subject: [PATCH 164/429] Removed ++ operator, deprecated in preparation for Swift 3. --- examples/CPTTestApp-iPhone/Classes/BarChartController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 54c61d31b..87c0984d9 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -87,7 +87,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { var labelLocation = 0 var customLabels = Set() for tickLocation in customTickLocations { - let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation++], textStyle:x.labelTextStyle) + let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation], textStyle:x.labelTextStyle) + labelLocation += 1 newLabel.tickLocation = tickLocation newLabel.offset = x.labelOffset + x.majorTickLength newLabel.rotation = CGFloat(M_PI_4) From 4eb6e97008b1fa0a9b4f0de345f16ac7937995ea Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 6 Mar 2016 19:22:47 -0500 Subject: [PATCH 165/429] Fixed floating point precision conversion warnings (new with Xcode 7.3 beta 5). Fixed issue 266. --- QCPlugin/CPTBarPlotPlugin.m | 2 +- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 2 +- examples/CPTTestApp/Source/Controller.m | 2 +- .../CorePlotGallery/src/plots/ControlChart.m | 8 ++--- .../CorePlotGallery/src/plots/DonutChart.m | 4 +-- .../src/plots/SimplePieChart.m | 8 ++--- .../src/plots/VerticalBarChart.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.m | 2 +- examples/DropPlot/CPTPlotDocument.m | 30 +++++++++---------- framework/CorePlot.xcodeproj/project.pbxproj | 10 +++---- framework/Source/CPTAnimation.m | 4 +-- framework/Source/CPTAnimationPeriod.m | 2 +- framework/Source/CPTAxis.m | 2 +- framework/Source/CPTAxisTitle.m | 2 +- framework/Source/CPTBarPlot.m | 12 ++++---- framework/Source/CPTConstraints.m | 3 +- framework/Source/CPTDefinitions.h | 7 +++++ framework/Source/CPTGradient.m | 12 ++++---- framework/Source/CPTImage.m | 4 +-- framework/Source/CPTLayer.m | 10 +++---- framework/Source/CPTLegend.m | 2 +- framework/Source/CPTLegendEntry.m | 2 +- framework/Source/CPTPieChart.m | 22 +++++++------- framework/Source/CPTPlot.m | 10 +++---- framework/Source/CPTPlotArea.m | 6 ++-- framework/Source/CPTPlotSymbol.m | 4 +-- framework/Source/CPTRangePlot.m | 21 ++++++------- framework/Source/CPTScatterPlot.m | 10 +++---- framework/Source/CPTShadow.m | 2 +- framework/Source/CPTTradingRangePlot.m | 3 +- framework/Source/CPTUtilities.m | 10 +++---- framework/Source/CPTXYAxis.m | 8 ++--- framework/Source/CPTXYPlotSpace.m | 20 ++++++------- .../Source/_CPTAnimationTimingFunctions.m | 2 +- .../iPhoneOnly/CPTImagePlatformSpecific.m | 2 +- 35 files changed, 131 insertions(+), 121 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 1153dc6e8..5b4727635 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -217,7 +217,7 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd for ( NSUInteger i = 0; i < keyCount; i++ ) { xpos = (float)i + (float)plotIndex / (plotCount); - [array addObject:[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", xpos]]]; + [array addObject:[NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f", (double)xpos]]]; } } else { diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index a41fbd14c..c9104df7c 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -79,7 +79,7 @@ 2899E5210DE3E06400AC0155 /* CPTTestApp_iPadViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CPTTestApp_iPadViewController.xib; sourceTree = ""; }; 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 28D7ACF60DDB3853001CB0EB /* CPTTestApp_iPadViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTTestApp_iPadViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 28D7ACF70DDB3853001CB0EB /* CPTTestApp_iPadViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTTestApp_iPadViewController.m; sourceTree = ""; }; + 28D7ACF70DDB3853001CB0EB /* CPTTestApp_iPadViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTTestApp_iPadViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* CPTTestApp_iPad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTestApp_iPad_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* CPTTestApp_iPad-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CPTTestApp_iPad-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index f6b4c1d2e..9b889ad41 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -460,7 +460,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS // Setup a style for the annotation CPTMutableTextStyle *hitAnnotationTextStyle = [CPTMutableTextStyle textStyle]; hitAnnotationTextStyle.color = [CPTColor whiteColor]; - hitAnnotationTextStyle.fontSize = 16.0f; + hitAnnotationTextStyle.fontSize = CPTFloat(16.0); hitAnnotationTextStyle.fontName = @"Helvetica-Bold"; // Determine point of symbol in plot coordinates diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index c98248e49..9aa8c040e 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -228,7 +228,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot -(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { - double number = NAN; + double number = (double)NAN; switch ( fieldEnum ) { case CPTScatterPlotFieldX: @@ -246,7 +246,7 @@ -(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:( break; case 2: - number = NAN; + number = (double)NAN; break; } } @@ -268,7 +268,7 @@ -(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:( break; case 2: - number = NAN; + number = (double)NAN; break; case 3: @@ -285,7 +285,7 @@ -(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:( break; case 2: - number = NAN; + number = (double)NAN; break; case 3: diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index b5361d372..1fef65249 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -92,7 +92,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP // Add another pie chart piePlot = [[CPTPieChart alloc] init]; piePlot.dataSource = self; - piePlot.pieRadius = CPTFloat( animated ? 0.0 : (innerRadius - 5.0) ); + piePlot.pieRadius = ( animated ? CPTFloat(0.0) : ( innerRadius - CPTFloat(5.0) ) ); piePlot.identifier = innerChartName; piePlot.borderLineStyle = whiteLineStyle; piePlot.startAngle = CPTFloat(M_PI_4); @@ -154,7 +154,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", [self.plotData[index] floatValue]] style:whiteText]; + newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", [self.plotData[index] doubleValue]] style:whiteText]; newLayer.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; newLayer.cornerRadius = 5.0; newLayer.paddingLeft = 3.0; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 3a352d0e4..1a95fc643 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -116,7 +116,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", [self.plotData[index] floatValue]] + CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", [self.plotData[index] doubleValue]] style:whiteText]; return newLayer; } @@ -131,7 +131,7 @@ -(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { - NSLog(@"Slice was selected at index %d. Value = %f", (int)index, [self.plotData[index] floatValue]); + NSLog(@"Slice was selected at index %d. Value = %f", (int)index, [self.plotData[index] doubleValue]); self.offsetIndex = NSNotFound; @@ -156,7 +156,7 @@ -(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelected [CPTAnimation animate:self property:@"sliceOffset" - from:(idx == self.offsetIndex ? NAN : 0.0) + from:(idx == self.offsetIndex ? CPTNAN : 0.0) to:(idx == self.offsetIndex ? 0.0 : 35.0) duration:0.5 animationCurve:CPTAnimationCurveCubicOut @@ -224,7 +224,7 @@ -(void)setSliceOffset:(CGFloat)newOffset [self.graphs[0] reloadData]; - if ( newOffset == 0.0 ) { + if ( newOffset == CPTFloat(0.0) ) { self.offsetIndex = NSNotFound; } } diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index 114fd2b40..759a078b9 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -243,7 +243,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSNumber *value = [self numberForPlot:plot field:CPTBarPlotFieldBarTip recordIndex:index]; - NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, [value floatValue]); + NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, [value doubleValue]); CPTGraph *graph = (self.graphs)[0]; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index c58b2580c..efaa9b3a1 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -148,7 +148,7 @@ -(void)setPaddingDefaultsForGraph:(CPTGraph *)graph graph.paddingLeft = boundsPadding; - if ( graph.titleDisplacement.y > 0.0 ) { + if ( graph.titleDisplacement.y > CPTFloat(0.0) ) { graph.paddingTop = graph.titleTextStyle.fontSize * CPTFloat(2.0); } else { diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 243cfc64e..f78f76829 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -145,11 +145,11 @@ -(NSData *)dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)out -(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { if ( [typeName isEqualToString:@"CSVDocument"] ) { - double minX = MAXFLOAT; - double maxX = -MAXFLOAT; + double minX = (double)INFINITY; + double maxX = -(double)INFINITY; - double minY = MAXFLOAT; - double maxY = -MAXFLOAT; + double minY = (double)INFINITY; + double maxY = -(double)INFINITY; NSMutableArray *newData = [[NSMutableArray alloc] init]; @@ -263,11 +263,11 @@ -(IBAction)zoomIn -(IBAction)zoomOut { - double minX = MAXFLOAT; - double maxX = -MAXFLOAT; + double minX = (double)INFINITY; + double maxX = -(double)INFINITY; - double minY = MAXFLOAT; - double maxY = -MAXFLOAT; + double minY = (double)INFINITY; + double maxY = -(double)INFINITY; // get the ful range min and max values for ( NSDictionary *xyValues in self.dataPoints ) { @@ -361,7 +361,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(id)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; @@ -388,7 +388,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(i return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( !self.zoomAnnotation ) { self.dragStart = interactionPoint; @@ -429,14 +429,14 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)e return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; if ( annotation ) { self.dragEnd = interactionPoint; -// double-click to completely zoom out + // double-click to completely zoom out if ( [event clickCount] == 2 ) { CPTPlotArea *plotArea = self.graph.plotAreaFrame.plotArea; CGPoint dragEndInPlotArea = [self.graph convertPoint:interactionPoint toLayer:plotArea]; @@ -446,11 +446,11 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)eve } } else if ( !CGPointEqualToPoint(self.dragStart, self.dragEnd) ) { -// no accidental drag, so zoom in + // no accidental drag, so zoom in [self zoomIn]; } -// and we're done with the drag + // and we're done with the drag [self.graph.plotAreaFrame.plotArea removeAnnotation:annotation]; self.zoomAnnotation = nil; @@ -461,7 +461,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)eve return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(id)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 7000f014e..5e8c23366 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -680,7 +680,7 @@ 07321BBF0F37370D00F423D8 /* CPTExceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTExceptions.h; sourceTree = ""; }; 07321BC00F37370D00F423D8 /* CPTExceptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTExceptions.m; sourceTree = ""; }; 07321BC40F37382D00F423D8 /* CPTUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTUtilities.h; sourceTree = ""; }; - 07321BC50F37382D00F423D8 /* CPTUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTUtilities.m; sourceTree = ""; }; + 07321BC50F37382D00F423D8 /* CPTUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTUtilities.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 073FB02E0FC991A3007A728E /* CPTAxisLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAxisLabel.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 073FB02F0FC991A3007A728E /* CPTAxisLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisLabel.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0772B43710E24D5C009CD04C /* CPTTradingRangePlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTTradingRangePlot.h; sourceTree = ""; }; @@ -732,7 +732,7 @@ 07BF0D830F2B7340002FCEA7 /* CPTAxisSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAxisSet.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 07BF0D950F2B73CA002FCEA7 /* CPTScatterPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTScatterPlot.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0D960F2B73CA002FCEA7 /* CPTScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTDefinitions.h; sourceTree = ""; }; + 07BF0DF10F2B7BFB002FCEA7 /* CPTDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTDefinitions.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 07BF0DF20F2B7BFB002FCEA7 /* CPTDefinitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTDefinitions.m; sourceTree = ""; }; 07C467990FE1A24C00299939 /* CPTMutableTextStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTMutableTextStyle.h; sourceTree = ""; }; 07C4679A0FE1A24C00299939 /* CPTMutableTextStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTMutableTextStyle.m; sourceTree = ""; }; @@ -757,7 +757,7 @@ 4C422A620FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTXYPlotSpaceTests.h; sourceTree = ""; }; 4C422A630FB1FCD5000CAA43 /* CPTXYPlotSpaceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTXYPlotSpaceTests.m; sourceTree = ""; }; 4C97EEF7104D80C400B554F9 /* CPTNumericData+TypeConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CPTNumericData+TypeConversion.h"; sourceTree = ""; }; - 4C97EEF9104D80C400B554F9 /* CPTNumericData+TypeConversions_Generation.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = "CPTNumericData+TypeConversions_Generation.py"; sourceTree = ""; }; + 4C97EEF9104D80C400B554F9 /* CPTNumericData+TypeConversions_Generation.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; lineEnding = 0; path = "CPTNumericData+TypeConversions_Generation.py"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.python; }; 4C97EEFA104D80C400B554F9 /* CPTNumericData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTNumericData.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 4C97EEFB104D80C400B554F9 /* CPTNumericData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTNumericData.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 4C97EEFC104D80C400B554F9 /* CPTNumericDataType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTNumericDataType.h; sourceTree = ""; }; @@ -783,7 +783,7 @@ 4CD7E9630F4B625900F9BCBB /* CPTUtilitiesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CPTUtilitiesTests.m; sourceTree = ""; }; 8DC2EF5A0486A6940098B216 /* CorePlot-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "CorePlot-Info.plist"; sourceTree = ""; }; 8DC2EF5B0486A6940098B216 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9021E5690FC69B2900443472 /* doxygen.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = doxygen.config; path = ../documentation/doxygen/doxygen.config; sourceTree = SOURCE_ROOT; }; + 9021E5690FC69B2900443472 /* doxygen.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; lineEnding = 0; name = doxygen.config; path = ../documentation/doxygen/doxygen.config; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = ""; }; 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; @@ -816,7 +816,7 @@ C318F4AB11EA188700595FF9 /* CPTLimitBand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLimitBand.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C318F4AC11EA188700595FF9 /* CPTLimitBand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLimitBand.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C31908A41998168C00B61898 /* CorePlot.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlot.xcconfig; path = xcconfig/CorePlot.xcconfig; sourceTree = ""; }; - C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; }; + C3226A451A69ED0900F77249 /* doxygen touch.config */ = {isa = PBXFileReference; lastKnownFileType = text; lineEnding = 0; name = "doxygen touch.config"; path = "../documentation/doxygen/doxygen touch.config"; sourceTree = ""; xcLanguageSpecificationIdentifier = ""; }; C3226A461A69ED1F00F77249 /* doxygen-cocoa-touch-tags.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = "doxygen-cocoa-touch-tags.xml"; path = "../documentation/doxygen/doxygen-cocoa-touch-tags.xml"; sourceTree = ""; }; C3226A471A69EE9200F77249 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = ""; }; C3226A4C1A69F07600F77249 /* CorePlotTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CorePlotTests-Info.plist"; sourceTree = SOURCE_ROOT; }; diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index a6922adea..b1bf9e7d0 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -283,7 +283,7 @@ -(void)update startTime = currentTime; } else { - startTime = CPTFloat(NAN); + startTime = CPTNAN; } } else { @@ -631,7 +631,7 @@ -(NSString *)description { return [NSString stringWithFormat:@"<%@ timeOffset: %g; %lu active and %lu running operations>", [super description], - self.timeOffset, + (double)self.timeOffset, (unsigned long)self.animationOperations.count, (unsigned long)self.runningAnimationOperations.count]; } diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index f3bcb0be0..39854e267 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -440,7 +440,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett -(NSString *)description { - return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", [super description], self.startValue, self.endValue, self.duration, self.delay]; + return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", [super description], self.startValue, self.endValue, (double)self.duration, (double)self.delay]; } /// @endcond diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index eb95e3cd3..794c07d57 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -577,7 +577,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame tickDirection = CPTSignNone; axisTitle = nil; titleTextStyle = [[CPTTextStyle alloc] init]; - titleRotation = NAN; + titleRotation = CPTNAN; titleLocation = @(NAN); needsRelabel = YES; labelExclusionRanges = nil; diff --git a/framework/Source/CPTAxisTitle.m b/framework/Source/CPTAxisTitle.m index ececfdc0e..486cfbd5c 100644 --- a/framework/Source/CPTAxisTitle.m +++ b/framework/Source/CPTAxisTitle.m @@ -20,7 +20,7 @@ -(instancetype)initWithContentLayer:(CPTLayer *)layer { if ( layer ) { if ( (self = [super initWithContentLayer:layer]) ) { - self.rotation = NAN; + self.rotation = CPTNAN; } } else { diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 7ae9af868..5fd303824 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -938,7 +938,7 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin barRect.size.width = round(barRect.size.width * roundingPrecision) / roundingPrecision; barRect.size.height = round(barRect.size.height * roundingPrecision) / roundingPrecision; - if ( self.lineStyle.lineWidth > 0.0 ) { + if ( self.lineStyle.lineWidth > CPTFloat(0.0) ) { barRect = CPTAlignRectToUserSpace(context, barRect); } else { @@ -949,18 +949,18 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin CGFloat radius = MIN( MIN( self.barCornerRadius, ABS(barRect.size.width) * CPTFloat(0.5) ), ABS(barRect.size.height) * CPTFloat(0.5) ); CGFloat baseRadius = MIN( MIN( self.barBaseCornerRadius, ABS(barRect.size.width) * CPTFloat(0.5) ), ABS(barRect.size.height) * CPTFloat(0.5) ); - if ( widthNegative && (barRect.size.width > 0.0) ) { + if ( widthNegative && ( barRect.size.width > CPTFloat(0.0) ) ) { barRect.origin.x += barRect.size.width; barRect.size.width = -barRect.size.width; } - if ( heightNegative && (barRect.size.height > 0.0) ) { + if ( heightNegative && ( barRect.size.height > CPTFloat(0.0) ) ) { barRect.origin.y += barRect.size.height; barRect.size.height = -barRect.size.height; } CGMutablePathRef path = CGPathCreateMutable(); - if ( radius == 0.0 ) { - if ( baseRadius == 0.0 ) { + if ( radius == CPTFloat(0.0) ) { + if ( baseRadius == CPTFloat(0.0) ) { // square corners CGPathAddRect(path, NULL, barRect); } @@ -988,7 +988,7 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin CGFloat tipX = barRect.origin.x + barRect.size.width; CGFloat tipY = barRect.origin.y + barRect.size.height; - if ( baseRadius == 0.0 ) { + if ( baseRadius == CPTFloat(0.0) ) { // rounded at tip end only CGPathMoveToPoint(path, NULL, barRect.origin.x, barRect.origin.y); if ( horizontalBars ) { diff --git a/framework/Source/CPTConstraints.m b/framework/Source/CPTConstraints.m index 261148c33..7c1af4733 100644 --- a/framework/Source/CPTConstraints.m +++ b/framework/Source/CPTConstraints.m @@ -1,5 +1,6 @@ #import "CPTConstraints.h" +#import "CPTDefinitions.h" #import "NSCoderExtensions.h" #import "_CPTConstraintsFixed.h" #import "_CPTConstraintsRelative.h" @@ -159,7 +160,7 @@ -(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint -(CGFloat)positionForLowerBound:(CGFloat)lowerBound upperBound:(CGFloat)upperBound { // subclasses override to do position calculation here - return NAN; + return CPTNAN; } @end diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 6ca6a5350..e586819ad 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -104,6 +104,13 @@ **/ #define CPTRectInset(rect, dx, dy) CGRectInset( rect, (CGFloat)(dx), (CGFloat)(dy) ) +/** + * @def CPTNAN + * @hideinitializer + * @brief The not-a-number constant (@NAN), cast to @ref CGFloat. + **/ +#define CPTNAN ( (CGFloat)NAN ) + /** * @brief Enumeration of numeric types **/ diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index f0471b91a..2423c2440 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -731,7 +731,7 @@ -(CPTGradient *)removeColorStopAtPosition:(CGFloat)position CPTGradientElement removedElement = [newGradient removeElementAtPosition:position]; if ( isnan(removedElement.position) ) { - [NSException raise:NSRangeException format:@"-[%@ removeColorStopAtPosition:]: no such colorStop at position (%g)", [self class], position]; + [NSException raise:NSRangeException format:@"-[%@ removeColorStopAtPosition:]: no such colorStop at position (%g)", [self class], (double)position]; } return newGradient; @@ -1017,11 +1017,11 @@ -(CGShadingRef)newAxialGradientInRect:(CGRect)rect // First Calculate where the beginning and ending points should be CGPoint startPoint, endPoint; - if ( self.angle == 0.0 ) { + if ( self.angle == CPTFloat(0.0) ) { startPoint = CPTPointMake( CGRectGetMinX(rect), CGRectGetMinY(rect) ); // right of rect endPoint = CPTPointMake( CGRectGetMaxX(rect), CGRectGetMinY(rect) ); // left of rect } - else if ( self.angle == 90.0 ) { + else if ( self.angle == CPTFloat(90.0) ) { startPoint = CPTPointMake( CGRectGetMinX(rect), CGRectGetMinY(rect) ); // bottom of rect endPoint = CPTPointMake( CGRectGetMinX(rect), CGRectGetMaxY(rect) ); // top of rect } @@ -1206,7 +1206,7 @@ -(CPTGradientElement)removeElementAtIndex:(NSUInteger)idx removedElement.color.green = CPTFloat(0.0); removedElement.color.blue = CPTFloat(0.0); removedElement.color.alpha = CPTFloat(0.0); - removedElement.position = NAN; + removedElement.position = CPTNAN; removedElement.nextElement = NULL; return removedElement; @@ -1247,7 +1247,7 @@ -(CPTGradientElement)removeElementAtPosition:(CGFloat)position removedElement.color.green = CPTFloat(0.0); removedElement.color.blue = CPTFloat(0.0); removedElement.color.alpha = CPTFloat(0.0); - removedElement.position = NAN; + removedElement.position = CPTNAN; removedElement.nextElement = NULL; return removedElement; @@ -1519,7 +1519,7 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) void CPTTransformRGB_HSV(CGFloat *components) // H,S,B -> R,G,B { - CGFloat H = NAN, S, V; + CGFloat H = CPTNAN, S, V; CGFloat R = components[0]; CGFloat G = components[1]; CGFloat B = components[2]; diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 9287097b5..718d9ee54 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -133,7 +133,7 @@ -(instancetype)initWithContentsOfFile:(NSString *)path **/ -(instancetype)initWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale { - NSParameterAssert(newScale > 0.0); + NSParameterAssert( newScale > CPTFloat(0.0) ); if ( (self = [super init]) ) { CGImageRetain(anImage); @@ -551,7 +551,7 @@ -(CPTNativeImage *)nativeImage -(void)setScale:(CGFloat)newScale { - NSParameterAssert(newScale > 0.0); + NSParameterAssert( newScale > CPTFloat(0.0) ); if ( newScale != scale ) { scale = newScale; diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index d3af83ab5..8725aa5e4 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -857,10 +857,10 @@ -(void)setPosition:(CGPoint)newPosition CGRect currentFrame = self.frame; if ( !CGRectEqualToRect( currentFrame, CGRectIntegral(self.frame) ) ) { COREPLOT_LAYER_POSITION_CHANGE( (const char *)class_getName([self class]), - (int)lrint( ceil(currentFrame.origin.x * 1000.0) ), - (int)lrint( ceil(currentFrame.origin.y * 1000.0) ), - (int)lrint( ceil(currentFrame.size.width * 1000.0) ), - (int)lrint( ceil(currentFrame.size.height * 1000.0) ) ); + (int)lrint( ceil( currentFrame.origin.x * CPTFloat(1000.0) ) ), + (int)lrint( ceil( currentFrame.origin.y * CPTFloat(1000.0) ) ), + (int)lrint( ceil( currentFrame.size.width * CPTFloat(1000.0) ) ), + (int)lrint( ceil( currentFrame.size.height * CPTFloat(1000.0) ) ) ); } } } @@ -877,7 +877,7 @@ -(void)setHidden:(BOOL)newHidden -(void)setContentsScale:(CGFloat)newContentsScale { - NSParameterAssert(newContentsScale > 0.0); + NSParameterAssert( newContentsScale > CPTFloat(0.0) ); if ( self.contentsScale != newContentsScale ) { if ( [CALayer instancesRespondToSelector:@selector(setContentsScale:)] ) { diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 3aa266227..2e6e4ac8e 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -1306,7 +1306,7 @@ -(CGSize)swatchSize if ( CGSizeEqualToSize(theSwatchSize, CGSizeZero) ) { CPTTextStyle *theTextStyle = self.textStyle; CGFloat fontSize = theTextStyle.fontSize; - if ( fontSize > 0.0 ) { + if ( fontSize > CPTFloat(0.0) ) { fontSize *= CPTFloat(1.5); fontSize = round(fontSize); theSwatchSize = CPTSizeMake(fontSize, fontSize); diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 9c0bba5f8..e3382aba2 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -142,7 +142,7 @@ -(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFlo CGSize theTitleSize = self.titleSize; if ( theTitleSize.height < textRect.size.height ) { CGFloat offset = (textRect.size.height - theTitleSize.height) / CPTFloat(2.0); - if ( scale == 1.0 ) { + if ( scale == CPTFloat(1.0) ) { offset = round(offset); } else { diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index e18f596d1..de34f4ca0 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -212,7 +212,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame pieRadius = CPTFloat(0.8) * ( MIN(newFrame.size.width, newFrame.size.height) / CPTFloat(2.0) ); pieInnerRadius = CPTFloat(0.0); startAngle = CPTFloat(M_PI_2); // pi/2 - endAngle = NAN; + endAngle = CPTNAN; sliceDirection = CPTPieDirectionClockwise; centerAnchor = CPTPointMake(0.5, 0.5); borderLineStyle = nil; @@ -390,7 +390,7 @@ -(void)updateNormalizedData while ( dataBytes < dataEnd ) { double currentWidth = *dataBytes++; if ( isnan(currentWidth) ) { - *normalizedBytes++ = NAN; + *normalizedBytes++ = (double)NAN; } else { *normalizedBytes++ = currentWidth / valueSum; @@ -616,7 +616,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context CGFloat xOffset = CPTFloat(0.0); CGFloat yOffset = CPTFloat(0.0); CGPoint center = centerPoint; - if ( radialOffset != 0.0 ) { + if ( radialOffset != CPTFloat(0.0) ) { CGFloat medianAngle = CPTFloat(0.5) * (startingAngle + finishingAngle); xOffset = cos(medianAngle) * radialOffset; yOffset = sin(medianAngle) * radialOffset; @@ -675,7 +675,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context CGMutablePathRef fillPath = CGPathCreateMutable(); CGFloat innerRadius = self.pieInnerRadius; - if ( innerRadius > 0.0 ) { + if ( innerRadius > CPTFloat(0.0) ) { CGPathAddArc(fillPath, NULL, centerPoint.x, centerPoint.y, self.pieRadius, CPTFloat(0.0), CPTFloat(2.0 * M_PI), false); CGPathAddArc(fillPath, NULL, centerPoint.x, centerPoint.y, innerRadius, CPTFloat(2.0 * M_PI), CPTFloat(0.0), true); } @@ -718,7 +718,7 @@ -(void)addSliceToPath:(CGMutablePathRef)slicePath centerPoint:(CGPoint)center st bool direction = (self.sliceDirection == CPTPieDirectionClockwise) ? true : false; CGFloat innerRadius = self.pieInnerRadius; - if ( innerRadius > 0.0 ) { + if ( innerRadius > CPTFloat(0.0) ) { CGPathAddArc(slicePath, NULL, center.x, center.y, self.pieRadius, startingAngle, finishingAngle, direction); CGPathAddArc(slicePath, NULL, center.x, center.y, innerRadius, finishingAngle, startingAngle, !direction); } @@ -821,7 +821,7 @@ -(CGFloat)medianAngleForPieSliceIndex:(NSUInteger)idx NSParameterAssert(idx < sampleCount); if ( sampleCount == 0 ) { - return NAN; + return CPTNAN; } CGFloat startingWidth = CPTFloat(0.0); @@ -842,7 +842,7 @@ -(CGFloat)medianAngleForPieSliceIndex:(NSUInteger)idx } // Searched every pie slice but couldn't find one that corresponds to the given index - return NAN; + return CPTNAN; } #pragma mark - @@ -1233,11 +1233,11 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point switch ( self.sliceDirection ) { case CPTPieDirectionClockwise: - if ( isnan(theEndAngle) || ( 2.0 * M_PI == ABS(theEndAngle - theStartAngle) ) ) { + if ( isnan(theEndAngle) || ( CPTFloat(2.0 * M_PI) == ABS(theEndAngle - theStartAngle) ) ) { widthFactor = CPTFloat(1.0); } else { - widthFactor = (CGFloat)(2.0 * M_PI) / ( (CGFloat)(2.0 * M_PI) - ABS(theEndAngle - theStartAngle) ); + widthFactor = CPTFloat(2.0 * M_PI) / ( CPTFloat(2.0 * M_PI) - ABS(theEndAngle - theStartAngle) ); } for ( NSUInteger currentIndex = 0; currentIndex < sampleCount; currentIndex++ ) { @@ -1255,7 +1255,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point CGFloat offsetTouchedAngle = touchedAngle; CGFloat offsetDistanceSquared = distanceSquared; CGFloat radialOffset = [(NSNumber *)[self cachedValueForKey:CPTPieChartBindingPieSliceRadialOffsets recordIndex:currentIndex] cgFloatValue]; - if ( radialOffset != 0.0 ) { + if ( radialOffset != CPTFloat(0.0) ) { CGPoint offsetCenter; CGFloat medianAngle = CPTFloat(M_PI) * (startingAngle + endingAngle); offsetCenter = CPTPointMake(centerPoint.x + cos(medianAngle) * radialOffset, @@ -1311,7 +1311,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point CGFloat offsetTouchedAngle = touchedAngle; CGFloat offsetDistanceSquared = distanceSquared; CGFloat radialOffset = [(NSNumber *)[self cachedValueForKey:CPTPieChartBindingPieSliceRadialOffsets recordIndex:currentIndex] cgFloatValue]; - if ( radialOffset != 0.0 ) { + if ( radialOffset != CPTFloat(0.0) ) { CGPoint offsetCenter; CGFloat medianAngle = CPTFloat(M_PI) * (startingAngle + endingAngle); offsetCenter = CPTPointMake(centerPoint.x + cos(medianAngle) * radialOffset, diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index d021c561d..9ae519224 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -1249,7 +1249,7 @@ -(double)cachedDoubleForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx break; } } - return NAN; + return (double)NAN; } /** @brief Retrieves a single number from the cache. @@ -1423,16 +1423,16 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum if ( self.doublePrecisionCache ) { const double *doubles = (const double *)numbers.bytes; - double min = INFINITY; - double max = -INFINITY; + double min = (double)INFINITY; + double max = -(double)INFINITY; vDSP_minvD(doubles, 1, &min, (vDSP_Length)numberOfSamples); vDSP_maxvD(doubles, 1, &max, (vDSP_Length)numberOfSamples); if ( isnan(min) || isnan(max) ) { // vDSP functions may return NAN if any data in the array is NAN - min = INFINITY; - max = -INFINITY; + min = (double)INFINITY; + max = -(double)INFINITY; const double *lastSample = doubles + numberOfSamples; diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 15cbab954..a07e25796 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -160,7 +160,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame axisLabelGroup = nil; axisTitleGroup = nil; fill = nil; - touchedPoint = CGPointMake(NAN, NAN); + touchedPoint = CPTPointMake(NAN, NAN); topDownLayerOrder = nil; bottomUpLayerOrder = malloc( kCPTNumberOfLayers * sizeof(CPTGraphLayerType) ); [self updateLayerOrder]; @@ -251,7 +251,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder bottomUpLayerOrder = malloc( kCPTNumberOfLayers * sizeof(CPTGraphLayerType) ); [self updateLayerOrder]; - touchedPoint = CGPointMake(NAN, NAN); + touchedPoint = CPTPointMake(NAN, NAN); CGSize boundsSize = self.bounds.size; widthDecimal = CPTDecimalFromCGFloat(boundsSize.width); @@ -730,7 +730,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio } CGPoint lastPoint = self.touchedPoint; - self.touchedPoint = CGPointMake(NAN, NAN); + self.touchedPoint = CPTPointMake(NAN, NAN); id theDelegate = self.delegate; if ( [theDelegate respondsToSelector:@selector(plotAreaTouchUp:)] || diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index af467c4b7..fe0285996 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -485,7 +485,7 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl if ( theCachedLayer ) { CGSize layerSize = CGLayerGetSize(theCachedLayer); - if ( scale != 1.0 ) { + if ( scale != CPTFloat(1.0) ) { layerSize.width /= scale; layerSize.height /= scale; } @@ -496,7 +496,7 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl center.y - layerSize.height * CPTFloat(0.5) - symbolSize.height * ( symbolAnchor.y - CPTFloat(0.5) ) ); if ( alignToPixels ) { - if ( scale == 1.0 ) { + if ( scale == CPTFloat(1.0) ) { origin.x = round(origin.x); origin.y = round(origin.y); } diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index f157ccd3c..50895fd3f 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -13,6 +13,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "tgmath.h" /** @defgroup plotAnimationRangePlot Range Plot * @brief Range plot properties that can be animated using Core Animation. @@ -327,8 +328,8 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * const double left = leftBytes[i]; const double right = rightBytes[i]; if ( !drawPointFlags[i] || isnan(x) || isnan(y) ) { - viewPoints[i].x = NAN; // depending coordinates - viewPoints[i].y = NAN; + viewPoints[i].x = CPTNAN; // depending coordinates + viewPoints[i].y = CPTNAN; } else { double plotPoint[2]; @@ -377,8 +378,8 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * const NSDecimal right = rightBytes[i]; if ( !drawPointFlags[i] || NSDecimalIsNotANumber(&x) || NSDecimalIsNotANumber(&y) ) { - viewPoints[i].x = NAN; // depending coordinates - viewPoints[i].y = NAN; + viewPoints[i].x = CPTNAN; // depending coordinates + viewPoints[i].y = CPTNAN; } else { NSDecimal plotPoint[2]; @@ -397,7 +398,7 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * viewPoints[i].high = pos.y; } else { - viewPoints[i].high = NAN; + viewPoints[i].high = CPTNAN; } if ( !NSDecimalIsNotANumber(&low) ) { @@ -409,7 +410,7 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * viewPoints[i].low = pos.y; } else { - viewPoints[i].low = NAN; + viewPoints[i].low = CPTNAN; } if ( !NSDecimalIsNotANumber(&left) ) { @@ -421,7 +422,7 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * viewPoints[i].left = pos.x; } else { - viewPoints[i].left = NAN; + viewPoints[i].left = CPTNAN; } if ( !NSDecimalIsNotANumber(&right) ) { NSDecimal xr; @@ -432,7 +433,7 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * viewPoints[i].right = pos.x; } else { - viewPoints[i].right = NAN; + viewPoints[i].right = CPTNAN; } } }); @@ -443,7 +444,7 @@ -(void)alignViewPointsToUserSpace:(CGPointError *)viewPoints withContent:(CGCont { // Align to device pixels if there is a data line. // Otherwise, align to view space, so fills are sharp at edges. - if ( self.barLineStyle.lineWidth > 0.0 ) { + if ( self.barLineStyle.lineWidth > CPTFloat(0.0) ) { dispatch_apply(dataCount, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) { if ( drawPointFlags[i] ) { CGFloat x = viewPoints[i].x; @@ -1049,7 +1050,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point NSInteger result = [self extremeDrawnPointIndexForFlags:drawPointFlags numberOfPoints:dataCount extremeNumIsLowerBound:YES]; if ( result != NSNotFound ) { CGPointError lastViewPoint; - CGFloat minimumDistanceSquared = NAN; + CGFloat minimumDistanceSquared = CPTNAN; for ( NSUInteger i = (NSUInteger)result; i < dataCount; ++i ) { if ( drawPointFlags[i] ) { lastViewPoint = viewPoints[i]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 6d3d975a1..78c97fcc4 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -615,7 +615,7 @@ -(void)alignViewPointsToUserSpace:(CGPoint *)viewPoints withContent:(CGContextRe { // Align to device pixels if there is a data line. // Otherwise, align to view space, so fills are sharp at edges. - if ( self.dataLineStyle.lineWidth > 0.0 ) { + if ( self.dataLineStyle.lineWidth > CPTFloat(0.0) ) { dispatch_apply(dataCount, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) { if ( drawPointFlags[i] ) { viewPoints[i] = CPTAlignPointToUserSpace(context, viewPoints[i]); @@ -680,7 +680,7 @@ -(NSUInteger)indexOfVisiblePointClosestToPlotAreaPoint:(CGPoint)viewPoint NSInteger result = [self extremeDrawnPointIndexForFlags:drawPointFlags numberOfPoints:dataCount extremeNumIsLowerBound:YES]; if ( result != NSNotFound ) { - CGFloat minimumDistanceSquared = NAN; + CGFloat minimumDistanceSquared = CPTNAN; for ( NSUInteger i = (NSUInteger)result; i < dataCount; ++i ) { if ( drawPointFlags[i] ) { CGFloat distanceSquared = squareOfDistanceBetweenPoints(viewPoint, viewPoints[i]); @@ -867,7 +867,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context // Draw line if ( theLineStyle ) { - CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:viewIndexRange baselineYValue:NAN]; + CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:viewIndexRange baselineYValue:CPTNAN]; // Give the delegate a chance to prepare for the drawing. id theDelegate = self.delegate; @@ -1282,7 +1282,7 @@ -(CGPathRef)newDataLinePath // Create the path CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:NSMakeRange(0, dataCount) - baselineYValue:NAN]; + baselineYValue:CPTNAN]; free(viewPoints); free(drawPointFlags); @@ -1725,7 +1725,7 @@ -(BOOL)plotWasLineHitByInteractionPoint:(CGPoint)interactionPoint NSInteger lastDrawnPointIndex = [self extremeDrawnPointIndexForFlags:drawPointFlags numberOfPoints:dataCount extremeNumIsLowerBound:NO]; NSRange viewIndexRange = NSMakeRange( (NSUInteger)firstDrawnPointIndex, (NSUInteger)(lastDrawnPointIndex - firstDrawnPointIndex + 1) ); - CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:viewIndexRange baselineYValue:NAN]; + CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:viewIndexRange baselineYValue:CPTNAN]; CGPathRef path = CGPathCreateCopyByStrokingPath( dataLinePath, NULL, self.plotLineMarginForHitDetection * CPTFloat(2.0), diff --git a/framework/Source/CPTShadow.m b/framework/Source/CPTShadow.m index f3426df6f..e3163c5f1 100644 --- a/framework/Source/CPTShadow.m +++ b/framework/Source/CPTShadow.m @@ -161,7 +161,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone -(void)setShadowBlurRadius:(CGFloat)newShadowBlurRadius { - NSParameterAssert(newShadowBlurRadius >= 0.0); + NSParameterAssert( newShadowBlurRadius >= CPTFloat(0.0) ); if ( newShadowBlurRadius != shadowBlurRadius ) { shadowBlurRadius = newShadowBlurRadius; diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 765485347..78bd90aae 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -12,6 +12,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "tgmath.h" /** @defgroup plotAnimationTradingRangePlot Trading Range Plot * @brief Trading range plot properties that can be animated using Core Animation. @@ -1257,7 +1258,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point CGFloat lastViewMax = CPTFloat(0.0); NSUInteger result = NSNotFound; - CGFloat minimumDistanceSquared = NAN; + CGFloat minimumDistanceSquared = CPTNAN; if ( self.doublePrecisionCache ) { const double *locationBytes = (const double *)locations.data.bytes; diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 5b64efeeb..3f9a8b805 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -468,7 +468,7 @@ NSDecimal CPTDecimalFromFloat(float aFloat) return CPTDecimalNaN(); } else { - NSString *stringValue = [[NSString alloc] initWithFormat:@"%f", aFloat]; + NSString *stringValue = [[NSString alloc] initWithFormat:@"%f", (double)aFloat]; NSDecimal result = CPTDecimalFromString(stringValue); return result; @@ -504,7 +504,7 @@ NSDecimal CPTDecimalFromCGFloat(CGFloat aCGFloat) return CPTDecimalNaN(); } else { - NSString *stringValue = [[NSString alloc] initWithFormat:@"%f", aCGFloat]; + NSString *stringValue = [[NSString alloc] initWithFormat:@"%f", (double)aCGFloat]; NSDecimal result = CPTDecimalFromString(stringValue); return result; @@ -944,7 +944,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin **/ NSString *CPTStringFromPoint(CGPoint point) { - return [NSString stringWithFormat:@"{%g, %g}", point.x, point.y]; + return [NSString stringWithFormat:@"{%g, %g}", (double)point.x, (double)point.y]; } /** @brief Creates a string representation of the given size. @@ -953,7 +953,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin **/ NSString *CPTStringFromSize(CGSize size) { - return [NSString stringWithFormat:@"{%g, %g}", size.width, size.height]; + return [NSString stringWithFormat:@"{%g, %g}", (double)size.width, (double)size.height]; } /** @brief Creates a string representation of the given rectangle. @@ -962,7 +962,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin **/ NSString *CPTStringFromRect(CGRect rect) { - return [NSString stringWithFormat:@"{{%g, %g}, {%g, %g}}", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height]; + return [NSString stringWithFormat:@"{{%g, %g}, {%g, %g}}", (double)rect.origin.x, (double)rect.origin.y, (double)rect.size.width, (double)rect.size.height]; } #pragma mark - diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 92e8bdaee..b141e448f 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -142,8 +142,8 @@ -(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat * break; default: - *lower = NAN; - *upper = NAN; + *lower = CPTNAN; + *upper = CPTNAN; break; } } @@ -349,11 +349,11 @@ -(void)renderAsVectorInContext:(CGContextRef)context if ( minCap || maxCap ) { switch ( self.coordinate ) { case CPTCoordinateX: - axisDirection = ( range.lengthDouble >= CPTFloat(0.0) ) ? CPTPointMake(1.0, 0.0) : CPTPointMake(-1.0, 0.0); + axisDirection = (range.lengthDouble >= 0.0) ? CPTPointMake(1.0, 0.0) : CPTPointMake(-1.0, 0.0); break; case CPTCoordinateY: - axisDirection = ( range.lengthDouble >= CPTFloat(0.0) ) ? CPTPointMake(0.0, 1.0) : CPTPointMake(0.0, -1.0); + axisDirection = (range.lengthDouble >= 0.0) ? CPTPointMake(0.0, 1.0) : CPTPointMake(0.0, -1.0); break; default: diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 25a113193..d0c9de441 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -582,7 +582,7 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif // decelerate at the global range if ( hasShift ) { - CGFloat brakingDelay = CPTFloat(NAN); + CGFloat brakingDelay = CPTNAN; if ( [globalRange containsRange:oldRange] ) { // momentum started inside the global range; coast until we hit the global range @@ -690,7 +690,7 @@ -(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate point[orthogonalCoordinate] = CPTDecimalFromInteger(1); CGPoint viewPoint = [self plotAreaViewPointForPlotPoint:point numberOfCoordinates:2]; - CGFloat pointCoordinate = CPTFloat(NAN); + CGFloat pointCoordinate = CPTNAN; switch ( coordinate ) { case CPTCoordinateX: @@ -711,7 +711,7 @@ -(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate // return NAN if no positive roots CGFloat CPTFirstPositiveRoot(CGFloat a, CGFloat b, CGFloat c) { - CGFloat root = CPTFloat(NAN); + CGFloat root = CPTNAN; CGFloat discriminant = sqrt(b * b - CPTFloat(4.0) * a * c); @@ -873,11 +873,11 @@ -(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(C -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { - if ( boundsLength == 0.0 ) { + if ( boundsLength == CPTFloat(0.0) ) { return 0.0; } - double coordinate = viewLength / boundsLength; + double coordinate = (double)viewLength / (double)boundsLength; coordinate *= range.lengthDouble; coordinate += range.locationDouble; @@ -900,14 +900,14 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotR -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { - if ( boundsLength == 0.0 ) { + if ( boundsLength == CPTFloat(0.0) ) { return 0.0; } double logLoc = log10(range.locationDouble); double logEnd = log10(range.endDouble); - double coordinate = viewLength * (logEnd - logLoc) / boundsLength + logLoc; + double coordinate = (double)viewLength * (logEnd - logLoc) / (double)boundsLength + logLoc; return pow(10.0, coordinate); } @@ -928,13 +928,13 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(C -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { - if ( boundsLength == 0.0 ) { + if ( boundsLength == CPTFloat(0.0) ) { return 0.0; } double logLoc = CPTLogModulus(range.locationDouble); double logEnd = CPTLogModulus(range.endDouble); - double coordinate = viewLength * (logEnd - logLoc) / boundsLength + logLoc; + double coordinate = (double)viewLength * (logEnd - logLoc) / (double)boundsLength + logLoc; return CPTInverseLogModulus(coordinate); } @@ -1362,7 +1362,7 @@ -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint CPTGraph *theGraph = self.graph; CPTPlotArea *plotArea = theGraph.plotAreaFrame.plotArea; - if ( !plotArea || (interactionScale <= 1.e-6) ) { + if ( !plotArea || ( interactionScale <= CPTFloat(1.e-6) ) ) { return; } if ( ![plotArea containsPoint:plotAreaPoint] ) { diff --git a/framework/Source/_CPTAnimationTimingFunctions.m b/framework/Source/_CPTAnimationTimingFunctions.m index f43c7f84b..a50417ad6 100644 --- a/framework/Source/_CPTAnimationTimingFunctions.m +++ b/framework/Source/_CPTAnimationTimingFunctions.m @@ -393,7 +393,7 @@ CGFloat CPTAnimationTimingFunctionExponentialInOut(CGFloat elapsedTime, CGFloat elapsedTime /= duration * CPTFloat(0.5); elapsedTime -= CPTFloat(1.0); - if ( elapsedTime >= 1.0 ) { + if ( elapsedTime >= CPTFloat(1.0) ) { return CPTFloat(1.0); } diff --git a/framework/iPhoneOnly/CPTImagePlatformSpecific.m b/framework/iPhoneOnly/CPTImagePlatformSpecific.m index aaa7fbad1..0f847fc94 100644 --- a/framework/iPhoneOnly/CPTImagePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTImagePlatformSpecific.m @@ -45,7 +45,7 @@ -(instancetype)initForPNGFile:(NSString *)path imageScale = MAX(imageScale, screen.scale); } - if ( imageScale > 1.0 ) { + if ( imageScale > CPTFloat(1.0) ) { NSMutableString *hiDpiPath = [path mutableCopy]; NSUInteger replaceCount = [hiDpiPath replaceOccurrencesOfString:@".png" withString:[NSString stringWithFormat:@"@%dx.png", (int)imageScale] From 42767a16dfeb35967748cfc48e4b889003e22982 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 6 Mar 2016 20:12:45 -0500 Subject: [PATCH 166/429] Renamed Coding Style.markdown to CONTRIBUTING.md and moved it to the .github folder. --- documentation/Coding Style.markdown => .github/CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename documentation/Coding Style.markdown => .github/CONTRIBUTING.md (100%) diff --git a/documentation/Coding Style.markdown b/.github/CONTRIBUTING.md similarity index 100% rename from documentation/Coding Style.markdown rename to .github/CONTRIBUTING.md From 8c9e95b55b69d71e7becd14c0d487554de04755f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 7 Mar 2016 20:20:27 -0500 Subject: [PATCH 167/429] Added GitHub pull request template. --- .github/PULL_REQUEST_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..4e7381cd7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +Please consider the following issues before submitting a pull request: + +-[] Support all platforms (Mac, iOS, and tvOS) +-[] Pass Travis build validation +-[] Include unit tests where appropriate +-[] If adding a new feature, consider including a demo in the *Plot Gallery* example app \ No newline at end of file From bc31fe1f3cf7cb6b436a73ecc50f3f087ed6ef5a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 15 Mar 2016 21:38:05 -0400 Subject: [PATCH 168/429] Added nullability annotations in implementation files to match the header files. Added missing annotations to some headers and updated others to match the Apple headers. --- documentation/doxygen/doxygen touch.config | 3 +- documentation/doxygen/doxygen.config | 3 +- framework/CorePlot.xcodeproj/project.pbxproj | 10 +- .../CPTDecimalNumberValueTransformer.m | 6 +- framework/MacOnly/CPTGraphHostingView.m | 52 ++-- framework/MacOnly/CPTImagePlatformSpecific.m | 4 +- .../MacOnly/CPTPlatformSpecificCategories.m | 6 +- .../MacOnly/CPTPlatformSpecificFunctions.m | 6 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 29 +- framework/Source/CPTAnimation.h | 2 +- framework/Source/CPTAnimation.m | 38 +-- framework/Source/CPTAnimationOperation.m | 14 +- framework/Source/CPTAnimationPeriod.m | 82 ++--- framework/Source/CPTAnnotation.m | 20 +- framework/Source/CPTAnnotationHostLayer.m | 50 +-- framework/Source/CPTAxis.h | 2 +- framework/Source/CPTAxis.m | 287 +++++++++--------- framework/Source/CPTAxisLabel.h | 4 +- framework/Source/CPTAxisLabel.m | 39 ++- framework/Source/CPTAxisLabelGroup.m | 2 +- framework/Source/CPTAxisSet.m | 22 +- framework/Source/CPTAxisTitle.m | 9 +- framework/Source/CPTBarPlot.h | 6 +- framework/Source/CPTBarPlot.m | 127 ++++---- framework/Source/CPTBorderedLayer.m | 34 +-- framework/Source/CPTCalendarFormatter.h | 2 +- framework/Source/CPTCalendarFormatter.m | 18 +- framework/Source/CPTColor.h | 2 +- framework/Source/CPTColor.m | 56 ++-- framework/Source/CPTColorSpace.h | 4 +- framework/Source/CPTColorSpace.m | 21 +- framework/Source/CPTConstraints.m | 20 +- framework/Source/CPTDataSourceTestCase.h | 12 +- framework/Source/CPTDataSourceTestCase.m | 22 +- framework/Source/CPTDebugQuickLook.h | 2 +- framework/Source/CPTFill.h | 12 +- framework/Source/CPTFill.m | 32 +- framework/Source/CPTFillTests.m | 6 +- framework/Source/CPTFunctionDataSource.m | 34 +-- framework/Source/CPTGradient.m | 116 +++---- framework/Source/CPTGraph.h | 8 +- framework/Source/CPTGraph.m | 181 ++++++----- framework/Source/CPTGridLineGroup.m | 14 +- framework/Source/CPTGridLines.m | 14 +- framework/Source/CPTImage.h | 2 +- framework/Source/CPTImage.m | 46 +-- framework/Source/CPTLayer.h | 2 +- framework/Source/CPTLayer.m | 92 +++--- framework/Source/CPTLayerAnnotation.h | 5 +- framework/Source/CPTLayerAnnotation.m | 10 +- framework/Source/CPTLayerTests.h | 4 +- framework/Source/CPTLegend.m | 134 ++++---- framework/Source/CPTLegendEntry.m | 27 +- framework/Source/CPTLimitBand.h | 2 +- framework/Source/CPTLimitBand.m | 18 +- framework/Source/CPTLineCap.m | 52 ++-- framework/Source/CPTLineStyle.m | 38 +-- framework/Source/CPTMutableLineStyle.m | 8 +- framework/Source/CPTMutableNumericData.m | 10 +- framework/Source/CPTMutablePlotRange.h | 14 +- framework/Source/CPTMutablePlotRange.m | 14 +- framework/Source/CPTMutableShadow.m | 2 +- framework/Source/CPTMutableTextStyle.m | 4 +- .../Source/CPTNumericData+TypeConversion.h | 8 +- .../Source/CPTNumericData+TypeConversion.m | 18 +- framework/Source/CPTNumericData.h | 2 +- framework/Source/CPTNumericData.m | 154 +++++----- framework/Source/CPTNumericDataType.m | 14 +- framework/Source/CPTPathExtensions.m | 4 +- framework/Source/CPTPieChart.m | 60 ++-- framework/Source/CPTPlot.m | 145 ++++----- framework/Source/CPTPlotArea.m | 102 ++++--- framework/Source/CPTPlotAreaFrame.m | 42 +-- framework/Source/CPTPlotGroup.m | 10 +- framework/Source/CPTPlotRange.h | 2 +- framework/Source/CPTPlotRange.m | 46 +-- framework/Source/CPTPlotSpace.h | 2 +- framework/Source/CPTPlotSpace.m | 82 ++--- framework/Source/CPTPlotSpaceAnnotation.h | 5 +- framework/Source/CPTPlotSpaceAnnotation.m | 16 +- framework/Source/CPTPlotSpaceTests.h | 2 +- framework/Source/CPTPlotSymbol.m | 74 ++--- framework/Source/CPTRangePlot.m | 100 +++--- framework/Source/CPTScatterPlot.m | 123 ++++---- framework/Source/CPTScatterPlotTests.h | 4 +- framework/Source/CPTScatterPlotTests.m | 56 +++- framework/Source/CPTShadow.m | 16 +- framework/Source/CPTTextLayer.m | 32 +- framework/Source/CPTTextStyle.m | 20 +- framework/Source/CPTTheme.h | 10 +- framework/Source/CPTTheme.m | 40 ++- framework/Source/CPTTimeFormatter.h | 2 +- framework/Source/CPTTimeFormatter.m | 16 +- framework/Source/CPTTradingRangePlot.m | 132 ++++---- framework/Source/CPTUtilities.h | 28 +- framework/Source/CPTUtilities.m | 24 +- framework/Source/CPTUtilitiesTests.m | 2 +- framework/Source/CPTXYAxis.m | 39 +-- framework/Source/CPTXYAxisSet.m | 17 +- framework/Source/CPTXYGraph.m | 20 +- framework/Source/CPTXYPlotSpace.m | 112 +++---- framework/Source/CPTXYPlotSpaceTests.h | 2 +- framework/Source/CPTXYPlotSpaceTests.m | 3 +- framework/Source/NSCoderExtensions.m | 34 +-- framework/Source/NSDecimalNumberExtensions.h | 2 + framework/Source/NSDecimalNumberExtensions.m | 2 +- framework/Source/NSNumberExtensions.m | 6 +- framework/Source/_CPTAnimationCGFloatPeriod.m | 10 +- framework/Source/_CPTAnimationCGPointPeriod.m | 10 +- framework/Source/_CPTAnimationCGRectPeriod.m | 10 +- framework/Source/_CPTAnimationCGSizePeriod.m | 10 +- .../Source/_CPTAnimationNSDecimalPeriod.m | 10 +- .../Source/_CPTAnimationPlotRangePeriod.m | 6 +- framework/Source/_CPTBorderLayer.m | 16 +- framework/Source/_CPTConstraintsFixed.h | 2 +- framework/Source/_CPTConstraintsFixed.m | 14 +- framework/Source/_CPTConstraintsRelative.h | 2 +- framework/Source/_CPTConstraintsRelative.m | 12 +- framework/Source/_CPTDarkGradientTheme.m | 14 +- framework/Source/_CPTFillColor.h | 4 +- framework/Source/_CPTFillColor.m | 27 +- framework/Source/_CPTFillGradient.h | 4 +- framework/Source/_CPTFillGradient.m | 27 +- framework/Source/_CPTFillImage.h | 4 +- framework/Source/_CPTFillImage.m | 27 +- framework/Source/_CPTMaskLayer.m | 4 +- framework/Source/_CPTPlainBlackTheme.m | 10 +- framework/Source/_CPTPlainWhiteTheme.m | 10 +- framework/Source/_CPTSlateTheme.m | 14 +- framework/Source/_CPTStocksTheme.m | 10 +- framework/Source/_CPTXYTheme.m | 6 +- framework/iPhoneOnly/CPTGraphHostingView.m | 101 +++--- .../iPhoneOnly/CPTImagePlatformSpecific.m | 4 +- .../CPTPlatformSpecificCategories.m | 14 +- .../iPhoneOnly/CPTPlatformSpecificFunctions.m | 2 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.h | 2 +- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 29 +- 137 files changed, 2109 insertions(+), 1853 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index a510a9239..a3236a7a1 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2043,7 +2043,8 @@ INCLUDE_FILE_PATTERNS = PREDEFINED = TARGET_OS_IPHONE, \ TARGET_IPHONE_SIMULATOR, \ - "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type" \ + "NS_DESIGNATED_INITIALIZER:=''", \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 297937e81..3552600d1 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -2041,7 +2041,8 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type" \ +PREDEFINED = "NS_DESIGNATED_INITIALIZER:=''", \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 5e8c23366..dbef056a7 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -787,13 +787,13 @@ 906156BC0F375598001B75FC /* CPTLineStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTLineStyle.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 906156BD0F375598001B75FC /* CPTLineStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTLineStyle.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 90AF4FB90F36D39700753D26 /* CPTXYPlotSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTXYPlotSpace.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationNSDecimalPeriod.m; sourceTree = ""; }; + A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTAnimationNSDecimalPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; A92C0563E082D1C1E249FA6F /* _CPTAnimationCGSizePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGSizePeriod.h; sourceTree = ""; }; A92C0685ACE3281299F10F73 /* _CPTAnimationNSDecimalPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationNSDecimalPeriod.h; sourceTree = ""; }; - A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationCGSizePeriod.m; sourceTree = ""; }; + A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTAnimationCGSizePeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; A92C091B8592D9F32AC384CB /* _CPTAnimationPlotRangePeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationPlotRangePeriod.m; sourceTree = ""; }; - A92C0AE447398AF62D584F9C /* _CPTAnimationCGPointPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationCGPointPeriod.m; sourceTree = ""; }; - A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationCGRectPeriod.m; sourceTree = ""; }; + A92C0AE447398AF62D584F9C /* _CPTAnimationCGPointPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTAnimationCGPointPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + A92C0C3DB583ED8FC2EFD9DB /* _CPTAnimationCGRectPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = _CPTAnimationCGRectPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; A92C0E154E8598EDE2EDEF2F /* _CPTAnimationCGPointPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGPointPeriod.h; sourceTree = ""; }; A92C0E16290C226BC4BE3936 /* _CPTAnimationPlotRangePeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationPlotRangePeriod.h; sourceTree = ""; }; A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationCGRectPeriod.h; sourceTree = ""; }; @@ -896,7 +896,7 @@ C3C2847016584EB9006BA43C /* CPTAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C2847316585085006BA43C /* _CPTAnimationTimingFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _CPTAnimationTimingFunctions.h; sourceTree = ""; }; C3C2847416585085006BA43C /* _CPTAnimationTimingFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = _CPTAnimationTimingFunctions.m; sourceTree = ""; }; - C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPTAnimationOperation.h; sourceTree = ""; }; + C3C9CB0C165DB4D500739006 /* CPTAnimationOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimationOperation.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3C9CB0D165DB4D500739006 /* CPTAnimationOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimationOperation.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3C9CB11165DB50300739006 /* CPTAnimationPeriod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CPTAnimationPeriod.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C3C9CB12165DB50300739006 /* CPTAnimationPeriod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CPTAnimationPeriod.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; diff --git a/framework/MacOnly/CPTDecimalNumberValueTransformer.m b/framework/MacOnly/CPTDecimalNumberValueTransformer.m index edf9645ef..04477ecb9 100644 --- a/framework/MacOnly/CPTDecimalNumberValueTransformer.m +++ b/framework/MacOnly/CPTDecimalNumberValueTransformer.m @@ -19,19 +19,19 @@ +(BOOL)allowsReverseTransformation * @brief The class of the value returned for a forward transformation. * @return Transformed values will be instances of NSNumber. **/ -+(Class)transformedValueClass ++(nonnull Class)transformedValueClass { return [NSNumber class]; } /// @cond --(id)transformedValue:(id)value +-(nullable id)transformedValue:(nullable id)value { return [value copy]; } --(id)reverseTransformedValue:(id)value +-(nullable id)reverseTransformedValue:(nullable id)value { return [value decimalNumber]; } diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index d34e101a7..b8518ab81 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -29,7 +29,7 @@ -(void)plotAreaBoundsChanged; **/ @implementation CPTGraphHostingView -/** @property CPTGraph *hostedGraph +/** @property nullable CPTGraph *hostedGraph * @brief The CPTGraph hosted inside this view. **/ @synthesize hostedGraph; @@ -41,12 +41,12 @@ @implementation CPTGraphHostingView **/ @synthesize printRect; -/** @property NSCursor *closedHandCursor +/** @property nullable NSCursor *closedHandCursor * @brief The cursor displayed when the user is actively dragging any plot space. **/ @synthesize closedHandCursor; -/** @property NSCursor *openHandCursor +/** @property nullable NSCursor *openHandCursor * @brief The cursor displayed when the mouse pointer is over a plot area mapped to a plot space that allows user interaction, but not actively being dragged. **/ @synthesize openHandCursor; @@ -61,7 +61,7 @@ @implementation CPTGraphHostingView /// @cond --(instancetype)initWithFrame:(NSRect)frame +-(nonnull instancetype)initWithFrame:(NSRect)frame { if ( (self = [super initWithFrame:frame]) ) { hostedGraph = nil; @@ -81,7 +81,7 @@ -(instancetype)initWithFrame:(NSRect)frame return self; } --(CALayer *)makeBackingLayer +-(nonnull CALayer *)makeBackingLayer { return [[CPTLayer alloc] initWithFrame:NSRectToCGRect(self.bounds)]; } @@ -107,7 +107,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -122,7 +122,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // scrollOffset } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { CPTLayer *mainLayer = [[CPTLayer alloc] initWithFrame:NSRectToCGRect(self.frame)]; @@ -202,7 +202,7 @@ -(void)drawRect:(NSRect)dirtyRect /// @cond --(BOOL)knowsPageRange:(NSRangePointer)rangePointer +-(BOOL)knowsPageRange:(nonnull NSRangePointer)rangePointer { rangePointer->location = 1; rangePointer->length = 1; @@ -222,12 +222,12 @@ -(NSRect)rectForPage:(NSInteger)pageNumber /// @cond --(BOOL)acceptsFirstMouse:(NSEvent *)theEvent +-(BOOL)acceptsFirstMouse:(nullable NSEvent *)theEvent { return YES; } --(void)mouseDown:(NSEvent *)theEvent +-(void)mouseDown:(nonnull NSEvent *)theEvent { [super mouseDown:theEvent]; @@ -245,7 +245,7 @@ -(void)mouseDown:(NSEvent *)theEvent } } --(void)mouseDragged:(NSEvent *)theEvent +-(void)mouseDragged:(nonnull NSEvent *)theEvent { CPTGraph *theGraph = self.hostedGraph; BOOL handled = NO; @@ -261,7 +261,7 @@ -(void)mouseDragged:(NSEvent *)theEvent } } --(void)mouseUp:(NSEvent *)theEvent +-(void)mouseUp:(nonnull NSEvent *)theEvent { CPTGraph *theGraph = self.hostedGraph; BOOL handled = NO; @@ -284,7 +284,7 @@ -(void)mouseUp:(NSEvent *)theEvent /// @cond --(void)magnifyWithEvent:(NSEvent *)event +-(void)magnifyWithEvent:(nonnull NSEvent *)event { CPTGraph *theGraph = self.hostedGraph; BOOL handled = NO; @@ -309,7 +309,7 @@ -(void)magnifyWithEvent:(NSEvent *)event } } --(void)scrollWheel:(NSEvent *)theEvent +-(void)scrollWheel:(nonnull NSEvent *)theEvent { CPTGraph *theGraph = self.hostedGraph; BOOL handled = NO; @@ -459,7 +459,7 @@ -(void)resetCursorRects /** @internal * @brief Adds a KVO observer to a new plot space added to the hosted graph. **/ --(void)plotSpaceAdded:(NSNotification *)notification +-(void)plotSpaceAdded:(nonnull NSNotification *)notification { CPTDictionary userInfo = notification.userInfo; CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; @@ -473,7 +473,7 @@ -(void)plotSpaceAdded:(NSNotification *)notification /** @internal * @brief Removes the KVO observer from a plot space removed from the hosted graph. **/ --(void)plotSpaceRemoved:(NSNotification *)notification +-(void)plotSpaceRemoved:(nonnull NSNotification *)notification { CPTDictionary userInfo = notification.userInfo; CPTPlotSpace *space = userInfo[CPTGraphPlotSpaceNotificationKey]; @@ -490,7 +490,7 @@ -(void)plotAreaBoundsChanged [self.window invalidateCursorRectsForView:self]; } --(void)viewWillMoveToSuperview:(NSView *)newSuperview +-(void)viewWillMoveToSuperview:(nullable NSView *)newSuperview { if ( self.superview.wantsLayer != newSuperview.wantsLayer ) { self.wantsLayer = NO; @@ -513,7 +513,7 @@ -(void)viewWillMoveToSuperview:(NSView *)newSuperview /// @cond --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(CPTDictionary)change context:(void *)context +-(void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable CPTDictionary)change context:(nullable void *)context { if ( context == CPTGraphHostingViewKVOContext ) { CPTGraph *theGraph = self.hostedGraph; @@ -566,7 +566,7 @@ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(CP /// @cond --(void)setHostedGraph:(CPTGraph *)newGraph +-(void)setHostedGraph:(nullable CPTGraph *)newGraph { NSParameterAssert( (newGraph == nil) || [newGraph isKindOfClass:[CPTGraph class]] ); @@ -592,21 +592,23 @@ -(void)setHostedGraph:(CPTGraph *)newGraph hostedGraph = newGraph; if ( newGraph ) { + CPTGraph *theGraph = newGraph; + newGraph.hostingView = self; [self viewDidChangeBackingProperties]; - [self.layer addSublayer:newGraph]; + [self.layer addSublayer:theGraph]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plotSpaceAdded:) name:CPTGraphDidAddPlotSpaceNotification - object:newGraph]; + object:theGraph]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plotSpaceRemoved:) name:CPTGraphDidRemovePlotSpaceNotification - object:newGraph]; + object:theGraph]; - [newGraph addObserver:self + [theGraph addObserver:self forKeyPath:@"plotAreaFrame" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial context:CPTGraphHostingViewKVOContext]; @@ -621,7 +623,7 @@ -(void)setHostedGraph:(CPTGraph *)newGraph } } --(void)setClosedHandCursor:(NSCursor *)newCursor +-(void)setClosedHandCursor:(nullable NSCursor *)newCursor { if ( newCursor != closedHandCursor ) { closedHandCursor = newCursor; @@ -630,7 +632,7 @@ -(void)setClosedHandCursor:(NSCursor *)newCursor } } --(void)setOpenHandCursor:(NSCursor *)newCursor +-(void)setOpenHandCursor:(nullable NSCursor *)newCursor { if ( newCursor != openHandCursor ) { openHandCursor = newCursor; diff --git a/framework/MacOnly/CPTImagePlatformSpecific.m b/framework/MacOnly/CPTImagePlatformSpecific.m index dc46739e0..21b1a9ba8 100644 --- a/framework/MacOnly/CPTImagePlatformSpecific.m +++ b/framework/MacOnly/CPTImagePlatformSpecific.m @@ -10,7 +10,7 @@ @implementation CPTImage(CPTPlatformSpecificImageExtensions) * @param anImage The platform-native image. * @return A CPTImage instance initialized with the provided image. **/ --(instancetype)initWithNativeImage:(CPTNativeImage *)anImage +-(nonnull instancetype)initWithNativeImage:(nullable CPTNativeImage *)anImage { if ( (self = [self init]) ) { self.nativeImage = anImage; @@ -28,7 +28,7 @@ -(instancetype)initWithNativeImage:(CPTNativeImage *)anImage * @param path The file system path of the file. * @return A CPTImage instance initialized with the contents of the PNG file. **/ --(instancetype)initForPNGFile:(NSString *)path +-(nonnull instancetype)initForPNGFile:(nonnull NSString *)path { CGFloat imageScale = CPTFloat(1.0); diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index f53be1a3a..91e2efed4 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -9,7 +9,7 @@ @implementation CPTLayer(CPTPlatformSpecificLayerExtensions) /** @brief Gets an image of the layer contents. * @return A native image representation of the layer content. **/ --(CPTNativeImage *)imageOfLayer +-(nonnull CPTNativeImage *)imageOfLayer { CGSize boundsSize = self.bounds.size; @@ -50,7 +50,7 @@ @implementation CPTColor(CPTPlatformSpecificColorExtensions) **/ @dynamic nsColor; --(NSColor *)nsColor +-(nonnull NSColor *)nsColor { return [NSColor colorWithCIColor:[CIColor colorWithCGColor:self.cgColor]]; } @@ -65,7 +65,7 @@ @implementation NSAttributedString(CPTPlatformSpecificAttributedStringExtensions * @param rect The bounding rectangle in which to draw the text. * @param context The graphics context to draw into. **/ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context { CPTPushCGContext(context); diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index 2951f7cdc..abec8af4a 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -12,7 +12,7 @@ /** @brief Pushes the current AppKit graphics context onto a stack and replaces it with the given Core Graphics context. * @param newContext The graphics context. **/ -void CPTPushCGContext(CGContextRef newContext) +void CPTPushCGContext(__nonnull CGContextRef newContext) { dispatch_once(&contextOnceToken, ^{ pushedContexts = [[NSMutableArray alloc] init]; @@ -75,7 +75,7 @@ void CPTPopCGContext(void) * @param nsColor The NSColor. * @return The @ref CGColorRef. **/ -CGColorRef CPTCreateCGColorFromNSColor(NSColor *nsColor) +__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor) { NSColor *rgbColor = [nsColor colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]]; CGFloat r, g, b, a; @@ -91,7 +91,7 @@ CGColorRef CPTCreateCGColorFromNSColor(NSColor *nsColor) * @param nsColor The NSColor. * @return The CPTRGBAColor. **/ -CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *nsColor) +CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor) { CGFloat red, green, blue, alpha; diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index b6ed84fda..a6ba316e0 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -6,7 +6,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary attributes +/** @property nonnull CPTDictionary attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -32,7 +32,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -82,7 +82,7 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes /// @cond --(CPTDictionary)attributes +-(nonnull CPTDictionary)attributes { CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; @@ -125,9 +125,20 @@ -(CPTDictionary)attributes @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtensions) -/// @cond - -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes +/** @brief Creates and returns a new CPTMutableTextStyle instance initialized from a dictionary of text attributes. + * + * The text style will be initalized with values associated with the following keys: + * - #NSFontAttributeName: Sets the @link CPTMutableTextStyle::fontName fontName @endlink + * and @link CPTMutableTextStyle::fontSize fontSize @endlink. + * - #NSForegroundColorAttributeName: Sets the @link CPTMutableTextStyle::color color @endlink. + * - #NSParagraphStyleAttributeName: Sets the @link CPTMutableTextStyle::textAlignment textAlignment @endlink and @link CPTMutableTextStyle::lineBreakMode lineBreakMode @endlink. + * + * Properties associated with missing keys will be inialized to their default values. + * + * @param attributes A dictionary of standard text attributes. + * @return A new CPTMutableTextStyle instance. + **/ ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -172,8 +183,6 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes return newStyle; } -/// @endcond - @end #pragma mark - @@ -187,7 +196,7 @@ @implementation NSString(CPTTextStyleExtensions) * @param style The text style. * @return The size of the text when drawn with the given style. **/ --(CGSize)sizeWithTextStyle:(CPTTextStyle *)style +-(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style { NSFont *theFont = nil; NSString *fontName = style.fontName; @@ -220,7 +229,7 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style * @param style The text style. * @param context The graphics context to draw into. **/ --(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CGContextRef)context +-(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inContext:(nonnull CGContextRef)context { if ( style.color == nil ) { return; diff --git a/framework/Source/CPTAnimation.h b/framework/Source/CPTAnimation.h index 8d3252e23..1802cde6c 100644 --- a/framework/Source/CPTAnimation.h +++ b/framework/Source/CPTAnimation.h @@ -99,7 +99,7 @@ typedef NS_ENUM (NSInteger, CPTAnimationCurve) { /// @name Property Animation /// @{ -+(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nullable CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nonnull CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate; /// @} /// @name Animation Management diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index b1bf9e7d0..1e7fa861a 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -20,19 +20,19 @@ @interface CPTAnimation() @property (nonatomic, readwrite, assign) CGFloat timeOffset; @property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray animationOperations; @property (nonatomic, readwrite, strong, nonnull) CPTMutableAnimationArray runningAnimationOperations; -@property (nonatomic, readwrite) dispatch_source_t timer; -@property (nonatomic, readwrite) dispatch_queue_t animationQueue; +@property (nonatomic, readwrite, nullable) dispatch_source_t timer; +@property (nonatomic, readwrite, nonnull) dispatch_queue_t animationQueue; +(nonnull SEL)setterFromProperty:(nonnull NSString *)property; --(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve; +-(nullable CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve; -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters; -(void)startTimer; -(void)cancelTimer; -(void)update; -dispatch_source_t CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t queue, dispatch_block_t block); +dispatch_source_t __nonnull CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t __nonnull queue, dispatch_block_t __nonnull block); @end /// @endcond @@ -61,20 +61,20 @@ @implementation CPTAnimation @synthesize defaultAnimationCurve; /** @internal - * @property CPTMutableAnimationArray animationOperations + * @property nonnull CPTMutableAnimationArray animationOperations * * @brief The list of animation operations currently running or waiting to run. **/ @synthesize animationOperations; /** @internal - * @property CPTMutableAnimationArray runningAnimationOperations + * @property nonnull CPTMutableAnimationArray runningAnimationOperations * @brief The list of running animation operations. **/ @synthesize runningAnimationOperations; /** @internal - * @property dispatch_source_t timer + * @property nullable dispatch_source_t timer * @brief The animation timer. Each tick of the timer corresponds to one animation frame. **/ @synthesize timer; @@ -82,7 +82,7 @@ @implementation CPTAnimation #pragma mark - Init/Dealloc /** @internal - * @property dispatch_queue_t animationQueue; + * @property nonnull dispatch_queue_t animationQueue; * @brief The serial dispatch queue used to synchronize animation updates. **/ @synthesize animationQueue; @@ -98,7 +98,7 @@ @implementation CPTAnimation * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { animationOperations = [[NSMutableArray alloc] init]; @@ -141,7 +141,7 @@ -(void)dealloc /** @brief A shared CPTAnimation instance responsible for scheduling and executing animations. * @return The shared CPTAnimation instance. **/ -+(instancetype)sharedInstance ++(nonnull instancetype)sharedInstance { static dispatch_once_t once = 0; static CPTAnimation *shared; @@ -163,7 +163,7 @@ +(instancetype)sharedInstance * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property period:(CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nonnull CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationOperation *animationOperation = [[CPTAnimationOperation alloc] initWithAnimationPeriod:period @@ -181,7 +181,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property perio /// @cond -+(SEL)setterFromProperty:(NSString *)property ++(nonnull SEL)setterFromProperty:(nonnull NSString *)property { return NSSelectorFromString([NSString stringWithFormat:@"set%@:", [property stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[[property substringToIndex:1] capitalizedString]]]); @@ -195,7 +195,7 @@ +(SEL)setterFromProperty:(NSString *)property * @param animationOperation The animation operation to add. * @return The queued animation operation. **/ --(CPTAnimationOperation *)addAnimationOperation:(CPTAnimationOperation *)animationOperation +-(CPTAnimationOperation *)addAnimationOperation:(nonnull CPTAnimationOperation *)animationOperation { id boundObject = animationOperation.boundObject; CPTAnimationPeriod *period = animationOperation.period; @@ -215,7 +215,7 @@ -(CPTAnimationOperation *)addAnimationOperation:(CPTAnimationOperation *)animati /** @brief Removes an animation operation from the animation queue. * @param animationOperation The animation operation to remove. **/ --(void)removeAnimationOperation:(CPTAnimationOperation *)animationOperation +-(void)removeAnimationOperation:(nullable CPTAnimationOperation *)animationOperation { if ( animationOperation ) { dispatch_async(self.animationQueue, ^{ @@ -241,7 +241,7 @@ -(void)removeAllAnimationOperations * @param identifier An animation operation identifier. * @return The animation operation with the given identifier or @nil if it was not found. **/ --(CPTAnimationOperation *)operationWithIdentifier:(id)identifier +-(nullable CPTAnimationOperation *)operationWithIdentifier:(nullable id)identifier { for ( CPTAnimationOperation *operation in self.animationOperations ) { if ( [[operation identifier] isEqual:identifier] ) { @@ -364,7 +364,7 @@ -(void)update } // This method must be called from the main thread. --(void)updateOnMainThreadWithParameters:(CPTDictionary)parameters +-(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters { CPTAnimationOperation *animationOperation = parameters[CPTAnimationOperationKey]; @@ -462,7 +462,7 @@ -(void)cancelTimer } } -dispatch_source_t CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t queue, dispatch_block_t block) +dispatch_source_t __nonnull CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t __nonnull queue, dispatch_block_t __nonnull block) { dispatch_source_t newTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); @@ -480,7 +480,7 @@ dispatch_source_t CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t queu /// @cond --(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve +-(nullable CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve)animationCurve { CPTAnimationTimingFunction timingFunction; @@ -627,7 +627,7 @@ -(CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimationCurve) /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ timeOffset: %g; %lu active and %lu running operations>", [super description], diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index f323e4d2e..25b814609 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -6,7 +6,7 @@ **/ @implementation CPTAnimationOperation -/** @property CPTAnimationPeriod *period +/** @property nonnull CPTAnimationPeriod *period * @brief The start value, end value, and duration of this animation operation. **/ @synthesize period; @@ -16,7 +16,7 @@ @implementation CPTAnimationOperation **/ @synthesize animationCurve; -/** @property id boundObject +/** @property nonnull id boundObject * @brief The object to update for each animation frame. **/ @synthesize boundObject; @@ -31,7 +31,7 @@ @implementation CPTAnimationOperation **/ @synthesize boundSetter; -/** @property cpt_weak iddelegate +/** @property nullable cpt_weak iddelegate * @brief The animation delegate. **/ @synthesize delegate; @@ -41,12 +41,12 @@ @implementation CPTAnimationOperation **/ @synthesize canceled; -/** @property id identifier +/** @property nullable id identifier * @brief An object used to identify the animation operation in collections. **/ @synthesize identifier; -/** @property NSDictionary *userInfo +/** @property nullable NSDictionary *userInfo * @brief Application-specific user info that can be attached to the operation. **/ @synthesize userInfo; @@ -96,7 +96,7 @@ -(nonnull instancetype)initWithAnimationPeriod:(nonnull CPTAnimationPeriod *)ani /// @cond --(instancetype)init +-(nonnull instancetype)init { NSAssert(NO, @"Must call -initWithAnimationPeriod:animationCurve:object:getter:setter: to initialize a CPTAnimationOperation."); @@ -114,7 +114,7 @@ -(instancetype)init /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ animate %@ %@ with period %@>", [super description], self.boundObject, NSStringFromSelector(self.boundGetter), self.period]; } diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index 39854e267..5dccc6705 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -13,9 +13,9 @@ /// @cond @interface CPTAnimationPeriod() -+(instancetype)periodWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; ++(nonnull instancetype)periodWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; --(instancetype)initWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; +-(nonnull instancetype)initWithStartValue:(nullable NSValue *)aStartValue endValue:(nullable NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay; @property (nonatomic, readwrite) CGFloat startOffset; @@ -38,14 +38,14 @@ -(instancetype)initWithStartValue:(nullable NSValue *)aStartValue endValue:(null **/ @implementation CPTAnimationPeriod -/** @property NSValue *startValue +/** @property nullable NSValue *startValue * @brief The starting value of the animation. * * If @nil or the encoded value is @NAN, the animation starts from the current value of the animated property. **/ @synthesize startValue; -/** @property NSValue *endValue +/** @property nullable NSValue *endValue * @brief The ending value of the animation. **/ @synthesize endValue; @@ -79,7 +79,7 @@ @implementation CPTAnimationPeriod * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { return [[self alloc] initWithStartValue:aStartValue endValue:anEndValue duration:aDuration withDelay:aDelay]; } @@ -94,7 +94,7 @@ +(instancetype)periodWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)a * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSNumber *start = isnan(aStart) ? nil : @(aStart); @@ -112,7 +112,7 @@ +(instancetype)periodWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFl * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -134,7 +134,7 @@ +(instancetype)periodWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEnd * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -156,7 +156,7 @@ +(instancetype)periodWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -178,7 +178,7 @@ +(instancetype)periodWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSDecimalNumber *start = NSDecimalIsNotANumber(&aStartDecimal) ? nil : [NSDecimalNumber decimalNumberWithDecimal:aStartDecimal]; @@ -196,7 +196,7 @@ +(instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDec * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { CPTPlotRange *startRange = aStartPlotRange; @@ -228,7 +228,7 @@ +(instancetype)periodWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotR * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anEndValue duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { if ( (self = [super init]) ) { startValue = [aStartValue copy]; @@ -251,7 +251,7 @@ -(instancetype)initWithStartValue:(NSValue *)aStartValue endValue:(NSValue *)anE * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSNumber *start = isnan(aStart) ? nil : @(aStart); @@ -271,7 +271,7 @@ -(instancetype)initWithStart:(CGFloat)aStart end:(CGFloat)anEnd duration:(CGFloa * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPoint duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -295,7 +295,7 @@ -(instancetype)initWithStartPoint:(CGPoint)aStartPoint endPoint:(CGPoint)anEndPo * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -319,7 +319,7 @@ -(instancetype)initWithStartSize:(CGSize)aStartSize endSize:(CGSize)anEndSize du * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSValue *start = nil; @@ -343,7 +343,7 @@ -(instancetype)initWithStartRect:(CGRect)aStartRect endRect:(CGRect)anEndRect du * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecimal)anEndDecimal duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { NSDecimalNumber *start = NSDecimalIsNotANumber(&aStartDecimal) ? nil : [NSDecimalNumber decimalNumberWithDecimal:aStartDecimal]; @@ -363,7 +363,7 @@ -(instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal:(NSDecim * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRange:(CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartPlotRange:(nonnull CPTPlotRange *)aStartPlotRange endPlotRange:(nonnull CPTPlotRange *)anEndPlotRange duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { CPTPlotRange *startRange = aStartPlotRange; @@ -384,7 +384,7 @@ -(instancetype)initWithStartPlotRange:(CPTPlotRange *)aStartPlotRange endPlotRan /** @brief Initializes a newly allocated CPTAnimationPeriod object with no start or end values and a @par{duration} and @par{delay} of zero (@num{0}). * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { return [self initWithStartValue:nil endValue:nil duration:CPTFloat(0.0) withDelay:CPTFloat(0.0)]; } @@ -399,7 +399,7 @@ -(instancetype)init * @param boundObject The object to update for each animation frame. * @param boundGetter The getter method for the property to update. **/ --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { [NSException raise:NSGenericException format:@"The -initializeStartValue method must be implemented by CPTAnimationPeriod subclasses."]; @@ -413,7 +413,7 @@ -(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter * @param progress The fraction of the animation progress. * @return The computed value. **/ --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { [NSException raise:NSGenericException format:@"The -tweenedValueForProgress: method must be implemented by CPTAnimationPeriod subclasses."]; @@ -426,7 +426,7 @@ -(NSValue *)tweenedValueForProgress:(CGFloat)progress * @param boundGetter The getter method for the property to update. * @return @YES if the current value of the bound property is between the start and end value. **/ --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { [NSException raise:NSGenericException format:@"The -canStartWithValueFromObject:propertyGetter: method must be implemented by CPTAnimationPeriod subclasses."]; @@ -438,7 +438,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", [super description], self.startValue, self.endValue, (double)self.duration, (double)self.delay]; } @@ -464,7 +464,7 @@ @implementation CPTAnimation(CPTAnimationPeriodAdditions) * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -489,7 +489,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -512,7 +512,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -539,7 +539,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property from: * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -564,7 +564,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -587,7 +587,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -614,7 +614,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -639,7 +639,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -662,7 +662,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -689,7 +689,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromS * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -714,7 +714,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -737,7 +737,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -764,7 +764,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromR * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -789,7 +789,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -812,7 +812,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -839,7 +839,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromD * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to @@ -864,7 +864,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(id)delegate ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to @@ -887,7 +887,7 @@ +(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromP * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(id)object property:(NSString *)property fromPlotRange:(CPTPlotRange *)from toPlotRange:(CPTPlotRange *)to duration:(CGFloat)duration ++(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 1662d9780..2ca0c8231 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -11,12 +11,12 @@ **/ @implementation CPTAnnotation -/** @property CPTLayer *contentLayer +/** @property nullable CPTLayer *contentLayer * @brief The annotation content. **/ @synthesize contentLayer; -/** @property cpt_weak CPTAnnotationHostLayer *annotationHostLayer +/** @property nullable cpt_weak CPTAnnotationHostLayer *annotationHostLayer * @brief The host layer for the annotation content. **/ @synthesize annotationHostLayer; @@ -53,7 +53,7 @@ @implementation CPTAnnotation * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { annotationHostLayer = nil; @@ -72,7 +72,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeConditionalObject:self.annotationHostLayer forKey:@"CPTAnnotation.annotationHostLayer"]; [coder encodeObject:self.contentLayer forKey:@"CPTAnnotation.contentLayer"]; @@ -81,7 +81,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeCGFloat:self.rotation forKey:@"CPTAnnotation.rotation"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { annotationHostLayer = [coder decodeObjectForKey:@"CPTAnnotation.annotationHostLayer"]; @@ -100,7 +100,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; } @@ -112,19 +112,21 @@ -(NSString *)description /// @cond --(void)setContentLayer:(CPTLayer *)newLayer +-(void)setContentLayer:(nullable CPTLayer *)newLayer { if ( newLayer != contentLayer ) { [contentLayer removeFromSuperlayer]; contentLayer = newLayer; if ( newLayer ) { + CPTLayer *layer = newLayer; + CPTAnnotationHostLayer *hostLayer = self.annotationHostLayer; - [hostLayer addSublayer:newLayer]; + [hostLayer addSublayer:layer]; } } } --(void)setAnnotationHostLayer:(CPTAnnotationHostLayer *)newLayer +-(void)setAnnotationHostLayer:(nullable CPTAnnotationHostLayer *)newLayer { if ( newLayer != annotationHostLayer ) { CPTLayer *myContent = self.contentLayer; diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index cbee41637..2455e96a5 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -20,7 +20,7 @@ @interface CPTAnnotationHostLayer() **/ @implementation CPTAnnotationHostLayer -/** @property CPTAnnotationArray annotations +/** @property nonnull CPTAnnotationArray annotations * @brief An array of annotations attached to this layer. **/ @dynamic annotations; @@ -41,7 +41,7 @@ @implementation CPTAnnotationHostLayer * @param newFrame The frame rectangle. * @return The initialized CPTAnnotationHostLayer object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { mutableAnnotations = [[NSMutableArray alloc] init]; @@ -53,7 +53,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTAnnotationHostLayer *theLayer = (CPTAnnotationHostLayer *)layer; @@ -70,14 +70,14 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:self.mutableAnnotations forKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { CPTAnnotationArray annotations = [coder decodeObjectForKey:@"CPTAnnotationHostLayer.mutableAnnotations"]; @@ -96,38 +96,46 @@ -(instancetype)initWithCoder:(NSCoder *)coder #pragma mark - #pragma mark Annotations --(CPTAnnotationArray)annotations +/// @cond + +-(nonnull CPTAnnotationArray)annotations { return [self.mutableAnnotations copy]; } +/// @endcond + /** * @brief Adds an annotation to the receiver. **/ --(void)addAnnotation:(CPTAnnotation *)annotation +-(void)addAnnotation:(nullable CPTAnnotation *)annotation { if ( annotation ) { + CPTAnnotation *theAnnotation = annotation; + CPTMutableAnnotationArray annotationArray = self.mutableAnnotations; - if ( ![annotationArray containsObject:annotation] ) { - [annotationArray addObject:annotation]; + if ( ![annotationArray containsObject:theAnnotation] ) { + [annotationArray addObject:theAnnotation]; } - annotation.annotationHostLayer = self; - [annotation positionContentLayer]; + theAnnotation.annotationHostLayer = self; + [theAnnotation positionContentLayer]; } } /** * @brief Removes an annotation from the receiver. **/ --(void)removeAnnotation:(CPTAnnotation *)annotation +-(void)removeAnnotation:(nullable CPTAnnotation *)annotation { if ( annotation ) { - if ( [self.mutableAnnotations containsObject:annotation] ) { - annotation.annotationHostLayer = nil; - [self.mutableAnnotations removeObject:annotation]; + CPTAnnotation *theAnnotation = annotation; + + if ( [self.mutableAnnotations containsObject:theAnnotation] ) { + theAnnotation.annotationHostLayer = nil; + [self.mutableAnnotations removeObject:theAnnotation]; } else { - CPTAnnotationHostLayer *hostLayer = annotation.annotationHostLayer; + CPTAnnotationHostLayer *hostLayer = theAnnotation.annotationHostLayer; [NSException raise:CPTException format:@"Tried to remove CPTAnnotation from %@. Host layer was %@.", self, hostLayer]; } } @@ -151,7 +159,7 @@ -(void)removeAllAnnotations /// @cond --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout { CPTMutableAnnotationArray annotations = self.mutableAnnotations; @@ -204,7 +212,7 @@ -(void)layoutSublayers * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { for ( CPTAnnotation *annotation in self.annotations ) { CPTLayer *content = annotation.contentLayer; @@ -235,7 +243,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { for ( CPTAnnotation *annotation in self.annotations ) { CPTLayer *content = annotation.contentLayer; @@ -266,7 +274,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { for ( CPTAnnotation *annotation in self.annotations ) { CPTLayer *content = annotation.contentLayer; @@ -297,7 +305,7 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter * @param event The OS event. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event { for ( CPTAnnotation *annotation in self.annotations ) { CPTLayer *content = annotation.contentLayer; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index b15f915b7..338c17837 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -200,7 +200,7 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; /// @{ @property (nonatomic, readwrite, copy, nullable) CPTLineStyle *axisLineStyle; @property (nonatomic, readwrite, assign) CPTCoordinate coordinate; -@property (nonatomic, readwrite, strong, nullable) NSNumber *labelingOrigin; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *labelingOrigin; @property (nonatomic, readwrite, assign) CPTSign tickDirection; @property (nonatomic, readwrite, copy, nullable) CPTPlotRange *visibleRange; @property (nonatomic, readwrite, copy, nullable) CPTPlotRange *visibleAxisRange; diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 794c07d57..22f06dd64 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -73,7 +73,7 @@ @implementation CPTAxis // Axis -/** @property CPTLineStyle *axisLineStyle +/** @property nullable CPTLineStyle *axisLineStyle * @brief The line style for the axis line. * If @nil, the line is not drawn. **/ @@ -84,7 +84,7 @@ @implementation CPTAxis **/ @synthesize coordinate; -/** @property NSNumber *labelingOrigin +/** @property nonnull NSNumber *labelingOrigin * @brief The origin used for axis labels. * The default value is @num{0}. It is only used when the axis labeling * policy is #CPTAxisLabelingPolicyFixedInterval. The origin is @@ -101,7 +101,7 @@ @implementation CPTAxis **/ @synthesize tickDirection; -/** @property CPTPlotRange *visibleRange +/** @property nullable CPTPlotRange *visibleRange * @brief The plot range over which the axis and ticks are visible. * Use this to restrict an axis and its grid lines to less than the full plot area width. * Use the @ref visibleAxisRange to specify a separate range for the axis line, if needed. @@ -109,7 +109,7 @@ @implementation CPTAxis **/ @synthesize visibleRange; -/** @property CPTPlotRange *visibleAxisRange; +/** @property nullable CPTPlotRange *visibleAxisRange; * @brief The plot range over which the axis itself is visible. * Use this to restrict an axis line to less than the full plot area width. This range is independent * of the @ref visibleRange and overrides it for the axis line and line cap. @@ -117,13 +117,13 @@ @implementation CPTAxis **/ @synthesize visibleAxisRange; -/** @property CPTLineCap *axisLineCapMin +/** @property nullable CPTLineCap *axisLineCapMin * @brief The line cap for the end of the axis line with the minimum value. * @see axisLineCapMax **/ @synthesize axisLineCapMin; -/** @property CPTLineCap *axisLineCapMax +/** @property nullable CPTLineCap *axisLineCapMax * @brief The line cap for the end of the axis line with the maximum value. * @see axisLineCapMin **/ @@ -131,14 +131,14 @@ @implementation CPTAxis // Title -/** @property CPTTextStyle *titleTextStyle +/** @property nullable CPTTextStyle *titleTextStyle * @brief The text style used to draw the axis title text. * * Assigning a new value to this property also sets the value of the @ref attributedTitle property to @nil. **/ @synthesize titleTextStyle; -/** @property CPTAxisTitle *axisTitle +/** @property nullable CPTAxisTitle *axisTitle * @brief The axis title. * If @nil, no title is drawn. **/ @@ -150,14 +150,14 @@ @implementation CPTAxis **/ @synthesize titleOffset; -/** @property NSString *title +/** @property nullable NSString *title * @brief A convenience property for setting the text title of the axis. * * Assigning a new value to this property also sets the value of the @ref attributedTitle property to @nil. **/ @synthesize title; -/** @property NSAttributedString *attributedTitle +/** @property nullable NSAttributedString *attributedTitle * @brief A convenience property for setting the styled text title of the axis. * * Assigning a new value to this property also sets the value of the @ref title property to the @@ -183,13 +183,13 @@ @implementation CPTAxis **/ @synthesize titleDirection; -/** @property NSNumber *titleLocation +/** @property nullable NSNumber *titleLocation * @brief The position along the axis where the axis title should be centered. * If @NAN (the default), the @ref defaultTitleLocation will be used. **/ @synthesize titleLocation; -/** @property NSNumber *defaultTitleLocation +/** @property nonnull NSNumber *defaultTitleLocation * @brief The position along the axis where the axis title should be centered * if @ref titleLocation is @NAN. **/ @@ -197,7 +197,7 @@ @implementation CPTAxis // Plot space -/** @property CPTPlotSpace *plotSpace +/** @property nullable CPTPlotSpace *plotSpace * @brief The plot space for the axis. **/ @synthesize plotSpace; @@ -245,12 +245,12 @@ @implementation CPTAxis **/ @synthesize minorTickLabelAlignment; -/** @property CPTTextStyle *labelTextStyle +/** @property nullable CPTTextStyle *labelTextStyle * @brief The text style used to draw the label text. **/ @synthesize labelTextStyle; -/** @property CPTTextStyle *minorTickLabelTextStyle +/** @property nullable CPTTextStyle *minorTickLabelTextStyle * @brief The text style used to draw the label text of minor tick labels. **/ @synthesize minorTickLabelTextStyle; @@ -273,7 +273,7 @@ @implementation CPTAxis **/ @synthesize minorTickLabelDirection; -/** @property NSFormatter *labelFormatter +/** @property nullable NSFormatter *labelFormatter * @brief The number formatter used to format the label text. * If you need a non-numerical label, such as a date, you can use a formatter than turns * the numerical plot coordinate into a string (e.g., @quote{Jan 10, 2010}). @@ -281,7 +281,7 @@ @implementation CPTAxis **/ @synthesize labelFormatter; -/** @property NSFormatter *minorTickLabelFormatter +/** @property nullable NSFormatter *minorTickLabelFormatter * @brief The number formatter used to format the label text of minor ticks. * If you need a non-numerical label, such as a date, you can use a formatter than turns * the numerical plot coordinate into a string (e.g., @quote{Jan 10, 2010}). @@ -293,12 +293,12 @@ @implementation CPTAxis @synthesize minorLabelFormatterChanged; @dynamic tickOffset; -/** @property CPTAxisLabelSet axisLabels +/** @property nullable CPTAxisLabelSet axisLabels * @brief The set of axis labels. **/ @synthesize axisLabels; -/** @property CPTAxisLabelSet minorTickAxisLabels +/** @property nullable CPTAxisLabelSet minorTickAxisLabels * @brief The set of minor tick axis labels. **/ @synthesize minorTickAxisLabels; @@ -308,29 +308,29 @@ @implementation CPTAxis **/ @synthesize needsRelabel; -/** @property CPTPlotRangeArray labelExclusionRanges +/** @property nullable CPTPlotRangeArray labelExclusionRanges * @brief An array of CPTPlotRange objects. Any tick marks and labels falling inside any of the ranges in the array will not be drawn. **/ @synthesize labelExclusionRanges; -/** @property CPTShadow *labelShadow +/** @property nullable CPTShadow *labelShadow * @brief The shadow applied to each axis label. **/ @synthesize labelShadow; -/** @property CPTShadow *minorTickLabelShadow +/** @property nullable CPTShadow *minorTickLabelShadow * @brief The shadow applied to each minor tick axis label. **/ @synthesize minorTickLabelShadow; // Major ticks -/** @property NSNumber *majorIntervalLength +/** @property nullable NSNumber *majorIntervalLength * @brief The distance between major tick marks expressed in data coordinates. **/ @synthesize majorIntervalLength; -/** @property CPTLineStyle *majorTickLineStyle +/** @property nullable CPTLineStyle *majorTickLineStyle * @brief The line style for the major tick marks. * If @nil, the major ticks are not drawn. **/ @@ -341,7 +341,7 @@ @implementation CPTAxis **/ @synthesize majorTickLength; -/** @property CPTNumberSet majorTickLocations +/** @property nullable CPTNumberSet majorTickLocations * @brief A set of axis coordinates for all major tick marks. **/ @synthesize majorTickLocations; @@ -361,7 +361,7 @@ @implementation CPTAxis **/ @synthesize minorTicksPerInterval; -/** @property CPTLineStyle *minorTickLineStyle +/** @property nullable CPTLineStyle *minorTickLineStyle * @brief The line style for the minor tick marks. * If @nil, the minor ticks are not drawn. **/ @@ -372,26 +372,26 @@ @implementation CPTAxis **/ @synthesize minorTickLength; -/** @property CPTNumberSet minorTickLocations +/** @property nullable CPTNumberSet minorTickLocations * @brief A set of axis coordinates for all minor tick marks. **/ @synthesize minorTickLocations; // Grid Lines -/** @property CPTLineStyle *majorGridLineStyle +/** @property nullable CPTLineStyle *majorGridLineStyle * @brief The line style for the major grid lines. * If @nil, the major grid lines are not drawn. **/ @synthesize majorGridLineStyle; -/** @property CPTLineStyle *minorGridLineStyle +/** @property nullable CPTLineStyle *minorGridLineStyle * @brief The line style for the minor grid lines. * If @nil, the minor grid lines are not drawn. **/ @synthesize minorGridLineStyle; -/** @property CPTPlotRange *CPTPlotRange *gridLinesRange +/** @property nullable CPTPlotRange *CPTPlotRange *gridLinesRange * @brief The plot range over which the grid lines are visible. * Note that this range applies to the orthogonal coordinate, not * the axis coordinate itself. @@ -401,7 +401,7 @@ @implementation CPTAxis // Background Bands -/** @property CPTFillArray alternatingBandFills +/** @property nullable CPTFillArray alternatingBandFills * @brief An array of two or more fills to be drawn between successive major tick marks. * * When initializing the fills, provide an NSArray containing any combination of CPTFill, @@ -410,7 +410,7 @@ @implementation CPTAxis **/ @synthesize alternatingBandFills; -/** @property CPTLimitBandArray backgroundLimitBands +/** @property nullable CPTLimitBandArray backgroundLimitBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn on top of the alternating band fills. @@ -429,34 +429,34 @@ @implementation CPTAxis **/ @synthesize separateLayers; -/** @property cpt_weak CPTPlotArea *plotArea +/** @property nullable cpt_weak CPTPlotArea *plotArea * @brief The plot area that the axis belongs to. **/ @synthesize plotArea; -/** @property cpt_weak CPTGridLines *minorGridLines +/** @property nullable cpt_weak CPTGridLines *minorGridLines * @brief The layer that draws the minor grid lines. **/ @synthesize minorGridLines; -/** @property cpt_weak CPTGridLines *majorGridLines +/** @property nullable cpt_weak CPTGridLines *majorGridLines * @brief The layer that draws the major grid lines. **/ @synthesize majorGridLines; -/** @property CPTAxisSet *axisSet +/** @property nullable CPTAxisSet *axisSet * @brief The axis set that the axis belongs to. **/ @dynamic axisSet; /** @internal - * @property cpt_weak CPTAxisLabel *pointingDeviceDownLabel + * @property nullable cpt_weak CPTAxisLabel *pointingDeviceDownLabel * @brief The label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownLabel; /** @internal - * @property cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel + * @property nullable cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel * @brief The tick label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownTickLabel; @@ -528,7 +528,7 @@ @implementation CPTAxis * @param newFrame The frame rectangle. * @return The initialized CPTAxis object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { plotSpace = nil; @@ -606,7 +606,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTAxis *theLayer = (CPTAxis *)layer; @@ -691,7 +691,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -759,31 +759,32 @@ -(void)encodeWithCoder:(NSCoder *)coder // labelsUpdated } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - coordinate = (CPTCoordinate)[coder decodeIntegerForKey:@"CPTAxis.coordinate"]; - plotSpace = [coder decodeObjectForKey:@"CPTAxis.plotSpace"]; - majorTickLocations = [coder decodeObjectForKey:@"CPTAxis.majorTickLocations"]; - minorTickLocations = [coder decodeObjectForKey:@"CPTAxis.minorTickLocations"]; - majorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.majorTickLength"]; - minorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLength"]; - labelOffset = [coder decodeCGFloatForKey:@"CPTAxis.labelOffset"]; - minorTickLabelOffset = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelOffset"]; - labelRotation = [coder decodeCGFloatForKey:@"CPTAxis.labelRotation"]; - minorTickLabelRotation = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelRotation"]; - labelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.labelAlignment"]; - minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelAlignment"]; - axisLineStyle = [[coder decodeObjectForKey:@"CPTAxis.axisLineStyle"] copy]; - majorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorTickLineStyle"] copy]; - minorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLineStyle"] copy]; - tickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.tickLabelDirection"]; - minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelDirection"]; - majorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorGridLineStyle"] copy]; - minorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorGridLineStyle"] copy]; - axisLineCapMin = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMin"] copy]; - axisLineCapMax = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMax"] copy]; - labelingOrigin = [coder decodeObjectForKey:@"CPTAxis.labelingOrigin"]; + coordinate = (CPTCoordinate)[coder decodeIntegerForKey:@"CPTAxis.coordinate"]; + plotSpace = [coder decodeObjectForKey:@"CPTAxis.plotSpace"]; + majorTickLocations = [coder decodeObjectForKey:@"CPTAxis.majorTickLocations"]; + minorTickLocations = [coder decodeObjectForKey:@"CPTAxis.minorTickLocations"]; + majorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.majorTickLength"]; + minorTickLength = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLength"]; + labelOffset = [coder decodeCGFloatForKey:@"CPTAxis.labelOffset"]; + minorTickLabelOffset = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelOffset"]; + labelRotation = [coder decodeCGFloatForKey:@"CPTAxis.labelRotation"]; + minorTickLabelRotation = [coder decodeCGFloatForKey:@"CPTAxis.minorTickLabelRotation"]; + labelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.labelAlignment"]; + minorTickLabelAlignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelAlignment"]; + axisLineStyle = [[coder decodeObjectForKey:@"CPTAxis.axisLineStyle"] copy]; + majorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorTickLineStyle"] copy]; + minorTickLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorTickLineStyle"] copy]; + tickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.tickLabelDirection"]; + minorTickLabelDirection = (CPTSign)[coder decodeIntegerForKey:@"CPTAxis.minorTickLabelDirection"]; + majorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.majorGridLineStyle"] copy]; + minorGridLineStyle = [[coder decodeObjectForKey:@"CPTAxis.minorGridLineStyle"] copy]; + axisLineCapMin = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMin"] copy]; + axisLineCapMax = [[coder decodeObjectForKey:@"CPTAxis.axisLineCapMax"] copy]; + NSNumber *origin = [coder decodeObjectForKey:@"CPTAxis.labelingOrigin"]; + labelingOrigin = origin ? origin : @0.0; majorIntervalLength = [coder decodeObjectForKey:@"CPTAxis.majorIntervalLength"]; minorTicksPerInterval = (NSUInteger)[coder decodeIntegerForKey:@"CPTAxis.minorTicksPerInterval"]; preferredNumberOfMajorTicks = (NSUInteger)[coder decodeIntegerForKey:@"CPTAxis.preferredNumberOfMajorTicks"]; @@ -835,7 +836,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -1404,7 +1405,7 @@ NSDecimal CPTNiceLength(NSDecimal length) * @param allLocations A set of tick locations. * @return The filtered set of tick locations. */ --(CPTNumberSet)filteredTickLocations:(CPTNumberSet)allLocations +-(nullable CPTNumberSet)filteredTickLocations:(nullable CPTNumberSet)allLocations { CPTPlotRangeArray exclusionRanges = self.labelExclusionRanges; @@ -1430,7 +1431,7 @@ -(CPTNumberSet)filteredTickLocations:(CPTNumberSet)allLocations * @param allLocations A set of major tick locations. * @return The filtered set. **/ --(CPTNumberSet)filteredMajorTickLocations:(CPTNumberSet)allLocations +-(nullable CPTNumberSet)filteredMajorTickLocations:(nullable CPTNumberSet)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1439,7 +1440,7 @@ -(CPTNumberSet)filteredMajorTickLocations:(CPTNumberSet)allLocations * @param allLocations A set of minor tick locations. * @return The filtered set. **/ --(CPTNumberSet)filteredMinorTickLocations:(CPTNumberSet)allLocations +-(nullable CPTNumberSet)filteredMinorTickLocations:(nullable CPTNumberSet)allLocations { return [self filteredTickLocations:allLocations]; } @@ -1475,7 +1476,7 @@ -(CGFloat)tickOffset * @param labeledRange A plot range used to filter the generated labels. If @nil, no filtering is done. * @param useMajorAxisLabels If @YES, label the major ticks, otherwise label the minor ticks. **/ --(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels +-(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet)locations inRange:(nullable CPTPlotRange *)labeledRange useMajorAxisLabels:(BOOL)useMajorAxisLabels { CPTAlignment theLabelAlignment; CPTSign theLabelDirection; @@ -1489,10 +1490,13 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange id theDelegate = self.delegate; if ( useMajorAxisLabels ) { - if ( [theDelegate respondsToSelector:@selector(axis:shouldUpdateAxisLabelsAtLocations:)] ) { - BOOL shouldContinue = [theDelegate axis:self shouldUpdateAxisLabelsAtLocations:locations]; - if ( !shouldContinue ) { - return; + if ( locations.count > 0 ) { + if ( [theDelegate respondsToSelector:@selector(axis:shouldUpdateAxisLabelsAtLocations:)] ) { + CPTNumberSet locationSet = locations; + BOOL shouldContinue = [theDelegate axis:self shouldUpdateAxisLabelsAtLocations:locationSet]; + if ( !shouldContinue ) { + return; + } } } theLabelAlignment = self.labelAlignment; @@ -1505,10 +1509,13 @@ -(void)updateAxisLabelsAtLocations:(CPTNumberSet)locations inRange:(CPTPlotRange theShadow = self.labelShadow; } else { - if ( [theDelegate respondsToSelector:@selector(axis:shouldUpdateMinorAxisLabelsAtLocations:)] ) { - BOOL shouldContinue = [theDelegate axis:self shouldUpdateMinorAxisLabelsAtLocations:locations]; - if ( !shouldContinue ) { - return; + if ( locations.count > 0 ) { + if ( [theDelegate respondsToSelector:@selector(axis:shouldUpdateMinorAxisLabelsAtLocations:)] ) { + CPTNumberSet locationSet = locations; + BOOL shouldContinue = [theDelegate axis:self shouldUpdateMinorAxisLabelsAtLocations:locationSet]; + if ( !shouldContinue ) { + return; + } } } theLabelAlignment = self.minorTickLabelAlignment; @@ -1874,7 +1881,7 @@ -(void)updateMinorTickLabels #pragma mark - #pragma mark Titles --(NSNumber *)defaultTitleLocation +-(nonnull NSNumber *)defaultTitleLocation { return @(NAN); } @@ -1927,14 +1934,15 @@ -(void)layoutSublayers /** @brief Add a background limit band. * @param limitBand The new limit band. **/ --(void)addBackgroundLimitBand:(CPTLimitBand *)limitBand +-(void)addBackgroundLimitBand:(nullable CPTLimitBand *)limitBand { if ( limitBand ) { if ( !self.mutableBackgroundLimitBands ) { self.mutableBackgroundLimitBands = [NSMutableArray array]; } - [self.mutableBackgroundLimitBands addObject:limitBand]; + CPTLimitBand *band = limitBand; + [self.mutableBackgroundLimitBands addObject:band]; CPTPlotArea *thePlotArea = self.plotArea; [thePlotArea setNeedsDisplay]; @@ -1944,10 +1952,11 @@ -(void)addBackgroundLimitBand:(CPTLimitBand *)limitBand /** @brief Remove a background limit band. * @param limitBand The limit band to be removed. **/ --(void)removeBackgroundLimitBand:(CPTLimitBand *)limitBand +-(void)removeBackgroundLimitBand:(nullable CPTLimitBand *)limitBand { if ( limitBand ) { - [self.mutableBackgroundLimitBands removeObject:limitBand]; + CPTLimitBand *band = limitBand; + [self.mutableBackgroundLimitBands removeObject:band]; CPTPlotArea *thePlotArea = self.plotArea; [thePlotArea setNeedsDisplay]; @@ -1994,7 +2003,7 @@ -(void)removeAllBackgroundLimitBands * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; @@ -2099,7 +2108,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTAxisLabel *selectedDownLabel = self.pointingDeviceDownLabel; CPTAxisLabel *selectedDownTickLabel = self.pointingDeviceDownTickLabel; @@ -2211,7 +2220,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxisLabels:(CPTAxisLabelSet)newLabels +-(void)setAxisLabels:(nullable CPTAxisLabelSet)newLabels { if ( newLabels != axisLabels ) { if ( self.labelsUpdated ) { @@ -2251,7 +2260,7 @@ -(void)setAxisLabels:(CPTAxisLabelSet)newLabels } } --(void)setMinorTickAxisLabels:(CPTAxisLabelSet)newLabels +-(void)setMinorTickAxisLabels:(nullable CPTAxisLabelSet)newLabels { if ( newLabels != minorTickAxisLabels ) { if ( self.labelsUpdated ) { @@ -2291,9 +2300,9 @@ -(void)setMinorTickAxisLabels:(CPTAxisLabelSet)newLabels } } --(void)setLabelTextStyle:(CPTTextStyle *)newStyle +-(void)setLabelTextStyle:(nullable CPTTextStyle *)newStyle { - if ( newStyle != labelTextStyle ) { + if ( labelTextStyle != newStyle ) { labelTextStyle = [newStyle copy]; Class textLayerClass = [CPTTextLayer class]; @@ -2308,9 +2317,9 @@ -(void)setLabelTextStyle:(CPTTextStyle *)newStyle } } --(void)setMinorTickLabelTextStyle:(CPTTextStyle *)newStyle +-(void)setMinorTickLabelTextStyle:(nullable CPTTextStyle *)newStyle { - if ( newStyle != minorTickLabelTextStyle ) { + if ( minorTickLabelTextStyle != newStyle ) { minorTickLabelTextStyle = [newStyle copy]; Class textLayerClass = [CPTTextLayer class]; @@ -2325,7 +2334,7 @@ -(void)setMinorTickLabelTextStyle:(CPTTextStyle *)newStyle } } --(void)setAxisTitle:(CPTAxisTitle *)newTitle +-(void)setAxisTitle:(nullable CPTAxisTitle *)newTitle { if ( newTitle != axisTitle ) { [axisTitle.contentLayer removeFromSuperlayer]; @@ -2345,7 +2354,7 @@ -(void)setAxisTitle:(CPTAxisTitle *)newTitle } } --(CPTAxisTitle *)axisTitle +-(nullable CPTAxisTitle *)axisTitle { if ( !axisTitle ) { CPTAxisTitle *newTitle = nil; @@ -2366,7 +2375,7 @@ -(CPTAxisTitle *)axisTitle return axisTitle; } --(void)setTitleTextStyle:(CPTTextStyle *)newStyle +-(void)setTitleTextStyle:(nullable CPTTextStyle *)newStyle { if ( newStyle != titleTextStyle ) { titleTextStyle = [newStyle copy]; @@ -2414,7 +2423,7 @@ -(void)setTitleDirection:(CPTSign)newDirection } } --(void)setTitle:(NSString *)newTitle +-(void)setTitle:(nullable NSString *)newTitle { if ( newTitle != title ) { title = [newTitle copy]; @@ -2438,7 +2447,7 @@ -(void)setTitle:(NSString *)newTitle } } --(void)setAttributedTitle:(NSAttributedString *)newTitle +-(void)setAttributedTitle:(nullable NSAttributedString *)newTitle { if ( newTitle != attributedTitle ) { attributedTitle = [newTitle copy]; @@ -2469,12 +2478,13 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle } } --(void)setTitleLocation:(NSNumber *)newLocation +-(void)setTitleLocation:(nullable NSNumber *)newLocation { BOOL needsUpdate = YES; if ( newLocation ) { - needsUpdate = ![titleLocation isEqualToNumber:newLocation]; + NSNumber *location = newLocation; + needsUpdate = ![titleLocation isEqualToNumber:location]; } if ( needsUpdate ) { @@ -2483,7 +2493,7 @@ -(void)setTitleLocation:(NSNumber *)newLocation } } --(NSNumber *)titleLocation +-(nullable NSNumber *)titleLocation { if ( isnan(titleLocation.doubleValue) ) { return self.defaultTitleLocation; @@ -2493,7 +2503,7 @@ -(NSNumber *)titleLocation } } --(void)setLabelExclusionRanges:(CPTPlotRangeArray)ranges +-(void)setLabelExclusionRanges:(nullable CPTPlotRangeArray)ranges { if ( ranges != labelExclusionRanges ) { labelExclusionRanges = ranges; @@ -2523,7 +2533,7 @@ -(void)setNeedsRelabel:(BOOL)newNeedsRelabel } } --(void)setMajorTickLocations:(CPTNumberSet)newLocations +-(void)setMajorTickLocations:(nullable CPTNumberSet)newLocations { if ( newLocations != majorTickLocations ) { majorTickLocations = newLocations; @@ -2540,7 +2550,7 @@ -(void)setMajorTickLocations:(CPTNumberSet)newLocations } } --(void)setMinorTickLocations:(CPTNumberSet)newLocations +-(void)setMinorTickLocations:(nullable CPTNumberSet)newLocations { if ( newLocations != minorTickLocations ) { minorTickLocations = newLocations; @@ -2637,7 +2647,7 @@ -(void)setMinorTickLabelAlignment:(CPTAlignment)newAlignment } } --(void)setLabelShadow:(CPTShadow *)newLabelShadow +-(void)setLabelShadow:(nullable CPTShadow *)newLabelShadow { if ( newLabelShadow != labelShadow ) { labelShadow = newLabelShadow; @@ -2648,7 +2658,7 @@ -(void)setLabelShadow:(CPTShadow *)newLabelShadow } } --(void)setMinorTickLabelShadow:(CPTShadow *)newLabelShadow +-(void)setMinorTickLabelShadow:(nullable CPTShadow *)newLabelShadow { if ( newLabelShadow != minorTickLabelShadow ) { minorTickLabelShadow = newLabelShadow; @@ -2659,7 +2669,7 @@ -(void)setMinorTickLabelShadow:(CPTShadow *)newLabelShadow } } --(void)setPlotSpace:(CPTPlotSpace *)newSpace +-(void)setPlotSpace:(nullable CPTPlotSpace *)newSpace { if ( newSpace != plotSpace ) { plotSpace = newSpace; @@ -2675,7 +2685,7 @@ -(void)setCoordinate:(CPTCoordinate)newCoordinate } } --(void)setAxisLineStyle:(CPTLineStyle *)newLineStyle +-(void)setAxisLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != axisLineStyle ) { axisLineStyle = [newLineStyle copy]; @@ -2683,7 +2693,7 @@ -(void)setAxisLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setMajorTickLineStyle:(CPTLineStyle *)newLineStyle +-(void)setMajorTickLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != majorTickLineStyle ) { majorTickLineStyle = [newLineStyle copy]; @@ -2691,7 +2701,7 @@ -(void)setMajorTickLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setMinorTickLineStyle:(CPTLineStyle *)newLineStyle +-(void)setMinorTickLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != minorTickLineStyle ) { minorTickLineStyle = [newLineStyle copy]; @@ -2699,7 +2709,7 @@ -(void)setMinorTickLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setMajorGridLineStyle:(CPTLineStyle *)newLineStyle +-(void)setMajorGridLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != majorGridLineStyle ) { majorGridLineStyle = [newLineStyle copy]; @@ -2729,7 +2739,7 @@ -(void)setMajorGridLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setMinorGridLineStyle:(CPTLineStyle *)newLineStyle +-(void)setMinorGridLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != minorGridLineStyle ) { minorGridLineStyle = [newLineStyle copy]; @@ -2759,7 +2769,7 @@ -(void)setMinorGridLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setAxisLineCapMin:(CPTLineCap *)newAxisLineCapMin +-(void)setAxisLineCapMin:(nullable CPTLineCap *)newAxisLineCapMin { if ( newAxisLineCapMin != axisLineCapMin ) { axisLineCapMin = [newAxisLineCapMin copy]; @@ -2767,7 +2777,7 @@ -(void)setAxisLineCapMin:(CPTLineCap *)newAxisLineCapMin } } --(void)setAxisLineCapMax:(CPTLineCap *)newAxisLineCapMax +-(void)setAxisLineCapMax:(nullable CPTLineCap *)newAxisLineCapMax { if ( newAxisLineCapMax != axisLineCapMax ) { axisLineCapMax = [newAxisLineCapMax copy]; @@ -2775,7 +2785,7 @@ -(void)setAxisLineCapMax:(CPTLineCap *)newAxisLineCapMax } } --(void)setLabelingOrigin:(NSNumber *)newLabelingOrigin +-(void)setLabelingOrigin:(nonnull NSNumber *)newLabelingOrigin { BOOL needsUpdate = YES; @@ -2790,12 +2800,13 @@ -(void)setLabelingOrigin:(NSNumber *)newLabelingOrigin } } --(void)setMajorIntervalLength:(NSNumber *)newIntervalLength +-(void)setMajorIntervalLength:(nullable NSNumber *)newIntervalLength { BOOL needsUpdate = YES; if ( newIntervalLength ) { - needsUpdate = ![majorIntervalLength isEqualToNumber:newIntervalLength]; + NSNumber *interval = newIntervalLength; + needsUpdate = ![majorIntervalLength isEqualToNumber:interval]; } if ( needsUpdate ) { @@ -2832,7 +2843,7 @@ -(void)setPreferredNumberOfMajorTicks:(NSUInteger)newPreferredNumberOfMajorTicks } } --(void)setLabelFormatter:(NSFormatter *)newTickLabelFormatter +-(void)setLabelFormatter:(nullable NSFormatter *)newTickLabelFormatter { if ( newTickLabelFormatter != labelFormatter ) { labelFormatter = newTickLabelFormatter; @@ -2842,7 +2853,7 @@ -(void)setLabelFormatter:(NSFormatter *)newTickLabelFormatter } } --(void)setMinorTickLabelFormatter:(NSFormatter *)newMinorTickLabelFormatter +-(void)setMinorTickLabelFormatter:(nullable NSFormatter *)newMinorTickLabelFormatter { if ( newMinorTickLabelFormatter != minorTickLabelFormatter ) { minorTickLabelFormatter = newMinorTickLabelFormatter; @@ -2886,9 +2897,9 @@ -(void)setMinorTickLabelDirection:(CPTSign)newDirection } } --(void)setGridLinesRange:(CPTPlotRange *)newRange +-(void)setGridLinesRange:(nullable CPTPlotRange *)newRange { - if ( newRange != gridLinesRange ) { + if ( gridLinesRange != newRange ) { gridLinesRange = [newRange copy]; if ( self.separateLayers ) { CPTGridLines *gridlines = self.majorGridLines; @@ -2905,7 +2916,7 @@ -(void)setGridLinesRange:(CPTPlotRange *)newRange } } --(void)setPlotArea:(CPTPlotArea *)newPlotArea +-(void)setPlotArea:(nullable CPTPlotArea *)newPlotArea { if ( newPlotArea != plotArea ) { plotArea = newPlotArea; @@ -2988,7 +2999,7 @@ -(void)setPlotArea:(CPTPlotArea *)newPlotArea } } --(void)setVisibleRange:(CPTPlotRange *)newRange +-(void)setVisibleRange:(nullable CPTPlotRange *)newRange { if ( newRange != visibleRange ) { visibleRange = [newRange copy]; @@ -2996,7 +3007,7 @@ -(void)setVisibleRange:(CPTPlotRange *)newRange } } --(void)setVisibleAxisRange:(CPTPlotRange *)newRange +-(void)setVisibleAxisRange:(nullable CPTPlotRange *)newRange { if ( newRange != visibleAxisRange ) { visibleAxisRange = [newRange copy]; @@ -3032,7 +3043,7 @@ -(void)setSeparateLayers:(BOOL)newSeparateLayers } } --(void)setMinorGridLines:(CPTGridLines *)newGridLines +-(void)setMinorGridLines:(nullable CPTGridLines *)newGridLines { CPTGridLines *oldGridLines = minorGridLines; @@ -3041,16 +3052,18 @@ -(void)setMinorGridLines:(CPTGridLines *)newGridLines minorGridLines = newGridLines; if ( newGridLines ) { - newGridLines.major = NO; - newGridLines.axis = self; + CPTGridLines *gridLines = newGridLines; + + gridLines.major = NO; + gridLines.axis = self; CPTPlotArea *thePlotArea = self.plotArea; - [thePlotArea.minorGridLineGroup insertSublayer:newGridLines atIndex:[thePlotArea sublayerIndexForAxis:self layerType:CPTGraphLayerTypeMinorGridLines]]; + [thePlotArea.minorGridLineGroup insertSublayer:gridLines atIndex:[thePlotArea sublayerIndexForAxis:self layerType:CPTGraphLayerTypeMinorGridLines]]; } } } --(void)setMajorGridLines:(CPTGridLines *)newGridLines +-(void)setMajorGridLines:(nullable CPTGridLines *)newGridLines { CPTGridLines *oldGridLines = majorGridLines; @@ -3059,16 +3072,18 @@ -(void)setMajorGridLines:(CPTGridLines *)newGridLines majorGridLines = newGridLines; if ( newGridLines ) { - newGridLines.major = YES; - newGridLines.axis = self; + CPTGridLines *gridLines = newGridLines; + + gridLines.major = YES; + gridLines.axis = self; CPTPlotArea *thePlotArea = self.plotArea; - [thePlotArea.majorGridLineGroup insertSublayer:newGridLines atIndex:[thePlotArea sublayerIndexForAxis:self layerType:CPTGraphLayerTypeMajorGridLines]]; + [thePlotArea.majorGridLineGroup insertSublayer:gridLines atIndex:[thePlotArea sublayerIndexForAxis:self layerType:CPTGraphLayerTypeMajorGridLines]]; } } } --(void)setAlternatingBandFills:(CPTFillArray)newFills +-(void)setAlternatingBandFills:(nullable CPTFillArray)newFills { if ( newFills != alternatingBandFills ) { Class nullClass = [NSNull class]; @@ -3128,12 +3143,12 @@ -(void)setAlternatingBandFills:(CPTFillArray)newFills } } --(CPTLimitBandArray)backgroundLimitBands +-(nullable CPTLimitBandArray)backgroundLimitBands { return [self.mutableBackgroundLimitBands copy]; } --(CPTAxisSet *)axisSet +-(nullable CPTAxisSet *)axisSet { CPTPlotArea *thePlotArea = self.plotArea; @@ -3160,7 +3175,7 @@ @implementation CPTAxis(AbstractMethods) * @param coordinateValue The axis value in data coordinate space. * @return The drawing coordinates of the point. **/ --(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue +-(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *)coordinateValue { return CGPointZero; } @@ -3169,7 +3184,7 @@ -(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue * @param context The graphics context to draw into. * @param major Draw the major grid lines If @YES, minor grid lines otherwise. **/ --(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major +-(void)drawGridLinesInContext:(nonnull CGContextRef)context isMajor:(BOOL)major { // do nothing--subclasses must override to do their drawing } @@ -3177,7 +3192,7 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major /** @brief Draws alternating background bands into the provided graphics context. * @param context The graphics context to draw into. **/ --(void)drawBackgroundBandsInContext:(CGContextRef)context +-(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context { // do nothing--subclasses must override to do their drawing } @@ -3185,7 +3200,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context /** @brief Draws background limit ranges into the provided graphics context. * @param context The graphics context to draw into. **/ --(void)drawBackgroundLimitsInContext:(CGContextRef)context +-(void)drawBackgroundLimitsInContext:(nonnull CGContextRef)context { // do nothing--subclasses must override to do their drawing } diff --git a/framework/Source/CPTAxisLabel.h b/framework/Source/CPTAxisLabel.h index 954ccda40..e014311cd 100644 --- a/framework/Source/CPTAxisLabel.h +++ b/framework/Source/CPTAxisLabel.h @@ -22,13 +22,13 @@ typedef NSMutableSet *CPTMutableAxisLabelSet; @property (nonatomic, readwrite, assign) CGFloat offset; @property (nonatomic, readwrite, assign) CGFloat rotation; @property (nonatomic, readwrite, assign) CPTAlignment alignment; -@property (nonatomic, readwrite, strong, nullable) NSNumber *tickLocation; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *tickLocation; /// @name Initialization /// @{ -(nonnull instancetype)initWithText:(nullable NSString *)newText textStyle:(nullable CPTTextStyle *)style; -(nonnull instancetype)initWithContentLayer:(nonnull CPTLayer *)layer NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Layout diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index b47870eb0..2361c88a6 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -13,7 +13,7 @@ **/ @implementation CPTAxisLabel -/** @property CPTLayer *contentLayer +/** @property nullable CPTLayer *contentLayer * @brief The label content. **/ @synthesize contentLayer; @@ -33,7 +33,7 @@ @implementation CPTAxisLabel **/ @synthesize alignment; -/** @property NSNumber *tickLocation +/** @property nonnull NSNumber *tickLocation * @brief The data coordinate of the tick location. **/ @synthesize tickLocation; @@ -47,7 +47,7 @@ @implementation CPTAxisLabel * @param newStyle The text style for the label. * @return The initialized CPTAxisLabel object. **/ --(instancetype)initWithText:(NSString *)newText textStyle:(CPTTextStyle *)newStyle +-(nonnull instancetype)initWithText:(nullable NSString *)newText textStyle:(nullable CPTTextStyle *)newStyle { CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:newText style:newStyle]; @@ -61,26 +61,22 @@ -(instancetype)initWithText:(NSString *)newText textStyle:(CPTTextStyle *)newSty * @param layer The label content. * @return The initialized CPTAxisLabel object. **/ --(instancetype)initWithContentLayer:(CPTLayer *)layer +-(nonnull instancetype)initWithContentLayer:(nonnull CPTLayer *)layer { - if ( layer ) { - if ( (self = [super init]) ) { - contentLayer = layer; - offset = CPTFloat(20.0); - rotation = CPTFloat(0.0); - alignment = CPTAlignmentCenter; - tickLocation = @0.0; - } - } - else { - self = nil; + if ( (self = [super init]) ) { + contentLayer = layer; + offset = CPTFloat(20.0); + rotation = CPTFloat(0.0); + alignment = CPTAlignmentCenter; + tickLocation = @0.0; } + return self; } /// @cond --(instancetype)init +-(nonnull instancetype)init { return [self initWithText:nil textStyle:nil]; } @@ -92,7 +88,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.contentLayer forKey:@"CPTAxisLabel.contentLayer"]; [coder encodeCGFloat:self.offset forKey:@"CPTAxisLabel.offset"]; @@ -107,14 +103,15 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { contentLayer = [coder decodeObjectForKey:@"CPTAxisLabel.contentLayer"]; offset = [coder decodeCGFloatForKey:@"CPTAxisLabel.offset"]; rotation = [coder decodeCGFloatForKey:@"CPTAxisLabel.rotation"]; alignment = (CPTAlignment)[coder decodeIntegerForKey:@"CPTAxisLabel.alignment"]; - tickLocation = [coder decodeObjectForKey:@"CPTAxisLabel.tickLocation"]; + NSNumber *location = [coder decodeObjectForKey:@"CPTAxisLabel.tickLocation"]; + tickLocation = location ? location : @0.0; } return self; } @@ -294,7 +291,7 @@ -(void)positionBetweenViewPoint:(CGPoint)firstPoint andViewPoint:(CGPoint)second /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; } @@ -312,7 +309,7 @@ -(NSString *)description * @param object The object to be compared with the receiver. * @return @YES if @par{object} is equal to the receiver, @NO otherwise. **/ --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; diff --git a/framework/Source/CPTAxisLabelGroup.m b/framework/Source/CPTAxisLabelGroup.m index 2603369a2..174f90bed 100644 --- a/framework/Source/CPTAxisLabelGroup.m +++ b/framework/Source/CPTAxisLabelGroup.m @@ -15,7 +15,7 @@ -(void)display // nothing to draw } --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { // nothing to draw } diff --git a/framework/Source/CPTAxisSet.m b/framework/Source/CPTAxisSet.m index 55674657e..0472002ad 100644 --- a/framework/Source/CPTAxisSet.m +++ b/framework/Source/CPTAxisSet.m @@ -9,12 +9,12 @@ **/ @implementation CPTAxisSet -/** @property CPTAxisArray axes +/** @property nullable CPTAxisArray axes * @brief The axes in the axis set. **/ @synthesize axes; -/** @property CPTLineStyle *borderLineStyle +/** @property nullable CPTLineStyle *borderLineStyle * @brief The line style for the layer border. * If @nil, the border is not drawn. **/ @@ -36,7 +36,7 @@ @implementation CPTAxisSet * @param newFrame The frame rectangle. * @return The initialized CPTAxisSet object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { axes = @[]; @@ -51,7 +51,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTAxisSet *theLayer = (CPTAxisSet *)layer; @@ -69,7 +69,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -77,7 +77,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.borderLineStyle forKey:@"CPTAxisSet.borderLineStyle"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { axes = [[coder decodeObjectForKey:@"CPTAxisSet.axes"] copy]; @@ -129,7 +129,7 @@ -(void)relabelAxes * @param idx The zero-based index. * @return The axis matching the given coordinate and index, or @nil if no match is found. **/ --(CPTAxis *)axisForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx +-(nullable CPTAxis *)axisForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx { CPTAxis *foundAxis = nil; NSUInteger count = 0; @@ -168,7 +168,7 @@ -(CPTAxis *)axisForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { for ( CPTAxis *axis in self.axes ) { if ( [axis pointingDeviceDownEvent:event atPoint:interactionPoint] ) { @@ -192,7 +192,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { for ( CPTAxis *axis in self.axes ) { if ( [axis pointingDeviceUpEvent:event atPoint:interactionPoint] ) { @@ -210,7 +210,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setAxes:(CPTAxisArray)newAxes +-(void)setAxes:(nullable CPTAxisArray)newAxes { if ( newAxes != axes ) { for ( CPTAxis *axis in axes ) { @@ -231,7 +231,7 @@ -(void)setAxes:(CPTAxisArray)newAxes } } --(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle +-(void)setBorderLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != borderLineStyle ) { borderLineStyle = [newLineStyle copy]; diff --git a/framework/Source/CPTAxisTitle.m b/framework/Source/CPTAxisTitle.m index 486cfbd5c..d5d5a97da 100644 --- a/framework/Source/CPTAxisTitle.m +++ b/framework/Source/CPTAxisTitle.m @@ -13,10 +13,9 @@ @implementation CPTAxisTitle #pragma mark - #pragma mark Init/Dealloc -/// @name Initialization -/// @{ +/// @cond --(instancetype)initWithContentLayer:(CPTLayer *)layer +-(nonnull instancetype)initWithContentLayer:(nonnull CPTLayer *)layer { if ( layer ) { if ( (self = [super initWithContentLayer:layer]) ) { @@ -29,7 +28,7 @@ -(instancetype)initWithContentLayer:(CPTLayer *)layer return self; } -/// @} +/// @endcond #pragma mark - #pragma mark Label comparison @@ -42,7 +41,7 @@ -(instancetype)initWithContentLayer:(CPTLayer *)layer * @param object The object to be compared with the receiver. * @return @YES if @par{object} is equal to the receiver, @NO otherwise. **/ --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index f274b0f17..cd2637df8 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -188,12 +188,12 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { /// @name Appearance /// @{ @property (nonatomic, readwrite, assign) BOOL barWidthsAreInViewCoordinates; -@property (nonatomic, readwrite, strong, nullable) NSNumber *barWidth; -@property (nonatomic, readwrite, strong, nullable) NSNumber *barOffset; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *barWidth; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *barOffset; @property (nonatomic, readwrite, assign) CGFloat barCornerRadius; @property (nonatomic, readwrite, assign) CGFloat barBaseCornerRadius; @property (nonatomic, readwrite, assign) BOOL barsAreHorizontal; -@property (nonatomic, readwrite, strong, nullable) NSNumber *baseValue; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *baseValue; @property (nonatomic, readwrite, assign) BOOL barBasesVary; @property (nonatomic, readwrite, copy, nullable) CPTPlotRange *plotRange; /// @} diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 5fd303824..b0e4b7756 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -36,19 +36,19 @@ /// @cond @interface CPTBarPlot() -@property (nonatomic, readwrite, copy) CPTNumberArray barLocations; -@property (nonatomic, readwrite, copy) CPTNumberArray barTips; -@property (nonatomic, readwrite, copy) CPTNumberArray barBases; -@property (nonatomic, readwrite, copy) CPTFillArray barFills; -@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray barLocations; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray barTips; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray barBases; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray barFills; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; --(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint:(CGPoint *)tipPoint; --(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context recordIndex:(NSUInteger)recordIndex; --(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint; --(CPTFill *)barFillForIndex:(NSUInteger)idx; --(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; --(void)drawBarInContext:(CGContextRef)context recordIndex:(NSUInteger)idx; +-(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint tipPoint:(nonnull CGPoint *)tipPoint; +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex; +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint; +-(nullable CPTFill *)barFillForIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; +-(void)drawBarInContext:(nonnull CGContextRef)context recordIndex:(NSUInteger)idx; -(CGFloat)lengthInView:(NSDecimal)plotLength; -(double)doubleLengthInPlotCoordinates:(NSDecimal)decimalLength; @@ -88,7 +88,7 @@ @implementation CPTBarPlot **/ @synthesize barBaseCornerRadius; -/** @property NSNumber *barOffset +/** @property nonnull NSNumber *barOffset * @brief The starting offset of the first bar in location data units. * @ingroup plotAnimationBarPlot **/ @@ -100,7 +100,7 @@ @implementation CPTBarPlot **/ @synthesize barWidthsAreInViewCoordinates; -/** @property NSNumber *barWidth +/** @property nonnull NSNumber *barWidth * @brief The width of each bar. Either view or plot coordinates can be used. * * With plot coordinates, the bar locations are one data unit apart (e.g., 1, 2, 3, etc.), @@ -112,13 +112,13 @@ @implementation CPTBarPlot **/ @synthesize barWidth; -/** @property CPTLineStyle *lineStyle +/** @property nullable CPTLineStyle *lineStyle * @brief The line style for the bar outline. * If @nil, the outline is not drawn. **/ @synthesize lineStyle; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill style for the bars. * If @nil, the bars are not filled. **/ @@ -129,7 +129,7 @@ @implementation CPTBarPlot **/ @synthesize barsAreHorizontal; -/** @property NSNumber *baseValue +/** @property nonnull NSNumber *baseValue * @brief The coordinate value of the fixed end of the bars. * This is only used if @ref barBasesVary is @NO. Otherwise, the data source * will be queried for an appropriate value of #CPTBarPlotFieldBarBase. @@ -144,7 +144,7 @@ @implementation CPTBarPlot **/ @synthesize barBasesVary; -/** @property CPTPlotRange *plotRange +/** @property nullable CPTPlotRange *plotRange * @brief Sets the plot range for the independent axis. * * If a plot range is provided, the bars are spaced evenly throughout the plot range. If @ref plotRange is @nil, @@ -168,7 +168,7 @@ @implementation CPTBarPlot * @param horizontal If @YES, the bars will have a horizontal orientation, otherwise they will be vertical. * @return A new CPTBarPlot instance initialized with a linear gradient bar fill. **/ -+(instancetype)tubularBarPlotWithColor:(CPTColor *)color horizontalBars:(BOOL)horizontal ++(nonnull instancetype)tubularBarPlotWithColor:(nonnull CPTColor *)color horizontalBars:(BOOL)horizontal { CPTBarPlot *barPlot = [[CPTBarPlot alloc] init]; CPTMutableLineStyle *barLineStyle = [[CPTMutableLineStyle alloc] init]; @@ -234,7 +234,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTBarPlot object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { lineStyle = [[CPTLineStyle alloc] init]; @@ -260,7 +260,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTBarPlot *theLayer = (CPTBarPlot *)layer; @@ -288,7 +288,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -308,16 +308,21 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownIndex } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { + NSNumber *num; + lineStyle = [[coder decodeObjectForKey:@"CPTBarPlot.lineStyle"] copy]; fill = [[coder decodeObjectForKey:@"CPTBarPlot.fill"] copy]; - barWidth = [coder decodeObjectForKey:@"CPTBarPlot.barWidth"]; - barOffset = [coder decodeObjectForKey:@"CPTBarPlot.barOffset"]; + num = [coder decodeObjectForKey:@"CPTBarPlot.barWidth"]; + barWidth = num ? num : @0.0; + num = [coder decodeObjectForKey:@"CPTBarPlot.barOffset"]; + barOffset = num ? num : @0.0; barCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barCornerRadius"]; barBaseCornerRadius = [coder decodeCGFloatForKey:@"CPTBarPlot.barBaseCornerRadius"]; - baseValue = [coder decodeObjectForKey:@"CPTBarPlot.baseValue"]; + num = [coder decodeObjectForKey:@"CPTBarPlot.baseValue"]; + baseValue = num ? num : @0.0; barsAreHorizontal = [coder decodeBoolForKey:@"CPTBarPlot.barsAreHorizontal"]; barBasesVary = [coder decodeBoolForKey:@"CPTBarPlot.barBasesVary"]; barWidthsAreInViewCoordinates = [coder decodeBoolForKey:@"CPTBarPlot.barWidthsAreInViewCoordinates"]; @@ -685,7 +690,7 @@ -(NSDecimal)lengthInPlotCoordinates:(NSDecimal)decimalLength /// @cond --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord { CPTPlotRange *range = [super plotRangeForCoordinate:coord]; @@ -730,7 +735,7 @@ -(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord * * @return A plot range that completely encloses all of the bars. **/ --(CPTPlotRange *)plotRangeEnclosingBars +-(nullable CPTPlotRange *)plotRangeEnclosingBars { BOOL horizontalBars = self.barsAreHorizontal; CPTMutablePlotRange *range; @@ -770,7 +775,7 @@ -(CPTPlotRange *)plotRangeEnclosingBars /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -813,7 +818,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context CGContextEndTransparencyLayer(context); } --(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint:(CGPoint *)tipPoint +-(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint tipPoint:(nonnull CGPoint *)tipPoint { BOOL horizontalBars = self.barsAreHorizontal; CPTCoordinate independentCoord = (horizontalBars ? CPTCoordinateY : CPTCoordinateX); @@ -890,7 +895,7 @@ -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(CGPoint *)basePoint tipPoint: return YES; } --(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context recordIndex:(NSUInteger)recordIndex +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex { // Get base and tip points CGPoint basePoint, tipPoint; @@ -905,7 +910,7 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context recordIndex:(NSUI return path; } --(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint { // This function is used to create a path which is used for both // drawing a bar and for doing hit-testing on a click/touch event @@ -938,11 +943,13 @@ -(CGMutablePathRef)newBarPathWithContext:(CGContextRef)context basePoint:(CGPoin barRect.size.width = round(barRect.size.width * roundingPrecision) / roundingPrecision; barRect.size.height = round(barRect.size.height * roundingPrecision) / roundingPrecision; + CGContextRef theContext = context; + if ( self.lineStyle.lineWidth > CPTFloat(0.0) ) { - barRect = CPTAlignRectToUserSpace(context, barRect); + barRect = CPTAlignRectToUserSpace(theContext, barRect); } else { - barRect = CPTAlignIntegralRectToUserSpace(context, barRect); + barRect = CPTAlignIntegralRectToUserSpace(theContext, barRect); } } @@ -1041,7 +1048,7 @@ -(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint return (base + halfBarWidth >= lowerBound) && (base - halfBarWidth <= upperBound); } --(CPTFill *)barFillForIndex:(NSUInteger)idx +-(nullable CPTFill *)barFillForIndex:(NSUInteger)idx { CPTFill *theBarFill = [self cachedValueForKey:CPTBarPlotBindingBarFills recordIndex:idx]; @@ -1052,7 +1059,7 @@ -(CPTFill *)barFillForIndex:(NSUInteger)idx return theBarFill; } --(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx +-(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx { CPTLineStyle *theBarLineStyle = [self cachedValueForKey:CPTBarPlotBindingBarLineStyles recordIndex:idx]; @@ -1063,7 +1070,7 @@ -(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx return theBarLineStyle; } --(void)drawBarInContext:(CGContextRef)context recordIndex:(NSUInteger)idx +-(void)drawBarInContext:(nonnull CGContextRef)context recordIndex:(NSUInteger)idx { // Get base and tip points CGPoint basePoint, tipPoint; @@ -1104,7 +1111,7 @@ -(void)drawBarInContext:(CGContextRef)context recordIndex:(NSUInteger)idx } } --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; @@ -1138,7 +1145,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -1166,7 +1173,7 @@ +(BOOL)needsDisplayForKey:(NSString *)aKey /// @cond --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { NSDecimal theBaseDecimalValue; @@ -1254,7 +1261,7 @@ -(NSUInteger)numberOfLegendEntries * @param idx The index of the desired title. * @return The title of the legend entry at the requested index. **/ --(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx { NSString *legendTitle = nil; @@ -1275,7 +1282,7 @@ -(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx * @param idx The index of the desired title. * @return The styled title of the legend entry at the requested index. **/ --(NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx { NSAttributedString *legendTitle = nil; @@ -1342,7 +1349,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; CPTPlotArea *thePlotArea = self.plotArea; @@ -1407,7 +1414,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownIndex; @@ -1470,59 +1477,59 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(CPTNumberArray)barTips +-(nullable CPTNumberArray)barTips { return [[self cachedNumbersForField:CPTBarPlotFieldBarTip] sampleArray]; } --(void)setBarTips:(CPTNumberArray)newTips +-(void)setBarTips:(nullable CPTNumberArray)newTips { [self cacheNumbers:newTips forField:CPTBarPlotFieldBarTip]; } --(CPTNumberArray)barBases +-(nullable CPTNumberArray)barBases { return [[self cachedNumbersForField:CPTBarPlotFieldBarBase] sampleArray]; } --(void)setBarBases:(CPTNumberArray)newBases +-(void)setBarBases:(nullable CPTNumberArray)newBases { [self cacheNumbers:newBases forField:CPTBarPlotFieldBarBase]; } --(CPTNumberArray)barLocations +-(nullable CPTNumberArray)barLocations { return [[self cachedNumbersForField:CPTBarPlotFieldBarLocation] sampleArray]; } --(void)setBarLocations:(CPTNumberArray)newLocations +-(void)setBarLocations:(nullable CPTNumberArray)newLocations { [self cacheNumbers:newLocations forField:CPTBarPlotFieldBarLocation]; } --(CPTFillArray)barFills +-(nullable CPTFillArray)barFills { return [self cachedArrayForKey:CPTBarPlotBindingBarFills]; } --(void)setBarFills:(CPTFillArray)newBarFills +-(void)setBarFills:(nullable CPTFillArray)newBarFills { [self cacheArray:newBarFills forKey:CPTBarPlotBindingBarFills]; [self setNeedsDisplay]; } --(CPTLineStyleArray)barLineStyles +-(nullable CPTLineStyleArray)barLineStyles { return [self cachedArrayForKey:CPTBarPlotBindingBarLineStyles]; } --(void)setBarLineStyles:(CPTLineStyleArray)newBarLineStyles +-(void)setBarLineStyles:(nullable CPTLineStyleArray)newBarLineStyles { [self cacheArray:newBarLineStyles forKey:CPTBarPlotBindingBarLineStyles]; [self setNeedsDisplay]; } --(void)setLineStyle:(CPTLineStyle *)newLineStyle +-(void)setLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( lineStyle != newLineStyle ) { lineStyle = [newLineStyle copy]; @@ -1531,7 +1538,7 @@ -(void)setLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setFill:(CPTFill *)newFill +-(void)setFill:(nullable CPTFill *)newFill { if ( fill != newFill ) { fill = [newFill copy]; @@ -1540,7 +1547,7 @@ -(void)setFill:(CPTFill *)newFill } } --(void)setBarWidth:(NSNumber *)newBarWidth +-(void)setBarWidth:(nonnull NSNumber *)newBarWidth { if ( ![barWidth isEqualToNumber:newBarWidth] ) { barWidth = newBarWidth; @@ -1548,7 +1555,7 @@ -(void)setBarWidth:(NSNumber *)newBarWidth } } --(void)setBarOffset:(NSNumber *)newBarOffset +-(void)setBarOffset:(nonnull NSNumber *)newBarOffset { if ( ![barOffset isEqualToNumber:newBarOffset] ) { barOffset = newBarOffset; @@ -1575,7 +1582,7 @@ -(void)setBarBaseCornerRadius:(CGFloat)newCornerRadius } } --(void)setBaseValue:(NSNumber *)newBaseValue +-(void)setBaseValue:(nonnull NSNumber *)newBaseValue { if ( ![baseValue isEqualToNumber:newBaseValue] ) { baseValue = newBaseValue; @@ -1615,14 +1622,14 @@ -(NSUInteger)numberOfFields return 3; } --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[@(CPTBarPlotFieldBarLocation), @(CPTBarPlotFieldBarTip), @(CPTBarPlotFieldBarBase)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { CPTNumberArray result = nil; diff --git a/framework/Source/CPTBorderedLayer.m b/framework/Source/CPTBorderedLayer.m index 63910ba72..61e6bf2df 100644 --- a/framework/Source/CPTBorderedLayer.m +++ b/framework/Source/CPTBorderedLayer.m @@ -10,7 +10,7 @@ @interface CPTBorderedLayer() -@property (nonatomic, readonly) CPTLayer *borderLayer; +@property (nonatomic, readonly, nullable) CPTLayer *borderLayer; -(void)updateOpacity; @@ -27,14 +27,14 @@ -(void)updateOpacity; **/ @implementation CPTBorderedLayer -/** @property CPTLineStyle *borderLineStyle +/** @property nullable CPTLineStyle *borderLineStyle * @brief The line style for the layer border. * * If @nil, the border is not drawn. **/ @synthesize borderLineStyle; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill for the layer background. * * If @nil, the layer background is not filled. @@ -66,7 +66,7 @@ @implementation CPTBorderedLayer * @param newFrame The frame rectangle. * @return The initialized CPTBorderedLayer object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { borderLineStyle = nil; @@ -82,7 +82,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTBorderedLayer *theLayer = (CPTBorderedLayer *)layer; @@ -101,7 +101,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -112,7 +112,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // inLayout } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { borderLineStyle = [[coder decodeObjectForKey:@"CPTBorderedLayer.borderLineStyle"] copy]; @@ -130,7 +130,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden || self.masksToBorder ) { return; @@ -145,7 +145,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /** @brief Draws the fill and border of a CPTBorderedLayer into the given graphics context. * @param context The graphics context to draw into. **/ --(void)renderBorderedLayerAsVectorInContext:(CGContextRef)context +-(void)renderBorderedLayerAsVectorInContext:(nonnull CGContextRef)context { if ( !self.backgroundColor || !self.useFastRendering ) { CPTFill *theFill = self.fill; @@ -192,7 +192,7 @@ -(void)renderBorderedLayerAsVectorInContext:(CGContextRef)context * @param right The right margin. * @param bottom The bottom margin. **/ --(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)right bottom:(CGFloat *)bottom +-(void)sublayerMarginLeft:(nonnull CGFloat *)left top:(nonnull CGFloat *)top right:(nonnull CGFloat *)right bottom:(nonnull CGFloat *)bottom { [super sublayerMarginLeft:left top:top right:right bottom:bottom]; @@ -224,7 +224,7 @@ -(void)layoutSublayers /// @cond --(CGPathRef)maskingPath +-(nullable CGPathRef)maskingPath { if ( self.masksToBounds ) { CGPathRef path = self.outerBorderPath; @@ -246,7 +246,7 @@ -(CGPathRef)maskingPath } } --(CGPathRef)sublayerMaskingPath +-(nullable CGPathRef)sublayerMaskingPath { if ( self.masksToBorder ) { CGPathRef path = self.innerBorderPath; @@ -316,7 +316,7 @@ -(void)updateOpacity /// @cond --(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle +-(void)setBorderLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != borderLineStyle ) { if ( newLineStyle.lineWidth != borderLineStyle.lineWidth ) { @@ -333,7 +333,7 @@ -(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setFill:(CPTFill *)newFill +-(void)setFill:(nullable CPTFill *)newFill { if ( newFill != fill ) { fill = [newFill copy]; @@ -381,7 +381,7 @@ -(void)setMasksToBorder:(BOOL)newMasksToBorder } } --(CPTLayer *)borderLayer +-(nullable CPTLayer *)borderLayer { CPTLayer *theBorderLayer = nil; CPTBorderLayer *superLayer = (CPTBorderLayer *)self.superlayer; @@ -485,7 +485,7 @@ -(void)setTransform:(CATransform3D)newTransform } } --(void)setShadow:(CPTShadow *)newShadow +-(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != self.shadow ) { [super setShadow:newShadow]; @@ -496,7 +496,7 @@ -(void)setShadow:(CPTShadow *)newShadow } } --(void)setBackgroundColor:(CGColorRef)newColor +-(void)setBackgroundColor:(nullable CGColorRef)newColor { if ( self.masksToBorder ) { [self.borderLayer setBackgroundColor:newColor]; diff --git a/framework/Source/CPTCalendarFormatter.h b/framework/Source/CPTCalendarFormatter.h index 8bfa23e40..89dc656ea 100644 --- a/framework/Source/CPTCalendarFormatter.h +++ b/framework/Source/CPTCalendarFormatter.h @@ -8,7 +8,7 @@ /// @name Initialization /// @{ -(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index caf9a04de..dcaa8b8e8 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -14,18 +14,18 @@ **/ @implementation CPTCalendarFormatter -/** @property NSDateFormatter *dateFormatter +/** @property nullable NSDateFormatter *dateFormatter * @brief The date formatter used to generate strings from date calculations. **/ @synthesize dateFormatter; -/** @property NSDate *referenceDate +/** @property nullable NSDate *referenceDate * @brief Date from which time intervals are computed. * If @nil, the standard reference date (1 January 2001, GMT) is used. **/ @synthesize referenceDate; -/** @property NSCalendar *referenceCalendar +/** @property nullable NSCalendar *referenceCalendar * @brief Calendar which is used for date calculations. * If @nil, the current calendar is used. **/ @@ -47,7 +47,7 @@ @implementation CPTCalendarFormatter * The default formatter uses @ref NSDateFormatterMediumStyle for dates and times. * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc] init]; @@ -65,7 +65,7 @@ -(instancetype)init * @param aDateFormatter The date formatter. * @return The new instance. **/ --(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter +-(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter { if ( (self = [super init]) ) { dateFormatter = aDateFormatter; @@ -81,7 +81,7 @@ -(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -97,7 +97,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { dateFormatter = [coder decodeObjectForKey:@"CPTCalendarFormatter.dateFormatter"]; @@ -113,7 +113,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTCalendarFormatter *newFormatter = [[CPTCalendarFormatter allocWithZone:zone] init]; @@ -142,7 +142,7 @@ -(id)copyWithZone:(NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(NSString *)stringForObjectValue:(id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue { NSInteger componentIncrement = 0; diff --git a/framework/Source/CPTColor.h b/framework/Source/CPTColor.h index f5872e84f..3de4f5dcc 100644 --- a/framework/Source/CPTColor.h +++ b/framework/Source/CPTColor.h @@ -30,7 +30,7 @@ /// @{ -(nonnull instancetype)initWithCGColor:(nonnull CGColorRef)cgColor NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)colorWithAlphaComponent:(CGFloat)alpha; /// @} diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 3e9d265c1..5690aa510 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -14,7 +14,7 @@ **/ @implementation CPTColor -/** @property CGColorRef cgColor +/** @property nonnull CGColorRef cgColor * @brief The @ref CGColorRef to wrap around. **/ @synthesize cgColor; @@ -31,7 +31,7 @@ @implementation CPTColor * * @return A shared CPTColor object initialized with a fully transparent color. **/ -+(instancetype)clearColor ++(nonnull instancetype)clearColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -53,7 +53,7 @@ +(instancetype)clearColor * * @return A shared CPTColor object initialized with a fully opaque white color. **/ -+(instancetype)whiteColor ++(nonnull instancetype)whiteColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -69,7 +69,7 @@ +(instancetype)whiteColor * * @return A shared CPTColor object initialized with a fully opaque 67% gray color. **/ -+(instancetype)lightGrayColor ++(nonnull instancetype)lightGrayColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -85,7 +85,7 @@ +(instancetype)lightGrayColor * * @return A shared CPTColor object initialized with a fully opaque 50% gray color. **/ -+(instancetype)grayColor ++(nonnull instancetype)grayColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -101,7 +101,7 @@ +(instancetype)grayColor * * @return A shared CPTColor object initialized with a fully opaque 33% gray color. **/ -+(instancetype)darkGrayColor ++(nonnull instancetype)darkGrayColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -117,7 +117,7 @@ +(instancetype)darkGrayColor * * @return A shared CPTColor object initialized with a fully opaque black color. **/ -+(instancetype)blackColor ++(nonnull instancetype)blackColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -133,7 +133,7 @@ +(instancetype)blackColor * * @return A shared CPTColor object initialized with a fully opaque red color. **/ -+(instancetype)redColor ++(nonnull instancetype)redColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -152,7 +152,7 @@ +(instancetype)redColor * * @return A shared CPTColor object initialized with a fully opaque green color. **/ -+(instancetype)greenColor ++(nonnull instancetype)greenColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -171,7 +171,7 @@ +(instancetype)greenColor * * @return A shared CPTColor object initialized with a fully opaque blue color. **/ -+(instancetype)blueColor ++(nonnull instancetype)blueColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -190,7 +190,7 @@ +(instancetype)blueColor * * @return A shared CPTColor object initialized with a fully opaque cyan color. **/ -+(instancetype)cyanColor ++(nonnull instancetype)cyanColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -209,7 +209,7 @@ +(instancetype)cyanColor * * @return A shared CPTColor object initialized with a fully opaque yellow color. **/ -+(instancetype)yellowColor ++(nonnull instancetype)yellowColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -225,7 +225,7 @@ +(instancetype)yellowColor * * @return A shared CPTColor object initialized with a fully opaque magenta color. **/ -+(instancetype)magentaColor ++(nonnull instancetype)magentaColor { static CPTColor *color = nil; @@ -239,7 +239,7 @@ +(instancetype)magentaColor * * @return A shared CPTColor object initialized with a fully opaque orange color. **/ -+(instancetype)orangeColor ++(nonnull instancetype)orangeColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -255,7 +255,7 @@ +(instancetype)orangeColor * * @return A shared CPTColor object initialized with a fully opaque purple color. **/ -+(instancetype)purpleColor ++(nonnull instancetype)purpleColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -271,7 +271,7 @@ +(instancetype)purpleColor * * @return A shared CPTColor object initialized with a fully opaque brown color. **/ -+(instancetype)brownColor ++(nonnull instancetype)brownColor { static CPTColor *color = nil; static dispatch_once_t onceToken = 0; @@ -287,7 +287,7 @@ +(instancetype)brownColor * @param newCGColor The color to wrap. * @return A new CPTColor instance initialized with the provided @ref CGColorRef. **/ -+(instancetype)colorWithCGColor:(CGColorRef)newCGColor ++(nonnull instancetype)colorWithCGColor:(nonnull CGColorRef)newCGColor { return [[CPTColor alloc] initWithCGColor:newCGColor]; } @@ -299,7 +299,7 @@ +(instancetype)colorWithCGColor:(CGColorRef)newCGColor * @param alpha The alpha component (@num{0} ≤ @par{alpha} ≤ @num{1}). * @return A new CPTColor instance initialized with the provided RGBA color components. **/ -+(instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha ++(nonnull instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return [[CPTColor alloc] initWithComponentRed:red green:green blue:blue alpha:alpha]; } @@ -308,7 +308,7 @@ +(instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGF * @param gray The gray level (@num{0} ≤ @par{gray} ≤ @num{1}). * @return A new CPTColor instance initialized with the provided gray level. **/ -+(instancetype)colorWithGenericGray:(CGFloat)gray ++(nonnull instancetype)colorWithGenericGray:(CGFloat)gray { CGFloat values[4] = { gray, gray, gray, CPTFloat(1.0) }; CGColorRef colorRef = CGColorCreate([CPTColorSpace genericRGBSpace].cgColorSpace, values); @@ -326,7 +326,7 @@ +(instancetype)colorWithGenericGray:(CGFloat)gray * @param newCGColor The color to wrap. * @return The initialized CPTColor object. **/ --(instancetype)initWithCGColor:(CGColorRef)newCGColor +-(nonnull instancetype)initWithCGColor:(nonnull CGColorRef)newCGColor { if ( (self = [super init]) ) { CGColorRetain(newCGColor); @@ -343,7 +343,7 @@ -(instancetype)initWithCGColor:(CGColorRef)newCGColor * @param alpha The alpha component (@num{0} ≤ @par{alpha} ≤ @num{1}). * @return The initialized CPTColor object. **/ --(instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha +-(nonnull instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { CGFloat colorComponents[4]; @@ -359,7 +359,7 @@ -(instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFl /// @cond --(instancetype)init +-(nonnull instancetype)init { return [self initWithComponentRed:0.0 green:0.0 blue:0.0 alpha:0.0]; } @@ -379,7 +379,7 @@ -(void)dealloc * @param alpha The alpha component (@num{0} ≤ @par{alpha} ≤ @num{1}). * @return A new CPTColor instance having the provided alpha component. **/ --(instancetype)colorWithAlphaComponent:(CGFloat)alpha +-(nonnull instancetype)colorWithAlphaComponent:(CGFloat)alpha { CGColorRef newCGColor = CGColorCreateCopyWithAlpha(self.cgColor, alpha); CPTColor *newColor = [CPTColor colorWithCGColor:newCGColor]; @@ -401,7 +401,7 @@ -(BOOL)isOpaque /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { CGColorRef theColor = self.cgColor; @@ -424,7 +424,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { CGColorSpaceRef colorSpace = [coder newCGColorSpaceDecodeForKey:@"CPTColor.colorSpace"]; @@ -452,7 +452,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CGColorRef cgColorCopy = NULL; @@ -482,7 +482,7 @@ -(id)copyWithZone:(NSZone *)zone * @param object The object to be compared with the receiver. * @return @YES if @par{object} is equal to the receiver, @NO otherwise. **/ --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; @@ -524,7 +524,7 @@ -(NSUInteger)hash /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE return self.uiColor; diff --git a/framework/Source/CPTColorSpace.h b/framework/Source/CPTColorSpace.h index fa6b1ddfb..6c42ceba1 100644 --- a/framework/Source/CPTColorSpace.h +++ b/framework/Source/CPTColorSpace.h @@ -1,6 +1,6 @@ @interface CPTColorSpace : NSObject -@property (nonatomic, readonly, nullable) CGColorSpaceRef cgColorSpace; +@property (nonatomic, readonly, nonnull) CGColorSpaceRef cgColorSpace; /// @name Factory Methods /// @{ @@ -10,7 +10,7 @@ /// @name Initialization /// @{ -(nonnull instancetype)initWithCGColorSpace:(nonnull CGColorSpaceRef)colorSpace NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTColorSpace.m b/framework/Source/CPTColorSpace.m index 0f184e7cd..6daf10726 100644 --- a/framework/Source/CPTColorSpace.m +++ b/framework/Source/CPTColorSpace.m @@ -9,7 +9,7 @@ @implementation CPTColorSpace -/** @property CGColorSpaceRef cgColorSpace +/** @property nonnull CGColorSpaceRef cgColorSpace * @brief The @ref CGColorSpaceRef to wrap around. **/ @synthesize cgColorSpace; @@ -25,7 +25,7 @@ @implementation CPTColorSpace * * @return A shared CPTColorSpace object initialized with the standard RGB colorspace. **/ -+(instancetype)genericRGBSpace ++(nonnull instancetype)genericRGBSpace { static CPTColorSpace *space = nil; static dispatch_once_t onceToken = 0; @@ -53,7 +53,7 @@ +(instancetype)genericRGBSpace * @param colorSpace The color space. * @return The initialized CPTColorSpace object. **/ --(instancetype)initWithCGColorSpace:(CGColorSpaceRef)colorSpace +-(nonnull instancetype)initWithCGColorSpace:(nonnull CGColorSpaceRef)colorSpace { if ( (self = [super init]) ) { CGColorSpaceRetain(colorSpace); @@ -64,7 +64,7 @@ -(instancetype)initWithCGColorSpace:(CGColorSpaceRef)colorSpace /// @cond --(instancetype)init +-(nonnull instancetype)init { CGColorSpaceRef cgSpace = NULL; @@ -93,7 +93,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCGColorSpace:self.cgColorSpace forKey:@"CPTColorSpace.cgColorSpace"]; } @@ -104,10 +104,17 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { - cgColorSpace = [coder newCGColorSpaceDecodeForKey:@"CPTColorSpace.cgColorSpace"]; + CGColorSpaceRef colorSpace = [coder newCGColorSpaceDecodeForKey:@"CPTColorSpace.cgColorSpace"]; + + if ( colorSpace ) { + cgColorSpace = colorSpace; + } + else { + self = nil; + } } return self; } diff --git a/framework/Source/CPTConstraints.m b/framework/Source/CPTConstraints.m index 7c1af4733..dd557e049 100644 --- a/framework/Source/CPTConstraints.m +++ b/framework/Source/CPTConstraints.m @@ -18,7 +18,7 @@ @implementation CPTConstraints * @param newOffset The offset. * @return A new CPTConstraints instance initialized with the given offset. **/ -+(instancetype)constraintWithLowerOffset:(CGFloat)newOffset ++(nonnull instancetype)constraintWithLowerOffset:(CGFloat)newOffset { return [[_CPTConstraintsFixed alloc] initWithLowerOffset:newOffset]; } @@ -27,7 +27,7 @@ +(instancetype)constraintWithLowerOffset:(CGFloat)newOffset * @param newOffset The offset. * @return A new CPTConstraints instance initialized with the given offset. **/ -+(instancetype)constraintWithUpperOffset:(CGFloat)newOffset ++(nonnull instancetype)constraintWithUpperOffset:(CGFloat)newOffset { return [[_CPTConstraintsFixed alloc] initWithUpperOffset:newOffset]; } @@ -40,7 +40,7 @@ +(instancetype)constraintWithUpperOffset:(CGFloat)newOffset * @param newOffset The offset. * @return A new CPTConstraints instance initialized with the given offset. **/ -+(instancetype)constraintWithRelativeOffset:(CGFloat)newOffset ++(nonnull instancetype)constraintWithRelativeOffset:(CGFloat)newOffset { return [[_CPTConstraintsRelative alloc] initWithRelativeOffset:newOffset]; } @@ -52,7 +52,7 @@ +(instancetype)constraintWithRelativeOffset:(CGFloat)newOffset * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithLowerOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithLowerOffset:(CGFloat)newOffset { self = [[_CPTConstraintsFixed alloc] initWithLowerOffset:newOffset]; @@ -63,7 +63,7 @@ -(instancetype)initWithLowerOffset:(CGFloat)newOffset * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithUpperOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithUpperOffset:(CGFloat)newOffset { self = [[_CPTConstraintsFixed alloc] initWithUpperOffset:newOffset]; @@ -78,7 +78,7 @@ -(instancetype)initWithUpperOffset:(CGFloat)newOffset * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithRelativeOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset { self = [[_CPTConstraintsRelative alloc] initWithRelativeOffset:newOffset]; @@ -90,7 +90,7 @@ -(instancetype)initWithRelativeOffset:(CGFloat)newOffset /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { // do nothing--implemented in subclasses return nil; @@ -103,12 +103,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { // do nothing--implemented in subclasses } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( [coder containsValueForKey:@"_CPTConstraintsFixed.offset"] ) { CGFloat offset = [coder decodeCGFloatForKey:@"_CPTConstraintsFixed.offset"]; @@ -143,7 +143,7 @@ @implementation CPTConstraints(AbstractMethods) * @param otherConstraint The constraint to check. * @return @YES if the constraints are equal. **/ --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint { // subclasses override to do comparison here return [super isEqual:otherConstraint]; diff --git a/framework/Source/CPTDataSourceTestCase.h b/framework/Source/CPTDataSourceTestCase.h index cdd05cbbb..444ee3c5b 100644 --- a/framework/Source/CPTDataSourceTestCase.h +++ b/framework/Source/CPTDataSourceTestCase.h @@ -6,15 +6,15 @@ @interface CPTDataSourceTestCase : CPTTestCase -@property (nonatomic, readwrite, copy) CPTNumberArray xData; -@property (nonatomic, readwrite, copy) CPTNumberArray yData; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray xData; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray yData; @property (nonatomic, readwrite, assign) NSUInteger nRecords; -@property (nonatomic, readonly, strong) CPTPlotRange *xRange; -@property (nonatomic, readonly, strong) CPTPlotRange *yRange; -@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; +@property (nonatomic, readonly, strong, nonnull) CPTPlotRange *xRange; +@property (nonatomic, readonly, strong, nonnull) CPTPlotRange *yRange; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray plots; -(void)buildData; --(void)addPlot:(CPTPlot *)newPlot; +-(void)addPlot:(nonnull CPTPlot *)newPlot; @end diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index a24deb7ba..8dcb5c593 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -10,7 +10,7 @@ /// @cond @interface CPTDataSourceTestCase() --(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray; +-(nonnull CPTMutablePlotRange *)plotRangeForData:(nonnull CPTNumberArray)dataArray; @end @@ -56,7 +56,7 @@ -(void)buildData self.yData = arr; } --(void)addPlot:(CPTPlot *)newPlot +-(void)addPlot:(nonnull CPTPlot *)newPlot { if ( nil == self.plots ) { self.plots = [NSMutableArray array]; @@ -65,16 +65,20 @@ -(void)addPlot:(CPTPlot *)newPlot [[self plots] addObject:newPlot]; } --(CPTPlotRange *)xRange +-(nonnull CPTPlotRange *)xRange { [self buildData]; - return [self plotRangeForData:self.xData]; + + CPTNumberArray data = self.xData; + return [self plotRangeForData:data]; } --(CPTPlotRange *)yRange +-(nonnull CPTPlotRange *)yRange { [self buildData]; - CPTMutablePlotRange *range = [self plotRangeForData:self.yData]; + + CPTNumberArray data = self.yData; + CPTMutablePlotRange *range = [self plotRangeForData:data]; if ( self.plots.count > 1 ) { range.lengthDecimal = CPTDecimalAdd( range.lengthDecimal, CPTDecimalFromUnsignedInteger(self.plots.count) ); @@ -83,7 +87,7 @@ -(CPTPlotRange *)yRange return range; } --(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray +-(nonnull CPTMutablePlotRange *)plotRangeForData:(nonnull CPTNumberArray)dataArray { double min = [[dataArray valueForKeyPath:@"@min.doubleValue"] doubleValue]; double max = [[dataArray valueForKeyPath:@"@max.doubleValue"] doubleValue]; @@ -96,12 +100,12 @@ -(CPTMutablePlotRange *)plotRangeForData:(CPTNumberArray)dataArray #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.nRecords; } --(CPTNumberArray)numbersForPlot:(CPTPlot *)plot +-(CPTNumberArray)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { diff --git a/framework/Source/CPTDebugQuickLook.h b/framework/Source/CPTDebugQuickLook.h index 3b306a33c..4779168e7 100644 --- a/framework/Source/CPTDebugQuickLook.h +++ b/framework/Source/CPTDebugQuickLook.h @@ -9,7 +9,7 @@ /** * @brief Used to show QuickLook previews of objects in the Xcode debugger and Swift playgrounds. **/ --(id)debugQuickLookObject; +-(nullable id)debugQuickLookObject; /// @} diff --git a/framework/Source/CPTFill.h b/framework/Source/CPTFill.h index 990f30ef9..6ace506bf 100644 --- a/framework/Source/CPTFill.h +++ b/framework/Source/CPTFill.h @@ -19,16 +19,16 @@ typedef NSMutableArray *CPTMutableFillArray; /// @name Factory Methods /// @{ -+(nonnull instancetype)fillWithColor:(nullable CPTColor *)aColor; -+(nonnull instancetype)fillWithGradient:(nullable CPTGradient *)aGradient; -+(nonnull instancetype)fillWithImage:(nullable CPTImage *)anImage; ++(nonnull instancetype)fillWithColor:(nonnull CPTColor *)aColor; ++(nonnull instancetype)fillWithGradient:(nonnull CPTGradient *)aGradient; ++(nonnull instancetype)fillWithImage:(nonnull CPTImage *)anImage; /// @} /// @name Initialization /// @{ --(nonnull instancetype)initWithColor:(nullable CPTColor *)aColor; --(nonnull instancetype)initWithGradient:(nullable CPTGradient *)aGradient; --(nonnull instancetype)initWithImage:(nullable CPTImage *)anImage; +-(nonnull instancetype)initWithColor:(nonnull CPTColor *)aColor; +-(nonnull instancetype)initWithGradient:(nonnull CPTGradient *)aGradient; +-(nonnull instancetype)initWithImage:(nonnull CPTImage *)anImage; /// @} @end diff --git a/framework/Source/CPTFill.m b/framework/Source/CPTFill.m index c4c63382a..469651769 100644 --- a/framework/Source/CPTFill.m +++ b/framework/Source/CPTFill.m @@ -23,7 +23,7 @@ @implementation CPTFill * @param aColor The color. * @return A new CPTFill instance initialized with the given color. **/ -+(instancetype)fillWithColor:(CPTColor *)aColor ++(nonnull instancetype)fillWithColor:(nonnull CPTColor *)aColor { return [[_CPTFillColor alloc] initWithColor:aColor]; } @@ -32,7 +32,7 @@ +(instancetype)fillWithColor:(CPTColor *)aColor * @param aGradient The gradient. * @return A new CPTFill instance initialized with the given gradient. **/ -+(instancetype)fillWithGradient:(CPTGradient *)aGradient ++(nonnull instancetype)fillWithGradient:(nonnull CPTGradient *)aGradient { return [[_CPTFillGradient alloc] initWithGradient:aGradient]; } @@ -41,7 +41,7 @@ +(instancetype)fillWithGradient:(CPTGradient *)aGradient * @param anImage The image. * @return A new CPTFill instance initialized with the given image. **/ -+(instancetype)fillWithImage:(CPTImage *)anImage ++(nonnull instancetype)fillWithImage:(nonnull CPTImage *)anImage { return [[_CPTFillImage alloc] initWithImage:anImage]; } @@ -50,7 +50,7 @@ +(instancetype)fillWithImage:(CPTImage *)anImage * @param aColor The color. * @return The initialized CPTFill object. **/ --(instancetype)initWithColor:(CPTColor *)aColor +-(nonnull instancetype)initWithColor:(nonnull CPTColor *)aColor { self = [[_CPTFillColor alloc] initWithColor:aColor]; @@ -61,7 +61,7 @@ -(instancetype)initWithColor:(CPTColor *)aColor * @param aGradient The gradient. * @return The initialized CPTFill object. **/ --(instancetype)initWithGradient:(CPTGradient *)aGradient +-(nonnull instancetype)initWithGradient:(nonnull CPTGradient *)aGradient { self = [[_CPTFillGradient alloc] initWithGradient:aGradient]; @@ -72,7 +72,7 @@ -(instancetype)initWithGradient:(CPTGradient *)aGradient * @param anImage The image. * @return The initialized CPTFill object. **/ --(instancetype)initWithImage:(CPTImage *)anImage +-(nonnull instancetype)initWithImage:(nonnull CPTImage *)anImage { self = [[_CPTFillImage alloc] initWithImage:anImage]; @@ -84,7 +84,7 @@ -(instancetype)initWithImage:(CPTImage *)anImage /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { // do nothing--implemented in subclasses return nil; @@ -97,12 +97,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { // do nothing--implemented in subclasses } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { id fill = [coder decodeObjectForKey:@"_CPTFillColor.fillColor"]; @@ -136,7 +136,7 @@ @implementation CPTFill(AbstractMethods) */ @dynamic opaque; -/** @property CGColorRef cgColor +/** @property nullable CGColorRef cgColor * @brief Returns a @ref CGColorRef describing the fill if the fill can be represented as a color, @NULL otherwise. */ @dynamic cgColor; @@ -144,16 +144,20 @@ @implementation CPTFill(AbstractMethods) #pragma mark - #pragma mark Opacity +/// @cond + -(BOOL)isOpaque { // do nothing--subclasses override to describe the fill opacity return NO; } +/// @endcond + #pragma mark - #pragma mark Color --(CGColorRef)cgColor +-(nullable CGColorRef)cgColor { // do nothing--subclasses override to describe the color return NULL; @@ -166,7 +170,7 @@ -(CGColorRef)cgColor * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context { // do nothing--subclasses override to do drawing here } @@ -174,7 +178,7 @@ -(void)fillRect:(CGRect)rect inContext:(CGContextRef)context /** @brief Draws the gradient into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef)context { // do nothing--subclasses override to do drawing here } @@ -184,7 +188,7 @@ -(void)fillPathInContext:(CGContextRef)context /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); diff --git a/framework/Source/CPTFillTests.m b/framework/Source/CPTFillTests.m index c0acf4d02..1ae176ccc 100644 --- a/framework/Source/CPTFillTests.m +++ b/framework/Source/CPTFillTests.m @@ -10,7 +10,7 @@ @interface _CPTFillColor() -@property (nonatomic, readwrite, copy) CPTColor *fillColor; +@property (nonatomic, readwrite, copy, nonnull) CPTColor *fillColor; @end @@ -18,7 +18,7 @@ @interface _CPTFillColor() @interface _CPTFillGradient() -@property (nonatomic, readwrite, copy) CPTGradient *fillGradient; +@property (nonatomic, readwrite, copy, nonnull) CPTGradient *fillGradient; @end @@ -26,7 +26,7 @@ @interface _CPTFillGradient() @interface _CPTFillImage() -@property (nonatomic, readwrite, copy) CPTImage *fillImage; +@property (nonatomic, readwrite, copy, nonnull) CPTImage *fillImage; @end diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index a74a6ab3d..eb439fdde 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -14,13 +14,13 @@ @interface CPTFunctionDataSource() -@property (nonatomic, readwrite) CPTPlot *dataPlot; +@property (nonatomic, readwrite, nonnull) CPTPlot *dataPlot; @property (nonatomic, readwrite) double cachedStep; @property (nonatomic, readwrite) NSUInteger dataCount; @property (nonatomic, readwrite) NSUInteger cachedCount; -@property (nonatomic, readwrite, strong) CPTMutablePlotRange *cachedPlotRange; +@property (nonatomic, readwrite, strong, nullable) CPTMutablePlotRange *cachedPlotRange; --(instancetype)initForPlot:(CPTPlot *)plot NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot NS_DESIGNATED_INITIALIZER; -(void)plotBoundsChanged; -(void)plotSpaceChanged; @@ -35,17 +35,17 @@ -(void)plotSpaceChanged; **/ @implementation CPTFunctionDataSource -/** @property CPTDataSourceFunction dataSourceFunction +/** @property nullable CPTDataSourceFunction dataSourceFunction * @brief The function used to generate plot data. **/ @synthesize dataSourceFunction; -/** @property CPTDataSourceBlock dataSourceBlock +/** @property nullable CPTDataSourceBlock dataSourceBlock * @brief The Objective-C block used to generate plot data. **/ @synthesize dataSourceBlock; -/** @property CPTPlot *dataPlot +/** @property nonnull CPTPlot *dataPlot * @brief The plot that will display the function values. Must be an instance of CPTScatterPlot. **/ @synthesize dataPlot; @@ -55,7 +55,7 @@ @implementation CPTFunctionDataSource **/ @synthesize resolution; -/** @property CPTPlotRange *dataRange +/** @property nullable CPTPlotRange *dataRange * @brief The maximum range of x-values that will be plotted. If @nil (the default), the function will be plotted for all visible x-values. **/ @synthesize dataRange; @@ -73,7 +73,7 @@ @implementation CPTFunctionDataSource * @param function The function used to generate plot data. * @return A new CPTFunctionDataSource instance initialized with the provided function and plot. **/ -+(instancetype)dataSourceForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunction)function ++(nonnull instancetype)dataSourceForPlot:(nonnull CPTPlot *)plot withFunction:(nonnull CPTDataSourceFunction)function { return [[self alloc] initForPlot:plot withFunction:function]; } @@ -83,7 +83,7 @@ +(instancetype)dataSourceForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunc * @param block The Objective-C block used to generate plot data. * @return A new CPTFunctionDataSource instance initialized with the provided block and plot. **/ -+(instancetype)dataSourceForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)block ++(nonnull instancetype)dataSourceForPlot:(nonnull CPTPlot *)plot withBlock:(nonnull CPTDataSourceBlock)block { return [[self alloc] initForPlot:plot withBlock:block]; } @@ -93,7 +93,7 @@ +(instancetype)dataSourceForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)b * @param function The function used to generate plot data. * @return The initialized CPTFunctionDataSource object. **/ --(instancetype)initForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunction)function +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot withFunction:(nonnull CPTDataSourceFunction)function { NSParameterAssert(function); @@ -110,7 +110,7 @@ -(instancetype)initForPlot:(CPTPlot *)plot withFunction:(CPTDataSourceFunction)f * @param block The Objective-C block used to generate plot data. * @return The initialized CPTFunctionDataSource object. **/ --(instancetype)initForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)block +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot withBlock:(nonnull CPTDataSourceBlock)block { NSParameterAssert(block); @@ -124,7 +124,7 @@ -(instancetype)initForPlot:(CPTPlot *)plot withBlock:(CPTDataSourceBlock)block /// @cond --(instancetype)initForPlot:(CPTPlot *)plot +-(nonnull instancetype)initForPlot:(nonnull CPTPlot *)plot { NSParameterAssert([plot isKindOfClass:[CPTScatterPlot class]]); @@ -154,7 +154,7 @@ -(instancetype)initForPlot:(CPTPlot *)plot } // function and plot are required; this will fail the assertions in -initForPlot:withFunction: --(instancetype)init +-(nonnull instancetype)init { [NSException raise:CPTException format:@"%@ must be initialized with a function or a block.", NSStringFromClass([self class])]; return [self initForPlot:[CPTScatterPlot layer] withFunction:sin]; @@ -188,7 +188,7 @@ -(void)setResolution:(CGFloat)newResolution } } --(void)setDataRange:(CPTPlotRange *)newRange +-(void)setDataRange:(nullable CPTPlotRange *)newRange { if ( newRange != dataRange ) { dataRange = newRange; @@ -330,7 +330,7 @@ -(void)plotSpaceChanged /// @cond --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +-(void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(NSDictionary *)change context:(nullable void *)context { if ( (context == CPTFunctionDataSourceKVOContext) && [keyPath isEqualToString:@"plotSpace"] && [object isEqual:self.dataPlot] ) { CPTPlotSpace *oldSpace = change[NSKeyValueChangeOldKey]; @@ -364,7 +364,7 @@ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NS /// @cond --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger count = 0; @@ -375,7 +375,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return count; } --(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange +-(CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange { CPTNumericData *numericData = nil; diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 2423c2440..766cdf895 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -10,18 +10,18 @@ /// @cond @interface CPTGradient() -@property (nonatomic, readwrite, strong) CPTColorSpace *colorspace; +@property (nonatomic, readwrite, strong, nonnull) CPTColorSpace *colorspace; @property (nonatomic, readwrite, assign) CPTGradientBlendingMode blendingMode; @property (nonatomic, readwrite, assign) CPTGradientElement *elementList; -@property (nonatomic, readwrite, assign) CGFunctionRef gradientFunction; +@property (nonatomic, readwrite, assign, nonnull) CGFunctionRef gradientFunction; -(void)commonInit; --(void)addElement:(CPTGradientElement *)newElement; +-(void)addElement:(nonnull CPTGradientElement *)newElement; --(CGShadingRef)newAxialGradientInRect:(CGRect)rect; --(CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(CGContextRef)context; +-(nonnull CGShadingRef)newAxialGradientInRect:(CGRect)rect; +-(nonnull CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(nonnull CGContextRef)context; --(CPTGradientElement *)elementAtIndex:(NSUInteger)idx; +-(nullable CPTGradientElement *)elementAtIndex:(NSUInteger)idx; -(NSUInteger)elementCount; -(CPTGradientElement)removeElementAtIndex:(NSUInteger)idx; @@ -31,12 +31,12 @@ -(void)removeAllElements; @end // C Functions for color blending -static void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out); -static void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out); -static void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out); -static void CPTTransformRGB_HSV(CGFloat *components); -static void CPTTransformHSV_RGB(CGFloat *components); -static void CPTResolveHSV(CGFloat *color1, CGFloat *color2); +static void CPTLinearEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out); +static void CPTChromaticEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out); +static void CPTInverseChromaticEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out); +static void CPTTransformRGB_HSV(CGFloat *__nonnull components); +static void CPTTransformHSV_RGB(CGFloat *__nonnull components); +static void CPTResolveHSV(CGFloat *__nonnull color1, CGFloat *__nonnull color2); /// @endcond @@ -58,7 +58,7 @@ @implementation CPTGradient /// @cond -/** @property CPTColorSpace *colorspace; +/** @property nonnull CPTColorSpace *colorspace; * @brief The colorspace for the gradient colors. **/ @synthesize colorspace; @@ -115,7 +115,7 @@ @implementation CPTGradient * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { [self commonInit]; @@ -153,7 +153,7 @@ -(void)dealloc /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTGradient *copy = [[[self class] allocWithZone:zone] init]; @@ -180,7 +180,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { if ( [coder allowsKeyedCoding] ) { NSUInteger count = 0; @@ -207,7 +207,7 @@ -(void)encodeWithCoder:(NSCoder *)coder } } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { [self commonInit]; @@ -246,7 +246,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @param end The ending color. * @return A new CPTGradient instance initialized with an axial linear gradient between the two given colors. **/ -+(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColor *)end ++(nonnull instancetype)gradientWithBeginningColor:(nonnull CPTColor *)begin endingColor:(nonnull CPTColor *)end { return [self gradientWithBeginningColor:begin endingColor:end beginningPosition:CPTFloat(0.0) endingPosition:CPTFloat(1.0)]; } @@ -258,7 +258,7 @@ +(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColo * @param endingPosition The ending position (@num{0} ≤ @par{endingPosition} ≤ @num{1}). * @return A new CPTGradient instance initialized with an axial linear gradient between the two given colors, at two given normalized positions. **/ -+(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColor *)end beginningPosition:(CGFloat)beginningPosition endingPosition:(CGFloat)endingPosition ++(nonnull instancetype)gradientWithBeginningColor:(nonnull CPTColor *)begin endingColor:(nonnull CPTColor *)end beginningPosition:(CGFloat)beginningPosition endingPosition:(CGFloat)endingPosition { CPTGradient *newInstance = [[self alloc] init]; @@ -280,7 +280,7 @@ +(instancetype)gradientWithBeginningColor:(CPTColor *)begin endingColor:(CPTColo /** @brief Creates and returns a new CPTGradient instance initialized with the Aqua selected gradient. * @return A new CPTGradient instance initialized with the Aqua selected gradient. **/ -+(instancetype)aquaSelectedGradient ++(nonnull instancetype)aquaSelectedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -324,7 +324,7 @@ +(instancetype)aquaSelectedGradient /** @brief Creates and returns a new CPTGradient instance initialized with the Aqua normal gradient. * @return A new CPTGradient instance initialized with the Aqua normal gradient. **/ -+(instancetype)aquaNormalGradient ++(nonnull instancetype)aquaNormalGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -360,7 +360,7 @@ +(instancetype)aquaNormalGradient /** @brief Creates and returns a new CPTGradient instance initialized with the Aqua pressed gradient. * @return A new CPTGradient instance initialized with the Aqua pressed gradient. **/ -+(instancetype)aquaPressedGradient ++(nonnull instancetype)aquaPressedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -396,7 +396,7 @@ +(instancetype)aquaPressedGradient /** @brief Creates and returns a new CPTGradient instance initialized with the unified selected gradient. * @return A new CPTGradient instance initialized with the unified selected gradient. **/ -+(instancetype)unifiedSelectedGradient ++(nonnull instancetype)unifiedSelectedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -420,7 +420,7 @@ +(instancetype)unifiedSelectedGradient /** @brief Creates and returns a new CPTGradient instance initialized with the unified normal gradient. * @return A new CPTGradient instance initialized with the unified normal gradient. **/ -+(instancetype)unifiedNormalGradient ++(nonnull instancetype)unifiedNormalGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -444,7 +444,7 @@ +(instancetype)unifiedNormalGradient /** @brief Creates and returns a new CPTGradient instance initialized with the unified pressed gradient. * @return A new CPTGradient instance initialized with the unified pressed gradient. **/ -+(instancetype)unifiedPressedGradient ++(nonnull instancetype)unifiedPressedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -468,7 +468,7 @@ +(instancetype)unifiedPressedGradient /** @brief Creates and returns a new CPTGradient instance initialized with the unified dark gradient. * @return A new CPTGradient instance initialized with the unified dark gradient. **/ -+(instancetype)unifiedDarkGradient ++(nonnull instancetype)unifiedDarkGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -492,7 +492,7 @@ +(instancetype)unifiedDarkGradient /** @brief Creates and returns a new CPTGradient instance initialized with the source list selected gradient. * @return A new CPTGradient instance initialized with the source list selected gradient. **/ -+(instancetype)sourceListSelectedGradient ++(nonnull instancetype)sourceListSelectedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -520,7 +520,7 @@ +(instancetype)sourceListSelectedGradient /** @brief Creates and returns a new CPTGradient instance initialized with the source list unselected gradient. * @return A new CPTGradient instance initialized with the source list unselected gradient. **/ -+(instancetype)sourceListUnselectedGradient ++(nonnull instancetype)sourceListUnselectedGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -548,7 +548,7 @@ +(instancetype)sourceListUnselectedGradient /** @brief Creates and returns a new CPTGradient instance initialized with a rainbow gradient. * @return A new CPTGradient instance initialized with a rainbow gradient. **/ -+(instancetype)rainbowGradient ++(nonnull instancetype)rainbowGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -578,7 +578,7 @@ +(instancetype)rainbowGradient /** @brief Creates and returns a new CPTGradient instance initialized with a hydrogen spectrum gradient. * @return A new CPTGradient instance initialized with a hydrogen spectrum gradient. **/ -+(instancetype)hydrogenSpectrumGradient ++(nonnull instancetype)hydrogenSpectrumGradient { CPTGradient *newInstance = [[self alloc] init]; @@ -706,7 +706,7 @@ -(CPTGradient *)gradientWithBlendingMode:(CPTGradientBlendingMode)mode * @param position The color stop position (@num{0} ≤ @par{position} ≤ @num{1}). * @return A copy of the current gradient with the new color stop. **/ --(CPTGradient *)addColorStop:(CPTColor *)color atPosition:(CGFloat)position +-(CPTGradient *)addColorStop:(nonnull CPTColor *)color atPosition:(CGFloat)position { CPTGradient *newGradient = [self copy]; CPTGradientElement newGradientElement; @@ -819,7 +819,7 @@ -(CGColorRef)newColorAtPosition:(CGFloat)position * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)drawSwatchInRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchInRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [self fillRect:rect inContext:context]; } @@ -828,7 +828,7 @@ -(void)drawSwatchInRect:(CGRect)rect inContext:(CGContextRef)context * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context { CGShadingRef myCGShading = NULL; @@ -855,7 +855,7 @@ -(void)fillRect:(CGRect)rect inContext:(CGContextRef)context /** @brief Draws the gradient into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef)context { if ( !CGContextIsPathEmpty(context) ) { CGShadingRef myCGShading = NULL; @@ -885,6 +885,8 @@ -(void)fillPathInContext:(CGContextRef)context #pragma mark - #pragma mark Opacity +/// @cond + -(BOOL)isOpaque { BOOL opaqueGradient = YES; @@ -899,6 +901,8 @@ -(BOOL)isOpaque return opaqueGradient; } +/// @endcond + #pragma mark - #pragma mark Gradient comparison @@ -910,7 +914,7 @@ -(BOOL)isOpaque * @param object The object to be compared with the receiver. * @return @YES if @par{object} is equal to the receiver, @NO otherwise. **/ --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; @@ -999,7 +1003,9 @@ -(NSUInteger)hash #pragma mark - #pragma mark Accessors --(void)setGradientFunction:(CGFunctionRef)newGradientFunction +/// @cond + +-(void)setGradientFunction:(nonnull CGFunctionRef)newGradientFunction { if ( newGradientFunction != gradientFunction ) { CGFunctionRelease(gradientFunction); @@ -1007,12 +1013,14 @@ -(void)setGradientFunction:(CGFunctionRef)newGradientFunction } } +/// @endcond + #pragma mark - #pragma mark Private Methods /// @cond --(CGShadingRef)newAxialGradientInRect:(CGRect)rect +-(nonnull CGShadingRef)newAxialGradientInRect:(CGRect)rect { // First Calculate where the beginning and ending points should be CGPoint startPoint, endPoint; @@ -1072,7 +1080,7 @@ -(CGShadingRef)newAxialGradientInRect:(CGRect)rect return myCGShading; } --(CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(CGContextRef)context +-(nonnull CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(nonnull CGContextRef)context { CGPoint startPoint, endPoint; CGFloat startRadius, endRadius; @@ -1135,13 +1143,17 @@ -(void)setBlendingMode:(CPTGradientBlendingMode)mode static const CGFloat input_value_range[2] = { 0, 1 }; // range for the evaluator input static const CGFloat output_value_ranges[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }; // ranges for the evaluator output (4 returned values) - self.gradientFunction = CGFunctionCreate( (__bridge void *)(self), // the two transition colors - 1, input_value_range, // number of inputs (just fraction of progression) - 4, output_value_ranges, // number of outputs (4 - RGBa) - &evaluationCallbackInfo ); // info for using the evaluator function + CGFunctionRef cgFunction = CGFunctionCreate( (__bridge void *)(self), // the two transition colors + 1, input_value_range, // number of inputs (just fraction of progression) + 4, output_value_ranges, // number of outputs (4 - RGBa) + &evaluationCallbackInfo ); // info for using the evaluator function + + if ( cgFunction ) { + self.gradientFunction = cgFunction; + } } --(void)addElement:(CPTGradientElement *)newElement +-(void)addElement:(nonnull CPTGradientElement *)newElement { CPTGradientElement *curElement = self.elementList; @@ -1266,7 +1278,7 @@ -(void)removeAllElements self.elementList = NULL; } --(CPTGradientElement *)elementAtIndex:(NSUInteger)idx +-(nullable CPTGradientElement *)elementAtIndex:(NSUInteger)idx { NSUInteger count = 0; CPTGradientElement *currentElement = self.elementList; @@ -1303,7 +1315,7 @@ -(NSUInteger)elementCount /// @cond -void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) +void CPTLinearEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out) { CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; @@ -1369,7 +1381,7 @@ void CPTLinearEvaluation(void *info, const CGFloat *in, CGFloat *out) // this we will add to the hue's angle (if we subtract we'll be doing the inverse // chromatic...scroll down more for that). All we need to do is keep adding to the hue // until we wrap around the color wheel and get to color2. -void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) +void CPTChromaticEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out) { CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; @@ -1446,7 +1458,7 @@ void CPTChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) // is strictly decreasing, that is we need to get from color1 to color2 by decreasing // the 'angle' (i.e. 90º -> 180º would be done by subtracting 270º and getting -180º... // which is equivalent to 180º mod 360º -void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) +void CPTInverseChromaticEvaluation(void *__nullable info, const CGFloat *__nonnull in, CGFloat *__nonnull out) { CGFloat position = *in; CPTGradient *gradient = (__bridge CPTGradient *)info; @@ -1517,7 +1529,7 @@ void CPTInverseChromaticEvaluation(void *info, const CGFloat *in, CGFloat *out) CPTTransformHSV_RGB(out); } -void CPTTransformRGB_HSV(CGFloat *components) // H,S,B -> R,G,B +void CPTTransformRGB_HSV(CGFloat *__nonnull components) // H,S,B -> R,G,B { CGFloat H = CPTNAN, S, V; CGFloat R = components[0]; @@ -1550,7 +1562,7 @@ void CPTTransformRGB_HSV(CGFloat *components) // H,S,B -> R,G,B components[2] = V; } -void CPTTransformHSV_RGB(CGFloat *components) // H,S,B -> R,G,B +void CPTTransformHSV_RGB(CGFloat *__nonnull components) // H,S,B -> R,G,B { CGFloat R = CPTFloat(0.0), G = CPTFloat(0.0), B = CPTFloat(0.0); CGFloat H = fmod( components[0], CPTFloat(360.0) ); // map to [0,360) @@ -1609,8 +1621,8 @@ void CPTTransformHSV_RGB(CGFloat *components) // H,S,B -> R,G,B components[2] = B; } -void CPTResolveHSV(CGFloat *color1, CGFloat *color2) // H value may be undefined (i.e. grayscale color) -{ // we want to fill it with a sensible value +void CPTResolveHSV(CGFloat *__nonnull color1, CGFloat *__nonnull color2) // H value may be undefined (i.e. grayscale color) +{ // we want to fill it with a sensible value if ( isnan(color1[0]) && isnan(color2[0]) ) { color1[0] = color2[0] = 0; } @@ -1629,7 +1641,7 @@ void CPTResolveHSV(CGFloat *color1, CGFloat *color2) // H value may be undefined /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 491c8e891..9ace06c35 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -106,12 +106,12 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Adding and Removing Plots /// @{ --(void)addPlot:(nullable CPTPlot *)plot; --(void)addPlot:(nullable CPTPlot *)plot toPlotSpace:(nullable CPTPlotSpace *)space; +-(void)addPlot:(nonnull CPTPlot *)plot; +-(void)addPlot:(nonnull CPTPlot *)plot toPlotSpace:(nullable CPTPlotSpace *)space; -(void)removePlot:(nullable CPTPlot *)plot; -(void)removePlotWithIdentifier:(nullable id)identifier; --(void)insertPlot:(nullable CPTPlot *)plot atIndex:(NSUInteger)idx; --(void)insertPlot:(nullable CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(nullable CPTPlotSpace *)space; +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx; +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(nullable CPTPlotSpace *)space; /// @} /// @name Retrieving Plot Spaces diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 1a0d2317e..957aa5d30 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -32,8 +32,8 @@ @interface CPTGraph() @property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray plots; @property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotSpaceArray plotSpaces; -@property (nonatomic, readwrite, strong) CPTLayerAnnotation *titleAnnotation; -@property (nonatomic, readwrite, strong) CPTLayerAnnotation *legendAnnotation; +@property (nonatomic, readwrite, strong, nullable) CPTLayerAnnotation *titleAnnotation; +@property (nonatomic, readwrite, strong, nullable) CPTLayerAnnotation *legendAnnotation; @property (nonatomic, readwrite, assign) BOOL inTitleUpdate; -(void)plotSpaceMappingDidChange:(nonnull NSNotification *)notif; @@ -66,54 +66,54 @@ -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor; **/ @implementation CPTGraph -/** @property cpt_weak CPTGraphHostingView *hostingView +/** @property nullable cpt_weak CPTGraphHostingView *hostingView * @brief The hosting view that contains the graph. **/ @synthesize hostingView; -/** @property CPTAxisSet *axisSet +/** @property nullable CPTAxisSet *axisSet * @brief The axis set. **/ @dynamic axisSet; -/** @property CPTPlotAreaFrame *plotAreaFrame +/** @property nullable CPTPlotAreaFrame *plotAreaFrame * @brief The plot area frame. **/ @synthesize plotAreaFrame; /// @cond -/** @property CPTMutablePlotArray plots +/** @property nonnull CPTMutablePlotArray plots * @brief An array of all plots associated with the graph. **/ @synthesize plots; -/** @property CPTMutablePlotSpaceArray plotSpaces +/** @property nonnull CPTMutablePlotSpaceArray plotSpaces * @brief An array of all plot spaces associated with the graph. **/ @synthesize plotSpaces; /// @endcond -/** @property CPTPlotSpace *defaultPlotSpace +/** @property nullable CPTPlotSpace *defaultPlotSpace * @brief The default plot space. **/ @dynamic defaultPlotSpace; -/** @property CPTNumberArray topDownLayerOrder +/** @property nullable CPTNumberArray topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * @see CPTPlotArea @link CPTPlotArea::topDownLayerOrder topDownLayerOrder @endlink property. **/ @dynamic topDownLayerOrder; -/** @property NSString *title +/** @property nullable NSString *title * @brief The title string. * * Assigning a new value to this property also sets the value of the @ref attributedTitle property to @nil. **/ @synthesize title; -/** @property NSAttributedString *attributedTitle +/** @property nullable NSAttributedString *attributedTitle * @brief The styled title string. * * Assigning a new value to this property also sets the value of the @ref title property to the @@ -123,7 +123,7 @@ @implementation CPTGraph **/ @synthesize attributedTitle; -/** @property CPTTextStyle *titleTextStyle +/** @property nullable CPTTextStyle *titleTextStyle * @brief The text style of the title. * * Assigning a new value to this property also sets the value of the @ref attributedTitle property to @nil. @@ -142,7 +142,7 @@ @implementation CPTGraph **/ @synthesize titleDisplacement; -/** @property CPTLegend *legend +/** @property nullable CPTLegend *legend * @brief The graph legend. * Setting this property will automatically anchor the legend to the graph and position it * using the @ref legendAnchor and @ref legendDisplacement properties. This is a convenience property @@ -198,7 +198,7 @@ @implementation CPTGraph * @param newFrame The frame rectangle. * @return The initialized CPTGraph object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { hostingView = nil; @@ -248,7 +248,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTGraph *theLayer = (CPTGraph *)layer; @@ -284,7 +284,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -307,7 +307,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // inTitleUpdate } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { hostingView = [coder decodeObjectForKey:@"CPTGraph.hostingView"]; @@ -352,7 +352,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)layoutAndRenderInContext:(CGContextRef)context +-(void)layoutAndRenderInContext:(nonnull CGContextRef)context { [self reloadDataIfNeeded]; [self.axisSet.axes makeObjectsPerformSelector:@selector(relabel)]; @@ -366,7 +366,7 @@ -(void)layoutAndRenderInContext:(CGContextRef)context /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -409,7 +409,7 @@ -(void)reloadDataIfNeeded /** @brief All plots associated with the graph. * @return An array of all plots associated with the graph. **/ --(CPTPlotArray)allPlots +-(nonnull CPTPlotArray)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -418,7 +418,7 @@ -(CPTPlotArray)allPlots * @param idx An index within the bounds of the plot array. * @return The plot at the given index. **/ --(CPTPlot *)plotAtIndex:(NSUInteger)idx +-(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx { if ( idx < self.plots.count ) { return (self.plots)[idx]; @@ -432,7 +432,7 @@ -(CPTPlot *)plotAtIndex:(NSUInteger)idx * @param identifier A plot identifier. * @return The plot with the given identifier or @nil if it was not found. **/ --(CPTPlot *)plotWithIdentifier:(id)identifier +-(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier { for ( CPTPlot *plot in self.plots ) { if ( [[plot identifier] isEqual:identifier] ) { @@ -448,7 +448,7 @@ -(CPTPlot *)plotWithIdentifier:(id)identifier /** @brief Add a plot to the default plot space. * @param plot The plot. **/ --(void)addPlot:(CPTPlot *)plot +-(void)addPlot:(nonnull CPTPlot *)plot { [self addPlot:plot toPlotSpace:self.defaultPlotSpace]; } @@ -457,7 +457,7 @@ -(void)addPlot:(CPTPlot *)plot * @param plot The plot. * @param space The plot space. **/ --(void)addPlot:(CPTPlot *)plot toPlotSpace:(CPTPlotSpace *)space +-(void)addPlot:(nonnull CPTPlot *)plot toPlotSpace:(nullable CPTPlotSpace *)space { if ( plot ) { [self.plots addObject:plot]; @@ -470,16 +470,20 @@ -(void)addPlot:(CPTPlot *)plot toPlotSpace:(CPTPlotSpace *)space /** @brief Remove a plot from the graph. * @param plot The plot to remove. **/ --(void)removePlot:(CPTPlot *)plot +-(void)removePlot:(nullable CPTPlot *)plot { - if ( [self.plots containsObject:plot] ) { - plot.plotSpace = nil; - plot.graph = nil; - [self.plotAreaFrame.plotGroup removePlot:plot]; - [self.plots removeObject:plot]; - } - else { - [NSException raise:CPTException format:@"Tried to remove CPTPlot which did not exist."]; + if ( plot ) { + CPTPlot *thePlot = plot; + + if ( [self.plots containsObject:thePlot] ) { + thePlot.plotSpace = nil; + thePlot.graph = nil; + [self.plotAreaFrame.plotGroup removePlot:thePlot]; + [self.plots removeObject:thePlot]; + } + else { + [NSException raise:CPTException format:@"Tried to remove CPTPlot which did not exist."]; + } } } @@ -487,7 +491,7 @@ -(void)removePlot:(CPTPlot *)plot * @param plot The plot. * @param idx An index within the bounds of the plot array. **/ --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx { [self insertPlot:plot atIndex:idx intoPlotSpace:self.defaultPlotSpace]; } @@ -497,7 +501,7 @@ -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx * @param idx An index within the bounds of the plot array. * @param space The plot space. **/ --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(CPTPlotSpace *)space +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(nullable CPTPlotSpace *)space { if ( plot ) { [self.plots insertObject:plot atIndex:idx]; @@ -510,7 +514,7 @@ -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx intoPlotSpace:(CPTPlot /** @brief Remove a plot from the graph. * @param identifier The identifier of the plot to remove. **/ --(void)removePlotWithIdentifier:(id)identifier +-(void)removePlotWithIdentifier:(nullable id)identifier { CPTPlot *plotToRemove = [self plotWithIdentifier:identifier]; @@ -525,7 +529,7 @@ -(void)removePlotWithIdentifier:(id)identifier #pragma mark - #pragma mark Retrieving Plot Spaces --(CPTPlotSpace *)defaultPlotSpace +-(nullable CPTPlotSpace *)defaultPlotSpace { return self.plotSpaces.count > 0 ? (self.plotSpaces)[0] : nil; } @@ -533,7 +537,7 @@ -(CPTPlotSpace *)defaultPlotSpace /** @brief All plot spaces associated with the graph. * @return An array of all plot spaces associated with the graph. **/ --(CPTPlotSpaceArray)allPlotSpaces +-(nonnull CPTPlotSpaceArray)allPlotSpaces { return [NSArray arrayWithArray:self.plotSpaces]; } @@ -542,7 +546,7 @@ -(CPTPlotSpaceArray)allPlotSpaces * @param idx An index within the bounds of the plot space array. * @return The plot space at the given index. **/ --(CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx +-(nullable CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx { return self.plotSpaces.count > idx ? (self.plotSpaces)[idx] : nil; } @@ -551,7 +555,7 @@ -(CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx * @param identifier A plot space identifier. * @return The plot space with the given identifier or @nil if it was not found. **/ --(CPTPlotSpace *)plotSpaceWithIdentifier:(id)identifier +-(nullable CPTPlotSpace *)plotSpaceWithIdentifier:(nullable id)identifier { for ( CPTPlotSpace *plotSpace in self.plotSpaces ) { if ( [[plotSpace identifier] isEqual:identifier] ) { @@ -566,14 +570,21 @@ -(CPTPlotSpace *)plotSpaceWithIdentifier:(id)identifier /// @cond --(void)setPlotAreaFrame:(CPTPlotAreaFrame *)newArea +-(void)setPlotAreaFrame:(nullable CPTPlotAreaFrame *)newArea { if ( plotAreaFrame != newArea ) { plotAreaFrame.graph = nil; [plotAreaFrame removeFromSuperlayer]; + plotAreaFrame = newArea; - [self addSublayer:newArea]; - plotAreaFrame.graph = self; + + if ( newArea ) { + CPTPlotAreaFrame *theFrame = newArea; + + [self addSublayer:theFrame]; + theFrame.graph = self; + } + for ( CPTPlotSpace *space in self.plotSpaces ) { space.graph = self; } @@ -588,7 +599,7 @@ -(void)setPlotAreaFrame:(CPTPlotAreaFrame *)newArea /** @brief Add a plot space to the graph. * @param space The plot space. **/ --(void)addPlotSpace:(CPTPlotSpace *)space +-(void)addPlotSpace:(nonnull CPTPlotSpace *)space { NSParameterAssert(space); @@ -609,31 +620,35 @@ -(void)addPlotSpace:(CPTPlotSpace *)space /** @brief Remove a plot space from the graph. * @param plotSpace The plot space. **/ --(void)removePlotSpace:(CPTPlotSpace *)plotSpace +-(void)removePlotSpace:(nullable CPTPlotSpace *)plotSpace { - if ( [self.plotSpaces containsObject:plotSpace] ) { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:CPTPlotSpaceCoordinateMappingDidChangeNotification - object:plotSpace]; - - // Remove space - plotSpace.graph = nil; - [self.plotSpaces removeObject:plotSpace]; - - // Update axes that referenced space - for ( CPTAxis *axis in self.axisSet.axes ) { - if ( axis.plotSpace == plotSpace ) { - axis.plotSpace = nil; + if ( plotSpace ) { + CPTPlotSpace *thePlotSpace = plotSpace; + + if ( [self.plotSpaces containsObject:thePlotSpace] ) { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:CPTPlotSpaceCoordinateMappingDidChangeNotification + object:thePlotSpace]; + + // Remove space + thePlotSpace.graph = nil; + [self.plotSpaces removeObject:thePlotSpace]; + + // Update axes that referenced space + for ( CPTAxis *axis in self.axisSet.axes ) { + if ( axis.plotSpace == thePlotSpace ) { + axis.plotSpace = nil; + } } - } - [[NSNotificationCenter defaultCenter] postNotificationName:CPTGraphDidRemovePlotSpaceNotification - object:self - userInfo:@{ CPTGraphPlotSpaceNotificationKey: plotSpace } - ]; - } - else { - [NSException raise:CPTException format:@"Tried to remove CPTPlotSpace which did not exist."]; + [[NSNotificationCenter defaultCenter] postNotificationName:CPTGraphDidRemovePlotSpaceNotification + object:self + userInfo:@{ CPTGraphPlotSpaceNotificationKey: thePlotSpace } + ]; + } + else { + [NSException raise:CPTException format:@"Tried to remove CPTPlotSpace which did not exist."]; + } } } @@ -642,7 +657,7 @@ -(void)removePlotSpace:(CPTPlotSpace *)plotSpace /// @cond --(void)plotSpaceMappingDidChange:(NSNotification *)notif +-(void)plotSpaceMappingDidChange:(nonnull NSNotification *)notif { CPTPlotSpace *plotSpace = notif.object; BOOL backgroundBandsNeedRedraw = NO; @@ -674,12 +689,12 @@ -(void)plotSpaceMappingDidChange:(NSNotification *)notif /// @cond --(CPTAxisSet *)axisSet +-(nullable CPTAxisSet *)axisSet { return self.plotAreaFrame.axisSet; } --(void)setAxisSet:(CPTAxisSet *)newSet +-(void)setAxisSet:(nullable CPTAxisSet *)newSet { self.plotAreaFrame.axisSet = newSet; } @@ -692,7 +707,7 @@ -(void)setAxisSet:(CPTAxisSet *)newSet /** @brief Apply a theme to style the graph. * @param theme The theme object used to style the graph. **/ --(void)applyTheme:(CPTTheme *)theme +-(void)applyTheme:(nullable CPTTheme *)theme { [theme applyThemeToGraph:self]; } @@ -702,7 +717,7 @@ -(void)applyTheme:(CPTTheme *)theme /// @cond --(void)setLegend:(CPTLegend *)newLegend +-(void)setLegend:(nullable CPTLegend *)newLegend { if ( newLegend != legend ) { legend = newLegend; @@ -834,17 +849,17 @@ -(void)setPaddingBottom:(CGFloat)newPadding } } --(CPTNumberArray)topDownLayerOrder +-(nullable CPTNumberArray)topDownLayerOrder { return self.plotAreaFrame.plotArea.topDownLayerOrder; } --(void)setTopDownLayerOrder:(CPTNumberArray)newArray +-(void)setTopDownLayerOrder:(nullable CPTNumberArray)newArray { self.plotAreaFrame.plotArea.topDownLayerOrder = newArray; } --(void)setTitle:(NSString *)newTitle +-(void)setTitle:(nullable NSString *)newTitle { if ( newTitle != title ) { title = [newTitle copy]; @@ -884,7 +899,7 @@ -(void)setTitle:(NSString *)newTitle } } --(void)setAttributedTitle:(NSAttributedString *)newTitle +-(void)setAttributedTitle:(nullable NSAttributedString *)newTitle { if ( newTitle != attributedTitle ) { attributedTitle = [newTitle copy]; @@ -931,7 +946,7 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle } } --(void)setTitleTextStyle:(CPTTextStyle *)newStyle +-(void)setTitleTextStyle:(nullable CPTTextStyle *)newStyle { if ( newStyle != titleTextStyle ) { titleTextStyle = [newStyle copy]; @@ -999,7 +1014,7 @@ -(void)setTitlePlotAreaFrameAnchor:(CPTRectAnchor)newAnchor * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { // Plots for ( CPTPlot *plot in [self.plots reverseObjectEnumerator] ) { @@ -1060,7 +1075,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledEvent = NO; @@ -1125,7 +1140,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { // Plots for ( CPTPlot *plot in [self.plots reverseObjectEnumerator] ) { @@ -1186,7 +1201,7 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter * @param event The OS event. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event { // Plots for ( CPTPlot *plot in [self.plots reverseObjectEnumerator] ) { @@ -1247,7 +1262,7 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event * @param toPoint The ending coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { // Plots for ( CPTPlot *plot in [self.plots reverseObjectEnumerator] ) { @@ -1298,7 +1313,7 @@ @implementation CPTGraph(AbstractFactoryMethods) /** @brief Creates a new plot space for the graph. * @return A new plot space. **/ --(CPTPlotSpace *)newPlotSpace +-(nullable CPTPlotSpace *)newPlotSpace { return nil; } @@ -1306,7 +1321,7 @@ -(CPTPlotSpace *)newPlotSpace /** @brief Creates a new axis set for the graph. * @return A new axis set. **/ --(CPTAxisSet *)newAxisSet +-(nullable CPTAxisSet *)newAxisSet { return nil; } diff --git a/framework/Source/CPTGridLineGroup.m b/framework/Source/CPTGridLineGroup.m index cc5f18c04..14800f2fe 100644 --- a/framework/Source/CPTGridLineGroup.m +++ b/framework/Source/CPTGridLineGroup.m @@ -12,7 +12,7 @@ **/ @implementation CPTGridLineGroup -/** @property cpt_weak CPTPlotArea *plotArea +/** @property nullable cpt_weak CPTPlotArea *plotArea * @brief The plot area that this grid line group belongs to. **/ @synthesize plotArea; @@ -38,7 +38,7 @@ @implementation CPTGridLineGroup * @param newFrame The frame rectangle. * @return The initialized CPTGridLineGroup object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { plotArea = nil; @@ -53,7 +53,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTGridLineGroup *theLayer = (CPTGridLineGroup *)layer; @@ -71,7 +71,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -79,7 +79,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeBool:self.major forKey:@"CPTGridLineGroup.major"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { plotArea = [coder decodeObjectForKey:@"CPTGridLineGroup.plotArea"]; @@ -95,7 +95,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -116,7 +116,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /// @cond --(void)setPlotArea:(CPTPlotArea *)newPlotArea +-(void)setPlotArea:(nullable CPTPlotArea *)newPlotArea { if ( newPlotArea != plotArea ) { plotArea = newPlotArea; diff --git a/framework/Source/CPTGridLines.m b/framework/Source/CPTGridLines.m index f96777129..510fc7c46 100644 --- a/framework/Source/CPTGridLines.m +++ b/framework/Source/CPTGridLines.m @@ -7,7 +7,7 @@ **/ @implementation CPTGridLines -/** @property cpt_weak CPTAxis *axis +/** @property nullable cpt_weak CPTAxis *axis * @brief The axis. **/ @synthesize axis; @@ -33,7 +33,7 @@ @implementation CPTGridLines * @param newFrame The frame rectangle. * @return The initialized CPTGridLines object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { axis = nil; @@ -48,7 +48,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTGridLines *theLayer = (CPTGridLines *)layer; @@ -66,7 +66,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -74,7 +74,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeBool:self.major forKey:@"CPTGridLines.major"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { axis = [coder decodeObjectForKey:@"CPTGridLines.axis"]; @@ -90,7 +90,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -107,7 +107,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /// @cond --(void)setAxis:(CPTAxis *)newAxis +-(void)setAxis:(nullable CPTAxis *)newAxis { if ( newAxis != axis ) { axis = newAxis; diff --git a/framework/Source/CPTImage.h b/framework/Source/CPTImage.h index 23e509fef..13903d24c 100644 --- a/framework/Source/CPTImage.h +++ b/framework/Source/CPTImage.h @@ -27,7 +27,7 @@ -(nonnull instancetype)initWithContentsOfFile:(nonnull NSString *)path; -(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage scale:(CGFloat)newScale NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 718d9ee54..941244a3c 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -28,7 +28,7 @@ @interface CPTImage() @property (nonatomic, readwrite, assign) CPTImageSlices slices; -(void)makeImageSlices; --(void)drawImage:(CGImageRef)theImage inContext:(CGContextRef)context rect:(CGRect)rect scaleRatio:(CGFloat)scaleRatio; +-(void)drawImage:(nonnull CGImageRef)theImage inContext:(nonnull CGContextRef)context rect:(CGRect)rect scaleRatio:(CGFloat)scaleRatio; @end @@ -47,12 +47,12 @@ -(void)drawImage:(CGImageRef)theImage inContext:(CGContextRef)context rect:(CGRe @implementation CPTImage -/** @property CPTNativeImage *nativeImage +/** @property nullable CPTNativeImage *nativeImage * @brief A platform-native representation of the image. **/ @synthesize nativeImage; -/** @property CGImageRef image +/** @property nullable CGImageRef image * @brief The image drawn into a @ref CGImageRef. **/ @synthesize image; @@ -118,7 +118,7 @@ @implementation CPTImage * @param path The full or partial path to the image file. * @return A CPTImage instance initialized from the file at the given path. **/ --(instancetype)initWithContentsOfFile:(NSString *)path +-(nonnull instancetype)initWithContentsOfFile:(nonnull NSString *)path { return [self initWithNativeImage:[[CPTNativeImage alloc] initWithContentsOfFile:path]]; } @@ -131,7 +131,7 @@ -(instancetype)initWithContentsOfFile:(NSString *)path * @param newScale The image scale. Must be greater than zero. * @return A CPTImage instance initialized with the provided @ref CGImageRef. **/ --(instancetype)initWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale +-(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage scale:(CGFloat)newScale { NSParameterAssert( newScale > CPTFloat(0.0) ); @@ -152,7 +152,7 @@ -(instancetype)initWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale * @param anImage The image to wrap. * @return A CPTImage instance initialized with the provided @ref CGImageRef. **/ --(instancetype)initWithCGImage:(CGImageRef)anImage +-(nonnull instancetype)initWithCGImage:(nullable CGImageRef)anImage { return [self initWithCGImage:anImage scale:CPTFloat(1.0)]; } @@ -163,7 +163,7 @@ -(instancetype)initWithCGImage:(CGImageRef)anImage /** @brief Initializes a newly allocated CPTImage object with a @NULL image. * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { return [self initWithCGImage:NULL]; } @@ -188,7 +188,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.nativeImage forKey:@"CPTImage.nativeImage"]; [coder encodeCGImage:self.image forKey:@"CPTImage.image"]; @@ -212,7 +212,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { nativeImage = [[coder decodeObjectForKey:@"CPTImage.nativeImage"] copy]; @@ -235,7 +235,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTImage *copy = [[[self class] allocWithZone:zone] init]; @@ -268,7 +268,7 @@ -(id)copyWithZone:(NSZone *)zone * @param name The name of the image to load. * @return A new CPTImage instance initialized with the named image. **/ -+(instancetype)imageNamed:(NSString *)name ++(nonnull instancetype)imageNamed:(nonnull NSString *)name { return [self imageWithNativeImage:[CPTNativeImage imageNamed:name]]; } @@ -278,7 +278,7 @@ +(instancetype)imageNamed:(NSString *)name * @param anImage The platform-native image. * @return A new CPTImage instance initialized with the provided image. **/ -+(instancetype)imageWithNativeImage:(CPTNativeImage *)anImage ++(nonnull instancetype)imageWithNativeImage:(nullable CPTNativeImage *)anImage { return [[self alloc] initWithNativeImage:anImage]; } @@ -288,7 +288,7 @@ +(instancetype)imageWithNativeImage:(CPTNativeImage *)anImage * @param path The full or partial path to the image file. * @return A new CPTImage instance initialized from the file at the given path. **/ -+(instancetype)imageWithContentsOfFile:(NSString *)path ++(nonnull instancetype)imageWithContentsOfFile:(nonnull NSString *)path { return [[self alloc] initWithContentsOfFile:path]; } @@ -298,7 +298,7 @@ +(instancetype)imageWithContentsOfFile:(NSString *)path * @param newScale The image scale. * @return A new CPTImage instance initialized with the provided @ref CGImageRef. **/ -+(instancetype)imageWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale ++(nonnull instancetype)imageWithCGImage:(nullable CGImageRef)anImage scale:(CGFloat)newScale { return [[self alloc] initWithCGImage:anImage scale:newScale]; } @@ -307,7 +307,7 @@ +(instancetype)imageWithCGImage:(CGImageRef)anImage scale:(CGFloat)newScale * @param anImage The image to wrap. * @return A new CPTImage instance initialized with the provided @ref CGImageRef. **/ -+(instancetype)imageWithCGImage:(CGImageRef)anImage ++(nonnull instancetype)imageWithCGImage:(nullable CGImageRef)anImage { return [self imageWithCGImage:anImage scale:CPTFloat(1.0)]; } @@ -321,7 +321,7 @@ +(instancetype)imageWithCGImage:(CGImageRef)anImage * @param path The file system path of the file. * @return A new CPTImage instance initialized with the contents of the PNG file. **/ -+(instancetype)imageForPNGFile:(NSString *)path ++(nonnull instancetype)imageForPNGFile:(nonnull NSString *)path { return [[self alloc] initForPNGFile:path]; } @@ -337,7 +337,7 @@ +(instancetype)imageForPNGFile:(NSString *)path * @param object The object to be compared with the receiver. * @return @YES if @par{object} is equal to the receiver, @NO otherwise. **/ --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; @@ -486,7 +486,7 @@ -(BOOL)isOpaque /// @cond --(void)setImage:(CGImageRef)newImage +-(void)setImage:(nullable CGImageRef)newImage { if ( newImage != image ) { CGImageRetain(newImage); @@ -495,7 +495,7 @@ -(void)setImage:(CGImageRef)newImage } } --(void)setNativeImage:(CPTNativeImage *)newImage +-(void)setNativeImage:(nullable CPTNativeImage *)newImage { if ( newImage != nativeImage ) { nativeImage = [newImage copy]; @@ -504,7 +504,7 @@ -(void)setNativeImage:(CPTNativeImage *)newImage } } --(CPTNativeImage *)nativeImage +-(nullable CPTNativeImage *)nativeImage { if ( !nativeImage ) { CGImageRef imageRef = self.image; @@ -664,7 +664,7 @@ -(void)makeImageSlices } } --(void)drawImage:(CGImageRef)theImage inContext:(CGContextRef)context rect:(CGRect)rect scaleRatio:(CGFloat)scaleRatio +-(void)drawImage:(nonnull CGImageRef)theImage inContext:(nonnull CGContextRef)context rect:(CGRect)rect scaleRatio:(CGFloat)scaleRatio { if ( theImage && ( rect.size.width > CPTFloat(0.0) ) && ( rect.size.height > CPTFloat(0.0) ) ) { CGFloat imageScale = self.scale; @@ -701,7 +701,7 @@ -(void)drawImage:(CGImageRef)theImage inContext:(CGContextRef)context rect:(CGRe * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context { CGImageRef theImage = self.image; @@ -823,7 +823,7 @@ -(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { return self.nativeImage; } diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 434d7f2e2..fcbe15701 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -82,7 +82,7 @@ typedef NSMutableSet *CPTMutableSublayerSet; /// @name Initialization /// @{ -(nonnull instancetype)initWithFrame:(CGRect)newFrame NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 8725aa5e4..87723c3e0 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -51,7 +51,7 @@ -(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx; **/ @implementation CPTLayer -/** @property cpt_weak CPTGraph *graph +/** @property nullable cpt_weak CPTGraph *graph * @brief The graph for the layer. **/ @synthesize graph; @@ -96,17 +96,17 @@ @implementation CPTLayer **/ @dynamic shadowMargin; -/** @property CGPathRef outerBorderPath +/** @property nullable CGPathRef outerBorderPath * @brief A drawing path that encompasses the outer boundary of the layer border. **/ @synthesize outerBorderPath; -/** @property CGPathRef innerBorderPath +/** @property nullable CGPathRef innerBorderPath * @brief A drawing path that encompasses the inner boundary of the layer border. **/ @synthesize innerBorderPath; -/** @property CGPathRef maskingPath +/** @property nullable CGPathRef maskingPath * @brief A drawing path that encompasses the layer content including any borders. Set to @NULL when no masking is desired. * * This path defines the outline of the layer and is used to mask all drawing. Set to @NULL when no masking is desired. @@ -114,7 +114,7 @@ @implementation CPTLayer **/ @dynamic maskingPath; -/** @property CGPathRef sublayerMaskingPath +/** @property nullable CGPathRef sublayerMaskingPath * @brief A drawing path that encompasses the layer content excluding any borders. Set to @NULL when no masking is desired. * * This path defines the outline of the part of the layer where sublayers should draw and is used to mask all sublayer drawing. @@ -123,7 +123,7 @@ @implementation CPTLayer **/ @dynamic sublayerMaskingPath; -/** @property CPTSublayerSet sublayersExcludedFromAutomaticLayout +/** @property nullable CPTSublayerSet sublayersExcludedFromAutomaticLayout * @brief A set of sublayers that should be excluded from the automatic sublayer layout. **/ @dynamic sublayersExcludedFromAutomaticLayout; @@ -133,7 +133,7 @@ @implementation CPTLayer **/ @synthesize useFastRendering; -/** @property id identifier +/** @property nullable id identifier * @brief An object used to identify the layer in collections. **/ @synthesize identifier; @@ -165,7 +165,7 @@ @implementation CPTLayer * @param newFrame The frame rectangle. * @return The initialized object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super init]) ) { paddingLeft = CPTFloat(0.0); @@ -195,7 +195,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /** @brief Initializes a newly allocated CPTLayer object with an empty frame rectangle. * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { return [self initWithFrame:CGRectZero]; } @@ -206,7 +206,7 @@ -(instancetype)init * @param layer The layer from which custom fields should be copied. * @return A layer instance with any custom instance variables copied from @par{layer}. */ --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTLayer *theLayer = (CPTLayer *)layer; @@ -242,7 +242,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -267,7 +267,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { paddingLeft = [coder decodeCGFloatForKey:@"CPTLayer.paddingLeft"]; @@ -291,7 +291,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)actionForKey:(NSString *)aKey +-(id)actionForKey:(nonnull NSString *)aKey { return nil; } @@ -313,7 +313,7 @@ -(void)display } } --(void)drawInContext:(CGContextRef)context +-(void)drawInContext:(nonnull CGContextRef)context { if ( context ) { self.useFastRendering = YES; @@ -336,7 +336,7 @@ -(void)drawInContext:(CGContextRef)context * * @param context The graphics context to draw into. **/ --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { // This is where subclasses do their drawing if ( self.renderingRecursively ) { @@ -348,7 +348,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /** @brief Draws layer content and the content of all sublayers into the provided graphics context. * @param context The graphics context to draw into. **/ --(void)recursivelyRenderInContext:(CGContextRef)context +-(void)recursivelyRenderInContext:(nonnull CGContextRef)context { if ( !self.hidden ) { // render self @@ -396,7 +396,7 @@ -(void)recursivelyRenderInContext:(CGContextRef)context /// @cond --(void)applyTransform:(CATransform3D)transform3D toContext:(CGContextRef)context +-(void)applyTransform:(CATransform3D)transform3D toContext:(nonnull CGContextRef)context { if ( !CATransform3DIsIdentity(transform3D) ) { if ( CATransform3DIsAffine(transform3D) ) { @@ -422,7 +422,7 @@ -(void)applyTransform:(CATransform3D)transform3D toContext:(CGContextRef)context /** @brief Updates the layer layout if needed and then draws layer content and the content of all sublayers into the provided graphics context. * @param context The graphics context to draw into. */ --(void)layoutAndRenderInContext:(CGContextRef)context +-(void)layoutAndRenderInContext:(nonnull CGContextRef)context { [self layoutIfNeeded]; [self recursivelyRenderInContext:context]; @@ -431,7 +431,7 @@ -(void)layoutAndRenderInContext:(CGContextRef)context /** @brief Draws layer content and the content of all sublayers into a PDF document. * @return PDF representation of the layer content. **/ --(NSData *)dataForPDFRepresentationOfLayer +-(nonnull NSData *)dataForPDFRepresentationOfLayer { NSMutableData *pdfData = [[NSMutableData alloc] init]; CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData( (__bridge CFMutableDataRef)pdfData ); @@ -460,29 +460,29 @@ -(NSData *)dataForPDFRepresentationOfLayer /// @name User Interaction /// @{ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { return NO; } --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { return NO; } --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { return NO; } --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event { return NO; } #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #else --(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { return NO; } @@ -646,18 +646,22 @@ -(void)layoutSublayers /// @} --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +/// @cond + +-(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout { return nil; } +/// @endcond + /** @brief Returns the margins that should be left between the bounds of the receiver and all sublayers. * @param left The left margin. * @param top The top margin. * @param right The right margin. * @param bottom The bottom margin. **/ --(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)right bottom:(CGFloat *)bottom +-(void)sublayerMarginLeft:(nonnull CGFloat *)left top:(nonnull CGFloat *)top right:(nonnull CGFloat *)right bottom:(nonnull CGFloat *)bottom { *left = self.paddingLeft; *top = self.paddingTop; @@ -670,7 +674,7 @@ -(void)sublayerMarginLeft:(CGFloat *)left top:(CGFloat *)top right:(CGFloat *)ri /// @cond --(void)setSublayers:(CPTSublayerArray)sublayers +-(void)setSublayers:(nullable CPTSublayerArray)sublayers { [super setSublayers:sublayers]; @@ -683,7 +687,7 @@ -(void)setSublayers:(CPTSublayerArray)sublayers } } --(void)addSublayer:(CALayer *)layer +-(void)addSublayer:(nonnull CALayer *)layer { [super addSublayer:layer]; @@ -692,7 +696,7 @@ -(void)addSublayer:(CALayer *)layer } } --(void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx +-(void)insertSublayer:(nonnull CALayer *)layer atIndex:(unsigned)idx { [super insertSublayer:layer atIndex:idx]; @@ -701,7 +705,7 @@ -(void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx } } --(void)insertSublayer:(CALayer *)layer below:(CALayer *)sibling +-(void)insertSublayer:(nonnull CALayer *)layer below:(nullable CALayer *)sibling { [super insertSublayer:layer below:sibling]; @@ -710,7 +714,7 @@ -(void)insertSublayer:(CALayer *)layer below:(CALayer *)sibling } } --(void)insertSublayer:(CALayer *)layer above:(CALayer *)sibling +-(void)insertSublayer:(nonnull CALayer *)layer above:(nullable CALayer *)sibling { [super insertSublayer:layer above:sibling]; @@ -719,7 +723,7 @@ -(void)insertSublayer:(CALayer *)layer above:(CALayer *)sibling } } --(void)replaceSublayer:(CALayer *)layer with:(CALayer *)layer2 +-(void)replaceSublayer:(nonnull CALayer *)layer with:(nonnull CALayer *)layer2 { [super replaceSublayer:layer with:layer2]; @@ -733,8 +737,10 @@ -(void)replaceSublayer:(CALayer *)layer with:(CALayer *)layer2 #pragma mark - #pragma mark Masking +/// @cond + // default path is the rounded rect layer bounds --(CGPathRef)maskingPath +-(nullable CGPathRef)maskingPath { if ( self.masksToBounds ) { CGPathRef path = self.outerBorderPath; @@ -753,11 +759,13 @@ -(CGPathRef)maskingPath } } --(CGPathRef)sublayerMaskingPath +-(nullable CGPathRef)sublayerMaskingPath { return self.innerBorderPath; } +/// @endcond + /** @brief Recursively sets the clipping path of the given graphics context to the sublayer masking paths of its superlayers. * * The clipping path is built by recursively climbing the layer tree and combining the sublayer masks from @@ -767,7 +775,7 @@ -(CGPathRef)sublayerMaskingPath * @param sublayer The sublayer that called this method. * @param offset The cumulative position offset between the receiver and the first layer in the recursive calling chain. **/ --(void)applySublayerMaskToContext:(CGContextRef)context forSublayer:(CPTLayer *)sublayer withOffset:(CGPoint)offset +-(void)applySublayerMaskToContext:(nonnull CGContextRef)context forSublayer:(nonnull CPTLayer *)sublayer withOffset:(CGPoint)offset { CGPoint sublayerBoundsOrigin = sublayer.bounds.origin; CGPoint layerOffset = offset; @@ -804,7 +812,7 @@ -(void)applySublayerMaskToContext:(CGContextRef)context forSublayer:(CPTLayer *) * * @param context The graphics context to clip. **/ --(void)applyMaskToContext:(CGContextRef)context +-(void)applyMaskToContext:(nonnull CGContextRef)context { CPTLayer *mySuperlayer = (CPTLayer *)self.superlayer; @@ -905,7 +913,7 @@ -(CGFloat)contentsScale return scale; } --(void)setShadow:(CPTShadow *)newShadow +-(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != shadow ) { shadow = [newShadow copy]; @@ -914,7 +922,7 @@ -(void)setShadow:(CPTShadow *)newShadow } } --(void)setOuterBorderPath:(CGPathRef)newPath +-(void)setOuterBorderPath:(nullable CGPathRef)newPath { if ( newPath != outerBorderPath ) { CGPathRelease(outerBorderPath); @@ -922,7 +930,7 @@ -(void)setOuterBorderPath:(CGPathRef)newPath } } --(void)setInnerBorderPath:(CGPathRef)newPath +-(void)setInnerBorderPath:(nullable CGPathRef)newPath { if ( newPath != innerBorderPath ) { CGPathRelease(innerBorderPath); @@ -1028,7 +1036,7 @@ -(void)setCornerRadius:(CGFloat)newRadius /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ bounds: %@>", [super description], CPTStringFromRect(self.bounds)]; } @@ -1045,7 +1053,7 @@ -(void)logLayers /// @cond --(NSString *)subLayersAtIndex:(NSUInteger)idx +-(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx { NSMutableString *result = [NSMutableString string]; @@ -1075,7 +1083,7 @@ -(NSString *)subLayersAtIndex:(NSUInteger)idx /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { return [self imageOfLayer]; } diff --git a/framework/Source/CPTLayerAnnotation.h b/framework/Source/CPTLayerAnnotation.h index 4a1b45bbd..67c31862e 100644 --- a/framework/Source/CPTLayerAnnotation.h +++ b/framework/Source/CPTLayerAnnotation.h @@ -8,7 +8,10 @@ @property (nonatomic, readonly, nullable) cpt_weak CPTLayer *anchorLayer; @property (nonatomic, readwrite, assign) CPTRectAnchor rectAnchor; +/// @name Initialization +/// @{ -(nonnull instancetype)initWithAnchorLayer:(nonnull CPTLayer *)anchorLayer NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +/// @} @end diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index 40a7d1464..34e48c4a0 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -26,7 +26,7 @@ -(void)setConstraints; **/ @implementation CPTLayerAnnotation -/** @property cpt_weak CPTLayer *anchorLayer +/** @property nullable cpt_weak CPTLayer *anchorLayer * @brief The reference layer. **/ @synthesize anchorLayer; @@ -53,7 +53,7 @@ @implementation CPTLayerAnnotation * @param newAnchorLayer The reference layer. Must be non-@nil. * @return The initialized CPTLayerAnnotation object. **/ --(instancetype)initWithAnchorLayer:(CPTLayer *)newAnchorLayer +-(nonnull instancetype)initWithAnchorLayer:(nonnull CPTLayer *)newAnchorLayer { NSParameterAssert(newAnchorLayer); @@ -77,7 +77,7 @@ -(instancetype)initWithAnchorLayer:(CPTLayer *)newAnchorLayer /// @cond // anchorLayer is required --(instancetype)init +-(nonnull instancetype)init { [NSException raise:CPTException format:@"%@ must be initialized with an anchor layer.", NSStringFromClass([self class])]; return [self initWithAnchorLayer:[CPTLayer layer]]; @@ -96,7 +96,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -112,7 +112,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { anchorLayer = [coder decodeObjectForKey:@"CPTLayerAnnotation.anchorLayer"]; diff --git a/framework/Source/CPTLayerTests.h b/framework/Source/CPTLayerTests.h index 3f507fdd2..af9553bf2 100644 --- a/framework/Source/CPTLayerTests.h +++ b/framework/Source/CPTLayerTests.h @@ -6,7 +6,7 @@ @interface CPTLayerTests : CPTTestCase -@property (nonatomic, readwrite, strong) CPTLayer *layer; -@property (nonatomic, readwrite, strong) CPTNumberArray positions; +@property (nonatomic, readwrite, strong, nonnull) CPTLayer *layer; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray positions; @end diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 2e6e4ac8e..c74f698f6 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -27,21 +27,21 @@ /// @cond @interface CPTLegend() -@property (nonatomic, readwrite, strong) CPTMutablePlotArray plots; -@property (nonatomic, readwrite, strong) CPTMutableLegendEntryArray legendEntries; -@property (nonatomic, readwrite, strong) CPTNumberArray rowHeightsThatFit; -@property (nonatomic, readwrite, strong) CPTNumberArray columnWidthsThatFit; +@property (nonatomic, readwrite, strong, nonnull) CPTMutablePlotArray plots; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableLegendEntryArray legendEntries; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray rowHeightsThatFit; +@property (nonatomic, readwrite, strong, nullable) CPTNumberArray columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; -@property (nonatomic, readwrite, cpt_weak_property) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; +@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; -(void)recalculateLayout; --(void)removeLegendEntriesForPlot:(CPTPlot *)plot; +-(void)removeLegendEntriesForPlot:(nonnull CPTPlot *)plot; --(void)legendEntryForInteractionPoint:(CGPoint)interactionPoint row:(NSUInteger *)row col:(NSUInteger *)col; +-(void)legendEntryForInteractionPoint:(CGPoint)interactionPoint row:(nonnull NSUInteger *)row col:(nonnull NSUInteger *)col; --(void)legendNeedsRedraw:(NSNotification *)notif; --(void)legendNeedsLayout:(NSNotification *)notif; --(void)legendNeedsReloadEntries:(NSNotification *)notif; +-(void)legendNeedsRedraw:(nonnull NSNotification *)notif; +-(void)legendNeedsLayout:(nonnull NSNotification *)notif; +-(void)legendNeedsReloadEntries:(nonnull NSNotification *)notif; @end @@ -66,7 +66,7 @@ -(void)legendNeedsReloadEntries:(NSNotification *)notif; **/ @implementation CPTLegend -/** @property CPTTextStyle *textStyle +/** @property nullable CPTTextStyle *textStyle * @brief The text style used to draw all legend entry titles. **/ @synthesize textStyle; @@ -77,7 +77,7 @@ @implementation CPTLegend **/ @synthesize swatchSize; -/** @property CPTLineStyle *swatchBorderLineStyle +/** @property nullable CPTLineStyle *swatchBorderLineStyle * @brief The line style for the border drawn around each swatch. * If @nil (the default), no border is drawn. **/ @@ -89,13 +89,13 @@ @implementation CPTLegend **/ @synthesize swatchCornerRadius; -/** @property CPTFill *swatchFill +/** @property nullable CPTFill *swatchFill * @brief The background fill drawn behind each swatch. * If @nil (the default), no fill is drawn. **/ @synthesize swatchFill; -/** @property CPTLineStyle *entryBorderLineStyle +/** @property nullable CPTLineStyle *entryBorderLineStyle * @brief The line style for the border drawn around each legend entry. * If @nil (the default), no border is drawn. **/ @@ -107,7 +107,7 @@ @implementation CPTLegend **/ @synthesize entryCornerRadius; -/** @property CPTFill *entryFill +/** @property nullable CPTFill *entryFill * @brief The background fill drawn behind each legend entry. * If @nil (the default), no fill is drawn. **/ @@ -160,7 +160,7 @@ @implementation CPTLegend **/ @synthesize equalColumns; -/** @property CPTNumberArray rowHeights +/** @property nullable CPTNumberArray rowHeights * @brief The desired height of each row of legend entries, including the swatch and title. * Each element in this array should be an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). If @nil, all rows will be sized automatically. @@ -169,14 +169,14 @@ @implementation CPTLegend **/ @synthesize rowHeights; -/** @property CPTNumberArray rowHeightsThatFit +/** @property nullable CPTNumberArray rowHeightsThatFit * @brief The computed best-fit height of each row of legend entries, including the swatch and title. * Each element in this array is an NSNumber representing the height of the corresponding row in device units. * Rows are numbered from top to bottom starting from zero (@num{0}). **/ @synthesize rowHeightsThatFit; -/** @property CPTNumberArray columnWidths +/** @property nullable CPTNumberArray columnWidths * @brief The desired width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array should be an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). If @nil, all columns will be sized automatically. @@ -185,7 +185,7 @@ @implementation CPTLegend **/ @synthesize columnWidths; -/** @property CPTNumberArray columnWidthsThatFit +/** @property nullable CPTNumberArray columnWidthsThatFit * @brief The computed best-fit width of each column of legend entries, including the swatch, title, and title offset. * Each element in this array is an NSNumber representing the width of the corresponding column in device units. * Columns are numbered from left to right starting from zero (@num{0}). @@ -207,12 +207,14 @@ @implementation CPTLegend **/ @synthesize titleOffset; -/** @property CPTMutablePlotArray plots +/** @internal + * @property nonnull CPTMutablePlotArray plots * @brief An array of all plots associated with the legend. **/ @synthesize plots; -/** @property CPTMutableLegendEntryArray legendEntries +/** @internal + * @property nonnull CPTMutableLegendEntryArray legendEntries * @brief An array of all legend entries. **/ @synthesize legendEntries; @@ -223,7 +225,7 @@ @implementation CPTLegend @synthesize layoutChanged; /** @internal - * @property cpt_weak CPTLegendEntry *pointingDeviceDownEntry + * @property nullable cpt_weak CPTLegendEntry *pointingDeviceDownEntry * @brief The legend entry that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownEntry; @@ -235,7 +237,7 @@ @implementation CPTLegend * @param newPlots An array of plots. * @return A new CPTLegend instance. **/ -+(instancetype)legendWithPlots:(CPTPlotArray)newPlots ++(nonnull instancetype)legendWithPlots:(nullable CPTPlotArray)newPlots { return [[self alloc] initWithPlots:newPlots]; } @@ -244,7 +246,7 @@ +(instancetype)legendWithPlots:(CPTPlotArray)newPlots * @param graph The graph. * @return A new CPTLegend instance. **/ -+(instancetype)legendWithGraph:(CPTGraph *)graph ++(nonnull instancetype)legendWithGraph:(nullable __kindof CPTGraph *)graph { return [[self alloc] initWithGraph:graph]; } @@ -291,7 +293,7 @@ +(instancetype)legendWithGraph:(CPTGraph *)graph * @param newFrame The frame rectangle. * @return The initialized CPTLegend object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { plots = [[NSMutableArray alloc] init]; @@ -339,7 +341,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame * @param newPlots An array of plots. * @return The initialized CPTLegend object. **/ --(instancetype)initWithPlots:(CPTPlotArray)newPlots +-(nonnull instancetype)initWithPlots:(nullable CPTPlotArray)newPlots { if ( (self = [self initWithFrame:CGRectZero]) ) { for ( CPTPlot *plot in newPlots ) { @@ -353,7 +355,7 @@ -(instancetype)initWithPlots:(CPTPlotArray)newPlots * @param graph A graph. * @return The initialized CPTLegend object. **/ --(instancetype)initWithGraph:(CPTGraph *)graph +-(nonnull instancetype)initWithGraph:(nullable __kindof CPTGraph *)graph { if ( (self = [self initWithFrame:CGRectZero]) ) { for ( CPTPlot *plot in [graph allPlots] ) { @@ -365,7 +367,7 @@ -(instancetype)initWithGraph:(CPTGraph *)graph /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTLegend *theLayer = (CPTLegend *)layer; @@ -414,7 +416,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -449,11 +451,25 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownEntry } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - plots = [[coder decodeObjectForKey:@"CPTLegend.plots"] mutableCopy]; - legendEntries = [[coder decodeObjectForKey:@"CPTLegend.legendEntries"] mutableCopy]; + NSArray *plotArray = [coder decodeObjectForKey:@"CPTLegend.plots"]; + if ( plotArray ) { + plots = [plotArray mutableCopy]; + } + else { + plots = [[NSMutableArray alloc] init]; + } + + NSArray *entries = [coder decodeObjectForKey:@"CPTLegend.legendEntries"]; + if ( entries ) { + legendEntries = [entries mutableCopy]; + } + else { + legendEntries = [[NSMutableArray alloc] init]; + } + layoutChanged = [coder decodeBoolForKey:@"CPTLegend.layoutChanged"]; textStyle = [[coder decodeObjectForKey:@"CPTLegend.textStyle"] copy]; swatchSize = [coder decodeCPTSizeForKey:@"CPTLegend.swatchSize"]; @@ -491,7 +507,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -647,7 +663,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -830,7 +846,7 @@ -(void)recalculateLayout /** @brief All plots associated with the legend. * @return An array of all plots associated with the legend. **/ --(CPTPlotArray)allPlots +-(nonnull CPTPlotArray)allPlots { return [NSArray arrayWithArray:self.plots]; } @@ -839,7 +855,7 @@ -(CPTPlotArray)allPlots * @param idx An index within the bounds of the plot array. * @return The plot at the given index. **/ --(CPTPlot *)plotAtIndex:(NSUInteger)idx +-(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx { if ( idx < self.plots.count ) { return (self.plots)[idx]; @@ -853,7 +869,7 @@ -(CPTPlot *)plotAtIndex:(NSUInteger)idx * @param identifier A plot identifier. * @return The plot with the given identifier or nil if it was not found. **/ --(CPTPlot *)plotWithIdentifier:(id)identifier +-(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier { for ( CPTPlot *plot in self.plots ) { if ( [[plot identifier] isEqual:identifier] ) { @@ -869,7 +885,7 @@ -(CPTPlot *)plotWithIdentifier:(id)identifier /** @brief Add a plot to the legend. * @param plot The plot. **/ --(void)addPlot:(CPTPlot *)plot +-(void)addPlot:(nonnull CPTPlot *)plot { if ( [plot isKindOfClass:[CPTPlot class]] ) { [self.plots addObject:plot]; @@ -898,7 +914,7 @@ -(void)addPlot:(CPTPlot *)plot * @param plot The plot. * @param idx An index within the bounds of the plot array. **/ --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx { if ( [plot isKindOfClass:[CPTPlot class]] ) { CPTMutablePlotArray thePlots = self.plots; @@ -943,7 +959,7 @@ -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx /** @brief Remove a plot from the legend. * @param plot The plot to remove. **/ --(void)removePlot:(CPTPlot *)plot +-(void)removePlot:(nonnull CPTPlot *)plot { if ( [self.plots containsObject:plot] ) { [self.plots removeObjectIdenticalTo:plot]; @@ -961,7 +977,7 @@ -(void)removePlot:(CPTPlot *)plot /** @brief Remove a plot from the legend. * @param identifier The identifier of the plot to remove. **/ --(void)removePlotWithIdentifier:(id)identifier +-(void)removePlotWithIdentifier:(nullable id)identifier { CPTPlot *plotToRemove = [self plotWithIdentifier:identifier]; @@ -981,7 +997,7 @@ -(void)removePlotWithIdentifier:(id)identifier * @brief Remove all legend entries for the given plot from the legend. * @param plot The plot. **/ --(void)removeLegendEntriesForPlot:(CPTPlot *)plot +-(void)removeLegendEntriesForPlot:(nonnull CPTPlot *)plot { CPTMutableLegendEntryArray theLegendEntries = self.legendEntries; CPTMutableLegendEntryArray entriesToRemove = [[NSMutableArray alloc] init]; @@ -1001,18 +1017,18 @@ -(void)removeLegendEntriesForPlot:(CPTPlot *)plot /// @cond --(void)legendNeedsRedraw:(NSNotification *)notif +-(void)legendNeedsRedraw:(nonnull NSNotification *)notif { [self setNeedsDisplay]; } --(void)legendNeedsLayout:(NSNotification *)notif +-(void)legendNeedsLayout:(nonnull NSNotification *)notif { self.layoutChanged = YES; [self setNeedsDisplay]; } --(void)legendNeedsReloadEntries:(NSNotification *)notif +-(void)legendNeedsReloadEntries:(nonnull NSNotification *)notif { CPTPlot *thePlot = (CPTPlot *)notif.object; @@ -1051,7 +1067,7 @@ -(void)legendNeedsReloadEntries:(NSNotification *)notif /// @cond --(void)legendEntryForInteractionPoint:(CGPoint)interactionPoint row:(NSUInteger *)row col:(NSUInteger *)col +-(void)legendEntryForInteractionPoint:(CGPoint)interactionPoint row:(nonnull NSUInteger *)row col:(nonnull NSUInteger *)col { // Convert the interaction point to the local coordinate system CPTGraph *theGraph = self.graph; @@ -1137,7 +1153,7 @@ -(void)legendEntryForInteractionPoint:(CGPoint)interactionPoint row:(NSUInteger * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( self.hidden || (self.plots.count == 0) ) { return NO; @@ -1204,7 +1220,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTLegendEntry *selectedDownEntry = self.pointingDeviceDownEntry; @@ -1270,7 +1286,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ for plots %@>", [super description], self.plots]; } @@ -1282,7 +1298,7 @@ -(NSString *)description /// @cond --(void)setTextStyle:(CPTTextStyle *)newTextStyle +-(void)setTextStyle:(nullable CPTTextStyle *)newTextStyle { if ( newTextStyle != textStyle ) { textStyle = [newTextStyle copy]; @@ -1318,7 +1334,7 @@ -(CGSize)swatchSize return theSwatchSize; } --(void)setSwatchBorderLineStyle:(CPTLineStyle *)newSwatchBorderLineStyle +-(void)setSwatchBorderLineStyle:(nullable CPTLineStyle *)newSwatchBorderLineStyle { if ( newSwatchBorderLineStyle != swatchBorderLineStyle ) { swatchBorderLineStyle = [newSwatchBorderLineStyle copy]; @@ -1334,7 +1350,7 @@ -(void)setSwatchCornerRadius:(CGFloat)newSwatchCornerRadius } } --(void)setSwatchFill:(CPTFill *)newSwatchFill +-(void)setSwatchFill:(nullable CPTFill *)newSwatchFill { if ( newSwatchFill != swatchFill ) { swatchFill = [newSwatchFill copy]; @@ -1342,7 +1358,7 @@ -(void)setSwatchFill:(CPTFill *)newSwatchFill } } --(void)setEntryBorderLineStyle:(CPTLineStyle *)newEntryBorderLineStyle +-(void)setEntryBorderLineStyle:(nullable CPTLineStyle *)newEntryBorderLineStyle { if ( newEntryBorderLineStyle != entryBorderLineStyle ) { entryBorderLineStyle = [newEntryBorderLineStyle copy]; @@ -1358,7 +1374,7 @@ -(void)setEntryCornerRadius:(CGFloat)newEntryCornerRadius } } --(void)setEntryFill:(CPTFill *)newEntryFill +-(void)setEntryFill:(nullable CPTFill *)newEntryFill { if ( newEntryFill != entryFill ) { entryFill = [newEntryFill copy]; @@ -1430,7 +1446,7 @@ -(void)setEqualColumns:(BOOL)newEqualColumns } } --(void)setRowHeights:(CPTNumberArray)newRowHeights +-(void)setRowHeights:(nullable CPTNumberArray)newRowHeights { if ( newRowHeights != rowHeights ) { rowHeights = [newRowHeights copy]; @@ -1438,7 +1454,7 @@ -(void)setRowHeights:(CPTNumberArray)newRowHeights } } --(void)setColumnWidths:(CPTNumberArray)newColumnWidths +-(void)setColumnWidths:(nullable CPTNumberArray)newColumnWidths { if ( newColumnWidths != columnWidths ) { columnWidths = [newColumnWidths copy]; @@ -1514,7 +1530,7 @@ -(void)setPaddingBottom:(CGFloat)newPadding } } --(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle +-(void)setBorderLineStyle:(nullable CPTLineStyle *)newLineStyle { CPTLineStyle *oldLineStyle = self.borderLineStyle; @@ -1527,7 +1543,7 @@ -(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle } } --(CPTNumberArray)rowHeightsThatFit +-(nullable CPTNumberArray)rowHeightsThatFit { if ( !rowHeightsThatFit ) { [self recalculateLayout]; @@ -1535,7 +1551,7 @@ -(CPTNumberArray)rowHeightsThatFit return rowHeightsThatFit; } --(CPTNumberArray)columnWidthsThatFit +-(nullable CPTNumberArray)columnWidthsThatFit { if ( !columnWidthsThatFit ) { [self recalculateLayout]; diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index e3382aba2..8fe8c9634 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -9,8 +9,8 @@ /// @cond @interface CPTLegendEntry() -@property (nonatomic, readonly) NSString *title; -@property (nonatomic, readonly) NSAttributedString *attributedTitle; +@property (nonatomic, readonly, nullable) NSString *title; +@property (nonatomic, readonly, nullable) NSAttributedString *attributedTitle; @end @@ -23,7 +23,7 @@ @interface CPTLegendEntry() **/ @implementation CPTLegendEntry -/** @property cpt_weak CPTPlot *plot +/** @property nullable cpt_weak CPTPlot *plot * @brief The plot associated with this legend entry. **/ @synthesize plot; @@ -45,14 +45,19 @@ @implementation CPTLegendEntry /// @cond -/** @property NSString *title +/** @property nullable NSString *title * @brief The legend entry title. **/ @dynamic title; +/** @property nullable NSAttributedString *attributedTitle + * @brief The legend entry attributed title. + **/ +@dynamic attributedTitle; + /// @endcond -/** @property CPTTextStyle *textStyle +/** @property nullable CPTTextStyle *textStyle * @brief The text style used to draw the legend entry title. **/ @synthesize textStyle; @@ -79,7 +84,7 @@ @implementation CPTLegendEntry * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { plot = nil; @@ -98,7 +103,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeConditionalObject:self.plot forKey:@"CPTLegendEntry.plot"]; [coder encodeInteger:(NSInteger)self.index forKey:@"CPTLegendEntry.index"]; @@ -107,7 +112,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.textStyle forKey:@"CPTLegendEntry.textStyle"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { plot = [coder decodeObjectForKey:@"CPTLegendEntry.plot"]; @@ -129,7 +134,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @param context The graphics context to draw into. * @param scale The drawing scale factor. Must be greater than zero (@num{0}). **/ --(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFloat)scale +-(void)drawTitleInRect:(CGRect)rect inContext:(nonnull CGContextRef)context scale:(CGFloat)scale { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGContextSaveGState(context); @@ -180,14 +185,14 @@ -(void)drawTitleInRect:(CGRect)rect inContext:(CGContextRef)context scale:(CGFlo /// @cond --(NSString *)title +-(nullable NSString *)title { CPTPlot *thePlot = self.plot; return [thePlot titleForLegendEntryAtIndex:self.index]; } --(NSAttributedString *)attributedTitle +-(nullable NSAttributedString *)attributedTitle { CPTPlot *thePlot = self.plot; diff --git a/framework/Source/CPTLimitBand.h b/framework/Source/CPTLimitBand.h index dcda555e5..f15389e8c 100644 --- a/framework/Source/CPTLimitBand.h +++ b/framework/Source/CPTLimitBand.h @@ -27,7 +27,7 @@ typedef NSMutableArray *CPTMutableLimitBandArray; /// @name Initialization /// @{ -(nonnull instancetype)initWithRange:(nullable CPTPlotRange *)newRange fill:(nullable CPTFill *)newFill NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index 5e4a17017..80c9eb28e 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -8,12 +8,12 @@ **/ @implementation CPTLimitBand -/** @property CPTPlotRange *range +/** @property nullable CPTPlotRange *range * @brief The data range for the band. **/ @synthesize range; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill used to draw the band. **/ @synthesize fill; @@ -26,7 +26,7 @@ @implementation CPTLimitBand * @param newFill The fill used to draw the interior of the band. * @return A new CPTLimitBand instance initialized with the provided range and fill. **/ -+(instancetype)limitBandWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill ++(nonnull instancetype)limitBandWithRange:(nullable CPTPlotRange *)newRange fill:(nullable CPTFill *)newFill { return [[CPTLimitBand alloc] initWithRange:newRange fill:newFill]; } @@ -36,7 +36,7 @@ +(instancetype)limitBandWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFi * @param newFill The fill used to draw the interior of the band. * @return The initialized CPTLimitBand object. **/ --(instancetype)initWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill +-(nonnull instancetype)initWithRange:(nullable CPTPlotRange *)newRange fill:(nullable CPTFill *)newFill { if ( (self = [super init]) ) { range = newRange; @@ -47,7 +47,7 @@ -(instancetype)initWithRange:(CPTPlotRange *)newRange fill:(CPTFill *)newFill /// @cond --(instancetype)init +-(nonnull instancetype)init { return [self initWithRange:nil fill:nil]; } @@ -59,7 +59,7 @@ -(instancetype)init /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTLimitBand *newBand = [[CPTLimitBand allocWithZone:zone] init]; @@ -77,7 +77,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)encoder +-(void)encodeWithCoder:(nonnull NSCoder *)encoder { if ( [encoder allowsKeyedCoding] ) { [encoder encodeObject:self.range forKey:@"CPTLimitBand.range"]; @@ -95,7 +95,7 @@ -(void)encodeWithCoder:(NSCoder *)encoder * @param decoder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)decoder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder { if ( (self = [super init]) ) { if ( [decoder allowsKeyedCoding] ) { @@ -115,7 +115,7 @@ -(instancetype)initWithCoder:(NSCoder *)decoder /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ with range: %@ and fill: %@>", [super description], self.range, self.fill]; } diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index 924f1f56a..4bd91cf5d 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -35,19 +35,19 @@ @implementation CPTLineCap **/ @synthesize lineCapType; -/** @property CPTLineStyle *lineStyle +/** @property nullable CPTLineStyle *lineStyle * @brief The line style for the border of the line cap. * If @nil, the border is not drawn. **/ @synthesize lineStyle; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill for the interior of the line cap. * If @nil, the symbol is not filled. **/ @synthesize fill; -/** @property CGPathRef customLineCapPath +/** @property nullable CGPathRef customLineCapPath * @brief The drawing path for a custom line cap. It will be scaled to size before being drawn. **/ @synthesize customLineCapPath; @@ -78,7 +78,7 @@ @implementation CPTLineCap * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { size = CPTSizeMake(5.0, 5.0); @@ -109,7 +109,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCPTSize:self.size forKey:@"CPTLineCap.size"]; [coder encodeInteger:self.lineCapType forKey:@"CPTLineCap.lineCapType"]; @@ -122,7 +122,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // cachedLineCapPath } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { size = [coder decodeCPTSizeForKey:@"CPTLineCap.size"]; @@ -160,7 +160,7 @@ -(void)setLineCapType:(CPTLineCapType)newType } } --(void)setCustomLineCapPath:(CGPathRef)newPath +-(void)setCustomLineCapPath:(nullable CGPathRef)newPath { if ( customLineCapPath != newPath ) { CGPathRelease(customLineCapPath); @@ -169,7 +169,7 @@ -(void)setCustomLineCapPath:(CGPathRef)newPath } } --(CGPathRef)cachedLineCapPath +-(nullable CGPathRef)cachedLineCapPath { if ( !cachedLineCapPath ) { cachedLineCapPath = [self newLineCapPath]; @@ -177,7 +177,7 @@ -(CGPathRef)cachedLineCapPath return cachedLineCapPath; } --(void)setCachedLineCapPath:(CGPathRef)newPath +-(void)setCachedLineCapPath:(nullable CGPathRef)newPath { if ( cachedLineCapPath != newPath ) { CGPathRelease(cachedLineCapPath); @@ -193,7 +193,7 @@ -(void)setCachedLineCapPath:(CGPathRef)newPath /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeNone. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeNone. **/ -+(instancetype)lineCap ++(nonnull instancetype)lineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -205,7 +205,7 @@ +(instancetype)lineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeOpenArrow. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeOpenArrow. **/ -+(instancetype)openArrowPlotLineCap ++(nonnull instancetype)openArrowPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -217,7 +217,7 @@ +(instancetype)openArrowPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSolidArrow. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSolidArrow. **/ -+(instancetype)solidArrowPlotLineCap ++(nonnull instancetype)solidArrowPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -229,7 +229,7 @@ +(instancetype)solidArrowPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSweptArrow. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSweptArrow. **/ -+(instancetype)sweptArrowPlotLineCap ++(nonnull instancetype)sweptArrowPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -241,7 +241,7 @@ +(instancetype)sweptArrowPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeRectangle. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeRectangle. **/ -+(instancetype)rectanglePlotLineCap ++(nonnull instancetype)rectanglePlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -253,7 +253,7 @@ +(instancetype)rectanglePlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeEllipse. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeEllipse. **/ -+(instancetype)ellipsePlotLineCap ++(nonnull instancetype)ellipsePlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -265,7 +265,7 @@ +(instancetype)ellipsePlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeDiamond. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeDiamond. **/ -+(instancetype)diamondPlotLineCap ++(nonnull instancetype)diamondPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -277,7 +277,7 @@ +(instancetype)diamondPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypePentagon. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypePentagon. **/ -+(instancetype)pentagonPlotLineCap ++(nonnull instancetype)pentagonPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -289,7 +289,7 @@ +(instancetype)pentagonPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeHexagon. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeHexagon. **/ -+(instancetype)hexagonPlotLineCap ++(nonnull instancetype)hexagonPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -301,7 +301,7 @@ +(instancetype)hexagonPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeBar. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeBar. **/ -+(instancetype)barPlotLineCap ++(nonnull instancetype)barPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -313,7 +313,7 @@ +(instancetype)barPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeCross. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeCross. **/ -+(instancetype)crossPlotLineCap ++(nonnull instancetype)crossPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -325,7 +325,7 @@ +(instancetype)crossPlotLineCap /** @brief Creates and returns a new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSnow. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeSnow. **/ -+(instancetype)snowPlotLineCap ++(nonnull instancetype)snowPlotLineCap { CPTLineCap *lineCap = [[self alloc] init]; @@ -338,7 +338,7 @@ +(instancetype)snowPlotLineCap * @param aPath The bounding path for the custom line cap. * @return A new CPTLineCap instance initialized with a line cap type of #CPTLineCapTypeCustom. **/ -+(instancetype)customLineCapWithPath:(CGPathRef)aPath ++(nonnull instancetype)customLineCapWithPath:(nullable CGPathRef)aPath { CPTLineCap *lineCap = [[self alloc] init]; @@ -353,7 +353,7 @@ +(instancetype)customLineCapWithPath:(CGPathRef)aPath /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTLineCap *copy = [[[self class] allocWithZone:zone] init]; @@ -382,7 +382,7 @@ -(id)copyWithZone:(NSZone *)zone * @param center The center point of the line cap. * @param direction The direction the line is pointing. **/ --(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center inDirection:(CGPoint)direction +-(void)renderAsVectorInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center inDirection:(CGPoint)direction { CGPathRef theLineCapPath = self.cachedLineCapPath; @@ -462,7 +462,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center inD * The path is standardized for a line direction of @quote{up}. * @return A path describing the outline of the current line cap type. **/ --(CGPathRef)newLineCapPath +-(nonnull CGPathRef)newLineCapPath { CGFloat dx, dy; CGSize lineCapSize = self.size; @@ -584,7 +584,7 @@ -(CGPathRef)newLineCapPath /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { const CGSize symbolSize = self.size; const CGSize halfSize = CPTSizeMake( symbolSize.width * CPTFloat(0.5), symbolSize.height * CPTFloat(0.5) ); diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index d289073d7..f01f95fd1 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -22,7 +22,7 @@ @interface CPTLineStyle() @property (nonatomic, readwrite, strong, nullable) CPTFill *lineFill; @property (nonatomic, readwrite, strong, nullable) CPTGradient *lineGradient; --(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)context; +-(void)strokePathWithGradient:(nonnull CPTGradient *)gradient inContext:(nonnull CGContextRef)context; @end @@ -65,7 +65,7 @@ @implementation CPTLineStyle **/ @synthesize lineWidth; -/** @property CPTNumberArray dashPattern +/** @property nullable CPTNumberArray dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @synthesize dashPattern; @@ -75,19 +75,19 @@ @implementation CPTLineStyle **/ @synthesize patternPhase; -/** @property CPTColor *lineColor +/** @property nullable CPTColor *lineColor * @brief The current stroke color in a context. Default is solid black. **/ @synthesize lineColor; -/** @property CPTFill *lineFill +/** @property nullable CPTFill *lineFill * @brief The current line fill. Default is @nil. * * If @nil, the line is drawn using the @ref lineGradient or @ref lineColor. **/ @synthesize lineFill; -/** @property CPTGradient *lineGradient +/** @property nullable CPTGradient *lineGradient * @brief The current line gradient fill. Default is @nil. * * If @nil, the line is drawn using the @ref lineFill or @ref lineColor. @@ -105,7 +105,7 @@ @implementation CPTLineStyle /** @brief Creates and returns a new CPTLineStyle instance. * @return A new CPTLineStyle instance. **/ -+(instancetype)lineStyle ++(nonnull instancetype)lineStyle { return [[self alloc] init]; } @@ -117,7 +117,7 @@ +(instancetype)lineStyle * @param lineStyle An existing CPTLineStyle. * @return A new line style instance. **/ -+(instancetype)lineStyleWithStyle:(CPTLineStyle *)lineStyle ++(nonnull instancetype)lineStyleWithStyle:(nullable CPTLineStyle *)lineStyle { CPTLineStyle *newLineStyle = [[self alloc] init]; @@ -152,7 +152,7 @@ +(instancetype)lineStyleWithStyle:(CPTLineStyle *)lineStyle * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { lineCap = kCGLineCapButt; @@ -175,7 +175,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeInt:self.lineCap forKey:@"CPTLineStyle.lineCap"]; [coder encodeInt:self.lineJoin forKey:@"CPTLineStyle.lineJoin"]; @@ -188,7 +188,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.lineGradient forKey:@"CPTLineStyle.lineGradient"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { lineCap = (CGLineCap)[coder decodeIntForKey:@"CPTLineStyle.lineCap"]; @@ -212,7 +212,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /** @brief Sets all of the line drawing properties in the given graphics context. * @param context The graphics context. **/ --(void)setLineStyleInContext:(CGContextRef)context +-(void)setLineStyleInContext:(nonnull CGContextRef)context { CGContextSetLineCap(context, self.lineCap); CGContextSetLineJoin(context, self.lineJoin); @@ -244,7 +244,7 @@ -(void)setLineStyleInContext:(CGContextRef)context * * @param context The graphics context. **/ --(void)strokePathInContext:(CGContextRef)context +-(void)strokePathInContext:(nonnull CGContextRef)context { CPTGradient *gradient = self.lineGradient; CPTFill *fill = self.lineFill; @@ -267,7 +267,7 @@ -(void)strokePathInContext:(CGContextRef)context * @param rect The rectangle to draw. * @param context The graphics context. **/ --(void)strokeRect:(CGRect)rect inContext:(CGContextRef)context +-(void)strokeRect:(CGRect)rect inContext:(nonnull CGContextRef)context { CPTGradient *gradient = self.lineGradient; CPTFill *fill = self.lineFill; @@ -290,7 +290,7 @@ -(void)strokeRect:(CGRect)rect inContext:(CGContextRef)context /// @cond --(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)context +-(void)strokePathWithGradient:(nonnull CPTGradient *)gradient inContext:(nonnull CGContextRef)context { if ( gradient ) { CGRect deviceRect = CGContextConvertRectToDeviceSpace( context, CPTRectMake(0.0, 0.0, 1.0, 1.0) ); @@ -325,6 +325,8 @@ -(void)strokePathWithGradient:(CPTGradient *)gradient inContext:(CGContextRef)co #pragma mark - #pragma mark Opacity +/// @cond + -(BOOL)isOpaque { BOOL opaqueLine = NO; @@ -344,12 +346,14 @@ -(BOOL)isOpaque return opaqueLine; } +/// @endcond + #pragma mark - #pragma mark NSCopying Methods /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTLineStyle *styleCopy = [[CPTLineStyle allocWithZone:zone] init]; @@ -373,7 +377,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(id)mutableCopyWithZone:(NSZone *)zone +-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone { CPTLineStyle *styleCopy = [[CPTMutableLineStyle allocWithZone:zone] init]; @@ -397,7 +401,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); diff --git a/framework/Source/CPTMutableLineStyle.m b/framework/Source/CPTMutableLineStyle.m index 39b9500a8..c5a4b4e89 100644 --- a/framework/Source/CPTMutableLineStyle.m +++ b/framework/Source/CPTMutableLineStyle.m @@ -29,7 +29,7 @@ @implementation CPTMutableLineStyle **/ @dynamic lineWidth; -/** @property CPTNumberArray dashPattern +/** @property nullable CPTNumberArray dashPattern * @brief The dash-and-space pattern for the line. Default is @nil. **/ @dynamic dashPattern; @@ -39,19 +39,19 @@ @implementation CPTMutableLineStyle **/ @dynamic patternPhase; -/** @property CPTColor *lineColor +/** @property nullable CPTColor *lineColor * @brief The current stroke color in a context. Default is solid black. **/ @dynamic lineColor; -/** @property CPTFill *lineFill +/** @property nullable CPTFill *lineFill * @brief The current line fill. Default is @nil. * * If @nil, the line is drawn using the @ref lineGradient or @ref lineColor. **/ @dynamic lineFill; -/** @property CPTGradient *lineGradient +/** @property nullable CPTGradient *lineGradient * @brief The current line gradient fill. Default is @nil. * * If @nil, the line is drawn using the @ref lineFill or @ref lineColor. diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 371a20365..889c42543 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -24,12 +24,12 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; **/ @implementation CPTMutableNumericData -/** @property void *mutableBytes +/** @property nonnull void *mutableBytes * @brief Returns a pointer to the data buffer’s contents. **/ @dynamic mutableBytes; -/** @property CPTNumberArray shape +/** @property nonnull CPTNumberArray shape * @brief The shape of the data buffer array. Set a new shape to change the size of the data buffer. * * The shape describes the dimensions of the sample array stored in @@ -46,7 +46,7 @@ @implementation CPTMutableNumericData * @param sample The zero-based index into the sample array. The array is treated as if it only has one dimension. * @return A pointer to the sample or @NULL if the sample index is out of bounds. **/ --(void *)mutableSamplePointer:(NSUInteger)sample +-(nullable void *)mutableSamplePointer:(NSUInteger)sample { if ( sample < self.numberOfSamples ) { return (void *)( (char *)self.mutableBytes + sample * self.sampleBytes ); @@ -61,7 +61,7 @@ -(void *)mutableSamplePointer:(NSUInteger)sample * (including @par{index}) should match the @ref numberOfDimensions. * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. **/ --(void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... +-(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... { NSUInteger newIndex; @@ -85,7 +85,7 @@ -(void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... /// @cond --(void *)mutableBytes +-(nonnull void *)mutableBytes { return [(NSMutableData *) self.data mutableBytes]; } diff --git a/framework/Source/CPTMutablePlotRange.h b/framework/Source/CPTMutablePlotRange.h index 0735717f7..a4d602679 100644 --- a/framework/Source/CPTMutablePlotRange.h +++ b/framework/Source/CPTMutablePlotRange.h @@ -4,8 +4,8 @@ /// @name Range Limits /// @{ -@property (nonatomic, readwrite, strong) NSNumber *location; -@property (nonatomic, readwrite, strong) NSNumber *length; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *location; +@property (nonatomic, readwrite, strong, nonnull) NSNumber *length; @property (nonatomic, readwrite) NSDecimal locationDecimal; @property (nonatomic, readwrite) NSDecimal lengthDecimal; @property (nonatomic, readwrite) double locationDouble; @@ -14,19 +14,19 @@ /// @name Combining Ranges /// @{ --(void)unionPlotRange:(CPTPlotRange *)otherRange; --(void)intersectionPlotRange:(CPTPlotRange *)otherRange; +-(void)unionPlotRange:(nullable CPTPlotRange *)otherRange; +-(void)intersectionPlotRange:(nullable CPTPlotRange *)otherRange; /// @} /// @name Shifting Ranges /// @{ --(void)shiftLocationToFitInRange:(CPTPlotRange *)otherRange; --(void)shiftEndToFitInRange:(CPTPlotRange *)otherRange; +-(void)shiftLocationToFitInRange:(nonnull CPTPlotRange *)otherRange; +-(void)shiftEndToFitInRange:(nonnull CPTPlotRange *)otherRange; /// @} /// @name Expanding/Contracting Ranges /// @{ --(void)expandRangeByFactor:(NSNumber *)factor; +-(void)expandRangeByFactor:(nonnull NSNumber *)factor; /// @} @end diff --git a/framework/Source/CPTMutablePlotRange.m b/framework/Source/CPTMutablePlotRange.m index 3e54ebf41..4f17749f1 100644 --- a/framework/Source/CPTMutablePlotRange.m +++ b/framework/Source/CPTMutablePlotRange.m @@ -21,13 +21,13 @@ @interface CPTMutablePlotRange() **/ @implementation CPTMutablePlotRange -/** @property NSNumber *location +/** @property nonnull NSNumber *location * @brief The starting value of the range. * @see @ref locationDecimal, @ref locationDouble **/ @dynamic location; -/** @property NSNumber *length +/** @property nonnull NSNumber *length * @brief The length of the range. * @see @ref lengthDecimal, @ref lengthDouble **/ @@ -65,7 +65,7 @@ @implementation CPTMutablePlotRange /** @brief Extends the range to include another range. The sign of @ref length is unchanged. * @param other The other plot range. **/ --(void)unionPlotRange:(CPTPlotRange *)other +-(void)unionPlotRange:(nullable CPTPlotRange *)other { if ( !other ) { return; @@ -96,7 +96,7 @@ -(void)unionPlotRange:(CPTPlotRange *)other /** @brief Sets the messaged object to the intersection with another range. The sign of @ref length is unchanged. * @param other The other plot range. **/ --(void)intersectionPlotRange:(CPTPlotRange *)other +-(void)intersectionPlotRange:(nullable CPTPlotRange *)other { if ( !other ) { return; @@ -136,7 +136,7 @@ -(void)intersectionPlotRange:(CPTPlotRange *)other * @param factor Factor used. A value of @num{1.0} gives no change. * Less than @num{1.0} is a contraction, and greater than @num{1.0} is expansion. **/ --(void)expandRangeByFactor:(NSNumber *)factor +-(void)expandRangeByFactor:(nonnull NSNumber *)factor { NSDecimal oldLength = self.lengthDecimal; NSDecimal newLength = CPTDecimalMultiply(oldLength, factor.decimalValue); @@ -154,7 +154,7 @@ -(void)expandRangeByFactor:(NSNumber *)factor * @param otherRange Other range. * The minimum possible shift is made. The range @ref length is unchanged. **/ --(void)shiftLocationToFitInRange:(CPTPlotRange *)otherRange +-(void)shiftLocationToFitInRange:(nonnull CPTPlotRange *)otherRange { NSParameterAssert(otherRange); @@ -177,7 +177,7 @@ -(void)shiftLocationToFitInRange:(CPTPlotRange *)otherRange * @param otherRange Other range. * The minimum possible shift is made. The range @ref length is unchanged. **/ --(void)shiftEndToFitInRange:(CPTPlotRange *)otherRange +-(void)shiftEndToFitInRange:(nonnull CPTPlotRange *)otherRange { NSParameterAssert(otherRange); diff --git a/framework/Source/CPTMutableShadow.m b/framework/Source/CPTMutableShadow.m index db73e4aef..b30e7afca 100644 --- a/framework/Source/CPTMutableShadow.m +++ b/framework/Source/CPTMutableShadow.m @@ -21,7 +21,7 @@ @implementation CPTMutableShadow **/ @dynamic shadowBlurRadius; -/** @property CPTColor *shadowColor +/** @property nullable CPTColor *shadowColor * @brief The shadow color. If @nil (the default), the shadow will not be drawn. **/ @dynamic shadowColor; diff --git a/framework/Source/CPTMutableTextStyle.m b/framework/Source/CPTMutableTextStyle.m index 4c50dd317..0d63a221f 100644 --- a/framework/Source/CPTMutableTextStyle.m +++ b/framework/Source/CPTMutableTextStyle.m @@ -12,12 +12,12 @@ @implementation CPTMutableTextStyle **/ @dynamic fontSize; -/** @property NSString *fontName +/** @property nullable NSString *fontName * @brief The font name. Default is Helvetica. **/ @dynamic fontName; -/** @property CPTColor *color +/** @property nullable CPTColor *color * @brief The current text color. Default is solid black. **/ @dynamic color; diff --git a/framework/Source/CPTNumericData+TypeConversion.h b/framework/Source/CPTNumericData+TypeConversion.h index 7ae0179c6..7bd08216b 100644 --- a/framework/Source/CPTNumericData+TypeConversion.h +++ b/framework/Source/CPTNumericData+TypeConversion.h @@ -8,15 +8,15 @@ /// @name Type Conversion /// @{ --(CPTNumericData *)dataByConvertingToDataType:(CPTNumericDataType)newDataType; +-(nonnull CPTNumericData *)dataByConvertingToDataType:(CPTNumericDataType)newDataType; --(CPTNumericData *)dataByConvertingToType:(CPTDataTypeFormat)newDataType sampleBytes:(size_t)newSampleBytes byteOrder:(CFByteOrder)newByteOrder; +-(nonnull CPTNumericData *)dataByConvertingToType:(CPTDataTypeFormat)newDataType sampleBytes:(size_t)newSampleBytes byteOrder:(CFByteOrder)newByteOrder; /// @} /// @name Data Conversion Utilities /// @{ --(void)convertData:(NSData *)sourceData dataType:(CPTNumericDataType *)sourceDataType toData:(NSMutableData *)destData dataType:(CPTNumericDataType *)destDataType; --(void)swapByteOrderForData:(NSMutableData *)sourceData sampleSize:(size_t)sampleSize; +-(void)convertData:(nonnull NSData *)sourceData dataType:(nonnull CPTNumericDataType *)sourceDataType toData:(nonnull NSMutableData *)destData dataType:(nonnull CPTNumericDataType *)destDataType; +-(void)swapByteOrderForData:(nonnull NSMutableData *)sourceData sampleSize:(size_t)sampleSize; /// @} @end diff --git a/framework/Source/CPTNumericData+TypeConversion.m b/framework/Source/CPTNumericData+TypeConversion.m index 60b17ddc7..2790710ab 100644 --- a/framework/Source/CPTNumericData+TypeConversion.m +++ b/framework/Source/CPTNumericData+TypeConversion.m @@ -11,9 +11,9 @@ @implementation CPTNumericData(TypeConversion) * @param newByteOrder The new byte order. * @return A copy of the current numeric data converted to the new data type. **/ --(CPTNumericData *)dataByConvertingToType:(CPTDataTypeFormat)newDataType - sampleBytes:(size_t)newSampleBytes - byteOrder:(CFByteOrder)newByteOrder +-(nonnull CPTNumericData *)dataByConvertingToType:(CPTDataTypeFormat)newDataType + sampleBytes:(size_t)newSampleBytes + byteOrder:(CFByteOrder)newByteOrder { return [self dataByConvertingToDataType:CPTDataType(newDataType, newSampleBytes, newByteOrder)]; } @@ -22,7 +22,7 @@ -(CPTNumericData *)dataByConvertingToType:(CPTDataTypeFormat)newDataType * @param newDataType The new data type. * @return A copy of the current numeric data converted to the new data type. **/ --(CPTNumericData *)dataByConvertingToDataType:(CPTNumericDataType)newDataType +-(nonnull CPTNumericData *)dataByConvertingToDataType:(CPTNumericDataType)newDataType { CPTNumericDataType myDataType = self.dataType; @@ -80,10 +80,10 @@ -(CPTNumericData *)dataByConvertingToDataType:(CPTNumericDataType)newDataType * @param destData The destination data buffer. * @param destDataType The new data type. **/ --(void)convertData:(NSData *)sourceData - dataType:(CPTNumericDataType *)sourceDataType - toData:(NSMutableData *)destData - dataType:(CPTNumericDataType *)destDataType +-(void)convertData:(nonnull NSData *)sourceData + dataType:(nonnull CPTNumericDataType *)sourceDataType + toData:(nonnull NSMutableData *)destData + dataType:(nonnull CPTNumericDataType *)destDataType { NSUInteger sampleCount = sourceData.length / sourceDataType->sampleBytes; @@ -2268,7 +2268,7 @@ case sizeof(NSDecimal): * @param sourceData The data buffer. * @param sampleSize The number of bytes in each sample stored in sourceData. **/ --(void)swapByteOrderForData:(NSMutableData *)sourceData sampleSize:(size_t)sampleSize +-(void)swapByteOrderForData:(nonnull NSMutableData *)sourceData sampleSize:(size_t)sampleSize { NSUInteger sampleCount; diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index 83deb4292..41316f7d1 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -51,7 +51,7 @@ -(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData dataTypeString:(nonnull NSString *)newDataTypeString shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Samples diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 89fa45e77..09e552734 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -16,7 +16,7 @@ @interface CPTNumericData() -(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order; -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList; --(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType; +-(nonnull NSData *)dataFromArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType; @end @@ -46,12 +46,12 @@ -(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)ne **/ @implementation CPTNumericData -/** @property NSData *data +/** @property nonnull NSData *data * @brief The data buffer. **/ @synthesize data; -/** @property const void *bytes +/** @property nonnull const void *bytes * @brief Returns a pointer to the data buffer’s contents. **/ @dynamic bytes; @@ -81,7 +81,7 @@ @implementation CPTNumericData **/ @dynamic byteOrder; -/** @property CPTNumberArray shape +/** @property nonnull CPTNumberArray shape * @brief The shape of the data buffer array. * * The shape describes the dimensions of the sample array stored in @@ -115,9 +115,9 @@ @implementation CPTNumericData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithData:(NSData *)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray { return [[self alloc] initWithData:newData dataType:newDataType @@ -130,9 +130,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray { return [[self alloc] initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -149,9 +149,9 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray { return [[self alloc] initWithArray:newData dataType:newDataType @@ -168,9 +168,9 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray { return [[self alloc] initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -184,10 +184,10 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithData:(NSData *)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData dataType:newDataType @@ -202,10 +202,10 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order ++(nonnull instancetype)numericDataWithData:(nonnull NSData *)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [[self alloc] initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -224,10 +224,10 @@ +(instancetype)numericDataWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData dataType:newDataType @@ -246,10 +246,10 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return A new CPTNumericData instance. **/ -+(instancetype)numericDataWithArray:(CPTNumberArray)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order ++(nonnull instancetype)numericDataWithArray:(nonnull CPTNumberArray)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [[self alloc] initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -266,9 +266,9 @@ +(instancetype)numericDataWithArray:(CPTNumberArray)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithData:(NSData *)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray +-(nonnull instancetype)initWithData:(nonnull NSData *)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray { return [self initWithData:newData dataType:newDataType @@ -282,9 +282,9 @@ -(instancetype)initWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray +-(nonnull instancetype)initWithData:(nonnull NSData *)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -301,9 +301,9 @@ -(instancetype)initWithData:(NSData *)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray { return [self initWithData:[self dataFromArray:newData dataType:newDataType] dataType:newDataType @@ -320,9 +320,9 @@ -(instancetype)initWithArray:(CPTNumberArray)newData * @param shapeArray The shape of the data buffer array. Multi-dimensional data arrays will be assumed to be stored in #CPTDataOrderRowsFirst. * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray { return [self initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -336,10 +336,10 @@ -(instancetype)initWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithData:(NSData *)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order +-(nonnull instancetype)initWithData:(nonnull NSData *)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { if ( (self = [super init]) ) { [self commonInitWithData:newData @@ -358,10 +358,10 @@ -(instancetype)initWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithData:(NSData *)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order +-(nonnull instancetype)initWithData:(nonnull NSData *)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [self initWithData:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -380,10 +380,10 @@ -(instancetype)initWithData:(NSData *)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData - dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData + dataType:(CPTNumericDataType)newDataType + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [self initWithData:[self dataFromArray:newData dataType:newDataType] dataType:newDataType @@ -402,10 +402,10 @@ -(instancetype)initWithArray:(CPTNumberArray)newData * @param order The data order for a multi-dimensional data array (row-major or column-major). * @return The initialized CPTNumericData instance. **/ --(instancetype)initWithArray:(CPTNumberArray)newData - dataTypeString:(NSString *)newDataTypeString - shape:(CPTNumberArray)shapeArray - dataOrder:(CPTDataOrder)order +-(nonnull instancetype)initWithArray:(nonnull CPTNumberArray)newData + dataTypeString:(nonnull NSString *)newDataTypeString + shape:(nullable CPTNumberArray)shapeArray + dataOrder:(CPTDataOrder)order { return [self initWithArray:newData dataType:CPTDataTypeWithDataTypeString(newDataTypeString) @@ -415,16 +415,16 @@ -(instancetype)initWithArray:(CPTNumberArray)newData /// @cond --(instancetype)init +-(nonnull instancetype)init { return [self initWithData:[NSData data] dataType:CPTDataType( CPTFloatingPointDataType, sizeof(double), CFByteOrderGetCurrent() ) shape:nil]; } --(void)commonInitWithData:(NSData *)newData +-(void)commonInitWithData:(nonnull NSData *)newData dataType:(CPTNumericDataType)newDataType - shape:(CPTNumberArray)shapeArray + shape:(nullable CPTNumberArray)shapeArray dataOrder:(CPTDataOrder)order { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); @@ -433,12 +433,14 @@ -(void)commonInitWithData:(NSData *)newData self.dataType = newDataType; self.dataOrder = order; - if ( shapeArray == nil ) { + CPTNumberArray theShape = shapeArray; + + if ( theShape == nil ) { self.shape = @[@(self.numberOfSamples)]; } else { NSUInteger prod = 1; - for ( NSNumber *cNum in shapeArray ) { + for ( NSNumber *cNum in theShape ) { prod *= [cNum unsignedIntegerValue]; } @@ -447,7 +449,7 @@ -(void)commonInitWithData:(NSData *)newData format:@"Shape product (%lu) does not match data size (%lu)", (unsigned long)prod, (unsigned long)self.numberOfSamples]; } - self.shape = shapeArray; + self.shape = theShape; } } @@ -463,7 +465,7 @@ -(NSUInteger)numberOfDimensions return self.shape.count; } --(const void *)bytes +-(nonnull const void *)bytes { return self.data.bytes; } @@ -493,7 +495,7 @@ -(CFByteOrder)byteOrder return self.dataType.byteOrder; } --(void)setData:(NSData *)newData +-(void)setData:(nonnull NSData *)newData { if ( data != newData ) { if ( [self isKindOfClass:[CPTMutableNumericData class]] ) { @@ -549,7 +551,7 @@ -(void)setDataType:(CPTNumericDataType)newDataType } } --(void)setShape:(CPTNumberArray)newShape +-(void)setShape:(nonnull CPTNumberArray)newShape { if ( newShape != shape ) { shape = [newShape copy]; @@ -763,7 +765,7 @@ -(const void *)samplePointerAtIndex:(NSUInteger)idx, ... * @note NSNumber does not support complex numbers. Complex number types will be cast to * @float or @double before being wrapped in an instance of NSNumber. **/ --(CPTNumberArray)sampleArray +-(nonnull CPTNumberArray)sampleArray { NSUInteger sampleCount = self.numberOfSamples; @@ -861,7 +863,7 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList return newIndex; } --(NSData *)dataFromArray:(CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType +-(nonnull NSData *)dataFromArray:(nonnull CPTNumberArray)newData dataType:(CPTNumericDataType)newDataType { NSParameterAssert( CPTDataTypeIsSupported(newDataType) ); NSParameterAssert(newDataType.dataTypeFormat != CPTUndefinedDataType); @@ -1097,7 +1099,7 @@ case sizeof(NSDecimal): /// @cond --(NSString *)description +-(nonnull NSString *)description { NSUInteger sampleCount = self.numberOfSamples; NSMutableString *descriptionString = [NSMutableString stringWithCapacity:sampleCount * 3]; @@ -1124,7 +1126,7 @@ -(NSString *)description /// @cond --(id)mutableCopyWithZone:(NSZone *)zone +-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone { return [[CPTMutableNumericData allocWithZone:zone] initWithData:self.data dataType:self.dataType @@ -1139,7 +1141,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { return [[[self class] allocWithZone:zone] initWithData:self.data dataType:self.dataType @@ -1154,7 +1156,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)encoder +-(void)encodeWithCoder:(nonnull NSCoder *)encoder { if ( [encoder allowsKeyedCoding] ) { [encoder encodeObject:self.data forKey:@"CPTNumericData.data"]; @@ -1188,7 +1190,7 @@ -(void)encodeWithCoder:(NSCoder *)encoder * @param decoder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)decoder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder { if ( (self = [super init]) ) { NSData *newData; diff --git a/framework/Source/CPTNumericDataType.m b/framework/Source/CPTNumericDataType.m index 4ea9e4171..22c84c9a0 100644 --- a/framework/Source/CPTNumericDataType.m +++ b/framework/Source/CPTNumericDataType.m @@ -2,9 +2,9 @@ #import "complex.h" -static CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString); -static size_t SampleBytesForDataTypeString(NSString *dataTypeString); -static CFByteOrder ByteOrderForDataTypeString(NSString *dataTypeString); +static CPTDataTypeFormat DataTypeForDataTypeString(NSString *__nonnull dataTypeString); +static size_t SampleBytesForDataTypeString(NSString *__nonnull dataTypeString); +static CFByteOrder ByteOrderForDataTypeString(NSString *__nonnull dataTypeString); #pragma mark - #pragma mark Data type utilities @@ -30,7 +30,7 @@ CPTNumericDataType CPTDataType(CPTDataTypeFormat format, size_t sampleBytes, CFB * @param dataTypeString The data type string. * @return The initialized CPTNumericDataType struct. **/ -CPTNumericDataType CPTDataTypeWithDataTypeString(NSString *dataTypeString) +CPTNumericDataType CPTDataTypeWithDataTypeString(NSString *__nonnull dataTypeString) { CPTNumericDataType type; @@ -193,7 +193,7 @@ BOOL CPTDataTypeEqualToDataType(CPTNumericDataType dataType1, CPTNumericDataType #pragma mark - #pragma mark Private functions -CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString) +CPTDataTypeFormat DataTypeForDataTypeString(NSString *__nonnull dataTypeString) { CPTDataTypeFormat result = CPTUndefinedDataType; @@ -231,7 +231,7 @@ CPTDataTypeFormat DataTypeForDataTypeString(NSString *dataTypeString) return result; } -size_t SampleBytesForDataTypeString(NSString *dataTypeString) +size_t SampleBytesForDataTypeString(NSString *__nonnull dataTypeString) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" @@ -243,7 +243,7 @@ size_t SampleBytesForDataTypeString(NSString *dataTypeString) return (size_t)result; } -CFByteOrder ByteOrderForDataTypeString(NSString *dataTypeString) +CFByteOrder ByteOrderForDataTypeString(NSString *__nonnull dataTypeString) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" diff --git a/framework/Source/CPTPathExtensions.m b/framework/Source/CPTPathExtensions.m index d2f9bed3c..245c942ac 100644 --- a/framework/Source/CPTPathExtensions.m +++ b/framework/Source/CPTPathExtensions.m @@ -8,7 +8,7 @@ * @param cornerRadius The radius of the rounded corners. * @return The new path. Caller is responsible for releasing this. **/ -CGPathRef CPTCreateRoundedRectPath(CGRect rect, CGFloat cornerRadius) +__nonnull CGPathRef CPTCreateRoundedRectPath(CGRect rect, CGFloat cornerRadius) { if ( cornerRadius > CPTFloat(0.0) ) { cornerRadius = MIN( MIN( cornerRadius, rect.size.width * CPTFloat(0.5) ), rect.size.height * CPTFloat(0.5) ); @@ -52,7 +52,7 @@ CGPathRef CPTCreateRoundedRectPath(CGRect rect, CGFloat cornerRadius) * @param rect The bounding rectangle for the path. * @param cornerRadius The radius of the rounded corners. **/ -void CPTAddRoundedRectPath(CGContextRef context, CGRect rect, CGFloat cornerRadius) +void CPTAddRoundedRectPath(__nonnull CGContextRef context, CGRect rect, CGFloat cornerRadius) { CGPathRef path = CPTCreateRoundedRectPath(rect, cornerRadius); diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index de34f4ca0..9d043a173 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -32,9 +32,9 @@ /// @cond @interface CPTPieChart() -@property (nonatomic, readwrite, copy) CPTNumberArray sliceWidths; -@property (nonatomic, readwrite, copy) CPTFillArray sliceFills; -@property (nonatomic, readwrite, copy) CPTNumberArray sliceRadialOffsets; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray sliceWidths; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray sliceFills; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray sliceRadialOffsets; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)updateNormalizedData; @@ -42,8 +42,8 @@ -(CGFloat)radiansForPieSliceValue:(CGFloat)pieSliceValue; -(CGFloat)normalizedPosition:(CGFloat)rawPosition; -(BOOL)angle:(CGFloat)touchedAngle betweenStartAngle:(CGFloat)startingAngle endAngle:(CGFloat)endingAngle; --(void)addSliceToPath:(CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle; --(CPTFill *)sliceFillForIndex:(NSUInteger)idx; +-(void)addSliceToPath:(nonnull CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle; +-(nullable CPTFill *)sliceFillForIndex:(NSUInteger)idx; @end @@ -102,12 +102,12 @@ @implementation CPTPieChart **/ @synthesize centerAnchor; -/** @property CPTLineStyle *borderLineStyle +/** @property nullable CPTLineStyle *borderLineStyle * @brief The line style used to outline the pie slices. If @nil, no border is drawn. Defaults to @nil. **/ @synthesize borderLineStyle; -/** @property CPTFill *overlayFill +/** @property nullable CPTFill *overlayFill * @brief A fill drawn on top of the pie chart. * Can be used to add shading and/or gloss effects. Defaults to @nil. **/ @@ -158,7 +158,7 @@ @implementation CPTPieChart * @return A new CPTColor instance corresponding to the default value for this pie slice index. **/ -+(CPTColor *)defaultPieSliceColorForIndex:(NSUInteger)pieSliceIndex ++(nonnull CPTColor *)defaultPieSliceColorForIndex:(NSUInteger)pieSliceIndex { return [CPTColor colorWithComponentRed:( colorLookupTable[pieSliceIndex % 10][0] + (CGFloat)(pieSliceIndex / 10) * CPTFloat(0.1) ) green:( colorLookupTable[pieSliceIndex % 10][1] + (CGFloat)(pieSliceIndex / 10) * CPTFloat(0.1) ) @@ -206,7 +206,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTPieChart object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { pieRadius = CPTFloat(0.8) * ( MIN(newFrame.size.width, newFrame.size.height) / CPTFloat(2.0) ); @@ -230,7 +230,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTPieChart *theLayer = (CPTPieChart *)layer; @@ -256,7 +256,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -274,7 +274,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownIndex } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { pieRadius = [coder decodeCGFloatForKey:@"CPTPieChart.pieRadius"]; @@ -544,7 +544,7 @@ -(void)reloadRadialOffsetsInIndexRange:(NSRange)indexRange /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -713,7 +713,7 @@ -(CGFloat)radiansForPieSliceValue:(CGFloat)pieSliceValue return angle; } --(void)addSliceToPath:(CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle +-(void)addSliceToPath:(nonnull CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle { bool direction = (self.sliceDirection == CPTPieDirectionClockwise) ? true : false; CGFloat innerRadius = self.pieInnerRadius; @@ -728,7 +728,7 @@ -(void)addSliceToPath:(CGMutablePathRef)slicePath centerPoint:(CGPoint)center st } } --(CPTFill *)sliceFillForIndex:(NSUInteger)idx +-(nullable CPTFill *)sliceFillForIndex:(NSUInteger)idx { CPTFill *currentFill = [self cachedValueForKey:CPTPieChartBindingPieSliceFills recordIndex:idx]; @@ -739,7 +739,7 @@ -(CPTFill *)sliceFillForIndex:(NSUInteger)idx return currentFill; } --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; @@ -850,7 +850,7 @@ -(CGFloat)medianAngleForPieSliceIndex:(NSUInteger)idx /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -883,7 +883,7 @@ -(NSUInteger)numberOfFields return 1; } --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[@(CPTPieChartFieldSliceWidth)]; } @@ -895,7 +895,7 @@ -(CPTNumberArray)fieldIdentifiers /// @cond --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { CPTLayer *contentLayer = label.contentLayer; CPTPlotArea *thePlotArea = self.plotArea; @@ -968,7 +968,7 @@ -(NSUInteger)numberOfLegendEntries * @param idx The index of the desired title. * @return The title of the legend entry at the requested index. **/ --(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx { NSString *legendTitle = nil; @@ -989,7 +989,7 @@ -(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx * @param idx The index of the desired title. * @return The styled title of the legend entry at the requested index. **/ --(NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx { NSAttributedString *legendTitle = nil; @@ -1072,7 +1072,7 @@ -(BOOL)angle:(CGFloat)touchedAngle betweenStartAngle:(CGFloat)startingAngle endA * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; CPTPlotArea *thePlotArea = self.plotArea; @@ -1137,7 +1137,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownIndex; @@ -1356,34 +1356,34 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point /// @cond --(CPTNumberArray)sliceWidths +-(nullable CPTNumberArray)sliceWidths { return [[self cachedNumbersForField:CPTPieChartFieldSliceWidth] sampleArray]; } --(void)setSliceWidths:(CPTNumberArray)newSliceWidths +-(void)setSliceWidths:(nullable CPTNumberArray)newSliceWidths { [self cacheNumbers:newSliceWidths forField:CPTPieChartFieldSliceWidth]; [self updateNormalizedData]; } --(CPTFillArray)sliceFills +-(nullable CPTFillArray)sliceFills { return [self cachedArrayForKey:CPTPieChartBindingPieSliceFills]; } --(void)setSliceFills:(CPTFillArray)newSliceFills +-(void)setSliceFills:(nullable CPTFillArray)newSliceFills { [self cacheArray:newSliceFills forKey:CPTPieChartBindingPieSliceFills]; [self setNeedsDisplay]; } --(CPTNumberArray)sliceRadialOffsets +-(nullable CPTNumberArray)sliceRadialOffsets { return [self cachedArrayForKey:CPTPieChartBindingPieSliceRadialOffsets]; } --(void)setSliceRadialOffsets:(CPTNumberArray)newSliceRadialOffsets +-(void)setSliceRadialOffsets:(nullable CPTNumberArray)newSliceRadialOffsets { [self cacheArray:newSliceRadialOffsets forKey:CPTPieChartBindingPieSliceRadialOffsets]; [self setNeedsDisplay]; @@ -1434,7 +1434,7 @@ -(void)setSliceDirection:(CPTPieDirection)newDirection } } --(void)setBorderLineStyle:(CPTLineStyle *)newStyle +-(void)setBorderLineStyle:(nullable CPTLineStyle *)newStyle { if ( borderLineStyle != newStyle ) { borderLineStyle = [newStyle copy]; diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 9ae519224..c35a68c27 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -51,12 +51,12 @@ @interface CPTPlot() @property (nonatomic, readwrite, assign) BOOL dataNeedsReloading; -@property (nonatomic, readwrite, strong) NSMutableDictionary *cachedData; +@property (nonatomic, readwrite, strong, nonnull) NSMutableDictionary *cachedData; @property (nonatomic, readwrite, assign) BOOL needsRelabel; @property (nonatomic, readwrite, assign) NSRange labelIndexRange; -@property (nonatomic, readwrite, strong) CPTMutableAnnotationArray labelAnnotations; -@property (nonatomic, readwrite, copy) NSArray *dataLabels; +@property (nonatomic, readwrite, strong, nullable) CPTMutableAnnotationArray labelAnnotations; +@property (nonatomic, readwrite, copy, nullable) NSArray *dataLabels; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownLabelIndex; @property (nonatomic, readwrite, assign) NSUInteger cachedDataCount; @@ -64,9 +64,9 @@ @interface CPTPlot() @property (nonatomic, readonly, assign) NSUInteger numberOfRecords; --(CPTMutableNumericData *)numericDataForNumbers:(id)numbers; +-(nonnull CPTMutableNumericData *)numericDataForNumbers:(nonnull id)numbers; -(void)setCachedDataType:(CPTNumericDataType)newDataType; --(void)updateContentAnchorForLabel:(CPTPlotSpaceAnnotation *)label; +-(void)updateContentAnchorForLabel:(nonnull CPTPlotSpaceAnnotation *)label; @end @@ -104,19 +104,19 @@ @implementation CPTPlot @dynamic dataLabels; -/** @property cpt_weak id dataSource +/** @property nullable cpt_weak id dataSource * @brief The data source for the plot. **/ @synthesize dataSource; -/** @property NSString *title +/** @property nullable NSString *title * @brief The title of the plot displayed in the legend. * * Assigning a new value to this property also sets the value of the @ref attributedTitle property to @nil. **/ @synthesize title; -/** @property NSAttributedString *attributedTitle +/** @property nullable NSAttributedString *attributedTitle * @brief The styled title of the plot displayed in the legend. * * Assigning a new value to this property also sets the value of the @ref title property to the @@ -124,12 +124,12 @@ @implementation CPTPlot **/ @synthesize attributedTitle; -/** @property CPTPlotSpace *plotSpace +/** @property nullable CPTPlotSpace *plotSpace * @brief The plot space for the plot. **/ @synthesize plotSpace; -/** @property CPTPlotArea *plotArea +/** @property nullable CPTPlotArea *plotArea * @brief The plot area for the plot. **/ @dynamic plotArea; @@ -199,13 +199,13 @@ @implementation CPTPlot **/ @synthesize labelField; -/** @property CPTTextStyle *labelTextStyle +/** @property nullable CPTTextStyle *labelTextStyle * @brief The text style used to draw the data labels. * Set this property to @nil to hide the data labels. **/ @synthesize labelTextStyle; -/** @property NSFormatter *labelFormatter +/** @property nullable NSFormatter *labelFormatter * @brief The number formatter used to format the data labels. * Set this property to @nil to hide the data labels. * If you need a non-numerical label, such as a date, you can use a formatter than turns @@ -214,7 +214,7 @@ @implementation CPTPlot **/ @synthesize labelFormatter; -/** @property CPTShadow *labelShadow +/** @property nullable CPTShadow *labelShadow * @brief The shadow applied to each data label. **/ @synthesize labelShadow; @@ -290,7 +290,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTPlot object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { cachedData = [[NSMutableDictionary alloc] initWithCapacity:5]; @@ -328,7 +328,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTPlot *theLayer = (CPTPlot *)layer; @@ -368,7 +368,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -402,7 +402,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownLabelIndex } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { dataSource = [coder decodeObjectForKey:@"CPTPlot.dataSource"]; @@ -451,7 +451,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(Class)valueClassForBinding:(NSString *)binding +-(nullable Class)valueClassForBinding:(nonnull NSString *)binding { return [NSArray class]; } @@ -464,7 +464,7 @@ -(Class)valueClassForBinding:(NSString *)binding /// @cond --(void)drawInContext:(CGContextRef)context +-(void)drawInContext:(nonnull CGContextRef)context { [self reloadDataIfNeeded]; [super drawInContext:context]; @@ -482,7 +482,7 @@ -(void)drawInContext:(CGContextRef)context /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -712,7 +712,7 @@ -(void)reloadDataLabelsInIndexRange:(NSRange)indexRange /** * @brief A unique marker object used in collections to indicate that the datasource returned @nil. **/ -+(id)nilData ++(nonnull id)nilData { static id nilObject = nil; static dispatch_once_t onceToken = 0; @@ -729,7 +729,7 @@ +(id)nilData * @param indexRange The range of the data indexes of interest. * @return An array of data points. **/ --(id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange +-(nullable id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { id numbers; // can be CPTNumericData, NSArray, or NSData @@ -930,7 +930,7 @@ -(NSUInteger)cachedDataCount * @param numbers An array of numbers to cache. Can be a CPTNumericData, NSArray, or NSData (NSData is assumed to be a c-style array of type @double). * @param fieldEnum The field enumerator identifying the field. **/ --(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum +-(void)cacheNumbers:(nullable id)numbers forField:(NSUInteger)fieldEnum { NSNumber *cacheKey = @(fieldEnum); @@ -943,7 +943,8 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum case CPTScaleTypeLog: case CPTScaleTypeLogModulus: { - CPTMutableNumericData *mutableNumbers = [self numericDataForNumbers:numbers]; + id theNumbers = numbers; + CPTMutableNumericData *mutableNumbers = [self numericDataForNumbers:theNumbers]; NSUInteger sampleCount = mutableNumbers.numberOfSamples; if ( sampleCount > 0 ) { @@ -1022,7 +1023,7 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum * @param fieldEnum The field enumerator identifying the field. * @param idx The index of the first data point to replace. **/ --(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NSUInteger)idx +-(void)cacheNumbers:(nullable id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NSUInteger)idx { if ( numbers ) { NSNumber *cacheKey = @(fieldEnum); @@ -1038,7 +1039,8 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NS case CPTScaleTypeLog: case CPTScaleTypeLogModulus: { - mutableNumbers = [self numericDataForNumbers:numbers]; + id theNumbers = numbers; + mutableNumbers = [self numericDataForNumbers:theNumbers]; sampleCount = mutableNumbers.numberOfSamples; if ( sampleCount > 0 ) { @@ -1126,7 +1128,7 @@ -(void)cacheNumbers:(id)numbers forField:(NSUInteger)fieldEnum atRecordIndex:(NS /// @cond --(CPTMutableNumericData *)numericDataForNumbers:(id)numbers +-(nonnull CPTMutableNumericData *)numericDataForNumbers:(nonnull id)numbers { CPTMutableNumericData *mutableNumbers = nil; CPTNumericDataType loadedDataType; @@ -1198,7 +1200,7 @@ -(BOOL)doublePrecisionCache * @param fieldEnum The field enumerator identifying the field. * @return The array of cached numbers. **/ --(CPTMutableNumericData *)cachedNumbersForField:(NSUInteger)fieldEnum +-(nullable CPTMutableNumericData *)cachedNumbersForField:(NSUInteger)fieldEnum { return (self.cachedData)[@(fieldEnum)]; } @@ -1208,7 +1210,7 @@ -(CPTMutableNumericData *)cachedNumbersForField:(NSUInteger)fieldEnum * @param idx The index of the desired data value. * @return The cached number. **/ --(NSNumber *)cachedNumberForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx +-(nullable NSNumber *)cachedNumberForField:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx { CPTMutableNumericData *numbers = [self cachedNumbersForField:fieldEnum]; @@ -1335,7 +1337,7 @@ -(CPTNumericDataType)decimalDataType * @param key The key identifying the field. * @return The array of cached values. **/ --(NSArray *)cachedArrayForKey:(NSString *)key +-(nullable NSArray *)cachedArrayForKey:(nonnull NSString *)key { return (self.cachedData)[key]; } @@ -1345,7 +1347,7 @@ -(NSArray *)cachedArrayForKey:(NSString *)key * @param idx The index of the desired data value. * @return The cached value or @nil if no data is cached for the requested key. **/ --(id)cachedValueForKey:(NSString *)key recordIndex:(NSUInteger)idx +-(nullable id)cachedValueForKey:(nonnull NSString *)key recordIndex:(NSUInteger)idx { return [self cachedArrayForKey:key][idx]; } @@ -1354,7 +1356,7 @@ -(id)cachedValueForKey:(NSString *)key recordIndex:(NSUInteger)idx * @param array An array of arbitrary values to cache. * @param key The key identifying the field. **/ --(void)cacheArray:(NSArray *)array forKey:(NSString *)key +-(void)cacheArray:(nullable NSArray *)array forKey:(nonnull NSString *)key { if ( array ) { NSUInteger sampleCount = array.count; @@ -1378,28 +1380,29 @@ -(void)cacheArray:(NSArray *)array forKey:(NSString *)key * @param key The key identifying the field. * @param idx The index of the first data point to replace. **/ --(void)cacheArray:(NSArray *)array forKey:(NSString *)key atRecordIndex:(NSUInteger)idx +-(void)cacheArray:(nullable NSArray *)array forKey:(nonnull NSString *)key atRecordIndex:(NSUInteger)idx { - if ( array ) { - NSUInteger sampleCount = array.count; - if ( sampleCount > 0 ) { - // Ensure the data cache exists and is the right size - id theDataSource = self.dataSource; - NSUInteger numberOfRecords = [theDataSource numberOfRecordsForPlot:self]; - NSMutableArray *cachedValues = (self.cachedData)[key]; - if ( !cachedValues ) { - cachedValues = [NSMutableArray arrayWithCapacity:numberOfRecords]; - NSNull *nullObject = [NSNull null]; - for ( NSUInteger i = 0; i < numberOfRecords; i++ ) { - [cachedValues addObject:nullObject]; - } - (self.cachedData)[key] = cachedValues; - } + NSUInteger sampleCount = array.count; - // Update the cache - self.cachedDataCount = numberOfRecords; - [cachedValues replaceObjectsInRange:NSMakeRange(idx, sampleCount) withObjectsFromArray:array]; + if ( sampleCount > 0 ) { + // Ensure the data cache exists and is the right size + id theDataSource = self.dataSource; + NSUInteger numberOfRecords = [theDataSource numberOfRecordsForPlot:self]; + NSMutableArray *cachedValues = (self.cachedData)[key]; + if ( !cachedValues ) { + cachedValues = [NSMutableArray arrayWithCapacity:numberOfRecords]; + NSNull *nullObject = [NSNull null]; + for ( NSUInteger i = 0; i < numberOfRecords; i++ ) { + [cachedValues addObject:nullObject]; + } + (self.cachedData)[key] = cachedValues; } + + // Update the cache + self.cachedDataCount = numberOfRecords; + + NSArray *dataArray = array; + [cachedValues replaceObjectsInRange:NSMakeRange(idx, sampleCount) withObjectsFromArray:dataArray]; } } @@ -1410,7 +1413,7 @@ -(void)cacheArray:(NSArray *)array forKey:(NSString *)key atRecordIndex:(NSUInte * @param fieldEnum The field enumerator identifying the field. * @return The plot range enclosing the data. **/ --(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum +-(nullable CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum { if ( self.dataNeedsReloading ) { [self reloadData]; @@ -1485,7 +1488,7 @@ -(CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum * @param coord The coordinate identifier. * @return The plot range enclosing the data. **/ --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord { CPTNumberArray fields = [self fieldIdentifiersForCoordinate:coord]; @@ -1664,7 +1667,7 @@ -(void)relabelIndexRange:(NSRange)indexRange /// @cond --(void)updateContentAnchorForLabel:(CPTPlotSpaceAnnotation *)label +-(void)updateContentAnchorForLabel:(nonnull CPTPlotSpaceAnnotation *)label { if ( label && self.adjustLabelAnchors ) { CGPoint displacement = label.displacement; @@ -1723,7 +1726,7 @@ -(NSUInteger)numberOfLegendEntries * @param idx The index of the desired title. * @return The title of the legend entry at the requested index. **/ --(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx { NSString *legendTitle = self.title; @@ -1742,7 +1745,7 @@ -(NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx * @param idx The index of the desired title. * @return The styled title of the legend entry at the requested index. **/ --(NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx { NSAttributedString *legendTitle = self.attributedTitle; @@ -1764,7 +1767,7 @@ -(NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx * @param rect The bounding rectangle where the swatch should be drawn. * @param context The graphics context to draw into. **/ --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { id theDelegate = (id)self.delegate; @@ -1825,7 +1828,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { self.pointingDeviceDownLabelIndex = NSNotFound; @@ -1901,7 +1904,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownLabelIndex; @@ -1974,18 +1977,18 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(NSArray *)dataLabels +-(nullable NSArray *)dataLabels { return [self cachedArrayForKey:CPTPlotBindingDataLabels]; } --(void)setDataLabels:(NSArray *)newDataLabels +-(void)setDataLabels:(nullable NSArray *)newDataLabels { [self cacheArray:newDataLabels forKey:CPTPlotBindingDataLabels]; [self setNeedsRelabel]; } --(void)setTitle:(NSString *)newTitle +-(void)setTitle:(nullable NSString *)newTitle { if ( newTitle != title ) { title = [newTitle copy]; @@ -2000,7 +2003,7 @@ -(void)setTitle:(NSString *)newTitle } } --(void)setAttributedTitle:(NSAttributedString *)newTitle +-(void)setAttributedTitle:(nullable NSAttributedString *)newTitle { if ( newTitle != attributedTitle ) { attributedTitle = [newTitle copy]; @@ -2015,7 +2018,7 @@ -(void)setAttributedTitle:(NSAttributedString *)newTitle } } --(void)setDataSource:(id)newSource +-(void)setDataSource:(nullable id)newSource { if ( newSource != dataSource ) { dataSource = newSource; @@ -2033,7 +2036,7 @@ -(void)setDataNeedsReloading:(BOOL)newDataNeedsReloading } } --(CPTPlotArea *)plotArea +-(nullable CPTPlotArea *)plotArea { CPTGraph *theGraph = self.graph; @@ -2061,7 +2064,7 @@ -(void)setShowLabels:(BOOL)newShowLabels } } --(void)setLabelTextStyle:(CPTTextStyle *)newStyle +-(void)setLabelTextStyle:(nullable CPTTextStyle *)newStyle { if ( newStyle != labelTextStyle ) { labelTextStyle = [newStyle copy]; @@ -2101,7 +2104,7 @@ -(void)setLabelRotation:(CGFloat)newRotation } } --(void)setLabelFormatter:(NSFormatter *)newTickLabelFormatter +-(void)setLabelFormatter:(nullable NSFormatter *)newTickLabelFormatter { if ( newTickLabelFormatter != labelFormatter ) { labelFormatter = newTickLabelFormatter; @@ -2109,7 +2112,7 @@ -(void)setLabelFormatter:(NSFormatter *)newTickLabelFormatter } } --(void)setLabelShadow:(CPTShadow *)newLabelShadow +-(void)setLabelShadow:(nullable CPTShadow *)newLabelShadow { if ( newLabelShadow != labelShadow ) { labelShadow = newLabelShadow; @@ -2181,7 +2184,7 @@ -(NSUInteger)numberOfFields /** @brief Identifiers (enum values) identifying the fields. * @return Array of NSNumber objects for the various field identifiers. **/ --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[]; } @@ -2190,7 +2193,7 @@ -(CPTNumberArray)fieldIdentifiers * @param coord The coordinate for which the corresponding field identifiers are desired. * @return Array of NSNumber objects for the field identifiers. **/ --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { return @[]; } @@ -2211,7 +2214,7 @@ -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field * @param label The annotation for the data label. * @param idx The data index for the label. **/ --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { // do nothing--implementation provided by subclasses } diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index a07e25796..565217539 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -14,7 +14,7 @@ /// @cond @interface CPTPlotArea() -@property (nonatomic, readwrite, assign) CPTGraphLayerType *bottomUpLayerOrder; +@property (nonatomic, readwrite, assign, nonnull) CPTGraphLayerType *bottomUpLayerOrder; @property (nonatomic, readwrite, assign, getter = isUpdatingLayers) BOOL updatingLayers; @property (nonatomic, readwrite) CGPoint touchedPoint; @property (nonatomic, readwrite) NSDecimal widthDecimal; @@ -44,37 +44,37 @@ -(unsigned)indexForLayerType:(CPTGraphLayerType)layerType; **/ @implementation CPTPlotArea -/** @property CPTGridLineGroup *minorGridLineGroup +/** @property nullable CPTGridLineGroup *minorGridLineGroup * @brief The parent layer for all minor grid lines. **/ @synthesize minorGridLineGroup; -/** @property CPTGridLineGroup *majorGridLineGroup +/** @property nullable CPTGridLineGroup *majorGridLineGroup * @brief The parent layer for all major grid lines. **/ @synthesize majorGridLineGroup; -/** @property CPTAxisSet *axisSet +/** @property nullable CPTAxisSet *axisSet * @brief The axis set. **/ @synthesize axisSet; -/** @property CPTPlotGroup *plotGroup +/** @property nullable CPTPlotGroup *plotGroup * @brief The plot group. **/ @synthesize plotGroup; -/** @property CPTAxisLabelGroup *axisLabelGroup +/** @property nullable CPTAxisLabelGroup *axisLabelGroup * @brief The parent layer for all axis labels. **/ @synthesize axisLabelGroup; -/** @property CPTAxisLabelGroup *axisTitleGroup +/** @property nullable CPTAxisLabelGroup *axisTitleGroup * @brief The parent layer for all axis titles. **/ @synthesize axisTitleGroup; -/** @property CPTNumberArray topDownLayerOrder +/** @property nullable CPTNumberArray topDownLayerOrder * @brief An array of graph layers to be drawn in an order other than the default. * * The array should reference the layers using the constants defined in #CPTGraphLayerType. @@ -100,13 +100,13 @@ @implementation CPTPlotArea **/ @synthesize topDownLayerOrder; -/** @property CPTLineStyle *borderLineStyle +/** @property nullable CPTLineStyle *borderLineStyle * @brief The line style for the layer border. * If @nil, the border is not drawn. **/ @dynamic borderLineStyle; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill for the layer background. * If @nil, the layer background is not filled. **/ @@ -150,7 +150,7 @@ @implementation CPTPlotArea * @param newFrame The frame rectangle. * @return The initialized CPTPlotArea object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { minorGridLineGroup = nil; @@ -181,7 +181,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTPlotArea *theLayer = (CPTPlotArea *)layer; @@ -215,7 +215,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -236,7 +236,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // heightDecimal } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { minorGridLineGroup = [coder decodeObjectForKey:@"CPTPlotArea.minorGridLineGroup"]; @@ -267,7 +267,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -353,7 +353,11 @@ -(void)layoutSublayers } } --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +/// @} + +/// @cond + +-(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout { CPTGridLineGroup *minorGrid = self.minorGridLineGroup; CPTGridLineGroup *majorGrid = self.majorGridLineGroup; @@ -394,7 +398,7 @@ -(CPTSublayerSet)sublayersExcludedFromAutomaticLayout } } -/// @} +/// @endcond #pragma mark - #pragma mark Layer ordering @@ -606,7 +610,7 @@ -(void)setAxisSetLayersForType:(CPTGraphLayerType)layerType * @param layerType The layer type being updated. * @return The sublayer index for the given layer type. **/ --(unsigned)sublayerIndexForAxis:(CPTAxis *)axis layerType:(CPTGraphLayerType)layerType +-(unsigned)sublayerIndexForAxis:(nonnull CPTAxis *)axis layerType:(CPTGraphLayerType)layerType { unsigned idx = 0; @@ -670,7 +674,7 @@ -(unsigned)sublayerIndexForAxis:(CPTAxis *)axis layerType:(CPTGraphLayerType)lay * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; @@ -721,7 +725,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; @@ -774,17 +778,17 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(CPTLineStyle *)borderLineStyle +-(nullable CPTLineStyle *)borderLineStyle { return self.axisSet.borderLineStyle; } --(void)setBorderLineStyle:(CPTLineStyle *)newLineStyle +-(void)setBorderLineStyle:(nullable CPTLineStyle *)newLineStyle { self.axisSet.borderLineStyle = newLineStyle; } --(void)setFill:(CPTFill *)newFill +-(void)setFill:(nullable CPTFill *)newFill { if ( newFill != fill ) { fill = [newFill copy]; @@ -792,35 +796,39 @@ -(void)setFill:(CPTFill *)newFill } } --(void)setMinorGridLineGroup:(CPTGridLineGroup *)newGridLines +-(void)setMinorGridLineGroup:(nullable CPTGridLineGroup *)newGridLines { if ( (newGridLines != minorGridLineGroup) || self.isUpdatingLayers ) { [minorGridLineGroup removeFromSuperlayer]; minorGridLineGroup = newGridLines; if ( newGridLines ) { - newGridLines.plotArea = self; - newGridLines.major = NO; - [self insertSublayer:newGridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMinorGridLines]]; + CPTGridLineGroup *gridLines = newGridLines; + + gridLines.plotArea = self; + gridLines.major = NO; + [self insertSublayer:gridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMinorGridLines]]; } [self setNeedsLayout]; } } --(void)setMajorGridLineGroup:(CPTGridLineGroup *)newGridLines +-(void)setMajorGridLineGroup:(nullable CPTGridLineGroup *)newGridLines { if ( (newGridLines != majorGridLineGroup) || self.isUpdatingLayers ) { [majorGridLineGroup removeFromSuperlayer]; majorGridLineGroup = newGridLines; if ( newGridLines ) { - newGridLines.plotArea = self; - newGridLines.major = YES; - [self insertSublayer:newGridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMajorGridLines]]; + CPTGridLineGroup *gridLines = newGridLines; + + gridLines.plotArea = self; + gridLines.major = YES; + [self insertSublayer:gridLines atIndex:[self indexForLayerType:CPTGraphLayerTypeMajorGridLines]]; } [self setNeedsLayout]; } } --(void)setAxisSet:(CPTAxisSet *)newAxisSet +-(void)setAxisSet:(nullable CPTAxisSet *)newAxisSet { if ( (newAxisSet != axisSet) || self.isUpdatingLayers ) { [axisSet removeFromSuperlayer]; @@ -835,9 +843,11 @@ -(void)setAxisSet:(CPTAxisSet *)newAxisSet [self updateAxisSetLayersForType:CPTGraphLayerTypeAxisTitles]; if ( newAxisSet ) { - CPTGraph *theGraph = self.graph; - [self insertSublayer:newAxisSet atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLines]]; - for ( CPTAxis *axis in newAxisSet.axes ) { + CPTGraph *theGraph = self.graph; + CPTAxisSet *theAxisSet = newAxisSet; + + [self insertSublayer:theAxisSet atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLines]]; + for ( CPTAxis *axis in theAxisSet.axes ) { axis.plotArea = self; axis.graph = theGraph; } @@ -846,43 +856,49 @@ -(void)setAxisSet:(CPTAxisSet *)newAxisSet } } --(void)setPlotGroup:(CPTPlotGroup *)newPlotGroup +-(void)setPlotGroup:(nullable CPTPlotGroup *)newPlotGroup { if ( (newPlotGroup != plotGroup) || self.isUpdatingLayers ) { [plotGroup removeFromSuperlayer]; plotGroup = newPlotGroup; if ( newPlotGroup ) { - [self insertSublayer:newPlotGroup atIndex:[self indexForLayerType:CPTGraphLayerTypePlots]]; + CPTPlotGroup *group = newPlotGroup; + + [self insertSublayer:group atIndex:[self indexForLayerType:CPTGraphLayerTypePlots]]; } [self setNeedsLayout]; } } --(void)setAxisLabelGroup:(CPTAxisLabelGroup *)newAxisLabelGroup +-(void)setAxisLabelGroup:(nullable CPTAxisLabelGroup *)newAxisLabelGroup { if ( (newAxisLabelGroup != axisLabelGroup) || self.isUpdatingLayers ) { [axisLabelGroup removeFromSuperlayer]; axisLabelGroup = newAxisLabelGroup; if ( newAxisLabelGroup ) { - [self insertSublayer:newAxisLabelGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLabels]]; + CPTAxisLabelGroup *group = newAxisLabelGroup; + + [self insertSublayer:group atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisLabels]]; } [self setNeedsLayout]; } } --(void)setAxisTitleGroup:(CPTAxisLabelGroup *)newAxisTitleGroup +-(void)setAxisTitleGroup:(nullable CPTAxisLabelGroup *)newAxisTitleGroup { if ( (newAxisTitleGroup != axisTitleGroup) || self.isUpdatingLayers ) { [axisTitleGroup removeFromSuperlayer]; axisTitleGroup = newAxisTitleGroup; if ( newAxisTitleGroup ) { - [self insertSublayer:newAxisTitleGroup atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisTitles]]; + CPTAxisLabelGroup *group = newAxisTitleGroup; + + [self insertSublayer:group atIndex:[self indexForLayerType:CPTGraphLayerTypeAxisTitles]]; } [self setNeedsLayout]; } } --(void)setTopDownLayerOrder:(CPTNumberArray)newArray +-(void)setTopDownLayerOrder:(nullable CPTNumberArray)newArray { if ( newArray != topDownLayerOrder ) { topDownLayerOrder = newArray; @@ -890,7 +906,7 @@ -(void)setTopDownLayerOrder:(CPTNumberArray)newArray } } --(void)setGraph:(CPTGraph *)newGraph +-(void)setGraph:(nullable CPTGraph *)newGraph { if ( newGraph != self.graph ) { [super setGraph:newGraph]; diff --git a/framework/Source/CPTPlotAreaFrame.m b/framework/Source/CPTPlotAreaFrame.m index 9102b3392..2827e9e02 100644 --- a/framework/Source/CPTPlotAreaFrame.m +++ b/framework/Source/CPTPlotAreaFrame.m @@ -7,7 +7,7 @@ /// @cond @interface CPTPlotAreaFrame() -@property (nonatomic, readwrite, strong) CPTPlotArea *plotArea; +@property (nonatomic, readwrite, strong, nullable) CPTPlotArea *plotArea; @end @@ -23,17 +23,17 @@ @interface CPTPlotAreaFrame() **/ @implementation CPTPlotAreaFrame -/** @property CPTPlotArea *plotArea +/** @property nullable CPTPlotArea *plotArea * @brief The plot area. **/ @synthesize plotArea; -/** @property CPTAxisSet *axisSet +/** @property nullable CPTAxisSet *axisSet * @brief The axis set. **/ @dynamic axisSet; -/** @property CPTPlotGroup *plotGroup +/** @property nullable CPTPlotGroup *plotGroup * @brief The plot group. **/ @dynamic plotGroup; @@ -54,7 +54,7 @@ @implementation CPTPlotAreaFrame * @param newFrame The frame rectangle. * @return The initialized CPTPlotAreaFrame object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { plotArea = nil; @@ -72,7 +72,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTPlotAreaFrame *theLayer = (CPTPlotAreaFrame *)layer; @@ -89,14 +89,14 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:self.plotArea forKey:@"CPTPlotAreaFrame.plotArea"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { plotArea = [coder decodeObjectForKey:@"CPTPlotAreaFrame.plotArea"]; @@ -121,7 +121,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( [self.plotArea pointingDeviceDownEvent:event atPoint:interactionPoint] ) { return YES; @@ -140,7 +140,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( [self.plotArea pointingDeviceUpEvent:event atPoint:interactionPoint] ) { return YES; @@ -159,7 +159,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( [self.plotArea pointingDeviceDraggedEvent:event atPoint:interactionPoint] ) { return YES; @@ -178,7 +178,7 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter * @param event The OS event. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event { if ( [self.plotArea pointingDeviceCancelledEvent:event] ) { return YES; @@ -195,42 +195,44 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event /// @cond --(void)setPlotArea:(CPTPlotArea *)newPlotArea +-(void)setPlotArea:(nullable CPTPlotArea *)newPlotArea { if ( newPlotArea != plotArea ) { [plotArea removeFromSuperlayer]; plotArea = newPlotArea; if ( newPlotArea ) { - [self insertSublayer:newPlotArea atIndex:0]; - newPlotArea.graph = self.graph; + CPTPlotArea *theArea = newPlotArea; + + [self insertSublayer:theArea atIndex:0]; + theArea.graph = self.graph; } [self setNeedsLayout]; } } --(CPTAxisSet *)axisSet +-(nullable CPTAxisSet *)axisSet { return self.plotArea.axisSet; } --(void)setAxisSet:(CPTAxisSet *)newAxisSet +-(void)setAxisSet:(nullable CPTAxisSet *)newAxisSet { self.plotArea.axisSet = newAxisSet; } --(CPTPlotGroup *)plotGroup +-(nullable CPTPlotGroup *)plotGroup { return self.plotArea.plotGroup; } --(void)setPlotGroup:(CPTPlotGroup *)newPlotGroup +-(void)setPlotGroup:(nullable CPTPlotGroup *)newPlotGroup { self.plotArea.plotGroup = newPlotGroup; } --(void)setGraph:(CPTGraph *)newGraph +-(void)setGraph:(nullable CPTGraph *)newGraph { if ( newGraph != self.graph ) { [super setGraph:newGraph]; diff --git a/framework/Source/CPTPlotGroup.m b/framework/Source/CPTPlotGroup.m index d80b7ab82..a42909342 100644 --- a/framework/Source/CPTPlotGroup.m +++ b/framework/Source/CPTPlotGroup.m @@ -12,7 +12,7 @@ @implementation CPTPlotGroup /// @cond --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { // support old archives @@ -31,7 +31,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /** @brief Add a plot to this plot group. * @param plot The plot. **/ --(void)addPlot:(CPTPlot *)plot +-(void)addPlot:(nonnull CPTPlot *)plot { NSParameterAssert(plot); @@ -42,7 +42,7 @@ -(void)addPlot:(CPTPlot *)plot * @param plot The plot. * @param idx The index at which to insert the plot. This value must not be greater than the count of elements in the sublayer array. **/ --(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx +-(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx { NSParameterAssert(plot); NSParameterAssert(idx <= [[self sublayers] count]); @@ -53,7 +53,7 @@ -(void)insertPlot:(CPTPlot *)plot atIndex:(NSUInteger)idx /** @brief Remove a plot from this plot group. * @param plot The plot to remove. **/ --(void)removePlot:(CPTPlot *)plot +-(void)removePlot:(nullable CPTPlot *)plot { if ( self == [plot superlayer] ) { [plot removeFromSuperlayer]; @@ -70,7 +70,7 @@ -(void)display // nothing to draw } --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { // nothing to draw } diff --git a/framework/Source/CPTPlotRange.h b/framework/Source/CPTPlotRange.h index ef2c1aa81..e23dda2b9 100644 --- a/framework/Source/CPTPlotRange.h +++ b/framework/Source/CPTPlotRange.h @@ -58,7 +58,7 @@ typedef NSMutableArray *CPTMutablePlotRangeArray; /// @{ -(nonnull instancetype)initWithLocation:(nonnull NSNumber *)loc length:(nonnull NSNumber *)len; -(nonnull instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Checking Ranges diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index a38bde557..26fda2edc 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -25,19 +25,19 @@ @interface CPTPlotRange() **/ @implementation CPTPlotRange -/** @property NSNumber *location +/** @property nonnull NSNumber *location * @brief The starting value of the range. * @see @ref locationDecimal, @ref locationDouble **/ @dynamic location; -/** @property NSNumber *length +/** @property nonnull NSNumber *length * @brief The length of the range. * @see @ref lengthDecimal, @ref lengthDouble **/ @dynamic length; -/** @property NSNumber *end; +/** @property nonnull NSNumber *end; * @brief The ending value of the range, equivalent to @ref location + @ref length. **/ @dynamic end; @@ -76,7 +76,7 @@ @implementation CPTPlotRange **/ @dynamic endDouble; -/** @property NSNumber *minLimit +/** @property nonnull NSNumber *minLimit * @brief The minimum extreme value of the range. **/ @dynamic minLimit; @@ -91,7 +91,7 @@ @implementation CPTPlotRange **/ @dynamic minLimitDouble; -/** @property NSNumber *midPoint +/** @property nonnull NSNumber *midPoint * @brief The middle value of the range. **/ @dynamic midPoint; @@ -106,7 +106,7 @@ @implementation CPTPlotRange **/ @dynamic midPointDouble; -/** @property NSNumber *maxLimit +/** @property nonnull NSNumber *maxLimit * @brief The maximum extreme value of the range. **/ @dynamic maxLimit; @@ -131,7 +131,7 @@ @implementation CPTPlotRange * @param len The length of the range. * @return A new CPTPlotRange instance initialized with the provided location and length. **/ -+(instancetype)plotRangeWithLocation:(NSNumber *)loc length:(NSNumber *)len ++(nonnull instancetype)plotRangeWithLocation:(nonnull NSNumber *)loc length:(nonnull NSNumber *)len { return [[self alloc] initWithLocation:loc length:len]; } @@ -141,7 +141,7 @@ +(instancetype)plotRangeWithLocation:(NSNumber *)loc length:(NSNumber *)len * @param len The length of the range. * @return A new CPTPlotRange instance initialized with the provided location and length. **/ -+(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len ++(nonnull instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len { return [[self alloc] initWithLocationDecimal:loc lengthDecimal:len]; } @@ -151,7 +151,7 @@ +(instancetype)plotRangeWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDeci * @param len The length of the range. * @return The initialized CPTPlotRange object. **/ --(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len +-(nonnull instancetype)initWithLocation:(nonnull NSNumber *)loc length:(nonnull NSNumber *)len { NSParameterAssert(loc); NSParameterAssert(len); @@ -165,7 +165,7 @@ -(instancetype)initWithLocation:(NSNumber *)loc length:(NSNumber *)len * @param len The length of the range. * @return The initialized CPTPlotRange object. **/ --(instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len +-(nonnull instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)len { if ( (self = [super init]) ) { self.locationDecimal = loc; @@ -185,7 +185,7 @@ -(instancetype)initWithLocationDecimal:(NSDecimal)loc lengthDecimal:(NSDecimal)l * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { return [self initWithLocation:@0.0 length:@0.0]; } @@ -350,7 +350,7 @@ -(double)maxLimitDouble /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTPlotRange *newRange = [[CPTPlotRange allocWithZone:zone] init]; @@ -370,7 +370,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(id)mutableCopyWithZone:(NSZone *)zone +-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone { CPTPlotRange *newRange = [[CPTMutablePlotRange allocWithZone:zone] init]; @@ -390,7 +390,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @cond --(void)encodeWithCoder:(NSCoder *)encoder +-(void)encodeWithCoder:(nonnull NSCoder *)encoder { [encoder encodeDecimal:self.locationDecimal forKey:@"CPTPlotRange.location"]; [encoder encodeDecimal:self.lengthDecimal forKey:@"CPTPlotRange.length"]; @@ -402,7 +402,7 @@ -(void)encodeWithCoder:(NSCoder *)encoder * @param decoder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)decoder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder { if ( (self = [super init]) ) { self.locationDecimal = [decoder decodeDecimalForKey:@"CPTPlotRange.location"]; @@ -437,7 +437,7 @@ -(BOOL)containsDouble:(double)number * @param number The number to check. * @return @YES if @ref location ≤ @par{number} ≤ @ref end. **/ --(BOOL)containsNumber:(NSNumber *)number +-(BOOL)containsNumber:(nullable NSNumber *)number { if ( [number isKindOfClass:[NSDecimalNumber class]] ) { NSDecimal numericValue = number.decimalValue; @@ -453,7 +453,7 @@ -(BOOL)containsNumber:(NSNumber *)number * @param otherRange The range to check. * @return @YES if the ranges both have the same location and length. **/ --(BOOL)isEqualToRange:(CPTPlotRange *)otherRange +-(BOOL)isEqualToRange:(nullable CPTPlotRange *)otherRange { if ( otherRange ) { return CPTDecimalEquals(self.locationDecimal, otherRange.locationDecimal) && CPTDecimalEquals(self.lengthDecimal, otherRange.lengthDecimal); @@ -467,7 +467,7 @@ -(BOOL)isEqualToRange:(CPTPlotRange *)otherRange * @param otherRange The range to check. * @return @YES if the other range fits entirely within the range of the receiver. **/ --(BOOL)containsRange:(CPTPlotRange *)otherRange +-(BOOL)containsRange:(nullable CPTPlotRange *)otherRange { if ( otherRange ) { return CPTDecimalGreaterThanOrEqualTo(otherRange.minLimitDecimal, self.minLimitDecimal) && CPTDecimalLessThanOrEqualTo(otherRange.maxLimitDecimal, self.maxLimitDecimal); @@ -481,7 +481,7 @@ -(BOOL)containsRange:(CPTPlotRange *)otherRange * @param otherRange The range to check. * @return @YES if the ranges intersect. **/ --(BOOL)intersectsRange:(CPTPlotRange *)otherRange +-(BOOL)intersectsRange:(nullable CPTPlotRange *)otherRange { if ( !otherRange ) { return NO; @@ -502,7 +502,7 @@ -(BOOL)intersectsRange:(CPTPlotRange *)otherRange * @param number The number to check. * @return The comparison result. **/ --(CPTPlotRangeComparisonResult)compareToNumber:(NSNumber *)number +-(CPTPlotRangeComparisonResult)compareToNumber:(nonnull NSNumber *)number { CPTPlotRangeComparisonResult result; @@ -560,7 +560,7 @@ -(CPTPlotRangeComparisonResult)compareToDouble:(double)number /// @cond --(BOOL)isEqual:(id)object +-(BOOL)isEqual:(nullable id)object { if ( self == object ) { return YES; @@ -588,7 +588,7 @@ -(NSUInteger)hash /// @cond --(NSString *)description +-(nullable NSString *)description { NSDecimal myLocation = self.locationDecimal; NSDecimal myLength = self.lengthDecimal; @@ -606,7 +606,7 @@ -(NSString *)description /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { NSDecimal myLocation = self.locationDecimal; NSDecimal myLength = self.lengthDecimal; diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 8dd84ec78..203f06a4b 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -191,7 +191,7 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; /// @name Initialization /// @{ -(nonnull instancetype)init NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 16745da1e..da517de1a 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -15,11 +15,11 @@ @interface CPTPlotSpace() -@property (nonatomic, readwrite, strong) NSMutableDictionary *categoryNames; +@property (nonatomic, readwrite, strong, nullable) NSMutableDictionary *categoryNames; @property (nonatomic, readwrite) BOOL isDragging; --(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate; +-(nonnull CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate; @end @@ -35,7 +35,7 @@ -(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate; **/ @implementation CPTPlotSpace -/** @property id identifier +/** @property nullable id identifier * @brief An object used to identify the plot in collections. **/ @synthesize identifier; @@ -50,12 +50,12 @@ @implementation CPTPlotSpace **/ @synthesize isDragging; -/** @property cpt_weak CPTGraph *graph +/** @property nullable cpt_weak CPTGraph *graph * @brief The graph of the space. **/ @synthesize graph; -/** @property cpt_weak id delegate +/** @property nullable cpt_weak id delegate * @brief The plot space delegate. **/ @synthesize delegate; @@ -66,7 +66,7 @@ @implementation CPTPlotSpace @dynamic numberOfCoordinates; /** @internal - * @property NSMutableDictionary *categoryNames + * @property nullable NSMutableDictionary *categoryNames * @brief The names of the data categories for each coordinate with a #CPTScaleTypeCategory scale type. * The keys are the CPTCoordinate enumeration values and the values are arrays of strings. **/ @@ -89,7 +89,7 @@ @implementation CPTPlotSpace * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { identifier = nil; @@ -119,7 +119,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeConditionalObject:self.graph forKey:@"CPTPlotSpace.graph"]; [coder encodeObject:self.identifier forKey:@"CPTPlotSpace.identifier"]; @@ -140,7 +140,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { graph = [coder decodeObjectForKey:@"CPTPlotSpace.graph"]; @@ -157,12 +157,14 @@ -(instancetype)initWithCoder:(NSCoder *)coder #pragma mark - #pragma mark Categorical Data +/// @cond + /** @internal * @brief Gets the ordered set of categories for the given coordinate, creating it if necessary. * @param coordinate The axis coordinate. * @return The ordered set of categories for the given coordinate. */ --(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate +-(nonnull CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate { NSMutableDictionary *names = self.categoryNames; @@ -185,6 +187,8 @@ -(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate return categories; } +/// @endcond + /** * @brief Add a new category name for the given coordinate. * @@ -193,7 +197,7 @@ -(CPTMutableCategorySet)orderedSetForCoordinate:(CPTCoordinate)coordinate * @param category The category name. * @param coordinate The axis coordinate. */ --(void)addCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate +-(void)addCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate { NSParameterAssert(category); @@ -207,7 +211,7 @@ -(void)addCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate * @param category The category name. * @param coordinate The axis coordinate. */ --(void)removeCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate +-(void)removeCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate { NSParameterAssert(category); @@ -225,7 +229,7 @@ -(void)removeCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina * @param coordinate The axis coordinate. * @param idx The index in the list of category names. */ --(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx +-(void)insertCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx { NSParameterAssert(category); @@ -241,7 +245,7 @@ -(void)insertCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordina * @param newCategories An array of category names. * @param coordinate The axis coordinate. */ --(void)setCategories:(CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate +-(void)setCategories:(nullable CPTStringArray)newCategories forCoordinate:(CPTCoordinate)coordinate { NSMutableDictionary *names = self.categoryNames; @@ -254,7 +258,9 @@ -(void)setCategories:(CPTStringArray)newCategories forCoordinate:(CPTCoordinate) NSNumber *cacheKey = @(coordinate); if ( [newCategories isKindOfClass:[NSArray class]] ) { - names[cacheKey] = [NSMutableOrderedSet orderedSetWithArray:newCategories]; + CPTStringArray categories = newCategories; + + names[cacheKey] = [NSMutableOrderedSet orderedSetWithArray:categories]; } else { [names removeObjectForKey:cacheKey]; @@ -274,7 +280,7 @@ -(void)removeAllCategories * @param coordinate The axis coordinate. * @return An array of category names. */ --(CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate +-(nonnull CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate { CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; @@ -287,7 +293,7 @@ -(CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate * @param idx The index in the list of category names. * @return The category name. */ --(NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx +-(nullable NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger)idx { CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; @@ -302,7 +308,7 @@ -(NSString *)categoryForCoordinate:(CPTCoordinate)coordinate atIndex:(NSUInteger * @param coordinate The axis coordinate. * @return The category index. */ --(NSUInteger)indexOfCategory:(NSString *)category forCoordinate:(CPTCoordinate)coordinate +-(NSUInteger)indexOfCategory:(nonnull NSString *)category forCoordinate:(CPTCoordinate)coordinate { NSParameterAssert(category); @@ -333,7 +339,7 @@ -(NSUInteger)indexOfCategory:(NSString *)category forCoordinate:(CPTCoordinate)c * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledByDelegate = NO; @@ -361,7 +367,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledByDelegate = NO; @@ -389,7 +395,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledByDelegate = NO; @@ -417,7 +423,7 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter * @param event The OS event. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event { BOOL handledByDelegate = NO; @@ -447,7 +453,7 @@ -(BOOL)pointingDeviceCancelledEvent:(CPTNativeEvent *)event * @param toPoint The ending coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { BOOL handledByDelegate = NO; @@ -481,7 +487,7 @@ -(NSUInteger)numberOfCoordinates * @param plotPoint An array of data point coordinates (as NSNumber values). * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint { NSParameterAssert(plotPoint.count == self.numberOfCoordinates); @@ -493,7 +499,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -505,7 +511,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -516,7 +522,7 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe * @param point The drawing coordinates of the data point. * @return An array of data point coordinates (as NSNumber values). **/ --(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point +-(nullable CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point { return nil; } @@ -526,7 +532,7 @@ -(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -536,7 +542,7 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -545,7 +551,7 @@ -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInte * @param event The event. * @return The drawing coordinates of the point. **/ --(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event +-(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event { return CGPointZero; } @@ -554,7 +560,7 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event * @param event The event. * @return An array of data point coordinates (as NSNumber values). **/ --(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event +-(nullable CPTNumberArray)plotPointForEvent:(nonnull CPTNativeEvent *)event { return nil; } @@ -564,7 +570,7 @@ -(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event { NSParameterAssert(count == self.numberOfCoordinates); } @@ -574,7 +580,7 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event { NSParameterAssert(count == self.numberOfCoordinates); } @@ -583,7 +589,7 @@ -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInte * @param newRange The new plot range. * @param coordinate The axis coordinate. **/ --(void)setPlotRange:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(void)setPlotRange:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { } @@ -591,7 +597,7 @@ -(void)setPlotRange:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordi * @param coordinate The axis coordinate. * @return The range of values. **/ --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate { return nil; } @@ -616,7 +622,7 @@ -(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate /** @brief Scales the plot ranges so that the plots just fit in the visible space. * @param plots An array of the plots that have to fit in the visible area. **/ --(void)scaleToFitPlots:(CPTPlotArray)plots +-(void)scaleToFitPlots:(nullable CPTPlotArray)plots { } @@ -624,7 +630,7 @@ -(void)scaleToFitPlots:(CPTPlotArray)plots * @param plots An array of the plots that have to fit in the visible area. * @param coordinate The axis coordinate. **/ --(void)scaleToFitPlots:(CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate +-(void)scaleToFitPlots:(nullable CPTPlotArray)plots forCoordinate:(CPTCoordinate)coordinate { if ( plots.count == 0 ) { return; @@ -662,7 +668,7 @@ -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { return [NSString stringWithFormat:@"Identifier: %@\nallowsUserInteraction: %@", self.identifier, diff --git a/framework/Source/CPTPlotSpaceAnnotation.h b/framework/Source/CPTPlotSpaceAnnotation.h index a0fb80bec..b3540af5a 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.h +++ b/framework/Source/CPTPlotSpaceAnnotation.h @@ -7,7 +7,10 @@ @property (nonatomic, readwrite, copy, nullable) CPTNumberArray anchorPlotPoint; @property (nonatomic, readonly, nonnull) CPTPlotSpace *plotSpace; +/// @name Initialization +/// @{ -(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)space anchorPlotPoint:(nullable CPTNumberArray)plotPoint NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +/// @} @end diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 102058d7d..46da27ceb 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -28,12 +28,12 @@ -(void)setContentNeedsLayout; **/ @implementation CPTPlotSpaceAnnotation -/** @property CPTNumberArray anchorPlotPoint +/** @property nullable CPTNumberArray anchorPlotPoint * @brief An array of NSDecimalNumber objects giving the anchor plot coordinates. **/ @synthesize anchorPlotPoint; -/** @property CPTPlotSpace *plotSpace +/** @property nonnull CPTPlotSpace *plotSpace * @brief The plot space which the anchor is defined in. **/ @synthesize plotSpace; @@ -56,7 +56,7 @@ @implementation CPTPlotSpaceAnnotation * @param newPlotPoint An array of NSDecimalNumber objects giving the anchor plot coordinates. * @return The initialized CPTPlotSpaceAnnotation object. **/ --(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(CPTNumberArray)newPlotPoint +-(nonnull instancetype)initWithPlotSpace:(nonnull CPTPlotSpace *)newPlotSpace anchorPlotPoint:(nullable CPTNumberArray)newPlotPoint { NSParameterAssert(newPlotSpace); @@ -77,7 +77,7 @@ -(instancetype)initWithPlotSpace:(CPTPlotSpace *)newPlotSpace anchorPlotPoint:(C /// @cond // plotSpace is required --(instancetype)init +-(nonnull instancetype)init { [NSException raise:CPTException format:@"%@ must be initialized with a plot space.", NSStringFromClass([self class])]; return [self initWithPlotSpace:[[CPTPlotSpace alloc] init] anchorPlotPoint:nil]; @@ -96,7 +96,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -110,7 +110,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { anchorPlotPoint = [[coder decodeObjectForKey:@"CPTPlotSpaceAnnotation.anchorPlotPoint"] copy]; @@ -175,7 +175,7 @@ -(void)positionContentLayer /// @cond --(void)setAnchorPlotPoint:(CPTNumberArray)newPlotPoint +-(void)setAnchorPlotPoint:(nullable CPTNumberArray)newPlotPoint { if ( anchorPlotPoint != newPlotPoint ) { anchorPlotPoint = [newPlotPoint copy]; @@ -192,7 +192,7 @@ -(void)setAnchorPlotPoint:(CPTNumberArray)newPlotPoint } } --(void)setDecimalAnchor:(NSDecimal *)newAnchor +-(void)setDecimalAnchor:(nonnull NSDecimal *)newAnchor { if ( decimalAnchor != newAnchor ) { free(decimalAnchor); diff --git a/framework/Source/CPTPlotSpaceTests.h b/framework/Source/CPTPlotSpaceTests.h index ccd2a1f49..fd5b2cf96 100644 --- a/framework/Source/CPTPlotSpaceTests.h +++ b/framework/Source/CPTPlotSpaceTests.h @@ -4,6 +4,6 @@ @interface CPTPlotSpaceTests : CPTTestCase -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *graph; @end diff --git a/framework/Source/CPTPlotSymbol.m b/framework/Source/CPTPlotSymbol.m index fe0285996..18840965c 100644 --- a/framework/Source/CPTPlotSymbol.m +++ b/framework/Source/CPTPlotSymbol.m @@ -11,11 +11,11 @@ /// @cond @interface CPTPlotSymbol() -@property (nonatomic, readwrite, assign) CGPathRef cachedSymbolPath; -@property (nonatomic, readwrite, assign) CGLayerRef cachedLayer; +@property (nonatomic, readwrite, assign, nullable) CGPathRef cachedSymbolPath; +@property (nonatomic, readwrite, assign, nullable) CGLayerRef cachedLayer; @property (nonatomic, readwrite, assign) CGFloat cachedScale; --(CGPathRef)newSymbolPath; +-(nonnull CGPathRef)newSymbolPath; -(CGSize)layerSizeForScale:(CGFloat)scale; @end @@ -43,24 +43,24 @@ @implementation CPTPlotSymbol **/ @synthesize symbolType; -/** @property CPTLineStyle *lineStyle +/** @property nullable CPTLineStyle *lineStyle * @brief The line style for the border of the symbol. * If @nil, the border is not drawn. **/ @synthesize lineStyle; -/** @property CPTFill *fill +/** @property nullable CPTFill *fill * @brief The fill for the interior of the symbol. * If @nil, the symbol is not filled. **/ @synthesize fill; -/** @property CPTShadow *shadow +/** @property nullable CPTShadow *shadow * @brief The shadow applied to each plot symbol. **/ @synthesize shadow; -/** @property CGPathRef customSymbolPath +/** @property nullable CGPathRef customSymbolPath * @brief The drawing path for a custom plot symbol. It will be scaled to @ref size before being drawn. **/ @synthesize customSymbolPath; @@ -96,7 +96,7 @@ @implementation CPTPlotSymbol * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { anchorPoint = CPTPointMake(0.5, 0.5); @@ -132,7 +132,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCPTPoint:self.anchorPoint forKey:@"CPTPlotSymbol.anchorPoint"]; [coder encodeCPTSize:self.size forKey:@"CPTPlotSymbol.size"]; @@ -149,7 +149,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // cachedScale } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { anchorPoint = [coder decodeCPTPointForKey:@"CPTPlotSymbol.anchorPoint"]; @@ -191,7 +191,7 @@ -(void)setSymbolType:(CPTPlotSymbolType)newType } } --(void)setShadow:(CPTShadow *)newShadow +-(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != shadow ) { shadow = [newShadow copy]; @@ -199,7 +199,7 @@ -(void)setShadow:(CPTShadow *)newShadow } } --(void)setCustomSymbolPath:(CGPathRef)newPath +-(void)setCustomSymbolPath:(nullable CGPathRef)newPath { if ( customSymbolPath != newPath ) { CGPathRelease(customSymbolPath); @@ -208,7 +208,7 @@ -(void)setCustomSymbolPath:(CGPathRef)newPath } } --(void)setLineStyle:(CPTLineStyle *)newLineStyle +-(void)setLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( newLineStyle != lineStyle ) { lineStyle = newLineStyle; @@ -216,7 +216,7 @@ -(void)setLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setFill:(CPTFill *)newFill +-(void)setFill:(nullable CPTFill *)newFill { if ( newFill != fill ) { fill = newFill; @@ -232,7 +232,7 @@ -(void)setUsesEvenOddClipRule:(BOOL)newEvenOddClipRule } } --(CGPathRef)cachedSymbolPath +-(nullable CGPathRef)cachedSymbolPath { if ( !cachedSymbolPath ) { cachedSymbolPath = [self newSymbolPath]; @@ -240,7 +240,7 @@ -(CGPathRef)cachedSymbolPath return cachedSymbolPath; } --(void)setCachedSymbolPath:(CGPathRef)newPath +-(void)setCachedSymbolPath:(nullable CGPathRef)newPath { if ( cachedSymbolPath != newPath ) { CGPathRelease(cachedSymbolPath); @@ -249,7 +249,7 @@ -(void)setCachedSymbolPath:(CGPathRef)newPath } } --(void)setCachedLayer:(CGLayerRef)newLayer +-(void)setCachedLayer:(nullable CGLayerRef)newLayer { if ( cachedLayer != newLayer ) { CGLayerRelease(cachedLayer); @@ -265,7 +265,7 @@ -(void)setCachedLayer:(CGLayerRef)newLayer /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeNone. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeNone. **/ -+(instancetype)plotSymbol ++(nonnull instancetype)plotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -277,7 +277,7 @@ +(instancetype)plotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeCross. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeCross. **/ -+(instancetype)crossPlotSymbol ++(nonnull instancetype)crossPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -289,7 +289,7 @@ +(instancetype)crossPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeEllipse. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeEllipse. **/ -+(instancetype)ellipsePlotSymbol ++(nonnull instancetype)ellipsePlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -301,7 +301,7 @@ +(instancetype)ellipsePlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeRectangle. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeRectangle. **/ -+(instancetype)rectanglePlotSymbol ++(nonnull instancetype)rectanglePlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -313,7 +313,7 @@ +(instancetype)rectanglePlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypePlus. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypePlus. **/ -+(instancetype)plusPlotSymbol ++(nonnull instancetype)plusPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -325,7 +325,7 @@ +(instancetype)plusPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeStar. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeStar. **/ -+(instancetype)starPlotSymbol ++(nonnull instancetype)starPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -337,7 +337,7 @@ +(instancetype)starPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeDiamond. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeDiamond. **/ -+(instancetype)diamondPlotSymbol ++(nonnull instancetype)diamondPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -349,7 +349,7 @@ +(instancetype)diamondPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeTriangle. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeTriangle. **/ -+(instancetype)trianglePlotSymbol ++(nonnull instancetype)trianglePlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -361,7 +361,7 @@ +(instancetype)trianglePlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypePentagon. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypePentagon. **/ -+(instancetype)pentagonPlotSymbol ++(nonnull instancetype)pentagonPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -373,7 +373,7 @@ +(instancetype)pentagonPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeHexagon. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeHexagon. **/ -+(instancetype)hexagonPlotSymbol ++(nonnull instancetype)hexagonPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -385,7 +385,7 @@ +(instancetype)hexagonPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeDash. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeDash. **/ -+(instancetype)dashPlotSymbol ++(nonnull instancetype)dashPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -397,7 +397,7 @@ +(instancetype)dashPlotSymbol /** @brief Creates and returns a new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeSnow. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeSnow. **/ -+(instancetype)snowPlotSymbol ++(nonnull instancetype)snowPlotSymbol { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -410,7 +410,7 @@ +(instancetype)snowPlotSymbol * @param aPath The bounding path for the custom symbol. * @return A new CPTPlotSymbol instance initialized with a symbol type of #CPTPlotSymbolTypeCustom. **/ -+(instancetype)customPlotSymbolWithPath:(CGPathRef)aPath ++(nonnull instancetype)customPlotSymbolWithPath:(nullable CGPathRef)aPath { CPTPlotSymbol *symbol = [[self alloc] init]; @@ -425,7 +425,7 @@ +(instancetype)customPlotSymbolWithPath:(CGPathRef)aPath /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTPlotSymbol *copy = [[[self class] allocWithZone:zone] init]; @@ -457,7 +457,7 @@ -(id)copyWithZone:(NSZone *)zone * @param scale The drawing scale factor. Must be greater than zero (@num{0}). * @param alignToPixels If @YES, the symbol position is aligned with device pixels to reduce anti-aliasing artifacts. **/ --(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale alignToPixels:(BOOL)alignToPixels +-(void)renderInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale alignToPixels:(BOOL)alignToPixels { CGPoint symbolAnchor = self.anchorPoint; @@ -510,6 +510,8 @@ -(void)renderInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFl } } +/// @cond + -(CGSize)layerSizeForScale:(CGFloat)scale { const CGFloat symbolMargin = CPTFloat(2.0); @@ -537,12 +539,14 @@ -(CGSize)layerSizeForScale:(CGFloat)scale return layerSize; } +/// @endcond + /** @brief Draws the plot symbol into the given graphics context centered at the provided point. * @param context The graphics context to draw into. * @param center The center point of the symbol. * @param scale The drawing scale factor. Must be greater than zero (@num{0}). **/ --(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale +-(void)renderAsVectorInContext:(nonnull CGContextRef)context atPoint:(CGPoint)center scale:(CGFloat)scale { CGPathRef theSymbolPath = self.cachedSymbolPath; @@ -643,7 +647,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context atPoint:(CGPoint)center sca * @brief Creates and returns a drawing path for the current symbol type. * @return A path describing the outline of the current symbol type. **/ --(CGPathRef)newSymbolPath +-(nonnull CGPathRef)newSymbolPath { CGFloat dx, dy; CGSize symbolSize = self.size; @@ -776,7 +780,7 @@ -(CGPathRef)newSymbolPath /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { const CGFloat screenScale = 1.0; diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 50895fd3f..56f08c447 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -48,21 +48,21 @@ @interface CPTRangePlot() -@property (nonatomic, readwrite, copy) CPTNumberArray xValues; -@property (nonatomic, readwrite, copy) CPTNumberArray yValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *leftValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *rightValues; -@property (nonatomic, readwrite, copy) CPTLineStyleArray barLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray xValues; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray yValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *highValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *lowValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *leftValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *rightValues; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray barLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; --(void)calculatePointsToDraw:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; --(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; --(void)alignViewPointsToUserSpace:(CGPointError *)viewPoints withContent:(CGContextRef)context drawPointFlags:(BOOL *)drawPointFlag numberOfPoints:(NSUInteger)dataCounts; --(NSInteger)extremeDrawnPointIndexForFlags:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound; +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; +-(void)calculateViewPoints:(nonnull CGPointError *)viewPoints withDrawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; +-(void)alignViewPointsToUserSpace:(nonnull CGPointError *)viewPoints withContext:(nonnull CGContextRef)context drawPointFlags:(nonnull BOOL *)drawPointFlag numberOfPoints:(NSUInteger)dataCounts; +-(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound; --(void)drawRangeInContext:(CGContextRef)context lineStyle:(CPTLineStyle *)lineStyle viewPoint:(CGPointError *)viewPoint halfGapSize:(CGSize)halfGapSize halfBarWidth:(CGFloat)halfBarWidth alignPoints:(BOOL)alignPoints; +-(void)drawRangeInContext:(nonnull CGContextRef)context lineStyle:(nonnull CPTLineStyle *)lineStyle viewPoint:(CGPointError *)viewPoint halfGapSize:(CGSize)halfGapSize halfBarWidth:(CGFloat)halfBarWidth alignPoints:(BOOL)alignPoints; -(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; @end @@ -169,7 +169,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTRangePlot object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { barLineStyle = [[CPTLineStyle alloc] init]; @@ -187,7 +187,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTRangePlot *theLayer = (CPTRangePlot *)layer; @@ -208,7 +208,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -223,7 +223,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownIndex } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { barLineStyle = [[coder decodeObjectForKey:@"CPTRangePlot.barLineStyle"] copy]; @@ -245,7 +245,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)calculatePointsToDraw:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly { if ( dataCount == 0 ) { return; @@ -307,7 +307,7 @@ -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)d } } --(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount +-(void)calculateViewPoints:(nonnull CGPointError *)viewPoints withDrawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount { CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -440,7 +440,7 @@ -(void)calculateViewPoints:(CGPointError *)viewPoints withDrawPointFlags:(BOOL * } } --(void)alignViewPointsToUserSpace:(CGPointError *)viewPoints withContent:(CGContextRef)context drawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount +-(void)alignViewPointsToUserSpace:(nonnull CGPointError *)viewPoints withContext:(nonnull CGContextRef)context drawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount { // Align to device pixels if there is a data line. // Otherwise, align to view space, so fills are sharp at edges. @@ -486,7 +486,7 @@ -(void)alignViewPointsToUserSpace:(CGPointError *)viewPoints withContent:(CGCont } } --(NSInteger)extremeDrawnPointIndexForFlags:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound +-(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound { NSInteger result = NSNotFound; NSInteger delta = (isLowerBound ? 1 : -1); @@ -612,7 +612,7 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -642,7 +642,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context [self calculatePointsToDraw:drawPointFlags numberOfPoints:dataCount forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO]; [self calculateViewPoints:viewPoints withDrawPointFlags:drawPointFlags numberOfPoints:dataCount]; if ( self.alignsPointsToPixels ) { - [self alignViewPointsToUserSpace:viewPoints withContent:context drawPointFlags:drawPointFlags numberOfPoints:dataCount]; + [self alignViewPointsToUserSpace:viewPoints withContext:context drawPointFlags:drawPointFlags numberOfPoints:dataCount]; } // Get extreme points @@ -726,9 +726,9 @@ -(void)renderAsVectorInContext:(CGContextRef)context free(drawPointFlags); } --(void)drawRangeInContext:(CGContextRef)context - lineStyle:(CPTLineStyle *)lineStyle - viewPoint:(CGPointError *)viewPoint +-(void)drawRangeInContext:(nonnull CGContextRef)context + lineStyle:(nonnull CPTLineStyle *)lineStyle + viewPoint:(nonnull CGPointError *)viewPoint halfGapSize:(CGSize)halfGapSize halfBarWidth:(CGFloat)halfBarWidth alignPoints:(BOOL)alignPoints @@ -847,7 +847,7 @@ -(void)drawRangeInContext:(CGContextRef)context } } --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; @@ -889,7 +889,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C } } --(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx +-(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx { CPTLineStyle *theBarLineStyle = [self cachedValueForKey:CPTRangePlotBindingBarLineStyles recordIndex:idx]; @@ -907,7 +907,7 @@ -(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -938,7 +938,7 @@ -(NSUInteger)numberOfFields return 6; } --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[@(CPTRangePlotFieldX), @(CPTRangePlotFieldY), @@ -948,7 +948,7 @@ -(CPTNumberArray)fieldIdentifiers @(CPTRangePlotFieldRight)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { CPTNumberArray result = nil; @@ -999,7 +999,7 @@ -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field /// @cond --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { NSNumber *xValue = [self cachedNumberForField:CPTRangePlotFieldX recordIndex:idx]; @@ -1109,7 +1109,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; CPTPlotArea *thePlotArea = self.plotArea; @@ -1174,7 +1174,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownIndex; @@ -1237,7 +1237,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio /// @cond --(void)setBarLineStyle:(CPTLineStyle *)newLineStyle +-(void)setBarLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( barLineStyle != newLineStyle ) { barLineStyle = [newLineStyle copy]; @@ -1246,7 +1246,7 @@ -(void)setBarLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setAreaFill:(CPTFill *)newFill +-(void)setAreaFill:(nullable CPTFill *)newFill { if ( newFill != areaFill ) { areaFill = [newFill copy]; @@ -1255,7 +1255,7 @@ -(void)setAreaFill:(CPTFill *)newFill } } --(void)setAreaBorderLineStyle:(CPTLineStyle *)newLineStyle +-(void)setAreaBorderLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( areaBorderLineStyle != newLineStyle ) { areaBorderLineStyle = [newLineStyle copy]; @@ -1288,72 +1288,72 @@ -(void)setGapWidth:(CGFloat)newGapWidth } } --(void)setXValues:(CPTNumberArray)newValues +-(void)setXValues:(nullable CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldX]; } --(CPTNumberArray)xValues +-(nullable CPTNumberArray)xValues { return [[self cachedNumbersForField:CPTRangePlotFieldX] sampleArray]; } --(void)setYValues:(CPTNumberArray)newValues +-(void)setYValues:(nullable CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldY]; } --(CPTNumberArray)yValues +-(nullable CPTNumberArray)yValues { return [[self cachedNumbersForField:CPTRangePlotFieldY] sampleArray]; } --(CPTMutableNumericData *)highValues +-(nullable CPTMutableNumericData *)highValues { return [self cachedNumbersForField:CPTRangePlotFieldHigh]; } --(void)setHighValues:(CPTMutableNumericData *)newValues +-(void)setHighValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldHigh]; } --(CPTMutableNumericData *)lowValues +-(nullable CPTMutableNumericData *)lowValues { return [self cachedNumbersForField:CPTRangePlotFieldLow]; } --(void)setLowValues:(CPTMutableNumericData *)newValues +-(void)setLowValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldLow]; } --(CPTMutableNumericData *)leftValues +-(nullable CPTMutableNumericData *)leftValues { return [self cachedNumbersForField:CPTRangePlotFieldLeft]; } --(void)setLeftValues:(CPTMutableNumericData *)newValues +-(void)setLeftValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldLeft]; } --(CPTMutableNumericData *)rightValues +-(nullable CPTMutableNumericData *)rightValues { return [self cachedNumbersForField:CPTRangePlotFieldRight]; } --(void)setRightValues:(CPTMutableNumericData *)newValues +-(void)setRightValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTRangePlotFieldRight]; } --(CPTLineStyleArray)barLineStyles +-(nullable CPTLineStyleArray)barLineStyles { return [self cachedArrayForKey:CPTRangePlotBindingBarLineStyles]; } --(void)setBarLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setBarLineStyles:(nullable CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTRangePlotBindingBarLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 78c97fcc4..23c95160e 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -34,22 +34,22 @@ /// @cond @interface CPTScatterPlot() -@property (nonatomic, readwrite, copy) CPTNumberArray xValues; -@property (nonatomic, readwrite, copy) CPTNumberArray yValues; -@property (nonatomic, readwrite, strong) CPTPlotSymbolArray plotSymbols; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray xValues; +@property (nonatomic, readwrite, copy, nullable) CPTNumberArray yValues; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSymbolArray plotSymbols; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; @property (nonatomic, readwrite, assign) BOOL pointingDeviceDownOnLine; @property (nonatomic, readwrite, strong) CPTMutableLimitBandArray mutableAreaFillBands; --(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; --(void)calculateViewPoints:(CGPoint *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; --(void)alignViewPointsToUserSpace:(CGPoint *)viewPoints withContent:(CGContextRef)context drawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; +-(void)calculateViewPoints:(nonnull CGPoint *)viewPoints withDrawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; +-(void)alignViewPointsToUserSpace:(nonnull CGPoint *)viewPoints withContext:(nonnull CGContextRef)context drawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; --(NSInteger)extremeDrawnPointIndexForFlags:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound; +-(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound; --(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; --(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; --(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange; +-(nonnull CGPathRef)newDataLinePathForViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; +-(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; +-(void)computeControlPoints:(nonnull CGPoint *)cp1 points2:(nonnull CGPoint *)cp2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange; @end @@ -82,31 +82,31 @@ @implementation CPTScatterPlot **/ @synthesize histogramOption; -/** @property CPTLineStyle *dataLineStyle +/** @property nullable CPTLineStyle *dataLineStyle * @brief The line style for the data line. * If @nil, the line is not drawn. **/ @synthesize dataLineStyle; -/** @property CPTPlotSymbol *plotSymbol +/** @property nullable CPTPlotSymbol *plotSymbol * @brief The plot symbol drawn at each point if the data source does not provide symbols. * If @nil, no symbol is drawn. **/ @synthesize plotSymbol; -/** @property CPTFill *areaFill +/** @property nullable CPTFill *areaFill * @brief The fill style for the area underneath the data line. * If @nil, the area is not filled. **/ @synthesize areaFill; -/** @property CPTFill *areaFill2 +/** @property nullable CPTFill *areaFill2 * @brief The fill style for the area above the data line. * If @nil, the area is not filled. **/ @synthesize areaFill2; -/** @property NSNumber *areaBaseValue +/** @property nullable NSNumber *areaBaseValue * @brief The Y coordinate of the straight boundary of the area fill. * If not a number, the area is not filled. * @@ -116,7 +116,7 @@ @implementation CPTScatterPlot **/ @synthesize areaBaseValue; -/** @property NSNumber *areaBaseValue2 +/** @property nullable NSNumber *areaBaseValue2 * @brief The Y coordinate of the straight boundary of the secondary area fill. * If not a number, the area is not filled. * @@ -133,7 +133,7 @@ @implementation CPTScatterPlot **/ @synthesize plotSymbolMarginForHitDetection; -/** @property CGPathRef newDataLinePath +/** @property nonnull CGPathRef newDataLinePath * @brief The path used to draw the data line. The caller must release the returned path. **/ @dynamic newDataLinePath; @@ -166,7 +166,7 @@ @implementation CPTScatterPlot **/ @synthesize pointingDeviceDownOnLine; -/** @property CPTLimitBandArray areaFillBands +/** @property nullable CPTLimitBandArray areaFillBands * @brief An array of CPTLimitBand objects. * * The limit bands are drawn between the plot line and areaBaseValue and on top of the areaFill. @@ -216,7 +216,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTScatterPlot object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { dataLineStyle = [[CPTLineStyle alloc] init]; @@ -241,7 +241,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTScatterPlot *theLayer = (CPTScatterPlot *)layer; @@ -271,7 +271,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -293,7 +293,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownOnLine } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey:@"CPTScatterPlot.interpolation"]; @@ -406,7 +406,7 @@ -(void)reloadPlotSymbolsInIndexRange:(NSRange)indexRange * @param idx The index of the record. * @return The plot symbol to use, or @nil if no plot symbol should be drawn. **/ --(CPTPlotSymbol *)plotSymbolForRecordIndex:(NSUInteger)idx +-(nullable CPTPlotSymbol *)plotSymbolForRecordIndex:(NSUInteger)idx { CPTPlotSymbol *symbol = [self cachedValueForKey:CPTScatterPlotBindingPlotSymbols recordIndex:idx]; @@ -422,7 +422,7 @@ -(CPTPlotSymbol *)plotSymbolForRecordIndex:(NSUInteger)idx /// @cond --(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount { if ( dataCount == 0 ) { return; @@ -563,7 +563,7 @@ -(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace } } --(void)calculateViewPoints:(CGPoint *)viewPoints withDrawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount +-(void)calculateViewPoints:(nonnull CGPoint *)viewPoints withDrawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount { CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -611,7 +611,7 @@ -(void)calculateViewPoints:(CGPoint *)viewPoints withDrawPointFlags:(BOOL *)draw } } --(void)alignViewPointsToUserSpace:(CGPoint *)viewPoints withContent:(CGContextRef)context drawPointFlags:(BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount +-(void)alignViewPointsToUserSpace:(nonnull CGPoint *)viewPoints withContext:(nonnull CGContextRef)context drawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount { // Align to device pixels if there is a data line. // Otherwise, align to view space, so fills are sharp at edges. @@ -631,7 +631,7 @@ -(void)alignViewPointsToUserSpace:(CGPoint *)viewPoints withContent:(CGContextRe } } --(NSInteger)extremeDrawnPointIndexForFlags:(BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound +-(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound { NSInteger result = NSNotFound; NSInteger delta = (isLowerBound ? 1 : -1); @@ -732,7 +732,7 @@ -(CGPoint)plotAreaPointOfVisiblePointAtIndex:(NSUInteger)idx /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -767,7 +767,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context BOOL pixelAlign = self.alignsPointsToPixels; if ( pixelAlign ) { - [self alignViewPointsToUserSpace:viewPoints withContent:context drawPointFlags:drawPointFlags numberOfPoints:dataCount]; + [self alignViewPointsToUserSpace:viewPoints withContext:context drawPointFlags:drawPointFlags numberOfPoints:dataCount]; } // Get extreme points @@ -917,7 +917,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context free(drawPointFlags); } --(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue +-(nonnull CGPathRef)newDataLinePathForViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue { CPTScatterPlotInterpolation theInterpolation = self.interpolation; @@ -996,7 +996,7 @@ -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRan return dataLinePath; } --(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue +-(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue { CGMutablePathRef dataLinePath = CGPathCreateMutable(); BOOL lastPointSkipped = YES; @@ -1107,7 +1107,7 @@ -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange: // Compute the control points using the algorithm described at http://www.particleincell.com/blog/2012/bezier-splines/ // cp1, cp2, and viewPoints should point to arrays of points with at least NSMaxRange(indexRange) elements each. --(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange +-(void)computeControlPoints:(nonnull CGPoint *)cp1 points2:(nonnull CGPoint *)cp2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange { if ( indexRange.length == 2 ) { NSUInteger rangeEnd = NSMaxRange(indexRange) - 1; @@ -1192,7 +1192,7 @@ -(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints: } } --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; @@ -1260,7 +1260,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C } } --(CGPathRef)newDataLinePath +-(nonnull CGPathRef)newDataLinePath { [self reloadDataIfNeeded]; @@ -1297,7 +1297,7 @@ -(CGPathRef)newDataLinePath /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken; @@ -1327,12 +1327,12 @@ -(NSUInteger)numberOfFields return 2; } --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[@(CPTScatterPlotFieldX), @(CPTScatterPlotFieldY)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { CPTNumberArray result = nil; @@ -1379,7 +1379,7 @@ -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field /// @cond --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { NSNumber *xValue = [self cachedNumberForField:CPTScatterPlotFieldX recordIndex:idx]; NSNumber *yValue = [self cachedNumberForField:CPTScatterPlotFieldY recordIndex:idx]; @@ -1413,14 +1413,15 @@ -(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInte * * @param limitBand The new limit band. **/ --(void)addAreaFillBand:(CPTLimitBand *)limitBand +-(void)addAreaFillBand:(nullable CPTLimitBand *)limitBand { if ( [limitBand isKindOfClass:[CPTLimitBand class]] ) { if ( !self.mutableAreaFillBands ) { self.mutableAreaFillBands = [NSMutableArray array]; } - [self.mutableAreaFillBands addObject:limitBand]; + CPTLimitBand *band = limitBand; + [self.mutableAreaFillBands addObject:band]; [self setNeedsDisplay]; } @@ -1429,12 +1430,14 @@ -(void)addAreaFillBand:(CPTLimitBand *)limitBand /** @brief Remove an area fill limit band. * @param limitBand The limit band to be removed. **/ --(void)removeAreaFillBand:(CPTLimitBand *)limitBand +-(void)removeAreaFillBand:(nullable CPTLimitBand *)limitBand { if ( limitBand ) { CPTMutableLimitBandArray fillBands = self.mutableAreaFillBands; - [fillBands removeObject:limitBand]; + CPTLimitBand *band = limitBand; + [fillBands removeObject:band]; + if ( fillBands.count == 0 ) { self.mutableAreaFillBands = nil; } @@ -1478,7 +1481,7 @@ -(void)removeAreaFillBand:(CPTLimitBand *)limitBand * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { self.pointingDeviceDownIndex = NSNotFound; self.pointingDeviceDownOnLine = NO; @@ -1593,7 +1596,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownIndex; @@ -1770,7 +1773,7 @@ -(void)setHistogramOption:(CPTScatterPlotHistogramOption)newHistogramOption } } --(void)setPlotSymbol:(CPTPlotSymbol *)aSymbol +-(void)setPlotSymbol:(nullable CPTPlotSymbol *)aSymbol { if ( aSymbol != plotSymbol ) { plotSymbol = [aSymbol copy]; @@ -1779,7 +1782,7 @@ -(void)setPlotSymbol:(CPTPlotSymbol *)aSymbol } } --(void)setDataLineStyle:(CPTLineStyle *)newLineStyle +-(void)setDataLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( dataLineStyle != newLineStyle ) { dataLineStyle = [newLineStyle copy]; @@ -1788,7 +1791,7 @@ -(void)setDataLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setAreaFill:(CPTFill *)newFill +-(void)setAreaFill:(nullable CPTFill *)newFill { if ( newFill != areaFill ) { areaFill = [newFill copy]; @@ -1797,7 +1800,7 @@ -(void)setAreaFill:(CPTFill *)newFill } } --(void)setAreaFill2:(CPTFill *)newFill +-(void)setAreaFill2:(nullable CPTFill *)newFill { if ( newFill != areaFill2 ) { areaFill2 = [newFill copy]; @@ -1806,17 +1809,18 @@ -(void)setAreaFill2:(CPTFill *)newFill } } --(CPTLimitBandArray)areaFillBands +-(nullable CPTLimitBandArray)areaFillBands { return [self.mutableAreaFillBands copy]; } --(void)setAreaBaseValue:(NSNumber *)newAreaBaseValue +-(void)setAreaBaseValue:(nullable NSNumber *)newAreaBaseValue { BOOL needsUpdate = YES; if ( newAreaBaseValue ) { - needsUpdate = ![areaBaseValue isEqualToNumber:newAreaBaseValue]; + NSNumber *baseValue = newAreaBaseValue; + needsUpdate = ![areaBaseValue isEqualToNumber:baseValue]; } if ( needsUpdate ) { @@ -1826,12 +1830,13 @@ -(void)setAreaBaseValue:(NSNumber *)newAreaBaseValue } } --(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue +-(void)setAreaBaseValue2:(nullable NSNumber *)newAreaBaseValue { BOOL needsUpdate = YES; if ( newAreaBaseValue ) { - needsUpdate = ![areaBaseValue2 isEqualToNumber:newAreaBaseValue]; + NSNumber *baseValue = newAreaBaseValue; + needsUpdate = ![areaBaseValue2 isEqualToNumber:baseValue]; } if ( needsUpdate ) { @@ -1841,33 +1846,33 @@ -(void)setAreaBaseValue2:(NSNumber *)newAreaBaseValue } } --(void)setXValues:(CPTNumberArray)newValues +-(void)setXValues:(nullable CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldX]; } --(CPTNumberArray)xValues +-(nullable CPTNumberArray)xValues { return [[self cachedNumbersForField:CPTScatterPlotFieldX] sampleArray]; } --(void)setYValues:(CPTNumberArray)newValues +-(void)setYValues:(nullable CPTNumberArray)newValues { [self cacheNumbers:newValues forField:CPTScatterPlotFieldY]; } --(CPTNumberArray)yValues +-(nullable CPTNumberArray)yValues { return [[self cachedNumbersForField:CPTScatterPlotFieldY] sampleArray]; } --(void)setPlotSymbols:(CPTPlotSymbolArray)newSymbols +-(void)setPlotSymbols:(nullable CPTPlotSymbolArray)newSymbols { [self cacheArray:newSymbols forKey:CPTScatterPlotBindingPlotSymbols]; [self setNeedsDisplay]; } --(CPTPlotSymbolArray)plotSymbols +-(nullable CPTPlotSymbolArray)plotSymbols { return [self cachedArrayForKey:CPTScatterPlotBindingPlotSymbols]; } diff --git a/framework/Source/CPTScatterPlotTests.h b/framework/Source/CPTScatterPlotTests.h index 14c954c5c..994599bdd 100644 --- a/framework/Source/CPTScatterPlotTests.h +++ b/framework/Source/CPTScatterPlotTests.h @@ -5,7 +5,7 @@ @interface CPTScatterPlotTests : CPTTestCase -@property (nonatomic, readwrite, strong) CPTScatterPlot *plot; -@property (nonatomic, readwrite, strong) CPTXYPlotSpace *plotSpace; +@property (nonatomic, readwrite, strong, nullable) CPTScatterPlot *plot; +@property (nonatomic, readwrite, strong, nullable) CPTXYPlotSpace *plotSpace; @end diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index aca7fc1f7..5024ae1d6 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -6,9 +6,9 @@ @interface CPTScatterPlot(Testing) --(void)calculatePointsToDraw:(BOOL *)pointDrawFlags forPlotSpace:(CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; --(void)setXValues:(CPTNumberArray)newValues; --(void)setYValues:(CPTNumberArray)newValues; +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly numberOfPoints:(NSUInteger)dataCount; +-(void)setXValues:(nullable CPTNumberArray)newValues; +-(void)setYValues:(nullable CPTNumberArray)newValues; @end @@ -52,8 +52,11 @@ -(void)testCalculatePointsToDrawAllInRange for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%g).", inRangeValues[i]); } @@ -69,8 +72,11 @@ -(void)testCalculatePointsToDrawAllInRangeVisibleOnly for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%g).", inRangeValues[i]); } @@ -86,8 +92,11 @@ -(void)testCalculatePointsToDrawNoneInRange for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%g).", inRangeValues[i]); } @@ -103,8 +112,11 @@ -(void)testCalculatePointsToDrawNoneInRangeVisibleOnly for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%g).", inRangeValues[i]); } @@ -120,8 +132,11 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegions for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertTrue(drawFlags[i], @"Test that out of range points in different regions get included (%g).", inRangeValues[i]); } @@ -137,8 +152,11 @@ -(void)testCalculatePointsToDrawNoneInRangeDifferentRegionsVisibleOnly for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { XCTAssertFalse(drawFlags[i], @"Test that out of range points in different regions get included (%g).", inRangeValues[i]); } @@ -155,8 +173,11 @@ -(void)testCalculatePointsToDrawSomeInRange for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { if ( expected[i] ) { XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); @@ -177,8 +198,11 @@ -(void)testCalculatePointsToDrawSomeInRangeVisibleOnly for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { if ( [self.plotSpace.xRange compareToNumber:@(inRangeValues[i])] == CPTPlotRangeComparisonResultNumberInRange ) { XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); @@ -200,8 +224,11 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossing for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { if ( expected[i] ) { XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); @@ -222,8 +249,11 @@ -(void)testCalculatePointsToDrawSomeInRangeCrossingVisibleOnly for ( NSUInteger i = 0; i < 5; i++ ) { [values addObject:@(inRangeValues[i])]; } + + CPTXYPlotSpace *thePlotSpace = self.plotSpace; + [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; for ( NSUInteger i = 0; i < 5; i++ ) { if ( [self.plotSpace.xRange compareToNumber:@(inRangeValues[i])] == CPTPlotRangeComparisonResultNumberInRange ) { XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); diff --git a/framework/Source/CPTShadow.m b/framework/Source/CPTShadow.m index e3163c5f1..ce752e189 100644 --- a/framework/Source/CPTShadow.m +++ b/framework/Source/CPTShadow.m @@ -40,7 +40,7 @@ @implementation CPTShadow **/ @synthesize shadowBlurRadius; -/** @property CPTColor *shadowColor +/** @property nullable CPTColor *shadowColor * @brief The shadow color. If @nil (the default), the shadow will not be drawn. **/ @synthesize shadowColor; @@ -51,7 +51,7 @@ @implementation CPTShadow /** @brief Creates and returns a new CPTShadow instance. * @return A new CPTShadow instance. **/ -+(instancetype)shadow ++(nonnull instancetype)shadow { return [[self alloc] init]; } @@ -68,7 +68,7 @@ +(instancetype)shadow * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { shadowOffset = CGSizeZero; @@ -85,14 +85,14 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCPTSize:self.shadowOffset forKey:@"CPTShadow.shadowOffset"]; [coder encodeCGFloat:self.shadowBlurRadius forKey:@"CPTShadow.shadowBlurRadius"]; [coder encodeObject:self.shadowColor forKey:@"CPTShadow.shadowColor"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { shadowOffset = [coder decodeCPTSizeForKey:@"CPTShadow.shadowOffset"]; @@ -110,7 +110,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /** @brief Sets the shadow properties in the given graphics context. * @param context The graphics context. **/ --(void)setShadowInContext:(CGContextRef)context +-(void)setShadowInContext:(nonnull CGContextRef)context { CGContextSetShadowWithColor(context, self.shadowOffset, @@ -123,7 +123,7 @@ -(void)setShadowInContext:(CGContextRef)context /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTShadow *shadowCopy = [[CPTShadow allocWithZone:zone] init]; @@ -141,7 +141,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(id)mutableCopyWithZone:(NSZone *)zone +-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone { CPTShadow *shadowCopy = [[CPTMutableShadow allocWithZone:zone] init]; diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index 05412a560..b1f15b192 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -24,7 +24,7 @@ @interface CPTTextLayer() **/ @implementation CPTTextLayer -/** @property NSString *text +/** @property nullable NSString *text * @brief The text to display. * * Assigning a new value to this property also sets the value of the @ref attributedText property to @nil. @@ -32,14 +32,14 @@ @implementation CPTTextLayer **/ @synthesize text; -/** @property CPTTextStyle *textStyle +/** @property nullable CPTTextStyle *textStyle * @brief The text style used to draw the text. * * Assigning a new value to this property also sets the value of the @ref attributedText property to @nil. **/ @synthesize textStyle; -/** @property NSAttributedString *attributedText +/** @property nullable NSAttributedString *attributedText * @brief The styled text to display. * * Assigning a new value to this property also sets the value of the @ref text property to the @@ -69,7 +69,7 @@ @implementation CPTTextLayer * @param newStyle The text style used to draw the text. * @return The initialized CPTTextLayer object. **/ --(instancetype)initWithText:(NSString *)newText style:(CPTTextStyle *)newStyle +-(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle { if ( (self = [super initWithFrame:CGRectZero]) ) { textStyle = newStyle; @@ -89,7 +89,7 @@ -(instancetype)initWithText:(NSString *)newText style:(CPTTextStyle *)newStyle * @param newText The text to display. * @return The initialized CPTTextLayer object. **/ --(instancetype)initWithText:(NSString *)newText +-(nonnull instancetype)initWithText:(nullable NSString *)newText { return [self initWithText:newText style:[CPTTextStyle textStyle]]; } @@ -98,7 +98,7 @@ -(instancetype)initWithText:(NSString *)newText * @param newText The styled text to display. * @return The initialized CPTTextLayer object. **/ --(instancetype)initWithAttributedText:(NSAttributedString *)newText +-(nonnull instancetype)initWithAttributedText:(nullable NSAttributedString *)newText { CPTTextStyle *newStyle = [CPTTextStyle textStyleWithAttributes:[newText attributesAtIndex:0 effectiveRange:NULL]]; @@ -113,7 +113,7 @@ -(instancetype)initWithAttributedText:(NSAttributedString *)newText /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTTextLayer *theLayer = (CPTTextLayer *)layer; @@ -141,7 +141,7 @@ -(instancetype)initWithLayer:(id)layer * @param newFrame The frame rectangle. * @return The initialized CPTTextLayer object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { return [self initWithText:nil style:nil]; } @@ -153,7 +153,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -165,7 +165,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // inTextUpdate } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { textStyle = [coder decodeObjectForKey:@"CPTTextLayer.textStyle"]; @@ -184,7 +184,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)setText:(NSString *)newValue +-(void)setText:(nullable NSString *)newValue { if ( text != newValue ) { text = [newValue copy]; @@ -199,7 +199,7 @@ -(void)setText:(NSString *)newValue } } --(void)setTextStyle:(CPTTextStyle *)newStyle +-(void)setTextStyle:(nullable CPTTextStyle *)newStyle { if ( textStyle != newStyle ) { textStyle = newStyle; @@ -214,7 +214,7 @@ -(void)setTextStyle:(CPTTextStyle *)newStyle } } --(void)setAttributedText:(NSAttributedString *)newValue +-(void)setAttributedText:(nullable NSAttributedString *)newValue { if ( attributedText != newValue ) { attributedText = [newValue copy]; @@ -246,7 +246,7 @@ -(void)setMaximumSize:(CGSize)newSize } } --(void)setShadow:(CPTShadow *)newShadow +-(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != self.shadow ) { [super setShadow:newShadow]; @@ -357,7 +357,7 @@ -(void)sizeToFit /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -407,7 +407,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /// @cond --(NSString *)description +-(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ \"%@\">", [super description], self.text]; } diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index f1d05b81b..ac9f5735e 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -31,12 +31,12 @@ @implementation CPTTextStyle **/ @synthesize fontSize; -/** @property NSString *fontName +/** @property nullable NSString *fontName * @brief The font name. Default is Helvetica. **/ @synthesize fontName; -/** @property CPTColor *color +/** @property nullable CPTColor *color * @brief The current text color. Default is solid black. **/ @synthesize color; @@ -57,7 +57,7 @@ @implementation CPTTextStyle /** @brief Creates and returns a new CPTTextStyle instance. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyle ++(nonnull instancetype)textStyle { return [[self alloc] init]; } @@ -69,7 +69,7 @@ +(instancetype)textStyle * @param textStyle An existing CPTTextStyle. * @return A new text style instance. **/ -+(instancetype)textStyleWithStyle:(CPTTextStyle *)textStyle ++(nonnull instancetype)textStyleWithStyle:(nullable CPTTextStyle *)textStyle { CPTTextStyle *newTextStyle = [[self alloc] init]; @@ -99,7 +99,7 @@ +(instancetype)textStyleWithStyle:(CPTTextStyle *)textStyle * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { fontName = @"Helvetica"; @@ -118,7 +118,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.fontName forKey:@"CPTTextStyle.fontName"]; [coder encodeCGFloat:self.fontSize forKey:@"CPTTextStyle.fontSize"]; @@ -127,7 +127,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeInteger:(NSInteger)self.lineBreakMode forKey:@"CPTTextStyle.lineBreakMode"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { fontName = [[coder decodeObjectForKey:@"CPTTextStyle.fontName"] copy]; @@ -146,7 +146,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTTextStyle *newCopy = [[CPTTextStyle allocWithZone:zone] init]; @@ -166,7 +166,7 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(id)mutableCopyWithZone:(NSZone *)zone +-(nonnull id)mutableCopyWithZone:(nullable NSZone *)zone { CPTTextStyle *newCopy = [[CPTMutableTextStyle allocWithZone:zone] init]; @@ -186,7 +186,7 @@ -(id)mutableCopyWithZone:(NSZone *)zone /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { NSString *lorem = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; diff --git a/framework/Source/CPTTheme.h b/framework/Source/CPTTheme.h index 2825e914c..130155c0c 100644 --- a/framework/Source/CPTTheme.h +++ b/framework/Source/CPTTheme.h @@ -20,13 +20,13 @@ extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with /// @{ +(void)registerTheme:(nonnull Class)themeClass; +(nullable NSArray *)themeClasses; -+(nullable instancetype)themeNamed:(nullable NSString *)theme; ++(nullable instancetype)themeNamed:(nullable NSString *)themeName; +(nonnull NSString *)name; /// @} /// @name Theme Usage /// @{ --(void)applyThemeToGraph:(nullable CPTGraph *)graph; +-(void)applyThemeToGraph:(nonnull CPTGraph *)graph; /// @} @end @@ -40,9 +40,9 @@ extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with /// @{ -(nullable id)newGraph; --(void)applyThemeToBackground:(nullable CPTGraph *)graph; --(void)applyThemeToPlotArea:(nullable CPTPlotAreaFrame *)plotAreaFrame; --(void)applyThemeToAxisSet:(nullable CPTAxisSet *)axisSet; +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph; +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame; +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet; /// @} @end diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index 7138d6344..3aae496f3 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -20,7 +20,7 @@ **/ @implementation CPTTheme -/** @property Class graphClass +/** @property nullable Class graphClass * @brief The class used to create new graphs. Must be a subclass of CPTGraph. **/ @synthesize graphClass; @@ -38,7 +38,7 @@ @implementation CPTTheme * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { graphClass = Nil; @@ -53,7 +53,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:[[self class] name] forKey:@"CPTTheme.name"]; @@ -63,7 +63,7 @@ -(void)encodeWithCoder:(NSCoder *)coder } } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { self = [CPTTheme themeNamed:[coder decodeObjectForKey:@"CPTTheme.name"]]; @@ -84,7 +84,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /** @brief List of the available theme classes, sorted by name. * @return An NSArray containing all available theme classes, sorted by name. **/ -+(NSArray *)themeClasses ++(nullable NSArray *)themeClasses { NSSortDescriptor *nameSort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; @@ -96,7 +96,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder * @return A CPTTheme instance with name matching @par{themeName} or @nil if no themes with a matching name were found. * @see See @ref themeNames "Theme Names" for a list of named themes provided by Core Plot. **/ -+(instancetype)themeNamed:(NSString *)themeName ++(nullable instancetype)themeNamed:(nullable NSString *)themeName { CPTTheme *newTheme = nil; @@ -113,7 +113,7 @@ +(instancetype)themeNamed:(NSString *)themeName /** @brief Register a theme class. * @param themeClass Theme class to register. **/ -+(void)registerTheme:(Class)themeClass ++(void)registerTheme:(nonnull Class)themeClass { NSParameterAssert(themeClass); @@ -135,7 +135,7 @@ +(void)registerTheme:(Class)themeClass /** @brief The name used for this theme class. * @return The name. **/ -+(NSString *)name ++(nonnull NSString *)name { return NSStringFromClass(self); } @@ -145,7 +145,7 @@ +(NSString *)name /// @cond --(void)setGraphClass:(Class)newGraphClass +-(void)setGraphClass:(nullable Class)newGraphClass { if ( graphClass != newGraphClass ) { if ( ![newGraphClass isSubclassOfClass:[CPTGraph class]] ) { @@ -168,11 +168,19 @@ -(void)setGraphClass:(Class)newGraphClass /** @brief Applies the theme to the provided graph. * @param graph The graph to style. **/ --(void)applyThemeToGraph:(CPTGraph *)graph +-(void)applyThemeToGraph:(nonnull CPTGraph *)graph { [self applyThemeToBackground:graph]; - [self applyThemeToPlotArea:graph.plotAreaFrame]; - [self applyThemeToAxisSet:graph.axisSet]; + + CPTPlotAreaFrame *plotAreaFrame = graph.plotAreaFrame; + if ( plotAreaFrame ) { + [self applyThemeToPlotArea:plotAreaFrame]; + } + + CPTAxisSet *axisSet = graph.axisSet; + if ( axisSet ) { + [self applyThemeToAxisSet:axisSet]; + } } @end @@ -184,7 +192,7 @@ @implementation CPTTheme(AbstractMethods) /** @brief Creates a new graph styled with the theme. * @return The new graph. **/ --(id)newGraph +-(nullable id)newGraph { return nil; } @@ -192,21 +200,21 @@ -(id)newGraph /** @brief Applies the background theme to the provided graph. * @param graph The graph to style. **/ --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { } /** @brief Applies the theme to the provided plot area. * @param plotAreaFrame The plot area to style. **/ --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { } /** @brief Applies the theme to the provided axis set. * @param axisSet The axis set to style. **/ --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { } diff --git a/framework/Source/CPTTimeFormatter.h b/framework/Source/CPTTimeFormatter.h index afb81774e..62328736c 100644 --- a/framework/Source/CPTTimeFormatter.h +++ b/framework/Source/CPTTimeFormatter.h @@ -8,7 +8,7 @@ /// @name Initialization /// @{ -(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTTimeFormatter.m b/framework/Source/CPTTimeFormatter.m index bfa12b728..d35d6dc94 100644 --- a/framework/Source/CPTTimeFormatter.m +++ b/framework/Source/CPTTimeFormatter.m @@ -8,12 +8,12 @@ **/ @implementation CPTTimeFormatter -/** @property NSDateFormatter *dateFormatter +/** @property nullable NSDateFormatter *dateFormatter * @brief The date formatter used to generate strings from time intervals. **/ @synthesize dateFormatter; -/** @property NSDate *referenceDate +/** @property nullable NSDate *referenceDate * @brief Date from which time intervals are taken. * If @nil, the standard reference date (1 January 2001, GMT) is used. **/ @@ -29,7 +29,7 @@ @implementation CPTTimeFormatter * The default formatter uses @ref NSDateFormatterMediumStyle for dates and times. * @return The new instance. **/ --(instancetype)init +-(nonnull instancetype)init { NSDateFormatter *newDateFormatter = [[NSDateFormatter alloc] init]; @@ -47,7 +47,7 @@ -(instancetype)init * @param aDateFormatter The date formatter. * @return The new instance. **/ --(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter +-(nonnull instancetype)initWithDateFormatter:(nullable NSDateFormatter *)aDateFormatter { if ( (self = [super init]) ) { dateFormatter = aDateFormatter; @@ -61,7 +61,7 @@ -(instancetype)initWithDateFormatter:(NSDateFormatter *)aDateFormatter /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -75,7 +75,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { dateFormatter = [coder decodeObjectForKey:@"CPTTimeFormatter.dateFormatter"]; @@ -89,7 +89,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { CPTTimeFormatter *newFormatter = [[CPTTimeFormatter allocWithZone:zone] init]; @@ -116,7 +116,7 @@ -(id)copyWithZone:(NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(NSString *)stringForObjectValue:(id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue { NSString *string = nil; diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 78bd90aae..def618939 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -43,27 +43,27 @@ /// @cond @interface CPTTradingRangePlot() -@property (nonatomic, readwrite, copy) CPTMutableNumericData *xValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *openValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *highValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *lowValues; -@property (nonatomic, readwrite, copy) CPTMutableNumericData *closeValues; -@property (nonatomic, readwrite, copy) CPTFillArray increaseFills; -@property (nonatomic, readwrite, copy) CPTFillArray decreaseFills; -@property (nonatomic, readwrite, copy) CPTLineStyleArray lineStyles; -@property (nonatomic, readwrite, copy) CPTLineStyleArray increaseLineStyles; -@property (nonatomic, readwrite, copy) CPTLineStyleArray decreaseLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *xValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *openValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *highValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *lowValues; +@property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *closeValues; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray increaseFills; +@property (nonatomic, readwrite, copy, nullable) CPTFillArray decreaseFills; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray lineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray increaseLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray decreaseLineStyles; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; --(void)drawCandleStickInContext:(CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; --(void)drawOHLCInContext:(CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; +-(void)drawCandleStickInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; +-(void)drawOHLCInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; --(CPTFill *)increaseFillForIndex:(NSUInteger)idx; --(CPTFill *)decreaseFillForIndex:(NSUInteger)idx; +-(nullable CPTFill *)increaseFillForIndex:(NSUInteger)idx; +-(nullable CPTFill *)decreaseFillForIndex:(NSUInteger)idx; --(CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx; --(CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx; --(CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx; +-(nullable CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx; @end @@ -91,29 +91,29 @@ @implementation CPTTradingRangePlot @dynamic increaseLineStyles; @dynamic decreaseLineStyles; -/** @property CPTLineStyle *lineStyle +/** @property nullable CPTLineStyle *lineStyle * @brief The line style used to draw candlestick or OHLC symbols. **/ @synthesize lineStyle; -/** @property CPTLineStyle *increaseLineStyle +/** @property nullable CPTLineStyle *increaseLineStyle * @brief The line style used to outline candlestick symbols or draw OHLC symbols when close >= open. * If @nil, will use @ref lineStyle instead. **/ @synthesize increaseLineStyle; -/** @property CPTLineStyle *decreaseLineStyle +/** @property nullable CPTLineStyle *decreaseLineStyle * @brief The line style used to outline candlestick symbols or draw OHLC symbols when close < open. * If @nil, will use @ref lineStyle instead. **/ @synthesize decreaseLineStyle; -/** @property CPTFill *increaseFill +/** @property nullable CPTFill *increaseFill * @brief The fill used with a candlestick plot when close >= open. **/ @synthesize increaseFill; -/** @property CPTFill *decreaseFill +/** @property nullable CPTFill *decreaseFill * @brief The fill used with a candlestick plot when close < open. **/ @synthesize decreaseFill; @@ -201,7 +201,7 @@ +(void)initialize * @param newFrame The frame rectangle. * @return The initialized CPTTradingRangePlot object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { plotStyle = CPTTradingRangePlotStyleOHLC; @@ -226,7 +226,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTTradingRangePlot *theLayer = (CPTTradingRangePlot *)layer; @@ -254,7 +254,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -273,7 +273,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pointingDeviceDownIndex } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { lineStyle = [[coder decodeObjectForKey:@"CPTTradingRangePlot.lineStyle"] copy]; @@ -536,7 +536,7 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -760,7 +760,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context CGContextEndTransparencyLayer(context); } --(void)drawCandleStickInContext:(CGContextRef)context +-(void)drawCandleStickInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue @@ -917,7 +917,7 @@ -(void)drawCandleStickInContext:(CGContextRef)context } } --(void)drawOHLCInContext:(CGContextRef)context +-(void)drawOHLCInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue @@ -998,7 +998,7 @@ -(void)drawOHLCInContext:(CGContextRef)context } } --(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [super drawSwatchForLegend:legend atIndex:idx inRect:rect inContext:context]; @@ -1031,7 +1031,7 @@ -(void)drawSwatchForLegend:(CPTLegend *)legend atIndex:(NSUInteger)idx inRect:(C } } --(CPTFill *)increaseFillForIndex:(NSUInteger)idx +-(nullable CPTFill *)increaseFillForIndex:(NSUInteger)idx { CPTFill *theFill = [self cachedValueForKey:CPTTradingRangePlotBindingIncreaseFills recordIndex:idx]; @@ -1042,7 +1042,7 @@ -(CPTFill *)increaseFillForIndex:(NSUInteger)idx return theFill; } --(CPTFill *)decreaseFillForIndex:(NSUInteger)idx +-(nullable CPTFill *)decreaseFillForIndex:(NSUInteger)idx { CPTFill *theFill = [self cachedValueForKey:CPTTradingRangePlotBindingDecreaseFills recordIndex:idx]; @@ -1053,7 +1053,7 @@ -(CPTFill *)decreaseFillForIndex:(NSUInteger)idx return theFill; } --(CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx +-(nullable CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx { CPTLineStyle *theLineStyle = [self cachedValueForKey:CPTTradingRangePlotBindingLineStyles recordIndex:idx]; @@ -1064,7 +1064,7 @@ -(CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx return theLineStyle; } --(CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx +-(nullable CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx { CPTLineStyle *theLineStyle = [self cachedValueForKey:CPTTradingRangePlotBindingIncreaseLineStyles recordIndex:idx]; @@ -1079,7 +1079,7 @@ -(CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx return theLineStyle; } --(CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx +-(nullable CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx { CPTLineStyle *theLineStyle = [self cachedValueForKey:CPTTradingRangePlotBindingDecreaseLineStyles recordIndex:idx]; @@ -1101,7 +1101,7 @@ -(CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx /// @cond -+(BOOL)needsDisplayForKey:(NSString *)aKey ++(BOOL)needsDisplayForKey:(nonnull NSString *)aKey { static NSSet *keys = nil; static dispatch_once_t onceToken = 0; @@ -1133,7 +1133,7 @@ -(NSUInteger)numberOfFields return 5; } --(CPTNumberArray)fieldIdentifiers +-(nonnull CPTNumberArray)fieldIdentifiers { return @[@(CPTTradingRangePlotFieldX), @(CPTTradingRangePlotFieldOpen), @@ -1142,7 +1142,7 @@ -(CPTNumberArray)fieldIdentifiers @(CPTTradingRangePlotFieldLow)]; } --(CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray)fieldIdentifiersForCoordinate:(CPTCoordinate)coord { CPTNumberArray result = nil; @@ -1195,7 +1195,7 @@ -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field /// @cond --(void)positionLabelAnnotation:(CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx { BOOL positiveDirection = YES; CPTPlotRange *yRange = [self.plotSpace plotRangeForCoordinate:CPTCoordinateY]; @@ -1493,7 +1493,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTGraph *theGraph = self.graph; CPTPlotArea *thePlotArea = self.plotArea; @@ -1558,7 +1558,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { NSUInteger selectedDownIndex = self.pointingDeviceDownIndex; @@ -1630,7 +1630,7 @@ -(void)setPlotStyle:(CPTTradingRangePlotStyle)newPlotStyle } } --(void)setLineStyle:(CPTLineStyle *)newLineStyle +-(void)setLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( lineStyle != newLineStyle ) { lineStyle = [newLineStyle copy]; @@ -1639,7 +1639,7 @@ -(void)setLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setIncreaseLineStyle:(CPTLineStyle *)newLineStyle +-(void)setIncreaseLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( increaseLineStyle != newLineStyle ) { increaseLineStyle = [newLineStyle copy]; @@ -1648,7 +1648,7 @@ -(void)setIncreaseLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setDecreaseLineStyle:(CPTLineStyle *)newLineStyle +-(void)setDecreaseLineStyle:(nullable CPTLineStyle *)newLineStyle { if ( decreaseLineStyle != newLineStyle ) { decreaseLineStyle = [newLineStyle copy]; @@ -1657,7 +1657,7 @@ -(void)setDecreaseLineStyle:(CPTLineStyle *)newLineStyle } } --(void)setIncreaseFill:(CPTFill *)newFill +-(void)setIncreaseFill:(nullable CPTFill *)newFill { if ( increaseFill != newFill ) { increaseFill = [newFill copy]; @@ -1666,7 +1666,7 @@ -(void)setIncreaseFill:(CPTFill *)newFill } } --(void)setDecreaseFill:(CPTFill *)newFill +-(void)setDecreaseFill:(nullable CPTFill *)newFill { if ( decreaseFill != newFill ) { decreaseFill = [newFill copy]; @@ -1709,106 +1709,106 @@ -(void)setShowBarBorder:(BOOL)newShowBarBorder } } --(void)setXValues:(CPTMutableNumericData *)newValues +-(void)setXValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldX]; } --(CPTMutableNumericData *)xValues +-(nullable CPTMutableNumericData *)xValues { return [self cachedNumbersForField:CPTTradingRangePlotFieldX]; } --(CPTMutableNumericData *)openValues +-(nullable CPTMutableNumericData *)openValues { return [self cachedNumbersForField:CPTTradingRangePlotFieldOpen]; } --(void)setOpenValues:(CPTMutableNumericData *)newValues +-(void)setOpenValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldOpen]; } --(CPTMutableNumericData *)highValues +-(nullable CPTMutableNumericData *)highValues { return [self cachedNumbersForField:CPTTradingRangePlotFieldHigh]; } --(void)setHighValues:(CPTMutableNumericData *)newValues +-(void)setHighValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldHigh]; } --(CPTMutableNumericData *)lowValues +-(nullable CPTMutableNumericData *)lowValues { return [self cachedNumbersForField:CPTTradingRangePlotFieldLow]; } --(void)setLowValues:(CPTMutableNumericData *)newValues +-(void)setLowValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldLow]; } --(CPTMutableNumericData *)closeValues +-(nullable CPTMutableNumericData *)closeValues { return [self cachedNumbersForField:CPTTradingRangePlotFieldClose]; } --(void)setCloseValues:(CPTMutableNumericData *)newValues +-(void)setCloseValues:(nullable CPTMutableNumericData *)newValues { [self cacheNumbers:newValues forField:CPTTradingRangePlotFieldClose]; } --(CPTFillArray)increaseFills +-(nullable CPTFillArray)increaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseFills]; } --(void)setIncreaseFills:(CPTFillArray)newFills +-(void)setIncreaseFills:(nullable CPTFillArray)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingIncreaseFills]; [self setNeedsDisplay]; } --(CPTFillArray)decreaseFills +-(nullable CPTFillArray)decreaseFills { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseFills]; } --(void)setDecreaseFills:(CPTFillArray)newFills +-(void)setDecreaseFills:(nullable CPTFillArray)newFills { [self cacheArray:newFills forKey:CPTTradingRangePlotBindingDecreaseFills]; [self setNeedsDisplay]; } --(CPTLineStyleArray)lineStyles +-(nullable CPTLineStyleArray)lineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingLineStyles]; } --(void)setLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setLineStyles:(nullable CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingLineStyles]; [self setNeedsDisplay]; } --(CPTLineStyleArray)increaseLineStyles +-(nullable CPTLineStyleArray)increaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingIncreaseLineStyles]; } --(void)setIncreaseLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setIncreaseLineStyles:(nullable CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingIncreaseLineStyles]; [self setNeedsDisplay]; } --(CPTLineStyleArray)decreaseLineStyles +-(nullable CPTLineStyleArray)decreaseLineStyles { return [self cachedArrayForKey:CPTTradingRangePlotBindingDecreaseLineStyles]; } --(void)setDecreaseLineStyles:(CPTLineStyleArray)newLineStyles +-(void)setDecreaseLineStyles:(nullable CPTLineStyleArray)newLineStyles { [self cacheArray:newLineStyles forKey:CPTTradingRangePlotBindingDecreaseLineStyles]; [self setNeedsDisplay]; diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index 8835dc852..fe41b4dd6 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -30,7 +30,7 @@ float CPTDecimalFloatValue(NSDecimal decimalNumber); double CPTDecimalDoubleValue(NSDecimal decimalNumber); CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber); -NSString *CPTDecimalStringValue(NSDecimal decimalNumber); +NSString *__nonnull CPTDecimalStringValue(NSDecimal decimalNumber); /// @} @@ -54,7 +54,7 @@ NSDecimal CPTDecimalFromFloat(float aFloat); NSDecimal CPTDecimalFromDouble(double aDouble); NSDecimal CPTDecimalFromCGFloat(CGFloat aCGFloat); -NSDecimal CPTDecimalFromString(NSString *stringRepresentation); +NSDecimal CPTDecimalFromString(NSString *__nonnull stringRepresentation); /// @} @@ -100,7 +100,7 @@ CPTCoordinate CPTOrthogonalCoordinate(CPTCoordinate coord); /// @name Gradient Colors /// @{ -CPTRGBAColor CPTRGBAColorFromCGColor(CGColorRef color); +CPTRGBAColor CPTRGBAColorFromCGColor(__nonnull CGColorRef color); /// @} @@ -110,29 +110,29 @@ CPTRGBAColor CPTRGBAColorFromCGColor(CGColorRef color); /** * @brief A function called to align a point in a CGContext. **/ -typedef CGPoint (*CPTAlignPointFunction)(CGContextRef, CGPoint); +typedef CGPoint (*CPTAlignPointFunction)(__nonnull CGContextRef, CGPoint); /** * @brief A function called to align a rectangle in a CGContext. **/ -typedef CGRect (*CPTAlignRectFunction)(CGContextRef, CGRect); +typedef CGRect (*CPTAlignRectFunction)(__nonnull CGContextRef, CGRect); -CGPoint CPTAlignPointToUserSpace(CGContextRef context, CGPoint point); -CGSize CPTAlignSizeToUserSpace(CGContextRef context, CGSize size); -CGRect CPTAlignRectToUserSpace(CGContextRef context, CGRect rect); +CGPoint CPTAlignPointToUserSpace(__nonnull CGContextRef context, CGPoint point); +CGSize CPTAlignSizeToUserSpace(__nonnull CGContextRef context, CGSize size); +CGRect CPTAlignRectToUserSpace(__nonnull CGContextRef context, CGRect rect); -CGPoint CPTAlignIntegralPointToUserSpace(CGContextRef context, CGPoint point); -CGRect CPTAlignIntegralRectToUserSpace(CGContextRef context, CGRect rect); +CGPoint CPTAlignIntegralPointToUserSpace(__nonnull CGContextRef context, CGPoint point); +CGRect CPTAlignIntegralRectToUserSpace(__nonnull CGContextRef context, CGRect rect); -CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLineStyle *borderLineStyle); +CGRect CPTAlignBorderedRectToUserSpace(__nonnull CGContextRef context, CGRect rect, CPTLineStyle *__nonnull borderLineStyle); /// @} /// @name String Formatting for Core Graphics Structs /// @{ -NSString *CPTStringFromPoint(CGPoint point); -NSString *CPTStringFromSize(CGSize size); -NSString *CPTStringFromRect(CGRect rect); +NSString *__nonnull CPTStringFromPoint(CGPoint point); +NSString *__nonnull CPTStringFromSize(CGSize size); +NSString *__nonnull CPTStringFromRect(CGRect rect); /// @} diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 3f9a8b805..eebd0c0cd 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -173,7 +173,7 @@ CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber) * @param decimalNumber The @ref NSDecimal value. * @return The converted value. **/ -NSString *CPTDecimalStringValue(NSDecimal decimalNumber) +NSString *__nonnull CPTDecimalStringValue(NSDecimal decimalNumber) { return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] stringValue]; } @@ -516,7 +516,7 @@ NSDecimal CPTDecimalFromCGFloat(CGFloat aCGFloat) * @param stringRepresentation The string value. * @return The numeric value extracted from the string. **/ -NSDecimal CPTDecimalFromString(NSString *stringRepresentation) +NSDecimal CPTDecimalFromString(NSString *__nonnull stringRepresentation) { // The following NSDecimalNumber-based creation of NSDecimal structs from strings is slower than // the NSScanner-based method: (307000 operations per second vs. 582000 operations per second for NSScanner) @@ -744,7 +744,7 @@ NSRange CPTExpandedRange(NSRange range, NSInteger expandBy) * @param color The color. * @return The RGBA components of the color. **/ -CPTRGBAColor CPTRGBAColorFromCGColor(CGColorRef color) +CPTRGBAColor CPTRGBAColorFromCGColor(__nonnull CGColorRef color) { CPTRGBAColor rgbColor; @@ -798,7 +798,7 @@ CPTCoordinate CPTOrthogonalCoordinate(CPTCoordinate coord) * @param point The point in user space. * @return The device aligned point in user space. **/ -CGPoint CPTAlignPointToUserSpace(CGContextRef context, CGPoint point) +CGPoint CPTAlignPointToUserSpace(__nonnull CGContextRef context, CGPoint point) { // Compute the coordinates of the point in device space. point = CGContextConvertPointToDeviceSpace(context, point); @@ -822,7 +822,7 @@ CGPoint CPTAlignPointToUserSpace(CGContextRef context, CGPoint point) * @param size The size in user space. * @return The device aligned size in user space. **/ -CGSize CPTAlignSizeToUserSpace(CGContextRef context, CGSize size) +CGSize CPTAlignSizeToUserSpace(__nonnull CGContextRef context, CGSize size) { // Compute the size in device space. size = CGContextConvertSizeToDeviceSpace(context, size); @@ -846,7 +846,7 @@ CGSize CPTAlignSizeToUserSpace(CGContextRef context, CGSize size) * @param rect The rectangle in user space. * @return The device aligned rectangle in user space. **/ -CGRect CPTAlignRectToUserSpace(CGContextRef context, CGRect rect) +CGRect CPTAlignRectToUserSpace(__nonnull CGContextRef context, CGRect rect) { rect = CGContextConvertRectToDeviceSpace(context, rect); @@ -874,7 +874,7 @@ CGRect CPTAlignRectToUserSpace(CGContextRef context, CGRect rect) * @param point The point in user space. * @return The device aligned point in user space. **/ -CGPoint CPTAlignIntegralPointToUserSpace(CGContextRef context, CGPoint point) +CGPoint CPTAlignIntegralPointToUserSpace(__nonnull CGContextRef context, CGPoint point) { point = CGContextConvertPointToDeviceSpace(context, point); @@ -894,7 +894,7 @@ CGPoint CPTAlignIntegralPointToUserSpace(CGContextRef context, CGPoint point) * @param rect The rectangle in user space. * @return The device aligned rectangle in user space. **/ -CGRect CPTAlignIntegralRectToUserSpace(CGContextRef context, CGRect rect) +CGRect CPTAlignIntegralRectToUserSpace(__nonnull CGContextRef context, CGRect rect) { rect = CGContextConvertRectToDeviceSpace(context, rect); @@ -909,7 +909,7 @@ CGRect CPTAlignIntegralRectToUserSpace(CGContextRef context, CGRect rect) return CGContextConvertRectToUserSpace(context, rect); } -CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLineStyle *borderLineStyle) +CGRect CPTAlignBorderedRectToUserSpace(__nonnull CGContextRef context, CGRect rect, CPTLineStyle *__nonnull borderLineStyle) { CGRect borderRect; CGFloat contextScale = CPTFloat(1.0); @@ -942,7 +942,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin * @param point The point. * @return A string with the format {x, y}. **/ -NSString *CPTStringFromPoint(CGPoint point) +NSString * __nonnull CPTStringFromPoint(CGPoint point) { return [NSString stringWithFormat:@"{%g, %g}", (double)point.x, (double)point.y]; } @@ -951,7 +951,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin * @param size The size. * @return A string with the format {width, height}. **/ -NSString *CPTStringFromSize(CGSize size) +NSString *__nonnull CPTStringFromSize(CGSize size) { return [NSString stringWithFormat:@"{%g, %g}", (double)size.width, (double)size.height]; } @@ -960,7 +960,7 @@ CGRect CPTAlignBorderedRectToUserSpace(CGContextRef context, CGRect rect, CPTLin * @param rect The rectangle. * @return A string with the format {{x, y}, {width, height}}. **/ -NSString *CPTStringFromRect(CGRect rect) +NSString *__nonnull CPTStringFromRect(CGRect rect) { return [NSString stringWithFormat:@"{{%g, %g}, {%g, %g}}", (double)rect.origin.x, (double)rect.origin.y, (double)rect.size.width, (double)rect.size.height]; } diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index 75726a79e..eaecc2f25 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -609,7 +609,7 @@ -(void)testInverseLogModulus /// @cond --(void)setContext:(CGContextRef)newContext +-(void)setContext:(nonnull CGContextRef)newContext { if ( context != newContext ) { CGContextRetain(newContext); diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index b141e448f..3d736ef03 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -32,14 +32,14 @@ -(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord **/ @implementation CPTXYAxis -/** @property NSNumber *orthogonalPosition +/** @property nullable NSNumber *orthogonalPosition * @brief The data coordinate value where the axis crosses the orthogonal axis. * If the @ref axisConstraints is non-nil, the constraints take priority and this property is ignored. * @see @ref axisConstraints **/ @synthesize orthogonalPosition; -/** @property CPTConstraints *axisConstraints +/** @property nullable CPTConstraints *axisConstraints * @brief The constraints used when positioning relative to the plot area. * If @nil (the default), the axis is fixed relative to the plot space coordinates, * crossing the orthogonal axis at @ref orthogonalPosition and moves only @@ -63,7 +63,7 @@ @implementation CPTXYAxis * @param newFrame The frame rectangle. * @return The initialized CPTXYAxis object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { orthogonalPosition = @0.0; @@ -77,7 +77,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTXYAxis *theLayer = (CPTXYAxis *)layer; @@ -95,7 +95,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -103,7 +103,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeObject:self.axisConstraints forKey:@"CPTXYAxis.axisConstraints"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { orthogonalPosition = [coder decodeObjectForKey:@"CPTXYAxis.orthogonalPosition"]; @@ -119,7 +119,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat *)upper +-(void)orthogonalCoordinateViewLowerBound:(nonnull CGFloat *)lower upperBound:(nonnull CGFloat *)upper { CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(self.coordinate); CPTXYPlotSpace *xyPlotSpace = (CPTXYPlotSpace *)self.plotSpace; @@ -148,7 +148,7 @@ -(void)orthogonalCoordinateViewLowerBound:(CGFloat *)lower upperBound:(CGFloat * } } --(CGPoint)viewPointForOrthogonalCoordinate:(NSNumber *)orthogonalCoord axisCoordinate:(NSNumber *)coordinateValue +-(CGPoint)viewPointForOrthogonalCoordinate:(nullable NSNumber *)orthogonalCoord axisCoordinate:(nullable NSNumber *)coordinateValue { CPTCoordinate myCoordinate = self.coordinate; CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(myCoordinate); @@ -163,7 +163,7 @@ -(CGPoint)viewPointForOrthogonalCoordinate:(NSNumber *)orthogonalCoord axisCoord return [self convertPoint:[self.plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; } --(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue +-(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *)coordinateValue { CGPoint point = [self viewPointForOrthogonalCoordinate:self.orthogonalPosition axisCoordinate:coordinateValue]; @@ -210,7 +210,7 @@ -(CGPoint)viewPointForCoordinateValue:(NSNumber *)coordinateValue /// @cond --(void)drawTicksInContext:(CGContextRef)context atLocations:(CPTNumberSet)locations withLength:(CGFloat)length inRange:(CPTPlotRange *)labeledRange isMajor:(BOOL)major +-(void)drawTicksInContext:(nonnull CGContextRef)context atLocations:(nullable CPTNumberSet)locations withLength:(CGFloat)length inRange:(nullable CPTPlotRange *)labeledRange isMajor:(BOOL)major { CPTLineStyle *lineStyle = (major ? self.majorTickLineStyle : self.minorTickLineStyle); @@ -284,7 +284,7 @@ -(void)drawTicksInContext:(CGContextRef)context atLocations:(CPTNumberSet)locati [lineStyle strokePathInContext:context]; } --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -380,7 +380,7 @@ -(void)renderAsVectorInContext:(CGContextRef)context /// @cond --(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major +-(void)drawGridLinesInContext:(nonnull CGContextRef)context isMajor:(BOOL)major { CPTLineStyle *lineStyle = (major ? self.majorGridLineStyle : self.minorGridLineStyle); @@ -478,7 +478,7 @@ -(void)drawGridLinesInContext:(CGContextRef)context isMajor:(BOOL)major /// @cond --(void)drawBackgroundBandsInContext:(CGContextRef)context +-(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context { CPTFillArray bandArray = self.alternatingBandFills; NSUInteger bandCount = bandArray.count; @@ -601,7 +601,7 @@ -(void)drawBackgroundBandsInContext:(CGContextRef)context } } --(void)drawBackgroundLimitsInContext:(CGContextRef)context +-(void)drawBackgroundLimitsInContext:(nonnull CGContextRef)context { CPTLimitBandArray limitArray = self.backgroundLimitBands; @@ -666,7 +666,7 @@ -(void)drawBackgroundLimitsInContext:(CGContextRef)context /// @cond --(NSString *)description +-(nullable NSString *)description { CPTPlotRange *range = [self.plotSpace plotRangeForCoordinate:self.coordinate]; CGPoint startViewPoint = [self viewPointForCoordinateValue:range.location]; @@ -687,7 +687,7 @@ -(NSString *)description /// @cond // Center title in the plot range by default --(NSNumber *)defaultTitleLocation +-(nonnull NSNumber *)defaultTitleLocation { NSNumber *location; @@ -746,7 +746,7 @@ -(NSNumber *)defaultTitleLocation /// @cond --(void)setAxisConstraints:(CPTConstraints *)newConstraints +-(void)setAxisConstraints:(nullable CPTConstraints *)newConstraints { if ( ![axisConstraints isEqualToConstraint:newConstraints] ) { axisConstraints = newConstraints; @@ -755,12 +755,13 @@ -(void)setAxisConstraints:(CPTConstraints *)newConstraints } } --(void)setOrthogonalPosition:(NSNumber *)newPosition +-(void)setOrthogonalPosition:(nullable NSNumber *)newPosition { BOOL needsUpdate = YES; if ( newPosition ) { - needsUpdate = ![orthogonalPosition isEqualToNumber:newPosition]; + NSNumber *position = newPosition; + needsUpdate = ![orthogonalPosition isEqualToNumber:position]; } if ( needsUpdate ) { diff --git a/framework/Source/CPTXYAxisSet.m b/framework/Source/CPTXYAxisSet.m index b4aa6703a..dfa61ad6b 100644 --- a/framework/Source/CPTXYAxisSet.m +++ b/framework/Source/CPTXYAxisSet.m @@ -10,12 +10,12 @@ **/ @implementation CPTXYAxisSet -/** @property CPTXYAxis *xAxis +/** @property nullable CPTXYAxis *xAxis * @brief The x-axis. **/ @dynamic xAxis; -/** @property CPTXYAxis *yAxis +/** @property nullable CPTXYAxis *yAxis * @brief The y-axis. **/ @dynamic yAxis; @@ -40,7 +40,7 @@ @implementation CPTXYAxisSet * @param newFrame The frame rectangle. * @return The initialized CPTXYAxisSet object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { CPTXYAxis *xAxis = [[CPTXYAxis alloc] initWithFrame:newFrame]; @@ -63,7 +63,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -97,6 +97,9 @@ -(void)renderAsVectorInContext:(CGContextRef)context #pragma mark - #pragma mark Layout +/// @name Layout +/// @{ + /** * @brief Updates the layout of all sublayers. Sublayers (the axes) fill the plot area frame’s bounds. * @@ -128,17 +131,19 @@ -(void)layoutSublayers } } +/// @} + #pragma mark - #pragma mark Accessors /// @cond --(CPTXYAxis *)xAxis +-(nullable CPTXYAxis *)xAxis { return (CPTXYAxis *)[self axisForCoordinate:CPTCoordinateX atIndex:0]; } --(CPTXYAxis *)yAxis +-(nullable CPTXYAxis *)yAxis { return (CPTXYAxis *)[self axisForCoordinate:CPTCoordinateY atIndex:0]; } diff --git a/framework/Source/CPTXYGraph.m b/framework/Source/CPTXYGraph.m index 5d544b624..0ceb46711 100644 --- a/framework/Source/CPTXYGraph.m +++ b/framework/Source/CPTXYGraph.m @@ -21,12 +21,14 @@ @interface CPTXYGraph() **/ @implementation CPTXYGraph -/** @property CPTScaleType xScaleType +/** @internal + * @property CPTScaleType xScaleType * @brief The scale type for the x-axis. **/ @synthesize xScaleType; -/** @property CPTScaleType yScaleType +/** @internal + * @property CPTScaleType yScaleType * @brief The scale type for the y-axis. **/ @synthesize yScaleType; @@ -43,7 +45,7 @@ @implementation CPTXYGraph * @param newYScaleType The scale type for the y-axis. * @return The initialized CPTXYGraph object. **/ --(instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType +-(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType { if ( (self = [super initWithFrame:newFrame]) ) { xScaleType = newXScaleType; @@ -65,7 +67,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScale * @return The initialized CPTXYGraph object. * @see @link CPTXYGraph::initWithFrame:xScaleType:yScaleType: -initWithFrame:xScaleType:yScaleType: @endlink **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { return [self initWithFrame:newFrame xScaleType:CPTScaleTypeLinear yScaleType:CPTScaleTypeLinear]; } @@ -74,7 +76,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTXYGraph *theLayer = (CPTXYGraph *)layer; @@ -92,7 +94,7 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -100,7 +102,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeInteger:self.yScaleType forKey:@"CPTXYGraph.yScaleType"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { xScaleType = (CPTScaleType)[coder decodeIntegerForKey:@"CPTXYGraph.xScaleType"]; @@ -116,7 +118,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(CPTPlotSpace *)newPlotSpace +-(nullable CPTPlotSpace *)newPlotSpace { CPTXYPlotSpace *space = [[CPTXYPlotSpace alloc] init]; @@ -125,7 +127,7 @@ -(CPTPlotSpace *)newPlotSpace return space; } --(CPTAxisSet *)newAxisSet +-(nullable CPTAxisSet *)newAxisSet { CPTXYAxisSet *newAxisSet = [[CPTXYAxisSet alloc] initWithFrame:self.bounds]; diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index d0c9de441..3aecf8f4b 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -21,23 +21,23 @@ @interface CPTXYPlotSpace() --(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord; --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nonnull CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nullable CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord; --(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength; --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nonnull CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nullable CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength; --(CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange; +-(nonnull CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange; -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shift momentumTime:(CGFloat)momentumTime speed:(CGFloat)speed acceleration:(CGFloat)acceleration; --(CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement; +-(nullable CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement; -(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTCoordinate)coordinate direction:(BOOL)direction; @@ -73,7 +73,7 @@ -(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTC **/ @implementation CPTXYPlotSpace -/** @property CPTPlotRange *xRange +/** @property nonnull CPTPlotRange *xRange * @brief The range of the x coordinate. Defaults to a range with @link CPTPlotRange::location location @endlink zero (@num{0}) * and a @link CPTPlotRange::length length @endlink of one (@num{1}). * @@ -84,7 +84,7 @@ @implementation CPTXYPlotSpace **/ @synthesize xRange; -/** @property CPTPlotRange *yRange +/** @property nonnull CPTPlotRange *yRange * @brief The range of the y coordinate. Defaults to a range with @link CPTPlotRange::location location @endlink zero (@num{0}) * and a @link CPTPlotRange::length length @endlink of one (@num{1}). * @@ -95,7 +95,7 @@ @implementation CPTXYPlotSpace **/ @synthesize yRange; -/** @property CPTPlotRange *globalXRange +/** @property nullable CPTPlotRange *globalXRange * @brief The global range of the x coordinate to which the @ref xRange is constrained. * * If non-@nil, the @ref xRange and any changes to it will @@ -104,7 +104,7 @@ @implementation CPTXYPlotSpace **/ @synthesize globalXRange; -/** @property CPTPlotRange *globalYRange +/** @property nullable CPTPlotRange *globalYRange * @brief The global range of the y coordinate to which the @ref yRange is constrained. * * If non-@nil, the @ref yRange and any changes to it will @@ -196,7 +196,7 @@ @implementation CPTXYPlotSpace * * @return The initialized object. **/ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { xRange = [[CPTPlotRange alloc] initWithLocation:@0.0 length:@1.0]; @@ -229,7 +229,7 @@ -(instancetype)init /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -255,7 +255,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // animations } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { CPTPlotRange *range = [coder decodeObjectForKey:@"CPTXYPlotSpace.xRange"]; @@ -300,7 +300,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)setPlotRange:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(void)setPlotRange:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { switch ( coordinate ) { case CPTCoordinateX: @@ -317,7 +317,7 @@ -(void)setPlotRange:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordi } } --(CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate { CPTPlotRange *theRange = nil; @@ -376,7 +376,7 @@ -(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate return theScaleType; } --(void)setXRange:(CPTPlotRange *)range +-(void)setXRange:(nonnull CPTPlotRange *)range { NSParameterAssert(range); @@ -440,7 +440,7 @@ -(void)setXRange:(CPTPlotRange *)range } } --(void)setYRange:(CPTPlotRange *)range +-(void)setYRange:(nonnull CPTPlotRange *)range { NSParameterAssert(range); @@ -504,7 +504,7 @@ -(void)setYRange:(CPTPlotRange *)range } } --(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPTPlotRange *)globalRange +-(nonnull CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange { if ( !globalRange ) { return existingRange; @@ -513,13 +513,15 @@ -(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPT return nil; } - if ( CPTDecimalGreaterThanOrEqualTo(existingRange.lengthDecimal, globalRange.lengthDecimal) ) { - return [globalRange copy]; + CPTPlotRange *theGlobalRange = globalRange; + + if ( CPTDecimalGreaterThanOrEqualTo(existingRange.lengthDecimal, theGlobalRange.lengthDecimal) ) { + return [theGlobalRange copy]; } else { CPTMutablePlotRange *newRange = [existingRange mutableCopy]; - [newRange shiftEndToFitInRange:globalRange]; - [newRange shiftLocationToFitInRange:globalRange]; + [newRange shiftEndToFitInRange:theGlobalRange]; + [newRange shiftLocationToFitInRange:theGlobalRange]; return newRange; } } @@ -680,7 +682,7 @@ -(void)animateRangeForCoordinate:(CPTCoordinate)coordinate shift:(NSDecimal)shif } } --(CGFloat)viewCoordinateForRange:(CPTPlotRange *)range coordinate:(CPTCoordinate)coordinate direction:(BOOL)direction +-(CGFloat)viewCoordinateForRange:(nullable CPTPlotRange *)range coordinate:(CPTCoordinate)coordinate direction:(BOOL)direction { CPTCoordinate orthogonalCoordinate = CPTOrthogonalCoordinate(coordinate); @@ -730,7 +732,7 @@ CGFloat CPTFirstPositiveRoot(CGFloat a, CGFloat b, CGFloat c) return root; } --(void)setGlobalXRange:(CPTPlotRange *)newRange +-(void)setGlobalXRange:(nullable CPTPlotRange *)newRange { if ( ![newRange isEqualToRange:globalXRange] ) { globalXRange = [newRange copy]; @@ -738,7 +740,7 @@ -(void)setGlobalXRange:(CPTPlotRange *)newRange } } --(void)setGlobalYRange:(CPTPlotRange *)newRange +-(void)setGlobalYRange:(nullable CPTPlotRange *)newRange { if ( ![newRange isEqualToRange:globalYRange] ) { globalYRange = [newRange copy]; @@ -746,7 +748,7 @@ -(void)setGlobalYRange:(CPTPlotRange *)newRange } } --(void)scaleToFitPlots:(CPTPlotArray)plots +-(void)scaleToFitPlots:(nullable CPTPlotArray)plots { if ( plots.count == 0 ) { return; @@ -828,7 +830,7 @@ -(void)setYScaleType:(CPTScaleType)newScaleType /// @cond // Linear --(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord +-(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nonnull CPTPlotRange *)range plotCoordinateValue:(NSDecimal)plotCoord { if ( !range ) { return CPTFloat(0.0); @@ -844,7 +846,7 @@ -(CGFloat)viewCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(CPT return CPTDecimalCGFloatValue(viewCoordinate); } --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord { if ( !range || (range.lengthDouble == 0.0) ) { return CPTFloat(0.0); @@ -852,7 +854,7 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPl return viewLength * (CGFloat)( (plotCoord - range.locationDouble) / range.lengthDouble ); } --(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength +-(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(nonnull CPTPlotRange *)range boundsLength:(NSDecimal)boundsLength { const NSDecimal zero = CPTDecimalFromInteger(0); @@ -871,7 +873,7 @@ -(NSDecimal)plotCoordinateForViewLength:(NSDecimal)viewLength linearPlotRange:(C return coordinate; } --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { if ( boundsLength == CPTFloat(0.0) ) { return 0.0; @@ -885,7 +887,7 @@ -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength linearPl } // Log (only one version since there are no transcendental functions for NSDecimal) --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord { if ( (range.minLimitDouble <= 0.0) || (range.maxLimitDouble <= 0.0) || (plotCoord <= 0.0) ) { return CPTFloat(0.0); @@ -898,7 +900,7 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotR return viewLength * (CGFloat)( (logCoord - logLoc) / (logEnd - logLoc) ); } --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { if ( boundsLength == CPTFloat(0.0) ) { return 0.0; @@ -913,7 +915,7 @@ -(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logPlotR } // Log-modulus (only one version since there are no transcendental functions for NSDecimal) --(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord +-(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nonnull CPTPlotRange *)range doublePrecisionPlotCoordinateValue:(double)plotCoord { if ( !range ) { return CPTFloat(0.0); @@ -926,7 +928,7 @@ -(CGFloat)viewCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(C return viewLength * (CGFloat)( (logCoord - logLoc) / (logEnd - logLoc) ); } --(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(CPTPlotRange *)range boundsLength:(CGFloat)boundsLength +-(double)doublePrecisionPlotCoordinateForViewLength:(CGFloat)viewLength logModulusPlotRange:(nonnull CPTPlotRange *)range boundsLength:(CGFloat)boundsLength { if ( boundsLength == CPTFloat(0.0) ) { return 0.0; @@ -952,7 +954,7 @@ -(NSUInteger)numberOfCoordinates } // Plot area view point for plot point --(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint { CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint]; @@ -1014,7 +1016,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(CPTNumberArray)plotPoint return viewPoint; } --(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count { CGPoint viewPoint = [super plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:count]; @@ -1080,7 +1082,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(NSDecimal *)plotPoint numberOfCoordinat return viewPoint; } --(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count { CGPoint viewPoint = [super plotAreaViewPointForDoublePrecisionPlotPoint:plotPoint numberOfCoordinates:count]; @@ -1135,7 +1137,7 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(double *)plotPoint numbe } // Plot point for view point --(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point +-(nullable CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point { CPTMutableNumberArray plotPoint = [[super plotPointForPlotAreaViewPoint:point] mutableCopy]; @@ -1197,7 +1199,7 @@ -(CPTNumberArray)plotPointForPlotAreaViewPoint:(CGPoint)point return plotPoint; } --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point { [super plotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:point]; @@ -1252,7 +1254,7 @@ -(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count fo } } --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point { [super doublePrecisionPlotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:point]; @@ -1307,7 +1309,7 @@ -(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInte } // Plot area view point for event --(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event +-(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event { CGPoint plotAreaViewPoint = CGPointZero; @@ -1335,17 +1337,17 @@ -(CGPoint)plotAreaViewPointForEvent:(CPTNativeEvent *)event } // Plot point for event --(CPTNumberArray)plotPointForEvent:(CPTNativeEvent *)event +-(nullable CPTNumberArray)plotPointForEvent:(nonnull CPTNativeEvent *)event { return [self plotPointForPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; } --(void)plotPoint:(NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event +-(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event { [self plotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; } --(void)doublePrecisionPlotPoint:(double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(CPTNativeEvent *)event +-(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event { [self doublePrecisionPlotPoint:plotPoint numberOfCoordinates:count forPlotAreaViewPoint:[self plotAreaViewPointForEvent:event]]; } @@ -1460,7 +1462,7 @@ -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)plotAreaPoint * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { self.isDragging = NO; @@ -1514,7 +1516,7 @@ -(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interact * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledByDelegate = [super pointingDeviceUpEvent:event atPoint:interactionPoint]; @@ -1612,7 +1614,7 @@ -(BOOL)pointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactio * @param interactionPoint The coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { BOOL handledByDelegate = [super pointingDeviceDraggedEvent:event atPoint:interactionPoint]; @@ -1683,7 +1685,7 @@ -(BOOL)pointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)inter return NO; } --(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement +-(nullable CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement { CPTMutablePlotRange *newRange = [oldRange mutableCopy]; @@ -1733,7 +1735,7 @@ -(CPTPlotRange *)shiftRange:(CPTPlotRange *)oldRange by:(NSDecimal)shift usingMo * @param toPoint The ending coordinates of the interaction. * @return Whether the event was handled or not. **/ --(BOOL)scrollWheelEvent:(CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { BOOL handledByDelegate = [super scrollWheelEvent:event fromPoint:fromPoint toPoint:toPoint]; @@ -1823,7 +1825,7 @@ -(BOOL)allowsMomentum /// @cond --(void)animationDidFinish:(CPTAnimationOperation *)operation +-(void)animationDidFinish:(nonnull CPTAnimationOperation *)operation { [self.animations removeObjectIdenticalTo:operation]; } @@ -1835,7 +1837,7 @@ -(void)animationDidFinish:(CPTAnimationOperation *)operation /// @cond --(id)debugQuickLookObject +-(nullable id)debugQuickLookObject { // Plot space NSString *plotAreaDesc = [super debugQuickLookObject]; diff --git a/framework/Source/CPTXYPlotSpaceTests.h b/framework/Source/CPTXYPlotSpaceTests.h index 7bef754be..56c6e53aa 100644 --- a/framework/Source/CPTXYPlotSpaceTests.h +++ b/framework/Source/CPTXYPlotSpaceTests.h @@ -4,6 +4,6 @@ @interface CPTXYPlotSpaceTests : CPTTestCase -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *graph; @end diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 2d8656831..af2da6092 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -7,7 +7,7 @@ @interface CPTXYPlotSpace(testingAdditions) --(CPTPlotRange *)constrainRange:(CPTPlotRange *)existingRange toGlobalRange:(CPTPlotRange *)globalRange; +-(nonnull CPTPlotRange *)constrainRange:(nonnull CPTPlotRange *)existingRange toGlobalRange:(nullable CPTPlotRange *)globalRange; @end @@ -526,7 +526,6 @@ -(void)testConstrainNilRanges CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; XCTAssertEqualObjects([plotSpace constrainRange:plotSpace.xRange toGlobalRange:nil], plotSpace.xRange, @"Constrain to nil global range should return original range."); - XCTAssertNil([plotSpace constrainRange:nil toGlobalRange:plotSpace.xRange], @"Constrain nil range should return nil."); } -(void)testConstrainRanges1 diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index b225174f1..500b2f0f8 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -16,7 +16,7 @@ @implementation NSCoder(CPTExtensions) * @param number The number to encode. * @param key The key to associate with the number. **/ --(void)encodeCGFloat:(CGFloat)number forKey:(NSString *)key +-(void)encodeCGFloat:(CGFloat)number forKey:(nonnull NSString *)key { #if CGFLOAT_IS_DOUBLE [self encodeDouble:number forKey:key]; @@ -29,7 +29,7 @@ -(void)encodeCGFloat:(CGFloat)number forKey:(NSString *)key * @param point The point to encode. * @param key The key to associate with the point. **/ --(void)encodeCPTPoint:(CGPoint)point forKey:(NSString *)key +-(void)encodeCPTPoint:(CGPoint)point forKey:(nonnull NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.x", key]; @@ -43,7 +43,7 @@ -(void)encodeCPTPoint:(CGPoint)point forKey:(NSString *)key * @param size The size to encode. * @param key The key to associate with the size. **/ --(void)encodeCPTSize:(CGSize)size forKey:(NSString *)key +-(void)encodeCPTSize:(CGSize)size forKey:(nonnull NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.width", key]; @@ -57,7 +57,7 @@ -(void)encodeCPTSize:(CGSize)size forKey:(NSString *)key * @param rect The rectangle to encode. * @param key The key to associate with the rectangle. **/ --(void)encodeCPTRect:(CGRect)rect forKey:(NSString *)key +-(void)encodeCPTRect:(CGRect)rect forKey:(nonnull NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.origin", key]; @@ -72,7 +72,7 @@ -(void)encodeCPTRect:(CGRect)rect forKey:(NSString *)key * @param key The key to associate with the color space. * @note The current implementation only works with named color spaces. **/ --(void)encodeCGColorSpace:(CGColorSpaceRef)colorSpace forKey:(NSString *)key +-(void)encodeCGColorSpace:(nullable CGColorSpaceRef)colorSpace forKey:(nonnull NSString *)key { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE NSLog(@"Color space encoding is not supported on iOS. Decoding will return a generic RGB color space."); @@ -87,7 +87,7 @@ -(void)encodeCGColorSpace:(CGColorSpaceRef)colorSpace forKey:(NSString *)key /// @cond -void CPTPathApplierFunc(void *info, const CGPathElement *element) +void CPTPathApplierFunc(void *__nullable info, const CGPathElement *__nonnull element) { NSMutableDictionary *elementData = [[NSMutableDictionary alloc] init]; @@ -122,7 +122,7 @@ void CPTPathApplierFunc(void *info, const CGPathElement *element) * @param path The @ref CGPathRef to encode. * @param key The key to associate with the path. **/ --(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key +-(void)encodeCGPath:(nullable CGPathRef)path forKey:(nonnull NSString *)key { NSMutableArray *> *pathData = [[NSMutableArray alloc] init]; @@ -175,7 +175,7 @@ -(void)encodeCGPath:(CGPathRef)path forKey:(NSString *)key * @param image The @ref CGImageRef to encode. * @param key The key to associate with the image. **/ --(void)encodeCGImage:(CGImageRef)image forKey:(NSString *)key +-(void)encodeCGImage:(nullable CGImageRef)image forKey:(nonnull NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.width", key]; @@ -235,7 +235,7 @@ -(void)encodeCGImage:(CGImageRef)image forKey:(NSString *)key * @param number The number to encode. * @param key The key to associate with the number. **/ --(void)encodeDecimal:(NSDecimal)number forKey:(NSString *)key +-(void)encodeDecimal:(NSDecimal)number forKey:(nonnull NSString *)key { [self encodeObject:[NSDecimalNumber decimalNumberWithDecimal:number] forKey:key]; } @@ -249,7 +249,7 @@ -(void)encodeDecimal:(NSDecimal)number forKey:(NSString *)key * @param key The key associated with the number. * @return The number as a @ref CGFloat. **/ --(CGFloat)decodeCGFloatForKey:(NSString *)key +-(CGFloat)decodeCGFloatForKey:(nonnull NSString *)key { #if CGFLOAT_IS_DOUBLE return [self decodeDoubleForKey:key]; @@ -265,7 +265,7 @@ -(CGFloat)decodeCGFloatForKey:(NSString *)key * @param key The key associated with the point. * @return The point. **/ --(CGPoint)decodeCPTPointForKey:(NSString *)key +-(CGPoint)decodeCPTPointForKey:(nonnull NSString *)key { CGPoint point; @@ -285,7 +285,7 @@ -(CGPoint)decodeCPTPointForKey:(NSString *)key * @param key The key associated with the size. * @return The size. **/ --(CGSize)decodeCPTSizeForKey:(NSString *)key +-(CGSize)decodeCPTSizeForKey:(nonnull NSString *)key { CGSize size; @@ -305,7 +305,7 @@ -(CGSize)decodeCPTSizeForKey:(NSString *)key * @param key The key associated with the rectangle. * @return The rectangle. **/ --(CGRect)decodeCPTRectForKey:(NSString *)key +-(CGRect)decodeCPTRectForKey:(nonnull NSString *)key { CGRect rect; @@ -326,7 +326,7 @@ -(CGRect)decodeCPTRectForKey:(NSString *)key * @return The new path. * @note The current implementation only works with named color spaces. **/ --(CGColorSpaceRef)newCGColorSpaceDecodeForKey:(NSString *)key +-(nullable CGColorSpaceRef)newCGColorSpaceDecodeForKey:(nonnull NSString *)key { CGColorSpaceRef colorSpace = NULL; @@ -353,7 +353,7 @@ -(CGColorSpaceRef)newCGColorSpaceDecodeForKey:(NSString *)key * @param key The key associated with the path. * @return The new path. **/ --(CGPathRef)newCGPathDecodeForKey:(NSString *)key +-(nullable CGPathRef)newCGPathDecodeForKey:(nonnull NSString *)key { CGMutablePathRef newPath = CGPathCreateMutable(); @@ -421,7 +421,7 @@ -(CGPathRef)newCGPathDecodeForKey:(NSString *)key * @param key The key associated with the image. * @return The new image. **/ --(CGImageRef)newCGImageDecodeForKey:(NSString *)key +-(nullable CGImageRef)newCGImageDecodeForKey:(nonnull NSString *)key { NSString *newKey = [[NSString alloc] initWithFormat:@"%@.width", key]; size_t width = (size_t)[self decodeInt64ForKey:newKey]; @@ -497,7 +497,7 @@ -(CGImageRef)newCGImageDecodeForKey:(NSString *)key * @param key The key associated with the number. * @return The number as an @ref NSDecimal. **/ --(NSDecimal)decodeDecimalForKey:(NSString *)key +-(NSDecimal)decodeDecimalForKey:(nonnull NSString *)key { NSDecimal result; diff --git a/framework/Source/NSDecimalNumberExtensions.h b/framework/Source/NSDecimalNumberExtensions.h index d0e48e815..1d41a0eb5 100644 --- a/framework/Source/NSDecimalNumberExtensions.h +++ b/framework/Source/NSDecimalNumberExtensions.h @@ -3,4 +3,6 @@ **/ @interface NSDecimalNumber(CPTExtensions) +-(nonnull NSDecimalNumber *)decimalNumber; + @end diff --git a/framework/Source/NSDecimalNumberExtensions.m b/framework/Source/NSDecimalNumberExtensions.m index e096ef023..b27563037 100644 --- a/framework/Source/NSDecimalNumberExtensions.m +++ b/framework/Source/NSDecimalNumberExtensions.m @@ -5,7 +5,7 @@ @implementation NSDecimalNumber(CPTExtensions) /** @brief Returns the value of the receiver as an NSDecimalNumber. * @return The value of the receiver as an NSDecimalNumber. **/ --(NSDecimalNumber *)decimalNumber +-(nonnull NSDecimalNumber *)decimalNumber { return [self copy]; } diff --git a/framework/Source/NSNumberExtensions.m b/framework/Source/NSNumberExtensions.m index 3f795af9a..84103dcca 100644 --- a/framework/Source/NSNumberExtensions.m +++ b/framework/Source/NSNumberExtensions.m @@ -6,7 +6,7 @@ @implementation NSNumber(CPTExtensions) * @param number The value for the new number. * @return An NSNumber object containing value, treating it as a @ref CGFloat. **/ -+(instancetype)numberWithCGFloat:(CGFloat)number ++(nonnull instancetype)numberWithCGFloat:(CGFloat)number { return @(number); } @@ -28,7 +28,7 @@ -(CGFloat)cgFloatValue * @param number The value for the new number. * @return An NSNumber object containing value, treating it as a @ref CGFloat. **/ --(instancetype)initWithCGFloat:(CGFloat)number +-(nonnull instancetype)initWithCGFloat:(CGFloat)number { #if CGFLOAT_IS_DOUBLE return [self initWithDouble:number]; @@ -41,7 +41,7 @@ -(instancetype)initWithCGFloat:(CGFloat)number /** @brief Returns the value of the receiver as an NSDecimalNumber. * @return The value of the receiver as an NSDecimalNumber. **/ --(NSDecimalNumber *)decimalNumber +-(nonnull NSDecimalNumber *)decimalNumber { if ( [self isMemberOfClass:[NSDecimalNumber class]] ) { return (NSDecimalNumber *)self; diff --git a/framework/Source/_CPTAnimationCGFloatPeriod.m b/framework/Source/_CPTAnimationCGFloatPeriod.m index 9f31b267e..8ada09dda 100644 --- a/framework/Source/_CPTAnimationCGFloatPeriod.m +++ b/framework/Source/_CPTAnimationCGFloatPeriod.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTAnimationCGFloatPeriod() -CGFloat CPTCurrentFloatValue(id boundObject, SEL boundGetter); +CGFloat CPTCurrentFloatValue(id __nonnull boundObject, SEL __nonnull boundGetter); @end /// @endcond @@ -14,7 +14,7 @@ @interface _CPTAnimationCGFloatPeriod() @implementation _CPTAnimationCGFloatPeriod -CGFloat CPTCurrentFloatValue(id boundObject, SEL boundGetter) +CGFloat CPTCurrentFloatValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; @@ -29,12 +29,12 @@ CGFloat CPTCurrentFloatValue(id boundObject, SEL boundGetter) return value; } --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { self.startValue = @( CPTCurrentFloatValue(boundObject, boundGetter) ); } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGFloat current = CPTCurrentFloatValue(boundObject, boundGetter); CGFloat start; @@ -50,7 +50,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett return ( (current >= start) && (current <= end) ) || ( (current >= end) && (current <= start) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { CGFloat start; CGFloat end; diff --git a/framework/Source/_CPTAnimationCGPointPeriod.m b/framework/Source/_CPTAnimationCGPointPeriod.m index b6acc22d1..f82feaf21 100644 --- a/framework/Source/_CPTAnimationCGPointPeriod.m +++ b/framework/Source/_CPTAnimationCGPointPeriod.m @@ -3,7 +3,7 @@ /// @cond @interface _CPTAnimationCGPointPeriod() -CGPoint CPTCurrentPointValue(id boundObject, SEL boundGetter); +CGPoint CPTCurrentPointValue(id __nonnull boundObject, SEL __nonnull boundGetter); @end /// @endcond @@ -12,7 +12,7 @@ @interface _CPTAnimationCGPointPeriod() @implementation _CPTAnimationCGPointPeriod -CGPoint CPTCurrentPointValue(id boundObject, SEL boundGetter) +CGPoint CPTCurrentPointValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; @@ -27,14 +27,14 @@ CGPoint CPTCurrentPointValue(id boundObject, SEL boundGetter) return value; } --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGPoint start = CPTCurrentPointValue(boundObject, boundGetter); self.startValue = [NSValue valueWithBytes:&start objCType:@encode(CGPoint)]; } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGPoint current = CPTCurrentPointValue(boundObject, boundGetter); CGPoint start; @@ -51,7 +51,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett ( ( (current.y >= start.y) && (current.y <= end.y) ) || ( (current.y >= end.y) && (current.y <= start.y) ) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { CGPoint start; CGPoint end; diff --git a/framework/Source/_CPTAnimationCGRectPeriod.m b/framework/Source/_CPTAnimationCGRectPeriod.m index 06a861db2..77af5a832 100644 --- a/framework/Source/_CPTAnimationCGRectPeriod.m +++ b/framework/Source/_CPTAnimationCGRectPeriod.m @@ -3,7 +3,7 @@ /// @cond @interface _CPTAnimationCGRectPeriod() -CGRect CPTCurrentRectValue(id boundObject, SEL boundGetter); +CGRect CPTCurrentRectValue(id __nonnull boundObject, SEL __nonnull boundGetter); @end /// @endcond @@ -12,7 +12,7 @@ @interface _CPTAnimationCGRectPeriod() @implementation _CPTAnimationCGRectPeriod -CGRect CPTCurrentRectValue(id boundObject, SEL boundGetter) +CGRect CPTCurrentRectValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; @@ -27,14 +27,14 @@ CGRect CPTCurrentRectValue(id boundObject, SEL boundGetter) return value; } --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGRect start = CPTCurrentRectValue(boundObject, boundGetter); self.startValue = [NSValue valueWithBytes:&start objCType:@encode(CGRect)]; } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGRect current = CPTCurrentRectValue(boundObject, boundGetter); CGRect start; @@ -53,7 +53,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett ( ( (current.size.height >= start.size.height) && (current.size.height <= end.size.height) ) || ( (current.size.height >= end.size.height) && (current.size.height <= start.size.height) ) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { CGRect start; CGRect end; diff --git a/framework/Source/_CPTAnimationCGSizePeriod.m b/framework/Source/_CPTAnimationCGSizePeriod.m index 02784bbca..f2b8c0d59 100644 --- a/framework/Source/_CPTAnimationCGSizePeriod.m +++ b/framework/Source/_CPTAnimationCGSizePeriod.m @@ -3,7 +3,7 @@ /// @cond @interface _CPTAnimationCGSizePeriod() -CGSize CPTCurrentSizeValue(id boundObject, SEL boundGetter); +CGSize CPTCurrentSizeValue(id __nonnull boundObject, SEL __nonnull boundGetter); @end /// @endcond @@ -12,7 +12,7 @@ @interface _CPTAnimationCGSizePeriod() @implementation _CPTAnimationCGSizePeriod -CGSize CPTCurrentSizeValue(id boundObject, SEL boundGetter) +CGSize CPTCurrentSizeValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; @@ -27,14 +27,14 @@ CGSize CPTCurrentSizeValue(id boundObject, SEL boundGetter) return value; } --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGSize start = CPTCurrentSizeValue(boundObject, boundGetter); self.startValue = [NSValue valueWithBytes:&start objCType:@encode(CGSize)]; } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { CGSize current = CPTCurrentSizeValue(boundObject, boundGetter); CGSize start; @@ -51,7 +51,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett ( ( (current.height >= start.height) && (current.height <= end.height) ) || ( (current.height >= end.height) && (current.height <= start.height) ) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { CGSize start; CGSize end; diff --git a/framework/Source/_CPTAnimationNSDecimalPeriod.m b/framework/Source/_CPTAnimationNSDecimalPeriod.m index 6dc397ac8..e2291dff2 100644 --- a/framework/Source/_CPTAnimationNSDecimalPeriod.m +++ b/framework/Source/_CPTAnimationNSDecimalPeriod.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTAnimationNSDecimalPeriod() -NSDecimal CPTCurrentDecimalValue(id boundObject, SEL boundGetter); +NSDecimal CPTCurrentDecimalValue(id __nonnull boundObject, SEL __nonnull boundGetter); @end /// @endcond @@ -14,7 +14,7 @@ @interface _CPTAnimationNSDecimalPeriod() @implementation _CPTAnimationNSDecimalPeriod -NSDecimal CPTCurrentDecimalValue(id boundObject, SEL boundGetter) +NSDecimal CPTCurrentDecimalValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; @@ -29,14 +29,14 @@ NSDecimal CPTCurrentDecimalValue(id boundObject, SEL boundGetter) return value; } --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { NSDecimal start = CPTCurrentDecimalValue(boundObject, boundGetter); self.startValue = [NSDecimalNumber decimalNumberWithDecimal:start]; } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { if ( !self.startValue ) { [self setStartValueFromObject:boundObject propertyGetter:boundGetter]; @@ -50,7 +50,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett ( CPTDecimalGreaterThanOrEqualTo(current, end) && CPTDecimalLessThanOrEqualTo(current, start) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { NSDecimal start = [(NSDecimalNumber *) self.startValue decimalValue]; NSDecimal end = [(NSDecimalNumber *) self.endValue decimalValue]; diff --git a/framework/Source/_CPTAnimationPlotRangePeriod.m b/framework/Source/_CPTAnimationPlotRangePeriod.m index 569696a3d..fdcabbb21 100644 --- a/framework/Source/_CPTAnimationPlotRangePeriod.m +++ b/framework/Source/_CPTAnimationPlotRangePeriod.m @@ -5,7 +5,7 @@ @implementation _CPTAnimationPlotRangePeriod --(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { typedef NSValue *(*GetterType)(id, SEL); GetterType getterMethod = (GetterType)[boundObject methodForSelector:boundGetter]; @@ -13,7 +13,7 @@ -(void)setStartValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter self.startValue = getterMethod(boundObject, boundGetter); } --(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter { if ( !self.startValue ) { [self setStartValueFromObject:boundObject propertyGetter:boundGetter]; @@ -34,7 +34,7 @@ -(BOOL)canStartWithValueFromObject:(id)boundObject propertyGetter:(SEL)boundGett ( CPTDecimalGreaterThanOrEqualTo(currentLoc, endLoc) && CPTDecimalLessThanOrEqualTo(currentLoc, startLoc) ); } --(NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { CPTPlotRange *start = (CPTPlotRange *)self.startValue; CPTPlotRange *end = (CPTPlotRange *)self.endValue; diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 30f9c1966..3e03057c2 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -10,7 +10,7 @@ **/ @implementation CPTBorderLayer -/** @property CPTBorderedLayer *maskedLayer +/** @property nullable CPTBorderedLayer *maskedLayer * @brief The CPTBorderedLayer masked being masked. * Its fill and border are drawn into this layer so that they are outside the mask applied to the @par{maskedLayer}. **/ @@ -31,7 +31,7 @@ @implementation CPTBorderLayer * @param newFrame The frame rectangle. * @return The initialized CPTBorderLayer object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { maskedLayer = nil; @@ -45,7 +45,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(instancetype)initWithLayer:(id)layer +-(nonnull instancetype)initWithLayer:(nonnull id)layer { if ( (self = [super initWithLayer:layer]) ) { CPTBorderLayer *theLayer = (CPTBorderLayer *)layer; @@ -62,14 +62,14 @@ -(instancetype)initWithLayer:(id)layer /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:self.maskedLayer forKey:@"CPTBorderLayer.maskedLayer"]; } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { maskedLayer = [coder decodeObjectForKey:@"CPTBorderLayer.maskedLayer"]; @@ -84,7 +84,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { if ( self.hidden ) { return; @@ -130,7 +130,7 @@ -(void)layoutSublayers } } --(CPTSublayerSet)sublayersExcludedFromAutomaticLayout +-(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout { CPTBorderedLayer *excludedLayer = self.maskedLayer; @@ -154,7 +154,7 @@ -(CPTSublayerSet)sublayersExcludedFromAutomaticLayout /// @cond --(void)setMaskedLayer:(CPTBorderedLayer *)newLayer +-(void)setMaskedLayer:(nullable CPTBorderedLayer *)newLayer { if ( newLayer != maskedLayer ) { maskedLayer = newLayer; diff --git a/framework/Source/_CPTConstraintsFixed.h b/framework/Source/_CPTConstraintsFixed.h index a926cd2e5..6bf4b66c5 100644 --- a/framework/Source/_CPTConstraintsFixed.h +++ b/framework/Source/_CPTConstraintsFixed.h @@ -6,7 +6,7 @@ /// @{ -(nonnull instancetype)initWithLowerOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithUpperOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Comparison diff --git a/framework/Source/_CPTConstraintsFixed.m b/framework/Source/_CPTConstraintsFixed.m index 5b30de626..e6ffb0467 100644 --- a/framework/Source/_CPTConstraintsFixed.m +++ b/framework/Source/_CPTConstraintsFixed.m @@ -30,7 +30,7 @@ @implementation _CPTConstraintsFixed * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithLowerOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithLowerOffset:(CGFloat)newOffset { if ( (self = [super init]) ) { offset = newOffset; @@ -44,7 +44,7 @@ -(instancetype)initWithLowerOffset:(CGFloat)newOffset * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithUpperOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithUpperOffset:(CGFloat)newOffset { if ( (self = [super init]) ) { offset = newOffset; @@ -57,7 +57,7 @@ -(instancetype)initWithUpperOffset:(CGFloat)newOffset #pragma mark - #pragma mark Comparison --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint { if ( [self class] != [otherConstraint class] ) { return NO; @@ -95,7 +95,7 @@ -(CGFloat)positionForLowerBound:(CGFloat)lowerBound upperBound:(CGFloat)upperBou /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { _CPTConstraintsFixed *copy = [[[self class] allocWithZone:zone] init]; @@ -112,12 +112,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTConstraints class]; } --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCGFloat:self.offset forKey:@"_CPTConstraintsFixed.offset"]; [coder encodeBool:self.isFixedToLower forKey:@"_CPTConstraintsFixed.isFixedToLower"]; @@ -129,7 +129,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { offset = [coder decodeCGFloatForKey:@"_CPTConstraintsFixed.offset"]; diff --git a/framework/Source/_CPTConstraintsRelative.h b/framework/Source/_CPTConstraintsRelative.h index 9980999ca..bad6150cb 100644 --- a/framework/Source/_CPTConstraintsRelative.h +++ b/framework/Source/_CPTConstraintsRelative.h @@ -5,7 +5,7 @@ /// @name Initialization /// @{ -(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder NS_DESIGNATED_INITIALIZER; /// @} /// @name Comparison diff --git a/framework/Source/_CPTConstraintsRelative.m b/framework/Source/_CPTConstraintsRelative.m index 93019c3bc..40a93b59b 100644 --- a/framework/Source/_CPTConstraintsRelative.m +++ b/framework/Source/_CPTConstraintsRelative.m @@ -33,7 +33,7 @@ @implementation _CPTConstraintsRelative * @param newOffset The offset. * @return The initialized CPTConstraints object. **/ --(instancetype)initWithRelativeOffset:(CGFloat)newOffset +-(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset { if ( (self = [super init]) ) { offset = newOffset; @@ -45,7 +45,7 @@ -(instancetype)initWithRelativeOffset:(CGFloat)newOffset #pragma mark - #pragma mark Comparison --(BOOL)isEqualToConstraint:(CPTConstraints *)otherConstraint +-(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint { if ( [self class] != [otherConstraint class] ) { return NO; @@ -75,7 +75,7 @@ -(CGFloat)positionForLowerBound:(CGFloat)lowerBound upperBound:(CGFloat)upperBou /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { _CPTConstraintsRelative *copy = [[[self class] allocWithZone:zone] init]; @@ -91,12 +91,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTConstraints class]; } --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeCGFloat:self.offset forKey:@"_CPTConstraintsRelative.offset"]; } @@ -107,7 +107,7 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { offset = [coder decodeCGFloatForKey:@"_CPTConstraintsRelative.offset"]; diff --git a/framework/Source/_CPTDarkGradientTheme.m b/framework/Source/_CPTDarkGradientTheme.m index 112185fcd..34c2f40c6 100644 --- a/framework/Source/_CPTDarkGradientTheme.m +++ b/framework/Source/_CPTDarkGradientTheme.m @@ -17,7 +17,7 @@ /// @cond @interface _CPTDarkGradientTheme() --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle; +-(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle; @end @@ -35,14 +35,14 @@ +(void)load [self registerTheme:self]; } -+(NSString *)name ++(nonnull NSString *)name { return kCPTDarkGradientTheme; } #pragma mark - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle +-(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle { axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; axis.majorIntervalLength = @0.5; @@ -59,7 +59,7 @@ -(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)ma axis.titleTextStyle = textStyle; } --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { CPTColor *endColor = [CPTColor colorWithGenericGray:CPTFloat(0.1)]; CPTGradient *graphGradient = [CPTGradient gradientWithBeginningColor:endColor endingColor:endColor]; @@ -71,7 +71,7 @@ -(void)applyThemeToBackground:(CPTGraph *)graph graph.fill = [CPTFill fillWithGradient:graphGradient]; } --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { CPTGradient *gradient = [CPTGradient gradientWithBeginningColor:[CPTColor colorWithGenericGray:CPTFloat(0.1)] endingColor:[CPTColor colorWithGenericGray:CPTFloat(0.3)]]; @@ -86,7 +86,7 @@ -(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame plotAreaFrame.cornerRadius = CPTFloat(10.0); } --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; @@ -115,7 +115,7 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/Source/_CPTFillColor.h b/framework/Source/_CPTFillColor.h index 00f7a66f5..768ade7ef 100644 --- a/framework/Source/_CPTFillColor.h +++ b/framework/Source/_CPTFillColor.h @@ -4,8 +4,8 @@ /// @name Initialization /// @{ --(nonnull instancetype)initWithColor:(nullable CPTColor *)aColor NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithColor:(nonnull CPTColor *)aColor NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing diff --git a/framework/Source/_CPTFillColor.m b/framework/Source/_CPTFillColor.m index aa63358e5..8acec91b7 100644 --- a/framework/Source/_CPTFillColor.m +++ b/framework/Source/_CPTFillColor.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillColor() -@property (nonatomic, readwrite, copy, nullable) CPTColor *fillColor; +@property (nonatomic, readwrite, copy, nonnull) CPTColor *fillColor; @end @@ -18,7 +18,7 @@ @interface _CPTFillColor() @implementation _CPTFillColor -/** @property fillColor +/** @property nonnull CPTColor *fillColor * @brief The fill color. **/ @synthesize fillColor; @@ -30,7 +30,7 @@ @implementation _CPTFillColor * @param aColor The color. * @return The initialized _CPTFillColor object. **/ --(instancetype)initWithColor:(CPTColor *)aColor +-(nonnull instancetype)initWithColor:(nonnull CPTColor *)aColor { if ( (self = [super init]) ) { fillColor = aColor; @@ -45,7 +45,7 @@ -(instancetype)initWithColor:(CPTColor *)aColor * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context { CGContextSaveGState(context); CGContextSetFillColorWithColor(context, self.fillColor.cgColor); @@ -56,7 +56,7 @@ -(void)fillRect:(CGRect)rect inContext:(CGContextRef)context /** @brief Draws the color into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef)context { CGContextSaveGState(context); CGContextSetFillColorWithColor(context, self.fillColor.cgColor); @@ -85,7 +85,7 @@ -(CGColorRef)cgColor /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { _CPTFillColor *copy = [[[self class] allocWithZone:zone] init]; @@ -101,12 +101,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTFill class]; } --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.fillColor forKey:@"_CPTFillColor.fillColor"]; } @@ -117,10 +117,17 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { - fillColor = [coder decodeObjectForKey:@"_CPTFillColor.fillColor"]; + CPTColor *color = [coder decodeObjectForKey:@"_CPTFillColor.fillColor"]; + + if ( color ) { + fillColor = color; + } + else { + self = nil; + } } return self; } diff --git a/framework/Source/_CPTFillGradient.h b/framework/Source/_CPTFillGradient.h index a7bb7e610..6e9e1279e 100644 --- a/framework/Source/_CPTFillGradient.h +++ b/framework/Source/_CPTFillGradient.h @@ -6,8 +6,8 @@ /// @name Initialization /// @{ --(nonnull instancetype)initWithGradient:(nullable CPTGradient *)aGradient NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithGradient:(nonnull CPTGradient *)aGradient NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing diff --git a/framework/Source/_CPTFillGradient.m b/framework/Source/_CPTFillGradient.m index 98b44040b..122dac2f8 100644 --- a/framework/Source/_CPTFillGradient.m +++ b/framework/Source/_CPTFillGradient.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillGradient() -@property (nonatomic, readwrite, copy, nullable) CPTGradient *fillGradient; +@property (nonatomic, readwrite, copy, nonnull) CPTGradient *fillGradient; @end @@ -18,7 +18,7 @@ @interface _CPTFillGradient() @implementation _CPTFillGradient -/** @property fillGradient +/** @property nonnull CPTGradient *fillGradient * @brief The fill gradient. **/ @synthesize fillGradient; @@ -30,7 +30,7 @@ @implementation _CPTFillGradient * @param aGradient The gradient. * @return The initialized _CPTFillGradient object. **/ --(instancetype)initWithGradient:(CPTGradient *)aGradient +-(nonnull instancetype)initWithGradient:(nonnull CPTGradient *)aGradient { if ( (self = [super init]) ) { fillGradient = aGradient; @@ -45,7 +45,7 @@ -(instancetype)initWithGradient:(CPTGradient *)aGradient * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [self.fillGradient fillRect:rect inContext:context]; } @@ -53,7 +53,7 @@ -(void)fillRect:(CGRect)rect inContext:(CGContextRef)context /** @brief Draws the gradient into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef)context { [self.fillGradient fillPathInContext:context]; } @@ -71,7 +71,7 @@ -(BOOL)isOpaque /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { _CPTFillGradient *copy = [[[self class] allocWithZone:zone] init]; @@ -87,12 +87,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTFill class]; } --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.fillGradient forKey:@"_CPTFillGradient.fillGradient"]; } @@ -103,10 +103,17 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { - fillGradient = [coder decodeObjectForKey:@"_CPTFillGradient.fillGradient"]; + CPTGradient *gradient = [coder decodeObjectForKey:@"_CPTFillGradient.fillGradient"]; + + if ( gradient ) { + fillGradient = gradient; + } + else { + self = nil; + } } return self; } diff --git a/framework/Source/_CPTFillImage.h b/framework/Source/_CPTFillImage.h index 9efe99470..b370ce012 100644 --- a/framework/Source/_CPTFillImage.h +++ b/framework/Source/_CPTFillImage.h @@ -6,8 +6,8 @@ /// @name Initialization /// @{ --(nonnull instancetype)initWithImage:(nullable CPTImage *)anImage NS_DESIGNATED_INITIALIZER; --(nonnull instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithImage:(nonnull CPTImage *)anImage NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; /// @} /// @name Drawing diff --git a/framework/Source/_CPTFillImage.m b/framework/Source/_CPTFillImage.m index 16a6ade4e..4ccda0aab 100644 --- a/framework/Source/_CPTFillImage.m +++ b/framework/Source/_CPTFillImage.m @@ -5,7 +5,7 @@ /// @cond @interface _CPTFillImage() -@property (nonatomic, readwrite, copy, nullable) CPTImage *fillImage; +@property (nonatomic, readwrite, copy, nonnull) CPTImage *fillImage; @end @@ -18,7 +18,7 @@ @interface _CPTFillImage() @implementation _CPTFillImage -/** @property fillImage +/** @property nonnull CPTImage *fillImage * @brief The fill image. **/ @synthesize fillImage; @@ -30,7 +30,7 @@ @implementation _CPTFillImage * @param anImage The image. * @return The initialized _CPTFillImage object. **/ --(instancetype)initWithImage:(CPTImage *)anImage +-(nonnull instancetype)initWithImage:(nonnull CPTImage *)anImage { if ( (self = [super init]) ) { fillImage = anImage; @@ -45,7 +45,7 @@ -(instancetype)initWithImage:(CPTImage *)anImage * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(CGContextRef)context +-(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context { [self.fillImage drawInRect:rect inContext:context]; } @@ -53,7 +53,7 @@ -(void)fillRect:(CGRect)rect inContext:(CGContextRef)context /** @brief Draws the image into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef)context { CGContextSaveGState(context); @@ -77,7 +77,7 @@ -(BOOL)isOpaque /// @cond --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { _CPTFillImage *copy = [[[self class] allocWithZone:zone] init]; @@ -93,12 +93,12 @@ -(id)copyWithZone:(NSZone *)zone /// @cond --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTFill class]; } --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [coder encodeObject:self.fillImage forKey:@"_CPTFillImage.fillImage"]; } @@ -109,10 +109,17 @@ -(void)encodeWithCoder:(NSCoder *)coder * @param coder An unarchiver object. * @return An object initialized from data in a given unarchiver. */ --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super init]) ) { - fillImage = [coder decodeObjectForKey:@"_CPTFillImage.fillImage"]; + CPTImage *image = [coder decodeObjectForKey:@"_CPTFillImage.fillImage"]; + + if ( image ) { + fillImage = image; + } + else { + self = nil; + } } return self; } diff --git a/framework/Source/_CPTMaskLayer.m b/framework/Source/_CPTMaskLayer.m index c5cd55634..d4cceba9f 100644 --- a/framework/Source/_CPTMaskLayer.m +++ b/framework/Source/_CPTMaskLayer.m @@ -16,7 +16,7 @@ @implementation CPTMaskLayer * @param newFrame The frame rectangle. * @return The initialized CPTMaskLayer object. **/ --(instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect)newFrame { if ( (self = [super initWithFrame:newFrame]) ) { self.needsDisplayOnBoundsChange = YES; @@ -29,7 +29,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame /// @cond --(void)renderAsVectorInContext:(CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef)context { [super renderAsVectorInContext:context]; diff --git a/framework/Source/_CPTPlainBlackTheme.m b/framework/Source/_CPTPlainBlackTheme.m index 6bc25f94a..ad52aa0b8 100644 --- a/framework/Source/_CPTPlainBlackTheme.m +++ b/framework/Source/_CPTPlainBlackTheme.m @@ -23,19 +23,19 @@ +(void)load [self registerTheme:self]; } -+(NSString *)name ++(nonnull NSString *)name { return kCPTPlainBlackTheme; } #pragma mark - --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { graph.fill = [CPTFill fillWithColor:[CPTColor blackColor]]; } --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { plotAreaFrame.fill = [CPTFill fillWithColor:[CPTColor blackColor]]; @@ -47,7 +47,7 @@ -(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame plotAreaFrame.cornerRadius = CPTFloat(0.0); } --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; @@ -101,7 +101,7 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/Source/_CPTPlainWhiteTheme.m b/framework/Source/_CPTPlainWhiteTheme.m index fbdbf673b..485475e47 100644 --- a/framework/Source/_CPTPlainWhiteTheme.m +++ b/framework/Source/_CPTPlainWhiteTheme.m @@ -23,19 +23,19 @@ +(void)load [self registerTheme:self]; } -+(NSString *)name ++(nonnull NSString *)name { return kCPTPlainWhiteTheme; } #pragma mark - --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { graph.fill = [CPTFill fillWithColor:[CPTColor whiteColor]]; } --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { plotAreaFrame.fill = [CPTFill fillWithColor:[CPTColor whiteColor]]; @@ -47,7 +47,7 @@ -(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame plotAreaFrame.cornerRadius = CPTFloat(0.0); } --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; @@ -103,7 +103,7 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/Source/_CPTSlateTheme.m b/framework/Source/_CPTSlateTheme.m index 67e7afc6d..35cff032b 100644 --- a/framework/Source/_CPTSlateTheme.m +++ b/framework/Source/_CPTSlateTheme.m @@ -17,7 +17,7 @@ /// @cond @interface _CPTSlateTheme() --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle; +-(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle; @end @@ -35,14 +35,14 @@ +(void)load [self registerTheme:self]; } -+(NSString *)name ++(nonnull NSString *)name { return kCPTSlateTheme; } #pragma mark - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)majorLineStyle minorLineStyle:(CPTLineStyle *)minorLineStyle textStyle:(CPTMutableTextStyle *)textStyle minorTickTextStyle:(CPTMutableTextStyle *)minorTickTextStyle +-(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle { axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; axis.majorIntervalLength = @0.5; @@ -59,7 +59,7 @@ -(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(CPTLineStyle *)ma axis.titleTextStyle = textStyle; } --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { CPTGradient *gradient = [CPTGradient gradientWithBeginningColor:[CPTColor colorWithComponentRed:CPTFloat(0.43) green:CPTFloat(0.51) blue:CPTFloat(0.63) alpha:CPTFloat(1.0)] endingColor:[CPTColor colorWithComponentRed:CPTFloat(0.70) green:CPTFloat(0.73) blue:CPTFloat(0.80) alpha:CPTFloat(1.0)]]; @@ -69,7 +69,7 @@ -(void)applyThemeToBackground:(CPTGraph *)graph graph.fill = [CPTFill fillWithGradient:gradient]; } --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { CPTGradient *gradient = [CPTGradient gradientWithBeginningColor:[CPTColor colorWithComponentRed:CPTFloat(0.43) green:CPTFloat(0.51) blue:CPTFloat(0.63) alpha:CPTFloat(1.0)] endingColor:[CPTColor colorWithComponentRed:CPTFloat(0.70) green:CPTFloat(0.73) blue:CPTFloat(0.80) alpha:CPTFloat(1.0)]]; @@ -85,7 +85,7 @@ -(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame plotAreaFrame.cornerRadius = CPTFloat(5.0); } --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; @@ -114,7 +114,7 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/Source/_CPTStocksTheme.m b/framework/Source/_CPTStocksTheme.m index d24ced3a3..83d2dc92d 100644 --- a/framework/Source/_CPTStocksTheme.m +++ b/framework/Source/_CPTStocksTheme.m @@ -24,19 +24,19 @@ +(void)load [self registerTheme:self]; } -+(NSString *)name ++(nonnull NSString *)name { return kCPTStocksTheme; } #pragma mark - --(void)applyThemeToBackground:(CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *)graph { graph.fill = [CPTFill fillWithColor:[CPTColor blackColor]]; } --(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame { CPTGradient *stocksBackgroundGradient = [[CPTGradient alloc] init]; @@ -60,7 +60,7 @@ -(void)applyThemeToPlotArea:(CPTPlotAreaFrame *)plotAreaFrame plotAreaFrame.cornerRadius = CPTFloat(14.0); } --(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; @@ -115,7 +115,7 @@ -(void)applyThemeToAxisSet:(CPTAxisSet *)axisSet #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/Source/_CPTXYTheme.m b/framework/Source/_CPTXYTheme.m index eef244cdb..9bb2675ba 100644 --- a/framework/Source/_CPTXYTheme.m +++ b/framework/Source/_CPTXYTheme.m @@ -13,7 +13,7 @@ @implementation _CPTXYTheme /// @name Initialization /// @{ --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.graphClass = [CPTXYGraph class]; @@ -23,7 +23,7 @@ -(instancetype)init /// @} --(id)newGraph +-(nullable id)newGraph { CPTXYGraph *graph; @@ -50,7 +50,7 @@ -(id)newGraph #pragma mark - #pragma mark NSCoding Methods --(Class)classForCoder +-(nonnull Class)classForCoder { return [CPTTheme class]; } diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index 42d18d311..ab6ac6f71 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -9,10 +9,10 @@ /// @cond @interface CPTGraphHostingView() -@property (nonatomic, readwrite, cpt_weak_property) cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; +@property (nonatomic, readwrite, nullable, cpt_weak_property) cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; --(void)graphNeedsRedraw:(NSNotification *)notification; --(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer; +-(void)graphNeedsRedraw:(nonnull NSNotification *)notification; +-(void)handlePinchGesture:(nonnull UIPinchGestureRecognizer *)aPinchGestureRecognizer; @end @@ -25,7 +25,7 @@ -(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer; **/ @implementation CPTGraphHostingView -/** @property CPTGraph *hostedGraph +/** @property nullable CPTGraph *hostedGraph * @brief The CPTLayer hosted inside this view. **/ @synthesize hostedGraph; @@ -45,7 +45,7 @@ @implementation CPTGraphHostingView /// @cond /** @internal - * @property cpt_weak id pinchGestureRecognizer + * @property nullable cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer * @brief The pinch gesture recognizer for this view. **/ @synthesize pinchGestureRecognizer; @@ -57,7 +57,7 @@ @implementation CPTGraphHostingView /// @cond -+(Class)layerClass ++(nonnull Class)layerClass { return [CALayer class]; } @@ -75,7 +75,7 @@ -(void)commonInit self.layer.sublayerTransform = CATransform3DMakeScale( CPTFloat(1.0), CPTFloat(-1.0), CPTFloat(1.0) ); } --(instancetype)initWithFrame:(CGRect)frame +-(nonnull instancetype)initWithFrame:(CGRect)frame { if ( (self = [super initWithFrame:frame]) ) { [self commonInit]; @@ -95,7 +95,7 @@ -(void)dealloc /// @cond --(void)encodeWithCoder:(NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *)coder { [super encodeWithCoder:coder]; @@ -107,7 +107,7 @@ -(void)encodeWithCoder:(NSCoder *)coder // pinchGestureRecognizer } --(instancetype)initWithCoder:(NSCoder *)coder +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { [self commonInit]; @@ -129,18 +129,19 @@ -(instancetype)initWithCoder:(NSCoder *)coder /// @cond --(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesBegan:(nonnull NSSet *)touches withEvent:(nullable UIEvent *)event { BOOL handled = NO; // Ignore pinch or other multitouch gestures if ( [[event allTouches] count] == 1 ) { CPTGraph *theHostedGraph = self.hostedGraph; + UIEvent *theEvent = event; theHostedGraph.frame = self.bounds; [theHostedGraph layoutIfNeeded]; - CGPoint pointOfTouch = [[[event touchesForView:self] anyObject] locationInView:self]; + CGPoint pointOfTouch = [[[theEvent touchesForView:self] anyObject] locationInView:self]; if ( self.collapsesLayers ) { pointOfTouch.y = self.frame.size.height - pointOfTouch.y; @@ -148,7 +149,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event else { pointOfTouch = [self.layer convertPoint:pointOfTouch toLayer:theHostedGraph]; } - handled = [theHostedGraph pointingDeviceDownEvent:event atPoint:pointOfTouch]; + handled = [theHostedGraph pointingDeviceDownEvent:theEvent atPoint:pointOfTouch]; } if ( !handled ) { @@ -156,53 +157,67 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event } } --(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesMoved:(nonnull NSSet *)touches withEvent:(nullable UIEvent *)event { - CPTGraph *theHostedGraph = self.hostedGraph; + BOOL handled = NO; - theHostedGraph.frame = self.bounds; - [theHostedGraph layoutIfNeeded]; + if ( event ) { + CPTGraph *theHostedGraph = self.hostedGraph; + UIEvent *theEvent = event; - CGPoint pointOfTouch = [[[event touchesForView:self] anyObject] locationInView:self]; + theHostedGraph.frame = self.bounds; + [theHostedGraph layoutIfNeeded]; - if ( self.collapsesLayers ) { - pointOfTouch.y = self.frame.size.height - pointOfTouch.y; - } - else { - pointOfTouch = [self.layer convertPoint:pointOfTouch toLayer:theHostedGraph]; - } - BOOL handled = [theHostedGraph pointingDeviceDraggedEvent:event atPoint:pointOfTouch]; + CGPoint pointOfTouch = [[[theEvent touchesForView:self] anyObject] locationInView:self]; + if ( self.collapsesLayers ) { + pointOfTouch.y = self.frame.size.height - pointOfTouch.y; + } + else { + pointOfTouch = [self.layer convertPoint:pointOfTouch toLayer:theHostedGraph]; + } + handled = [theHostedGraph pointingDeviceDraggedEvent:theEvent atPoint:pointOfTouch]; + } if ( !handled ) { [super touchesMoved:touches withEvent:event]; } } --(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesEnded:(nonnull NSSet *)touches withEvent:(nullable UIEvent *)event { - CPTGraph *theHostedGraph = self.hostedGraph; + BOOL handled = NO; - theHostedGraph.frame = self.bounds; - [theHostedGraph layoutIfNeeded]; + if ( event ) { + CPTGraph *theHostedGraph = self.hostedGraph; + UIEvent *theEvent = event; + + theHostedGraph.frame = self.bounds; + [theHostedGraph layoutIfNeeded]; - CGPoint pointOfTouch = [[[event touchesForView:self] anyObject] locationInView:self]; + CGPoint pointOfTouch = [[[theEvent touchesForView:self] anyObject] locationInView:self]; - if ( self.collapsesLayers ) { - pointOfTouch.y = self.frame.size.height - pointOfTouch.y; - } - else { - pointOfTouch = [self.layer convertPoint:pointOfTouch toLayer:theHostedGraph]; + if ( self.collapsesLayers ) { + pointOfTouch.y = self.frame.size.height - pointOfTouch.y; + } + else { + pointOfTouch = [self.layer convertPoint:pointOfTouch toLayer:theHostedGraph]; + } + handled = [theHostedGraph pointingDeviceUpEvent:theEvent atPoint:pointOfTouch]; } - BOOL handled = [theHostedGraph pointingDeviceUpEvent:event atPoint:pointOfTouch]; if ( !handled ) { [super touchesEnded:touches withEvent:event]; } } --(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +-(void)touchesCancelled:(nullable NSSet *)touches withEvent:(nullable UIEvent *)event { - BOOL handled = [self.hostedGraph pointingDeviceCancelledEvent:event]; + BOOL handled = NO; + + if ( event ) { + UIEvent *theEvent = event; + handled = [self.hostedGraph pointingDeviceCancelledEvent:theEvent]; + } if ( !handled ) { [super touchesCancelled:touches withEvent:event]; @@ -236,7 +251,7 @@ -(void)setAllowPinchScaling:(BOOL)allowScaling } } --(void)handlePinchGesture:(UIPinchGestureRecognizer *)aPinchGestureRecognizer +-(void)handlePinchGesture:(nonnull UIPinchGestureRecognizer *)aPinchGestureRecognizer { CGPoint interactionPoint = [aPinchGestureRecognizer locationInView:self]; CPTGraph *theHostedGraph = self.hostedGraph; @@ -286,7 +301,7 @@ -(void)drawRect:(CGRect)rect } } --(void)graphNeedsRedraw:(NSNotification *)notification +-(void)graphNeedsRedraw:(nonnull NSNotification *)notification { [self setNeedsDisplay]; } @@ -298,7 +313,7 @@ -(void)graphNeedsRedraw:(NSNotification *)notification /// @cond --(void)setHostedGraph:(CPTGraph *)newLayer +-(void)setHostedGraph:(nullable CPTGraph *)newLayer { NSParameterAssert( (newLayer == nil) || [newLayer isKindOfClass:[CPTGraph class]] ); @@ -335,8 +350,10 @@ -(void)setHostedGraph:(CPTGraph *)newLayer } else { if ( newLayer ) { - newLayer.frame = self.layer.bounds; - [self.layer addSublayer:newLayer]; + CPTGraph *newGraph = newLayer; + + newGraph.frame = self.layer.bounds; + [self.layer addSublayer:newGraph]; } } } diff --git a/framework/iPhoneOnly/CPTImagePlatformSpecific.m b/framework/iPhoneOnly/CPTImagePlatformSpecific.m index 0f847fc94..21ad7a51e 100644 --- a/framework/iPhoneOnly/CPTImagePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTImagePlatformSpecific.m @@ -12,7 +12,7 @@ @implementation CPTImage(CPTPlatformSpecificImageExtensions) * @param anImage The platform-native image. * @return A CPTImage instance initialized with the provided image. **/ --(instancetype)initWithNativeImage:(CPTNativeImage *)anImage +-(nonnull instancetype)initWithNativeImage:(nullable CPTNativeImage *)anImage { if ( (self = [self initWithCGImage:NULL scale:anImage.scale]) ) { self.nativeImage = anImage; @@ -33,7 +33,7 @@ -(instancetype)initWithNativeImage:(CPTNativeImage *)anImage * @param path The file system path of the file. * @return A CPTImage instance initialized with the contents of the PNG file. **/ --(instancetype)initForPNGFile:(NSString *)path +-(nonnull instancetype)initForPNGFile:(nonnull NSString *)path { CGFloat imageScale = CPTFloat(1.0); diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m index 9a4e542b3..c3b42aace 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m @@ -11,7 +11,7 @@ @implementation CPTColor(CPTPlatformSpecificColorExtensions) **/ @dynamic uiColor; --(UIColor *)uiColor +-(nonnull UIColor *)uiColor { return [UIColor colorWithCGColor:self.cgColor]; } @@ -25,7 +25,7 @@ @implementation CPTLayer(CPTPlatformSpecificLayerExtensions) /** @brief Gets an image of the layer contents. * @return A native image representation of the layer content. **/ --(CPTNativeImage *)imageOfLayer +-(nullable CPTNativeImage *)imageOfLayer { CGSize boundsSize = self.bounds.size; @@ -58,7 +58,7 @@ @implementation NSNumber(CPTPlatformSpecificNumberExtensions) * @param other The other number to compare to the receiver. * @return @YES if the receiver is less than other, otherwise @NO. **/ --(BOOL)isLessThan:(NSNumber *)other +-(BOOL)isLessThan:(nonnull NSNumber *)other { return [self compare:other] == NSOrderedAscending; } @@ -67,7 +67,7 @@ -(BOOL)isLessThan:(NSNumber *)other * @param other The other number to compare to the receiver. * @return @YES if the receiver is less than or equal to other, otherwise @NO. **/ --(BOOL)isLessThanOrEqualTo:(NSNumber *)other +-(BOOL)isLessThanOrEqualTo:(nonnull NSNumber *)other { return [self compare:other] == NSOrderedSame || [self compare:other] == NSOrderedAscending; } @@ -76,7 +76,7 @@ -(BOOL)isLessThanOrEqualTo:(NSNumber *)other * @param other The other number to compare to the receiver. * @return @YES if the receiver is greater than other, otherwise @NO. **/ --(BOOL)isGreaterThan:(NSNumber *)other +-(BOOL)isGreaterThan:(nonnull NSNumber *)other { return [self compare:other] == NSOrderedDescending; } @@ -85,7 +85,7 @@ -(BOOL)isGreaterThan:(NSNumber *)other * @param other The other number to compare to the receiver. * @return @YES if the receiver is greater than or equal to other, otherwise @NO. **/ --(BOOL)isGreaterThanOrEqualTo:(NSNumber *)other +-(BOOL)isGreaterThanOrEqualTo:(nonnull NSNumber *)other { return [self compare:other] == NSOrderedSame || [self compare:other] == NSOrderedDescending; } @@ -101,7 +101,7 @@ @implementation NSAttributedString(CPTPlatformSpecificAttributedStringExtensions * @param context The graphics context to draw into. * @since Available on iOS 6.0 and later. Does nothing on earlier versions. **/ --(void)drawInRect:(CGRect)rect inContext:(CGContextRef)context +-(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context { if ( [self respondsToSelector:@selector(drawInRect:)] ) { CPTPushCGContext(context); diff --git a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m index 3e7cd3677..922dc209d 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificFunctions.m @@ -5,7 +5,7 @@ #pragma mark - #pragma mark Context management -void CPTPushCGContext(CGContextRef newContext) +void CPTPushCGContext(__nonnull CGContextRef newContext) { UIGraphicsPushContext(newContext); } diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index 2da829d3f..283e70583 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -17,7 +17,7 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 @interface NSString(CPTTextStylePlatformSpecificExtensions) --(CGSize)sizeWithAttributes:(CPTDictionary)attrs; +-(CGSize)sizeWithAttributes:(nonnull CPTDictionary)attrs; @end #else diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 1152dae82..5d31e2002 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -8,7 +8,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) -/** @property CPTDictionary attributes +/** @property nonnull CPTDictionary attributes * @brief A dictionary of standard text attributes suitable for formatting an NSAttributedString. * * The dictionary will contain values for the following keys that represent the receiver's text style: @@ -34,7 +34,7 @@ @implementation CPTTextStyle(CPTPlatformSpecificTextStyleExtensions) * @param attributes A dictionary of standard text attributes. * @return A new CPTTextStyle instance. **/ -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -67,7 +67,7 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes /// @cond --(CPTDictionary)attributes +-(nonnull CPTDictionary)attributes { CPTMutableDictionary myAttributes = [NSMutableDictionary dictionary]; @@ -111,9 +111,20 @@ -(CPTDictionary)attributes @implementation CPTMutableTextStyle(CPTPlatformSpecificMutableTextStyleExtensions) -/// @cond - -+(instancetype)textStyleWithAttributes:(CPTDictionary)attributes +/** @brief Creates and returns a new CPTMutableTextStyle instance initialized from a dictionary of text attributes. + * + * The text style will be initalized with values associated with the following keys: + * - #NSFontAttributeName: Sets the @link CPTMutableTextStyle::fontName fontName @endlink + * and @link CPTMutableTextStyle::fontSize fontSize @endlink. + * - #NSForegroundColorAttributeName: Sets the @link CPTMutableTextStyle::color color @endlink. + * - #NSParagraphStyleAttributeName: Sets the @link CPTMutableTextStyle::textAlignment textAlignment @endlink and @link CPTMutableTextStyle::lineBreakMode lineBreakMode @endlink. + * + * Properties associated with missing keys will be inialized to their default values. + * + * @param attributes A dictionary of standard text attributes. + * @return A new CPTMutableTextStyle instance. + **/ ++(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attributes { CPTMutableTextStyle *newStyle = [CPTMutableTextStyle textStyle]; @@ -143,8 +154,6 @@ +(instancetype)textStyleWithAttributes:(CPTDictionary)attributes return newStyle; } -/// @endcond - @end #pragma mark - @@ -158,7 +167,7 @@ @implementation NSString(CPTTextStyleExtensions) * @param style The text style. * @return The size of the text when drawn with the given style. **/ --(CGSize)sizeWithTextStyle:(CPTTextStyle *)style +-(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style { CGSize textSize; @@ -197,7 +206,7 @@ -(CGSize)sizeWithTextStyle:(CPTTextStyle *)style * @param style The text style. * @param context The graphics context to draw into. **/ --(void)drawInRect:(CGRect)rect withTextStyle:(CPTTextStyle *)style inContext:(CGContextRef)context +-(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inContext:(nonnull CGContextRef)context { if ( style.color == nil ) { return; From e8e2a5267e0135da6bc81e3eab630fcc66bb8e11 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 15 Mar 2016 22:06:26 -0400 Subject: [PATCH 169/429] Updated the scatterplot tests with modern NSArray syntax. --- framework/Source/CPTScatterPlotTests.m | 223 +++++++++++-------------- 1 file changed, 102 insertions(+), 121 deletions(-) diff --git a/framework/Source/CPTScatterPlotTests.m b/framework/Source/CPTScatterPlotTests.m index 5024ae1d6..700ebb1fa 100644 --- a/framework/Source/CPTScatterPlotTests.m +++ b/framework/Source/CPTScatterPlotTests.m @@ -19,13 +19,9 @@ @implementation CPTScatterPlotTests -(void)setUp { - double values[5] = { 0.5, 0.5, 0.5, 0.5, 0.5 }; + CPTNumberArray yValues = @[@0.5, @0.5, @0.5, @0.5, @0.5]; self.plot = [CPTScatterPlot new]; - CPTMutableNumberArray yValues = [NSMutableArray array]; - for ( NSInteger i = 0; i < 5; i++ ) { - [yValues addObject:@(values[i])]; - } [self.plot setYValues:yValues]; self.plot.cachePrecision = CPTPlotCachePrecisionDouble; @@ -44,224 +40,209 @@ -(void)tearDown -(void)testCalculatePointsToDrawAllInRange { - BOOL drawFlags[5]; - double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; - - CPTMutableNumberArray values = [NSMutableArray array]; + CPTNumberArray inRangeValues = @[@0.1, @0.2, @0.15, @0.6, @0.9]; - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawAllInRangeVisibleOnly { - BOOL drawFlags[5]; - double inRangeValues[5] = { 0.1, 0.2, 0.15, 0.6, 0.9 }; + CPTNumberArray inRangeValues = @[@0.1, @0.2, @0.15, @0.6, @0.9]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertTrue(drawFlags[i], @"Test that in range points are drawn (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawNoneInRange { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; + CPTNumberArray inRangeValues = @[@(-0.1), @(-0.2), @(-0.15), @(-0.6), @(-0.9)]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawNoneInRangeVisibleOnly { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, -0.2, -0.15, -0.6, -0.9 }; + CPTNumberArray inRangeValues = @[@(-0.1), @(-0.2), @(-0.15), @(-0.6), @(-0.9)]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertFalse(drawFlags[i], @"Test that out of range points are not drawn (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawNoneInRangeDifferentRegions { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; + CPTNumberArray inRangeValues = @[@(-0.1), @2, @(-0.15), @3, @(-0.9)]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertTrue(drawFlags[i], @"Test that out of range points in different regions get included (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertTrue(drawFlags[i], @"Test that out of range points in different regions get included (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawNoneInRangeDifferentRegionsVisibleOnly { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 2, -0.15, 3, -0.9 }; + CPTNumberArray inRangeValues = @[@(-0.1), @2, @(-0.15), @3, @(-0.9)]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - XCTAssertFalse(drawFlags[i], @"Test that out of range points in different regions get included (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + XCTAssertFalse(drawFlags[i], @"Test that out of range points in different regions get included (%@).", inRangeValues[i]); } + + free(drawFlags); } -(void)testCalculatePointsToDrawSomeInRange { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; - BOOL expected[5] = { YES, YES, YES, YES, NO }; - - CPTMutableNumberArray values = [NSMutableArray array]; + CPTNumberArray inRangeValues = @[@(-0.1), @0.1, @0.2, @1.2, @1.5]; + BOOL expected[5] = { YES, YES, YES, YES, NO }; - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:inRangeValues.count]; + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { if ( expected[i] ) { - XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); + XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%@).", inRangeValues[i]); } else { - XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); + XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out (%@).", inRangeValues[i]); } } + + free(drawFlags); } -(void)testCalculatePointsToDrawSomeInRangeVisibleOnly { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 0.1, 0.2, 1.2, 1.5 }; + CPTNumberArray inRangeValues = @[@(-0.1), @0.1, @0.2, @1.2, @1.5]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - if ( [self.plotSpace.xRange compareToNumber:@(inRangeValues[i])] == CPTPlotRangeComparisonResultNumberInRange ) { - XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + if ( [self.plotSpace.xRange compareToNumber:inRangeValues[i]] == CPTPlotRangeComparisonResultNumberInRange ) { + XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out (%@).", inRangeValues[i]); } else { - XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out (%g).", inRangeValues[i]); + XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out (%@).", inRangeValues[i]); } } + + free(drawFlags); } -(void)testCalculatePointsToDrawSomeInRangeCrossing { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; - BOOL expected[5] = { YES, YES, YES, YES, NO }; + CPTNumberArray inRangeValues = @[@(-0.1), @1.1, @0.9, @(-0.1), @(-0.2)]; - CPTMutableNumberArray values = [NSMutableArray array]; + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); + BOOL *expected = malloc(sizeof(BOOL) * inRangeValues.count); - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; + for ( NSUInteger i = 0; i < inRangeValues.count - 1; i++ ) { + expected[i] = YES; } + expected[inRangeValues.count] = NO; CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { if ( expected[i] ) { - XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); + XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%@).", inRangeValues[i]); } else { - XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); + XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%@).", inRangeValues[i]); } } + + free(drawFlags); + free(expected); } -(void)testCalculatePointsToDrawSomeInRangeCrossingVisibleOnly { - BOOL drawFlags[5]; - double inRangeValues[5] = { -0.1, 1.1, 0.9, -0.1, -0.2 }; + CPTNumberArray inRangeValues = @[@(-0.1), @1.1, @0.9, @(-0.1), @(-0.2)]; - CPTMutableNumberArray values = [NSMutableArray array]; - - for ( NSUInteger i = 0; i < 5; i++ ) { - [values addObject:@(inRangeValues[i])]; - } + BOOL *drawFlags = malloc(sizeof(BOOL) * inRangeValues.count); CPTXYPlotSpace *thePlotSpace = self.plotSpace; - [self.plot setXValues:values]; - [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:values.count]; - for ( NSUInteger i = 0; i < 5; i++ ) { - if ( [self.plotSpace.xRange compareToNumber:@(inRangeValues[i])] == CPTPlotRangeComparisonResultNumberInRange ) { - XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); + [self.plot setXValues:inRangeValues]; + [self.plot calculatePointsToDraw:drawFlags forPlotSpace:thePlotSpace includeVisiblePointsOnly:YES numberOfPoints:inRangeValues.count]; + + for ( NSUInteger i = 0; i < inRangeValues.count; i++ ) { + if ( [self.plotSpace.xRange compareToNumber:inRangeValues[i]] == CPTPlotRangeComparisonResultNumberInRange ) { + XCTAssertTrue(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%@).", inRangeValues[i]); } else { - XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%g).", inRangeValues[i]); + XCTAssertFalse(drawFlags[i], @"Test that correct points included when some are in range, others out, crossing range (%@).", inRangeValues[i]); } } + + free(drawFlags); } @end From bf19acfc1d8cf5138748ad22fd97114372d9a4d7 Mon Sep 17 00:00:00 2001 From: malte bargholz Date: Mon, 14 Mar 2016 10:15:35 +0100 Subject: [PATCH 170/429] Add methods to compute catmull rom and cubic hermite spline control points. Add enum + property to select the interpolation method. --- framework/Source/CPTScatterPlot.h | 16 +- framework/Source/CPTScatterPlot.m | 275 ++++++++++++++++++++++++++++-- 2 files changed, 279 insertions(+), 12 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 84317a202..0bbd63993 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -31,7 +31,19 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { CPTScatterPlotInterpolationLinear, ///< Linear interpolation. CPTScatterPlotInterpolationStepped, ///< Steps beginning at data point. CPTScatterPlotInterpolationHistogram, ///< Steps centered at data point. - CPTScatterPlotInterpolationCurved ///< Bezier curve interpolation. + CPTScatterPlotInterpolationCurved ///< Curved interpolation. +}; + +/** + * @brief Enumration of scatter plot curved interpolation style options + **/ +typedef NS_ENUM(NSInteger, CPTScatterPlotCurvedInterpolationOption){ + CPTScatterPlotCurvedInterpolationNormal, ///< Standard Curved Interpolation (Bezier Curve) + CPTScatterPlotCurvedInterpolationCatmullRomUniform, ///< Catmull-Rom Spline Interpolation with alpha = 0.0. + CPTScatterPlotCurvedInterpolationCatmullRomCentripetal, ///< Catmull-Rom Spline Interpolation with alpha = 0.5. + CPTScatterPlotCurvedInterpolationCatmullRomChordal, ///< Catmull-Rom Spline Interpolation with alpha = 1.0. + CPTScatterPlotCurvedInterpolationCatmullCustomAlpha,///< Catmull-Rom Spline Interpolation with a custom alpha value. + CPTScatterPlotCurvedInterpolationHermiteCubic ///< Hermite Cubic Spline Interpolation }; /** @@ -234,6 +246,8 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { @property (nonatomic, readwrite, strong, nullable) NSNumber *areaBaseValue2; @property (nonatomic, readwrite, assign) CPTScatterPlotInterpolation interpolation; @property (nonatomic, readwrite, assign) CPTScatterPlotHistogramOption histogramOption; +@property (nonatomic, readwrite, assign) CPTScatterPlotCurvedInterpolationOption curvedInterpolationOption; +@property (nonatomic, readwrite, assign) CGFloat curvedInterpolationCustomAlpha; /// @} /// @name Area Fill Bands diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 78c97fcc4..9a075dda5 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -49,8 +49,9 @@ -(NSInteger)extremeDrawnPointIndexForFlags:(BOOL *)pointDrawFlags numberOfPoints -(CGPathRef)newDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange baselineYValue:(CGFloat)baselineYValue; --(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange; - +-(void)computeBezierControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange; +-(void)computeCatmullRomControlPoints:(CGPoint*)points points2:(CGPoint*)points2 withAlpha:(CGFloat)alpha forViewPoints:(CGPoint*)viewPoints indexRange:(NSRange)indexRange; +-(void)computeHermiteControlPoints:(CGPoint*)points points2:(CGPoint*)points2 forViewPoints:(CGPoint*)viewPoints indexRange:(NSRange)indexRange; @end /// @endcond @@ -82,6 +83,19 @@ @implementation CPTScatterPlot **/ @synthesize histogramOption; +/** @property CPTScatterPlotCurvedInterpolationOption curvedInterpolationOption + * @brief The interpolation method used to generate the curved plot line (@ref interpolation = #CPTScatterPlotInterpolationCurved) + * Default is #CPTScatterPlotCurvedInterpolationNormal + **/ +@synthesize curvedInterpolationOption; + +/** @property CGFloat curvedInterpolationCustomAlpha + * @brief The custom alpha value used when the #CPTScatterPlotCurvedInterpolationCatmullCustomAlpha interpolation is selected. + * Default is @num{0.5}. + * @warning Must be between @num{0.0} and @num{1.0}. + **/ +@synthesize curvedInterpolationCustomAlpha; + /** @property CPTLineStyle *dataLineStyle * @brief The line style for the data line. * If @nil, the line is not drawn. @@ -229,6 +243,7 @@ -(instancetype)initWithFrame:(CGRect)newFrame plotLineMarginForHitDetection = CPTFloat(4.0); interpolation = CPTScatterPlotInterpolationLinear; histogramOption = CPTScatterPlotHistogramNormal; + curvedInterpolationOption = CPTScatterPlotCurvedInterpolationNormal; pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; mutableAreaFillBands = nil; @@ -257,6 +272,7 @@ -(instancetype)initWithLayer:(id)layer allowSimultaneousSymbolAndPlotSelection = theLayer->allowSimultaneousSymbolAndPlotSelection; interpolation = theLayer->interpolation; histogramOption = theLayer->histogramOption; + curvedInterpolationOption = theLayer->curvedInterpolationOption; mutableAreaFillBands = theLayer->mutableAreaFillBands; pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; @@ -277,6 +293,7 @@ -(void)encodeWithCoder:(NSCoder *)coder [coder encodeInteger:self.interpolation forKey:@"CPTScatterPlot.interpolation"]; [coder encodeInteger:self.histogramOption forKey:@"CPTScatterPlot.histogramOption"]; + [coder encodeInteger:self.curvedInterpolationOption forKey:@"CPTScatterPlot.curvedInterpolationOption"]; [coder encodeObject:self.dataLineStyle forKey:@"CPTScatterPlot.dataLineStyle"]; [coder encodeObject:self.plotSymbol forKey:@"CPTScatterPlot.plotSymbol"]; [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; @@ -298,6 +315,7 @@ -(instancetype)initWithCoder:(NSCoder *)coder if ( (self = [super initWithCoder:coder]) ) { interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey:@"CPTScatterPlot.interpolation"]; histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey:@"CPTScatterPlot.histogramOption"]; + curvedInterpolationOption = (CPTScatterPlotCurvedInterpolationOption)[coder decodeIntegerForKey:@"CPTScatterPlot.curvedInterpolationOption"]; dataLineStyle = [[coder decodeObjectForKey:@"CPTScatterPlot.dataLineStyle"] copy]; plotSymbol = [[coder decodeObjectForKey:@"CPTScatterPlot.plotSymbol"] copy]; areaFill = [[coder decodeObjectForKey:@"CPTScatterPlot.areaFill"] copy]; @@ -1004,6 +1022,8 @@ -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange: CGPoint lastPoint = CGPointZero; NSUInteger firstIndex = indexRange.location; NSUInteger lastDrawnPointIndex = NSMaxRange(indexRange); + CPTScatterPlotCurvedInterpolationOption interpolationOption = self.curvedInterpolationOption; + if ( lastDrawnPointIndex > 0 ) { CGPoint *controlPoints1 = calloc( lastDrawnPointIndex, sizeof(CGPoint) ); @@ -1017,10 +1037,49 @@ -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange: if ( isnan(viewPoint.x) || isnan(viewPoint.y) ) { if ( !lastPointSkipped ) { - [self computeControlPoints:controlPoints1 - points2:controlPoints2 - forViewPoints:viewPoints - indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + switch (interpolationOption) { + case CPTScatterPlotCurvedInterpolationNormal: + [self computeBezierControlPoints:controlPoints1 + points2:controlPoints2 + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullRomUniform: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(0) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullRomCentripetal: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(0.5) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullRomChordal: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(1) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + + break; + case CPTScatterPlotCurvedInterpolationHermiteCubic: + [self computeHermiteControlPoints:controlPoints1 + points2:controlPoints2 + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullCustomAlpha: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:self.curvedInterpolationCustomAlpha + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, i - firstIndex)]; + break; + } lastPointSkipped = YES; } @@ -1034,10 +1093,50 @@ -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange: } if ( !lastPointSkipped ) { - [self computeControlPoints:controlPoints1 - points2:controlPoints2 - forViewPoints:viewPoints - indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + switch (interpolationOption) { + case CPTScatterPlotCurvedInterpolationNormal: + [self computeBezierControlPoints:controlPoints1 + points2:controlPoints2 + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullRomUniform: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(0) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + + break; + case CPTScatterPlotCurvedInterpolationCatmullRomCentripetal: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(0.5) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullRomChordal: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:CPTFloat(1) + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + + break; + case CPTScatterPlotCurvedInterpolationHermiteCubic: + [self computeHermiteControlPoints:controlPoints1 + points2:controlPoints2 + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; + break; + case CPTScatterPlotCurvedInterpolationCatmullCustomAlpha: + [self computeCatmullRomControlPoints:controlPoints1 + points2:controlPoints2 + withAlpha:self.curvedInterpolationCustomAlpha + forViewPoints:viewPoints + indexRange:NSMakeRange(firstIndex,NSMaxRange(indexRange) - firstIndex)]; + break; + } } // Build the path @@ -1105,9 +1204,144 @@ -(CGPathRef)newCurvedDataLinePathForViewPoints:(CGPoint *)viewPoints indexRange: return dataLinePath; } +/** @brief Compute the control points using a catmull-rom spline. + * @param points A pointer to the array which should hold the first control points. + * @param points2 A pointer to the array which should hold the second control points. + * @param alpha The alpha value used for the catmull-rom interpolation. + * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. + * @param indexRange The range in which the interpolation should occur. + * @warning The indexRange must be valid for all passed array's otherwise this method crashes. + **/ +-(void)computeCatmullRomControlPoints:(CGPoint*)points points2:(CGPoint*)points2 withAlpha:(CGFloat)alpha forViewPoints:(CGPoint*)viewPoints indexRange:(NSRange)indexRange +{ + if (indexRange.length >= 2) { + NSUInteger startIndex = indexRange.location; + NSUInteger endIndex = NSMaxRange(indexRange) - 1;// the index starts at zero + NSUInteger segmentCount = endIndex - 1; // there are n - 1 segments + + CGFloat epsilon = CPTFloat(1e-5);// the minimum point distance. below that no interpolation happens. + + for(NSUInteger index = startIndex; index <= segmentCount ; index++){ + //calculate the control for the segment from index -> index + 1 + CGPoint p0,p1,p2,p3;//the view point + + // the internal points are always valid + p1 = viewPoints[index]; + p2 = viewPoints[index + 1]; + //account for first and last segment + if (index == startIndex) { + p0 = CGPointMake(CGRectGetMinX(self.bounds), p1.y);//guess first point + } + else{ + p0 = viewPoints[index - 1]; + } + if (index == segmentCount) { + p3 = CGPointMake(CGRectGetMaxX(self.bounds), p2.y);//guess end point + } + else{ + p3 = viewPoints[index + 2]; + }; + + + //distance between the points + CGFloat d1 = hypot(p1.x - p0.x,p1.y - p0.y); + CGFloat d2 = hypot(p2.x - p1.x, p2.y - p1.y); + CGFloat d3 = hypot(p3.x - p2.x, p3.y - p2.y); + //constants + CGFloat d1_a = pow(d1,alpha);//d1^alpha + CGFloat d2_a = pow(d2,alpha);//d2^alpha + CGFloat d3_a = pow(d3,alpha);//d3^alpha + CGFloat d1_2a = pow(d1_a,2);//d1^alpha^2 = d1^2*alpha + CGFloat d2_2a = pow(d2_a,2);//d2^2alpha + CGFloat d3_2a = pow(d3_a,2); + + //calculate the control points + //see : http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf under point 3. + CGPoint cp1,cp2;//the calculated view points; + if (fabs(d1) <= epsilon) { + cp1 = p1; + } + else{ + CGFloat divisor = 3 * d1_a * (d1_a + d2_a); + cp1 = CPTPointMake((p2.x * d1_2a - p0.x * d2_2a + (2* d1_2a + 3 * d1_a * d2_a + d2_2a) * p1.x) / divisor, + (p2.y * d1_2a - p0.y * d2_2a + (2* d1_2a + 3 * d1_a * d2_a + d2_2a) * p1.y) / divisor + ); + } + + if (fabs(d3) <= epsilon) { + cp2 = p2; + } + else{ + CGFloat divisor = 3 * d3_a * (d3_a + d2_a); + cp2 = CPTPointMake((d3_2a * p1.x - d2_2a * p3.x + (2 * d3_2a + 3 * d3_a * d2_a + d2_2a) * p2.x)/divisor, + (d3_2a * p1.y - d2_2a * p3.y + (2 * d3_2a + 3 * d3_a * d2_a + d2_2a) * p2.y)/divisor); + } + + points[index + 1] = cp1; + points2[index + 1] = cp2; + } + + } + +} + +/** @brief Compute the control points using a hermite cubic spline. Taken from https://en.wikipedia.org/wiki/Cubic_Hermite_spline (see representations). + * @param points A pointer to the array which should hold the first control points. + * @param points2 A pointer to the array which should hold the second control points. + * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. + * @param indexRange The range in which the interpolation should occur. + * @warning The indexRange must be valid for all passed array's otherwise this method crashes. + **/ +-(void)computeHermiteControlPoints:(CGPoint*)points points2:(CGPoint*)points2 forViewPoints:(CGPoint*)viewPoints indexRange:(NSRange)indexRange +{ + + if (indexRange.length >= 2) { + + NSUInteger startIndex = indexRange.location; + NSUInteger numberOfPoints = NSMaxRange(indexRange) - 1;//last accessible element in view points + for (NSUInteger index = indexRange.location; index <= numberOfPoints; index ++) { + CGPoint p0,p1,p2,lhsControlPoint,rhsControlPoint; + + p1 = viewPoints[index];//is always valid + + CGFloat mx,my; + if (index == startIndex){ + p2 = viewPoints[index + 1]; + mx = (p2.x - p1.x) * CPTFloat(0.5); + my = (p2.y - p1.y) * CPTFloat(0.5); + + } + else if (index == numberOfPoints){ + p0 = viewPoints[index - 1]; + mx = (p1.x - p0.x) * CPTFloat(0.5); + my = (p1.y - p0.y) * CPTFloat(0.5); + } + else {//index > startIndex && index < numberOfPoints + p2 = viewPoints[index + 1]; + p0 = viewPoints[index - 1]; + + mx = (p2.x - p1.x) * CPTFloat(0.5) + (p1.x - p0.x) * CPTFloat(0.5); + my = (p2.y - p1.y) * CPTFloat(0.5) + (p1.y - p0.y) * CPTFloat(0.5); + } + //get control points + mx /= CPTFloat(3.0); + my /= CPTFloat(3.0); + rhsControlPoint = CPTPointMake(p1.x + mx, p1.y + my); + lhsControlPoint = CPTPointMake(p1.x - mx, p1.y - my); + + //We calculated the lhs & rhs control point. the rhs control point is the first control point for the curve to the next point. the lhs control point is the second control point for the curve to the current point. + + points2[index] = lhsControlPoint; + if (index + 1 <= numberOfPoints) { + points[index + 1] = rhsControlPoint; + } + } + } +} + // Compute the control points using the algorithm described at http://www.particleincell.com/blog/2012/bezier-splines/ // cp1, cp2, and viewPoints should point to arrays of points with at least NSMaxRange(indexRange) elements each. --(void)computeControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange +-(void)computeBezierControlPoints:(CGPoint *)cp1 points2:(CGPoint *)cp2 forViewPoints:(CGPoint *)viewPoints indexRange:(NSRange)indexRange { if ( indexRange.length == 2 ) { NSUInteger rangeEnd = NSMaxRange(indexRange) - 1; @@ -1770,6 +2004,25 @@ -(void)setHistogramOption:(CPTScatterPlotHistogramOption)newHistogramOption } } +-(void)setCurvedInterpolationOption:(CPTScatterPlotCurvedInterpolationOption)newCurvedInterpolationOption +{ + if ( newCurvedInterpolationOption != curvedInterpolationOption) { + curvedInterpolationOption = newCurvedInterpolationOption; + [self setNeedsDisplay]; + } +} + +-(void)setCurvedInterpolationCustomAlpha:(CGFloat)newCurvedInterpolationCustomAlpha +{ + if (newCurvedInterpolationCustomAlpha > 1.0) newCurvedInterpolationCustomAlpha = 1.0; + if (newCurvedInterpolationCustomAlpha < 0) newCurvedInterpolationCustomAlpha = 0.0; + + if (newCurvedInterpolationCustomAlpha != curvedInterpolationCustomAlpha) { + curvedInterpolationCustomAlpha = newCurvedInterpolationCustomAlpha; + [self setNeedsDisplay]; + } +} + -(void)setPlotSymbol:(CPTPlotSymbol *)aSymbol { if ( aSymbol != plotSymbol ) { From 294299b5ca4d856fe94a56f98b71c81822fe1d36 Mon Sep 17 00:00:00 2001 From: malte bargholz Date: Thu, 17 Mar 2016 08:46:49 +0100 Subject: [PATCH 171/429] Add curved interpolation demo --- .../Plot_Gallery.xcodeproj/project.pbxproj | 74 ++-- .../src/plots/CurvedInterpolationDemo.h | 13 + .../src/plots/CurvedInterpolationDemo.m | 316 ++++++++++++++++++ 3 files changed, 370 insertions(+), 33 deletions(-) create mode 100644 examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.h create mode 100644 examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj index d70c93309..8ec4b184c 100644 --- a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj @@ -30,50 +30,50 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; C30B12431BCADD300084C567 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D4146F1A7D824700B6F5D6 /* CorePlot.framework */; }; C30B12441BCADD300084C567 /* CorePlot.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C3D4146F1A7D824700B6F5D6 /* CorePlot.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - C30B12481BCADE170084C567 /* PlotItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFAE12342DB1006BF615 /* PlotItem.m */; settings = {ASSET_TAGS = (); }; }; - C30B12491BCADE170084C567 /* PlotGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFAC12342DB1006BF615 /* PlotGallery.m */; settings = {ASSET_TAGS = (); }; }; - C30B124A1BCADE170084C567 /* PiNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C3457A4C17AD7C5D000880F3 /* PiNumberFormatter.m */; settings = {ASSET_TAGS = (); }; }; + C30B12481BCADE170084C567 /* PlotItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFAE12342DB1006BF615 /* PlotItem.m */; }; + C30B12491BCADE170084C567 /* PlotGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFAC12342DB1006BF615 /* PlotGallery.m */; }; + C30B124A1BCADE170084C567 /* PiNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C3457A4C17AD7C5D000880F3 /* PiNumberFormatter.m */; }; C3457A4D17AD7C5D000880F3 /* PiNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = C3457A4C17AD7C5D000880F3 /* PiNumberFormatter.m */; }; - C34CB5461BC9A83C009270A0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C34CB5451BC9A83C009270A0 /* Images.xcassets */; settings = {ASSET_TAGS = (); }; }; - C34CB5541BC9A889009270A0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5481BC9A889009270A0 /* AppDelegate.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5551BC9A889009270A0 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB54A1BC9A889009270A0 /* DetailViewController.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5561BC9A889009270A0 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C34CB54B1BC9A889009270A0 /* Launch Screen.xib */; settings = {ASSET_TAGS = (); }; }; - C34CB5571BC9A889009270A0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB54C1BC9A889009270A0 /* main.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5581BC9A889009270A0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C34CB54D1BC9A889009270A0 /* Main.storyboard */; settings = {ASSET_TAGS = (); }; }; - C34CB55A1BC9A889009270A0 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5511BC9A889009270A0 /* RootViewController.m */; settings = {ASSET_TAGS = (); }; }; - C34CB55B1BC9A889009270A0 /* ThemeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5531BC9A889009270A0 /* ThemeTableViewController.m */; settings = {ASSET_TAGS = (); }; }; + C34CB5461BC9A83C009270A0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C34CB5451BC9A83C009270A0 /* Images.xcassets */; }; + C34CB5541BC9A889009270A0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5481BC9A889009270A0 /* AppDelegate.m */; }; + C34CB5551BC9A889009270A0 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB54A1BC9A889009270A0 /* DetailViewController.m */; }; + C34CB5561BC9A889009270A0 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C34CB54B1BC9A889009270A0 /* Launch Screen.xib */; }; + C34CB5571BC9A889009270A0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB54C1BC9A889009270A0 /* main.m */; }; + C34CB5581BC9A889009270A0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C34CB54D1BC9A889009270A0 /* Main.storyboard */; }; + C34CB55A1BC9A889009270A0 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5511BC9A889009270A0 /* RootViewController.m */; }; + C34CB55B1BC9A889009270A0 /* ThemeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34CB5531BC9A889009270A0 /* ThemeTableViewController.m */; }; C34CB5601BC9AB7B009270A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C34CB55F1BC9AB7B009270A0 /* Foundation.framework */; }; C34CB5621BC9AB85009270A0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C34CB5611BC9AB85009270A0 /* UIKit.framework */; }; C34CB5641BC9AB8C009270A0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C34CB5631BC9AB8C009270A0 /* CoreGraphics.framework */; }; C34CB5661BC9AB93009270A0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C34CB5651BC9AB93009270A0 /* QuartzCore.framework */; }; C34CB5681BC9AB9E009270A0 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C34CB5671BC9AB9E009270A0 /* Accelerate.framework */; }; - C34CB57C1BC9B1C1009270A0 /* AxisDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1CC112908B0000D2035F /* AxisDemo.m */; settings = {ASSET_TAGS = (); }; }; - C34CB57D1BC9B1C1009270A0 /* CandlestickPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1DF13B18CAE007994B6 /* CandlestickPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB57E1BC9B1C1009270A0 /* ColoredBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A31A5514DF782A00734AB7 /* ColoredBarChart.m */; settings = {ASSET_TAGS = (); }; }; - C34CB57F1BC9B1C1009270A0 /* CompositePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9B12342D7C006BF615 /* CompositePlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5801BC9B1C1009270A0 /* ControlChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C35597951437E07800B41DA7 /* ControlChart.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5811BC9B1C1009270A0 /* CurvedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F42A2714D3A75F0044B323 /* CurvedScatterPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5821BC9B1C1009270A0 /* DatePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C13129077C200D2035F /* DatePlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5831BC9B1C1009270A0 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F1412AB2598008FBDC3 /* DonutChart.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5841BC9B1C1009270A0 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1817A9DE2000A52FF2 /* FunctionPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5851BC9B1C1009270A0 /* GradientScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9D12342D7C006BF615 /* GradientScatterPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5861BC9B1C1009270A0 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BA5175EB29E00F27173 /* ImageDemo.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5871BC9B1C1009270A0 /* LabelingPolicyDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4013BFE1A900CD9194 /* LabelingPolicyDemo.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5881BC9B1C1009270A0 /* LineCapDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C367249213E103910070F47A /* LineCapDemo.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5891BC9B1C1009270A0 /* OHLCPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1C513B18AAF007994B6 /* OHLCPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58A1BC9B1C1009270A0 /* PlotSpaceDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4313BFE1B400CD9194 /* PlotSpaceDemo.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58B1BC9B1C1009270A0 /* RangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A14BEB13AEB7E700D103EA /* RangePlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58C1BC9B1C1009270A0 /* RealTimePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C354C0D613C7CDBE00DA8822 /* RealTimePlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58D1BC9B1C1009270A0 /* SteppedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C85129083B000D2035F /* SteppedScatterPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58E1BC9B1C1009270A0 /* SimplePieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9F12342D7C006BF615 /* SimplePieChart.m */; settings = {ASSET_TAGS = (); }; }; - C34CB58F1BC9B1C1009270A0 /* SimpleScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFA112342D7C006BF615 /* SimpleScatterPlot.m */; settings = {ASSET_TAGS = (); }; }; - C34CB5901BC9B1C1009270A0 /* VerticalBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFA312342D7C006BF615 /* VerticalBarChart.m */; settings = {ASSET_TAGS = (); }; }; + C34CB57C1BC9B1C1009270A0 /* AxisDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1CC112908B0000D2035F /* AxisDemo.m */; }; + C34CB57D1BC9B1C1009270A0 /* CandlestickPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1DF13B18CAE007994B6 /* CandlestickPlot.m */; }; + C34CB57E1BC9B1C1009270A0 /* ColoredBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A31A5514DF782A00734AB7 /* ColoredBarChart.m */; }; + C34CB57F1BC9B1C1009270A0 /* CompositePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9B12342D7C006BF615 /* CompositePlot.m */; }; + C34CB5801BC9B1C1009270A0 /* ControlChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C35597951437E07800B41DA7 /* ControlChart.m */; }; + C34CB5811BC9B1C1009270A0 /* CurvedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F42A2714D3A75F0044B323 /* CurvedScatterPlot.m */; }; + C34CB5821BC9B1C1009270A0 /* DatePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C13129077C200D2035F /* DatePlot.m */; }; + C34CB5831BC9B1C1009270A0 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F1412AB2598008FBDC3 /* DonutChart.m */; }; + C34CB5841BC9B1C1009270A0 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1817A9DE2000A52FF2 /* FunctionPlot.m */; }; + C34CB5851BC9B1C1009270A0 /* GradientScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9D12342D7C006BF615 /* GradientScatterPlot.m */; }; + C34CB5861BC9B1C1009270A0 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BA5175EB29E00F27173 /* ImageDemo.m */; }; + C34CB5871BC9B1C1009270A0 /* LabelingPolicyDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4013BFE1A900CD9194 /* LabelingPolicyDemo.m */; }; + C34CB5881BC9B1C1009270A0 /* LineCapDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C367249213E103910070F47A /* LineCapDemo.m */; }; + C34CB5891BC9B1C1009270A0 /* OHLCPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1C513B18AAF007994B6 /* OHLCPlot.m */; }; + C34CB58A1BC9B1C1009270A0 /* PlotSpaceDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4313BFE1B400CD9194 /* PlotSpaceDemo.m */; }; + C34CB58B1BC9B1C1009270A0 /* RangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A14BEB13AEB7E700D103EA /* RangePlot.m */; }; + C34CB58C1BC9B1C1009270A0 /* RealTimePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C354C0D613C7CDBE00DA8822 /* RealTimePlot.m */; }; + C34CB58D1BC9B1C1009270A0 /* SteppedScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E1C85129083B000D2035F /* SteppedScatterPlot.m */; }; + C34CB58E1BC9B1C1009270A0 /* SimplePieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FF9F12342D7C006BF615 /* SimplePieChart.m */; }; + C34CB58F1BC9B1C1009270A0 /* SimpleScatterPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFA112342D7C006BF615 /* SimpleScatterPlot.m */; }; + C34CB5901BC9B1C1009270A0 /* VerticalBarChart.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F22FFA312342D7C006BF615 /* VerticalBarChart.m */; }; C354C0D713C7CDBE00DA8822 /* RealTimePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C354C0D613C7CDBE00DA8822 /* RealTimePlot.m */; }; C35597961437E07800B41DA7 /* ControlChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C35597951437E07800B41DA7 /* ControlChart.m */; }; C360E1C613B18AAF007994B6 /* OHLCPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1C513B18AAF007994B6 /* OHLCPlot.m */; }; C360E1E013B18CAF007994B6 /* CandlestickPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C360E1DF13B18CAE007994B6 /* CandlestickPlot.m */; }; C367249313E103910070F47A /* LineCapDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C367249213E103910070F47A /* LineCapDemo.m */; }; - C367EEE21BCAEA9E00A21FE7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D2FE6219FF1D03002CD4D6 /* Images.xcassets */; settings = {ASSET_TAGS = (); }; }; + C367EEE21BCAEA9E00A21FE7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D2FE6219FF1D03002CD4D6 /* Images.xcassets */; }; C39C4E4113BFE1A900CD9194 /* LabelingPolicyDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4013BFE1A900CD9194 /* LabelingPolicyDemo.m */; }; C39C4E4413BFE1B400CD9194 /* PlotSpaceDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C39C4E4313BFE1B400CD9194 /* PlotSpaceDemo.m */; }; C3A14BEC13AEB7E700D103EA /* RangePlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A14BEB13AEB7E700D103EA /* RangePlot.m */; }; @@ -84,6 +84,8 @@ C3EF42FD19FC75810060791A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3EF42FC19FC75810060791A /* Images.xcassets */; }; C3F34F1512AB2598008FBDC3 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F1412AB2598008FBDC3 /* DonutChart.m */; }; C3F97F1917A9DE2000A52FF2 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1817A9DE2000A52FF2 /* FunctionPlot.m */; }; + E9595DFC1C9973B9004129DA /* CurvedInterpolationDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */; }; + E9AB989C1C9A903700D23875 /* CurvedInterpolationDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -266,6 +268,8 @@ C3F42A2714D3A75F0044B323 /* CurvedScatterPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 2; name = CurvedScatterPlot.m; path = src/plots/CurvedScatterPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; C3F97F1717A9DE2000A52FF2 /* FunctionPlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FunctionPlot.h; path = src/plots/FunctionPlot.h; sourceTree = ""; }; C3F97F1817A9DE2000A52FF2 /* FunctionPlot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = FunctionPlot.m; path = src/plots/FunctionPlot.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + E9595DFA1C9973B9004129DA /* CurvedInterpolationDemo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CurvedInterpolationDemo.h; path = src/plots/CurvedInterpolationDemo.h; sourceTree = ""; }; + E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CurvedInterpolationDemo.m; path = src/plots/CurvedInterpolationDemo.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -396,6 +400,8 @@ C35597951437E07800B41DA7 /* ControlChart.m */, C3F42A2614D3A75F0044B323 /* CurvedScatterPlot.h */, C3F42A2714D3A75F0044B323 /* CurvedScatterPlot.m */, + E9595DFA1C9973B9004129DA /* CurvedInterpolationDemo.h */, + E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */, 4F8E1C12129077C200D2035F /* DatePlot.h */, 4F8E1C13129077C200D2035F /* DatePlot.m */, C3F34F1312AB2598008FBDC3 /* DonutChart.h */, @@ -675,6 +681,7 @@ C39C4E4113BFE1A900CD9194 /* LabelingPolicyDemo.m in Sources */, C39C4E4413BFE1B400CD9194 /* PlotSpaceDemo.m in Sources */, C354C0D713C7CDBE00DA8822 /* RealTimePlot.m in Sources */, + E9595DFC1C9973B9004129DA /* CurvedInterpolationDemo.m in Sources */, C367249313E103910070F47A /* LineCapDemo.m in Sources */, C35597961437E07800B41DA7 /* ControlChart.m in Sources */, C3A31A5614DF782A00734AB7 /* ColoredBarChart.m in Sources */, @@ -696,6 +703,7 @@ C34CB5871BC9B1C1009270A0 /* LabelingPolicyDemo.m in Sources */, C34CB5801BC9B1C1009270A0 /* ControlChart.m in Sources */, C34CB5831BC9B1C1009270A0 /* DonutChart.m in Sources */, + E9AB989C1C9A903700D23875 /* CurvedInterpolationDemo.m in Sources */, C34CB5811BC9B1C1009270A0 /* CurvedScatterPlot.m in Sources */, C34CB5861BC9B1C1009270A0 /* ImageDemo.m in Sources */, C34CB5541BC9A889009270A0 /* AppDelegate.m in Sources */, diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.h b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.h new file mode 100644 index 000000000..238a7c29c --- /dev/null +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.h @@ -0,0 +1,13 @@ +// +// CurvedInterpolationDemo.h +// Plot_Gallery +// +// Created by malte on 16/03/16. +// +// + +#import "PlotItem.h" + +@interface CurvedInterpolationDemo : PlotItem + +@end diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m new file mode 100644 index 000000000..129b2ae24 --- /dev/null +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m @@ -0,0 +1,316 @@ +// +// CurvedInterpolationDemo.m +// Plot_Gallery +// +// Created by malte on 16/03/16. +// +// + +#import "CurvedInterpolationDemo.h" + +static const CGFloat bezierYShift = -1.0; +static const CGFloat catmullRomUniformPlotYShift = 0.0; +static const CGFloat catmullRomCentripetalYShift = 1.0; +static const CGFloat catmullRomChordalYShift = 2.0; +static const CGFloat hermiteCubicYShift = -2.0; + +static NSString * const bezierCurveIdentifier = @"Bezier"; +static NSString * const catmullRomUniformIdentifier = @"Catmull-Rom Uniform"; +static NSString * const catmullRomCentripetalIdentifier = @"Catmull-Rom Centripetal"; +static NSString * const catmullRomChordalIdentifier = @"Catmull-Rom Chordal"; +static NSString * const hermiteCubicIdentifier = @"Hermite Cubic"; + +@interface CurvedInterpolationDemo() + +@property (nonatomic, readwrite, strong) NSArray *> *plotData; + + +@end + +@implementation CurvedInterpolationDemo + +@synthesize plotData = _plotData; + + ++(void)load +{ + [super registerPlotItem:self]; +} + +-(instancetype)init +{ + if ( (self = [super init]) ) { + self.title = @"Curved Interpolation Options Demo"; + self.section = kLinePlots; + } + + return self; +} + +-(void)generateData{ + if (self.plotData == nil) { + + NSArray * const xValues = @[@0, @0.1, @0.2, @0.5 ,@0.6 ,@0.7 ,@1]; + NSArray * const yValues = @[@(0.5),@0.5, @(-1), @1 ,@1 ,@0 ,@0.1]; + + if (xValues.count != yValues.count) { + [[NSException exceptionWithName:NSInternalInconsistencyException reason:@"invalid const data" userInfo:nil] raise]; + } + NSMutableArray *> *generatedData = [NSMutableArray new]; + for (NSUInteger i = 0; i < xValues.count; i++) { + NSNumber *x = xValues[i]; + NSNumber *y = yValues[i]; + if (x && y) { + [generatedData addObject:@{ + @"x":x, + @"y":y + }]; + } + } + self.plotData = generatedData; + } +} + +-(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +{ +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + CGRect bounds = hostingView.bounds; +#else + CGRect bounds = NSRectToCGRect(hostingView.bounds); +#endif + + CPTGraph *graph = [[CPTXYGraph alloc] initWithFrame:bounds]; + [self addGraph:graph toHostingView:hostingView]; + [self applyTheme:theme toGraph:graph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; + + graph.plotAreaFrame.paddingLeft += self.titleSize * CPTFloat(2.25); + graph.plotAreaFrame.paddingTop += self.titleSize; + graph.plotAreaFrame.paddingRight += self.titleSize; + graph.plotAreaFrame.paddingBottom += self.titleSize; + graph.plotAreaFrame.masksToBorder = NO; + + // Setup scatter plot space + CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; + plotSpace.allowsUserInteraction = YES; + plotSpace.delegate = self; + + // Grid line styles + CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; + majorGridLineStyle.lineWidth = 0.75; + majorGridLineStyle.lineColor = [[CPTColor colorWithGenericGray:CPTFloat(0.2)] colorWithAlphaComponent:CPTFloat(0.75)]; + + CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle]; + minorGridLineStyle.lineWidth = 0.25; + minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:CPTFloat(0.1)]; + + CPTMutableLineStyle *redLineStyle = [CPTMutableLineStyle lineStyle]; + redLineStyle.lineWidth = 10.0; + redLineStyle.lineColor = [[CPTColor redColor] colorWithAlphaComponent:0.5]; + + CPTLineCap *lineCap = [CPTLineCap sweptArrowPlotLineCap]; + lineCap.size = CGSizeMake( self.titleSize * CPTFloat(0.625), self.titleSize * CPTFloat(0.625) ); + + // Axes + // Label x axis with a fixed interval policy + CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet; + CPTXYAxis *x = axisSet.xAxis; + x.majorIntervalLength = @0.1; + x.minorTicksPerInterval = 4; + x.majorGridLineStyle = majorGridLineStyle; + x.minorGridLineStyle = minorGridLineStyle; + x.axisConstraints = [CPTConstraints constraintWithRelativeOffset:0.5]; + + lineCap.lineStyle = x.axisLineStyle; + lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; + x.axisLineCapMax = lineCap; + + x.title = @"X Axis"; + x.titleOffset = self.titleSize * CPTFloat(1.25); + + // Label y with an automatic label policy. + CPTXYAxis *y = axisSet.yAxis; + y.labelingPolicy = CPTAxisLabelingPolicyAutomatic; + y.minorTicksPerInterval = 4; + y.preferredNumberOfMajorTicks = 8; + y.majorGridLineStyle = majorGridLineStyle; + y.minorGridLineStyle = minorGridLineStyle; + y.axisConstraints = [CPTConstraints constraintWithLowerOffset:0.0]; + y.labelOffset = self.titleSize * CPTFloat(0.25); + + lineCap.lineStyle = y.axisLineStyle; + lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; + y.axisLineCapMax = lineCap; + y.axisLineCapMin = lineCap; + + y.title = @"Y Axis"; + y.titleOffset = self.titleSize * CPTFloat(1.25); + + // Set axes + graph.axisSet.axes = @[x, y]; + + // Create the plots + //Bezier + CPTScatterPlot *bezierPlot = [[CPTScatterPlot alloc] initWithFrame:CGRectZero]; + bezierPlot.identifier = bezierCurveIdentifier; + //Catmull-Rom + CPTScatterPlot *cmUniformPlot = [[CPTScatterPlot alloc] initWithFrame:CGRectZero]; + cmUniformPlot.identifier = catmullRomUniformIdentifier; + CPTScatterPlot *cmCentripetalPlot = [[CPTScatterPlot alloc] initWithFrame:CGRectZero]; + cmCentripetalPlot.identifier = catmullRomCentripetalIdentifier; + CPTScatterPlot *cmChordalPlot = [[CPTScatterPlot alloc] initWithFrame:CGRectZero]; + cmChordalPlot.identifier = catmullRomChordalIdentifier; + //Hermite Cubic + CPTScatterPlot *hermitePlot = [[CPTScatterPlot alloc] initWithFrame:CGRectZero]; + hermitePlot.identifier = hermiteCubicIdentifier; + + + // set interpolation types + bezierPlot.interpolation = cmUniformPlot.interpolation = cmCentripetalPlot.interpolation = cmChordalPlot.interpolation = hermitePlot.interpolation = CPTScatterPlotInterpolationCurved; + + bezierPlot.curvedInterpolationOption = CPTScatterPlotCurvedInterpolationNormal; + cmUniformPlot.curvedInterpolationOption = CPTScatterPlotCurvedInterpolationCatmullRomUniform; + cmChordalPlot.curvedInterpolationOption = CPTScatterPlotCurvedInterpolationCatmullRomChordal; + cmCentripetalPlot.curvedInterpolationOption = CPTScatterPlotCurvedInterpolationCatmullRomCentripetal; + hermitePlot.curvedInterpolationOption = CPTScatterPlotCurvedInterpolationHermiteCubic; + + + //style plots + CPTMutableLineStyle *lineStyle = [bezierPlot.dataLineStyle mutableCopy]; + lineStyle.lineWidth = 2.0; + lineStyle.lineColor = [CPTColor greenColor]; + + bezierPlot.dataLineStyle = lineStyle; + + lineStyle.lineColor = [CPTColor redColor]; + cmUniformPlot.dataLineStyle = lineStyle; + + lineStyle.lineColor = [CPTColor orangeColor]; + cmCentripetalPlot.dataLineStyle = lineStyle; + + lineStyle.lineColor = [CPTColor yellowColor]; + cmChordalPlot.dataLineStyle = lineStyle; + + lineStyle.lineColor = [CPTColor cyanColor]; + hermitePlot.dataLineStyle = lineStyle; + + + //set data source and add plots + bezierPlot.dataSource = cmUniformPlot.dataSource = cmCentripetalPlot.dataSource = cmChordalPlot.dataSource = hermitePlot.dataSource = self; + + [graph addPlot:bezierPlot]; + [graph addPlot:cmUniformPlot]; + [graph addPlot:cmCentripetalPlot]; + [graph addPlot:cmChordalPlot]; + [graph addPlot:hermitePlot]; + + + // Auto scale the plot space to fit the plot data + [plotSpace scaleToFitPlots:[graph allPlots]]; + CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy]; + CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy]; + + // Expand the ranges to put some space around the plot + [xRange expandRangeByFactor:@1.2]; + [yRange expandRangeByFactor:@1.2]; + plotSpace.xRange = xRange; + plotSpace.yRange = yRange; + + [xRange expandRangeByFactor:@1.025]; + xRange.location = plotSpace.xRange.location; + [yRange expandRangeByFactor:@1.05]; + x.visibleAxisRange = xRange; + y.visibleAxisRange = yRange; + + [xRange expandRangeByFactor:@3.0]; + [yRange expandRangeByFactor:@3.0]; + plotSpace.globalXRange = xRange; + plotSpace.globalYRange = yRange; + + // Add plot symbols + CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle]; + symbolLineStyle.lineColor = [[CPTColor blackColor] colorWithAlphaComponent:0.5]; + CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; + plotSymbol.fill = [CPTFill fillWithColor:[[CPTColor blueColor] colorWithAlphaComponent:0.5]]; + plotSymbol.lineStyle = symbolLineStyle; + plotSymbol.size = CGSizeMake(5.0, 5.0); + bezierPlot.plotSymbol = cmUniformPlot.plotSymbol = cmCentripetalPlot.plotSymbol = cmChordalPlot.plotSymbol = hermitePlot.plotSymbol = plotSymbol; + + // Add legend + graph.legend = [CPTLegend legendWithGraph:graph]; + graph.legend.numberOfRows = 2; + graph.legend.textStyle = x.titleTextStyle; + graph.legend.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; + graph.legend.borderLineStyle = x.axisLineStyle; + graph.legend.cornerRadius = 5.0; + graph.legendAnchor = CPTRectAnchorBottom; + graph.legendDisplacement = CGPointMake( 0.0, self.titleSize * CPTFloat(2.0) ); +} + +#pragma mark - +#pragma mark Plot Data Source Methods + +-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +{ + return self.plotData.count; +} + +-(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +{ + NSString *identifier = (NSString *)plot.identifier; + if (fieldEnum == CPTScatterPlotFieldX) { + return self.plotData[index][@"x"]; + } + else{ + NSNumber *baseY = self.plotData[index][@"y"]; + CGFloat shift = 0; + if ([identifier isEqualToString:catmullRomUniformIdentifier]) { + shift = catmullRomUniformPlotYShift; + } + else if([identifier isEqualToString:catmullRomCentripetalIdentifier]){ + shift = catmullRomCentripetalYShift; + } + else if([identifier isEqualToString:catmullRomChordalIdentifier]){ + shift = catmullRomChordalYShift; + } + else if([identifier isEqualToString:hermiteCubicIdentifier]){ + shift = hermiteCubicYShift; + } + else if([identifier isEqualToString:bezierCurveIdentifier]){ + shift = bezierYShift; + } + return @(baseY.doubleValue + shift); + } +} + +#pragma mark - +#pragma mark Plot Space Delegate Methods + +-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +{ + CPTGraph *theGraph = space.graph; + CPTXYAxisSet *axisSet = (CPTXYAxisSet *)theGraph.axisSet; + + CPTMutablePlotRange *changedRange = [newRange mutableCopy]; + + switch ( coordinate ) { + case CPTCoordinateX: + [changedRange expandRangeByFactor:@1.025]; + changedRange.location = newRange.location; + axisSet.xAxis.visibleAxisRange = changedRange; + break; + + case CPTCoordinateY: + [changedRange expandRangeByFactor:@1.05]; + axisSet.yAxis.visibleAxisRange = changedRange; + break; + + default: + break; + } + + return newRange; +} + + + +@end From 2c20f8f2b5b6ff6417828311bd70e7a42d42c573 Mon Sep 17 00:00:00 2001 From: malte bargholz Date: Thu, 17 Mar 2016 09:28:30 +0100 Subject: [PATCH 172/429] pass travis testing --- framework/Source/CPTScatterPlot.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 9a075dda5..ba1364d50 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1251,9 +1251,9 @@ -(void)computeCatmullRomControlPoints:(CGPoint*)points points2:(CGPoint*)points2 CGFloat d1_a = pow(d1,alpha);//d1^alpha CGFloat d2_a = pow(d2,alpha);//d2^alpha CGFloat d3_a = pow(d3,alpha);//d3^alpha - CGFloat d1_2a = pow(d1_a,2);//d1^alpha^2 = d1^2*alpha - CGFloat d2_2a = pow(d2_a,2);//d2^2alpha - CGFloat d3_2a = pow(d3_a,2); + CGFloat d1_2a = pow(d1_a,CPTFloat(2));//d1^alpha^2 = d1^2*alpha + CGFloat d2_2a = pow(d2_a,CPTFloat(2));//d2^2alpha + CGFloat d3_2a = pow(d3_a,CPTFloat(2)); //calculate the control points //see : http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf under point 3. From 1b47d78cb525e213eee1277fc08e2d972ef869cb Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 17:36:30 -0400 Subject: [PATCH 173/429] Use HTTPS to download stock data to satisfy App Transport Security. --- examples/AAPLot/APYahooDataPuller.m | 2 +- examples/StockPlot/Classes/APYahooDataPuller.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 555f69d7b..33301b570 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -182,7 +182,7 @@ -(NSString *)URL NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index fdf3bb3a4..9b5c5c35c 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -198,7 +198,7 @@ -(NSString *)URL NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"http://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; From 6d63e591cca54ffdc30a4316731c73bc548ce4ff Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 19:40:28 -0400 Subject: [PATCH 174/429] Added nullability annotations in all example apps. --- QCPlugin/CPTBarPlotPlugin.m | 10 +- QCPlugin/CPTPieChartPlugin.h | 4 +- QCPlugin/CPTPieChartPlugin.m | 16 +-- QCPlugin/CPTScatterPlotPlugin.m | 10 +- QCPlugin/CorePlotQCPlugin.h | 18 +-- QCPlugin/CorePlotQCPlugin.m | 46 +++--- examples/AAPLot/APFinancialData.h | 2 +- examples/AAPLot/APFinancialData.m | 2 +- examples/AAPLot/APYahooDataPuller.h | 32 +++-- examples/AAPLot/APYahooDataPuller.m | 136 +++++++++++------- examples/AAPLot/Classes/AAPLotAppDelegate.h | 4 +- examples/AAPLot/Classes/AAPLotAppDelegate.m | 2 +- examples/AAPLot/Classes/FlipsideView.m | 2 +- examples/AAPLot/Classes/MainViewController.h | 2 +- examples/AAPLot/Classes/MainViewController.m | 20 +-- examples/AAPLot/Classes/RootViewController.h | 8 +- examples/AAPLot/Classes/RootViewController.m | 10 +- examples/AAPLot/NSDateFormatterExtensions.h | 2 +- examples/AAPLot/NSDateFormatterExtensions.m | 2 +- .../Classes/CPTTestApp_iPadAppDelegate.h | 4 +- .../Classes/CPTTestApp_iPadAppDelegate.m | 2 +- .../Classes/CPTTestApp_iPadViewController.h | 4 +- .../Classes/CPTTestApp_iPadViewController.m | 22 +-- .../Classes/ScatterPlotController.swift | 2 +- .../CPTTestApp/Source/AxisDemoController.m | 2 +- .../Source/CPTPlotSymbolTestController.m | 10 +- examples/CPTTestApp/Source/Controller.h | 28 ++-- examples/CPTTestApp/Source/Controller.m | 59 ++++---- examples/CPTTestApp/Source/RotationView.h | 2 +- examples/CPTTestApp/Source/RotationView.m | 10 +- .../Source/SelectionDemoController.m | 16 +-- .../CorePlotGallery/src/ios/AppDelegate.h | 2 +- .../CorePlotGallery/src/ios/AppDelegate.m | 2 +- .../src/ios/DetailViewController.h | 10 +- .../src/ios/DetailViewController.m | 39 ++--- .../src/ios/RootViewController.m | 21 +-- .../src/ios/ThemeTableViewController.h | 8 +- .../src/ios/ThemeTableViewController.m | 12 +- .../src/mac/PlotGalleryController.h | 6 +- .../src/mac/PlotGalleryController.m | 43 +++--- examples/CorePlotGallery/src/mac/PlotView.h | 2 +- examples/CorePlotGallery/src/mac/PlotView.m | 2 +- .../src/mac/Plot_Gallery_MacAppDelegate.h | 2 +- .../src/mac/Plot_Gallery_MacAppDelegate.m | 2 +- examples/CorePlotGallery/src/plots/AxisDemo.m | 6 +- .../src/plots/CandlestickPlot.h | 4 +- .../src/plots/CandlestickPlot.m | 26 ++-- .../src/plots/ColoredBarChart.m | 14 +- .../CorePlotGallery/src/plots/CompositePlot.h | 10 +- .../CorePlotGallery/src/plots/CompositePlot.m | 59 ++++---- .../CorePlotGallery/src/plots/ControlChart.m | 10 +- .../src/plots/CurvedScatterPlot.m | 44 +++--- examples/CorePlotGallery/src/plots/DatePlot.m | 10 +- .../CorePlotGallery/src/plots/DonutChart.h | 4 +- .../CorePlotGallery/src/plots/DonutChart.m | 26 ++-- .../CorePlotGallery/src/plots/FunctionPlot.m | 43 +++--- .../src/plots/GradientScatterPlot.m | 18 +-- .../CorePlotGallery/src/plots/ImageDemo.m | 4 +- .../src/plots/LabelingPolicyDemo.m | 4 +- .../CorePlotGallery/src/plots/LineCapDemo.m | 4 +- examples/CorePlotGallery/src/plots/OHLCPlot.h | 3 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 14 +- .../CorePlotGallery/src/plots/PlotSpaceDemo.m | 4 +- .../CorePlotGallery/src/plots/RangePlot.h | 4 +- .../CorePlotGallery/src/plots/RangePlot.m | 23 +-- .../CorePlotGallery/src/plots/RealTimePlot.h | 2 +- .../CorePlotGallery/src/plots/RealTimePlot.m | 27 ++-- .../src/plots/SimplePieChart.m | 26 ++-- .../src/plots/SimpleScatterPlot.m | 24 ++-- .../src/plots/SteppedScatterPlot.m | 12 +- .../src/plots/VerticalBarChart.m | 14 +- .../src/shared/PiNumberFormatter.m | 2 +- .../CorePlotGallery/src/shared/PlotGallery.h | 8 +- .../CorePlotGallery/src/shared/PlotGallery.m | 10 +- .../CorePlotGallery/src/shared/PlotItem.h | 34 ++--- .../CorePlotGallery/src/shared/PlotItem.m | 22 +-- examples/DropPlot/CPTPlotDocument.h | 4 +- examples/DropPlot/CPTPlotDocument.m | 32 ++--- examples/MinorTickLabels/Controller.m | 10 +- examples/RangePlot/Controller.m | 16 +-- .../StockPlot/Classes/APYahooDataPuller.h | 34 ++--- .../StockPlot/Classes/APYahooDataPuller.m | 115 +++++++++------ .../Classes/APYahooDataPullerGraph.h | 4 +- .../Classes/APYahooDataPullerGraph.m | 8 +- .../Classes/NSDictionary+APFinancialData.h | 2 +- .../Classes/NSDictionary+APFinancialData.m | 10 +- .../StockPlot/Classes/RootViewController.h | 4 +- .../StockPlot/Classes/RootViewController.m | 34 ++--- .../StockPlot/Classes/StockPlotAppDelegate.h | 4 +- .../StockPlot/Classes/StockPlotAppDelegate.m | 4 +- framework/Source/CPTFunctionDataSource.m | 2 +- 91 files changed, 783 insertions(+), 655 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 5b4727635..1c76128da 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -27,7 +27,7 @@ @implementation CPTBarPlotPlugIn */ @dynamic inputBaseValue, inputBarOffset, inputBarWidth, inputHorizontalBars; -+(NSDictionary *)attributes ++(nonnull NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Bar Chart", @@ -35,7 +35,7 @@ @implementation CPTBarPlotPlugIn }; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(nonnull CPTDictionary)attributesForPropertyPortWithKey:(nonnull NSString *)key { // A few additional ports for the bar plot chart type ... @@ -177,7 +177,7 @@ -(BOOL)configurePlots plot.barWidth = @(barWidth); plot.barOffset = @(self.inputBarOffset); plot.barsAreHorizontal = self.inputHorizontalBars; - plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:(CGColorRef)[self areaFillColor:index]]]; + plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:[self areaFillColor:index]]]; [plot reloadData]; } @@ -188,7 +188,7 @@ -(BOOL)configurePlots #pragma mark - #pragma mark Data source methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; @@ -196,7 +196,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return [[self valueForInputKey:key] count]; } --(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange +-(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; diff --git a/QCPlugin/CPTPieChartPlugin.h b/QCPlugin/CPTPieChartPlugin.h index fbe9781eb..4700d9951 100644 --- a/QCPlugin/CPTPieChartPlugin.h +++ b/QCPlugin/CPTPieChartPlugin.h @@ -8,7 +8,7 @@ @property (readwrite, assign) double inputStartAngle; @property (readwrite, assign) NSUInteger inputSliceDirection; @property (readwrite, assign) double inputBorderWidth; -@property (readwrite, assign) CGColorRef inputBorderColor; -@property (readwrite, assign) CGColorRef inputLabelColor; +@property (readwrite, assign, nonnull) CGColorRef inputBorderColor; +@property (readwrite, assign, nonnull) CGColorRef inputLabelColor; @end diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index 3089cd0c1..c3dc4a7e8 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -25,7 +25,7 @@ @implementation CPTPieChartPlugIn */ @dynamic inputPieRadius, inputSliceLabelOffset, inputStartAngle, inputSliceDirection; -+(NSDictionary *)attributes ++(nonnull NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Pie Chart", @@ -55,19 +55,19 @@ -(double)inputYMin // Pie charts only support one layer so we override the createViewController method (to hide the number of charts button) --(QCPlugInViewController *)createViewController +-(nullable QCPlugInViewController *)createViewController { return nil; } -+(CPTStringArray)sortedPropertyPortKeys ++(nonnull CPTStringArray)sortedPropertyPortKeys { CPTStringArray pieChartPropertyPortKeys = @[@"inputPieRadius", @"inputSliceLabelOffset", @"inputStartAngle", @"inputSliceDirection", @"inputBorderColor", @"inputBorderWidth"]; return [[super sortedPropertyPortKeys] arrayByAddingObjectsFromArray:pieChartPropertyPortKeys]; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(nonnull CPTDictionary)attributesForPropertyPortWithKey:(nonnull NSString *)key { // A few additional ports for the pie chart type ... if ( [key isEqualToString:@"inputPieRadius"] ) { @@ -216,7 +216,7 @@ -(BOOL)configurePlots #pragma mark - #pragma mark Data source methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; @@ -224,7 +224,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return [[self valueForInputKey:key] count]; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; @@ -239,7 +239,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI } } --(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(nullable CPTFill *)sliceFillForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { CGColorRef plotFillColor = [[CPTPieChart defaultPieSliceColorForIndex:index] cgColor]; CGColorRef inputFillColor = (CGColorRef)[self areaFillColor:0]; @@ -259,7 +259,7 @@ -(CPTFill *)sliceFillForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger return [[CPTFill alloc] initWithColor:fillCPColor]; } --(CPTTextLayer *)sliceLabelForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(nullable CPTTextLayer *)sliceLabelForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:pieChart]; NSString *key = [NSString stringWithFormat:@"plotLabels%lu", (unsigned long)plotIndex]; diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index 9dd7acb06..a09623e69 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -22,7 +22,7 @@ @implementation CPTScatterPlotPlugIn @dynamic inputXMin, inputXMax, inputYMin, inputYMax; @dynamic inputXMajorIntervals, inputYMajorIntervals, inputXMinorIntervals, inputYMinorIntervals; -+(NSDictionary *)attributes ++(nonnull NSDictionary *)attributes { return @{ QCPlugInAttributeNameKey: @"Core Plot Scatter Plot", @@ -127,7 +127,7 @@ -(void)removePlots:(NSUInteger)count } } --(CPTPlotSymbol *)plotSymbol:(NSUInteger)index +-(nullable CPTPlotSymbol *)plotSymbol:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotDataSymbols%lu", (unsigned long)index]; NSUInteger value = [[self valueForInputKey:key] unsignedIntegerValue]; @@ -168,7 +168,7 @@ -(CPTPlotSymbol *)plotSymbol:(NSUInteger)index } } --(CGColorRef)dataSymbolColor:(NSUInteger)index +-(nonnull CGColorRef)dataSymbolColor:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotDataSymbolColor%lu", (unsigned long)index]; @@ -204,7 +204,7 @@ -(BOOL)configurePlots #pragma mark - #pragma mark Data source methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; @@ -223,7 +223,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return xVals.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *xKey = [NSString stringWithFormat:@"plotXNumbers%lu", (unsigned long)plotIndex]; diff --git a/QCPlugin/CorePlotQCPlugin.h b/QCPlugin/CorePlotQCPlugin.h index c5359b7ca..1a24245b4 100644 --- a/QCPlugin/CorePlotQCPlugin.h +++ b/QCPlugin/CorePlotQCPlugin.h @@ -3,18 +3,18 @@ @interface CorePlotQCPlugIn : QCPlugIn -@property (readwrite, strong) CPTGraph *graph; +@property (readwrite, strong, nullable) CPTGraph *graph; -@property (readwrite, assign) id outputImage; +@property (readwrite, assign, nonnull) id outputImage; @property (readwrite, assign) NSUInteger numberOfPlots; @property (readwrite, assign) NSUInteger inputPixelsWide; @property (readwrite, assign) NSUInteger inputPixelsHigh; -@property (readwrite, assign) CGColorRef inputPlotAreaColor; +@property (readwrite, assign, nonnull) CGColorRef inputPlotAreaColor; -@property (readwrite, assign) CGColorRef inputAxisColor; +@property (readwrite, assign, nonnull) CGColorRef inputAxisColor; @property (readwrite, assign) double inputAxisLineWidth; @property (readwrite, assign) double inputAxisMajorTickWidth; @property (readwrite, assign) double inputAxisMinorTickWidth; @@ -41,14 +41,14 @@ -(BOOL)configurePlots; -(BOOL)configureAxis; --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot; --(CGColorRef)newDefaultColorForPlot:(NSUInteger)index alpha:(CGFloat)alpha; +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot; +-(nonnull CGColorRef)newDefaultColorForPlot:(NSUInteger)index alpha:(CGFloat)alpha; -(void)freeResources; --(CGColorRef)dataLineColor:(NSUInteger)index; +-(nonnull CGColorRef)dataLineColor:(NSUInteger)index; -(CGFloat)dataLineWidth:(NSUInteger)index; --(CGColorRef)areaFillColor:(NSUInteger)index; --(CGImageRef)newAreaFillImage:(NSUInteger)index; +-(nonnull CGColorRef)areaFillColor:(NSUInteger)index; +-(nonnull CGImageRef)newAreaFillImage:(NSUInteger)index; @end diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index 8b34bea00..bfc81275b 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -8,18 +8,18 @@ @interface CorePlotQCPlugIn() -@property (nonatomic, readwrite, strong) NSMutableData *imageData; -@property (nonatomic, readwrite, assign) CGContextRef bitmapContext; -@property (nonatomic, readwrite, strong) id imageProvider; +@property (nonatomic, readwrite, strong, nullable) NSMutableData *imageData; +@property (nonatomic, readwrite, assign, nullable) CGContextRef bitmapContext; +@property (nonatomic, readwrite, strong, nonnull) id imageProvider; -void drawErrorText(CGContextRef context, CGRect rect); +void drawErrorText(CGContextRef __nonnull context, CGRect rect); @end #pragma mark - // Draws the string "ERROR" in the given context in big red letters -void drawErrorText(CGContextRef context, CGRect rect) +void drawErrorText(CGContextRef __nonnull context, CGRect rect) { CGContextSaveGState(context); @@ -83,7 +83,7 @@ @implementation CorePlotQCPlugIn */ @synthesize numberOfPlots; -+(NSDictionary *)attributes ++(nonnull NSDictionary *)attributes { /* * Return a dictionary of attributes describing the plug-in (QCPlugInAttributeNameKey, QCPlugInAttributeDescriptionKey...). @@ -113,7 +113,7 @@ +(QCPlugInTimeMode)timeMode return kQCPlugInTimeModeNone; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { /* @@ -149,7 +149,7 @@ -(void)freeResources self.graph = nil; } --(QCPlugInViewController *)createViewController +-(nullable QCPlugInViewController *)createViewController { /* * Return a new QCPlugInViewController to edit the internal settings of this plug-in instance. @@ -162,7 +162,7 @@ -(QCPlugInViewController *)createViewController #pragma mark - #pragma mark Input and output port configuration -+(CPTStringArray)sortedPropertyPortKeys ++(nonnull CPTStringArray)sortedPropertyPortKeys { return @[@"inputPixelsWide", @"inputPixelsHigh", @@ -186,7 +186,7 @@ +(CPTStringArray)sortedPropertyPortKeys @"inputAxisMinorTickWidth"]; } -+(CPTDictionary)attributesForPropertyPortWithKey:(NSString *)key ++(nonnull CPTDictionary)attributesForPropertyPortWithKey:(nonnull NSString *)key { /* * Specify the optional attributes for property based ports (QCPortAttributeNameKey, QCPortAttributeDefaultValueKey...). @@ -380,7 +380,7 @@ -(void)createGraph } } --(CGColorRef)newDefaultColorForPlot:(NSUInteger)index alpha:(CGFloat)alpha +-(nonnull CGColorRef)newDefaultColorForPlot:(NSUInteger)index alpha:(CGFloat)alpha { CGColorRef color; @@ -497,7 +497,7 @@ -(BOOL)configureAxis return YES; } --(CGColorRef)dataLineColor:(NSUInteger)index +-(nonnull CGColorRef)dataLineColor:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotDataLineColor%lu", (unsigned long)index]; @@ -513,14 +513,14 @@ -(CGFloat)dataLineWidth:(NSUInteger)index return inputValue.doubleValue; } --(CGColorRef)areaFillColor:(NSUInteger)index +-(nonnull CGColorRef)areaFillColor:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotFillColor%lu", (unsigned long)index]; return (__bridge CGColorRef)([self valueForInputKey:key]); } --(CGImageRef)newAreaFillImage:(NSUInteger)index +-(nonnull CGImageRef)newAreaFillImage:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotFillImage%lu", (unsigned long)index]; @@ -563,12 +563,12 @@ -(CGImageRef)newAreaFillImage:(NSUInteger)index return imageRef; } -static void _BufferReleaseCallback(const void *address, void *context) +static void _BufferReleaseCallback(const void *__nonnull address, void *__nonnull context) { // Don't do anything. We release the buffer manually when it's recreated or during dealloc } --(void)createImageResourcesWithContext:(id)context +-(void)createImageResourcesWithContext:(nonnull id)context { // Create a CG bitmap for drawing. The image data is released when QC calls _BufferReleaseCallback CGSize boundsSize = self.graph.bounds.size; @@ -639,12 +639,12 @@ -(void)createImageResourcesWithContext:(id)context #pragma mark - #pragma mark Data source methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return 0; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return @0; } @@ -671,12 +671,12 @@ -(void)setNumberOfPlots:(NSUInteger)number numberOfPlots = number; } -+(CPTStringArray)plugInKeys ++(nonnull CPTStringArray)plugInKeys { return @[@"numberOfPlots"]; } --(id)serializedValueForKey:(NSString *)key +-(nonnull id)serializedValueForKey:(nonnull NSString *)key { /* * Provide custom serialization for the plug-in internal settings that are not values complying to the protocol. @@ -691,7 +691,7 @@ -(id)serializedValueForKey:(NSString *)key } } --(void)setSerializedValue:(id)serializedValue forKey:(NSString *)key +-(void)setSerializedValue:(nonnull id)serializedValue forKey:(nonnull NSString *)key { /* * Provide deserialization for the plug-in internal settings that were custom serialized in -serializedValueForKey. @@ -709,7 +709,7 @@ -(void)setSerializedValue:(id)serializedValue forKey:(NSString *)key #pragma mark - #pragma mark Accessors --(void)setBitmapContext:(CGContextRef)newContext +-(void)setBitmapContext:(nullable CGContextRef)newContext { if ( newContext != bitmapContext ) { CGContextRelease(bitmapContext); @@ -795,7 +795,7 @@ -(BOOL)configureGraph @implementation CorePlotQCPlugIn(Execution) --(BOOL)execute:(id)context atTime:(NSTimeInterval)time withArguments:(CPTDictionary)arguments +-(BOOL)execute:(nonnull id)context atTime:(NSTimeInterval)time withArguments:(nullable CPTDictionary)arguments { // Configure the plot for drawing BOOL configurationCheck = [self configureGraph]; diff --git a/examples/AAPLot/APFinancialData.h b/examples/AAPLot/APFinancialData.h index 6ede21860..9a2509602 100644 --- a/examples/AAPLot/APFinancialData.h +++ b/examples/AAPLot/APFinancialData.h @@ -2,6 +2,6 @@ @interface NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; ++(nonnull CPTDictionary)dictionaryWithCSVLine:(nonnull NSString *)csvLine; @end diff --git a/examples/AAPLot/APFinancialData.m b/examples/AAPLot/APFinancialData.m index cce58345d..3d32947d0 100644 --- a/examples/AAPLot/APFinancialData.m +++ b/examples/AAPLot/APFinancialData.m @@ -3,7 +3,7 @@ @implementation NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine ++(nonnull CPTDictionary)dictionaryWithCSVLine:(nonnull NSString *)csvLine { CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; diff --git a/examples/AAPLot/APYahooDataPuller.h b/examples/AAPLot/APYahooDataPuller.h index 123d6e07c..b2598d1d0 100644 --- a/examples/AAPLot/APYahooDataPuller.h +++ b/examples/AAPLot/APYahooDataPuller.h @@ -4,30 +4,32 @@ typedef NSArray *CPTFinancialDataArray; -@protocol APYahooDataPullerDelegate +@protocol APYahooDataPullerDelegate @optional --(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp; +-(void)dataPullerDidFinishFetch:(nonnull APYahooDataPuller *)dp; @end +#pragma mark - + @interface APYahooDataPuller : NSObject -@property (nonatomic, readwrite, weak) id delegate; -@property (nonatomic, readwrite, copy) NSString *symbol; -@property (nonatomic, readwrite, strong) NSDate *startDate; -@property (nonatomic, readwrite, strong) NSDate *endDate; -@property (nonatomic, readwrite, copy) NSString *targetSymbol; -@property (nonatomic, readwrite, strong) NSDate *targetStartDate; -@property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallVolumeHigh; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallVolumeLow; +@property (nonatomic, readwrite, weak, nullable) id delegate; +@property (nonatomic, readwrite, copy, nonnull) NSString *symbol; +@property (nonatomic, readwrite, strong, nonnull) NSDate *startDate; +@property (nonatomic, readwrite, strong, nonnull) NSDate *endDate; +@property (nonatomic, readwrite, copy, nonnull) NSString *targetSymbol; +@property (nonatomic, readwrite, strong, nonnull) NSDate *targetStartDate; +@property (nonatomic, readwrite, strong, nonnull) NSDate *targetEndDate; +@property (nonatomic, readonly, strong, nonnull) CPTFinancialDataArray financialData; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallHigh; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallLow; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallVolumeHigh; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallVolumeLow; @property (nonatomic, readonly, assign) BOOL loadingData; --(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate; +-(nonnull instancetype)initWithTargetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate; @end diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 33301b570..9df469247 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -3,20 +3,28 @@ @interface APYahooDataPuller() -@property (nonatomic, readwrite, copy) NSString *csvString; +@property (nonatomic, readwrite, copy, nonnull) NSString *csvString; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallHigh; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeHigh; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallVolumeLow; -@property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallHigh; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallLow; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallVolumeHigh; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallVolumeLow; +@property (nonatomic, readwrite, strong, nonnull) CPTFinancialDataArray financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; -@property (nonatomic, readwrite, strong) NSMutableData *receivedData; -@property (nonatomic, readwrite, strong) NSURLConnection *connection; +@property (nonatomic, readwrite, strong, nullable) NSMutableData *receivedData; +@property (nonatomic, readwrite, strong, nullable) NSURLConnection *connection; +-(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate; + +-(nonnull CPTDictionary)plistRep; +-(BOOL)writeToFile:(nonnull NSString *)path atomically:(BOOL)flag; -(void)fetch; --(NSString *)URL; +-(BOOL)shouldDownload; +-(nonnull NSString *)pathForSymbol:(nonnull NSString *)aSymbol; +-(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol; +-(nonnull CPTDictionary)dictionaryForSymbol:(nonnull NSString *)aSymbol; +-(nonnull NSString *)URL; -(void)notifyPulledData; -(void)parseCSVAndPopulate; @@ -54,7 +62,7 @@ @implementation APYahooDataPuller @synthesize delegate; --(void)setDelegate:(id)aDelegate +-(void)setDelegate:(id)aDelegate { if ( delegate != aDelegate ) { delegate = aDelegate; @@ -64,7 +72,7 @@ -(void)setDelegate:(id)aDelegate } } --(CPTDictionary)plistRep +-(nonnull CPTDictionary)plistRep { CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; @@ -80,34 +88,46 @@ -(CPTDictionary)plistRep return [NSDictionary dictionaryWithDictionary:rep]; } --(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag +-(BOOL)writeToFile:(nonnull NSString *)path atomically:(BOOL)flag { NSLog(@"writeToFile:%@", path); BOOL success = [[self plistRep] writeToFile:path atomically:flag]; return success; } --(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate { self = [super init]; if ( self != nil ) { - self.symbol = aDict[@"symbol"]; - self.startDate = aDict[@"startDate"]; - self.overallLow = [NSDecimalNumber decimalNumberWithDecimal:[aDict[@"overallLow"] decimalValue]]; - self.overallHigh = [NSDecimalNumber decimalNumberWithDecimal:[aDict[@"overallHigh"] decimalValue]]; - self.endDate = aDict[@"endDate"]; - self.financialData = aDict[@"financialData"]; + NSString *theSymbol = aDict[@"symbol"]; + self.symbol = theSymbol ? theSymbol : @""; + NSDate *theStartDate = aDict[@"startDate"]; + self.startDate = theStartDate ? theStartDate : [NSDate date]; + NSDate *theEndDate = aDict[@"endDate"]; + self.endDate = theEndDate ? theEndDate : [NSDate date]; + NSNumber *low = aDict[@"overallLow"]; + self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[low decimalValue]] : [NSDecimalNumber notANumber]; + NSNumber *high = aDict[@"overallHigh"]; + self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[high decimalValue]] : [NSDecimalNumber notANumber]; + NSNumber *volumeLow = aDict[@"overallVolumeLow"]; + self.overallVolumeLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[volumeLow decimalValue]] : [NSDecimalNumber notANumber]; + NSNumber *volumeHigh = aDict[@"overallVolumeHigh"]; + self.overallVolumeHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[volumeHigh decimalValue]] : [NSDecimalNumber notANumber]; + CPTFinancialDataArray dataArray = aDict[@"financialData"]; + self.financialData = dataArray ? dataArray : [[NSArray alloc] init]; self.targetSymbol = aSymbol; self.targetStartDate = aStartDate; self.targetEndDate = anEndDate; - self.csvString = @""; + + self.csvString = @""; + [self performSelector:@selector(fetch) withObject:nil afterDelay:0.01]; } return self; } --(NSString *)pathForSymbol:(NSString *)aSymbol +-(nonnull NSString *)pathForSymbol:(nonnull NSString *)aSymbol { CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; @@ -116,7 +136,7 @@ -(NSString *)pathForSymbol:(NSString *)aSymbol return docPath; } --(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol +-(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol { NSString *docPath = [self pathForSymbol:aSymbol]; @@ -128,7 +148,7 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } // Always returns *something* --(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol +-(nonnull CPTDictionary)dictionaryForSymbol:(nonnull NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; @@ -137,7 +157,7 @@ -(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol return localPlistDict; } --(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(nonnull instancetype)initWithTargetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate { CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; @@ -146,17 +166,19 @@ -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate } CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; - rep[@"symbol"] = aSymbol; - rep[@"startDate"] = aStartDate; - rep[@"endDate"] = anEndDate; - rep[@"overallHigh"] = [NSDecimalNumber notANumber]; - rep[@"overallLow"] = [NSDecimalNumber notANumber]; - rep[@"financialData"] = @[]; + rep[@"symbol"] = aSymbol; + rep[@"startDate"] = aStartDate; + rep[@"endDate"] = anEndDate; + rep[@"overallHigh"] = [NSDecimalNumber notANumber]; + rep[@"overallLow"] = [NSDecimalNumber notANumber]; + rep[@"overallVolumeHigh"] = [NSDecimalNumber notANumber]; + rep[@"overallVolumeLow"] = [NSDecimalNumber notANumber]; + rep[@"financialData"] = @[]; return [self initWithDictionary:rep targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } --(instancetype)init +-(nonnull instancetype)init { NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; @@ -172,35 +194,45 @@ -(void)dealloc } // http://www.goldb.org/ystockquote.html --(NSString *)URL +-(nonnull NSString *)URL { - unsigned int unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitYear; + NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitYear; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; - NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + NSDate *tStartDate = self.targetStartDate; + + if ( tStartDate ) { + NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:tStartDate]; + + url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + } + + NSDate *tEndDate = self.targetEndDate; + if ( tEndDate ) { + NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:tEndDate]; + + url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + } - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; url = [url stringByAppendingString:@"g=d&"]; url = [url stringByAppendingString:@"ignore=.csv"]; url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return url; } -(void)notifyPulledData { - id theDelegate = self.delegate; + id theDelegate = self.delegate; if ( [theDelegate respondsToSelector:@selector(dataPullerDidFinishFetch:)] ) { [theDelegate performSelector:@selector(dataPullerDidFinishFetch:) withObject:self]; @@ -245,13 +277,13 @@ -(void)fetch } } --(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data +-(void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data { // append the new data to the receivedData [self.receivedData appendData:data]; } --(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response +-(void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response { // this method is called when the server has determined that it // has enough information to create the NSURLResponse @@ -271,7 +303,7 @@ -(void)cancelDownload } } --(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error +-(void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error { self.loadingData = NO; self.receivedData = nil; @@ -280,13 +312,19 @@ -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro // TODO:report err } --(void)connectionDidFinishLoading:(NSURLConnection *)connection +-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection { self.loadingData = NO; self.connection = nil; - NSString *csv = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; - self.csvString = csv; + NSMutableData *data = self.receivedData; + if ( data ) { + NSString *csv = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + self.csvString = csv; + } + else { + self.csvString = @""; + } self.receivedData = nil; [self parseCSVAndPopulate]; diff --git a/examples/AAPLot/Classes/AAPLotAppDelegate.h b/examples/AAPLot/Classes/AAPLotAppDelegate.h index 4137a735c..13e1ab5d5 100644 --- a/examples/AAPLot/Classes/AAPLotAppDelegate.h +++ b/examples/AAPLot/Classes/AAPLotAppDelegate.h @@ -12,7 +12,7 @@ @interface AAPLotAppDelegate : NSObject -@property (nonatomic, strong) IBOutlet UIWindow *window; -@property (nonatomic, strong) IBOutlet RootViewController *rootViewController; +@property (nonatomic, strong, nullable) IBOutlet UIWindow *window; +@property (nonatomic, strong, nullable) IBOutlet RootViewController *rootViewController; @end diff --git a/examples/AAPLot/Classes/AAPLotAppDelegate.m b/examples/AAPLot/Classes/AAPLotAppDelegate.m index 403119616..0ab940279 100644 --- a/examples/AAPLot/Classes/AAPLotAppDelegate.m +++ b/examples/AAPLot/Classes/AAPLotAppDelegate.m @@ -14,7 +14,7 @@ @implementation AAPLotAppDelegate @synthesize window; @synthesize rootViewController; --(void)applicationDidFinishLaunching:(UIApplication *)application +-(void)applicationDidFinishLaunching:(nonnull UIApplication *)application { self.window.rootViewController = self.rootViewController; [self.window makeKeyAndVisible]; diff --git a/examples/AAPLot/Classes/FlipsideView.m b/examples/AAPLot/Classes/FlipsideView.m index 2c582d751..179b28f9d 100644 --- a/examples/AAPLot/Classes/FlipsideView.m +++ b/examples/AAPLot/Classes/FlipsideView.m @@ -10,7 +10,7 @@ @implementation FlipsideView --(instancetype)initWithFrame:(CGRect)frame +-(nonnull instancetype)initWithFrame:(CGRect)frame { if ( (self = [super initWithFrame:frame]) ) { // Initialization code diff --git a/examples/AAPLot/Classes/MainViewController.h b/examples/AAPLot/Classes/MainViewController.h index f907b8530..ef107f67a 100644 --- a/examples/AAPLot/Classes/MainViewController.h +++ b/examples/AAPLot/Classes/MainViewController.h @@ -8,6 +8,6 @@ @interface MainViewController : UIViewController -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *graphHost; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *graphHost; @end diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index 0e45eed38..d1951f24c 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -6,8 +6,8 @@ @interface MainViewController() -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) APYahooDataPuller *datapuller; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) APYahooDataPuller *datapuller; @end @@ -125,7 +125,7 @@ -(void)viewDidLoad [super viewDidLoad]; } --(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +-(nonnull instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) { } @@ -135,14 +135,14 @@ -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBu #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.datapuller.financialData.count; } #if ROWS_FIRST_DATA_ORDER --(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange +-(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange { CPTFinancialDataArray financialData = self.datapuller.financialData; const NSUInteger financialDataCount = financialData.count; @@ -363,7 +363,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa #else --(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRange +-(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange { CPTFinancialDataArray financialData = self.datapuller.financialData; const NSUInteger financialDataCount = financialData.count; @@ -583,7 +583,7 @@ -(CPTNumericData *)dataForPlot:(CPTPlot *)plot recordIndexRange:(NSRange)indexRa } #endif --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { if ( ![(NSString *) plot.identifier isEqualToString:@"OHLC"] ) { return (id)[NSNull null]; // Don't show any label @@ -596,7 +596,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index } } --(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp +-(void)dataPullerDidFinishFetch:(nonnull APYahooDataPuller *)dp { static CPTAnimationOperation *animationOperation = nil; @@ -642,7 +642,6 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp NSDecimalNumber *volumeLengthDisplayLocation = [volumeLength decimalNumberByAdding:volumeLengthDisplacementValue]; volumePlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:@0.0 length:@(thePuller.financialData.count + 1)]; -// volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation]; if ( animationOperation ) { [[CPTAnimation sharedInstance] removeAnimationOperation:animationOperation]; @@ -657,6 +656,9 @@ -(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp length:volumeLengthDisplayLocation] duration:2.5]; } + else { + volumePlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation]; + } axisSet.xAxis.orthogonalPosition = low; axisSet.yAxis.majorIntervalLength = @50.0; diff --git a/examples/AAPLot/Classes/RootViewController.h b/examples/AAPLot/Classes/RootViewController.h index 5cacc5b83..0c2f2d472 100644 --- a/examples/AAPLot/Classes/RootViewController.h +++ b/examples/AAPLot/Classes/RootViewController.h @@ -13,10 +13,10 @@ @interface RootViewController : UIViewController -@property (nonatomic, strong) IBOutlet UIButton *infoButton; -@property (nonatomic, strong) MainViewController *mainViewController; -@property (nonatomic, strong) UINavigationBar *flipsideNavigationBar; -@property (nonatomic, strong) FlipsideViewController *flipsideViewController; +@property (nonatomic, strong, nullable) IBOutlet UIButton *infoButton; +@property (nonatomic, strong, nonnull) MainViewController *mainViewController; +@property (nonatomic, strong, nonnull) UINavigationBar *flipsideNavigationBar; +@property (nonatomic, strong, nonnull) FlipsideViewController *flipsideViewController; -(IBAction)toggleView; diff --git a/examples/AAPLot/Classes/RootViewController.m b/examples/AAPLot/Classes/RootViewController.m index ab9c6cce8..fc8ab4c27 100644 --- a/examples/AAPLot/Classes/RootViewController.m +++ b/examples/AAPLot/Classes/RootViewController.m @@ -23,7 +23,10 @@ -(void)viewDidLoad MainViewController *viewController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; self.mainViewController = viewController; - [self.view insertSubview:self.mainViewController.view belowSubview:self.infoButton]; + UIButton *button = self.infoButton; + if ( button ) { + [self.view insertSubview:viewController.view belowSubview:button]; + } self.mainViewController.view.frame = self.view.bounds; } @@ -82,7 +85,10 @@ -(IBAction)toggleView [flipsideView removeFromSuperview]; [self.flipsideNavigationBar removeFromSuperview]; [self.view addSubview:mainView]; - [self.view insertSubview:self.infoButton aboveSubview:self.mainViewController.view]; + UIButton *button = self.infoButton; + if ( button ) { + [self.view insertSubview:button aboveSubview:self.mainViewController.view]; + } [self.flipsideViewController viewDidDisappear:YES]; [self.mainViewController viewDidAppear:YES]; } diff --git a/examples/AAPLot/NSDateFormatterExtensions.h b/examples/AAPLot/NSDateFormatterExtensions.h index 2deb1696c..380cd36e4 100644 --- a/examples/AAPLot/NSDateFormatterExtensions.h +++ b/examples/AAPLot/NSDateFormatterExtensions.h @@ -2,6 +2,6 @@ @interface NSDateFormatter(APExtensions) -+(NSDateFormatter *)csvDateFormatter; ++(nonnull NSDateFormatter *)csvDateFormatter; @end diff --git a/examples/AAPLot/NSDateFormatterExtensions.m b/examples/AAPLot/NSDateFormatterExtensions.m index 9bb5989a1..cf1b0970d 100644 --- a/examples/AAPLot/NSDateFormatterExtensions.m +++ b/examples/AAPLot/NSDateFormatterExtensions.m @@ -2,7 +2,7 @@ @implementation NSDateFormatter(APExtensions) -+(NSDateFormatter *)csvDateFormatter ++(nonnull NSDateFormatter *)csvDateFormatter { static NSDateFormatter *df = nil; static dispatch_once_t onceToken = 0; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h index 42261c864..728b16a7b 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.h @@ -11,7 +11,7 @@ @interface CPTTestApp_iPadAppDelegate : NSObject -@property (nonatomic, readwrite, strong) IBOutlet UIWindow *window; -@property (nonatomic, readwrite, strong) IBOutlet CPTTestApp_iPadViewController *viewController; +@property (nonatomic, readwrite, strong, nullable) IBOutlet UIWindow *window; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTTestApp_iPadViewController *viewController; @end diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m index 9f89da1a0..d1ef49dc7 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m @@ -13,7 +13,7 @@ @implementation CPTTestApp_iPadAppDelegate @synthesize window; @synthesize viewController; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions +-(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOptions:(nullable CPTDictionary)launchOptions { self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h index 76c78dcd5..fe12845c9 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h @@ -10,8 +10,8 @@ @interface CPTTestApp_iPadViewController : UIViewController -@property (nonatomic, readwrite, strong) CPTNumberArray dataForChart; -@property (nonatomic, readwrite, strong) NSArray *dataForPlot; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray dataForChart; +@property (nonatomic, readwrite, strong, nonnull) NSArray *dataForPlot; // Plot construction methods -(void)constructScatterPlot; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 179693462..eeed42c8b 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -10,15 +10,15 @@ @interface CPTTestApp_iPadViewController() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *scatterPlotView; -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *barChartView; -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *pieChartView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *scatterPlotView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *barChartView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *pieChartView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) CPTXYGraph *barChart; -@property (nonatomic, readwrite, strong) CPTXYGraph *pieGraph; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *barChart; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *pieGraph; -@property (nonatomic, readwrite, strong) CPTPieChart *piePlot; +@property (nonatomic, readwrite, strong, nonnull) CPTPieChart *piePlot; @property (nonatomic, readwrite, assign) BOOL piePlotIsRotating; @end @@ -320,7 +320,7 @@ -(void)constructPieChart #pragma mark - #pragma mark CPTBarPlot delegate method --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"barWasSelectedAtRecordIndex %lu", (unsigned long)index); } @@ -328,7 +328,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { if ( [plot isKindOfClass:[CPTPieChart class]] ) { return self.dataForChart.count; @@ -341,7 +341,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot } } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; @@ -400,7 +400,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { if ( self.piePlotIsRotating ) { return nil; diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 842ad29b5..2f1681dd3 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -172,7 +172,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) - newLabel.tickLocation = tickLocation as? NSNumber + newLabel.tickLocation = tickLocation as! NSNumber newLabel.offset = labelOffset newLabels.insert(newLabel) diff --git a/examples/CPTTestApp/Source/AxisDemoController.m b/examples/CPTTestApp/Source/AxisDemoController.m index b72d72233..51cf85317 100644 --- a/examples/CPTTestApp/Source/AxisDemoController.m +++ b/examples/CPTTestApp/Source/AxisDemoController.m @@ -2,7 +2,7 @@ @interface AxisDemoController() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; @end diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index 4dd744c97..e02f36772 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -2,8 +2,8 @@ @interface CPTPlotSymbolTestController() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; @end @@ -67,12 +67,12 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return 10; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -91,7 +91,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndex:(NSUInteger)index { CPTGradient *gradientFill = [CPTGradient rainbowGradient]; diff --git a/examples/CPTTestApp/Source/Controller.h b/examples/CPTTestApp/Source/Controller.h index 206c7e1ca..d6fee2276 100644 --- a/examples/CPTTestApp/Source/Controller.h +++ b/examples/CPTTestApp/Source/Controller.h @@ -9,27 +9,27 @@ @property (nonatomic, readwrite, assign) CGFloat labelRotation; // Data loading --(IBAction)reloadDataSourcePlot:(id)sender; --(IBAction)removeData:(id)sender; --(IBAction)insertData:(id)sender; +-(IBAction)reloadDataSourcePlot:(nullable id)sender; +-(IBAction)removeData:(nullable id)sender; +-(IBAction)insertData:(nullable id)sender; // PDF / image export --(IBAction)exportToPDF:(id)sender; --(IBAction)exportToPNG:(id)sender; +-(IBAction)exportToPDF:(nullable id)sender; +-(IBAction)exportToPNG:(nullable id)sender; // Printing --(IBAction)printDocument:(id)sender; --(void)printOperationDidRun:(NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(void *)contextInfo; +-(IBAction)printDocument:(nullable id)sender; +-(void)printOperationDidRun:(nonnull NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(nullable void *)contextInfo; // Layer exploding for illustration --(IBAction)explodeLayers:(id)sender; -+(void)recursivelySplitSublayersInZForLayer:(CALayer *)layer depthLevel:(NSUInteger)depthLevel; --(IBAction)reassembleLayers:(id)sender; -+(void)recursivelyAssembleSublayersInZForLayer:(CALayer *)layer; +-(IBAction)explodeLayers:(nullable id)sender; ++(void)recursivelySplitSublayersInZForLayer:(nonnull CALayer *)layer depthLevel:(NSUInteger)depthLevel; +-(IBAction)reassembleLayers:(nullable id)sender; ++(void)recursivelyAssembleSublayersInZForLayer:(nonnull CALayer *)layer; // Demo windows --(IBAction)plotSymbolDemo:(id)sender; --(IBAction)axisDemo:(id)sender; --(IBAction)selectionDemo:(id)sender; +-(IBAction)plotSymbolDemo:(nullable id)sender; +-(IBAction)axisDemo:(nullable id)sender; +-(IBAction)selectionDemo:(nullable id)sender; @end diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 9b889ad41..321a2f944 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -9,14 +9,14 @@ @interface Controller() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, weak) IBOutlet NSWindow *plotSymbolWindow; -@property (nonatomic, readwrite, weak) IBOutlet NSWindow *axisDemoWindow; -@property (nonatomic, readwrite, weak) IBOutlet NSWindow *selectionDemoWindow; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *plotSymbolWindow; +@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *axisDemoWindow; +@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *selectionDemoWindow; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) RotationView *overlayRotationView; -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nullable) RotationView *overlayRotationView; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *symbolTextAnnotation; -(void)setupGraph; -(void)setupAxes; @@ -364,14 +364,14 @@ -(void)setupBarPlots #pragma mark - #pragma mark Actions --(IBAction)reloadDataSourcePlot:(id)sender +-(IBAction)reloadDataSourcePlot:(nullable id)sender { CPTPlot *plot = [self.graph plotWithIdentifier:dataSourcePlot]; [plot reloadData]; } --(IBAction)removeData:(id)sender +-(IBAction)removeData:(nullable id)sender { NSUInteger index = self.selectionIndex; @@ -383,7 +383,7 @@ -(IBAction)removeData:(id)sender } } --(IBAction)insertData:(id)sender +-(IBAction)insertData:(nullable id)sender { NSUInteger index = self.selectionIndex; @@ -399,7 +399,7 @@ -(IBAction)insertData:(id)sender #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { if ( [plot isKindOfClass:[CPTBarPlot class]] ) { return 8; @@ -409,7 +409,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot } } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -429,7 +429,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { if ( [(NSString *) plot.identifier isEqualToString:barPlot2] ) { return (id)[NSNull null]; // Don't show any label @@ -448,7 +448,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index #pragma mark - #pragma mark CPTScatterPlot delegate method --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -492,7 +492,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS #pragma mark - #pragma mark CPTBarPlot delegate method --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"barWasSelectedAtRecordIndex %u", (unsigned)index); @@ -543,7 +543,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -557,7 +557,7 @@ -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea #pragma mark - #pragma mark PDF / image export --(IBAction)exportToPDF:(id)sender +-(IBAction)exportToPDF:(nullable id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; @@ -573,7 +573,7 @@ -(IBAction)exportToPDF:(id)sender } } --(IBAction)exportToPNG:(id)sender +-(IBAction)exportToPNG:(nullable id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; @@ -595,7 +595,7 @@ -(IBAction)exportToPNG:(id)sender #pragma mark - #pragma mark Printing --(IBAction)printDocument:(id)sender +-(IBAction)printDocument:(nullable id)sender { NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo]; @@ -606,9 +606,10 @@ -(IBAction)printDocument:(id)sender self.hostView.printRect = printRect; - NSWindow *window = self.hostView.window; + CPTGraphHostingView *host = self.hostView; + NSWindow *window = host.window; if ( window ) { - NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:self.hostView printInfo:printInfo]; + NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:host printInfo:printInfo]; [printOperation runOperationModalForWindow:window delegate:self didRunSelector:@selector(printOperationDidRun:success:contextInfo:) @@ -616,7 +617,7 @@ -(IBAction)printDocument:(id)sender } } --(void)printOperationDidRun:(NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(void *)contextInfo +-(void)printOperationDidRun:(nonnull NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(nullable void *)contextInfo { // print delegate } @@ -624,7 +625,7 @@ -(void)printOperationDidRun:(NSPrintOperation *)printOperation success:(BOOL)suc #pragma mark - #pragma mark Layer exploding for illustration --(IBAction)explodeLayers:(id)sender +-(IBAction)explodeLayers:(nullable id)sender { CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0); @@ -651,7 +652,7 @@ -(IBAction)explodeLayers:(id)sender [CATransaction commit]; } -+(void)recursivelySplitSublayersInZForLayer:(CALayer *)layer depthLevel:(NSUInteger)depthLevel ++(void)recursivelySplitSublayersInZForLayer:(nonnull CALayer *)layer depthLevel:(NSUInteger)depthLevel { layer.zPosition = kZDistanceBetweenLayers * (CGFloat)depthLevel; layer.borderColor = [CPTColor blueColor].cgColor; @@ -663,7 +664,7 @@ +(void)recursivelySplitSublayersInZForLayer:(CALayer *)layer depthLevel:(NSUInte } } --(IBAction)reassembleLayers:(id)sender +-(IBAction)reassembleLayers:(nullable id)sender { [CATransaction begin]; [CATransaction setValue:@1.0f forKey:kCATransactionAnimationDuration]; @@ -677,7 +678,7 @@ -(IBAction)reassembleLayers:(id)sender self.overlayRotationView = nil; } -+(void)recursivelyAssembleSublayersInZForLayer:(CALayer *)layer ++(void)recursivelyAssembleSublayersInZForLayer:(nonnull CALayer *)layer { layer.zPosition = 0.0; layer.borderColor = [CPTColor clearColor].cgColor; @@ -690,7 +691,7 @@ +(void)recursivelyAssembleSublayersInZForLayer:(CALayer *)layer #pragma mark - #pragma mark Demo windows --(IBAction)plotSymbolDemo:(id)sender +-(IBAction)plotSymbolDemo:(nullable id)sender { if ( !self.plotSymbolWindow ) { [NSBundle loadNibNamed:@"PlotSymbolDemo" owner:self]; @@ -700,7 +701,7 @@ -(IBAction)plotSymbolDemo:(id)sender [window makeKeyAndOrderFront:sender]; } --(IBAction)axisDemo:(id)sender +-(IBAction)axisDemo:(nullable id)sender { if ( !self.axisDemoWindow ) { [NSBundle loadNibNamed:@"AxisDemo" owner:self]; @@ -710,7 +711,7 @@ -(IBAction)axisDemo:(id)sender [window makeKeyAndOrderFront:sender]; } --(IBAction)selectionDemo:(id)sender +-(IBAction)selectionDemo:(nullable id)sender { if ( !self.selectionDemoWindow ) { [NSBundle loadNibNamed:@"SelectionDemo" owner:self]; diff --git a/examples/CPTTestApp/Source/RotationView.h b/examples/CPTTestApp/Source/RotationView.h index ab5a2912f..80f9a40eb 100644 --- a/examples/CPTTestApp/Source/RotationView.h +++ b/examples/CPTTestApp/Source/RotationView.h @@ -11,7 +11,7 @@ @interface RotationView : NSView @property (nonatomic, readwrite) CATransform3D rotationTransform; -@property (nonatomic, readwrite, weak) id rotationDelegate; +@property (nonatomic, readwrite, weak, nullable) id rotationDelegate; @end diff --git a/examples/CPTTestApp/Source/RotationView.m b/examples/CPTTestApp/Source/RotationView.m index 92c2405c5..1c2a649b1 100644 --- a/examples/CPTTestApp/Source/RotationView.m +++ b/examples/CPTTestApp/Source/RotationView.m @@ -18,7 +18,7 @@ @implementation RotationView #pragma mark - #pragma mark Initialization and teardown --(instancetype)initWithFrame:(NSRect)frame +-(nonnull instancetype)initWithFrame:(NSRect)frame { if ( (self = [super initWithFrame:frame]) ) { rotationTransform = CATransform3DIdentity; @@ -30,17 +30,17 @@ -(instancetype)initWithFrame:(NSRect)frame #pragma mark - #pragma mark Mouse handling methods --(BOOL)acceptsFirstMouse:(NSEvent *)theEvent +-(BOOL)acceptsFirstMouse:(nullable NSEvent *)theEvent { return YES; } --(void)mouseDown:(NSEvent *)theEvent +-(void)mouseDown:(nonnull NSEvent *)theEvent { self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; } --(void)mouseDragged:(NSEvent *)theEvent +-(void)mouseDragged:(nonnull NSEvent *)theEvent { NSPoint currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; @@ -62,7 +62,7 @@ -(void)mouseDragged:(NSEvent *)theEvent self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; } --(void)mouseUp:(NSEvent *)theEvent +-(void)mouseUp:(nonnull NSEvent *)theEvent { self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; } diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index 007cfb64b..9f47621ea 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -10,11 +10,11 @@ -(void)setupAxes; -(void)setupScatterPlots; -(void)initializeData; -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSMutableArray *dataForPlot; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *dataForPlot; @property (nonatomic, readwrite) NSUInteger selectedIndex; @end @@ -182,7 +182,7 @@ -(void)initializeData #pragma mark - #pragma mark Plot datasource methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger count = 0; @@ -198,7 +198,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; @@ -260,7 +260,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndex:(NSUInteger)index { static CPTPlotSymbol *redDot = nil; @@ -282,7 +282,7 @@ -(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUIn #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { self.selectedIndex = index; } @@ -291,7 +291,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS #pragma mark Plot space delegate methods #ifdef REMOVE_SELECTION_ON_CLICK --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point { self.selectedIndex = NSUIntegerMax; return YES; diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.h b/examples/CorePlotGallery/src/ios/AppDelegate.h index d34bfcad8..b0a134582 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.h +++ b/examples/CorePlotGallery/src/ios/AppDelegate.h @@ -7,6 +7,6 @@ @interface AppDelegate : UIResponder -@property (nonatomic, readwrite, strong) UIWindow *window; +@property (nonatomic, readwrite, strong, nullable) UIWindow *window; @end diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index 9dd1fd212..3dd446d92 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -18,7 +18,7 @@ @implementation AppDelegate @synthesize window; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(CPTDictionary)launchOptions +-(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOptions:(nullable CPTDictionary)launchOptions { [[PlotGallery sharedPlotGallery] sortByTitle]; diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.h b/examples/CorePlotGallery/src/ios/DetailViewController.h index 2d13e52a2..fad34930c 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.h +++ b/examples/CorePlotGallery/src/ios/DetailViewController.h @@ -7,12 +7,12 @@ @interface DetailViewController : UIViewController -@property (nonatomic, strong) PlotItem *detailItem; -@property (nonatomic, copy) NSString *currentThemeName; +@property (nonatomic, strong, nonnull) PlotItem *detailItem; +@property (nonatomic, copy, nonnull) NSString *currentThemeName; -@property (nonatomic, strong) IBOutlet UIView *hostingView; -@property (nonatomic, strong) IBOutlet UIBarButtonItem *themeBarButton; +@property (nonatomic, strong, nullable) IBOutlet UIView *hostingView; +@property (nonatomic, strong, nullable) IBOutlet UIBarButtonItem *themeBarButton; --(void)themeSelectedWithName:(NSString *)themeName; +-(void)themeSelectedWithName:(nonnull NSString *)themeName; @end diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index 384ebad06..a50fe4923 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -10,12 +10,10 @@ @interface DetailViewController() --(CPTTheme *)currentTheme; - -@property (nonatomic, readwrite) UIPopoverController *themePopoverController; +-(nullable CPTTheme *)currentTheme; -(void)setupView; --(void)themeChanged:(NSNotification *)notification; +-(void)themeChanged:(nonnull NSNotification *)notification; @end @@ -27,7 +25,6 @@ @implementation DetailViewController @synthesize hostingView; @synthesize themeBarButton; @synthesize currentThemeName; -@synthesize themePopoverController; #pragma mark - #pragma mark Initialization and Memory Management @@ -39,7 +36,10 @@ -(void)setupView name:PlotGalleryThemeDidChangeNotification object:nil]; - [self.detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + UIView *hostView = self.hostingView; + if ( hostView ) { + [self.detailItem renderInView:hostView withTheme:[self currentTheme] animated:YES]; + } } -(void)awakeFromNib @@ -47,7 +47,7 @@ -(void)awakeFromNib [self setupView]; } --(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +-(nonnull instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) { [self setupView]; @@ -64,15 +64,16 @@ -(void)dealloc #pragma mark - #pragma mark Managing the detail item --(void)setDetailItem:(PlotItem *)newDetailItem +-(void)setDetailItem:(nonnull PlotItem *)newDetailItem { if ( detailItem != newDetailItem ) { [detailItem killGraph]; detailItem = newDetailItem; - if ( self.hostingView ) { - [detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + UIView *hostView = self.hostingView; + if ( hostView ) { + [detailItem renderInView:hostView withTheme:[self currentTheme] animated:YES]; } } } @@ -90,7 +91,7 @@ -(void)viewDidAppear:(BOOL)animated #pragma mark - #pragma mark Theme Selection --(void)setCurrentThemeName:(NSString *)newThemeName +-(void)setCurrentThemeName:(nonnull NSString *)newThemeName { if ( newThemeName != currentThemeName ) { currentThemeName = [newThemeName copy]; @@ -99,7 +100,7 @@ -(void)setCurrentThemeName:(NSString *)newThemeName } } --(CPTTheme *)currentTheme +-(nullable CPTTheme *)currentTheme { CPTTheme *theme; @@ -116,18 +117,24 @@ -(CPTTheme *)currentTheme return theme; } --(void)themeSelectedWithName:(NSString *)themeName +-(void)themeSelectedWithName:(nonnull NSString *)themeName { self.currentThemeName = themeName; - [self.detailItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + UIView *hostView = self.hostingView; + if ( hostView ) { + [self.detailItem renderInView:hostView withTheme:[self currentTheme] animated:YES]; + } } --(void)themeChanged:(NSNotification *)notification +-(void)themeChanged:(nonnull NSNotification *)notification { NSDictionary *themeInfo = notification.userInfo; - [self themeSelectedWithName:themeInfo[PlotGalleryThemeNameKey]]; + NSString *themeName = themeInfo[PlotGalleryThemeNameKey]; + if ( themeName ) { + [self themeSelectedWithName:themeName]; + } } @end diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index 1f729464e..1a7b1e2fd 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -13,9 +13,9 @@ @interface RootViewController() -@property (nonatomic, copy) NSString *currentThemeName; +@property (nonatomic, copy, nonnull) NSString *currentThemeName; --(void)themeChanged:(NSNotification *)notification; +-(void)themeChanged:(nonnull NSNotification *)notification; @end @@ -47,7 +47,7 @@ -(void)dealloc #pragma mark - #pragma mark Segues --(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +-(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { DetailViewController *controller = (DetailViewController *)[segue.destinationViewController topViewController]; @@ -69,27 +69,30 @@ -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender #pragma mark - #pragma mark Theme Selection --(void)themeChanged:(NSNotification *)notification +-(void)themeChanged:(nonnull NSNotification *)notification { NSDictionary *themeInfo = notification.userInfo; - self.currentThemeName = themeInfo[PlotGalleryThemeNameKey]; + NSString *themeName = themeInfo[PlotGalleryThemeNameKey]; + if ( themeName ) { + self.currentThemeName = themeName; + } } #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(UITableView *)tv +-(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tv { return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfSections]; } --(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(nonnull UITableView *)tv numberOfRowsInSection:(NSInteger)section { return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; } --(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath +-(nonnull UITableViewCell *)tableView:(nonnull UITableView *)tv cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { static NSString *cellId = @"PlotCell"; @@ -108,7 +111,7 @@ -(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPa return cell; } --(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +-(nullable NSString *)tableView:(nonnull UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [[PlotGallery sharedPlotGallery] sectionTitles][(NSUInteger)section]; } diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.h b/examples/CorePlotGallery/src/ios/ThemeTableViewController.h index 6abdb28af..4c14585c2 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.h +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.h @@ -3,11 +3,11 @@ // CorePlotGallery // -extern NSString *const kThemeTableViewControllerNoTheme; -extern NSString *const kThemeTableViewControllerDefaultTheme; +extern NSString *__nonnull const kThemeTableViewControllerNoTheme; +extern NSString *__nonnull const kThemeTableViewControllerDefaultTheme; -extern NSString *const PlotGalleryThemeDidChangeNotification; -extern NSString *const PlotGalleryThemeNameKey; +extern NSString *__nonnull const PlotGalleryThemeDidChangeNotification; +extern NSString *__nonnull const PlotGalleryThemeNameKey; #pragma mark - diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index ac906eb41..10b51976a 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -15,7 +15,7 @@ @interface ThemeTableViewController() -@property (nonatomic, readwrite, strong) CPTMutableStringArray themes; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableStringArray themes; @end @@ -44,7 +44,7 @@ -(void)awakeFromNib [self setupThemes]; } --(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +-(nonnull instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) { [self setupThemes]; @@ -56,17 +56,17 @@ -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBu #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +-(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tableView { return 1; } --(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return (NSInteger)self.themes.count; } --(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +-(nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { static NSString *CellIdentifier = @"ThemeCell"; @@ -84,7 +84,7 @@ -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS #pragma mark - #pragma mark Table view delegate --(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +-(void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath { NSDictionary *themeInfo = @{ PlotGalleryThemeNameKey: self.themes[(NSUInteger)indexPath.row] diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.h b/examples/CorePlotGallery/src/mac/PlotGalleryController.h index 4da469a02..04bd17bcf 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.h +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.h @@ -13,9 +13,9 @@ @interface PlotGalleryController : NSObject -@property (nonatomic, strong) PlotItem *plotItem; -@property (nonatomic, copy) NSString *currentThemeName; +@property (nonatomic, strong, nullable) PlotItem *plotItem; +@property (nonatomic, copy, nullable) NSString *currentThemeName; --(IBAction)themeSelectionDidChange:(id)sender; +-(IBAction)themeSelectionDidChange:(nonnull id)sender; @end diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 3f2fd06b8..09aeb644e 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -15,12 +15,12 @@ @interface PlotGalleryController() -@property (nonatomic, readwrite, strong) IBOutlet NSSplitView *splitView; -@property (nonatomic, readwrite, strong) IBOutlet NSScrollView *scrollView; -@property (nonatomic, readwrite, strong) IBOutlet IKImageBrowserView *imageBrowser; -@property (nonatomic, readwrite, strong) IBOutlet NSPopUpButton *themePopUpButton; +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSSplitView *splitView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSScrollView *scrollView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet IKImageBrowserView *imageBrowser; +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSPopUpButton *themePopUpButton; -@property (nonatomic, readwrite, strong) IBOutlet PlotView *hostingView; +@property (nonatomic, readwrite, strong, nullable) IBOutlet PlotView *hostingView; @end @@ -110,7 +110,7 @@ -(void)setFrameSize:(NSSize)newSize #pragma mark - #pragma mark Theme Selection --(CPTTheme *)currentTheme +-(nullable CPTTheme *)currentTheme { CPTTheme *theme; @@ -127,45 +127,52 @@ -(CPTTheme *)currentTheme return theme; } --(IBAction)themeSelectionDidChange:(id)sender +-(IBAction)themeSelectionDidChange:(nonnull id)sender { self.currentThemeName = [sender titleOfSelectedItem]; - [self.plotItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + + PlotView *hostView = self.hostingView; + if ( hostView ) { + [self.plotItem renderInView:hostView withTheme:[self currentTheme] animated:YES]; + } } #pragma mark - #pragma mark PlotItem Property --(void)setPlotItem:(PlotItem *)item +-(void)setPlotItem:(nullable PlotItem *)item { if ( plotItem != item ) { [plotItem killGraph]; plotItem = item; - [plotItem renderInView:self.hostingView withTheme:[self currentTheme] animated:YES]; + PlotView *hostView = self.hostingView; + if ( hostView ) { + [plotItem renderInView:hostView withTheme:[self currentTheme] animated:YES]; + } } } #pragma mark - #pragma mark IKImageBrowserViewDataSource methods --(NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView *)browser +-(NSUInteger)numberOfItemsInImageBrowser:(nonnull IKImageBrowserView *)browser { return [[PlotGallery sharedPlotGallery] count]; } --(id)imageBrowser:(IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index +-(nonnull id)imageBrowser:(nonnull IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index { return [[PlotGallery sharedPlotGallery] objectInSection:0 atIndex:index]; } --(NSUInteger)numberOfGroupsInImageBrowser:(IKImageBrowserView *)aBrowser +-(NSUInteger)numberOfGroupsInImageBrowser:(nonnull IKImageBrowserView *)aBrowser { return [[PlotGallery sharedPlotGallery] numberOfSections]; } --(CPTDictionary)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index +-(nonnull CPTDictionary)imageBrowser:(nonnull IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index { NSString *groupTitle = [[PlotGallery sharedPlotGallery] sectionTitles][index]; @@ -187,7 +194,7 @@ -(CPTDictionary)imageBrowser:(IKImageBrowserView *)aBrowser groupAtIndex:(NSUInt #pragma mark - #pragma mark IKImageBrowserViewDelegate methods --(void)imageBrowserSelectionDidChange:(IKImageBrowserView *)browser +-(void)imageBrowserSelectionDidChange:(nonnull IKImageBrowserView *)browser { NSUInteger index = [[browser selectionIndexes] firstIndex]; @@ -200,17 +207,17 @@ -(void)imageBrowserSelectionDidChange:(IKImageBrowserView *)browser #pragma mark - #pragma mark NSSplitViewDelegate methods --(CGFloat)splitView:(NSSplitView *)sv constrainMinCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index +-(CGFloat)splitView:(nonnull NSSplitView *)sv constrainMinCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index { return coord + CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } --(CGFloat)splitView:(NSSplitView *)sv constrainMaxCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index +-(CGFloat)splitView:(nonnull NSSplitView *)sv constrainMaxCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index { return coord - CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } --(void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize +-(void)splitView:(nonnull NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize { // Lock the LHS width NSRect frame = [sender frame]; diff --git a/examples/CorePlotGallery/src/mac/PlotView.h b/examples/CorePlotGallery/src/mac/PlotView.h index dad27812e..e906b766f 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.h +++ b/examples/CorePlotGallery/src/mac/PlotView.h @@ -12,6 +12,6 @@ @end @interface PlotView : NSView -@property (nonatomic, weak) id delegate; +@property (nonatomic, weak, nullable) id delegate; @end diff --git a/examples/CorePlotGallery/src/mac/PlotView.m b/examples/CorePlotGallery/src/mac/PlotView.m index 4c32ef4c4..2df73ae70 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.m +++ b/examples/CorePlotGallery/src/mac/PlotView.m @@ -9,7 +9,7 @@ @implementation PlotView @synthesize delegate; --(instancetype)initWithFrame:(NSRect)frame +-(nonnull instancetype)initWithFrame:(NSRect)frame { if ( (self = [super initWithFrame:frame]) ) { } diff --git a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h index 028433349..c4820dd23 100644 --- a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h +++ b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.h @@ -7,6 +7,6 @@ @interface Plot_Gallery_MacAppDelegate : NSObject -@property (nonatomic, readwrite, strong) IBOutlet NSWindow *window; +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSWindow *window; @end diff --git a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m index 5807c2a7f..3a5f91189 100644 --- a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m +++ b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m @@ -9,7 +9,7 @@ @implementation Plot_Gallery_MacAppDelegate @synthesize window; --(void)applicationDidFinishLaunching:(NSNotification *)aNotification +-(void)applicationDidFinishLaunching:(nonnull NSNotification *)aNotification { } diff --git a/examples/CorePlotGallery/src/plots/AxisDemo.m b/examples/CorePlotGallery/src/plots/AxisDemo.m index de39e41e0..0cac6ac1a 100644 --- a/examples/CorePlotGallery/src/plots/AxisDemo.m +++ b/examples/CorePlotGallery/src/plots/AxisDemo.m @@ -12,7 +12,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Axis Demo"; @@ -22,7 +22,7 @@ -(instancetype)init return self; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -146,7 +146,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - Axis delegate --(void)axis:(CPTAxis *)axis labelWasSelected:(CPTAxisLabel *)label +-(void)axis:(nonnull CPTAxis *)axis labelWasSelected:(nonnull CPTAxisLabel *)label { NSLog(@"%@ label was selected at location %@", axis.title, label.tickLocation); } diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.h b/examples/CorePlotGallery/src/plots/CandlestickPlot.h index a45a5246c..e015ab15c 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.h +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.h @@ -5,6 +5,8 @@ #import "PlotItem.h" -@interface CandlestickPlot : PlotItem +@interface CandlestickPlot : PlotItem @end diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index e60f226e6..cd56e1242 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -9,8 +9,8 @@ @interface CandlestickPlot() -@property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -24,7 +24,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; @@ -62,7 +62,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -103,10 +103,14 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP xAxis.labelFormatter = timeFormatter; CPTLineCap *lineCap = [[CPTLineCap alloc] init]; - lineCap.lineStyle = xAxis.axisLineStyle; - lineCap.lineCapType = CPTLineCapTypeSweptArrow; - lineCap.size = CGSizeMake( self.titleSize * CPTFloat(0.5), self.titleSize * CPTFloat(0.625) ); - lineCap.fill = [CPTFill fillWithColor:xAxis.axisLineStyle.lineColor]; + lineCap.lineStyle = xAxis.axisLineStyle; + lineCap.lineCapType = CPTLineCapTypeSweptArrow; + lineCap.size = CGSizeMake( self.titleSize * CPTFloat(0.5), self.titleSize * CPTFloat(0.625) ); + + CPTColor *lineColor = xAxis.axisLineStyle.lineColor; + if ( lineColor ) { + lineCap.fill = [CPTFill fillWithColor:lineColor]; + } xAxis.axisLineCapMax = lineCap; CPTXYAxis *yAxis = xyAxisSet.yAxis; @@ -180,12 +184,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSDecimalNumber *num = [NSDecimalNumber zero]; @@ -212,7 +216,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Delegate Methods --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Bar for '%@' was selected at index %d.", plot.identifier, (int)index); } diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 2369f8420..86d22a68f 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -2,7 +2,7 @@ @interface ColoredBarChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray plotData; @end @@ -15,7 +15,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Colored Bar Chart"; @@ -36,7 +36,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -139,12 +139,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange +-(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { CPTNumberArray nums = nil; @@ -167,7 +167,7 @@ -(NSArray *)numbersForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordInd return nums; } --(CPTFill *)barFillForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)index +-(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)index { CPTColor *color = nil; @@ -214,7 +214,7 @@ -(CPTFill *)barFillForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)inde return [CPTFill fillWithGradient:fillGradient]; } --(NSString *)legendTitleForBarPlot:(CPTBarPlot *)barPlot recordIndex:(NSUInteger)index +-(nullable NSString *)legendTitleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)index { return [NSString stringWithFormat:@"Bar %lu", (unsigned long)(index + 1)]; } diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.h b/examples/CorePlotGallery/src/plots/CompositePlot.h index 0edb815ec..6ec67f461 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.h +++ b/examples/CorePlotGallery/src/plots/CompositePlot.h @@ -10,11 +10,11 @@ CPTScatterPlotDelegate, CPTBarPlotDelegate> -@property (readwrite, strong, nonatomic) CPTMutableNumberArray dataForChart; -@property (readwrite, strong, nonatomic) NSMutableArray *dataForPlot; +@property (readwrite, strong, nonatomic, nonnull) CPTMutableNumberArray dataForChart; +@property (readwrite, strong, nonatomic, nonnull) NSMutableArray *dataForPlot; --(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; --(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; --(void)renderPieChartInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme; +-(void)renderScatterPlotInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme; +-(void)renderBarPlotInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme; +-(void)renderPieChartInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme; @end diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 5a1446d9c..01309b6c3 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -9,13 +9,13 @@ @interface CompositePlot() @property (nonatomic, readwrite, assign) NSInteger selectedIndex; -@property (nonatomic, readwrite, strong) CPTGraphHostingView *scatterPlotView; -@property (nonatomic, readwrite, strong) CPTGraphHostingView *barChartView; -@property (nonatomic, readwrite, strong) CPTGraphHostingView *pieChartView; +@property (nonatomic, readwrite, strong, nullable) CPTGraphHostingView *scatterPlotView; +@property (nonatomic, readwrite, strong, nullable) CPTGraphHostingView *barChartView; +@property (nonatomic, readwrite, strong, nullable) CPTGraphHostingView *pieChartView; -@property (nonatomic, readwrite, strong) CPTXYGraph *scatterPlot; -@property (nonatomic, readwrite, strong) CPTXYGraph *barChart; -@property (nonatomic, readwrite, strong) CPTXYGraph *pieChart; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *scatterPlot; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *barChart; +@property (nonatomic, readwrite, strong, nullable) CPTXYGraph *pieChart; @end @@ -38,7 +38,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { selectedIndex = NSNotFound; @@ -79,7 +79,7 @@ -(void)setFrameSize:(NSSize)newSize } #endif --(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { [self killGraph]; @@ -221,7 +221,7 @@ -(void)killGraph [super killGraph]; } --(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme +-(void)renderScatterPlotInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme { // Create graph from theme #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR @@ -230,10 +230,11 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe CGRect bounds = NSRectToCGRect(self.scatterPlotView.bounds); #endif - self.scatterPlot = [[CPTXYGraph alloc] initWithFrame:bounds]; - [self addGraph:self.scatterPlot toHostingView:hostingView]; + CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:bounds]; + self.scatterPlot = newGraph; - [self applyTheme:theme toGraph:self.scatterPlot withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; + [self addGraph:newGraph toHostingView:hostingView]; + [self applyTheme:theme toGraph:newGraph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; self.scatterPlot.plotAreaFrame.plotArea.delegate = self; @@ -328,7 +329,7 @@ -(void)renderScatterPlotInHostingView:(CPTGraphHostingView *)hostingView withThe self.dataForPlot = contentArray; } --(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme +-(void)renderBarPlotInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -336,9 +337,11 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( CGRect bounds = NSRectToCGRect(hostingView.bounds); #endif - self.barChart = [[CPTXYGraph alloc] initWithFrame:bounds]; - [self addGraph:self.barChart toHostingView:hostingView]; - [self applyTheme:theme toGraph:self.barChart withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; + CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:bounds]; + self.barChart = newGraph; + + [self addGraph:newGraph toHostingView:hostingView]; + [self applyTheme:theme toGraph:newGraph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; self.barChart.plotAreaFrame.masksToBorder = NO; @@ -396,7 +399,7 @@ -(void)renderBarPlotInHostingView:(CPTGraphHostingView *)hostingView withTheme:( [self.barChart addPlot:barPlot toPlotSpace:plotSpace]; } --(void)renderPieChartInHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme +-(void)renderPieChartInHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE [hostingView layoutIfNeeded]; @@ -406,9 +409,11 @@ -(void)renderPieChartInHostingView:(CPTGraphHostingView *)hostingView withTheme: CGRect bounds = NSRectToCGRect(hostingView.bounds); #endif - self.pieChart = [[CPTXYGraph alloc] initWithFrame:bounds]; - [self addGraph:self.pieChart toHostingView:hostingView]; - [self applyTheme:theme toGraph:self.pieChart withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; + CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:bounds]; + self.pieChart = newGraph; + + [self addGraph:newGraph toHostingView:hostingView]; + [self applyTheme:theme toGraph:newGraph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; self.pieChart.plotAreaFrame.masksToBorder = NO; @@ -432,7 +437,7 @@ -(void)renderPieChartInHostingView:(CPTGraphHostingView *)hostingView withTheme: #pragma mark - #pragma mark CPTBarPlot delegate --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"barWasSelectedAtRecordIndex %d", (int)index); } @@ -440,7 +445,7 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index #pragma mark - #pragma mark CPTScatterPlot delegate --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { if ( [(NSString *) plot.identifier isEqualToString:@"Blue Plot"] ) { self.selectedIndex = (NSInteger)index; @@ -450,7 +455,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS #pragma mark - #pragma mark Plot area delegate --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { CPTGraph *theGraph = plotArea.graph; @@ -462,7 +467,7 @@ -(void)plotAreaWasSelected:(CPTPlotArea *)plotArea #pragma mark - #pragma mark Plot Data Source --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { if ( [plot isKindOfClass:[CPTPieChart class]] ) { return [self.dataForChart count]; @@ -475,7 +480,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot } } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; @@ -520,7 +525,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { CPTTextLayer *newLayer = nil; @@ -563,7 +568,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index return newLayer; } --(CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot recordIndex:(NSUInteger)index { static CPTPlotSymbol *redDot = nil; static dispatch_once_t onceToken = 0; diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index 9aa8c040e..683d2ed4e 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -9,7 +9,7 @@ @interface ControlChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray plotData; @property (nonatomic, readwrite, assign) double meanValue; @property (nonatomic, readwrite, assign) double standardError; @@ -26,7 +26,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Control Chart"; @@ -63,7 +63,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -213,7 +213,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { if ( plot.identifier == kDataLine ) { return self.plotData.count; @@ -226,7 +226,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot } } --(double)doubleForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(double)doubleForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { double number = (double)NAN; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 40ddb46fa..28f83b557 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -12,11 +12,11 @@ @interface CurvedScatterPlot() -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *> *plotData; -@property (nonatomic, readwrite, strong) NSArray *> *plotData1; -@property (nonatomic, readwrite, strong) NSArray *> *plotData2; +@property (nonatomic, readwrite, strong, nonnull) NSArray *> *plotData; +@property (nonatomic, readwrite, strong, nonnull) NSArray *> *plotData1; +@property (nonatomic, readwrite, strong, nonnull) NSArray *> *plotData2; @end @@ -32,7 +32,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Curved Scatter Plot"; @@ -129,7 +129,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -182,8 +182,11 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP x.axisConstraints = [CPTConstraints constraintWithRelativeOffset:0.5]; lineCap.lineStyle = x.axisLineStyle; - lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; - x.axisLineCapMax = lineCap; + CPTColor *lineColor = lineCap.lineStyle.lineColor; + if ( lineColor ) { + lineCap.fill = [CPTFill fillWithColor:lineColor]; + } + x.axisLineCapMax = lineCap; x.title = @"X Axis"; x.titleOffset = self.titleSize * CPTFloat(1.25); @@ -199,9 +202,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP y.labelOffset = self.titleSize * CPTFloat(0.25); lineCap.lineStyle = y.axisLineStyle; - lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; - y.axisLineCapMax = lineCap; - y.axisLineCapMin = lineCap; + lineColor = lineCap.lineStyle.lineColor; + if ( lineColor ) { + lineCap.fill = [CPTFill fillWithColor:lineColor]; + } + y.axisLineCapMax = lineCap; + y.axisLineCapMin = lineCap; y.title = @"Y Axis"; y.titleOffset = self.titleSize * CPTFloat(1.25); @@ -294,7 +300,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { NSUInteger numRecords = 0; NSString *identifier = (NSString *)plot.identifier; @@ -312,7 +318,7 @@ -(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot return numRecords; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; NSString *identifier = (NSString *)plot.identifier; @@ -333,7 +339,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { CPTGraph *theGraph = space.graph; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)theGraph.axisSet; @@ -362,7 +368,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTXYGraph *graph = (self.graphs)[0]; @@ -412,17 +418,17 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS } } --(void)scatterPlotDataLineWasSelected:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineWasSelected:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineWasSelected: %@", plot); } --(void)scatterPlotDataLineTouchDown:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineTouchDown:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineTouchDown: %@", plot); } --(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineTouchUp: %@", plot); } @@ -430,7 +436,7 @@ -(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index a9158a416..4934f3dc4 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -7,7 +7,7 @@ @interface DatePlot() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -20,7 +20,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Date Plot"; @@ -53,7 +53,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -123,12 +123,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } diff --git a/examples/CorePlotGallery/src/plots/DonutChart.h b/examples/CorePlotGallery/src/plots/DonutChart.h index 0514a4ec7..ad7f4823e 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.h +++ b/examples/CorePlotGallery/src/plots/DonutChart.h @@ -1,5 +1,7 @@ #import "PlotItem.h" -@interface DonutChart : PlotItem +@interface DonutChart : PlotItem @end diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index 1fef65249..b04c5a8f4 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -5,7 +5,7 @@ @interface DonutChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray plotData; @end @@ -18,7 +18,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Donut Chart"; @@ -35,7 +35,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -113,7 +113,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP } } --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index +-(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"%@ slice was selected at index %lu. Value = %@", plot.identifier, (unsigned long)index, self.plotData[index]); } @@ -121,12 +121,12 @@ -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)in #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -140,7 +140,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { static CPTMutableTextStyle *whiteText = nil; static dispatch_once_t onceToken = 0; @@ -167,7 +167,7 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index return newLayer; } --(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(CGFloat)radialOffsetForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { CGFloat result = 0.0; @@ -180,27 +180,27 @@ -(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUIntege #pragma mark - #pragma mark Animation Delegate --(void)animationDidStart:(id)operation +-(void)animationDidStart:(nonnull id)operation { NSLog(@"animationDidStart: %@", operation); } --(void)animationDidFinish:(CPTAnimationOperation *)operation +-(void)animationDidFinish:(nonnull CPTAnimationOperation *)operation { NSLog(@"animationDidFinish: %@", operation); } --(void)animationCancelled:(CPTAnimationOperation *)operation +-(void)animationCancelled:(nonnull CPTAnimationOperation *)operation { NSLog(@"animationCancelled: %@", operation); } --(void)animationWillUpdate:(CPTAnimationOperation *)operation +-(void)animationWillUpdate:(nonnull CPTAnimationOperation *)operation { NSLog(@"animationWillUpdate:"); } --(void)animationDidUpdate:(CPTAnimationOperation *)operation +-(void)animationDidUpdate:(nonnull CPTAnimationOperation *)operation { NSLog(@"animationDidUpdate:"); } diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 0adea48f8..ade67907e 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -7,11 +7,13 @@ @interface FunctionPlot() @property (nonatomic, readwrite, strong) NSMutableSet *dataSources; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE --(UIFont *)italicFontForFont:(UIFont *)oldFont; +typedef UIFont CPTFont; #else --(NSFont *)italicFontForFont:(NSFont *)oldFont; +typedef NSFont CPTFont; #endif +-(nullable CPTFont *)italicFontForFont:(nonnull CPTFont *)oldFont; + @end #pragma mark - @@ -29,7 +31,7 @@ +(void)load #pragma mark - --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { dataSources = [[NSMutableSet alloc] init]; @@ -48,7 +50,7 @@ -(void)killGraph [super killGraph]; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -144,24 +146,19 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:titleString attributes:textAttributes]; -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - UIFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; -#else - NSFont *italicFont = [self italicFontForFont:textAttributes[NSFontAttributeName]]; -#endif + CPTFont *fontAttribute = textAttributes[NSFontAttributeName]; + if ( fontAttribute ) { + CPTFont *italicFont = [self italicFontForFont:fontAttribute]; - [title addAttribute:NSFontAttributeName - value:italicFont - range:NSMakeRange(0, 1)]; - [title addAttribute:NSFontAttributeName - value:italicFont - range:NSMakeRange(8, 1)]; + [title addAttribute:NSFontAttributeName + value:italicFont + range:NSMakeRange(0, 1)]; + [title addAttribute:NSFontAttributeName + value:italicFont + range:NSMakeRange(8, 1)]; + } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE - UIFont *labelFont = [UIFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; -#else - NSFont *labelFont = [NSFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; -#endif + CPTFont *labelFont = [CPTFont fontWithName:@"Helvetica" size:self.titleSize * CPTFloat(0.5)]; [title addAttribute:NSFontAttributeName value:labelFont range:NSMakeRange(0, title.length)]; @@ -208,7 +205,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP } #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE --(UIFont *)italicFontForFont:(UIFont *)oldFont +-(nullable UIFont *)italicFontForFont:(nonnull UIFont *)oldFont { NSString *italicName = nil; @@ -240,7 +237,7 @@ -(UIFont *)italicFontForFont:(UIFont *)oldFont } #else --(NSFont *)italicFontForFont:(NSFont *)oldFont +-(nullable NSFont *)italicFontForFont:(nonnull NSFont *)oldFont { return [[NSFontManager sharedFontManager] convertFont:oldFont toHaveTrait:NSFontItalicTrait]; @@ -249,7 +246,7 @@ -(NSFont *)italicFontForFont:(NSFont *)oldFont #pragma mark - Legend delegate --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx { plot.hidden = !plot.hidden; } diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index ad6b17b8d..d1aefd0de 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -7,8 +7,8 @@ @interface GradientScatterPlot() -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *symbolTextAnnotation; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -22,7 +22,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Gradient Scatter Plot"; @@ -61,7 +61,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -190,12 +190,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; @@ -210,7 +210,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { @@ -226,7 +226,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR #pragma mark - #pragma mark CPTScatterPlot delegate method --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTGraph *graph = (self.graphs)[0]; @@ -272,7 +272,7 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; diff --git a/examples/CorePlotGallery/src/plots/ImageDemo.m b/examples/CorePlotGallery/src/plots/ImageDemo.m index 21d76d814..5606d3120 100644 --- a/examples/CorePlotGallery/src/plots/ImageDemo.m +++ b/examples/CorePlotGallery/src/plots/ImageDemo.m @@ -12,7 +12,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Image Demo"; @@ -22,7 +22,7 @@ -(instancetype)init return self; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index 59d6ac9ca..f97964b57 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -12,7 +12,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Axis Labeling Policies"; @@ -22,7 +22,7 @@ -(instancetype)init return self; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { const CGFloat majorTickLength = 12.0; const CGFloat minorTickLength = 8.0; diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index e655bb54c..e9690f144 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -12,7 +12,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Line Caps"; @@ -22,7 +22,7 @@ -(instancetype)init return self; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.h b/examples/CorePlotGallery/src/plots/OHLCPlot.h index 09b366258..a29b0936a 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.h +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.h @@ -5,6 +5,7 @@ #import "PlotItem.h" -@interface OHLCPlot : PlotItem +@interface OHLCPlot : PlotItem @end diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 9c11c0ab4..224be5551 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -9,8 +9,8 @@ @interface OHLCPlot() -@property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nullable) CPTGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -24,7 +24,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; @@ -62,7 +62,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -181,12 +181,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSDecimalNumber *num = [NSDecimalNumber zero]; @@ -213,7 +213,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Delegate Methods --(void)tradingRangePlot:(CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)tradingRangePlot:(nonnull CPTTradingRangePlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Bar for '%@' was selected at index %d.", plot.identifier, (int)index); } diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m index 6ec44911a..05a0c4482 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m @@ -12,7 +12,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Plot Space Demo"; @@ -22,7 +22,7 @@ -(instancetype)init return self; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { const CGFloat majorTickLength = 12.0; const CGFloat minorTickLength = 8.0; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.h b/examples/CorePlotGallery/src/plots/RangePlot.h index 3801583da..53327e4fa 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.h +++ b/examples/CorePlotGallery/src/plots/RangePlot.h @@ -5,6 +5,8 @@ #import "PlotItem.h" -@interface RangePlot : PlotItem +@interface RangePlot : PlotItem @end diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 9191fe76e..ef761f2d4 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -9,10 +9,10 @@ @interface RangePlot() -@property (nonatomic, readwrite, strong) CPTGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; -@property (nonatomic, readwrite, strong) CPTFill *areaFill; -@property (nonatomic, readwrite, strong) CPTLineStyle *barLineStyle; +@property (nonatomic, readwrite, strong, nullable) CPTGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTFill *areaFill; +@property (nonatomic, readwrite, strong, nonnull) CPTLineStyle *barLineStyle; @end @@ -28,7 +28,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; @@ -68,7 +68,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -82,11 +82,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #endif CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:bounds]; + self.graph = newGraph; + [self addGraph:newGraph toHostingView:hostingView]; [self applyTheme:theme toGraph:newGraph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]]; newGraph.plotAreaFrame.masksToBorder = NO; - self.graph = newGraph; // Instructions CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; @@ -176,12 +177,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } @@ -189,7 +190,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point { CPTRangePlot *rangePlot = (CPTRangePlot *)[self.graph plotWithIdentifier:@"Range Plot"]; @@ -211,7 +212,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)eve #pragma mark - #pragma mark Plot Delegate Methods --(void)rangePlot:(CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)index +-(void)rangePlot:(nonnull CPTRangePlot *)plot rangeWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Range for '%@' was selected at index %d.", plot.identifier, (int)index); } diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.h b/examples/CorePlotGallery/src/plots/RealTimePlot.h index deead9655..dff911140 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.h +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.h @@ -7,6 +7,6 @@ @interface RealTimePlot : PlotItem --(void)newData:(NSTimer *)theTimer; +-(void)newData:(nonnull NSTimer *)theTimer; @end diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 1d6a22c7d..d3815886e 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -13,9 +13,9 @@ @interface RealTimePlot() -@property (nonatomic, readwrite, strong) CPTMutableNumberArray plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTMutableNumberArray plotData; @property (nonatomic, readwrite, assign) NSUInteger currentIndex; -@property (nonatomic, readwrite, strong) NSTimer *dataTimer; +@property (nonatomic, readwrite, strong, nullable) NSTimer *dataTimer; @end @@ -30,7 +30,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { plotData = [[NSMutableArray alloc] initWithCapacity:kMaxDataPoints]; @@ -57,7 +57,7 @@ -(void)generateData self.currentIndex = 0; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -137,12 +137,13 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP [self.dataTimer invalidate]; if ( animated ) { - self.dataTimer = [NSTimer timerWithTimeInterval:1.0 / kFrameRate - target:self - selector:@selector(newData:) - userInfo:nil - repeats:YES]; - [[NSRunLoop mainRunLoop] addTimer:self.dataTimer forMode:NSRunLoopCommonModes]; + NSTimer *newTimer = [NSTimer timerWithTimeInterval:1.0 / kFrameRate + target:self + selector:@selector(newData:) + userInfo:nil + repeats:YES]; + self.dataTimer = newTimer; + [[NSRunLoop mainRunLoop] addTimer:newTimer forMode:NSRunLoopCommonModes]; } else { self.dataTimer = nil; @@ -157,7 +158,7 @@ -(void)dealloc #pragma mark - #pragma mark Timer callback --(void)newData:(NSTimer *)theTimer +-(void)newData:(nonnull NSTimer *)theTimer { CPTGraph *theGraph = (self.graphs)[0]; CPTPlot *thePlot = [theGraph plotWithIdentifier:kPlotIdentifier]; @@ -191,12 +192,12 @@ -(void)newData:(NSTimer *)theTimer #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 1a95fc643..cdc3103df 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -7,7 +7,7 @@ @interface SimplePieChart() -@property (nonatomic, readwrite, strong) CPTNumberArray plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTNumberArray plotData; @property (nonatomic, readwrite) NSUInteger offsetIndex; @property (nonatomic, readwrite) CGFloat sliceOffset; @@ -24,7 +24,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Simple Pie Chart"; @@ -43,7 +43,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -105,7 +105,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP graph.legendDisplacement = CGPointMake(-graph.paddingRight - CPTFloat(10.0), 0.0); } --(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index { static CPTMutableTextStyle *whiteText = nil; static dispatch_once_t onceToken = 0; @@ -124,12 +124,12 @@ -(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index #pragma mark - #pragma mark CPTPieChartDelegate Methods --(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index +-(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Data label for '%@' was selected at index %d.", plot.identifier, (int)index); } --(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index +-(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Slice was selected at index %d. Value = %f", (int)index, [self.plotData[index] doubleValue]); @@ -150,14 +150,14 @@ -(void)pieChart:(CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)in #pragma mark - #pragma mark CPTLegendDelegate Methods --(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx +-(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx { NSLog(@"Legend entry for '%@' was selected at index %lu.", plot.identifier, (unsigned long)idx); [CPTAnimation animate:self property:@"sliceOffset" - from:(idx == self.offsetIndex ? CPTNAN : 0.0) - to:(idx == self.offsetIndex ? 0.0 : 35.0) + from:CPTFloat(idx == self.offsetIndex ? NAN : 0.0) + to:CPTFloat(idx == self.offsetIndex ? 0.0 : 35.0) duration:0.5 animationCurve:CPTAnimationCurveCubicOut delegate:nil]; @@ -168,12 +168,12 @@ -(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelected #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -187,7 +187,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE UIColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].uiColor; @@ -209,7 +209,7 @@ -(NSAttributedString *)attributedLegendTitleForPieChart:(CPTPieChart *)pieChart return title; } --(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(CGFloat)radialOffsetForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { return index == self.offsetIndex ? self.sliceOffset : 0.0; } diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index ab5e70cec..4aec27e7b 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -7,8 +7,8 @@ @interface SimpleScatterPlot() -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *symbolTextAnnotation; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @property (nonatomic, readwrite, assign) CPTScatterPlotHistogramOption histogramOption; @end @@ -24,7 +24,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Simple Scatter Plot"; @@ -65,7 +65,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -184,12 +184,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; @@ -200,7 +200,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { @@ -217,7 +217,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTXYGraph *graph = (self.graphs)[0]; @@ -260,17 +260,17 @@ -(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NS } } --(void)scatterPlotDataLineWasSelected:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineWasSelected:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineWasSelected: %@", plot); } --(void)scatterPlotDataLineTouchDown:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineTouchDown:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineTouchDown: %@", plot); } --(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot +-(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot { NSLog(@"scatterPlotDataLineTouchUp: %@", plot); } @@ -278,7 +278,7 @@ -(void)scatterPlotDataLineTouchUp:(CPTScatterPlot *)plot #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { CPTXYGraph *graph = [self.graphs objectAtIndex:0]; diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index f1e11c6fe..7a1d9fc36 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -7,7 +7,7 @@ @interface SteppedScatterPlot() -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -20,7 +20,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Stepped Scatter Plot"; @@ -44,7 +44,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -102,7 +102,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark CPTScatterPlotDelegate Methods --(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index +-(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Data label for '%@' was selected at index %d.", plot.identifier, (int)index); } @@ -110,12 +110,12 @@ -(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index 759a078b9..257e0644c 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -9,7 +9,7 @@ @interface VerticalBarChart() -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *symbolTextAnnotation; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *symbolTextAnnotation; @end @implementation VerticalBarChart @@ -21,7 +21,7 @@ +(void)load [super registerPlotItem:self]; } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { self.title = @"Vertical Bar Chart"; @@ -50,7 +50,7 @@ -(void)generateData { } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -234,12 +234,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark CPTBarPlot delegate methods --(void)plot:(CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index +-(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"Data label for '%@' was selected at index %d.", plot.identifier, (int)index); } --(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSNumber *value = [self numberForPlot:plot field:CPTBarPlotFieldBarTip recordIndex:index]; @@ -287,12 +287,12 @@ -(void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return 10; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { id num = nil; diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index da4d27215..32d50adb7 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -17,7 +17,7 @@ @implementation PiNumberFormatter * @param coordinateValue The numeric value. * @return The formatted string. **/ --(NSString *)stringForObjectValue:(id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue { NSString *string = nil; diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.h b/examples/CorePlotGallery/src/shared/PlotGallery.h index 31441d294..96a11e43b 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.h +++ b/examples/CorePlotGallery/src/shared/PlotGallery.h @@ -9,15 +9,15 @@ @property (nonatomic, readonly) NSUInteger count; @property (nonatomic, readonly) NSUInteger numberOfSections; -@property (nonatomic, readonly, strong) CPTStringArray sectionTitles; +@property (nonatomic, readonly, strong, nonnull) CPTStringArray sectionTitles; -+(PlotGallery *)sharedPlotGallery; ++(nonnull PlotGallery *)sharedPlotGallery; --(void)addPlotItem:(PlotItem *)plotItem; +-(void)addPlotItem:(nonnull PlotItem *)plotItem; -(void)sortByTitle; --(PlotItem *)objectInSection:(NSUInteger)section atIndex:(NSUInteger)index; +-(nonnull PlotItem *)objectInSection:(NSUInteger)section atIndex:(NSUInteger)index; -(NSUInteger)numberOfRowsInSection:(NSUInteger)section; @end diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index 491d1191d..5abe25fe9 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -19,7 +19,7 @@ @implementation PlotGallery static PlotGallery *sharedPlotGallery = nil; -+(PlotGallery *)sharedPlotGallery ++(nonnull PlotGallery *)sharedPlotGallery { @synchronized(self) { @@ -41,7 +41,7 @@ +(id)allocWithZone:(NSZone *)zone return sharedPlotGallery; } --(instancetype)init +-(nonnull instancetype)init { Class thisClass = [self class]; @@ -59,12 +59,12 @@ -(instancetype)init return sharedPlotGallery; } --(id)copyWithZone:(NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *)zone { return self; } --(void)addPlotItem:(PlotItem *)plotItem +-(void)addPlotItem:(nonnull PlotItem *)plotItem { [self.plotItems addObject:plotItem]; @@ -89,7 +89,7 @@ -(NSUInteger)numberOfRowsInSection:(NSUInteger)section return [self.plotSections countForObject:self.sectionTitles[section]]; } --(PlotItem *)objectInSection:(NSUInteger)section atIndex:(NSUInteger)index +-(nonnull PlotItem *)objectInSection:(NSUInteger)section atIndex:(NSUInteger)index { NSUInteger offset = 0; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.h b/examples/CorePlotGallery/src/shared/PlotItem.h index b7e7b5a24..c8c7c4f8b 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.h +++ b/examples/CorePlotGallery/src/shared/PlotItem.h @@ -19,47 +19,47 @@ typedef NSRect CGNSRect; typedef NSView PlotGalleryNativeView; #endif -extern NSString *const kDemoPlots; -extern NSString *const kPieCharts; -extern NSString *const kLinePlots; -extern NSString *const kBarPlots; -extern NSString *const kFinancialPlots; +extern NSString *__nonnull const kDemoPlots; +extern NSString *__nonnull const kPieCharts; +extern NSString *__nonnull const kLinePlots; +extern NSString *__nonnull const kBarPlots; +extern NSString *__nonnull const kFinancialPlots; @class CPTGraph; @class CPTTheme; @interface PlotItem : NSObject -@property (nonatomic, readwrite, strong) CPTGraphHostingView *defaultLayerHostingView; +@property (nonatomic, readwrite, strong, nullable) CPTGraphHostingView *defaultLayerHostingView; -@property (nonatomic, readwrite, strong) NSMutableArray<__kindof CPTGraph *> *graphs; -@property (nonatomic, readwrite, strong) NSString *section; -@property (nonatomic, readwrite, strong) NSString *title; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray<__kindof CPTGraph *> *graphs; +@property (nonatomic, readwrite, strong, nonnull) NSString *section; +@property (nonatomic, readwrite, strong, nonnull) NSString *title; @property (nonatomic, readonly) CGFloat titleSize; -+(void)registerPlotItem:(id)item; ++(void)registerPlotItem:(nonnull id)item; --(void)renderInView:(PlotGalleryNativeView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated; --(CPTNativeImage *)image; +-(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated; +-(nonnull CPTNativeImage *)image; #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE #else -(void)setFrameSize:(NSSize)size; #endif --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated; +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated; -(void)formatAllGraphs; -(void)reloadData; --(void)applyTheme:(CPTTheme *)theme toGraph:(CPTGraph *)graph withDefault:(CPTTheme *)defaultTheme; +-(void)applyTheme:(nullable CPTTheme *)theme toGraph:(nonnull CPTGraph *)graph withDefault:(nullable CPTTheme *)defaultTheme; --(void)addGraph:(CPTGraph *)graph; --(void)addGraph:(CPTGraph *)graph toHostingView:(CPTGraphHostingView *)hostingView; +-(void)addGraph:(nonnull CPTGraph *)graph; +-(void)addGraph:(nonnull CPTGraph *)graph toHostingView:(nullable CPTGraphHostingView *)hostingView; -(void)killGraph; -(void)generateData; --(NSComparisonResult)titleCompare:(PlotItem *)other; +-(NSComparisonResult)titleCompare:(nonnull PlotItem *)other; @end diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index efaa9b3a1..35db805c5 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -36,7 +36,7 @@ @implementation PlotItem @synthesize cachedImage; @dynamic titleSize; -+(void)registerPlotItem:(id)item ++(void)registerPlotItem:(nonnull id)item { NSLog(@"registerPlotItem for class %@", [item class]); @@ -51,7 +51,7 @@ +(void)registerPlotItem:(id)item } } --(instancetype)init +-(nonnull instancetype)init { if ( (self = [super init]) ) { defaultLayerHostingView = nil; @@ -64,7 +64,7 @@ -(instancetype)init return self; } --(void)addGraph:(CPTGraph *)graph toHostingView:(CPTGraphHostingView *)hostingView +-(void)addGraph:(nonnull CPTGraph *)graph toHostingView:(nullable CPTGraphHostingView *)hostingView { [self.graphs addObject:graph]; @@ -73,7 +73,7 @@ -(void)addGraph:(CPTGraph *)graph toHostingView:(CPTGraphHostingView *)hostingVi } } --(void)addGraph:(CPTGraph *)graph +-(void)addGraph:(nonnull CPTGraph *)graph { [self addGraph:graph toHostingView:nil]; } @@ -106,7 +106,7 @@ -(void)generateData { } --(NSComparisonResult)titleCompare:(PlotItem *)other +-(NSComparisonResult)titleCompare:(nonnull PlotItem *)other { NSComparisonResult comparisonResult = [self.section caseInsensitiveCompare:other.section]; @@ -142,7 +142,7 @@ -(CGFloat)titleSize return size; } --(void)setPaddingDefaultsForGraph:(CPTGraph *)graph +-(void)setPaddingDefaultsForGraph:(nonnull CPTGraph *)graph { CGFloat boundsPadding = self.titleSize; @@ -240,7 +240,7 @@ -(void)formatAllGraphs #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE --(UIImage *)image +-(nonnull UIImage *)image { if ( self.cachedImage == nil ) { CGRect imageFrame = CGRectMake(0, 0, 400, 300); @@ -285,7 +285,7 @@ -(UIImage *)image #else // OSX --(NSImage *)image +-(nonnull NSImage *)image { if ( self.cachedImage == nil ) { CGRect imageFrame = CGRectMake(0, 0, 400, 300); @@ -326,7 +326,7 @@ -(NSImage *)image } #endif --(void)applyTheme:(CPTTheme *)theme toGraph:(CPTGraph *)graph withDefault:(CPTTheme *)defaultTheme +-(void)applyTheme:(nullable CPTTheme *)theme toGraph:(nonnull CPTGraph *)graph withDefault:(nullable CPTTheme *)defaultTheme { if ( theme == nil ) { [graph applyTheme:defaultTheme]; @@ -343,7 +343,7 @@ -(void)setFrameSize:(NSSize)size } #endif --(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInView:(nonnull PlotGalleryNativeView *)inView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { [self killGraph]; @@ -394,7 +394,7 @@ -(void)renderInView:(PlotGalleryNativeView *)inView withTheme:(CPTTheme *)theme self.defaultLayerHostingView = hostingView; } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated { NSLog(@"PlotItem:renderInLayer: Override me"); } diff --git a/examples/DropPlot/CPTPlotDocument.h b/examples/DropPlot/CPTPlotDocument.h index 53ca54d7a..695e3165f 100644 --- a/examples/DropPlot/CPTPlotDocument.h +++ b/examples/DropPlot/CPTPlotDocument.h @@ -7,7 +7,7 @@ -(IBAction)zoomOut; // PDF / image export --(IBAction)exportToPDF:(id)sender; --(IBAction)exportToPNG:(id)sender; +-(IBAction)exportToPDF:(nullable id)sender; +-(IBAction)exportToPNG:(nullable id)sender; @end diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index f78f76829..2eb51fd72 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -3,8 +3,8 @@ @interface CPTPlotDocument() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *graphView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *graphView; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; @property (nonatomic, readwrite, assign) double minimumValueForXAxis; @property (nonatomic, readwrite, assign) double maximumValueForXAxis; @@ -14,7 +14,7 @@ @interface CPTPlotDocument() @property (nonatomic, readwrite, assign) double majorIntervalLengthForY; @property (nonatomic, readwrite, strong) NSArray *dataPoints; -@property (nonatomic, readwrite, strong) CPTPlotSpaceAnnotation *zoomAnnotation; +@property (nonatomic, readwrite, strong, nullable) CPTPlotSpaceAnnotation *zoomAnnotation; @property (nonatomic, readwrite, assign) CGPoint dragStart; @property (nonatomic, readwrite, assign) CGPoint dragEnd; @@ -42,7 +42,7 @@ @implementation CPTPlotDocument // #define USE_NSDECIMAL --(instancetype)init +-(nonnull instancetype)init { self = [super init]; if ( self ) { @@ -54,12 +54,12 @@ -(instancetype)init return self; } --(NSString *)windowNibName +-(nullable NSString *)windowNibName { return @"CPTPlotDocument"; } --(void)windowControllerDidLoadNib:(NSWindowController *)windowController +-(void)windowControllerDidLoadNib:(nonnull NSWindowController *)windowController { // Create graph from theme CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; @@ -128,7 +128,7 @@ -(void)windowControllerDidLoadNib:(NSWindowController *)windowController #pragma mark - #pragma mark Data loading methods --(NSData *)dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError +-(nullable NSData *)dataOfType:(nonnull NSString *)typeName error:(NSError *__autoreleasing __nullable *)outError { // Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil. @@ -142,7 +142,7 @@ -(NSData *)dataOfType:(NSString *)typeName error:(NSError *__autoreleasing *)out return nil; } --(BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError +-(BOOL)readFromData:(nonnull NSData *)data ofType:(NSString *)typeName error:(NSError *__autoreleasing __nullable *)outError { if ( [typeName isEqualToString:@"CSVDocument"] ) { double minX = (double)INFINITY; @@ -308,7 +308,7 @@ -(IBAction)zoomOut #pragma mark - #pragma mark PDF / image export --(IBAction)exportToPDF:(id)sender +-(IBAction)exportToPDF:(nullable id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; @@ -324,7 +324,7 @@ -(IBAction)exportToPDF:(id)sender } } --(IBAction)exportToPNG:(id)sender +-(IBAction)exportToPNG:(nullable id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; @@ -346,12 +346,12 @@ -(IBAction)exportToPNG:(id)sender #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.dataPoints.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); @@ -361,7 +361,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI #pragma mark - #pragma mark Plot Space Delegate Methods --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; @@ -388,7 +388,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(C return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { if ( !self.zoomAnnotation ) { self.dragStart = interactionPoint; @@ -429,7 +429,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTN return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; @@ -461,7 +461,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNat return NO; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; diff --git a/examples/MinorTickLabels/Controller.m b/examples/MinorTickLabels/Controller.m index 2b1684769..28395c4b5 100644 --- a/examples/MinorTickLabels/Controller.m +++ b/examples/MinorTickLabels/Controller.m @@ -3,9 +3,9 @@ @interface Controller() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -98,12 +98,12 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } diff --git a/examples/RangePlot/Controller.m b/examples/RangePlot/Controller.m index d2b16d02e..51b78dcee 100644 --- a/examples/RangePlot/Controller.m +++ b/examples/RangePlot/Controller.m @@ -3,11 +3,11 @@ @interface Controller() -@property (nonatomic, readwrite, strong) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, strong) CPTXYGraph *graph; -@property (nonatomic, readwrite, strong) NSArray *plotData; -@property (nonatomic, readwrite, strong) CPTFill *areaFill; -@property (nonatomic, readwrite, strong) CPTLineStyle *barLineStyle; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; +@property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; +@property (nonatomic, readwrite, strong, nonnull) CPTFill *areaFill; +@property (nonatomic, readwrite, strong, nonnull) CPTLineStyle *barLineStyle; @end @@ -124,17 +124,17 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return self.plotData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point { CPTRangePlot *rangePlot = (CPTRangePlot *)[self.graph plotWithIdentifier:@"Date Plot"]; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.h b/examples/StockPlot/Classes/APYahooDataPuller.h index 0185dd8d0..0a69082f5 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.h +++ b/examples/StockPlot/Classes/APYahooDataPuller.h @@ -4,31 +4,33 @@ typedef NSArray *CPTFinancialDataArray; -@protocol APYahooDataPullerDelegate +@protocol APYahooDataPullerDelegate @optional --(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp; --(void)dataPuller:(APYahooDataPuller *)dp downloadDidFailWithError:(NSError *)error; +-(void)dataPullerFinancialDataDidChange:(nonnull APYahooDataPuller *)dp; +-(void)dataPuller:(nonnull APYahooDataPuller *)dp downloadDidFailWithError:(nonnull NSError *)error; @end -@interface APYahooDataPuller : NSObject - -@property (nonatomic, readwrite, weak) id delegate; -@property (nonatomic, readwrite, copy) NSString *symbol; -@property (nonatomic, readwrite, strong) NSDate *startDate; -@property (nonatomic, readwrite, strong) NSDate *endDate; -@property (nonatomic, readwrite, copy) NSString *targetSymbol; -@property (nonatomic, readwrite, strong) NSDate *targetStartDate; -@property (nonatomic, readwrite, strong) NSDate *targetEndDate; -@property (nonatomic, readonly, strong) CPTFinancialDataArray financialData; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallHigh; -@property (nonatomic, readonly, strong) NSDecimalNumber *overallLow; +#pragma mark - + +@interface APYahooDataPuller : NSObject + +@property (nonatomic, readwrite, weak, nullable) id delegate; +@property (nonatomic, readwrite, copy, nonnull) NSString *symbol; +@property (nonatomic, readwrite, strong, nonnull) NSDate *startDate; +@property (nonatomic, readwrite, strong, nonnull) NSDate *endDate; +@property (nonatomic, readwrite, copy, nonnull) NSString *targetSymbol; +@property (nonatomic, readwrite, strong, nonnull) NSDate *targetStartDate; +@property (nonatomic, readwrite, strong, nonnull) NSDate *targetEndDate; +@property (nonatomic, readonly, strong, nonnull) CPTFinancialDataArray financialData; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallHigh; +@property (nonatomic, readonly, strong, nonnull) NSDecimalNumber *overallLow; @property (nonatomic, readonly, assign) BOOL loadingData; @property (nonatomic, readonly, assign) BOOL staleData; --(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate; +-(nonnull instancetype)initWithTargetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate; -(void)fetchIfNeeded; -(void)cancelDownload; diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index 9b5c5c35c..14cd0face 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -3,18 +3,29 @@ @interface APYahooDataPuller() -@property (nonatomic, readwrite, copy) NSString *csvString; +@property (nonatomic, readwrite, copy, nonnull) NSString *csvString; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallHigh; -@property (nonatomic, readwrite, strong) NSDecimalNumber *overallLow; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallHigh; +@property (nonatomic, readwrite, strong, nonnull) NSDecimalNumber *overallLow; @property (nonatomic, readwrite, strong) CPTFinancialDataArray financialData; @property (nonatomic, readwrite, assign) BOOL loadingData; -@property (nonatomic, readwrite, strong) NSMutableData *receivedData; -@property (nonatomic, readwrite, strong) NSURLConnection *connection; +@property (nonatomic, readwrite, strong, nullable) NSMutableData *receivedData; +@property (nonatomic, readwrite, strong, nullable) NSURLConnection *connection; NSTimeInterval timeIntervalForNumberOfWeeks(double numberOfWeeks); +-(nonnull CPTDictionary)sanitizedFinancialLine:(nonnull CPTDictionary)theFinancialLine; + +-(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate; + +-(nonnull CPTDictionary)plistRep; +-(BOOL)writeToFile:(nonnull NSString *)path atomically:(BOOL)flag; +-(nonnull NSString *)URL; +-(nonnull NSString *)pathForSymbol:(nonnull NSString *)aSymbol; +-(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol; +-(nonnull CPTDictionary)dictionaryForSymbol:(nonnull NSString *)aSymbol; + @end #pragma mark - @@ -47,7 +58,7 @@ @implementation APYahooDataPuller @synthesize delegate; // convert any NSNumber in financial line to NSDecimalNumber --(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine +-(nonnull CPTDictionary)sanitizedFinancialLine:(nonnull CPTDictionary)theFinancialLine { CPTMutableDictionary aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; @@ -61,7 +72,7 @@ -(CPTDictionary)sanitizedFinancialLine:(CPTDictionary)theFinancialLine return [NSDictionary dictionaryWithDictionary:aFinancialLine]; } --(void)setFinancialData:(NSArray *)aFinancialData +-(void)setFinancialData:(nonnull NSArray *)aFinancialData { // NSLog(@"in -setFinancialData:, old value of financialData: %@, changed to: %@", financialData, aFinancialData); @@ -84,7 +95,7 @@ -(void)setFinancialData:(NSArray *)aFinancialData } } --(CPTDictionary)plistRep +-(nonnull CPTDictionary)plistRep { CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; @@ -98,32 +109,40 @@ -(CPTDictionary)plistRep return [NSDictionary dictionaryWithDictionary:rep]; } --(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag +-(BOOL)writeToFile:(nonnull NSString *)path atomically:(BOOL)flag { NSLog(@"writeToFile:%@", path); BOOL success = [[self plistRep] writeToFile:path atomically:flag]; return success; } --(instancetype)initWithDictionary:(CPTDictionary)aDict targetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate { self = [super init]; if ( self != nil ) { - self.symbol = aDict[@"symbol"]; - self.startDate = aDict[@"startDate"]; - self.overallLow = [NSDecimalNumber decimalNumberWithDecimal:[aDict[@"overallLow"] decimalValue]]; - self.overallHigh = [NSDecimalNumber decimalNumberWithDecimal:[aDict[@"overallHigh"] decimalValue]]; - self.endDate = aDict[@"endDate"]; - self.financialData = aDict[@"financialData"]; + NSString *theSymbol = aDict[@"symbol"]; + self.symbol = theSymbol ? theSymbol : @""; + NSDate *theStartDate = aDict[@"startDate"]; + self.startDate = theStartDate ? theStartDate : [NSDate date]; + NSDate *theEndDate = aDict[@"endDate"]; + self.endDate = theEndDate ? theEndDate : [NSDate date]; + NSNumber *low = aDict[@"overallLow"]; + self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[low decimalValue]] : [NSDecimalNumber notANumber]; + NSNumber *high = aDict[@"overallHigh"]; + self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[high decimalValue]] : [NSDecimalNumber notANumber]; + CPTFinancialDataArray dataArray = aDict[@"financialData"]; + self.financialData = dataArray ? dataArray : [[NSArray alloc] init]; self.targetSymbol = aSymbol; self.targetStartDate = aStartDate; self.targetEndDate = anEndDate; + + self.csvString = @""; } return self; } --(NSString *)pathForSymbol:(NSString *)aSymbol +-(nonnull NSString *)pathForSymbol:(nonnull NSString *)aSymbol { CPTStringArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = paths[0]; @@ -132,7 +151,7 @@ -(NSString *)pathForSymbol:(NSString *)aSymbol return docPath; } --(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol +-(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol { NSString *docPath = [self pathForSymbol:aSymbol]; @@ -144,7 +163,7 @@ -(NSString *)faultTolerantPathForSymbol:(NSString *)aSymbol } // Always returns *something* --(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol +-(nonnull CPTDictionary)dictionaryForSymbol:(nonnull NSString *)aSymbol { NSString *path = [self faultTolerantPathForSymbol:aSymbol]; @@ -153,7 +172,7 @@ -(CPTDictionary)dictionaryForSymbol:(NSString *)aSymbol return localPlistDict; } --(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate *)aStartDate targetEndDate:(NSDate *)anEndDate +-(nonnull instancetype)initWithTargetSymbol:(nonnull NSString *)aSymbol targetStartDate:(nonnull NSDate *)aStartDate targetEndDate:(nonnull NSDate *)anEndDate { CPTDictionary cachedDictionary = [self dictionaryForSymbol:aSymbol]; @@ -172,7 +191,7 @@ -(instancetype)initWithTargetSymbol:(NSString *)aSymbol targetStartDate:(NSDate return [self initWithDictionary:rep targetSymbol:aSymbol targetStartDate:aStartDate targetEndDate:anEndDate]; } --(instancetype)init +-(nonnull instancetype)init { NSTimeInterval secondsAgo = -timeIntervalForNumberOfWeeks(14.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; @@ -188,35 +207,45 @@ -(void)dealloc } // http://www.goldb.org/ystockquote.html --(NSString *)URL +-(nonnull NSString *)URL { - unsigned int unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitYear; + NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitYear; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:self.targetStartDate]; - NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:self.targetEndDate]; - NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + NSDate *tStartDate = self.targetStartDate; + + if ( tStartDate ) { + NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:tStartDate]; + + url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + } + + NSDate *tEndDate = self.targetEndDate; + if ( tEndDate ) { + NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:tEndDate]; + + url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + } - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; url = [url stringByAppendingString:@"g=d&"]; url = [url stringByAppendingString:@"ignore=.csv"]; url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return url; } -(void)notifyFinancesChanged { - id theDelegate = self.delegate; + id theDelegate = self.delegate; if ( [theDelegate respondsToSelector:@selector(dataPullerFinancialDataDidChange:)] ) { [theDelegate performSelector:@selector(dataPullerFinancialDataDidChange:) withObject:self]; @@ -264,13 +293,13 @@ -(void)fetchIfNeeded } } --(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data +-(void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data { // append the new data to the receivedData [self.receivedData appendData:data]; } --(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response +-(void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response { // this method is called when the server has determined that it // has enough information to create the NSURLResponse @@ -290,7 +319,7 @@ -(void)cancelDownload } } --(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error +-(void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error { self.loadingData = NO; self.receivedData = nil; @@ -298,19 +327,25 @@ -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro NSLog(@"err = %@", [error localizedDescription]); self.connection = nil; - id theDelegate = self.delegate; + id theDelegate = self.delegate; if ( [theDelegate respondsToSelector:@selector(dataPuller:downloadDidFailWithError:)] ) { [theDelegate performSelector:@selector(dataPuller:downloadDidFailWithError:) withObject:self withObject:error]; } } --(void)connectionDidFinishLoading:(NSURLConnection *)connection +-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection { self.loadingData = NO; self.connection = nil; - NSString *csv = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; - [self populateWithString:csv]; + NSMutableData *data = self.receivedData; + if ( data ) { + NSString *csv = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + [self populateWithString:csv]; + } + else { + [self populateWithString:@""]; + } self.receivedData = nil; [self writeToFile:[self pathForSymbol:self.symbol] atomically:YES]; diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.h b/examples/StockPlot/Classes/APYahooDataPullerGraph.h index 4e66dffb9..7e4f72c24 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.h +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.h @@ -12,7 +12,7 @@ @interface APYahooDataPullerGraph : UIViewController -@property (nonatomic, strong) IBOutlet CPTGraphHostingView *graphHost; -@property (nonatomic, strong) APYahooDataPuller *dataPuller; +@property (nonatomic, strong, nullable) IBOutlet CPTGraphHostingView *graphHost; +@property (nonatomic, strong, nonnull) APYahooDataPuller *dataPuller; @end diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 22dd4ad53..a009ae6e4 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -119,7 +119,7 @@ -(NSUInteger)numberOfRecords return self.dataPuller.financialData.count; } --(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = @0; @@ -137,14 +137,14 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI return num; } --(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp +-(void)dataPullerFinancialDataDidChange:(nonnull APYahooDataPuller *)dp { [self reloadData]; } #pragma mark accessors --(void)setDataPuller:(APYahooDataPuller *)aDataPuller +-(void)setDataPuller:(nonnull APYahooDataPuller *)aDataPuller { // NSLog(@"in -setDataPuller:, old value of dataPuller: %@, changed to: %@", dataPuller, aDataPuller); @@ -162,7 +162,7 @@ -(void)dealloc } } --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { return [self numberOfRecords]; } diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h index 6ede21860..9a2509602 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.h +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.h @@ -2,6 +2,6 @@ @interface NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine; ++(nonnull CPTDictionary)dictionaryWithCSVLine:(nonnull NSString *)csvLine; @end diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 60f20707b..0fb7ddaf2 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -2,13 +2,15 @@ @interface NSDateFormatter(yahooCSVDateFormatter) -+(NSDateFormatter *)yahooCSVDateFormatter; ++(nonnull NSDateFormatter *)yahooCSVDateFormatter; @end +#pragma mark - + @implementation NSDateFormatter(yahooCSVDateFormatter) -+(NSDateFormatter *)yahooCSVDateFormatter ++(nonnull NSDateFormatter *)yahooCSVDateFormatter { static NSDateFormatter *df = nil; static dispatch_once_t onceToken = 0; @@ -23,9 +25,11 @@ +(NSDateFormatter *)yahooCSVDateFormatter @end +#pragma mark - + @implementation NSDictionary(APFinancialData) -+(CPTDictionary)dictionaryWithCSVLine:(NSString *)csvLine ++(nonnull CPTDictionary)dictionaryWithCSVLine:(nonnull NSString *)csvLine { CPTStringArray csvChunks = [csvLine componentsSeparatedByString:@","]; diff --git a/examples/StockPlot/Classes/RootViewController.h b/examples/StockPlot/Classes/RootViewController.h index 17517ed85..0c0774805 100644 --- a/examples/StockPlot/Classes/RootViewController.h +++ b/examples/StockPlot/Classes/RootViewController.h @@ -12,8 +12,8 @@ @interface RootViewController : UITableViewController -@property (nonatomic, readonly, strong) CPTStringArray symbols; +@property (nonatomic, readonly, strong, nonnull) CPTStringArray symbols; --(void)addSymbol:(NSString *)aSymbol; +-(void)addSymbol:(nonnull NSString *)aSymbol; @end diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index 9d12f31c5..0619048a1 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -11,8 +11,8 @@ @interface RootViewController() -@property (nonatomic, readwrite, strong) APYahooDataPullerGraph *graph; -@property (nonatomic, readwrite, strong) NSMutableArray *stocks; +@property (nonatomic, readwrite, strong, nonnull) APYahooDataPullerGraph *graph; +@property (nonatomic, readwrite, strong, nonnull) NSMutableArray *stocks; @end @@ -55,7 +55,7 @@ -(void)viewWillAppear:(BOOL)animated #pragma mark Table view methods --(void)inspectStock:(APYahooDataPuller *)aStock +-(void)inspectStock:(nonnull APYahooDataPuller *)aStock { NSDecimalNumber *high = [aStock overallHigh]; NSDecimalNumber *low = [aStock overallLow]; @@ -78,7 +78,7 @@ -(void)inspectStock:(APYahooDataPuller *)aStock } // Override to support row selection in the table view. --(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +-(void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath { APYahooDataPuller *dp = self.stocks[(NSUInteger)indexPath.row]; @@ -86,18 +86,18 @@ -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath * [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } --(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +-(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tableView { return 1; } // Customize the number of rows in the table view. --(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return (NSInteger)self.stocks.count; } --(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row +-(void)setupCell:(nonnull UITableViewCell *)cell forStockAtIndex:(NSUInteger)row { APYahooDataPuller *dp = self.stocks[row]; @@ -162,7 +162,7 @@ -(void)setupCell:(UITableViewCell *)cell forStockAtIndex:(NSUInteger)row } // Customize the appearance of table view cells. --(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +-(UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { static NSString *CellIdentifier = @"UITableViewCellStyleSubtitle"; @@ -187,7 +187,7 @@ -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie #pragma mark - #pragma mark accessors --(CPTStringArray)symbols +-(nonnull CPTStringArray)symbols { // NSLog(@"in -symbols, returned symbols = %@", symbols); CPTMutableStringArray symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; @@ -198,7 +198,7 @@ -(CPTStringArray)symbols return [NSArray arrayWithArray:symbols]; } --(void)dataPuller:(APYahooDataPuller *)dp downloadDidFailWithError:(NSError *)error +-(void)dataPuller:(nonnull APYahooDataPuller *)dp downloadDidFailWithError:(nonnull NSError *)error { NSLog(@"dataPuller:%@ downloadDidFailWithError:%@", dp, error); NSUInteger idx = [self.stocks indexOfObject:dp]; @@ -208,7 +208,7 @@ -(void)dataPuller:(APYahooDataPuller *)dp downloadDidFailWithError:(NSError *)er [self setupCell:cell forStockAtIndex:idx]; } --(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp +-(void)dataPullerFinancialDataDidChange:(nonnull APYahooDataPuller *)dp { NSLog(@"dataPullerFinancialDataDidChange:%@", dp); NSUInteger idx = [self.stocks indexOfObject:dp]; @@ -218,7 +218,7 @@ -(void)dataPullerFinancialDataDidChange:(APYahooDataPuller *)dp [self setupCell:cell forStockAtIndex:idx]; } --(void)addSymbol:(NSString *)aSymbol +-(void)addSymbol:(nonnull NSString *)aSymbol { NSTimeInterval secondsAgo = -fabs(60.0 * 60.0 * 24.0 * 7.0 * 12.0); // 12 weeks ago NSDate *start = [NSDate dateWithTimeIntervalSinceNow:secondsAgo]; @@ -271,7 +271,7 @@ -(void)dealloc /* * // Override to support row selection in the table view. - * - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + * - (void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath { * * // Navigation logic may go here -- for example, create and push another view controller. * // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; @@ -282,7 +282,7 @@ -(void)dealloc /* * // Override to support conditional editing of the table view. - * - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + * - (BOOL)tableView:(nonnull UITableView *)tableView canEditRowAtIndexPath:(nonnull NSIndexPath *)indexPath { * // Return NO if you do not want the specified item to be editable. * return YES; * } @@ -290,7 +290,7 @@ -(void)dealloc /* * // Override to support editing the table view. - * - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + * - (void)tableView:(nonnull UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(nonnull NSIndexPath *)indexPath { * * if (editingStyle == UITableViewCellEditingStyleDelete) { * // Delete the row from the data source. @@ -304,13 +304,13 @@ -(void)dealloc /* * // Override to support rearranging the table view. - * - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { + * - (void)tableView:(nonnull UITableView *)tableView moveRowAtIndexPath:(nonnull NSIndexPath *)fromIndexPath toIndexPath:(nonnull NSIndexPath *)toIndexPath { * } */ /* * // Override to support conditional rearranging of the table view. - * - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { + * - (BOOL)tableView:(nonnull UITableView *)tableView canMoveRowAtIndexPath:(nonnull NSIndexPath *)indexPath { * // Return NO if you do not want the item to be re-orderable. * return YES; * } diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.h b/examples/StockPlot/Classes/StockPlotAppDelegate.h index 3ded41f62..8ef6cdd9d 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.h +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.h @@ -8,7 +8,7 @@ @interface StockPlotAppDelegate : NSObject -@property (nonatomic, strong) IBOutlet UIWindow *window; -@property (nonatomic, strong) IBOutlet UINavigationController *navigationController; +@property (nonatomic, strong, nullable) IBOutlet UIWindow *window; +@property (nonatomic, strong, nullable) IBOutlet UINavigationController *navigationController; @end diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.m b/examples/StockPlot/Classes/StockPlotAppDelegate.m index 69dff4698..00bbba1ae 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.m +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.m @@ -17,7 +17,7 @@ @implementation StockPlotAppDelegate #pragma mark - #pragma mark Application lifecycle --(void)applicationDidFinishLaunching:(UIApplication *)application +-(void)applicationDidFinishLaunching:(nonnull UIApplication *)application { [[self.navigationController navigationBar] setTintColor:[UIColor blackColor]]; @@ -25,7 +25,7 @@ -(void)applicationDidFinishLaunching:(UIApplication *)application [self.window makeKeyAndVisible]; } --(void)applicationWillTerminate:(UIApplication *)application +-(void)applicationWillTerminate:(nonnull UIApplication *)application { // Save data if appropriate } diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index eb439fdde..1aede27c1 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -375,7 +375,7 @@ -(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot return count; } --(CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange +-(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange { CPTNumericData *numericData = nil; From ef1ec2b22b63b01cc197730037e2d8f6664350f0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:14:05 -0400 Subject: [PATCH 175/429] Converted the framework projects to modern Objective-C syntax with Xcode 7.2.1. --- framework/MacOnly/CPTGraphHostingView.m | 10 +++--- .../MacOnly/CPTPlatformSpecificCategories.m | 2 +- .../MacOnly/CPTPlatformSpecificFunctions.h | 2 +- .../MacOnly/CPTPlatformSpecificFunctions.m | 2 +- .../MacOnly/CPTTextStylePlatformSpecific.m | 8 ++--- framework/Source/CPTAnimation.m | 12 +++---- framework/Source/CPTAnimationOperation.m | 2 +- framework/Source/CPTAnimationPeriod.m | 2 +- framework/Source/CPTAnnotation.m | 8 ++--- framework/Source/CPTAnnotationHostLayer.m | 4 +-- framework/Source/CPTAxis.m | 8 ++--- framework/Source/CPTAxisLabel.m | 2 +- framework/Source/CPTBarPlot.m | 4 +-- framework/Source/CPTBorderedLayer.m | 28 +++++++-------- framework/Source/CPTDarkGradientThemeTests.m | 2 +- framework/Source/CPTDataSourceTestCase.m | 10 +++--- framework/Source/CPTGradient.h | 4 +-- framework/Source/CPTGradient.m | 4 +-- framework/Source/CPTGraph.m | 12 +++---- framework/Source/CPTImage.m | 2 +- framework/Source/CPTLayer.m | 18 +++++----- framework/Source/CPTLegend.m | 16 ++++----- framework/Source/CPTLimitBand.m | 6 ++-- framework/Source/CPTMutableNumericData.h | 4 +-- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTMutableNumericDataTests.m | 24 ++++++------- ...CPTMutableNumericDataTypeConversionTests.m | 24 ++++++------- framework/Source/CPTNumericData.h | 4 +-- framework/Source/CPTNumericData.m | 12 +++---- framework/Source/CPTNumericDataTests.m | 30 ++++++++-------- framework/Source/CPTNumericDataType.m | 6 ++-- .../CPTNumericDataTypeConversionTests.m | 30 ++++++++-------- framework/Source/CPTPathExtensions.h | 5 +++ framework/Source/CPTPieChart.m | 2 +- framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 24 ++++++------- framework/Source/CPTPlotArea.m | 12 +++---- framework/Source/CPTPlotAreaFrame.m | 2 +- framework/Source/CPTPlotGroup.m | 2 +- framework/Source/CPTPlotRange.m | 6 ++-- framework/Source/CPTPlotSpace.m | 2 +- framework/Source/CPTPlotSpaceAnnotation.m | 2 +- framework/Source/CPTRangePlot.m | 2 +- framework/Source/CPTScatterPlot.m | 2 +- framework/Source/CPTTextLayer.h | 4 ++- framework/Source/CPTTextLayer.m | 12 +++---- framework/Source/CPTTextStyle.m | 2 +- framework/Source/CPTThemeTests.m | 4 +-- framework/Source/CPTTradingRangePlot.m | 2 +- framework/Source/CPTUtilities.m | 34 +++++++++---------- framework/Source/CPTUtilitiesTests.m | 8 ++--- framework/Source/CPTXYAxis.m | 8 ++--- framework/Source/CPTXYAxisSet.m | 2 +- framework/Source/CPTXYGraph.h | 4 ++- framework/Source/CPTXYPlotSpace.m | 14 ++++---- framework/Source/NSCoderExtensions.m | 4 +-- framework/Source/NSNumberExtensions.m | 4 +-- framework/Source/_CPTAnimationCGFloatPeriod.m | 4 +-- framework/Source/_CPTAnimationCGPointPeriod.m | 4 +-- framework/Source/_CPTAnimationCGRectPeriod.m | 4 +-- framework/Source/_CPTAnimationCGSizePeriod.m | 4 +-- .../Source/_CPTAnimationNSDecimalPeriod.m | 12 +++---- framework/Source/_CPTBorderLayer.m | 6 ++-- framework/iPhoneOnly/CPTGraphHostingView.m | 6 ++-- 64 files changed, 259 insertions(+), 250 deletions(-) diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index b8518ab81..9fc0588ed 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -187,7 +187,7 @@ -(void)drawRect:(NSRect)dirtyRect // render CPTLayers recursively into the graphics context used for printing // (thanks to Brad for the tip: http://stackoverflow.com/a/2791305/132867 ) - CGContextRef context = [graphicsContext graphicsPort]; + CGContextRef context = graphicsContext.graphicsPort; [self.hostedGraph recursivelyRenderInContext:context]; [graphicsContext restoreGraphicsState]; @@ -235,7 +235,7 @@ -(void)mouseDown:(nonnull NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseDown = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseDown = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseDown toLayer:theGraph]; handled = [theGraph pointingDeviceDownEvent:theEvent atPoint:pointInHostedGraph]; } @@ -251,7 +251,7 @@ -(void)mouseDragged:(nonnull NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseDrag = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseDrag = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseDrag toLayer:theGraph]; handled = [theGraph pointingDeviceDraggedEvent:theEvent atPoint:pointInHostedGraph]; } @@ -267,7 +267,7 @@ -(void)mouseUp:(nonnull NSEvent *)theEvent BOOL handled = NO; if ( theGraph ) { - CGPoint pointOfMouseUp = NSPointToCGPoint([self convertPoint:[theEvent locationInWindow] fromView:nil]); + CGPoint pointOfMouseUp = NSPointToCGPoint([self convertPoint:theEvent.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMouseUp toLayer:theGraph]; handled = [theGraph pointingDeviceUpEvent:theEvent atPoint:pointInHostedGraph]; } @@ -290,7 +290,7 @@ -(void)magnifyWithEvent:(nonnull NSEvent *)event BOOL handled = NO; if ( theGraph && self.allowPinchScaling ) { - CGPoint pointOfMagnification = NSPointToCGPoint([self convertPoint:[event locationInWindow] fromView:nil]); + CGPoint pointOfMagnification = NSPointToCGPoint([self convertPoint:event.locationInWindow fromView:nil]); CGPoint pointInHostedGraph = [self.layer convertPoint:pointOfMagnification toLayer:theGraph]; CGPoint pointInPlotArea = [theGraph convertPoint:pointInHostedGraph toLayer:theGraph.plotAreaFrame.plotArea]; diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index 91e2efed4..1030e5798 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -25,7 +25,7 @@ -(nonnull CPTNativeImage *)imageOfLayer bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect( context, CPTRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.h b/framework/MacOnly/CPTPlatformSpecificFunctions.h index 2f7d1b0cf..66fc3580a 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.h +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.h @@ -16,7 +16,7 @@ void CPTPopCGContext(void); /// @name Color Conversion /// @{ -__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor); +__nonnull CGColorRef CPTCreateCGColorFromNSColor(NSColor *__nonnull nsColor) CF_RETURNS_RETAINED; CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor); /// @} diff --git a/framework/MacOnly/CPTPlatformSpecificFunctions.m b/framework/MacOnly/CPTPlatformSpecificFunctions.m index abec8af4a..e32552b18 100644 --- a/framework/MacOnly/CPTPlatformSpecificFunctions.m +++ b/framework/MacOnly/CPTPlatformSpecificFunctions.m @@ -125,7 +125,7 @@ CPTRGBAColor CPTRGBAColorFromNSColor(NSColor *__nonnull nsColor) NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect(context, rect); diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index a6ba316e0..5bc190ba9 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -52,12 +52,12 @@ +(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attribute newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } else { - const NSInteger numberOfComponents = [styleColor numberOfComponents]; + const NSInteger numberOfComponents = styleColor.numberOfComponents; CGFloat *components = calloc( (size_t)numberOfComponents, sizeof(CGFloat) ); [styleColor getComponents:components]; - CGColorSpaceRef colorSpace = [[styleColor colorSpace] CGColorSpace]; + CGColorSpaceRef colorSpace = styleColor.colorSpace.CGColorSpace; CGColorRef styleCGColor = CGColorCreate(colorSpace, components); newStyle.color = [CPTColor colorWithCGColor:styleCGColor]; @@ -158,12 +158,12 @@ +(nonnull instancetype)textStyleWithAttributes:(nullable CPTDictionary)attribute newStyle.color = [CPTColor colorWithCGColor:styleColor.CGColor]; } else { - const NSInteger numberOfComponents = [styleColor numberOfComponents]; + const NSInteger numberOfComponents = styleColor.numberOfComponents; CGFloat *components = calloc( (size_t)numberOfComponents, sizeof(CGFloat) ); [styleColor getComponents:components]; - CGColorSpaceRef colorSpace = [[styleColor colorSpace] CGColorSpace]; + CGColorSpaceRef colorSpace = styleColor.colorSpace.CGColorSpace; CGColorRef styleCGColor = CGColorCreate(colorSpace, components); newStyle.color = [CPTColor colorWithCGColor:styleCGColor]; diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 1e7fa861a..c6edde80f 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -184,7 +184,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString +(nonnull SEL)setterFromProperty:(nonnull NSString *)property { return NSSelectorFromString([NSString stringWithFormat:@"set%@:", [property stringByReplacingCharactersInRange:NSMakeRange(0, 1) - withString:[[property substringToIndex:1] capitalizedString]]]); + withString:[property substringToIndex:1].capitalizedString]]); } /// @endcond @@ -244,7 +244,7 @@ -(void)removeAllAnimationOperations -(nullable CPTAnimationOperation *)operationWithIdentifier:(nullable id)identifier { for ( CPTAnimationOperation *operation in self.animationOperations ) { - if ( [[operation identifier] isEqual:identifier] ) { + if ( [operation.identifier isEqual:identifier] ) { return operation; } } @@ -394,7 +394,7 @@ -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters id tweenedValue = parameters[CPTAnimationValueKey]; if ( [tweenedValue isKindOfClass:[NSDecimalNumber class]] ) { - NSDecimal buffer = [(NSDecimalNumber *) tweenedValue decimalValue]; + NSDecimal buffer = ( (NSDecimalNumber *)tweenedValue ).decimalValue; typedef void (*SetterType)(id, SEL, NSDecimal); SetterType setterMethod = (SetterType)[boundObject methodForSelector:boundSetter]; @@ -407,8 +407,8 @@ -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters NSGetSizeAndAlignment(value.objCType, &bufferSize, NULL); NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundSetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundSetter]; + invocation.target = boundObject; + invocation.selector = boundSetter; void *buffer = malloc(bufferSize); [value getValue:buffer]; @@ -630,7 +630,7 @@ -(nullable CPTAnimationTimingFunction)timingFunctionForAnimationCurve:(CPTAnimat -(nullable NSString *)description { return [NSString stringWithFormat:@"<%@ timeOffset: %g; %lu active and %lu running operations>", - [super description], + super.description, (double)self.timeOffset, (unsigned long)self.animationOperations.count, (unsigned long)self.runningAnimationOperations.count]; diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index 25b814609..1dedcfb0d 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -116,7 +116,7 @@ -(nonnull instancetype)init -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ animate %@ %@ with period %@>", [super description], self.boundObject, NSStringFromSelector(self.boundGetter), self.period]; + return [NSString stringWithFormat:@"<%@ animate %@ %@ with period %@>", super.description, self.boundObject, NSStringFromSelector(self.boundGetter), self.period]; } /// @endcond diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index 5dccc6705..ad470ee00 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -440,7 +440,7 @@ -(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnu -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", [super description], self.startValue, self.endValue, (double)self.duration, (double)self.delay]; + return [NSString stringWithFormat:@"<%@ from: %@; to: %@; duration: %g, delay: %g>", super.description, self.startValue, self.endValue, (double)self.duration, (double)self.delay]; } /// @endcond diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 2ca0c8231..5e21a7185 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -102,7 +102,7 @@ -(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; + return [NSString stringWithFormat:@"<%@ {%@}>", super.description, self.contentLayer]; } /// @endcond @@ -143,7 +143,7 @@ -(void)setDisplacement:(CGPoint)newDisplacement { if ( !CGPointEqualToPoint(newDisplacement, displacement) ) { displacement = newDisplacement; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } @@ -151,7 +151,7 @@ -(void)setContentAnchorPoint:(CGPoint)newAnchorPoint { if ( !CGPointEqualToPoint(newAnchorPoint, contentAnchorPoint) ) { contentAnchorPoint = newAnchorPoint; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } @@ -159,7 +159,7 @@ -(void)setRotation:(CGFloat)newRotation { if ( newRotation != rotation ) { rotation = newRotation; - [[self.contentLayer superlayer] setNeedsLayout]; + [self.contentLayer.superlayer setNeedsLayout]; } } diff --git a/framework/Source/CPTAnnotationHostLayer.m b/framework/Source/CPTAnnotationHostLayer.m index 2455e96a5..079c0592f 100644 --- a/framework/Source/CPTAnnotationHostLayer.m +++ b/framework/Source/CPTAnnotationHostLayer.m @@ -164,7 +164,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout CPTMutableAnnotationArray annotations = self.mutableAnnotations; if ( annotations.count > 0 ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; @@ -180,7 +180,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 22f06dd64..0722e7b24 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1538,7 +1538,7 @@ -(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet)locations inRange:(nul return; } - CPTDictionary textAttributes = [theLabelTextStyle attributes]; + CPTDictionary textAttributes = theLabelTextStyle.attributes; BOOL hasAttributedFormatter = ([theLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -2309,7 +2309,7 @@ -(void)setLabelTextStyle:(nullable CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.axisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *) contentLayer setTextStyle:labelTextStyle]; + ( (CPTTextLayer *)contentLayer ).textStyle = labelTextStyle; } } @@ -2326,7 +2326,7 @@ -(void)setMinorTickLabelTextStyle:(nullable CPTTextStyle *)newStyle for ( CPTAxisLabel *axisLabel in self.minorTickAxisLabels ) { CPTLayer *contentLayer = axisLabel.contentLayer; if ( [contentLayer isKindOfClass:textLayerClass] ) { - [(CPTTextLayer *) contentLayer setTextStyle:minorTickLabelTextStyle]; + ( (CPTTextLayer *)contentLayer ).textStyle = minorTickLabelTextStyle; } } @@ -3158,7 +3158,7 @@ -(nullable CPTAxisSet *)axisSet -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; [self setNeedsRelabel]; } } diff --git a/framework/Source/CPTAxisLabel.m b/framework/Source/CPTAxisLabel.m index 2361c88a6..5b64b28c3 100644 --- a/framework/Source/CPTAxisLabel.m +++ b/framework/Source/CPTAxisLabel.m @@ -293,7 +293,7 @@ -(void)positionBetweenViewPoint:(CGPoint)firstPoint andViewPoint:(CGPoint)second -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ {%@}>", [super description], self.contentLayer]; + return [NSString stringWithFormat:@"<%@ {%@}>", super.description, self.contentLayer]; } /// @endcond diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index b0e4b7756..88acba05a 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -1187,7 +1187,7 @@ -(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex: NSNumber *location = [self cachedNumberForField:CPTBarPlotFieldBarLocation recordIndex:idx]; NSNumber *length = [self cachedNumberForField:CPTBarPlotFieldBarTip recordIndex:idx]; - BOOL positiveDirection = CPTDecimalGreaterThanOrEqualTo([length decimalValue], theBaseDecimalValue); + BOOL positiveDirection = CPTDecimalGreaterThanOrEqualTo(length.decimalValue, theBaseDecimalValue); BOOL horizontalBars = self.barsAreHorizontal; CPTCoordinate coordinate = (horizontalBars ? CPTCoordinateX : CPTCoordinateY); CPTPlotRange *lengthRange = [self.plotSpace plotRangeForCoordinate:coordinate]; @@ -1200,7 +1200,7 @@ -(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex: offsetLocation = @(location.doubleValue + [self doubleLengthInPlotCoordinates:self.barOffset.decimalValue]); } else { - NSDecimal decimalLocation = [location decimalValue]; + NSDecimal decimalLocation = location.decimalValue; NSDecimal offset = [self lengthInPlotCoordinates:self.barOffset.decimalValue]; offsetLocation = [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalAdd(decimalLocation, offset)]; } diff --git a/framework/Source/CPTBorderedLayer.m b/framework/Source/CPTBorderedLayer.m index 61e6bf2df..4f0790e7a 100644 --- a/framework/Source/CPTBorderedLayer.m +++ b/framework/Source/CPTBorderedLayer.m @@ -365,7 +365,7 @@ -(void)setCornerRadius:(CGFloat)newRadius -(void)setMasksToBorder:(BOOL)newMasksToBorder { if ( newMasksToBorder != self.masksToBorder ) { - [super setMasksToBorder:newMasksToBorder]; + super.masksToBorder = newMasksToBorder; if ( newMasksToBorder ) { CPTMaskLayer *maskLayer = [[CPTMaskLayer alloc] initWithFrame:self.bounds]; @@ -438,57 +438,57 @@ -(nullable CPTLayer *)borderLayer -(void)setBounds:(CGRect)newBounds { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setBounds:newBounds]; + self.borderLayer.bounds = newBounds; } else { - [super setBounds:newBounds]; + super.bounds = newBounds; } } -(void)setPosition:(CGPoint)newPosition { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setPosition:newPosition]; + self.borderLayer.position = newPosition; } else { - [super setPosition:newPosition]; + super.position = newPosition; } } -(void)setAnchorPoint:(CGPoint)newAnchorPoint { if ( self.masksToBorder && !self.inLayout ) { - [self.borderLayer setAnchorPoint:newAnchorPoint]; + self.borderLayer.anchorPoint = newAnchorPoint; } else { - [super setAnchorPoint:newAnchorPoint]; + super.anchorPoint = newAnchorPoint; } } -(void)setHidden:(BOOL)newHidden { if ( self.masksToBorder ) { - [self.borderLayer setHidden:newHidden]; + self.borderLayer.hidden = newHidden; } else { - [super setHidden:newHidden]; + super.hidden = newHidden; } } -(void)setTransform:(CATransform3D)newTransform { if ( self.masksToBorder ) { - [self.borderLayer setTransform:newTransform]; + self.borderLayer.transform = newTransform; } else { - [super setTransform:newTransform]; + super.transform = newTransform; } } -(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != self.shadow ) { - [super setShadow:newShadow]; + super.shadow = newShadow; if ( self.masksToBorder ) { self.borderLayer.shadow = newShadow; @@ -499,10 +499,10 @@ -(void)setShadow:(nullable CPTShadow *)newShadow -(void)setBackgroundColor:(nullable CGColorRef)newColor { if ( self.masksToBorder ) { - [self.borderLayer setBackgroundColor:newColor]; + self.borderLayer.backgroundColor = newColor; } else { - [super setBackgroundColor:newColor]; + super.backgroundColor = newColor; } } diff --git a/framework/Source/CPTDarkGradientThemeTests.m b/framework/Source/CPTDarkGradientThemeTests.m index 67dbe9801..0f215c53f 100644 --- a/framework/Source/CPTDarkGradientThemeTests.m +++ b/framework/Source/CPTDarkGradientThemeTests.m @@ -22,7 +22,7 @@ -(void)testNewThemeSetGraphClassReturnedClassShouldBeOfCorrectType // Arrange _CPTDarkGradientTheme *theme = [[_CPTDarkGradientTheme alloc] init]; - [theme setGraphClass:[CPTDerivedXYGraph class]]; + theme.graphClass = [CPTDerivedXYGraph class]; // Act CPTGraph *graph = [theme newGraph]; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 8dcb5c593..ae5a47162 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -35,7 +35,7 @@ -(void)tearDown { self.xData = nil; self.yData = nil; - [[self plots] removeAllObjects]; + [self.plots removeAllObjects]; } -(void)buildData @@ -62,7 +62,7 @@ -(void)addPlot:(nonnull CPTPlot *)newPlot self.plots = [NSMutableArray array]; } - [[self plots] addObject:newPlot]; + [self.plots addObject:newPlot]; } -(nonnull CPTPlotRange *)xRange @@ -113,16 +113,16 @@ -(CPTNumberArray)numbersForPlot:(nonnull CPTPlot *)plot switch ( fieldEnum ) { case CPTScatterPlotFieldX: - result = [[self xData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; + result = [self.xData objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; break; case CPTScatterPlotFieldY: - result = [[self yData] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; + result = [self.yData objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:indexRange]]; if ( self.plots.count > 1 ) { XCTAssertTrue([[self plots] containsObject:plot], @"Plot missing"); CPTMutableNumberArray shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; for ( NSDecimalNumber *d in result ) { - [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([[self plots] indexOfObject:plot] + 1) )]]]; + [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([self.plots indexOfObject:plot] + 1) )]]]; } result = shiftedResult; diff --git a/framework/Source/CPTGradient.h b/framework/Source/CPTGradient.h index 637ea858f..84b839e2d 100644 --- a/framework/Source/CPTGradient.h +++ b/framework/Source/CPTGradient.h @@ -90,8 +90,8 @@ typedef NS_ENUM (NSInteger, CPTGradientType) { /// @name Information /// @{ --(nullable CGColorRef)newColorStopAtIndex:(NSUInteger)idx; --(nonnull CGColorRef)newColorAtPosition:(CGFloat)position; +-(nullable CGColorRef)newColorStopAtIndex:(NSUInteger)idx CF_RETURNS_RETAINED; +-(nonnull CGColorRef)newColorAtPosition:(CGFloat)position CF_RETURNS_RETAINED; /// @} /// @name Drawing diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 766cdf895..95ac32079 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -21,7 +21,7 @@ -(void)addElement:(nonnull CPTGradientElement *)newElement; -(nonnull CGShadingRef)newAxialGradientInRect:(CGRect)rect; -(nonnull CGShadingRef)newRadialGradientInRect:(CGRect)rect context:(nonnull CGContextRef)context; --(nullable CPTGradientElement *)elementAtIndex:(NSUInteger)idx; +-(nullable CPTGradientElement *)elementAtIndex:(NSUInteger)idx NS_RETURNS_INNER_POINTER; -(NSUInteger)elementCount; -(CPTGradientElement)removeElementAtIndex:(NSUInteger)idx; @@ -182,7 +182,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone -(void)encodeWithCoder:(nonnull NSCoder *)coder { - if ( [coder allowsKeyedCoding] ) { + if ( coder.allowsKeyedCoding ) { NSUInteger count = 0; CPTGradientElement *currentElement = self.elementList; while ( currentElement != NULL ) { diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index 957aa5d30..a599806a0 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -435,7 +435,7 @@ -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier { for ( CPTPlot *plot in self.plots ) { - if ( [[plot identifier] isEqual:identifier] ) { + if ( [plot.identifier isEqual:identifier] ) { return plot; } } @@ -558,7 +558,7 @@ -(nullable CPTPlotSpace *)plotSpaceAtIndex:(NSUInteger)idx -(nullable CPTPlotSpace *)plotSpaceWithIdentifier:(nullable id)identifier { for ( CPTPlotSpace *plotSpace in self.plotSpaces ) { - if ( [[plotSpace identifier] isEqual:identifier] ) { + if ( [plotSpace.identifier isEqual:identifier] ) { return plotSpace; } } @@ -820,7 +820,7 @@ -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -828,7 +828,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -836,7 +836,7 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } @@ -844,7 +844,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; + super.paddingBottom = newPadding; [self.axisSet.axes makeObjectsPerformSelector:@selector(setNeedsDisplay)]; } } diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index 941244a3c..96af7644e 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -536,7 +536,7 @@ -(nullable CPTNativeImage *)nativeImage bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:imageRep]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextDrawImage(context, CPTRectMake(0.0, 0.0, imageSize.width, imageSize.height), imageRef); diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 87723c3e0..41094b182 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -634,7 +634,7 @@ -(void)layoutSublayers subLayerFrame.origin = CGPointMake( round(leftPadding), round(bottomPadding) ); subLayerFrame.size = subLayerSize; - CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + CPTSublayerSet excludedSublayers = self.sublayersExcludedFromAutomaticLayout; Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in mySublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { @@ -676,7 +676,7 @@ -(void)sublayerMarginLeft:(nonnull CGFloat *)left top:(nonnull CGFloat *)top rig -(void)setSublayers:(nullable CPTSublayerArray)sublayers { - [super setSublayers:sublayers]; + super.sublayers = sublayers; Class layerClass = [CPTLayer class]; CGFloat scale = self.contentsScale; @@ -860,7 +860,7 @@ -(void)setNeedsDisplay -(void)setPosition:(CGPoint)newPosition { - [super setPosition:newPosition]; + super.position = newPosition; if ( COREPLOT_LAYER_POSITION_CHANGE_ENABLED() ) { CGRect currentFrame = self.frame; if ( !CGRectEqualToRect( currentFrame, CGRectIntegral(self.frame) ) ) { @@ -876,7 +876,7 @@ -(void)setPosition:(CGPoint)newPosition -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; if ( !newHidden ) { [self setNeedsDisplay]; } @@ -967,7 +967,7 @@ -(void)setBounds:(CGRect)newBounds newBounds.size.height += sizeOffset.height * CPTFloat(2.0); } - [super setBounds:newBounds]; + super.bounds = newBounds; self.outerBorderPath = NULL; self.innerBorderPath = NULL; @@ -1014,7 +1014,7 @@ -(void)setAnchorPoint:(CGPoint)newAnchorPoint } } - [super setAnchorPoint:newAnchorPoint]; + super.anchorPoint = newAnchorPoint; } -(void)setCornerRadius:(CGFloat)newRadius @@ -1038,7 +1038,7 @@ -(void)setCornerRadius:(CGFloat)newRadius -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ bounds: %@>", [super description], CPTStringFromRect(self.bounds)]; + return [NSString stringWithFormat:@"<%@ bounds: %@>", super.description, CPTStringFromRect(self.bounds)]; } /// @endcond @@ -1060,7 +1060,7 @@ -(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx for ( NSUInteger i = 0; i < idx; i++ ) { [result appendString:@". "]; } - [result appendString:[self description]]; + [result appendString:self.description]; for ( CPTLayer *sublayer in self.sublayers ) { [result appendString:@"\n"]; @@ -1069,7 +1069,7 @@ -(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx [result appendString:[sublayer subLayersAtIndex:idx + 1]]; } else { - [result appendString:[sublayer description]]; + [result appendString:sublayer.description]; } } diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index c74f698f6..e80866abe 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -872,7 +872,7 @@ -(nullable CPTPlot *)plotAtIndex:(NSUInteger)idx -(nullable CPTPlot *)plotWithIdentifier:(nullable id)identifier { for ( CPTPlot *plot in self.plots ) { - if ( [[plot identifier] isEqual:identifier] ) { + if ( [plot.identifier isEqual:identifier] ) { return plot; } } @@ -1288,7 +1288,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ for plots %@>", [super description], self.plots]; + return [NSString stringWithFormat:@"<%@ for plots %@>", super.description, self.plots]; } /// @endcond @@ -1501,7 +1501,7 @@ -(void)setLayoutChanged:(BOOL)newLayoutChanged -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; self.layoutChanged = YES; } } @@ -1509,7 +1509,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; self.layoutChanged = YES; } } @@ -1517,7 +1517,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; self.layoutChanged = YES; } } @@ -1525,8 +1525,8 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; - self.layoutChanged = YES; + super.paddingBottom = newPadding; + self.layoutChanged = YES; } } @@ -1535,7 +1535,7 @@ -(void)setBorderLineStyle:(nullable CPTLineStyle *)newLineStyle CPTLineStyle *oldLineStyle = self.borderLineStyle; if ( newLineStyle != oldLineStyle ) { - [super setBorderLineStyle:newLineStyle]; + super.borderLineStyle = newLineStyle; if ( newLineStyle.lineWidth != oldLineStyle.lineWidth ) { self.layoutChanged = YES; diff --git a/framework/Source/CPTLimitBand.m b/framework/Source/CPTLimitBand.m index 80c9eb28e..f8738a301 100644 --- a/framework/Source/CPTLimitBand.m +++ b/framework/Source/CPTLimitBand.m @@ -79,7 +79,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone -(void)encodeWithCoder:(nonnull NSCoder *)encoder { - if ( [encoder allowsKeyedCoding] ) { + if ( encoder.allowsKeyedCoding ) { [encoder encodeObject:self.range forKey:@"CPTLimitBand.range"]; [encoder encodeObject:self.fill forKey:@"CPTLimitBand.fill"]; } @@ -98,7 +98,7 @@ -(void)encodeWithCoder:(nonnull NSCoder *)encoder -(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder { if ( (self = [super init]) ) { - if ( [decoder allowsKeyedCoding] ) { + if ( decoder.allowsKeyedCoding ) { range = [decoder decodeObjectForKey:@"CPTLimitBand.range"]; fill = [decoder decodeObjectForKey:@"CPTLimitBand.fill"]; } @@ -117,7 +117,7 @@ -(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ with range: %@ and fill: %@>", [super description], self.range, self.fill]; + return [NSString stringWithFormat:@"<%@ with range: %@ and fill: %@>", super.description, self.range, self.fill]; } /// @endcond diff --git a/framework/Source/CPTMutableNumericData.h b/framework/Source/CPTMutableNumericData.h index 51307f7e9..a53de71c3 100644 --- a/framework/Source/CPTMutableNumericData.h +++ b/framework/Source/CPTMutableNumericData.h @@ -15,8 +15,8 @@ /// @name Samples /// @{ --(nullable void *)mutableSamplePointer:(NSUInteger)sample; --(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable void *)mutableSamplePointer:(NSUInteger)sample NS_RETURNS_INNER_POINTER; +-(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ...NS_RETURNS_INNER_POINTER; /// @} @end diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 889c42543..3a14ae5e9 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -87,7 +87,7 @@ -(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... -(nonnull void *)mutableBytes { - return [(NSMutableData *) self.data mutableBytes]; + return ( (NSMutableData *)self.data ).mutableBytes; } /// @endcond diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index 67eafd056..774419104 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -16,7 +16,7 @@ -(void)testNilShapeGivesSingleDimension NSUInteger expected = 1; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); - expected = [nd.shape count]; + expected = nd.shape.count; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); } @@ -47,7 +47,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= [num unsignedIntValue]; + prod *= num.unsignedIntValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); @@ -79,7 +79,7 @@ -(void)testReturnsDataLength shape:nil]; NSUInteger expected = 10 * sizeof(float); - NSUInteger actual = [nd length]; + NSUInteger actual = nd.length; XCTAssertEqual(expected, actual, @"data length"); } @@ -88,7 +88,7 @@ -(void)testBytesEqualDataBytes { NSUInteger nElements = 10; NSMutableData *data = [NSMutableData dataWithLength:nElements * sizeof(NSInteger)]; - NSInteger *intData = (NSInteger *)[data mutableBytes]; + NSInteger *intData = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < nElements; i++ ) { intData[i] = (NSInteger)i; @@ -106,7 +106,7 @@ -(void)testArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -133,7 +133,7 @@ -(void)testNumberOfSamplesCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -147,7 +147,7 @@ -(void)testNumberOfSamplesCorrectForDataType nElems = 10; data = [NSMutableData dataWithLength:nElems * sizeof(char)]; - char *charSamples = (char *)[data mutableBytes]; + char *charSamples = (char *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { charSamples[i] = (char)lrint(sin(i) * 100.0); } @@ -163,7 +163,7 @@ -(void)testDataTypeAccessorsCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -182,7 +182,7 @@ -(void)testConvertTypeConvertsType { NSUInteger numberOfSamples = 10; NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -196,7 +196,7 @@ -(void)testConvertTypeConvertsType sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); } @@ -206,7 +206,7 @@ -(void)testSamplePointerCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -226,7 +226,7 @@ -(void)testSampleValueCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); diff --git a/framework/Source/CPTMutableNumericDataTypeConversionTests.m b/framework/Source/CPTMutableNumericDataTypeConversionTests.m index 1f825e4c8..b84644905 100644 --- a/framework/Source/CPTMutableNumericDataTypeConversionTests.m +++ b/framework/Source/CPTMutableNumericDataTypeConversionTests.m @@ -11,7 +11,7 @@ @implementation CPTMutableNumericDataTypeConversionTests -(void)testFloatToDoubleInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -23,7 +23,7 @@ -(void)testFloatToDoubleInPlaceConversion numericData.sampleBytes = sizeof(double); - const double *doubleSamples = (const double *)[numericData.data bytes]; + const double *doubleSamples = (const double *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); } @@ -32,7 +32,7 @@ -(void)testFloatToDoubleInPlaceConversion -(void)testDoubleToFloatInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -44,7 +44,7 @@ -(void)testDoubleToFloatInPlaceConversion numericData.sampleBytes = sizeof(float); - const float *floatSamples = (const float *)[numericData.data bytes]; + const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); } @@ -53,7 +53,7 @@ -(void)testDoubleToFloatInPlaceConversion -(void)testFloatToIntegerInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i) * 1000.0f; @@ -65,7 +65,7 @@ -(void)testFloatToIntegerInPlaceConversion numericData.dataType = CPTDataType( CPTIntegerDataType, sizeof(NSInteger), NSHostByteOrder() ); - const NSInteger *intSamples = (const NSInteger *)[numericData.data bytes]; + const NSInteger *intSamples = (const NSInteger *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); } @@ -74,7 +74,7 @@ -(void)testFloatToIntegerInPlaceConversion -(void)testIntegerToFloatInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -86,7 +86,7 @@ -(void)testIntegerToFloatInPlaceConversion numericData.dataType = CPTDataType( CPTFloatingPointDataType, sizeof(float), NSHostByteOrder() ); - const float *floatSamples = (const float *)[numericData.data bytes]; + const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); } @@ -95,7 +95,7 @@ -(void)testIntegerToFloatInPlaceConversion -(void)testDecimalToDoubleInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); @@ -107,7 +107,7 @@ -(void)testDecimalToDoubleInPlaceConversion numericData.dataType = CPTDataType( CPTFloatingPointDataType, sizeof(double), NSHostByteOrder() ); - const double *doubleSamples = (const double *)[numericData.data bytes]; + const double *doubleSamples = (const double *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqual(CPTDecimalDoubleValue(samples[i]), doubleSamples[i], @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(samples[i]), doubleSamples[i]); } @@ -116,7 +116,7 @@ -(void)testDecimalToDoubleInPlaceConversion -(void)testDoubleToDecimalInPlaceConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -128,7 +128,7 @@ -(void)testDoubleToDecimalInPlaceConversion numericData.dataType = CPTDataType( CPTDecimalDataType, sizeof(NSDecimal), NSHostByteOrder() ); - const NSDecimal *decimalSamples = (const NSDecimal *)[numericData.data bytes]; + const NSDecimal *decimalSamples = (const NSDecimal *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(CPTDecimalEquals( decimalSamples[i], CPTDecimalFromDouble(samples[i]) ), @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(decimalSamples[i]), samples[i]); } diff --git a/framework/Source/CPTNumericData.h b/framework/Source/CPTNumericData.h index 41316f7d1..5eaee1435 100644 --- a/framework/Source/CPTNumericData.h +++ b/framework/Source/CPTNumericData.h @@ -57,8 +57,8 @@ /// @name Samples /// @{ -(NSUInteger)sampleIndex:(NSUInteger)idx, ...; --(nullable const void *)samplePointer:(NSUInteger)sample; --(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...; +-(nullable const void *)samplePointer:(NSUInteger)sample NS_RETURNS_INNER_POINTER; +-(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ...NS_RETURNS_INNER_POINTER; -(nullable NSNumber *)sampleValue:(NSUInteger)sample; -(nullable NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ...; -(nonnull CPTNumberArray)sampleArray; diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 09e552734..5849706c7 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -441,7 +441,7 @@ -(void)commonInitWithData:(nonnull NSData *)newData else { NSUInteger prod = 1; for ( NSNumber *cNum in theShape ) { - prod *= [cNum unsignedIntegerValue]; + prod *= cNum.unsignedIntegerValue; } if ( prod != self.numberOfSamples ) { @@ -561,7 +561,7 @@ -(void)setShape:(nonnull CPTNumberArray)newShape if ( [myData isKindOfClass:[NSMutableData class]] ) { NSUInteger sampleCount = 1; for ( NSNumber *num in shape ) { - sampleCount *= [num unsignedIntegerValue]; + sampleCount *= num.unsignedIntegerValue; } myData.length = sampleCount * self.sampleBytes; @@ -812,7 +812,7 @@ -(NSUInteger)sampleIndex:(NSUInteger)idx indexList:(va_list)indexList if ( argIndex > 0 ) { indices[argIndex] = va_arg(indexList, NSUInteger); } - dims[argIndex] = [dim unsignedIntegerValue]; + dims[argIndex] = dim.unsignedIntegerValue; if ( indices[argIndex] >= dims[argIndex] ) { free(dims); @@ -1104,7 +1104,7 @@ -(nonnull NSString *)description NSUInteger sampleCount = self.numberOfSamples; NSMutableString *descriptionString = [NSMutableString stringWithCapacity:sampleCount * 3]; - [descriptionString appendFormat:@"<%@ [", [super description]]; + [descriptionString appendFormat:@"<%@ [", super.description]; for ( NSUInteger i = 0; i < sampleCount; i++ ) { if ( i > 0 ) { [descriptionString appendFormat:@","]; @@ -1158,7 +1158,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone -(void)encodeWithCoder:(nonnull NSCoder *)encoder { - if ( [encoder allowsKeyedCoding] ) { + if ( encoder.allowsKeyedCoding ) { [encoder encodeObject:self.data forKey:@"CPTNumericData.data"]; CPTNumericDataType selfDataType = self.dataType; @@ -1198,7 +1198,7 @@ -(nullable instancetype)initWithCoder:(nonnull NSCoder *)decoder CPTNumberArray shapeArray; CPTDataOrder order; - if ( [decoder allowsKeyedCoding] ) { + if ( decoder.allowsKeyedCoding ) { newData = [decoder decodeObjectForKey:@"CPTNumericData.data"]; newDataType = CPTDataType( (CPTDataTypeFormat)[decoder decodeIntegerForKey:@"CPTNumericData.dataType.dataTypeFormat"], diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index c0eaeb007..85c4d7c30 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -15,7 +15,7 @@ -(void)testNilShapeGivesSingleDimension NSUInteger expected = 1; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); - expected = [nd.shape count]; + expected = nd.shape.count; XCTAssertEqual(actual, expected, @"numberOfDimensions == 1"); } @@ -46,7 +46,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= [num unsignedIntValue]; + prod *= num.unsignedIntValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); @@ -78,7 +78,7 @@ -(void)testReturnsDataLength shape:nil]; NSUInteger expected = 10 * sizeof(float); - NSUInteger actual = [nd.data length]; + NSUInteger actual = (nd.data).length; XCTAssertEqual(expected, actual, @"data length"); } @@ -87,7 +87,7 @@ -(void)testBytesEqualDataBytes { NSUInteger nElements = 10; NSMutableData *data = [NSMutableData dataWithLength:nElements * sizeof(NSInteger)]; - NSInteger *intData = (NSInteger *)[data mutableBytes]; + NSInteger *intData = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < nElements; i++ ) { intData[i] = (NSInteger)i; @@ -106,7 +106,7 @@ -(void)testArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -133,7 +133,7 @@ -(void)testKeyedArchivingRoundTrip { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -160,7 +160,7 @@ -(void)testNumberOfSamplesCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -174,7 +174,7 @@ -(void)testNumberOfSamplesCorrectForDataType nElems = 10; data = [NSMutableData dataWithLength:nElems * sizeof(char)]; - char *charSamples = (char *)[data mutableBytes]; + char *charSamples = (char *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { charSamples[i] = (char)lrint(sin(i) * 100.0); } @@ -190,7 +190,7 @@ -(void)testDataTypeAccessorsCorrectForDataType { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -209,7 +209,7 @@ -(void)testConvertTypeConvertsType { NSUInteger numberOfSamples = 10; NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -223,7 +223,7 @@ -(void)testConvertTypeConvertsType sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); } @@ -233,7 +233,7 @@ -(void)testSamplePointerCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -253,7 +253,7 @@ -(void)testSampleValueCorrect { NSUInteger nElems = 10; NSMutableData *data = [NSMutableData dataWithLength:nElems * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < nElems; i++ ) { samples[i] = sinf(i); @@ -273,7 +273,7 @@ -(void)testSampleIndexRowsFirstOrder const NSUInteger cols = 4; NSMutableData *data = [NSMutableData dataWithLength:rows * cols * sizeof(NSUInteger)]; - NSUInteger *samples = (NSUInteger *)[data mutableBytes]; + NSUInteger *samples = (NSUInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < rows * cols; i++ ) { samples[i] = i; @@ -300,7 +300,7 @@ -(void)testSampleIndexColumnsFirstOrder const NSUInteger cols = 4; NSMutableData *data = [NSMutableData dataWithLength:rows * cols * sizeof(NSUInteger)]; - NSUInteger *samples = (NSUInteger *)[data mutableBytes]; + NSUInteger *samples = (NSUInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < rows * cols; i++ ) { samples[i] = i; diff --git a/framework/Source/CPTNumericDataType.m b/framework/Source/CPTNumericDataType.m index 22c84c9a0..6ba0daa5a 100644 --- a/framework/Source/CPTNumericDataType.m +++ b/framework/Source/CPTNumericDataType.m @@ -202,7 +202,7 @@ CPTDataTypeFormat DataTypeForDataTypeString(NSString *__nonnull dataTypeString) NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); #pragma clang diagnostic pop - switch ( [[dataTypeString lowercaseString] characterAtIndex:1] ) { + switch ( [dataTypeString.lowercaseString characterAtIndex:1] ) { case 'f': result = CPTFloatingPointDataType; break; @@ -236,7 +236,7 @@ size_t SampleBytesForDataTypeString(NSString *__nonnull dataTypeString) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" NSCAssert([dataTypeString length] >= 3, @"dataTypeString is too short"); - NSInteger result = [[dataTypeString substringFromIndex:2] integerValue]; + NSInteger result = [dataTypeString substringFromIndex:2].integerValue; NSCAssert(result > 0, @"sample bytes is negative."); #pragma clang diagnostic pop @@ -252,7 +252,7 @@ CFByteOrder ByteOrderForDataTypeString(NSString *__nonnull dataTypeString) CFByteOrder result = CFByteOrderUnknown; - switch ( [[dataTypeString lowercaseString] characterAtIndex:0] ) { + switch ( [dataTypeString.lowercaseString characterAtIndex:0] ) { case '=': result = CFByteOrderGetCurrent(); break; diff --git a/framework/Source/CPTNumericDataTypeConversionTests.m b/framework/Source/CPTNumericDataTypeConversionTests.m index 46f7fb1ff..cc79dadf2 100644 --- a/framework/Source/CPTNumericDataTypeConversionTests.m +++ b/framework/Source/CPTNumericDataTypeConversionTests.m @@ -11,7 +11,7 @@ @implementation CPTNumericDataTypeConversionTests -(void)testFloatToDoubleConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i); @@ -25,7 +25,7 @@ -(void)testFloatToDoubleConversion sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[dd.data bytes]; + const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); } @@ -34,7 +34,7 @@ -(void)testFloatToDoubleConversion -(void)testDoubleToFloatConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -48,7 +48,7 @@ -(void)testDoubleToFloatConversion sampleBytes:sizeof(float) byteOrder:NSHostByteOrder()]; - const float *floatSamples = (const float *)[fd.data bytes]; + const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); } @@ -57,7 +57,7 @@ -(void)testDoubleToFloatConversion -(void)testFloatToIntegerConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(float)]; - float *samples = (float *)[data mutableBytes]; + float *samples = (float *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sinf(i) * 1000.0f; @@ -71,7 +71,7 @@ -(void)testFloatToIntegerConversion sampleBytes:sizeof(NSInteger) byteOrder:NSHostByteOrder()]; - const NSInteger *intSamples = (const NSInteger *)[intData.data bytes]; + const NSInteger *intSamples = (const NSInteger *)intData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); } @@ -80,7 +80,7 @@ -(void)testFloatToIntegerConversion -(void)testIntegerToFloatConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -94,7 +94,7 @@ -(void)testIntegerToFloatConversion sampleBytes:sizeof(float) byteOrder:NSHostByteOrder()]; - const float *floatSamples = (const float *)[fd.data bytes]; + const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); } @@ -133,7 +133,7 @@ -(void)testTypeConversionSwapsByteOrderInteger -(void)testDecimalToDoubleConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); @@ -147,7 +147,7 @@ -(void)testDecimalToDoubleConversion sampleBytes:sizeof(double) byteOrder:NSHostByteOrder()]; - const double *doubleSamples = (const double *)[doubleData.data bytes]; + const double *doubleSamples = (const double *)doubleData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertEqual(CPTDecimalDoubleValue(samples[i]), doubleSamples[i], @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(samples[i]), doubleSamples[i]); } @@ -156,7 +156,7 @@ -(void)testDecimalToDoubleConversion -(void)testDoubleToDecimalConversion { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -170,7 +170,7 @@ -(void)testDoubleToDecimalConversion sampleBytes:sizeof(NSDecimal) byteOrder:NSHostByteOrder()]; - const NSDecimal *decimalSamples = (const NSDecimal *)[decimalData.data bytes]; + const NSDecimal *decimalSamples = (const NSDecimal *)decimalData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { XCTAssertTrue(CPTDecimalEquals( decimalSamples[i], CPTDecimalFromDouble(samples[i]) ), @"(NSDecimal)%@ != (double)%g", CPTDecimalStringValue(decimalSamples[i]), samples[i]); } @@ -215,7 +215,7 @@ -(void)testTypeConversionSwapsByteOrderDouble -(void)testRoundTripToDoubleArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(double)]; - double *samples = (double *)[data mutableBytes]; + double *samples = (double *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = sin(i); @@ -243,7 +243,7 @@ -(void)testRoundTripToDoubleArray -(void)testRoundTripToIntegerArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSInteger)]; - NSInteger *samples = (NSInteger *)[data mutableBytes]; + NSInteger *samples = (NSInteger *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = (NSInteger)(sin(i) * 1000.0); @@ -271,7 +271,7 @@ -(void)testRoundTripToIntegerArray -(void)testRoundTripToDecimalArray { NSMutableData *data = [NSMutableData dataWithLength:numberOfSamples * sizeof(NSDecimal)]; - NSDecimal *samples = (NSDecimal *)[data mutableBytes]; + NSDecimal *samples = (NSDecimal *)data.mutableBytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { samples[i] = CPTDecimalFromDouble( sin(i) ); diff --git a/framework/Source/CPTPathExtensions.h b/framework/Source/CPTPathExtensions.h index a3722a615..c47bfcf5a 100644 --- a/framework/Source/CPTPathExtensions.h +++ b/framework/Source/CPTPathExtensions.h @@ -4,7 +4,12 @@ extern "C" { #endif +CF_IMPLICIT_BRIDGING_ENABLED + __nonnull CGPathRef CPTCreateRoundedRectPath(CGRect rect, CGFloat cornerRadius); + +CF_IMPLICIT_BRIDGING_DISABLED + void CPTAddRoundedRectPath(__nonnull CGContextRef context, CGRect rect, CGFloat cornerRadius); #if __cplusplus diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 9d043a173..2c8cfd4c9 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -1463,7 +1463,7 @@ -(void)setLabelRotationRelativeToRadius:(BOOL)newLabelRotationRelativeToRadius -(void)setLabelRotation:(CGFloat)newRotation { if ( newRotation != self.labelRotation ) { - [super setLabelRotation:newRotation]; + super.labelRotation = newRotation; if ( self.labelRotationRelativeToRadius ) { [self repositionAllLabelAnnotations]; } diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 26c0a37b9..066e07885 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -93,7 +93,7 @@ typedef NSMutableArray<__kindof CPTPlot *> *CPTMutablePlotArray; * @param indexRange The range of the data indexes of interest. * @return A retained C array of data points. **/ --(nullable double *)doublesForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange; +-(nullable double *)doublesForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange NS_RETURNS_INNER_POINTER; /** @brief @optional Gets a plot data value for the given plot and field. * Implement one and only one of the optional methods in this section. diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index c35a68c27..66c7fc5ca 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -582,7 +582,7 @@ -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRec NSParameterAssert(idx <= self.cachedDataCount); Class numericClass = [CPTNumericData class]; - for ( id data in [self.cachedData allValues] ) { + for ( id data in (self.cachedData).allValues ) { if ( [data isKindOfClass:numericClass] ) { CPTMutableNumericData *numericData = (CPTMutableNumericData *)data; size_t sampleSize = numericData.sampleBytes; @@ -618,7 +618,7 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange NSParameterAssert(NSMaxRange(indexRange) <= self.cachedDataCount); Class numericClass = [CPTNumericData class]; - for ( id data in [self.cachedData allValues] ) { + for ( id data in (self.cachedData).allValues ) { if ( [data isKindOfClass:numericClass] ) { CPTMutableNumericData *numericData = (CPTMutableNumericData *)data; size_t sampleSize = numericData.sampleBytes; @@ -757,7 +757,7 @@ -(nullable id)numbersFromDataSourceForField:(NSUInteger)fieldEnum recordIndexRan else if ( [theDataSource respondsToSelector:@selector(doubleForPlot:field:recordIndex:)] ) { NSUInteger recordIndex; NSMutableData *fieldData = [NSMutableData dataWithLength:sizeof(double) * indexRange.length]; - double *fieldValues = [fieldData mutableBytes]; + double *fieldValues = fieldData.mutableBytes; for ( recordIndex = indexRange.location; recordIndex < indexRange.location + indexRange.length; ++recordIndex ) { double number = [theDataSource doubleForPlot:self field:fieldEnum recordIndex:recordIndex]; *fieldValues++ = number; @@ -814,8 +814,8 @@ -(BOOL)loadNumbersForAllFieldsFromDataSourceInRecordIndexRange:(NSRange)indexRan if ( (sampleCount > 0) && (data.numberOfDimensions == 2) ) { CPTNumberArray theShape = data.shape; - const NSUInteger rowCount = [theShape[0] unsignedIntegerValue]; - const NSUInteger fieldCount = [theShape[1] unsignedIntegerValue]; + const NSUInteger rowCount = theShape[0].unsignedIntegerValue; + const NSUInteger fieldCount = theShape[1].unsignedIntegerValue; if ( fieldCount > 0 ) { // convert data type if needed @@ -1176,9 +1176,9 @@ -(BOOL)doublePrecisionCache { NSMutableDictionary *dataCache = self.cachedData; Class numberClass = [NSNumber class]; - for ( id key in [dataCache allKeys] ) { + for ( id key in dataCache.allKeys ) { if ( [key isKindOfClass:numberClass] ) { - result = CPTDataTypeEqualToDataType([(CPTMutableNumericData *) dataCache[key] dataType], self.doubleDataType); + result = CPTDataTypeEqualToDataType( ( (CPTMutableNumericData *)dataCache[key] ).dataType, self.doubleDataType ); break; } } @@ -1299,7 +1299,7 @@ -(void)setCachedDataType:(CPTNumericDataType)newDataType NSMutableDictionary *dataDictionary = self.cachedData; - for ( id key in [dataDictionary allKeys] ) { + for ( id key in dataDictionary.allKeys ) { if ( [key isKindOfClass:numberClass] ) { CPTMutableNumericData *numericData = dataDictionary[key]; numericData.dataType = newDataType; @@ -1458,8 +1458,8 @@ -(nullable CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum } } else { - NSDecimal min = [[NSDecimalNumber maximumDecimalNumber] decimalValue]; - NSDecimal max = [[NSDecimalNumber minimumDecimalNumber] decimalValue]; + NSDecimal min = [NSDecimalNumber maximumDecimalNumber].decimalValue; + NSDecimal max = [NSDecimalNumber minimumDecimalNumber].decimalValue; const NSDecimal *decimals = (const NSDecimal *)numbers.bytes; const NSDecimal *lastSample = decimals + numberOfSamples; @@ -1561,7 +1561,7 @@ -(void)relabel return; } - CPTDictionary textAttributes = [dataLabelTextStyle attributes]; + CPTDictionary textAttributes = dataLabelTextStyle.attributes; BOOL hasAttributedFormatter = ([dataLabelFormatter attributedStringForObjectValue:[NSDecimalNumber zero] withDefaultAttributes:textAttributes] != nil); @@ -2157,7 +2157,7 @@ -(void)setAlignsPointsToPixels:(BOOL)newAlignsPointsToPixels -(void)setHidden:(BOOL)newHidden { if ( newHidden != self.hidden ) { - [super setHidden:newHidden]; + super.hidden = newHidden; [self setNeedsRelabel]; } } diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 565217539..eb1d5989c 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -367,7 +367,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout CPTAxisLabelGroup *titles = self.axisTitleGroup; if ( minorGrid || majorGrid || theAxisSet || thePlotGroup || labels || titles ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } @@ -394,7 +394,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } @@ -417,8 +417,8 @@ -(void)updateLayerOrder if ( tdLayerOrder ) { buLayerOrder = self.bottomUpLayerOrder; - for ( NSUInteger layerIndex = 0; layerIndex < [tdLayerOrder count]; layerIndex++ ) { - CPTGraphLayerType layerType = (CPTGraphLayerType)[tdLayerOrder[layerIndex] intValue]; + for ( NSUInteger layerIndex = 0; layerIndex < tdLayerOrder.count; layerIndex++ ) { + CPTGraphLayerType layerType = (CPTGraphLayerType)(tdLayerOrder[layerIndex]).intValue; NSUInteger i = kCPTNumberOfLayers - layerIndex - 1; while ( buLayerOrder[i] != layerType ) { if ( i == 0 ) { @@ -909,7 +909,7 @@ -(void)setTopDownLayerOrder:(nullable CPTNumberArray)newArray -(void)setGraph:(nullable CPTGraph *)newGraph { if ( newGraph != self.graph ) { - [super setGraph:newGraph]; + super.graph = newGraph; for ( CPTAxis *axis in self.axisSet.axes ) { axis.graph = newGraph; @@ -923,7 +923,7 @@ -(void)setBounds:(CGRect)newBounds self.widthDecimal = CPTDecimalFromCGFloat(newBounds.size.width); self.heightDecimal = CPTDecimalFromCGFloat(newBounds.size.height); - [super setBounds:newBounds]; + super.bounds = newBounds; } } diff --git a/framework/Source/CPTPlotAreaFrame.m b/framework/Source/CPTPlotAreaFrame.m index 2827e9e02..71fba56d9 100644 --- a/framework/Source/CPTPlotAreaFrame.m +++ b/framework/Source/CPTPlotAreaFrame.m @@ -235,7 +235,7 @@ -(void)setPlotGroup:(nullable CPTPlotGroup *)newPlotGroup -(void)setGraph:(nullable CPTGraph *)newGraph { if ( newGraph != self.graph ) { - [super setGraph:newGraph]; + super.graph = newGraph; self.plotArea.graph = newGraph; } diff --git a/framework/Source/CPTPlotGroup.m b/framework/Source/CPTPlotGroup.m index a42909342..4b6ea01f7 100644 --- a/framework/Source/CPTPlotGroup.m +++ b/framework/Source/CPTPlotGroup.m @@ -55,7 +55,7 @@ -(void)insertPlot:(nonnull CPTPlot *)plot atIndex:(NSUInteger)idx **/ -(void)removePlot:(nullable CPTPlot *)plot { - if ( self == [plot superlayer] ) { + if ( self == plot.superlayer ) { [plot removeFromSuperlayer]; } } diff --git a/framework/Source/CPTPlotRange.m b/framework/Source/CPTPlotRange.m index 26fda2edc..bd7f051cb 100644 --- a/framework/Source/CPTPlotRange.m +++ b/framework/Source/CPTPlotRange.m @@ -208,7 +208,7 @@ -(void)setLocationDecimal:(NSDecimal)newLocation locationDecimal = newLocation; if ( !self.inValueUpdate ) { - self.locationDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLocation] doubleValue]; + self.locationDouble = [NSDecimalNumber decimalNumberWithDecimal:newLocation].doubleValue; } } } @@ -235,7 +235,7 @@ -(void)setLengthDecimal:(NSDecimal)newLength lengthDecimal = newLength; if ( !self.inValueUpdate ) { - self.lengthDouble = [[NSDecimalNumber decimalNumberWithDecimal:newLength] doubleValue]; + self.lengthDouble = [NSDecimalNumber decimalNumberWithDecimal:newLength].doubleValue; } } } @@ -594,7 +594,7 @@ -(nullable NSString *)description NSDecimal myLength = self.lengthDecimal; return [NSString stringWithFormat:@"<%@ {%@, %@}>", - [super description], + super.description, NSDecimalString(&myLocation, [NSLocale currentLocale]), NSDecimalString(&myLength, [NSLocale currentLocale])]; } diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index da517de1a..eadc53d9a 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -284,7 +284,7 @@ -(nonnull CPTStringArray)categoriesForCoordinate:(CPTCoordinate)coordinate { CPTMutableCategorySet categories = [self orderedSetForCoordinate:coordinate]; - return [categories array]; + return categories.array; } /** diff --git a/framework/Source/CPTPlotSpaceAnnotation.m b/framework/Source/CPTPlotSpaceAnnotation.m index 46da27ceb..965cd3956 100644 --- a/framework/Source/CPTPlotSpaceAnnotation.m +++ b/framework/Source/CPTPlotSpaceAnnotation.m @@ -184,7 +184,7 @@ -(void)setAnchorPlotPoint:(nullable CPTNumberArray)newPlotPoint NSDecimal *decimalPoint = malloc(sizeof(NSDecimal) * self.anchorCount); for ( NSUInteger i = 0; i < self.anchorCount; i++ ) { - decimalPoint[i] = [anchorPlotPoint[i] decimalValue]; + decimalPoint[i] = anchorPlotPoint[i].decimalValue; } self.decimalAnchor = decimalPoint; diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 56f08c447..26b8599f6 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -1014,7 +1014,7 @@ -(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex: CPTNumberArray yValues = @[[self cachedNumberForField:CPTRangePlotFieldY recordIndex:idx]]; CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { - yValue = [yValuesSorted lastObject]; + yValue = yValuesSorted.lastObject; } else { yValue = yValuesSorted[0]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 23c95160e..689561562 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -811,7 +811,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context NSNumber *xValue = [xValueData sampleValue:(NSUInteger)firstDrawnPointIndex]; NSDecimal plotPoint[2]; - plotPoint[CPTCoordinateX] = [xValue decimalValue]; + plotPoint[CPTCoordinateX] = xValue.decimalValue; plotPoint[CPTCoordinateY] = theAreaBaseValue; CGPoint baseLinePoint = [self convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2] fromLayer:thePlotArea]; if ( pixelAlign ) { diff --git a/framework/Source/CPTTextLayer.h b/framework/Source/CPTTextLayer.h index 9d9c85956..e8f2243b3 100644 --- a/framework/Source/CPTTextLayer.h +++ b/framework/Source/CPTTextLayer.h @@ -15,8 +15,10 @@ extern const CGFloat kCPTTextLayerMarginWidth; ///< Margin width around the text /// @name Initialization /// @{ -(nonnull instancetype)initWithText:(nullable NSString *)newText; --(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle; +-(nonnull instancetype)initWithText:(nullable NSString *)newText style:(nullable CPTTextStyle *)newStyle NS_DESIGNATED_INITIALIZER; -(nonnull instancetype)initWithAttributedText:(nullable NSAttributedString *)newText; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} /// @name Layout diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index b1f15b192..8e3cc2464 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -249,7 +249,7 @@ -(void)setMaximumSize:(CGSize)newSize -(void)setShadow:(nullable CPTShadow *)newShadow { if ( newShadow != self.shadow ) { - [super setShadow:newShadow]; + super.shadow = newShadow; [self sizeToFit]; } } @@ -257,7 +257,7 @@ -(void)setShadow:(nullable CPTShadow *)newShadow -(void)setPaddingLeft:(CGFloat)newPadding { if ( newPadding != self.paddingLeft ) { - [super setPaddingLeft:newPadding]; + super.paddingLeft = newPadding; [self sizeToFit]; } } @@ -265,7 +265,7 @@ -(void)setPaddingLeft:(CGFloat)newPadding -(void)setPaddingRight:(CGFloat)newPadding { if ( newPadding != self.paddingRight ) { - [super setPaddingRight:newPadding]; + super.paddingRight = newPadding; [self sizeToFit]; } } @@ -273,7 +273,7 @@ -(void)setPaddingRight:(CGFloat)newPadding -(void)setPaddingTop:(CGFloat)newPadding { if ( newPadding != self.paddingTop ) { - [super setPaddingTop:newPadding]; + super.paddingTop = newPadding; [self sizeToFit]; } } @@ -281,7 +281,7 @@ -(void)setPaddingTop:(CGFloat)newPadding -(void)setPaddingBottom:(CGFloat)newPadding { if ( newPadding != self.paddingBottom ) { - [super setPaddingBottom:newPadding]; + super.paddingBottom = newPadding; [self sizeToFit]; } } @@ -409,7 +409,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context -(nullable NSString *)description { - return [NSString stringWithFormat:@"<%@ \"%@\">", [super description], self.text]; + return [NSString stringWithFormat:@"<%@ \"%@\">", super.description, self.text]; } /// @endcond diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index ac9f5735e..4ec64b45f 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -190,7 +190,7 @@ -(nullable id)debugQuickLookObject { NSString *lorem = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; - return [[NSAttributedString alloc] initWithString:lorem attributes:[self attributes]]; + return [[NSAttributedString alloc] initWithString:lorem attributes:self.attributes]; } /// @endcond diff --git a/framework/Source/CPTThemeTests.m b/framework/Source/CPTThemeTests.m index 9fe75004f..1750f90c4 100644 --- a/framework/Source/CPTThemeTests.m +++ b/framework/Source/CPTThemeTests.m @@ -15,7 +15,7 @@ -(void)testSetGraphClassUsingCPTXYGraphShouldWork { CPTTheme *theme = [[CPTTheme alloc] init]; - [theme setGraphClass:[CPTXYGraph class]]; + theme.graphClass = [CPTXYGraph class]; XCTAssertEqual([CPTXYGraph class], theme.graphClass, @"graphClass should be CPTXYGraph"); } @@ -23,7 +23,7 @@ -(void)testSetGraphUsingDerivedClassShouldWork { CPTTheme *theme = [[CPTTheme alloc] init]; - [theme setGraphClass:[CPTDerivedXYGraph class]]; + theme.graphClass = [CPTDerivedXYGraph class]; XCTAssertEqual([CPTDerivedXYGraph class], theme.graphClass, @"graphClass should be CPTDerivedXYGraph"); } diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index def618939..79218c679 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -1212,7 +1212,7 @@ -(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex: [self cachedNumberForField:CPTTradingRangePlotFieldLow recordIndex:idx]]; CPTNumberArray yValuesSorted = [yValues sortedArrayUsingSelector:@selector(compare:)]; if ( positiveDirection ) { - yValue = [yValuesSorted lastObject]; + yValue = yValuesSorted.lastObject; } else { yValue = yValuesSorted[0]; diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index eebd0c0cd..677015001 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -20,7 +20,7 @@ **/ int8_t CPTDecimalCharValue(NSDecimal decimalNumber) { - return (int8_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] charValue]; + return (int8_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].charValue; } /** @@ -30,7 +30,7 @@ int8_t CPTDecimalCharValue(NSDecimal decimalNumber) **/ int16_t CPTDecimalShortValue(NSDecimal decimalNumber) { - return (int16_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] shortValue]; + return (int16_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].shortValue; } /** @@ -40,7 +40,7 @@ int16_t CPTDecimalShortValue(NSDecimal decimalNumber) **/ int32_t CPTDecimalLongValue(NSDecimal decimalNumber) { - return (int32_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] longValue]; + return (int32_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].longValue; } /** @@ -50,7 +50,7 @@ int32_t CPTDecimalLongValue(NSDecimal decimalNumber) **/ int64_t CPTDecimalLongLongValue(NSDecimal decimalNumber) { - return (int64_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] longLongValue]; + return (int64_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].longLongValue; } /** @@ -60,7 +60,7 @@ int64_t CPTDecimalLongLongValue(NSDecimal decimalNumber) **/ int CPTDecimalIntValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] intValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].intValue; } /** @@ -70,7 +70,7 @@ int CPTDecimalIntValue(NSDecimal decimalNumber) **/ NSInteger CPTDecimalIntegerValue(NSDecimal decimalNumber) { - return (NSInteger)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] integerValue]; + return (NSInteger)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].integerValue; } /** @@ -80,7 +80,7 @@ NSInteger CPTDecimalIntegerValue(NSDecimal decimalNumber) **/ uint8_t CPTDecimalUnsignedCharValue(NSDecimal decimalNumber) { - return (uint8_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedCharValue]; + return (uint8_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedCharValue; } /** @@ -90,7 +90,7 @@ uint8_t CPTDecimalUnsignedCharValue(NSDecimal decimalNumber) **/ uint16_t CPTDecimalUnsignedShortValue(NSDecimal decimalNumber) { - return (uint16_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedShortValue]; + return (uint16_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedShortValue; } /** @@ -100,7 +100,7 @@ uint16_t CPTDecimalUnsignedShortValue(NSDecimal decimalNumber) **/ uint32_t CPTDecimalUnsignedLongValue(NSDecimal decimalNumber) { - return (uint32_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedLongValue]; + return (uint32_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedLongValue; } /** @@ -110,7 +110,7 @@ uint32_t CPTDecimalUnsignedLongValue(NSDecimal decimalNumber) **/ uint64_t CPTDecimalUnsignedLongLongValue(NSDecimal decimalNumber) { - return (uint64_t)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedLongLongValue]; + return (uint64_t)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedLongLongValue; } /** @@ -120,7 +120,7 @@ uint64_t CPTDecimalUnsignedLongLongValue(NSDecimal decimalNumber) **/ unsigned int CPTDecimalUnsignedIntValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedIntValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedIntValue; } /** @@ -130,7 +130,7 @@ unsigned int CPTDecimalUnsignedIntValue(NSDecimal decimalNumber) **/ NSUInteger CPTDecimalUnsignedIntegerValue(NSDecimal decimalNumber) { - return (NSUInteger)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] unsignedIntegerValue]; + return (NSUInteger)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].unsignedIntegerValue; } /** @@ -140,7 +140,7 @@ NSUInteger CPTDecimalUnsignedIntegerValue(NSDecimal decimalNumber) **/ float CPTDecimalFloatValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] floatValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].floatValue; } /** @@ -150,7 +150,7 @@ float CPTDecimalFloatValue(NSDecimal decimalNumber) **/ double CPTDecimalDoubleValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] doubleValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].doubleValue; } /** @@ -161,7 +161,7 @@ float CPTDecimalFloatValue(NSDecimal decimalNumber) CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber) { #if CGFLOAT_IS_DOUBLE - return (CGFloat)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] doubleValue]; + return (CGFloat)[NSDecimalNumber decimalNumberWithDecimal:decimalNumber].doubleValue; #else return (CGFloat)[[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] floatValue]; @@ -175,7 +175,7 @@ CGFloat CPTDecimalCGFloatValue(NSDecimal decimalNumber) **/ NSString *__nonnull CPTDecimalStringValue(NSDecimal decimalNumber) { - return [[NSDecimalNumber decimalNumberWithDecimal:decimalNumber] stringValue]; + return [NSDecimalNumber decimalNumberWithDecimal:decimalNumber].stringValue; } #pragma mark - @@ -662,7 +662,7 @@ BOOL CPTDecimalEquals(NSDecimal leftOperand, NSDecimal rightOperand) **/ NSDecimal CPTDecimalNaN(void) { - return [[NSDecimalNumber notANumber] decimalValue]; + return [NSDecimalNumber notANumber].decimalValue; } /** diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index eaecc2f25..24823de3c 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -88,8 +88,8 @@ -(void)testToDecimalConversion -(void)testConvertNegativeOne { - NSDecimal zero = [[NSDecimalNumber zero] decimalValue]; - NSDecimal one = [[NSDecimalNumber one] decimalValue]; + NSDecimal zero = [NSDecimalNumber zero].decimalValue; + NSDecimal one = [NSDecimalNumber one].decimalValue; NSDecimal negativeOne; NSDecimalSubtract(&negativeOne, &zero, &one, NSRoundPlain); @@ -127,7 +127,7 @@ -(void)testConvertNegativeOne -(void)testCachedZero { - NSDecimal zero = [[NSDecimalNumber zero] decimalValue]; + NSDecimal zero = [NSDecimalNumber zero].decimalValue; NSDecimal testValue; NSString *errMessage; @@ -184,7 +184,7 @@ -(void)testCachedZero -(void)testCachedOne { - NSDecimal one = [[NSDecimalNumber one] decimalValue]; + NSDecimal one = [NSDecimalNumber one].decimalValue; NSDecimal testValue; NSString *errMessage; diff --git a/framework/Source/CPTXYAxis.m b/framework/Source/CPTXYAxis.m index 3d736ef03..ad212088d 100644 --- a/framework/Source/CPTXYAxis.m +++ b/framework/Source/CPTXYAxis.m @@ -484,7 +484,7 @@ -(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context NSUInteger bandCount = bandArray.count; if ( bandCount > 0 ) { - CPTNumberArray locations = [self.majorTickLocations allObjects]; + CPTNumberArray locations = self.majorTickLocations.allObjects; if ( locations.count > 0 ) { CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -543,7 +543,7 @@ -(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context } for ( NSDecimalNumber *location in locations ) { - NSDecimal currentLocation = [location decimalValue]; + NSDecimal currentLocation = location.decimalValue; if ( !CPTDecimalEquals(CPTDecimalSubtract(currentLocation, lastLocation), zero) ) { CPTFill *bandFill = bandArray[bandIndex++]; bandIndex %= bandCount; @@ -673,7 +673,7 @@ -(nullable NSString *)description CGPoint endViewPoint = [self viewPointForCoordinateValue:range.end]; return [NSString stringWithFormat:@"<%@ with range: %@ viewCoordinates: %@ to %@>", - [super description], + super.description, range, CPTStringFromPoint(startViewPoint), CPTStringFromPoint(endViewPoint)]; @@ -774,7 +774,7 @@ -(void)setOrthogonalPosition:(nullable NSNumber *)newPosition -(void)setCoordinate:(CPTCoordinate)newCoordinate { if ( self.coordinate != newCoordinate ) { - [super setCoordinate:newCoordinate]; + super.coordinate = newCoordinate; switch ( newCoordinate ) { case CPTCoordinateX: switch ( self.labelAlignment ) { diff --git a/framework/Source/CPTXYAxisSet.m b/framework/Source/CPTXYAxisSet.m index dfa61ad6b..4208dbb28 100644 --- a/framework/Source/CPTXYAxisSet.m +++ b/framework/Source/CPTXYAxisSet.m @@ -121,7 +121,7 @@ -(void)layoutSublayers sublayerPosition = CGPointMake(-sublayerPosition.x, -sublayerPosition.y); CGRect subLayerFrame = CGRectMake(sublayerPosition.x, sublayerPosition.y, sublayerBounds.size.width, sublayerBounds.size.height); - CPTSublayerSet excludedSublayers = [self sublayersExcludedFromAutomaticLayout]; + CPTSublayerSet excludedSublayers = self.sublayersExcludedFromAutomaticLayout; Class layerClass = [CPTLayer class]; for ( CALayer *subLayer in self.sublayers ) { if ( [subLayer isKindOfClass:layerClass] && ![excludedSublayers containsObject:subLayer] ) { diff --git a/framework/Source/CPTXYGraph.h b/framework/Source/CPTXYGraph.h index 90bca7639..503b0a19e 100644 --- a/framework/Source/CPTXYGraph.h +++ b/framework/Source/CPTXYGraph.h @@ -5,7 +5,9 @@ /// @name Initialization /// @{ --(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType; +-(nonnull instancetype)initWithFrame:(CGRect)newFrame xScaleType:(CPTScaleType)newXScaleType yScaleType:(CPTScaleType)newYScaleType NS_DESIGNATED_INITIALIZER; +-(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder NS_DESIGNATED_INITIALIZER; +-(nonnull instancetype)initWithLayer:(nonnull id)layer NS_DESIGNATED_INITIALIZER; /// @} @end diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 3aecf8f4b..8399692c8 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -972,18 +972,18 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint switch ( self.xScaleType ) { case CPTScaleTypeLinear: case CPTScaleTypeCategory: - viewPoint.x = [self viewCoordinateForViewLength:plotArea.widthDecimal linearPlotRange:self.xRange plotCoordinateValue:[plotPoint[CPTCoordinateX] decimalValue]]; + viewPoint.x = [self viewCoordinateForViewLength:plotArea.widthDecimal linearPlotRange:self.xRange plotCoordinateValue:plotPoint[CPTCoordinateX].decimalValue]; break; case CPTScaleTypeLog: { - viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX].doubleValue]; } break; case CPTScaleTypeLogModulus: { - viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateX] doubleValue]]; + viewPoint.x = [self viewCoordinateForViewLength:layerSize.width logModulusPlotRange:self.xRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateX].doubleValue]; } break; @@ -994,18 +994,18 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray)plotPoint switch ( self.yScaleType ) { case CPTScaleTypeLinear: case CPTScaleTypeCategory: - viewPoint.y = [self viewCoordinateForViewLength:plotArea.heightDecimal linearPlotRange:self.yRange plotCoordinateValue:[plotPoint[CPTCoordinateY] decimalValue]]; + viewPoint.y = [self viewCoordinateForViewLength:plotArea.heightDecimal linearPlotRange:self.yRange plotCoordinateValue:plotPoint[CPTCoordinateY].decimalValue]; break; case CPTScaleTypeLog: { - viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY].doubleValue]; } break; case CPTScaleTypeLogModulus: { - viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:[plotPoint[CPTCoordinateY] doubleValue]]; + viewPoint.y = [self viewCoordinateForViewLength:layerSize.height logModulusPlotRange:self.yRange doublePrecisionPlotCoordinateValue:plotPoint[CPTCoordinateY].doubleValue]; } break; @@ -1328,7 +1328,7 @@ -(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event plotAreaViewPoint = [theHostingView.layer convertPoint:interactionPoint toLayer:thePlotArea]; } #else - CGPoint interactionPoint = NSPointToCGPoint([theHostingView convertPoint:[event locationInWindow] fromView:nil]); + CGPoint interactionPoint = NSPointToCGPoint([theHostingView convertPoint:event.locationInWindow fromView:nil]); plotAreaViewPoint = [theHostingView.layer convertPoint:interactionPoint toLayer:thePlotArea]; #endif } diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 500b2f0f8..5da2ab060 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -138,7 +138,7 @@ -(void)encodeCGPath:(nullable CGPathRef)path forKey:(nonnull NSString *)key for ( NSUInteger i = 0; i < dataCount; i++ ) { NSDictionary *elementData = pathData[i]; - CGPathElementType type = (CGPathElementType)[elementData[@"type"] intValue]; + CGPathElementType type = (CGPathElementType)(elementData[@"type"]).intValue; newKey = [[NSString alloc] initWithFormat:@"%@[%lu].type", key, (unsigned long)i]; [self encodeInt:type forKey:newKey]; @@ -504,7 +504,7 @@ -(NSDecimal)decodeDecimalForKey:(nonnull NSString *)key NSNumber *number = [self decodeObjectForKey:key]; if ( [number respondsToSelector:@selector(decimalValue)] ) { - result = [number decimalValue]; + result = number.decimalValue; } else { result = CPTDecimalNaN(); diff --git a/framework/Source/NSNumberExtensions.m b/framework/Source/NSNumberExtensions.m index 84103dcca..3f49c824f 100644 --- a/framework/Source/NSNumberExtensions.m +++ b/framework/Source/NSNumberExtensions.m @@ -17,7 +17,7 @@ +(nonnull instancetype)numberWithCGFloat:(CGFloat)number -(CGFloat)cgFloatValue { #if CGFLOAT_IS_DOUBLE - return [self doubleValue]; + return self.doubleValue; #else return [self floatValue]; @@ -46,7 +46,7 @@ -(nonnull NSDecimalNumber *)decimalNumber if ( [self isMemberOfClass:[NSDecimalNumber class]] ) { return (NSDecimalNumber *)self; } - return [NSDecimalNumber decimalNumberWithDecimal:[self decimalValue]]; + return [NSDecimalNumber decimalNumberWithDecimal:self.decimalValue]; } @end diff --git a/framework/Source/_CPTAnimationCGFloatPeriod.m b/framework/Source/_CPTAnimationCGFloatPeriod.m index 8ada09dda..3d5cde004 100644 --- a/framework/Source/_CPTAnimationCGFloatPeriod.m +++ b/framework/Source/_CPTAnimationCGFloatPeriod.m @@ -18,8 +18,8 @@ CGFloat CPTCurrentFloatValue(id __nonnull boundObject, SEL __nonnull boundGetter { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGPointPeriod.m b/framework/Source/_CPTAnimationCGPointPeriod.m index f82feaf21..62a825574 100644 --- a/framework/Source/_CPTAnimationCGPointPeriod.m +++ b/framework/Source/_CPTAnimationCGPointPeriod.m @@ -16,8 +16,8 @@ CGPoint CPTCurrentPointValue(id __nonnull boundObject, SEL __nonnull boundGetter { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGRectPeriod.m b/framework/Source/_CPTAnimationCGRectPeriod.m index 77af5a832..2ab3fde6a 100644 --- a/framework/Source/_CPTAnimationCGRectPeriod.m +++ b/framework/Source/_CPTAnimationCGRectPeriod.m @@ -16,8 +16,8 @@ CGRect CPTCurrentRectValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationCGSizePeriod.m b/framework/Source/_CPTAnimationCGSizePeriod.m index f2b8c0d59..89499b687 100644 --- a/framework/Source/_CPTAnimationCGSizePeriod.m +++ b/framework/Source/_CPTAnimationCGSizePeriod.m @@ -16,8 +16,8 @@ CGSize CPTCurrentSizeValue(id __nonnull boundObject, SEL __nonnull boundGetter) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; diff --git a/framework/Source/_CPTAnimationNSDecimalPeriod.m b/framework/Source/_CPTAnimationNSDecimalPeriod.m index e2291dff2..f70877093 100644 --- a/framework/Source/_CPTAnimationNSDecimalPeriod.m +++ b/framework/Source/_CPTAnimationNSDecimalPeriod.m @@ -18,8 +18,8 @@ NSDecimal CPTCurrentDecimalValue(id __nonnull boundObject, SEL __nonnull boundGe { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[boundObject methodSignatureForSelector:boundGetter]]; - [invocation setTarget:boundObject]; - [invocation setSelector:boundGetter]; + invocation.target = boundObject; + invocation.selector = boundGetter; [invocation invoke]; @@ -43,8 +43,8 @@ -(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnu } NSDecimal current = CPTCurrentDecimalValue(boundObject, boundGetter); - NSDecimal start = [(NSDecimalNumber *) self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *) self.endValue decimalValue]; + NSDecimal start = ( (NSDecimalNumber *)self.startValue ).decimalValue; + NSDecimal end = ( (NSDecimalNumber *)self.endValue ).decimalValue; return ( CPTDecimalGreaterThanOrEqualTo(current, start) && CPTDecimalLessThanOrEqualTo(current, end) ) || ( CPTDecimalGreaterThanOrEqualTo(current, end) && CPTDecimalLessThanOrEqualTo(current, start) ); @@ -52,8 +52,8 @@ -(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnu -(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress { - NSDecimal start = [(NSDecimalNumber *) self.startValue decimalValue]; - NSDecimal end = [(NSDecimalNumber *) self.endValue decimalValue]; + NSDecimal start = ( (NSDecimalNumber *)self.startValue ).decimalValue; + NSDecimal end = ( (NSDecimalNumber *)self.endValue ).decimalValue; NSDecimal length = CPTDecimalSubtract(end, start); NSDecimal tweenedValue = CPTDecimalAdd( start, CPTDecimalMultiply(CPTDecimalFromCGFloat(progress), length) ); diff --git a/framework/Source/_CPTBorderLayer.m b/framework/Source/_CPTBorderLayer.m index 3e03057c2..2915afe91 100644 --- a/framework/Source/_CPTBorderLayer.m +++ b/framework/Source/_CPTBorderLayer.m @@ -135,7 +135,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout CPTBorderedLayer *excludedLayer = self.maskedLayer; if ( excludedLayer ) { - CPTMutableSublayerSet excludedSublayers = [[super sublayersExcludedFromAutomaticLayout] mutableCopy]; + CPTMutableSublayerSet excludedSublayers = [super.sublayersExcludedFromAutomaticLayout mutableCopy]; if ( !excludedSublayers ) { excludedSublayers = [NSMutableSet set]; } @@ -143,7 +143,7 @@ -(nullable CPTSublayerSet)sublayersExcludedFromAutomaticLayout return excludedSublayers; } else { - return [super sublayersExcludedFromAutomaticLayout]; + return super.sublayersExcludedFromAutomaticLayout; } } @@ -165,7 +165,7 @@ -(void)setMaskedLayer:(nullable CPTBorderedLayer *)newLayer -(void)setBounds:(CGRect)newBounds { if ( !CGRectEqualToRect(newBounds, self.bounds) ) { - [super setBounds:newBounds]; + super.bounds = newBounds; [self setNeedsLayout]; } } diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index ab6ac6f71..e74951a8f 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -134,7 +134,7 @@ -(void)touchesBegan:(nonnull NSSet *)touches withEvent:(nullable UIEv BOOL handled = NO; // Ignore pinch or other multitouch gestures - if ( [[event allTouches] count] == 1 ) { + if ( [event allTouches].count == 1 ) { CPTGraph *theHostedGraph = self.hostedGraph; UIEvent *theEvent = event; @@ -391,7 +391,7 @@ -(void)setCollapsesLayers:(BOOL)collapse -(void)setFrame:(CGRect)newFrame { - [super setFrame:newFrame]; + super.frame = newFrame; CPTGraph *theHostedGraph = self.hostedGraph; [theHostedGraph setNeedsLayout]; @@ -406,7 +406,7 @@ -(void)setFrame:(CGRect)newFrame -(void)setBounds:(CGRect)newBounds { - [super setBounds:newBounds]; + super.bounds = newBounds; CPTGraph *theHostedGraph = self.hostedGraph; [theHostedGraph setNeedsLayout]; From c1cfc6828eb838842baa5f1733389a3f231c6eec Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:31:12 -0400 Subject: [PATCH 176/429] Converted the Plot Gallery example app to modern Objective-C syntax with Xcode 7.2.1. --- .../CorePlotGallery/src/ios/AppDelegate.m | 4 +-- .../src/ios/RootViewController.m | 8 +++--- .../src/mac/PlotGalleryController.m | 28 +++++++++---------- examples/CorePlotGallery/src/mac/PlotView.h | 2 +- .../CorePlotGallery/src/plots/CompositePlot.m | 12 ++++---- .../CorePlotGallery/src/plots/ControlChart.m | 4 +-- .../src/plots/CurvedScatterPlot.m | 20 ++++++------- examples/CorePlotGallery/src/plots/DatePlot.m | 12 ++++---- .../CorePlotGallery/src/plots/DonutChart.m | 2 +- .../CorePlotGallery/src/plots/FunctionPlot.m | 4 +-- .../src/plots/GradientScatterPlot.m | 8 +++--- .../CorePlotGallery/src/plots/RealTimePlot.m | 2 +- .../src/plots/SimplePieChart.m | 4 +-- .../src/plots/SimpleScatterPlot.m | 6 ++-- .../src/plots/VerticalBarChart.m | 6 ++-- .../src/shared/PiNumberFormatter.m | 2 +- .../CorePlotGallery/src/shared/PlotGallery.h | 2 +- .../CorePlotGallery/src/shared/PlotGallery.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +-- 19 files changed, 66 insertions(+), 66 deletions(-) diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index 3dd446d92..00b0b425e 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -25,7 +25,7 @@ -(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOp UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; splitViewController.delegate = self; - UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; + UINavigationController *navigationController = splitViewController.viewControllers.lastObject; navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; return YES; @@ -35,7 +35,7 @@ -(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOp -(BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController { - if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *) secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *) secondaryViewController topViewController] detailItem] == nil) ) { + if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [( (UINavigationController *)secondaryViewController ).topViewController isKindOfClass:[DetailViewController class]] && ( ( (DetailViewController *)( (UINavigationController *)secondaryViewController ).topViewController ).detailItem == nil ) ) { // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. return YES; } diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index 1a7b1e2fd..0e61ad1f3 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -50,14 +50,14 @@ -(void)dealloc -(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { - DetailViewController *controller = (DetailViewController *)[segue.destinationViewController topViewController]; + DetailViewController *controller = (DetailViewController *)( (UINavigationController *)segue.destinationViewController ).topViewController; controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; controller.navigationItem.leftItemsSupplementBackButton = YES; controller.currentThemeName = self.currentThemeName; - NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; + NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow; PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectInSection:[indexPath indexAtPosition:0] atIndex:[indexPath indexAtPosition:1]]; @@ -84,7 +84,7 @@ -(void)themeChanged:(nonnull NSNotification *)notification -(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tv { - return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfSections]; + return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } -(NSInteger)tableView:(nonnull UITableView *)tv numberOfRowsInSection:(NSInteger)section @@ -113,7 +113,7 @@ -(nonnull UITableViewCell *)tableView:(nonnull UITableView *)tv cellForRowAtInde -(nullable NSString *)tableView:(nonnull UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [[PlotGallery sharedPlotGallery] sectionTitles][(NSUInteger)section]; + return [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)section]; } @end diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 09aeb644e..daabd4836 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -53,7 +53,7 @@ -(void)awakeFromNib { [[PlotGallery sharedPlotGallery] sortByTitle]; - [self.splitView setDelegate:self]; + (self.splitView).delegate = self; [self.imageBrowser setDelegate:self]; [self.imageBrowser setDataSource:self]; @@ -61,7 +61,7 @@ -(void)awakeFromNib [self.imageBrowser reloadData]; - [self.hostingView setDelegate:self]; + (self.hostingView).delegate = self; [self setupThemes]; @@ -159,7 +159,7 @@ -(void)setPlotItem:(nullable PlotItem *)item -(NSUInteger)numberOfItemsInImageBrowser:(nonnull IKImageBrowserView *)browser { - return [[PlotGallery sharedPlotGallery] count]; + return [PlotGallery sharedPlotGallery].count; } -(nonnull id)imageBrowser:(nonnull IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index @@ -169,12 +169,12 @@ -(nonnull id)imageBrowser:(nonnull IKImageBrowserView *)browser itemAtIndex:(NSU -(NSUInteger)numberOfGroupsInImageBrowser:(nonnull IKImageBrowserView *)aBrowser { - return [[PlotGallery sharedPlotGallery] numberOfSections]; + return [PlotGallery sharedPlotGallery].numberOfSections; } -(nonnull CPTDictionary)imageBrowser:(nonnull IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index { - NSString *groupTitle = [[PlotGallery sharedPlotGallery] sectionTitles][index]; + NSString *groupTitle = [PlotGallery sharedPlotGallery].sectionTitles[index]; NSUInteger offset = 0; @@ -196,7 +196,7 @@ -(nonnull CPTDictionary)imageBrowser:(nonnull IKImageBrowserView *)aBrowser grou -(void)imageBrowserSelectionDidChange:(nonnull IKImageBrowserView *)browser { - NSUInteger index = [[browser selectionIndexes] firstIndex]; + NSUInteger index = [browser selectionIndexes].firstIndex; if ( index != NSNotFound ) { PlotItem *item = [[PlotGallery sharedPlotGallery] objectInSection:0 atIndex:index]; @@ -220,13 +220,13 @@ -(CGFloat)splitView:(nonnull NSSplitView *)sv constrainMaxCoordinate:(CGFloat)co -(void)splitView:(nonnull NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize { // Lock the LHS width - NSRect frame = [sender frame]; - NSView *lhs = [sender subviews][0]; - NSRect lhsRect = [lhs frame]; - NSView *rhs = [sender subviews][1]; - NSRect rhsRect = [rhs frame]; + NSRect frame = sender.frame; + NSView *lhs = sender.subviews[0]; + NSRect lhsRect = lhs.frame; + NSView *rhs = sender.subviews[1]; + NSRect rhsRect = rhs.frame; - CGFloat dividerThickness = [sender dividerThickness]; + CGFloat dividerThickness = sender.dividerThickness; lhsRect.size.height = frame.size.height; @@ -234,8 +234,8 @@ -(void)splitView:(nonnull NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize rhsRect.size.height = frame.size.height; rhsRect.origin.x = lhsRect.size.width + dividerThickness; - [lhs setFrame:lhsRect]; - [rhs setFrame:rhsRect]; + lhs.frame = lhsRect; + rhs.frame = rhsRect; } @end diff --git a/examples/CorePlotGallery/src/mac/PlotView.h b/examples/CorePlotGallery/src/mac/PlotView.h index e906b766f..f4e9bc28a 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.h +++ b/examples/CorePlotGallery/src/mac/PlotView.h @@ -11,7 +11,7 @@ @end -@interface PlotView : NSView +@interface PlotView : NSView @property (nonatomic, weak, nullable) id delegate; @end diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 01309b6c3..cde38ee8f 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -168,7 +168,7 @@ -(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(null constant:0.0]]; #else - NSRect viewRect = [hostingView bounds]; + NSRect viewRect = hostingView.bounds; scatterView.frame = NSMakeRect( 0.0, 0.0, @@ -187,7 +187,7 @@ -(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(null for ( NSView *view in @[scatterView, barView, pieView] ) { [view setAutoresizesSubviews:YES]; - [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; [hostingView addSubview:view]; } @@ -364,7 +364,7 @@ -(void)renderBarPlotInHostingView:(nonnull CPTGraphHostingView *)hostingView wit CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:xAxisLabels.count]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; @@ -470,7 +470,7 @@ -(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea -(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot { if ( [plot isKindOfClass:[CPTPieChart class]] ) { - return [self.dataForChart count]; + return self.dataForChart.count; } else if ( [plot isKindOfClass:[CPTBarPlot class]] ) { return 16; @@ -485,7 +485,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum NSNumber *num = nil; if ( [plot isKindOfClass:[CPTPieChart class]] ) { - if ( index >= [self.dataForChart count] ) { + if ( index >= self.dataForChart.count ) { return nil; } @@ -517,7 +517,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum // Green plot gets shifted above the blue if ( [(NSString *) plot.identifier isEqualToString:@"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } } diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index 683d2ed4e..fad037583 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -55,7 +55,7 @@ -(void)generateData sum = 0.0; for ( NSNumber *value in contentArray ) { - double error = [value doubleValue] - self.meanValue; + double error = value.doubleValue - self.meanValue; sum += error * error; } double stdDev = sqrt( ( 1.0 / (numberOfPoints - 1) ) * sum ); @@ -255,7 +255,7 @@ -(double)doubleForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recor case CPTScatterPlotFieldY: if ( plot.identifier == kDataLine ) { - number = [self.plotData[index] doubleValue]; + number = (self.plotData[index]).doubleValue; } else if ( plot.identifier == kCenterLine ) { number = self.meanValue; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 28f83b557..a536a2869 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -83,13 +83,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = [point1[@"x"] doubleValue]; - double x2 = [point2[@"x"] doubleValue]; + double x1 = (point1[@"x"]).doubleValue; + double x2 = (point2[@"x"]).doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [point1[@"y"] doubleValue]; - double y2 = [point2[@"y"] doubleValue]; + double y1 = (point1[@"y"]).doubleValue; + double y2 = (point2[@"y"]).doubleValue; double dy = y2 - y1; [contentArray addObject: @@ -110,13 +110,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = [point1[@"x"] doubleValue]; - double x2 = [point2[@"x"] doubleValue]; + double x1 = (point1[@"x"]).doubleValue; + double x2 = (point2[@"x"]).doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = [point1[@"y"] doubleValue]; - double y2 = [point2[@"y"] doubleValue]; + double y1 = (point1[@"y"]).doubleValue; + double y2 = (point2[@"y"]).doubleValue; double dy = y2 - y1; [contentArray addObject: @@ -395,7 +395,7 @@ -(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordI // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -442,7 +442,7 @@ -(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; if ( annotation ) { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; [graph.plotAreaFrame.plotArea removeAnnotation:annotation]; self.symbolTextAnnotation = nil; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index 4934f3dc4..8cc19f69f 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -60,12 +60,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT // for daylight savings time. NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; - [dateComponents setMonth:10]; - [dateComponents setDay:29]; - [dateComponents setYear:2009]; - [dateComponents setHour:12]; - [dateComponents setMinute:0]; - [dateComponents setSecond:0]; + dateComponents.month = 10; + dateComponents.day = 29; + dateComponents.year = 2009; + dateComponents.hour = 12; + dateComponents.minute = 0; + dateComponents.second = 0; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index b04c5a8f4..1a96030f1 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -154,7 +154,7 @@ -(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUI whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", [self.plotData[index] doubleValue]] style:whiteText]; + newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", (self.plotData[index]).doubleValue] style:whiteText]; newLayer.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; newLayer.cornerRadius = 5.0; newLayer.paddingLeft = 3.0; diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index ade67907e..cfa93a914 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -212,7 +212,7 @@ -(nullable UIFont *)italicFontForFont:(nonnull UIFont *)oldFont CPTStringArray fontNames = [UIFont fontNamesForFamilyName:oldFont.familyName]; for ( NSString *fontName in fontNames ) { - NSString *upperCaseFontName = [fontName uppercaseString]; + NSString *upperCaseFontName = fontName.uppercaseString; if ( [upperCaseFontName rangeOfString:@"ITALIC"].location != NSNotFound ) { italicName = fontName; break; @@ -220,7 +220,7 @@ -(nullable UIFont *)italicFontForFont:(nonnull UIFont *)oldFont } if ( !italicName ) { for ( NSString *fontName in fontNames ) { - NSString *upperCaseFontName = [fontName uppercaseString]; + NSString *upperCaseFontName = fontName.uppercaseString; if ( [upperCaseFontName rangeOfString:@"OBLIQUE"].location != NSNotFound ) { italicName = fontName; break; diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index d1aefd0de..d2970ede8 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -34,7 +34,7 @@ -(nonnull instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -201,7 +201,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum NSNumber *num = self.plotData[index][key]; if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue]); + num = @(num.doubleValue); } return num; @@ -254,7 +254,7 @@ -(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordI // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -278,7 +278,7 @@ -(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; if ( annotation ) { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; [graph.plotAreaFrame.plotArea removeAnnotation:annotation]; self.symbolTextAnnotation = nil; diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index d3815886e..204c103db 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -184,7 +184,7 @@ -(void)newData:(nonnull NSTimer *)theTimer duration:CPTFloat(1.0 / kFrameRate)]; self.currentIndex++; - [self.plotData addObject:@( (1.0 - kAlpha) * [[self.plotData lastObject] doubleValue] + kAlpha * arc4random() / (double)UINT32_MAX )]; + [self.plotData addObject:@( (1.0 - kAlpha) * self.plotData.lastObject.doubleValue + kAlpha * arc4random() / (double)UINT32_MAX )]; [thePlot insertDataAtIndex:self.plotData.count - 1 numberOfRecords:1]; } } diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index cdc3103df..59514026e 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -116,7 +116,7 @@ -(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUI whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", [self.plotData[index] doubleValue]] + CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", (self.plotData[index]).doubleValue] style:whiteText]; return newLayer; } @@ -131,7 +131,7 @@ -(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUIntege -(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { - NSLog(@"Slice was selected at index %d. Value = %f", (int)index, [self.plotData[index] doubleValue]); + NSLog(@"Slice was selected at index %d. Value = %f", (int)index, (self.plotData[index]).doubleValue); self.offsetIndex = NSNotFound; diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 4aec27e7b..47a3f92cc 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -38,7 +38,7 @@ -(nonnull instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -245,7 +245,7 @@ -(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordI // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -280,7 +280,7 @@ -(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot -(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea { - CPTXYGraph *graph = [self.graphs objectAtIndex:0]; + CPTXYGraph *graph = (self.graphs)[0]; if ( graph ) { // Remove the annotation diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index 257e0644c..b9802ba27 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -33,7 +33,7 @@ -(nonnull instancetype)init -(void)killGraph { - if ( [self.graphs count] ) { + if ( self.graphs.count ) { CPTGraph *graph = (self.graphs)[0]; CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -243,7 +243,7 @@ -(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUIntege { NSNumber *value = [self numberForPlot:plot field:CPTBarPlotFieldBarTip recordIndex:index]; - NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, [value doubleValue]); + NSLog(@"Bar for '%@' was selected at index %d. Value = %f", plot.identifier, (int)index, value.doubleValue); CPTGraph *graph = (self.graphs)[0]; @@ -268,7 +268,7 @@ -(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUIntege // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:value]; // Now add the annotation to the plot area diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index 32d50adb7..44db81b2e 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -22,7 +22,7 @@ -(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue NSString *string = nil; if ( [coordinateValue respondsToSelector:@selector(doubleValue)] ) { - double value = [(NSNumber *) coordinateValue doubleValue] / M_PI; + double value = ( (NSNumber *)coordinateValue ).doubleValue / M_PI; double factor = round(self.multiplier.doubleValue); if ( factor == 0.0 ) { diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.h b/examples/CorePlotGallery/src/shared/PlotGallery.h index 96a11e43b..4ce75f7c1 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.h +++ b/examples/CorePlotGallery/src/shared/PlotGallery.h @@ -5,7 +5,7 @@ #import "PlotItem.h" -@interface PlotGallery : NSObject +@interface PlotGallery : NSObject @property (nonatomic, readonly) NSUInteger count; @property (nonatomic, readonly) NSUInteger numberOfSections; diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index 5abe25fe9..489052d87 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -107,7 +107,7 @@ -(void)sortByTitle -(CPTStringArray)sectionTitles { - return [[self.plotSections allObjects] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + return [(self.plotSections).allObjects sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; } @end diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 35db805c5..c10b0b8a3 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -310,7 +310,7 @@ -(nonnull NSImage *)image bitsPerPixel:32]; NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)[bitmapContext graphicsPort]; + CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; CGContextClearRect( context, CGRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); @@ -382,7 +382,7 @@ -(void)renderInView:(nonnull PlotGalleryNativeView *)inView withTheme:(nullable multiplier:1.0 constant:0.0]]; #else - [hostingView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + hostingView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; [hostingView setAutoresizesSubviews:YES]; #endif From cda724428168162626fb9e15bfc3ca9418bc8e5f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:34:45 -0400 Subject: [PATCH 177/429] Converted the AAPLot example app to modern Objective-C syntax with Xcode 7.2.1. --- examples/AAPLot/APYahooDataPuller.m | 56 ++++++++++---------- examples/AAPLot/Classes/MainViewController.m | 34 ++++++------ examples/AAPLot/Classes/RootViewController.m | 4 +- examples/AAPLot/NSDateFormatterExtensions.m | 2 +- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/examples/AAPLot/APYahooDataPuller.m b/examples/AAPLot/APYahooDataPuller.m index 9df469247..7c8c5c7f0 100644 --- a/examples/AAPLot/APYahooDataPuller.m +++ b/examples/AAPLot/APYahooDataPuller.m @@ -76,14 +76,14 @@ -(nonnull CPTDictionary)plistRep { CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; - rep[@"symbol"] = [self symbol]; - rep[@"startDate"] = [self startDate]; - rep[@"endDate"] = [self endDate]; - rep[@"overallHigh"] = [self overallHigh]; - rep[@"overallLow"] = [self overallLow]; - rep[@"overallVolumeHigh"] = [self overallVolumeHigh]; - rep[@"overallVolumeLow"] = [self overallVolumeLow]; - rep[@"financialData"] = [self financialData]; + rep[@"symbol"] = self.symbol; + rep[@"startDate"] = self.startDate; + rep[@"endDate"] = self.endDate; + rep[@"overallHigh"] = self.overallHigh; + rep[@"overallLow"] = self.overallLow; + rep[@"overallVolumeHigh"] = self.overallVolumeHigh; + rep[@"overallVolumeLow"] = self.overallVolumeLow; + rep[@"financialData"] = self.financialData; return [NSDictionary dictionaryWithDictionary:rep]; } @@ -106,13 +106,13 @@ -(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSym NSDate *theEndDate = aDict[@"endDate"]; self.endDate = theEndDate ? theEndDate : [NSDate date]; NSNumber *low = aDict[@"overallLow"]; - self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[low decimalValue]] : [NSDecimalNumber notANumber]; + self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:low.decimalValue] : [NSDecimalNumber notANumber]; NSNumber *high = aDict[@"overallHigh"]; - self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[high decimalValue]] : [NSDecimalNumber notANumber]; + self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:high.decimalValue] : [NSDecimalNumber notANumber]; NSNumber *volumeLow = aDict[@"overallVolumeLow"]; - self.overallVolumeLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[volumeLow decimalValue]] : [NSDecimalNumber notANumber]; + self.overallVolumeLow = low ? [NSDecimalNumber decimalNumberWithDecimal:volumeLow.decimalValue] : [NSDecimalNumber notANumber]; NSNumber *volumeHigh = aDict[@"overallVolumeHigh"]; - self.overallVolumeHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[volumeHigh decimalValue]] : [NSDecimalNumber notANumber]; + self.overallVolumeHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:volumeHigh.decimalValue] : [NSDecimalNumber notANumber]; CPTFinancialDataArray dataArray = aDict[@"financialData"]; self.financialData = dataArray ? dataArray : [[NSArray alloc] init]; @@ -142,7 +142,7 @@ -(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { // if there isn't one in the user's documents directory, see if we ship with this data - docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; + docPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } @@ -201,25 +201,25 @@ -(nonnull NSString *)URL NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", self.targetSymbol]; NSDate *tStartDate = self.targetStartDate; if ( tStartDate ) { NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:tStartDate]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + url = [url stringByAppendingFormat:@"a=%ld&", (long)compsStart.month - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)compsStart.day]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)compsStart.year]; } NSDate *tEndDate = self.targetEndDate; if ( tEndDate ) { NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:tEndDate]; - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + url = [url stringByAppendingFormat:@"d=%ld&", (long)compsEnd.month - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)compsEnd.day]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)compsEnd.year]; } url = [url stringByAppendingString:@"g=d&"]; @@ -289,7 +289,7 @@ -(void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonn // has enough information to create the NSURLResponse // it can be called multiple times, for example in the case of a // redirect, so each time we reset the data. - [self.receivedData setLength:0]; + self.receivedData.length = 0; } -(void)cancelDownload @@ -308,7 +308,7 @@ -(void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnul self.loadingData = NO; self.receivedData = nil; self.connection = nil; - NSLog(@"err = %@", [error localizedDescription]); + NSLog(@"err = %@", error.localizedDescription); // TODO:report err } @@ -335,19 +335,19 @@ -(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection BOOL sameSymbol = NO; NSString *dictSymbol = dictionaryForSymbol[@"symbol"]; if ( dictSymbol ) { - sameSymbol = [[self symbol] isEqualToString:dictSymbol]; + sameSymbol = [self.symbol isEqualToString:dictSymbol]; } BOOL sameStart = NO; NSDate *dictStart = dictionaryForSymbol[@"startDate"]; if ( dictStart ) { - sameStart = ([[self startDate] compare:dictStart] != NSOrderedSame); + sameStart = ([self.startDate compare:dictStart] != NSOrderedSame); } BOOL sameEnd = NO; NSDate *dictEnd = dictionaryForSymbol[@"endDate"]; if ( dictEnd ) { - sameEnd = ([[self startDate] compare:dictEnd] != NSOrderedSame); + sameEnd = ([self.startDate compare:dictEnd] != NSOrderedSame); } if ( !sameSymbol || !sameStart || !sameEnd ) { @@ -362,7 +362,7 @@ -(void)parseCSVAndPopulate { CPTStringArray csvLines = [self.csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:[csvLines count]]; + NSMutableArray *newFinancials = [NSMutableArray arrayWithCapacity:csvLines.count]; CPTDictionary currentFinancial = nil; NSString *line = nil; @@ -371,7 +371,7 @@ -(void)parseCSVAndPopulate self.overallVolumeHigh = [NSDecimalNumber notANumber]; self.overallVolumeLow = [NSDecimalNumber notANumber]; - for ( NSUInteger i = 1; i < [csvLines count] - 1; i++ ) { + for ( NSUInteger i = 1; i < csvLines.count - 1; i++ ) { line = csvLines[i]; currentFinancial = [NSDictionary dictionaryWithCSVLine:line]; [newFinancials addObject:currentFinancial]; @@ -415,7 +415,7 @@ -(void)parseCSVAndPopulate self.endDate = self.targetEndDate; self.symbol = self.targetSymbol; - [self setFinancialData:[NSArray arrayWithArray:newFinancials]]; + self.financialData = [NSArray arrayWithArray:newFinancials]; [self notifyPulledData]; } diff --git a/examples/AAPLot/Classes/MainViewController.m b/examples/AAPLot/Classes/MainViewController.m index d1951f24c..1dd039670 100644 --- a/examples/AAPLot/Classes/MainViewController.m +++ b/examples/AAPLot/Classes/MainViewController.m @@ -19,7 +19,7 @@ @implementation MainViewController -(void)setView:(UIView *)aView { - [super setView:aView]; + super.view = aView; if ( nil == aView ) { self.graph = nil; self.graphHost = nil; @@ -119,8 +119,8 @@ -(void)viewDidLoad NSDate *start = [NSDate dateWithTimeIntervalSinceNow:-60.0 * 60.0 * 24.0 * 7.0 * 12.0]; // 12 weeks ago NSDate *end = [NSDate date]; APYahooDataPuller *dp = [[APYahooDataPuller alloc] initWithTargetSymbol:@"AAPL" targetStartDate:start targetEndDate:end]; - [self setDatapuller:dp]; - [dp setDelegate:self]; + self.datapuller = dp; + dp.delegate = self; [super viewDidLoad]; } @@ -176,7 +176,7 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTScatterPlotFieldY: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -201,7 +201,7 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTScatterPlotFieldY: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -228,7 +228,7 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTBarPlotFieldBarTip: value = fData[@"volume"]; NSAssert(value, @"Volume value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -253,7 +253,7 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTBarPlotFieldBarTip: value = fData[@"volume"]; NSAssert(value, @"Volume value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -280,25 +280,25 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTTradingRangePlotFieldOpen: value = fData[@"open"]; NSAssert(value, @"Open value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldHigh: value = fData[@"high"]; NSAssert(value, @"High value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldLow: value = fData[@"low"]; NSAssert(value, @"Low value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; case CPTTradingRangePlotFieldClose: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value doubleValue]; + *nextValue++ = value.doubleValue; break; default: @@ -323,25 +323,25 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange case CPTTradingRangePlotFieldOpen: value = fData[@"open"]; NSAssert(value, @"Open value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldHigh: value = fData[@"high"]; NSAssert(value, @"High value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldLow: value = fData[@"low"]; NSAssert(value, @"Low value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; case CPTTradingRangePlotFieldClose: value = fData[@"close"]; NSAssert(value, @"Close value was nil"); - *nextValue++ = [value decimalValue]; + *nextValue++ = value.decimalValue; break; default: @@ -650,8 +650,8 @@ -(void)dataPullerDidFinishFetch:(nonnull APYahooDataPuller *)dp if ( volumeLowDisplayLocation && volumeLengthDisplayLocation ) { animationOperation = [CPTAnimation animate:volumePlotSpace property:@"yRange" - fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:[volumeLowDisplayLocation decimalValue] - lengthDecimal:CPTDecimalMultiply( [volumeLengthDisplayLocation decimalValue], CPTDecimalFromInteger(10) )] + fromPlotRange:[CPTPlotRange plotRangeWithLocationDecimal:volumeLowDisplayLocation.decimalValue + lengthDecimal:CPTDecimalMultiply( volumeLengthDisplayLocation.decimalValue, CPTDecimalFromInteger(10) )] toPlotRange:[CPTPlotRange plotRangeWithLocation:volumeLowDisplayLocation length:volumeLengthDisplayLocation] duration:2.5]; diff --git a/examples/AAPLot/Classes/RootViewController.m b/examples/AAPLot/Classes/RootViewController.m index fc8ab4c27..9f53bd403 100644 --- a/examples/AAPLot/Classes/RootViewController.m +++ b/examples/AAPLot/Classes/RootViewController.m @@ -66,10 +66,10 @@ -(IBAction)toggleView [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1]; - UIViewAnimationTransition transition = ([mainView superview] ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft); + UIViewAnimationTransition transition = (mainView.superview ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft); [UIView setAnimationTransition:transition forView:self.view cache:YES]; - if ( [mainView superview] != nil ) { + if ( mainView.superview != nil ) { [self.flipsideViewController viewWillAppear:YES]; [self.mainViewController viewWillDisappear:YES]; [mainView removeFromSuperview]; diff --git a/examples/AAPLot/NSDateFormatterExtensions.m b/examples/AAPLot/NSDateFormatterExtensions.m index cf1b0970d..53e754d36 100644 --- a/examples/AAPLot/NSDateFormatterExtensions.m +++ b/examples/AAPLot/NSDateFormatterExtensions.m @@ -9,7 +9,7 @@ +(nonnull NSDateFormatter *)csvDateFormatter dispatch_once(&onceToken, ^{ df = [[NSDateFormatter alloc] init]; - [df setDateFormat:@"yyyy-MM-dd"]; + df.dateFormat = @"yyyy-MM-dd"; }); return df; From fd4fc35ccb8f505f181d575a736a487ab8708d70 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:39:24 -0400 Subject: [PATCH 178/429] Converted the CPTTestApp example apps to modern Objective-C syntax with Xcode 7.2.1. --- .../Classes/CPTTestApp_iPadViewController.m | 6 ++--- .../Source/CPTPlotSymbolTestController.m | 4 ++-- examples/CPTTestApp/Source/Controller.m | 22 +++++++++---------- examples/CPTTestApp/Source/RotationView.m | 8 +++---- .../Source/SelectionDemoController.m | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index eeed42c8b..b30d7bf03 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -233,7 +233,7 @@ -(void)constructBarChart CPTNumberArray customTickLocations = @[@1, @5, @10, @15]; CPTStringArray xAxisLabels = @[@"Label A", @"Label B", @"Label C", @"Label D"]; NSUInteger labelLocation = 0; - CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:[xAxisLabels count]]; + CPTMutableAxisLabelSet customLabels = [NSMutableSet setWithCapacity:xAxisLabels.count]; for ( NSNumber *tickLocation in customTickLocations ) { CPTAxisLabel *newLabel = [[CPTAxisLabel alloc] initWithText:xAxisLabels[labelLocation++] textStyle:x.labelTextStyle]; newLabel.tickLocation = tickLocation; @@ -346,7 +346,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum NSNumber *num = nil; if ( [plot isKindOfClass:[CPTPieChart class]] ) { - if ( index >= [self.dataForChart count] ) { + if ( index >= self.dataForChart.count ) { return nil; } @@ -388,7 +388,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum // Green plot gets shifted above the blue if ( [(NSString *) plot.identifier isEqualToString:@"Green Plot"] ) { if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } } diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index e02f36772..9cb1fa30c 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -82,7 +82,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum break; case CPTScatterPlotFieldY: - num = @([(NSString *) plot.identifier integerValue]); + num = @( ( (NSString *)plot.identifier ).integerValue ); break; default: @@ -103,7 +103,7 @@ -(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot r symbolShadow.shadowColor = [CPTColor blackColor]; CPTPlotSymbol *symbol = [[CPTPlotSymbol alloc] init]; - symbol.symbolType = (CPTPlotSymbolType)[(NSString *) plot.identifier intValue]; + symbol.symbolType = (CPTPlotSymbolType)( (NSString *)plot.identifier ).intValue; symbol.fill = [CPTFill fillWithGradient:gradientFill]; symbol.shadow = symbolShadow; diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 321a2f944..081a64185 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -423,7 +423,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); num = (self.arrangedObjects)[index][key]; if ( fieldEnum == CPTScatterPlotFieldY ) { - num = @([num doubleValue] + 1.0); + num = @(num.doubleValue + 1.0); } } return num; @@ -474,7 +474,7 @@ -(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordI // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -517,7 +517,7 @@ -(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUIntege // Add annotation // First make a string for the y value NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setMaximumFractionDigits:2]; + formatter.maximumFractionDigits = 2; NSString *yString = [formatter stringFromNumber:y]; // Now add the annotation to the plot area @@ -561,12 +561,12 @@ -(IBAction)exportToPDF:(nullable id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; - [pdfSavingDialog setAllowedFileTypes:@[@"pdf"]]; + pdfSavingDialog.allowedFileTypes = @[@"pdf"]; if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - NSURL *url = [pdfSavingDialog URL]; + NSURL *url = pdfSavingDialog.URL; if ( url ) { [dataForPDF writeToURL:url atomically:NO]; } @@ -577,15 +577,15 @@ -(IBAction)exportToPNG:(nullable id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; - [pngSavingDialog setAllowedFileTypes:@[@"png"]]; + pngSavingDialog.allowedFileTypes = @[@"png"]; if ( [pngSavingDialog runModal] == NSOKButton ) { NSImage *image = [self.graph imageOfLayer]; - NSData *tiffData = [image TIFFRepresentation]; + NSData *tiffData = image.TIFFRepresentation; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:@{}]; - NSURL *url = [pngSavingDialog URL]; + NSURL *url = pngSavingDialog.URL; if ( url ) { [pngData writeToURL:url atomically:NO]; } @@ -639,8 +639,8 @@ -(IBAction)explodeLayers:(nullable id)sender RotationView *overlayView = [[RotationView alloc] initWithFrame:self.hostView.frame]; overlayView.rotationDelegate = self; overlayView.rotationTransform = perspectiveRotation; - [overlayView setAutoresizingMask:[self.hostView autoresizingMask]]; - [[self.hostView superview] addSubview:overlayView positioned:NSWindowAbove relativeTo:self.hostView]; + overlayView.autoresizingMask = self.hostView.autoresizingMask; + [(self.hostView).superview addSubview:overlayView positioned:NSWindowAbove relativeTo:self.hostView]; self.overlayRotationView = overlayView; [CATransaction begin]; diff --git a/examples/CPTTestApp/Source/RotationView.m b/examples/CPTTestApp/Source/RotationView.m index 1c2a649b1..f65a18c17 100644 --- a/examples/CPTTestApp/Source/RotationView.m +++ b/examples/CPTTestApp/Source/RotationView.m @@ -37,12 +37,12 @@ -(BOOL)acceptsFirstMouse:(nullable NSEvent *)theEvent -(void)mouseDown:(nonnull NSEvent *)theEvent { - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } -(void)mouseDragged:(nonnull NSEvent *)theEvent { - NSPoint currentLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + NSPoint currentLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; CGFloat displacementInX = kMouseMovementScaleFactorForRotation * (currentLocation.x - self.previousLocation.x); CGFloat displacementInY = kMouseMovementScaleFactorForRotation * (self.previousLocation.y - currentLocation.y); @@ -59,12 +59,12 @@ -(void)mouseDragged:(nonnull NSEvent *)theEvent [theDelegate rotateObjectUsingTransform:newTransform]; self.rotationTransform = newTransform; - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } -(void)mouseUp:(nonnull NSEvent *)theEvent { - self.previousLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + self.previousLocation = [self convertPoint:theEvent.locationInWindow fromView:nil]; } #pragma mark - diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index 9f47621ea..088ca6cd9 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -187,7 +187,7 @@ -(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot NSUInteger count = 0; if ( [(NSString *) plot.identifier isEqualToString:MAIN_PLOT] ) { - count = [self.dataForPlot count]; + count = self.dataForPlot.count; } else if ( [(NSString *) plot.identifier isEqualToString:SELECTION_PLOT] ) { if ( self.selectedIndex < NSUIntegerMax ) { From b5162f5d4cda605f9a6e0cd4b98fee4d6bbc514a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:43:33 -0400 Subject: [PATCH 179/429] Converted the DropPlot example app to modern Objective-C syntax with Xcode 7.2.1. --- examples/DropPlot/CPTPlotDocument.m | 24 ++++++++++++------------ examples/DropPlot/NSString+ParseCSV.m | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 2eb51fd72..77c5c6355 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -95,7 +95,7 @@ -(void)windowControllerDidLoadNib:(nonnull NSWindowController *)windowController length:@(ceil( (self.maximumValueForYAxis - self.minimumValueForYAxis) / self.majorIntervalLengthForY ) * self.majorIntervalLengthForY)]; // this allows the plot to respond to mouse events - [plotSpace setDelegate:self]; + plotSpace.delegate = self; [plotSpace setAllowsUserInteraction:YES]; CPTXYAxisSet *axisSet = (CPTXYAxisSet *)newGraph.axisSet; @@ -171,8 +171,8 @@ -(BOOL)readFromData:(nonnull NSData *)data ofType:(NSString *)typeName error:(NS currentRange = NSMakeRange(lineStart, contentsEnd - lineStart); CPTStringArray columnValues = [[fileContents substringWithRange:currentRange] arrayByParsingCSVLine]; - double xValue = [columnValues[0] doubleValue]; - double yValue = [columnValues[1] doubleValue]; + double xValue = columnValues[0].doubleValue; + double yValue = columnValues[1].doubleValue; if ( xValue < minX ) { minX = xValue; } @@ -271,12 +271,12 @@ -(IBAction)zoomOut // get the ful range min and max values for ( NSDictionary *xyValues in self.dataPoints ) { - double xVal = [xyValues[@"x"] doubleValue]; + double xVal = xyValues[@"x"].doubleValue; minX = fmin(xVal, minX); maxX = fmax(xVal, maxX); - double yVal = [xyValues[@"y"] doubleValue]; + double yVal = xyValues[@"y"].doubleValue; minY = fmin(yVal, minY); maxY = fmax(yVal, maxY); @@ -312,12 +312,12 @@ -(IBAction)exportToPDF:(nullable id)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; - [pdfSavingDialog setAllowedFileTypes:@[@"pdf"]]; + pdfSavingDialog.allowedFileTypes = @[@"pdf"]; if ( [pdfSavingDialog runModal] == NSOKButton ) { NSData *dataForPDF = [self.graph dataForPDFRepresentationOfLayer]; - NSURL *url = [pdfSavingDialog URL]; + NSURL *url = pdfSavingDialog.URL; if ( url ) { [dataForPDF writeToURL:url atomically:NO]; } @@ -328,15 +328,15 @@ -(IBAction)exportToPNG:(nullable id)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; - [pngSavingDialog setAllowedFileTypes:@[@"png"]]; + pngSavingDialog.allowedFileTypes = @[@"png"]; if ( [pngSavingDialog runModal] == NSOKButton ) { NSImage *image = [self.graph imageOfLayer]; - NSData *tiffData = [image TIFFRepresentation]; + NSData *tiffData = image.TIFFRepresentation; NSBitmapImageRep *tiffRep = [NSBitmapImageRep imageRepWithData:tiffData]; - NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:[NSDictionary dictionary]]; + NSData *pngData = [tiffRep representationUsingType:NSPNGFileType properties:@{}]; - NSURL *url = [pngSavingDialog URL]; + NSURL *url = pngSavingDialog.URL; if ( url ) { [pngData writeToURL:url atomically:NO]; } @@ -437,7 +437,7 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent self.dragEnd = interactionPoint; // double-click to completely zoom out - if ( [event clickCount] == 2 ) { + if ( event.clickCount == 2 ) { CPTPlotArea *plotArea = self.graph.plotAreaFrame.plotArea; CGPoint dragEndInPlotArea = [self.graph convertPoint:interactionPoint toLayer:plotArea]; diff --git a/examples/DropPlot/NSString+ParseCSV.m b/examples/DropPlot/NSString+ParseCSV.m index d3b604b98..a9dc67d4d 100644 --- a/examples/DropPlot/NSString+ParseCSV.m +++ b/examples/DropPlot/NSString+ParseCSV.m @@ -13,7 +13,7 @@ -(CPTStringArray)arrayByParsingCSVLine BOOL inField = NO; - for ( NSUInteger i = 0; i < [theFields count]; i++ ) { + for ( NSUInteger i = 0; i < theFields.count; i++ ) { NSString *theField = theFields[i]; switch ( inField ) { case NO: From 263798192678fc1e8160a19effebfdc8be9be2b0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:49:08 -0400 Subject: [PATCH 180/429] Converted the StockPlot example app to modern Objective-C syntax with Xcode 7.2.1. --- .../StockPlot/Classes/APYahooDataPuller.m | 48 +++++++------- .../Classes/APYahooDataPullerGraph.m | 8 +-- .../Classes/NSDictionary+APFinancialData.m | 2 +- .../StockPlot/Classes/RootViewController.m | 62 +++++++++---------- .../StockPlot/Classes/StockPlotAppDelegate.m | 2 +- 5 files changed, 61 insertions(+), 61 deletions(-) diff --git a/examples/StockPlot/Classes/APYahooDataPuller.m b/examples/StockPlot/Classes/APYahooDataPuller.m index 14cd0face..005bb63f0 100644 --- a/examples/StockPlot/Classes/APYahooDataPuller.m +++ b/examples/StockPlot/Classes/APYahooDataPuller.m @@ -62,10 +62,10 @@ -(nonnull CPTDictionary)sanitizedFinancialLine:(nonnull CPTDictionary)theFinanci { CPTMutableDictionary aFinancialLine = [NSMutableDictionary dictionaryWithDictionary:theFinancialLine]; - for ( id key in [aFinancialLine allKeys] ) { + for ( id key in aFinancialLine.allKeys ) { id something = aFinancialLine[key]; if ( [something respondsToSelector:@selector(decimalValue)] ) { - something = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *) something decimalValue]]; + something = [NSDecimalNumber decimalNumberWithDecimal:( (NSNumber *)something ).decimalValue]; aFinancialLine[key] = something; } } @@ -99,12 +99,12 @@ -(nonnull CPTDictionary)plistRep { CPTMutableDictionary rep = [NSMutableDictionary dictionaryWithCapacity:7]; - rep[@"symbol"] = [self symbol]; - rep[@"startDate"] = [self startDate]; - rep[@"endDate"] = [self endDate]; - rep[@"overallHigh"] = [self overallHigh]; - rep[@"overallLow"] = [self overallLow]; - rep[@"financialData"] = [self financialData]; + rep[@"symbol"] = self.symbol; + rep[@"startDate"] = self.startDate; + rep[@"endDate"] = self.endDate; + rep[@"overallHigh"] = self.overallHigh; + rep[@"overallLow"] = self.overallLow; + rep[@"financialData"] = self.financialData; return [NSDictionary dictionaryWithDictionary:rep]; } @@ -127,9 +127,9 @@ -(nonnull instancetype)initWithDictionary:(nonnull CPTDictionary)aDict targetSym NSDate *theEndDate = aDict[@"endDate"]; self.endDate = theEndDate ? theEndDate : [NSDate date]; NSNumber *low = aDict[@"overallLow"]; - self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:[low decimalValue]] : [NSDecimalNumber notANumber]; + self.overallLow = low ? [NSDecimalNumber decimalNumberWithDecimal:low.decimalValue] : [NSDecimalNumber notANumber]; NSNumber *high = aDict[@"overallHigh"]; - self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:[high decimalValue]] : [NSDecimalNumber notANumber]; + self.overallHigh = high ? [NSDecimalNumber decimalNumberWithDecimal:high.decimalValue] : [NSDecimalNumber notANumber]; CPTFinancialDataArray dataArray = aDict[@"financialData"]; self.financialData = dataArray ? dataArray : [[NSArray alloc] init]; @@ -157,7 +157,7 @@ -(nonnull NSString *)faultTolerantPathForSymbol:(nonnull NSString *)aSymbol if ( ![[NSFileManager defaultManager] fileExistsAtPath:docPath] ) { // if there isn't one in the user's documents directory, see if we ship with this data - docPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; + docPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", aSymbol]]; } return docPath; } @@ -214,25 +214,25 @@ -(nonnull NSString *)URL NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", [self targetSymbol]]; + NSString *url = [NSString stringWithFormat:@"https://ichart.yahoo.com/table.csv?s=%@&", self.targetSymbol]; NSDate *tStartDate = self.targetStartDate; if ( tStartDate ) { NSDateComponents *compsStart = [gregorian components:unitFlags fromDate:tStartDate]; - url = [url stringByAppendingFormat:@"a=%ld&", (long)[compsStart month] - 1]; - url = [url stringByAppendingFormat:@"b=%ld&", (long)[compsStart day]]; - url = [url stringByAppendingFormat:@"c=%ld&", (long)[compsStart year]]; + url = [url stringByAppendingFormat:@"a=%ld&", (long)compsStart.month - 1]; + url = [url stringByAppendingFormat:@"b=%ld&", (long)compsStart.day]; + url = [url stringByAppendingFormat:@"c=%ld&", (long)compsStart.year]; } NSDate *tEndDate = self.targetEndDate; if ( tEndDate ) { NSDateComponents *compsEnd = [gregorian components:unitFlags fromDate:tEndDate]; - url = [url stringByAppendingFormat:@"d=%ld&", (long)[compsEnd month] - 1]; - url = [url stringByAppendingFormat:@"e=%ld&", (long)[compsEnd day]]; - url = [url stringByAppendingFormat:@"f=%ld&", (long)[compsEnd year]]; + url = [url stringByAppendingFormat:@"d=%ld&", (long)compsEnd.month - 1]; + url = [url stringByAppendingFormat:@"e=%ld&", (long)compsEnd.day]; + url = [url stringByAppendingFormat:@"f=%ld&", (long)compsEnd.year]; } url = [url stringByAppendingString:@"g=d&"]; @@ -260,9 +260,9 @@ -(BOOL)staleData NSTimeInterval twelveHours = 60.0 * 60.0 * 12.0; return 0 >= self.financialData.count || - ![[self targetSymbol] isEqualToString:[self symbol]] || - [[self targetStartDate] timeIntervalSinceDate:[self startDate]] > twelveHours || - [[self targetEndDate] timeIntervalSinceDate:[self endDate]] > twelveHours; + ![self.targetSymbol isEqualToString:self.symbol] || + [self.targetStartDate timeIntervalSinceDate:self.startDate] > twelveHours || + [self.targetEndDate timeIntervalSinceDate:self.endDate] > twelveHours; } -(void)fetchIfNeeded @@ -305,7 +305,7 @@ -(void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonn // has enough information to create the NSURLResponse // it can be called multiple times, for example in the case of a // redirect, so each time we reset the data. - [self.receivedData setLength:0]; + self.receivedData.length = 0; } -(void)cancelDownload @@ -324,7 +324,7 @@ -(void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnul self.loadingData = NO; self.receivedData = nil; self.connection = nil; - NSLog(@"err = %@", [error localizedDescription]); + NSLog(@"err = %@", error.localizedDescription); self.connection = nil; id theDelegate = self.delegate; @@ -389,7 +389,7 @@ -(void)populateWithString:(NSString *)csv self.endDate = self.targetEndDate; self.symbol = self.targetSymbol; - [self setFinancialData:[NSArray arrayWithArray:newFinancials]]; + self.financialData = [NSArray arrayWithArray:newFinancials]; } @end diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index a009ae6e4..9125fced1 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -78,7 +78,7 @@ -(void)reloadData [theGraph reloadData]; - [[self navigationItem] setTitle:[self.dataPuller symbol]]; + self.navigationItem.title = self.dataPuller.symbol; } -(void)viewWillAppear:(BOOL)animated @@ -129,7 +129,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum else if ( fieldEnum == CPTScatterPlotFieldY ) { CPTFinancialDataArray financialData = self.dataPuller.financialData; - CPTDictionary fData = financialData[[financialData count] - index - 1]; + CPTDictionary fData = financialData[financialData.count - index - 1]; num = fData[@"close"]; NSAssert([num isMemberOfClass:[NSDecimalNumber class]], @"grrr"); } @@ -149,8 +149,8 @@ -(void)setDataPuller:(nonnull APYahooDataPuller *)aDataPuller // NSLog(@"in -setDataPuller:, old value of dataPuller: %@, changed to: %@", dataPuller, aDataPuller); if ( dataPuller != aDataPuller ) { - dataPuller = aDataPuller; - [dataPuller setDelegate:self]; + dataPuller = aDataPuller; + dataPuller.delegate = self; [self reloadData]; } } diff --git a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m index 0fb7ddaf2..2bd122e61 100644 --- a/examples/StockPlot/Classes/NSDictionary+APFinancialData.m +++ b/examples/StockPlot/Classes/NSDictionary+APFinancialData.m @@ -17,7 +17,7 @@ +(nonnull NSDateFormatter *)yahooCSVDateFormatter dispatch_once(&onceToken, ^{ df = [[NSDateFormatter alloc] init]; - [df setDateFormat:@"yyyy-MM-dd"]; + df.dateFormat = @"yyyy-MM-dd"; }); return df; diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index 0619048a1..4037157e3 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -46,10 +46,10 @@ -(void)didReceiveMemoryWarning -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - [[self navigationItem] setTitle:@"Stocks"]; + self.navigationItem.title = @"Stocks"; // the graph will set itself as delegate of the dataPuller when we push it, so we need to reset this. for ( APYahooDataPuller *dp in self.stocks ) { - [dp setDelegate:self]; + dp.delegate = self; } } @@ -57,11 +57,11 @@ -(void)viewWillAppear:(BOOL)animated -(void)inspectStock:(nonnull APYahooDataPuller *)aStock { - NSDecimalNumber *high = [aStock overallHigh]; - NSDecimalNumber *low = [aStock overallLow]; + NSDecimalNumber *high = aStock.overallHigh; + NSDecimalNumber *low = aStock.overallLow; - if ( [high isEqualToNumber:[NSDecimalNumber notANumber]] || [low isEqualToNumber:[NSDecimalNumber notANumber]] || ([[aStock financialData] count] <= 0) ) { - NSString *message = [NSString stringWithFormat:@"No information available for %@", [aStock symbol]]; + if ( [high isEqualToNumber:[NSDecimalNumber notANumber]] || [low isEqualToNumber:[NSDecimalNumber notANumber]] || (aStock.financialData.count <= 0) ) { + NSString *message = [NSString stringWithFormat:@"No information available for %@", aStock.symbol]; UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Alert" message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [av show]; } @@ -71,7 +71,7 @@ -(void)inspectStock:(nonnull APYahooDataPuller *)aStock self.graph = aGraph; } - [self.graph setDataPuller:aStock]; + self.graph.dataPuller = aStock; [self.navigationController pushViewController:self.graph animated:YES]; self.graph.view.frame = self.view.bounds; } @@ -101,44 +101,44 @@ -(void)setupCell:(nonnull UITableViewCell *)cell forStockAtIndex:(NSUInteger)row { APYahooDataPuller *dp = self.stocks[row]; - [[cell textLabel] setText:[dp symbol]]; + cell.textLabel.text = dp.symbol; NSDateFormatter *df = [[NSDateFormatter alloc] init]; - [df setDateStyle:NSDateFormatterShortStyle]; + df.dateStyle = NSDateFormatterShortStyle; NSString *startString = @"(NA)"; - if ( [dp startDate] ) { - startString = [df stringFromDate:[dp startDate]]; + if ( dp.startDate ) { + startString = [df stringFromDate:dp.startDate]; } NSString *endString = @"(NA)"; - if ( [dp endDate] ) { - endString = [df stringFromDate:[dp endDate]]; + if ( dp.endDate ) { + endString = [df stringFromDate:dp.endDate]; } NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; - [nf setRoundingMode:NSNumberFormatterRoundHalfUp]; - [nf setDecimalSeparator:@"."]; - [nf setGroupingSeparator:@","]; - [nf setPositiveFormat:@"\u00A4###,##0.00"]; - [nf setNegativeFormat:@"(\u00A4###,##0.00)"]; + nf.roundingMode = NSNumberFormatterRoundHalfUp; + nf.decimalSeparator = @"."; + nf.groupingSeparator = @","; + nf.positiveFormat = @"\u00A4###,##0.00"; + nf.negativeFormat = @"(\u00A4###,##0.00)"; NSString *overallLow = @"(NA)"; - if ( ![[NSDecimalNumber notANumber] isEqual:[dp overallLow]] ) { - overallLow = [nf stringFromNumber:[dp overallLow]]; + if ( ![[NSDecimalNumber notANumber] isEqual:dp.overallLow] ) { + overallLow = [nf stringFromNumber:dp.overallLow]; } NSString *overallHigh = @"(NA)"; - if ( ![[NSDecimalNumber notANumber] isEqual:[dp overallHigh]] ) { - overallHigh = [nf stringFromNumber:[dp overallHigh]]; + if ( ![[NSDecimalNumber notANumber] isEqual:dp.overallHigh] ) { + overallHigh = [nf stringFromNumber:dp.overallHigh]; } - [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%@ - %@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]]; + cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@; Low:%@ High:%@", startString, endString, overallLow, overallHigh]; - UIView *accessory = [cell accessoryView]; + UIView *accessory = cell.accessoryView; if ( dp.loadingData ) { if ( ![accessory isMemberOfClass:[UIActivityIndicatorView class]] ) { accessory = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [(UIActivityIndicatorView *) accessory setHidesWhenStopped:NO]; - [cell setAccessoryView:accessory]; + cell.accessoryView = accessory; } [(UIActivityIndicatorView *) accessory startAnimating]; } @@ -149,8 +149,8 @@ -(void)setupCell:(nonnull UITableViewCell *)cell forStockAtIndex:(NSUInteger)row if ( dp.staleData ) { if ( ![accessory isMemberOfClass:[UIImageView class]] ) { UIImage *caution = [UIImage imageNamed:@"caution.png"]; - accessory = [[UIImageView alloc] initWithImage:caution]; - [cell setAccessoryView:accessory]; + accessory = [[UIImageView alloc] initWithImage:caution]; + cell.accessoryView = accessory; // CGRect frame = accessory.frame; // #pragma unused (frame) } @@ -193,7 +193,7 @@ -(nonnull CPTStringArray)symbols CPTMutableStringArray symbols = [NSMutableArray arrayWithCapacity:self.stocks.count]; for ( APYahooDataPuller *dp in self.stocks ) { - [symbols addObject:[dp symbol]]; + [symbols addObject:dp.symbol]; } return [NSArray arrayWithArray:symbols]; } @@ -226,10 +226,10 @@ -(void)addSymbol:(nonnull NSString *)aSymbol APYahooDataPuller *dp = [[APYahooDataPuller alloc] initWithTargetSymbol:aSymbol targetStartDate:start targetEndDate:end]; - [[self stocks] addObject:dp]; + [self.stocks addObject:dp]; [dp fetchIfNeeded]; - [dp setDelegate:self]; - [[self tableView] reloadData]; // TODO: should reload whole thing + dp.delegate = self; + [self.tableView reloadData]; // TODO: should reload whole thing } -(void)dealloc diff --git a/examples/StockPlot/Classes/StockPlotAppDelegate.m b/examples/StockPlot/Classes/StockPlotAppDelegate.m index 00bbba1ae..73a586315 100644 --- a/examples/StockPlot/Classes/StockPlotAppDelegate.m +++ b/examples/StockPlot/Classes/StockPlotAppDelegate.m @@ -19,7 +19,7 @@ @implementation StockPlotAppDelegate -(void)applicationDidFinishLaunching:(nonnull UIApplication *)application { - [[self.navigationController navigationBar] setTintColor:[UIColor blackColor]]; + self.navigationController.navigationBar.tintColor = [UIColor blackColor]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; From af1d22d5157f85a27dab5a4b83f0a83e0daaeb06 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:51:05 -0400 Subject: [PATCH 181/429] Converted the Quartz Composer plugin to modern Objective-C syntax with Xcode 7.2.1. --- QCPlugin/CPTBarPlotPlugin.m | 8 ++++---- QCPlugin/CPTPieChartPlugin.m | 2 +- QCPlugin/CPTScatterPlotPlugin.m | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 1c76128da..557a0ba7b 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -153,7 +153,7 @@ -(void)removePlots:(NSUInteger)count [self removeInputPortForKey:[NSString stringWithFormat:@"plotFillColor%lu", (unsigned long)(i - 1)]]; [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataLineWidth%lu", (unsigned long)(i - 1)]]; - [theGraph removePlot:[[theGraph allPlots] lastObject]]; + [theGraph removePlot:[theGraph allPlots].lastObject]; } } @@ -162,7 +162,7 @@ -(BOOL)configurePlots CPTGraph *theGraph = self.graph; // The pixel width of a single plot unit (1..2) along the x axis of the plot - double count = (double)[[theGraph allPlots] count]; + double count = (double)[theGraph allPlots].count; double unitWidth = theGraph.plotAreaFrame.bounds.size.width / (self.inputXMax - self.inputXMin); double barWidth = self.inputBarWidth * unitWidth / count; @@ -207,13 +207,13 @@ -(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fi return nil; } - NSUInteger keyCount = [[dict allKeys] count]; + NSUInteger keyCount = dict.allKeys.count; CPTMutableNumberArray array = [NSMutableArray array]; if ( fieldEnum == CPTBarPlotFieldBarLocation ) { // Calculate horizontal position of bar - nth bar index + barWidth*plotIndex + 0.5 float xpos; - float plotCount = [[self.graph allPlots] count]; + float plotCount = [self.graph allPlots].count; for ( NSUInteger i = 0; i < keyCount; i++ ) { xpos = (float)i + (float)plotIndex / (plotCount); diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index c3dc4a7e8..5bc619278 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -241,7 +241,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum -(nullable CPTFill *)sliceFillForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { - CGColorRef plotFillColor = [[CPTPieChart defaultPieSliceColorForIndex:index] cgColor]; + CGColorRef plotFillColor = [CPTPieChart defaultPieSliceColorForIndex:index].cgColor; CGColorRef inputFillColor = (CGColorRef)[self areaFillColor:0]; const CGFloat *plotColorComponents = CGColorGetComponents(plotFillColor); diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index a09623e69..41ed47bef 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -123,7 +123,7 @@ -(void)removePlots:(NSUInteger)count [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataSymbols%lu", (unsigned long)(i - 1)]]; [self removeInputPortForKey:[NSString stringWithFormat:@"plotDataSymbolColor%lu", (unsigned long)(i - 1)]]; - [theGraph removePlot:[[theGraph allPlots] lastObject]]; + [theGraph removePlot:[theGraph allPlots].lastObject]; } } From 03924990317eb2609ab9e94820dc8045e642ed42 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 19 Mar 2016 20:51:40 -0400 Subject: [PATCH 182/429] Modern objective-C conversion cleanup. --- .../CorePlotGallery/src/plots/ControlChart.m | 2 +- .../src/plots/CurvedScatterPlot.m | 16 ++++++++-------- examples/CorePlotGallery/src/plots/DonutChart.m | 2 +- .../CorePlotGallery/src/plots/SimplePieChart.m | 4 ++-- framework/Source/CPTNumericDataTests.m | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index fad037583..50425cd77 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -255,7 +255,7 @@ -(double)doubleForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recor case CPTScatterPlotFieldY: if ( plot.identifier == kDataLine ) { - number = (self.plotData[index]).doubleValue; + number = self.plotData[index].doubleValue; } else if ( plot.identifier == kCenterLine ) { number = self.meanValue; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index a536a2869..51799f473 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -83,13 +83,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = (point1[@"x"]).doubleValue; - double x2 = (point2[@"x"]).doubleValue; + double x1 = point1[@"x"].doubleValue; + double x2 = point2[@"x"].doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = (point1[@"y"]).doubleValue; - double y2 = (point2[@"y"]).doubleValue; + double y1 = point1[@"y"].doubleValue; + double y2 = point2[@"y"].doubleValue; double dy = y2 - y1; [contentArray addObject: @@ -110,13 +110,13 @@ -(void)generateData NSDictionary *point1 = dataArray[i - 1]; NSDictionary *point2 = dataArray[i]; - double x1 = (point1[@"x"]).doubleValue; - double x2 = (point2[@"x"]).doubleValue; + double x1 = point1[@"x"].doubleValue; + double x2 = point2[@"x"].doubleValue; double dx = x2 - x1; double xLoc = (x1 + x2) * 0.5; - double y1 = (point1[@"y"]).doubleValue; - double y2 = (point2[@"y"]).doubleValue; + double y1 = point1[@"y"].doubleValue; + double y2 = point2[@"y"].doubleValue; double dy = y2 - y1; [contentArray addObject: diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index 1a96030f1..f05fa77ac 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -154,7 +154,7 @@ -(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUI whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", (self.plotData[index]).doubleValue] style:whiteText]; + newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%.0f", self.plotData[index].doubleValue] style:whiteText]; newLayer.fill = [CPTFill fillWithColor:[CPTColor darkGrayColor]]; newLayer.cornerRadius = 5.0; newLayer.paddingLeft = 3.0; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 59514026e..c9398afb5 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -116,7 +116,7 @@ -(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUI whiteText.fontSize = self.titleSize * CPTFloat(0.5); }); - CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", (self.plotData[index]).doubleValue] + CPTTextLayer *newLayer = [[CPTTextLayer alloc] initWithText:[NSString stringWithFormat:@"%1.0f", self.plotData[index].doubleValue] style:whiteText]; return newLayer; } @@ -131,7 +131,7 @@ -(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUIntege -(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUInteger)index { - NSLog(@"Slice was selected at index %d. Value = %f", (int)index, (self.plotData[index]).doubleValue); + NSLog(@"Slice was selected at index %d. Value = %f", (int)index, self.plotData[index].doubleValue); self.offsetIndex = NSNotFound; diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 85c4d7c30..37231e0b3 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -78,7 +78,7 @@ -(void)testReturnsDataLength shape:nil]; NSUInteger expected = 10 * sizeof(float); - NSUInteger actual = (nd.data).length; + NSUInteger actual = nd.data.length; XCTAssertEqual(expected, actual, @"data length"); } From 07b8ff34c9efabcd3312efcdbf3cac42be94a325 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 10:10:58 -0400 Subject: [PATCH 183/429] Added the _CPTCatmullRomInterpolation class to the tvOS framework. --- framework/CorePlot.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 8a25b3603..061789d74 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -467,6 +467,9 @@ C37EA6AE1BC83F2D0091C8F7 /* CPTLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C3C1C07F1790D3B400E8B1B7 /* CPTLayerTests.m */; }; C37EA6AF1BC83F2D0091C8F7 /* CPTScatterPlotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FEBD61110B7E8B00E44D37 /* CPTScatterPlotTests.m */; }; C37EA6B11BC83F2D0091C8F7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; + C38274C51C9EE6A400F4E5C6 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C38274C61C9EE6AE00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; + C38274C71C9EE6AF00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; C38A09831A46185300D45436 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot.framework */; }; C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; }; C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; @@ -2164,6 +2167,7 @@ C37EA64F1BC83F2A0091C8F7 /* CPTResponder.h in Headers */, C37EA6501BC83F2A0091C8F7 /* CPTLayer.h in Headers */, C37EA6511BC83F2A0091C8F7 /* CPTPlotAreaFrame.h in Headers */, + C38274C51C9EE6A400F4E5C6 /* _CPTCatmullRomInterpolation.h in Headers */, C37EA6521BC83F2A0091C8F7 /* CPTXYAxis.h in Headers */, C37EA6531BC83F2A0091C8F7 /* _CPTStocksTheme.h in Headers */, C37EA6541BC83F2A0091C8F7 /* CPTImage.h in Headers */, @@ -2870,6 +2874,7 @@ C37EA60D1BC83F2A0091C8F7 /* CPTAxisLabelGroup.m in Sources */, C37EA60E1BC83F2A0091C8F7 /* CPTFill.m in Sources */, C37EA60F1BC83F2A0091C8F7 /* CPTMutableNumericData+TypeConversion.m in Sources */, + C38274C61C9EE6AE00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */, C37EA6101BC83F2A0091C8F7 /* CPTRangePlot.m in Sources */, C37EA6111BC83F2A0091C8F7 /* CPTGraph.m in Sources */, C37EA6121BC83F2A0091C8F7 /* CPTMutablePlotRange.m in Sources */, @@ -2906,6 +2911,7 @@ C37EA6991BC83F2D0091C8F7 /* CPTColorSpaceTests.m in Sources */, C37EA69A1BC83F2D0091C8F7 /* CPTFillTests.m in Sources */, C37EA69B1BC83F2D0091C8F7 /* CPTUtilitiesTests.m in Sources */, + C38274C71C9EE6AF00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */, C37EA69C1BC83F2D0091C8F7 /* CPTGradientTests.m in Sources */, C37EA69D1BC83F2D0091C8F7 /* CPTDarkGradientThemeTests.m in Sources */, C37EA69E1BC83F2D0091C8F7 /* CPTAxisLabelTests.m in Sources */, From 8b5b954c990f3c7dd204f3d2e61edea617f072ba Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 11:00:03 -0400 Subject: [PATCH 184/429] Documentation fixes. --- documentation/doxygen/doxygen touch.config | 1 + documentation/doxygen/doxygen.config | 1 + 2 files changed, 2 insertions(+) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index a3236a7a1..6d9380cec 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2044,6 +2044,7 @@ INCLUDE_FILE_PATTERNS = PREDEFINED = TARGET_OS_IPHONE, \ TARGET_IPHONE_SIMULATOR, \ "NS_DESIGNATED_INITIALIZER:=''", \ + "NS_RETURNS_INNER_POINTER:=''", \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 3552600d1..8c04b83b9 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -2042,6 +2042,7 @@ INCLUDE_FILE_PATTERNS = # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = "NS_DESIGNATED_INITIALIZER:=''", \ + "NS_RETURNS_INNER_POINTER:=''", \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" From 9e05159210deb42a396dbbf140028dda1a780c52 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 11:02:14 -0400 Subject: [PATCH 185/429] Added missing nullability annotations in CPTNumericData. --- framework/Source/CPTNumericData.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 5849706c7..45226e56c 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -725,7 +725,7 @@ -(NSNumber *)sampleValueAtIndex:(NSUInteger)idx, ... * @param sample The zero-based index into the sample array. The array is treated as if it only has one dimension. * @return A pointer to the sample or @NULL if the sample index is out of bounds. **/ --(const void *)samplePointer:(NSUInteger)sample +-(nullable const void *)samplePointer:(NSUInteger)sample { if ( sample < self.numberOfSamples ) { return (const void *)( (const char *)self.bytes + sample * self.sampleBytes ); @@ -740,7 +740,7 @@ -(const void *)samplePointer:(NSUInteger)sample * (including @par{index}) should match the @ref numberOfDimensions. * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. **/ --(const void *)samplePointerAtIndex:(NSUInteger)idx, ... +-(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ... { NSUInteger newIndex; From cb5347fc0374b29b85ffdc3badb8b6f1d76dabb6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:33:10 -0400 Subject: [PATCH 186/429] Fixed a type-conversion compiler warning. --- examples/CorePlotGallery/src/plots/SimplePieChart.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index c9398afb5..39972e663 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -156,7 +156,7 @@ -(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *) [CPTAnimation animate:self property:@"sliceOffset" - from:CPTFloat(idx == self.offsetIndex ? NAN : 0.0) + from:CPTFloat(idx == self.offsetIndex ? CPTNAN : 0.0) to:CPTFloat(idx == self.offsetIndex ? 0.0 : 35.0) duration:0.5 animationCurve:CPTAnimationCurveCubicOut From 13501b168fdc9deb4c6465bcb24c70ac3215bb3d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:33:24 -0400 Subject: [PATCH 187/429] More documentation fixes. --- framework/Source/CPTColor.m | 4 ++++ framework/Source/CPTGradient.m | 6 +++--- framework/Source/CPTMutableNumericData.m | 2 +- framework/Source/CPTNumericData.m | 8 ++++---- framework/Source/CPTXYPlotSpace.m | 6 +++++- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 5690aa510..c8091b852 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -391,11 +391,15 @@ -(nonnull instancetype)colorWithAlphaComponent:(CGFloat)alpha #pragma mark - #pragma mark Opacity +/// @cond + -(BOOL)isOpaque { return CGColorGetAlpha(self.cgColor) >= CPTFloat(1.0); } +/// @endcond + #pragma mark - #pragma mark NSCoding Methods diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 95ac32079..10b2d4cc5 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -737,7 +737,7 @@ -(CPTGradient *)removeColorStopAtPosition:(CGFloat)position return newGradient; } -/** @brief Copies the current gradient and removes the color stop at @par{index} from the list of color stops. +/** @brief Copies the current gradient and removes the color stop at @par{idx} from the list of color stops. * @param idx The color stop index. * @return A copy of the current gradient with the color stop removed. **/ @@ -756,9 +756,9 @@ -(CPTGradient *)removeColorStopAtIndex:(NSUInteger)idx #pragma mark - #pragma mark Information -/** @brief Gets the color at color stop @par{index} from the list of color stops. +/** @brief Gets the color at color stop @par{idx} from the list of color stops. * @param idx The color stop index. - * @return The color at color stop @par{index}. + * @return The color at color stop @par{idx}. **/ -(CGColorRef)newColorStopAtIndex:(NSUInteger)idx { diff --git a/framework/Source/CPTMutableNumericData.m b/framework/Source/CPTMutableNumericData.m index 3a14ae5e9..d977e5ae6 100644 --- a/framework/Source/CPTMutableNumericData.m +++ b/framework/Source/CPTMutableNumericData.m @@ -58,7 +58,7 @@ -(nullable void *)mutableSamplePointer:(NSUInteger)sample /** @brief Gets a pointer to a given sample in the data buffer. * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices - * (including @par{index}) should match the @ref numberOfDimensions. + * (including @par{idx}) should match the @ref numberOfDimensions. * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. **/ -(nullable void *)mutableSamplePointerAtIndex:(NSUInteger)idx, ... diff --git a/framework/Source/CPTNumericData.m b/framework/Source/CPTNumericData.m index 45226e56c..97290b859 100644 --- a/framework/Source/CPTNumericData.m +++ b/framework/Source/CPTNumericData.m @@ -576,7 +576,7 @@ -(void)setShape:(nonnull CPTNumberArray)newShape /** @brief Gets the offset of a given sample in the data buffer. * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices - * (including @par{index}) should match the @ref numberOfDimensions. + * (including @par{idx}) should match the @ref numberOfDimensions. * @return The sample offset in the data buffer. To get the byte offset, multiply this value by * @ref sampleBytes. If any index is greater than or equal to the corresponding * dimension of the data buffer, this method returns @ref NSNotFound. @@ -696,7 +696,7 @@ case sizeof(NSDecimal): /** @brief Gets the value of a given sample in the data buffer. * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices - * (including @par{index}) should match the @ref numberOfDimensions. + * (including @par{idx}) should match the @ref numberOfDimensions. * @return The sample value wrapped in an instance of NSNumber or @nil if any of the sample indices are out of bounds. * * @note NSNumber does not support complex numbers. Complex number types will be cast to @@ -737,7 +737,7 @@ -(nullable const void *)samplePointer:(NSUInteger)sample /** @brief Gets a pointer to a given sample in the data buffer. * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices - * (including @par{index}) should match the @ref numberOfDimensions. + * (including @par{idx}) should match the @ref numberOfDimensions. * @return A pointer to the sample or @NULL if any of the sample indices are out of bounds. **/ -(nullable const void *)samplePointerAtIndex:(NSUInteger)idx, ... @@ -789,7 +789,7 @@ -(nonnull CPTNumberArray)sampleArray * @brief Gets the offset of a given sample in the data buffer. This method does not call @par{va_end()} * on the @par{indexList}. * @param idx The zero-based indices into a multi-dimensional sample array. Each index should of type @ref NSUInteger and the number of indices - * (including @par{index}) should match the @ref numberOfDimensions. + * (including @par{idx}) should match the @ref numberOfDimensions. * @param indexList A @par{va_list} of the additional indices. * @return The sample offset in the data buffer. To get the byte offset, multiply this value by * @ref sampleBytes. If any index is greater than or equal to the corresponding diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 8399692c8..8269b844f 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -1685,6 +1685,8 @@ -(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoi return NO; } +/// @cond + -(nullable CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDecimal)shift usingMomentum:(BOOL)momentum inGlobalRange:(nullable CPTPlotRange *)globalRange withDisplacement:(CGFloat *)displacement { CPTMutablePlotRange *newRange = [oldRange mutableCopy]; @@ -1717,7 +1719,9 @@ -(nullable CPTPlotRange *)shiftRange:(nonnull CPTPlotRange *)oldRange by:(NSDeci return newRange; } -#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE +/// @endcond + +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else /** From a93e09fbbae74f7136f9466a6743e62c12932e79 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:45:28 -0400 Subject: [PATCH 188/429] Added missing nullability annotations in CPTAnimationPeriod. --- framework/Source/CPTAnimation.m | 2 +- framework/Source/CPTAnimationPeriod.m | 36 +++++++++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index c6edde80f..cc995c3a0 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -163,7 +163,7 @@ +(nonnull instancetype)sharedInstance * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nonnull CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property period:(nonnull CPTAnimationPeriod *)period animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationOperation *animationOperation = [[CPTAnimationOperation alloc] initWithAnimationPeriod:period diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index ad470ee00..bfc74f27a 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -464,7 +464,7 @@ @implementation CPTAnimation(CPTAnimationPeriodAdditions) * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -489,7 +489,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -512,7 +512,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property from:(CGFloat)from to:(CGFloat)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStart:from end:to @@ -539,7 +539,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -564,7 +564,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -587,7 +587,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPoint:(CGPoint)from toPoint:(CGPoint)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPoint:from endPoint:to @@ -614,7 +614,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -639,7 +639,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -662,7 +662,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromSize:(CGSize)from toSize:(CGSize)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartSize:from endSize:to @@ -689,7 +689,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -714,7 +714,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -737,7 +737,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromRect:(CGRect)from toRect:(CGRect)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartRect:from endRect:to @@ -764,7 +764,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -789,7 +789,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -812,7 +812,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromDecimal:(NSDecimal)from toDecimal:(NSDecimal)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartDecimal:from endDecimal:to @@ -839,7 +839,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration withDelay:(CGFloat)delay animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to @@ -864,7 +864,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param delegate The animation delegate (can be @nil). * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration animationCurve:(CPTAnimationCurve)animationCurve delegate:(nullable id)delegate { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to @@ -887,7 +887,7 @@ +(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString * @param duration The duration of the animation. * @return The queued animation operation. **/ -+(CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration ++(nonnull CPTAnimationOperation *)animate:(nonnull id)object property:(nonnull NSString *)property fromPlotRange:(nonnull CPTPlotRange *)from toPlotRange:(nonnull CPTPlotRange *)to duration:(CGFloat)duration { CPTAnimationPeriod *period = [CPTAnimationPeriod periodWithStartPlotRange:from endPlotRange:to From 28be465a8bdcd76241ada94dd857877eb19876aa Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:49:36 -0400 Subject: [PATCH 189/429] Added missing nullability annotations in CPTAnimationPeriod. --- framework/Source/CPTAnimationPeriod.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index f48278208..4fac622c7 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -209,7 +209,7 @@ +(nonnull instancetype)periodWithStartDecimal:(NSDecimal)aStartDecimal endDecima * @param aDelay The starting delay in seconds. * @return The initialized object. **/ -+(instancetype)periodWithStartNumber:(NSNumber *)aStartNumber endNumber:(NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay ++(nonnull instancetype)periodWithStartNumber:(nullable NSNumber *)aStartNumber endNumber:(nonnull NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { return [_CPTAnimationNSNumberPeriod periodWithStartValue:aStartNumber endValue:anEndNumber @@ -402,7 +402,7 @@ -(nonnull instancetype)initWithStartDecimal:(NSDecimal)aStartDecimal endDecimal: * @param aDelay The starting delay in seconds. * @return The initialized object. **/ --(instancetype)initWithStartNumber:(NSNumber *)aStartNumber endNumber:(NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay +-(nonnull instancetype)initWithStartNumber:(nullable NSNumber *)aStartNumber endNumber:(nonnull NSNumber *)anEndNumber duration:(CGFloat)aDuration withDelay:(CGFloat)aDelay { self = [[_CPTAnimationNSNumberPeriod alloc] initWithStartValue:aStartNumber endValue:anEndNumber From 9126d74a85e03e317a26f129c803c65288b7f020 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:53:27 -0400 Subject: [PATCH 190/429] Fixed target membership settings for _CPTCatmullRomInterpolation.m. --- framework/CorePlot.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index fd8f93c70..1e367ff6c 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -171,11 +171,8 @@ 93961BE61C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 93961BE71C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 93961BE91C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; - 93961BEA1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; 93961BEB1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; - 93961BEC1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; 93961BED1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; - 93961BEE1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; A92C00498745CB844AF563E0 /* _CPTAnimationCGRectPeriod.h in Headers */ = {isa = PBXBuildFile; fileRef = A92C0E876AE37EB30019586B /* _CPTAnimationCGRectPeriod.h */; }; A92C02A48B4FBD94D718ECF8 /* _CPTAnimationCGSizePeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C087BF0913A6BA2363E40 /* _CPTAnimationCGSizePeriod.m */; }; A92C02FFEE33F8D28665257B /* _CPTAnimationNSDecimalPeriod.m in Sources */ = {isa = PBXBuildFile; fileRef = A92C00B71DCB2085A92BE0A9 /* _CPTAnimationNSDecimalPeriod.m */; }; @@ -469,7 +466,6 @@ C37EA6B11BC83F2D0091C8F7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3226A571A69F6FA00F77249 /* CoreGraphics.framework */; }; C38274C51C9EE6A400F4E5C6 /* _CPTCatmullRomInterpolation.h in Headers */ = {isa = PBXBuildFile; fileRef = 93961BE51C71ACFD002F5A58 /* _CPTCatmullRomInterpolation.h */; settings = {ATTRIBUTES = (Private, ); }; }; C38274C61C9EE6AE00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; - C38274C71C9EE6AF00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93961BE81C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m */; }; C38A09831A46185300D45436 /* CorePlot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09781A46185200D45436 /* CorePlot.framework */; }; C38A09C51A4619A900D45436 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C38A09BA1A4619A900D45436 /* libCorePlot-CocoaTouch.a */; }; C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 0730F64D109494D100E95162 /* CPTTestCase.m */; }; @@ -2681,7 +2677,6 @@ C3392A481225FB68008DA6BD /* CPTMutableNumericDataTests.m in Sources */, C3392A491225FB69008DA6BD /* CPTNumericDataTests.m in Sources */, C3BFFD1112274CB500DE22AC /* CPTNumericDataTypeConversionTests.m in Sources */, - 93961BEA1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C3CB561C122A9E9F00FBFB61 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C3D979A413D2136700145DFF /* CPTPlotSpaceTests.m in Sources */, C3D979A913D2328000145DFF /* CPTTimeFormatterTests.m in Sources */, @@ -2911,7 +2906,6 @@ C37EA6991BC83F2D0091C8F7 /* CPTColorSpaceTests.m in Sources */, C37EA69A1BC83F2D0091C8F7 /* CPTFillTests.m in Sources */, C37EA69B1BC83F2D0091C8F7 /* CPTUtilitiesTests.m in Sources */, - C38274C71C9EE6AF00F4E5C6 /* _CPTCatmullRomInterpolation.m in Sources */, C37EA69C1BC83F2D0091C8F7 /* CPTGradientTests.m in Sources */, C37EA69D1BC83F2D0091C8F7 /* CPTDarkGradientThemeTests.m in Sources */, C37EA69E1BC83F2D0091C8F7 /* CPTAxisLabelTests.m in Sources */, @@ -3057,7 +3051,6 @@ C38A09D31A461C1800D45436 /* CPTDataSourceTestCase.m in Sources */, C38A09E81A461CB600D45436 /* CPTNumericDataTests.m in Sources */, C38A0B141A46261F00D45436 /* CPTDerivedXYGraph.m in Sources */, - 93961BEC1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A0ABD1A46250B00D45436 /* CPTXYPlotSpaceTests.m in Sources */, C38A09D11A461C1100D45436 /* CPTTestCase.m in Sources */, C38A0A011A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, @@ -3193,7 +3186,6 @@ C38A0A911A46210A00D45436 /* CPTLineStyleTests.m in Sources */, C38A0A021A461D2E00D45436 /* CPTPlotRangeTests.m in Sources */, C38A0B171A46262000D45436 /* CPTDerivedXYGraph.m in Sources */, - 93961BEE1C71AD57002F5A58 /* _CPTCatmullRomInterpolation.m in Sources */, C38A09E71A461CB300D45436 /* CPTMutableNumericDataTypeConversionTests.m in Sources */, C38A0A8E1A46210A00D45436 /* CPTFillTests.m in Sources */, C38A09E91A461CB700D45436 /* CPTNumericDataTests.m in Sources */, From 86277d92e5e95db4dade406c6ca7ec5cb5aa6bbf Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 13:38:47 -0400 Subject: [PATCH 191/429] Added nullability annotations in _CPTCatmullRomInterpolation. --- framework/Source/_CPTCatmullRomInterpolation.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/_CPTCatmullRomInterpolation.m b/framework/Source/_CPTCatmullRomInterpolation.m index f54397a6e..bd970475c 100644 --- a/framework/Source/_CPTCatmullRomInterpolation.m +++ b/framework/Source/_CPTCatmullRomInterpolation.m @@ -6,7 +6,7 @@ /// @cond @interface _CPTCatmullRomInterpolation() -+(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath; ++(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(nonnull CGMutablePathRef)dataLinePath; CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull const time, CGFloat t); @@ -29,7 +29,7 @@ @implementation _CPTCatmullRomInterpolation * @param granularity The number of smoothed points to interpolate between each view point. * @return A Catmull-Rom spline path through the given view points in the given index range. **/ -+(CGMutablePathRef)newPathForViewPoints:(const CGPoint *)viewPoints indexRange:(NSRange)indexRange withGranularity:(NSUInteger)granularity ++(nonnull CGMutablePathRef)newPathForViewPoints:(nonnull const CGPoint *)viewPoints indexRange:(NSRange)indexRange withGranularity:(NSUInteger)granularity { // Based on code from this post: http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections CGMutablePathRef dataLinePath = CGPathCreateMutable(); @@ -128,7 +128,7 @@ CGFloat interpolate(const CGFloat *__nonnull const p, const CGFloat *__nonnull c * @param curveType The type of knot parameterization. * @param dataLinePath The path to receive the spline segments. **/ -+(void)interpolate:(CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(CGMutablePathRef)dataLinePath ++(void)interpolate:(nonnull CPTValueArray *)points forIndex:(NSUInteger)index withPointsPerSegment:(NSUInteger)pointsPerSegment andType:(CPTCatmullRomType)curveType intoPath:(nonnull CGMutablePathRef)dataLinePath { CGFloat x[4]; CGFloat y[4]; From 808d8fcaad0a81986879a809183edf01448a02b7 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 14:37:50 -0400 Subject: [PATCH 192/429] Coding style updates. Fixed documentation typos. --- framework/Source/CPTScatterPlot.m | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 114ab5285..b0433c9f5 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1049,7 +1049,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo case CPTScatterPlotCurvedInterpolationCatmullRomUniform: [self computeCatmullRomControlPoints:controlPoints1 points2:controlPoints2 - withAlpha:CPTFloat(0) + withAlpha:CPTFloat(0.0) forViewPoints:viewPoints indexRange:NSMakeRange(firstIndex, i - firstIndex)]; break; @@ -1065,7 +1065,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo case CPTScatterPlotCurvedInterpolationCatmullRomChordal: [self computeCatmullRomControlPoints:controlPoints1 points2:controlPoints2 - withAlpha:CPTFloat(1) + withAlpha:CPTFloat(1.0) forViewPoints:viewPoints indexRange:NSMakeRange(firstIndex, i - firstIndex)]; @@ -1110,7 +1110,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo case CPTScatterPlotCurvedInterpolationCatmullRomUniform: [self computeCatmullRomControlPoints:controlPoints1 points2:controlPoints2 - withAlpha:CPTFloat(0) + withAlpha:CPTFloat(0.0) forViewPoints:viewPoints indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; @@ -1127,7 +1127,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo case CPTScatterPlotCurvedInterpolationCatmullRomChordal: [self computeCatmullRomControlPoints:controlPoints1 points2:controlPoints2 - withAlpha:CPTFloat(1) + withAlpha:CPTFloat(1.0) forViewPoints:viewPoints indexRange:NSMakeRange(firstIndex, NSMaxRange(indexRange) - firstIndex)]; @@ -1221,7 +1221,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo * @param alpha The alpha value used for the catmull-rom interpolation. * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. * @param indexRange The range in which the interpolation should occur. - * @warning The indexRange must be valid for all passed array's otherwise this method crashes. + * @warning The indexRange must be valid for all passed arrays otherwise this method crashes. **/ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 withAlpha:(CGFloat)alpha forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange { @@ -1230,7 +1230,7 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull NSUInteger endIndex = NSMaxRange(indexRange) - 1; // the index starts at zero NSUInteger segmentCount = endIndex - 1; // there are n - 1 segments - CGFloat epsilon = CPTFloat(1e-5); // the minimum point distance. below that no interpolation happens. + CGFloat epsilon = CPTFloat(1.0e-5); // the minimum point distance. below that no interpolation happens. for ( NSUInteger index = startIndex; index <= segmentCount; index++ ) { // calculate the control for the segment from index -> index + 1 @@ -1258,12 +1258,12 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull CGFloat d2 = hypot(p2.x - p1.x, p2.y - p1.y); CGFloat d3 = hypot(p3.x - p2.x, p3.y - p2.y); // constants - CGFloat d1_a = pow(d1, alpha); // d1^alpha - CGFloat d2_a = pow(d2, alpha); // d2^alpha - CGFloat d3_a = pow(d3, alpha); // d3^alpha - CGFloat d1_2a = pow( d1_a, CPTFloat(2) ); // d1^alpha^2 = d1^2*alpha - CGFloat d2_2a = pow( d2_a, CPTFloat(2) ); // d2^2alpha - CGFloat d3_2a = pow( d3_a, CPTFloat(2) ); + CGFloat d1_a = pow(d1, alpha); // d1^alpha + CGFloat d2_a = pow(d2, alpha); // d2^alpha + CGFloat d3_a = pow(d3, alpha); // d3^alpha + CGFloat d1_2a = pow( d1_a, CPTFloat(2.0) ); // d1^alpha^2 = d1^2*alpha + CGFloat d2_2a = pow( d2_a, CPTFloat(2.0) ); // d2^alpha^2 = d2^2*alpha + CGFloat d3_2a = pow( d3_a, CPTFloat(2.0) ); // d3^alpha^2 = d3^2*alpha // calculate the control points // see : http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf under point 3. @@ -1298,7 +1298,7 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull * @param points2 A pointer to the array which should hold the second control points. * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. * @param indexRange The range in which the interpolation should occur. - * @warning The indexRange must be valid for all passed array's otherwise this method crashes. + * @warning The indexRange must be valid for all passed arrays otherwise this method crashes. **/ -(void)computeHermiteControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange { From 8ceab425de93afa3f84cbb86480813d9640e13bd Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 15:42:21 -0400 Subject: [PATCH 193/429] Finished implementation of the curvedInterpolationCustomAlpha property. --- framework/Source/CPTScatterPlot.m | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index e37e8490a..0127e8de8 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -93,7 +93,7 @@ @implementation CPTScatterPlot /** @property CGFloat curvedInterpolationCustomAlpha * @brief The custom alpha value used when the #CPTScatterPlotCurvedInterpolationCatmullCustomAlpha interpolation is selected. * Default is @num{0.5}. - * @warning Must be between @num{0.0} and @num{1.0}. + * @note Must be between @num{0.0} and @num{1.0}. **/ @synthesize curvedInterpolationCustomAlpha; @@ -232,6 +232,8 @@ +(void)initialize * - @ref allowSimultaneousSymbolAndPlotSelection = NO * - @ref interpolation = #CPTScatterPlotInterpolationLinear * - @ref histogramOption = #CPTScatterPlotHistogramNormal + * - @ref curvedInterpolationOption = #CPTScatterPlotCurvedInterpolationNormal + * - @ref curvedInterpolationCustomAlpha = @num{0.5} * - @ref labelField = #CPTScatterPlotFieldY * * @param newFrame The frame rectangle. @@ -252,6 +254,7 @@ -(nonnull instancetype)initWithFrame:(CGRect)newFrame interpolation = CPTScatterPlotInterpolationLinear; histogramOption = CPTScatterPlotHistogramNormal; curvedInterpolationOption = CPTScatterPlotCurvedInterpolationNormal; + curvedInterpolationCustomAlpha = CPTFloat(0.5); pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; mutableAreaFillBands = nil; @@ -282,6 +285,7 @@ -(nonnull instancetype)initWithLayer:(nonnull id)layer interpolation = theLayer->interpolation; histogramOption = theLayer->histogramOption; curvedInterpolationOption = theLayer->curvedInterpolationOption; + curvedInterpolationCustomAlpha = theLayer->curvedInterpolationCustomAlpha; mutableAreaFillBands = theLayer->mutableAreaFillBands; pointingDeviceDownIndex = NSNotFound; pointingDeviceDownOnLine = NO; @@ -303,6 +307,7 @@ -(void)encodeWithCoder:(nonnull NSCoder *)coder [coder encodeInteger:self.interpolation forKey:@"CPTScatterPlot.interpolation"]; [coder encodeInteger:self.histogramOption forKey:@"CPTScatterPlot.histogramOption"]; [coder encodeInteger:self.curvedInterpolationOption forKey:@"CPTScatterPlot.curvedInterpolationOption"]; + [coder encodeCGFloat:self.curvedInterpolationCustomAlpha forKey:@"CPTScatterPlot.curvedInterpolationCustomAlpha"]; [coder encodeObject:self.dataLineStyle forKey:@"CPTScatterPlot.dataLineStyle"]; [coder encodeObject:self.plotSymbol forKey:@"CPTScatterPlot.plotSymbol"]; [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; @@ -323,11 +328,12 @@ -(void)encodeWithCoder:(nonnull NSCoder *)coder -(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { if ( (self = [super initWithCoder:coder]) ) { - interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey:@"CPTScatterPlot.interpolation"]; - histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey:@"CPTScatterPlot.histogramOption"]; - curvedInterpolationOption = (CPTScatterPlotCurvedInterpolationOption)[coder decodeIntegerForKey:@"CPTScatterPlot.curvedInterpolationOption"]; - dataLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] - forKey:@"CPTScatterPlot.dataLineStyle"] copy]; + interpolation = (CPTScatterPlotInterpolation)[coder decodeIntegerForKey:@"CPTScatterPlot.interpolation"]; + histogramOption = (CPTScatterPlotHistogramOption)[coder decodeIntegerForKey:@"CPTScatterPlot.histogramOption"]; + curvedInterpolationOption = (CPTScatterPlotCurvedInterpolationOption)[coder decodeIntegerForKey:@"CPTScatterPlot.curvedInterpolationOption"]; + curvedInterpolationCustomAlpha = [coder decodeCGFloatForKey:@"CPTScatterPlot.curvedInterpolationCustomAlpha"]; + dataLineStyle = [[coder decodeObjectOfClass:[CPTLineStyle class] + forKey:@"CPTScatterPlot.dataLineStyle"] copy]; plotSymbol = [[coder decodeObjectOfClass:[CPTPlotSymbol class] forKey:@"CPTScatterPlot.plotSymbol"] copy]; areaFill = [[coder decodeObjectOfClass:[CPTFill class] From 1047c34e60b20507c3262771f530a1f7b094c45f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 15:51:24 -0400 Subject: [PATCH 194/429] Added the curved interpolation demo to the tvOS Plot Gallery. --- examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj index 574b754df..72ef8b50e 100644 --- a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj @@ -121,6 +121,7 @@ C3D70BA6175EB29E00F27173 /* ImageDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = C3D70BA5175EB29E00F27173 /* ImageDemo.m */; }; C3EF42FD19FC75810060791A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3EF42FC19FC75810060791A /* Images.xcassets */; }; C3F34F1512AB2598008FBDC3 /* DonutChart.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F34F1412AB2598008FBDC3 /* DonutChart.m */; }; + C3F6216C1C9F365100301061 /* CurvedInterpolationDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */; }; C3F97F1917A9DE2000A52FF2 /* FunctionPlot.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F97F1817A9DE2000A52FF2 /* FunctionPlot.m */; }; E9595DFC1C9973B9004129DA /* CurvedInterpolationDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */; }; E9AB989C1C9A903700D23875 /* CurvedInterpolationDemo.m in Sources */ = {isa = PBXBuildFile; fileRef = E9595DFB1C9973B9004129DA /* CurvedInterpolationDemo.m */; }; @@ -869,6 +870,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C3F6216C1C9F365100301061 /* CurvedInterpolationDemo.m in Sources */, C30D8B301BCAFDE20003BB70 /* LabelingPolicyDemo.m in Sources */, C30D8B291BCAFDE20003BB70 /* ControlChart.m in Sources */, C30D8B2B1BCAFDE20003BB70 /* DatePlot.m in Sources */, From 38a52a25c4d8a78cd2fbc5a155fba7cb2056c2f1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 15:52:18 -0400 Subject: [PATCH 195/429] Fixed memory management warnings in the curved interpolation demo. --- .../src/plots/CurvedInterpolationDemo.m | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m index aa7708703..d788e3119 100644 --- a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m @@ -119,8 +119,11 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP x.axisConstraints = [CPTConstraints constraintWithRelativeOffset:0.5]; lineCap.lineStyle = x.axisLineStyle; - lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; - x.axisLineCapMax = lineCap; + CPTColor *lineColor = lineCap.lineStyle.lineColor; + if ( lineColor ) { + lineCap.fill = [CPTFill fillWithColor:lineColor]; + } + x.axisLineCapMax = lineCap; x.title = @"X Axis"; x.titleOffset = self.titleSize * CPTFloat(1.25); @@ -136,9 +139,12 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP y.labelOffset = self.titleSize * CPTFloat(0.25); lineCap.lineStyle = y.axisLineStyle; - lineCap.fill = [CPTFill fillWithColor:lineCap.lineStyle.lineColor]; - y.axisLineCapMax = lineCap; - y.axisLineCapMin = lineCap; + lineColor = lineCap.lineStyle.lineColor; + if ( lineColor ) { + lineCap.fill = [CPTFill fillWithColor:lineColor]; + } + y.axisLineCapMax = lineCap; + y.axisLineCapMin = lineCap; y.title = @"Y Axis"; y.titleOffset = self.titleSize * CPTFloat(1.25); From 674e94e1cab3b57b4b3b735e199b0e62fde5473d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 18:17:41 -0400 Subject: [PATCH 196/429] Handle division errors in CPTDecimalDivide() by returning zero (0). Fixed issue #262. --- framework/Source/CPTUtilities.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 677015001..9b268e58e 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -588,7 +588,18 @@ NSDecimal CPTDecimalDivide(NSDecimal numerator, NSDecimal denominator) { NSDecimal result; - NSDecimalDivide(&result, &numerator, &denominator, NSRoundBankers); + NSCalculationError calcError = NSDecimalDivide(&result, &numerator, &denominator, NSRoundBankers); + + switch ( calcError ) { + case NSCalculationUnderflow: + case NSCalculationDivideByZero: + result = CPTDecimalFromInteger(0); + break; + + default: + // no error--return the result of the division + break; + } return result; } From 099e3da9941d42ddf1e5961c1faeec53c3c01ce5 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 21 Mar 2016 20:36:48 -0400 Subject: [PATCH 197/429] Fixed numeric precision warnings in the unit tests. --- framework/Source/CPTMutableNumericDataTests.m | 2 +- .../Source/CPTMutableNumericDataTypeConversionTests.m | 8 ++++---- framework/Source/CPTNumericDataTests.m | 2 +- framework/Source/CPTNumericDataTypeConversionTests.m | 8 ++++---- framework/Source/CPTUtilitiesTests.m | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index 774419104..a1bf3d728 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -198,7 +198,7 @@ -(void)testConvertTypeConvertsType const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); + XCTAssertTrue( (double)samples[i] == doubleSamples[i], @"(float)%g != (double)%g", (double)samples[i], doubleSamples[i] ); } } diff --git a/framework/Source/CPTMutableNumericDataTypeConversionTests.m b/framework/Source/CPTMutableNumericDataTypeConversionTests.m index b84644905..ff8105309 100644 --- a/framework/Source/CPTMutableNumericDataTypeConversionTests.m +++ b/framework/Source/CPTMutableNumericDataTypeConversionTests.m @@ -25,7 +25,7 @@ -(void)testFloatToDoubleInPlaceConversion const double *doubleSamples = (const double *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); + XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", (double)samples[i], doubleSamples[i] ); } } @@ -46,7 +46,7 @@ -(void)testDoubleToFloatInPlaceConversion const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); + XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", (double)floatSamples[i], samples[i] ); } } @@ -67,7 +67,7 @@ -(void)testFloatToIntegerInPlaceConversion const NSInteger *intSamples = (const NSInteger *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); + XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", (double)samples[i], (long)intSamples[i] ); } } @@ -88,7 +88,7 @@ -(void)testIntegerToFloatInPlaceConversion const float *floatSamples = (const float *)numericData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); + XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], (float)precision, @"(float)%g != (NSInteger)%ld", (double)floatSamples[i], (long)samples[i]); } } diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 37231e0b3..7f0ff74bf 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -225,7 +225,7 @@ -(void)testConvertTypeConvertsType const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertTrue(samples[i] == doubleSamples[i], @"(float)%g != (double)%g", samples[i], doubleSamples[i]); + XCTAssertTrue( (double)samples[i] == doubleSamples[i], @"(float)%g != (double)%g", (double)samples[i], doubleSamples[i] ); } } diff --git a/framework/Source/CPTNumericDataTypeConversionTests.m b/framework/Source/CPTNumericDataTypeConversionTests.m index cc79dadf2..ab0e882b0 100644 --- a/framework/Source/CPTNumericDataTypeConversionTests.m +++ b/framework/Source/CPTNumericDataTypeConversionTests.m @@ -27,7 +27,7 @@ -(void)testFloatToDoubleConversion const double *doubleSamples = (const double *)dd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", samples[i], doubleSamples[i] ); + XCTAssertEqualWithAccuracy( (double)samples[i], doubleSamples[i], precision, @"(float)%g != (double)%g", (double)samples[i], doubleSamples[i] ); } } @@ -50,7 +50,7 @@ -(void)testDoubleToFloatConversion const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", floatSamples[i], samples[i] ); + XCTAssertEqualWithAccuracy( (double)floatSamples[i], samples[i], precision, @"(float)%g != (double)%g", (double)floatSamples[i], samples[i] ); } } @@ -73,7 +73,7 @@ -(void)testFloatToIntegerConversion const NSInteger *intSamples = (const NSInteger *)intData.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", samples[i], (long)intSamples[i] ); + XCTAssertEqualWithAccuracy( (NSInteger)samples[i], intSamples[i], precision, @"(float)%g != (NSInteger)%ld", (double)samples[i], (long)intSamples[i] ); } } @@ -96,7 +96,7 @@ -(void)testIntegerToFloatConversion const float *floatSamples = (const float *)fd.data.bytes; for ( NSUInteger i = 0; i < numberOfSamples; i++ ) { - XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], precision, @"(float)%g != (NSInteger)%ld", floatSamples[i], (long)samples[i]); + XCTAssertEqualWithAccuracy(floatSamples[i], (float)samples[i], (float)precision, @"(float)%g != (NSInteger)%ld", (double)floatSamples[i], (long)samples[i]); } } diff --git a/framework/Source/CPTUtilitiesTests.m b/framework/Source/CPTUtilitiesTests.m index 24823de3c..c2d99d839 100644 --- a/framework/Source/CPTUtilitiesTests.m +++ b/framework/Source/CPTUtilitiesTests.m @@ -82,7 +82,7 @@ -(void)testToDecimalConversion XCTAssertEqualObjects([NSDecimalNumber decimalNumberWithString:@"100"], [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromInteger(i)], @"NSInteger to NSDecimal conversion failed"); XCTAssertEqualObjects([NSDecimalNumber decimalNumberWithString:@"100"], [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromUnsignedInteger(unsignedI)], @"NSUInteger to NSDecimal conversion failed"); - XCTAssertEqualWithAccuracy([@(f)floatValue], [[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromFloat(f)] floatValue], 1.0e-7, @"float to NSDecimal conversion failed"); + XCTAssertEqualWithAccuracy([@(f)floatValue], [[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromFloat(f)] floatValue], 1.0e-7f, @"float to NSDecimal conversion failed"); XCTAssertEqualObjects(@(d), [NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble(d)], @"double to NSDecimal conversion failed."); } From 220257a996d60cda483322ca44f51a8149fdc89d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 22 Mar 2016 21:02:11 -0400 Subject: [PATCH 198/429] Fixed a type conversion warning in CPTScatterPlot. Fixed issue #266. --- framework/Source/CPTScatterPlot.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 0127e8de8..8ae5c9e5b 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -2057,11 +2057,11 @@ -(void)setCurvedInterpolationOption:(CPTScatterPlotCurvedInterpolationOption)new -(void)setCurvedInterpolationCustomAlpha:(CGFloat)newCurvedInterpolationCustomAlpha { - if ( newCurvedInterpolationCustomAlpha > 1.0 ) { - newCurvedInterpolationCustomAlpha = 1.0; + if ( newCurvedInterpolationCustomAlpha > CPTFloat(1.0) ) { + newCurvedInterpolationCustomAlpha = CPTFloat(1.0); } - if ( newCurvedInterpolationCustomAlpha < 0 ) { - newCurvedInterpolationCustomAlpha = 0.0; + if ( newCurvedInterpolationCustomAlpha < CPTFloat(0.0) ) { + newCurvedInterpolationCustomAlpha = CPTFloat(0.0); } if ( newCurvedInterpolationCustomAlpha != curvedInterpolationCustomAlpha ) { From 495a1c89feecba909332dc3ee19a838fab18eb74 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 22 Mar 2016 22:37:50 -0400 Subject: [PATCH 199/429] Fixed a couple of type conversion warnings in the Plot Gallery app. Fixed issue #266. --- .../src/plots/CurvedInterpolationDemo.m | 12 ++++++------ examples/CorePlotGallery/src/plots/SimplePieChart.m | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m index d788e3119..d68848b84 100644 --- a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m @@ -8,11 +8,11 @@ #import "CurvedInterpolationDemo.h" -static const CGFloat bezierYShift = -1.0; -static const CGFloat catmullRomUniformPlotYShift = 0.0; -static const CGFloat catmullRomCentripetalYShift = 1.0; -static const CGFloat catmullRomChordalYShift = 2.0; -static const CGFloat hermiteCubicYShift = -2.0; +static const double bezierYShift = -1.0; +static const double catmullRomUniformPlotYShift = 0.0; +static const double catmullRomCentripetalYShift = 1.0; +static const double catmullRomChordalYShift = 2.0; +static const double hermiteCubicYShift = -2.0; static NSString *const bezierCurveIdentifier = @"Bezier"; static NSString *const catmullRomUniformIdentifier = @"Catmull-Rom Uniform"; @@ -263,7 +263,7 @@ -(id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUI } else { NSNumber *baseY = self.plotData[index][@"y"]; - CGFloat shift = 0; + double shift = 0.0; if ( [identifier isEqualToString:catmullRomUniformIdentifier] ) { shift = catmullRomUniformPlotYShift; } diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index ad12992b0..95b855094 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -156,8 +156,8 @@ -(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *) [CPTAnimation animate:self property:@"sliceOffset" - from:CPTFloat(idx == self.offsetIndex ? CPTNAN : 0.0) - to:CPTFloat(idx == self.offsetIndex ? 0.0 : 35.0) + from:( idx == self.offsetIndex ? CPTNAN : CPTFloat(0.0) ) + to:( idx == self.offsetIndex ? CPTFloat(0.0) : CPTFloat(35.0) ) duration:0.5 animationCurve:CPTAnimationCurveCubicOut delegate:nil]; From fdf4cdb5a6eec106fcde2a6aa70b57b2ab9aeee7 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 26 Mar 2016 11:28:11 -0400 Subject: [PATCH 200/429] Fixed a broken link in the README file. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3e3703ef..3bef73a9e 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Core Plot is an open source project hosted on [GitHub](https://github.com/core-p * [core-plot.github.io](https://github.com/core-plot/core-plot.github.io): This is the HTML API documentation. You can view the pages online at [http://core-plot.github.io](http://core-plot.github.io). ## Coding Standards -Everyone has a their own preferred coding style, and no one way can be considered right. Nonetheless, in a project like Core Plot, with many developers contributing, it is worthwhile defining a set of basic coding standards to prevent a mishmash of different styles which can become frustrating when navigating the code base. See the file [Coding Style.markdown](https://github.com/core-plot/core-plot/blob/master/documentation/Coding%20Style.markdown) found in the [documentation](https://github.com/core-plot/core-plot/tree/master/documentation) directory of the project source for specific guidelines. +Everyone has a their own preferred coding style, and no one way can be considered right. Nonetheless, in a project like Core Plot, with many developers contributing, it is worthwhile defining a set of basic coding standards to prevent a mishmash of different styles which can become frustrating when navigating the code base. See the file [CONTRIBUTING.md](https://github.com/core-plot/core-plot/blob/master/.github/CONTRIBUTING.md) found in the [.github](https://github.com/core-plot/core-plot/tree/master/.github) directory of the project source for specific guidelines. Core Plot includes a [script](https://github.com/core-plot/core-plot/blob/master/scripts/format_core_plot.sh) to run [Uncrustify](http://uncrustify.sourceforge.net) on the source code to standardize the formatting. All source code will be formatted with this tool before being committed to the Core Plot repository. From 90a883e1dbc989f79edf0f7e97c438646b3fe963 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 11:48:24 -0400 Subject: [PATCH 201/429] Fixed broken links on the Doxygen main page. --- framework/Source/mainpage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/mainpage.h b/framework/Source/mainpage.h index b4e1287ad..417135609 100644 --- a/framework/Source/mainpage.h +++ b/framework/Source/mainpage.h @@ -56,8 +56,8 @@ * Nonetheless, in a project like Core Plot, with many developers contributing, it is worthwhile * defining a set of basic coding standards to prevent a mishmash of different styles which can * become frustrating when navigating the code base. See the file - *
    Coding Style.markdown - * found in the
    documentation + * CONTRIBUTING.md + * found in the .github * directory of the project source for specific guidelines. * * Core Plot includes a script From a84272583a5c7c2eee6f1a60e67fc72f5e91c4fc Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 12:14:04 -0400 Subject: [PATCH 202/429] Fixed a type conversion warning in the Plot Gallery app. --- examples/CorePlotGallery/src/plots/SimplePieChart.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 39972e663..468e719fb 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -156,8 +156,8 @@ -(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *) [CPTAnimation animate:self property:@"sliceOffset" - from:CPTFloat(idx == self.offsetIndex ? CPTNAN : 0.0) - to:CPTFloat(idx == self.offsetIndex ? 0.0 : 35.0) + from:( idx == self.offsetIndex ? CPTNAN : CPTFloat(0.0) ) + to:( idx == self.offsetIndex ? CPTFloat(0.0) : CPTFloat(35.0) ) duration:0.5 animationCurve:CPTAnimationCurveCubicOut delegate:nil]; From 33bac95786ce8d8a37cb59d9dfe235f7f1cfeab3 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 12:16:25 -0400 Subject: [PATCH 203/429] Added profiling app setting to the Mac Plot Gallery scheme. --- .../xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme index 7c6c37ab4..f823650a0 100644 --- a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme @@ -72,7 +72,8 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - + - + From 1abd234ecd5fe8e3a315354ba43784dba5814e18 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 12:17:19 -0400 Subject: [PATCH 204/429] Updated all scheme settings for Xcode 7.3. --- .../xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme | 3 +-- .../AAPLot.xcodeproj/xcshareddata/xcschemes/AAPLot.xcscheme | 3 +-- .../xcshareddata/xcschemes/CPTTestApp-iPad.xcscheme | 3 +-- .../xcshareddata/xcschemes/CPTTestApp-iPhone.xcscheme | 3 +-- .../xcshareddata/xcschemes/CPTTestApp.xcscheme | 3 +-- .../xcshareddata/xcschemes/Plot Gallery-Mac.xcscheme | 3 +-- .../xcshareddata/xcschemes/Plot Gallery-iOS.xcscheme | 3 +-- .../xcshareddata/xcschemes/DatePlot.xcscheme | 3 +-- .../xcshareddata/xcschemes/DropPlot.xcscheme | 3 +-- .../xcshareddata/xcschemes/minorTickFormatter.xcscheme | 3 +-- .../xcshareddata/xcschemes/RangePlot.xcscheme | 3 +-- .../xcshareddata/xcschemes/StockPlot.xcscheme | 3 +-- .../xcshareddata/xcschemes/CorePlot Mac.xcscheme | 3 +-- .../xcshareddata/xcschemes/CorePlot iOS.xcscheme | 6 ++---- .../xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme | 6 ++---- .../xcshareddata/xcschemes/Documentation-Mac.xcscheme | 3 +-- .../xcshareddata/xcschemes/Documentation-iOS.xcscheme | 3 +-- .../xcshareddata/xcschemes/Universal Library.xcscheme | 3 +-- .../xcshareddata/xcschemes/Universal iOS Framework.xcscheme | 3 +-- 19 files changed, 21 insertions(+), 42 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme index 3832f8561..0126ce202 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/CorePlotQCPlugin.xcscheme @@ -11,8 +11,7 @@ buildForRunning = "YES" buildForProfiling = "YES" buildForArchiving = "YES" - buildForAnalyzing = "YES" - hideIssues = "NO"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "NO"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "NO"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> + buildForAnalyzing = "YES"> Date: Sun, 27 Mar 2016 13:00:36 -0400 Subject: [PATCH 205/429] Fixed a memory leak in CPTAnimation. --- framework/Source/CPTAnimation.m | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index cc995c3a0..059f9871c 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -32,8 +32,6 @@ -(void)startTimer; -(void)cancelTimer; -(void)update; -dispatch_source_t __nonnull CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t __nonnull queue, dispatch_block_t __nonnull block); - @end /// @endcond @@ -447,9 +445,17 @@ -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary)parameters -(void)startTimer { - self.timer = CPTCreateDispatchTimer(kCPTAnimationFrameRate, self.animationQueue, ^{ - [self update]; - }); + dispatch_source_t newTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.animationQueue); + + if ( newTimer ) { + dispatch_source_set_timer(newTimer, dispatch_time(DISPATCH_TIME_NOW, 0), (uint64_t)(kCPTAnimationFrameRate * NSEC_PER_SEC), 0); + dispatch_source_set_event_handler(newTimer, ^{ + [self update]; + }); + dispatch_resume(newTimer); + + self.timer = newTimer; + } } -(void)cancelTimer @@ -462,18 +468,6 @@ -(void)cancelTimer } } -dispatch_source_t __nonnull CPTCreateDispatchTimer(CGFloat interval, dispatch_queue_t __nonnull queue, dispatch_block_t __nonnull block) -{ - dispatch_source_t newTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); - - if ( newTimer ) { - dispatch_source_set_timer(newTimer, dispatch_time(DISPATCH_TIME_NOW, 0), (uint64_t)(interval * NSEC_PER_SEC), 0); - dispatch_source_set_event_handler(newTimer, block); - dispatch_resume(newTimer); - } - return newTimer; -} - /// @endcond #pragma mark - Timing Functions From 272db3d17bc062cbd5c2de5dffe6747224b6ffb4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 13:17:10 -0400 Subject: [PATCH 206/429] Removed the cpt_weak definition and removed it from all property declarations. It was redundant and caused problems with client code that does not use ARC. Fixed issue #269. --- framework/Source/CPTAnimationOperation.h | 2 +- framework/Source/CPTAnimationOperation.m | 2 +- framework/Source/CPTAnnotation.h | 2 +- framework/Source/CPTAnnotation.m | 2 +- framework/Source/CPTAxis.h | 6 +++--- framework/Source/CPTAxis.m | 18 +++++++++--------- framework/Source/CPTDefinitions.h | 15 +-------------- framework/Source/CPTGraph.h | 2 +- framework/Source/CPTGraph.m | 2 +- framework/Source/CPTGridLineGroup.h | 2 +- framework/Source/CPTGridLineGroup.m | 2 +- framework/Source/CPTGridLines.h | 2 +- framework/Source/CPTGridLines.m | 2 +- framework/Source/CPTLayer.h | 2 +- framework/Source/CPTLayer.m | 2 +- framework/Source/CPTLayerAnnotation.h | 2 +- framework/Source/CPTLayerAnnotation.m | 2 +- framework/Source/CPTLegend.m | 4 ++-- framework/Source/CPTLegendEntry.h | 2 +- framework/Source/CPTLegendEntry.m | 2 +- framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 2 +- framework/Source/CPTPlotSpace.h | 4 ++-- framework/Source/CPTPlotSpace.m | 4 ++-- framework/iPhoneOnly/CPTGraphHostingView.m | 4 ++-- 25 files changed, 39 insertions(+), 52 deletions(-) diff --git a/framework/Source/CPTAnimationOperation.h b/framework/Source/CPTAnimationOperation.h index 275a316fd..b179bf210 100644 --- a/framework/Source/CPTAnimationOperation.h +++ b/framework/Source/CPTAnimationOperation.h @@ -20,7 +20,7 @@ /// @name Delegate /// @{ -@property (nonatomic, cpt_weak_property, nullable) cpt_weak id delegate; +@property (nonatomic, cpt_weak_property, nullable) id delegate; /// @} /// @name Status diff --git a/framework/Source/CPTAnimationOperation.m b/framework/Source/CPTAnimationOperation.m index 1dedcfb0d..f807cca63 100644 --- a/framework/Source/CPTAnimationOperation.m +++ b/framework/Source/CPTAnimationOperation.m @@ -31,7 +31,7 @@ @implementation CPTAnimationOperation **/ @synthesize boundSetter; -/** @property nullable cpt_weak iddelegate +/** @property nullable iddelegate * @brief The animation delegate. **/ @synthesize delegate; diff --git a/framework/Source/CPTAnnotation.h b/framework/Source/CPTAnnotation.h index 9bab1b560..f95042de8 100644 --- a/framework/Source/CPTAnnotation.h +++ b/framework/Source/CPTAnnotation.h @@ -19,7 +19,7 @@ typedef NSMutableArray<__kindof CPTAnnotation *> *CPTMutableAnnotationArray; @interface CPTAnnotation : NSObject @property (nonatomic, readwrite, strong, nullable) CPTLayer *contentLayer; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAnnotationHostLayer *annotationHostLayer; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTAnnotationHostLayer *annotationHostLayer; @property (nonatomic, readwrite, assign) CGPoint contentAnchorPoint; @property (nonatomic, readwrite, assign) CGPoint displacement; @property (nonatomic, readwrite, assign) CGFloat rotation; diff --git a/framework/Source/CPTAnnotation.m b/framework/Source/CPTAnnotation.m index 5e21a7185..69d178386 100644 --- a/framework/Source/CPTAnnotation.m +++ b/framework/Source/CPTAnnotation.m @@ -16,7 +16,7 @@ @implementation CPTAnnotation **/ @synthesize contentLayer; -/** @property nullable cpt_weak CPTAnnotationHostLayer *annotationHostLayer +/** @property nullable CPTAnnotationHostLayer *annotationHostLayer * @brief The host layer for the annotation content. **/ @synthesize annotationHostLayer; diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index 338c17837..47470a6d7 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -282,9 +282,9 @@ typedef NSMutableArray<__kindof CPTAxis *> *CPTMutableAxisArray; /// @name Layers /// @{ @property (nonatomic, readwrite, assign) BOOL separateLayers; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlotArea *plotArea; -@property (nonatomic, readonly, nullable) cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readonly, nullable) cpt_weak CPTGridLines *majorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTPlotArea *plotArea; +@property (nonatomic, readonly, cpt_weak_property, nullable) CPTGridLines *minorGridLines; +@property (nonatomic, readonly, cpt_weak_property, nullable) CPTGridLines *majorGridLines; @property (nonatomic, readonly, nullable) CPTAxisSet *axisSet; /// @} diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 0722e7b24..b91cd0d9b 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -32,10 +32,10 @@ @interface CPTAxis() @property (nonatomic, readwrite, assign) BOOL needsRelabel; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGridLines *minorGridLines; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGridLines *majorGridLines; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownLabel; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTGridLines *minorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTGridLines *majorGridLines; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTAxisLabel *pointingDeviceDownLabel; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTAxisLabel *pointingDeviceDownTickLabel; @property (nonatomic, readwrite, assign) BOOL labelFormatterChanged; @property (nonatomic, readwrite, assign) BOOL minorLabelFormatterChanged; @property (nonatomic, readwrite, strong, nullable) CPTMutableLimitBandArray mutableBackgroundLimitBands; @@ -429,17 +429,17 @@ @implementation CPTAxis **/ @synthesize separateLayers; -/** @property nullable cpt_weak CPTPlotArea *plotArea +/** @property nullable CPTPlotArea *plotArea * @brief The plot area that the axis belongs to. **/ @synthesize plotArea; -/** @property nullable cpt_weak CPTGridLines *minorGridLines +/** @property nullable CPTGridLines *minorGridLines * @brief The layer that draws the minor grid lines. **/ @synthesize minorGridLines; -/** @property nullable cpt_weak CPTGridLines *majorGridLines +/** @property nullable CPTGridLines *majorGridLines * @brief The layer that draws the major grid lines. **/ @synthesize majorGridLines; @@ -450,13 +450,13 @@ @implementation CPTAxis @dynamic axisSet; /** @internal - * @property nullable cpt_weak CPTAxisLabel *pointingDeviceDownLabel + * @property nullable CPTAxisLabel *pointingDeviceDownLabel * @brief The label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownLabel; /** @internal - * @property nullable cpt_weak CPTAxisLabel *pointingDeviceDownTickLabel + * @property nullable CPTAxisLabel *pointingDeviceDownTickLabel * @brief The tick label that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownTickLabel; diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index e586819ad..e28d940da 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -9,13 +9,6 @@ * @brief Defined as @num{1} if the compiler and active SDK support weak references, @num{0} otherwise. **/ -/** - * @def cpt_weak - * @hideinitializer - * @brief A custom definition for automatic reference counting (ARC) weak references that falls back to - * __unsafe_unretained values on older platforms. - **/ - /** * @def cpt_weak_property * @hideinitializer @@ -34,15 +27,9 @@ #endif #if CPT_SDK_SUPPORTS_WEAK -#define cpt_weak __weak #define cpt_weak_property weak #else -#if __clang__ && (__clang_major__ >= 3) -#define cpt_weak __unsafe_unretained -#else -#define cpt_weak -#endif -#define cpt_weak_property assign +#define cpt_weak_property unsafe_unretained #endif // Deprecated method attribute diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index 9ace06c35..f4425a5c2 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -64,7 +64,7 @@ typedef NS_ENUM (NSInteger, CPTGraphLayerType) { /// @name Hosting View /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraphHostingView *hostingView; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTGraphHostingView *hostingView; /// @} /// @name Title diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index a599806a0..7dfac5077 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -66,7 +66,7 @@ -(CGPoint)contentAnchorForRectAnchor:(CPTRectAnchor)anchor; **/ @implementation CPTGraph -/** @property nullable cpt_weak CPTGraphHostingView *hostingView +/** @property nullable CPTGraphHostingView *hostingView * @brief The hosting view that contains the graph. **/ @synthesize hostingView; diff --git a/framework/Source/CPTGridLineGroup.h b/framework/Source/CPTGridLineGroup.h index 5e28da35a..bca74c4cd 100644 --- a/framework/Source/CPTGridLineGroup.h +++ b/framework/Source/CPTGridLineGroup.h @@ -4,7 +4,7 @@ @interface CPTGridLineGroup : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlotArea *plotArea; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTPlotArea *plotArea; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTGridLineGroup.m b/framework/Source/CPTGridLineGroup.m index 14800f2fe..10da12f7b 100644 --- a/framework/Source/CPTGridLineGroup.m +++ b/framework/Source/CPTGridLineGroup.m @@ -12,7 +12,7 @@ **/ @implementation CPTGridLineGroup -/** @property nullable cpt_weak CPTPlotArea *plotArea +/** @property nullable CPTPlotArea *plotArea * @brief The plot area that this grid line group belongs to. **/ @synthesize plotArea; diff --git a/framework/Source/CPTGridLines.h b/framework/Source/CPTGridLines.h index 80650a0b5..f5ee267a7 100644 --- a/framework/Source/CPTGridLines.h +++ b/framework/Source/CPTGridLines.h @@ -4,7 +4,7 @@ @interface CPTGridLines : CPTLayer -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTAxis *axis; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTAxis *axis; @property (nonatomic, readwrite) BOOL major; @end diff --git a/framework/Source/CPTGridLines.m b/framework/Source/CPTGridLines.m index 510fc7c46..fc43af0df 100644 --- a/framework/Source/CPTGridLines.m +++ b/framework/Source/CPTGridLines.m @@ -7,7 +7,7 @@ **/ @implementation CPTGridLines -/** @property nullable cpt_weak CPTAxis *axis +/** @property nullable CPTAxis *axis * @brief The axis. **/ @synthesize axis; diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index fcbe15701..88cbb6a3b 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -41,7 +41,7 @@ typedef NSMutableSet *CPTMutableSublayerSet; /// @name Graph /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTGraph *graph; /// @} /// @name Padding diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 41094b182..9203acabd 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -51,7 +51,7 @@ -(nonnull NSString *)subLayersAtIndex:(NSUInteger)idx; **/ @implementation CPTLayer -/** @property nullable cpt_weak CPTGraph *graph +/** @property nullable CPTGraph *graph * @brief The graph for the layer. **/ @synthesize graph; diff --git a/framework/Source/CPTLayerAnnotation.h b/framework/Source/CPTLayerAnnotation.h index 67c31862e..d16785280 100644 --- a/framework/Source/CPTLayerAnnotation.h +++ b/framework/Source/CPTLayerAnnotation.h @@ -5,7 +5,7 @@ @interface CPTLayerAnnotation : CPTAnnotation -@property (nonatomic, readonly, nullable) cpt_weak CPTLayer *anchorLayer; +@property (nonatomic, readonly, cpt_weak_property, nullable) CPTLayer *anchorLayer; @property (nonatomic, readwrite, assign) CPTRectAnchor rectAnchor; /// @name Initialization diff --git a/framework/Source/CPTLayerAnnotation.m b/framework/Source/CPTLayerAnnotation.m index 34e48c4a0..e6e157dfc 100644 --- a/framework/Source/CPTLayerAnnotation.m +++ b/framework/Source/CPTLayerAnnotation.m @@ -26,7 +26,7 @@ -(void)setConstraints; **/ @implementation CPTLayerAnnotation -/** @property nullable cpt_weak CPTLayer *anchorLayer +/** @property nullable CPTLayer *anchorLayer * @brief The reference layer. **/ @synthesize anchorLayer; diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index e80866abe..b656f9746 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -32,7 +32,7 @@ @interface CPTLegend() @property (nonatomic, readwrite, strong, nullable) CPTNumberArray rowHeightsThatFit; @property (nonatomic, readwrite, strong, nullable) CPTNumberArray columnWidthsThatFit; @property (nonatomic, readwrite, assign) BOOL layoutChanged; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTLegendEntry *pointingDeviceDownEntry; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTLegendEntry *pointingDeviceDownEntry; -(void)recalculateLayout; -(void)removeLegendEntriesForPlot:(nonnull CPTPlot *)plot; @@ -225,7 +225,7 @@ @implementation CPTLegend @synthesize layoutChanged; /** @internal - * @property nullable cpt_weak CPTLegendEntry *pointingDeviceDownEntry + * @property nullable CPTLegendEntry *pointingDeviceDownEntry * @brief The legend entry that was selected on the pointing device down event. **/ @synthesize pointingDeviceDownEntry; diff --git a/framework/Source/CPTLegendEntry.h b/framework/Source/CPTLegendEntry.h index f9fbe5d90..42f8e92a7 100644 --- a/framework/Source/CPTLegendEntry.h +++ b/framework/Source/CPTLegendEntry.h @@ -20,7 +20,7 @@ typedef NSMutableArray *CPTMutableLegendEntryArray; /// @name Plot Info /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTPlot *plot; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTPlot *plot; @property (nonatomic, readwrite, assign) NSUInteger index; /// @} diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 8fe8c9634..7b39c28ec 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -23,7 +23,7 @@ @interface CPTLegendEntry() **/ @implementation CPTLegendEntry -/** @property nullable cpt_weak CPTPlot *plot +/** @property nullable CPTPlot *plot * @brief The plot associated with this legend entry. **/ @synthesize plot; diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 066e07885..5a547e261 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -253,7 +253,7 @@ typedef NSMutableArray<__kindof CPTPlot *> *CPTMutablePlotArray; /// @name Data Source /// @{ -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak id dataSource; +@property (nonatomic, readwrite, cpt_weak_property, nullable) id dataSource; /// @} /// @name Identification diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 66c7fc5ca..935084366 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -104,7 +104,7 @@ @implementation CPTPlot @dynamic dataLabels; -/** @property nullable cpt_weak id dataSource +/** @property nullable id dataSource * @brief The data source for the plot. **/ @synthesize dataSource; diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 203f06a4b..35cc62f1f 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -170,8 +170,8 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> *CPTMutablePlotSpaceArray; @property (nonatomic, readwrite, copy, nullable) id identifier; @property (nonatomic, readwrite) BOOL allowsUserInteraction; @property (nonatomic, readonly) BOOL isDragging; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak CPTGraph *graph; -@property (nonatomic, readwrite, cpt_weak_property, nullable) cpt_weak id delegate; +@property (nonatomic, readwrite, cpt_weak_property, nullable) CPTGraph *graph; +@property (nonatomic, readwrite, cpt_weak_property, nullable) id delegate; @property (nonatomic, readonly) NSUInteger numberOfCoordinates; diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index eadc53d9a..8f55ba32f 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -50,12 +50,12 @@ @implementation CPTPlotSpace **/ @synthesize isDragging; -/** @property nullable cpt_weak CPTGraph *graph +/** @property nullable CPTGraph *graph * @brief The graph of the space. **/ @synthesize graph; -/** @property nullable cpt_weak id delegate +/** @property nullable id delegate * @brief The plot space delegate. **/ @synthesize delegate; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index e74951a8f..ca67963d2 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -9,7 +9,7 @@ /// @cond @interface CPTGraphHostingView() -@property (nonatomic, readwrite, nullable, cpt_weak_property) cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer; +@property (nonatomic, readwrite, nullable, cpt_weak_property) UIPinchGestureRecognizer *pinchGestureRecognizer; -(void)graphNeedsRedraw:(nonnull NSNotification *)notification; -(void)handlePinchGesture:(nonnull UIPinchGestureRecognizer *)aPinchGestureRecognizer; @@ -45,7 +45,7 @@ @implementation CPTGraphHostingView /// @cond /** @internal - * @property nullable cpt_weak UIPinchGestureRecognizer *pinchGestureRecognizer + * @property nullable UIPinchGestureRecognizer *pinchGestureRecognizer * @brief The pinch gesture recognizer for this view. **/ @synthesize pinchGestureRecognizer; From 2e6b25210926cf12a8b72a3aba167efe5252d3a2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 27 Mar 2016 19:43:35 -0400 Subject: [PATCH 207/429] Removed the unused curvedLineGranularity property from CPTScatterPlot. Fixed issue #270. --- framework/Source/CPTScatterPlot.h | 1 - framework/Source/CPTScatterPlot.m | 14 ++------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index e09c7e2c8..b5f108cc4 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -261,7 +261,6 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotHistogramOption) { @property (nonatomic, readwrite, copy, nullable) CPTPlotSymbol *plotSymbol; @property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill; @property (nonatomic, readwrite, copy, nullable) CPTFill *areaFill2; -@property (nonatomic, readwrite) NSUInteger curvedLineGranularity; /// @} /// @name Data Line diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 8ae5c9e5b..3c9138384 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -121,11 +121,6 @@ @implementation CPTScatterPlot **/ @synthesize areaFill2; -/** @property NSUInteger curvedLineGranularity - * @brief The number of smoothed points to interpolate between each view point when drawing a curved line with @ref interpolation of #CPTScatterPlotInterpolationCatmullRom. - **/ -@synthesize curvedLineGranularity; - /** @property nullable NSNumber *areaBaseValue * @brief The Y coordinate of the straight boundary of the area fill. * If not a number, the area is not filled. @@ -224,7 +219,6 @@ +(void)initialize * - @ref plotSymbol = @nil * - @ref areaFill = @nil * - @ref areaFill2 = @nil - * - @ref curvedLineGranularity = @num{20} * - @ref areaBaseValue = @NAN * - @ref areaBaseValue2 = @NAN * - @ref plotSymbolMarginForHitDetection = @num{0.0} @@ -246,7 +240,6 @@ -(nonnull instancetype)initWithFrame:(CGRect)newFrame plotSymbol = nil; areaFill = nil; areaFill2 = nil; - curvedLineGranularity = 20; areaBaseValue = @(NAN); areaBaseValue2 = @(NAN); plotSymbolMarginForHitDetection = CPTFloat(0.0); @@ -276,7 +269,6 @@ -(nonnull instancetype)initWithLayer:(nonnull id)layer plotSymbol = theLayer->plotSymbol; areaFill = theLayer->areaFill; areaFill2 = theLayer->areaFill2; - curvedLineGranularity = theLayer->curvedLineGranularity; areaBaseValue = theLayer->areaBaseValue; areaBaseValue2 = theLayer->areaBaseValue2; plotSymbolMarginForHitDetection = theLayer->plotSymbolMarginForHitDetection; @@ -312,7 +304,6 @@ -(void)encodeWithCoder:(nonnull NSCoder *)coder [coder encodeObject:self.plotSymbol forKey:@"CPTScatterPlot.plotSymbol"]; [coder encodeObject:self.areaFill forKey:@"CPTScatterPlot.areaFill"]; [coder encodeObject:self.areaFill2 forKey:@"CPTScatterPlot.areaFill2"]; - [coder encodeInteger:(NSInteger)self.curvedLineGranularity forKey:@"CPTScatterPlot.curvedLineGranularity"]; [coder encodeObject:self.mutableAreaFillBands forKey:@"CPTScatterPlot.mutableAreaFillBands"]; [coder encodeObject:self.areaBaseValue forKey:@"CPTScatterPlot.areaBaseValue"]; [coder encodeObject:self.areaBaseValue2 forKey:@"CPTScatterPlot.areaBaseValue2"]; @@ -340,9 +331,8 @@ -(nullable instancetype)initWithCoder:(nonnull NSCoder *)coder forKey:@"CPTScatterPlot.areaFill"] copy]; areaFill2 = [[coder decodeObjectOfClass:[CPTFill class] forKey:@"CPTScatterPlot.areaFill2"] copy]; - curvedLineGranularity = (NSUInteger)[coder decodeIntegerForKey:@"CPTScatterPlot.curvedLineGranularity"]; - mutableAreaFillBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] - forKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; + mutableAreaFillBands = [[coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSArray class], [CPTLimitBand class]]] + forKey:@"CPTScatterPlot.mutableAreaFillBands"] mutableCopy]; areaBaseValue = [coder decodeObjectOfClass:[NSNumber class] forKey:@"CPTScatterPlot.areaBaseValue"]; areaBaseValue2 = [coder decodeObjectOfClass:[NSNumber class] From cb3240a0a29c072059e8aff9243f827cc50bb696 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 2 Apr 2016 14:24:06 -0400 Subject: [PATCH 208/429] Changed unsignedIntValue to unsignedIntegerValue to remove implicit type conversions. --- framework/Source/CPTMutableNumericDataTests.m | 2 +- framework/Source/CPTNumericDataTests.m | 2 +- framework/Source/CPTPlot.m | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/Source/CPTMutableNumericDataTests.m b/framework/Source/CPTMutableNumericDataTests.m index c0aa9db63..bd9abf7ac 100644 --- a/framework/Source/CPTMutableNumericDataTests.m +++ b/framework/Source/CPTMutableNumericDataTests.m @@ -47,7 +47,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= num.unsignedIntValue; + prod *= num.unsignedIntegerValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); diff --git a/framework/Source/CPTNumericDataTests.m b/framework/Source/CPTNumericDataTests.m index 5eaff20dc..be2c41a27 100644 --- a/framework/Source/CPTNumericDataTests.m +++ b/framework/Source/CPTNumericDataTests.m @@ -46,7 +46,7 @@ -(void)testNilShapeCorrectElementCount NSUInteger prod = 1; for ( NSNumber *num in nd.shape ) { - prod *= num.unsignedIntValue; + prod *= num.unsignedIntegerValue; } XCTAssertEqual(prod, nElems, @"prod == nElems"); diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 84aa62341..5e466f7c6 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -1520,12 +1520,12 @@ -(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord CPTMutablePlotRange *unionRange = nil; for ( NSNumber *field in fields ) { - CPTPlotRange *currentRange = [self plotRangeForField:field.unsignedIntValue]; + CPTPlotRange *currentRange = [self plotRangeForField:field.unsignedIntegerValue]; if ( !unionRange ) { unionRange = [currentRange mutableCopy]; } else { - [unionRange unionPlotRange:[self plotRangeForField:field.unsignedIntValue]]; + [unionRange unionPlotRange:[self plotRangeForField:field.unsignedIntegerValue]]; } } From 3f882677af082b6b28604714255ee6ef8892395e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 2 Apr 2016 19:27:23 -0400 Subject: [PATCH 209/429] Added a method to automatically scale the plot space to fit the entire plot. Fixed issue #131. --- documentation/changelog.markdown | 1 + .../src/plots/CurvedScatterPlot.m | 7 +-- framework/Source/CPTBarPlot.m | 21 +++++++ framework/Source/CPTPlot.h | 2 + framework/Source/CPTPlot.m | 35 ++++++++++++ framework/Source/CPTPlotSpace.h | 2 + framework/Source/CPTPlotSpace.m | 36 ++++++++++++ framework/Source/CPTScatterPlot.m | 55 +++++++++++++++++++ framework/Source/CPTXYPlotSpace.m | 38 +++++++++++++ 9 files changed, 191 insertions(+), 6 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 9bb4ec802..d9fe7ec78 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -12,6 +12,7 @@ To be determined. - **New**: Added support for `NSSecureCoding`. - **New**: Added an option to draw legend swatches to the left or right side of the title. - **New**: Added an option to use the Catmull-Rom algorithm to draw curved scatter plot lines. +- **New**: Added a method to automatically scale the plot space to fit the entire plot. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index b33ba4e1f..9445c7589 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -252,16 +252,11 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT // [graph addPlot:secondPlot]; // Auto scale the plot space to fit the plot data - [plotSpace scaleToFitPlots:[graph allPlots]]; + [plotSpace scaleToFitEntirePlots:[graph allPlots]]; CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy]; CPTMutablePlotRange *yRange = [plotSpace.yRange mutableCopy]; // Expand the ranges to put some space around the plot - [xRange expandRangeByFactor:@1.2]; - [yRange expandRangeByFactor:@1.2]; - plotSpace.xRange = xRange; - plotSpace.yRange = yRange; - [xRange expandRangeByFactor:@1.025]; xRange.location = plotSpace.xRange.location; [yRange expandRangeByFactor:@1.05]; diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 24bd86449..16e6c6e60 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -743,6 +743,27 @@ -(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord return range; } +-(nullable CPTPlotRange *)plotRangeEnclosingField:(NSUInteger)fieldEnum +{ + CPTPlotRange *range = nil; + + switch ( fieldEnum ) { + case CPTBarPlotFieldBarLocation: + range = [self plotRangeEnclosingBars]; + break; + + case CPTBarPlotFieldBarTip: + case CPTBarPlotFieldBarBase: + range = [self plotRangeForField:fieldEnum]; + break; + + default: + break; + } + + return range; +} + /// @endcond /** @brief Computes a plot range that completely encloses all of the bars. diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 0b13948d8..e9d2833f8 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -357,6 +357,8 @@ typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; /// @{ -(nullable CPTPlotRange *)plotRangeForField:(NSUInteger)fieldEnum; -(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord; +-(nullable CPTPlotRange *)plotRangeEnclosingField:(NSUInteger)fieldEnum; +-(nullable CPTPlotRange *)plotRangeEnclosingCoordinate:(CPTCoordinate)coord; /// @} /// @name Legends diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 5e466f7c6..d75bdf325 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -1532,6 +1532,41 @@ -(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coord return unionRange; } +/** @brief Determines the smallest plot range that fully encloses the entire plot for a particular field. + * @param fieldEnum The field enumerator identifying the field. + * @return The plot range enclosing the data. + **/ +-(nullable CPTPlotRange *)plotRangeEnclosingField:(NSUInteger)fieldEnum +{ + return [self plotRangeForField:fieldEnum]; +} + +/** @brief Determines the smallest plot range that fully encloses the entire plot for a particular coordinate. + * @param coord The coordinate identifier. + * @return The plot range enclosing the data. + **/ +-(nullable CPTPlotRange *)plotRangeEnclosingCoordinate:(CPTCoordinate)coord +{ + CPTNumberArray *fields = [self fieldIdentifiersForCoordinate:coord]; + + if ( fields.count == 0 ) { + return nil; + } + + CPTMutablePlotRange *unionRange = nil; + for ( NSNumber *field in fields ) { + CPTPlotRange *currentRange = [self plotRangeEnclosingField:field.unsignedIntegerValue]; + if ( !unionRange ) { + unionRange = [currentRange mutableCopy]; + } + else { + [unionRange unionPlotRange:[self plotRangeEnclosingField:field.unsignedIntegerValue]]; + } + } + + return unionRange; +} + #pragma mark - #pragma mark Data Labels diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 490a74577..646e906fa 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -236,6 +236,8 @@ typedef NSMutableArray<__kindof CPTPlotSpace *> CPTMutablePlotSpaceArray; /// @{ -(void)scaleToFitPlots:(nullable CPTPlotArray *)plots; -(void)scaleToFitPlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordinate)coordinate; +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots; +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordinate)coordinate; -(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 25ea2ffe4..8a40414a2 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -672,6 +672,42 @@ -(void)scaleToFitPlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordina } } +/** @brief Scales the plot ranges so that the plots just fit in the visible space. + * @param plots An array of the plots that have to fit in the visible area. + **/ +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots +{ +} + +/** @brief Scales the plot range for the given coordinate so that the plots just fit in the visible space. + * @param plots An array of the plots that have to fit in the visible area. + * @param coordinate The axis coordinate. + **/ +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordinate)coordinate +{ + if ( plots.count == 0 ) { + return; + } + + // Determine union of ranges + CPTMutablePlotRange *unionRange = nil; + for ( CPTPlot *plot in plots ) { + CPTPlotRange *currentRange = [plot plotRangeForCoordinate:coordinate]; + if ( !unionRange ) { + unionRange = [currentRange mutableCopy]; + } + [unionRange unionPlotRange:currentRange]; + } + + // Set range + if ( unionRange ) { + if ( CPTDecimalEquals( unionRange.lengthDecimal, CPTDecimalFromInteger(0) ) ) { + [unionRange unionPlotRange:[self plotRangeForCoordinate:coordinate]]; + } + [self setPlotRange:unionRange forCoordinate:coordinate]; + } +} + /** @brief Zooms the plot space equally in each dimension. * @param interactionScale The scaling factor. One (@num{1}) gives no scaling. * @param interactionPoint The plot area view point about which the scaling occurs. diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 3c9138384..23101c7e3 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1581,6 +1581,61 @@ +(BOOL)needsDisplayForKey:(nonnull NSString *)aKey /// @endcond +#pragma mark - +#pragma mark Data Ranges + +/// @cond + +-(nullable CPTPlotRange *)plotRangeEnclosingField:(NSUInteger)fieldEnum +{ + CPTPlotRange *range = [self plotRangeForField:fieldEnum]; + + if ( self.interpolation == CPTScatterPlotInterpolationCurved ) { + CPTPlotSpace *space = self.plotSpace; + + if ( space ) { + CGPathRef dataLinePath = self.newDataLinePath; + + CGRect boundingBox = CGPathGetBoundingBox(dataLinePath); + + CGPathRelease(dataLinePath); + + CPTNumberArray *lowerLeft = [space plotPointForPlotAreaViewPoint:boundingBox.origin]; + CPTNumberArray *upperRight = [space plotPointForPlotAreaViewPoint:CGPointMake( CGRectGetMaxX(boundingBox), + CGRectGetMaxY(boundingBox) )]; + + switch ( fieldEnum ) { + case CPTScatterPlotFieldX: + { + NSNumber *length = [NSDecimalNumber decimalNumberWithDecimal: + CPTDecimalSubtract(upperRight[CPTCoordinateX].decimalValue, + lowerLeft[CPTCoordinateX].decimalValue)]; + range = [CPTPlotRange plotRangeWithLocation:lowerLeft[CPTCoordinateX] + length:length]; + } + break; + + case CPTScatterPlotFieldY: + { + NSNumber *length = [NSDecimalNumber decimalNumberWithDecimal: + CPTDecimalSubtract(upperRight[CPTCoordinateY].decimalValue, + lowerLeft[CPTCoordinateY].decimalValue)]; + range = [CPTPlotRange plotRangeWithLocation:lowerLeft[CPTCoordinateY] + length:length]; + } + break; + + default: + break; + } + } + } + + return range; +} + +/// @endcond + #pragma mark - #pragma mark Fields diff --git a/framework/Source/CPTXYPlotSpace.m b/framework/Source/CPTXYPlotSpace.m index 22a22e800..e1cd65691 100644 --- a/framework/Source/CPTXYPlotSpace.m +++ b/framework/Source/CPTXYPlotSpace.m @@ -802,6 +802,44 @@ -(void)scaleToFitPlots:(nullable CPTPlotArray *)plots } } +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots +{ + if ( plots.count == 0 ) { + return; + } + + // Determine union of ranges + CPTMutablePlotRange *unionXRange = nil; + CPTMutablePlotRange *unionYRange = nil; + for ( CPTPlot *plot in plots ) { + CPTPlotRange *currentXRange = [plot plotRangeEnclosingCoordinate:CPTCoordinateX]; + CPTPlotRange *currentYRange = [plot plotRangeEnclosingCoordinate:CPTCoordinateY]; + if ( !unionXRange ) { + unionXRange = [currentXRange mutableCopy]; + } + if ( !unionYRange ) { + unionYRange = [currentYRange mutableCopy]; + } + [unionXRange unionPlotRange:currentXRange]; + [unionYRange unionPlotRange:currentYRange]; + } + + // Set range + NSDecimal zero = CPTDecimalFromInteger(0); + if ( unionXRange ) { + if ( CPTDecimalEquals(unionXRange.lengthDecimal, zero) ) { + [unionXRange unionPlotRange:self.xRange]; + } + self.xRange = unionXRange; + } + if ( unionYRange ) { + if ( CPTDecimalEquals(unionYRange.lengthDecimal, zero) ) { + [unionYRange unionPlotRange:self.yRange]; + } + self.yRange = unionYRange; + } +} + -(void)setXScaleType:(CPTScaleType)newScaleType { if ( newScaleType != xScaleType ) { From 26ef75a459e2b0fd7f3c6a73850a910aa03211d1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 2 Apr 2016 19:56:49 -0400 Subject: [PATCH 210/429] Fix Catmull-Rom control points so the scatter plot curve doesn't change as the plot scrolls. --- framework/Source/CPTScatterPlot.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 23101c7e3..1f99b9978 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -1266,13 +1266,13 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull p2 = viewPoints[index + 1]; // account for first and last segment if ( index == startIndex ) { - p0 = CGPointMake(CGRectGetMinX(self.bounds), p1.y); // guess first point + p0 = p1; } else { p0 = viewPoints[index - 1]; } if ( index == segmentCount ) { - p3 = CGPointMake(CGRectGetMaxX(self.bounds), p2.y); // guess end point + p3 = p2; } else { p3 = viewPoints[index + 2]; @@ -1297,7 +1297,7 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull cp1 = p1; } else { - CGFloat divisor = 3 * d1_a * (d1_a + d2_a); + CGFloat divisor = CPTFloat(3.0) * d1_a * (d1_a + d2_a); cp1 = CPTPointMake( (p2.x * d1_2a - p0.x * d2_2a + (2 * d1_2a + 3 * d1_a * d2_a + d2_2a) * p1.x) / divisor, (p2.y * d1_2a - p0.y * d2_2a + (2 * d1_2a + 3 * d1_a * d2_a + d2_2a) * p1.y) / divisor ); From 041073eb7aa678dc867e60b90b238e24ce31107b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 9 Apr 2016 10:01:30 -0400 Subject: [PATCH 211/429] Minor documentation formatting updates. --- framework/Source/CPTScatterPlot.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index b5f108cc4..2d09335c5 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -39,9 +39,9 @@ typedef NS_ENUM (NSInteger, CPTScatterPlotInterpolation) { **/ typedef NS_ENUM (NSInteger, CPTScatterPlotCurvedInterpolationOption) { CPTScatterPlotCurvedInterpolationNormal, ///< Standard Curved Interpolation (Bezier Curve) - CPTScatterPlotCurvedInterpolationCatmullRomUniform, ///< Catmull-Rom Spline Interpolation with alpha = 0.0. - CPTScatterPlotCurvedInterpolationCatmullRomCentripetal, ///< Catmull-Rom Spline Interpolation with alpha = 0.5. - CPTScatterPlotCurvedInterpolationCatmullRomChordal, ///< Catmull-Rom Spline Interpolation with alpha = 1.0. + CPTScatterPlotCurvedInterpolationCatmullRomUniform, ///< Catmull-Rom Spline Interpolation with alpha = @num{0.0}. + CPTScatterPlotCurvedInterpolationCatmullRomCentripetal, ///< Catmull-Rom Spline Interpolation with alpha = @num{0.5}. + CPTScatterPlotCurvedInterpolationCatmullRomChordal, ///< Catmull-Rom Spline Interpolation with alpha = @num{1.0}. CPTScatterPlotCurvedInterpolationCatmullCustomAlpha, ///< Catmull-Rom Spline Interpolation with a custom alpha value. CPTScatterPlotCurvedInterpolationHermiteCubic ///< Hermite Cubic Spline Interpolation }; From 0ebfd1354b0a327ad83f3bc0accecc646a008062 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 10 Apr 2016 16:24:01 -0400 Subject: [PATCH 212/429] Added the CPTStringFromVector() utility function. --- framework/Source/CPTUtilities.h | 1 + framework/Source/CPTUtilities.m | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/framework/Source/CPTUtilities.h b/framework/Source/CPTUtilities.h index fe41b4dd6..691923cec 100644 --- a/framework/Source/CPTUtilities.h +++ b/framework/Source/CPTUtilities.h @@ -133,6 +133,7 @@ CGRect CPTAlignBorderedRectToUserSpace(__nonnull CGContextRef context, CGRect re NSString *__nonnull CPTStringFromPoint(CGPoint point); NSString *__nonnull CPTStringFromSize(CGSize size); NSString *__nonnull CPTStringFromRect(CGRect rect); +NSString *__nonnull CPTStringFromVector(CGVector vector); /// @} diff --git a/framework/Source/CPTUtilities.m b/framework/Source/CPTUtilities.m index 9b268e58e..373f11b5b 100644 --- a/framework/Source/CPTUtilities.m +++ b/framework/Source/CPTUtilities.m @@ -976,6 +976,15 @@ CGRect CPTAlignBorderedRectToUserSpace(__nonnull CGContextRef context, CGRect re return [NSString stringWithFormat:@"{{%g, %g}, {%g, %g}}", (double)rect.origin.x, (double)rect.origin.y, (double)rect.size.width, (double)rect.size.height]; } +/** @brief Creates a string representation of the given vector. + * @param vector The vector. + * @return A string with the format {dx, dy}. + **/ +NSString *__nonnull CPTStringFromVector(CGVector vector) +{ + return [NSString stringWithFormat:@"{%g, %g}", (double)vector.dx, (double)vector.dy]; +} + #pragma mark - #pragma mark CGPoint utilities From eaa4fc9649d97dd28ae9d9cbbcf43407db4e0968 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 10 Apr 2016 16:27:14 -0400 Subject: [PATCH 213/429] Automatically draw a monotonic curve when using Hermite cubic spline interpolation on a scatter plot with monotonic plot data. Fixed issue #193. --- framework/Source/CPTScatterPlot.m | 153 +++++++++++++++++++++++++----- 1 file changed, 127 insertions(+), 26 deletions(-) diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 1f99b9978..6ab1d51a2 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -52,6 +52,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo -(void)computeBezierControlPoints:(nonnull CGPoint *)cp1 points2:(nonnull CGPoint *)cp2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange; -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 withAlpha:(CGFloat)alpha forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange; -(void)computeHermiteControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange; +-(BOOL)monotonicViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange; @end @@ -1246,7 +1247,7 @@ -(nonnull CGPathRef)newCurvedDataLinePathForViewPoints:(nonnull CGPoint *)viewPo * @param alpha The alpha value used for the catmull-rom interpolation. * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. * @param indexRange The range in which the interpolation should occur. - * @warning The indexRange must be valid for all passed arrays otherwise this method crashes. + * @warning The @par{indexRange} must be valid for all passed arrays otherwise this method crashes. **/ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 withAlpha:(CGFloat)alpha forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange { @@ -1318,57 +1319,157 @@ -(void)computeCatmullRomControlPoints:(nonnull CGPoint *)points points2:(nonnull } } -/** @brief Compute the control points using a hermite cubic spline. Taken from https://en.wikipedia.org/wiki/Cubic_Hermite_spline (see representations). +/** @brief Compute the control points using a hermite cubic spline. + * + * If the view points are monotonically increasing or decreasing in both @par{x} and @par{y}, + * the smoothed curve will be also. + * * @param points A pointer to the array which should hold the first control points. * @param points2 A pointer to the array which should hold the second control points. * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. * @param indexRange The range in which the interpolation should occur. - * @warning The indexRange must be valid for all passed arrays otherwise this method crashes. + * @warning The @par{indexRange} must be valid for all passed arrays otherwise this method crashes. **/ -(void)computeHermiteControlPoints:(nonnull CGPoint *)points points2:(nonnull CGPoint *)points2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange { + // See https://en.wikipedia.org/wiki/Cubic_Hermite_spline and https://en.m.wikipedia.org/wiki/Monotone_cubic_interpolation for a discussion of algorithms used. if ( indexRange.length >= 2 ) { - NSUInteger startIndex = indexRange.location; - NSUInteger numberOfPoints = NSMaxRange(indexRange) - 1; // last accessible element in view points - for ( NSUInteger index = indexRange.location; index <= numberOfPoints; index++ ) { - CGPoint p0, p1, p2, lhsControlPoint, rhsControlPoint; + NSUInteger startIndex = indexRange.location; + NSUInteger lastIndex = NSMaxRange(indexRange) - 1; // last accessible element in view points - p1 = viewPoints[index]; // is always valid + BOOL monotonic = [self monotonicViewPoints:viewPoints indexRange:indexRange]; + + for ( NSUInteger index = startIndex; index <= lastIndex; index++ ) { + CGVector m; + CGPoint p1 = viewPoints[index]; - CGFloat mx, my; if ( index == startIndex ) { - p2 = viewPoints[index + 1]; - mx = (p2.x - p1.x) * CPTFloat(0.5); - my = (p2.y - p1.y) * CPTFloat(0.5); + CGPoint p2 = viewPoints[index + 1]; + + m.dx = p2.x - p1.x; + m.dy = p2.y - p1.y; } - else if ( index == numberOfPoints ) { - p0 = viewPoints[index - 1]; - mx = (p1.x - p0.x) * CPTFloat(0.5); - my = (p1.y - p0.y) * CPTFloat(0.5); + else if ( index == lastIndex ) { + CGPoint p0 = viewPoints[index - 1]; + + m.dx = p1.x - p0.x; + m.dy = p1.y - p0.y; } else { // index > startIndex && index < numberOfPoints - p2 = viewPoints[index + 1]; - p0 = viewPoints[index - 1]; + CGPoint p0 = viewPoints[index - 1]; + CGPoint p2 = viewPoints[index + 1]; - mx = (p2.x - p1.x) * CPTFloat(0.5) + (p1.x - p0.x) * CPTFloat(0.5); - my = (p2.y - p1.y) * CPTFloat(0.5) + (p1.y - p0.y) * CPTFloat(0.5); + m.dx = p2.x - p0.x; + m.dy = p2.y - p0.y; + + if ( monotonic ) { + if ( m.dx > CPTFloat(0.0) ) { + m.dx = MIN(p2.x - p1.x, p1.x - p0.x); + } + else if ( m.dx < CPTFloat(0.0) ) { + m.dx = MAX(p2.x - p1.x, p1.x - p0.x); + } + + if ( m.dy > CPTFloat(0.0) ) { + m.dy = MIN(p2.y - p1.y, p1.y - p0.y); + } + else if ( m.dy < CPTFloat(0.0) ) { + m.dy = MAX(p2.y - p1.y, p1.y - p0.y); + } + } } + // get control points - mx /= CPTFloat(3.0); - my /= CPTFloat(3.0); - rhsControlPoint = CPTPointMake(p1.x + mx, p1.y + my); - lhsControlPoint = CPTPointMake(p1.x - mx, p1.y - my); + m.dx /= CPTFloat(6.0); + m.dy /= CPTFloat(6.0); - // We calculated the lhs & rhs control point. the rhs control point is the first control point for the curve to the next point. the lhs control point is the second control point for the curve to the current point. + CGPoint rhsControlPoint = CPTPointMake(p1.x + m.dx, p1.y + m.dy); + CGPoint lhsControlPoint = CPTPointMake(p1.x - m.dx, p1.y - m.dy); + + // We calculated the lhs & rhs control point. The rhs control point is the first control point for the curve to the next point. The lhs control point is the second control point for the curve to the current point. points2[index] = lhsControlPoint; - if ( index + 1 <= numberOfPoints ) { + if ( index + 1 <= lastIndex ) { points[index + 1] = rhsControlPoint; } } } } +/** @brief Determine whether the plot points form a monotonic series. + * @param viewPoints A pointer to the array which holds all view points for which the interpolation should be calculated. + * @param indexRange The range in which the interpolation should occur. + * @return Returns @YES if the viewpoints are monotonically increasing or decreasing in both @par{x} and @par{y}. + * @warning The @par{indexRange} must be valid for all passed arrays otherwise this method crashes. + **/ +-(BOOL)monotonicViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange +{ + if ( indexRange.length < 2 ) { + return YES; + } + + NSUInteger startIndex = indexRange.location; + NSUInteger lastIndex = NSMaxRange(indexRange) - 2; + + BOOL foundTrendX = NO; + BOOL foundTrendY = NO; + BOOL isIncreasingX = NO; + BOOL isIncreasingY = NO; + + for ( NSUInteger index = startIndex; index <= lastIndex; index++ ) { + CGPoint p1 = viewPoints[index]; + CGPoint p2 = viewPoints[index + 1]; + + if ( !foundTrendX ) { + if ( p2.x > p1.x ) { + isIncreasingX = YES; + foundTrendX = YES; + } + else if ( p2.x < p1.x ) { + foundTrendX = YES; + } + } + + if ( foundTrendX ) { + if ( isIncreasingX ) { + if ( p2.x < p1.x ) { + return NO; + } + } + else { + if ( p2.x > p1.x ) { + return NO; + } + } + } + + if ( !foundTrendY ) { + if ( p2.y > p1.y ) { + isIncreasingY = YES; + foundTrendY = YES; + } + else if ( p2.y < p1.y ) { + foundTrendY = YES; + } + } + + if ( foundTrendY ) { + if ( isIncreasingY ) { + if ( p2.y < p1.y ) { + return NO; + } + } + else { + if ( p2.y > p1.y ) { + return NO; + } + } + } + } + + return YES; +} + // Compute the control points using the algorithm described at http://www.particleincell.com/blog/2012/bezier-splines/ // cp1, cp2, and viewPoints should point to arrays of points with at least NSMaxRange(indexRange) elements each. -(void)computeBezierControlPoints:(nonnull CGPoint *)cp1 points2:(nonnull CGPoint *)cp2 forViewPoints:(nonnull CGPoint *)viewPoints indexRange:(NSRange)indexRange From 8f1da128f9d127d323c9189a400f4e4cc4643e60 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Apr 2016 13:24:12 -0400 Subject: [PATCH 214/429] Updated the Doxygen config files for Doxygen 1.8.11. --- documentation/doxygen/doxygen touch.config | 36 ++++++++++++++++---- documentation/doxygen/doxygen.config | 36 ++++++++++++++++---- scripts/README Creating a release package.md | 2 +- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 6d9380cec..0dbc37dfb 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.10 +# Doxyfile 1.8.11 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -758,6 +758,12 @@ WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated @@ -808,8 +814,8 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, -# *.vhdl, *.ucf, *.qsf, *.as and *.js. +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = @@ -899,6 +905,10 @@ IMAGE_PATH = "$(SOURCE_ROOT)/../documentation/" # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. INPUT_FILTER = @@ -908,6 +918,10 @@ INPUT_FILTER = # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. FILTER_PATTERNS = @@ -1025,7 +1039,7 @@ VERBATIM_HEADERS = YES # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was -# compiled with the --with-libclang option. +# generated with the -Duse-libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO @@ -1770,6 +1784,14 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -2043,9 +2065,9 @@ INCLUDE_FILE_PATTERNS = PREDEFINED = TARGET_OS_IPHONE, \ TARGET_IPHONE_SIMULATOR, \ - "NS_DESIGNATED_INITIALIZER:=''", \ - "NS_RETURNS_INNER_POINTER:=''", \ - "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ + "NS_DESIGNATED_INITIALIZER:='' ," \ + "NS_RETURNS_INNER_POINTER:='' ," \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 8c04b83b9..c96d56493 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.10 +# Doxyfile 1.8.11 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -758,6 +758,12 @@ WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated @@ -808,8 +814,8 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, -# *.vhdl, *.ucf, *.qsf, *.as and *.js. +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = @@ -899,6 +905,10 @@ IMAGE_PATH = "$(SOURCE_ROOT)/../documentation/" # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. INPUT_FILTER = @@ -908,6 +918,10 @@ INPUT_FILTER = # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. FILTER_PATTERNS = @@ -1025,7 +1039,7 @@ VERBATIM_HEADERS = YES # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was -# compiled with the --with-libclang option. +# generated with the -Duse-libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO @@ -1770,6 +1784,14 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_TIMESTAMP = NO + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -2041,9 +2063,9 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = "NS_DESIGNATED_INITIALIZER:=''", \ - "NS_RETURNS_INNER_POINTER:=''", \ - "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type", \ +PREDEFINED = "NS_DESIGNATED_INITIALIZER:='' ," \ + "NS_RETURNS_INNER_POINTER:='' ," \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 2ed55f5dd..3bd752bed 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -6,7 +6,7 @@ Follow these steps to create a Core Plot release and post it to GitHub:
    • Xcode 7
    • -
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.10 or later, installed in /Applications
    • +
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.11 or later, installed in /Applications
    • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.36.0 or later
    From e04d7c05b5d31d89733663d91bb7ce41cc06b557 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Apr 2016 13:44:01 -0400 Subject: [PATCH 215/429] Removed the deprecated `CorePlot-CocoaTouch.xcodeproj` project file. --- .../xcschemes/CorePlot-CocoaTouch.xcscheme | 80 ------------------- .../xcschemes/Documentation.xcscheme | 80 ------------------- .../xcschemes/Universal Library.xcscheme | 80 ------------------- 3 files changed, 240 deletions(-) delete mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme delete mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme delete mode 100644 framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme deleted file mode 100644 index fd055e090..000000000 --- a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/CorePlot-CocoaTouch.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme deleted file mode 100644 index ee433f2a3..000000000 --- a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Documentation.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme b/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme deleted file mode 100644 index 1df3e4a8e..000000000 --- a/framework/CorePlot-CocoaTouch.xcodeproj/xcshareddata/xcschemes/Universal Library.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 145c5c56f93b94e99663e69cb133ca84f97c14a9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Apr 2016 14:31:14 -0400 Subject: [PATCH 216/429] Updated the static library and documentation readme files. --- READMEs/README for Docs Install.md | 8 ++++---- READMEs/README for Static Library Install.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/READMEs/README for Docs Install.md b/READMEs/README for Docs Install.md index 01cf04a82..57c19c0bd 100644 --- a/READMEs/README for Docs Install.md +++ b/READMEs/README for Docs Install.md @@ -8,10 +8,10 @@ # To Build the Documentation From Source -1. Install [Doxygen]([http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc) in **/Applications**. Core Plot requires Doxygen 1.8.6 or later. +1. Install [Doxygen]([http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc) in **/Applications**. Core Plot requires Doxygen 1.8.11 or later. -2. Install [Graphviz](http://www.graphviz.org/Download_macos.php). Core Plot requires Graphviz 2.34.0 or later. +2. Install [Graphviz](http://www.graphviz.org/Download_macos.php). Core Plot requires Graphviz 2.36.0 or later. -3. Open the **CorePlot** or **CorePlot-CocoaTouch** project in Xcode. +3. Open the **CorePlot** project in Xcode. -4. Build the "Documentation" target. \ No newline at end of file +4. Build the "Documentation-Mac" and/or "Documentation-iOS" targets. \ No newline at end of file diff --git a/READMEs/README for Static Library Install.md b/READMEs/README for Static Library Install.md index 286d1e38a..ece0cccd7 100644 --- a/READMEs/README for Static Library Install.md +++ b/READMEs/README for Static Library Install.md @@ -5,8 +5,8 @@ 2. Copy **libCorePlotCocoaTouch.a** to your Xcode project 3. Add the following flags to "Other Linker Flags" in your target build settings: - `-ObjC -all_load` + `-ObjC` -4. Add the **QuartzCore** framework to the project. +4. Add the **QuartzCore** and **Accelerate** frameworks to the project. 5. Add a `CPTGraph` to your application. See the example apps in Source Code to see how, or read the documentation. \ No newline at end of file From 77f2e154a7c6ff3beb210e1c77495cee8e0b01c9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Apr 2016 14:36:27 -0400 Subject: [PATCH 217/429] Updated the changelog for release 2.1. --- documentation/changelog.markdown | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index d9fe7ec78..77eeae54a 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,8 +1,12 @@ -# Release 2.1 (TBD) +# Release 2.1 (April 16, 2016) ## Release Notes -To be determined. +This release adds a tvOS framework and removes the deprecated `CorePlot-CocoaTouch.xcodeproj` project file. All Core Plot build targets for Mac, iOS, tvOS, and the documentation are in the `CorePlot.xcodeproj` project file. Annotated type definitions (e.g., `CPTNumberArray`) were changed to exclude the pointer star ("*") so they can be used interchangeably with class names. + +Curved scatter plots received several improvements. This release adds options to use Catmull-Rom and Hermite cubic splines to draw curved scatter plot lines. When a Hermite spline is used to draw a monotonic data series, the curved line will be monotonic as well. Plot spaces have new methods to scale the plot space to fit entire plots. + +The Mac deployment target has increased to OS X 10.8. The iOS deployment target remains iOS 6.0 for the static library and iOS 8.0 for the framework. The tvOS deployment target is tvOS 9.0. ## Details - **New**: Increased the Mac deployment target to OS X 10.8. @@ -11,10 +15,11 @@ To be determined. - **New**: Added support for animating `NSNumber` properties with `CPTAnimation`. - **New**: Added support for `NSSecureCoding`. - **New**: Added an option to draw legend swatches to the left or right side of the title. -- **New**: Added an option to use the Catmull-Rom algorithm to draw curved scatter plot lines. +- **New**: Added options to use Catmull-Rom and Hermite cubic splines to draw curved scatter plot lines. - **New**: Added a method to automatically scale the plot space to fit the entire plot. - **Changed**: Changed the annotated type definitions to exclude the pointer star ("*"). - **Changed**: Miscellaneous bug fixes and cleanup. +- **Removed**: Removed the deprecated `CorePlot-CocoaTouch.xcodeproj` project file. From 1a5c6611fd101bf1332c445c85c431a09662432e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 17 Apr 2016 14:53:55 -0400 Subject: [PATCH 218/429] Fixed a plot range animation bug. --- framework/Source/CPTAnimation.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 967defe85..b4ff5f3e6 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -3,6 +3,7 @@ #import "CPTAnimationOperation.h" #import "CPTAnimationPeriod.h" #import "CPTDefinitions.h" +#import "CPTPlotRange.h" #import "_CPTAnimationTimingFunctions.h" static const CGFloat kCPTAnimationFrameRate = CPTFloat(1.0 / 60.0); // 60 frames per second @@ -406,6 +407,13 @@ -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary *)parameters SetterType setterMethod = (SetterType)[boundObject methodForSelector:boundSetter]; setterMethod(boundObject, boundSetter, buffer); } + else if ( [tweenedValue isKindOfClass:[CPTPlotRange class]] ) { + CPTPlotRange *range = (CPTPlotRange *)tweenedValue; + + typedef void (*RangeSetterType)(id, SEL, CPTPlotRange *); + RangeSetterType setterMethod = (RangeSetterType)[boundObject methodForSelector:boundSetter]; + setterMethod(boundObject, boundSetter, range); + } else { // wrapped scalars and structs NSValue *value = (NSValue *)tweenedValue; From cb9639583755edd3e394667cc1b03824fb86ac5f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 22 Apr 2016 13:07:05 -0400 Subject: [PATCH 219/429] Updated the Mac deployment target to OS X 10.8 (fixed a merge error from release 2.1). --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 05807c599..114400ad1 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3253,7 +3253,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; @@ -3272,7 +3272,7 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; From 1d09d5e71493988d81962f82334e40fc517f2060 Mon Sep 17 00:00:00 2001 From: Tim Monzures Date: Thu, 12 May 2016 14:40:51 +0800 Subject: [PATCH 220/429] Enable support for retina monitors when calling imageOfLayer --- .../MacOnly/CPTPlatformSpecificCategories.m | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index 1030e5798..dc5435a8f 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -12,30 +12,40 @@ @implementation CPTLayer(CPTPlatformSpecificLayerExtensions) -(nonnull CPTNativeImage *)imageOfLayer { CGSize boundsSize = self.bounds.size; - - NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL - pixelsWide:(NSInteger)boundsSize.width - pixelsHigh:(NSInteger)boundsSize.height - bitsPerSample:8 - samplesPerPixel:4 - hasAlpha:YES - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bytesPerRow:(NSInteger)boundsSize.width * 4 - bitsPerPixel:32]; - + + // Figure out the scale of pixels to points + CGFloat scale = [[NSScreen mainScreen] backingScaleFactor]; + + NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:NULL + pixelsWide:(NSInteger)(boundsSize.width * scale) + pixelsHigh:(NSInteger)(boundsSize.height * scale) + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:NSAlphaFirstBitmapFormat + bytesPerRow:0 + bitsPerPixel:0 + ]; + + + // Setting the size communicates the dpi; enables proper scaling for Retina screens + [layerImage setSize:NSMakeSize(boundsSize.width, boundsSize.height)]; + NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; - + CGContextClearRect( context, CPTRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); CGContextSetShouldSmoothFonts(context, false); [self layoutAndRenderInContext:context]; CGContextFlush(context); - + NSImage *image = [[NSImage alloc] initWithSize:NSSizeFromCGSize(boundsSize)]; [image addRepresentation:layerImage]; - + return image; } From b4cc5ae17cd42ad06b3097a988a524ef3b9c1312 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 13 May 2016 21:14:19 -0400 Subject: [PATCH 221/429] Updated formatting configuration for Uncrustify 0.63. --- examples/DropPlot/CPTPlotDocument.m | 2 +- framework/Source/CPTBarPlot.m | 8 ++++---- framework/Source/CPTCalendarFormatter.m | 8 ++++---- framework/Source/CPTPlot.m | 2 +- framework/iPhoneOnly/CPTTextStylePlatformSpecific.h | 2 +- scripts/uncrustify.cfg | 11 ++++++++++- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index 41ef93d2f..22bcfec78 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -156,7 +156,7 @@ -(BOOL)readFromData:(nonnull NSData *)data ofType:(NSString *)typeName error:(NS NSString *fileContents = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; // Parse CSV - NSUInteger length = fileContents.length; + NSUInteger length = fileContents.length; NSUInteger lineStart = 0, lineEnd = 0, contentsEnd = 0; NSRange currentRange; diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 16e6c6e60..839825dd0 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -656,8 +656,8 @@ -(double)doubleLengthInPlotCoordinates:(NSDecimal)decimalLength double length; if ( self.barWidthsAreInViewCoordinates ) { - CGFloat floatLength = CPTDecimalCGFloatValue(decimalLength); - CGPoint originViewPoint = CGPointZero; + CGFloat floatLength = CPTDecimalCGFloatValue(decimalLength); + CGPoint originViewPoint = CGPointZero; CGPoint displacedViewPoint = CPTPointMake(floatLength, floatLength); double originPlotPoint[2], displacedPlotPoint[2]; CPTPlotSpace *thePlotSpace = self.plotSpace; @@ -681,8 +681,8 @@ -(NSDecimal)lengthInPlotCoordinates:(NSDecimal)decimalLength NSDecimal length; if ( self.barWidthsAreInViewCoordinates ) { - CGFloat floatLength = CPTDecimalCGFloatValue(decimalLength); - CGPoint originViewPoint = CGPointZero; + CGFloat floatLength = CPTDecimalCGFloatValue(decimalLength); + CGPoint originViewPoint = CGPointZero; CGPoint displacedViewPoint = CPTPointMake(floatLength, floatLength); NSDecimal originPlotPoint[2], displacedPlotPoint[2]; CPTPlotSpace *thePlotSpace = self.plotSpace; diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index dcaa8b8e8..abb1c3be0 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -189,7 +189,7 @@ -(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue dateComponents.weekdayOrdinal = componentIncrement; break; -#if MAC_OS_X_VERSION_10_5 < MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_3_0 < __IPHONE_OS_VERSION_MAX_ALLOWED +#if MAC_OS_X_VERSION_10_5 *cachedLabels = (NSMutableArray *)[self cachedArrayForKey: CPTPlotBindingDataLabels]; + NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey:CPTPlotBindingDataLabels]; for ( CPTLayer *label in cachedLabels ) { if ( ![label isKindOfClass:nullClass] ) { hasCachedLabels = YES; diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index 98141e3a3..b6f4e498f 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -14,7 +14,7 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { // @cond // for iOS SDK compatibility #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED<70000 @interface NSString(CPTTextStylePlatformSpecificExtensions) -(CGSize)sizeWithAttributes:(nonnull CPTDictionary *)attrs; diff --git a/scripts/uncrustify.cfg b/scripts/uncrustify.cfg index af6a1fc0b..9a72e033e 100644 --- a/scripts/uncrustify.cfg +++ b/scripts/uncrustify.cfg @@ -1,4 +1,4 @@ -# Uncrustify 0.62 +# Uncrustify 0.63 newlines = auto input_tab_size = 4 output_tab_size = 4 @@ -292,6 +292,7 @@ align_pp_define_together = false align_pp_define_gap = 1 align_pp_define_span = 2 align_left_shift = true +align_asm_colon = false align_oc_msg_colon_span = 16 align_oc_msg_colon_first = false align_oc_decl_colon = true @@ -405,6 +406,8 @@ nl_before_do = ignore nl_after_do = ignore nl_ds_struct_enum_cmt = false nl_ds_struct_enum_close_brace = false +nl_before_func_class_def = 0 +nl_before_func_class_proto = 0 nl_class_colon = remove nl_constr_colon = ignore nl_create_if_one_liner = true @@ -427,6 +430,8 @@ ls_code_width = false nl_max = 2 nl_after_func_proto = 1 nl_after_func_proto_group = 2 +nl_before_func_body_def = 0 +nl_before_func_body_proto = 0 nl_after_func_body = 2 nl_after_func_body_class = 0 nl_after_func_body_one_liner = 1 @@ -505,3 +510,7 @@ pp_region_indent_code = false pp_indent_if = 0 pp_if_indent_code = false pp_define_at_level = false +use_indent_func_call_param = true +use_indent_continue_only_once = false +# option(s) with 'not default' value: 0 +# From 72a939094a894e79119853e4725b22355e7619b5 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 14 May 2016 07:50:47 -0400 Subject: [PATCH 222/429] Standardized code formatting. --- .../MacOnly/CPTPlatformSpecificCategories.m | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index dc5435a8f..5ad813a76 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -12,40 +12,39 @@ @implementation CPTLayer(CPTPlatformSpecificLayerExtensions) -(nonnull CPTNativeImage *)imageOfLayer { CGSize boundsSize = self.bounds.size; - + // Figure out the scale of pixels to points CGFloat scale = [[NSScreen mainScreen] backingScaleFactor]; - + NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL - pixelsWide:(NSInteger)(boundsSize.width * scale) - pixelsHigh:(NSInteger)(boundsSize.height * scale) - bitsPerSample:8 - samplesPerPixel:4 - hasAlpha:YES - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bitmapFormat:NSAlphaFirstBitmapFormat - bytesPerRow:0 - bitsPerPixel:0 - ]; - - + pixelsWide:(NSInteger)(boundsSize.width * scale) + pixelsHigh:(NSInteger)(boundsSize.height * scale) + bitsPerSample:8 + samplesPerPixel:4 + hasAlpha:YES + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:NSAlphaFirstBitmapFormat + bytesPerRow:0 + bitsPerPixel:0 + ]; + // Setting the size communicates the dpi; enables proper scaling for Retina screens [layerImage setSize:NSMakeSize(boundsSize.width, boundsSize.height)]; - + NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; - + CGContextClearRect( context, CPTRectMake(0.0, 0.0, boundsSize.width, boundsSize.height) ); CGContextSetAllowsAntialiasing(context, true); CGContextSetShouldSmoothFonts(context, false); [self layoutAndRenderInContext:context]; CGContextFlush(context); - + NSImage *image = [[NSImage alloc] initWithSize:NSSizeFromCGSize(boundsSize)]; [image addRepresentation:layerImage]; - + return image; } From ee50e56ee6e7069a7cefb01fbd20638d0faa4a11 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 14 May 2016 13:14:43 -0400 Subject: [PATCH 223/429] Use the window backing scale factor (when available) instead of the main screen to generate an image from layer contents. --- .../MacOnly/CPTPlatformSpecificCategories.m | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index 5ad813a76..b87e1ab6d 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -1,5 +1,7 @@ #import "CPTPlatformSpecificCategories.h" +#import "CPTGraph.h" +#import "CPTGraphHostingView.h" #import "CPTPlatformSpecificFunctions.h" #pragma mark CPTLayer @@ -14,7 +16,21 @@ -(nonnull CPTNativeImage *)imageOfLayer CGSize boundsSize = self.bounds.size; // Figure out the scale of pixels to points - CGFloat scale = [[NSScreen mainScreen] backingScaleFactor]; + CGFloat scale = 0.0; + + if ( [self respondsToSelector:@selector(hostingView)] ) { + scale = ( (CPTGraph *)self ).hostingView.window.backingScaleFactor; + } + else { + NSWindow *myWindow = self.graph.hostingView.window; + + if ( myWindow ) { + scale = myWindow.backingScaleFactor; + } + else { + scale = [NSScreen mainScreen].backingScaleFactor; + } + } NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL @@ -31,7 +47,7 @@ -(nonnull CPTNativeImage *)imageOfLayer ]; // Setting the size communicates the dpi; enables proper scaling for Retina screens - [layerImage setSize:NSMakeSize(boundsSize.width, boundsSize.height)]; + layerImage.size = NSSizeFromCGSize(boundsSize); NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; From 608b162b0b780216a08b4fec5a38dc87efe7c759 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 14 May 2016 13:16:53 -0400 Subject: [PATCH 224/429] Added Tim Monzures to the license file. --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 53ba4f2a8..e9bf9f52d 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2015, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, Victor Martin Garcia, Jérôme Morissard, and Demitri Muna. +Copyright (c) 2015, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, Victor Martin Garcia, Jérôme Morissard, Demitri Muna, and Tim Monzures. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: From 0b03b9b0b52d15a2e9e79cc63424d73f7d29a714 Mon Sep 17 00:00:00 2001 From: Kal Conley Date: Tue, 14 Jun 2016 13:41:54 +0200 Subject: [PATCH 225/429] Fix conflicting nullability specifier errors with iOS 10 SDK --- framework/Source/CPTCalendarFormatter.m | 2 +- framework/Source/CPTTimeFormatter.m | 2 +- framework/iPhoneOnly/CPTGraphHostingView.m | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index dcaa8b8e8..bef5ccd61 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -142,7 +142,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue +-(nullable NSString *)stringForObjectValue:(id)coordinateValue { NSInteger componentIncrement = 0; diff --git a/framework/Source/CPTTimeFormatter.m b/framework/Source/CPTTimeFormatter.m index d35d6dc94..ed20c9866 100644 --- a/framework/Source/CPTTimeFormatter.m +++ b/framework/Source/CPTTimeFormatter.m @@ -116,7 +116,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue +-(nullable NSString *)stringForObjectValue:(id)coordinateValue { NSString *string = nil; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index 83a5586b1..a9dd03030 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -230,7 +230,7 @@ -(void)touchesEnded:(nonnull NSSet *)touches withEvent:(nullable UIEv } } --(void)touchesCancelled:(nullable NSSet *)touches withEvent:(nullable UIEvent *)event +-(void)touchesCancelled:(NSSet *)touches withEvent:(nullable UIEvent *)event { BOOL handled = NO; From c96d31ee078e7597421e25b6e71e86f8a8cc48d9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 14 Jun 2016 22:42:12 -0400 Subject: [PATCH 226/429] Increased the iOS deployment target to iOS 8. Updated all project files for Xcode 8. --- .../project.pbxproj | 64 +++++++++++++++++- .../xcschemes/Build & Copy.xcscheme | 5 +- .../xcschemes/CorePlotQCPlugin.xcscheme | 2 +- documentation/changelog.markdown | 12 ++++ .../AAPLot/AAPLot.xcodeproj/project.pbxproj | 64 +++++++++++++++++- .../xcshareddata/xcschemes/AAPLot.xcscheme | 2 +- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 64 +++++++++++++++++- .../xcschemes/CPTTestApp-iPad.xcscheme | 2 +- .../project.pbxproj | 65 ++++++++++++++++++- .../xcschemes/CPTTestApp-iPhone.xcscheme | 2 +- .../CPTTestApp.xcodeproj/project.pbxproj | 31 ++++++++- .../xcschemes/CPTTestApp.xcscheme | 2 +- .../Plot_Gallery.xcodeproj/project.pbxproj | 30 ++++++++- .../xcschemes/Plot Gallery-Mac.xcscheme | 2 +- .../xcschemes/Plot Gallery-iOS.xcscheme | 2 +- .../xcschemes/Plot Gallery-tvOS.xcscheme | 2 +- .../DatePlot.xcodeproj/project.pbxproj | 31 ++++++++- .../xcshareddata/xcschemes/DatePlot.xcscheme | 2 +- .../DropPlot.xcodeproj/project.pbxproj | 30 ++++++++- .../xcshareddata/xcschemes/DropPlot.xcscheme | 2 +- .../project.pbxproj | 30 ++++++++- .../xcschemes/minorTickFormatter.xcscheme | 2 +- .../RangePlot.xcodeproj/project.pbxproj | 30 ++++++++- .../xcshareddata/xcschemes/RangePlot.xcscheme | 2 +- .../StockPlot.xcodeproj/project.pbxproj | 64 +++++++++++++++++- .../xcshareddata/xcschemes/StockPlot.xcscheme | 2 +- framework/CorePlot.xcodeproj/project.pbxproj | 46 +++++++++++-- .../xcschemes/CorePlot Mac.xcscheme | 2 +- .../xcschemes/CorePlot iOS.xcscheme | 2 +- .../xcschemes/CorePlot tvOS.xcscheme | 2 +- .../xcschemes/CorePlot-CocoaTouch.xcscheme | 2 +- .../xcschemes/Documentation-Mac.xcscheme | 2 +- .../xcschemes/Documentation-iOS.xcscheme | 2 +- .../xcschemes/Universal Library.xcscheme | 2 +- .../Universal iOS Framework.xcscheme | 2 +- 35 files changed, 557 insertions(+), 51 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 4f7d5cf2e..036b9dd6b 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -62,6 +62,20 @@ remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = CorePlot; }; + C31D02421D10F531008C1EF2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6921BC83F2A0091C8F7; + remoteInfo = "CorePlot tvOS"; + }; + C31D02441D10F531008C1EF2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C37EA6B71BC83F2D0091C8F7; + remoteInfo = "UnitTests tvOS"; + }; C3B925EA1ADF1CBE00C67086 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = A89BAB3B1027EFBD004B2FE1 /* CorePlot.xcodeproj */; @@ -213,6 +227,8 @@ C3B925ED1ADF1CBE00C67086 /* UnitTests iOS.xctest */, C3B925EF1ADF1CBE00C67086 /* libCorePlot-CocoaTouch.a */, C3B925F11ADF1CBE00C67086 /* CorePlot-CocoaTouchTests.xctest */, + C31D02431D10F531008C1EF2 /* CorePlot.framework */, + C31D02451D10F531008C1EF2 /* UnitTests tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -246,7 +262,7 @@ 089C1669FE841209C02AAC07 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0800; }; buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "CorePlotQCPlugin" */; compatibilityVersion = "Xcode 6.3"; @@ -289,6 +305,20 @@ remoteRef = BC21A97E1035BEAF00FED2A4 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + C31D02431D10F531008C1EF2 /* CorePlot.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CorePlot.framework; + remoteRef = C31D02421D10F531008C1EF2 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + C31D02451D10F531008C1EF2 /* UnitTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "UnitTests tvOS.xctest"; + remoteRef = C31D02441D10F531008C1EF2 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; C3B925EB1ADF1CBE00C67086 /* CorePlot.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; @@ -437,8 +467,24 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -449,7 +495,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ""; SYMROOT = "$(PROJECT_DIR)/../build"; diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme index 4b733b333..a994e62a5 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/xcshareddata/xcschemes/Build & Copy.xcscheme @@ -1,6 +1,6 @@ + buildForAnalyzing = "YES"> Date: Tue, 14 Jun 2016 22:42:30 -0400 Subject: [PATCH 227/429] Enabled new compiler warnings. --- framework/xcconfig/CorePlotWarnings.xcconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/xcconfig/CorePlotWarnings.xcconfig b/framework/xcconfig/CorePlotWarnings.xcconfig index 599c13467..63c6691c4 100644 --- a/framework/xcconfig/CorePlotWarnings.xcconfig +++ b/framework/xcconfig/CorePlotWarnings.xcconfig @@ -55,7 +55,12 @@ ENABLE_STRICT_OBJC_MSGSEND = YES CLANG_ANALYZER_DEADCODE_DEADSTORES = YES CLANG_ANALYZER_MEMORY_MANAGEMENT = YES CLANG_ANALYZER_GCD = YES +CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES +CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES +CLANG_ANALYZER_NONNULL = YES CLANG_ANALYZER_OBJC_ATSYNC = YES +CLANG_ANALYZER_OBJC_DEALLOC = YES +CLANG_ANALYZER_OBJC_GENERICS = YES CLANG_ANALYZER_OBJC_NSCFERROR = YES CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES = YES CLANG_ANALYZER_OBJC_COLLECTIONS = YES From 3a8f03195031c815f8cb792e2fe06653331952fb Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 14 Jun 2016 23:07:03 -0400 Subject: [PATCH 228/429] Fixed Xcode 8 compiler warnings in the framework project. --- framework/Source/CPTBarPlot.m | 4 +-- framework/Source/CPTCalendarFormatter.m | 2 +- framework/Source/CPTImage.m | 38 +++++++++++++++------- framework/Source/CPTTimeFormatter.m | 2 +- framework/iPhoneOnly/CPTGraphHostingView.m | 2 +- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 839825dd0..06bed146e 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -44,7 +44,7 @@ @interface CPTBarPlot() @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint tipPoint:(nonnull CGPoint *)tipPoint; --(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex; +-(nullable CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex; -(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint; -(nullable CPTFill *)barFillForIndex:(NSUInteger)idx; -(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; @@ -934,7 +934,7 @@ -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint t return YES; } --(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex +-(nullable CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex { // Get base and tip points CGPoint basePoint, tipPoint; diff --git a/framework/Source/CPTCalendarFormatter.m b/framework/Source/CPTCalendarFormatter.m index 6a23d6c45..73ee6ec0b 100644 --- a/framework/Source/CPTCalendarFormatter.m +++ b/framework/Source/CPTCalendarFormatter.m @@ -142,7 +142,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(nullable NSString *)stringForObjectValue:(id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nullable id)coordinateValue { NSInteger componentIncrement = 0; diff --git a/framework/Source/CPTImage.m b/framework/Source/CPTImage.m index b94389961..a761c723a 100644 --- a/framework/Source/CPTImage.m +++ b/framework/Source/CPTImage.m @@ -19,7 +19,7 @@ typedef NS_ENUM (NSInteger, CPTSlice) { }; typedef struct _CPTImageSlices { - CGImageRef slice[9]; ///< The image slices used to render a stretchable image. + __nonnull CGImageRef slice[9]; ///< The image slices used to render a stretchable image. } CPTImageSlices; @@ -592,7 +592,10 @@ -(void)setSlices:(CPTImageSlices)newSlices for ( NSUInteger i = 0; i < 9; i++ ) { CGImageRelease(slices.slice[i]); - slices.slice[i] = CGImageRetain(newSlices.slice[i]); + CGImageRef slice = CGImageRetain(newSlices.slice[i]); + if ( slice ) { + slices.slice[i] = slice; + } } } @@ -630,45 +633,54 @@ -(void)makeImageSlices // top row if ( capTop > CPTFloat(0.0) ) { if ( capLeft > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceTopLeft] = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, 0.0, capLeft, capTop) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, 0.0, capLeft, capTop) ); + imageSlices.slice[CPTSliceTopLeft] = sliceImage; } if ( centerSize.width > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceTop] = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, 0.0, centerSize.width, capTop) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, 0.0, centerSize.width, capTop) ); + imageSlices.slice[CPTSliceTop] = sliceImage; } if ( capRight > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceTopRight] = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, 0.0, capRight, capTop) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, 0.0, capRight, capTop) ); + imageSlices.slice[CPTSliceTopRight] = sliceImage; } } // middle row if ( centerSize.height > CPTFloat(0.0) ) { if ( capLeft > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceLeft] = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, capTop, capLeft, centerSize.height) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, capTop, capLeft, centerSize.height) ); + imageSlices.slice[CPTSliceLeft] = sliceImage; } if ( centerSize.width > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceMiddle] = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, capTop, centerSize.width, centerSize.height) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, capTop, centerSize.width, centerSize.height) ); + imageSlices.slice[CPTSliceMiddle] = sliceImage; } if ( capRight > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceRight] = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, capTop, capRight, centerSize.height) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, capTop, capRight, centerSize.height) ); + imageSlices.slice[CPTSliceRight] = sliceImage; } } // bottom row if ( capBottom > CPTFloat(0.0) ) { if ( capLeft > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceBottomLeft] = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, height - capBottom, capLeft, capBottom) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(0.0, height - capBottom, capLeft, capBottom) ); + imageSlices.slice[CPTSliceBottomLeft] = sliceImage; } if ( centerSize.width > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceBottom] = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, height - capBottom, centerSize.width, capBottom) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(capLeft, height - capBottom, centerSize.width, capBottom) ); + imageSlices.slice[CPTSliceBottom] = sliceImage; } if ( capRight > CPTFloat(0.0) ) { - imageSlices.slice[CPTSliceBottomRight] = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, height - capBottom, capRight, capBottom) ); + CGImageRef sliceImage = CGImageCreateWithImageInRect( theImage, CPTRectMake(width - capRight, height - capBottom, capRight, capBottom) ); + imageSlices.slice[CPTSliceBottomRight] = sliceImage; } } @@ -752,6 +764,10 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context } } + if ( !theImage ) { + return; + } + // draw the image CGFloat imageScale = self.scale; CGFloat scaleRatio = contextScale / imageScale; diff --git a/framework/Source/CPTTimeFormatter.m b/framework/Source/CPTTimeFormatter.m index ed20c9866..4abfd3967 100644 --- a/framework/Source/CPTTimeFormatter.m +++ b/framework/Source/CPTTimeFormatter.m @@ -116,7 +116,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone * @param coordinateValue The time value. * @return The date string. **/ --(nullable NSString *)stringForObjectValue:(id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nullable id)coordinateValue { NSString *string = nil; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index a9dd03030..ccf0df3e5 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -230,7 +230,7 @@ -(void)touchesEnded:(nonnull NSSet *)touches withEvent:(nullable UIEv } } --(void)touchesCancelled:(NSSet *)touches withEvent:(nullable UIEvent *)event +-(void)touchesCancelled:(nonnull NSSet *)touches withEvent:(nullable UIEvent *)event { BOOL handled = NO; From 756772942af5d73160f05398e5acee800c724f25 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 14 Jun 2016 23:07:25 -0400 Subject: [PATCH 229/429] Fixed Xcode 8 compiler warnings in the Objective-C example apps. --- QCPlugin/CPTBarPlotPlugin.m | 7 +++++-- QCPlugin/CPTPieChartPlugin.m | 2 +- QCPlugin/CPTScatterPlotPlugin.m | 7 +++++-- QCPlugin/CorePlotQCPlugin.h | 4 ++-- QCPlugin/CorePlotQCPlugin.m | 19 ++++++++++++------- examples/AAPLot/Classes/RootViewController.m | 2 +- .../src/ios/DetailViewController.m | 2 ++ .../src/ios/ThemeTableViewController.m | 2 ++ .../src/plots/CandlestickPlot.m | 4 ++-- .../CorePlotGallery/src/plots/FunctionPlot.m | 6 +++--- examples/CorePlotGallery/src/plots/OHLCPlot.m | 2 +- .../CorePlotGallery/src/plots/RangePlot.m | 2 +- .../src/shared/PiNumberFormatter.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 ++-- .../src/tvOS/DetailViewControllerTV.m | 2 ++ .../src/tvOS/ThemeTableViewControllerTV.m | 2 ++ .../StockPlot/Classes/RootViewController.m | 5 ++--- 17 files changed, 46 insertions(+), 28 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index 98757ff2e..8a85bd372 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -35,7 +35,7 @@ @implementation CPTBarPlotPlugIn }; } -+(nonnull CPTDictionary *)attributesForPropertyPortWithKey:(nonnull NSString *)key ++(nullable CPTDictionary *)attributesForPropertyPortWithKey:(nullable NSString *)key { // A few additional ports for the bar plot chart type ... @@ -177,7 +177,10 @@ -(BOOL)configurePlots plot.barWidth = @(barWidth); plot.barOffset = @(self.inputBarOffset); plot.barsAreHorizontal = self.inputHorizontalBars; - plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:[self areaFillColor:index]]]; + CGColorRef fillColor = [self areaFillColor:index]; + if ( fillColor ) { + plot.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:fillColor]]; + } [plot reloadData]; } diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index d2a6628d5..a7ca04379 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -67,7 +67,7 @@ +(nonnull CPTStringArray *)sortedPropertyPortKeys return [[super sortedPropertyPortKeys] arrayByAddingObjectsFromArray:pieChartPropertyPortKeys]; } -+(nonnull CPTDictionary *)attributesForPropertyPortWithKey:(nonnull NSString *)key ++(nullable CPTDictionary *)attributesForPropertyPortWithKey:(nullable NSString *)key { // A few additional ports for the pie chart type ... if ( [key isEqualToString:@"inputPieRadius"] ) { diff --git a/QCPlugin/CPTScatterPlotPlugin.m b/QCPlugin/CPTScatterPlotPlugin.m index dbe784b14..3fd32a752 100644 --- a/QCPlugin/CPTScatterPlotPlugin.m +++ b/QCPlugin/CPTScatterPlotPlugin.m @@ -193,8 +193,11 @@ -(BOOL)configurePlots plot.plotSymbol.lineStyle = lineStyle; plot.plotSymbol.fill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:[self dataSymbolColor:index]]]; plot.plotSymbol.size = CGSizeMake(10.0, 10.0); - plot.areaFill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:[self areaFillColor:index]]]; - plot.areaBaseValue = @( MAX( self.inputYMin, MIN(self.inputYMax, 0.0) ) ); + CGColorRef fillColor = [self areaFillColor:index]; + if ( fillColor ) { + plot.areaFill = [CPTFill fillWithColor:[CPTColor colorWithCGColor:fillColor]]; + } + plot.areaBaseValue = @( MAX( self.inputYMin, MIN(self.inputYMax, 0.0) ) ); [plot reloadData]; } diff --git a/QCPlugin/CorePlotQCPlugin.h b/QCPlugin/CorePlotQCPlugin.h index 1a24245b4..e0ec5811c 100644 --- a/QCPlugin/CorePlotQCPlugin.h +++ b/QCPlugin/CorePlotQCPlugin.h @@ -48,7 +48,7 @@ -(nonnull CGColorRef)dataLineColor:(NSUInteger)index; -(CGFloat)dataLineWidth:(NSUInteger)index; --(nonnull CGColorRef)areaFillColor:(NSUInteger)index; --(nonnull CGImageRef)newAreaFillImage:(NSUInteger)index; +-(nullable CGColorRef)areaFillColor:(NSUInteger)index; +-(nullable CGImageRef)newAreaFillImage:(NSUInteger)index; @end diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index b814402bf..99d4c9080 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -10,7 +10,7 @@ @interface CorePlotQCPlugIn() @property (nonatomic, readwrite, strong, nullable) NSMutableData *imageData; @property (nonatomic, readwrite, assign, nullable) CGContextRef bitmapContext; -@property (nonatomic, readwrite, strong, nonnull) id imageProvider; +@property (nonatomic, readwrite, strong, nullable) id imageProvider; void drawErrorText(CGContextRef __nonnull context, CGRect rect); @@ -186,7 +186,7 @@ +(nonnull CPTStringArray *)sortedPropertyPortKeys @"inputAxisMinorTickWidth"]; } -+(nonnull CPTDictionary *)attributesForPropertyPortWithKey:(nonnull NSString *)key ++(nullable CPTDictionary *)attributesForPropertyPortWithKey:(nullable NSString *)key { /* * Specify the optional attributes for property based ports (QCPortAttributeNameKey, QCPortAttributeDefaultValueKey...). @@ -513,14 +513,14 @@ -(CGFloat)dataLineWidth:(NSUInteger)index return inputValue.doubleValue; } --(nonnull CGColorRef)areaFillColor:(NSUInteger)index +-(nullable CGColorRef)areaFillColor:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotFillColor%lu", (unsigned long)index]; return (__bridge CGColorRef)([self valueForInputKey:key]); } --(nonnull CGImageRef)newAreaFillImage:(NSUInteger)index +-(nullable CGImageRef)newAreaFillImage:(NSUInteger)index { NSString *key = [NSString stringWithFormat:@"plotFillImage%lu", (unsigned long)index]; @@ -828,9 +828,14 @@ -(BOOL)execute:(nonnull id)context atTime:(NSTimeInterval)time CGContextFlush(bmContext); // ... and put it on the output port - self.outputImage = self.imageProvider; - - return YES; + id provider = self.imageProvider; + if ( provider ) { + self.outputImage = provider; + return YES; + } + else { + return NO; + } } @end diff --git a/examples/AAPLot/Classes/RootViewController.m b/examples/AAPLot/Classes/RootViewController.m index 9f53bd403..c8218a811 100644 --- a/examples/AAPLot/Classes/RootViewController.m +++ b/examples/AAPLot/Classes/RootViewController.m @@ -46,7 +46,7 @@ -(void)loadFlipsideViewController UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toggleView)]; - UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"AAPLot"]; + UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(@"AAPLot", @"App name")]; navigationItem.rightBarButtonItem = buttonItem; [self.flipsideNavigationBar pushNavigationItem:navigationItem animated:NO]; } diff --git a/examples/CorePlotGallery/src/ios/DetailViewController.m b/examples/CorePlotGallery/src/ios/DetailViewController.m index a50fe4923..ecf8ed0c1 100644 --- a/examples/CorePlotGallery/src/ios/DetailViewController.m +++ b/examples/CorePlotGallery/src/ios/DetailViewController.m @@ -44,6 +44,8 @@ -(void)setupView -(void)awakeFromNib { + [super awakeFromNib]; + [self setupView]; } diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index a0901f3ae..08d140dc7 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -41,6 +41,8 @@ -(void)setupThemes -(void)awakeFromNib { + [super awakeFromNib]; + [self setupThemes]; } diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index ed592f22b..ac1898980 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -9,7 +9,7 @@ @interface CandlestickPlot() -@property (nonatomic, readwrite, strong, nonnull) CPTGraph *graph; +@property (nonatomic, readwrite, strong, nullable) CPTGraph *graph; @property (nonatomic, readwrite, strong, nonnull) NSArray *plotData; @end @@ -28,7 +28,7 @@ -(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; - plotData = nil; + plotData = @[]; self.title = @"Candlestick Plot"; self.section = kFinancialPlots; diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 8455ce546..24d94d2a5 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -118,13 +118,13 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT switch ( plotNum ) { case 0: - titleString = @"y = sin(x)"; + titleString = NSLocalizedString(@"y = sin(x)", @"y = sin(x)"); function = &sin; lineColor = [CPTColor redColor]; break; case 1: - titleString = @"y = cos(x)"; + titleString = NSLocalizedString(@"y = cos(x)", @"y = cos(x)"); block = ^(double xVal) { return cos(xVal); }; @@ -132,7 +132,7 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT break; case 2: - titleString = @"y = tan(x)"; + titleString = NSLocalizedString(@"y = tan(x)", @"y = tan(x)"); function = &tan; lineColor = [CPTColor blueColor]; break; diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 2032889fb..86cfca07f 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -28,7 +28,7 @@ -(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; - plotData = nil; + plotData = @[]; self.title = @"OHLC Plot"; self.section = kFinancialPlots; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index d5c80ba63..31bb76cdd 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -32,7 +32,7 @@ -(nonnull instancetype)init { if ( (self = [super init]) ) { graph = nil; - plotData = nil; + plotData = @[]; self.title = @"Range Plot"; self.section = kFinancialPlots; diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index 44db81b2e..f8cfe1e59 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -17,7 +17,7 @@ @implementation PiNumberFormatter * @param coordinateValue The numeric value. * @return The formatted string. **/ --(nullable NSString *)stringForObjectValue:(nonnull id)coordinateValue +-(nullable NSString *)stringForObjectValue:(nullable id)coordinateValue { NSString *string = nil; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index c1643e3a9..414d26910 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -57,8 +57,8 @@ -(nonnull instancetype)init defaultLayerHostingView = nil; graphs = [[NSMutableArray alloc] init]; - section = nil; - title = nil; + section = @""; + title = @""; } return self; diff --git a/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m index e98a8f379..87f3aafa0 100644 --- a/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/DetailViewControllerTV.m @@ -40,6 +40,8 @@ -(void)setupView -(void)awakeFromNib { + [super awakeFromNib]; + [self setupView]; } diff --git a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m index d8f3ce37b..560c42897 100644 --- a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m @@ -41,6 +41,8 @@ -(void)setupThemes -(void)awakeFromNib { + [super awakeFromNib]; + [self setupThemes]; } diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index f543b6e9f..7e5dace94 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -46,7 +46,7 @@ -(void)didReceiveMemoryWarning -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - self.navigationItem.title = @"Stocks"; + self.navigationItem.title = NSLocalizedString(@"Stocks", @"App name"); // the graph will set itself as delegate of the dataPuller when we push it, so we need to reset this. for ( APYahooDataPuller *dp in self.stocks ) { dp.delegate = self; @@ -62,7 +62,7 @@ -(void)inspectStock:(nonnull APYahooDataPuller *)aStock if ( [high isEqualToNumber:[NSDecimalNumber notANumber]] || [low isEqualToNumber:[NSDecimalNumber notANumber]] || (aStock.financialData.count <= 0) ) { NSString *message = [NSString stringWithFormat:@"No information available for %@", aStock.symbol]; - UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Alert" message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; + UIAlertView *av = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert", @"Alert title") message:message delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; [av show]; } else { @@ -239,7 +239,6 @@ -(void)dealloc dp.delegate = nil; } } - stocks = nil; } /* From d89bdb21da90f000cbe288a1ed6756b227c9e82a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 14 Jun 2016 23:10:43 -0400 Subject: [PATCH 230/429] Updated the Travis configuration to build with Xcode 8. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 927fa9fa8..0de77074a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode7.1 +osx_image: xcode8 ios_env: SDK:iphonesimulator From 93ae2d455ce2a37911bc8fe384c3c2a6971ea9b4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 15 Jun 2016 20:55:02 -0400 Subject: [PATCH 231/429] Updated the Swift example apps to Swift 3 and fixed all Xcode 8 warnings. --- .../Classes/BarChartController.swift | 36 +++++++-------- .../Classes/PieChartController.swift | 32 +++++++------- .../Classes/ScatterPlotController.swift | 44 +++++++++---------- .../Classes/iPhoneAppDelegate.swift | 2 +- .../DatePlot.xcodeproj/project.pbxproj | 8 ++-- examples/DatePlot/Source/AppDelegate.swift | 12 +++++ examples/DatePlot/Source/DateController.swift | 27 ++++++------ examples/DatePlot/Source/main.swift | 3 -- 8 files changed, 86 insertions(+), 78 deletions(-) create mode 100644 examples/DatePlot/Source/AppDelegate.swift delete mode 100644 examples/DatePlot/Source/main.swift diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 87c0984d9..7aadad198 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -5,13 +5,13 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { // MARK: Initialization - override func viewDidAppear(animated : Bool) + override func viewDidAppear(_ animated : Bool) { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph(frame: CGRectZero) - newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + let newGraph = CPTXYGraph(frame: .zero) + newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph @@ -36,7 +36,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { // Graph title let paragraphStyle = NSMutableParagraphStyle() - paragraphStyle.alignment = .Center + paragraphStyle.alignment = .center let lineOne = "Graph Title" let lineTwo = "Line 2" @@ -49,8 +49,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let titleRange1 = NSRange(location: 0, length: lineOne.utf16.count) let titleRange2 = NSRange(location: lineOne.utf16.count + 1, length: lineTwo.utf16.count) - graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.whiteColor(), range:titleRange1) - graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.grayColor(), range:titleRange2) + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.white(), range:titleRange1) + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.gray(), range:titleRange2) graphTitle.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSRange(location: 0, length: graphTitle.length)) graphTitle.addAttribute(NSFontAttributeName, value:line1Font!, range:titleRange1) graphTitle.addAttribute(NSFontAttributeName, value:line2Font!, range:titleRange2) @@ -58,7 +58,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { newGraph.attributedTitle = graphTitle newGraph.titleDisplacement = CGPoint(x: 0.0, y:-20.0) - newGraph.titlePlotAreaFrameAnchor = .Top + newGraph.titlePlotAreaFrameAnchor = .top // Plot space let plotSpace = newGraph.defaultPlotSpace as! CPTXYPlotSpace @@ -79,7 +79,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { // Custom labels x.labelRotation = CGFloat(M_PI_4) - x.labelingPolicy = .None + x.labelingPolicy = .none let customTickLocations = [1, 5, 10, 15] let xAxisLabels = ["Label A", "Label B", "Label C", "Label D"] @@ -110,41 +110,41 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { } // First bar plot - let barPlot1 = CPTBarPlot.tubularBarPlotWithColor(CPTColor.darkGrayColor(), horizontalBars:false) + let barPlot1 = CPTBarPlot.tubularBarPlot(with: .darkGray(), horizontalBars:false) barPlot1.baseValue = 0.0 barPlot1.dataSource = self barPlot1.barOffset = -0.2 barPlot1.identifier = "Bar Plot 1" - newGraph.addPlot(barPlot1, toPlotSpace:plotSpace) + newGraph.add(barPlot1, to:plotSpace) // Second bar plot - let barPlot2 = CPTBarPlot.tubularBarPlotWithColor(CPTColor.blueColor(), horizontalBars:false) + let barPlot2 = CPTBarPlot.tubularBarPlot(with: .blue(), horizontalBars:false) barPlot2.dataSource = self barPlot2.baseValue = 0.0 barPlot2.barOffset = 0.25 barPlot2.barCornerRadius = 2.0 barPlot2.identifier = "Bar Plot 2" - newGraph.addPlot(barPlot2, toPlotSpace:plotSpace) + newGraph.add(barPlot2, to:plotSpace) self.barGraph = newGraph } // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot) -> UInt + func numberOfRecords(for plot: CPTPlot) -> UInt { return 16 } - func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? { switch CPTBarPlotField(rawValue: Int(field))! { - case .BarLocation: - return recordIndex as NSNumber + case .barLocation: + return record as NSNumber - case .BarTip: + case .barTip: let plotID = plot.identifier as! String - return (plotID == "Bar Plot 2" ? recordIndex : ((recordIndex + 1) * (recordIndex + 1)) ) as NSNumber + return (plotID == "Bar Plot 2" ? record : ((record + 1) * (record + 1)) ) as NSNumber default: return nil diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index ea01894e6..46f4a4466 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -7,13 +7,13 @@ class PieChartController : UIViewController, CPTPieChartDataSource { // MARK: Initialization - override func viewDidAppear(animated : Bool) + override func viewDidAppear(_ animated : Bool) { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph(frame: CGRectZero) - newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + let newGraph = CPTXYGraph(frame: .zero) + newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph @@ -27,55 +27,55 @@ class PieChartController : UIViewController, CPTPieChartDataSource { newGraph.axisSet = nil let whiteText = CPTMutableTextStyle() - whiteText.color = CPTColor.whiteColor() + whiteText.color = .white() newGraph.titleTextStyle = whiteText newGraph.title = "Graph Title" // Add pie chart - let piePlot = CPTPieChart(frame: CGRectZero) + let piePlot = CPTPieChart(frame: .zero) piePlot.dataSource = self piePlot.pieRadius = 131.0 piePlot.identifier = "Pie Chart 1" piePlot.startAngle = CGFloat(M_PI_4) - piePlot.sliceDirection = .CounterClockwise + piePlot.sliceDirection = .counterClockwise piePlot.centerAnchor = CGPoint(x: 0.5, y: 0.38) piePlot.borderLineStyle = CPTLineStyle() piePlot.delegate = self - newGraph.addPlot(piePlot) + newGraph.add(piePlot) self.pieGraph = newGraph } // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot) -> UInt + func numberOfRecords(for plot: CPTPlot) -> UInt { return UInt(self.dataForChart.count) } - func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? { - if Int(recordIndex) > self.dataForChart.count { + if Int(record) > self.dataForChart.count { return nil } else { switch CPTPieChartField(rawValue: Int(field))! { - case .SliceWidth: - return (self.dataForChart)[Int(recordIndex)] as NSNumber + case .sliceWidth: + return (self.dataForChart)[Int(record)] as NSNumber default: - return recordIndex as NSNumber + return record as NSNumber } } } - func dataLabelForPlot(plot: CPTPlot, recordIndex: UInt) -> CPTLayer? + func dataLabel(for plot: CPTPlot, record: UInt) -> CPTLayer? { - let label = CPTTextLayer(text:"\(recordIndex)") + let label = CPTTextLayer(text:"\(record)") if let textStyle = label.textStyle?.mutableCopy() as? CPTMutableTextStyle { - textStyle.color = CPTColor.lightGrayColor() + textStyle.color = .lightGray() label.textStyle = textStyle } diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 2f1681dd3..94ce8e4bc 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -8,13 +8,13 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // MARK: Initialization - override func viewDidAppear(animated : Bool) + override func viewDidAppear(_ animated : Bool) { super.viewDidAppear(animated) // Create graph from theme - let newGraph = CPTXYGraph(frame: CGRectZero) - newGraph.applyTheme(CPTTheme(named: kCPTDarkGradientTheme)) + let newGraph = CPTXYGraph(frame: .zero) + newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph @@ -58,35 +58,35 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { } // Create a blue plot area - let boundLinePlot = CPTScatterPlot(frame: CGRectZero) + let boundLinePlot = CPTScatterPlot(frame: .zero) let blueLineStyle = CPTMutableLineStyle() blueLineStyle.miterLimit = 1.0 blueLineStyle.lineWidth = 3.0 - blueLineStyle.lineColor = CPTColor.blueColor() + blueLineStyle.lineColor = .blue() boundLinePlot.dataLineStyle = blueLineStyle boundLinePlot.identifier = "Blue Plot" boundLinePlot.dataSource = self - newGraph.addPlot(boundLinePlot) + newGraph.add(boundLinePlot) let fillImage = CPTImage(named:"BlueTexture") - fillImage.tiled = true + fillImage.isTiled = true boundLinePlot.areaFill = CPTFill(image: fillImage) boundLinePlot.areaBaseValue = 0.0 // Add plot symbols let symbolLineStyle = CPTMutableLineStyle() - symbolLineStyle.lineColor = CPTColor.blackColor() - let plotSymbol = CPTPlotSymbol.ellipsePlotSymbol() - plotSymbol.fill = CPTFill(color: CPTColor.blueColor()) + symbolLineStyle.lineColor = .black() + let plotSymbol = CPTPlotSymbol.ellipse() + plotSymbol.fill = CPTFill(color: .blue()) plotSymbol.lineStyle = symbolLineStyle plotSymbol.size = CGSize(width: 10.0, height: 10.0) boundLinePlot.plotSymbol = plotSymbol // Create a green plot area - let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) + let dataSourceLinePlot = CPTScatterPlot(frame: .zero) let greenLineStyle = CPTMutableLineStyle() greenLineStyle.lineWidth = 3.0 - greenLineStyle.lineColor = CPTColor.greenColor() + greenLineStyle.lineColor = .green() greenLineStyle.dashPattern = [5.0, 5.0] dataSourceLinePlot.dataLineStyle = greenLineStyle dataSourceLinePlot.identifier = "Green Plot" @@ -94,7 +94,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // Put an area gradient under the plot above let areaColor = CPTColor(componentRed: 0.3, green: 1.0, blue: 0.3, alpha: 0.8) - let areaGradient = CPTGradient(beginningColor: areaColor, endingColor: CPTColor.clearColor()) + let areaGradient = CPTGradient(beginning: areaColor, ending: .clear()) areaGradient.angle = -90.0 let areaGradientFill = CPTFill(gradient: areaGradient) dataSourceLinePlot.areaFill = areaGradientFill @@ -102,14 +102,14 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // Animate in the new plot, as an example dataSourceLinePlot.opacity = 0.0 - newGraph.addPlot(dataSourceLinePlot) + newGraph.add(dataSourceLinePlot) let fadeInAnimation = CABasicAnimation(keyPath: "opacity") fadeInAnimation.duration = 1.0 - fadeInAnimation.removedOnCompletion = false + fadeInAnimation.isRemovedOnCompletion = false fadeInAnimation.fillMode = kCAFillModeForwards fadeInAnimation.toValue = 1.0 - dataSourceLinePlot.addAnimation(fadeInAnimation, forKey: "animateOpacity") + dataSourceLinePlot.add(fadeInAnimation, forKey: "animateOpacity") // Add some initial data var contentArray = [plotDataType]() @@ -126,16 +126,16 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot) -> UInt + func numberOfRecords(for plot: CPTPlot) -> UInt { return UInt(self.dataForPlot.count) } - func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? { let plotField = CPTScatterPlotField(rawValue: Int(field)) - if let num = self.dataForPlot[Int(recordIndex)][plotField!] { + if let num = self.dataForPlot[Int(record)][plotField!] { let plotID = plot.identifier as! String if (plotField! == .Y) && (plotID == "Green Plot") { return (num + 1.0) as NSNumber @@ -162,13 +162,13 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { if let labelTextStyle = axis.labelTextStyle?.mutableCopy() as? CPTMutableTextStyle { if tickLocation.doubleValue >= 0.0 { - labelTextStyle.color = CPTColor.greenColor() + labelTextStyle.color = .green() } else { - labelTextStyle.color = CPTColor.redColor() + labelTextStyle.color = .red() } - let labelString = formatter.stringForObjectValue(tickLocation) + let labelString = formatter.string(for:tickLocation) let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) diff --git a/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift index e19b8b21d..42189f9ec 100644 --- a/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift +++ b/examples/CPTTestApp-iPhone/Classes/iPhoneAppDelegate.swift @@ -11,7 +11,7 @@ class iPhoneAppDelegate : NSObject, UIApplicationDelegate, UITabBarControllerDel @IBOutlet var window: UIWindow? = nil @IBOutlet var tabBarController: UITabBarController? = nil - func applicationDidFinishLaunching(application: UIApplication) { + func applicationDidFinishLaunching(_ application: UIApplication) { if let myWindow = self.window { myWindow.rootViewController = self.tabBarController myWindow.makeKeyAndVisible() diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index b8dc1ddb8..99d8c4cd2 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 90AF4F440F36CF1800753D26 /* DatePlot.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90AF4F430F36CF1800753D26 /* DatePlot.xib */; }; BC8E737D0FC0B3CF00DF8511 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */; }; - C33E19A8198330CA00182AF2 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33E19A7198330CA00182AF2 /* main.swift */; }; + C33E19A8198330CA00182AF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33E19A7198330CA00182AF2 /* AppDelegate.swift */; }; C3A14440197DE35F0048F1FF /* DateController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A1443F197DE35F0048F1FF /* DateController.swift */; }; C3D3937419FD6E3500148319 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3D3937319FD6E3500148319 /* Images.xcassets */; }; /* End PBXBuildFile section */ @@ -111,7 +111,7 @@ 8D1107320486CEB800E47090 /* DatePlot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DatePlot.app; sourceTree = BUILT_PRODUCTS_DIR; }; 90AF4F430F36CF1800753D26 /* DatePlot.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DatePlot.xib; sourceTree = ""; }; BC8E737C0FC0B3CF00DF8511 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - C33E19A7198330CA00182AF2 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = Source/main.swift; sourceTree = ""; }; + C33E19A7198330CA00182AF2 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Source/AppDelegate.swift; sourceTree = ""; }; C3A1443E197DE35F0048F1FF /* DatePlot-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DatePlot-Bridging-Header.h"; sourceTree = ""; }; C3A1443F197DE35F0048F1FF /* DateController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DateController.swift; path = Source/DateController.swift; sourceTree = ""; }; C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = CorePlotWarnings.xcconfig; path = ../../framework/xcconfig/CorePlotWarnings.xcconfig; sourceTree = ""; }; @@ -151,6 +151,7 @@ isa = PBXGroup; children = ( C3A1443E197DE35F0048F1FF /* DatePlot-Bridging-Header.h */, + C33E19A7198330CA00182AF2 /* AppDelegate.swift */, C3A1443F197DE35F0048F1FF /* DateController.swift */, ); name = Classes; @@ -224,7 +225,6 @@ C33E19A219832EEA00182AF2 /* Other Sources */ = { isa = PBXGroup; children = ( - C33E19A7198330CA00182AF2 /* main.swift */, C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */, ); name = "Other Sources"; @@ -365,7 +365,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C33E19A8198330CA00182AF2 /* main.swift in Sources */, + C33E19A8198330CA00182AF2 /* AppDelegate.swift in Sources */, C3A14440197DE35F0048F1FF /* DateController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/examples/DatePlot/Source/AppDelegate.swift b/examples/DatePlot/Source/AppDelegate.swift new file mode 100644 index 000000000..32a1c9cba --- /dev/null +++ b/examples/DatePlot/Source/AppDelegate.swift @@ -0,0 +1,12 @@ +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + func applicationDidFinishLaunching(_ aNotification: Notification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } +} diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 5ebba13a6..43a4e0358 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -19,13 +19,13 @@ class DateController : NSObject, CPTPlotDataSource { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust // for daylight savings time. - let refDate = NSDateFormatter().dateFromString("12:00 Oct 29, 2009") + let refDate = DateFormatter().date(from: "12:00 Oct 29, 2009") // Create graph - let newGraph = CPTXYGraph(frame: CGRectZero) + let newGraph = CPTXYGraph(frame: .zero) let theme = CPTTheme(named: kCPTDarkGradientTheme) - newGraph.applyTheme(theme) + newGraph.apply(theme) if let host = self.hostView { host.hostedGraph = newGraph; @@ -43,8 +43,8 @@ class DateController : NSObject, CPTPlotDataSource { x.majorIntervalLength = oneDay x.orthogonalPosition = 2.0 x.minorTicksPerInterval = 0; - let dateFormatter = NSDateFormatter() - dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .shortStyle let timeFormatter = CPTTimeFormatter(dateFormatter:dateFormatter) timeFormatter.referenceDate = refDate; x.labelFormatter = timeFormatter; @@ -55,21 +55,21 @@ class DateController : NSObject, CPTPlotDataSource { y.minorTicksPerInterval = 5 y.orthogonalPosition = oneDay - y.labelingPolicy = .None + y.labelingPolicy = .none } // Create a plot that uses the data source method - let dataSourceLinePlot = CPTScatterPlot(frame: CGRectZero) + let dataSourceLinePlot = CPTScatterPlot(frame: .zero) dataSourceLinePlot.identifier = "Date Plot" if let lineStyle = dataSourceLinePlot.dataLineStyle?.mutableCopy() as? CPTMutableLineStyle { lineStyle.lineWidth = 3.0 - lineStyle.lineColor = CPTColor.greenColor() + lineStyle.lineColor = .green() dataSourceLinePlot.dataLineStyle = lineStyle } dataSourceLinePlot.dataSource = self - newGraph.addPlot(dataSourceLinePlot) + newGraph.add(dataSourceLinePlot) self.graph = newGraph } @@ -87,19 +87,18 @@ class DateController : NSObject, CPTPlotDataSource { // MARK: - Plot Data Source Methods - func numberOfRecordsForPlot(plot: CPTPlot) -> UInt - { + func numberOfRecords(for plot: CPTPlot) -> UInt { return UInt(self.plotData.count) } - func numberForPlot(plot: CPTPlot, field: UInt, recordIndex: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? { switch CPTScatterPlotField(rawValue: Int(field))! { case .X: - return (oneDay * Double(recordIndex)) as NSNumber + return (oneDay * Double(record)) as NSNumber case .Y: - return self.plotData[Int(recordIndex)] as NSNumber + return self.plotData[Int(record)] as NSNumber } } } diff --git a/examples/DatePlot/Source/main.swift b/examples/DatePlot/Source/main.swift deleted file mode 100644 index f43c39451..000000000 --- a/examples/DatePlot/Source/main.swift +++ /dev/null @@ -1,3 +0,0 @@ -import Cocoa - -NSApplicationMain(Process.argc, Process.unsafeArgv) From dadb011a7a4e2e02cdd792dc1e3a208b372e586e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 21 Jun 2016 20:33:38 -0400 Subject: [PATCH 232/429] =?UTF-8?q?Constrain=20angles=20to=200...2=CF=80?= =?UTF-8?q?=20when=20drawing=20pie=20charts.=20Fixed=20issue=20#287.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/Source/CPTPieChart.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 72e7669c5..b63f7c6a6 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -724,7 +724,7 @@ -(CGFloat)radiansForPieSliceValue:(CGFloat)pieSliceValue angle += pieSliceValue * pieRange; break; } - return angle; + return fmod(angle, 2.0 * M_PI); } -(void)addSliceToPath:(nonnull CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle From 8fe361e1a6a523abd0b25d3c5978232fbc4e42d4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 15 Jul 2016 12:53:48 -0400 Subject: [PATCH 233/429] Fixed another Swift 3 change in the DatePlot example app. --- examples/DatePlot/Source/DateController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 43a4e0358..db2f80006 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -44,7 +44,7 @@ class DateController : NSObject, CPTPlotDataSource { x.orthogonalPosition = 2.0 x.minorTicksPerInterval = 0; let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .shortStyle + dateFormatter.dateStyle = .short let timeFormatter = CPTTimeFormatter(dateFormatter:dateFormatter) timeFormatter.referenceDate = refDate; x.labelFormatter = timeFormatter; From dcf3ef2475369c3e8059543a690553fd11984e6c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 15 Jul 2016 17:11:15 -0400 Subject: [PATCH 234/429] Layer and animation delegate protocols now inherit from CALayerDelegate and CAAnimationDelegate when available. Fixed some new compiler warnings from Xcode 8 beta 2. Fixed issue #290. --- documentation/doxygen/doxygen-cocoa-tags.xml | 45 ++++++++++++++++++ .../doxygen/doxygen-cocoa-touch-tags.xml | 47 ++++++++++++++++++- .../Classes/CPTTestApp_iPadViewController.h | 5 +- .../Classes/PieChartController.swift | 4 +- .../Classes/ScatterPlotController.swift | 4 +- .../Source/SelectionDemoController.h | 4 +- .../CorePlotGallery/src/plots/DonutChart.h | 1 + .../Classes/APYahooDataPullerGraph.m | 10 ---- .../Classes/APYahooDataPullerGraph.xib | 16 +++---- .../StockPlot/Classes/RootViewController.m | 5 -- examples/StockPlot/Launch Screen.xib | 11 +++-- examples/StockPlot/MainWindow.xib | 8 ++-- examples/StockPlot/RootViewController.xib | 8 ++-- framework/Source/CPTAnimation.h | 10 ++++ framework/Source/CPTAxis.h | 2 +- framework/Source/CPTAxis.m | 8 ++-- framework/Source/CPTBarPlot.m | 4 +- framework/Source/CPTLayer.h | 17 +++++++ framework/Source/CPTLegend.h | 2 +- framework/Source/CPTLegend.m | 4 +- framework/Source/CPTPieChart.m | 4 +- framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 4 +- framework/Source/CPTPlotArea.h | 2 +- framework/Source/CPTPlotArea.m | 4 +- framework/Source/CPTRangePlot.m | 4 +- framework/Source/CPTScatterPlot.m | 6 +-- framework/Source/CPTTradingRangePlot.m | 4 +- 28 files changed, 178 insertions(+), 67 deletions(-) diff --git a/documentation/doxygen/doxygen-cocoa-tags.xml b/documentation/doxygen/doxygen-cocoa-tags.xml index e004861d2..1578dd526 100644 --- a/documentation/doxygen/doxygen-cocoa-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-tags.xml @@ -758,6 +758,21 @@ + + CAAnimationDelegate + https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAAnimationDelegate_protocol/Introduction/Introduction.html/ + NSObject-p + + void + animationDidStart: + //apple_ref/occ/intfcm/CAAnimationDelegate/animationDidStart + + + void + animationDidStop:finished: + //apple_ref/occ/intfcm/CAAnimationDelegate/animationDidStopfinished + + CALayer https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html @@ -860,6 +875,36 @@ //apple_ref/occ/instm/CALayer/setNeedsLayout + + CALayerDelegate + https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayerDelegate_protocol/Introduction/Introduction.html/ + NSObject-p + + id + actionForLayer:forKey: + //apple_ref/occ/intfcm/CALayerDelegate/actionForLayerforKey + + + void + displayLayer: + //apple_ref/occ/intfcm/CALayerDelegate/displayLayer + + + void + drawLayer:inContext: + //apple_ref/occ/intfcm/CALayerDelegate/drawLayerinContext + + + void + layerWillDraw: + //apple_ref/occ/intfcm/CALayerDelegate/layerWillDraw + + + void + layoutSublayersOfLayer: + //apple_ref/occ/intfcm/CALayerDelegate/layoutSublayersOfLayer + + CAMediaTiming https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CAMediaTiming_protocol/Introduction/Introduction.html diff --git a/documentation/doxygen/doxygen-cocoa-touch-tags.xml b/documentation/doxygen/doxygen-cocoa-touch-tags.xml index 92439a53f..1de3c13d3 100644 --- a/documentation/doxygen/doxygen-cocoa-touch-tags.xml +++ b/documentation/doxygen/doxygen-cocoa-touch-tags.xml @@ -687,6 +687,21 @@ + + CAAnimationDelegate + https://developer.apple.com/library/ios/documentation/Foundation/Reference/CAAnimationDelegate_Protocol_Ref/ + NSObject-p + + void + animationDidStart: + //apple_ref/occ/intfcm/CAAnimationDelegate/animationDidStart + + + void + animationDidStop:finished: + //apple_ref/occ/intfcm/CAAnimationDelegate/animationDidStopfinished + + CALayer https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html @@ -788,6 +803,36 @@ //apple_ref/occ/instm/CALayer/setNeedsLayout + + CALayerDelegate + https://developer.apple.com/library/ios/documentation/Foundation/Reference/CALayerDelegate_Protocol_Ref/ + NSObject-p + + id + actionForLayer:forKey: + //apple_ref/occ/intfcm/CALayerDelegate/actionForLayerforKey + + + void + displayLayer: + //apple_ref/occ/intfcm/CALayerDelegate/displayLayer + + + void + drawLayer:inContext: + //apple_ref/occ/intfcm/CALayerDelegate/drawLayerinContext + + + void + layerWillDraw: + //apple_ref/occ/intfcm/CALayerDelegate/layerWillDraw + + + void + layoutSublayersOfLayer: + //apple_ref/occ/intfcm/CALayerDelegate/layoutSublayersOfLayer + + CAMediaTiming https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CAMediaTiming_protocol/Introduction/Introduction.html @@ -954,4 +999,4 @@ //apple_ref/c/tdef/NSZone - \ No newline at end of file + diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h index 1b24934bd..120d9fbf3 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.h @@ -8,7 +8,10 @@ #import "CorePlot-CocoaTouch.h" #import -@interface CPTTestApp_iPadViewController : UIViewController +@interface CPTTestApp_iPadViewController : UIViewController @property (nonatomic, readwrite, strong, nonnull) CPTNumberArray *dataForChart; @property (nonatomic, readwrite, strong, nonnull) NSArray *dataForPlot; diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 46f4a4466..9ab4d4754 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -1,6 +1,6 @@ import UIKit -class PieChartController : UIViewController, CPTPieChartDataSource { +class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartDelegate { private var pieGraph : CPTXYGraph? = nil let dataForChart = [20.0, 30.0, 60.0] @@ -96,7 +96,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource { // MARK: - Delegate Methods - func pieChart(plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) + private func pieChart(plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) { self.pieGraph?.title = "Selected index: \(recordIndex)" } diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 94ce8e4bc..1e4df0fd2 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -1,6 +1,6 @@ import UIKit -class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { +class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxisDelegate { private var scatterGraph : CPTXYGraph? = nil typealias plotDataType = [CPTScatterPlotField : Double] @@ -151,7 +151,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource { // MARK: - Axis Delegate Methods - func axis(axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool + private func axis(axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool { if let formatter = axis.labelFormatter { let labelOffset = axis.labelOffset diff --git a/examples/CPTTestApp/Source/SelectionDemoController.h b/examples/CPTTestApp/Source/SelectionDemoController.h index d4e3be7dc..a94d0e322 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.h +++ b/examples/CPTTestApp/Source/SelectionDemoController.h @@ -1,6 +1,8 @@ #import #import -@interface SelectionDemoController : NSObject +@interface SelectionDemoController : NSObject @end diff --git a/examples/CorePlotGallery/src/plots/DonutChart.h b/examples/CorePlotGallery/src/plots/DonutChart.h index ad7f4823e..bab4de00a 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.h +++ b/examples/CorePlotGallery/src/plots/DonutChart.h @@ -2,6 +2,7 @@ @interface DonutChart : PlotItem @end diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.m b/examples/StockPlot/Classes/APYahooDataPullerGraph.m index 3b056904d..8e3204d7d 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.m +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.m @@ -93,16 +93,6 @@ -(void)viewDidLoad [self reloadData]; } --(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration -{ - // NSLog(@"willRotateToInterfaceOrientation"); -} - --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - // NSLog(@"didRotateFromInterfaceOrientation"); -} - -(void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. diff --git a/examples/StockPlot/Classes/APYahooDataPullerGraph.xib b/examples/StockPlot/Classes/APYahooDataPullerGraph.xib index 979259557..5004be323 100644 --- a/examples/StockPlot/Classes/APYahooDataPullerGraph.xib +++ b/examples/StockPlot/Classes/APYahooDataPullerGraph.xib @@ -1,8 +1,9 @@ - + - + + @@ -13,17 +14,14 @@ - + - - - - + - + @@ -32,7 +30,7 @@ - + diff --git a/examples/StockPlot/Classes/RootViewController.m b/examples/StockPlot/Classes/RootViewController.m index 7e5dace94..f36fd6fc4 100644 --- a/examples/StockPlot/Classes/RootViewController.m +++ b/examples/StockPlot/Classes/RootViewController.m @@ -179,11 +179,6 @@ -(UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndex return cell; } --(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation -{ - self.graph.view.frame = self.view.bounds; -} - #pragma mark - #pragma mark accessors diff --git a/examples/StockPlot/Launch Screen.xib b/examples/StockPlot/Launch Screen.xib index a4454db08..3548d2299 100644 --- a/examples/StockPlot/Launch Screen.xib +++ b/examples/StockPlot/Launch Screen.xib @@ -1,24 +1,25 @@ - + - + + + - + - + diff --git a/examples/StockPlot/MainWindow.xib b/examples/StockPlot/MainWindow.xib index ddc52b78a..c2a6c8cb1 100644 --- a/examples/StockPlot/MainWindow.xib +++ b/examples/StockPlot/MainWindow.xib @@ -1,7 +1,9 @@ - + - + + + @@ -19,7 +21,7 @@ - + diff --git a/examples/StockPlot/RootViewController.xib b/examples/StockPlot/RootViewController.xib index 046950821..e1e5f9e24 100644 --- a/examples/StockPlot/RootViewController.xib +++ b/examples/StockPlot/RootViewController.xib @@ -1,7 +1,9 @@ - + - + + + @@ -14,7 +16,7 @@ - + diff --git a/framework/Source/CPTAnimation.h b/framework/Source/CPTAnimation.h index 1802cde6c..3ed23488e 100644 --- a/framework/Source/CPTAnimation.h +++ b/framework/Source/CPTAnimation.h @@ -1,3 +1,5 @@ +#import + @class CPTAnimationOperation; @class CPTAnimationPeriod; @@ -39,10 +41,18 @@ typedef NS_ENUM (NSInteger, CPTAnimationCurve) { CPTAnimationCurveQuinticInOut ///< Quintic in and out animation curve. }; +#pragma mark - + /** * @brief Animation delegate. **/ +#if ( ( TARGET_OS_SIMULATOR || TARGET_OS_IPHONE || TARGET_OS_TV) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 ) ) \ + || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 ) ) +// CAAnimationDelegate is defined by Core Animation in iOS 10.0+, macOS 10.12+, and tvOS 10.0+ +@protocol CPTAnimationDelegate +#else @protocol CPTAnimationDelegate +#endif @optional diff --git a/framework/Source/CPTAxis.h b/framework/Source/CPTAxis.h index 2bde6b4ed..65bec6a8a 100644 --- a/framework/Source/CPTAxis.h +++ b/framework/Source/CPTAxis.h @@ -44,7 +44,7 @@ typedef NSMutableArray<__kindof CPTAxis *> CPTMutableAxisArray; /** * @brief Axis labeling delegate. **/ -@protocol CPTAxisDelegate +@protocol CPTAxisDelegate @optional diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index d91deca53..a3c619a3e 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -1548,7 +1548,7 @@ -(void)updateAxisLabelsAtLocations:(nullable CPTNumberSet *)locations inRange:(n BOOL theLabelFormatterChanged; CPTShadow *theShadow; - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( useMajorAxisLabels ) { if ( locations.count > 0 ) { @@ -1732,7 +1732,7 @@ -(void)relabel if ( !self.plotSpace ) { return; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(axisShouldRelabel:)] && ![theDelegate axisShouldRelabel:self] ) { self.needsRelabel = NO; return; @@ -2072,7 +2072,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; // Tick labels if ( [theDelegate respondsToSelector:@selector(axis:labelTouchDown:)] || @@ -2183,7 +2183,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; // Tick labels if ( [theDelegate respondsToSelector:@selector(axis:labelTouchUp:)] || diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 06bed146e..ba07e3288 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -1397,7 +1397,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(barPlot:barTouchDownAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(barPlot:barTouchDownAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(barPlot:barWasSelectedAtRecordIndex:)] || @@ -1466,7 +1466,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(barPlot:barTouchUpAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(barPlot:barTouchUpAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(barPlot:barWasSelectedAtRecordIndex:)] || diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index ec2381a44..52ddc6df6 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -37,6 +37,23 @@ typedef NSSet CPTSublayerSet; **/ typedef NSMutableSet CPTMutableSublayerSet; +#pragma mark - + +/** + * @brief Layer delegate. + **/ +#if ( ( TARGET_OS_SIMULATOR || TARGET_OS_IPHONE || TARGET_OS_TV) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 ) ) \ + || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 ) ) +// CALayerDelegate is defined by Core Animation in iOS 10.0+, macOS 10.12+, and tvOS 10.0+ +@protocol CPTLayerDelegate +#else +@protocol CPTLayerDelegate +#endif + +@end + +#pragma mark - + @interface CPTLayer : CALayer /// @name Graph diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index a15240eac..e339e94c5 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -41,7 +41,7 @@ typedef NS_ENUM (NSInteger, CPTLegendSwatchLayout) { /** * @brief Legend delegate. **/ -@protocol CPTLegendDelegate +@protocol CPTLegendDelegate @optional diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index a55c030c7..20eb78cf6 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -1206,7 +1206,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:touchDownAtIndex:)] || [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:touchDownAtIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:wasSelectedAtIndex:)] || @@ -1277,7 +1277,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:touchUpAtIndex:)] || [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:touchUpAtIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(legend:legendEntryForPlot:wasSelectedAtIndex:)] || diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index b63f7c6a6..c1e587b13 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -1095,7 +1095,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(pieChart:sliceTouchDownAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(pieChart:sliceTouchDownAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(pieChart:sliceWasSelectedAtRecordIndex:)] || @@ -1164,7 +1164,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(pieChart:sliceTouchUpAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(pieChart:sliceTouchUpAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(pieChart:sliceWasSelectedAtRecordIndex:)] || diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index e9d2833f8..d7c68f00d 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -162,7 +162,7 @@ typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; /** * @brief Plot delegate. **/ -@protocol CPTPlotDelegate +@protocol CPTPlotDelegate @optional diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 7df92b6df..98b912041 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -1895,7 +1895,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(plot:dataLabelTouchDownAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelTouchDownAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || @@ -1973,7 +1973,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(plot:dataLabelTouchUpAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelTouchUpAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(plot:dataLabelWasSelectedAtRecordIndex:)] || diff --git a/framework/Source/CPTPlotArea.h b/framework/Source/CPTPlotArea.h index b606caa2c..1d29c5f78 100644 --- a/framework/Source/CPTPlotArea.h +++ b/framework/Source/CPTPlotArea.h @@ -14,7 +14,7 @@ /** * @brief Plot area delegate. **/ -@protocol CPTPlotAreaDelegate +@protocol CPTPlotAreaDelegate @optional diff --git a/framework/Source/CPTPlotArea.m b/framework/Source/CPTPlotArea.m index 216ca4152..7263da862 100644 --- a/framework/Source/CPTPlotArea.m +++ b/framework/Source/CPTPlotArea.m @@ -702,7 +702,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(plotAreaTouchDown:)] || [theDelegate respondsToSelector:@selector(plotAreaTouchDown:withEvent:)] || [theDelegate respondsToSelector:@selector(plotAreaWasSelected:)] || @@ -756,7 +756,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in CGPoint lastPoint = self.touchedPoint; self.touchedPoint = CPTPointMake(NAN, NAN); - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(plotAreaTouchUp:)] || [theDelegate respondsToSelector:@selector(plotAreaTouchUp:withEvent:)] || [theDelegate respondsToSelector:@selector(plotAreaWasSelected:)] || diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 95ee7a8ac..9b1d7483e 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -1133,7 +1133,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(rangePlot:rangeTouchDownAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(rangePlot:rangeTouchDownAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(rangePlot:rangeWasSelectedAtRecordIndex:)] || @@ -1202,7 +1202,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(rangePlot:rangeTouchUpAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(rangePlot:rangeTouchUpAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(rangePlot:rangeWasSelectedAtRecordIndex:)] || diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index 6ab1d51a2..eb9757bcc 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -915,7 +915,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context CGPathRef dataLinePath = [self newDataLinePathForViewPoints:viewPoints indexRange:viewIndexRange baselineYValue:CPTNAN]; // Give the delegate a chance to prepare for the drawing. - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(scatterPlot:prepareForDrawingPlotLine:inContext:)] ) { [theDelegate scatterPlot:self prepareForDrawingPlotLine:dataLinePath inContext:context]; } @@ -1913,7 +1913,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; BOOL symbolTouchUpHandled = NO; if ( [theDelegate respondsToSelector:@selector(scatterPlot:plotSymbolTouchDownAtRecordIndex:)] || @@ -2030,7 +2030,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; BOOL symbolSelectHandled = NO; if ( [theDelegate respondsToSelector:@selector(scatterPlot:plotSymbolTouchUpAtRecordIndex:)] || diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 99085ddcc..0326f1d57 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -1519,7 +1519,7 @@ -(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint) return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(tradingRangePlot:barTouchDownAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(tradingRangePlot:barTouchDownAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(tradingRangePlot:barWasSelectedAtRecordIndex:)] || @@ -1588,7 +1588,7 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in return NO; } - id theDelegate = self.delegate; + id theDelegate = (id)self.delegate; if ( [theDelegate respondsToSelector:@selector(tradingRangePlot:barTouchUpAtRecordIndex:)] || [theDelegate respondsToSelector:@selector(tradingRangePlot:barTouchUpAtRecordIndex:withEvent:)] || [theDelegate respondsToSelector:@selector(tradingRangePlot:barWasSelectedAtRecordIndex:)] || From fe93e08aee3a1abba3ea22afa5481f4a9db36b03 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 7 Aug 2016 20:41:47 -0400 Subject: [PATCH 235/429] Updated the Swift example apps with Swift 3.0 changes in Xcode 8 beta 4. --- .../CPTTestApp-iPhone.xcodeproj/project.pbxproj | 7 +++++++ .../CPTTestApp-iPhone/Classes/BarChartController.swift | 4 ++-- .../CPTTestApp-iPhone/Classes/PieChartController.swift | 4 ++-- .../CPTTestApp-iPhone/Classes/ScatterPlotController.swift | 2 +- examples/DatePlot/DatePlot.xcodeproj/project.pbxproj | 7 +++++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 4c96c7238..48555a5cd 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -249,6 +249,11 @@ attributes = { LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0800; + TargetAttributes = { + 1D6058900D05DD3D006BFB54 = { + LastSwiftMigration = 0800; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "CPTTestApp-iPhone" */; compatibilityVersion = "Xcode 6.3"; @@ -394,6 +399,7 @@ PRODUCT_NAME = "CPTTestApp-iPhone"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; + SWIFT_VERSION = 3.0; USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; }; name = Debug; @@ -422,6 +428,7 @@ "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SWIFT_OBJC_BRIDGING_HEADER = "CPTTestApp-iPhone-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; USER_HEADER_SEARCH_PATHS = "\"${PROJECT_DIR}/../../framework\"/**"; }; name = Release; diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 7aadad198..e20fddb5f 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -49,8 +49,8 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { let titleRange1 = NSRange(location: 0, length: lineOne.utf16.count) let titleRange2 = NSRange(location: lineOne.utf16.count + 1, length: lineTwo.utf16.count) - graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.white(), range:titleRange1) - graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.gray(), range:titleRange2) + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.white, range:titleRange1) + graphTitle.addAttribute(NSForegroundColorAttributeName, value:UIColor.gray, range:titleRange2) graphTitle.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSRange(location: 0, length: graphTitle.length)) graphTitle.addAttribute(NSFontAttributeName, value:line1Font!, range:titleRange1) graphTitle.addAttribute(NSFontAttributeName, value:line2Font!, range:titleRange2) diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 9ab4d4754..016f0fa1c 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -83,7 +83,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD return label } - func radialOffsetForPieChart(piePlot: CPTPieChart, recordIndex: UInt) -> CGFloat + func radialOffset(for piePlot: CPTPieChart, record recordIndex: UInt) -> CGFloat { var offset: CGFloat = 0.0 @@ -96,7 +96,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD // MARK: - Delegate Methods - private func pieChart(plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) + private func pieChart(_ plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) { self.pieGraph?.title = "Selected index: \(recordIndex)" } diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 1e4df0fd2..90b173754 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -151,7 +151,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi // MARK: - Axis Delegate Methods - private func axis(axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool + private func axis(_ axis: CPTAxis, shouldUpdateAxisLabelsAtLocations locations: NSSet!) -> Bool { if let formatter = axis.labelFormatter { let labelOffset = axis.labelOffset diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index 99d8c4cd2..d57d8fa79 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -262,6 +262,11 @@ BuildIndependentTargetsInParallel = NO; LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0800; + TargetAttributes = { + 8D1107260486CEB800E47090 = { + LastSwiftMigration = 0800; + }; + }; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "DatePlot" */; compatibilityVersion = "Xcode 6.3"; @@ -416,6 +421,7 @@ PRODUCT_NAME = DatePlot; SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -440,6 +446,7 @@ PRODUCT_NAME = DatePlot; SWIFT_OBJC_BRIDGING_HEADER = "DatePlot-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; }; name = Release; }; From 1c0c68b0a094a219455f02771f1c39990f439305 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 13 Aug 2016 22:03:13 -0400 Subject: [PATCH 236/429] Fixed a compiler warning for 32-bit builds. --- framework/Source/CPTPieChart.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index c1e587b13..3487c03b6 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -724,7 +724,7 @@ -(CGFloat)radiansForPieSliceValue:(CGFloat)pieSliceValue angle += pieSliceValue * pieRange; break; } - return fmod(angle, 2.0 * M_PI); + return fmod( angle, CPTFloat(2.0 * M_PI) ); } -(void)addSliceToPath:(nonnull CGMutablePathRef)slicePath centerPoint:(CGPoint)center startingAngle:(CGFloat)startingAngle finishingAngle:(CGFloat)finishingAngle From 58d45d5bef84f2d93ee163fb0890b95b273eeeaf Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 15 Aug 2016 20:20:12 -0400 Subject: [PATCH 237/429] Fixed compiler warnings for 32-bit builds in the unit tests. --- framework/Source/CPTAxisLabelTests.m | 2 +- framework/Source/CPTDataSourceTestCase.m | 2 +- framework/Source/CPTLayerTests.m | 6 +++--- framework/Source/CPTXYPlotSpaceTests.m | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/Source/CPTAxisLabelTests.m b/framework/Source/CPTAxisLabelTests.m index 22bf84e9a..eee894a7f 100644 --- a/framework/Source/CPTAxisLabelTests.m +++ b/framework/Source/CPTAxisLabelTests.m @@ -6,7 +6,7 @@ #import "CPTUtilities.h" #import -static const double precision = 1.0e-6; +static const CGFloat precision = CPTFloat(1.0e-6); @implementation CPTAxisLabelTests diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index ce5a50380..333df3157 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -122,7 +122,7 @@ -(nullable CPTNumberArray *)numbersForPlot:(nonnull CPTPlot *)plot XCTAssertTrue([[self plots] containsObject:plot], @"Plot missing"); CPTMutableNumberArray *shiftedResult = [NSMutableArray arrayWithCapacity:result.count]; for ( NSDecimalNumber *d in result ) { - [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromDouble( CPTDataSourceTestCasePlotOffset * ([self.plots indexOfObject:plot] + 1) )]]]; + [shiftedResult addObject:[d decimalNumberByAdding:[NSDecimalNumber decimalNumberWithDecimal:CPTDecimalFromCGFloat( CPTDataSourceTestCasePlotOffset * ([self.plots indexOfObject:plot] + 1) )]]]; } result = shiftedResult; diff --git a/framework/Source/CPTLayerTests.m b/framework/Source/CPTLayerTests.m index ad279c43c..879fb87d6 100644 --- a/framework/Source/CPTLayerTests.m +++ b/framework/Source/CPTLayerTests.m @@ -4,7 +4,7 @@ #import "CPTUtilities.h" #import "NSNumberExtensions.h" -static const double precision = 1.0e-6; +static const CGFloat precision = CPTFloat(1.0e-6); @interface CPTLayerTests() @@ -152,10 +152,10 @@ -(void)testPositionsWithScale:(CGFloat)scale anchorPoint:(CGPoint)anchor expecte CGFloat expected = ( (NSNumber *)(expectedValues[i]) ).cgFloatValue; NSString *errMessage; - errMessage = [NSString stringWithFormat:@"pixelAlign at x = %g with scale %g and anchor %@", position, scale, CPTStringFromPoint(anchor)]; + errMessage = [NSString stringWithFormat:@"pixelAlign at x = %g with scale %g and anchor %@", (double)position, (double)scale, CPTStringFromPoint(anchor)]; XCTAssertEqualWithAccuracy(alignedPoint.x, expected, precision, @"%@", errMessage); - errMessage = [NSString stringWithFormat:@"pixelAlign at y = %g with scale %g and anchor %@", position, scale, CPTStringFromPoint(anchor)]; + errMessage = [NSString stringWithFormat:@"pixelAlign at y = %g with scale %g and anchor %@", (double)position, (double)scale, CPTStringFromPoint(anchor)]; XCTAssertEqualWithAccuracy(alignedPoint.y, expected, precision, @"%@", errMessage); } } diff --git a/framework/Source/CPTXYPlotSpaceTests.m b/framework/Source/CPTXYPlotSpaceTests.m index 1185faedf..8b0075245 100644 --- a/framework/Source/CPTXYPlotSpaceTests.m +++ b/framework/Source/CPTXYPlotSpaceTests.m @@ -465,7 +465,7 @@ -(void)testPlotPointArrayForViewPointLogModulus [plotSpace plotPointForPlotAreaViewPoint:viewPoint]; errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %@", plotPoint[CPTCoordinateX]]; - XCTAssertEqualWithAccuracy([plotPoint[CPTCoordinateX] doubleValue], CPTInverseLogModulus(1.0), CPTFloat(0.01), @"%@", errMessage); + XCTAssertEqualWithAccuracy([plotPoint[CPTCoordinateX] doubleValue], CPTInverseLogModulus(1.0), 0.01, @"%@", errMessage); errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %@", plotPoint[CPTCoordinateY]]; XCTAssertEqual([plotPoint[CPTCoordinateY] doubleValue], 0.0, @"%@", errMessage); } @@ -513,7 +513,7 @@ -(void)testDoublePrecisionPlotPointForViewPointLogModulus [plotSpace doublePrecisionPlotPoint:plotPoint numberOfCoordinates:2 forPlotAreaViewPoint:viewPoint]; errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateX] was %g", plotPoint[CPTCoordinateX]]; - XCTAssertEqualWithAccuracy(plotPoint[CPTCoordinateX], CPTInverseLogModulus(1.0), CPTFloat(0.01), @"%@", errMessage); + XCTAssertEqualWithAccuracy(plotPoint[CPTCoordinateX], CPTInverseLogModulus(1.0), 0.01, @"%@", errMessage); errMessage = [NSString stringWithFormat:@"plotPoint[CPTCoordinateY] was %g", plotPoint[CPTCoordinateY]]; XCTAssertEqual(plotPoint[CPTCoordinateY], 0.0, @"%@", errMessage); } From 4f033f06a14f46a50188d22609b1794493b261bc Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 15 Aug 2016 21:16:38 -0400 Subject: [PATCH 238/429] Updated the Swift example apps with Swift 3.0 changes in Xcode 8 beta 6. --- .../Classes/BarChartController.swift | 8 ++-- .../Classes/PieChartController.swift | 4 +- .../Classes/ScatterPlotController.swift | 37 ++++++++++--------- examples/DatePlot/Source/DateController.swift | 6 +-- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index e20fddb5f..b28098ff5 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -89,7 +89,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { for tickLocation in customTickLocations { let newLabel = CPTAxisLabel(text:xAxisLabels[labelLocation], textStyle:x.labelTextStyle) labelLocation += 1 - newLabel.tickLocation = tickLocation + newLabel.tickLocation = NSNumber.init(value: tickLocation) newLabel.offset = x.labelOffset + x.majorTickLength newLabel.rotation = CGFloat(M_PI_4) customLabels.insert(newLabel) @@ -114,7 +114,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { barPlot1.baseValue = 0.0 barPlot1.dataSource = self barPlot1.barOffset = -0.2 - barPlot1.identifier = "Bar Plot 1" + barPlot1.identifier = NSString.init(string: "Bar Plot 1") newGraph.add(barPlot1, to:plotSpace) // Second bar plot @@ -123,7 +123,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { barPlot2.baseValue = 0.0 barPlot2.barOffset = 0.25 barPlot2.barCornerRadius = 2.0 - barPlot2.identifier = "Bar Plot 2" + barPlot2.identifier = NSString.init(string: "Bar Plot 2") newGraph.add(barPlot2, to:plotSpace) self.barGraph = newGraph @@ -136,7 +136,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { return 16 } - func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any? { switch CPTBarPlotField(rawValue: Int(field))! { case .barLocation: diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 016f0fa1c..50ece431a 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -36,7 +36,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD let piePlot = CPTPieChart(frame: .zero) piePlot.dataSource = self piePlot.pieRadius = 131.0 - piePlot.identifier = "Pie Chart 1" + piePlot.identifier = NSString.init(string: "Pie Chart 1") piePlot.startAngle = CGFloat(M_PI_4) piePlot.sliceDirection = .counterClockwise piePlot.centerAnchor = CGPoint(x: 0.5, y: 0.38) @@ -54,7 +54,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD return UInt(self.dataForChart.count) } - func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any? { if Int(record) > self.dataForChart.count { return nil diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 90b173754..5e1e6685f 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -64,7 +64,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi blueLineStyle.lineWidth = 3.0 blueLineStyle.lineColor = .blue() boundLinePlot.dataLineStyle = blueLineStyle - boundLinePlot.identifier = "Blue Plot" + boundLinePlot.identifier = NSString.init(string: "Blue Plot") boundLinePlot.dataSource = self newGraph.add(boundLinePlot) @@ -89,7 +89,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi greenLineStyle.lineColor = .green() greenLineStyle.dashPattern = [5.0, 5.0] dataSourceLinePlot.dataLineStyle = greenLineStyle - dataSourceLinePlot.identifier = "Green Plot" + dataSourceLinePlot.identifier = NSString.init(string: "Green Plot") dataSourceLinePlot.dataSource = self // Put an area gradient under the plot above @@ -131,7 +131,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi return UInt(self.dataForPlot.count) } - func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any? { let plotField = CPTScatterPlotField(rawValue: Int(field)) @@ -158,24 +158,25 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi var newLabels = Set() - for tickLocation in locations { - if let labelTextStyle = axis.labelTextStyle?.mutableCopy() as? CPTMutableTextStyle { + if let labelTextStyle = axis.labelTextStyle?.mutableCopy() as? CPTMutableTextStyle { + for location in locations { + if let tickLocation = location as? NSNumber { + if tickLocation.doubleValue >= 0.0 { + labelTextStyle.color = .green() + } + else { + labelTextStyle.color = .red() + } - if tickLocation.doubleValue >= 0.0 { - labelTextStyle.color = .green() - } - else { - labelTextStyle.color = .red() - } + let labelString = formatter.string(for:tickLocation) + let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) - let labelString = formatter.string(for:tickLocation) - let newLabelLayer = CPTTextLayer(text: labelString, style: labelTextStyle) + let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) + newLabel.tickLocation = tickLocation + newLabel.offset = labelOffset - let newLabel = CPTAxisLabel(contentLayer: newLabelLayer) - newLabel.tickLocation = tickLocation as! NSNumber - newLabel.offset = labelOffset - - newLabels.insert(newLabel) + newLabels.insert(newLabel) + } } axis.axisLabels = newLabels diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index db2f80006..b71accfc2 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -34,13 +34,13 @@ class DateController : NSObject, CPTPlotDataSource { // Setup scatter plot space let plotSpace = newGraph.defaultPlotSpace as! CPTXYPlotSpace - plotSpace.xRange = CPTPlotRange(location:0.0, length:oneDay * 5.0) + plotSpace.xRange = CPTPlotRange(location:0.0, length:NSNumber.init(value: oneDay * 5.0)) plotSpace.yRange = CPTPlotRange(location:1.0, length:3.0) // Axes let axisSet = newGraph.axisSet as! CPTXYAxisSet if let x = axisSet.xAxis { - x.majorIntervalLength = oneDay + x.majorIntervalLength = NSNumber.init(value: oneDay) x.orthogonalPosition = 2.0 x.minorTicksPerInterval = 0; let dateFormatter = DateFormatter() @@ -91,7 +91,7 @@ class DateController : NSObject, CPTPlotDataSource { return UInt(self.plotData.count) } - func number(for plot: CPTPlot, field: UInt, record: UInt) -> AnyObject? + func number(for plot: CPTPlot, field: UInt, record: UInt) -> Any? { switch CPTScatterPlotField(rawValue: Int(field))! { case .X: From 300fe0a175974b221baaab76d5f81a2699ceae3f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 17 Aug 2016 20:00:22 -0400 Subject: [PATCH 239/429] Updated the Swift example apps with Swift 3.0 changes in Xcode 8 beta 6. --- examples/DatePlot/Source/DateController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index b71accfc2..406ef3aa0 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -53,14 +53,14 @@ class DateController : NSObject, CPTPlotDataSource { if let y = axisSet.yAxis { y.majorIntervalLength = 0.5 y.minorTicksPerInterval = 5 - y.orthogonalPosition = oneDay + y.orthogonalPosition = NSNumber.init(value: oneDay) y.labelingPolicy = .none } // Create a plot that uses the data source method let dataSourceLinePlot = CPTScatterPlot(frame: .zero) - dataSourceLinePlot.identifier = "Date Plot" + dataSourceLinePlot.identifier = NSString.init(string: "Date Plot") if let lineStyle = dataSourceLinePlot.dataLineStyle?.mutableCopy() as? CPTMutableLineStyle { lineStyle.lineWidth = 3.0 From b425fb766bdd7aba3771873feca3ae9a1b64ddf1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 17 Aug 2016 20:02:34 -0400 Subject: [PATCH 240/429] Added swift function names to eliminate Swift 3 name collisions. --- framework/Source/CPTPlot.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index d7c68f00d..97115caa2 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -327,8 +327,10 @@ typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; -(void)reloadDataInIndexRange:(NSRange)indexRange; -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRecords; -(void)deleteDataInIndexRange:(NSRange)indexRange; --(void)reloadPlotData; --(void)reloadPlotDataInIndexRange:(NSRange)indexRange; +-(void)reloadPlotData NS_SWIFT_NAME( CPTPlot.reloadPlotData() ); + +-(void)reloadPlotDataInIndexRange:(NSRange)indexRange NS_SWIFT_NAME( CPTPlot.reloadPlotData(inIndexRange:) ); + /// @} /// @name Plot Data From ec1759ef3d1d00220055e1d6af1e75d9de40b0a5 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 18 Aug 2016 20:35:42 -0400 Subject: [PATCH 241/429] Added typedefs for arrays and sets of CPTLayer objects. --- framework/Source/CPTLayer.h | 21 +++++++++++++++++++++ framework/Source/CPTPlot.h | 2 +- framework/Source/CPTPlot.m | 16 ++++++++-------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 52ddc6df6..5f137fe6c 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -5,6 +5,7 @@ /// @file @class CPTGraph; +@class CPTLayer; @class CPTShadow; /// @name Layout @@ -17,6 +18,26 @@ extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; /// @} +/** + * @brief An array of CPTLayer objects. + **/ +typedef NSArray CPTLayerArray; + +/** + * @brief A mutable array of CPTLayer objects. + **/ +typedef NSMutableArray CPTMutableLayerArray; + +/** + * @brief A set of CPTLayer objects. + **/ +typedef NSSet CPTLayerSet; + +/** + * @brief A mutable set of CPTLayer objects. + **/ +typedef NSMutableSet CPTMutableLayerSet; + /** * @brief An array of CALayer objects. **/ diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 97115caa2..30347acb6 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -139,7 +139,7 @@ typedef NSMutableArray<__kindof CPTPlot *> CPTMutablePlotArray; * @param indexRange The range of the data indexes of interest. * @return An array of data labels. **/ --(nullable NSArray *)dataLabelsForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; +-(nullable CPTLayerArray *)dataLabelsForPlot:(nonnull CPTPlot *)plot recordIndexRange:(NSRange)indexRange; /** @brief @optional Gets a data label for the given plot. * This method will not be called if diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 98b912041..4fd091bed 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -56,7 +56,7 @@ @interface CPTPlot() @property (nonatomic, readwrite, assign) BOOL needsRelabel; @property (nonatomic, readwrite, assign) NSRange labelIndexRange; @property (nonatomic, readwrite, strong, nullable) CPTMutableAnnotationArray *labelAnnotations; -@property (nonatomic, readwrite, copy, nullable) NSArray *dataLabels; +@property (nonatomic, readwrite, copy, nullable) CPTLayerArray *dataLabels; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownLabelIndex; @property (nonatomic, readwrite, assign) NSUInteger cachedDataCount; @@ -709,9 +709,9 @@ -(void)reloadDataLabelsInIndexRange:(NSRange)indexRange atRecordIndex:indexRange.location]; } else if ( [theDataSource respondsToSelector:@selector(dataLabelForPlot:recordIndex:)] ) { - id nilObject = [CPTPlot nilData]; - NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; - NSUInteger maxIndex = NSMaxRange(indexRange); + id nilObject = [CPTPlot nilData]; + CPTMutableLayerArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { CPTLayer *labelLayer = [theDataSource dataLabelForPlot:self recordIndex:idx]; @@ -1599,8 +1599,8 @@ -(void)relabel NSFormatter *dataLabelFormatter = self.labelFormatter; BOOL plotProvidesLabels = dataLabelTextStyle && dataLabelFormatter; - BOOL hasCachedLabels = NO; - NSMutableArray *cachedLabels = (NSMutableArray *)[self cachedArrayForKey:CPTPlotBindingDataLabels]; + BOOL hasCachedLabels = NO; + CPTMutableLayerArray *cachedLabels = (CPTMutableLayerArray *)[self cachedArrayForKey:CPTPlotBindingDataLabels]; for ( CPTLayer *label in cachedLabels ) { if ( ![label isKindOfClass:nullClass] ) { hasCachedLabels = YES; @@ -2034,12 +2034,12 @@ -(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)in /// @cond --(nullable NSArray *)dataLabels +-(nullable CPTLayerArray *)dataLabels { return [self cachedArrayForKey:CPTPlotBindingDataLabels]; } --(void)setDataLabels:(nullable NSArray *)newDataLabels +-(void)setDataLabels:(nullable CPTLayerArray *)newDataLabels { [self cacheArray:newDataLabels forKey:CPTPlotBindingDataLabels]; [self setNeedsRelabel]; From b1470b1474162ae9a9b6928341a9cb14b096403a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 18 Aug 2016 20:39:18 -0400 Subject: [PATCH 242/429] Fixed missing data labels when adding and removing plot data. Fixed issue #293. --- framework/Source/CPTPlot.m | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 4fd091bed..f1e0d4892 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -628,6 +628,15 @@ -(void)insertDataAtIndex:(NSUInteger)idx numberOfRecords:(NSUInteger)numberOfRec } } + CPTMutableAnnotationArray *labelArray = self.labelAnnotations; + if ( labelArray ) { + id nullObject = [NSNull null]; + NSUInteger lastIndex = idx + numberOfRecords - 1; + for ( NSUInteger i = idx; i <= lastIndex; i++ ) { + [labelArray insertObject:nullObject atIndex:i]; + } + } + self.cachedDataCount += numberOfRecords; [self reloadDataInIndexRange:NSMakeRange(idx, numberOfRecords)]; } @@ -659,8 +668,20 @@ -(void)deleteDataInIndexRange:(NSRange)indexRange } } + CPTMutableAnnotationArray *labelArray = self.labelAnnotations; + + NSUInteger maxIndex = NSMaxRange(indexRange); + Class annotationClass = [CPTAnnotation class]; + + for ( NSUInteger i = indexRange.location; i < maxIndex; i++ ) { + CPTAnnotation *annotation = labelArray[i]; + if ( [annotation isKindOfClass:annotationClass] ) { + [self removeAnnotation:annotation]; + } + } + [labelArray removeObjectsInRange:indexRange]; + self.cachedDataCount -= indexRange.length; - [self relabelIndexRange:NSMakeRange(indexRange.location, self.cachedDataCount - indexRange.location)]; [self setNeedsDisplay]; } From 176573269744945e022b709a0aacb51cc39390a4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 19 Aug 2016 20:43:17 -0400 Subject: [PATCH 243/429] Added tvOS to the the page headers in the generated API documentation. --- documentation/doxygen/doxygen touch.config | 4 ++-- documentation/doxygen/doxygen.config | 2 +- framework/Source/mainpage.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 437d31484..847e7bb09 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "Core Plot (iOS)" +PROJECT_NAME = "Core Plot (iOS and tvOS)" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -44,7 +44,7 @@ PROJECT_NUMBER = # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "Cocoa plotting framework for Mac OS X and iOS" +PROJECT_BRIEF = "Cocoa plotting framework for Mac OS X, iOS, and tvOS" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index c96d56493..6653a4a8e 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -44,7 +44,7 @@ PROJECT_NUMBER = # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "Cocoa plotting framework for Mac OS X and iOS" +PROJECT_BRIEF = "Cocoa plotting framework for Mac OS X, iOS, and tvOS" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 diff --git a/framework/Source/mainpage.h b/framework/Source/mainpage.h index 417135609..402872198 100644 --- a/framework/Source/mainpage.h +++ b/framework/Source/mainpage.h @@ -2,7 +2,7 @@ * * @section intro Introduction * - * Core Plot is a 2D plotting framework for Mac OS X and iOS. + * Core Plot is a 2D Cocoa plotting framework for Mac OS X, iOS, and tvOS. * It is highly customizable and capable of drawing many types of plots. * See the Example Graphs * wiki page and the example applications From d3c48b08cf80af0e223f49843a2b2ad37cfdfce8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 19 Aug 2016 20:43:54 -0400 Subject: [PATCH 244/429] Ignore the NS_SWIFT_NAME() macro when generating documentation. --- documentation/doxygen/doxygen touch.config | 3 ++- documentation/doxygen/doxygen.config | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 847e7bb09..7b182c6ba 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2069,7 +2069,8 @@ PREDEFINED = TARGET_OS_IPHONE, \ "NS_DESIGNATED_INITIALIZER:='' ," \ "NS_RETURNS_INNER_POINTER:='' ," \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" + "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type ," \ + "NS_SWIFT_NAME(_name):=''" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 6653a4a8e..de141a6a6 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -2066,7 +2066,8 @@ INCLUDE_FILE_PATTERNS = PREDEFINED = "NS_DESIGNATED_INITIALIZER:='' ," \ "NS_RETURNS_INNER_POINTER:='' ," \ "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type" + "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type ," \ + "NS_SWIFT_NAME(_name):=''" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The From 08461c3b0e5995f2d2e30eb63d040d2a5dc119e2 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 21 Aug 2016 14:21:00 -0400 Subject: [PATCH 245/429] Added Swift name mappings for all string constants. --- documentation/changelog.markdown | 2 ++ documentation/doxygen/doxygen touch.config | 13 ++++++---- documentation/doxygen/doxygen.config | 13 ++++++---- .../Classes/BarChartController.swift | 2 +- .../Classes/PieChartController.swift | 2 +- .../Classes/ScatterPlotController.swift | 2 +- framework/Source/CPTBarPlot.h | 15 +++++++---- framework/Source/CPTBarPlot.m | 10 +++---- framework/Source/CPTDefinitions.h | 16 ++++++++++++ framework/Source/CPTExceptions.h | 13 +++++++--- framework/Source/CPTExceptions.m | 6 ++--- framework/Source/CPTGraph.h | 26 +++++++++++++------ framework/Source/CPTGraph.m | 8 +++--- framework/Source/CPTLayer.h | 7 ++++- framework/Source/CPTLayer.m | 2 +- framework/Source/CPTLegend.h | 11 +++++--- framework/Source/CPTLegend.m | 6 ++--- framework/Source/CPTPieChart.h | 11 +++++--- framework/Source/CPTPieChart.m | 6 ++--- framework/Source/CPTPlot.h | 7 ++++- framework/Source/CPTPlot.m | 2 +- framework/Source/CPTPlotSpace.h | 24 ++++++++++++----- framework/Source/CPTPlotSpace.m | 8 +++--- framework/Source/CPTRangePlot.h | 19 +++++++++----- framework/Source/CPTRangePlot.m | 14 +++++----- framework/Source/CPTScatterPlot.h | 11 +++++--- framework/Source/CPTScatterPlot.m | 6 ++--- framework/Source/CPTTheme.h | 21 ++++++++++----- framework/Source/CPTTheme.m | 4 +-- framework/Source/CPTTradingRangePlot.h | 25 +++++++++++------- framework/Source/CPTTradingRangePlot.m | 20 +++++++------- framework/Source/_CPTDarkGradientTheme.m | 2 +- framework/Source/_CPTPlainBlackTheme.m | 2 +- framework/Source/_CPTPlainWhiteTheme.m | 2 +- framework/Source/_CPTSlateTheme.m | 2 +- framework/Source/_CPTStocksTheme.m | 2 +- 36 files changed, 220 insertions(+), 122 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 3835463fe..4f8f4a975 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -6,6 +6,8 @@ To be determined. ## Details - **New**: Increased the iOS deployment target to iOS 8. +- **Changed**: Added Swift name mappings for all string constants. +- **Changed**: Updated all Swift example apps to Swift 3. - **Changed**: Miscellaneous bug fixes and cleanup. diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index 7b182c6ba..d18a23b42 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -2066,11 +2066,14 @@ INCLUDE_FILE_PATTERNS = PREDEFINED = TARGET_OS_IPHONE, \ TARGET_OS_TV, \ TARGET_OS_SIMULATOR, \ - "NS_DESIGNATED_INITIALIZER:='' ," \ - "NS_RETURNS_INNER_POINTER:='' ," \ - "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_SWIFT_NAME(_name):=''" + "NS_DESIGNATED_INITIALIZER:= " \ + "NS_RETURNS_INNER_POINTER:= " \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type " \ + "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type " \ + "NS_SWIFT_NAME(_name):= " \ + "cpt_deprecated:= " \ + "cpt_swift_enum:= " \ + "cpt_swift_struct:= " # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index de141a6a6..942b4ec35 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -2063,11 +2063,14 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = "NS_DESIGNATED_INITIALIZER:='' ," \ - "NS_RETURNS_INNER_POINTER:='' ," \ - "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type ," \ - "NS_SWIFT_NAME(_name):=''" +PREDEFINED = "NS_DESIGNATED_INITIALIZER:= " \ + "NS_RETURNS_INNER_POINTER:= " \ + "NS_ENUM(_type,_name):=enum _name : _type _name; enum _name : _type " \ + "NS_OPTIONS(_type,_name):=enum _name : _type _name; enum _name : _type " \ + "NS_SWIFT_NAME(_name):= " \ + "cpt_deprecated:= " \ + "cpt_swift_enum:= " \ + "cpt_swift_struct:= " # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index b28098ff5..d8ec6d36b 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -11,7 +11,7 @@ class BarChartController : UIViewController, CPTBarPlotDataSource { // Create graph from theme let newGraph = CPTXYGraph(frame: .zero) - newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) + newGraph.apply(CPTTheme(named: .darkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index 50ece431a..7ccb93a88 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -13,7 +13,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD // Create graph from theme let newGraph = CPTXYGraph(frame: .zero) - newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) + newGraph.apply(CPTTheme(named: .darkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index 5e1e6685f..2f41d6be9 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -14,7 +14,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi // Create graph from theme let newGraph = CPTXYGraph(frame: .zero) - newGraph.apply(CPTTheme(named: kCPTDarkGradientTheme)) + newGraph.apply(CPTTheme(named: .darkGradientTheme)) let hostingView = self.view as! CPTGraphHostingView hostingView.hostedGraph = newGraph diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index 307be7b0b..f44f7ad94 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -13,13 +13,18 @@ @class CPTTextLayer; @class CPTTextStyle; +/** + * @brief Bar plot bindings. + **/ +typedef NSString *CPTBarPlotBinding cpt_swift_struct; + /// @ingroup plotBindingsBarPlot /// @{ -extern NSString *__nonnull const CPTBarPlotBindingBarLocations; -extern NSString *__nonnull const CPTBarPlotBindingBarTips; -extern NSString *__nonnull const CPTBarPlotBindingBarBases; -extern NSString *__nonnull const CPTBarPlotBindingBarFills; -extern NSString *__nonnull const CPTBarPlotBindingBarLineStyles; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarLocations; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarTips; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarBases; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarFills; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarLineStyles; /// @} /** diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index ba07e3288..6bdaaf8a5 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -27,11 +27,11 @@ * @endif **/ -NSString *const CPTBarPlotBindingBarLocations = @"barLocations"; ///< Bar locations. -NSString *const CPTBarPlotBindingBarTips = @"barTips"; ///< Bar tips. -NSString *const CPTBarPlotBindingBarBases = @"barBases"; ///< Bar bases. -NSString *const CPTBarPlotBindingBarFills = @"barFills"; ///< Bar fills. -NSString *const CPTBarPlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. +CPTBarPlotBinding const CPTBarPlotBindingBarLocations = @"barLocations"; ///< Bar locations. +CPTBarPlotBinding const CPTBarPlotBindingBarTips = @"barTips"; ///< Bar tips. +CPTBarPlotBinding const CPTBarPlotBindingBarBases = @"barBases"; ///< Bar bases. +CPTBarPlotBinding const CPTBarPlotBindingBarFills = @"barFills"; ///< Bar fills. +CPTBarPlotBinding const CPTBarPlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. /// @cond @interface CPTBarPlot() diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 10787bdb7..7ca25c47b 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -42,6 +42,22 @@ #define cpt_deprecated __attribute__( (deprecated) ) +// Swift wrappers + +/** + * @def cpt_swift_enum + * @hideinitializer + * @brief Marks a type definition to be imported into Swift as an enumeration. + **/ +#define cpt_swift_enum __attribute__( ( swift_wrapper(enum) ) ) + +/** + * @def cpt_swift_struct + * @hideinitializer + * @brief Marks a type definition to be imported into Swift as a structure. + **/ +#define cpt_swift_struct __attribute__( ( swift_wrapper(struct) ) ) + // Type safety defines /** diff --git a/framework/Source/CPTExceptions.h b/framework/Source/CPTExceptions.h index d62def47a..67eed530c 100644 --- a/framework/Source/CPTExceptions.h +++ b/framework/Source/CPTExceptions.h @@ -1,8 +1,15 @@ /// @file +#import "CPTDefinitions.h" + +/** + * @brief Custom exception type. + **/ +typedef NSString *CPTExceptionType cpt_swift_struct; + /// @name Custom Exception Identifiers /// @{ -extern NSString *__nonnull const CPTException; -extern NSString *__nonnull const CPTDataException; -extern NSString *__nonnull const CPTNumericDataException; +extern CPTExceptionType __nonnull const CPTException; +extern CPTExceptionType __nonnull const CPTDataException; +extern CPTExceptionType __nonnull const CPTNumericDataException; /// @} diff --git a/framework/Source/CPTExceptions.m b/framework/Source/CPTExceptions.m index 349839242..efe533257 100644 --- a/framework/Source/CPTExceptions.m +++ b/framework/Source/CPTExceptions.m @@ -1,5 +1,5 @@ #import "CPTExceptions.h" -NSString *const CPTException = @"CPTException"; ///< General Core Plot exceptions. -NSString *const CPTDataException = @"CPTDataException"; ///< Core Plot data exceptions. -NSString *const CPTNumericDataException = @"CPTNumericDataException"; ///< Core Plot numeric data exceptions. +CPTExceptionType const CPTException = @"CPTException"; ///< General Core Plot exceptions. +CPTExceptionType const CPTDataException = @"CPTDataException"; ///< Core Plot data exceptions. +CPTExceptionType const CPTNumericDataException = @"CPTNumericDataException"; ///< Core Plot numeric data exceptions. diff --git a/framework/Source/CPTGraph.h b/framework/Source/CPTGraph.h index f6ac1f1c4..7c4c397ac 100644 --- a/framework/Source/CPTGraph.h +++ b/framework/Source/CPTGraph.h @@ -14,35 +14,45 @@ @class CPTTextStyle; @class CPTLayerAnnotation; +/** + * @brief Graph notification type. + **/ +typedef NSString *CPTGraphNotification cpt_swift_struct; + +/** + * @brief The userInfo dictionary keys used by CPTGraph plot space notifications. + **/ +typedef NSString *CPTGraphPlotSpaceKey cpt_swift_struct; + /// @name Graph /// @{ /** @brief Notification sent by various objects to tell the graph it should redraw itself. * @ingroup notification **/ -extern NSString *__nonnull const CPTGraphNeedsRedrawNotification; +extern CPTGraphNotification __nonnull const CPTGraphNeedsRedrawNotification NS_SWIFT_NAME(needsRedraw); /** @brief Notification sent by a graph after adding a new plot space. * @ingroup notification * * The notification userInfo dictionary will include the new plot space under the - * CPTGraphPlotSpaceNotificationKey key. + * #CPTGraphPlotSpaceNotificationKey key. **/ -extern NSString *__nonnull const CPTGraphDidAddPlotSpaceNotification; +extern CPTGraphNotification __nonnull const CPTGraphDidAddPlotSpaceNotification NS_SWIFT_NAME(didAddPlotSpace); /** @brief Notification sent by a graph after removing a plot space. * @ingroup notification * * The notification userInfo dictionary will include the removed plot space under the - * CPTGraphPlotSpaceNotificationKey key. + * #CPTGraphPlotSpaceNotificationKey key. **/ -extern NSString *__nonnull const CPTGraphDidRemovePlotSpaceNotification; +extern CPTGraphNotification __nonnull const CPTGraphDidRemovePlotSpaceNotification NS_SWIFT_NAME(didRemovePlotSpace); -/** @brief The userInfo dictionary key used by the CPTGraphDidAddPlotSpaceNotification - * and CPTGraphDidRemovePlotSpaceNotification notifications for the plot space. +/** @brief The userInfo dictionary key used by the #CPTGraphDidAddPlotSpaceNotification + * and #CPTGraphDidRemovePlotSpaceNotification notifications for the plot space. * @ingroup notification **/ -extern NSString *__nonnull const CPTGraphPlotSpaceNotificationKey; +extern CPTGraphPlotSpaceKey __nonnull const CPTGraphPlotSpaceNotificationKey; /// @} diff --git a/framework/Source/CPTGraph.m b/framework/Source/CPTGraph.m index ba591f216..13dd7ae08 100644 --- a/framework/Source/CPTGraph.m +++ b/framework/Source/CPTGraph.m @@ -22,10 +22,10 @@ * @ingroup animation **/ -NSString *const CPTGraphNeedsRedrawNotification = @"CPTGraphNeedsRedrawNotification"; -NSString *const CPTGraphDidAddPlotSpaceNotification = @"CPTGraphDidAddPlotSpaceNotification"; -NSString *const CPTGraphDidRemovePlotSpaceNotification = @"CPTGraphDidRemovePlotSpaceNotification"; -NSString *const CPTGraphPlotSpaceNotificationKey = @"CPTGraphPlotSpaceNotificationKey"; +CPTGraphNotification const CPTGraphNeedsRedrawNotification = @"CPTGraphNeedsRedrawNotification"; +CPTGraphNotification const CPTGraphDidAddPlotSpaceNotification = @"CPTGraphDidAddPlotSpaceNotification"; +CPTGraphNotification const CPTGraphDidRemovePlotSpaceNotification = @"CPTGraphDidRemovePlotSpaceNotification"; +CPTGraphPlotSpaceKey const CPTGraphPlotSpaceNotificationKey = @"CPTGraphPlotSpaceNotificationKey"; /// @cond @interface CPTGraph() diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 5f137fe6c..729623938 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -8,13 +8,18 @@ @class CPTLayer; @class CPTShadow; +/** + * @brief Layer notification type. + **/ +typedef NSString *CPTLayerNotification cpt_swift_struct; + /// @name Layout /// @{ /** @brief Notification sent by all layers when the layer @link CALayer::bounds bounds @endlink change. * @ingroup notification **/ -extern NSString *__nonnull const CPTLayerBoundsDidChangeNotification; +extern CPTLayerNotification __nonnull const CPTLayerBoundsDidChangeNotification NS_SWIFT_NAME(boundsDidChange); /// @} diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index be45a9adc..2141fb181 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -11,7 +11,7 @@ #import #import -NSString *const CPTLayerBoundsDidChangeNotification = @"CPTLayerBoundsDidChangeNotification"; +CPTLayerNotification const CPTLayerBoundsDidChangeNotification = @"CPTLayerBoundsDidChangeNotification"; /** @defgroup animation Animatable Properties * @brief Custom layer properties that can be animated using Core Animation. diff --git a/framework/Source/CPTLegend.h b/framework/Source/CPTLegend.h index e339e94c5..06c9bf942 100644 --- a/framework/Source/CPTLegend.h +++ b/framework/Source/CPTLegend.h @@ -8,23 +8,28 @@ @class CPTLineStyle; @class CPTTextStyle; +/** + * @brief Graph notification type. + **/ +typedef NSString *CPTLegendNotification cpt_swift_struct; + /// @name Legend /// @{ /** @brief Notification sent by plots to tell the legend it should redraw itself. * @ingroup notification **/ -extern NSString *__nonnull const CPTLegendNeedsRedrawForPlotNotification; +extern CPTLegendNotification __nonnull const CPTLegendNeedsRedrawForPlotNotification NS_SWIFT_NAME(needsRedrawForPlot); /** @brief Notification sent by plots to tell the legend it should update its layout and redraw itself. * @ingroup notification **/ -extern NSString *__nonnull const CPTLegendNeedsLayoutForPlotNotification; +extern CPTLegendNotification __nonnull const CPTLegendNeedsLayoutForPlotNotification NS_SWIFT_NAME(needsLayoutForPlot); /** @brief Notification sent by plots to tell the legend it should reload all legend entries. * @ingroup notification **/ -extern NSString *__nonnull const CPTLegendNeedsReloadEntriesForPlotNotification; +extern CPTLegendNotification __nonnull const CPTLegendNeedsReloadEntriesForPlotNotification NS_SWIFT_NAME(needsReloadEntriesForPlot); /// @} diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 20eb78cf6..351e6e2b0 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -20,9 +20,9 @@ * @ingroup animation **/ -NSString *const CPTLegendNeedsRedrawForPlotNotification = @"CPTLegendNeedsRedrawForPlotNotification"; -NSString *const CPTLegendNeedsLayoutForPlotNotification = @"CPTLegendNeedsLayoutForPlotNotification"; -NSString *const CPTLegendNeedsReloadEntriesForPlotNotification = @"CPTLegendNeedsReloadEntriesForPlotNotification"; +CPTLegendNotification const CPTLegendNeedsRedrawForPlotNotification = @"CPTLegendNeedsRedrawForPlotNotification"; +CPTLegendNotification const CPTLegendNeedsLayoutForPlotNotification = @"CPTLegendNeedsLayoutForPlotNotification"; +CPTLegendNotification const CPTLegendNeedsReloadEntriesForPlotNotification = @"CPTLegendNeedsReloadEntriesForPlotNotification"; /// @cond @interface CPTLegend() diff --git a/framework/Source/CPTPieChart.h b/framework/Source/CPTPieChart.h index 1ff0d9587..e7aeb6e25 100644 --- a/framework/Source/CPTPieChart.h +++ b/framework/Source/CPTPieChart.h @@ -9,11 +9,16 @@ @class CPTTextLayer; @class CPTLineStyle; +/** + * @brief Pie chart bindings. + **/ +typedef NSString *CPTPieChartBinding cpt_swift_struct; + /// @ingroup plotBindingsPieChart /// @{ -extern NSString *__nonnull const CPTPieChartBindingPieSliceWidthValues; -extern NSString *__nonnull const CPTPieChartBindingPieSliceFills; -extern NSString *__nonnull const CPTPieChartBindingPieSliceRadialOffsets; +extern CPTPieChartBinding __nonnull const CPTPieChartBindingPieSliceWidthValues; +extern CPTPieChartBinding __nonnull const CPTPieChartBindingPieSliceFills; +extern CPTPieChartBinding __nonnull const CPTPieChartBindingPieSliceRadialOffsets; /// @} /** diff --git a/framework/Source/CPTPieChart.m b/framework/Source/CPTPieChart.m index 3487c03b6..705bd2607 100644 --- a/framework/Source/CPTPieChart.m +++ b/framework/Source/CPTPieChart.m @@ -25,9 +25,9 @@ * @endif **/ -NSString *const CPTPieChartBindingPieSliceWidthValues = @"sliceWidths"; ///< Pie slice widths. -NSString *const CPTPieChartBindingPieSliceFills = @"sliceFills"; ///< Pie slice interior fills. -NSString *const CPTPieChartBindingPieSliceRadialOffsets = @"sliceRadialOffsets"; ///< Pie slice radial offsets. +CPTPieChartBinding const CPTPieChartBindingPieSliceWidthValues = @"sliceWidths"; ///< Pie slice widths. +CPTPieChartBinding const CPTPieChartBindingPieSliceFills = @"sliceFills"; ///< Pie slice interior fills. +CPTPieChartBinding const CPTPieChartBindingPieSliceRadialOffsets = @"sliceRadialOffsets"; ///< Pie slice radial offsets. /// @cond @interface CPTPieChart() diff --git a/framework/Source/CPTPlot.h b/framework/Source/CPTPlot.h index 30347acb6..5a5e87fc3 100644 --- a/framework/Source/CPTPlot.h +++ b/framework/Source/CPTPlot.h @@ -14,9 +14,14 @@ @class CPTPlotRange; @class CPTTextStyle; +/** + * @brief Plot bindings. + **/ +typedef NSString *CPTPlotBinding cpt_swift_struct; + /// @ingroup plotBindingsAllPlots /// @{ -extern NSString *__nonnull const CPTPlotBindingDataLabels; +extern CPTPlotBinding __nonnull const CPTPlotBindingDataLabels; /// @} /** diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index f1e0d4892..bb7afa5c7 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -45,7 +45,7 @@ * @endif **/ -NSString *const CPTPlotBindingDataLabels = @"dataLabels"; ///< Plot data labels. +CPTPlotBinding const CPTPlotBindingDataLabels = @"dataLabels"; ///< Plot data labels. /// @cond @interface CPTPlot() diff --git a/framework/Source/CPTPlotSpace.h b/framework/Source/CPTPlotSpace.h index 646e906fa..902817b73 100644 --- a/framework/Source/CPTPlotSpace.h +++ b/framework/Source/CPTPlotSpace.h @@ -7,6 +7,16 @@ @class CPTGraph; @class CPTPlotSpace; +/** + * @brief Plot space mapping notification type. + **/ +typedef NSString *CPTPlotSpaceCoordinateMapping cpt_swift_struct; + +/** + * @brief The userInfo dictionary keys used by #CPTPlotSpaceCoordinateMappingDidChangeNotification notifications. + **/ +typedef NSString *CPTPlotSpaceInfoKey cpt_swift_struct; + /// @name Plot Space /// @{ @@ -16,32 +26,32 @@ * the plot space coordinate system and drawing coordinates changes. * @ingroup notification **/ -extern NSString *__nonnull const CPTPlotSpaceCoordinateMappingDidChangeNotification; +extern CPTPlotSpaceCoordinateMapping __nonnull const CPTPlotSpaceCoordinateMappingDidChangeNotification; -/** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification +/** @brief The userInfo dictionary key used by the #CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate the plot coordinate affected by the mapping change. * * The value associated with this key is the CPTCoordinate affected by the change wrapped in an instance of NSNumber. * @ingroup notification **/ -extern NSString *__nonnull const CPTPlotSpaceCoordinateKey; +extern CPTPlotSpaceInfoKey __nonnull const CPTPlotSpaceCoordinateKey; -/** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification +/** @brief The userInfo dictionary key used by the #CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate whether the mapping change is a scroll movement or other change. * * The value associated with this key is a boolean value wrapped in an instance of NSNumber. The value * is @YES if the plot space change represents a horizontal or vertical translation, @NO otherwise. * @ingroup notification **/ -extern NSString *__nonnull const CPTPlotSpaceScrollingKey; +extern CPTPlotSpaceInfoKey __nonnull const CPTPlotSpaceScrollingKey; -/** @brief The userInfo dictionary key used by the CPTPlotSpaceCoordinateMappingDidChangeNotification +/** @brief The userInfo dictionary key used by the #CPTPlotSpaceCoordinateMappingDidChangeNotification * to indicate the displacement offset for scrolling changes in drawing coordinates. * * The value associated with this key is the displacement offset wrapped in an instance of NSNumber. * @ingroup notification **/ -extern NSString *__nonnull const CPTPlotSpaceDisplacementKey; +extern CPTPlotSpaceInfoKey __nonnull const CPTPlotSpaceDisplacementKey; /// @} diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 8a40414a2..e6a518d9b 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -4,11 +4,11 @@ #import "CPTMutablePlotRange.h" #import "CPTUtilities.h" -NSString *const CPTPlotSpaceCoordinateMappingDidChangeNotification = @"CPTPlotSpaceCoordinateMappingDidChangeNotification"; +CPTPlotSpaceCoordinateMapping const CPTPlotSpaceCoordinateMappingDidChangeNotification = @"CPTPlotSpaceCoordinateMappingDidChangeNotification"; -NSString *const CPTPlotSpaceCoordinateKey = @"CPTPlotSpaceCoordinateKey"; -NSString *const CPTPlotSpaceScrollingKey = @"CPTPlotSpaceScrollingKey"; -NSString *const CPTPlotSpaceDisplacementKey = @"CPTPlotSpaceDisplacementKey"; +CPTPlotSpaceInfoKey const CPTPlotSpaceCoordinateKey = @"CPTPlotSpaceCoordinateKey"; +CPTPlotSpaceInfoKey const CPTPlotSpaceScrollingKey = @"CPTPlotSpaceScrollingKey"; +CPTPlotSpaceInfoKey const CPTPlotSpaceDisplacementKey = @"CPTPlotSpaceDisplacementKey"; /// @cond diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index e8a0cb07e..6e9d3f112 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -5,15 +5,20 @@ @class CPTFill; @class CPTRangePlot; +/** + * @brief Range plot bindings. + **/ +typedef NSString *CPTRangePlotBinding cpt_swift_struct; + /// @ingroup plotBindingsRangePlot /// @{ -extern NSString *__nonnull const CPTRangePlotBindingXValues; -extern NSString *__nonnull const CPTRangePlotBindingYValues; -extern NSString *__nonnull const CPTRangePlotBindingHighValues; -extern NSString *__nonnull const CPTRangePlotBindingLowValues; -extern NSString *__nonnull const CPTRangePlotBindingLeftValues; -extern NSString *__nonnull const CPTRangePlotBindingRightValues; -extern NSString *__nonnull const CPTRangePlotBindingBarLineStyles; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingXValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingYValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingHighValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingLowValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingLeftValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingRightValues; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingBarLineStyles; /// @} /** diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 9b1d7483e..c1fc4d271 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -27,13 +27,13 @@ * @endif **/ -NSString *const CPTRangePlotBindingXValues = @"xValues"; ///< X values. -NSString *const CPTRangePlotBindingYValues = @"yValues"; ///< Y values. -NSString *const CPTRangePlotBindingHighValues = @"highValues"; ///< High values. -NSString *const CPTRangePlotBindingLowValues = @"lowValues"; ///< Low values. -NSString *const CPTRangePlotBindingLeftValues = @"leftValues"; ///< Left price values. -NSString *const CPTRangePlotBindingRightValues = @"rightValues"; ///< Right price values. -NSString *const CPTRangePlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. +CPTRangePlotBinding const CPTRangePlotBindingXValues = @"xValues"; ///< X values. +CPTRangePlotBinding const CPTRangePlotBindingYValues = @"yValues"; ///< Y values. +CPTRangePlotBinding const CPTRangePlotBindingHighValues = @"highValues"; ///< High values. +CPTRangePlotBinding const CPTRangePlotBindingLowValues = @"lowValues"; ///< Low values. +CPTRangePlotBinding const CPTRangePlotBindingLeftValues = @"leftValues"; ///< Left price values. +CPTRangePlotBinding const CPTRangePlotBindingRightValues = @"rightValues"; ///< Right price values. +CPTRangePlotBinding const CPTRangePlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. /// @cond struct CGPointError { diff --git a/framework/Source/CPTScatterPlot.h b/framework/Source/CPTScatterPlot.h index 2d09335c5..8cd3b9a7d 100644 --- a/framework/Source/CPTScatterPlot.h +++ b/framework/Source/CPTScatterPlot.h @@ -9,11 +9,16 @@ @class CPTScatterPlot; @class CPTFill; +/** + * @brief Scatter plot bindings. + **/ +typedef NSString *CPTScatterPlotBinding cpt_swift_struct; + /// @ingroup plotBindingsScatterPlot /// @{ -extern NSString *__nonnull const CPTScatterPlotBindingXValues; -extern NSString *__nonnull const CPTScatterPlotBindingYValues; -extern NSString *__nonnull const CPTScatterPlotBindingPlotSymbols; +extern CPTScatterPlotBinding __nonnull const CPTScatterPlotBindingXValues; +extern CPTScatterPlotBinding __nonnull const CPTScatterPlotBindingYValues; +extern CPTScatterPlotBinding __nonnull const CPTScatterPlotBindingPlotSymbols; /// @} /** diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index eb9757bcc..e101e18b3 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -27,9 +27,9 @@ * @endif **/ -NSString *const CPTScatterPlotBindingXValues = @"xValues"; ///< X values. -NSString *const CPTScatterPlotBindingYValues = @"yValues"; ///< Y values. -NSString *const CPTScatterPlotBindingPlotSymbols = @"plotSymbols"; ///< Plot symbols. +CPTScatterPlotBinding const CPTScatterPlotBindingXValues = @"xValues"; ///< X values. +CPTScatterPlotBinding const CPTScatterPlotBindingYValues = @"yValues"; ///< Y values. +CPTScatterPlotBinding const CPTScatterPlotBindingPlotSymbols = @"plotSymbols"; ///< Plot symbols. /// @cond @interface CPTScatterPlot() diff --git a/framework/Source/CPTTheme.h b/framework/Source/CPTTheme.h index 705ef54ec..83cda6ef7 100644 --- a/framework/Source/CPTTheme.h +++ b/framework/Source/CPTTheme.h @@ -1,10 +1,17 @@ +#import "CPTDefinitions.h" + +/** + * @brief Theme name type. + **/ +typedef NSString *CPTThemeName cpt_swift_struct; + /// @ingroup themeNames /// @{ -extern NSString *__nonnull const kCPTDarkGradientTheme; ///< A graph theme with dark gray gradient backgrounds and light gray lines. -extern NSString *__nonnull const kCPTPlainBlackTheme; ///< A graph theme with black backgrounds and white lines. -extern NSString *__nonnull const kCPTPlainWhiteTheme; ///< A graph theme with white backgrounds and black lines. -extern NSString *__nonnull const kCPTSlateTheme; ///< A graph theme with colors that match the default iPhone navigation bar, toolbar buttons, and table views. -extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with a gradient background and white lines. +extern CPTThemeName __nonnull const kCPTDarkGradientTheme; ///< A graph theme with dark gray gradient backgrounds and light gray lines. +extern CPTThemeName __nonnull const kCPTPlainBlackTheme; ///< A graph theme with black backgrounds and white lines. +extern CPTThemeName __nonnull const kCPTPlainWhiteTheme; ///< A graph theme with white backgrounds and black lines. +extern CPTThemeName __nonnull const kCPTSlateTheme; ///< A graph theme with colors that match the default iPhone navigation bar, toolbar buttons, and table views. +extern CPTThemeName __nonnull const kCPTStocksTheme; ///< A graph theme with a gradient background and white lines. /// @} @class CPTGraph; @@ -20,8 +27,8 @@ extern NSString *__nonnull const kCPTStocksTheme; ///< A graph theme with /// @{ +(void)registerTheme:(nonnull Class)themeClass; +(nullable NSArray *)themeClasses; -+(nullable instancetype)themeNamed:(nullable NSString *)themeName; -+(nonnull NSString *)name; ++(nullable instancetype)themeNamed:(nullable CPTThemeName)themeName; ++(nonnull CPTThemeName)name; /// @} /// @name Theme Usage diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index 350ffa90b..ae9c34ce2 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -110,7 +110,7 @@ +(BOOL)supportsSecureCoding * @return A CPTTheme instance with name matching @par{themeName} or @nil if no themes with a matching name were found. * @see See @ref themeNames "Theme Names" for a list of named themes provided by Core Plot. **/ -+(nullable instancetype)themeNamed:(nullable NSString *)themeName ++(nullable instancetype)themeNamed:(nullable CPTThemeName)themeName { CPTTheme *newTheme = nil; @@ -149,7 +149,7 @@ +(void)registerTheme:(nonnull Class)themeClass /** @brief The name used for this theme class. * @return The name. **/ -+(nonnull NSString *)name ++(nonnull CPTThemeName)name { return NSStringFromClass(self); } diff --git a/framework/Source/CPTTradingRangePlot.h b/framework/Source/CPTTradingRangePlot.h index 513d8ccaf..77c319b9b 100644 --- a/framework/Source/CPTTradingRangePlot.h +++ b/framework/Source/CPTTradingRangePlot.h @@ -7,18 +7,23 @@ @class CPTTradingRangePlot; +/** + * @brief Trading range plot bindings. + **/ +typedef NSString *CPTTradingRangePlotBinding cpt_swift_struct; + /// @ingroup plotBindingsTradingRangePlot /// @{ -extern NSString *__nonnull const CPTTradingRangePlotBindingXValues; -extern NSString *__nonnull const CPTTradingRangePlotBindingOpenValues; -extern NSString *__nonnull const CPTTradingRangePlotBindingHighValues; -extern NSString *__nonnull const CPTTradingRangePlotBindingLowValues; -extern NSString *__nonnull const CPTTradingRangePlotBindingCloseValues; -extern NSString *__nonnull const CPTTradingRangePlotBindingIncreaseFills; -extern NSString *__nonnull const CPTTradingRangePlotBindingDecreaseFills; -extern NSString *__nonnull const CPTTradingRangePlotBindingLineStyles; -extern NSString *__nonnull const CPTTradingRangePlotBindingIncreaseLineStyles; -extern NSString *__nonnull const CPTTradingRangePlotBindingDecreaseLineStyles; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingXValues; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingOpenValues; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingHighValues; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingLowValues; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingCloseValues; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingIncreaseFills; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingDecreaseFills; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingLineStyles; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingIncreaseLineStyles; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingDecreaseLineStyles; /// @} /** diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 0326f1d57..6ec8ce1d3 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -26,16 +26,16 @@ * @endif **/ -NSString *const CPTTradingRangePlotBindingXValues = @"xValues"; ///< X values. -NSString *const CPTTradingRangePlotBindingOpenValues = @"openValues"; ///< Open price values. -NSString *const CPTTradingRangePlotBindingHighValues = @"highValues"; ///< High price values. -NSString *const CPTTradingRangePlotBindingLowValues = @"lowValues"; ///< Low price values. -NSString *const CPTTradingRangePlotBindingCloseValues = @"closeValues"; ///< Close price values. -NSString *const CPTTradingRangePlotBindingIncreaseFills = @"increaseFills"; ///< Fills used with a candlestick plot when close >= open. -NSString *const CPTTradingRangePlotBindingDecreaseFills = @"decreaseFills"; ///< Fills used with a candlestick plot when close < open. -NSString *const CPTTradingRangePlotBindingLineStyles = @"lineStyles"; ///< Line styles used to draw candlestick or OHLC symbols. -NSString *const CPTTradingRangePlotBindingIncreaseLineStyles = @"increaseLineStyles"; ///< Line styles used to outline candlestick symbols when close >= open. -NSString *const CPTTradingRangePlotBindingDecreaseLineStyles = @"decreaseLineStyles"; ///< Line styles used to outline candlestick symbols when close < open. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingXValues = @"xValues"; ///< X values. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingOpenValues = @"openValues"; ///< Open price values. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingHighValues = @"highValues"; ///< High price values. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingLowValues = @"lowValues"; ///< Low price values. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingCloseValues = @"closeValues"; ///< Close price values. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingIncreaseFills = @"increaseFills"; ///< Fills used with a candlestick plot when close >= open. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingDecreaseFills = @"decreaseFills"; ///< Fills used with a candlestick plot when close < open. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingLineStyles = @"lineStyles"; ///< Line styles used to draw candlestick or OHLC symbols. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingIncreaseLineStyles = @"increaseLineStyles"; ///< Line styles used to outline candlestick symbols when close >= open. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingDecreaseLineStyles = @"decreaseLineStyles"; ///< Line styles used to outline candlestick symbols when close < open. static const CPTCoordinate independentCoord = CPTCoordinateX; static const CPTCoordinate dependentCoord = CPTCoordinateY; diff --git a/framework/Source/_CPTDarkGradientTheme.m b/framework/Source/_CPTDarkGradientTheme.m index 34c2f40c6..1f2801e84 100644 --- a/framework/Source/_CPTDarkGradientTheme.m +++ b/framework/Source/_CPTDarkGradientTheme.m @@ -12,7 +12,7 @@ #import "CPTXYAxisSet.h" #import "CPTXYGraph.h" -NSString *const kCPTDarkGradientTheme = @"Dark Gradients"; +CPTThemeName const kCPTDarkGradientTheme = @"Dark Gradients"; /// @cond @interface _CPTDarkGradientTheme() diff --git a/framework/Source/_CPTPlainBlackTheme.m b/framework/Source/_CPTPlainBlackTheme.m index ad52aa0b8..0bff8bb06 100644 --- a/framework/Source/_CPTPlainBlackTheme.m +++ b/framework/Source/_CPTPlainBlackTheme.m @@ -11,7 +11,7 @@ #import "CPTXYAxisSet.h" #import "CPTXYGraph.h" -NSString *const kCPTPlainBlackTheme = @"Plain Black"; +CPTThemeName const kCPTPlainBlackTheme = @"Plain Black"; /** * @brief Creates a CPTXYGraph instance formatted with black backgrounds and white lines. diff --git a/framework/Source/_CPTPlainWhiteTheme.m b/framework/Source/_CPTPlainWhiteTheme.m index 485475e47..aa2f1fd10 100644 --- a/framework/Source/_CPTPlainWhiteTheme.m +++ b/framework/Source/_CPTPlainWhiteTheme.m @@ -11,7 +11,7 @@ #import "CPTXYAxisSet.h" #import "CPTXYGraph.h" -NSString *const kCPTPlainWhiteTheme = @"Plain White"; +CPTThemeName const kCPTPlainWhiteTheme = @"Plain White"; /** * @brief Creates a CPTXYGraph instance formatted with white backgrounds and black lines. diff --git a/framework/Source/_CPTSlateTheme.m b/framework/Source/_CPTSlateTheme.m index 35cff032b..92f34f922 100644 --- a/framework/Source/_CPTSlateTheme.m +++ b/framework/Source/_CPTSlateTheme.m @@ -12,7 +12,7 @@ #import "CPTXYAxisSet.h" #import "CPTXYGraph.h" -NSString *const kCPTSlateTheme = @"Slate"; +CPTThemeName const kCPTSlateTheme = @"Slate"; /// @cond @interface _CPTSlateTheme() diff --git a/framework/Source/_CPTStocksTheme.m b/framework/Source/_CPTStocksTheme.m index 83d2dc92d..b807cfe38 100644 --- a/framework/Source/_CPTStocksTheme.m +++ b/framework/Source/_CPTStocksTheme.m @@ -12,7 +12,7 @@ #import "CPTXYAxisSet.h" #import "CPTXYGraph.h" -NSString *const kCPTStocksTheme = @"Stocks"; +CPTThemeName const kCPTStocksTheme = @"Stocks"; /** * @brief Creates a CPTXYGraph instance formatted with a gradient background and white lines. From 3b3800b13286740729844359a26de67050d24140 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 26 Aug 2016 15:27:33 -0400 Subject: [PATCH 246/429] Added additional margin space in CPTTextLayer to fix truncated text with some fonts. Fixed issue #280. --- framework/Source/CPTTextLayer.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index f220ce7d9..c767c130a 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -328,10 +328,12 @@ -(CGSize)sizeThatFits } // Add small margin - textSize.width += kCPTTextLayerMarginWidth * CPTFloat(2.0); + CGFloat margin = kCPTTextLayerMarginWidth * CPTFloat(2.0) * self.contentsScale; + + textSize.width += margin; textSize.width = ceil(textSize.width); - textSize.height += kCPTTextLayerMarginWidth * CPTFloat(2.0); + textSize.height += margin; textSize.height = ceil(textSize.height); } From 1d887ac08073bba1218eb439c3078e78de36c67f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 5 Sep 2016 16:21:15 -0400 Subject: [PATCH 247/429] Reverted the last change. --- framework/Source/CPTTextLayer.m | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index c767c130a..f220ce7d9 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -328,12 +328,10 @@ -(CGSize)sizeThatFits } // Add small margin - CGFloat margin = kCPTTextLayerMarginWidth * CPTFloat(2.0) * self.contentsScale; - - textSize.width += margin; + textSize.width += kCPTTextLayerMarginWidth * CPTFloat(2.0); textSize.width = ceil(textSize.width); - textSize.height += margin; + textSize.height += kCPTTextLayerMarginWidth * CPTFloat(2.0); textSize.height = ceil(textSize.height); } From 2b3ab7a14a083e1a98dc476973d7cc7f8eb4a783 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 7 Sep 2016 20:04:51 -0400 Subject: [PATCH 248/429] Defined a constant value to standardize string drawing options. --- framework/MacOnly/CPTPlatformSpecificCategories.m | 2 +- framework/MacOnly/CPTTextStylePlatformSpecific.m | 2 +- framework/Source/CPTDefinitions.h | 2 ++ framework/Source/CPTDefinitions.m | 4 ++++ framework/iPhoneOnly/CPTPlatformSpecificCategories.m | 2 +- framework/iPhoneOnly/CPTTextStylePlatformSpecific.m | 6 +++--- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index b87e1ab6d..7da93b251 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -95,7 +95,7 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context CPTPushCGContext(context); [self drawWithRect:NSRectFromCGRect(rect) - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine]; + options:CPTStringDrawingOptions]; CPTPopCGContext(); } diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index b733fc305..bcb5685c7 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -261,7 +261,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inCo NSParagraphStyleAttributeName: paragraphStyle }; [self drawWithRect:NSRectFromCGRect(rect) - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + options:CPTStringDrawingOptions attributes:attributes]; } CPTPopCGContext(); diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 7ca25c47b..38da64fcf 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -214,6 +214,8 @@ CPTEdgeInsets; extern const CPTEdgeInsets CPTEdgeInsetsZero; ///< Defines a set of stretchable image edge insets where all of the values are zero (@num{0}). +extern const NSStringDrawingOptions CPTStringDrawingOptions; ///< String drawing options used when measuring and drawing text. + /** * @brief An array of numbers. **/ diff --git a/framework/Source/CPTDefinitions.m b/framework/Source/CPTDefinitions.m index 7b54f79ab..5af8aaada 100644 --- a/framework/Source/CPTDefinitions.m +++ b/framework/Source/CPTDefinitions.m @@ -1,3 +1,7 @@ #import "CPTDefinitions.h" const CPTEdgeInsets CPTEdgeInsetsZero = { CPTFloat(0.0), CPTFloat(0.0), CPTFloat(0.0), CPTFloat(0.0) }; + +const NSStringDrawingOptions CPTStringDrawingOptions = NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading | + NSStringDrawingTruncatesLastVisibleLine; diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m index c3b42aace..6af4e8cab 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m @@ -107,7 +107,7 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context CPTPushCGContext(context); [self drawWithRect:rect - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + options:CPTStringDrawingOptions context:nil]; CPTPopCGContext(); diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index 4fdedfc01..b519d6987 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -173,7 +173,7 @@ -(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style #if TARGET_OS_SIMULATOR || TARGET_OS_TV CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + options:CPTStringDrawingOptions attributes:style.attributes context:nil]; textSize = rect.size; @@ -232,7 +232,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inCo #if TARGET_OS_SIMULATOR || TARGET_OS_TV [self drawWithRect:rect - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + options:CPTStringDrawingOptions attributes:style.attributes context:nil]; #else @@ -240,7 +240,7 @@ -(void)drawInRect:(CGRect)rect withTextStyle:(nullable CPTTextStyle *)style inCo // -drawWithRect:options:attributes:context: method is available in iOS 7.0 and later if ( [self respondsToSelector:@selector(drawWithRect:options:attributes:context:)] ) { [self drawWithRect:rect - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine + options:CPTStringDrawingOptions attributes:style.attributes context:nil]; } From e5607eb4ae2c17f198d6f6fabb38ec940858e51b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 7 Sep 2016 20:33:32 -0400 Subject: [PATCH 249/429] Use the -boundingRectWithSize:options:attributes:context: method for all string measurement. Fixed issue #280. --- .../MacOnly/CPTPlatformSpecificCategories.h | 5 +++ .../MacOnly/CPTPlatformSpecificCategories.m | 25 +++++++++++++++ .../MacOnly/CPTTextStylePlatformSpecific.m | 24 ++++---------- framework/Source/CPTLegendEntry.m | 8 ++--- framework/Source/CPTTextLayer.m | 8 ++--- .../CPTPlatformSpecificCategories.h | 5 +++ .../CPTPlatformSpecificCategories.m | 17 ++++++++++ .../iPhoneOnly/CPTTextStylePlatformSpecific.h | 15 --------- .../iPhoneOnly/CPTTextStylePlatformSpecific.m | 32 ++----------------- 9 files changed, 66 insertions(+), 73 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.h b/framework/MacOnly/CPTPlatformSpecificCategories.h index 96732d478..f47f00e94 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.h +++ b/framework/MacOnly/CPTPlatformSpecificCategories.h @@ -39,4 +39,9 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} +/// @name Measurement +/// @{ +-(CGSize)sizeAsDrawn; +/// @} + @end diff --git a/framework/MacOnly/CPTPlatformSpecificCategories.m b/framework/MacOnly/CPTPlatformSpecificCategories.m index 7da93b251..3261e9cff 100644 --- a/framework/MacOnly/CPTPlatformSpecificCategories.m +++ b/framework/MacOnly/CPTPlatformSpecificCategories.m @@ -100,4 +100,29 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context CPTPopCGContext(); } +/** + * @brief Computes the size of the styled text when drawn rounded up to the nearest whole number in each dimension. + **/ +-(CGSize)sizeAsDrawn +{ + CGRect rect = CGRectZero; + + if ( [self respondsToSelector:@selector(boundingRectWithSize:options:context:)] ) { + rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) + options:CPTStringDrawingOptions + context:nil]; + } + else { + rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) + options:CPTStringDrawingOptions]; + } + + CGSize textSize = rect.size; + + textSize.width = ceil(textSize.width); + textSize.height = ceil(textSize.height); + + return textSize; +} + @end diff --git a/framework/MacOnly/CPTTextStylePlatformSpecific.m b/framework/MacOnly/CPTTextStylePlatformSpecific.m index bcb5685c7..533bf4888 100644 --- a/framework/MacOnly/CPTTextStylePlatformSpecific.m +++ b/framework/MacOnly/CPTTextStylePlatformSpecific.m @@ -198,25 +198,15 @@ @implementation NSString(CPTTextStyleExtensions) **/ -(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style { - NSFont *theFont = nil; - NSString *fontName = style.fontName; - - if ( fontName ) { - theFont = [NSFont fontWithName:fontName size:style.fontSize]; - } + CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) + options:CPTStringDrawingOptions + attributes:style.attributes + context:nil]; - CGSize textSize; + CGSize textSize = rect.size; - if ( theFont ) { - CPTDictionary *attributes = @{ - NSFontAttributeName: theFont - }; - - textSize = NSSizeToCGSize([self sizeWithAttributes:attributes]); - } - else { - textSize = CGSizeZero; - } + textSize.width = ceil(textSize.width); + textSize.height = ceil(textSize.height); return textSize; } diff --git a/framework/Source/CPTLegendEntry.m b/framework/Source/CPTLegendEntry.m index 5d5d40a15..475f7f9fb 100644 --- a/framework/Source/CPTLegendEntry.m +++ b/framework/Source/CPTLegendEntry.m @@ -219,12 +219,8 @@ -(CGSize)titleSize NSAttributedString *styledTitle = self.attributedTitle; - if ( (styledTitle.length > 0) && [styledTitle respondsToSelector:@selector(size)] ) { -#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE - theTitleSize = styledTitle.size; -#else - theTitleSize = NSSizeToCGSize(styledTitle.size); -#endif + if ( styledTitle.length > 0 ) { + theTitleSize = [styledTitle sizeAsDrawn]; } else { NSString *theTitle = styledTitle.string; diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index f220ce7d9..97a475e77 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -316,12 +316,8 @@ -(CGSize)sizeThatFits if ( myText.length > 0 ) { NSAttributedString *styledText = self.attributedText; - if ( (styledText.length > 0) && [styledText respondsToSelector:@selector(size)] ) { -#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE - textSize = styledText.size; -#else - textSize = NSSizeToCGSize(styledText.size); -#endif + if ( styledText.length > 0 ) { + textSize = [styledText sizeAsDrawn]; } else { textSize = [myText sizeWithTextStyle:self.textStyle]; diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.h b/framework/iPhoneOnly/CPTPlatformSpecificCategories.h index 06cd3ec67..9132da000 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.h @@ -53,4 +53,9 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context; /// @} +/// @name Measurement +/// @{ +-(CGSize)sizeAsDrawn; +/// @} + @end diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m index 6af4e8cab..2fbe8775f 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m @@ -114,4 +114,21 @@ -(void)drawInRect:(CGRect)rect inContext:(nonnull CGContextRef)context } } +/** + * @brief Computes the size of the styled text when drawn rounded up to the nearest whole number in each dimension. + **/ +-(CGSize)sizeAsDrawn +{ + CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) + options:CPTStringDrawingOptions + context:nil]; + + CGSize textSize = rect.size; + + textSize.width = ceil(textSize.width); + textSize.height = ceil(textSize.height); + + return textSize; +} + @end diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h index b6f4e498f..b1e699720 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.h @@ -10,18 +10,3 @@ typedef NS_ENUM (NSInteger, CPTTextAlignment) { CPTTextAlignmentJustified = NSTextAlignmentJustified, ///< Justified alignment. CPTTextAlignmentNatural = NSTextAlignmentNatural ///< Natural alignment of the text's script. }; - -// @cond -// for iOS SDK compatibility -#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -#if __IPHONE_OS_VERSION_MAX_ALLOWED<70000 -@interface NSString(CPTTextStylePlatformSpecificExtensions) - --(CGSize)sizeWithAttributes:(nonnull CPTDictionary *)attrs; - -@end -#else -#endif -#endif - -/// @endcond diff --git a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m index b519d6987..8ecca165a 100644 --- a/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m +++ b/framework/iPhoneOnly/CPTTextStylePlatformSpecific.m @@ -169,41 +169,15 @@ @implementation NSString(CPTTextStyleExtensions) **/ -(CGSize)sizeWithTextStyle:(nullable CPTTextStyle *)style { - CGSize textSize; - -#if TARGET_OS_SIMULATOR || TARGET_OS_TV CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) options:CPTStringDrawingOptions attributes:style.attributes context:nil]; - textSize = rect.size; - textSize.width = ceil(textSize.width); - textSize.height = ceil(textSize.height); -#else - // -boundingRectWithSize:options:attributes:context: is available in iOS 7.0 and later - if ( [self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)] ) { - CGRect rect = [self boundingRectWithSize:CPTSizeMake(10000.0, 10000.0) - options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine - attributes:style.attributes - context:nil]; - textSize = rect.size; - textSize.width = ceil(textSize.width); - textSize.height = ceil(textSize.height); - } - else { - UIFont *theFont = nil; - NSString *fontName = style.fontName; - if ( fontName ) { - theFont = [UIFont fontWithName:fontName size:style.fontSize]; - } + CGSize textSize = rect.size; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - textSize = [self sizeWithFont:theFont constrainedToSize:CPTSizeMake(10000.0, 10000.0)]; -#pragma clang diagnostic pop - } -#endif + textSize.width = ceil(textSize.width); + textSize.height = ceil(textSize.height); return textSize; } From 76465918093cfbcbf5e6b6594be37bce8b9cdec1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Sep 2016 13:50:12 -0400 Subject: [PATCH 250/429] Updated the DatePlot example app with a Swift 3 naming change. --- examples/DatePlot/Source/DateController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/DatePlot/Source/DateController.swift b/examples/DatePlot/Source/DateController.swift index 406ef3aa0..450d8ab48 100644 --- a/examples/DatePlot/Source/DateController.swift +++ b/examples/DatePlot/Source/DateController.swift @@ -24,7 +24,7 @@ class DateController : NSObject, CPTPlotDataSource { // Create graph let newGraph = CPTXYGraph(frame: .zero) - let theme = CPTTheme(named: kCPTDarkGradientTheme) + let theme = CPTTheme(named: .darkGradientTheme) newGraph.apply(theme) if let host = self.hostView { From 742eb1bcf731c1943661e9e22a65aae8b1dd1bc1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Sep 2016 13:50:57 -0400 Subject: [PATCH 251/429] Fixed a compiler warning for 32-bit builds. Fixed issue #301. --- framework/iPhoneOnly/CPTPlatformSpecificCategories.m | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m index 2fbe8775f..4d22e17da 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificCategories.m +++ b/framework/iPhoneOnly/CPTPlatformSpecificCategories.m @@ -1,6 +1,7 @@ #import "CPTPlatformSpecificCategories.h" #import "CPTPlatformSpecificFunctions.h" +#import "tgmath.h" #pragma mark CPTColor From 15ee42289d4393052f58993b1b6c8fa1c0e76b93 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:17:16 -0400 Subject: [PATCH 252/429] Updated the version number in the podspec. --- CorePlot-latest.podspec | 2 +- CorePlot.podspec | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index 6f7f9dfd7..bf65bf04f 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -18,7 +18,7 @@ Pod::Spec.new do |s| 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' - s.ios.deployment_target = '6.0' + s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.8' s.tvos.deployment_target = '9.0' diff --git a/CorePlot.podspec b/CorePlot.podspec index 084705347..e23d3b6c8 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CorePlot' - s.version = '2.1' + s.version = '2.2' s.license = 'BSD' s.summary = 'Cocoa plotting framework for Mac OS X, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' @@ -18,7 +18,7 @@ Pod::Spec.new do |s| 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' - s.ios.deployment_target = '6.0' + s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.8' s.tvos.deployment_target = '9.0' From ba749bd490428b3a03e01f3155c3485619e74429 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:17:42 -0400 Subject: [PATCH 253/429] Updated the project version. --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 6f0cbf21a..eb9065875 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3292,7 +3292,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CURRENT_PROJECT_VERSION = 2.1; + CURRENT_PROJECT_VERSION = 2.2; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -3319,7 +3319,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CURRENT_PROJECT_VERSION = 2.1; + CURRENT_PROJECT_VERSION = 2.2; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; From 3ec9c7e8dd8adbc340c5e48652838a53cbfb2432 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:18:15 -0400 Subject: [PATCH 254/429] Updated the release instructions to require Xcode 8. --- scripts/README Creating a release package.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 3bd752bed..36ce39a83 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -5,7 +5,7 @@ Follow these steps to create a Core Plot release and post it to GitHub: 1. Ensure the following tools are installed on your development machine:
      -
    • Xcode 7
    • +
    • Xcode 8
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.11 or later, installed in /Applications
    • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.36.0 or later
    From 485c56240df03ef5f0bbf79bf4cb3489a651ad0c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:18:32 -0400 Subject: [PATCH 255/429] Added release 2.2 information to the change log. --- documentation/changelog.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index 4f8f4a975..b1bdad0c4 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,8 +1,10 @@ -# Release 2.2 (TBD) +# Release 2.2 (September 17, 2016) ## Release Notes -To be determined. +This release updates Core Plot to be compatible with Xcode 8 and Swift 3. + +The Mac deployment target remains OS X 10.8. The iOS deployment target has changed to iOS 8.0 for both the framework and the static library. The tvOS deployment target remains tvOS 9.0. ## Details - **New**: Increased the iOS deployment target to iOS 8. From df75798589a8cee5d556e35c497f56d87a57c6a7 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:45:35 -0400 Subject: [PATCH 256/429] Removed the AppleScript that refreshes the Xcode documentation window. That command is no longer supported in Xcode 8. --- framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index eb9065875..3c2e33ed6 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -2588,7 +2588,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen.config\"' to \n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ] \nthen \n echo doxygen config file does not exist\n ${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${DOXYGEN_FOLDER}/doxygen.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/MacOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlot.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; + shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen.config\"' to \n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ] \nthen \n echo doxygen config file does not exist\n ${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${DOXYGEN_FOLDER}/doxygen.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/MacOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlot.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\nexit 0"; }; C37EA5C51BC83E900091C8F7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -2614,7 +2614,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"' to\n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ]\nthen\necho doxygen config file does not exist\n${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/iOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlotTouch.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotTouchDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\nrm -f \"${TEMP_DIR}/loadDocSet.scpt\"\n\necho \"tell application \\\"Xcode\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"load documentation set with path \\\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/\\\"\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\necho \"end tell\" >> \"${TEMP_DIR}/loadDocSet.scpt\"\n\n# Run the load-docset applescript command.\nosascript \"${TEMP_DIR}/loadDocSet.scpt\"\n\nexit 0"; + shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# Graphical class diagrams require Graphviz.\n# Graphviz.app is available free online\n# http://www.graphviz.org/Download_macos.php\n\n# If the config file doesn't exist, run 'doxygen -g \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"' to\n# a get default file.\n\nDOXYGEN_FOLDER=\"${SOURCE_ROOT}/../documentation/doxygen\"\n\nif ! [ -f \"${DOXYGEN_FOLDER}/doxygen.config\" ]\nthen\necho doxygen config file does not exist\n${DOXYGEN_PATH} -g \"${DOXYGEN_FOLDER}/doxygen.config\"\nfi\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n${DOXYGEN_PATH} \"${SOURCE_ROOT}/../documentation/doxygen/doxygen touch.config\"\n\n# make a copy of the html docs\nDOCS_FOLDER=\"${SOURCE_ROOT}/../documentation/html/iOS\"\nmkdir -p \"${DOCS_FOLDER}\"\ncp -R \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/\" \"${DOCS_FOLDER}\"\nrm -f \"${DOCS_FOLDER}/Info.plist\"\nrm -f \"${DOCS_FOLDER}/Makefile\"\nrm -f \"${DOCS_FOLDER}/Nodes.xml\"\nrm -f \"${DOCS_FOLDER}/Tokens.xml\"\n\n# fix nodes.xml so the docset gets the correct index page\nsed -i 's|index.html|index.html' \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html/nodes.xml\"\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\nmake -C \"${SOURCE_ROOT}/CorePlotTouchDocs.docset/html\" install\n\n# add publisher info to the docset\nDOCSET_FOLDER=\"/Users/${USER}/Library/Developer/Shared/Documentation/DocSets/com.CorePlotTouch.Framework.docset\"\n\nfind \"${DOCSET_FOLDER}/Contents/\" -type f -name Info.plist | xargs perl -pi -e 's/\\<\\/dict\\>/\\t\\DocSetPublisherIdentifier\\<\\/key\\>\\n\\t\\com.CorePlot.documentation\\<\\/string\\>\\n\\t\\DocSetPublisherName\\<\\/key\\>\\n\\t\\Core Plot\\<\\/string\\>\\n\\t\\NSHumanReadableCopyright\\<\\/key\\>\\n\\t\\Copyright © 2013 Core Plot. All rights reserved.\\<\\/string\\>\\n\\t\\isJavaScriptEnabled\\<\\/key\\>\\n\\t\\\\n\\<\\/dict\\>\\n/g'\n\n# add docset icon\ncp \"${DOXYGEN_FOLDER}/icon.png\" \"${DOCSET_FOLDER}\"\n\n# make a copy of the docset\nrm -Rf \"${SOURCE_ROOT}/CorePlotTouchDocs.docset\"\ncp -R \"${DOCSET_FOLDER}\" \"${SOURCE_ROOT}\"\n\nexit 0"; }; C38A09971A46193F00D45436 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; From bc913b2b69095b427ce1d1d7f1bccf3aee8acbc4 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 14:55:29 -0400 Subject: [PATCH 257/429] Updated documentation configuration for Doxygen 1.8.12. --- documentation/doxygen/doxygen touch.config | 15 ++++++++++++--- documentation/doxygen/doxygen.config | 15 ++++++++++++--- scripts/README Creating a release package.md | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/documentation/doxygen/doxygen touch.config b/documentation/doxygen/doxygen touch.config index d18a23b42..56012d005 100644 --- a/documentation/doxygen/doxygen touch.config +++ b/documentation/doxygen/doxygen touch.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.11 +# Doxyfile 1.8.12 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -312,6 +312,15 @@ EXTENSION_MAPPING = MARKDOWN_SUPPORT = NO +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or @@ -814,8 +823,8 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. FILE_PATTERNS = diff --git a/documentation/doxygen/doxygen.config b/documentation/doxygen/doxygen.config index 942b4ec35..50b8b844c 100644 --- a/documentation/doxygen/doxygen.config +++ b/documentation/doxygen/doxygen.config @@ -1,4 +1,4 @@ -# Doxyfile 1.8.11 +# Doxyfile 1.8.12 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -312,6 +312,15 @@ EXTENSION_MAPPING = MARKDOWN_SUPPORT = NO +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or @@ -814,8 +823,8 @@ INPUT_ENCODING = UTF-8 # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. FILE_PATTERNS = diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 36ce39a83..933dfd8f2 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -6,7 +6,7 @@ Follow these steps to create a Core Plot release and post it to GitHub:
    • Xcode 8
    • -
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.11 or later, installed in /Applications
    • +
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.12 or later, installed in /Applications
    • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.36.0 or later
    From d3d52d2248bc3eaab3283202acb160ec372b53d1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 15:25:49 -0400 Subject: [PATCH 258/429] Fixed missing plot data bugs in some of the Plot Gallery examples. --- examples/CorePlotGallery/src/plots/CandlestickPlot.m | 2 +- examples/CorePlotGallery/src/plots/ColoredBarChart.m | 2 +- examples/CorePlotGallery/src/plots/ControlChart.m | 2 +- examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m | 2 +- examples/CorePlotGallery/src/plots/CurvedScatterPlot.m | 2 +- examples/CorePlotGallery/src/plots/DatePlot.m | 2 +- examples/CorePlotGallery/src/plots/DonutChart.m | 2 +- examples/CorePlotGallery/src/plots/GradientScatterPlot.m | 2 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 2 +- examples/CorePlotGallery/src/plots/RangePlot.m | 2 +- examples/CorePlotGallery/src/plots/SimplePieChart.m | 2 +- examples/CorePlotGallery/src/plots/SimpleScatterPlot.m | 2 +- examples/CorePlotGallery/src/plots/SteppedScatterPlot.m | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index ac1898980..d4aa96b91 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -39,7 +39,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( !self.plotData ) { + if ( self.plotData.count == 0 ) { NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { NSTimeInterval x = oneDay * i; diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 1b7e4ea1d..b5e7ffa6d 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -27,7 +27,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { CPTMutableNumberArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { [contentArray addObject:@(10.0 * arc4random() / (double)UINT32_MAX + 5.0)]; diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index 9b8ae15c9..836d26dec 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -38,7 +38,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { CPTMutableNumberArray *contentArray = [NSMutableArray array]; double sum = 0.0; diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m index d68848b84..1a49cef92 100644 --- a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m @@ -47,7 +47,7 @@ -(instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSArray *const xValues = @[@0, @0.1, @0.2, @0.5, @0.6, @0.7, @1]; NSArray *const yValues = @[@(0.5), @0.5, @(-1), @1, @1, @0, @0.1]; diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 9445c7589..94f4e4983 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -59,7 +59,7 @@ -(void)killGraph -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSMutableArray *> *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 11; i++ ) { diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index d11948f08..7179dadb6 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -44,7 +44,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( !self.plotData ) { + if ( self.plotData.count == 0 ) { // Add some data CPTMutablePlotDataArray *newData = [NSMutableArray array]; diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index e7ca3a7c4..d889b83ce 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -30,7 +30,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { self.plotData = @[@20.0, @30.0, @60.0]; } } diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 056456fdc..ce63d545b 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -49,7 +49,7 @@ -(void)killGraph -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSMutableArray *contentArray = [NSMutableArray arrayWithCapacity:100]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index 86cfca07f..a2ce2ac9a 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -39,7 +39,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( !self.plotData ) { + if ( self.plotData.count == 0 ) { NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 8; i++ ) { NSTimeInterval x = oneDay * i; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 31bb76cdd..5fa05060e 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -43,7 +43,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSMutableArray *newData = [NSMutableArray array]; for ( NSUInteger i = 0; i < 5; i++ ) { NSTimeInterval x = oneDay * (i + 1.0); diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 95b855094..375b4f8e5 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -38,7 +38,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { self.plotData = @[@20.0, @30.0, @60.0]; } } diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index 7e9bbed4f..78a7995ee 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -53,7 +53,7 @@ -(void)killGraph -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSMutableArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index cc48d7746..fe26395d3 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -32,7 +32,7 @@ -(nonnull instancetype)init -(void)generateData { - if ( self.plotData == nil ) { + if ( self.plotData.count == 0 ) { NSMutableArray *contentArray = [NSMutableArray array]; for ( NSUInteger i = 0; i < 10; i++ ) { NSNumber *x = @(1.0 + i * 0.05); From 4d5cee9a3cf170401bd36f622e69a143dde3af73 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 17 Sep 2016 15:37:58 -0400 Subject: [PATCH 259/429] Added a check for the tvOS framework to the release instructions. --- scripts/README Creating a release package.md | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 933dfd8f2..1305b5d51 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -39,6 +39,7 @@ Follow these steps to create a Core Plot release and post it to GitHub:

    S=L-_RDLI|`!$nY`vIeR;MGqgj951}*8WaDFgq3S*c?z20ROdcyR z3~D_z7|8gi*&~uY#Bu0{l|yYZp45jKI9|(nbsPB1o2-rGEO9f;{b9B{Kg73a76v^Ps=C%h4uI<$pz6)E zC^VsnOExHZPNd;PsUe7`O6T*0nh?V<6E2VdS~7e?zG4=_9e2^PZj~%L;_$yRz`t4q z<@_LKu+kU>=6*1H4Hpp+QOU6uS}nY@p7BP7a|{5KkO5Ly`vA z+LRp9ikME^Oj$S2htT5Fxf7K)K`z$IkOrB0(&!`00~h`ZnW&>Yuj8MHarfD^bp||) zWtcke8>no$?j_uzVQO~#vz!cO=-;@m7^VXL>J=$MG)EN791lj4fMi6M%*P-!sNb34 z?aK{1ALwW0y6kZuBvY)=l{Z~NOZ|`}gV=DR>Xp2cpgv8GC#vG@fJQKJe)S>um5=^< z%|a#9N9W&~dR|plj{wz0+}+?c4eeh%@J(7U%f%KlaNe@}Ej3b*7yLJ&jZEcA5~9+| zMPN;2-sn+QlM&!d1(J?r__EP4pm`uD(mmy!(nWTVbY_Mwfk7vMBC-@sRHCf&jGD$! zvGMYB5?CuELK4~(@Yn0*5^IZ@f~V3Y^V62uP`VMlhYxmFn>5*CR@FxSF`Chpqf_(s zWtajCh zO;KAXi2Ised6Z|_A$W=0E2Js8uTG%mojmrv749=02I3`dz{7y?dP0?-HUp~|1@_T z7Y=jh{7($n8KO;RN@XHX1V&v;QrXaqCWXQzQkh7mq8e2E$HdK}@ous^Irg6*X>>J! z<;Z|Ls^L_EH@JY0Ld(^*6^0R+`X$?NFF??1;!<@;SafBid#xJ<2^ZnWRel7PB>EC*y%++?5IK{xq6XoR5V>7F8!Kpm1dKyZqee^Ho6v6j(>lmx+hnMQ1XXcu=N9DF&wEuN&f7e zYtuDp&WL=4kLq5z6Cgn-NRf2^>$MtSyu}ew@dx{eXKL}^M;es)PP+cCeaUs*bAbm* z=CMofMGMisHppZ-bYg}$Dy9mG(A6_l1RBXGQUTgf!|k4iKC1TBW-iT>r_M7}I=`-+ zYB$qkfM*F6D0G%_Z^xY&-=pOquh3H!HJPF^W`zCqg^fSg!hPi$-LB8xyzG_jB(zAj zk1Q26b5`}a%eubtY7uK}0O>spcfVX1y;N~MQW!ip+y)n#k_Em*v*X4_o#0;R$g=DB z8W*{PdGT!cv%0-}H=u^gh&M zPeT2-C%0JGt@GBEBM$C{Kxje2oCKe6dtX|4;1b8XW=Sc5nkF0hV~R-Tsxatz1`R1? z^YGLivGMU&19O2P3fc1MJ5|&aXY`n>ZU{*PSGT?(I0slYoa|IZs@tgAe2R1_LR9R@ z%#9MU=uK>WUz9w}UgZlgX-61-QN(oOxGgh>A5+7|N-{KPeZqsM)Em=AktVVj+La%1&FrC+&ovN zCqk3RYr&NN8j|j55o7pXl_*ApUVl$-e3F%hOl!5Dq)MTxQlwU#(B|!{nr~=o)G3Ea zU-7mdc_+BB>*mnMa~17j{rFFw|6jBu!CIK%JHBE1P|C2AuEBC&l9CME*5~?8Y2L{8 zHuZBBBUz}`j{D^=YEoO9e=h0!ZY1rf{)Y{-uG}9kf%Wj;bFNsJ1Rl}nMycC)l9h!1 z7#!GREkQBXBeeIToSIN(znu&xfAG{K_NeavyP@2<78**OV-*ZB!Io$~x{_WtmVAK{7ir*eExL(Ar)|0wWmTI>i~4bTjt(TD zA~{_VtBFR0Tad-WGwd&~e^~;`1awW8+lU8DyTRxpM;NYWEYG!LqO*Kbn}2o$jIP6X zs<>Ti<353(i!&9?40zd_FU}WgpI7EVUqrW;mj{tU+Jp9n3>z9PxUzzIaHcN>!H2Mg z9dmhLJ|_gU1aVt$Und6;F(m;i4Fz7llIaOd(84%T$2!5bOq_=%h7EzXbP5%4d|4$^ zR0a+x9h1ZHF+RlfeDES){I&%A+96LES5e?@*`+OF{5ZJ9aj?9Cs;GVueq5QabqN43 z0(hB`;8&7x(XbR8zc(t!7{pvdz7)hMegjSmVu&mOFG|aIh`=xV7T5QDaQuUjeN1qQ z)%pNFfeqo^0LE+}22lif5k*L91;5bQQBQzJgk(==9&tP^vOg=frZM&Xax|RXuy^|6 zsV*L2sG}7@>18`OgLmu~g@cUK75!w8W0ri;12Jn@MsCHpfynB_#k0lDXbqYTO3wgQ z$1q&cSvrQ{p)(DXb4&x)evElbsi_6eILL^Z5>?QoZ}(o`wbBDz z3FVl#`UlE=!nG~$?~J=IoK%pyiiOq4}~70XHvU%C0P2wrCnUfOp8<`o!)4Aq$e!(dy@iI>aO#& zd2W(@>BNVKv0x(FdUAe!Pa(Ai7VpNCir zJ~x*v@o8ayrOA-8T{NbW7rcAyC9pNBH;G;*5(*^kB8h_=GC6#cfpy@6FB^YRiUq40 z``F?tsJIR*a^zazCM=RaMi~?uJzMij1FzJb3XQ%UJQzu_`Y??BqlYCf;8COgLrgZ( z5s4RRi$y}jg|o`5Il`dpx<*w{Iw3B)JLD~Y79=^Qza}d-8foEK$qa^%PyVKsTb7Ce zR|FtiZ5A{kTMa5<O<3!fb4O9xMAbVYpGQ!cVnx?pXxe7oYc{p3A1j(4hGbv*of z&0~sc>Ed(<<`cpO-YDgq;#n(--LzMlLa+}u$kESK9jX+S?=tbR08L$a5||I4)JKuy zUyC!ZacQx=>i{nm6#NX=G)?09%p`Xl)ii-UgfEuqIrfvW-Dj;ljhG?N7Vu)h_|UqJ zaed~M`x;o@+JaBz4bqtjb)O{><;#f${&jD(K$c6zVT1}aJmUp|s`$n6C4O;1zJiG^ zCK)8w7=$qC^ktMvapy_(iDPAXHqkcz-HFdeJ71i9sos>(GitKv!r72>!NI&fj$RR> zG_F0BQ-%`10%b_90Wjs7NK>@%qO&3~vlv`0^g-HzpZ(abD!G;oH-L?1hSd-CdNj$v zi=km%e9G7-x^V_SF{#AyDVNEZgW=pAw3`P8wb!I7Dn6ob9GP_koY!AaFp1jj>@67V2iwvqGN5qyB+*2Rr< zOCFq4M8n>*hrWg1o4gNKlVnl62gxsvuVS@b0=XOmLSI|D+v3>i8>q3&?^ux@hZLjA zay1yH3UCDV#TMC`wPLGITA#bv_rG|QR*F#jd&5X9c>XhQ79IwEo`f4L+@ARY9F-23 zx*0z%yGP=Ly7fGJIc0l3jx-!T(jCU}=){BcX-R>({Hp1G!BVuk&xM{n0)hB+tl-0q zKdXM5#IoY;%vvys0BEFG0`j#wyXMUcegLZ>NEDT2m*AuQ!*bFTvwUFTp+7^=2a;Z2 zp-!&u4qN`^)t9dx<+vs#Lt58urSG;XSQ|oXkq5!$Z!OTFPZ9FcNFg8Qq47e<-;xP& zpo+)K^Fr{Q-&56DNyH)G4vf^DOjkRz8}-ddhU^fp>nD;hO4Q88CX53ap-iX-m=Ajy zuYoMg6NKE${@~b&ykE5dbnk#)Fjd{@BF9iNbXioK5scTSZx**^QKi;k6M?G zG<>$qiVF$f-!m)j?GdjVrVh&dJ(3j5I{h09yZ50_mYqw)IdAr+2ihj73ve|-o@@A7 z+OF+6y+LqYPD!}`s~;RJ{C}kJ{VRv28IQ?VyAoSldVRco5-!cl9f(~yBumRlW}I$A zt17%nRqPU+He2{6Y<64=Ec9$T1v96>YK>+k;+asa^z|X5y#t)>4n9mZ%YWE}$v-$g zC6Lr_=A#3bW}ze}du7#kpY4-ApK}Vw@~%TYAEIl!vYEX>0dS&sWdF1C6~`gZUU;&L zFSeN{>ux~(B*pIVY??P;qO#8n#aUjkb+QO3* zvHbgX-OPB}bU(&Nr*l!Co)iNd%k~ z?~ogq6Lbx1K8@6xgI(b{uz#J|gR&|CTIEcgw-Y|L81vJQYFngB=;PNo_N4_6Amqlm z-`hlaPNkx*Qu=V|2hK)!Q>_KhYZi#$_Q!AIVD1Y^E!Dtz=S-FdWXmCQ$qNMbZET`L zD<0LnQ67DHgFgFOj!ZDkiwryedT!5I(%3x{+u&S9*@IZ2WZns_w~ddW$^1S9JL}5o zSLTMkZDyXW`^DHjCM~^d-z&kJ`<7;93~Pbkc`JQQ;>+10BJsK6pNX_j z#`SGl|8$nUHqmyGlkXu0|GOD`$yG;t=?jXtQ&DT=)p19ET7pvkWlmcy&Tr7)pejC( zdz*ET-R%wL>+$>f0&FhY5E>GS+^eus%-o6$XL#m)TlUOw-R8eGzH!Z7qaDI;xG{bZ zUNdWa_ifoIk`mE%_==oj<**wL$+*Hi-nW8)t7x{dxckVsps;_@f=1=oEuzLp=g@m| zh`qqT?q%y@jw*+4*^KGgyo*qDw`W*itwQu3%9=S8!X+0SYI^D{$bB>%L+XzfswBx6DpWdH;eZ47EfDQ&p1%Y ztIgvZ8rk&?&VrwuEm^}G*bD2y`f@0{;{(5ghP3HypchT&Fh`~{o<6gE=5exDer{hp zh>!FkzQ~C*gK!sr34ca2utDtj$2c{l&c8bAK2+V4mUW39&}J0%+Ud`~s#x-)8_g1@ zeOTOd*G@Jsz zPnX8X{jV)#Pvxz+D+T|AHrgd`fs+Gk_xnAgks|y?BYIk}w#pHRv z#8(MY)Y-i^I(D>X(S5703|1VupUqQv{2!W5o1SGOPoxri#CppgOsB1!9R7{XT;W}D z*+ayGmHm&DN9Pfo?r|In+JXhZ`d$9Ud`8QtDV#PhfAsoFK7DnQIGOQOvI)z(9icTz1S3TX|tPg zE(vzYxS=^;uzO{jgT82@3)`i&`ZQV&4Lv3?tyDMxF+o2Xx{~*&+q$2K^)Bvv=*dij zuHLP!DmS_M<=uqljV;;lFkEDrw|K+VNZCfgizWQ6yOdw$x2dl4>Z#g}LmaBM9mNJE z^OO2MzBYg~7J`SnqQ^>AiBxHnu7)`*ABw3F4<4(qRxL|OQ^ z8s7@osgbQa?f1(&9^^3%@0kYeXU?uy`8YT*5BSbJ=tXhZzT8DwvDw(6j%&%Nhr;4L zehL!apux_LgK>n(FE1bxQvZy-CRE zCQUEzesSI!p9(YB5Xj=p&b-{b)+{=j@_IgW^dZR5pr35;f~{C*+~o20$j=th??5_f zF?EM{MU8b=H+F?(ZMO+z9ORECn=l;~DJC!&yS!75@61y@3K^|1P5l~jBgG`9p`2@g zq&Ez^r>%=tmSMRQ=b0GvpE?iDKvKdw-(#g^aTb*41HRFF180IMsWsxp>76HEImgAb zZ}At!EOvse$DEGmA4`)=w$OmMVt-gynemNr6ZWeBcjf7LknSlrK9uEOubT{^(7t(O z?bh`pNMYS(t*_Eub$%p62GT_gXS?R)JjtdJa!CpDkQ#wwwVf zqUtw^wZ0!p!mN;|R6^`n?!oXZI;{9Ox6K+9goWBbO`Fwn_J>__2GZ;Afa>x8zw5tf z1?ZxrW!AE`g(CPp4qv*TQOcY;^_vH#u8~*4sfJ_4p}mZm;?M ziE5Bo2Fk5$EXd&tTc@3p-bd$qF`Gon075H5{^Wmai=W)+j{;+izA&fpfs+{Q%%~Ny z8&prVeYPPn6)E~GTA|$<6~E^dG>a!NmZ~!%wYkB0=0gL!nEo^(jUy>l1Cs2qKgE`e zM6BRs0LsR+r8n&OgHye(lM+L%f}zVT_Bw<|L%W;I@78bfAu9KspZTn6&kRVi7I*?i z-9*|uy)}9QE@}vV1&-}D+6RhPQBk4ysBJ5@n053%FtymJ2hO*ywKOYh0ee2-%FIEB zgY?;Pq0fICfc?{)yCx%Hd*jTOfex-Xy}!vkK?a---OXeR9&yfZasp0+9|s6}`f1~2 zg;REgNutqXmNh1r=Ap*8qcco!SKbA`T5KKq+W_nQ&JLc&Teoz@)&NsPe2_|ZMkb1L zgFhik0DNnr#BEF{wXtGGrC%$c<)l$@~ubP0Z22Skv}!R0pR zJj4C77n6S*08!xmuU$xHs;%?7VAbs`w}aiS@}VT6Ac;8dTidJh)qB`Xy;@XW=Jw0N zns{?)a?10IROe^kk`trQ!PJW0)ub?|-q}Q9G`Xs#lwQd0lH6oE1sg0-uWa}?fQ}Nx zR$Sid7FXq`@5$wp;D!;R(`71g@yiffAKG+3*eg&^2= z88trjv#x4S+%b;&0sX=piMys*Dz*_zoUn?*@%b?Bm{rh+{C!P0vyagChZ9bu?*G9F zgMdPyy9(%nl%jH2qRrb5-m#dGTbVY_LDu9!sgU3u6;g!W6fppNHUsMept&kZ<}3s|`BKOXTnP_d62 z9FeElEx#G<%crWn{aXogPxWsE|YbEyxve<4L!@8rPYYSHseLRAG zjdgtTMYDK_$8o>EgxZl?uH=JGkA>;pGf?a0KOPibSVWDD*&0!ECo57|F~2gc=-(zs z{eNfAR(xZ>9kG{Wygk@6wPS)CJ}77Qi_fxWn@466TR}tFMgqca(dRNjt^mmbB zS*;!v{xTul+e!!xEsPY&a+G*t8&w)1m+f%-b8oG+w`XUf9MPF%(?V&;{8nOXslJaljyqM}7bUet@WtvxQoHD5 zKA*-EA@wKdK>#`DNE*ZF^AV~d1|{8I)v2vvtNzUoyrxQs-j24~e+;`za)>v1aLUz+ zcBhR`vb#&H89!7)vz%!cYx;>dY~vmOm~LNgPV=hldzZ62X{>MbT3$qk>Zj|E^L!%4%^JFD?k$&^xC>BfE{NXB-o&_ zeg2m*HKimO7lQ_oXdvcHExcgnp?k#&3#ep2I3~J-wDPtb z%d$!S_JCI$o!eg4a0qoQQ5v1Ytv}P6sY};4;v9_)0`hp2+C$VC6Tpxn-tz>|yeKK? z5&(`4jr4?D&uMWrWc=B8Mt{!@1_6`Gi_yY<^uB9uG`D3^0?-UkN0W?cM{r7@q{X4_T{)yOcoC_ba?OpArdSf5N zknGslJUI2>8qvJi(T!sle%cC~xy`yK50@Et?)WPuuMmPcBS6>ZbbLfqB@BEuSNKNt z&MaArNz_fY*jYZ-*X+J3H$Q>b;#B~8|G@!W)n#~XGqf?zCg9)_x4vv6=s7~~8^l|T zQr?m||7^AljSWA(nA;TRB@rJW6HeDXcBBt<^zh_mHqwgu&dBk}Z%fCSI$|LOkmf@e zC`zA*hc3;KR+t2AR$x(}kF*l$$#?~-JjwvL1AsSx;z2@PX%$j88}9UW>D->p`PtNM z;~wBvH$J21EOQ%m^9N{|X%8IkG{=xHe`i*`3NJm*0!T}?>o?G}YtqBe#f)G>yVysh zLMsfdq9dU6sbO-VWAAZ@Iqcw9KeVpw%mUH^u{&DbI;v-oeg+wGPf?L=#Pf?HhlBt7 zdEq~hU>6|xg4V&)b9i8OV;G2}x#RU@|oZqj4xh*>j1OgeIzF7mzUrMaPPr#O&fKzcU|);PFHxQDn3q zmQ;@~%bdVP{|b)2rnpqa_0R^Ren0R;#yZvx zRg=4d5Sq63>nNAM$=u>>N6Qrqv1}=NY^g2C??$4SnhrVC&`W~pdhGQ*w_n`N0}}s# z@CoQ>onAJ4!co6x15@J-Q))7{nPl7(x$uf#HGinVLnPq5Mak53Hjg4_R2h~$C&Gke}cfvS(%p>q!Zv-)bfb=W;pNQ&B z$fb;!N?V^6Z)rT{d`L{k`FWpgdvFOh$P3?^p4NI%VJEyD!9d`%D%iMjTdLb`owtAg zt6^DXO7ZAqFGS(1xI~A%tm%2K_tF990{?Ts!A3F4#sN+|y z$n#$*%sX$vJFM_*FP5y3l@gyg-@C}9i80I1nFj)f z6jgqlaxu}lHGrh{(Ka%wE$ynU{gU-HIRjZvDTg}cG*TtB^AfE4Ox>fi0&3ZxYUeh# z|F`sGGXp4?89g%tn7sf=p<$=IHCmI>i?E*3p=<~Lhdt4DY+mri9DYX6;e<#IRX>Lm zVL$e>`8QQ_?~}%|C-81jIssbZq4*N{>;u+~o=W>4-1!Yj{H@s+oZg{K)4%{x5b0%z zat8GE{w*`_d>J&;PL~}7bTGtM9JyOlx(hYkCNnS1yN0?0>C}_Qj$Ao+Wv#XP^5E&0 zU%KD(F+z*=I+Cm`LU#0B(;90v=I5DCs}63#oyFzynIt{vPNmhH3Vgbo+I(aX&@YLiX_^9`Wj;PUJe=hAv?y|+3bq3!3v(*YsgG%H4= zfr%B92mz<$(jhidYV_C=3W%$UCP|N04*&x`y8k@t49nB>f~fPl2pGB z88w!ep$CPD`(0;KJL-X}!%40Z88TTzC86i3d%mT9p{AW({}tfJMxXyQ@@oX9!oz;8Ln2kq zDiu*dI>=%*2_mIelmgdDqcuh{V#3U1oQ$pKFhZqM)Ob|y1MQUw+k5i`W? z7lY*2NzL}44QvFhHMhTaRQWRcq^XHFEW)i;QPrw8xc(B{5uf00jm%1Y~M#5PR!LSn-q)Wk&6UL8d`?-;<% znH5xsL-*OMJamtlO-4xERz`|Wih4>*(tBwAFFC_MOvgICs?c3aRv%&FKiA;rJO3!( z3eQvIgRpko>Y!LSfJTLVUWUnbvw-!AS$4V$S$r+LGcQ$vHWoo)3fMy)ek_%xM~|dV}fT5;Bf!pTD3%@MyvIn2+`o_ zESj9_kdqX1EU{gB$JA#~k{KDXQE>ax0A!#4lLxW+GpZ1YUb*HSJtVFpN$SWZY>&FR z$j~e2pqZQWkL@*&>o-egtXboncY)yL`0CJ|xH~i<;($e|v^-Gzn2H+b)FhM~QKsTbE7+b4u&EirF~0}7;}bCW1QQJ+O@M#uyC z^CcY7ccid=hM!IXnfyhPDjR%`ga4g;UtK-|4icXN(y8(xPVj4k3aPFaf{PwN3{!Lk z(j%n&rjUJ15meq3?9SdHJYoPE{#23dR*M+eihX=_lE^@D4SEF?g%e~hByo<;3z*@N+@1q~;Kv4s9T$@*OqW!=(IDK3VaNBw~?VtbI(8LgauU z@G&&zfX2}o33l9SVWm<9glFrEmez1$_I$E$3d?5| ziz`n=s1ou0SqDx=A1?noZrd1vjaf)kGuNp-3)-KZJVZ%x9%-lF8s5O4k42qqqPMqi z)s^#$LlEh){IDw z2ETs;)o`uG7=xgkABKS2`=OH}F}!`9{A&YhjiG}1+z$vqkd}oDbWt*5JKnzZ@cj&F z9gbUscH{-r#VzCN3s-|jtQcmE%Yp=;ld;7*;!6o?#?1X;2q50D2c`TXZIYo;`^DwQ z?hk>G&!t7Lz2=Uc9l+V+ODM_mRBQ>w;=V82+*T6N?L(6LP!W@w4U_!EN01y$0cstR zBdu63!ghZ}v1`V+sY`|gIM3ujMxfILnmI>076FH*4oDF|qv11e!a38}1rK88_&Bd; zF{dS0z9`~OSF-DHqG7$DQ-VWLxctCf;}MkSxO(G77#8c$;u2d7%&CrG_>t%#d07W% zn>`i%we3T2TK>9XN)kAhlLdHLnk0Ab5owpTYd20!FkY z|P}C+tK0)p6X- zpf5#gkBr$!O-ZqCqPnfoBvKF8F;WWu?$`ruK^^xm~FaADs83-Hsn=l7cQ z5FmGzHadX`V9)y^FC~Bx226wa85VWK{u*qI=UkFg)u9Izsq$^fdhL=$5seY|z^w{! z<_kvNqc%5TAiRBx7B#@X;4h`vDK9j$?#08xxjW#E&XAYj5}nkV*=+%?x%X`xK(F{i zKnqgAXitTMr$_EM*-IiSkoQh4gZEvNqJ$S%l6e$9to(`H4ANF`uUM3YC07A4fZWoj zoCaB1)w)PUHMmW6zSNu#(j+2ss9MjEr*`ECBS$GqZ0sGfg|<96%&6*9soIK&0JNe$ zu!-4pEANt+40uXE2=R2zQ)Pj=24Jf_bY&i4Zf`9D0JTU3Hi>0{q8^P6KyxLlxuU|= z`ds2z=gZzb2=SgYvTUeO&hV z)M3xv{$g8hcInL?U!r>3Oa4+*FLVsk#Ymt*|1b_T3|7LOK(8w&C)+h?ULE%Pf~Fmy zm0Ez%Jw^#C_FUP&Kft@Q_|*@r#ME@uSes+A4u~vlw@5e+3T)Xz)>2aprFlqp9jLJn zA(^>8xX`^ebNBgpN7=1Smfj1bCB*>aR1%O}cpI0o0PrWXOE4EI(rg`E8GS%8Sp$?8 zZa}PCfKHfqOZtw_24Gojf~8bKTpN|>OP6&$FqRIpNBj@2;cu(=v{wPESv}BU$TahC z05nkVNdD(>&dB4Z0MCiHSZ5SX6zIex!?p*aN-H$X@V$-BdUfE|)p=Q&5NVJF5d}!G zSqN}LADD^(SKa?`nEwMSQkQa|&&!_g1NE=0v9;}UF?_ah?zdK>F>_u{E8t0GKF-Hm zo;Np~1L53KM{EmhPQ1U+TZb>GACpXLG_48wk#)(SNjPs{OkWTavuR>n=`v#uc6A3Mn-ucY*R6c<`^Bo& zb=X9odatnROo-0dncYSP=J9kll2QSLtAC--ZQ!$ z)3bT1qo;oh`u{yRs)gy;z6y$-b>gaa?m*c@CfxTuUC6t2;wIVt{D!SWa}2l7Te{ae zJj+KeuHR5wWwmADSIo1{A^(!Kcz{*dMQjX%vrxx>Xe}%U75FWE4J*P2x=zL6p>T># z;O?tsy{LNZ#qKi{uew!r_7LZmNUVKfdmkbcJ8Fvps3XPk(2dV-k3o2q#6UUFP{+)m zyV^=y7A#t$0fbwo&A1z@mg-2c1@JArgVSRF-B@xd-@sI7kYq9w;DAo^K@;SwQnWlN zp2!wB>hAL*@>Cdv0z+fUi}Z8HIpU?lrlle4^S8}iv+!u9D3pF`7jEA3X*b4`ea8n% zgUi{Mt$^w!V}bQ7JHRXhpCvh6)14P%5INk@X@V=zHW1f%&gaf~k@aKH2)Hs4^}9$? z0=8c1a1OJGi5ZOoNH8|?q9Jc1c{hDpnI(Rqf#k z)xM#_bX^wuE&8P|CHnOs$I;ozy7@3qp@C`*d&`!@bNW&g8|k z8;WE;?t=sB!E6UFxChIK1F>ZG8x z;fCE!02qnocN4ugesQm654>cM-k=JtIYMgf4!D>ORAlsNwm@*k*%ffc8Eug?z+~55 z(-`Gt%8l)ikW-xk&=4W@=|Pf~M(>T1H{S|~Qu}h=LyL`SHhh3|gv$dtV5Gv<-T*O< zqq>;sXP~fIqjBF`w$nkg8Hr+v`SU(PxX>I;t) zIWS%ZznEeuwoHbTmoXH;Y@0otRznc_)+uuE@#CN2Tus{fZMQc#hVrp;f(C{PP zlw4D0%$0f0j-!;u+Z5w*_^jXCfY1u%}-%7$~cVlUdegl z@sYenQ^Gk$dEWc#n2{SU&Ck<`xmJ`WY*y$}TdecXa%>E%J%0Cxd&jcy#5GZFiOzaw^sHT?OF$a;o@ z+Yjnt`MyHnmb22~L98=-VnrmAn?mSC*;nfLsH{yh>agxIFHFc4uy|aJ9&{3#+L4Gz zb-q}gj{&5CL!=>DDG-EfD&+w+I3VYV;IpJ~Y26iiZSs7JhQbS3v2XB~|0gDm@3?k= zMT7Kf#|nG0fU4W3wVTq?Zuu|B7~ae}y7m(EK~>fbVjIE_kjra73Pz3jX-K2Poh@zs zSiY*h^`l%BP>IUdwu1acYp@^*k?CYLNd;u>GALF7#BwHZA@fOzqLwT0OoeO)Z*&HY zDUEW&shdb@BwBas{yMofUJ5-@lp)t5)XaVDv?l>sEPSUysz3zYR2-s&v`SO9feT2d z0EiUafa161w@xsmWLp^@)u&c68M;ymzNyza47m5?`+$sJ1fHCVS*pE3_BAa)p$agk zAX!Nt<*WJu=7MW@I&!OwH>OX?qalSyK#`a)H;B=?oF=hyk)d8rYA6qt@3_p3RM!c- zsOrp|4wL&@wK==g8oFG|Sb`!${NhOD6i2<;C>VI$A%h81?rn1~g?_ z35g0nE}}p#+XjL@Fu@>FzE{1vE&U?6e4%0L{%y9F<~bf?g^=PEtNXRjzYtA<@5=`a zhezu-k=Zr2qtnJ4T7K06h-cq+g1%1-AKGQJV&KdBlw_^UE8RL(aUt3~Cw@Ewrg{6* z#p3f>w#yK@y|(cKgfF=-gm-ky+2!kR9kc_ewi+a&rRENndcNo(?kM6-fqnh`=ICoqm}81G*z-@;$+iC}+SE?x-?4Vfyp+k6Zh=;H7r z^Ek8*p|Cl(gnbQV$X9;*;ZLCbZApP%b>HoTuT=?XF3#)4mXf*qEQUR>~}ubM3ZuP!@rv(#;N$dB>{;x9qy)LoD4bh%6&}bh#c&^r%I;{9W zFi~SYB?PoHxmDjlc@h|sid<{8R{pAwM*T;lj?;Cv?iAPtguf!|=60=Tn=UxJV1J~k z?KlO_$c+q+s7OG3Lk*q{;m?pqBh3#1w5 zEI|JoJe`eC)1KUA|4tIb_W%hO8>D;Q3a9^%y)Tbz^4iu`QK_O*YZXN$TB}%5Q4x_L zi9;(^RI~~a8R86rGKdIdRH?I=Dn&$rsEEiI5iv|jKm=qkVUA1*b07giW-`9t4z%ak z-t(Pv&;5F)`}_Xlmt+s?-6VUjz1H(QOWFR=>t#2KNm{!SUs@+RlozAZGLX=`J-JYC zqvd2JP!O%C*T;V9labm1KLnolt`Rok##%xYvn{$j}6Y6wJVdqVv%`p04TJqFTr!UdmIl}#{5R~kN9F^i4ratGput-q1cbH4#NQZ?&M0Ls z%D+zCc#hMMXnatsv6>LIIe*7z2g&7$b|d{$$gj_=W4W4i6n6Hb2f(V*uNC*37ulqrQKNx2)g5TTL-sFk@sQN%h2l$*(nJ z%8mWi53hbQJ%l+PF%i+RA9=pW4X!F`))k*c*MHgp9dKq{k)Z?s+N{lKjz$n6TPX9=GW)ZvJGp1zTP>+BQ;k0g1{!SL*%b=^bGLOze)NE)vETK z=gQA=FUW`|_9hz>BsOGSEmFm0Wu1pcV9I4ENZP~o#4ETbVY-m)lrbzD>F>a@iS*I$ zy=aLwI=GIwTJXgxn-&rie_Rim>x2LIkaB!3PIlat0KDnFM3JSgH;Vp9sCSneEhmI4 zl<-@Ws!aN}d|m$Ttjt*O6X?_WSpp!Qrzw_QtAh`o!O< z)RVk;&UnMeM$dAalxwb!SY)0{tv?X-0wm^vv}qX7qT$<~OCtD&5V8T*?Pv7dC?|Yx zMQ?gcdhHjkD4tC#&@2mg1u7+|1P^QBnOSRqnALbw@A0NC5@uh`e{CAjXQtWCacou; z3h~L{`vdh10JSKnTS_EC3bIZFlywJ=!_+ax)5vz(Os*`$8*gWaJT==Dr56cpKr@xsiMa7^tytM0fS`t-Dhicg;+Z{;f%b&(7ElQgS38;M!e;wQE zua5oSHzP#r<3HpmTNB`0ebH5n6!HyIo9gR>szzJ_#vi@bLS`U1Ah2-sl+z9-WL=bTV;Fl^LlX#zuY32^;p)d!a zY!qYWA>^aJ7{d3A$l*SyW+wztm2NB`p+rC-Q)9I8&}t+YvlTt|$~Hj75+ASx8ca%0 z?F%r8E?d)3rSm6_z2X%PAgi2dgU;HX&=3ImaVJy-*lHz29m^T$Eg^I0x*O1zex?(HmiR~71hDiWk5$r8L=oFjqS)Bp7e0p;CB>#aDD$p&VZhsviDhsSf5yVV#14heF9i)vTh{`Ma;Zi#Gh(a3yCpAZJ~N{o}Y*HzoQ? zewvHIe>`4o(EHB*Zw=E`g*#@fK=Njj7I_GhRx~t<^n^E2#vjWwn}KFnAA;!ywjKY+ z)ArCGqT&j?kZM2T5JfxU`6!o82-G$88a_Q_lH1rF4)VM4!Q?DJ5Nn#z)qiUCosk3O zScknFd0 z6&O$8wj>u^_+9>JzWpV&Zo)_`ElYa3aP5(L(sI}Rn`Rt(_}Q1M=ersY#$LOe9I5-fW2)&$o4>KchAoMa zIs?oqY0c+t7iVnTICR=rGja6zSC<|ip1JR9rwyy;e|77`-GeE?v}$zE&1ha5o>d_H zZpV%xrxWRTrWbaIgynoluX?|emkaNPwJR3+Ckn9s-ISW+Z3(5e3%?b7r`1YV zi)URLdN??({Q~p;(0YH?vAAyeZQ^-uaBgI#FfWp^jTD5P$6G}8)+DMEO3ngh)U%qo znA@${oBv_oBzA)aadR=DT5RDUG3}p70Xqpq` z7Wg37wftZ3fQSqc@L0$WdXU@{;+tgcE_7Vm=p@2U*vn zu<2=|)yOX4(08_-mmAiXRFez$!%AxS%)kz}r!`;qUa)z0Iail|c7R{4~*KABHql~Eg0 zz28;9n_O^x0L(3a8W*^g|KMn!Gv`IZY;(mS)Yw3+x6Zwtl5+fNEHXS1vm>tUxM!)i zZZ3Smh3xdv(Lgtc{jv5+mrMbsXcBdXFqip`d;7`Q7@Al-eFis0$ zJ8yTl!f+$SDBSU?9Xns3zqDDkC|-J2yKKq3>Ke%tBj&L;@*8vcF^Y{h?JHwem@d=$ zviyMmaLkc#?24*U%W$ZtK8V>EtK7+GkzjwEb*S`?=G}BznvlpPGK<$RZ*8;<27O2^ z0J-Nf_}+On2Cq|V1grZO-OfzpefQAkwlodyJLjo^Yt}NNZblIT!s~30CraMB&3S8} z7%AO){2fL9e)%sm)(RwC9@@JzTdWaEATi9emmWb4^V%5|OZxLL$gF-)6H|tSICw=n zmg*~Co$qM(@(^ZXSjDBKS51-1o;lTJ30s^Wo7c?gpC+A*nFPON`0%2a29yob)+x~w z2#{96g4T;bS#6$F1nME|n-c&0lg6O$#c5|~6B-IOdez+|eQcHX5Aq>Q^S5;k19?ux@n6 zgz<<|<{!0fzwk;O*L^{ZZU57we`2A2CI0l%BVbbDErX=N3#aZ0Ip~SZ374<S+AU6y#W0wwCA#C`hQ7jTonh2)<;x-Gp~ zKjlss1xsq_7x~cGO$9Psrl&ARmJhY=?PyU5S}@chU2pdHA=sgqzL1$z%f^C`ICj50 zDcrMU$VukEm}i}jKkda1RR2J8FAtCOM?Yj+x6uy@n}WO&TmK!pV4X;zzRM88k73*u z%y~%3b#*0r;@%%Jzxh`E^&Gx<5_4gMWnkd!s+QTAyz|6pq}I&-l@)g-A&t}EkQyTb zRpFN-wF}4sxCn&jvlFrxW{{Xx-BykqZcj3@JD6rp2R|~%!6sW)EBRRzYt9N4*ONtg zoH<+`gGEeu)U4_cuNAp}1jBN}+_z zJM{*EN!Wmp^eFcdR8|N!wo9#1C|SW)?l8FX0&=(*Xa0*h#^E{_vhPFB(W0Jg<2xFj z$;Ir+jfl5LR?IIAKCpw{7Ex6beT~-RI}@ZZvql|FEwCx%tXN7HEHc@0o#Z4uHXtNk zwScT#rK=57O|?QdMJZj`DP+-j6Hw;*|2O&lx_E19L;9*P&xk^xpR#Y-Go;adPX95+ z%^0-F=uNyFAz>7Ge@mNkuqZs4e{Eg){kAIvs4U zY6+LcAm{`)-V4`YiH!Z#G%k871G-s~lj^+q@wq3Lo-fO}C~nV2|D;wRr)J63uSDmWI<`1LHsVw`Irq@+Nav}^B_p9Q^ z+U@5vG9Huzi1EO}wgbtz;0I&Xo!w?tP+lZ@m?!K=P`w*ca}{V_2hKlXv1uSn8Q#9g zmzKsLLs~UAJ6kjO8B^@YScZ=K_J>k^ZjnjuuZ?@+2SmPtwp(^9iM>w>iiHSE<>l9kHTaE4LYL7VV zOBRs~As`tKZK+16`V;H1LRu(BPMkod%X294x)Eb&BocdKB+n51U&)Y8!zM#E!x4yY z9>0L(G1ZdBX#v8pSyXDG7Y1BIVs4)uJKy6!k2he#!z#jC5N9bE zaKoZ(D7Oc9t_NDazusoMx%w{~E7-WOCtS>*a|&A?oJ(6Qs}rpEXPh|WuGI*5;B=3d}EM;Zhk%t!R&0v&Z3 z@MGbJMqak2p-PjHeigW$DX8uPjKj$wd$|z-6ul+2Ho2x`Rim9OJ0THlrYKqcXRnTvbDs*#?{J6FB&R}gqZ=ThH>h?0L62;4{1C`EpVcKkhqR*&vSQ(0#hc?rN^7{zH=X<(p3c2)tHz!KAn25(_n7*rk0)<674P` z>j*!~`04uX=kAUvfg_sS^F}V+3|e?rTvg85Nj|g=P^@boEX{kbSH1ooCdlv@-BOwx zxk(BBS`Z8M#hzlZQY51jrF1C{>)vDAO2iI?yPgRONrIKw3$#6!`# z4AL^}Ya8E#`959dCIV0hvPZ0XBUQXBn73)=S*jI^U&YlTp-Zv0X--YH=yoHyyuY|N z;dYl+cPyf^^FrTlys~0k==<=;)HgXfaSCc^TdqJpAz>W&}ho@1X{~abgQ%pA)?)zv#6UH@0wOx#Xlz z5?NG1(ZpKnHPh;uIB)UWnCh4((S$N{hS;0l19VV#+e_jrjL;jDmqb_{71vg5p3cN)P;s%A-Bv`E zg?2Vq@nWV&qy1sDf}t(b_T#i(q%*_z9~DHkEGVsTL3HLKzKW?9*+f&E&y zJ%a}pj`bMv!M78^mA5Azp5CN&pE4zepBd8MK49v&J;EenYRpEoDFCBGq&NLE(GnIU$>)L z#0l+$E2H1qfOY{5ne;g$`VfM$mrOSp$wBJ}qrEg-RRl)ARL78S{C{|(!;OX1bt4Iu z&16VP=DG*02~$kHDUh#}b3!NF`OF<#m@&091Z#1jzuSFDG4JwrepK7DfR}3aCCoi4 z=Hr*N%XmnwQ@hPKduaapd&&|0WtlK9p=Lkq&9+}(UA@*f?QEUJM-a&pM-M%OL$fv=w($; z4vXm%Hu-Qs3Y6TxXz&AIj#7rfM zZT-|BmcxDC`y$gchG+XOpGecDi!E0UY~AjvcI!p@Sebn7KI9!u-1@z- z>8lpjDroDYyd};0)<(N9H9s{HT$PEZbTQtRa@|5TlRlf*412McAwNJ)(CGm6V7nq` z6ABE3PGhP(L(op4dP8#fh0#p?(C&@+HSPML*{Kp& zJH15#E{dG05RmV}Z2mSTowN zZI&ahBS(UEXZgj@9Lbywu70=*JXxY_E3)O)itS~ zu9raBYTbaoCc87h1TzS#cCMDO7a9fmkNRYC!uDZ0I1kX9p)|&se)NQc+~vdrY*;)Qjf$g6oGvYZ-k(oT$>@f#AXuD(gu%`z{@iVu7aFB zaoEug(+}Hl$%URhh~A>)p#PKzPV@VMl_bhxg*QL!~Ke4=%#^ z_(Z}bqMdVgcZfdSkFx_CC)t4+5c1|&0?6F-P!oE0@WA=q8ZU%P4R-pF!ALD zWK~!3U1RqbevQsvFYD~hn@3-nI(x0_wu%l5>?xVYKP-zfNtZIe-$YL@i!!Mm-M!pw zk@Dr0d{=GH6boALy-3S6QO^`B!~r1rhdA>j(*+q`yh|8&qPxo1A-woD>)=0pc%{b5 z{LMZSoiRc)BIOJOCxZ&#Tsv(Ean#ruQZqC$$wY;apq2tsJQQfMjP51XwotSWtFbZi z@M)tkT?sK4J28y3@lZAY31h}lSoP>^*d5%*ZJttOy%W;mKXXz3(!bQ^hxY0a!o>Gm zqDzMw)8AcA9F_KBzO-sxHt$Q;(CsMal4}vPknJ7Mn|x-PEDAaoaK-)>$XYq#F!zlM z)I?oqx3&GLw}5v)&G1K~SBxtbZ4FE3{mdPj%~h8SgU~cNyCk+_@JzfpAj|!vUE|UD zd{)+DjX!CW1G}I<9^w`=CwqGf9EvA)ULFkSoNg0xUE41}BO!w&=};>}9qJ4TQ4EYq z!$T5PJyFiXZ>7N#WtT~}Oo%N!@2PzI3AM9XXS+^)W)dgD5w8e>Ufr02x6B*W=#GsA zh=IBtr+;;%eDk#qkdL=$b4&Njg?9z_^_C2StPz^G)%%*&lbp;9i8M|mw(uB9^7hXN zJaFaEJ_2|~p>Y9-QWKf8yf0^Gha_}d4BRTGzU<0}EqvCLA$gQ{qmiyZT^220^7&Dd z6O^~KDTy;r4e!Sf+Qx+8+?AboFhz#LwZZW&i101K?=K`dE;=MSfc9h5OjPuTYgUmR z9=~qOly+R6i<*tyeJ?fe7975JS1K%Px7x9FvKKNNqAC#U1aq2)Wqf=nN#l zPmB!dZGQfX%>?aCTJ*3K27FShYVi(IAK-j@;G9FTB4Lka0&?>NFxDJh6pKa2u&MmbXGF+;%(ldIAa+a5i$6saz z-}@bK_{-gfWNE;`rxTu+r}V=Mw42jt1Q+1Lvsu#3b3sp-cMh9U37mUXtXc9?(9=5Y zJB8^(pJ_5DA%9pqV+-*~@{d1#R{hmS!yA`)YI?cTHf6;(NO?7B>I0m-co)npw=#L} zK0EL$Pb2Ur7eH#{*FWc7Y{Ye5O2Z9XuUt&Ept&GJ#yt1ntDEQC8T~Oo6YsTIu*8;G zk$_JTQ&hE6DDBQJ#^GC4Q*(qDlBj%h%a2;(1q1{IYq}S!@`yw&1>)ageH@S~AP(1_ zrj@ty$ZDXAh!^6%O_h||PC_Z;LjGifT0^|R1UfWXdN57GQo`Do095CxE*wcWs0i9C zA9RW)Hj>tc4G~f??~Uqg!0k+LVtDZ|_!q=2W&XGf@g&oaY{InLc_;XlH#$|b44HMO zfkL}Ggf)xNoh*KUc`SC~pZpJ*XRMz7w{s&^%gPU}T{SW0BKS z|M~MJZuxoal7Z0au`xvt*y0K>dX zb3|HuEL;eXGDH4lL(23D_ziw|?2TX(;i7etjJc zac3~Lmi);ucUr>~vkZ!wft=Vk-7MbHuH(3#LtN!uaXcd?zbH{Ms1rJ0%)9K!yESX{ zqjWfw3x3Iy5pUGrd3MyQRNxXcA$SUjX|i}EYoJ|7M?!7pBU$a1{7IxHHrNU$Kd=Zp zPw&4-+9M<=v`QZ05^0FA-z4lcoen9?i#&=GCEpnqUg2nG`7`nrsEYyQVZzj@-<($? z{ODqUV4kfkrDzt`YDn_yp|y@7L6jr;pAI1ZXoDA*#9<`uXS6 zk)s_EZXeIX;7?lXF9wF)Zr%E5tseD!QIC4oy8;C_ON8q`1$&RV0%@ByX5F6xr2l=I zejGKMZVcF5H~U)WyR3T?D0tdDn{hM5Gxssh-(K-W0iWb?B$`o|)|G82z6@XnF@jVt z@nsj?F3L@o>b()bCU|A0VJeJVl@_#B2*EN-0BFGEW%8F>9_pn?Q%BQDg?i{gZ+>b_ z;V%Or{=k8--3(bqK)h5CpowGzsgxkvRc}KVMM~^s|3a(&?seJ#ZBOSuS-BkG5!YHz zcO;k^ie|Iuew`9pY&^z_!vWOgI>r=+8b;2jg{Kd*R-W<`&QsJ&hH8c2X2xYz-*4wZ zI;i-ybsC%wCp)wArhpSxt5jIMImuN?gn5p5@%#COQ(5z-Vh?5BC?tr1BV6!H+ zYq3Ox6aO6JjA|-Zs-t7HR8NJAW z#6Ms-e}GxF2A1=Ka~UkdQuf}!tTEYUo#ZsFSD;fXh|G?`!N47w)j`ikJ}`rQ-x^dz zdL2t5YpQwHBwPwPE>V_bh6e{(0mQR3h~3U~7p&oWck2A6W=mW@n6r4-A-M^C!v>sd~pN$bWG;Zno^!rSis}YYQhfXgP=bpo|nZ3NdaUNhT<6mt^hd_ zhfQ#86=OX5s6S-Z?s)q7Ut^vmZ2s59Zh^0t0YoC**d5 zJI1?Kx}Sc6J0tJLk`5fXCl(kG`lGpj7?|ey8x)6nvYit(SW8J_Op2SdYv;Y)x)tdQ zGHcHICflf*5Lkbfrr*I;n$Z5-3llFxDQm;i!R2KS&4m~Zi!Z+k25WHte|-BYSJgz_ z3(2{<*0Iew`1H1+fn&2?rRi2NHkwJkqimz5;F;-2 zWg6kUci3623%s#WA8E#ACJ6b3PwY!p(Z$LB0OZw`Q{JfMLfWOg96MN_U5TH7!cWQ6 zV_0p;X}kivfPUu7n=oZklAX+gGMfw!%DUp=&zPpIH;~zPB_^lBO5a9%ics3RwtQE? z2TcksHFh)d<`m%1b)KLQch%zkzMw0?OSHtmeSM?WUg*JKho2fBkyP!0o|W&PsEKb+QdR z98O&f_|m>5f^nl=PlPC(H629pB;{9Gb4PLCTEZR=MhqZteKZN{Fe4CkLI}1ku{lzH zW-vILOteHwSjOEFu8|tVj;!J=MwHi85|-i3yo-aZ&&?i4syB;N02Rq-4nGP@XC6qP zNXTlX6-&}V(21~J+2QL@>v&a&2ZRjmWkY>dP9)P`$q74l$bBqXb%7t;O!!@HHAG$b z`a3*OW&T49enj~hTBqz^eGJ`k2|KD)GKP6b-f1dtZj^d5ecSvqaSVff-=F`cX3kfW z0VBu|v@)pdn-^qtFj`C-9pyHUq{I_8MR^u~&smV!WL1BZp%$ts*)=>!c`e4R4Ub5G zmou@NiJjBQqBYaR%$G>WPjP&cqkJ6Pd4-^pNu1|&tZswD0HBru(MAIvWN@jJ-tM*! zFNu(l3$a));)!PQ@yq1k1hph9wHl)BtpZ6c1A^b+LK=nn@ETtG`m?0g;{ru8*iH|A z@x>+Vv?;mnQ9$FLwtdom#ywmG@KpP z)9lKxg5PAe9nGBDsRndG*g_DDVDY61ZC8bWW=K2(e!cLtdhEG{^szCYfL$hiudw1j zptClge{iM~(qP2&%BpW{j2<2JA;Wv$mN6bO>g@RdxylEOCCXtG#!(v!z3>7wqSTP2 z&<3)S^oM^y;rEiMuH6>8{lvxq6{#<+3mr|C+H%H&6M4q)A{%ocMm< z>1y=w(TKn+`FC^^qvMu@7p;O>e@?~?9Y|{(JgM#asr9V<2V}PeV1YJIWa3C&x#I0F}2A<4(PAEeW_z#wb7Xb{=K=i}+TPdT9JM+ulpQ5BD zix1S#r~o0}2q*Mm5~fV}8QXftCaeoQn%HEc?g7#H;v~xq;ESYClJ}!f)mw2$}HxIhV{_;ep5`+A3Y93*jM?Y8f zwH}TSSCWvrQU4D|egubm=9!g-Hl0hwF1^^9{-~fBRRN?wQ^?4dur7%!elKk*H7(ak zt5phFL?S@2Q+O8%c+oAi1Ae5~FgXA(a8D)yZ?UetvNT9n9jrc9{M9~NJwk(R8+Kjd zx~Lp$?eH!9PecnqMiU_*F34wN8D}*ehR9qhU4Cp}%45Ri7#+h**FJwR27*{=y}d?7 zAR16Wx#u<5-}%f)%6;jzFJWVi%||UmGgJLNchuxV5Vu(GsfWxvKMP@G!ZQQx3IGs* zWJm}`80{QD5qeQfOGs+Sq;f&hE?!Sy8wwz*a}cLS+ai8>APS@;X28UeJ-FfGU+4i^ zCA1oF-YSi@AQooxPWG}B!z8eYTMvcJ!_J$KfYuEl_o4@jzdv}7W@2-=f0L-L>AP8j zlD=DbdE6~zt*w8F1hA3O3xQ8j(QTbeW9wz$sR~u6rxAFoR$TfCA&>)L<_x z#8YbZJs$h%ClMY7yKy8Pkixu>4mH+oV3N=^z}MQr^*axGnDv|LCn=Z*w(vxub-uob z9{)0~WvEiI83fK3gzkmh&8_{um)4wD?=CDh0has_KJ#B<+~2uon7#1EO{(Q)Aq6wp ziW9u$9DA#Y?}xnuuKI4lnJy?*ajvrx&K*gN`OMqZIR`zEMCKG4vX&wi4IM{UI@8h} zZ9hiQFtd$T5l&=>z9y$T=lfJ%`%qX1C_u;BnlQaz%{w^w{*fmUMFzEi#pz4+XD~`4T-b%Vf+EX zVuc=4U7V;r0k8Y+0OCwvG=V=Mn**pAKm@-W@j#YD*C))MlU)e>{e~;yRKVjH!&!IK z5?+}NJpBf?NwNzWa?ve-kMcWT1fb#7svpn}o5e@#S*wt;7Y08kw1W9>%+259F}!%l z&~u;4$Jh8#coI^ue+Kpy%JSIOQqmduD|)rLJ^?@A9ZkkGOx(p90v3!Rvctd%IR0q` zjx;?|>9tG&h&-F#U}6js+S2SwXE=XC67K@AU<{n@(Bj;*%yVOJ$tkaa1)*g-zEjdAAw8eDMjZw4G>U|!#(}~;n51UVg$-p@;%CeLlD4Bth9q`Wa0^}44 z1(3;tX%CUzD8UoJc!7NB={D>%r4=E^?4R)Q!p1cCK<<715%R;=Wo5(_%_i*mfC~aJ zda@{D199&g(McC%lB*!;pKsbH%d$`D7^ALOY9_xA<9rq^93pF*$=c~R4(!`X=)HJ- zPX3`!fVOB@_welah8G?QtnK&UfqHjo^!GrQ;19Jy;dZ1TWJ5SQ21h2q$ z&1JpKU~#t#1h9#5q#k4F8fzi0t}U6*iP@$XhC^ zcSgdK=j7wlO#7pozcI#AEAx^B@B-T0;CGIccBn*iJBjb5gohT~ENI{=px)4;(ba3? zd9|AvJbzeYd?`o*u|}yJKn$b1c!ArpdvDr#u&?XSNU)d3@E1o)650`|_P0Qb1W^DD zVz3UBkgg0nwB?Sweee*IF5v z44oRfkqJI}F}#|Cy?`xa$mqb$&Jcs4xU0~5(>+T)^*lAe_VtMaAMI~<16e5`)FHr+ znI}ugvWgKNH)>x|rs&vw)6h_@nH0EU!f9}dc=hx?tvTEE&HWXxS!RnIaag69MXO)n zLe75t`7Nx@O}a*$9vI*i0WwE?Q2l)tRYd7?2Pt}~XGEb_Ym; zsroMhArMWPQlGL1o`VPmvIx>e{@v&g)Ji=@AvY3wfv|fFL`lG}OpkD&6ra^N%4#P9 z!rUlIk^%DUn3*8MmP(q{Z`%g^@c@7}r~xKH|IsEL>28f+zu?8gZ^+Lb{K@pmOSc1~ z2VxF&ec`AYOadU8&;VVJH@P#rL$HWVEPZ1z?;3dRP*o)#d5P;OVZKqGV+^_< zU}x8LM+pxvv+s_I!c>5`Ny?rJV;s3%_<#9CRXI4AeK(-+wck?cX8*K%-wlt%39KiY z{4I(KCeAIOH|DCJIeF1rII0hITOh0r1h^;l32#~~L+n(N6XiUsGr>Y)Q6^LPY`%7= z2LCFXQ;k+8b+%NPUkhYKE9Z8rup8sHukJ@Qy9M-7GqkQKJO^=k|?&o2z?D>2+Zv*3)2a$9&`1+J~ zb9)dkibk7e#^cU?rtpYGug?T}2Da}m4@bqzPU$KwXR`MqY=6XNR#WD)xrv>Nj%@{x zgRvt1wZ}Q`^l1D!t9KJAoclW((Y?+?JyjGM4W%GL&ztDcNsyD?J~#e$)7P4q4iYp<0#PewC_Q*DZVlc9cKQ{s zkbN?3p8xcaOY9fZ*6e%ek6uaLUQcQ8!fI3z?DMz@ekbNaJNsn>>gyQ94 zkybb6t=vPU-0i-8)puYFes(c8sq+Mp*O z`iN7)0-QexK2^dPdA_Hk71YNB8r%J(G0d_OJyE9*VAi7;sz#fP$V}>|X@R1s2StDg zKD^*P$R3<<-V*#50`9*Hp4)g&(oP!rkcaX-{WlT?N5Urs3<$qwt;KBv^d*k)Q$v4~ z5BN1Tv6g(15fO}~JS{)M$evqmyl?W{cgFJ;m3BrTyQE%!W46cUfgmlBzL18Ngq~Fr z{NFJsIJ0Nr>ILPWJs$K z@)(fU$RQo>oWM?x;g45j^#gYRd0*x4c}?#DND%Y%2mF|)H3E+R5Kj41;7Vu@@e4v0 z>-`O;`j8a36EG({HB(O`XbKNVafT%>8vW6~1PEreGn9)jeqMa{GsNe!1Z%#GiMhGV z4AGfjWcEOnhH+s6mBVPEk7gxVo)7VO%X#kYq&RQD4evoI?*QWQY0B6)G{OPh7=Ez2 zGFr93z1Q9pS(!{5|6Yl4F1-EgEl_;#GrtTo{xy6rafx>hDWR-_Vw-PLHKEw zsE_n{!_xUF8c$V)%Ma1;_BjB^oH{zdqhGT6P)nCzH;4)y z!ca0C+mAE};r_}~B6g;t1=BFoUzXeZs1#km@e}N~0m6Cr1LhIO8+N#o-05zb90Bc( zSxAKYU+mOSe>kQF-_VWiI!%T*-FYS1W}(O_GhA`a<85uU>}!TN`4l*p0G+3yRq&|P z8wrT`;7wR#qW?M|{DSvBzKKytw&n75uDV2E%yTa;h|FM_Ww-0WS3`~R-p)I6zO!4? z6P}_;aRYv>*E-p2PIqfp?x{v{u;L?7jnK0L015O&(8@2RaBA;0$#8*?)7*vAh|231 zu7aAbtWeqhlyOM;rQ>ZsmmpH9&>CyWKh5f0pP6GWUmsX_N|*$q*9;y`6)Vbq{p(wL z4F))`o^_j?1kWN}>IR+gIyMsmdh?c`_Cv2F8NjDY>eWI95yOiQWfIq_vytlT^1w&Q z)>17|`8JCMRUxYsJmQdqlHE;C8ZaEbYg^c-|KiB4-}yR_|4 zeLj>=0URl0cxW|3E3L0LC*#gh?-wr!d_;3FZt)f-TwlY{#gdh=l#eQY9}l6(s|S1< ze6m`PChIb}82Xjv4C`d0w)&A}Sb+V^I0UA;b0J4QWW3q+j>KaF}HIZssrJ(LAB zc36X3NH>BM)N1Q~K>>-O(g8IjwjstRIWg;-+!iVwuC*>3_F)}wGYfJYM;LnaFOupL z8knnrv(|V)?~2ZNV<00p}0Zj$VJPX2c((?T{v_aMnt_KhdK2W5)eMWHEkY3dW`{ zh7E>GRd-w$+mgNMh>5|yNH(T^T9VAg)rl7%F0F!i`k zo6}Ft=Ztqqu2$hMC0cKaYq%v1Rouh*ygd%vjSmYQO=k!D>odY#!4Y=F>7hUx;>%S8 z)iSMx$mcB(@i=JQW~HZ+$R3f&;Z)(``zGXQZ*1Iv10_*174-wyeedd`!!~vX4eRAD zSbF*vG#4?^GWgZOkBDcJZq zqR@Vj3ndH+i5T(C{a@3Rzj4JC%*U=qvU-Ua9=FDAYnlo zR&RpWmlh7KssJRO%B|uiKF@M4uGJ!m`3jI3W%0~#)5*frYx+BD<6aKM9pSQQJ%=2f#ZPY@?vK(OUxIn59c1YSzenE22q*@UO>+RO z|1h%mme*DpUw&Y?9Sgz*!#c8jaxVKZ`9^ZPQZn4X5CmJ4JnzmF;?!TmCfmqRGJN8& z^+z&rGeAtGB^m0a$^X>#2omxltVpPgXCvRqf!fOfg_mw%VYieyxHQu+eBz4$Zw*kq z$NT@xn4TVU5%ArRcwJ1t^oxB^TUHq1Bkb6O_{2{=y5EY*jrneYL(>W+OnY9y_4+C# z^eC&cq+mnmb`PYSt!qJJUo!Tk2`4omgR7m2uKBzS{v9~wzq~Z7nk=moj>!>)6<$jn zP%^5663^gl$om-5U`Wa)q>;6uiRTW#`5RV^w5)g>dJJPz#?T0a%v0a#l~akY89=0M zc`76IR@n58Id|5|w+_6hg;Z!rpagZXUOwU^ksPv!zI)M`8b!^=ZCzV}Y#0WCPP-95ZsDdK>*Wn4b1upo z|Ay4v=<3}?+@uV-)9M#tR7XsJ?L_y@Dwk;>8iCTfm85!Y!VQ6VO&TE|QuAIuM5#y| zvab$Qk>@x7vR+Rzr&g5;KF{V1CRYNjAHd;_hF%bw9%&CMqsSOXK^pLHSeR_`Dx&y+ z&>Q0$ri8wxuY&e#({0o# zVsoVIP7|sZnM#(OLjLO}O;BxO7_5VsFTZ#d({;ETltCx-n)fZz3_6K(NSor;RBO66 zyw2E+izPlYL>&@=n{^?5>^5%NC{RW3=z|U9?I;Czbg}B5B||RvO2l|F>MAtL;OrNp z(dffoXmKx_!|^*v5uohA7(COtAP7(;aH4BkTCtJ*5bZ8=Af-7*1w0*&uZTfov6TI^ zO!UAB-Q5JggPKaqH55yw*e^h6oywM3#8)Hhf+GQOF{u~O=m|qZv>md1LQ<5{5tF$e zSoa!Or@wu(UwE-8=Qlt*S=N9*7;~Q;gHz^E6=O#4{oii16K{yD8zAeZUrwkQnsJ$N z^GoAZoFNyQp9EZ_3Lr*q<%>M_<8RyPyY3l$MPRk-k=IaBR=!bhdc?V0yd!SURd5jM zeMm;x-JbM_UoP9Dv7vfS7_^Lc^AOWcPaLPMm0AhMxNPjrQGn&}OE3T_@z=Yb#2$~? zRc?mku>e9}`>+H$&w@zWMurMSsc#q9<;4Hy?)(>a+L}2J_I79}6NGr944dM@1qrMC zH(#f1M3;HPqmfP^1{fT#tV3sz`l?3Llf~Zn3TI-b6{v@}qsoVVn}u0LYyvSlo}DC#aTxX? zM&#z)%TnDV>pZ;aQj`FQ^&kW(8aFi1WfWA$=zQ_N7$f-4H|B<(CHwryRG&4>!OBTM zs{sYj%YMEFy`lC>08mborUF?509pQEO}p$uOAPbf3G-v0GXC0ibACQFWYXWL*uEY7}GzrYyy$dp?5ybf~kR4-z85J9h94xPzM8$8ejhYy3|iSpfCy~KGV-7goU zMXH3L(||oV&d0IwxqeD`a;p_yFHeqAXLeqg8@h(UJCA)X)Qgypa|JSc6>H01h_8t{i=xT5I^-*h6z_Ul=i#9r7OtUB zc{PRt=Rz}|G-}=8hSXfLSBaUH4!nJB^%*^UTgkFIDTo`CJz3u15>Ig-(cd*0GyqN{ zV?iCgE{DW5ZHan327?^C2JC*2?!VC>+oBnC5_dG^VSR0vE@wdbvZ2TtK;3vN4CeO>)o{H=j`|9&`C|vee;4e3Q?OI9` zh^Cz@wXvuJe?RcM{)G($j=GOc;9g#<>3Fx_7Y7mt{ERYTMQ0q?ZaFz8DNSTdnkaUB zKaLH^(KWb7vNYrSH7-q-%<;wbjqm4u?iom#D-d8A+wZNozShbfUntGTBX7T=I3#T`#4g^>uB;#AWB;((8O01Z+tggvL3Eu?VZLCv(vxD8T^r^f2 z1E1Z+rh%Puag#en>>}#Ft>0w7vf13#!&wz$`olHZ{REr~X#4dW5DP=v!Q$Y7?<#06 zYrWTn910kyK$Rw1Z9Aqv@?r7DOtbNBRuAmbsnVXbuG$4lv-BBk64TJzSkHuyu3E7B z&oh10UwIvQ5!r@!Hs?_*duKccp;)*wHSGM3ooDn+cfdq%HgJq&Tj(ne=)AjxjwD1H^6|beMS$ieJgb_$vwm7!BeV~Eep;KuTCiJP;v@u06u2QWdJL=(I+^q$n)fTnhd_9UD+h#?NyC6{=gY$=~1^PX)-FSn{(F9FiZ{g>yW6{_@N^T$H)q+_>j)WlqI12&!| zyQa*o`39WS0=B9Dcew$N)z}Xn^ZQv|XY%ZG`4^k7=^5bW`}1OWLw*0E%itq$Kko;P z;M?0veg0`(HSd@47T_5hnLj^U!dv6<7hgUHZiM*_IWl*?eDBXcvbO$zC8IzM@jpN3 zz?HaU%_Z?EGd61XS*ZV;B#93z1N8k85X9oeN26q1!_dn8n`FULP zq~hNT{yZ!Iu2cXHR{XC2QE)TzyYYMQ6wU`|bJP8t=tf|B^LO6i>ev_Q_uhiXTng1J zUoSAZyU(ppSqj|Ty#M_FiJeN*HuHgInAUUuJ+u2RXza%HoJzVZaC`ps6NN5^&+oYn zTqgML=l_lT_J2ND-IcYhl)X)`5WbVblz-P{t1H@Z@L0Oh?uLzZj6XE;oW(B^Fm=aS nmS3z7a-ZE=MW|#4n)zS;>BH+c%4<&WGXR07tDnm{r-UW|$dp## literal 0 HcmV?d00001 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json index 8bf75d9f5..cf8282aa5 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -3,9 +3,6 @@ { "filename" : "Front.imagestacklayer" }, - { - "filename" : "Middle.imagestacklayer" - }, { "filename" : "Back.imagestacklayer" } @@ -14,4 +11,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json index 0564959fb..f8bc2faa1 100644 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +++ b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -2,6 +2,7 @@ "images" : [ { "idiom" : "tv", + "filename" : "PlotGalleryLargeIconFront.png", "scale" : "1x" } ], diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/PlotGalleryLargeIconFront.png b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/PlotGalleryLargeIconFront.png new file mode 100644 index 0000000000000000000000000000000000000000..43e6f13001185f3b5d34f636d04d60ded0fc210c GIT binary patch literal 216055 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

    - + - + - - - + - + - - + + - + @@ -657,13 +659,12 @@ - - - + - + @@ -688,7 +689,7 @@ - + @@ -696,7 +697,7 @@ - + @@ -704,15 +705,15 @@ - + - + - - + diff --git a/examples/CPTTestApp/Resources/Base.lproj/PlotSymbolDemo.xib b/examples/CPTTestApp/Resources/Base.lproj/PlotSymbolDemo.xib index bffdf5c16..ce94cac6a 100644 --- a/examples/CPTTestApp/Resources/Base.lproj/PlotSymbolDemo.xib +++ b/examples/CPTTestApp/Resources/Base.lproj/PlotSymbolDemo.xib @@ -1,26 +1,29 @@ - - + + - + + + - - + + - + + diff --git a/examples/CPTTestApp/Resources/Base.lproj/SelectionDemo.xib b/examples/CPTTestApp/Resources/Base.lproj/SelectionDemo.xib index 9dee883b9..c79ae2d56 100644 --- a/examples/CPTTestApp/Resources/Base.lproj/SelectionDemo.xib +++ b/examples/CPTTestApp/Resources/Base.lproj/SelectionDemo.xib @@ -1,26 +1,29 @@ - - + + - + + + - - + + - + + diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index 56c4e9371..dc5233bd7 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -1,5 +1,9 @@ #import "Controller.h" +#import "AxisDemoController.h" +#import "CPTPlotSymbolTestController.h" +#import "SelectionDemoController.h" + static const CGFloat kZDistanceBetweenLayers = 20.0; static NSString *const bindingsPlot = @"Bindings Plot"; @@ -9,10 +13,20 @@ @interface Controller() +-(void)plotSymbolWindowClosed; +-(void)axisDemoWindowClosed; +-(void)selectionDemoWindowClosed; + @property (nonatomic, readwrite, strong, nullable) IBOutlet CPTGraphHostingView *hostView; -@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *plotSymbolWindow; -@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *axisDemoWindow; -@property (nonatomic, readwrite, weak, nullable) IBOutlet NSWindow *selectionDemoWindow; + +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSWindow *plotSymbolWindow; +@property (nonatomic, readwrite, strong, nullable) IBOutlet CPTPlotSymbolTestController *plotSymbolTestController; + +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSWindow *axisDemoWindow; +@property (nonatomic, readwrite, strong, nullable) IBOutlet AxisDemoController *axisDemoController; + +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSWindow *selectionDemoWindow; +@property (nonatomic, readwrite, strong, nullable) IBOutlet SelectionDemoController *selectionDemoController; @property (nonatomic, readwrite, strong, nonnull) CPTXYGraph *graph; @property (nonatomic, readwrite, strong, nullable) RotationView *overlayRotationView; @@ -32,8 +46,11 @@ @implementation Controller @synthesize hostView; @synthesize plotSymbolWindow; +@synthesize plotSymbolTestController; @synthesize axisDemoWindow; +@synthesize axisDemoController; @synthesize selectionDemoWindow; +@synthesize selectionDemoController; @synthesize graph; @synthesize overlayRotationView; @@ -716,6 +733,11 @@ -(IBAction)plotSymbolDemo:(nullable id)sender NSWindow *window = self.plotSymbolWindow; [window makeKeyAndOrderFront:sender]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(plotSymbolWindowClosed) + name:NSWindowWillCloseNotification + object:window]; } -(IBAction)axisDemo:(nullable id)sender @@ -728,6 +750,11 @@ -(IBAction)axisDemo:(nullable id)sender NSWindow *window = self.axisDemoWindow; [window makeKeyAndOrderFront:sender]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(axisDemoWindowClosed) + name:NSWindowWillCloseNotification + object:window]; } -(IBAction)selectionDemo:(nullable id)sender @@ -740,6 +767,29 @@ -(IBAction)selectionDemo:(nullable id)sender NSWindow *window = self.selectionDemoWindow; [window makeKeyAndOrderFront:sender]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(selectionDemoWindowClosed) + name:NSWindowWillCloseNotification + object:window]; +} + +-(void)plotSymbolWindowClosed +{ + self.plotSymbolWindow = nil; + self.plotSymbolTestController = nil; +} + +-(void)axisDemoWindowClosed +{ + self.axisDemoWindow = nil; + self.axisDemoController = nil; +} + +-(void)selectionDemoWindowClosed +{ + self.selectionDemoWindow = nil; + self.selectionDemoController = nil; } #pragma mark - From bb3c62cf4bc17cb81562c74ee03c3ad666e4bec0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Dec 2019 09:34:22 -0500 Subject: [PATCH 395/429] Added platform-native color init methods to CPTColor. --- .../MacOnly/CPTPlatformSpecificDefines.h | 1 + framework/Source/CPTColor.h | 9 +++- framework/Source/CPTColor.m | 45 ++++++++++++++++--- .../iPhoneOnly/CPTPlatformSpecificDefines.h | 1 + 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/framework/MacOnly/CPTPlatformSpecificDefines.h b/framework/MacOnly/CPTPlatformSpecificDefines.h index 8c9421476..24d77c3c6 100644 --- a/framework/MacOnly/CPTPlatformSpecificDefines.h +++ b/framework/MacOnly/CPTPlatformSpecificDefines.h @@ -1,5 +1,6 @@ /// @file +typedef NSColor CPTNativeColor; ///< Platform-native color. typedef NSImage CPTNativeImage; ///< Platform-native image format. typedef NSEvent CPTNativeEvent; ///< Platform-native OS event. typedef NSFont CPTNativeFont; ///< Platform-native font. diff --git a/framework/Source/CPTColor.h b/framework/Source/CPTColor.h index f8a6fd678..b290cb1de 100644 --- a/framework/Source/CPTColor.h +++ b/framework/Source/CPTColor.h @@ -1,3 +1,5 @@ +#import "CPTPlatformSpecificDefines.h" + @interface CPTColor : NSObject @property (nonatomic, readonly, nonnull) CGColorRef cgColor; @@ -9,7 +11,7 @@ @property (nonatomic, readonly, nonnull) UIColor *uiColor; #endif -/// @name Factory Methods +/// @name Standard Colors /// @{ +(nonnull instancetype)clearColor; +(nonnull instancetype)whiteColor; @@ -26,7 +28,10 @@ +(nonnull instancetype)orangeColor; +(nonnull instancetype)purpleColor; +(nonnull instancetype)brownColor; +/// @} +/// @name Factory Methods +/// @{ +(nonnull instancetype)colorWithCGColor:(nonnull CGColorRef)newCGColor; +(nonnull instancetype)colorWithComponentRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; +(nonnull instancetype)colorWithGenericGray:(CGFloat)gray; @@ -36,6 +41,7 @@ #elif TARGET_OS_SIMULATOR || TARGET_OS_IPHONE +(nonnull instancetype)colorWithUIColor:(nonnull UIColor *)newUIColor; #endif ++(nonnull instancetype)colorWithNativeColor:(nonnull CPTNativeColor *)newColor; /// @} @@ -50,6 +56,7 @@ #elif TARGET_OS_SIMULATOR || TARGET_OS_IPHONE -(nonnull instancetype)initWithUIColor:(nonnull UIColor *)newUIColor NS_DESIGNATED_INITIALIZER; #endif +-(nonnull instancetype)initWithNativeColor:(nonnull CPTNativeColor *)newColor; -(nonnull instancetype)colorWithAlphaComponent:(CGFloat)alpha; /// @} diff --git a/framework/Source/CPTColor.m b/framework/Source/CPTColor.m index 3157f9a4c..e9173e326 100644 --- a/framework/Source/CPTColor.m +++ b/framework/Source/CPTColor.m @@ -109,7 +109,7 @@ -(CGColorRef)cgColor @dynamic opaque; #pragma mark - -#pragma mark Factory Methods +#pragma mark Standard Colors /** @brief Returns a shared instance of CPTColor initialized with a fully transparent color. * @@ -367,6 +367,9 @@ +(nonnull instancetype)brownColor return color; } +#pragma mark - +#pragma mark Factory Methods + /** @brief Creates and returns a new CPTColor instance initialized with the provided @ref CGColorRef. * @param newCGColor The color to wrap. * @return A new CPTColor instance initialized with the provided @ref CGColorRef. @@ -406,7 +409,7 @@ +(nonnull instancetype)colorWithGenericGray:(CGFloat)gray /** @brief Creates and returns a new CPTColor instance initialized with the provided NSColor. * - * NSColor can be a dynamic system color or catalog color. This adds support for dark mode in macOS 10.14. + * The NSColor can be a dynamic system color or catalog color. This adds support for Dark Mode in macOS 10.14. * * @param newNSColor The color to wrap. * @return A new CPTColor instance initialized with the provided NSColor. @@ -420,7 +423,7 @@ +(nonnull instancetype)colorWithNSColor:(nonnull NSColor *)newNSColor /** @brief Creates and returns a new CPTColor instance initialized with the provided UIColor. * - * UIColor can be a dynamic system color or catalog color. This adds support for dark mode in iOS13. + * The UIColor can be a dynamic system color or catalog color. This adds support for Dark Mode in iOS 13. * * @param newUIColor The color to wrap. * @return A new CPTColor instance initialized with the provided UIColor. @@ -432,6 +435,22 @@ +(nonnull instancetype)colorWithUIColor:(nonnull UIColor *)newUIColor #endif +/** @brief Creates and returns a new CPTColor instance initialized with the provided platform-native color. + * + * The color can be a dynamic system color or catalog color. This adds support for Dark Mode in iOS13. + * + * @param newColor The color to wrap. + * @return A new CPTColor instance initialized with the provided platform-native color. + **/ ++(nonnull instancetype)colorWithNativeColor:(nonnull CPTNativeColor *)newColor +{ +#if TARGET_OS_OSX + return [[self alloc] initWithNSColor:newColor]; +#elif TARGET_OS_SIMULATOR || TARGET_OS_IPHONE + return [[self alloc] initWithUIColor:newColor]; +#endif +} + #pragma mark - #pragma mark Init/Dealloc @@ -475,7 +494,7 @@ -(nonnull instancetype)initWithComponentRed:(CGFloat)red green:(CGFloat)green bl /** @brief Initializes a newly allocated CPTColor object with the provided NSColor. * - * NSColor can be a dynamic system color or catalog color. This adds support for dark mode in macOS 10.14. + * The NSColor can be a dynamic system color or catalog color. This adds support for Dark Mode in macOS 10.14. * * @param newNSColor The color to wrap. * @return The initialized CPTColor object. @@ -492,7 +511,7 @@ -(nonnull instancetype)initWithNSColor:(nonnull NSColor *)newNSColor /** @brief Initializes a newly allocated CPTColor object with the provided UIColor. * - * UIColor can be a dynamic system color or catalog color. This adds support for dark mode in iOS13. + * The UIColor can be a dynamic system color or catalog color. This adds support for Dark Mode in iOS 13. * * @param newUIColor The color to wrap. * @return The initialized CPTColor object. @@ -507,6 +526,22 @@ -(nonnull instancetype)initWithUIColor:(nonnull UIColor *)newUIColor #endif +/** @brief Initializes a newly allocated CPTColor object with the provided platform-native color. + * + * The color can be a dynamic system color or catalog color. This adds support for Dark Mode in macOS 10.14 and iOS 13. + * + * @param newColor The color to wrap. + * @return The initialized CPTColor object. + **/ +-(nonnull instancetype)initWithNativeColor:(nonnull CPTNativeColor *)newColor +{ +#if TARGET_OS_OSX + return [self initWithNSColor:newColor]; +#elif TARGET_OS_SIMULATOR || TARGET_OS_IPHONE + return [self initWithUIColor:newColor]; +#endif +} + /// @cond -(nonnull instancetype)init diff --git a/framework/iPhoneOnly/CPTPlatformSpecificDefines.h b/framework/iPhoneOnly/CPTPlatformSpecificDefines.h index 985ed3b6f..471ca99d5 100644 --- a/framework/iPhoneOnly/CPTPlatformSpecificDefines.h +++ b/framework/iPhoneOnly/CPTPlatformSpecificDefines.h @@ -1,5 +1,6 @@ /// @file +typedef UIColor CPTNativeColor; ///< Platform-native color. typedef UIImage CPTNativeImage; ///< Platform-native image format. typedef UIEvent CPTNativeEvent; ///< Platform-native OS event. typedef UIFont CPTNativeFont; ///< Platform-native font. From 0c7230017eab98bddfcf63c86d8051c057294403 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Dec 2019 09:37:07 -0500 Subject: [PATCH 396/429] Refactored themes to ensure all axes are updated with the same property values. --- framework/Source/_CPTDarkGradientTheme.m | 40 +++++++-------------- framework/Source/_CPTPlainBlackTheme.m | 46 +++++++++--------------- framework/Source/_CPTPlainWhiteTheme.m | 45 ++++++++--------------- framework/Source/_CPTSlateTheme.m | 40 +++++++-------------- framework/Source/_CPTStocksTheme.m | 45 ++++++++--------------- 5 files changed, 72 insertions(+), 144 deletions(-) diff --git a/framework/Source/_CPTDarkGradientTheme.m b/framework/Source/_CPTDarkGradientTheme.m index 1f2801e84..e15eaf091 100644 --- a/framework/Source/_CPTDarkGradientTheme.m +++ b/framework/Source/_CPTDarkGradientTheme.m @@ -14,15 +14,6 @@ CPTThemeName const kCPTDarkGradientTheme = @"Dark Gradients"; -/// @cond -@interface _CPTDarkGradientTheme() - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle; - -@end - -/// @endcond - #pragma mark - /** @@ -42,23 +33,6 @@ +(nonnull NSString *)name #pragma mark - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle -{ - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = @0.5; - axis.orthogonalPosition = @0.0; - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 4; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = CPTFloat(7.0); - axis.minorTickLength = CPTFloat(5.0); - axis.labelTextStyle = textStyle; - axis.minorTickLabelTextStyle = minorTickTextStyle; - axis.titleTextStyle = textStyle; -} - -(void)applyThemeToBackground:(nonnull CPTGraph *)graph { CPTColor *endColor = [CPTColor colorWithGenericGray:CPTFloat(0.1)]; @@ -108,7 +82,19 @@ -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet whiteMinorTickTextStyle.fontSize = CPTFloat(12.0); for ( CPTXYAxis *axis in axisSet.axes ) { - [self applyThemeToAxis:axis usingMajorLineStyle:majorLineStyle minorLineStyle:minorLineStyle textStyle:whiteTextStyle minorTickTextStyle:whiteMinorTickTextStyle]; + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = whiteTextStyle; + axis.minorTickLabelTextStyle = whiteMinorTickTextStyle; + axis.titleTextStyle = whiteTextStyle; } } diff --git a/framework/Source/_CPTPlainBlackTheme.m b/framework/Source/_CPTPlainBlackTheme.m index 0bff8bb06..05783b4f1 100644 --- a/framework/Source/_CPTPlainBlackTheme.m +++ b/framework/Source/_CPTPlainBlackTheme.m @@ -49,7 +49,6 @@ -(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { - CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; majorLineStyle.lineCap = kCGLineCapRound; @@ -60,42 +59,29 @@ -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet minorLineStyle.lineColor = [CPTColor whiteColor]; minorLineStyle.lineWidth = CPTFloat(3.0); - CPTXYAxis *x = xyAxisSet.xAxis; CPTMutableTextStyle *whiteTextStyle = [[CPTMutableTextStyle alloc] init]; whiteTextStyle.color = [CPTColor whiteColor]; whiteTextStyle.fontSize = CPTFloat(14.0); + CPTMutableTextStyle *minorTickWhiteTextStyle = [[CPTMutableTextStyle alloc] init]; minorTickWhiteTextStyle.color = [CPTColor whiteColor]; minorTickWhiteTextStyle.fontSize = CPTFloat(12.0); - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = @0.5; - x.orthogonalPosition = @0.0; - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = whiteTextStyle; - x.minorTickLabelTextStyle = whiteTextStyle; - x.titleTextStyle = whiteTextStyle; - - CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = @0.5; - y.minorTicksPerInterval = 4; - y.orthogonalPosition = @0.0; - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = whiteTextStyle; - y.minorTickLabelTextStyle = minorTickWhiteTextStyle; - y.titleTextStyle = whiteTextStyle; + for ( CPTXYAxis *axis in axisSet.axes ) { + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = whiteTextStyle; + axis.minorTickLabelTextStyle = whiteTextStyle; + axis.titleTextStyle = whiteTextStyle; + } } #pragma mark - diff --git a/framework/Source/_CPTPlainWhiteTheme.m b/framework/Source/_CPTPlainWhiteTheme.m index aa2f1fd10..5a8ed24f2 100644 --- a/framework/Source/_CPTPlainWhiteTheme.m +++ b/framework/Source/_CPTPlainWhiteTheme.m @@ -49,7 +49,6 @@ -(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { - CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; majorLineStyle.lineCap = kCGLineCapButt; @@ -69,35 +68,21 @@ -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet minorTickBlackTextStyle.color = [CPTColor blackColor]; minorTickBlackTextStyle.fontSize = CPTFloat(12.0); - CPTXYAxis *x = xyAxisSet.xAxis; - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = @0.5; - x.orthogonalPosition = @0.0; - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = blackTextStyle; - x.minorTickLabelTextStyle = blackTextStyle; - x.titleTextStyle = blackTextStyle; - - CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = @0.5; - y.minorTicksPerInterval = 4; - y.orthogonalPosition = @0.0; - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = blackTextStyle; - y.minorTickLabelTextStyle = minorTickBlackTextStyle; - y.titleTextStyle = blackTextStyle; + for ( CPTXYAxis *axis in axisSet.axes ) { + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = blackTextStyle; + axis.minorTickLabelTextStyle = blackTextStyle; + axis.titleTextStyle = blackTextStyle; + } } #pragma mark - diff --git a/framework/Source/_CPTSlateTheme.m b/framework/Source/_CPTSlateTheme.m index 92f34f922..c357e48a9 100644 --- a/framework/Source/_CPTSlateTheme.m +++ b/framework/Source/_CPTSlateTheme.m @@ -14,15 +14,6 @@ CPTThemeName const kCPTSlateTheme = @"Slate"; -/// @cond -@interface _CPTSlateTheme() - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle; - -@end - -/// @endcond - #pragma mark - /** @@ -42,23 +33,6 @@ +(nonnull NSString *)name #pragma mark - --(void)applyThemeToAxis:(CPTXYAxis *)axis usingMajorLineStyle:(nonnull CPTLineStyle *)majorLineStyle minorLineStyle:(nonnull CPTLineStyle *)minorLineStyle textStyle:(nonnull CPTMutableTextStyle *)textStyle minorTickTextStyle:(nonnull CPTMutableTextStyle *)minorTickTextStyle -{ - axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - axis.majorIntervalLength = @0.5; - axis.orthogonalPosition = @0.0; - axis.tickDirection = CPTSignNone; - axis.minorTicksPerInterval = 4; - axis.majorTickLineStyle = majorLineStyle; - axis.minorTickLineStyle = minorLineStyle; - axis.axisLineStyle = majorLineStyle; - axis.majorTickLength = CPTFloat(7.0); - axis.minorTickLength = CPTFloat(5.0); - axis.labelTextStyle = textStyle; - axis.minorTickLabelTextStyle = minorTickTextStyle; - axis.titleTextStyle = textStyle; -} - -(void)applyThemeToBackground:(nonnull CPTGraph *)graph { CPTGradient *gradient = [CPTGradient gradientWithBeginningColor:[CPTColor colorWithComponentRed:CPTFloat(0.43) green:CPTFloat(0.51) blue:CPTFloat(0.63) alpha:CPTFloat(1.0)] @@ -107,7 +81,19 @@ -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet minorTickBlackTextStyle.fontSize = CPTFloat(12.0); for ( CPTXYAxis *axis in axisSet.axes ) { - [self applyThemeToAxis:axis usingMajorLineStyle:majorLineStyle minorLineStyle:minorLineStyle textStyle:blackTextStyle minorTickTextStyle:minorTickBlackTextStyle]; + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = blackTextStyle; + axis.minorTickLabelTextStyle = minorTickBlackTextStyle; + axis.titleTextStyle = blackTextStyle; } } diff --git a/framework/Source/_CPTStocksTheme.m b/framework/Source/_CPTStocksTheme.m index b807cfe38..4e3dcf0bc 100644 --- a/framework/Source/_CPTStocksTheme.m +++ b/framework/Source/_CPTStocksTheme.m @@ -62,7 +62,6 @@ -(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet { - CPTXYAxisSet *xyAxisSet = (CPTXYAxisSet *)axisSet; CPTMutableLineStyle *majorLineStyle = [CPTMutableLineStyle lineStyle]; majorLineStyle.lineCap = kCGLineCapRound; @@ -81,35 +80,21 @@ -(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet minorTickWhiteTextStyle.color = [CPTColor whiteColor]; minorTickWhiteTextStyle.fontSize = CPTFloat(12.0); - CPTXYAxis *x = xyAxisSet.xAxis; - x.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - x.majorIntervalLength = @0.5; - x.orthogonalPosition = @0.0; - x.tickDirection = CPTSignNone; - x.minorTicksPerInterval = 4; - x.majorTickLineStyle = majorLineStyle; - x.minorTickLineStyle = minorLineStyle; - x.axisLineStyle = majorLineStyle; - x.majorTickLength = CPTFloat(7.0); - x.minorTickLength = CPTFloat(5.0); - x.labelTextStyle = whiteTextStyle; - x.minorTickLabelTextStyle = minorTickWhiteTextStyle; - x.titleTextStyle = whiteTextStyle; - - CPTXYAxis *y = xyAxisSet.yAxis; - y.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; - y.majorIntervalLength = @0.5; - y.minorTicksPerInterval = 4; - y.orthogonalPosition = @0.0; - y.tickDirection = CPTSignNone; - y.majorTickLineStyle = majorLineStyle; - y.minorTickLineStyle = minorLineStyle; - y.axisLineStyle = majorLineStyle; - y.majorTickLength = CPTFloat(7.0); - y.minorTickLength = CPTFloat(5.0); - y.labelTextStyle = whiteTextStyle; - y.minorTickLabelTextStyle = minorTickWhiteTextStyle; - y.titleTextStyle = whiteTextStyle; + for ( CPTXYAxis *axis in axisSet.axes ) { + axis.labelingPolicy = CPTAxisLabelingPolicyFixedInterval; + axis.majorIntervalLength = @0.5; + axis.orthogonalPosition = @0.0; + axis.tickDirection = CPTSignNone; + axis.minorTicksPerInterval = 4; + axis.majorTickLineStyle = majorLineStyle; + axis.minorTickLineStyle = minorLineStyle; + axis.axisLineStyle = majorLineStyle; + axis.majorTickLength = CPTFloat(7.0); + axis.minorTickLength = CPTFloat(5.0); + axis.labelTextStyle = whiteTextStyle; + axis.minorTickLabelTextStyle = minorTickWhiteTextStyle; + axis.titleTextStyle = whiteTextStyle; + } } #pragma mark - From 142977a4c04ec77199b0e16a8f4508b89463b676 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Dec 2019 11:17:29 -0500 Subject: [PATCH 397/429] Fixed a crashing bug with animating NSNumber values. --- framework/Source/CPTAnimation.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/framework/Source/CPTAnimation.m b/framework/Source/CPTAnimation.m index 4ef62d18f..f938fd2fd 100644 --- a/framework/Source/CPTAnimation.m +++ b/framework/Source/CPTAnimation.m @@ -407,6 +407,13 @@ -(void)updateOnMainThreadWithParameters:(nonnull CPTDictionary *)parameters SetterType setterMethod = (SetterType)[boundObject methodForSelector:boundSetter]; setterMethod(boundObject, boundSetter, buffer); } + else if ( [tweenedValue isKindOfClass:[NSNumber class]] ) { + NSNumber *value = (NSNumber *)tweenedValue; + + typedef void (*NumberSetterType)(id, SEL, NSNumber *); + NumberSetterType setterMethod = (NumberSetterType)[boundObject methodForSelector:boundSetter]; + setterMethod(boundObject, boundSetter, value); + } else if ( [tweenedValue isKindOfClass:[CPTPlotRange class]] ) { CPTPlotRange *range = (CPTPlotRange *)tweenedValue; From 4f2ad5a4f06510112e37db4015d315cdf9122064 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Dec 2019 12:37:00 -0500 Subject: [PATCH 398/429] Force redrawing of the graph on appearance change. Fixed issue #418. --- framework/MacOnly/CPTGraphHostingView.m | 10 ++++++++++ framework/Source/CPTLayer.h | 1 + framework/Source/CPTLayer.m | 17 +++++++++++++++++ framework/iPhoneOnly/CPTGraphHostingView.m | 7 +++++++ 4 files changed, 35 insertions(+) diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index 174bd0816..ca013d5f7 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -73,6 +73,11 @@ -(void)commonInit self.locationInWindow = NSZeroPoint; self.scrollOffset = CGPointZero; + [self addObserver:self + forKeyPath:@"effectiveAppearance" + options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionInitial + context:CPTGraphHostingViewKVOContext]; + if ( !self.superview.wantsLayer ) { self.layer = [self makeBackingLayer]; } @@ -102,6 +107,8 @@ -(void)dealloc [space removeObserver:self forKeyPath:@"isDragging" context:CPTGraphHostingViewKVOContext]; } + [self removeObserver:self forKeyPath:@"effectiveAppearance" context:CPTGraphHostingViewKVOContext]; + [hostedGraph removeFromSuperlayer]; } @@ -572,6 +579,9 @@ -(void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id object:newPlotArea]; } } + else if ( [keyPath isEqualToString:@"effectiveAppearance"] && (object == self)) { + [self.hostedGraph setNeedsDisplayAllLayers]; + } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; diff --git a/framework/Source/CPTLayer.h b/framework/Source/CPTLayer.h index 18cf5b9c3..4cca2d8b4 100644 --- a/framework/Source/CPTLayer.h +++ b/framework/Source/CPTLayer.h @@ -131,6 +131,7 @@ typedef NSMutableSet CPTMutableSublayerSet; /// @name Drawing /// @{ +-(void)setNeedsDisplayAllLayers; -(void)renderAsVectorInContext:(nonnull CGContextRef)context; -(void)recursivelyRenderInContext:(nonnull CGContextRef)context; -(void)layoutAndRenderInContext:(nonnull CGContextRef)context; diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 29732265b..77311006b 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -376,6 +376,23 @@ -(void)drawInContext:(nonnull CGContextRef)context /// @endcond +/** + * @brief Recursively marks this layer and all sublayers as needing to be redrawn. + **/ +-(void)setNeedsDisplayAllLayers +{ + [self setNeedsDisplay]; + + for ( CPTLayer *subLayer in self.sublayers ) { + if ( [subLayer respondsToSelector:@selector(setNeedsDisplayAllLayers)] ) { + [subLayer setNeedsDisplayAllLayers]; + } + else { + [subLayer setNeedsDisplay]; + } + } +} + /** @brief Draws layer content into the provided graphics context. * * This method replaces the CALayer @link CALayer::drawInContext: -drawInContext: @endlink method diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index 0efa0939e..fd27f232c 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -352,6 +352,13 @@ -(void)graphNeedsRedraw:(nonnull NSNotification *)notification [self setNeedsDisplay]; } +-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection +{ + [super traitCollectionDidChange:previousTraitCollection]; + + [self.hostedGraph setNeedsDisplayAllLayers]; +} + /// @endcond #pragma mark - From c280cb3c2e9f52ac25213e46ca44117950213b58 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Dec 2019 12:38:30 -0500 Subject: [PATCH 399/429] Updated the Mac CPTTestApp example app to support Dark Mode. --- .../CPTTestApp.xcodeproj/project.pbxproj | 4 - .../Resources/Base.lproj/CPTTestApp.xib | 14 +-- examples/CPTTestApp/Resources/BlueTexture.png | Bin 368382 -> 0 bytes examples/CPTTestApp/Source/Controller.m | 87 ++++++++++-------- 4 files changed, 55 insertions(+), 50 deletions(-) delete mode 100644 examples/CPTTestApp/Resources/BlueTexture.png diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index 81b524cf9..b92e4d395 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 077382B10F3DC1FB002F10E2 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 077382B00F3DC1FB002F10E2 /* Controller.m */; }; - 07C13BBB0FF9322A00BEE616 /* BlueTexture.png in Resources */ = {isa = PBXBuildFile; fileRef = 07C13BBA0FF9322A00BEE616 /* BlueTexture.png */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; @@ -118,7 +117,6 @@ 0761854B0F3CB3CB00A89A76 /* CorePlot.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CorePlot.framework; path = ../../../../framework/build/Debug/CorePlot.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 077382AF0F3DC1FB002F10E2 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = Source/Controller.h; sourceTree = ""; }; 077382B00F3DC1FB002F10E2 /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = Source/Controller.m; sourceTree = ""; }; - 07C13BBA0FF9322A00BEE616 /* BlueTexture.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = BlueTexture.png; path = Resources/BlueTexture.png; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Source/main.m; sourceTree = ""; }; @@ -250,7 +248,6 @@ children = ( C3D3935B19FD653300148319 /* Images.xcassets */, C37A40A720E030C000C4FF48 /* Info.plist */, - 07C13BBA0FF9322A00BEE616 /* BlueTexture.png */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, C3D0A18D20E017C500BA2921 /* AxisDemo.xib */, C3D0A19C20E017CC00BA2921 /* CPTTestApp.xib */, @@ -395,7 +392,6 @@ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, C3D3935C19FD653300148319 /* Images.xcassets in Resources */, C3D0A19A20E017CC00BA2921 /* CPTTestApp.xib in Resources */, - 07C13BBB0FF9322A00BEE616 /* BlueTexture.png in Resources */, C3D0A19D20E017D100BA2921 /* PlotSymbolDemo.xib in Resources */, C3D0A18B20E017C500BA2921 /* AxisDemo.xib in Resources */, C3D0A1A020E017D600BA2921 /* SelectionDemo.xib in Resources */, diff --git a/examples/CPTTestApp/Resources/Base.lproj/CPTTestApp.xib b/examples/CPTTestApp/Resources/Base.lproj/CPTTestApp.xib index 485f2536c..4b7d3ae17 100644 --- a/examples/CPTTestApp/Resources/Base.lproj/CPTTestApp.xib +++ b/examples/CPTTestApp/Resources/Base.lproj/CPTTestApp.xib @@ -1,8 +1,8 @@ - + - + @@ -673,15 +673,9 @@ - + - - - - - - @@ -747,7 +741,7 @@ y - + diff --git a/examples/CPTTestApp/Resources/BlueTexture.png b/examples/CPTTestApp/Resources/BlueTexture.png deleted file mode 100644 index ea004c70dd4a013e8a6a3c980b709ca8060dd803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368382 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
    +
    - + - + - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + + + + @@ -277,7 +272,6 @@ - @@ -297,6 +291,7 @@ + @@ -307,11 +302,12 @@ - - + + +
    diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.h b/examples/CorePlotGallery/src/mac/PlotGalleryController.h index 04bd17bcf..c8418c4a6 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.h +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.h @@ -11,6 +11,8 @@ #import "PlotView.h" @interface PlotGalleryController : NSObject @property (nonatomic, strong, nullable) PlotItem *plotItem; diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 882874e5c..36ccb4bd0 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -6,23 +6,29 @@ #import "PlotGalleryController.h" #import "dlfcn.h" +#import "PlotViewItem.h" static const CGFloat CPT_SPLIT_VIEW_MIN_LHS_WIDTH = 150.0; static NSString *const kThemeTableViewControllerNoTheme = @"None"; static NSString *const kThemeTableViewControllerDefaultTheme = @"Default"; +static NSString *const kCollectionHeader = @"CPTCollectionHeader"; +static NSString *const kCollectionItem = @"PlotViewItem"; + @interface PlotGalleryController() @property (nonatomic, readwrite, strong, nullable) IBOutlet NSSplitView *splitView; @property (nonatomic, readwrite, strong, nullable) IBOutlet NSScrollView *scrollView; -@property (nonatomic, readwrite, strong, nullable) IBOutlet IKImageBrowserView *imageBrowser; +@property (nonatomic, readwrite, strong, nullable) IBOutlet NSCollectionView *imageBrowser; @property (nonatomic, readwrite, strong, nullable) IBOutlet NSPopUpButton *themePopUpButton; @property (nonatomic, readwrite, strong, nullable) IBOutlet PlotView *hostingView; @end +#pragma mark - + @implementation PlotGalleryController @synthesize splitView; @@ -56,11 +62,16 @@ -(void)awakeFromNib self.splitView.delegate = self; - self.imageBrowser.delegate = self; - self.imageBrowser.dataSource = self; - self.imageBrowser.cellsStyleMask = IKCellsStyleShadowed | IKCellsStyleTitled; // | IKCellsStyleSubtitled; + NSCollectionView *browser = self.imageBrowser; + + browser.delegate = self; + browser.dataSource = self; - [self.imageBrowser reloadData]; + [browser registerClass:[NSTextField class] + forSupplementaryViewOfKind:NSCollectionElementKindSectionHeader + withIdentifier:kCollectionHeader]; + + [browser reloadData]; self.hostingView.delegate = self; @@ -192,7 +203,7 @@ -(IBAction)exportTVImagesToPNG:(id)sender pngSavingDialog.canChooseDirectories = YES; pngSavingDialog.allowsMultipleSelection = NO; - if ( [pngSavingDialog runModal] == NSOKButton ) { + if ( [pngSavingDialog runModal] == NSModalResponseOK ) { NSURL *url = pngSavingDialog.URL; if ( url ) { // top image @@ -240,69 +251,104 @@ -(void)setPlotItem:(nullable PlotItem *)item } #pragma mark - -#pragma mark IKImageBrowserViewDataSource methods +#pragma mark NSCollectionViewDataSource methods --(NSUInteger)numberOfItemsInImageBrowser:(nonnull IKImageBrowserView *)browser +-(NSInteger)numberOfSectionsInCollectionView:(nonnull NSCollectionView *)collectionView; { - return [PlotGallery sharedPlotGallery].count; + return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } --(nonnull id)imageBrowser:(nonnull IKImageBrowserView *)browser itemAtIndex:(NSUInteger)index +-(NSInteger)collectionView:(nonnull NSCollectionView *)collectionView + numberOfItemsInSection:(NSInteger)section { - return [[PlotGallery sharedPlotGallery] objectInSection:0 atIndex:index]; + return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; } --(NSUInteger)numberOfGroupsInImageBrowser:(nonnull IKImageBrowserView *)aBrowser +-(nonnull NSCollectionViewItem *)collectionView:(nonnull NSCollectionView *)collectionView + itemForRepresentedObjectAtIndexPath:(nonnull NSIndexPath *)indexPath { - return [PlotGallery sharedPlotGallery].numberOfSections; + PlotViewItem *item = [collectionView makeItemWithIdentifier:kCollectionItem + forIndexPath:indexPath]; + + PlotItem *thePlotItem = [[PlotGallery sharedPlotGallery] objectInSection:(NSUInteger)indexPath.section + atIndex:(NSUInteger)indexPath.item]; + + item.plotItemTitle.stringValue = thePlotItem.title; + item.plotItemImage.image = thePlotItem.image; + + return item; } --(nonnull CPTDictionary *)imageBrowser:(nonnull IKImageBrowserView *)aBrowser groupAtIndex:(NSUInteger)index +-(nonnull NSView *) collectionView:(nonnull NSCollectionView *)collectionView + viewForSupplementaryElementOfKind:(nonnull NSCollectionViewSupplementaryElementKind)kind + atIndexPath:(nonnull NSIndexPath *)indexPath { - NSString *groupTitle = [PlotGallery sharedPlotGallery].sectionTitles[index]; + NSString *identifier = nil; - NSUInteger offset = 0; - - for ( NSUInteger i = 0; i < index; i++ ) { - offset += [[PlotGallery sharedPlotGallery] numberOfRowsInSection:i]; + if ( [kind isEqual:NSCollectionElementKindSectionHeader] ) { + identifier = kCollectionHeader; + } + else { + identifier = @""; } - NSValue *groupRange = [NSValue valueWithRange:NSMakeRange(offset, [[PlotGallery sharedPlotGallery] numberOfRowsInSection:index])]; + NSString *content = [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)indexPath.section]; + + NSView *view = [collectionView makeSupplementaryViewOfKind:kind withIdentifier:identifier forIndexPath:indexPath]; + if ( content && [view isKindOfClass:[NSTextField class]] ) { + NSTextField *titleTextField = (NSTextField *)view; - return @{ - IKImageBrowserGroupStyleKey: @(IKGroupDisclosureStyle), - IKImageBrowserGroupTitleKey: groupTitle, - IKImageBrowserGroupRangeKey: groupRange - }; + titleTextField.editable = NO; + titleTextField.selectable = NO; + titleTextField.backgroundColor = [NSColor controlAccentColor]; + titleTextField.textColor = [NSColor headerTextColor]; + titleTextField.font = [NSFont boldSystemFontOfSize:14.0]; + titleTextField.bordered = YES; + titleTextField.stringValue = content; + } + + return view; } #pragma mark - -#pragma mark IKImageBrowserViewDelegate methods +#pragma mark NSCollectionViewDelegate methods --(void)imageBrowserSelectionDidChange:(nonnull IKImageBrowserView *)browser +-(void) collectionView:(nonnull NSCollectionView *)collectionView + didSelectItemsAtIndexPaths:(nonnull NSSet *)indexPaths { - NSUInteger index = [browser selectionIndexes].firstIndex; + NSUInteger section = NSNotFound; + NSUInteger index = NSNotFound; + NSIndexPath *path = indexPaths.allObjects.firstObject; + + if ( path ) { + section = (NSUInteger)path.section; + index = (NSUInteger)path.item; + } if ( index != NSNotFound ) { - PlotItem *item = [[PlotGallery sharedPlotGallery] objectInSection:0 atIndex:index]; - self.plotItem = item; + self.plotItem = [[PlotGallery sharedPlotGallery] objectInSection:section atIndex:index]; } } #pragma mark - #pragma mark NSSplitViewDelegate methods --(CGFloat)splitView:(nonnull NSSplitView *)sv constrainMinCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index +-(CGFloat) splitView:(nonnull NSSplitView *)sv + constrainMinCoordinate:(CGFloat)coord + ofSubviewAt:(NSInteger)index { return coord + CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } --(CGFloat)splitView:(nonnull NSSplitView *)sv constrainMaxCoordinate:(CGFloat)coord ofSubviewAt:(NSInteger)index +-(CGFloat) splitView:(nonnull NSSplitView *)sv + constrainMaxCoordinate:(CGFloat)coord + ofSubviewAt:(NSInteger)index { return coord - CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } --(void)splitView:(nonnull NSSplitView *)sender resizeSubviewsWithOldSize:(NSSize)oldSize +-(void) splitView:(nonnull NSSplitView *)sender + resizeSubviewsWithOldSize:(NSSize)oldSize { // Lock the LHS width NSRect frame = sender.frame; diff --git a/examples/CorePlotGallery/src/mac/PlotViewItem.h b/examples/CorePlotGallery/src/mac/PlotViewItem.h new file mode 100644 index 000000000..c908c2f82 --- /dev/null +++ b/examples/CorePlotGallery/src/mac/PlotViewItem.h @@ -0,0 +1,13 @@ +// +// PlotViewItem.h +// CorePlotGallery +// + +#import + +@interface PlotViewItem : NSCollectionViewItem + +@property (nonatomic, readwrite, strong) IBOutlet NSImageView *plotItemImage; +@property (nonatomic, readwrite, strong) IBOutlet NSTextField *plotItemTitle; + +@end diff --git a/examples/CorePlotGallery/src/mac/PlotViewItem.m b/examples/CorePlotGallery/src/mac/PlotViewItem.m new file mode 100644 index 000000000..300f5e158 --- /dev/null +++ b/examples/CorePlotGallery/src/mac/PlotViewItem.m @@ -0,0 +1,13 @@ +// +// PlotViewItem.m +// CorePlotGallery +// + +#import "PlotViewItem.h" + +@implementation PlotViewItem + +@synthesize plotItemImage; +@synthesize plotItemTitle; + +@end diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index b035b891d..65a795855 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -189,15 +189,12 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum -(NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index { -#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE - UIColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].uiColor; -#else - NSColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].nsColor; -#endif - CPTNativeFont *labelFont = [CPTNativeFont fontWithName:@"Helvetica" - size:self.titleSize * CPTFloat(0.5)]; + CPTNativeColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].nativeColor; + CPTNativeFont *labelFont = [CPTNativeFont fontWithName:@"Helvetica" + size:self.titleSize * CPTFloat(0.5)]; NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"Pie Slice %lu", (unsigned long)index]]; + [title addAttribute:NSForegroundColorAttributeName value:sliceColor range:NSMakeRange(4, 5)]; diff --git a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m index 6e10d62a3..8b1f1fdfb 100644 --- a/examples/CorePlotGallery/src/shared/PiNumberFormatter.m +++ b/examples/CorePlotGallery/src/shared/PiNumberFormatter.m @@ -2,6 +2,8 @@ double gcd(double a, double b); +#pragma mark - + /** @brief A number formatter that converts numbers to multiples of π. **/ @implementation PiNumberFormatter diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index f0de1f59a..43be7cdca 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -12,6 +12,8 @@ @interface PlotGallery() @end +#pragma mark - + @implementation PlotGallery @synthesize plotItems; diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 7b5be9d9f..86d5d8214 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -9,7 +9,7 @@ #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else -// For IKImageBrowser +// For NSCollectionView #import #endif @@ -242,7 +242,7 @@ -(void)formatAllGraphs #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE --(nonnull UIImage *)image +-(nonnull CPTNativeImage *)image { if ( self.cachedImage == nil ) { CGRect imageFrame = CGRectMake(0, 0, 400, 300); @@ -287,7 +287,7 @@ -(nonnull UIImage *)image #else // OSX --(nonnull NSImage *)image +-(nonnull CPTNativeImage *)image { if ( self.cachedImage == nil ) { CGRect imageFrame = CGRectMake(0, 0, 400, 300); @@ -299,26 +299,9 @@ -(nonnull NSImage *)image CGSize boundsSize = imageFrame.size; - NSBitmapImageRep *layerImage = [[NSBitmapImageRep alloc] - initWithBitmapDataPlanes:NULL - pixelsWide:(NSInteger)boundsSize.width - pixelsHigh:(NSInteger)boundsSize.height - bitsPerSample:8 - samplesPerPixel:4 - hasAlpha:YES - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bytesPerRow:(NSInteger)boundsSize.width * 4 - bitsPerPixel:32]; - - NSGraphicsContext *bitmapContext = [NSGraphicsContext graphicsContextWithBitmapImageRep:layerImage]; - CGContextRef context = (CGContextRef)bitmapContext.graphicsPort; - - CGContextClearRect(context, CGRectMake(0.0, 0.0, boundsSize.width, boundsSize.height)); - CGContextSetAllowsAntialiasing(context, true); - CGContextSetShouldSmoothFonts(context, false); - [imageView.layer renderInContext:context]; - CGContextFlush(context); + NSBitmapImageRep *layerImage = [imageView bitmapImageRepForCachingDisplayInRect:imageFrame]; + layerImage.size = boundsSize; + [imageView cacheDisplayInRect:imageFrame toBitmapImageRep:layerImage]; self.cachedImage = [[NSImage alloc] initWithSize:NSSizeFromCGSize(boundsSize)]; [self.cachedImage addRepresentation:layerImage]; From a8d592d092875c052fdcf4d6b3fa7b51802d57b1 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 28 Dec 2019 10:57:24 -0500 Subject: [PATCH 405/429] Removed "private" from a pie chart delegate method in the iPhone CPTTestApp example app so that Core Plot can see it. Minor code formatting and .xib cleanup throughout that app, too. --- .../CPTTestApp-iPhone/Base.lproj/BarChart.xib | 21 +++++++-------- .../Base.lproj/MainWindow.xib | 26 +++++++++---------- .../CPTTestApp-iPhone/Base.lproj/PieChart.xib | 21 +++++++-------- .../Base.lproj/ScatterPlot.xib | 20 +++++++------- .../project.pbxproj | 8 +++--- .../Classes/BarChartController.swift | 2 +- .../Classes/PieChartController.swift | 9 +++---- .../Classes/ScatterPlotController.swift | 2 +- 8 files changed, 49 insertions(+), 60 deletions(-) diff --git a/examples/CPTTestApp-iPhone/Base.lproj/BarChart.xib b/examples/CPTTestApp-iPhone/Base.lproj/BarChart.xib index 08a16b67e..646ef95c3 100644 --- a/examples/CPTTestApp-iPhone/Base.lproj/BarChart.xib +++ b/examples/CPTTestApp-iPhone/Base.lproj/BarChart.xib @@ -1,7 +1,10 @@ - - + + + - + + + @@ -11,16 +14,10 @@ - + - - - + + - - - - - diff --git a/examples/CPTTestApp-iPhone/Base.lproj/MainWindow.xib b/examples/CPTTestApp-iPhone/Base.lproj/MainWindow.xib index eb90ba470..19255ec6e 100644 --- a/examples/CPTTestApp-iPhone/Base.lproj/MainWindow.xib +++ b/examples/CPTTestApp-iPhone/Base.lproj/MainWindow.xib @@ -1,7 +1,10 @@ - - + + + - + + + @@ -16,19 +19,18 @@ - - + + - - + + - - + @@ -45,6 +47,7 @@ + @@ -52,9 +55,4 @@ - - - - - diff --git a/examples/CPTTestApp-iPhone/Base.lproj/PieChart.xib b/examples/CPTTestApp-iPhone/Base.lproj/PieChart.xib index 2489ea51a..840e4935a 100644 --- a/examples/CPTTestApp-iPhone/Base.lproj/PieChart.xib +++ b/examples/CPTTestApp-iPhone/Base.lproj/PieChart.xib @@ -1,7 +1,10 @@ - - + + + - + + + @@ -11,16 +14,10 @@ - + - - - + + - - - - - diff --git a/examples/CPTTestApp-iPhone/Base.lproj/ScatterPlot.xib b/examples/CPTTestApp-iPhone/Base.lproj/ScatterPlot.xib index 7e1ed2991..b1747d817 100644 --- a/examples/CPTTestApp-iPhone/Base.lproj/ScatterPlot.xib +++ b/examples/CPTTestApp-iPhone/Base.lproj/ScatterPlot.xib @@ -1,7 +1,10 @@ - - + + + - + + + @@ -11,15 +14,10 @@ - + - - + + - - - - - diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 1cb2ca9d1..1dc66451a 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -182,12 +182,12 @@ BC8166CC1100DD00006D898E /* 16-line-chart.png */, BC8166CD1100DD00006D898E /* 17-bar-chart.png */, C3B9F9D317503CDD001CCC50 /* BlueTexture.png */, - C3D0A20E20E019EB00BA2921 /* PieChart.xib */, - C3D0A21E20E019F000BA2921 /* BarChart.xib */, + C3D0A22720E019FF00BA2921 /* Launch Screen.xib */, C3D0A22120E019F300BA2921 /* MainWindow.xib */, - C37A40F120E0322D00C4FF48 /* Info.plist */, C3D0A22420E019F800BA2921 /* ScatterPlot.xib */, - C3D0A22720E019FF00BA2921 /* Launch Screen.xib */, + C3D0A21E20E019F000BA2921 /* BarChart.xib */, + C3D0A20E20E019EB00BA2921 /* PieChart.xib */, + C37A40F120E0322D00C4FF48 /* Info.plist */, ); name = Resources; sourceTree = ""; diff --git a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift index 3d5bc8ae8..5e5618f03 100644 --- a/examples/CPTTestApp-iPhone/Classes/BarChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/BarChartController.swift @@ -3,7 +3,7 @@ import UIKit class BarChartController : UIViewController, CPTBarPlotDataSource { private var barGraph : CPTXYGraph? = nil - // MARK: Initialization + // MARK: - Initialization override func viewDidAppear(_ animated : Bool) { diff --git a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift index a281a4e36..3b99ed916 100644 --- a/examples/CPTTestApp-iPhone/Classes/PieChartController.swift +++ b/examples/CPTTestApp-iPhone/Classes/PieChartController.swift @@ -5,7 +5,7 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD let dataForChart = [20.0, 30.0, 60.0] - // MARK: Initialization + // MARK: - Initialization override func viewDidAppear(_ animated : Bool) { @@ -95,9 +95,8 @@ class PieChartController : UIViewController, CPTPieChartDataSource, CPTPieChartD } // MARK: - Delegate Methods - - private func pieChart(_ plot: CPTPlot, sliceWasSelectedAtRecordIndex recordIndex: UInt) - { - self.pieGraph?.title = "Selected index: \(recordIndex)" + + func pieChart(_ plot: CPTPieChart, sliceWasSelectedAtRecord idx: UInt) { + self.pieGraph?.title = "Selected index: \(idx)" } } diff --git a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift index fffaba488..76b3191ee 100644 --- a/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift +++ b/examples/CPTTestApp-iPhone/Classes/ScatterPlotController.swift @@ -6,7 +6,7 @@ class ScatterPlotController : UIViewController, CPTScatterPlotDataSource, CPTAxi typealias plotDataType = [CPTScatterPlotField : Double] private var dataForPlot = [plotDataType]() - // MARK: Initialization + // MARK: - Initialization override func viewDidAppear(_ animated : Bool) { From 00704e268ec0e12fdd5e4e81ed9029c541cbb983 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 29 Dec 2019 10:14:08 -0500 Subject: [PATCH 406/429] Moved the deployment target settings into the CorePlot.xcconfig file. --- framework/CorePlot.xcodeproj/project.pbxproj | 24 -------------------- framework/xcconfig/CorePlot.xcconfig | 4 ++++ 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index bc9f52bf7..0ed742d13 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3278,7 +3278,6 @@ buildSettings = { INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = UnitTests; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; @@ -3291,7 +3290,6 @@ buildSettings = { INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlotTests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_NAME = UnitTests; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/MacOnly"; @@ -3308,7 +3306,6 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; @@ -3327,7 +3324,6 @@ FRAMEWORK_VERSION = A; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-Info.plist"; INSTALL_PATH = "@rpath"; - MACOSX_DEPLOYMENT_TARGET = 10.8; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = macosx; @@ -3367,7 +3363,6 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -3400,7 +3395,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -3475,7 +3469,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Debug; @@ -3497,7 +3490,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = CorePlot; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Release; @@ -3513,7 +3505,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Debug; @@ -3529,7 +3520,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; - TVOS_DEPLOYMENT_TARGET = 9.0; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Source $(SRCROOT)/iPhoneOnly"; }; name = Release; @@ -3546,7 +3536,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3569,7 +3558,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-iOS-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3586,7 +3574,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-iOSTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3603,7 +3590,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-iOSTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3647,7 +3633,6 @@ DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "Documentation-iOS copy"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -3662,7 +3647,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "Documentation-iOS copy"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -3677,8 +3661,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = ""; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -3694,8 +3676,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-CocoaTouch-Info.plist"; INSTALL_PATH = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = ""; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -3710,7 +3690,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-CocoaTouchTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3727,7 +3706,6 @@ buildSettings = { CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = "$(SRCROOT)/Info/Base.lproj/CorePlot-CocoaTouchTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.$(PRODUCT_NAME:rfc1034identifier)"; @@ -3746,7 +3724,6 @@ DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; @@ -3761,7 +3738,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; diff --git a/framework/xcconfig/CorePlot.xcconfig b/framework/xcconfig/CorePlot.xcconfig index cb645b667..47203826f 100644 --- a/framework/xcconfig/CorePlot.xcconfig +++ b/framework/xcconfig/CorePlot.xcconfig @@ -7,6 +7,10 @@ VALID_ARCHS[sdk=macosx*] = i386 x86_64 VALID_ARCHS[sdk=appletvos*] = arm64 VALID_ARCHS[sdk=appletvsimulator*] = i386 x86_64 +IPHONEOS_DEPLOYMENT_TARGET = 8.0 +MACOSX_DEPLOYMENT_TARGET = 10.8 +TVOS_DEPLOYMENT_TARGET = 9.0 + SYMROOT = $(PROJECT_DIR)/../build DEBUG_INFORMATION_FORMAT = dwarf-with-dsym COMBINE_HIDPI_IMAGES = YES From f4fcb408c12843c102b46b707ec7931b58124b74 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 31 Dec 2019 11:26:58 -0500 Subject: [PATCH 407/429] Cleaned up some project settings in the Plot Gallery example app. --- .../Plot_Gallery.xcodeproj/project.pbxproj | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj index 83c018278..3b13aabaa 100644 --- a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj @@ -1043,7 +1043,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "-"; @@ -1063,6 +1062,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.Plot-Gallery-Mac"; PRODUCT_NAME = "Plot Gallery"; RUN_CLANG_STATIC_ANALYZER = YES; + SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; }; name = Debug; @@ -1071,7 +1071,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "-"; @@ -1090,6 +1089,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.CorePlot.Plot-Gallery-Mac"; PRODUCT_NAME = "Plot Gallery"; RUN_CLANG_STATIC_ANALYZER = YES; + SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; }; name = Release; @@ -1098,6 +1098,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -1127,13 +1128,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ""; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-ObjC", "-all_load", ); - SDKROOT = macosx; SYMROOT = "$(PROJECT_DIR)/../../build"; }; name = Debug; @@ -1142,6 +1141,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; @@ -1173,7 +1173,6 @@ "-ObjC", "-all_load", ); - SDKROOT = macosx; SYMROOT = "$(PROJECT_DIR)/../../build"; }; name = Release; @@ -1182,7 +1181,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -1226,7 +1224,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -1267,7 +1264,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -1311,7 +1307,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C3C0DF2719D86B5E00631CAD /* CorePlotWarnings.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; From 39c924f47b4f6195e809002aee513f18e668760b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 11:38:57 -0500 Subject: [PATCH 408/429] Changed "OS X" to "macOS" in the podspec files. --- CorePlot-latest.podspec | 4 ++-- CorePlot.podspec | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CorePlot-latest.podspec b/CorePlot-latest.podspec index 6863350ba..3b958f7e4 100644 --- a/CorePlot-latest.podspec +++ b/CorePlot-latest.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = 'CorePlot' s.version = '99.99.99' s.license = 'BSD' - s.summary = 'Cocoa plotting framework for Mac OS X, iOS, and tvOS.' + s.summary = 'Cocoa plotting framework for macOS, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' s.social_media_url = 'https://twitter.com/CorePlot' s.documentation_url = 'http://core-plot.github.io' @@ -14,7 +14,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/core-plot/core-plot.git' } - s.description = 'Core Plot is a plotting framework for OS X, iOS, and tvOS. It provides 2D visualization ' \ + s.description = 'Core Plot is a plotting framework for macOS, iOS, and tvOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' diff --git a/CorePlot.podspec b/CorePlot.podspec index f0b7626bb..7b09046c7 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -2,7 +2,7 @@ Pod::Spec.new do |s| s.name = 'CorePlot' s.version = '2.2' s.license = 'BSD' - s.summary = 'Cocoa plotting framework for Mac OS X, iOS, and tvOS.' + s.summary = 'Cocoa plotting framework for macOS, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' s.social_media_url = 'https://twitter.com/CorePlot' s.documentation_url = 'http://core-plot.github.io' @@ -14,7 +14,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.2'} - s.description = 'Core Plot is a plotting framework for OS X, iOS, and tvOS. It provides 2D visualization ' \ + s.description = 'Core Plot is a plotting framework for macOS, iOS, and tvOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ 'Core Data, and Cocoa Bindings.' From 69c4b857506849ac244c5b53ecd0e3f4dab9a65f Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 13:00:37 -0500 Subject: [PATCH 409/429] Added support for variable bar widths in bar plots. Fixed issue #340. --- .../src/plots/ColoredBarChart.m | 5 + framework/Source/CPTBarPlot.h | 21 ++++ framework/Source/CPTBarPlot.m | 95 ++++++++++++++++--- 3 files changed, 110 insertions(+), 11 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 885203624..2e01e446d 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -215,6 +215,11 @@ -(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex return [CPTFill fillWithGradient:fillGradient]; } +-(nullable NSNumber *)barWidthForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx +{ + return @((double)(arc4random_uniform(50) + 25) / 100.0); +} + -(nullable NSString *)legendTitleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)index { return [NSString stringWithFormat:@"Bar %lu", (unsigned long)(index + 1)]; diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index f44f7ad94..2b04046e2 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -25,6 +25,7 @@ extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarTips; extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarBases; extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarFills; extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarLineStyles; +extern CPTBarPlotBinding __nonnull const CPTBarPlotBindingBarWidths; /// @} /** @@ -83,6 +84,24 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { **/ -(nullable CPTLineStyle *)barLineStyleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; +/** @brief @optional Gets an array of bar widths for the given bar plot. + * @param barPlot The bar plot. + * @param indexRange The range of the data indexes of interest. + * @return An array of bar widths. + **/ +-(nullable CPTNumberArray *)barWidthsForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndexRange:(NSRange)indexRange; + +/** @brief @optional Gets a bar width for the given bar plot. + * This method will not be called if + * @link CPTBarPlotDataSource::barWidthsForBarPlot:recordIndexRange: -barWidthsForBarPlot:recordIndexRange: @endlink + * is also implemented in the datasource. + * @param barPlot The bar plot. + * @param idx The data index of interest. + * @return The bar width for the bar with the given index. If the data source returns @nil, the default barWidth is used. + * If the data source returns an NSNull object, no line is drawn. + **/ +-(nullable NSNumber *)barWidthForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; + /// @} /// @name Legends @@ -225,6 +244,8 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { -(void)reloadBarFillsInIndexRange:(NSRange)indexRange; -(void)reloadBarLineStyles; -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange; +-(void)reloadBarWidths; +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange; /// @} @end diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 7a977ab3f..9ace4c8ff 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -32,6 +32,7 @@ CPTBarPlotBinding const CPTBarPlotBindingBarBases = @"barBases"; ///< Bar bases. CPTBarPlotBinding const CPTBarPlotBindingBarFills = @"barFills"; ///< Bar fills. CPTBarPlotBinding const CPTBarPlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. +CPTBarPlotBinding const CPTBarPlotBindingBarWidths = @"barWidths"; ///< Bar widths. /// @cond @interface CPTBarPlot() @@ -45,15 +46,16 @@ @interface CPTBarPlot() -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint tipPoint:(nonnull CGPoint *)tipPoint; -(nullable CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context recordIndex:(NSUInteger)recordIndex; --(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint; +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint width:(NSNumber *)width; -(nullable CPTFill *)barFillForIndex:(NSUInteger)idx; -(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx; -(void)drawBarInContext:(nonnull CGContextRef)context recordIndex:(NSUInteger)idx; -(CGFloat)lengthInView:(NSDecimal)plotLength; -(double)doubleLengthInPlotCoordinates:(NSDecimal)decimalLength; --(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint; +-(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint width:(NSNumber *)width; @end @@ -368,6 +370,9 @@ -(void)reloadDataInIndexRange:(NSRange)indexRange // Bar line styles [self reloadBarLineStylesInIndexRange:indexRange]; + // Bar line widths + [self reloadBarWidthsInIndexRange:indexRange]; + // Legend id theDataSource = (id)self.dataSource; @@ -529,7 +534,9 @@ -(void)reloadBarFillsInIndexRange:(NSRange)indexRange } } - [self cacheArray:array forKey:CPTBarPlotBindingBarFills atRecordIndex:indexRange.location]; + [self cacheArray:array + forKey:CPTBarPlotBindingBarFills + atRecordIndex:indexRange.location]; } // Legend @@ -581,7 +588,9 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange } } - [self cacheArray:array forKey:CPTBarPlotBindingBarLineStyles atRecordIndex:indexRange.location]; + [self cacheArray:array + forKey:CPTBarPlotBindingBarLineStyles + atRecordIndex:indexRange.location]; } // Legend @@ -592,6 +601,49 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange [self setNeedsDisplay]; } +/** + * @brief Reload all bar widths from the data source immediately. + **/ +-(void)reloadBarWidths +{ + [self reloadBarWidthsInIndexRange:NSMakeRange(0, self.cachedDataCount)]; +} + +/** @brief Reload bar widths in the given index range from the data source immediately. + * @param indexRange The index range to load. + **/ +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange +{ + id theDataSource = (id)self.dataSource; + + if ( [theDataSource respondsToSelector:@selector(barWidthsForBarPlot:recordIndexRange:)] ) { + [self cacheArray:[theDataSource barWidthsForBarPlot:self recordIndexRange:indexRange] + forKey:CPTBarPlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + else if ( [theDataSource respondsToSelector:@selector(barWidthForBarPlot:recordIndex:)] ) { + id nilObject = [CPTPlot nilData]; + CPTMutableNumberArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); + + for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { + NSNumber *width = [theDataSource barWidthForBarPlot:self recordIndex:idx]; + if ( width ) { + [array addObject:width]; + } + else { + [array addObject:nilObject]; + } + } + + [self cacheArray:array + forKey:CPTBarPlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + + [self setNeedsDisplay]; +} + #pragma mark - #pragma mark Length Conversions for Independent Coordinate (e.g., widths, offsets) @@ -945,18 +997,23 @@ -(nullable CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context return NULL; } - CGMutablePathRef path = [self newBarPathWithContext:context basePoint:basePoint tipPoint:tipPoint]; + NSNumber *width = [self barWidthForIndex:recordIndex]; + + CGMutablePathRef path = [self newBarPathWithContext:context + basePoint:basePoint + tipPoint:tipPoint + width:width]; return path; } --(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint +-(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context basePoint:(CGPoint)basePoint tipPoint:(CGPoint)tipPoint width:(NSNumber *)width { // This function is used to create a path which is used for both // drawing a bar and for doing hit-testing on a click/touch event BOOL horizontalBars = self.barsAreHorizontal; - CGFloat barWidthLength = [self lengthInView:self.barWidth.decimalValue]; + CGFloat barWidthLength = [self lengthInView:width.decimalValue]; CGFloat halfBarWidth = CPTFloat(0.5) * barWidthLength; CGRect barRect; @@ -1073,10 +1130,10 @@ -(nonnull CGMutablePathRef)newBarPathWithContext:(nullable CGContextRef)context return path; } --(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint +-(BOOL)barIsVisibleWithBasePoint:(CGPoint)basePoint width:(NSNumber *)width { BOOL horizontalBars = self.barsAreHorizontal; - CGFloat barWidthLength = [self lengthInView:self.barWidth.decimalValue]; + CGFloat barWidthLength = [self lengthInView:width.decimalValue]; CGFloat halfBarWidth = CPTFloat(0.5) * barWidthLength; CPTPlotArea *thePlotArea = self.plotArea; @@ -1110,6 +1167,17 @@ -(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx return theBarLineStyle; } +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx +{ + NSNumber *theBarWidth = [self cachedValueForKey:CPTBarPlotBindingBarWidths recordIndex:idx]; + + if ((theBarWidth == nil) || (theBarWidth == [CPTPlot nilData])) { + theBarWidth = self.barWidth; + } + + return theBarWidth; +} + -(void)drawBarInContext:(nonnull CGContextRef)context recordIndex:(NSUInteger)idx { // Get base and tip points @@ -1120,12 +1188,17 @@ -(void)drawBarInContext:(nonnull CGContextRef)context recordIndex:(NSUInteger)id return; } + NSNumber *width = [self barWidthForIndex:idx]; + // Return if bar is off screen - if ( ![self barIsVisibleWithBasePoint:basePoint] ) { + if ( ![self barIsVisibleWithBasePoint:basePoint width:width] ) { return; } - CGMutablePathRef path = [self newBarPathWithContext:context basePoint:basePoint tipPoint:tipPoint]; + CGMutablePathRef path = [self newBarPathWithContext:context + basePoint:basePoint + tipPoint:tipPoint + width:width]; if ( path ) { CGContextSaveGState(context); From 23799c889b957487978f52accf7d19c63d6d95b8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 14:08:06 -0500 Subject: [PATCH 410/429] Exposed data binding for bar plot bar widths. --- framework/Source/CPTBarPlot.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index 9ace4c8ff..a31d099b0 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -207,6 +207,7 @@ +(void)initialize [self exposeBinding:CPTBarPlotBindingBarBases]; [self exposeBinding:CPTBarPlotBindingBarFills]; [self exposeBinding:CPTBarPlotBindingBarLineStyles]; + [self exposeBinding:CPTBarPlotBindingBarWidths]; } } @@ -370,7 +371,7 @@ -(void)reloadDataInIndexRange:(NSRange)indexRange // Bar line styles [self reloadBarLineStylesInIndexRange:indexRange]; - // Bar line widths + // Bar widths [self reloadBarWidthsInIndexRange:indexRange]; // Legend From def37e9600aa40ad907a228a62e740baf829ba35 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 14:08:34 -0500 Subject: [PATCH 411/429] Added support for variable bar widths in range plots. --- .../CorePlotGallery/src/plots/RangePlot.m | 5 ++ framework/Source/CPTRangePlot.h | 21 +++++ framework/Source/CPTRangePlot.m | 79 ++++++++++++++++++- 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index cbbaf2423..0612971ca 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -210,6 +210,11 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent return NO; } +-(nullable NSNumber *)barWidthForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx +{ + return @(arc4random_uniform(85) + 15); +} + #pragma mark - #pragma mark Plot Delegate Methods diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index 11a96b061..4d335c690 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -19,6 +19,7 @@ extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingLowValues; extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingLeftValues; extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingRightValues; extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingBarLineStyles; +extern CPTRangePlotBinding __nonnull const CPTRangePlotBindingBarWidths; /// @} /** @@ -70,6 +71,24 @@ typedef NS_ENUM (NSInteger, CPTRangePlotFillDirection) { **/ -(nullable CPTLineStyle *)barLineStyleForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx; +/** @brief @optional Gets an array of bar widths for the given range plot. + * @param plot The range plot. + * @param indexRange The range of the data indexes of interest. + * @return An array of bar widths. + **/ +-(nullable CPTNumberArray *)barWidthsForRangePlot:(nonnull CPTRangePlot *)barPlot recordIndexRange:(NSRange)indexRange; + +/** @brief @optional Gets a bar width for the given range plot. + * This method will not be called if + * @link CPTBarPlotDataSource::barWidthsForBarPlot:recordIndexRange: -barWidthsForBarPlot:recordIndexRange: @endlink + * is also implemented in the datasource. + * @param plot The range plot. + * @param idx The data index of interest. + * @return The bar width for the bar with the given index. If the data source returns @nil, the default barWidth is used. + * If the data source returns an NSNull object, no line is drawn. + **/ +-(nullable NSNumber *)barWidthForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx; + /// @} @end @@ -176,6 +195,8 @@ typedef NS_ENUM (NSInteger, CPTRangePlotFillDirection) { /// @{ -(void)reloadBarLineStyles; -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange; +-(void)reloadBarWidths; +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange; /// @} @end diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index 0a108f428..cd6cf8a6a 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -13,6 +13,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "NSNumberExtensions.h" #import "tgmath.h" /** @defgroup plotAnimationRangePlot Range Plot @@ -34,6 +35,7 @@ CPTRangePlotBinding const CPTRangePlotBindingLeftValues = @"leftValues"; ///< Left price values. CPTRangePlotBinding const CPTRangePlotBindingRightValues = @"rightValues"; ///< Right price values. CPTRangePlotBinding const CPTRangePlotBindingBarLineStyles = @"barLineStyles"; ///< Bar line styles. +CPTRangePlotBinding const CPTRangePlotBindingBarWidths = @"barWidths"; ///< Bar widths. /// @cond struct CGPointError { @@ -64,6 +66,7 @@ -(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags number -(void)drawRangeInContext:(nonnull CGContextRef)context lineStyle:(nonnull CPTLineStyle *)lineStyle viewPoint:(CGPointError *)viewPoint halfGapSize:(CGSize)halfGapSize halfBarWidth:(CGFloat)halfBarWidth alignPoints:(BOOL)alignPoints; -(CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx; +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx; @end @@ -156,6 +159,7 @@ +(void)initialize [self exposeBinding:CPTRangePlotBindingLeftValues]; [self exposeBinding:CPTRangePlotBindingRightValues]; [self exposeBinding:CPTRangePlotBindingBarLineStyles]; + [self exposeBinding:CPTRangePlotBindingBarWidths]; } } @@ -170,7 +174,12 @@ +(void)initialize * * This is the designated initializer. The initialized layer will have the following properties: * - @ref barLineStyle = default line style + * - @ref fillDirection = CPTRangePlotFillHorizontal * - @ref areaFill = @nil + * - @ref areaBorderLineStyle = @nil + * - @ref barWidth = 0.0 + * - @ref gapHeight = 0.0 + * - @ref gapWidth = 0.0 * - @ref labelField = #CPTRangePlotFieldX * * @param newFrame The frame rectangle. @@ -183,6 +192,9 @@ -(nonnull instancetype)initWithFrame:(CGRect)newFrame fillDirection = CPTRangePlotFillHorizontal; areaFill = nil; areaBorderLineStyle = nil; + barWidth = CPTFloat(0.0); + gapHeight = CPTFloat(0.0); + gapWidth = CPTFloat(0.0); pointingDeviceDownIndex = NSNotFound; @@ -204,6 +216,9 @@ -(nonnull instancetype)initWithLayer:(nonnull id)layer fillDirection = theLayer->fillDirection; areaFill = theLayer->areaFill; areaBorderLineStyle = theLayer->areaBorderLineStyle; + barWidth = theLayer->barWidth; + gapHeight = theLayer->gapHeight; + gapWidth = theLayer->gapWidth; pointingDeviceDownIndex = NSNotFound; } @@ -545,6 +560,9 @@ -(void)reloadDataInIndexRange:(NSRange)indexRange // Bar line styles [self reloadBarLineStylesInIndexRange:indexRange]; + + // Bar widths + [self reloadBarWidthsInIndexRange:indexRange]; } -(void)reloadPlotDataInIndexRange:(NSRange)indexRange @@ -633,6 +651,49 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange [self setNeedsDisplay]; } +/** + * @brief Reload all bar widths from the data source immediately. + **/ +-(void)reloadBarWidths +{ + [self reloadBarWidthsInIndexRange:NSMakeRange(0, self.cachedDataCount)]; +} + +/** @brief Reload bar widths in the given index range from the data source immediately. + * @param indexRange The index range to load. + **/ +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange +{ + id theDataSource = (id)self.dataSource; + + if ( [theDataSource respondsToSelector:@selector(barWidthsForRangePlot:recordIndexRange:)] ) { + [self cacheArray:[theDataSource barWidthsForRangePlot:self recordIndexRange:indexRange] + forKey:CPTRangePlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + else if ( [theDataSource respondsToSelector:@selector(barWidthForRangePlot:recordIndex:)] ) { + id nilObject = [CPTPlot nilData]; + CPTMutableNumberArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); + + for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { + NSNumber *width = [theDataSource barWidthForRangePlot:self recordIndex:idx]; + if ( width ) { + [array addObject:width]; + } + else { + [array addObject:nilObject]; + } + } + + [self cacheArray:array + forKey:CPTRangePlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + + [self setNeedsDisplay]; +} + #pragma mark - #pragma mark Drawing @@ -775,11 +836,12 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context CGPathRelease(fillPath); } - CGSize halfGapSize = CPTSizeMake(self.gapWidth * CPTFloat(0.5), self.gapHeight * CPTFloat(0.5)); - CGFloat halfBarWidth = self.barWidth * CPTFloat(0.5); - BOOL alignPoints = self.alignsPointsToPixels; + CGSize halfGapSize = CPTSizeMake(self.gapWidth * CPTFloat(0.5), self.gapHeight * CPTFloat(0.5)); + BOOL alignPoints = self.alignsPointsToPixels; for ( NSUInteger i = (NSUInteger)firstDrawnPointIndex; i <= (NSUInteger)lastDrawnPointIndex; i++ ) { + CGFloat halfBarWidth = [self barWidthForIndex:i].cgFloatValue * CPTFloat(0.5); + [self drawRangeInContext:context lineStyle:[self barLineStyleForIndex:i] viewPoint:&viewPoints[i] @@ -967,6 +1029,17 @@ -(nullable CPTLineStyle *)barLineStyleForIndex:(NSUInteger)idx return theBarLineStyle; } +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx +{ + NSNumber *theBarWidth = [self cachedValueForKey:CPTRangePlotBindingBarWidths recordIndex:idx]; + + if ((theBarWidth == nil) || (theBarWidth == [CPTPlot nilData])) { + theBarWidth = @(self.barWidth); + } + + return theBarWidth; +} + /// @endcond #pragma mark - From b2ffc2a1218338a57c9173d7ecabca1fb15fa582 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 15:16:47 -0500 Subject: [PATCH 412/429] Fixed documentation typos in CPTBarPlot and CPTRangePlot. --- framework/Source/CPTBarPlot.h | 1 - framework/Source/CPTRangePlot.h | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/Source/CPTBarPlot.h b/framework/Source/CPTBarPlot.h index 2b04046e2..282fd873d 100644 --- a/framework/Source/CPTBarPlot.h +++ b/framework/Source/CPTBarPlot.h @@ -98,7 +98,6 @@ typedef NS_ENUM (NSInteger, CPTBarPlotField) { * @param barPlot The bar plot. * @param idx The data index of interest. * @return The bar width for the bar with the given index. If the data source returns @nil, the default barWidth is used. - * If the data source returns an NSNull object, no line is drawn. **/ -(nullable NSNumber *)barWidthForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx; diff --git a/framework/Source/CPTRangePlot.h b/framework/Source/CPTRangePlot.h index 4d335c690..5e3434e38 100644 --- a/framework/Source/CPTRangePlot.h +++ b/framework/Source/CPTRangePlot.h @@ -80,12 +80,11 @@ typedef NS_ENUM (NSInteger, CPTRangePlotFillDirection) { /** @brief @optional Gets a bar width for the given range plot. * This method will not be called if - * @link CPTBarPlotDataSource::barWidthsForBarPlot:recordIndexRange: -barWidthsForBarPlot:recordIndexRange: @endlink + * @link CPTRangePlotDataSource::barWidthForRangePlot:recordIndexRange: -barWidthForRangePlot:recordIndexRange: @endlink * is also implemented in the datasource. * @param plot The range plot. * @param idx The data index of interest. * @return The bar width for the bar with the given index. If the data source returns @nil, the default barWidth is used. - * If the data source returns an NSNull object, no line is drawn. **/ -(nullable NSNumber *)barWidthForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx; From e5d3a87b8b69888d501493effc1798a0d92f337b Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 15:17:44 -0500 Subject: [PATCH 413/429] Added barWidths properties for the data bindings in CPTBarPlot and CPTRangePlot. --- framework/Source/CPTBarPlot.m | 2 ++ framework/Source/CPTRangePlot.m | 2 ++ 2 files changed, 4 insertions(+) diff --git a/framework/Source/CPTBarPlot.m b/framework/Source/CPTBarPlot.m index a31d099b0..e667773e3 100644 --- a/framework/Source/CPTBarPlot.m +++ b/framework/Source/CPTBarPlot.m @@ -42,6 +42,7 @@ @interface CPTBarPlot() @property (nonatomic, readwrite, copy, nullable) CPTNumberArray *barBases; @property (nonatomic, readwrite, copy, nullable) CPTFillArray *barFills; @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barWidths; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(BOOL)barAtRecordIndex:(NSUInteger)idx basePoint:(nonnull CGPoint *)basePoint tipPoint:(nonnull CGPoint *)tipPoint; @@ -77,6 +78,7 @@ @implementation CPTBarPlot @dynamic barBases; @dynamic barFills; @dynamic barLineStyles; +@dynamic barWidths; /** @property CGFloat barCornerRadius * @brief The corner radius for the end of the bars. Default is @num{0.0} for square corners. diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index cd6cf8a6a..ed101fb26 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -57,6 +57,7 @@ @interface CPTRangePlot() @property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *leftValues; @property (nonatomic, readwrite, copy, nullable) CPTMutableNumericData *rightValues; @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barWidths; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; -(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; @@ -91,6 +92,7 @@ @implementation CPTRangePlot @dynamic leftValues; @dynamic rightValues; @dynamic barLineStyles; +@dynamic barWidths; /** @property CPTRangePlotFillDirection fillDirection * @brief Fill the range in a horizontal or vertical direction. From e16796ebfb711766d0278760a837801c117aad96 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 15:18:14 -0500 Subject: [PATCH 414/429] Added support for variable bar widths in trading range plots. --- .../src/plots/CandlestickPlot.m | 5 ++ framework/Source/CPTTradingRangePlot.h | 20 +++++ framework/Source/CPTTradingRangePlot.m | 79 +++++++++++++++++-- 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index 4d83cb741..6eff04149 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -215,6 +215,11 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum return num; } +-(nullable NSNumber *)barWidthForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx +{ + return @(arc4random_uniform(85) + 15); +} + #pragma mark - #pragma mark Plot Delegate Methods diff --git a/framework/Source/CPTTradingRangePlot.h b/framework/Source/CPTTradingRangePlot.h index 77c319b9b..b32085afe 100644 --- a/framework/Source/CPTTradingRangePlot.h +++ b/framework/Source/CPTTradingRangePlot.h @@ -24,6 +24,7 @@ extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingDecr extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingLineStyles; extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingIncreaseLineStyles; extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingDecreaseLineStyles; +extern CPTTradingRangePlotBinding __nonnull const CPTTradingRangePlotBindingBarWidths; /// @} /** @@ -91,6 +92,23 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { **/ -(nullable CPTFill *)decreaseFillForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; +/** @brief @optional Gets an array of bar widths for the given trading range plot. + * @param plot The trading range plot. + * @param indexRange The range of the data indexes of interest. + * @return An array of bar widths. + **/ +-(nullable CPTNumberArray *)barWidthsForTradingRangePlot:(nonnull CPTTradingRangePlot *)barPlot recordIndexRange:(NSRange)indexRange; + +/** @brief @optional Gets a bar width for the given trading range plot. + * This method will not be called if + * @link CPTTradingRangePlotDataSource::barWidthForTradingRangePlot:recordIndexRange: -barWidthForTradingRangePlot:recordIndexRange: @endlink + * is also implemented in the datasource. + * @param plot The tradingrange plot. + * @param idx The data index of interest. + * @return The bar width for the bar with the given index. If the data source returns @nil, the default barWidth is used. + **/ +-(nullable NSNumber *)barWidthForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx; + /// @} /// @name Bar Line Styles @@ -261,6 +279,8 @@ typedef NS_ENUM (NSInteger, CPTTradingRangePlotField) { -(void)reloadBarFillsInIndexRange:(NSRange)indexRange; -(void)reloadBarLineStyles; -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange; +-(void)reloadBarWidths; +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange; /// @} @end diff --git a/framework/Source/CPTTradingRangePlot.m b/framework/Source/CPTTradingRangePlot.m index 6d07649c1..3589b2870 100644 --- a/framework/Source/CPTTradingRangePlot.m +++ b/framework/Source/CPTTradingRangePlot.m @@ -12,6 +12,7 @@ #import "CPTUtilities.h" #import "CPTXYPlotSpace.h" #import "NSCoderExtensions.h" +#import "NSNumberExtensions.h" #import "tgmath.h" /** @defgroup plotAnimationTradingRangePlot Trading Range Plot @@ -36,6 +37,7 @@ CPTTradingRangePlotBinding const CPTTradingRangePlotBindingLineStyles = @"lineStyles"; ///< Line styles used to draw candlestick or OHLC symbols. CPTTradingRangePlotBinding const CPTTradingRangePlotBindingIncreaseLineStyles = @"increaseLineStyles"; ///< Line styles used to outline candlestick symbols when close >= open. CPTTradingRangePlotBinding const CPTTradingRangePlotBindingDecreaseLineStyles = @"decreaseLineStyles"; ///< Line styles used to outline candlestick symbols when close < open. +CPTTradingRangePlotBinding const CPTTradingRangePlotBindingBarWidths = @"barWidths"; ///< Bar widths. static const CPTCoordinate independentCoord = CPTCoordinateX; static const CPTCoordinate dependentCoord = CPTCoordinateY; @@ -53,9 +55,10 @@ @interface CPTTradingRangePlot() @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *lineStyles; @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *increaseLineStyles; @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *decreaseLineStyles; +@property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barWidths; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; --(void)drawCandleStickInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; +-(void)drawCandleStickInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue width:(CGFloat)width alignPoints:(BOOL)alignPoints; -(void)drawOHLCInContext:(nonnull CGContextRef)context atIndex:(NSUInteger)idx x:(CGFloat)x open:(CGFloat)openValue close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue alignPoints:(BOOL)alignPoints; -(nullable CPTFill *)increaseFillForIndex:(NSUInteger)idx; @@ -65,6 +68,8 @@ -(nullable CPTLineStyle *)lineStyleForIndex:(NSUInteger)idx; -(nullable CPTLineStyle *)increaseLineStyleForIndex:(NSUInteger)idx; -(nullable CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx; +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx; + @end /// @endcond @@ -90,6 +95,7 @@ @implementation CPTTradingRangePlot @dynamic lineStyles; @dynamic increaseLineStyles; @dynamic decreaseLineStyles; +@dynamic barWidths; /** @property nullable CPTLineStyle *lineStyle * @brief The line style used to draw candlestick or OHLC symbols. @@ -174,6 +180,7 @@ +(void)initialize [self exposeBinding:CPTTradingRangePlotBindingLineStyles]; [self exposeBinding:CPTTradingRangePlotBindingIncreaseLineStyles]; [self exposeBinding:CPTTradingRangePlotBindingDecreaseLineStyles]; + [self exposeBinding:CPTTradingRangePlotBindingBarWidths]; } } @@ -326,6 +333,9 @@ -(void)reloadDataInIndexRange:(NSRange)indexRange // Line styles [self reloadBarLineStylesInIndexRange:indexRange]; + + // Bar widths + [self reloadBarWidthsInIndexRange:indexRange]; } -(void)reloadPlotDataInIndexRange:(NSRange)indexRange @@ -549,6 +559,49 @@ -(void)reloadBarLineStylesInIndexRange:(NSRange)indexRange [self setNeedsDisplay]; } +/** + * @brief Reload all bar widths from the data source immediately. + **/ +-(void)reloadBarWidths +{ + [self reloadBarWidthsInIndexRange:NSMakeRange(0, self.cachedDataCount)]; +} + +/** @brief Reload bar widths in the given index range from the data source immediately. + * @param indexRange The index range to load. + **/ +-(void)reloadBarWidthsInIndexRange:(NSRange)indexRange +{ + id theDataSource = (id)self.dataSource; + + if ( [theDataSource respondsToSelector:@selector(barWidthsForTradingRangePlot:recordIndexRange:)] ) { + [self cacheArray:[theDataSource barWidthsForTradingRangePlot:self recordIndexRange:indexRange] + forKey:CPTTradingRangePlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + else if ( [theDataSource respondsToSelector:@selector(barWidthForTradingRangePlot:recordIndex:)] ) { + id nilObject = [CPTPlot nilData]; + CPTMutableNumberArray *array = [[NSMutableArray alloc] initWithCapacity:indexRange.length]; + NSUInteger maxIndex = NSMaxRange(indexRange); + + for ( NSUInteger idx = indexRange.location; idx < maxIndex; idx++ ) { + NSNumber *width = [theDataSource barWidthForTradingRangePlot:self recordIndex:idx]; + if ( width ) { + [array addObject:width]; + } + else { + [array addObject:nilObject]; + } + } + + [self cacheArray:array + forKey:CPTTradingRangePlotBindingBarWidths + atRecordIndex:indexRange.location]; + } + + [self setNeedsDisplay]; +} + #pragma mark - #pragma mark Drawing @@ -675,6 +728,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context close:closePoint.y high:highPoint.y low:lowPoint.y + width:[self barWidthForIndex:i].cgFloatValue alignPoints:alignPoints]; break; } @@ -768,6 +822,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context close:closePoint.y high:highPoint.y low:lowPoint.y + width:[self barWidthForIndex:i].cgFloatValue alignPoints:alignPoints]; break; } @@ -785,9 +840,11 @@ -(void)drawCandleStickInContext:(nonnull CGContextRef)context close:(CGFloat)closeValue high:(CGFloat)highValue low:(CGFloat)lowValue + width:(CGFloat)width alignPoints:(BOOL)alignPoints { - const CGFloat halfBarWidth = CPTFloat(0.5) * self.barWidth; + const CGFloat halfBarWidth = CPTFloat(0.5) * width; + CPTFill *currentBarFill = nil; CPTLineStyle *theBorderLineStyle = nil; @@ -1026,7 +1083,7 @@ -(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx i switch ( self.plotStyle ) { case CPTTradingRangePlotStyleOHLC: [self drawOHLCInContext:context - atIndex:idx + atIndex:0 x:CGRectGetMidX(rect) open:CGRectGetMinY(rect) + rect.size.height / CPTFloat(3.0) close:CGRectGetMinY(rect) + rect.size.height * (CGFloat)(2.0 / 3.0) @@ -1037,12 +1094,13 @@ -(void)drawSwatchForLegend:(nonnull CPTLegend *)legend atIndex:(NSUInteger)idx i case CPTTradingRangePlotStyleCandleStick: [self drawCandleStickInContext:context - atIndex:idx + atIndex:0 x:CGRectGetMidX(rect) open:CGRectGetMinY(rect) + rect.size.height / CPTFloat(3.0) close:CGRectGetMinY(rect) + rect.size.height * (CGFloat)(2.0 / 3.0) high:CGRectGetMaxY(rect) low:CGRectGetMinY(rect) + width:rect.size.width * CPTFloat(0.8) alignPoints:YES]; break; } @@ -1112,6 +1170,17 @@ -(nullable CPTLineStyle *)decreaseLineStyleForIndex:(NSUInteger)idx return theLineStyle; } +-(nonnull NSNumber *)barWidthForIndex:(NSUInteger)idx +{ + NSNumber *theBarWidth = [self cachedValueForKey:CPTTradingRangePlotBindingBarWidths recordIndex:idx]; + + if ((theBarWidth == nil) || (theBarWidth == [CPTPlot nilData])) { + theBarWidth = @(self.barWidth); + } + + return theBarWidth; +} + /// @endcond #pragma mark - @@ -1478,7 +1547,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point break; case CPTTradingRangePlotStyleCandleStick: - offset = self.barWidth * CPTFloat(0.5); + offset = [self barWidthForIndex:result].cgFloatValue * CPTFloat(0.5); break; } From 6ff971cd535491fee74acf91a9ed5cb554de09ab Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 16:11:44 -0500 Subject: [PATCH 415/429] Updated the copyright year to 2020 in the license file. --- License.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/License.txt b/License.txt index 8372ff9de..fbd7853fe 100644 --- a/License.txt +++ b/License.txt @@ -1,4 +1,4 @@ -Copyright (c) 2019, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, Victor Martin Garcia, Jérôme Morissard, Demitri Muna, Tim Monzures, Kirill Yakimovich, Tom Izaks, Pascal Freiburghaus, Fred Potter, and Aurélien Hugelé. +Copyright (c) 2020, Drew McCormack, Brad Larson, Eric Skroch, Barry Wark, Dirkjan Krijnders, Rick Maddy, Vijay Kalusani, Caleb Cannon, Jeff Buck, Thomas Elstner, Jeroen Leenarts, Craig Hockenberry, Hartwig Wiesmann, Koen van der Drift, Nino Ag, Mike Lischke, Trevor Harmon, Travis Fischer, Graham Mueller, Rafał Wójcik, Mike Rossetti, Michael Merickel, Lane Roathe, Ingmar Stein, Sean Holbert, Victor Martin Garcia, Jérôme Morissard, Demitri Muna, Tim Monzures, Kirill Yakimovich, Tom Izaks, Pascal Freiburghaus, Fred Potter, and Aurélien Hugelé. All rights reserved. From 39f5c152f3c02ede83e597f044fd6b051120a127 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 16:25:44 -0500 Subject: [PATCH 416/429] Updated the Travis CI configuration to use Xcode 11. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 49aa993ae..1df945ce3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode10 +osx_image: xcode11 ios_env: SDK:iphonesimulator From 1998af66c03cf22b24df031fb20365b9ba3c7b50 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 1 Jan 2020 16:43:28 -0500 Subject: [PATCH 417/429] Fixed documentation typos. --- framework/Source/CPTMutableTextStyle.m | 2 +- framework/Source/CPTTextStyle.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/Source/CPTMutableTextStyle.m b/framework/Source/CPTMutableTextStyle.m index 81c3b211b..50cce383a 100644 --- a/framework/Source/CPTMutableTextStyle.m +++ b/framework/Source/CPTMutableTextStyle.m @@ -8,7 +8,7 @@ @implementation CPTMutableTextStyle /** @property CPTNativeFont* font - * @brief The font. Default is nil. + * @brief The font. Default is @nil. * * Font will override fontName and fontSize if not @nil. **/ diff --git a/framework/Source/CPTTextStyle.m b/framework/Source/CPTTextStyle.m index 42507263b..f1c5c4628 100644 --- a/framework/Source/CPTTextStyle.m +++ b/framework/Source/CPTTextStyle.m @@ -29,7 +29,7 @@ @interface CPTTextStyle() @implementation CPTTextStyle /** @property CPTNativeFont* font - * @brief The font. Default is nil. + * @brief The font. Default is @nil. * * Font will override fontName and fontSize if not @nil. **/ From 885cbc77177b3853f254ce86f9da9bf4c94bd123 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 12:01:38 -0500 Subject: [PATCH 418/429] Moved all compiler warning settings to the .xcconfig file and sorted the config file to make it easier to read. --- framework/CorePlot.xcodeproj/project.pbxproj | 44 ------ framework/xcconfig/CorePlotWarnings.xcconfig | 151 +++++++++++-------- 2 files changed, 85 insertions(+), 110 deletions(-) diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 0ed742d13..74a0407c0 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3337,31 +3337,9 @@ baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CURRENT_PROJECT_VERSION = 2.2; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; }; name = Debug; @@ -3371,30 +3349,8 @@ baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CURRENT_PROJECT_VERSION = 2.2; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; }; name = Release; }; diff --git a/framework/xcconfig/CorePlotWarnings.xcconfig b/framework/xcconfig/CorePlotWarnings.xcconfig index de1eb10af..5e89bbf4c 100644 --- a/framework/xcconfig/CorePlotWarnings.xcconfig +++ b/framework/xcconfig/CorePlotWarnings.xcconfig @@ -1,84 +1,103 @@ -GCC_TREAT_WARNINGS_AS_ERRORS = YES -GCC_WARN_CHECK_SWITCH_STATEMENTS = YES -CLANG_WARN_DOCUMENTATION_COMMENTS = YES -GCC_WARN_SHADOW = YES -GCC_WARN_64_TO_32_BIT_CONVERSION = YES -CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES -GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES -GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES -GCC_WARN_ABOUT_RETURN_TYPE = YES -GCC_WARN_MISSING_PARENTHESES = YES -GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES -GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES -GCC_WARN_ABOUT_MISSING_NEWLINE = YES -GCC_WARN_SIGN_COMPARE = YES -CLANG_WARN_EMPTY_BODY = YES -CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES -GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE -GCC_WARN_UNUSED_FUNCTION = YES -GCC_WARN_UNUSED_LABEL = YES -GCC_WARN_UNUSED_VALUE = YES -GCC_WARN_UNUSED_VARIABLE = YES -CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE -GCC_WARN_UNUSED_PARAMETER = YES -GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES -CLANG_WARN_ASSIGN_ENUM = YES -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES -GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_RECEIVER_WEAK = YES -GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES -GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES -CLANG_WARN_BOOL_CONVERSION = YES -CLANG_WARN_CONSTANT_CONVERSION = YES -CLANG_WARN_ENUM_CONVERSION = YES -CLANG_WARN_INT_CONVERSION = YES -CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES -GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES -GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES -GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES -GCC_WARN_UNKNOWN_PRAGMAS = YES -CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES -CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = NO -GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES -GCC_WARN_STRICT_SELECTOR_MATCH = NO -CLANG_WARN_OBJC_ROOT_CLASS = YES -CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES -GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64] = YES -CLANG_WARN_INFINITE_RECURSION = YES -CLANG_WARN_SUSPICIOUS_MOVE = YES -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES - -ENABLE_STRICT_OBJC_MSGSEND = YES +ASSETCATALOG_WARNINGS = YES CLANG_ANALYZER_DEADCODE_DEADSTORES = YES -CLANG_ANALYZER_MEMORY_MANAGEMENT = YES CLANG_ANALYZER_GCD = YES CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES +CLANG_ANALYZER_MEMORY_MANAGEMENT = YES CLANG_ANALYZER_NONNULL = YES CLANG_ANALYZER_OBJC_ATSYNC = YES +CLANG_ANALYZER_OBJC_COLLECTIONS = YES CLANG_ANALYZER_OBJC_DEALLOC = YES CLANG_ANALYZER_OBJC_GENERICS = YES -CLANG_ANALYZER_OBJC_NSCFERROR = YES CLANG_ANALYZER_OBJC_INCOMP_METHOD_TYPES = YES -CLANG_ANALYZER_OBJC_COLLECTIONS = YES -CLANG_ANALYZER_OBJC_UNUSED_IVARS = YES -CLANG_ANALYZER_OBJC_SELF_INIT = YES +CLANG_ANALYZER_OBJC_NSCFERROR = YES CLANG_ANALYZER_OBJC_RETAIN_COUNT = YES +CLANG_ANALYZER_OBJC_SELF_INIT = YES +CLANG_ANALYZER_OBJC_UNUSED_IVARS = YES CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES -CLANG_ANALYZER_SECURITY_KEYCHAIN_API = YES -CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES +CLANG_ANALYZER_SECURITY_INSECUREAPI_UNCHECKEDRETURN = YES CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES +CLANG_ANALYZER_SECURITY_KEYCHAIN_API = YES + +CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_ASSIGN_ENUM = YES +CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES +CLANG_WARN_BOOL_CONVERSION = YES +CLANG_WARN_COMMA = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES +CLANG_WARN_DOCUMENTATION_COMMENTS = YES +CLANG_WARN_EMPTY_BODY = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_FLOAT_CONVERSION = YES +CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES +CLANG_WARN_INFINITE_RECURSION = YES +CLANG_WARN_INT_CONVERSION = YES +CLANG_WARN_MISSING_NOESCAPE = YES +CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES +CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES +CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES +CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = NO +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +CLANG_WARN_OBJC_INTERFACE_IVARS = YES +CLANG_WARN_OBJC_LITERAL_CONVERSION = YES +CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES +CLANG_WARN_OBJC_RECEIVER_WEAK = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_ROOT_CLASS = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_PRIVATE_MODULE = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CLANG_WARN_RANGE_LOOP_ANALYSIS = YES +CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY =YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES +CLANG_WARN_SUSPICIOUS_MOVE = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE + +ENABLE_STRICT_OBJC_MSGSEND = YES + +GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES +GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES +GCC_TREAT_WARNINGS_AS_ERRORS = YES + +GCC_WARN_64_TO_32_BIT_CONVERSION = YES +GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES +GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES +GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES +GCC_WARN_ABOUT_MISSING_NEWLINE = YES +GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES +GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES +GCC_WARN_CHECK_SWITCH_STATEMENTS = YES +GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES +GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES +GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES +GCC_WARN_MISSING_PARENTHESES = YES +GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO +GCC_WARN_SHADOW = YES +GCC_WARN_SIGN_COMPARE = YES +GCC_WARN_STRICT_SELECTOR_MATCH = NO +GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES +GCC_WARN_UNDECLARED_SELECTOR = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE +GCC_WARN_UNKNOWN_PRAGMAS = YES +GCC_WARN_UNUSED_FUNCTION = YES +GCC_WARN_UNUSED_LABEL = YES +GCC_WARN_UNUSED_PARAMETER = YES +GCC_WARN_UNUSED_VALUE = YES +GCC_WARN_UNUSED_VARIABLE = YES + +IBC_WARNINGS = YES -OTHER_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-padded -Wno-dollar-in-identifier-extension -Wno-custom-atomic-properties -Wno-gnu -Wno-assign-enum -Wno-pedantic -Wno-documentation -Wno-unknown-warning-option -Wno-cstring-format-directive -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-incompatible-pointer-types-discards-qualifiers -Wno-partial-availability -Wno-objc-messaging-id +WARNING_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-custom-atomic-properties -Wno-pedantic -Wno-documentation -Wno-documentation-unknown-command -Wno-partial-availability -Wno-objc-messaging-id From 8d5ff2ed3203d59fc90a66a17bb5740889651a7c Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 12:03:46 -0500 Subject: [PATCH 419/429] Updated all example app projects to rely on the .xcconfig file for all compiler warning settings. --- .../project.pbxproj | 45 +------- .../CPTTestApp-iPad.xcodeproj/project.pbxproj | 47 +------- .../project.pbxproj | 49 +------- .../CPTTestApp.xcodeproj/project.pbxproj | 46 +------- .../Plot_Gallery.xcodeproj/project.pbxproj | 107 +----------------- .../DatePlot.xcodeproj/project.pbxproj | 47 +------- .../DropPlot.xcodeproj/project.pbxproj | 47 +------- .../project.pbxproj | 47 +------- .../RangePlot.xcodeproj/project.pbxproj | 47 +------- 9 files changed, 12 insertions(+), 470 deletions(-) diff --git a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj index 1ce1433bb..e07788d06 100644 --- a/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj +++ b/QCPlugin/CorePlotQCPlugin.xcodeproj/project.pbxproj @@ -434,7 +434,6 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CorePlotQCPlugin_Prefix.pch; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Info.plist"; @@ -478,31 +477,11 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SYMROOT = "$(PROJECT_DIR)/../build"; @@ -515,30 +494,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; OTHER_LDFLAGS = ""; SYMROOT = "$(PROJECT_DIR)/../build"; diff --git a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj index 08fe16ad4..afd032e09 100644 --- a/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPad/CPTTestApp-iPad.xcodeproj/project.pbxproj @@ -404,7 +404,6 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 28ZA45DE7D; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CPTTestApp_iPad_Prefix.pch; HEADER_SEARCH_PATHS = ""; @@ -442,31 +441,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; ONLY_ACTIVE_ARCH = YES; @@ -487,30 +465,9 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + GCC_OPTIMIZATION_LEVEL = s; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; diff --git a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj index 1dc66451a..672347980 100644 --- a/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp-iPhone/CPTTestApp-iPhone.xcodeproj/project.pbxproj @@ -436,7 +436,6 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 28ZA45DE7D; GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CPTTestApp_iPhone_Prefix.pch; HEADER_SEARCH_PATHS = ""; @@ -489,34 +488,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; @@ -538,33 +515,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + GCC_OPTIMIZATION_LEVEL = s; HEADER_SEARCH_PATHS = ""; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks"; diff --git a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj index b92e4d395..a844a7791 100644 --- a/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj +++ b/examples/CPTTestApp/CPTTestApp.xcodeproj/project.pbxproj @@ -497,7 +497,6 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = CPTTestApp_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ""; @@ -538,33 +537,11 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -578,31 +555,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(PROJECT_DIR)/../../build"; diff --git a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj index 3b13aabaa..5fc2950c5 100644 --- a/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj +++ b/examples/CorePlotGallery/Plot_Gallery.xcodeproj/project.pbxproj @@ -1050,7 +1050,6 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_Mac-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; @@ -1077,7 +1076,6 @@ COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = s; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_Mac-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; @@ -1100,34 +1098,12 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-ObjC", @@ -1143,32 +1119,11 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Plot_Gallery_Prefix.pch; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; OTHER_LDFLAGS = ( "-ObjC", "-all_load", @@ -1186,29 +1141,14 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_tvOS-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; @@ -1229,25 +1169,10 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_tvOS-Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; @@ -1268,30 +1193,15 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_iOS-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1311,26 +1221,11 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Plot_Gallery_iOS-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; diff --git a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj index b33640023..21d005158 100644 --- a/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj +++ b/examples/DatePlot/DatePlot.xcodeproj/project.pbxproj @@ -425,11 +425,9 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DatePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; @@ -470,34 +468,12 @@ baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -510,31 +486,10 @@ baseConfigurationReference = C3C3CBBF19EA07F600A0296A /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.9; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; diff --git a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj index 0fea0d692..43c984131 100644 --- a/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj +++ b/examples/DropPlot/DropPlot.xcodeproj/project.pbxproj @@ -447,7 +447,6 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = DropPlot_Prefix.pch; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Info.plist"; @@ -486,33 +485,10 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -525,30 +501,9 @@ baseConfigurationReference = C3D6210E19DF72E000652CE7 /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + GCC_OPTIMIZATION_LEVEL = s; MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; diff --git a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj index 5733a8804..d0e672ef8 100644 --- a/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj +++ b/examples/MinorTickLabels/minorTickFormatter.xcodeproj/project.pbxproj @@ -422,11 +422,9 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = minorTickFormatter_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; @@ -462,34 +460,12 @@ baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -502,31 +478,10 @@ baseConfigurationReference = C37FFB5D19E1ECF0003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; diff --git a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj index 88317ffdc..53802d311 100644 --- a/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj +++ b/examples/RangePlot/RangePlot.xcodeproj/project.pbxproj @@ -422,11 +422,9 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = RangePlot_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "$(SRCROOT)/Base.lproj/Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/../Frameworks"; @@ -462,34 +460,12 @@ baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -502,31 +478,10 @@ baseConfigurationReference = C37FFB6019E1EEB6003F34C5 /* CorePlotWarnings.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ""; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; SYMROOT = "$(SRCROOT)/../../build"; From a1f9ef3963c86643aa4c066d9cf6fdcd392ad804 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 12:04:37 -0500 Subject: [PATCH 420/429] Fixed a new compiler warning in the Plot Gallery example app. --- examples/CorePlotGallery/src/mac/PlotGalleryController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 36ccb4bd0..05452e2a5 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -253,7 +253,7 @@ -(void)setPlotItem:(nullable PlotItem *)item #pragma mark - #pragma mark NSCollectionViewDataSource methods --(NSInteger)numberOfSectionsInCollectionView:(nonnull NSCollectionView *)collectionView; +-(NSInteger)numberOfSectionsInCollectionView:(nonnull NSCollectionView *)collectionView { return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } From b8c154fe8f0dceb9a2f4c571fc969206a9f8df9a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 13:32:47 -0500 Subject: [PATCH 421/429] Turned on the unused parameter warning and fixed all resulting compiler warnings. --- QCPlugin/CPTBarPlotPlugin.m | 2 +- QCPlugin/CPTPieChartPlugin.m | 4 +- QCPlugin/CorePlotQCPlugin.m | 17 +++-- .../Classes/CPTTestApp_iPadAppDelegate.m | 2 +- .../Classes/CPTTestApp_iPadViewController.m | 4 +- .../Source/CPTPlotSymbolTestController.m | 2 +- examples/CPTTestApp/Source/Controller.m | 22 +++--- examples/CPTTestApp/Source/RotationView.m | 2 +- .../Source/SelectionDemoController.m | 2 +- .../CorePlotGallery/src/ios/AppDelegate.m | 4 +- .../src/ios/RootViewController.m | 8 +-- .../src/ios/ThemeTableViewController.m | 6 +- .../src/mac/PlotGalleryController.m | 18 ++--- examples/CorePlotGallery/src/mac/PlotView.m | 2 +- .../src/mac/Plot_Gallery_MacAppDelegate.m | 4 +- examples/CorePlotGallery/src/plots/AxisDemo.m | 2 +- .../src/plots/CandlestickPlot.m | 6 +- .../src/plots/ColoredBarChart.m | 12 ++-- .../CorePlotGallery/src/plots/CompositePlot.m | 4 +- .../CorePlotGallery/src/plots/ControlChart.m | 2 +- .../src/plots/CurvedInterpolationDemo.m | 4 +- .../src/plots/CurvedScatterPlot.m | 6 +- examples/CorePlotGallery/src/plots/DatePlot.m | 14 ++-- .../CorePlotGallery/src/plots/DonutChart.m | 8 +-- .../CorePlotGallery/src/plots/FunctionPlot.m | 4 +- .../src/plots/GradientScatterPlot.m | 12 ++-- .../CorePlotGallery/src/plots/ImageDemo.m | 2 +- .../src/plots/LabelingPolicyDemo.m | 2 +- .../CorePlotGallery/src/plots/LineCapDemo.m | 2 +- examples/CorePlotGallery/src/plots/OHLCPlot.m | 4 +- .../CorePlotGallery/src/plots/PlotSpaceDemo.m | 2 +- .../CorePlotGallery/src/plots/RangePlot.m | 10 +-- .../CorePlotGallery/src/plots/RealTimePlot.m | 6 +- .../src/plots/SimplePieChart.m | 14 ++-- .../src/plots/SimpleScatterPlot.m | 12 ++-- .../src/plots/SteppedScatterPlot.m | 6 +- .../src/plots/VerticalBarChart.m | 4 +- .../CorePlotGallery/src/shared/PlotGallery.m | 2 +- .../CorePlotGallery/src/shared/PlotItem.m | 4 +- .../CorePlotGallery/src/tvOS/AppDelegateTV.m | 2 +- .../src/tvOS/RootViewControllerTV.m | 8 +-- .../src/tvOS/ThemeTableViewControllerTV.m | 6 +- examples/DropPlot/CPTPlotDocument.m | 20 +++--- examples/MinorTickLabels/Controller.m | 4 +- examples/RangePlot/Controller.m | 6 +- framework/MacOnly/CPTGraphHostingView.m | 6 +- framework/Source/CPTAnimationPeriod.m | 6 +- framework/Source/CPTAxis.m | 8 +-- framework/Source/CPTAxisLabelGroup.m | 2 +- framework/Source/CPTAxisLabelTests.m | 7 +- framework/Source/CPTConstraints.m | 6 +- framework/Source/CPTDataSourceTestCase.m | 2 +- framework/Source/CPTFill.m | 10 +-- framework/Source/CPTFunctionDataSource.m | 68 ++++++++++--------- framework/Source/CPTGradient.m | 2 +- framework/Source/CPTLayer.m | 12 ++-- framework/Source/CPTLegend.m | 4 +- framework/Source/CPTLineCap.m | 2 +- framework/Source/CPTLineStyle.m | 2 +- framework/Source/CPTPlot.m | 16 ++--- framework/Source/CPTPlotGroup.m | 2 +- framework/Source/CPTPlotSpace.m | 32 ++++----- framework/Source/CPTRangePlot.m | 8 +-- framework/Source/CPTScatterPlot.m | 2 +- framework/Source/CPTTextLayer.m | 2 +- framework/Source/CPTTheme.m | 6 +- framework/Source/NSCoderExtensions.m | 10 +++ framework/iPhoneOnly/CPTGraphHostingView.m | 4 +- framework/xcconfig/CorePlotWarnings.xcconfig | 2 +- 69 files changed, 266 insertions(+), 244 deletions(-) diff --git a/QCPlugin/CPTBarPlotPlugin.m b/QCPlugin/CPTBarPlotPlugin.m index d92cb84f0..77d6fc9fc 100644 --- a/QCPlugin/CPTBarPlotPlugin.m +++ b/QCPlugin/CPTBarPlotPlugin.m @@ -199,7 +199,7 @@ -(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot return [[self valueForInputKey:key] count]; } --(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange +-(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange __unused)indexRange { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; diff --git a/QCPlugin/CPTPieChartPlugin.m b/QCPlugin/CPTPieChartPlugin.m index 6466a2e8d..99aeb2ede 100644 --- a/QCPlugin/CPTPieChartPlugin.m +++ b/QCPlugin/CPTPieChartPlugin.m @@ -224,7 +224,7 @@ -(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot return [[self valueForInputKey:key] count]; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger __unused)fieldEnum recordIndex:(NSUInteger)index { NSUInteger plotIndex = [[self.graph allPlots] indexOfObject:plot]; NSString *key = [NSString stringWithFormat:@"plotNumbers%lu", (unsigned long)plotIndex]; @@ -239,7 +239,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum } } --(nullable CPTFill *)sliceFillForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(nullable CPTFill *)sliceFillForPieChart:(nonnull CPTPieChart *__unused)pieChart recordIndex:(NSUInteger)index { CGColorRef plotFillColor = [CPTPieChart defaultPieSliceColorForIndex:index].cgColor; CGColorRef inputFillColor = (CGColorRef)[self areaFillColor:0]; diff --git a/QCPlugin/CorePlotQCPlugin.m b/QCPlugin/CorePlotQCPlugin.m index eee35da9a..3aa3ef332 100644 --- a/QCPlugin/CorePlotQCPlugin.m +++ b/QCPlugin/CorePlotQCPlugin.m @@ -547,6 +547,9 @@ -(nullable CGImageRef)newAreaFillImage:(NSUInteger)index NSUInteger bytesPerRow = [img bufferBytesPerRow]; CGColorSpaceRef colorSpace = [img bufferColorSpace]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers" + CGContextRef imgContext = CGBitmapContextCreate(baseAddress, pixelsWide, pixelsHigh, @@ -555,6 +558,8 @@ -(nullable CGImageRef)newAreaFillImage:(NSUInteger)index colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast); +#pragma clang diagnostic pop + CGImageRef imageRef = CGBitmapContextCreateImage(imgContext); [img unlockBufferRepresentation]; @@ -564,7 +569,7 @@ -(nullable CGImageRef)newAreaFillImage:(NSUInteger)index return imageRef; } -static void _BufferReleaseCallback(const void *__nonnull address, void *__nonnull context) +static void _BufferReleaseCallback(const void *__nonnull __unused address, void *__nonnull __unused context) { // Don't do anything. We release the buffer manually when it's recreated or during dealloc } @@ -640,12 +645,12 @@ -(void)createImageResourcesWithContext:(nonnull id)context #pragma mark - #pragma mark Data source methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return 0; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger __unused)fieldEnum recordIndex:(NSUInteger __unused)index { return @0; } @@ -721,14 +726,14 @@ -(void)setBitmapContext:(nullable CGContextRef)newContext #pragma mark - #pragma mark Subclass methods --(void)addPlotWithIndex:(NSUInteger)index +-(void)addPlotWithIndex:(NSUInteger __unused)index { /* * Subclasses should override this method to create their own ports, plots, and add the plots to the graph */ } --(void)removePlots:(NSUInteger)count +-(void)removePlots:(NSUInteger __unused)count { /* * Subclasses should override this method to remove plots and their ports @@ -796,7 +801,7 @@ -(BOOL)configureGraph @implementation CorePlotQCPlugIn(Execution) --(BOOL)execute:(nonnull id)context atTime:(NSTimeInterval)time withArguments:(nullable CPTDictionary *)arguments +-(BOOL)execute:(nonnull id)context atTime:(NSTimeInterval __unused)time withArguments:(nullable CPTDictionary *__unused)arguments { // Configure the plot for drawing BOOL configurationCheck = [self configureGraph]; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m index 0cec7634b..b3c3e65b8 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadAppDelegate.m @@ -13,7 +13,7 @@ @implementation CPTTestApp_iPadAppDelegate @synthesize window; @synthesize viewController; --(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOptions:(nullable CPTDictionary *)launchOptions +-(BOOL)application:(nonnull UIApplication *__unused)application didFinishLaunchingWithOptions:(nullable CPTDictionary *__unused)launchOptions { self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; diff --git a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m index 330f0041a..4312843d4 100644 --- a/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m +++ b/examples/CPTTestApp-iPad/Classes/CPTTestApp_iPadViewController.m @@ -70,7 +70,7 @@ -(void)viewDidAppear:(BOOL)animated self.piePlotIsRotating = YES; } --(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag +-(void)animationDidStop:(CAAnimation *__unused)theAnimation finished:(BOOL __unused)flag { self.piePlotIsRotating = NO; [self.piePlot performSelector:@selector(reloadData) withObject:nil afterDelay:0.4]; @@ -320,7 +320,7 @@ -(void)constructPieChart #pragma mark - #pragma mark CPTBarPlot delegate method --(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *__unused)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"barWasSelectedAtRecordIndex %lu", (unsigned long)index); } diff --git a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m index 2726d76ae..8cf7d0aee 100644 --- a/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m +++ b/examples/CPTTestApp/Source/CPTPlotSymbolTestController.m @@ -67,7 +67,7 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return 10; } diff --git a/examples/CPTTestApp/Source/Controller.m b/examples/CPTTestApp/Source/Controller.m index deb4cb3b2..9f1d5439a 100644 --- a/examples/CPTTestApp/Source/Controller.m +++ b/examples/CPTTestApp/Source/Controller.m @@ -395,14 +395,14 @@ -(void)setupBarPlots #pragma mark - #pragma mark Actions --(IBAction)reloadDataSourcePlot:(nullable id)sender +-(IBAction)reloadDataSourcePlot:(nullable id __unused)sender { CPTPlot *plot = [self.graph plotWithIdentifier:dataSourcePlot]; [plot reloadData]; } --(IBAction)removeData:(nullable id)sender +-(IBAction)removeData:(nullable id __unused)sender { NSUInteger index = self.selectionIndex; @@ -414,7 +414,7 @@ -(IBAction)removeData:(nullable id)sender } } --(IBAction)insertData:(nullable id)sender +-(IBAction)insertData:(nullable id __unused)sender { NSUInteger index = self.selectionIndex; @@ -479,7 +479,7 @@ -(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUI #pragma mark - #pragma mark CPTScatterPlot delegate method --(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *__unused)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -590,7 +590,7 @@ -(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUIntege #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *__unused)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; @@ -604,7 +604,7 @@ -(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea #pragma mark - #pragma mark PDF / image export --(IBAction)exportToPDF:(nullable id)sender +-(IBAction)exportToPDF:(nullable id __unused)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; @@ -620,7 +620,7 @@ -(IBAction)exportToPDF:(nullable id)sender } } --(IBAction)exportToPNG:(nullable id)sender +-(IBAction)exportToPNG:(nullable id __unused)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; @@ -642,7 +642,7 @@ -(IBAction)exportToPNG:(nullable id)sender #pragma mark - #pragma mark Printing --(IBAction)printDocument:(nullable id)sender +-(IBAction)printDocument:(nullable id __unused)sender { NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo]; @@ -664,7 +664,7 @@ -(IBAction)printDocument:(nullable id)sender } } --(void)printOperationDidRun:(nonnull NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(nullable void *)contextInfo +-(void)printOperationDidRun:(nonnull NSPrintOperation *__unused)printOperation success:(BOOL __unused)success contextInfo:(nullable void *__unused)contextInfo { // print delegate } @@ -672,7 +672,7 @@ -(void)printOperationDidRun:(nonnull NSPrintOperation *)printOperation success:( #pragma mark - #pragma mark Layer exploding for illustration --(IBAction)explodeLayers:(nullable id)sender +-(IBAction)explodeLayers:(nullable id __unused)sender { CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0); @@ -711,7 +711,7 @@ +(void)recursivelySplitSublayersInZForLayer:(nonnull CALayer *)layer depthLevel: } } --(IBAction)reassembleLayers:(nullable id)sender +-(IBAction)reassembleLayers:(nullable id __unused)sender { [CATransaction begin]; [CATransaction setValue:@1.0f forKey:kCATransactionAnimationDuration]; diff --git a/examples/CPTTestApp/Source/RotationView.m b/examples/CPTTestApp/Source/RotationView.m index 99ba9673a..68b892fab 100644 --- a/examples/CPTTestApp/Source/RotationView.m +++ b/examples/CPTTestApp/Source/RotationView.m @@ -30,7 +30,7 @@ -(nonnull instancetype)initWithFrame:(NSRect)frame #pragma mark - #pragma mark Mouse handling methods --(BOOL)acceptsFirstMouse:(nullable NSEvent *)theEvent +-(BOOL)acceptsFirstMouse:(nullable NSEvent *__unused)theEvent { return YES; } diff --git a/examples/CPTTestApp/Source/SelectionDemoController.m b/examples/CPTTestApp/Source/SelectionDemoController.m index ec8b5f382..bcf2fdde1 100644 --- a/examples/CPTTestApp/Source/SelectionDemoController.m +++ b/examples/CPTTestApp/Source/SelectionDemoController.m @@ -282,7 +282,7 @@ -(nullable CPTPlotSymbol *)symbolForScatterPlot:(nonnull CPTScatterPlot *)plot r #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *__unused)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { self.selectedIndex = index; } diff --git a/examples/CorePlotGallery/src/ios/AppDelegate.m b/examples/CorePlotGallery/src/ios/AppDelegate.m index bfa738075..e3bafe91b 100644 --- a/examples/CorePlotGallery/src/ios/AppDelegate.m +++ b/examples/CorePlotGallery/src/ios/AppDelegate.m @@ -18,7 +18,7 @@ @implementation AppDelegate @synthesize window; --(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOptions:(nullable CPTDictionary *)launchOptions +-(BOOL)application:(nonnull UIApplication *__unused)application didFinishLaunchingWithOptions:(nullable CPTDictionary *__unused)launchOptions { [[PlotGallery sharedPlotGallery] sortByTitle]; @@ -33,7 +33,7 @@ -(BOOL)application:(nonnull UIApplication *)application didFinishLaunchingWithOp #pragma mark - Split view --(BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController +-(BOOL)splitViewController:(UISplitViewController *__unused)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *__unused)primaryViewController { if ( [secondaryViewController isKindOfClass:[UINavigationController class]] && [((UINavigationController *)secondaryViewController).topViewController isKindOfClass:[DetailViewController class]] && (((DetailViewController *)((UINavigationController *)secondaryViewController).topViewController).detailItem == nil)) { // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. diff --git a/examples/CorePlotGallery/src/ios/RootViewController.m b/examples/CorePlotGallery/src/ios/RootViewController.m index 5c0624442..9d81892b5 100644 --- a/examples/CorePlotGallery/src/ios/RootViewController.m +++ b/examples/CorePlotGallery/src/ios/RootViewController.m @@ -47,7 +47,7 @@ -(void)dealloc #pragma mark - #pragma mark Segues --(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id)sender +-(void)prepareForSegue:(nonnull UIStoryboardSegue *)segue sender:(nullable id __unused)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { DetailViewController *controller = (DetailViewController *)((UINavigationController *)segue.destinationViewController).topViewController; @@ -83,12 +83,12 @@ -(void)themeChanged:(nonnull NSNotification *)notification #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tv +-(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *__unused)tv { return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } --(NSInteger)tableView:(nonnull UITableView *)tv numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(nonnull UITableView *__unused)tv numberOfRowsInSection:(NSInteger)section { return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; } @@ -112,7 +112,7 @@ -(nonnull UITableViewCell *)tableView:(nonnull UITableView *)tv cellForRowAtInde return cell; } --(nullable NSString *)tableView:(nonnull UITableView *)tableView titleForHeaderInSection:(NSInteger)section +-(nullable NSString *)tableView:(nonnull UITableView *__unused)tableView titleForHeaderInSection:(NSInteger)section { return [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)section]; } diff --git a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m index 9854a26f8..a705f18cf 100644 --- a/examples/CorePlotGallery/src/ios/ThemeTableViewController.m +++ b/examples/CorePlotGallery/src/ios/ThemeTableViewController.m @@ -58,12 +58,12 @@ -(nonnull instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle: #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *)tableView +-(NSInteger)numberOfSectionsInTableView:(nonnull UITableView *__unused)tableView { return 1; } --(NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(nonnull UITableView *__unused)tableView numberOfRowsInSection:(NSInteger __unused)section { return (NSInteger)self.themes.count; } @@ -86,7 +86,7 @@ -(nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRo #pragma mark - #pragma mark Table view delegate --(void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath +-(void)tableView:(nonnull UITableView *__unused)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath { NSDictionary *themeInfo = @{ PlotGalleryThemeNameKey: self.themes[(NSUInteger)indexPath.row] diff --git a/examples/CorePlotGallery/src/mac/PlotGalleryController.m b/examples/CorePlotGallery/src/mac/PlotGalleryController.m index 05452e2a5..be4239e94 100644 --- a/examples/CorePlotGallery/src/mac/PlotGalleryController.m +++ b/examples/CorePlotGallery/src/mac/PlotGalleryController.m @@ -195,7 +195,7 @@ -(void)exportTVImageWithSize:(CGSize)size toURL:(NSURL *)url showPlots:(BOOL)sho } } --(IBAction)exportTVImagesToPNG:(id)sender +-(IBAction)exportTVImagesToPNG:(id __unused)sender { NSOpenPanel *pngSavingDialog = [NSOpenPanel openPanel]; @@ -253,12 +253,12 @@ -(void)setPlotItem:(nullable PlotItem *)item #pragma mark - #pragma mark NSCollectionViewDataSource methods --(NSInteger)numberOfSectionsInCollectionView:(nonnull NSCollectionView *)collectionView +-(NSInteger)numberOfSectionsInCollectionView:(nonnull NSCollectionView *__unused)collectionView { return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } --(NSInteger)collectionView:(nonnull NSCollectionView *)collectionView +-(NSInteger)collectionView:(nonnull NSCollectionView *__unused)collectionView numberOfItemsInSection:(NSInteger)section { return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; @@ -313,7 +313,7 @@ -(nonnull NSView *) collectionView:(nonnull NSCollectionView *)collectionView #pragma mark - #pragma mark NSCollectionViewDelegate methods --(void) collectionView:(nonnull NSCollectionView *)collectionView +-(void) collectionView:(nonnull NSCollectionView *__unused)collectionView didSelectItemsAtIndexPaths:(nonnull NSSet *)indexPaths { NSUInteger section = NSNotFound; @@ -333,22 +333,22 @@ -(void) collectionView:(nonnull NSCollectionView *)collectionView #pragma mark - #pragma mark NSSplitViewDelegate methods --(CGFloat) splitView:(nonnull NSSplitView *)sv +-(CGFloat) splitView:(nonnull NSSplitView *__unused)sv constrainMinCoordinate:(CGFloat)coord - ofSubviewAt:(NSInteger)index + ofSubviewAt:(NSInteger __unused)index { return coord + CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } --(CGFloat) splitView:(nonnull NSSplitView *)sv +-(CGFloat) splitView:(nonnull NSSplitView *__unused)sv constrainMaxCoordinate:(CGFloat)coord - ofSubviewAt:(NSInteger)index + ofSubviewAt:(NSInteger __unused)index { return coord - CPT_SPLIT_VIEW_MIN_LHS_WIDTH; } -(void) splitView:(nonnull NSSplitView *)sender - resizeSubviewsWithOldSize:(NSSize)oldSize + resizeSubviewsWithOldSize:(NSSize __unused)oldSize { // Lock the LHS width NSRect frame = sender.frame; diff --git a/examples/CorePlotGallery/src/mac/PlotView.m b/examples/CorePlotGallery/src/mac/PlotView.m index 4fe50f63e..b769c4a9e 100644 --- a/examples/CorePlotGallery/src/mac/PlotView.m +++ b/examples/CorePlotGallery/src/mac/PlotView.m @@ -17,7 +17,7 @@ -(nonnull instancetype)initWithFrame:(NSRect)frame return self; } --(void)drawRect:(NSRect)dirtyRect +-(void)drawRect:(NSRect __unused)dirtyRect { } diff --git a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m index 3a5f91189..b5c8479b6 100644 --- a/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m +++ b/examples/CorePlotGallery/src/mac/Plot_Gallery_MacAppDelegate.m @@ -9,11 +9,11 @@ @implementation Plot_Gallery_MacAppDelegate @synthesize window; --(void)applicationDidFinishLaunching:(nonnull NSNotification *)aNotification +-(void)applicationDidFinishLaunching:(nonnull NSNotification *__unused)aNotification { } --(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *__unused)sender { return YES; } diff --git a/examples/CorePlotGallery/src/plots/AxisDemo.m b/examples/CorePlotGallery/src/plots/AxisDemo.m index 7fb29e512..07730cda7 100644 --- a/examples/CorePlotGallery/src/plots/AxisDemo.m +++ b/examples/CorePlotGallery/src/plots/AxisDemo.m @@ -22,7 +22,7 @@ -(nonnull instancetype)init return self; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/CandlestickPlot.m b/examples/CorePlotGallery/src/plots/CandlestickPlot.m index 6eff04149..961ddc972 100644 --- a/examples/CorePlotGallery/src/plots/CandlestickPlot.m +++ b/examples/CorePlotGallery/src/plots/CandlestickPlot.m @@ -62,7 +62,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -186,7 +186,7 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } @@ -215,7 +215,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum return num; } --(nullable NSNumber *)barWidthForTradingRangePlot:(nonnull CPTTradingRangePlot *)plot recordIndex:(NSUInteger)idx +-(nullable NSNumber *)barWidthForTradingRangePlot:(nonnull CPTTradingRangePlot *__unused)plot recordIndex:(NSUInteger __unused)idx { return @(arc4random_uniform(85) + 15); } diff --git a/examples/CorePlotGallery/src/plots/ColoredBarChart.m b/examples/CorePlotGallery/src/plots/ColoredBarChart.m index 2e01e446d..e2a607c84 100644 --- a/examples/CorePlotGallery/src/plots/ColoredBarChart.m +++ b/examples/CorePlotGallery/src/plots/ColoredBarChart.m @@ -36,7 +36,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -140,12 +140,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange +-(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndexRange:(NSRange)indexRange { CPTNumberArray *nums = nil; @@ -168,7 +168,7 @@ -(nullable NSArray *)numbersForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fi return nums; } --(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)index +-(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *__unused)barPlot recordIndex:(NSUInteger)index { CPTColor *color = nil; @@ -215,12 +215,12 @@ -(nullable CPTFill *)barFillForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex return [CPTFill fillWithGradient:fillGradient]; } --(nullable NSNumber *)barWidthForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)idx +-(nullable NSNumber *)barWidthForBarPlot:(nonnull CPTBarPlot *__unused)barPlot recordIndex:(NSUInteger __unused)idx { return @((double)(arc4random_uniform(50) + 25) / 100.0); } --(nullable NSString *)legendTitleForBarPlot:(nonnull CPTBarPlot *)barPlot recordIndex:(NSUInteger)index +-(nullable NSString *)legendTitleForBarPlot:(nonnull CPTBarPlot *__unused)barPlot recordIndex:(NSUInteger)index { return [NSString stringWithFormat:@"Bar %lu", (unsigned long)(index + 1)]; } diff --git a/examples/CorePlotGallery/src/plots/CompositePlot.m b/examples/CorePlotGallery/src/plots/CompositePlot.m index 7fe8a0442..9a3c140b8 100644 --- a/examples/CorePlotGallery/src/plots/CompositePlot.m +++ b/examples/CorePlotGallery/src/plots/CompositePlot.m @@ -80,7 +80,7 @@ -(void)setFrameSize:(NSSize)newSize #endif --(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInView:(nonnull PlotGalleryNativeView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { [self killGraph]; @@ -437,7 +437,7 @@ -(void)renderPieChartInHostingView:(nonnull CPTGraphHostingView *)hostingView wi #pragma mark - #pragma mark CPTBarPlot delegate --(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)index +-(void)barPlot:(nonnull CPTBarPlot *__unused)plot barWasSelectedAtRecordIndex:(NSUInteger)index { NSLog(@"barWasSelectedAtRecordIndex %d", (int)index); } diff --git a/examples/CorePlotGallery/src/plots/ControlChart.m b/examples/CorePlotGallery/src/plots/ControlChart.m index 73e78030e..cc8682410 100644 --- a/examples/CorePlotGallery/src/plots/ControlChart.m +++ b/examples/CorePlotGallery/src/plots/ControlChart.m @@ -63,7 +63,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m index 782d61fcf..d5e6f20e9 100644 --- a/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m +++ b/examples/CorePlotGallery/src/plots/CurvedInterpolationDemo.m @@ -69,7 +69,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -249,7 +249,7 @@ -(void)renderInGraphHostingView:(CPTGraphHostingView *)hostingView withTheme:(CP #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *__unused)plot { return self.plotData.count; } diff --git a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m index 826a68dd1..27e300d0f 100644 --- a/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/CurvedScatterPlot.m @@ -129,7 +129,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -365,7 +365,7 @@ -(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlot #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *__unused)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTXYGraph *graph = (self.graphs)[0]; @@ -435,7 +435,7 @@ -(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *__unused)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; diff --git a/examples/CorePlotGallery/src/plots/DatePlot.m b/examples/CorePlotGallery/src/plots/DatePlot.m index 8e22b5a25..3bc85e487 100644 --- a/examples/CorePlotGallery/src/plots/DatePlot.m +++ b/examples/CorePlotGallery/src/plots/DatePlot.m @@ -63,7 +63,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -181,12 +181,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } @@ -194,12 +194,12 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum #pragma mark - #pragma mark Plot Space Delegate Methods --(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement +-(CGPoint)plotSpace:(CPTPlotSpace *__unused)space willDisplaceBy:(CGPoint __unused)displacement { return CPTPointMake(0.0, 0.0); } --(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *__unused)newRange forCoordinate:(CPTCoordinate)coordinate { CPTPlotRange *updatedRange = nil; @@ -221,7 +221,7 @@ -(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotR return updatedRange; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint __unused)point { CPTXYPlotSpace *xySpace = (CPTXYPlotSpace *)space; @@ -269,7 +269,7 @@ -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(C return [self plotSpace:space shouldHandlePointingDeviceDownEvent:event atPoint:point]; } --(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(CPTPlotSpace *__unused)space shouldHandlePointingDeviceUpEvent:(CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)point { return NO; } diff --git a/examples/CorePlotGallery/src/plots/DonutChart.m b/examples/CorePlotGallery/src/plots/DonutChart.m index 82eb54fa6..a56ec42fb 100644 --- a/examples/CorePlotGallery/src/plots/DonutChart.m +++ b/examples/CorePlotGallery/src/plots/DonutChart.m @@ -121,12 +121,12 @@ -(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUIn #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -195,12 +195,12 @@ -(void)animationCancelled:(nonnull CPTAnimationOperation *)operation NSLog(@"animationCancelled: %@", operation); } --(void)animationWillUpdate:(nonnull CPTAnimationOperation *)operation +-(void)animationWillUpdate:(nonnull CPTAnimationOperation *__unused)operation { NSLog(@"animationWillUpdate:"); } --(void)animationDidUpdate:(nonnull CPTAnimationOperation *)operation +-(void)animationDidUpdate:(nonnull CPTAnimationOperation *__unused)operation { NSLog(@"animationDidUpdate:"); } diff --git a/examples/CorePlotGallery/src/plots/FunctionPlot.m b/examples/CorePlotGallery/src/plots/FunctionPlot.m index 398fad0e3..839ca3d52 100644 --- a/examples/CorePlotGallery/src/plots/FunctionPlot.m +++ b/examples/CorePlotGallery/src/plots/FunctionPlot.m @@ -44,7 +44,7 @@ -(void)killGraph [super killGraph]; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -241,7 +241,7 @@ -(nullable NSFont *)italicFontForFont:(nonnull NSFont *)oldFont #pragma mark - Legend delegate --(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx +-(void)legend:(nonnull CPTLegend *__unused)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger __unused)idx { plot.hidden = !plot.hidden; } diff --git a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m index 4079575f8..db1004011 100644 --- a/examples/CorePlotGallery/src/plots/GradientScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/GradientScatterPlot.m @@ -61,7 +61,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -190,12 +190,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; @@ -206,7 +206,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum #pragma mark - #pragma mark Plot Space Delegate Methods --(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *__unused)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { @@ -222,7 +222,7 @@ -(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlot #pragma mark - #pragma mark CPTScatterPlot delegate method --(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *__unused)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTGraph *graph = (self.graphs)[0]; @@ -268,7 +268,7 @@ -(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordI #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *__unused)plotArea { // Remove the annotation CPTPlotSpaceAnnotation *annotation = self.symbolTextAnnotation; diff --git a/examples/CorePlotGallery/src/plots/ImageDemo.m b/examples/CorePlotGallery/src/plots/ImageDemo.m index 8af09fdb1..df304a094 100644 --- a/examples/CorePlotGallery/src/plots/ImageDemo.m +++ b/examples/CorePlotGallery/src/plots/ImageDemo.m @@ -22,7 +22,7 @@ -(nonnull instancetype)init return self; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m index 9a6d196f4..5be94fe80 100644 --- a/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m +++ b/examples/CorePlotGallery/src/plots/LabelingPolicyDemo.m @@ -22,7 +22,7 @@ -(nonnull instancetype)init return self; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { const CGFloat majorTickLength = 12.0; const CGFloat minorTickLength = 8.0; diff --git a/examples/CorePlotGallery/src/plots/LineCapDemo.m b/examples/CorePlotGallery/src/plots/LineCapDemo.m index de339da6d..c5b5eb68f 100644 --- a/examples/CorePlotGallery/src/plots/LineCapDemo.m +++ b/examples/CorePlotGallery/src/plots/LineCapDemo.m @@ -22,7 +22,7 @@ -(nonnull instancetype)init return self; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; diff --git a/examples/CorePlotGallery/src/plots/OHLCPlot.m b/examples/CorePlotGallery/src/plots/OHLCPlot.m index b4f7e1163..7761c4069 100644 --- a/examples/CorePlotGallery/src/plots/OHLCPlot.m +++ b/examples/CorePlotGallery/src/plots/OHLCPlot.m @@ -62,7 +62,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -181,7 +181,7 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } diff --git a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m index 90dae3e42..c192afd12 100644 --- a/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m +++ b/examples/CorePlotGallery/src/plots/PlotSpaceDemo.m @@ -22,7 +22,7 @@ -(nonnull instancetype)init return self; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { const CGFloat majorTickLength = 12.0; const CGFloat minorTickLength = 8.0; diff --git a/examples/CorePlotGallery/src/plots/RangePlot.m b/examples/CorePlotGallery/src/plots/RangePlot.m index 0612971ca..779a94ee0 100644 --- a/examples/CorePlotGallery/src/plots/RangePlot.m +++ b/examples/CorePlotGallery/src/plots/RangePlot.m @@ -68,7 +68,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { // If you make sure your dates are calculated at noon, you shouldn't have to // worry about daylight savings. If you use midnight, you will have to adjust @@ -178,12 +178,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } @@ -191,7 +191,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum #pragma mark - #pragma mark Plot Space Delegate Methods --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)point { CPTRangePlot *rangePlot = (CPTRangePlot *)[self.graph plotWithIdentifier:@"Range Plot"]; @@ -210,7 +210,7 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent return NO; } --(nullable NSNumber *)barWidthForRangePlot:(nonnull CPTRangePlot *)plot recordIndex:(NSUInteger)idx +-(nullable NSNumber *)barWidthForRangePlot:(nonnull CPTRangePlot *__unused)plot recordIndex:(NSUInteger __unused)idx { return @(arc4random_uniform(85) + 15); } diff --git a/examples/CorePlotGallery/src/plots/RealTimePlot.m b/examples/CorePlotGallery/src/plots/RealTimePlot.m index 86e9112ea..053fdda2b 100644 --- a/examples/CorePlotGallery/src/plots/RealTimePlot.m +++ b/examples/CorePlotGallery/src/plots/RealTimePlot.m @@ -158,7 +158,7 @@ -(void)dealloc #pragma mark - #pragma mark Timer callback --(void)newData:(nonnull NSTimer *)theTimer +-(void)newData:(nonnull NSTimer *__unused)theTimer { CPTGraph *theGraph = (self.graphs)[0]; CPTPlot *thePlot = [theGraph plotWithIdentifier:kPlotIdentifier]; @@ -192,12 +192,12 @@ -(void)newData:(nonnull NSTimer *)theTimer #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num = nil; diff --git a/examples/CorePlotGallery/src/plots/SimplePieChart.m b/examples/CorePlotGallery/src/plots/SimplePieChart.m index 65a795855..76e5c79ac 100644 --- a/examples/CorePlotGallery/src/plots/SimplePieChart.m +++ b/examples/CorePlotGallery/src/plots/SimplePieChart.m @@ -43,7 +43,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -105,7 +105,7 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT graph.legendDisplacement = CGPointMake(-graph.paddingRight - CPTFloat(10.0), 0.0); } --(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *)plot recordIndex:(NSUInteger)index +-(nullable CPTLayer *)dataLabelForPlot:(nonnull CPTPlot *__unused)plot recordIndex:(NSUInteger)index { static CPTMutableTextStyle *whiteText = nil; static dispatch_once_t onceToken = 0; @@ -150,7 +150,7 @@ -(void)pieChart:(nonnull CPTPieChart *)plot sliceWasSelectedAtRecordIndex:(NSUIn #pragma mark - #pragma mark CPTLegendDelegate Methods --(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx +-(void)legend:(nonnull CPTLegend *__unused)legend legendEntryForPlot:(nonnull CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx { NSLog(@"Legend entry for '%@' was selected at index %lu.", plot.identifier, (unsigned long)idx); @@ -168,12 +168,12 @@ -(void)legend:(nonnull CPTLegend *)legend legendEntryForPlot:(nonnull CPTPlot *) #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSNumber *num; @@ -187,7 +187,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum return num; } --(NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *__unused)pieChart recordIndex:(NSUInteger)index { CPTNativeColor *sliceColor = [CPTPieChart defaultPieSliceColorForIndex:index].nativeColor; CPTNativeFont *labelFont = [CPTNativeFont fontWithName:@"Helvetica" @@ -206,7 +206,7 @@ -(NSAttributedString *)attributedLegendTitleForPieChart:(nonnull CPTPieChart *)p return title; } --(CGFloat)radialOffsetForPieChart:(nonnull CPTPieChart *)pieChart recordIndex:(NSUInteger)index +-(CGFloat)radialOffsetForPieChart:(nonnull CPTPieChart *__unused)pieChart recordIndex:(NSUInteger)index { return index == self.offsetIndex ? self.sliceOffset : 0.0; } diff --git a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m index cb603ccf0..4a321efc4 100644 --- a/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SimpleScatterPlot.m @@ -65,7 +65,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -184,12 +184,12 @@ -(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withT #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; @@ -200,7 +200,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum #pragma mark - #pragma mark Plot Space Delegate Methods --(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *__unused)space willChangePlotRangeTo:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate { // Impose a limit on how far user can scroll in x if ( coordinate == CPTCoordinateX ) { @@ -217,7 +217,7 @@ -(nullable CPTPlotRange *)plotSpace:(nonnull CPTPlotSpace *)space willChangePlot #pragma mark - #pragma mark CPTScatterPlot delegate methods --(void)scatterPlot:(nonnull CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index +-(void)scatterPlot:(nonnull CPTScatterPlot *__unused)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index { CPTXYGraph *graph = (self.graphs)[0]; @@ -278,7 +278,7 @@ -(void)scatterPlotDataLineTouchUp:(nonnull CPTScatterPlot *)plot #pragma mark - #pragma mark Plot area delegate method --(void)plotAreaWasSelected:(nonnull CPTPlotArea *)plotArea +-(void)plotAreaWasSelected:(nonnull CPTPlotArea *__unused)plotArea { CPTXYGraph *graph = (self.graphs)[0]; diff --git a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m index b6f9e8008..861e3a1b7 100644 --- a/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m +++ b/examples/CorePlotGallery/src/plots/SteppedScatterPlot.m @@ -44,7 +44,7 @@ -(void)generateData } } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -110,12 +110,12 @@ -(void)Plot:(nonnull CPTPlot *)plot dataLabelWasSelectedAtRecordIndex:(NSUIntege #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); NSNumber *num = self.plotData[index][key]; diff --git a/examples/CorePlotGallery/src/plots/VerticalBarChart.m b/examples/CorePlotGallery/src/plots/VerticalBarChart.m index a61bf7fee..2236f441f 100644 --- a/examples/CorePlotGallery/src/plots/VerticalBarChart.m +++ b/examples/CorePlotGallery/src/plots/VerticalBarChart.m @@ -51,7 +51,7 @@ -(void)generateData { } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL __unused)animated { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE CGRect bounds = hostingView.bounds; @@ -288,7 +288,7 @@ -(void)barPlot:(nonnull CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUIntege #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return 10; } diff --git a/examples/CorePlotGallery/src/shared/PlotGallery.m b/examples/CorePlotGallery/src/shared/PlotGallery.m index 43be7cdca..fc40ffe5a 100644 --- a/examples/CorePlotGallery/src/shared/PlotGallery.m +++ b/examples/CorePlotGallery/src/shared/PlotGallery.m @@ -58,7 +58,7 @@ -(nonnull instancetype)init return sharedPlotGallery; } --(nonnull id)copyWithZone:(nullable NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *__unused)zone { return self; } diff --git a/examples/CorePlotGallery/src/shared/PlotItem.m b/examples/CorePlotGallery/src/shared/PlotItem.m index 86d5d8214..08bc060b7 100644 --- a/examples/CorePlotGallery/src/shared/PlotItem.m +++ b/examples/CorePlotGallery/src/shared/PlotItem.m @@ -324,7 +324,7 @@ -(void)applyTheme:(nullable CPTTheme *)theme toGraph:(nonnull CPTGraph *)graph w #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else --(void)setFrameSize:(NSSize)size +-(void)setFrameSize:(NSSize __unused)size { } @@ -381,7 +381,7 @@ -(void)renderInView:(nonnull PlotGalleryNativeView *)inView withTheme:(nullable self.defaultLayerHostingView = hostingView; } --(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *)hostingView withTheme:(nullable CPTTheme *)theme animated:(BOOL)animated +-(void)renderInGraphHostingView:(nonnull CPTGraphHostingView *__unused)hostingView withTheme:(nullable CPTTheme *__unused)theme animated:(BOOL __unused)animated { NSLog(@"PlotItem:renderInLayer: Override me"); } diff --git a/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m index c793498f1..25c2be344 100644 --- a/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m +++ b/examples/CorePlotGallery/src/tvOS/AppDelegateTV.m @@ -6,7 +6,7 @@ @implementation AppDelegateTV @synthesize window; --(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +-(BOOL)application:(UIApplication *__unused)application didFinishLaunchingWithOptions:(NSDictionary *__unused)launchOptions { [[PlotGallery sharedPlotGallery] sortByTitle]; diff --git a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m index fa737fcbc..0e114aef2 100644 --- a/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/RootViewControllerTV.m @@ -48,7 +48,7 @@ -(void)dealloc #pragma mark - #pragma mark Segues --(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id __unused)sender { if ( [segue.identifier isEqualToString:@"showDetail"] ) { DetailViewControllerTV *controller = (DetailViewControllerTV *)segue.destinationViewController; @@ -88,12 +88,12 @@ -(void)themeChanged:(NSNotification *)notification #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(UITableView *)tv +-(NSInteger)numberOfSectionsInTableView:(UITableView *__unused)tv { return (NSInteger)[PlotGallery sharedPlotGallery].numberOfSections; } --(NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(UITableView *__unused)tv numberOfRowsInSection:(NSInteger)section { return (NSInteger)[[PlotGallery sharedPlotGallery] numberOfRowsInSection:(NSUInteger)section]; } @@ -117,7 +117,7 @@ -(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPa return cell; } --(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section +-(NSString *)tableView:(UITableView *__unused)tableView titleForHeaderInSection:(NSInteger)section { return [PlotGallery sharedPlotGallery].sectionTitles[(NSUInteger)section]; } diff --git a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m index faa3122b4..fb6aac50e 100644 --- a/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m +++ b/examples/CorePlotGallery/src/tvOS/ThemeTableViewControllerTV.m @@ -58,12 +58,12 @@ -(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBu #pragma mark - #pragma mark Table view data source --(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +-(NSInteger)numberOfSectionsInTableView:(UITableView *__unused)tableView { return 1; } --(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +-(NSInteger)tableView:(UITableView *__unused)tableView numberOfRowsInSection:(NSInteger __unused)section { return (NSInteger)self.themes.count; } @@ -86,7 +86,7 @@ -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS #pragma mark - #pragma mark Table view delegate --(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +-(void)tableView:(UITableView *__unused)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *themeInfo = @{ PlotGalleryThemeNameKey: self.themes[(NSUInteger)indexPath.row] diff --git a/examples/DropPlot/CPTPlotDocument.m b/examples/DropPlot/CPTPlotDocument.m index d2bc0046e..537a8bdcb 100644 --- a/examples/DropPlot/CPTPlotDocument.m +++ b/examples/DropPlot/CPTPlotDocument.m @@ -59,7 +59,7 @@ -(nullable NSString *)windowNibName return @"CPTPlotDocument"; } --(void)windowControllerDidLoadNib:(nonnull NSWindowController *)windowController +-(void)windowControllerDidLoadNib:(nonnull NSWindowController *__unused)windowController { // Create graph from theme CPTXYGraph *newGraph = [[CPTXYGraph alloc] initWithFrame:CGRectZero]; @@ -128,7 +128,7 @@ -(void)windowControllerDidLoadNib:(nonnull NSWindowController *)windowController #pragma mark - #pragma mark Data loading methods --(nullable NSData *)dataOfType:(nonnull NSString *)typeName error:(NSError *__autoreleasing __nullable *)outError +-(nullable NSData *)dataOfType:(nonnull NSString *__unused)typeName error:(NSError *__autoreleasing __nullable *)outError { // Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil. @@ -308,7 +308,7 @@ -(IBAction)zoomOut #pragma mark - #pragma mark PDF / image export --(IBAction)exportToPDF:(nullable id)sender +-(IBAction)exportToPDF:(nullable id __unused)sender { NSSavePanel *pdfSavingDialog = [NSSavePanel savePanel]; @@ -324,7 +324,7 @@ -(IBAction)exportToPDF:(nullable id)sender } } --(IBAction)exportToPNG:(nullable id)sender +-(IBAction)exportToPNG:(nullable id __unused)sender { NSSavePanel *pngSavingDialog = [NSSavePanel savePanel]; @@ -346,12 +346,12 @@ -(IBAction)exportToPNG:(nullable id)sender #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.dataPoints.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { NSString *key = (fieldEnum == CPTScatterPlotFieldX ? @"x" : @"y"); @@ -361,7 +361,7 @@ -(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum #pragma mark - #pragma mark Plot Space Delegate Methods --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceDraggedEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; @@ -388,7 +388,7 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDragged return NO; } --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceDownEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint)interactionPoint { if ( !self.zoomAnnotation ) { self.dragStart = interactionPoint; @@ -429,7 +429,7 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceDownEve return NO; } --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; @@ -461,7 +461,7 @@ -(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent return NO; } --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceCancelledEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)interactionPoint { CPTPlotSpaceAnnotation *annotation = self.zoomAnnotation; diff --git a/examples/MinorTickLabels/Controller.m b/examples/MinorTickLabels/Controller.m index 28395c4b5..194c6a92a 100644 --- a/examples/MinorTickLabels/Controller.m +++ b/examples/MinorTickLabels/Controller.m @@ -98,12 +98,12 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } diff --git a/examples/RangePlot/Controller.m b/examples/RangePlot/Controller.m index 51b78dcee..bf6741983 100644 --- a/examples/RangePlot/Controller.m +++ b/examples/RangePlot/Controller.m @@ -124,17 +124,17 @@ -(void)awakeFromNib #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.plotData.count; } --(nullable id)numberForPlot:(nonnull CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index +-(nullable id)numberForPlot:(nonnull CPTPlot *__unused)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index { return self.plotData[index][@(fieldEnum)]; } --(BOOL)plotSpace:(nonnull CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)point +-(BOOL)plotSpace:(nonnull CPTPlotSpace *__unused)space shouldHandlePointingDeviceUpEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)point { CPTRangePlot *rangePlot = (CPTRangePlot *)[self.graph plotWithIdentifier:@"Date Plot"]; diff --git a/framework/MacOnly/CPTGraphHostingView.m b/framework/MacOnly/CPTGraphHostingView.m index ca013d5f7..531d6b06b 100644 --- a/framework/MacOnly/CPTGraphHostingView.m +++ b/framework/MacOnly/CPTGraphHostingView.m @@ -173,7 +173,7 @@ +(BOOL)supportsSecureCoding /// @cond --(void)drawRect:(NSRect)dirtyRect +-(void)drawRect:(NSRect __unused)dirtyRect { if ( self.hostedGraph ) { if ( ![NSGraphicsContext currentContextDrawingToScreen] ) { @@ -229,7 +229,7 @@ -(BOOL)knowsPageRange:(nonnull NSRangePointer)rangePointer return YES; } --(NSRect)rectForPage:(NSInteger)pageNumber +-(NSRect)rectForPage:(NSInteger __unused)pageNumber { return self.printRect; } @@ -241,7 +241,7 @@ -(NSRect)rectForPage:(NSInteger)pageNumber /// @cond --(BOOL)acceptsFirstMouse:(nullable NSEvent *)theEvent +-(BOOL)acceptsFirstMouse:(nullable NSEvent *__unused)theEvent { return YES; } diff --git a/framework/Source/CPTAnimationPeriod.m b/framework/Source/CPTAnimationPeriod.m index f8e658bb6..3d781b79c 100644 --- a/framework/Source/CPTAnimationPeriod.m +++ b/framework/Source/CPTAnimationPeriod.m @@ -458,7 +458,7 @@ -(nonnull instancetype)init * @param boundObject The object to update for each animation frame. * @param boundGetter The getter method for the property to update. **/ --(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter +-(void)setStartValueFromObject:(nonnull id __unused)boundObject propertyGetter:(nonnull SEL __unused)boundGetter { [NSException raise:NSGenericException format:@"The -initializeStartValue method must be implemented by CPTAnimationPeriod subclasses."]; @@ -472,7 +472,7 @@ -(void)setStartValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull S * @param progress The fraction of the animation progress. * @return The computed value. **/ --(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress +-(nonnull NSValue *)tweenedValueForProgress:(CGFloat __unused)progress { [NSException raise:NSGenericException format:@"The -tweenedValueForProgress: method must be implemented by CPTAnimationPeriod subclasses."]; @@ -485,7 +485,7 @@ -(nonnull NSValue *)tweenedValueForProgress:(CGFloat)progress * @param boundGetter The getter method for the property to update. * @return @YES if the current value of the bound property is between the start and end value. **/ --(BOOL)canStartWithValueFromObject:(nonnull id)boundObject propertyGetter:(nonnull SEL)boundGetter +-(BOOL)canStartWithValueFromObject:(nonnull id __unused)boundObject propertyGetter:(nonnull SEL __unused)boundGetter { [NSException raise:NSGenericException format:@"The -canStartWithValueFromObject:propertyGetter: method must be implemented by CPTAnimationPeriod subclasses."]; diff --git a/framework/Source/CPTAxis.m b/framework/Source/CPTAxis.m index 1e060b24b..102318084 100644 --- a/framework/Source/CPTAxis.m +++ b/framework/Source/CPTAxis.m @@ -3264,7 +3264,7 @@ @implementation CPTAxis(AbstractMethods) * @param coordinateValue The axis value in data coordinate space. * @return The drawing coordinates of the point. **/ --(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *)coordinateValue +-(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *__unused)coordinateValue { return CGPointZero; } @@ -3273,7 +3273,7 @@ -(CGPoint)viewPointForCoordinateValue:(nullable NSNumber *)coordinateValue * @param context The graphics context to draw into. * @param major Draw the major grid lines If @YES, minor grid lines otherwise. **/ --(void)drawGridLinesInContext:(nonnull CGContextRef)context isMajor:(BOOL)major +-(void)drawGridLinesInContext:(nonnull CGContextRef __unused)context isMajor:(BOOL __unused)major { // do nothing--subclasses must override to do their drawing } @@ -3281,7 +3281,7 @@ -(void)drawGridLinesInContext:(nonnull CGContextRef)context isMajor:(BOOL)major /** @brief Draws alternating background bands into the provided graphics context. * @param context The graphics context to draw into. **/ --(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context +-(void)drawBackgroundBandsInContext:(nonnull CGContextRef __unused)context { // do nothing--subclasses must override to do their drawing } @@ -3289,7 +3289,7 @@ -(void)drawBackgroundBandsInContext:(nonnull CGContextRef)context /** @brief Draws background limit ranges into the provided graphics context. * @param context The graphics context to draw into. **/ --(void)drawBackgroundLimitsInContext:(nonnull CGContextRef)context +-(void)drawBackgroundLimitsInContext:(nonnull CGContextRef __unused)context { // do nothing--subclasses must override to do their drawing } diff --git a/framework/Source/CPTAxisLabelGroup.m b/framework/Source/CPTAxisLabelGroup.m index 174f90bed..1693c7a78 100644 --- a/framework/Source/CPTAxisLabelGroup.m +++ b/framework/Source/CPTAxisLabelGroup.m @@ -15,7 +15,7 @@ -(void)display // nothing to draw } --(void)renderAsVectorInContext:(nonnull CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef __unused)context { // nothing to draw } diff --git a/framework/Source/CPTAxisLabelTests.m b/framework/Source/CPTAxisLabelTests.m index 9bb03a537..ff3248137 100644 --- a/framework/Source/CPTAxisLabelTests.m +++ b/framework/Source/CPTAxisLabelTests.m @@ -32,7 +32,12 @@ -(void)testPositionRelativeToViewPointRaisesForInvalidDirection @try { label = [[CPTAxisLabel alloc] initWithText:@"CPTAxisLabelTests-testPositionRelativeToViewPointRaisesForInvalidDirection" textStyle:[CPTTextStyle textStyle]]; - XCTAssertThrowsSpecificNamed([label positionRelativeToViewPoint:CGPointZero forCoordinate:CPTCoordinateX inDirection:INT_MAX], NSException, NSInvalidArgumentException, @"Should raise NSInvalidArgumentException for invalid direction (type CPTSign)"); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wassign-enum" + + XCTAssertThrowsSpecificNamed([label positionRelativeToViewPoint:CGPointZero forCoordinate:CPTCoordinateX inDirection:NSIntegerMax], NSException, NSInvalidArgumentException, @"Should raise NSInvalidArgumentException for invalid direction (type CPTSign)"); + +#pragma clang diagnostic pop } @finally { label = nil; diff --git a/framework/Source/CPTConstraints.m b/framework/Source/CPTConstraints.m index c929936fc..c9896ea25 100644 --- a/framework/Source/CPTConstraints.m +++ b/framework/Source/CPTConstraints.m @@ -90,7 +90,7 @@ -(nonnull instancetype)initWithRelativeOffset:(CGFloat)newOffset /// @cond --(nonnull id)copyWithZone:(nullable NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *__unused)zone { // do nothing--implemented in subclasses return nil; @@ -103,7 +103,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone /// @cond --(void)encodeWithCoder:(nonnull NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *__unused)coder { // do nothing--implemented in subclasses } @@ -169,7 +169,7 @@ -(BOOL)isEqualToConstraint:(nullable CPTConstraints *)otherConstraint * @param upperBound The upper bound; must be greater than or equal to the @par{lowerBound}. * @return The calculated position. **/ --(CGFloat)positionForLowerBound:(CGFloat)lowerBound upperBound:(CGFloat)upperBound +-(CGFloat)positionForLowerBound:(CGFloat __unused)lowerBound upperBound:(CGFloat __unused)upperBound { // subclasses override to do position calculation here return CPTNAN; diff --git a/framework/Source/CPTDataSourceTestCase.m b/framework/Source/CPTDataSourceTestCase.m index 8c601b1bf..1c71e3e1d 100644 --- a/framework/Source/CPTDataSourceTestCase.m +++ b/framework/Source/CPTDataSourceTestCase.m @@ -100,7 +100,7 @@ -(nonnull CPTMutablePlotRange *)plotRangeForData:(nonnull CPTNumberArray *)dataA #pragma mark - #pragma mark Plot Data Source Methods --(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *)plot +-(NSUInteger)numberOfRecordsForPlot:(nonnull CPTPlot *__unused)plot { return self.nRecords; } diff --git a/framework/Source/CPTFill.m b/framework/Source/CPTFill.m index d2d88890c..b884fdd99 100644 --- a/framework/Source/CPTFill.m +++ b/framework/Source/CPTFill.m @@ -85,7 +85,7 @@ -(nonnull instancetype)initWithImage:(nonnull CPTImage *)anImage /// @cond --(nonnull id)copyWithZone:(nullable NSZone *)zone +-(nonnull id)copyWithZone:(nullable NSZone *__unused)zone { // do nothing--implemented in subclasses return nil; @@ -98,7 +98,7 @@ -(nonnull id)copyWithZone:(nullable NSZone *)zone /// @cond --(void)encodeWithCoder:(nonnull NSCoder *)coder +-(void)encodeWithCoder:(nonnull NSCoder *__unused)coder { // do nothing--implemented in subclasses } @@ -186,7 +186,7 @@ -(nullable CGColorRef)cgColor * @param rect The rectangle to draw into. * @param context The graphics context to draw into. **/ --(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context +-(void)fillRect:(CGRect __unused)rect inContext:(nonnull CGContextRef __unused)context { // do nothing--subclasses override to do drawing here } @@ -194,7 +194,7 @@ -(void)fillRect:(CGRect)rect inContext:(nonnull CGContextRef)context /** @brief Draws the gradient into the given graphics context clipped to the current drawing path. * @param context The graphics context to draw into. **/ --(void)fillPathInContext:(nonnull CGContextRef)context +-(void)fillPathInContext:(nonnull CGContextRef __unused)context { // do nothing--subclasses override to do drawing here } @@ -208,7 +208,7 @@ -(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); - return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat __unused scale, CGRect bounds) { [self fillRect:bounds inContext:context]; }); } diff --git a/framework/Source/CPTFunctionDataSource.m b/framework/Source/CPTFunctionDataSource.m index 9b6fc7307..0e038673a 100644 --- a/framework/Source/CPTFunctionDataSource.m +++ b/framework/Source/CPTFunctionDataSource.m @@ -379,54 +379,56 @@ -(nullable CPTNumericData *)dataForPlot:(nonnull CPTPlot *)plot recordIndexRange { CPTNumericData *numericData = nil; - NSUInteger count = self.dataCount; - - if ( count > 0 ) { - CPTPlotRange *xRange = self.cachedPlotRange; - - if ( !xRange ) { - [self plotSpaceChanged]; - xRange = self.cachedPlotRange; - } + if ( [plot isEqual:self.dataPlot] ) { + NSUInteger count = self.dataCount; - NSMutableData *data = [[NSMutableData alloc] initWithLength:indexRange.length * 2 * sizeof(double)]; + if ( count > 0 ) { + CPTPlotRange *xRange = self.cachedPlotRange; - double *xBytes = data.mutableBytes; - double *yBytes = data.mutableBytes + (indexRange.length * sizeof(double)); + if ( !xRange ) { + [self plotSpaceChanged]; + xRange = self.cachedPlotRange; + } - double location = xRange.locationDouble; - double length = xRange.lengthDouble; - double denom = (double)(count - ((count > 1) ? 1 : 0)); + NSMutableData *data = [[NSMutableData alloc] initWithLength:indexRange.length * 2 * sizeof(double)]; - NSUInteger lastIndex = NSMaxRange(indexRange); + double *xBytes = data.mutableBytes; + double *yBytes = data.mutableBytes + (indexRange.length * sizeof(double)); - CPTDataSourceFunction function = self.dataSourceFunction; + double location = xRange.locationDouble; + double length = xRange.lengthDouble; + double denom = (double)(count - ((count > 1) ? 1 : 0)); - if ( function ) { - for ( NSUInteger i = indexRange.location; i < lastIndex; i++ ) { - double x = location + ((double)i / denom) * length; + NSUInteger lastIndex = NSMaxRange(indexRange); - *xBytes++ = x; - *yBytes++ = function(x); - } - } - else { - CPTDataSourceBlock functionBlock = self.dataSourceBlock; + CPTDataSourceFunction function = self.dataSourceFunction; - if ( functionBlock ) { + if ( function ) { for ( NSUInteger i = indexRange.location; i < lastIndex; i++ ) { double x = location + ((double)i / denom) * length; *xBytes++ = x; - *yBytes++ = functionBlock(x); + *yBytes++ = function(x); } } - } + else { + CPTDataSourceBlock functionBlock = self.dataSourceBlock; - numericData = [CPTNumericData numericDataWithData:data - dataType:CPTDataType(CPTFloatingPointDataType, sizeof(double), CFByteOrderGetCurrent()) - shape:@[@(indexRange.length), @2] - dataOrder:CPTDataOrderColumnsFirst]; + if ( functionBlock ) { + for ( NSUInteger i = indexRange.location; i < lastIndex; i++ ) { + double x = location + ((double)i / denom) * length; + + *xBytes++ = x; + *yBytes++ = functionBlock(x); + } + } + } + + numericData = [CPTNumericData numericDataWithData:data + dataType:CPTDataType(CPTFloatingPointDataType, sizeof(double), CFByteOrderGetCurrent()) + shape:@[@(indexRange.length), @2] + dataOrder:CPTDataOrderColumnsFirst]; + } } return numericData; diff --git a/framework/Source/CPTGradient.m b/framework/Source/CPTGradient.m index 965903adb..3d6028025 100644 --- a/framework/Source/CPTGradient.m +++ b/framework/Source/CPTGradient.m @@ -1653,7 +1653,7 @@ -(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); - return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat __unused scale, CGRect bounds) { switch ( self.gradientType ) { case CPTGradientTypeAxial: CGContextAddRect(context, bounds); diff --git a/framework/Source/CPTLayer.m b/framework/Source/CPTLayer.m index 77311006b..eef476e9a 100644 --- a/framework/Source/CPTLayer.m +++ b/framework/Source/CPTLayer.m @@ -305,7 +305,7 @@ +(BOOL)supportsSecureCoding /// @cond --(id)actionForKey:(nonnull NSString *)aKey +-(id)actionForKey:(nonnull NSString *__unused)aKey { return nil; } @@ -526,29 +526,29 @@ -(nonnull NSData *)dataForPDFRepresentationOfLayer /// @name User Interaction /// @{ --(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDownEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)interactionPoint { return NO; } --(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)interactionPoint { return NO; } --(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint +-(BOOL)pointingDeviceDraggedEvent:(nonnull CPTNativeEvent *__unused)event atPoint:(CGPoint __unused)interactionPoint { return NO; } --(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *)event +-(BOOL)pointingDeviceCancelledEvent:(nonnull CPTNativeEvent *__unused)event { return NO; } #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE #else --(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *)event fromPoint:(CGPoint)fromPoint toPoint:(CGPoint)toPoint +-(BOOL)scrollWheelEvent:(nonnull CPTNativeEvent *__unused)event fromPoint:(CGPoint __unused)fromPoint toPoint:(CGPoint __unused)toPoint { return NO; } diff --git a/framework/Source/CPTLegend.m b/framework/Source/CPTLegend.m index 15f06c82e..c5fcb69c4 100644 --- a/framework/Source/CPTLegend.m +++ b/framework/Source/CPTLegend.m @@ -1142,12 +1142,12 @@ -(void)removeLegendEntriesForPlot:(nonnull CPTPlot *)plot /// @cond --(void)legendNeedsRedraw:(nonnull NSNotification *)notif +-(void)legendNeedsRedraw:(nonnull NSNotification *__unused)notif { [self setNeedsDisplay]; } --(void)legendNeedsLayout:(nonnull NSNotification *)notif +-(void)legendNeedsLayout:(nonnull NSNotification *__unused)notif { self.layoutChanged = YES; [self setNeedsDisplay]; diff --git a/framework/Source/CPTLineCap.m b/framework/Source/CPTLineCap.m index e86e063ca..5350d1149 100644 --- a/framework/Source/CPTLineCap.m +++ b/framework/Source/CPTLineCap.m @@ -605,7 +605,7 @@ -(nullable id)debugQuickLookObject const CGRect rect = CGRectMake(-halfSize.width, -halfSize.height, symbolSize.width, symbolSize.height); const CGPoint centerPoint = CGPointMake(halfSize.width, halfSize.height); - return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat __unused scale, CGRect bounds __unused) { [self renderAsVectorInContext:context atPoint:centerPoint inDirection:CGPointMake(1.0, 0.0)]; }); } diff --git a/framework/Source/CPTLineStyle.m b/framework/Source/CPTLineStyle.m index 7916ffa8f..2208471f6 100644 --- a/framework/Source/CPTLineStyle.m +++ b/framework/Source/CPTLineStyle.m @@ -421,7 +421,7 @@ -(nullable id)debugQuickLookObject { const CGRect rect = CGRectMake(0.0, 0.0, 100.0, 100.0); - return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat scale, CGRect bounds) { + return CPTQuickLookImage(rect, ^(CGContextRef context, CGFloat __unused scale, CGRect bounds) { const CGRect alignedRect = CPTAlignBorderedRectToUserSpace(context, bounds, self); [self setLineStyleInContext:context]; diff --git a/framework/Source/CPTPlot.m b/framework/Source/CPTPlot.m index 679834020..5cd2637a0 100644 --- a/framework/Source/CPTPlot.m +++ b/framework/Source/CPTPlot.m @@ -473,7 +473,7 @@ +(BOOL)supportsSecureCoding /// @cond --(nullable Class)valueClassForBinding:(nonnull NSString *)binding +-(nullable Class)valueClassForBinding:(nonnull NSString *__unused)binding { return [NSArray class]; } @@ -702,7 +702,7 @@ -(void)reloadPlotData /** @brief Reload plot data in the given index range from the data source immediately. * @param indexRange The index range to load. **/ --(void)reloadPlotDataInIndexRange:(NSRange)indexRange +-(void)reloadPlotDataInIndexRange:(NSRange __unused)indexRange { // do nothing--implementation provided by subclasses } @@ -1795,7 +1795,7 @@ -(NSUInteger)numberOfLegendEntries * @param idx The index of the desired title. * @return The title of the legend entry at the requested index. **/ --(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger __unused)idx { NSString *legendTitle = self.title; @@ -1814,7 +1814,7 @@ -(nullable NSString *)titleForLegendEntryAtIndex:(NSUInteger)idx * @param idx The index of the desired title. * @return The styled title of the legend entry at the requested index. **/ --(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger)idx +-(nullable NSAttributedString *)attributedTitleForLegendEntryAtIndex:(NSUInteger __unused)idx { NSAttributedString *legendTitle = self.attributedTitle; @@ -2263,7 +2263,7 @@ -(nonnull CPTNumberArray *)fieldIdentifiers * @param coord The coordinate for which the corresponding field identifiers are desired. * @return Array of NSNumber objects for the field identifiers. **/ --(nonnull CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord +-(nonnull CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate __unused)coord { return @[]; } @@ -2272,7 +2272,7 @@ -(nonnull CPTNumberArray *)fieldIdentifiersForCoordinate:(CPTCoordinate)coord * @param field The field identifier for which the corresponding coordinate is desired. * @return The coordinate that corresponds to a particular field identifier or #CPTCoordinateNone if there is no matching coordinate. */ --(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field +-(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger __unused)field { return CPTCoordinateNone; } @@ -2284,7 +2284,7 @@ -(CPTCoordinate)coordinateForFieldIdentifier:(NSUInteger)field * @param label The annotation for the data label. * @param idx The data index for the label. **/ --(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex:(NSUInteger)idx +-(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *__unused)label forIndex:(NSUInteger __unused)idx { // do nothing--implementation provided by subclasses } @@ -2297,7 +2297,7 @@ -(void)positionLabelAnnotation:(nonnull CPTPlotSpaceAnnotation *)label forIndex: * @param point The coordinates of the interaction. * @return The index of the data point that is under the given point or @ref NSNotFound if none was found. */ --(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point +-(NSUInteger)dataIndexFromInteractionPoint:(CGPoint __unused)point { return NSNotFound; } diff --git a/framework/Source/CPTPlotGroup.m b/framework/Source/CPTPlotGroup.m index e2ce5f393..4a224e691 100644 --- a/framework/Source/CPTPlotGroup.m +++ b/framework/Source/CPTPlotGroup.m @@ -83,7 +83,7 @@ -(void)display // nothing to draw } --(void)renderAsVectorInContext:(nonnull CGContextRef)context +-(void)renderAsVectorInContext:(nonnull CGContextRef __unused)context { // nothing to draw } diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index 738a85ad7..efb3bdfda 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -517,7 +517,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray *)plotPoint * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -529,7 +529,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *)plotPoint numberOfC * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -540,7 +540,7 @@ -(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *)plotPoi * @param point The drawing coordinates of the data point. * @return An array of data point coordinates (as NSNumber values). **/ --(nullable CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint)point +-(nullable CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint __unused)point { return nil; } @@ -550,7 +550,7 @@ -(nullable CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint)point * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint __unused)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -560,7 +560,7 @@ -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger) * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint)point +-(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint __unused)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -569,7 +569,7 @@ -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates: * @param event The event. * @return The drawing coordinates of the point. **/ --(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event +-(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *__unused)event { return CGPointZero; } @@ -578,7 +578,7 @@ -(CGPoint)plotAreaViewPointForEvent:(nonnull CPTNativeEvent *)event * @param event The event. * @return An array of data point coordinates (as NSNumber values). **/ --(nullable CPTNumberArray *)plotPointForEvent:(nonnull CPTNativeEvent *)event +-(nullable CPTNumberArray *)plotPointForEvent:(nonnull CPTNativeEvent *__unused)event { return nil; } @@ -588,7 +588,7 @@ -(nullable CPTNumberArray *)plotPointForEvent:(nonnull CPTNativeEvent *)event * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event +-(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *__unused)event { NSParameterAssert(count == self.numberOfCoordinates); } @@ -598,7 +598,7 @@ -(void)plotPoint:(nonnull NSDecimal *)plotPoint numberOfCoordinates:(NSUInteger) * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *)event +-(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *__unused)event { NSParameterAssert(count == self.numberOfCoordinates); } @@ -607,7 +607,7 @@ -(void)doublePrecisionPlotPoint:(nonnull double *)plotPoint numberOfCoordinates: * @param newRange The new plot range. * @param coordinate The axis coordinate. **/ --(void)setPlotRange:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate +-(void)setPlotRange:(nonnull CPTPlotRange *__unused)newRange forCoordinate:(CPTCoordinate __unused)coordinate { } @@ -615,7 +615,7 @@ -(void)setPlotRange:(nonnull CPTPlotRange *)newRange forCoordinate:(CPTCoordinat * @param coordinate The axis coordinate. * @return The range of values. **/ --(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate +-(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate __unused)coordinate { return nil; } @@ -624,7 +624,7 @@ -(nullable CPTPlotRange *)plotRangeForCoordinate:(CPTCoordinate)coordinate * @param newType The new scale type. * @param coordinate The axis coordinate. **/ --(void)setScaleType:(CPTScaleType)newType forCoordinate:(CPTCoordinate)coordinate +-(void)setScaleType:(CPTScaleType __unused)newType forCoordinate:(CPTCoordinate __unused)coordinate { } @@ -632,7 +632,7 @@ -(void)setScaleType:(CPTScaleType)newType forCoordinate:(CPTCoordinate)coordinat * @param coordinate The axis coordinate. * @return The scale type. **/ --(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate +-(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate __unused)coordinate { return CPTScaleTypeLinear; } @@ -640,7 +640,7 @@ -(CPTScaleType)scaleTypeForCoordinate:(CPTCoordinate)coordinate /** @brief Scales the plot ranges so that the plots just fit in the visible space. * @param plots An array of the plots that have to fit in the visible area. **/ --(void)scaleToFitPlots:(nullable CPTPlotArray *)plots +-(void)scaleToFitPlots:(nullable CPTPlotArray *__unused)plots { } @@ -676,7 +676,7 @@ -(void)scaleToFitPlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCoordina /** @brief Scales the plot ranges so that the plots just fit in the visible space. * @param plots An array of the plots that have to fit in the visible area. **/ --(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots +-(void)scaleToFitEntirePlots:(nullable CPTPlotArray *__unused)plots { } @@ -713,7 +713,7 @@ -(void)scaleToFitEntirePlots:(nullable CPTPlotArray *)plots forCoordinate:(CPTCo * @param interactionScale The scaling factor. One (@num{1}) gives no scaling. * @param interactionPoint The plot area view point about which the scaling occurs. **/ --(void)scaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint +-(void)scaleBy:(CGFloat __unused)interactionScale aboutPoint:(CGPoint __unused)interactionPoint { } diff --git a/framework/Source/CPTRangePlot.m b/framework/Source/CPTRangePlot.m index ed101fb26..b03c7e6e2 100644 --- a/framework/Source/CPTRangePlot.m +++ b/framework/Source/CPTRangePlot.m @@ -60,7 +60,7 @@ @interface CPTRangePlot() @property (nonatomic, readwrite, copy, nullable) CPTLineStyleArray *barWidths; @property (nonatomic, readwrite, assign) NSUInteger pointingDeviceDownIndex; --(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly; +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace; -(void)calculateViewPoints:(nonnull CGPointError *)viewPoints withDrawPointFlags:(nonnull BOOL *)drawPointFlags numberOfPoints:(NSUInteger)dataCount; -(void)alignViewPointsToUserSpace:(nonnull CGPointError *)viewPoints withContext:(nonnull CGContextRef)context drawPointFlags:(nonnull BOOL *)drawPointFlag numberOfPoints:(NSUInteger)dataCounts; -(NSInteger)extremeDrawnPointIndexForFlags:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount extremeNumIsLowerBound:(BOOL)isLowerBound; @@ -288,7 +288,7 @@ +(BOOL)supportsSecureCoding /// @cond --(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace includeVisiblePointsOnly:(BOOL)visibleOnly +-(void)calculatePointsToDraw:(nonnull BOOL *)pointDrawFlags numberOfPoints:(NSUInteger)dataCount forPlotSpace:(nonnull CPTXYPlotSpace *)xyPlotSpace { if ( dataCount == 0 ) { return; @@ -728,7 +728,7 @@ -(void)renderAsVectorInContext:(nonnull CGContextRef)context BOOL *drawPointFlags = calloc(dataCount, sizeof(BOOL)); CPTXYPlotSpace *thePlotSpace = (CPTXYPlotSpace *)self.plotSpace; - [self calculatePointsToDraw:drawPointFlags numberOfPoints:dataCount forPlotSpace:thePlotSpace includeVisiblePointsOnly:NO]; + [self calculatePointsToDraw:drawPointFlags numberOfPoints:dataCount forPlotSpace:thePlotSpace]; [self calculateViewPoints:viewPoints withDrawPointFlags:drawPointFlags numberOfPoints:dataCount]; if ( self.alignsPointsToPixels ) { [self alignViewPointsToUserSpace:viewPoints withContext:context drawPointFlags:drawPointFlags numberOfPoints:dataCount]; @@ -1177,7 +1177,7 @@ -(NSUInteger)dataIndexFromInteractionPoint:(CGPoint)point CGPointError *viewPoints = calloc(dataCount, sizeof(CGPointError)); BOOL *drawPointFlags = calloc(dataCount, sizeof(BOOL)); - [self calculatePointsToDraw:drawPointFlags numberOfPoints:dataCount forPlotSpace:(id)self.plotSpace includeVisiblePointsOnly:YES]; + [self calculatePointsToDraw:drawPointFlags numberOfPoints:dataCount forPlotSpace:(CPTXYPlotSpace *)self.plotSpace]; [self calculateViewPoints:viewPoints withDrawPointFlags:drawPointFlags numberOfPoints:dataCount]; NSInteger result = [self extremeDrawnPointIndexForFlags:drawPointFlags numberOfPoints:dataCount extremeNumIsLowerBound:YES]; diff --git a/framework/Source/CPTScatterPlot.m b/framework/Source/CPTScatterPlot.m index b686c1ded..d8417fc1f 100644 --- a/framework/Source/CPTScatterPlot.m +++ b/framework/Source/CPTScatterPlot.m @@ -721,7 +721,7 @@ -(NSUInteger)indexOfVisiblePointClosestToPlotAreaPoint:(CGPoint)viewPoint CGPoint *viewPoints = calloc(dataCount, sizeof(CGPoint)); BOOL *drawPointFlags = calloc(dataCount, sizeof(BOOL)); - [self calculatePointsToDraw:drawPointFlags forPlotSpace:(id)self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:dataCount]; + [self calculatePointsToDraw:drawPointFlags forPlotSpace:(CPTXYPlotSpace *)self.plotSpace includeVisiblePointsOnly:YES numberOfPoints:dataCount]; [self calculateViewPoints:viewPoints withDrawPointFlags:drawPointFlags numberOfPoints:dataCount]; NSInteger result = [self extremeDrawnPointIndexForFlags:drawPointFlags numberOfPoints:dataCount extremeNumIsLowerBound:YES]; diff --git a/framework/Source/CPTTextLayer.m b/framework/Source/CPTTextLayer.m index 995afbe5f..45a208f31 100644 --- a/framework/Source/CPTTextLayer.m +++ b/framework/Source/CPTTextLayer.m @@ -141,7 +141,7 @@ -(nonnull instancetype)initWithLayer:(nonnull id)layer * @param newFrame The frame rectangle. * @return The initialized CPTTextLayer object. **/ --(nonnull instancetype)initWithFrame:(CGRect)newFrame +-(nonnull instancetype)initWithFrame:(CGRect __unused)newFrame { return [self initWithText:nil style:nil]; } diff --git a/framework/Source/CPTTheme.m b/framework/Source/CPTTheme.m index b4b06de37..9d17a6e00 100644 --- a/framework/Source/CPTTheme.m +++ b/framework/Source/CPTTheme.m @@ -213,21 +213,21 @@ -(nullable id)newGraph /** @brief Applies the background theme to the provided graph. * @param graph The graph to style. **/ --(void)applyThemeToBackground:(nonnull CPTGraph *)graph +-(void)applyThemeToBackground:(nonnull CPTGraph *__unused)graph { } /** @brief Applies the theme to the provided plot area. * @param plotAreaFrame The plot area to style. **/ --(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *)plotAreaFrame +-(void)applyThemeToPlotArea:(nonnull CPTPlotAreaFrame *__unused)plotAreaFrame { } /** @brief Applies the theme to the provided axis set. * @param axisSet The axis set to style. **/ --(void)applyThemeToAxisSet:(nonnull CPTAxisSet *)axisSet +-(void)applyThemeToAxisSet:(nonnull CPTAxisSet *__unused)axisSet { } diff --git a/framework/Source/NSCoderExtensions.m b/framework/Source/NSCoderExtensions.m index 6884d24f6..cfa40b7f7 100644 --- a/framework/Source/NSCoderExtensions.m +++ b/framework/Source/NSCoderExtensions.m @@ -72,10 +72,15 @@ -(void)encodeCPTRect:(CGRect)rect forKey:(nonnull NSString *)key * @param key The key to associate with the color space. * @note The current implementation only works with named color spaces. **/ +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-parameter" +#endif -(void)encodeCGColorSpace:(nullable CGColorSpaceRef)colorSpace forKey:(nonnull NSString *)key { #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE NSLog(@"Color space encoding is not supported on iOS. Decoding will return a generic RGB color space."); +#pragma clang diagnostic pop #else if ( colorSpace ) { CFDataRef iccProfile = NULL; @@ -334,6 +339,10 @@ -(CGRect)decodeCPTRectForKey:(nonnull NSString *)key * @return The new path. * @note The current implementation only works with named color spaces. **/ +#if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-parameter" +#endif -(nullable CGColorSpaceRef)newCGColorSpaceDecodeForKey:(nonnull NSString *)key { CGColorSpaceRef colorSpace = NULL; @@ -341,6 +350,7 @@ -(nullable CGColorSpaceRef)newCGColorSpaceDecodeForKey:(nonnull NSString *)key #if TARGET_OS_SIMULATOR || TARGET_OS_IPHONE NSLog(@"Color space decoding is not supported on iOS. Using generic RGB color space."); colorSpace = CGColorSpaceCreateDeviceRGB(); +#pragma clang diagnostic pop #else NSData *iccProfile = [self decodeObjectOfClass:[NSData class] forKey:key]; diff --git a/framework/iPhoneOnly/CPTGraphHostingView.m b/framework/iPhoneOnly/CPTGraphHostingView.m index fd27f232c..0c9866702 100644 --- a/framework/iPhoneOnly/CPTGraphHostingView.m +++ b/framework/iPhoneOnly/CPTGraphHostingView.m @@ -334,7 +334,7 @@ -(BOOL)canBecomeFocused /// @cond --(void)drawRect:(CGRect)rect +-(void)drawRect:(CGRect __unused)rect { if ( self.collapsesLayers ) { CGContextRef context = UIGraphicsGetCurrentContext(); @@ -347,7 +347,7 @@ -(void)drawRect:(CGRect)rect } } --(void)graphNeedsRedraw:(nonnull NSNotification *)notification +-(void)graphNeedsRedraw:(nonnull NSNotification *__unused)notification { [self setNeedsDisplay]; } diff --git a/framework/xcconfig/CorePlotWarnings.xcconfig b/framework/xcconfig/CorePlotWarnings.xcconfig index 5e89bbf4c..8c11ec296 100644 --- a/framework/xcconfig/CorePlotWarnings.xcconfig +++ b/framework/xcconfig/CorePlotWarnings.xcconfig @@ -100,4 +100,4 @@ GCC_WARN_UNUSED_VARIABLE = YES IBC_WARNINGS = YES -WARNING_CFLAGS = -Weverything -Wno-unused-parameter -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-custom-atomic-properties -Wno-pedantic -Wno-documentation -Wno-documentation-unknown-command -Wno-partial-availability -Wno-objc-messaging-id +WARNING_CFLAGS = -Weverything -Wno-undef -Wno-switch-enum -Wno-float-equal -Wno-custom-atomic-properties -Wno-pedantic -Wno-documentation -Wno-documentation-unknown-command -Wno-partial-availability -Wno-objc-messaging-id From 47989d7608ff7f0992cf6878d93b620cac3a38a8 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 21:15:18 -0500 Subject: [PATCH 422/429] Sorted the compiler settings in CorePlot.xcconfig to make it easier to read. --- framework/xcconfig/CorePlot.xcconfig | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/framework/xcconfig/CorePlot.xcconfig b/framework/xcconfig/CorePlot.xcconfig index 47203826f..f57ece3ce 100644 --- a/framework/xcconfig/CorePlot.xcconfig +++ b/framework/xcconfig/CorePlot.xcconfig @@ -12,23 +12,25 @@ MACOSX_DEPLOYMENT_TARGET = 10.8 TVOS_DEPLOYMENT_TARGET = 9.0 SYMROOT = $(PROJECT_DIR)/../build -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym + +ALWAYS_SEARCH_USER_PATHS = NO +CLANG_ENABLE_OBJC_ARC = YES +CLANG_STATIC_ANALYZER_MODE = shallow +CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION = deep COMBINE_HIDPI_IMAGES = YES COPY_PHASE_STRIP = YES -STRIP_STYLE = debugging -SEPARATE_STRIP = YES -SKIP_INSTALL = YES +DEAD_CODE_STRIPPING = YES +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym GCC_C_LANGUAGE_STANDARD = c99 GCC_DYNAMIC_NO_PIC = NO GCC_PRECOMPILE_PREFIX_HEADER = YES GCC_PREFIX_HEADER = CorePlot_Prefix.pch -DEAD_CODE_STRIPPING = YES -CLANG_ENABLE_OBJC_ARC = YES LINKER_DISPLAYS_MANGLED_NAMES = NO -RUN_CLANG_STATIC_ANALYZER = YES -CLANG_STATIC_ANALYZER_MODE_ON_ANALYZE_ACTION = deep -CLANG_STATIC_ANALYZER_MODE = shallow OTHER_LDFLAGS = -ObjC -ALWAYS_SEARCH_USER_PATHS = NO -USE_HEADERMAP = NO +RUN_CLANG_STATIC_ANALYZER = YES +SEPARATE_STRIP = YES +SKIP_INSTALL = YES +STRIP_STYLE = debugging +STRIP_SWIFT_SYMBOLS = YES SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule" +USE_HEADERMAP = NO From 427d5535d78bd379bffef7827c9107ff5dd6ee6e Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 5 Jan 2020 21:17:49 -0500 Subject: [PATCH 423/429] Fixed unused parameter warnings in release builds. --- framework/Source/CPTDefinitions.h | 14 ++++++++++++++ framework/Source/CPTPlotSpace.m | 14 +++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/framework/Source/CPTDefinitions.h b/framework/Source/CPTDefinitions.h index 61e4648aa..ff6f39eb7 100644 --- a/framework/Source/CPTDefinitions.h +++ b/framework/Source/CPTDefinitions.h @@ -42,6 +42,20 @@ #define cpt_deprecated __attribute__((deprecated)) +// Unused parameter attribute (DEBUG only) + +/** + * @def cpt_unused + * @hideinitializer + * @brief Marks a parameter value as unused only in RELEASE builds. + **/ + +#ifdef DEBUG +#define cpt_unused +#else +#define cpt_unused __unused +#endif + // Swift wrappers /** diff --git a/framework/Source/CPTPlotSpace.m b/framework/Source/CPTPlotSpace.m index efb3bdfda..644b1df79 100644 --- a/framework/Source/CPTPlotSpace.m +++ b/framework/Source/CPTPlotSpace.m @@ -505,7 +505,7 @@ -(NSUInteger)numberOfCoordinates * @param plotPoint An array of data point coordinates (as NSNumber values). * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray *)plotPoint +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray *cpt_unused)plotPoint { NSParameterAssert(plotPoint.count == self.numberOfCoordinates); @@ -517,7 +517,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull CPTNumberArray *)plotPoint * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -529,7 +529,7 @@ -(CGPoint)plotAreaViewPointForPlotPoint:(nonnull NSDecimal *__unused)plotPoint n * @param count The number of coordinate values in the @par{plotPoint} array. * @return The drawing coordinates of the data point. **/ --(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count +-(CGPoint)plotAreaViewPointForDoublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count { NSParameterAssert(count == self.numberOfCoordinates); @@ -550,7 +550,7 @@ -(nullable CPTNumberArray *)plotPointForPlotAreaViewPoint:(CGPoint __unused)poin * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint __unused)point +-(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count forPlotAreaViewPoint:(CGPoint __unused)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -560,7 +560,7 @@ -(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSU * @param count The number of coordinate values in the @par{plotPoint} array. * @param point The drawing coordinates of the data point. **/ --(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forPlotAreaViewPoint:(CGPoint __unused)point +-(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count forPlotAreaViewPoint:(CGPoint __unused)point { NSParameterAssert(count == self.numberOfCoordinates); } @@ -588,7 +588,7 @@ -(nullable CPTNumberArray *)plotPointForEvent:(nonnull CPTNativeEvent *__unused) * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *__unused)event +-(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count forEvent:(nonnull CPTNativeEvent *__unused)event { NSParameterAssert(count == self.numberOfCoordinates); } @@ -598,7 +598,7 @@ -(void)plotPoint:(nonnull NSDecimal *__unused)plotPoint numberOfCoordinates:(NSU * @param count The number of coordinate values in the @par{plotPoint} array. * @param event The event. **/ --(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger)count forEvent:(nonnull CPTNativeEvent *__unused)event +-(void)doublePrecisionPlotPoint:(nonnull double *__unused)plotPoint numberOfCoordinates:(NSUInteger cpt_unused)count forEvent:(nonnull CPTNativeEvent *__unused)event { NSParameterAssert(count == self.numberOfCoordinates); } From 189a5d5dbb132653666389fe8f4020c162485caa Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 10 Jan 2020 16:54:29 -0500 Subject: [PATCH 424/429] Updated the release package instructions. --- scripts/README Creating a release package.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/README Creating a release package.md b/scripts/README Creating a release package.md index 1305b5d51..bcfb6724c 100644 --- a/scripts/README Creating a release package.md +++ b/scripts/README Creating a release package.md @@ -5,7 +5,7 @@ Follow these steps to create a Core Plot release and post it to GitHub: 1. Ensure the following tools are installed on your development machine:
      -
    • Xcode 8
    • +
    • Xcode 11
    • [Doxygen](http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc), version 1.8.12 or later, installed in /Applications
    • [Graphviz](http://www.graphviz.org/Download_macos.php), version 2.36.0 or later
    @@ -99,5 +99,4 @@ Follow these steps to create a Core Plot release and post it to GitHub:
    • The Core Plot [discussion board](https://groups.google.com/forum/#!forum/coreplot-discuss)
    • [Twitter](https://twitter.com/CorePlot)
    • -
    • [App.net](https://alpha.app.net/coreplot)
    From 76de8e324d33124fd9be1070621ae9764a7045c0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 10 Jan 2020 16:56:08 -0500 Subject: [PATCH 425/429] Updated the change log, project version, and podspec for release 2.3. --- CorePlot.podspec | 4 ++-- documentation/changelog.markdown | 23 ++++++++++++++++++++ framework/CorePlot.xcodeproj/project.pbxproj | 4 ++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/CorePlot.podspec b/CorePlot.podspec index 7b09046c7..d6906a089 100644 --- a/CorePlot.podspec +++ b/CorePlot.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CorePlot' - s.version = '2.2' + s.version = '2.3' s.license = 'BSD' s.summary = 'Cocoa plotting framework for macOS, iOS, and tvOS.' s.homepage = 'https://github.com/core-plot' @@ -12,7 +12,7 @@ Pod::Spec.new do |s| 'Eric Skroch' => 'eskroch@mac.com', 'Barry Wark' => 'barrywark@gmail.com' } - s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.2'} + s.source = { :git => 'https://github.com/core-plot/core-plot.git', :tag => 'release_2.3'} s.description = 'Core Plot is a plotting framework for macOS, iOS, and tvOS. It provides 2D visualization ' \ 'of data, and is tightly integrated with Apple technologies like Core Animation, ' \ diff --git a/documentation/changelog.markdown b/documentation/changelog.markdown index ba7c20466..ed231ffeb 100644 --- a/documentation/changelog.markdown +++ b/documentation/changelog.markdown @@ -1,3 +1,26 @@ +# Release 2.3 (January 10, 2020) + +## Release Notes + +This release updates Core Plot to be compatible with Xcode 11 and Swift 5. It adds support for platform-native fonts and colors, including dynamic system colors. + +The Mac deployment target remains OS X 10.8. The iOS deployment target remains iOS 8.0 for both the framework and the static library. The tvOS deployment target remains tvOS 9.0. + +## Details +- **New**: Added support for platform native fonts (`NSFont` and `UIFont`). +- **New**: Added support for platform native colors (`NSColor` and `UIColor`), including dynamic system colors. +- **New**: Added support for variable bar widths in bar, range, and trading range plots. +- **Changed**: Updated the Core Plot project to prefer the new Xcode build system introduced with Xcode 9. +- **Changed**: Updated all framework and example code to be compatible with Xcode 11 and the latest SDKs on all platforms. +- **Changed**: Updated all Swift example apps to Swift 5. +- **Changed**: Added arm64e as a valid build architecture on iOS. +- **Changed**: Miscellaneous bug fixes and cleanup. +- **Removed**: Removed DTrace probing to support Xcode's New Build System. +- **Removed**: Removed docset generation. Docsets are no longer supported under Xcode 9.3. +- **Removed**: Removed the AAPLot and StockPlot example apps because the Yahoo finance API that both relied for data is no longer available. + + + # Release 2.2 (September 18, 2016) ## Release Notes diff --git a/framework/CorePlot.xcodeproj/project.pbxproj b/framework/CorePlot.xcodeproj/project.pbxproj index 74a0407c0..f6971f390 100644 --- a/framework/CorePlot.xcodeproj/project.pbxproj +++ b/framework/CorePlot.xcodeproj/project.pbxproj @@ -3337,7 +3337,7 @@ baseConfigurationReference = C3C9D08C1BB5A44800931F32 /* CorePlotDebug.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CURRENT_PROJECT_VERSION = 2.2; + CURRENT_PROJECT_VERSION = 2.3; ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; ONLY_ACTIVE_ARCH = YES; @@ -3349,7 +3349,7 @@ baseConfigurationReference = C3C9D08D1BB5A45B00931F32 /* CorePlotRelease.xcconfig */; buildSettings = { CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CURRENT_PROJECT_VERSION = 2.2; + CURRENT_PROJECT_VERSION = 2.3; GCC_NO_COMMON_BLOCKS = YES; }; name = Release; From b0b849f9f02499b8dcb089fe7ab11c4676de05d6 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 25 Sep 2021 08:18:07 -0400 Subject: [PATCH 426/429] Update README.md Added status badge for the GitHub CI workflow. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b6f54973..8ff2e7bbf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ *Cocoa plotting framework for macOS, iOS, and tvOS.* -[![Build Status](https://secure.travis-ci.org/core-plot/core-plot.svg)](http://travis-ci.org/core-plot/core-plot) [![Version Status](https://img.shields.io/cocoapods/v/CorePlot.svg)](https://cocoapods.org/pods/CorePlot) [![license MIT](https://img.shields.io/cocoapods/l/CorePlot.svg)](http://opensource.org/licenses/BSD-3-Clause) [![Platform](https://img.shields.io/cocoapods/p/CorePlot.svg)](http://core-plot.github.io) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Build Status](https://secure.travis-ci.org/core-plot/core-plot.svg)](http://travis-ci.org/core-plot/core-plot) [![core-plot CI](https://github.com/core-plot/core-plot/actions/workflows/ci.yml/badge.svg)](https://github.com/core-plot/core-plot/actions/workflows/ci.yml) [![Version Status](https://img.shields.io/cocoapods/v/CorePlot.svg)](https://cocoapods.org/pods/CorePlot) [![license MIT](https://img.shields.io/cocoapods/l/CorePlot.svg)](http://opensource.org/licenses/BSD-3-Clause) [![Platform](https://img.shields.io/cocoapods/p/CorePlot.svg)](http://core-plot.github.io) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) # Introduction From e5130f66066a6b2eef9a6b96971b40abf7c904af Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 2 Jan 2022 08:09:30 -0500 Subject: [PATCH 427/429] Update README.md Changed the Flattr donation button to point to a personal account. The Core Plot organization account cannot receive funds because there is no legally-registered organization behind the account. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ff2e7bbf..5d144acc5 100644 --- a/README.md +++ b/README.md @@ -52,4 +52,4 @@ Core Plot is intended to be applied in scientific, financial, and other domains # Support Core Plot -
    Flattr this +Flattr this From d31fff9b20cb62c0d3f415127cc3c07a16dd37b2 Mon Sep 17 00:00:00 2001 From: Mielie Date: Tue, 12 Jul 2022 09:30:07 +0100 Subject: [PATCH 428/429] Update CorePlot.xcconfig Add arm64 flag for Apple Silicon Macs --- framework/xcconfig/CorePlot.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/xcconfig/CorePlot.xcconfig b/framework/xcconfig/CorePlot.xcconfig index f57ece3ce..e7f5cc5f7 100644 --- a/framework/xcconfig/CorePlot.xcconfig +++ b/framework/xcconfig/CorePlot.xcconfig @@ -3,7 +3,7 @@ ARCHS = $(ARCHS_STANDARD) VALID_ARCHS[sdk=iphoneos*] = arm64 arm64e armv7 armv7s VALID_ARCHS[sdk=iphonesimulator*] = i386 x86_64 -VALID_ARCHS[sdk=macosx*] = i386 x86_64 +VALID_ARCHS[sdk=macosx*] = i386 x86_64 arm64 VALID_ARCHS[sdk=appletvos*] = arm64 VALID_ARCHS[sdk=appletvsimulator*] = i386 x86_64 From 193227944581d0d77e98b6e6fd4185776216a60a Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Wed, 22 Nov 2023 09:43:44 -0500 Subject: [PATCH 429/429] Updated the readme file. --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5d144acc5..b0b803087 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ +Core Plot logo + # Core Plot *Cocoa plotting framework for macOS, iOS, and tvOS.* -[![Build Status](https://secure.travis-ci.org/core-plot/core-plot.svg)](http://travis-ci.org/core-plot/core-plot) [![core-plot CI](https://github.com/core-plot/core-plot/actions/workflows/ci.yml/badge.svg)](https://github.com/core-plot/core-plot/actions/workflows/ci.yml) [![Version Status](https://img.shields.io/cocoapods/v/CorePlot.svg)](https://cocoapods.org/pods/CorePlot) [![license MIT](https://img.shields.io/cocoapods/l/CorePlot.svg)](http://opensource.org/licenses/BSD-3-Clause) [![Platform](https://img.shields.io/cocoapods/p/CorePlot.svg)](http://core-plot.github.io) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Cocoapods platforms](https://img.shields.io/cocoapods/p/CorePlot?color=bright-green)](https://core-plot.github.io) [![core-plot CI](https://github.com/core-plot/core-plot/actions/workflows/ci.yml/badge.svg)](https://github.com/core-plot/core-plot/actions/workflows/ci.yml) +[![Cocoapods](https://img.shields.io/cocoapods/v/CorePlot?color=bright-green)](https://cocoapods.org/pods/CorePlot) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-brightgreen?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/SPM-compatible-brightgreen)](https://github.com/apple/swift-package-manager) +[![GitHub license](https://img.shields.io/github/license/core-plot/core-plot?color=bright-green)](https://opensource.org/licenses/BSD-3-Clause) # Introduction @@ -17,9 +21,9 @@ See the [High Level Design Overview](https://github.com/core-plot/core-plot/wiki Documentation of the Core Plot API and high-level architecture can be found in the following places: * [Change log](https://github.com/core-plot/core-plot/blob/master/documentation/changelog.markdown) - * [API documentation](http://core-plot.github.io/MacOS/index.html) for Mac - * [API documentation](http://core-plot.github.io/iOS/index.html) for iOS and tvOS - * API documentation built with [Doxygen](http://www.doxygen.org/) and installed locally in Xcode (see the [instructions](https://github.com/core-plot/core-plot/blob/master/READMEs/README%20for%20Docs%20Install.md) in the **READMEs** folder for details) + * [API documentation](https://core-plot.github.io/MacOS/index.html) for Mac + * [API documentation](https://core-plot.github.io/iOS/index.html) for iOS and tvOS + * API documentation built with [Doxygen](https://www.doxygen.nl/) and installed locally in Xcode (see the [instructions](https://github.com/core-plot/core-plot/blob/master/READMEs/README%20for%20Docs%20Install.md) in the **READMEs** folder for details) * [Project Wiki](https://github.com/core-plot/core-plot/wiki) on GitHub * [Documentation](https://github.com/core-plot/core-plot/tree/master/documentation) folder in the code repository @@ -27,8 +31,8 @@ Documentation of the Core Plot API and high-level architecture can be found in t ## Q&A Sites - * [Core Plot](http://groups.google.com/group/coreplot-discuss) Google Group - * Stackoverflow.com [core-plot tag](http://stackoverflow.com/questions/tagged/core-plot) + * [Core Plot](https://groups.google.com/group/coreplot-discuss) Google Group + * Stackoverflow.com [core-plot tag](https://stackoverflow.com/questions/tagged/core-plot) ## Social Networks @@ -40,16 +44,12 @@ Core Plot is an open source project hosted on [GitHub](https://github.com/core-p * [core-plot](https://github.com/core-plot/core-plot): This is main code repository with the framework and all examples. This is where you will find the release packages, wiki pages, and issue tracker. - * [core-plot.github.io](https://github.com/core-plot/core-plot.github.io): This is the HTML API documentation. You can view the pages online at [http://core-plot.github.io](http://core-plot.github.io). + * [core-plot.github.io](https://github.com/core-plot/core-plot.github.io): This is the HTML API documentation. You can view the pages online at [https://core-plot.github.io](https://core-plot.github.io). ## Coding Standards Everyone has a their own preferred coding style, and no one way can be considered right. Nonetheless, in a project like Core Plot, with many developers contributing, it is worthwhile defining a set of basic coding standards to prevent a mishmash of different styles which can become frustrating when navigating the code base. See the file [CONTRIBUTING.md](https://github.com/core-plot/core-plot/blob/master/.github/CONTRIBUTING.md) found in the [.github](https://github.com/core-plot/core-plot/tree/master/.github) directory of the project source for specific guidelines. -Core Plot includes a [script](https://github.com/core-plot/core-plot/blob/master/scripts/format_core_plot.sh) to run [Uncrustify](http://uncrustify.sourceforge.net) on the source code to standardize the formatting. All source code will be formatted with this tool before being committed to the Core Plot repository. +Core Plot includes a [script](https://github.com/core-plot/core-plot/blob/master/scripts/format_core_plot.sh) to run [Uncrustify](https://github.com/uncrustify/uncrustify) on the source code to standardize the formatting. All source code will be formatted with this tool before being committed to the Core Plot repository. ## Testing Core Plot is intended to be applied in scientific, financial, and other domains where correctness is paramount. In order to assure the quality of the framework, unit testing is integrated. Good test coverage protects developers from introducing accidental regressions, and helps them to experiment and refactor without breaking existing code. See the [unit testing](https://github.com/core-plot/core-plot/wiki/Unit-Testing) wiki page for instructions on how to build unit tests for any new code you add to the project. - -# Support Core Plot - -Flattr this