From b2becb1f025ae6a53ff3f2b826ceb1a715a78564 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:35:02 -0400 Subject: [PATCH 001/328] 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 002/328] 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 003/328] 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 004/328] 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 005/328] 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 006/328] 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 9c58b276a4632102535bc27a68543a1daee3c0b9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 11 Oct 2015 16:02:39 -0400 Subject: [PATCH 007/328] 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 008/328] 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 009/328] 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 010/328] 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 011/328] 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 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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/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 zcmcG#2T)U87d9F&NK-mQ5DXwyARtY8$AB~erANAy2vR~*YNVrpbVBba9VsD5Z_+y` ziZtm(iXfr>hxh%z|CagY&b@c$XC?#LXYalCIh?iEv!3{Tbk&#A4DH@-vbRAX&K)Tf-qH+Q&d3&MXbj^6vJx}8IO8F=T_u8rWM z5EE6NpCvq2IS_%pL1)dnf{oT8|AU_oe*3-joCDo-8xuVY1pm6(qnAtV@WNNg@hlt^ zolB}H%K7yBmNv(A#W(Kw*Q;M&Q3jbBbi6+Gs`e_wjMZU?gU=P_;h1mtDt|*<$&6_T z!)4}jczaMJb4y?Mw_+rI`9p5CzK(rW=@>YLBT@!ImkNj}<~?nC^>KyUE`z zxqdtTwXg?=V8|C}2BtgH<6oBCwVwGVPI$%}!jnpUUVX-FG0ATkCf{E{i^X)hSDx+(m?sV- z^S-6)T6%i0p%Lt1a{s|x){6jX*+tketai%1EF$WGL0Yoixue?Y&d1O3D^Kw{&kpy_ z>;^ln7kTeiIlVvOn6$9Kd_ELJ$eVgMJq);U zsGGnzF!m(kZ$SG!8_|pgikBxb-+Rs=zy3z9X7LaTzL@`#igVI;{Y{l)Tj1spBlp%sG-ue>;mF*~Xt#>`_;qSL)&MrF!4|wV9@Zl22Z?em+-i z^^S@F9DvkC&Db3TBB#Cj5P&f0w?H6Pkh+TE6K{eoKjJ{nr-_~(LzXyh?m|loHJT?z z3Xjp@7Amu17S|b!>1|v+RPlz>U1Gl@E!+5uTXSLTgk<6D>Ku}tq?$t_EOv$Co4Wz^ zLz^$P=RTVHnYT>K%4#MqEjOPhb%HCVCVaG?Q{X$b4tlsl*njDF`1+2Y6dmf+L-7p1^uwB# z8!vqWG|HZ;LR8@;mlMX!jMWly&_o{Y%}t|f+K8P;qHt@dUzW@v4%r;jJj6X{elHuD zySe`HQ-9_Z@b~72DjmPE6OF__;)TfKsuxXT8#ssPZin-{+DVUt4>9F-CIKG;%OlFU z9~O|KWBk$&v+i4m4zV&cwj--4;RoEbr@vM@QU}sK__KcaN|?9{SLry*rS}dP_w4r$ zhUJO_%Z?3MHy5r%K1XIOOGYq zHgxYVoVs+scP!N?ukt;XOaE%qZ8;#8L^&5G68*#);r4F1{csU zguJP#3CkQLdX~|}8-i%`WTScqdLGFd@P@!f(?pZ6(q8W@H(A)+(dYc zdk#)Zl(oD-;0$nFI0IO83}Vy1)Vcx1(eXQzesSDzOZ?38Y zF`VORNy0zR-2fd-23zk^Y-oU+DlAV6AM zJ?0w^X`QQotQpF+YgkAg)bcVX<%ZULg(ieBU{2{iBc|0n^}kK5VSJegp&%iQ+=FUT zjL@hh)1>Hs;qjCBMJaK~N@dOy#jp4zUKy+#-LC{8gou0_sv!;5F-8|tgpuSjCx^hm zu;VcRs;Ha=Ey`F_ytiF9TDjpIl zRLfX?6r0Qa_-)NJh2sRy@C}!6);?F`HKlnguJ5VhLA$&fRFex-iU~{ABO$F_nsp*h zgbVsftRFkr&^$f1Ipjf6sW0qi!0koA0>l1aEzqin8c~(aa%cvYGTIA%rwdvj37-+@ z`C5MTj;ZmLNRBjz z^l%ezmx%fKB7Do%+h?Y`_Iedh9krlyJkVt31z}G7{U8R!&(r*C1W0paI3kN#txnX> z*MkC6A%-wI#Yva|zJ>sPH_Tj3rv-tpe!$O^`ytZJwoS%EY73+C4kmn^rki2f<(_~6 zlku)mAIIi8z%aLA;}puWOr7FwC)i5#fowZnKh?d^N-H#Ju@wOucX3cfe?Gop#={`b~(u(DQ)IA1ZN9^gEK7mEoy@@IRPh;5!z+`Q6 zjNq}ug&vq!dN=CB#ne%2?WY)am*v_w7KV~SeOho(qb{{kcMdHdN#2lnQXcIsxY@S0 z3`NFQ!1;_B$SeCX$k-|KkN2s+Q*Ng3QeQdXiN-hD$e0m_^YN3$=2IVM`Lh%2+q5@g zo7Ug^fsFQ4h^ouD@5S*NM#fo)lLD8Ab*aZ5yF;Y13^UUl^wUzzya{XraS_&QM}@W5>u$nlNn~(Ta+0KB)RvP*>6F)HxgSy zc&SyyBvpjuv?uri$o1L79o@n$eA9~!FBl3{s3w0=wH-_7R-6fFMzDVDWkc_|=03xl zrqKMe|12%3H0{?5aiWX4!brM%B3>=Ow0s2C)uNz&8$)~8H`ks(l8gB-hWh8w*NDv? z0`H4K8ByL28AIN#C0iI$mDSgi^lCu(2|LxpJl9$bhlm`7GOdbxpz1@9$4vJ*^2SV# z0KdR&ide0a1P{Z4zIybtp^IMv05GEDqSQ|5X4`w+IHHjdR!5ypK{40Ktb)7YQ&bF$ ziEMQ!w(yg}!(>eU;p%e{u3f36TaBuEm^2oC{-(E&rmK~;%sOER9SR4K2{8gD1%-s! zfCiI;3liBZ9RcUYUu_TW9AwtLR5)04RK)?f$Ao&_aZohii84e#vTklFs~~(fc5E9S zQ1s_-xX1V5`mC>mp{g47&?G{Ok52Mxyq=7&BU}A=JNi1Em8$Z}aSlWf?y`Uv>K^N& z(VUHrNXbVZy3{giF8D)W$>cq8e-BR@4W?uQ8NY{#@k7L;TnC7S+z)72K2~X1sH(4x z5w+fvZ4xDZxK5MJ$KbF|PsFN55;Y7{oR|hSZv_CYKC-flFcO_1u&CMUb<~}!x#*== z_Gvh`emMgCOiqRn3w_!G_e#A=fYHH8v_MnLo}@yL(98B7iq;n>ZW7yp3#|!$bHn5u z-prM($0aov2Che4+i>|n#^0}&@4b~(b!qA*RShCz_$HTY&Q{{Mv?B}-1hdrBvGA(y zi3TwA5b{$;J*Vy-EuiZHwwJyyG*$Mn!j=p@y5y5hUUZ9za6H>B(bV4}k9Z@CzQ>d} z1Kn4wPQC-9Yc9$+s#N$fQR^>@=(-LnTEtWpglW2d{P_|c5E(}`&c187Yp1PJ8Zm+@ z8&&DVkO2QYL!#WHnu}2kmY-I)Bw|GK!0YMNs{<{I=ohB0#gJ%aw5;`?Sx@A}m$uGu z6O2bGeA%Mm2)76qB@AG}QE~K)Y@ak@S^NYsr~c&&Qh0o-nx+&cH5@2v@s z#yr%pWHh7IJPZalkz@owgnYR{p>$9S1%jl;O&CBD0cK^IUjMAYe%S_q6PH+%)E)4J z6pHQNWn8!-`cjxJ+IVJklljIReIC7dOGpBzK`^WK>=zV9QA$giz`xg4l%}Y- z?v*juM5&FkBg(At!VfautaNBc_m}%IGPQQqyN$ruRijX~(aZfmP!t$o7_9Ng)*b|z z>r-qDrxO^Plu8nGAD6V3+xmswnn}(fF!SXj-e%XUQ8U~$Y97#9&Bj;8FI6MWL$A94 zhDL5?rHei`G$eit=e8AQEc@WWZ@#j!sH1&B!_r`^fOEJQm1?Cq{kF~os-2J5Ck1 z1_2gSEn0p`svHYz>!ZW%0|7jEgvox>#Ncg@!xcn`HmC*g%68NDbmX4o-NGx__%+W7u zDgGLwCVHsNHY|?=6x*89eBI%KpQV5CV@^K>Jd(quxI)n+ASv3`b#lbEej^5!!T~>I z43BQliQ*!GhX#rfKdV7PAU(FpRJpOOqio@v2Y`QoTc0W?v%vIP!RBQZuK#oVH`}ng zsx%T4(+bn_j*#W8?P5R4k+JVJM?-a2{KQW0C~JX#Vt$wgP(%uny^<5@&~V zV|H@22RU-5Cr5(jjK+gsJ*MYApiW2WshCZr7`9bg&bKzdU;3xD{EX8Dd%_V>frEyS z@O+-i=Ia<%<;w5`@PQ!%uSOO|>apC{v1z@xi7Uf;RBKAhZ^lo!4TnDt+e~Fe6nvNO z*KS?>MOr#+SaRP0STb4xau1q5HCObim`1!^*Gn{;QpX{WhM!L{Ax|KmdTkVVq0u(Y z!#o8faZPG>)mAojaa3!gdzO!=IW}V-#tuvaPB)Ub)RDlhHpTXiHMIi1u9OY$3FB3b zEmdYx6gH0;3sH!PrqqvQH4YO6rn*x=9(0EVT1cl@P2m9U^_6`DA(WMp)8s|lu#Az! z;eqW8{0ilpq6chk`P3W-hdc<9KWoQAzydt}+X7;u`!p>k=-3|JO9(Nh;ox(xR-#%4 zto89Ggs_psC8mliCg|{@d5Ru0gtDp`Jf8vU$`z30rYjlWLbDpDI?$@%695EGW@|}; zwy`bL`rkBo*YJ)Ek`9&b!OPOj$)Fe z8{^*Ah(=O~31sjv`VOie=xkQh6Erz}Da@@GZNuDcUS3}IcGk1C^bo`V# zq_4gBHviZL8$ucJ-KhFj7m?BFBS=~88Wux&qp&84ypeOilJ1DeB0!P+2ol?BRiLd@ z4$^aZFAmk(-~dP?^@HS__CGw-Hna5Cv0ClOjTe`1-n>bnoe$yney5K_BJJ#okOhU$ zFUnu!0l?$~=_Y7?hQd!`l#JW7m=we3T#bIK$2~Y#WcI7lxpM8~@6l0QUceo1E$X#Y zT8n$&-kp4Ek}L$;CPV3+FtcK{umcc3dg(Rp*fNrK_Y_GhR%_=xWQ+!08BxLoAcmC2 z5A*m7Swsfn+a!Me`SOQ^OFp1!NArzB%tIi402}8$ys6Pcw2k=~$r#{){5}b`9BM0# zg(TKl_G(jFx4Lc+<&8PcySeTGyPI~-RztVP9^y!8d3~%`tUT&>b>kvKUnbHFGG{CJ zBomflwuCzdUJ>X2Umba$n7PB>3<#UOw}1=rJtJ(GR|ZmFDEhzUyZ<{9=>tovN35R+ zYgTyB!8(uW#O*;!4D&Ci7aLB1o6_o!E)U3T=*EO&^6_wa!4fV#&s*as8n%Btk&|Sz z_OfE;(~nPaTd+B^ZK+Y>4u0lLI|*3Mx}75@ST3-*{Dpp}xaE=`PS3}!6}zkf7bHk} zu4tvGVgL^V)mh!AoyH-hztCdjoc+mOIoHn|Lj@%*w@RGD_T2n$6K0|XBsW!v$ z?oLuEhYQk4jbc-@A&N&40G>5wH5?P~n0Z-E2x^eA*|eKPc~}JwL-S!QMx1L%EDQkW z4ob7#r43vhYx&<}U&(X353dPb;@{ ziJmL4U|mMdHK67$^P5%=w^>EXkLan@mA~haS&d39aykLf)M^yhhRz*@A*x1Td7}(q z|L9h;u@gA5K!AsC^SU%nII@Xg$9`>Nqn+g@khY6WN%70QBgyGy;JOJ?9y4J!oL<)8 zB}_(tt)&o3MxE|e+)gRJy~ztqx1)D0=sTNGGJqf>tANtcY%`Nizwj z-st@|S47Kbg(xpw8%VM6m3rMDwP=>Szf1y@3yhsj+1^V)K8EoTRBYFBz5hwJAtWQI+4zz2dA7X&8A-dY! zEXQ<6*S6`V`YQUi#YaMO2eDiA^BmHJcpbO4G8c#QGBn-iD08CY`+;z7MMeSK$sVu6 zIr+2Qbny7e>XUMG{NL3Rh_y)@Q6iD&WU?)LxUi%OD}d9vdJN%~_Jp#SbZ!L6|N62r zTusF>tzsAhL_pC1mOh%}%`48zP-I;@8-Aay6(5qBdFR$>pAMO2J3uyV^Q9<*dp*k( zfB=eVp|B-AJG^4MN>WkWBY9{^mDm^4WGJ>TbJOs-u#NLo-NE!TOl`0lX_;LQjg}(Y=B4r^V+v7iP9dTL&FbQq)t;bzI%k zKZjPiviSaPR|~%hPLTmrD+T&PX8se+Vs4EdNBl$>eAbP|S$ajgyvzn=d8yI%!?C z_Rs&$UG8>JE@=iOes}F*`TNnZ=_3~FZEsH!t&t2npZ)D`=W0f3>Y4F|Pv>gv8NxRi zprWG_9bZf@lQ*ihX&@aNkF*Yw9oI~{7=8$E{Krb+q2P=2vX}^jJN%k7*qfgJKFlia zi9JCpoJT;upQmT>4M>;)heUH1N-IuKE5GGr#oV4%k9MmOc0f(!U8L-Qb>A$qnHEX}mbRJ6u&Q;!TA$mLXnvNl=Mrt)Z`vfidW ztT$jAoV!PY!*PwhbMxi@@q#4xnUn$UT+I)qW$}K)xIhD!*OqI7c=D|}o9`h7wGjP+ z+JhkIQ|&tJqGN@xguZxynT`Lz{hm^zDyyDo7ShA?YWyZ8&tTRZq=etv)4G29LDRa{ zB|huYXU^|$o8Q68;M~bny`!U}=kK2aj*D)s1jIjFI&MN>#^;?r0i;lyb#aSE z<&7Ia@uu37E7NL*oax9OKG~Ynk>0LBRx};uLC@`#s8ht-o_vvKvqXkF(B|V!IjeCJ zUb{=s%j3NsDC9IJ>`tUH;VLo55)~m=av0SA*fNZzFortLBBVAiY&$srv(R|`3=XQ;M_@8dCrn^(@=;Uc64CfeS zFRg5p5YJR5xbmZmz6oSp^3iNIW?Z`_Zya*@q%AGk!WG{weUg3y|Az^6QOV! zbtO-c|K#DYf#tY{J;vl!P4!Mr7vycjv{Q8OOXY5 zSgD6-&;R|Nu>V;KGJ?K{q<7I}|&xkiSOAN}|U(6q5U7i^>?&2f^p0bFlhcdDrS=%QMKkL0#}SikeBONLKpMv?!#=7&}uV zfH?aNzkA5dlvioY*-khAr{(;>{ImDo;k0>7$-r)d?_QMo*|K23I;~-k+ZCFvs5@Pa z;c=Pp&B6kOF96E=)*@E(wwW6LAb`?A)xRyW;+H-LE9Y~U=X18nh|rGftUVh`JE2$i zU-5c&(`A%hLJm%Cmg=y9p-=9PbE9heQ zl7#YnS?F%S2eK0!kzK0B{u1O}7YX77E zXaVs0j{|F9TF6%PBI;m zSh^vpjdd93Vpg+vc784aGDEw3VG9eqZj4$s0W-S=3iG>(2RQ=OKrc}R_$q63QrAW# zy5<#+_PTbfxJ!= zAq?B(c__(yfqMUvZfG9kRgj4s9twE#c#+O!uZ}-@&Ntw=1L|@Ef4mf9XOFh0xT=fg z4iK)iR7?j%uC}-?b+2XxT;xW9e&7yWQ|9)Qm`TBR)`n?w*((ekW5~`~iHF=p#__Ni4SWCv5hm?T_-k}G$hJPw# ziV3|VpnosTKs>MN%LOF-N=nHvux|AbLCx2*D#o)dJNXVy{$srBUKb?lOPJiBoC?2f zWKov?$#B4hd-_zcYu^eKfvj5d&^d@Ph)BD6MVx%gBhfQ(*2J(W%?Oiz?UO5F-rp0L z__!SZW;u#f&hz}3KHNt(Q-rTUS^jZyb5#u&^M4OGIzG} zV2PdHtn3Ig{rP&Zj{klZlzz3PgiDgzGpZ;3Wv&`Zhdm?yd@1uXKfYZixcqN z(>(2VX(O;10)%2}37Ka;?)`j)Xv$*?`yp{pQATBUA zySA>5fpVrjs8=um-~Y90zMCOcG@H;HcRd>RC4~1>S#it*byYON-V<5gGOc@&>Lyu0 zS^y|JDu)d~#9Z>{>pDwSW%jQ8WYbkkN({!gncuhPE6zb%hRba+-p}Z7c{H#mc+;>8 zPEJVvs~d43Ds&`r`QHBh=aKlpHJ1jypKC!SPorh_)y%eoON=>f&CVl>takG!pCDpH zD@aQNHLpkdxPsfj-I@jCK*1{|j=q(%O5!6wrHW$IPJ*V0)<+?Fdnc!^L2|4(k=uBo zR!2i<3$V}jCkb?jhzLoxcD=<;CF&f)G`~Eto%;adA~q7@R4{#1^ZQqex!sJ%m!TPm zV?9_3J>(fi#YK?2wF=zYzg}IG`RbnR`F(0=q(6@R&cQGh=f04qCPiiI zJtv3t%>G-hUv!5QE!3iAMvMb*_X9}tE)la(XW8ztZg|lq$sk$2-yszc zcQEOJwarr#Fkrf!{Yg)jemMNpaSJGc1H_%5)0`=Oi89ozGy1%%IVGUnV|-JBenY+& zzw}bzQs@S8hvIwuTx%<(u4rh6tE1V+O1bcn|9mD_tHmNE)FY>ZwD_i zd#_9SS1jt@)REZ>ULDRfb067EDG@v%{_+&CnU17r=$<@zwHV?Q=wOo-1-hrj5Y93- zCM9s3%ST3-@3AM=6DeI7z4C^i&0?Y|za$kc20yhz4PY^XHn=qfQOD?L6{^ti#f)ZH&R3A9hFZGgGZZ`;sd4Ar(6hr)r%duXw9*{d&atzg% z>4tURVr5oMS2~u#X-T7W9>!=)o*zJlF&Q4%J~7FloCS0YKjN<{WD_a+J))E zZvsVpT>`vl0bOf3W`60XtCHO*k*VET)rabSW^o2{gpM;!(v^}AfX6C+u9o1P*3L7K z@>k>nhLrhFw=&bN_u~P|> z#gzOEtTCl~!^-TiPJ{V$noyiv$BICWS_LK7Byqj1V#dX?_5nNrHBo&{jhXwPm_&rF z>sQY36Gw7o5k?7Z+V$hjZO`yp88ISz`X;4>uaYswtreh@nhAdmp2`zF+{`WZbs+jgMPn}$N;VH z(Q(b|n*(pO`d(?IWo79~J(hB5wa`_6T-`Nr5E>a489GSJL0&F#dfX!)EuE|l>(+)}usmtBuukmtXU= ztkft`A7pc&yP<_I2P~+t4q1gZ7EiZa81SiY295ZP84TwO-h&cTE`aIQ@)G?6?;d&cidM3 z&y94k%&Xxqv)7J`=}#%5|KrJNR(x^h_+p3wfCNJovSw;Xo~?rL)Lzx3|7?ZVcs zNX!!4kqhu7UFXIU24DxKA$ zWiReW^0onQ2Y=`!Ju!7i5lSF>=LFC?n&>atm@_A~*M3V0+Tca!-+ccetEF_k`@sv! zUph~bLe{p|R={rgG>|(>WH#;uZd54f*T$1b`nDR2WlF;Vd_9r-4kqX}<8G(ukN!%l zE;8Raq0{cUhOfhX4WYOh-Sm>*D!cBJ6G+9mxVX50^XY&tellY5kicZlMJ~QngC+C^ z^kO%xGM-W)K! z+mCihS{Q2?nQf*aDQ*zQ{%ggzYNcg?KBL;vHjU{}3WzynzQ?*0nd`w1^p`Zke&6++ z$L`NBghAytit}LDd9;q-hCX(35y<-_hg2;5sSdR+c8q+_&?iL!C)~`>&Q}92?92ww zMi#y5{#^DgKxzBRq@xuirun*(evtDz9U|a6kf%xyeA1*h|FJEoF`uOqVE(fDJ zrR$yy>6vfaXr0n>3~jL#nbN!$4Ff2+^)*u!ZRfiW)qTCT3&pVolRlBpCn(^?iudeU zW3-i6EIOaRDW3|{#esm$_L|H}E|7-JP_zY~ zESEX3wka#mO6S?)Cj%NH1R)Spa$XZsDLP!);ziMd%h<|d*s{(9h}K_eQ5S2I@_Ec4 zKxB)AXzkg8JUnKpTA4xgq5NX_T^Cl!gMn7`c*!wmlT9y8DmNJ%ImSn@hK-Mv7m-|P zx1REUfjo^!Ta|fm(~eO>K#0#Y0kJ$I@Kj)$<@1REANpH&#p>}?+wb9ychSIOCEDHJ zFKS9`DW^9ivj7xvPjRc6uPa+xD|~yY0=V`b(A>Vkg*g`MkWa$@x@?>~kJd$LJtj6& zkCcA0m)7lDcsJ_eGpfwY^Vs1pb*k>17*hzp9*{5>6fP0I;Vm1|YD6}#V7GQ_*&{L0 z1y_`4V`X%S7y^J7k}&DTopC($^@4`fvwHV&K53-*)925`A2%1&*xL^m@zamjPKu3s zLZ&=u#T=|X%3Cf@Or0BuPMyqDI77O;c7a?HbKm-Uxo)d^kkMTFMvQeZ_NCI%JBeA4 zA3wH_z}%O)J~r(BS`YDZg1p<5Z&Ng^vGjS(tLnnB4c)R2+py9lK*E?&RYX!g7A562 zW{J8dg%}+5gf_3(vp7v-=FjlM0W0{B%j1|!?BAcStKI-b(ajIMFcYxR<{DdaApihx zZlD>Fx9!T)t`n{hyZN(etUwcTvP(-)dpeW|pP?BG#o@MT0bWL)_nkuU>q5NPV=*sNn;NZ}v&*}1>jzY%j zc?3%m1zCD2uha}@e6PiCF5TE`VXd8c7UfMxCN~@^>@$Tos`aT9+-nfl#iWB>)4f=U zN+e5Jh5HC|GC)ReGeI8dZ`%7AX8ywgiA}j4j7~_I%oPAtu=Fu1P=9AX7V!E=tMqFt{Q{z@fNU}X@SPc6&RO+znw=TZfowdgURR9o zFdLzxi2}|93NsVd82A?QUY|@fhOpbq9?PNc`=tVMIBgr5rg8Etl{cWWrg+ZRvD)5G zCB5cMcBy;HhQsT?T!&?QaSZisz0vQ~^Q^GP^tXlNLNIN4^T~$v4))q zohPNtt^)J-nw5%nSBLHy4?iqBXl5r~-j7k0KT`@toQ(#RXaGg8W`Dy*Hyu_QA))wFT+^(FktoS8w zBy(IJVC=pXaEB*Ez~bC>0914tEqi37NwN!j;k&o|iWM9uC>Pze7!^~#y2``I^(!KW zaOI`CZo21+Nc7oynk=@@pI<>O;+_*f_ct{!G>^HsO3gnqW@AFj+^866qecJD7;wl$ zo5~g_qFoUt`~)e=waTdtZ&uFQsh<6m<8S>jA#^ggYatQrDa7-eN7*aeq4M{i0hf;5 z9o5;}KR?s!0m9|y?KPxVO6Y2EyG?RyLF@~lmYy&Sw58jScdBMR2%KkguAG1Muu3D1 zpGMkIvN{SuQ?5n@0i+mw^hldmU?uBh)+s;DyFiiw0~Du#2%1NORnwEyjI7raKzI17 zwjd(n)MxlU!`#U{tjAi-xORtFQIcFEc%~mZp251&|IZRQMXX!5Y+SYn=Urx39Jka5 z#%M}??2aA>D48V}){SQ<#E=0cL93UtId_jwhY$ka?3CavmO1=EBVReG8vP+hPW7{) zUY1KgL_?>_Ou51M#ezM~}z|C{;^l$j*^O1rWroQ;uXAw?uynP4WTZ=rm8 z=h;Pu?f1*MLT;GpW<2RQ*X|xhiWwN*{KJKwa42*!&L7)yR9kUAo^_G1x&1WL)%CDr zy(sIVNB%hYH4~X0Zo~B2q3@GMLn~tW83y~qXU+$pv)6mJq-6)ZbfgEkP~4RcGms1Criz1i>d4_smi}R-=CVePiyXNfA%*0y(Rnd&mJ}N zgD?l$@QKj+7sN)c7lp2TaF)FR;~ztTkXg&{zgoZWU4Zs{6nmPaD*jtflP}Q5Er_0V z*POA8Rgb-l-dAE#)tnH@0tKpHRWTKmMS=K=25&zX-@-hv%|GTtNRww-855iNLAHf4 zF)vupz{Kr&!EQILy+bW0c})E3{;FOLI@ zySQF3rl#3WBL-d9HB`DecSrX|fg>BI$0shn`#q=c1zXPC&N{)2EpjoEE4O40DTzz= zrbN#s8}_u;(rU^0ewOYdd>geQBkr_Z z^&K6eI70nL`*+2U>ea56QThnSM_icoj)=jQiUvV%+xquXNW-~+!^Gb_#5Wyv% zei@W7)lPt{$wd4Nd3Va?LeEjI)eX7CZI*ZFDsM*p&V#14P>^i_?ke#2YdP>h;Zd6( zlQxu)H1{VWtb+_jJ{bKnVj289sy_eN9MovQH0q2lv9=Cj+vX6eo z#U5ZxT|TrHc)uwaWA9mNk+XjZV9$P|k+ZW^`Ir*O-T~qC>+Wt&##Z@&2==Ur6ZiV0 zA4YB~sdkZ#McPXIE4+b-3`hPt(YBzM6S9ufD^L2f@J4)T0T;*pd#%?f=h^9l10^ns z=Lu+{AcEbr{v)zG*ri>j1RdW+TAByq>4|ZuvJ)M%3lhjX`p+Lb@^zsJUP*n;s-9f# zFJ&#pN4GWnMe8>{Jo>4|Nowl!M8tCz@v!`5=}`A4Pn)cDlsWw>u?0IZ$(SK7E(IKU zvq+@p2}mC-!*8wZE$Qw-q{kjd>+pX zan4pr3OS+A4yHHx6h~<+CQPWP86x-;NKkB4jVsn9h#GKi2MqK%zrfqA^x~nrJAuF5 z7g^m!=XEu%u?^o_N}uy87;F7S93^^C7*Q3IDCcBv#Rw>ZtJG4xT_4aQG~Jzb!=20mx5$fnzHTRsCQpa(zt}0lqJf( zjgNPDU9`a(NT~z|dx~u|0?Uo^0g|HFT0MDj)Ck2L%Zy4ZDO^!zKy*)54>)cisZ~O7 zx$SRB`8`nU?CNVzI{OzZH9!#lEkYq?g11I$*IHw1zH7hqTl~0uE+VpK#db4r2mH|X zj}iprXyQ8umEt7+KaJ{fOl(vW^vR?~c%y$p-7PDAf~yjX0BDv}1zwLL7{Q>3 zNB$9h6TUUN6|Jz9PatzT`mS*`m64tSRluouEELHENb@xyk%9bYnM6$zk>5R3jt+mY zS_DYtbsJycu30=W0e0jq#=XZ(TcXq~0yvl!700_^nOZ>yRC@Rso3nrv zagvhoFn55=ja$ig=QqU7JOe)sr5IW!?GAZ0)5Z*S9tglb?<%EdDcKvtfpxOVIuN8> z4@#8j&Dks-PS{}xLlExSLIM}SH5nsBdB#ak>8)32ztvkj7z^lZO_9pwdi289_Mo?g zI9c(_CtEL~!)-B%bc^L-Y`Ib8o4b;%_j3ras1%vrMLu@>s*zdXUjc}-X`;H(MAYXV zRG26YTCg!WXfP*_Xh16_E?BI!yttAta14iZMLjTVKAQXrhfB=5zY_Oz_IrF==JlCK zm>D+zRjtnpW(brej=*ghY5uNfg7>AM{MNfL*}uK-6bCJAkv{uua%GyOh!xo}I+?L2 zczYl9G#|o7mFd7|nHB?QyqU}ZGhCFwXMXA^Q>gv-bLPBOhIG&Rb z8vNMiuI<2Xug!{F+WX(e3nmR=-48}bjhFj?s_N+)U1U5GD7{$@+>kr{HoPeQD!rb8 z;+g4N4O*c*CCG2>jwL^r6sA>H8vzTB5schs3MF9dMOWD~!_kwTjrqSv@-fx1&0eeRmeTtv0?umG1zi7h0 z>2d)#boYs6nc=0N@BC0?U4Q^_1u3)9Kq727Pp5pa-)ZEetzxF@E0O7NBauSjbnzes zn!-s-H<|LmTrLVYzzZDyisXAl(LDRPQF1s0e`AsYQm^fJelQ@jG33!U66`GBFJD6~ zZ!n|%()756=$Hh{ZgAmLRBLHJZ)*?1Ni4RHHj$T}S-T%BY?amS0;etx%r6hkugHzP z>q_M$FqaOeNh~o9yy$Z0_XS1$u%&Zj?W4K!Af#M$wszB9-1Nx*J+s^A0&meN87q+QEGeKjB zJgyPlX7BZXZD+?fUHqxEsB|mF62Dn_Ga=CUBphva(3@Cs7f2~7w#IDR+ieV^jIPpD zAkl5uuYIYwZ(eCZ@N6jJJ45kVm!SV%VVd(vJES=<>Fra(;(V>bGkWVBxnuH?(hHewR7q8$CA=+VAOi zes%pnS^(Qy5a|5HLo-hcxi2Gkv>~mcqSik@-I$u!>z0L63sGt5y?w>9KKvt>c>^mk zLve%1f%nejuh^rE^s|yWgX=m(ZMp=W;bnrqQ+!^28p;X86DKaP@D;QTDSL{Y37lRy zBU#)(z8M12^ViyVeU;B&6H7;IUx69I0M%DlPIOe>c3eaa9dV_oWWJvO#Zuf>-Y5U_ zS3j0{s%Q2dwBTmZ5LbsSP15(4p@^QG#hjoM#ZR|Kr6~@) zEQc?O++O>*==ixLH8?KBeG-&h{o!shU1w#x=VJBaLAVINHxoG1Q}EkH=l(EsIQn+! z9pO_PE6`R4EddiL!)XQ+S#-z+a&pWET_*s5GyS!@%|}; zHeuL~QW#5Q>t3|?^;M%N?arTSPxf}i&#-?y{S?d5ITr`HmX zaiQbaI)qu%C(|glzN)ond?HxjXG2oLM^oO}=ijva9{^QBs=hE#InchOJ9Btj<&Lts zx0>mZD>n?q)>h~5;)pC-0z?6}e8X|ONyx{hhW!M7p81#bl+^rn#_prcqgpnf+Bxfw z(E@b0+{avU&CSXob{!G4Ao*LdV%KFN z^2gyrx%H7NGQRpxa{hx2<`;T)ZxilVq+-_or{(uERv(8aCj_rAddriqU3%~}^A{~z zgjL2;p$TpCopW0c zHg|hv&TGqDKfAmudmw?b8u-_L%j;T$GrBk9-_qdd_a0r4{6!=-2d<;$AafxT#QMq# zTCLWx>S-~h>(3XpQHN4v6}d`!G$9Q60<5kUNx<6I6-#qQNtFgYhxXx7#EVCs5jOjg z##Ok#7FUMN3f8@S>!R!CxHO?-C2Vy^1qy;wPB{e+R>O$~+(3_4hjCQrreonyBp$RP zkKY0rkN3h?>s#OY)Ky7D(cN2ZLL;}lZ$)Er$CtqG3E5?Ea=l7Mw? zu2`BQQaIAsu(4`4I(=ce!yOhA(BWK~;E-?W(+d&hqgTU+eeSP<*@Hx_dUM)2*tsH1hjJaMAuo@P}?b+ z0G7XHTk!t&*36d5o15q3cE@nHHf?!r>#88YFRZFy^VzKnZ#2)q9`j?3CGayHs2SLH znR%>*SzegdH?x1RaM@1L8g-dfpo^_=OC)>kbZI1jo#OsB9=WH@xJt zENIviKCQvTFq%zw%x-(*mYLVioBi9|ZUwRuVh&HAztQ}3#DZT1XSF|%xQ~_|eSvvj zgKMF$5MtMT%=){;VaGdWaY?Lo!N=!5_c`2ci${6l#l?6$7p{8)lc5O`WI5!MzmR1u z%mbLm9ZZCvAX@0UN~7)KmE7i<75E)5>st4=?T1`Df3SJTJOE_$f}MWX8QX#bg5Vxp z-yd#nBZP71UteEeUS9sgAN~-J@yFv+a2*pS*K)Ps6x~-`T0vky`RamCRi!a z)F8U1V#zaBY@PGe)M;}?n1Aaj;X@UJpyru+?r`KN0y!2~GO+mM(@*}zj$dqe0cTS; zyzz~1Jo3mRF-4F(8BTX&*UOTPc6YqOTt;S=EkW%IRXVH2r)wLZUR=^$g5#;$aeTEh z%G2%*p8Ba6HgH{Ga3Rn&FJKNWrBAm%!!6{P9qY3of|e^{;_;Vuf&!jfsqto!ns;GEsdf3U23W-oU1@({ktgGf9{+$EL+xA?O0$-gcy95};fG*W%P5`g=V>>r}bNy4ldTPsY?NUbUA@EQ+ zA3<=KHi0;@E165%_KvOn7q)Hx#HNy7JYi?lH8DQnm^MK)7E|&OBpHW`ckI}~M?qvL~!QGuE@m9=ZD`sVfzg+~!&E#M7tU0gZ8;GzS9r9tH#%|(OeRgJO#WKNKs3aGEH`TivS ztN&YlaChyjE9Nyl)_{n}OtG9JBfh(N|AVYCFJ{Y;N81j1pLAZo`D7fJyz8~_N? z0%(q?Ny{Muv1=Vzq`U4CbA>4mwCq~Y!^#iTn}^E5EG+@LVv*LehlAOMLjV$}cV1s` z5PCt-6V$D!8Y~|iHb?PH6l)Qq2w{kv*!(?xU7D6%)M%8hj*B65(PGiL=`=V*5Y>T2 zWVItOT?mB0Ey}D(H33DgQ&h zuqe2GTCgKn@Nk29t~?fLvEku=VcS2~{QA#-`{|#TsasWj(9N^WE_8MF$~?UK5>dvT zKOIfxZk^ctah(DFh~Ri0ULk>N)XZgS0|Ol$9eBbwUK@tP)o*?4TYvh~pE3l2#L_K? z7zpLU0*;3@6IjVWu7D`i>;664U`sT=48q@lu0;E1J*fE-?EE~ zw0P9oH^2GKcf8{rnBsl!d*8z&Y?-rop^fTbGJ*V8u3X6+s@kd!yn3-#795j*__1N4 zV0=d&h-QwHgo^-axh^vvYrwy%=POEf?x{??ez^5uNUudSe;L(wQInQ&(bXK6U1`X#U$zZ3|u& zZZ<_h-Lo}P0jZ2n4mvk@(cQ;4|N1vPQNQSY2d;T*Yeh%to_$F8$4rYeF-Z@({owW= z-gy5_trzXybim4BX3%oTL3PW_iAxapatc{BG0N%y>-9pHizriHe5?Vj8s)$p1ZgE!l%wrh7G5}PpfC8q?@#GS@O}bBr9p7cJVUvrl@C>4U3jb2q{CNz}PNd*vWTsa7iGJy zrN1$gnKw|qsuK5Gdg_}5!@ap)M^_z4CW!iCD7xrmFsi#gaWzMa=c>cd1j+ehR6MRztA-!`M> z*{Y)5*&D}VeRXX?7)Sj@HdY5WGT^d<|NYm@5FxglYI|Y8O{l zN{W?|QV@(;>R1A038MN^d1T?nGS7=j~OEEts*fN2wGWq(Xr0`a9RfL<6HfGz}4 zUkt$=Ef%^^M3mVTceFk8d(G1Zv9tyFyE0rkoT&?+g%#R#Ls6=`1);nEufFCL}5wLLl}r^9N0H*cJEW7S{veOge6c2Mrf|ELpMyGlT8hw;z4< z(RddtGQqV7xPpy8N2QExbu6Y$Afa_`7(y2<7FS{=$Rj$2>ndr)B@)DY5#TTJBab|? zV#NwP5gjjG-SaT;qM-Mn-r~XHY0uVX4@Sub6K+ZJ2hwWSpV1ziVP3nk^RTX&znH0K z!IQIsIGH3Dq^$YC=CY1r^8gbp+|I|!Kg-O8k7EhAGPP{Sl=vtor^udBO8Sax*Hzcu zSC4ZFS(o9Uq`##7@HTUGOL0*4x60}@NjE@x1_BK?- z!Z`(II2zP$tn9#5-nbvAHW*%CEay8s(|GpEwZUPTV9~(N1)bCGZ_2Lth<&0;i!efs;_C)aHp^b;)`~og=$1`~Fq7XTzo_{#4fY9vn z$vv=)>=rpV^#G5(m|Jbs%{G!LE&z{eYcCFatBO{a8B|5MB~dK~o{E)522@IYDf zN#UbuTv6Q->;&$9*{(c|2G}q`ZaHFH#^aq053u`4+);~3tm1_ zk|`O)vj=k7XIiV(^84o12k)A3=gc|3l&i$8@$qzVBxdC=SC~7r|J=Cf_NL;Zm}_)o zhlUo(SKQjv_d#=^==OJSo)bPd)+cJmv0cI0=8Q1*m$QC04?5QVGdzkAo^bS$n*a_D zmgAKlc<2uP*opk|_iec9U$4R)^0=XIA|?mPD>3#qJy<>JsD85CM2zAv3y!_ud0kqQI(u!Z2nA`v78j*2 z{p6ab{`%C?JC-iJVvQET)B5oAE^X0x?FE}n7xRkUrA*H!e`|eZ?WE-@1K>29v;cig znc(j`gEM<}o}9fOT4%D~V(iujaKtrk`K2-YdyhFk7^)ZwUcI|#PERJ2nf&#4P=xT61f|&avm~`DKyhjb|lUk4}=yYm$8Szp;TT z`~)xU$Hha~VC2iSt}-~lOb+mp;@TDQ55k%{b?Q7~r#U#kI0(vj7R$a!)*`a~C+|PG z|LL3FZ=M$4!#&RU*R}2M%?0ULYX30ZOa;u9DJn#u9WB9j#8NXPA4WSWkJ{B-Bp{b zCOhz83QXvs4BpyGrDfmcRX> zbx$Kk4#{?pVO*y<_dgflwMo_ZhL0?G!T}zB$(h>47hh~$7db-Q^WUz+b_d6)d30a# zE}US-ZXcJp^%r#>X|8xMPgXt@|9aXwOE5*2W%WOdJRamvRpqVbxE7Nfp_u==@;6ff znN=9l$jo3gUshIHb0a9efS8|D20in7nVQKc>9}&!{#Vb$EP7+IZ(EQhIZh8;KT{nT~qnnvAP_n+H zrKJUL(Zf^l<%xDOiWU!{!2@;h>T21UH$G8U_Af0x3;N9Cb7W$p_Mf%uDzZlpj@+9^ z5tuwc>v85>sRucrqm3S%Y!X?*$sqjrwg1|jixEa{#K=dN)Lr(DLl<#juP zH-#sYf}ru+Gt0J@Vk?QA+*tLK6_$0xQ2AE#hqb%lPV7zskoSS?;l2 z+%&)Oy2jw$9c4dmn(xVDYX)yYY5*OnVn!KWp>m zvfXcQo&B3;bLdQ6H!#As|7+!M4~P9xI%?B5>$kEjm}O=&c*f#>K1JA!O-LqdEdwPx z!$X&j`s0TTZk{gLZ9h*Uw)hFgo>#Y-ht(Vx4E;Vl2aJycpAPn4Jta8Bknp1V1kH44 zGAn@diJLyL9&bC``LP{4ug|pnHv1OP`S;Wh-&a5F@p|j-{K?GCKUO~;=MXN4xCc-r1MTpZTZk30#MU(`-)J++7u%+7sMYUEF7G0Cwdj z`)UZ0(_fRh;QaG1{m`X%+;PXh{L8;!Ht_9lf18o;Ac2p4>|=Oaw@eZGX7%I8TlEW- z)>K3Im76O9>?84)p~c+VP|}<47oTa28+4x#9{+tQP7p5~w@9vzs4ZONBN+AQBo$KJJlZ{hOor2%d)#|31!R!_rq;Msd@!edgh-*sdbZd>MTk06)e1K8V)R(yYKKU*DmwH z4U`R*kAB5`NS#{EATI01VNImn7t}2ew?k~xW>>JK$$NT_b%jY&U zyt%fbW7OmA>7EQ~R#hMNxkWo~>c*Q<0$fC8*!+&D+|<5K>W>zOgfF__qQCpfiLEQ! z7JsAVH^2D}ZUn%iiy?tq1o4;whVGx1!K>`TTiC)6PySvg&7f~MSQnT_pcdiGQFs0G zd-DuC(#9KrgJZ(VwBc6+Z|O14{nPq~iiUQa)^Xs02VQc?C72~()`_<< z;e}fI-VX_ahvsfMd&j(A&%*V$y|co{vkwlE~0g$CDUSs-hJ3c${tbV8&vEXagd?YB`ML}9md+3yH=psN50ZXc5pJ)J;{sdZ! zB@iP^;IcymLn0+Wm@d1H)mI-r1tI)08U=HRJ?sbwXY__Y@@+LAKZekTOZdlJ#*HQ0 z#Y@A&L+`&k_n`xCY(_G;y#!CN!rc?#NNxZ-58J)wTdRWb4!FJ#we>t*S+%i36tX&2 z4knISTzR_ep-<=uU!VMSTv^eP)n^^3IaGnkLiR(4G1vNM(+dA1m5~^`yJ%k_e0*{-rB|1-Da z;aa@69k)T5k54vc`Rd_-aQR^G++LjIuGmqbeRZs?i*X&bxbk$_wWceUw(DR6mF9Kl z(frL$GTfbJ$s;=u&;3u$^Of6gsS8fsIp^QzH{k8k;gVDSnL2Yn@TeR{@)o0Mv8X(0 zFWFTb{H88=`_9vXxBvZ?(|`Qw??3wJqj+vHcH{Tndv9^w$j{)~pbvK)k9_YS7PH@$ z6~}z3d`RweleI9BM~=NCu9R1d(lu%hJBDHxT_2Zk|4G?vN3bJ;2xw6$t%FhK>9V_G z#VUiGJ&6E>B{m83!Ihb!=mlhSLnp6BE5lLNL=>o_Ilx?)7{HL(#LZ_LZco|PByMK( z*^}quUaNThHV9igm z^8=j8tNwa()rJa_gVHfM#Kj%O8F49K{yMHCfY$oQR0k`DP;gviafVp54ILdL^=?I`>NyKPeQBH0p0a4bP@IqI7HAk4zn$hB6 z9HXvWTT$~umHCQ=AEH^UaO2tb%C6NnuUc{EiskPbxlL)rU&oTnrPXmIdUC6C)0$dG zb4KEu|AHeez+m-2G=DRm$Np3HKMQ}}JpYn~m8&s_8u|IJR*7i@9)6@1{}rPd|2DD z3vUgdr8u$^MmUMcxa?8WjF#vbr{zgH9sgh#=x`yJoUS$f@i8;a@k^Sl>Ee3d%5i3z+GCGjJYpa{?ud9FBOsP!bxM)by$IKYO1R1r!K(hd$n>IU{4qqO9Q+@FMuJeP7 zzjo1A`(M$AE$mBQ`V#i4vO3^a>?p7JK~vv{+wfHO>Hjgic4d{!#P_ICFw6m~Yr=)t z0OToo3BWg@aQSCfWF!{XOXnb!*}0^r_02nig9b`(nReK>%{Be{^O6Lmjn+T^&syv2 zxIVFD%aPWl13R9~ea}7jTyVh!(3cP};#KQBC5dikS_Yd97SHV`_)C3oXcr2&^WdK5 z2O5p%=(>%WKmNer5*G6jgrAYw6p%o;L7=H#SHH@Wc@Syhjel6@)1OM;%Z-Sa9J2 z769?3f{@Wlk%dg7@L7M&fx?(}S1hexC{6qrIOLE+mMvSxTb)rWR7Uc|y5m(kh}GNJ zix1IMB<}lL(NWTki;=J#Z0;1D%=~p7!VI!aw9aiObmB(Mk~Z@if}FO0tTi`V08<2M zNA{l>h7osZ6=zEDxXHfezN*&jA$oq+&YF}2xT_1-2DP8n6MTAR!&5c?pS>>ukfW&j zubrJ^XZAj_yU8B8$;FMJ+{Xt3B7A@dsQg7h0TC1hQBfn8pokzhd|cvz3332((Y$XS23 zZ)^X_saHMo=D(Ks7w`ASy{6tW^=I$>4D%0w6XkBvbBj{-sgYu2*}WqwqsFX1N<}7q zj#v4o(9|)_n|Nha&Mt1%mB0SMiBR@@vHPpIkY9UUvPW-ouy>D8aBQgk(5{*{E3i-> za`boyBvT=0LYHHCq;BcFdgg;y_5k&G5>}5?0^rNEov{0>;LNOI)TQB(ep!TU*)xbC zVKFV#vDRDmv0O(;wgb>+AU0&&v8TM{c7x0vVpF_24}6=Rtz3V6_e(Fman^ljHkCKw zER9$!Mw0j?k136%@%n$2t*weTyjVde9YBzL%@{;lF2#aN&9;>{#x2nrHVVtP^gz;z z;761rz#bS>h- zn~y({83YeWwuD=78?KK~2ZGAGJoI1xW=Z!}&!|@`{TuvFc54A_xy6ze%0v|xw+~DV zZmg(WBPUV2MeiQLvW3PZYKsudEz-h1${+8uo}L~YM}E#Z=b)pNXLK{*5hF%$Yk+UT zhTvEO#$nMc(5G(T5%zh-1!C2zRoq0#Q~wB}E(OejvtNHD0Yskh_A4{195kmeCiU{m zFJlK36#2_8y9{!sPoIvXWx4pznLFp^1-DduScYYFRK##`CNgc7Uvwy9i4|Q_smY~Z zS>px6Ky{L*96f4_PFgNsC#KT(Xzf)avE+|9P5eeEP84pmG!CNvi5Djdd*hyn8-p5d zbJ3s^{*D7X)!gAyeE69d22_7WLXo?lyl2t3<}X~m(Em&Sop;`eLq<4JSSU30jH%)+ zAwDRsdQV#wprz5O2ig!X(X~%7R++5+ptSrGDvwV1E%|6@QvO)?OWBH>znXufdP|81_utVbstTF4dz2Y?g$6Q*WOC4T% z81h{L8nhgITcf(ikmS1WZGogkfB)2fe^uQpSleOdT7UX4YW3j{jbsX8HW?{+9#^P2 zy!FtolEp=y4q7^twi6X86YrFY^%0yX<3mJ)y|9o07j}=qIpY{dcO zmTAr!?;x}>L^-I+sC|GdC49!xD$^QOa&%bAlL>X39}kubu0OX;)W-Jw_GDBtW5$eu z`C+qKeN&^!lP9C)de3Py4UsRDq59RuTMLWAU?Jq~!%sf^_zRDhmzB3{YAM-JELUrg zFz7ArijV#BxaI`;zrf}j~>gOgx>t4Ow zL>Q0|Fb@80zw(Ha~PiUsH!LdB(`Rs^0Z z26$Ti^T5Lr3^{r5+wtoX3^}HX6doE`-zw8rDk3ATUp&MnjY$!#ihNuZL=pLf%AZGx zRfIjP!UiBeMpx1F-wF z9=EOQXKgKiTEFHSZ5*SDlq8!N#>}W0^Sj28PgP?)%kVc#wOyvg2W^4{3l`w54}XM3 z0~eoAc+Klz9lxC|2hX+xja3HXBjJjgW9I|0e-f_o>t%%eWtGK+2pbQqzjLiP zDI^X|Y&d%hrU^gs#1q)x@Q;7|Bidw;gV)WkfBkFp)*OE1;mePj^9^w>0*;zZgF76B zB3Pgv7ake8U@|igTx<#2vatn3tTaXvu3xul( z_SaqYND=ze+_Va!2XV}Ery5+6 z2ne-uaKeTzUejWTlP}51{Dw5ilXNFzfmqw|omc~j&8fStY7P6fCWp+{zq3riUAp2In3Sjd1{ z@{BXiz)(8Ah7k%qD0tb=nKNhp{P}1)Ty)VzSmlAISlTdS#tbF4uC5NBbeO}a#^dp5 z)TmMTp2n9Sk4h-!97Iz@LAdOTe&E~ZZ3&L3^LFnJ*s8^g5FXE1BlENp6o9lp_F zbIK{FU`%k*6O-0`*Mk#}E>NeP_;r8q7i}n-bjalP zgF0hq62iXaE0B81sn(?%;y0TDpxFm5RL`Qw2h21gOi!5^E@=Hi#j$Pw?v86W8=kGA zXe+itltN7T>J~f}oM~H>_LkKIw>N$qqRPvHnSg8Hl=y4^G@{^71yyq@+l6NL*;({phSB+TUFrTTgk2{dQ=auVH$R>t0A9V~G^5DZ{kdw;`i~aJVpHRR6@F}} zmk<8fh?vp!6%l3FRIxw%!P0PEj|$9sy7V;b@xq^#hMhcaz4g{J&pZ=#E=E;;@{^yS z4**ZG7XnT`!{`I-0qui_AAT4o&|{VcrZ+zR_~RUfWjr1S&LSXo2ibSueX+{|)>2}G z9@~iN7<5|4sbkaqb$*=({)`_)KKwe5E{BD%>%^mD&}lRXuDk9!w4b0oXbF3&o_+S& zXe~u6qvfa8y)9lv6QTUR5jfb8>kU*GS?vdHZq!8Bflcn*mySWl>4YsS{`&fQZnx>% zyrMBTcI;TJ$L5(O7QH#e1-6D+RV^4PJG!^}!$4O2gw3>1&@35lhRpoxPgFQf&y=q} zviqRGp&v1>?lUNAbZ{;n@-DC@Lr#^9(kb$$Xa&w*Ewa^Xi|k6Nge? zPD{{LI**#>tl>QCf8ckw72?ZKU^KE)L~Ej0$O>s$FQ+`!{q=ylKH<;6K-l@$d}XWn z8ueim{jRcpc7>RSW%u5S_bRZB3RWTNa##qvx*VNH$Dq?XzwWQo1rsJrU|H~0LODL> zi;j(9hN>r;F|jd2g#H>f(d*JcJ3&z~T6paKSW6Qe71FbrUch+8voU1=lAiqbci^$h z2SUieE@|ukuuhDV;^vD{H#B;CX$GlNyt*76g3eE6PnND6a`do9q6URu51S+2z}7%v z%otgC;p7IXg4~)=AE{>JTVL+Y`iS7^x_sVzGw7xV^}RD#KAUn9V(u+ zr*(*LcH_8>>Yvq*e9oMbBB40xr1j*jTW@S7mbcxbuW!s6uO1ffp^`1d&=NxE{<_|r z{88=VyB`6uasjn4MVjrx7UP(ght3A|@X05iL^}Yj0d%}$JRVcMFdYHyi4#sZ0TUk4 z4}mUX>`$j-P+>th;Tej*E?=jI3xkr0g-h38fBlU&-iX|v3LtTIEDVH{IQk7RX37zSeh#IIdW@v5>Dt&g?dw^0N|!_S+V7BpZBBMjd_ z)lWbDv=W1PvN!zx*PpIi_`3&hQJzc;rT$#|qmANtvj{xrAAMIHr8M*E7ynw!r4R)p z=9SjGUEvN5+q=&xUfrLOe)9Y$qKU{6m(=t0QnWrxHyit==&8}e>Se^q-zltWcY=Yf zh&kzd2o$?20=_k5;pOa3rsUjI71AmCf%>yRCDuadw|$r^$^Bz`hO4~iwgSIaG3*2a zE??PrxGBv7!KEU?9;ITXSB#5^S^nnxYtvs3RG^d~S-PZf4yb|~G4dmmp98AkiXbi} za+vTN0;Sj-@ghUHiD1F665`~qCs3z#ekU8CA$F_FcLs$(SA%9nh18B9HZ`!v%izq^=&(0 zi~r418f8dlb~@h`&O~{#{h;2+=(gew-m#C2RQ?pDrZ>K|yHLfNHEY;k#{fBe%a1HP z*l`l$@fb}24_-n%9*^+_ynfI=Kv)c6;BBOYfDLlgEz`=i6X1lW?$5V&mpR$ZfnN!9 z;u(-Xw&BBC2CR5gc<|wlcQbkvP+gue?(~=5e!1b+QcJayH6QuaNcCjY<%B`kgA)(? zW7r7uC{?=+4Fz=6qh)}jXrTejrabSw^SFti>rIz$^%rv4t*jDr;HOmJ8bbZ4>L1@m zZ{_sbz)D}~`r=?D_|u>M6sfr8nrpCu2fDbB%#%(!2|Iz_`}Dnk`p2JDw#w)YN8x0` za;umOLaRUPX4Y)};zmwO%?oAe7lFp(RR1gdqaPW8{%L+CBWkDovg$e0;8nU5p(jwM zbvcMDf>T{&`#|&vKc?q%eeOynT*<=ZaDLk9@#=V(##4YvPrijO?v<+ofG_D*?_0y$ zBARbi5If<-@1%OWgg)wqHAV{15VkNN%Sn`ML(oIEa%w7QU+^5<%*Aw#jSOJxks7Ff zq^9H3@W|)Ob<@=4WJJvY8IC4L=OGI-TkcMBh7mt$iK}wwc#)yhHzL!U=9d9Er*!-} z%}*7NBDMz)Wa1r$DjP3045H%}Edz|WqYoD6X#DPXze685wgUnNBfSpz(E}VSHX0Ly z)_>)^z$Q99Oo+q7G-*Jd*`t!L2x2fV?^bW^KPyY$#7uX(*bJCXyQcj_>SK`~ll&ld zYIYQJbv!nxd$J7Fuq(_U~6kDMvn2d$I}>9bc)Eo z{IbCOv8gB&G0-&T=0{5iqvL=7``;BCzHw*HoQYTO-~RSDD8yUhJ%9QI?r!4*FRl%8 z*bj~e>>U$I*7Q}(EpvxxSXNK6ibeO#%445LiFu~z_`&ubn3{?)5$qd?2`DTlPyJ)B zFgjqAMrhOZp$=(#)IX&k`I|;H9r6DTpY`A@Y%hW9)KgCdcr+2deaW{coH+4+e}3xb z^_!_49@hHPx85UO^N3^O;stNSO=9V;Egy`)QV7v z+Q9?^U>8RdVap>-GRG7rhOzhFdnXbJ%znbV4a4eR|N7Ul=K&rm*ox3$#{+TN34uSM zobxdwtg;7GDAH_bGYoufPQuur=-#iV@;wYxX1Q315*7EF8@@Wn%Th2SsU3r}Xt+%h ziQ*(}mawC)@#Dv<@pyFD@Mtk70oq3I0#1i=!eU9UO1KmM_V&*o4_;Jz?S;{D>xE$# zOxN%=`C585BJKP*pYprz#&uZObW=0{XgjMn(s~P91qQWG>E+QFWxQ{wLRkHQcs()riNp3 zOfMEec;u#v%xA`%)qd#Yy~RT8P3F}*C0H@9%t(gw&p`E=l^^5rH{5UoKAK3eT(bwKP#ui@a>NZCgvK&1x)J)rdJ?KZRzu&*|{d9c(1xpVHh=c4J1 zArf6ark(Qi1uQH?ClJoyKy>JGD{U_Q!2RK`i*G#n>XTa+$eA%t_~FlxnZf1~{sGpX zk#OYhzuoilpI=_Ia*-HW@Y|U;V=xPA8K%@tG1}~>3vrtG{Mlc?lt#1mlo6XZdKwLy zfssO`2fLZ|C-#A^{z;v?y-?>F1b&oXceMXkWEPNlc;&DM%!!_Ke_eQnJcrh_Lo6z6 z-?Jw;F5d7$1&%vbF$|;qE168Nst3>1Xnp|>dU?}=; zdZJQ1R$1H`pjv|~QyHZlKUt8AmM8ULlDo||5QrG$#RkJX0=v)dO*yh{pJ4giQdTK$ znXv1PC9tdW=y-I0mSB;C`H2@_d@0Ym$|4HVke z82HC*5{wW{dS`!edhjf9&h#HnzvNq&48{HjSARbA_(OkO`e@rPW4*=e#ZhANJyY&| z?Y(9WabjF?%3z-AOADk9hw|A!)6B~VheaR9! zB7w2#c}l6sb~)K_HeT}6WpdbrS8nH^yl7Ii6oazO}?S|5tn%@4Mv!y49!B)qD+|v16S-CKZ79`m);TQghA(#!0d5t zZ~TFkUL!;Ii2^xiAHmmpgLM7p!^6Qz2~v)7ox(c#O95$zVWjURh56^0{e;D7Sm_7X zj(^d$YsD#A>*w77W}zBcKLq_3gsI7hqKhU%Zv3I~;nfeV5^wq|-YO~kP|k8>1IuYY zHE)(|?JR7VQ(m@++6PE0yH0WGJc?Nnxx=zd?0JXrcKVHL_XN^;eliZtcZN@Lo)Mo6n1z@ru`B7=-9AGHFS~O$HF5@u~)B< z{gkfrcCgS%vU14);)6jfbpy83#<@)siQ*(9S`rm z_pUgZ3c?)m(VZ2y(o<*r>59my?vm9hClPMCF4gM8to3JfO{BL_PM#PimV9rcM>f_; z&TMaC&}Bfvt&YtJgU+*^>(7p(d&KE9#Mbk62u%b6Y`b*(L1ytSxH#i-+knoaf+!;C z!SY7q85JGte}A0!hE{0*O%{#PfLVNsdszEJ3K9wnB`lLyqGXx z^dB}Yg{+stOP6ktb?ha*O-3338A0a0_fptQPc|2Yfd|`mDt=F!M`dWVHdfSTton7* zKXiykY!Xal$)j{~GbpF9PW~BzGj9+n7K34M0W-ZZ;EL(!IQ|&@;e6^bco`MkroYsz zN6m=bS}dynP*;q-$xQsP97@O#^dBpX`%<|M`~{M>!@8)S=G1Vf=qsB`(-rfvpTJ^Y z^O7Q8uh$i!szIfG5W4C&EXzcP0mkE@F}_78Oya{T=;xk$4x1=oUV<9c#v@iQ2>X~f zM~8P31gZ@g*%R*e!w<=juj5yd+6jf<{)l~+U%JWIpKXDte4_+{*`H#`!+x;qt3XHo zVo%8ja-%>Q*eUH!{s?5BM~S@%(TqdO0Nn!^Yr{a>Ew^N>5`@ofx7~)YXe;ovQ%qmj zuwlc^ci&9)wh-q8&lpiQBH#;z!y!t}5bPhSAcPEsDq^fIFsyFn_pT`(Xw5i`cknfLJQ?sH88UZqKK?vY2O=K&5ILwgmP8k!GeDg_VN^Bp-2`dQ(H{EX<^ys z*b@A6Micav>4d-6+*Gmb9lU9z z9a{7+0}}+xg@wIx^-w-Kv;3+PIA|MV-Y>oM62`o-s}CQ2 z1P1g*pjC1H`R8K^C2sS`aVR2fw_+MihdCi@5^fk;`20{6i-@-0e z^O?=wsJAFYot+lFaT+;l&{;7s4`v%+paHZ+4`?Xh_*u+e)Z1-J6bPQafHuTezxq{7 zU%)!yC)Yi_ylF*T#OH3C+a7NZhh%pw(q&vsSZ*oefu`LoN~U1`)#OyZRowG(w>T~? z+69h8ubEd`@e;4}QL)P~3Y!)-PyMGc3?;0Vf|8Y9xt$Y^V5M(&&JGYc@=k@exf7KFi$;U-{+UY3yRr0(yteqJbDqUjiq2eUd2}3^kbyOKm1pPsp z#s=EgHx%|1mTeo@G+iesPSDdaYT1AGdbYKYK2+j{mJ%~&=vRAeByI))@z zxs<27dRV>6cJgO?Wfy{}reKVETw2q?B8O`kgdhy&XQ9qx0A`4~Oz>}C{3CB{@B|CX zI?9a2PO4;b`ZWEs2WO@Eu%BP2eD5ci?Xe|N+`jwnyO`sRGnw#(ggIHff$r90IyYb0 zGVY@B?#+c!e>8=6cSE9?WV1PKQnJEB&IP z^h0d!Ci53q^0OaaU_2BZ4kfIfmaKAk%$t|&7vscGw?B84&_<}&l*-e%}op? ztS;F}PS*OTFjP44=!q@IwTGHxfn`Oq(8@O@Bo3tfVws#%ygIggXuBLt%|ZJhD}H_Y z0t-iv!sD0Bcx24O!7oN9Y#THBgwe9T(O&;Mw*DD)TkXbRd*l5h$~KnvmZLQ$ttCf2 zytC_1-)i|q3YdEc?8@UZ_hQbfe@lki^UlKHbQ>BQ7Dq<$*U>6U&P0~U+QWE76u6%# zPXtnpb1I5gaRbXq4EZ}@$OpeJH;*PlU&`G>Z0P;49>%3h%A0nAo!zj)LbXLfq&YHSgw?8S@|U+9P`xkViM)|PX-*{ZNDl4>rojezDSlm!r71vT z6q4VGXUF3AbQK~wI2M_v@F@I7dUma!d+)th0m64JhQ_f{A9W=LTv41>Kd??5OubC2 zezCIoC(T+OX|@5)51;;9f4ET`N{F_7p}Y297*4QWp)nB}F+_8Ep1}U<1GOJ?Fk%+2 zC={+ZTb@<^PP|uJEdc|*Q;`K2=z;xU%V*R(Pd)Y2PQ;df)K2w}yUSDaa)~UaX1m{L z^bEj$a9C{qNCwB56+cfq)whAd5E3?IJn8FSE_yuq-K#Es{a@@ zU~x!Rr@MOnNt?^vSz5l)SGBOLfP1oKhGo^id@>A9=jV*BEHTGtytydLWL40Y8uc88 zW>Ur7#jZYMk=G!i94P+&n+Wvsl5dejLBcDH^PrttBD%j5dO&10FgWq+Jm^N2Gs8(9 zfsrnSm1$*c^4%bxF^~BHkio;@Nld03Fw>}ye4sh(2^SYf$}AZeGT%hRDlMPzQ!I2N zTMJ0Ce7Gy&PZVO(Jv9-K3j|KP*we&MTD0?M>=~p}*n#?I2-R-*L#lKC?v_W^<5g;0 z6GXfs>FG3Eb4WC0%77mP|Tw(w0Ly3Sy+y0ohM7(AV;v zcCptwoGd);q-l^02~K6iNVx6Cf`@MjiOfX1Ox@omEW?AxyupvQ0x#Le(MPz&s07Pb z+`7yii9esXoUkR_2`aopE5A5W5a%>tr4?dqO@vMiU|ML4XpX=Mng%QPB>IFfp@E9%x(x zy84-$ zL>Ti8xg&rBO6BX^8O;LR5VH(RQL-o*DZ+4AvP;#}(0B}p5)TP5aq282&-B;%ZGa36 z3}%S%{NG!*a?Nl(wuDbecv~h(DDy z{H+2z9+D18#iV4FN4h?TuK((}#jSM4ix5YKF>jzC4mcT2DBPk7Ecp=UHW?_0IY0Zs zq6u+Q7$-sC!hi)2WH{+T_oo2nWyix$;17abJuLI5++y+NEtPLnZHsP0iyWMG9uAB7 zjM!?4$GovHm4lm+8^6rSu9Fw$r9{xl2~RowDOAvYh+9` zSR3sNq((h8f)m9NDPZ<^;lofZ{0jfd->#sctG|~{`*m|xIcwLh#bic{9B^L!i>p)h zDePIkt+SJh#nA1a>%d{De}Ir{PIhY>ry$Ham|KHWiPB$fJoMYdQpr)I>s~A~;gQyVZkea+@{y zbsk+Ey1$MFJh)|-c~V}1&g8;PY}h(4(Wb_TrgwvM=|(5`R=So~1qb0LSzST{QT#09 z#;|ODqFgp~b}66{Qjb>g60y_qhif9ihKPTIuV_6jYOw1cxsZX_nMcoGU5+KVy0zGV zib$8E^H}^7g^7qiT5(%V=V@E(?i%TBrR}7REK+J$gpAd^QxFEJe^0AhEEi&;z>BXAb;*#eLL1Ks}8Y10+%-nCf0EtPSoFF8#Pz z9qG;*V;7qMgvNxu8$98lG39Q!?4J`wX;+^#Dpi?8hRJ8#INCo1q^nI6ac0nT9CrQp z6IK&6ApDqL;z}4tZyc*W?gw=L&5|>4qlE8=TaD zB~?Zc$v|P5Q!7V024-f2x<7}??Hb28*&|2?lV4`*uo2DK)WE?>clFO!>rtjTCB--_ zp872_*x~9j`Dt)`Xx$TQXp`#Mp5|X+;fb_MvlB_LtS`C9CA48b!MhNy{x5lTVdm0Yr{q11kTG5sgimAvJaY(iJZSXO#lAB zRfbEFV_vNetf3v?El}ZuB@ePHPurf3Ew}xM`6c3D>TKM)Pq6AO+8{;OVGg}180d2@ zD=S;M65EkdSPTm6v(G-*6A5z+^#!6V7CcFRa_Q}>#G!IJR=sHXd|ShY5y|pUS4p_* z$~Fvnw4dAB@SCQJ4{1X;jCtc6NHylIV^aV?a3->=^W=kHm!pT({d36SNOfil%?#|4 ze34rH=T$hiSiI?NxV6@Wjm0uAy$;dy(O!OCSmlovLY;upqIEG}t9R)5yZ7lemYq!u z_LlX!5{2ky#)6s+$8Sq~ualOSZNxx46FbC3ojoD3?G2x&!%Z(>sob5S|C)bN z&%vm`$m;Rc{3d4PSdcdEg7Ka2Z~N%O`S4*~Dvc^4xBXNsEb0`!NMNGQm?EX?psy`+oN)IMXn)}RXqEsMJqj~s%uu3~zfKGYza9{@9yaSEi>H2T37Zup zJbR`D1&;}QE>;jiWg%q@y8NPt2~7kPt1%HY5iA(&@N^#w&0#klWX@lEuLLzo(v`%Y z@Wc~e=rs6igg7Y_e}TI|7`^B?n6_`Cbd}TS3Caq&@=|uF+b3)iw``g8^WXZ@EWhi% z(kVU{64MgnzBaySld*-2p-P*5I@uWb`BA^+7d;ko%OoQ!EO`ex@yet)lNPVWd$3zk zmL|fWv8jNH;Ci0=Pt=8HpcRKf!0J+>YNe^2J*DwknYPP)#}wH_z{w~}unfs|adD9F z=$TPEOoIJ&SLe}%aX{wOcvul|6`=<*Xe}(UQ8APJk|0Qm!5&yWQUvp;TM+u6ly4W4 zjzR^LObWIl^ss^D=80VU8cNomI?<}iQ-l-eF#3nag}2^-U1_Lqzx8;t#^eZ8l1+v0 z82!5o3#b2bI(C~^$;1)8f1L5hao?J7_dR$2?~K#nuhgyx#hfN=_=^`7ReZN*>|tZ4 zPH#@LnUqqyBFrcB3q07P7e@vwPaK?$9guM9&sA4lg{6tul~O%Y#JE3|> zG9JjCIm}wf3~T&qwnsjEs|eg${?sGl)-DG*%Ip=Pg)vDjEV1o+^`|(XTO5@@V=FY# z7_u>;59U{yy&^19FobGkghlzLq5@0J7x6xFcAzEvFx_&K0G$OOGMWf_TOl16K8{l< z-zpmJrE98L`SI;`b@w((Z^<$*RyEMET^JIOuCe~mY#KYMm2yJjR|Iip{;5YqK)!Tk zM6}8g?Ko=6L5OrEA!SNDjLLKg8}pk4Vb=eoK#GO_aIp)*w18aLWI`+qghx+f-uOM6 z3I%I-goswgB${2(NdyvW?pkeZd-thm_&e?8K&j4Dti0Vp`akVUr!9PC;qgZwuk?l2 zFizGv;ps15BYxQ=4miwrh|K80*pDmhD*Yfpb1(;f;UqvDV1Xk6RnYzS-+#`WIed$q zm2t?PdSnn-6x^Mxy`;YQrZL>UR`7r&)? z$*5b*swNjt-t~`;%A}Rr6)|A_=fXB9{9-Y7KclN_(f~fCILLrpjQ3&f9<}ha*OOiU z*q}(PmV%3LVA%G8#4Q2D4uS?6@Iz1>F61BaVQT~oZlW|TEbA-kLq+DmKCIr$O9ae) zj0mjpk>YTnsR@GHrR*bJPK-Sjlr(j~s3dS}hnNni$%jQzmz#`OjwaB_OcDb1MsiP3 zM!Z^Bewv%dNYPHi?-C!#<@+C(qoHWm$u8oPEa^kPJ6&C(?k6K%Sged|r|SQi7oK_H z)qh=b-uL_kMPbbMY$?Jd|CW}PEl2bmAP)UNynW#a)v5cc&}xZ# zqX~E17x!UN-{L>4s(Yfk`t^zdV%)XZX(QVYOGR}L#`}vuk#oppQ5bajEqgnFzd+2N z`w-#$wczRYl)mi`yi11?aVWy3*}r$A*V7{N&a8jpf>;KZ_#(->i+V*-MGv;+)Zwp`8fz4DZ|58)DfJgY`tJ(hk`p_rF(l?U`rFc97@n6gGa^_pf>VX@*E9n&Wp zF;s0)Ss_3G#ui32JYZH_i15NgJAhw%C`%@Oih>yoUUR^W9+(&Bhipd3fYdy~Gm2L= z7bIaAu@q>;%P?4ySzK|aW800quq3-K)=EHSy4iI1kC?bG}Sg_ttekZJBW87@VX@1D{5VTSmn19#}OO z1am5uh;Z>rB?^*BZ@B%W9&t=`^D!GYzrV5hH)Bec?zlQ(Nb0Z!Mo-DqYn!@%*As1w zVf`vsGQ>5s^2^81+F~1w2MiuZ8JeLeo zz6_tmFdw#iR903tk7^!s*B)(0w@ggz`O-I^edeiW(tybXrS%TPeiFrr-m#(b zPfB$;1EtYS!E{9oJ)rXd$1h>BVfWPD4G*moWn#s>%Ns6hpzc66W@(>J@^$>^{0)7> z=$sb^iFHq{5%*P0y>paP*j?Nov;R;d7p*sITceV|k6CXFy!_IP!eP3wcn6Yn{ZqZi zS;kSM3xd2i@uS-G(r!z#=GleoAM@q1qsy-uUqAIf7CDz(SyjF)P_~9v^lYaqS(Fs} zOW8^EX2~u*Ks2*Wg z62OUD8YGuejph`>((SH_zt3ghBvtHU7n&~-cQ`}&DpPj0{(ZE@hpx7xy4%{?=6^K5 z`rgvUZ#G80+g(4RzM`z0VB;E;{jC4P`jv05Y?-k>Qa`9!35*N}(CoF>(@#GQ6gcnd zoO8~3YWdR}{zUBqx|&41M!v~3`=_=nj9LPB!ViW~-)a!|lo%5xk|GcqYHx>$cPISD zX%h?7fmCvbtNad2C7JXj`#gOKfh7r4^`-yVsK~ZH3-u4DVtDmWGUXo=aB&T;{>NSg z6|V(6>)nGI`pegzd-e<&OItq`g+271>K8xOKIAKX;C$R3V3&Fkc&#Id?5zZ9hVlR~ zTCXnJ`w?6F?~sc|WDz_5u`46x2DKwvJRranMDoxGg^u575YR)(K}?dQmXbvS+5>v1 zE-INuaIHm8v1E&D7sn4JdxSX-t&+G?30VJKLjC-1yA{KRPvK2Vc*$P*JNnhuI<~ zk6Y}8fK>+QNWj4spDg+0_eb7htYh3HYA>w!;pkLcx|z!l2GThZ`U5?(6gIMKdbl$7 zOv&c+wpBe_Rx`g+f4qCqa)KCg1c@G=@*5iw?>-ZbjzoQbB3EJNR>sRL#=lT9Z+tEk6d2E+U z7JsOU`m6e%iy+^mWNNr#)v?gnXk=WX;qTS%P#%L69L(8e5Y%X*B1&K61~`%0d~%0x zRiSG`ft-jS>nku(Ltnb|iq1YhN3j`rB}KG(FC!ub{nBLW-uSMda6CRngeisyYO~-X z!1Vn=@})O!yPp1W_^+$m zCD1=T$G0K00ecd^IP1j~YgUY`9eM8M=gN#8g8h6{CXS;8CvE!$onA9e`qvM>f`qHD zz8Z%uVZVf~uC9j3O)Y<3k0p+Em(+W=nC(JolODIn>+|`%m=|0CH{$l-tgPJj?``um z{&oa1G2)E`A^}%{?4{#I24`eW*9m{lK*RZP&H1gKj>4jOg`PI5%7&}__U;)C-#{xB z+x`)A%Da4$(SAq|E#x^=L|(bMQwv`DCih0Ny9C_3o>?Bv@;n# z5+THGzOhvtKz_lG0_7hMX_S;DGYEF!qX_Ix*72Lo#Isp6o!CT#sih2piZwlyGNn549@bZ<6Xdxro3AOJ~3K~(ba5(%|3f(05uO&*=!2&f+E z#LmXw`n4|cZQ6*VJyC!rg3`Z{oSZ+*%&u-~x^8uUyrr-*aLt-EysHmn-*nSWIDzKV zPd|nKgAYFV_~VbmbL&yt#J9UBW-R@yl1qT-W|!0d9rxc6`)8t|t)Z;D4AtDMXJ$S5 z`ja))HJe&nlS#Sj5offX-JFihl{H!Ir|J`5hh!E9@yb-b$#C=6e{V0X3Bjpdu2rJy z!V#X0Zf~cXv&N8^67g6Ze}#pvKye@zje=H>EQH`35u+S~KPK(x>6Jk_IO^3SvW1|yWu4|o8yyA#mvBPfJlwTQJQ2o;H4 z6@SShU$3B=C@A+>&{qT}#CWC!j9BbB$QyuX@)P z`WXB38G~GUvsKqyKKP54c?I6l>xEcQicx6(Kxa*IcCZdvEUOFtOz18cQ1xJBkQU9m zspJ-aO79yCY-hKB6bOjH>UQjK%>_Z0i+=GZ3gR)BYs=YPmG2Y>R{M4SVX+@h6vQ&2 z%VeM2u8xN}yKw3*uMGV}csr=xCz-=he!c5Gv}Zh~XH1~YZE)^}f~|;t@#BOA>UPGp zS$NmE$);p$10MOK(5ZeE8`C=LlZ$>`-E8=?B-+ElrFQ{ zVj1k}VU_>$&p-dtOD|!2e-#P`&|$-WEXIRRcXu}q5y0h2hQ(STrU@+U9(7YKgMkoT zpSY7^t@*gK^dB4@5=Y1J*KxLJIJSX~Vj8mjxFTZIkqzFU#~;t@b*uDDx{{d!7ggJm zOYx}@9CvwBEES`%54x;+BR>V$G+;yXrhmWsk5$LlU%y@)BD$BfO+I_Fh#9RqlC9Z^ z!e;R&4CbZtn10q@U8eO}wtKtG)}v)l6_{T(7X1#F{kWn9WW(cVHc6x*>R)T@QK94N z7k_+2Qf$O7-$J}i)7SgeKZFk#e#8Y?6w*L?Kv?kXf38%?KygvUlpR`s*$SdSMl z)TLuko{HeK@8XuBTvchXju%1ebMG>(Qmz&U`=x|wrT}}iuJmpoo)Mw#Q%(_37 zBH2nnAR>781c^MuU$PO8*>2@n`gKV@a$S}H76>=DoUAxi5JfQC&cg56P)MB!FtA1u zD~)@))Aleh{Mu_kSEkDMBs$*{iC8R#@or8#PB-8K4k{`te)X$gVJlxO+4qILP3JbR z|G}2p85J0oVhC39tLhdt{^7s(uxDl2upTY{FR>dNSFM0 zqd1SoDOTOIzVYXE5XNR^39AP|4M%n@b5r;4U;p^B+DnF*ES6lhamw!-EPySy77SVO zgGcv=1irO|m9h5YSme+r{_#fJxaN(3!lp}6o=jM7Ef_52SIj6Eo>blP5=_?sCt_#* z{PCC1Eh#x}kIvEEC<3_p*S`*3(iXs$TgIbY3;zGspH_7)^ognT>I+VeqKS}CK3WuR zxmB8n|JGwWiZ!zY3gwCBRD;q&O4- zGxDwWig$%rR8sTF!1mi=1=-c4gj-^-nqA%z?h$*1{mU}Pek@G^^Odj5aiW2rVv(-S zqrdWXf4$gb4X86S1B(Kkk4z^Xi&%BLJ@C`UIZqUcxT|JinG0LTWUI~;0Dg*0gq?t9 zLeE*Ibt}?&IEXF{^q0T<t>yNmwC(Z+Ov;@2|@ z#jxN*ow&0yfW;Nza6DJApF?Xs`%Q<;4N~$ zgbTVm-zcq|SI(%+c<48O{NMzCzxJaG&q3?@A-1F#^Nq0^j_ye8(^Z5zOGjzg_ z^X36#(@a`dTAHAtSWYs_uq%Z9v%2`K^tQNFekmd=Gdzb8f7U1%fE`9Yx?*@)#VXHT z8NX*~QCzO^?U)>{dxp$X!B&KmZ7T*4cAi*ytnCgtw7OO_oYG*Q5vhV(^zWTt6#Gh4 ztfH4qzn8`Sv*LFW;^q~Psz9m*km&$00TYEQQqXu&qr1=T@9U@8k`A6Xr6;5A+3Jet zOJarc>;U?#F%-c_*tM%$rCb5l`EvkK{6<7nJ4rjBVX`ba&_6#1lyXRUyD)ydkDZ=~aZTH}+%~%M)-m0rvzbo~cu(;w(W79H`)mP&|sb_~MJPaR2PH&)%|S3q0cm z@i=mv)wP@GzYoVje@-SSAZVvg#I|;pRx_3S+*bnCWY{ zu||Ctnvybp)Ame4jYlMWAogGRQgQH^9&t(nFW}JlSjAjZkQP;*_z8ts?i8Vk83q#l z|0DlWmilXHc6%F+@|#E{kavT|PfNZvJ?Lpp=NDHjc6%ER{1m&ihIDi~2#roNIN{Nl zm00p~;@`#amn`*A;};#St}Iqf2{Cg@Ww#>uDZA{c9)alI&zRdP*5G^B=z~=H%%T74 zSBk~Ii;Ft~o>azHv>x4{X>Jej8d2u4qN z0M!^qC7Y!SE|iB#M7oM#e}h3XIy#yhBb1csM5`zik%g0iag++SBG_MxSBX-@&cY7> zY9!22W0?;Man#}TjH3?m9F2xYAAJ9u>cZEq zk+~K^sYnqP2D-(?E(oP|MabuAwqdd#7p5o9lcML+o+nvQ$rLHripaug!{1k!>X{bY zaCTdy&KTe0MD*+W*A-QNuZ})@UK9;CQTxCeM5#-{Q(*9=!hgz#2?bjb76!V-*|ay+ zqL*>RH|j>tsJ6zq-R=nza$a6c*rT%Z(Cjc-fus{cfz6=GY!tyym;r7c_CpnZ9+w>( z2f|+03L8U(s|fWdO(2+xP{CFN3mpjlT-Y@^X#nta_*1YIk%e;?#_wP3t39!P+(F|e z-_$@b&Gu_973KGA%jeA|!W`LJRf^3WJS7T)uEI|2;z`?_F(gIUgQ`c0u=D6XXajIF z0B*+aiqhYBrUH;qnenvw7)YF1-iPVV@aEJQEes9|PZ0FX#I59HB@~+?m<_jBhe|PX z)Y7Hc&09qnriNe!93%fA0hbIyE)gbvBH+P=hvPF{^+*xM6Ru?8DuN$yq&E2!GaY)C z25ewpPMbdoV^R2}w2?~$ags~K_Qan|Wqh(wq$UQ!VP5QsNWhi-; zGNRP32#%WA)A9>@T@Bx9^e*&73#d)QVBli!=Od3ivaXJH(PpTqC9sSI=Th>CQ|zhu z6`}YQ!H?7}2#8{rYo0voA9?|k6msnPp)xn*@=M(*W_lHo5B{x3b@q(uMMcZGAQ8$& z9+aO`|6EHL$cKy{P)VS4S+bH($@x#JKMSG--VJW7Euy^8E>e!nVny&nbqhkjm{}7b z#Noy;Wz}3`S}XX|GW*j%Rx1t8{_Qw*RFJ8}QZE9paL_q)nub7tS(PREjL#|I#KVJA zrH9IsRyaUF2)iU!HZ%B(22oQbATcn({>U#7R30*`Gc{(z$g|>4Cnqyq8L-tOMPxjt z8$B*y#I1DchX}sk9q?l#4qg8$J5&bgNynkXhaGm<>x;4x%KPU zBZ#_4MWhnr!md6zcn~)T^2j5POqnvJ==N$1ztLaPwPhU*H>5A6c15J08Pu+z{}FG~ z_`-;{Y(sAfwju_I-!tEssNAu?F?&}R03G6%v~Lz1R(r~o3cF~{FqW%ec0H*Gj1~;) z)+D?>Z)sU+k)P@*xL%(p9mM3(V`th)|Jcf%9(B}F&p!L?8E2dUPfi6tRW4!yZI2hs@T8QRgq_F9CtgOoR-hLFt`mN# zwIP+??xVu1f84tG!Q~NoD4zw4f~^R}kn|?oZr`-wpX*y@x1@Zi-E4WMShpvBXof9^ z-Lx@q?8+n*p`kKJ^+*vmp6#dq?SbEZL=hV&n=7&s1YAY1KN8JsmefnWRLNhf#lNu| zjG%SS^3rtzwddBqdJ$WM=XuM(6i!PhZW!dXyP_-aAHi$gsPI{=GP?;dS9%>p|WRFaGjRd|O3Tt*F{^&R zQ|UimmDqAZ=g7yZ!mbDzq_o5g+tX~A0-6%po}=Ly{t8`%#l(UD^{r>mAkFB5q_2rjeM(+`hw6JW6@zhgK!E)F<*fvzU_?E$1?8naI6jt|N zarbgjE5u9w`iCnDJ87QB_9(wS$M%T-rR}GBCxnYu(<&ZZ`QXO{bz?vDjRG6XA{TId zw(Fnmp?}hvS=rikh({Lt&!_$ucpI57IF*$$9>dA%sWa#_S#L@-Jysi>QId2eAX|UR zbid^{>F(>A*psMBR{gsiK@>dD0K>OA{5cl8OW5QEf>tzS6_gIfZ(rOqku2!GsYA%E z$78p~Jm#(=Y5r^!>rQD<5gauG;v^-ClJQGBX>xs3j5??RzYLaLN0m|aOb9I(rPPAo z#zR4}c@8CBh~(gk;M-jj|F+|T;sW~a?0PSpyNO`QN75XZKO1592eZ2Pseg@EERwq* zydWC>BD?DqhpE89=?!9br2cDfqAqmH#Q=tazj&Sh&g9LD3zu9s?pKNOguBaq!wol# zA3q*bMDZ2=!yo<-4F!%g;ZLr-Zv~be_Dt-d$%)vTL0*Hff0c1V#2>3ptiN%YI7~b@ z|M^9Wkj-Q&?d|Otio#aV7?$EDPG@H)_QSv?8EOY^2B2Ulf>Xq9K0I0Z<5h9qA6A?b zF1WXn(un`g#h;%mcL3#gDVhb;MCh6jsd*W{8CMScZJ#$*V~V$^4~cVO0P&jfa6lzt zaB>D=KW6*}^1;QcU@Ky9a)up$Xhb+!oh(^wd`H>eUs=sn>BN%n@JBZQMwE=rRBU#b z8-KDSx#^8fbWlUDsQi3c)u(K9}3)F^bGQnZt!@jX8z{dXS{=33&%`&`*D zwW)kz>AB~gTU}lK)?04@|B4mVFM=&GuD$kJY>A=T2NLz*oqp|h+hOJ=7H;RbC!sj!&YJmFETg@x$qS2VCWIijaMLQQl>%qnz?|_o{!`_Kc+R&ye+R z*t4vhS&dG*Vop0h0nzlIC`-2fa}#|Vw~NV#O*UXk(QI|ZZf01&cF4iu(yV;>cFX#X zgFJ=}PCNd>-a>4?DbST)BEq91*wr-uco~3&U!l?onyzTSbPmt}r|^*y78*mOJ(D8& z#9@(^`?hzIIe8nqRmclb|9gIK->RMiap?kwbof@7-u^l+7kw5J^Qu!#!25URorBKctsk zR=aX_oj5^IYF7kvI_hwj(Ldu^rru2%cBC~w}5684S*^hA)6Anx_N*ohP6vg6jS@2gq zTY~izbYbV%I|6^5`Bz}Zv;!WBg7?WMpNxa5F~#){fB1vs8-Sy#9Yy3BxZ^nE1?+#N z!V<)SpKrnAsKcE0Q?$}tiZ;cp(6smzY(=PtSNE z!pt+wtar}=v_$iSiG~3QoWB=YM8N2p^O_$&#S@&0x z7124(NUG;k?5n7}4FZ_qDUlll^Dv{0-5T635FDg;Ggnx6RyJK${}D-UJKL^_-@DF3 z3*^uw8z&OQNxY4m@=;g9fM}e2-*r&W=99a`@gXt0XpbwJV+AqZJ@CK!w`&rXlZYo1 z@lYfh@fZ2A!roorMxXrs_ur3wtb@TIW)fl7DFj6COJHeHNR~%&O=;QefZghp{H%tp z>mP**9}QHDb4ZcpMaj%caOnD9jcna_(}cRcpQ!uu^clZecHa`kj4d&+>h-L%&f+aG zlz*NC*H`Q!h$5Wqmi=i)IwnX+Q!mH#Qs*@C6Z`Z0%dcmXTU=jSz0zN{I%7jEPGAoF zBcH4;f6|ZHlxSJm0dR09f2F;l<5!||BCA#C_5%i1ksiuU@2>bi7UD=sO=v>I`@Z>E zWlx^-dr;@?II?TYA-!dDJjEaQT(bSqzglb@o)7);)9Le|W4}=CvsJn6pG!4tkJ)rE z7FxGYnv0;eOVS^t!vGenKsrnof9wt38>n1bT)xO^{T2y)OJQL+rmGY7BsD!=*|E|S zoYGtVagkAmH5;T!C8)vV)Ix)h*dQ}~F-q2^7FHu|%?mV&IXn}#uxa6$6qOm-Y9VhX z7?1SdUGSq5yZPR6wXvEluWl|38CzwbTbqwz#K76Le3`-^j@5 znt!YoYO=v`k)D#C!eAlmhm`%Ft$(BDb+R7}SmIM7m6|qf+PCDjZrwWkUUSVg7hZTF zlsEFvm7Ci7LgV8Nf2S!+q*baQ@Q+klZX+Zu>9nDlEUM>faCl>zu34 z*)(e-!m}amyYId@zUwPr`3jvko%6ES52{MZ8qTSnVSkLFOulkVufI1qEmGJaCn`!^ z^`n1H4+E%wk_8Qqm1FB9pYYntPFC>nB>kXzqeJ@1_ObL*eWmo8@j_@NmBWSUb3 znbUp{$`)42%Hr&1_&*JZBdMRYdvc`WeX7o!>{GWxC!Q_GcZt(N-QN_^pOx3l(vD4* zHfh(PmKACJmwi&yzP?+`E2?>i-o<*n>Q)i_RNaEmvEf!-yp{n^L0IP^D5f-#?qdJ~ z0_WN2X}q(_lfv2Z)RJP5r~62Vo1+2r9!9VYw!(E zdW1OBy3!yFGk$bj-!tvbRclt=we~Jbt4LjT*<~2>#-;_o{`If%!MAkjQXr9P(DCb_ zv(t>6h<=t7t?XAVli z-FM&p-h1z1Q-PjHPb3ws{8x#bKrC~?(e{)H=dd4|_ak!!Kbn1N#>dB&=4t;^Hto?+ zIBNE9UKPKQVuiT=`s;B{2e!mmuwa4VB?OYTc{7GptyiY~r)|&4-x}U_PnAqW1m^l+ za=2t74aH~IzqJgeF=XgRk4V!$w8>Q##g*R-bL2IFq-z-TPf{}Kkb&XP44aSre3t9a zz+!KxCnP=*MO!isE|8f;`3u6#JN6?tQ-_BBp(b_Mci9I%(*$KG&3-b&X3@WYxwqlC zMz723?Zb*HHk)+RSt(s+RtDt>PS8dZLHXJVl4!m@VdSz{K@n)^DpOAD#VLBdc<8Fs z`4tb%@FcS)z@qC*?wS1iIQaN>7CI7+Lk7kow)yrc)ucFCVgS@ym|9_ z!@Ut~QpA=&O!klLz&~7+x9kqV{x_`O&^WnKiYxG^{3Kgm*cF2by9;Kn3h;;tWpWn6 zatnSvtS(u}F^}BcLFJb>KeFRwAG<&BqluujG<5xw4*y$!4paSKIlH*>z+#`ko*~Bj zShqK2V-`Eq{V6--3o9}vY8>|6io?D=R4j&2ezBRMkSk?%JX!5u0bm$9Kl|vR_-U5b zkj^9}Di1E+Mj_AIX5nb;kx4mth0!)g0IeF8^(p()Gef5FEAO}& z!@H0Xhsi?kBDxIxX@VIztmH_CkhkOz6mHbxlb7lj<132bP-{l=q}|;J|MUNR?!}j0 zy!4{)p-%~WEV_jo9om>ghI1E@o`nk+UUk(~Mn=f=IXT;o?A~(WCSygJ5Nl3oZ+fJh zc7Bn{8Fhbo!QJT(T`9!O2u*t$nHkS#SO2-~2kDNDj77hOP8f0btUnz(_mCG~e6gi_ zWB0i3pZxV_Va)bqUr%-1bkY&-e`6sr5hYwk0qGggOndiPn0C_?9?Kqh*uBE+&nQji^XFIy&$O zdyI}4F=FfS+dQ&cwS1AkC(s!R%6a0l6c3{O@}w?Hyo5u$7z{k5!s)9Uv<1In&oa=U zo@FJtE(d-PTo-{24P;dR=>~7skl8#Lt3s>@=7mfQ#6hf#P9}p>#gDa*8wO)w(_htE zq!~P!_%*KVWJXx2QRo${R41!u0pGF!h9ceF2!A||O^_1NSQOLZ}oQ7qazZkeL#N4b@x47rgT`4pt)CkYli6OSA_*1Tl8mA|3>=~iIkSZ zuCkvy@3}M56ca~DU46d$+M}+$=7DRL&Fm3{o5VMT*jU{7M{0P{3q-R?$xTj%4$WKj zR3{>s7#WFTw7#UYBodCGeUK4$IP5=K6J2-XT5+goJfo?2Nv>9c4s5vSt;ct|Vg;V} zT?Ii5^PA23?OA^Ne928$b_lF!s1%bYI6Z{|@fMh^jbPBc#}!TeNH9b3FXTD#FP+|kxmlit?&=qcF`doqs6cap-!Bl5e$hx&8a4%v zDqW++ZRJTLNy|z55tTL!mY0^A=F`Kb`P0t{CGqTD_`{PUtM6PT_7z<(ch?1LksRa{ zmZ;&vayvbBOk<;8-mC*`@q$G0E8eba1k6ON7omya^|!7QBP4IT81WKL#4y4sg4?jtg%y&0+RLwAj`VnmW`U;d zn&J&_$*kwy0POX6*WUmDAOJ~3K~#V9Pg;3G_=a28PdI&IVMI;`utx8A?^JI%`CA0F zU%6Q{k$u*Dxz>k0yNm=40KX;eR^6sGCG~?^E>a+HT(4{kVV4_M53Mk#G65@>1YFQ* z{6`v_Ce_TP)fOx-Ej67UDS!LpCu{?@pR_(dtN8ho-JXx>{4w(s`HNB7DwN)J1 zxyM<1U};`V&5joq!1c?bAEiUxe^=7Kj-6-?Ct$vhUK#RT zfAcyqkqGQ`Rds%iwJ2A;np`ZnYc1RyEm=g31y$Wyh-gDhjFRzp2=5BFY}d((X!!Imr4InVsSTBO(}R9> zIhy~V>mN;qBrWn42Hn3O{hK0HSkr@kbvc@U|M*k!xGkZ7;cE7YfkP`&p~SIYrlW-WhZ?FOP5tbbW{qqA~Ir-H^!s(``bh#c|;zK z;*?jN&rWmf3brEbob1#8Tm<5S;xaE+SD|R7&lsMdIR{hdm4cGKzD;Mf2QTg53+*0|RT=*)}Ud)G;K{2cf z1k-e)gb)FxDIWa+D^sad5&r@D*L7vFpR$=%-EYQ6eOz9=(!c!Mo5c5e%fDOYU&3_( z+2P@b9(MAVPHt{&Ub<}QJrCZyxwX}>PgDN~f8pR0jy*wXdfxmGo_+3_v<<5Vim+tF zaOmINURd_ys_qAAL{=OeLQkZt!#HWyUO!;X?W9SQ7B60mF)utt2voRJr%r{7r4V{m zt0050%i$Vu>yhTBiZA%E-+-)>cS!lgrep`ul#bB&Xz{1%gTD0qW&GU-njLj-xCtSn z`>*|H=4ocVVd#hyXxcf^P@1Y+bboqgUOJEIN52-cx9LAJCDuNxjW`zwG!b-rBLMM0 z4!=+H;`~LM;LSJREGa2@=%I&juIY8xU6)MK;h%h6GyR%d?)bgjhTH@!?R+r!-*<~f znkdn;XBbTcE-$)`={TMIObPrEFFkK=r58)Go5&K900bh6of>@;- zb}a(I03SPlXkx_RTtH6|tDOfANG6`LHrXX{GALZxHN!3=cfwC{kP6Em#K0%_#S9!U zgP&Cgm%9^pGyLwY#@B!Qf~Sx^S)dMN9B%qkVv+hmJ7! zlmD;&v)F@!84cWiO5gA|&MXfsE{ezEjrUZHIH9)W9r?bI_WwV}{LdrzJ+geoipOR? zHhI$ISuM48#i`bk9kExa?>-$th-dWD3k+q={<1#%6^a#ac=<2 z4r?#0$MG(*m}iL!=Zs@l=0grS1bc7bbWlv5!t&0CAAT6egr0WVX|KKZ+FpC@g_Lpq zpu6k|7ne-8k&y5S#%W(393*5|f;Lu^_WJZa@iR0AL)(_N-X7zvJiPetxa*FT7Xv+V?M$PX`SeVj(pz3$j$SfOHtWCP zk*bz6LiFQT2&Q6poL{i>$veOOb#G z#flPt3pHUB0!0|XZ9mMQ*c8$Hm+Ibk{hKHCR)2&ZRH~_rc$tvVl200s$v{zPOd6TV zpMhUKqL5TIQBDwT5L^YwA|W5s0~r~Ckeu20DZF`+OcP!@D9cd#G#Mz6#-x#qf8rh! zjy>+!)vMQh@r2`-Em`{7tN+&7hYNo}yrBF$RsIdWvW=yfhZv5BvHm_ZDU8jmU=>)2 z8cjvTav|;tlq~U;y_8<#F4L@m*2vF>{wWo7?PU8gR*>54f79kovtOUh2qWQeFccg= zcKmzq&mkXa+i)k2pNOrF_nNvVCZ8@}xjcq#4cSD&B6*}$OBw7?Eb?7wJVxtdR`G*1jxUplWweR!Ngtu{oXK+FUO$1~gCTyVW;7a^C;p<9 zUhxmN|D%%1PfFDL)U+?_ud+9Okd9xLYv!EpLLxES##@ae_>Zxl zUtNC6|TzLM4KCkb!*IzR<46hVM@jXqAO*8*Av#q^t+?a7#$a>zz=Pg^loOuEP zzdvAfRDwcPfPJ(Is!3uv6gF0D=Vw0y)j#q!;)=A~)*=oU-TMb8{Hnnfb)mQ5_rL!= zVuvYWpJ~*;@4WL4Hx7^-$FY_8XawKYDOkYr4U;G?$jz97Er=EYx z)Cr>H^z5MWixdlx&N z!K%@;-F9lQSxm*DD&4c&O9hJAFzCM^=4$wHeW7p_x$t#8%vS*ho9!ao+T@H3`Jgw^ zTY%RFF72yAH7025N0%{I(Jp78KCx6R-Y55`&`nB(95oc{Caci(sS%2lh%N=xtf{T-N>aKy1kFi%Zw4fb;3kA#dIPKhmT zTiV;?>_Xk1b*2p4)|fO>uQ&9dZ2xU%^u&I{$0iFgUyS|USkG4KV;Dbv{Eau>xN+k~ zjNoG0EC$c)~&OZt-q;ev27oLMKBh`^=mQx`F0{Zov%G&%PA zXSc9_Lv@st^k5U)|FGc4ti6Tv79RbjV=#ZVrl$JMm)<=5@WVYG&nvIIf>y%Tty|G@ z#pVa-Hqi42bZKcR4rpy@X<`3m53Lf1(L1i}f~wNjOY75?;`f|t#iNi^DBRT|HJoR{DX_bA?jh0 z7Gl^xw!Qk%kAK8aySuyZd+@#|{`y2+ZQbTATi_WEhPR5X{ItmLM;oHMrzac^!NO@j z46;&rnZIQDYz6QJF*N(Hd8%Y%Lqc38=kxC?R{!7XJx<>Pvk`Cl|LlDSfK|oS|GZwd z@4~X|B7!K28e=Tj6$={dipCy|8a1{=O*FCmji#6wO)QB~6E*hmDRyiqiXCGI6lv0z zWeeNh+kO52JLlXxZ(duLZII7zSmvFXJ9FkYXU@!>JN2fUumb$U53${o3~mg;uq`eP zS+HOME{}fy{r55ZfEzF6DQqlXxagvb=FX)>)M&La@cYRppMc(er|mKJK*5j^$;*J^ zH{@dpD5Gw2`;){7oLeP*NhjZtMqmt+bSIa*w?ut|g(Sg|x0gF{dY{ILU>4U*V<8 z8~hsxGtli1$%Z7bdA0v;ulFZE`w8t8N-6ZPWd|eXys*pwosvEF*aJ&va{C9!iYyVP zOu?YwO8FZ&rGlTL*O(`dx%$&v`KNH6VZznptd^kYr7fK;TA!F}a#$c|$P8x@HvOT# zkB2tRhxBw%*(598TTm~<4INhW^I2)7-SBRrEb zu#$EUR;iC4!EYd=2|)&0J|8l2we9M;DaR;7#Kje0QAI(6S0@f>>pq% z0m~OK#UNNPnv0!gpixt<{^vEvl%EPZUXGcv937SjxpuGdlT<0N-MnPg5#r<6NBZ zfywn}?_7)0V!`S}bK~|V48?-sbTumw8;?KQ9hv>sTg64i&pi3eWA{Jy$6No188O_2 zi={J-atpGz{@KaEKnAe8!W0AxG`|n>- zNoTE!al73ZQQK>;z36?hkw&@%GQOTMihu{=o57HZoDDuzLF*4z%p*>SH2<_wZL2(o zc#AuVFbtRxabp|{Z(60c3#-q(!|$!|u4Gg?U6T*6KwLH=gJ7?`QFQbi{MHkbCvgxh z=ZBi15Lr$NB4}W<+DQ`RV5bnKZKg$G>}Og0ZEyTm4I74`Ds&N&$<%@`7c5)0Z0uHJ z=g*@9xh!MyBtHGcpG>5xt{CoYcY5i*CC;Lq6aoI0$zNyP8p$;D-+E-qWFX{kvjyKA zW2S|N9OT@y&i(tne@7pERBataaHzJ{wvNt@BaS$trMcz(58n59J%9egpAq1>=bszB z<>-qpxah@KUZfEM$x9|rY?ve_SqhogDT!G+!BP6E{}nG41(tcb>te1ioON5)VVv{X zXP+hZY%tgG)KgF4EZcY9c?TC^H#axma?36DL;6JrLY6O}`I6-eSQiHW>wbORFTK~T z+wL0*6U2xo%L@)o41WE^DSGO=NK&cou;zRuQyEtCM0+gc4cQ;m-}-BDPv_A{F0-sL zU|wEXv1av}a3^EnDCHI9I1>d^JUEBjhzY&QZvX9sj5dKd3?2U7w4doL37 zU9#J*yWM)zt)KqqQ%vEF9z7bnbFu7T>#es&*VfeAbkdoWv&B(@ytl9x%M5S1 z3gbWboO7@K`LCvZHto6z*FBo}_k+hj5LoTU!U&WjF6l+pz^t5}>B!4FuP6Eg@XzQX z$auBbdE$u9i7k)uws>EuV^l00RTb31@4MMKthU0iU^I1~7Msm1D_#BE6d63zudWP- z&BbmPO#J$p=1D%bBZGf>t$>ciVL7nosR=Vs|M24@&*Sxus2Neex*l!)$dR?rKmEMX z#&JqERgK$f+;zXY4u3k=*ZtR(>*%WJQ?wsvIgTkpK}%WHp?p+Z{z)N0u+S3mSeBO#)9 z^7k+B`M;tG`-RIFjT=AC?QqA7X_q>dF+wLXzU}9CZ|Su`6s6 zzV_N{F$iatSZ`<8)Dx!S_)aWMfA5`l zF}an=vOv0<2mVZ`d0qd9U&K;C4tZq;Pu8E7=H^l3M%fJ{IM4%js^d;Nj-6yZ#0EnM z?QQKjuUIo(w6wy+Zuhm?YeF;4CQLqpp~pA{^*H z45V8&qLndk3oXXfhEAPFZya(;%H%Yj2#i6Nzr%t1gzmikPUr(BWiI*IB^akHEi2t^ z;_kQKdK>O_Tejo&`ya616Vsm1Pzw_UpRRpl*lpkY3l=J36Agy+KmPdRoXVwQC9!o!w}sBc z!P;uvf#c%(fW-mAkMl+^{ON^s@!m&)osY#jvaZ!Tw4PtOEA|0NhUd?pkE^5#Wj?RJ z?iGN@7)8h%np9RYV@i_s*co==uw;6>2Y4K>K>Q7Qca4i!Vdg1Eg2y?nb_z-MU{HpF zDJzV`VjIY%Gm9V+RvuGH&n|qn=r#?KeOE%E&mnER@fQ={t{i7SvaMCz;+e@(^)888yEeW;Z1*&F2sl8 zuDl$VfY8FO6;CZ6@srxpPl_VC|z$2=7rMLQ9<+(tAB@xn#uAHcJ|e(hmXzR#j6*#6s6((p7f z==hOR;c_&}Zs6Ju$=jG>=(!v>4u7OON{b|li#|N_sU6jhXQ>~nUEAOPpZBq< z_x9Uw$Mhl&9K$72SO(Cy^@6?WBG@@X#?a^G?8#0-*b1F;bP;e2iZ3Y@SXX21gur^P z-rZZ;`|G~&=QhW*fZu7I;Fht8#jM5|s=zvpo&hDyr6qP={8`u#(#j%$q*rEOl__p7 z;}|>v*|R`-8}G< zNdBAU|E1b0$AK_>Ue9v(E!MQZU40!t!k0%x{T#Ox3Xa4A{nvpdxJoh{#ffoq|6$oT1h2<<| zrKR{R35T&2Q-J4d|G!P`&wcmbk82vs%gR@-Ub*`7)uf!G)bv@?vDFr*ci^}YtcgLX zQGx0<*^d*1M0(Umj2B_kp1ldbkRHl6?MA-8ut?(KpIlt`%9zJo56;-`t%WNW;`sa* zUU&gBZkP(e@*T{E=;~twqF?O&!3YGFo|v8{z2PnbWyz|U=~p1_G(`*IbPm65g!+q$ z&*QuPhLbAUfh|Iurn;NS<0&2upHW^utGI1UJMK%ho~DzcvkfFIJQDdzZO`m3q`3-U zD-7}P2|q>SjKEH_V2V2gvb``fU0wVLMpc?CHt`WBM;;*jDBzanwwUWo<X$o zbdfJYyHboJ8Jb1(mT&Uqi6`|$BE$6m&`+P(MQ8wdn24}uOf zt77&$4ofT_e)wTbL-f!^ur6aomSDKJv$=>KlQ2vpFVs}ZyTXk>sJ?J0WD7pnFkmCL z$v*nA+o*u+8F3m_pdG8zWvk_6c>dD9}cHhv-y+p}V<9Q#rR%|FM!F~|O)PTsb@8RLf_L}Hl|VS&So z#IA*GN?vIFXp_nR+k+oX3BH7if<^dLgdOk)jH1~z^7k+EjyR@9y`utGmU%yS#}jer z5?Ywh`0&CP7h(vv>G0O>x`=MLavLAKed(#)P#`)?Mw#krtBGt)#VP?*Ft+>G{-C>$ z)CDB?32b7F;f*10e=4ggcb~W$Qm4}}NShkyU`w5JLgx~XYsk%K_bEFomp4{Wspn$s)L92ddTC z*?GnpXJAAD`UX*mG{nXt2Aoc2&dp_)GP}8ZE9IT{d4?x+1)3omBLpi7-jC!@25Acv z&_d{%z|XTSc?z4)S18DzqDitQVL+g#;>=FLben;U$ii7{!#k6w5f|b@wGp9V=7pl* zKa3H^Lc{(he+k8*%^(?3o5bD3X%~g9=Ep7~nD_qZz z!1*gU8K&vG9cmoTUktUJ7NVmcA1&JEhFZyKR{JBTwq)mh2=NOlu`$G~8$%(&TXw}N z6SzDA2SVf)`=H7nx4})GJo%fY-{3rqU{Mjyu3o$d*AuC&#*Hg3DaL79d+ob7E`>4i z_o{s>sFRyUe+CbK^%FF06z~LM!{UoyUaW@MNgWUm)rE0OnJq3^fNz&CLP>Q7QBYPk ztL$HwZDF$j03ZNKL_t(ThDPM>NcSCgS&Jn6KL1U(+|;tZ1*;};j2QMkVub{VC!c&W zo0(F-_{A@9Tr`d)g*L)Szd?e*sl)f;js{HOS-FyEWHU#yL1VzAtfI{4rYRRmNhgp+ zWH~hmiD_>p6~4a-pH42NA+ zZ5@|~nH9!;A++CxDUJWcaNbiS=6EM0|9@+u(6^5mcB}C$Cp$ccOn#bXj@% z%b3}Q0ZwVNvLFvIe%vbl*6g<~zv6PtpyQ04S6_KG%tuwe^76}MH4 zAUJ}^!X^l%Ov#3OFxsEt)x$B)v1;Wi^j4+)#Ja26x>`V8v0`O{Z}UncB2X-!eEKt} z`0<(U#d+cNXp9LCb@iU|DXgp`I1GuP(c9OO)yC_8Z}9)~pZ~NLNvv9lI_7nF94^OI zS6zjp#vn0$ez{;EWT_PPv*6T(88c>}i$KWp8G-FaCPC3)7aPqb9mQ@j(mtfcTQ{~$Ri`K1)QP4Sh4q+6qQL8Ac?ZEB~yzX0bw4 z6qh8y?MtD$oKC~Qlf_e<6w=_iQTS`Gtc~0gYyVy(wnw|#TlqhBcgMQ1q8S4WIQMDY z;jQYVF0|Fuk7!esrwFhgE{_n)*s7UAPO<0Fqe zYVH?bp!OKP4kPM?`5@Q})oyuUiIMxwn#@F!hK-1>n%1o{NhES<-c;^miLjvLjf zdPH=Fp(?wvviN;mYeCU5e2?;z`3r|~Vi^K#dO$<^{Dd8rlW3z&BByPrcz9j_A$X`D z7rz};ekCxtQ6`D4C5^Pdxr_+R$tk^8(TM@YkNu62$PDE^oA6|1G4Y1m6SU#cb2b*v ziF-~we9GbT=Fgitb?R#~Uz_v694k9qcHqUi!0+JVr$qmo<^OHNZ#E^C!faCg&oBSD z@-OuHzV=bmc{8Z(zx0S*NWJtSb6dGO;=>9*F#x<)A-w6a!g(4R*}*VXai?- zSd^wqVA_>$fq;Y~-Od=WGyDe-KZXi05dyj*izVDoSxjQ5rvx z4Nd#$bR2xh!8iZmW-JWEl*ccw`o)`XyjeG@4toV|zUgMXv?lH`ai9J6`S)Z0wqFF? z;AS_DBv&$n-2PyF36iLMuGsNRF?BekiKbHAWbd!0<2xefw5#n^<;B%iGs|o-kd*Xm z7b_L8!4(@ZP~XeS%5aGZ?nS%v&O0SAZ1@Wef`JOA3$)Lc?heD$^0eDV1g zbbs`aZG10%r(^%K8)`hq0#`G{o_*(aCcPr}R6wmjC{p~W& zuj}v7=s(_Y%`L5Q$JxqtfL+0=mFu)vvUdIY2QU!rcDV_XZZ7rm-YeoW|pAZSBuJ`z(4109jX8#}}02orUpl+KY~a`JJM7PC>kz7H%!{a#pi5zMzdWc9`yZ|uJN?i5I=n{U2(CL4Jpi>GP# zVl9Gb0~G^rK7JK_V6`rO6?NHj046uB(W@5;^e65?gAYy_FW5)cd-X-t&s!z zp@%&fCq@@A#lfQsLQrfnX&dJjpMSvxk3I4zx(J2vXCxsU*ya~9AP_gvMdCnNH&l}n zqxUxXGhiz`{R{wpjIfoL*Q{@SIG$)!t^@gywkDOB;ZD6Ccl}1GG0h#@ln4J+Qdi=r$Eg#Jn>1+> z&csa=C1TC-L}_C0z4khE%R|5VlJB4zTKz}U5O*A=TnCYy(SFxjfMo3PzcM<0c+-dp~33sCi@{ii&M zNQVmlz_$N=z+d^9uSIoG#G^X9rgi(5(HcR#kx`*@-^&z?jee?~)&m?5Dz8l%cQ1=xnI@td&Z4&j_;`ClPZ3V2kT)R9=~sdGjLK{XPrvn3(3_QJ};7-RvDaw@RDxZ z`nGUq7~O3wM8Fsw?i#_(EX&n$$ua>RLi}mD7&0VJT@dLIh2>_%{XhI7unp?JAy+01 z8Irqz{HYAkq}U2<)h{FNe~bK`Sf9}C!S?iYW;qu_jQ{7C{Tw&Bf4bzewMW!1N-o|f zbO2VCO`A3i?KO7CO*vx9SG#;^^$+a&O9->tjlq#W7A-30WJ)%}@VJZf=tyj~Qt9KK zEQQf(qX{FfR-1m}$2pjfKK$rbTWy8=hn6f}($drdJzTP62?iMU-goaa&pPw=zuZ1Z z`VY24CV!EV$j_>1hA^{9LkH+l0r`8s_E@juYUOUDg#;XyI{Ha$4Z@5)Mb)2e4(w}y zD#B2>e8yst?@`(>S7fFtxS}p~Ur?PNR<{;Q|3D+qM4A^<*kgmsLU4KOl9F%KV(ed1 z>QjscU%t0;WS)4|QqmMc2?YG|E@jE-hPXiWK+GzwQ5>Mrk8AZat zUx-5Xfa6C(STL)iI2WNt>gO@iN)v&M#enf|6cdk8bA_)AMlg2lnLYphFaa3+;?gKA2J zyTWLp0I~;cItx978C3k#UgYS1mYjRQrtxzWa_PVtwkFKLCOsJXk3y26H0=VO@nh7I2r*&+5|G0(}%?zS#tQk>r$%U63dCZX-+YsYVq+-f} zrO@^yy1Y0nkyl|Wx+&)#u<0V`A&kzW4xB}Z{!~>B+itsU-+TAH_08))YW`^ViM!+I zOdS4$<&zi(#R)|(zVPCWzq`@v^Wj)0OYK>j1ET-^$B$ePoPl_MflnXg?~b_C(;jtv zOnsu_>tZR)f;gPm@00W-m%g=B{l{DOdTIH4MV>|vi;aq0Uekqo3Hdi5AeuIUQk=-S zNoZ%?O%)yQ_>156N1aixE8p=)njLOMKjaWO*ZR^+FI~58-35nV(BbM#;bcl?u6b(0 zDtqbXm`$N{h1e#L#+NZto3O(K-0l78C!bjynXk?i|9;{xEh`HK18eKoB0IP;2Tm#tDikV zO1Dr~xJUihfJJoLX%aduc%n;$EmBYz(6ED{AkX+paMBzEh7Gq6W?Ts*KH6UsLxbM} z%J4L;iA{wcll?dU>1K!m8!pa2{rsxRD!HXvfL(vX^|$=_mPiEKFVZG0x3u42$=`tu zQ^`i<7?Dv%lp5sN;&RY=kRm$4qOl2~od!};57Q}h@8#do-hTKIhc8;V2=k=SN4hp* z@nT%KeCYQNd-%bJuo-ikZMRvtU?FOXl}ds3U!DR?5BT-gO1*u9zYS0YC=0kPy_qLC zK=&TM&b}rxWDB&qD?gz1*OCV7f88&t6E`FhmGnxbvpa!5;Rx>>p`DpiqHR-}+EkNz z)4lbN$LLsDgzhwe*zhPqI;&Z1Y^R8?ly0X`H~|gfbvtQ^L##UHS?7_y3BAAVMUm(k z;9^Rg=K!DAUw<8EM87-dUDcJIWw06BzlJEuOPuyY`4x~FDvp0S^2j6ayn~i#qH+RZ zX7CJ`S^U^wjXoD_ifGK=zz0t4FU|}uJvcTVzc54TL?VZhe&R3i4bmrtmw{9A#9r{& z$f}R(TX#~iI*O9mv%a-_Wa<4bcjWr(ufON+d(i3LeuwR`S`&3(=*$k$}ZBe6HF z{CC@ZHw?GZ9d_Jdk3IL$ z^#YCHt$(^zj&aRSqObZRd~~L=+1hTwkF%2S2PMG~^w^A!zfG?H8-*XaKzImt^QpfY z|JLKS#`O8B)vKl)HHFr|v%%HXaUD`S_FLk3asi&pvx;#!K)#`Q(#PPq9D}^rA(Ju-_752Q3Xg zY|v5=;t%JB&5+dJEcxRq1KbKG%?l6$c}v!2f|VIx@`>VvGo1YjMs&p8a2J7fgo2u? zO!X0dBt1)qq$D6XoNa=(we_TM=k+baFB(zyHqB;E+7`;VhMdj7kTn$t>O?LYU+vC^`C;^-z${z4j7`wJ)5n0ZH z05Tu+0l&a&@4}kw3WDqmjSQ}4?C2$ML6ZC_E0A|>#iwi9A}WH}8hB2qZ~xhd(!b+M zo0CpC2~&F5Onld0?-JxgjGy2zO4y)#sXs$3e~dGI@x|Oj51p)q#z9rQ#1X%&xobI%dq6{QU#2CI}BLLP#MrRF0ivNyVh#eUU#a z6;hzOtrN=Y%t<)EN1ye-Z}^8;fAZuxQ~uxm&UgQO%b&0Qe^-Av=R;t_d3@Nwwd7B$ zuG#Y1f6ly5@~Cadc_{H06$iSTUymoYR<46dS*YFN-{dTJ^5vqUGAcVBK!W#>)!#Q} zz488g?_*GFT|)y7Y>32gPelCs>u(%R*A;rPQB$iWq0Kd!^3RJO-;Lit?EAmH@wYgI z5Z{y6{=aMSg@Bn0d>h>G>l^g9fllauf&SM$SQ?)ZY~Q!LYjT@9NR__s$7v$yPm@v3 zZ%%I+fA5GaSxU{_@I*seWoe9rXRWe1v1%DjQu|(^&fl#^O=!HYq5JB1^%Lbf20GEV z-g+z2MrZA;v(CcZVsF3mwmdae&}>$a4LD&Vm=Lfj3cV&Rtv2Igfzp@rzQoy56vW{; z4i#>5bUZVpD7j|!{5ZvPy8seL@L$UeVCQKz+yBVoLyvy z@-Bq}8#L0bEt|Kdqf3Qp)rCrpYG}RU?YD1z^Yz*2el<5YIh<}E-5(vq;5nWT4SrcB zMsRrmiGlT2e{{Y??35=%&I5}d3JHU==<&@2Ng^$Dsz%m~Jb3a!_^LkTv{UfWPp3*S zh+gV{F8+@{`grc=b0;5$rD0TF^0CV-Qx)YElMkJI%O7tUSpDgn{HbxoAtZcZT?U>( zlRt}`WTML&$f5sz!*A+|$7SpC@`{s-=R;M5tFP>^pPONzvp;C=1`K&uRGw!+2>6%XM{idkD zm{7pr0bLT|JXkr8Q|{pawx;nFck-pGsxs{JB4HJ7|2L>Vc>Db8U;je?0Bov++u#C;mFrhd{^gCyqeM&G0U z488ohq*;fQ!XagUy7^C7;|aWc7vgCi_NhiKE z<7ISHdZXus^r{E_-#GcB)?m;I-xgebHlh9t0LWzH@Ec2>H*NhD{G+zm0;eFn_VR07 zcd0=+OP%|Wx_`9VKCHqWuQryc;V3)E*=oCn96w&SuE0U@?o}%OE4L%89KLvJhq(Js zN^RBFwW=aGXOqYu)vdX?E$+I&zM&?m93z$Mthi%TbMxPEI3U_Fv%YMs{-Y*h7YVjj zUVO>LBkM*^e_}e?*Ye7W+L5(~9Ck=|xcjuzPQ!GD^=)9k2!^u#A5{H!#aw8Gs4vd5 z>hwOf-guUt%8#_$)I|_kYeF8FVZ{dn68OBJVF}D_FhSoO{5nT^l#D%R<67scIk9H# z-`A=Gn2np>Z}vM*?X=TQfB3^6Zn)uwr+0X%>*4j(?Eb&v+6PO)0StwYq?l{tDLf?% zv$idH_lON3DHV&yLZL1!1wwQ0aJYP4Z&7g&oyXqbM|QxsP+C%FqzJR+FhKZ`etXy9 zq?yQxf3Xv%ej{s;Fy6H+XN$02z3>NMM@3+*$MJT1`xYvGUEKK-<-#{BMZ+kAa{Vao z*rK`lE?v6@6~8148A@SEIrd(EhF<=V1}T;3k5X8=D2lag*)lwV+F**b|M*33P5r^S z9T?mE?9)$0-v&_sNq070{#0IgUE$~e)?_I@5rwu*{DY+bo3s9umzQIWJ+7Z#zn)KH zW4T~uG?o^uZ(YA)`3kAEBL5Z3mv1p<3rGo}pg*f#Uq!pOlv<&_9Hr`t-zgV4XSJV0 ztpAb3{>rsI27O&6bE*QX)^u#Ex(H>s`@|C8JdZm(^z|1_ciefna$+SG45}rDKe=)` zC&!bELZSD{%W0iN+DOe6n_JD^=s)Hx?!W(mt+yU`>ZzyV!o&8~wm;tVN0cn`yX|({ zqWAF8e?GFl4bmy`C#XHD{l7;4aao!wFyWuC^I(VrBwZB5M%oM5Fi>}~HNoB#5(I2l z$TjlpS~bn1o_3GExx!?5&pr3xfap1M=5+1AM=m*3Nj)DszIdDEMbT04ed^&wC& zFz^u@gd{2$02mEA2B|tD`@~#-jeDlU?u<=Fw^Y8>5KP0?gv8aXKuDq%at#SR9lV&? z29Xhd;P8hd+o;r7db_Lmh~N_H7BC*mW@H3R{H5POs8YrL^+D%d3bo6H+J)#SU)cPI z+U1yxxxFF4Pr{@_Ygj&g(w|Kzf2>0I#Z_0LTLApK?Y7(JpM8#wrY>m8+Q8`#cK5vd z&bwd^1EmsM8biybLPqhC4Wrdw6XFj@AQ&1;9#miDuhS9&HkqN-f67Q-@gu6p1gJqU z`T@g_?NL|$@=Clv&O86S3op7*(!x@b%dWV5t8rVMf5G`!1V_kW^5IwWEI9I0{7GPw zw?8RNek8XQJY}8+v>_vl7b+))ogup7hR}(~NUn})*qY!xTT0k}`A4v!(K&@N0ERST zu=#D}Isx^upZbrz4Eyf4FL17JX~9szH_N`+a?34|1zfBQ8~*6(!Iqg>63(|l|3wMd zmeLfv7e^=2@Cwy5^lkA0Aw66Yn)L}wy<^a@B?(AY2xnZ?UNs!2`{2clW%wR9_4}}L z8;6hLDr*YE0WtFS($_QS+r=1g14HnUB)}O8k;@;&Mrm>30T>9f6^$RXw6w>a7xHH` z(m*&2Qk@-F7^J$3P8H>;tPSEfF%THcV{q0?Ify_c-GRc7gj&0gAo;-fmO7o-{!5Y~ z0FaVom>-J8g0eJJx|C4Z>&F1ze9;{{TF6377QKQyH8@&`UB zIoo;hXO-i(O@EF&`pA3lxpx`glKk7>{T3q!^=s-+Ipvfae|;lX+P^vL&Erov9;@vN z$zLrfQpbcKL!1n)z6iM1^OR_T_H$_D-`R};1O6g+Ho09y{$Bdw*4=pKf2upssV35C8xRehSwtKIKT&5 zY!FmDY)F-Pa8jJwriKr%ZQSL`>V-EqdI_J8pI3M2sK8P`&L3U&`7#RJrADr-)$c!P zE)iA!Q2;{~gr|ftRn}~(@Sz-c9>Jf{h%6x4b{!T^Ee?m?DKDp^(R+hmvPKw)k(FPG zC^o@n?U4YI3p=zOV_yod!$;ZQfmpCZYw+i$xQH{exQ55rYy8bkl_ zL-Jy%FdPmvOh`_TSEG0aM1S&#p1pd7U$h8$wkx%*Z=^lK8OQ}c?7`4~NhR0r6@DWc z$&+&-e*MRfjDI!%tCh=F3M=#p0)fED+L6sI&3Lr+_-$6MSaJV9?>8W1kicKEz}xY4 zNPXoieYU7{mK-ZfZM{Iv2+h@XVDW=LAxCq>MJerPTNF(VKk?#9V`@WCx<$UGHt$ju z-5Rd8@DGc;H#o6gY~$PiKI8W|{jpRNEuR!@rk%ocsvlV>)c$jnJeG+cOA)c5@x~i( zT)Aqc)8%^Zndh)Ae9^*%*ujKv0~|Eu^?9)otk3va#3E)ADpeV7o^$1oTmUPuNp|w! zw!KXJ@RMo?VxaWLPAB`~=o3_*TjO8uU2%D%+Nn#msJfGBU7m!24cZ(zkRb%v@W;e34SYGdkuort z>eATQ5_A1csgVTLf+>KI##&F}LR^yEH~fMP84;+&Uoyz-2MYh1wx6ivE;MA|U07TG z5#%AAF(WAwwm1nxhH*5meLCj6Lpf^fAPi2zaQ5-$8&v$JY(+^1N`D4V{^%cI|1BnB zllEqJoZQb`zC)J zmsDI_Tv}3ET3*`T+P& zdGciVtX#Qj`yD1s`}edt@6XX~V_yBou`yUjuES(h<^q*`@Z`U`3>n6NEb0iRy4igQ3Tyv$q+pc zR!fzW$tu`jYBp^dYK=~xGu3)a3mwEzqSigKw*0bTTm5QeG!dmq2<~2hzx6Mtxdbb4 z27j}=fSD;ul;<}xvEks08uTVOlVA>lx)(r)ZYfR`MR$xC+AHmQi681h_+W&f>~hCQ zG?>+{|M;V^5h}Smt7dXoF*Zuc>;@&qsnZ7sXsO2BnEQ%k>ABo}6*U8O<#%zx&<(ywQ=C#5pMbnvU4v(fEJ-o_gJ_8SMI7R21lr%#6pkrNLln#Hbku%$MD2Mle_^Eq~tj zzxVo&t(Dlmw61v_FWx#qxvOKUaec=N9UU`hYo*J&_coYkj{P)nG#N45U7 z3CAa(j9u6T4SvMZwwctHP7Z`_Eu5rjP8o7rwh*Z%Jk<;( ziC*HDTrhu5j%8x$&A{Pr?3%)W9m>7j>+X<5VQWG#)8qzniaa~0uOl|gUlo5^UQt!_-D8yjN-tE%d#cQ zu%i`qaqZf*6&02EFol#@%o#G&BBdAG=Ar-Xu^ki+*u|fF4JkbrDitvmxT*@QQ0{uJ z4&J8DA7L05&m~`jjUPQ`9N3@|_o(>8Dv6s@oGMwbVt-SK+sex7uyeSF_8$lZo))<1 zs&?uC^li}Grd*dR_fM%ZDjYair`+eq9T!rSjK?Jk>G`)r|B+8N$T$p0*z|!S6#3ak z!ifz@QOiZ4Y+D}KHX_jzHbU4>vVT3R+#`;wQU788msQaRehP1~w%Q;mPIO*~V1qE^ zVq>NyDdwi@^LbU`NeNG*WH7La!0MYB^fc3$JSi+^Co@QfO8~>xggn-oWFg;p{INu( zito?doaI5Re%8<^G3^AwVZ_EG8Y7V<)R2?gQ&wF)MJ4W1@%u2bLV;n&?{p{b7%_~# zRyAx*Ft-7dzi_i`jZ_mEkIA7ksfnB*86Fz8CggFSdg?!`4JrfE@YfJkR#f zV%LO(*i7&bYW=!I-qjwAeL~er8dK z2uipKkrO1tLyKJ#^0*K3kHmInZN%8)8XT8pC!?{Zs)|3v>LzMDliM_R9e`R;GqUD8 zJAKC-h!*^#w;U}upNZ3EmFHK()_VmEDyg?l*cB6%)OjRT*nCFA)`W!WgZy0ps$saqOOfd zQV0P{VYD&uBOwe7x!jf2)dz<<=0qbe#FAK)8&r<%D=VvMFdJsj@Jl5z%LURfHLCym zGZ^@3fu|cwH((4=3hfwyry8~I_Cw~-GZew<)YSzdX=Z*IVXbBF=+1&==b=&V_@9(wqp zn{K+Per-JtegDf}{z46_hzJ-qWBtb_GnM!b6{t#8`|4>xnHn2tC}c(rDoC%pQw2U( zbeWurbf0|iu@yf!amojCKETOB*tP!jQ%`evg~_R_e)Y?n|M)^Evr(|4-y^;so>j-J`7d+G%3QO4ken8X;lKFlJnSXjx_$iDEv* zh`-Yp!^{*d@D!%TDoWqmGgV&kTb{xeVd=-=IIZg6pg^&yvjHzB+t^Mj|n+aeLRmu@O_Shq? zy7Cw6Th`-V1KeOa*1S{uqYFA$H!Pv>k37u{10UhQp}L|6S&@88@SZ5~ zt?O{DQwda3Uqkq?x?+2rm;?1qf9xuWItZfyNtLWlS4n=Hwt9y@9bSt?yhJh5kBRCV z{!AY1GG&;Rt`1!YzYbs%@=hV?5WXIa`xNxH&}@*=gP%-UO$n0Je;O7(`&nr?8flL> zNeN)=1j!Sz*$6>Ti68spiA`AkMtBPhham>c2G>kBbzY>LJ1WoZN-gvx&QsCDRqR5Q z#30o_+9T&lYLtNR*2sm}Nc?4GWw+dN3ofg~F57Fay@q(Q(Xcfk{;WccWys6^T zc>D%}%KS^bfTy{6>;r!4YTy8T8YKcYu|Xg?)DEj7BJea|Nmn}y;nx{K^lYQWt_cp& z2mFZlfBHj0z?wN)R?^VfJt^k8PkCR9x$a-zdC2^)7Gt33zexVAk?%^&pxii55O;IH z(0NbDpxCT<(3@0g5sqs#IR|a?znFTjZ82CxxS$~jlKjg2)K)PTXxArYa$XF{PSi?{B zdI4gLv%w~s=O!pS{2*=fBXWYkHbrO&Z&u{NaN4`b4{WVso)nUKA~j)4J_din04M31 z9g#_LvRTtHRi(Bh(y>L=@ST0`@q8$;uitfVxW{+G{P*UJWVQw)6-Jn#Mnybd+;4p`4eViW2%|fW~)EA;HtCxd6n3X z#+*!(#J*vaKBv&*D3~Ssj!2Xwp=09Qo3+@9G zwMSkyYyD5ic6UdqZ?%;XZgZsNG25SFUsJnpzKZPh)qJP&oqO~3En~JE_27dK;szk( zk*+(6QgG26`1D`?ja~a$6~wc|?TVrPK@-aZYrWZGFgzSco(q+?o z{iiA!nWj8f*irE-6*Fa3$xWpHxYq;bn{U2pZ)=zA02$sL*fO(l(L#(>L(~KQ{xyU^ z-9r=_#r=Ne((lGO!bI$qTgAc5;#T*XYR{G(GAGWTi z6;yeQhOG$>lovmCxpjuIXWI*1FDZK0>k6?b2~pe;ibwImgTaNdMZTF%2k!%7R%uHo zp$UGLD}S7?915dK4yUrS41J8L#7j~oB?|dyR+=DRu8g)lQ0?cGDN}y>)1RV5jyvu+ zOz3<$|4Srv?s-2x?9f9iD(DMy>C&Yw%`Fg}7`yBQ8N#}iuo zd$ATF{w#*a5t&55XIc?cdrgZZASgkbaFIY>e+1J80YHmQJn0kI1}&{&CQlt0gvlSy zc%rDa>k{f8z<3we1{V=wm+gq)+y=Tk5v_l9Q+VIu!8fHNf)FMj0c_#f5Pocl#`c>Z z|M^^?{_$5o1-1g_&dWj#2UU0z$4?pxU_U6+3LhM);s>2=l4BZ!CqH1d3r<@cR zS>X)OMr_IpRc^vfQQ?tF1-;FD3>LZ&TVvM2q3pR*3Smj!%5VSV&-{d`B+dMdFYnD+ ze_EoaE6+%r%A#Tys8pA7VBgw~DsY0t|;o!2p`ZDFkeIZj}CXMt4@K zlw{~!U*cbj$Ru8#0jcz_SQEx|)i|5EmJAe0* zi!K5GJ@?x4@FNbVJvH34Qo04+Q-%B`A+f;_gxIFP`INc{g+f?yl22o-73s0!i~7?O zae_c}K_lVQ+)N##aPmAOOO{v8kIAz)Sq1a8o#(1lC2?}JRTs||7^GUPU@m7&1wK~c z1MxT-JtY&Cg)LkiybvT{m6ILMs;C zk=O{oXN`$RLgw10Ow916e?}~%WL8Vb0b`aZgoi?;)n@b2ABaUI_M>LV`}>Nr$D_$W zsN*=&*W^lvgA_?*-hccwAmKkjb$_E07bpk1h5>X$D$6H$Jn6$sMXIKpherN#bP`gR zQ3N_hiOY-CkUwfj3<8?KZ=41!)$+&vBj61KWXL{F4d@-)kR~*l+B;_H&Z#~09>f9B@OwtU0RXM zC|1bKpZ4y9*~6hcU(%JuFq$V8SOz|hg{F{a^yoz3RZK&004p~Xw%76xMYdDPla+fH z6@Ne_&IU)>{8e4aJNWvFpD-BjL^HppKf%@pX|evJ*YelD{uTWLfzP6l8dHiIE=}srE7nc*ps{V$>QSIT~4&WYyg0u z6VIB!{Iy-*!?oZlRkkKHxvuE>e&TOyZv)%Kix&e4Rx&SHvSiHIG15gab72XG6^{HN zE2m@X)Ty#R3cD1$B6uO81D;g=Pk7dV5DR=pZsEs*A{-A18;>Y74z=JwrpT>W@7|;J~rU3H|1uA2R3;G&kf+uk$*;9qpT^joMrG7g^{e0Y7DLZh(ra9 zF?>8vd}0^aV!ylDr!caK#sWvrj)}&Gd9j#-OJjiWAFI6h20}@;s#Gb&(w)2`kfJpr z88T!E3reS5@b}hjhj9(_Ek{Klk}V>*stRGYKR7o0*=IkS{qQbd zeXabyE$;i*92`xEV4{<_*FZFE|&ZT<)28o)`!odgq+){qEknf*4D2-lRu@9=}R4|VUYC4QV9szcn>0* z;=~mH7hing5BjgZ`f6N0`M~`TAbhAJ^z1Xw-gf(KH0111KmYm9;W^;#r&Z#{k0^$# zrlv*olG4ANsm_>e31w*zMX%2U`BICFUg;t3yNn;lbXH^;&wtjjp^ z$RjVi;xh0#e(LcUev#=JQ3BY}cy(Lom&)O#c;1hO6@7`?NsS!6jx8H}a0X$A>Qu4q zNG%fE6#Hj79C#BHG#kVZDd7|m$Y<%2r8rUz$Fe^5=ws;dfg=)^T!WT%C9t&|cHU{{ zZMWSPrH-eqU3y?HW88@vEW!buC0Qd@lq8Zi%>XT zwAA|rMchdFBM}q7ktPGNGb<7U|FlLKdP4r})P#fwu)Ic|!lqdL)1MyjN8=;I-9HiG zl^4I{b#(z|N3>cchru)ISW)a^;!NJJcvQU4|VE_Y}*|> zlwdoX%7dSB5lBU*Y*_6I`)0MDix#hZXnJh=?5&=ews^spkA*`^T02|1LJ`R1wO40i z2}}R+*M|;K$?uUoU5m>DG!0J}*ai&(rV}HhvGIgIF}B42iW3XiSVcu*z106T;lov8 ze`eV=yzB*+BheA9lUna^&hvX#51#xXTF#4Q=juNO59ZCEw_?SLbANp9d+)x7Rq$t@ zeKxkvJ@wR67`L7@Y0}$ozpd*vizJV=vG~0nyg)5uu1kP&Z@@s^tq}4H8!s6AW82Iv zf@voRD4^IN09R}fWW+{8hNh5h9Z}LUvxola2`8TL(~Ez4_g#12@ar3nJmN^K8HS=G zG1y7vYz*P}%pfK1Tw7D}KH&vAN`us0Y!JXbGO$EB8(1xh>O;pM(X4c}6GU(D-*fjp zM;&?8t+(F#_rL%Bl~-QD2uCh{oqZ4h4EuY#e(#-k-y!^|R4Dob#^X@_k6q4$ATNYp za$(mOyIiE+z{Vfvoowy|h+XW)UOPO)A*R^hvC;C+#m{25hpPunIhNoIhynA8L+d{a25ZBzXiN*Gm?2wCc(=Ysu5pMgChUc3y_Zk)% zCW3c_G_>Mz8c2#oM_8R>~ zYE2bAmE$;6;4P1fPbI;*3(PB&7`v(TAH9Kt4>=eW4To@Gquio}i*V*Qj-B}Umma35oh1PPAYf~MO=wRc zv{MI=h#Tai!dEY(!`2ow7TcY_%W?;)>&tlmX@@&wRU&M{C*!ULC|a9 zDV0nk64-s>#9ME<1*vvMc2dbLIY{@20FFx{63BbNFB1(=1cbHp!bpPrxu(MpU29|; zcF?n~Q^L|#V@xekP1ad9VsDrf{9*$E5sX;~@dsxR!e5A7|E!cW7$LM%2kRvt9lj7D zNW=#6SiDvxCb1w>l|>&&ULgPBzU7TL5E;2k?u7lQZYM2U0V;u!%UlEQ8NZ6}C57hk zEb)69+7!m>Fom~eA{lf!!?|p8eX{VAb3o;f6eS6rBf%gU*N?=R3vYuy!a-~xCt^VH z_bh)&7hynTWpIPYwH(kKso-%cdZ6QcvL&TFl9s{3W3crmMjSp`994 zFZt;3g$O}n&&i@?SZ;+xDNx%%uAbW;++MCC*DKf6%6+sI*Rcg%$r#_Vq3QQ>4sW0F zhojr!JC4{oI?KGv@C5~u8Zov(6HErF{2!_=Y*EI-vLB>^vuPE!s8eP=EhM*fp|far z28?TUP2ej|M+H1hT@kMJ39RgvWGDzsAwKf7_qNF2DusOdk1Ib;IrWtJ^XAvr*JDTz za}9In&h`8Jd+)tBK8&&55j}>l7k({c)jC~`RtW9X0s4b~!)p=DWI$Wl)4qj^#0WxU zZp6F+Bp5O&xk4Bm;Pu&OpW))p>;B($W5ndnRvql-t@V#%ENl3 zlQRekRpwg}?pldW%=lDn2%k8rIj&Tm^OS#`(-9M`l!!VxgCHiH)eJ%^4%=K! z>`nrz78t^II-|;o*}DqV3QWp)>H9U0k%YuHWnu;`6bAkh#SEN9n{mxYW?DV)k?3Z` zEZXF6@-%~Gg=q}Sus=FZ3w-VtEq}KYyB}ApD`C{t>hM96^@N5@nLq1%2sTXrKJqnmNHCy4B{Si>Z+87$Yw zdb@Ytr9@qWxTsW?5*tNy`)NT%ep&mHQYY z3y6uG5l5@!SE0_=%F0W16eEmPe5Owpjachxp(3Z_or}#^fPpZ0lY*r8DYs_uLYp=+ z_;r2vKD@AOIPXxKZDP*iEKV)|_HKNb?aiLavfyhp|3=JHL3ac8GEstw@wr*Z^~p*_ z^M}7#re?50Vc;)O@Up`}J9plBC-%poPw?-@|BVG77*5!F>#ebj5#Pyp={)@K!zLIr zEzQSFRA@6w?$aK8deub$h%6Q+6ikY6F>=vTd6E;Rm(VrmjPT}sDo?Cpr3S_lCTu_9 z!k=9D<(FS#vrQryXbE4=D~4b#tPOr4tV})vM9@nvV3!1EcXXUdebd;Xk@#~y&)PoV z$EX_L5_S!JNr<7|^v_g$OvBpWVKJ)9GS>}dRJ#vK~{5&4@Surfd;CUJw4tO&j*!bAX(gK{rX(JkTZh)yi^e_}=i z-3R>b7%`&NZFB(#x`ULCXSIq@5^b^V&_&oB6BuYy4kAdl$sbQ6-A&3Pb94IJ-e%zWVI=ZmpXDD<26=G+ zVXO4d=V4&MhIBzt>NXOP2_8uJKB!3ax zp9{S`{Go8mV~KLNYrPZ`c$(#vm4tSha)S{1+5gtaF$yyQiwR5F#oqes6~001BWNkl_;`-*>;l+4teJ}BIz91jSnf{U~G)!dU4l6wDqE?uoPPp0!A_@ad`*< z?`(VkedTjEW$90ae~DG53Cs@Ati1Wx2mD>JJuQZAoY+Ap-FjTB>?E*Boitx;5E`~7 zBy}B3vY>6?0Zqc}xBNBFjU_e{{E*njBA4*J!5@j$sf2YGS8)(0u;ES?%v7S_+|l@m z0g?Zp;zv#+@!f4b#Qti`L((5wo-F-G^TI7mcKeBw6zMcc$}-m-BJ4lx`AkLnjK8@X zU-norhlPqOysj27#YQpw2_b0!FgvOG)L>>7D;E(yHL|q}m8)0!UmrS7rD_>-xVq$B zL^9h?-A;DXIeQytdZRz!D8aH=XVqWqhe!XQp}CbDCb7A7qur(p@#7Vb=dF+*j;A8%I&g|?|tJ*JI-ErpXjuY30r!<8pwRKNy zZ+9uriTQgK-l?HZ?C>Fh_6EPs4hTdMyN9?z_gV`fkD*C6v+|V|zDUWI)dn>L0Zaov za0)je&uLv$Lj-Gl>FKtsT!Klt(OqLLG(2!;jt=nEVu z>(wh3cSzFe8LA!DpP~PG@ry|F+TcJ@n3WI`tT*@(Qa)!9U8{#Cgr|0DLi{uAO@v>= z)&xLi;nYq|WFVI!D1g5yd@g^0;x)FQ#J7?JOLw49^^YVlEky?0#MT6R_e+0tb~KTj zFFZ>B6~K?}ASqJ*QT@yaWB_ay&Fyjn$1vQi1mbkQ24jJ#vP zyF6`+ZKdI9LU3xQCemWpMNmNggl|Iz+|UnbXuu)gSs#;^Dc6+^4GkEIM$(WE?5sb; z6;zs#0NSaET>o5LT;eKwxngd(NW3oK#TON|9h3mKrs9;qI#ulyqL7X7cqF#u2X=N~ z^0K@!J%dAz@A~^)OP4OiY~N##J=Waf33p%0Wr_7(AC&o)U}FPtkq)!b1YCJ(dI7k< zP;smG+vt4Xpfe zx*`r$#JNe}u1`-glhd@B?zc*RIwCu(lsAAgKH%FaGSH{cArlzrY`p z$7i#}5Owm)&d{qB<#YXVnakFz6yY@jugjKJThkD?J_@U9zKc*VDn;&W7ruHxK|D z!cfwD0BDA~gAbIDY#2Q}!;Y$=x0>6q`3IkOyLU!*DDut2s?p<*KfbZCQKWy}b=Rd& zNwXs(s^D~cd~x)qX}-V^ipU73cv3yYK%5v`aPhG6;Zp-L&lTLLcr3h8_;tFXDq^EV zaq>-W)#5ezZA#%r*Wzew1eRZjqSy%Ow+H!K0wfh6NouDVeZ#aZ1`0{la_IC&0~W#_ zLO}N}Ssr`~aPsPp&$~Dh--oa!_H(Ewq-5S`sfN+y2ptIsS zFwx`vKt&ImdR*$tOD~u``!!segEIqgK8;3p%rVEDd(OGI@1QBXi%McX0&Q=+qUaTF zFsZzxR3S@y30u&{9$3dz1H zkE>02K2$MuLUDf4IYIAbIKc6~f8O_>kNzW&v`mGIw&khEQyq^z%)MzDNWgO`NQa6& z;R}w41pZA+oiR;=`$$p&mBM@t=z3g1nGUIoKefu^DYCIqFUK(X@pFKTaEt)`0~&w= zE%;$utgw+GUIn@^Oe zo{ODM0GwBU%DgMqg=4%gahq7Y%HwXPtZh7g(#-_aj0&aH`!#C`yx4eFsyIGOQ<3=g zO3f6%EISu}ZjqT`%;*~{e}pGvX|l;FP0LdqMic1}nUskQfyJ2_Bu7{6#~I-_ss60# zI@I0>&^f#a-AZn7aB#Y-X}t_3CbvP>Y~a@K=7ZnDMhk0T96|45XrL~Oy!vnD!Oj$i zQBHSBRn-B_4S!V0<;rss@A+J#Vh^dAVfAZ|#Wre??)$CMYy!j@#G|lL}Je z`$SqWqaC9L4HFH*P79emQ`Nzb*2NC|*#(|Gj&+wr-WfgeU-$mw-Y1`UlCIKFYMZUM z*=@JopwXBv@94Tvl2D#^Y3&h}Rd#v#T$o!#l}B4$i~FYC`L-epa36i_28(UtH=E9#QSGkNuCw zhs{XDzW4Y!B-JqxQV_a!fgq%8TLgCTQF2(ZnBMhk=1YrR6E>RsasYaX&Jx(LRVXb% zZsE6EUL9EYYNsZ0{WWY&AaHK@2(F^HRdXI?%Cso83RqxZ_vQ8aT6TN5(D z30nsi*4n9wT>s4hzs_0@IDuTAY64CjQADAg5|S3%N6(h(qx?AEJ*wkkVI99zPzP&M zc-0j)!V0!#uEnki{YVEEe%h&tT>lNqKOV2ZU2dF{IW>Z};T!w|x-ngiVKQcF@ai0#CP4ea8Q@!`%Vl=D0G z7@Yu4@u0}GU=;?zY}lIU5x<1WEHxTMu=rR#E@qK(1UzfIqSPbA?))C)j|HKalg3c9 z+(3cgh04?{$3kHwIwcBYXP3yK(jTOig{`UUbRI&$fa_;|j1r545h}0#c)wO%wA~;Q z!zS#RBydZdq^G^q|K=zbG(hqx<>oWziG{_;?_S53$Iw?xEK%lmwPxvmE`Iok84UT; z?YGzjMmPOwRkYKyf6a8^mjyV>i2zyhx7o1#>~^3~7>RC0NsDc$^=EAeqrNnRt{iJ? zaB?;`oq`G(9kHF|n^3uy;!}pyFl`)e7xv+M z@kxf8gIGWLnS`qtj*i%@7hMMzF+>3XL!fKRW2CRcyL(Ic%CJs(*W z%!sYqPxwhg3fp+DhP&UL_xZlc=X>z>2|H~6hr9lEC%U*0`$ZRC^!Q_sQ%r{_K-sf0nkSlClr6vNJmt`5AnF1jy{%}}Yazy1B=Yu7xC6RdDY^COQwvg>ZUemLht4sD4j7B6e) zya7WF?1|$`-BqRgb%kceBGY2AsN3!J`Ky9elU(jHN(D)9TG+RPt_f_HyJ&dLq{g+s z<6gzdJVqzIivJll;sB3F_bMc2ukaHRH0$UVz$PQYv8#|R9P}HC-1XS?!9gaViqT~~ z`3(98xJ(SIeq;l#1j$>b;;A2LA|F@s8#4XDYC9ZEwsM7hpmWkl-09eFzx`gHwNxbz z=CV(g2i{;vwye?$la_y#cR{mAExB7V<-?V@k_%xKvkWR69bXps4~NXQ^6(_(q7u}PG?5+IcK1g9SQ-N9gSIMfkObQ6knb+ECJx@EVY^vvNb^{xm-aVqmc z;2G||yu>rl<6dt^qu(CzN8`h>8jJ(QhWqDQu_S#;5pk{d6EvzZZG+5g>)ftx<#|s< z4?6Q2=l8!?|NCEGj4f~5jK}0)Y|flHIG=`d<04+JuZ9P{A_7&M+kc|}KYP~!;8t<8 zSLI13UH92OV;fgo0Na>i1E!mjK!7CF6iPye0HKAFKM6mC8hYQ*lr~ZF4^WJLpB;DznZIZ0zz1iK_+1c6I^0vC#Pak$HlDD~Iu^s*ywF9eQ znYN?b%fe*@3(;;yhAHarzuh_W> zd)pGja(z1O($zx)C6d6c5xjVh@0(26-EhP&i>MT$^vY+#z(AZzEfrJP07qyZw#nkm{zCw^QW zd=KLWD@Z%ZDHomOpE5!jC7S@mXPW`?Vpfn(pXJAy2JB&m49ipL0hC-ZLo(R3j8+>B zfIo}_^0~x=b7!1+#@>7H?Fu^dkVAj>KfhZM`#Epdf;BT_;bu(Ic`}maJo#JRi1L2R zLJLLc&Y4b|M5-^I#$XEZnqUJ8f>L9fX+b9%glIEuN7w{Rq0-l4*T6<+w6d~5=@;Wl zv#o(*nEC#zA}7;+6jU7VS2dw|sKrv(2vhWjPRhY}qv>G`xGl`gxxG5+)@*B_lLXN8 z;nAZh9LrZ%Hpk}N(0^|Exee(|`>ETX`ifWh#30(niWQM_oO)%msoB z(e>2V*Q?m&Dscl%PQ$>CU#4PzsIRYS{}RuF#5LO*D2S##fd&JWfQ=G`_Sgj~fOa|& zyv?Z*ghtXOTLXfiV`;$lH}DZe5!nzCCq==`w*>*V-;Y%p$cXr4BLHlCIxqA4!@&R$ zK%17{+2)TznrtWI;VZXbC zX!xy(?zSd!E3amu1;u&Xzin2DJ+b&WXPNLN40HtpB?3<94kWSZGAB?-rTrFN-VVU$ zudJ-zwr~HvHyeBq?5dh={r*ahWydAHJHtQj7oqIXEh9DnC;6mPVgryL_jc3`HuFJ$ zN+{nLJp^dL07YyKuy>AsKAC(UWREDYJOvOOorDH#e*>RVBreEMT(;$eo*;|8&p!J+ z{q)nAEx^b~&;%2AZB3dyiTslLGNz}x>{X&d#UvaR*B`$<+1Nzu1)b)9ZEQOToPNH! z9u-GH5D~T+z_qX6*iBMu8|IBHolOl$kalW7N9hnKMgI1PQl!_B{M$)Uv!{U`=f9?w zN7e1fss#S~_U$`)$H}mDUT`n!D97LkbaUG{mEMgDC{+`FPFH8q9I>tJGif6<9TTXo zp+$;PsenGXY z+%sy_h)<_~dgF~Z9(m-EhaGX;ZU@kH{d*kbUB2wqpoL4;i4HZ4PW!K$O#wpmm=otB zGd!K9DSi4eKL5$KKQ5V@PD1CR#Ji~iNT~MLfEmk#F-oYc#q{=k6+J>lCX%gI^zAps zZ~4Iw(R2z+lhS~lmV?$c{x!9ny$BdGfV$WwyUMrS=9|BhE@)x2!1O- zS1d!o$N`Dj0jRi1<^}0cm}7Ei=JJn>AQwQ)<-whlimg;pV0l&9j+<}3*dd(r7yT}n zsjaQe@!cdHeQL46Gl#Qz^X8p<&bbF2d{A9o-R7I)}rLTM6o=>3XDCU=bXK7=v`_F&=b9@P$bmB?advoJW zH$t7xzu^Z-^8gt-OvsCb-K2>eXQ|_)*8P(UDc)@T{ri*C{`urSv%bKF1a;YU zR@#FOYd(^De<5ZKYdv@&)w_0h-NznJIVi(l8cf~(yV}nc&8t-kTv=7MlWMEJ$!EKC z9~>br9odDsc;OFmo|7(|w2dcRebbO3y<;^zatr+$9L%3lTTn(X28e;u*JrF z=$dhiHdyNv1t3KU0&L=_QK5yOx2}Hw-Bmw&cMfQ#TMWOL{(wzQOVh!23ct_4#i%WWe;kRPK7D$| zGsaOl@38(Kmxn5H^+A&Xkdv`+xOwHeh)P%CfLlf7?gIy4r*V$a>B85=e`{M%eKww( z=Jb%h%LAA$Dri=(Rk-&}S>eiEHy?y`jT{!Fq6+h7TDfdGQF7_K_{j~lT`rn%_O0tH z<716qO#T`HfQyb@+j>)fr1Z^ni{-Z<|M<#$_St6_FJ6ol>(fs^9aB&Ziy8)RKKQm< zZ^IA){D1oSb}EU1CMLe4qc{5`XrcIWbVHn>P-5BY6s<(0`fWaR%U~co$kY5lq^7J) zxXb*TL^_oJ`*X3%fN@NEK-JRnFq9w0Y){w&=d-CfwVWUqj)`x|LE@4u+DiBq5`Fus|C;VIT7(<-n? z#YX@q=Gl4FD3YOROqyEXOa#EC@NW(g?AAs;Ze6qrIidR1vu7`}tQIY%oGcY9O_Nq9 zam-?vFk!;%*_S0Via;jFIkHR6mUFYal^7l8XEql!beff!o{V58AJO#l};vGlEw^#@%8VNKJh?H zU6^rTcBBX~Jda~vg*`xb^Vxm=Dbu+sXy#qgwG>9y(7B9?4E*}*uSp1|VX@)k3_86A z`+(Q31qByPL$o#s`DJ zd0)>%>O1eeGjN`N{`vP7o_akIr*ibB7eylNBnnv-hD_$;*)>}>zeOpU zd}h&e{gqm}3cJ1`a7cY=BEBraJ6&?VV1&MJzDo56Z=Zi{#iH|wyrEZS6JW|A2ghi_ zC^^Rz#VNvnZJ%0nW~yr=$pGO?0Q(iN+}-qm#T ze@4xk6{#`4J4Fuo&Vf98T>nkkw7eh+NCZ1BVR8hA1`0c?;_(VWFUm#;npM+a1N=s({Ye%8qr#^~7hz55=!fBezMPdxDiB!BWr zC-<-KKY#wR$L}6}r69LS!-3eNOpwa9j#1n}$wMGA; zqEDg?SJu<$DcZ0??R`Yy5|pY-!v0y2NVc2L(Gx=qQrDDsk@8Fc(a)C#D$Bm+bhStv z01|K+gO1jJjE&I#2-7Y)8VCM4y1``IV$~|vpZQGHhTmS77zv~mtNT&A4O2w^IsQz? zwhZ2i;u!egM_d4M78(p36C`%#H+af}{C#7FY$&*{u4cvBuT}KNN=2043I}V;`|O@d z2cpqtyrG>;#-(T-HF6{f_KJzp9Rol=Tz4=6HrH>$l1?Qbi9@q32ZD zy!!AfF}jT-r)JRz*f~rffUM%>syK1s^9R7ESu1l?#A$n6^h@O5CX3Gm+HH}64LZ2a z8OIjvOPy^ww9u}LOdnjGGJjz#Kqv0p2HK3JS+rZ9Gn8z+OcVHev1mPcF ziWp+vaKkOBOckW^{!8lI^JgrWZ-325%|yiZ^~dr~Pbk_A-nf42Z`Ex&p$>t?O+Ud6 zu!QEH5sg6j9K)!tqCd(zM=5;dc~&h5x6#L2n)~nGd<_U7^zA=oW zT|UV{=;0cc`PwXRRyu;IgwIr^A}rUUzIw#N(is~2AWGLu{!#rsg)oHB3b5W#K*DN%<9 ze{6z* zA_Kcw5gHpCyH@n;T8DCx;hy$+{tTUjLL-8=XB!%pd%YN|_Phy)Y3V%QlsH6?L!z_u z<8K(Bv_fG&K&vv|6$7gNNE!fbq3?9ut;GE{f9#3BE!n*Gn5qPNV(vb3y9A6t=PT`i&JVM!Xc#LOsiG}QVRGKnniyGlhyVexA#U3>Qa>dFh#}5) zWAt!fvASpSf6X=5Al1d|f2-8~^Jk=YKH!r9q3I$M5>;vPuMN&y*_yziMVx0zrfTs@ zY$-XRcV$w0iW=7XXHp3i(Vss4MQbsVfO63jJEfYQl0W8wM{Y3^FOuNuailFwVng-7 zK?A>@`*jOmB!aRu@z4cUU4JhuTHEc>^)38%$FG!lyc3r2VwT;Dk83his1N8LZ%7AoAb?57OjK;*hn?-cVVlIy_BU&UV^QJA;n=lSz9GvoqcPAO8p>;mOj(sG7nM!YoT8wvZ z2(3$|ouY4F|08r&HfO>2mCxIzpkSFHcnPyDIXoPg+a+GQ7>Pe|I*5y|4~^YeWC@6{ zHIN?=exq1e7*7AOJglG&z0XMl)N!uCH6 zh(8rS3Y|_N*ns#WP8=g^>u9ErG`W!^n%rtzCuQQ_;;aJ4rB^NyAT}iiH4+>BF)29N z_#pwYDJ5c)(I|JIFZt|A{)xPi5R#)5oqqs`H?i?305X{IG^en^f>GF}D9jf=!ROAM zEAyg2ARLEj4T!%~HtCNML@fv#9YxTzt)pu|2Wfyr10zP@1GK0PnB@ibY%OvW#+HfW><#`U32mGF5ZkOC1Qg<7%$PBkTzbi!cissb z7ljGVk|j$3tc;%e#T*TeFC2|9jd|(89+JuW8pA8wMS?tY0sA6X|4p&ku~5# zpoq-yF1zk>=UsPFpo)-FM%8agcA^I2^quW9AoR;S@tb%qsxg!J*Q- zQ(ly(#=?A+;N|cSLKt@7QiMdDW@P1`2H?a`H=7y||11}vYMsL zb@Ux~+;QEt*WGi^J;`LUp`qcWmtKm-Myb%qJ1@@M`*14g`BYlY?zEqY_&Vi3nyVWZ z1n1XwTBk%?8a3M*D8|3n+p1{g2I z@m5-26QAA%(*CSXZ0VwpB(yR4fu}eLa9GlSL~-G3IwsKZ8x16C2rILt&XU9zCt#!s zSke|i2XSZ1=pX_kwgCu&jh2g(CF1c!Qe$Wm3dZ-X3;-lS+r9_@qOV6p*yL{mLIM&6 zK;=~22!f5Dqz9IUpd1R|dxjvCn4w02@dXg_hAoT<3MKBa;PMwI66!(zbz;n?JyK?d zZ82#6Eo*TiAs?(;gNJ)${uE@WT(|j<`sq zwXH2iUmL1f`A<@TbBAx!GN5uv7v+y>fb;}ZgjjNSkLQ(A_+J;_1^P-d@PA5~ZC`&p z*n+S4aB z;g&EP&7-g>`@Hkd`^nF)!85G~en0(>e|alCkBh?Cx#5uk)$ZK-Tj5*24vi#CdJNfx zj420%ixWUT|0tCI`Jey!>dUXd=VOmPhLtir0ledmJ05cAAwb@DpM8IR)Xy)v@FF6@ zInn%6vbty-`NxtNwbZcxO5Elt+2M3^+RsFy&7P4p8!w_*&>$IU;}Du{>?l**9RxAz z4L+&jM&2cjs^QrUF0sqRgNU3^Y8|t<^wt1|X5@rxez$z;bKY!qGDS)gFQ%-)5Zx6VRAuIY)Ci%tUm=-Uth~eE%(5mt!rza(7oox!a7oBERrkX+dvQVPooVULJ43Gn!zHj*iAA~es2Qp(N zS!P+2IC$<6F$K^?uYppC3bKx(0f~#PUbub)Tg@pIY=ZLpM~@keQ_)|3`DL-`R*VnO zq$=xYDsZX_Zmu%lVsk6@lvLI2gL0SRAmW|TpFV-vYw@5TM4H+)owm&7z@q%8r!vbb z9Qdqb{qfINiOHZJNld5>y(xLmx6QP=FMm+`;DZm)M@m9iGA|334H`6P=8TybAHWm6 z)EQ@-0ie6}*U3rG@-I|Pn#8Kz$v8>!-+cbDjMA@vzlR=rh-)>^@&G0k5ZXcg4d96{4<`Sy`+aaKT}Cs*B^ww2(C`o5{{TxoL?ELu zy%7qBT3cHyt1CAfu-VF$D{(K-(j`kvCa>1SaU%$2Q2AzcS^p_I1VL4X+pgU9vtavE zA9^cVv*XkqM?dpiVAi}-*Q`4JfCCQLYRj!KL^%4W6NZeKxa(nF)#RxRzsv0u(U(-n zM$XB_|4WcR;$n-M(}r_BmC-rn+lTEDXyE~Nf`8w){4Au3BuCY%xAOIecpPl6m2h#^o`lZ@S|f>+xi=AY!B%ggAJ0Nx460n*uv4G#y9>LZnr^G%tiaAzC= z7)2#cB1A0q4F5#QuDUXvL+R2Q8n2`QW`J&wqW3NFRZSPp*CvvE1OC+r?V9PV+I2P+ zXbzSJ&OP^BY&^tlFq}9HjT=$0O#bo5A7f%1pMYO|^_7b(j}P$f*Pm#JAjUIX1%He2 zU(=fNgY~<5{T0G_r{o{N6L47M$_&L$&zAW3s

>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 012/328] 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 013/328] 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 zcmeEt(|=|`vvurbV%xTD+qP}neq!6UZDV356FZsM$(i^4oj>8b_%6=P-utS%t7@;V z)wQal6y+u0VX$FQ+Aoj!;)#$)wpYR zkjF)>);QmWT?Bo>fPO!F=En0f^+INeGQ7zC8hz*6 z4O)gh*bSG@XXf*V-WutC(6Eu6?kkPRR3+t$e?lGD*!i{L{@F^)PDB!bNZ8)ZsxL#j z71gcTf~@MxFR5*fCh|WGWq+VOpo^U6IGs`%T(7Q59?cnaA8BXPzQ5-I8;I)C$+{bN z{;*TYyFWd?V9T2J@e=)f@9~m+_H)kXx<26vJ@{_i zmPQ1{vc^7^3ZPFaM$ln6)Uzu)o0oyZ;8-S*LBD(tQZD!rZH{pctk;65R*H>N*re;c zxO`I@ox||W_YGsO4hralZ-xe^%wUY@g^|+)MKYxngxEu0x2z07fM7Yvs}9pOK@sq$N$09`D z2$|PsmU>QfVg@GmisqGjPR4CQF};0Xm$ntt=jB-a>WO7hF3T3%;cDqFF#KVmmeo~R ztD!|`3n!VT`T*DK{TwrB)IF!=P-;8C%I(sadoy^u{A7Nn`Lr(i6L6$)*X}&7J=5JJ zJA7rU>EfY=Z3l6P{&yjBG-?#@!RhWucp3BgJEhi)IeI&joSBgmuN zx0;&jxnl|yp1Ok^XP*#CEUAcTYzn*TONYioA#tk0v9cAS3Xcj(W#h8YuZZR{_X0bR zk59anO8X||i$#-NKM<`YZu?94Su_us#bjgbdUooxtc$bA3e4~c*?3Eph)p|f9Pr!S zN5Eq?bN4S49eRnJ54eFofxD{@`h)lupfudTpm7p=%=szEU2x8a(9Nc;LA*psU)Vp( zFIUg~@64Y5U(4s)BQ7eiiY0~KtO^(Qldht zp1@arkb$~tPcMFU=54p+8!5Bo-8je~p@L_jrYh{cwz>CHU;d|koh;4GEZxo7dQC*9>CD)peV196^YcKEe+5HPzH3Ph984sA*QpSZk>8M>=RKG=SiAex+rie4Bl zRq!%0&YBOSc6)_a{DoISh*}AO+DSuo*idfC3i6bP7;Fx@(#}9e0&{o{eN|D8)KS`; z{z{t&iUlGWfMNvUp##B`ja(8f^#pFSZ3%m+Fquw?l%B`@1S~4O!xj^3nMBS>6X^@} zSsX+J!QlKe!n2%2Q3wASdm#$-%;NcdrEe*7Z}gQ%E5!teNv{Ray_;fE&u%7G>KIYP z2~$dBb{~;JR=!mPYFCA}?(c{(oW5ZO=FSCnw4L#n0I}^e*J!dHvy4{^vkBW}S1`Do zWEX4J2u2)NAvg-u8Z)*&Ljc?_o|i)D`Zx_?uK=6R7O0XF9zcz;P3HJ{joZzaK?MW_>+ruXV} zKo)@(g8w*fI>|=)(V2HJ5p@Br_2fb}Eyz*rDzV27R0s*yu@e^|HUAN}txJfyg*K`I za*`>O-VOXxBozH1=6wDaoVk#|sPn4JSZb%alJ4uNv;DAi(u1GJ(J_`!!VMHUTqDd^ zzg6fFs=lq2!x#g>WM2%eMOUh9B4S2kG&WIh&JFtbz!D~iSlMr^fW|Rt{KsK=T%xkY z{NBGN%@2fzQQS^3j3eV&X=2gTzl_VTOl4k?i0b0wb7Te9*+ws!mAP1m>8lYB{86Ww z9eFm9L)!8FI4$l=3`hc^;H`vCER*wQVEimk5wdeZgEA@*6*!khBDCAYX+dKUK{Kmd zLO(Ol0XY!Bz$+QJeq(X!tP&$eNJ>wrJ!9~q7!erafoPIOy6Ya0B!rEhg%Bjt#lN9M zzxD=Io$f*e2ZHWjHLehuy6-Y2RsS3rP?eoD$G4Irs&^M!_otAGM7xO1pv5SgC92w< z_zzWN0A!_093@A4O;8#^yvEh9D@aN5RlU3CZi?@kpQZ zANM4=W<}Gib27sl%A)@?LCxg?5{QnS%y_Bent0&$`A;Ly@F8K9yhfqWUgGD{&?b1g zyd}_FbY9}3wAPDkjAH5r(Dj1ox1iWCa)W1xv2+ZDqtD9O$Jw((MJ9vz7j2eTx<_{zw%jF}DM_XMgw;P~@`mf#KJ z&nB&@h->!wh$$*(AQS~x%aT18TiXsDv=oc&^rxemc&nFC&n3!CfFrUs`TG?|(#v$Q ztgazUt&bt^Z8I5;@{30^=n?QM0)Yg?JH}qXg15mij~>xQZ%T@ewN}mbH)GO>7CZq+ z2ffCp>o%aaYLGSygQoBEEA6kXk?yVSp0ecRln7F=2xX#ynz6>J+US|_&n{F0$ax&3 zKrcMhqsthHO4kUKC>C~liHFhopcFYWk2ng5MMm;S$J9f()q3Er@JdA3XCvPu3sHy) zz7=J%g`vppdZTBN5mPoWq9HglkRYxuGDyf~k4tgQKU^J-LdzaNtZbIBohy(|TJN!t zgV5+akfE>DdmtNyY3Xo)MXd+ zFS{WJa;|k$iGSE~vgI^Ign~1Vq1T(MO93q_f9E+YL=D&eDcFYu2tX*|IXEm=ykeGR z=Ol7Y%UKBDFvII$qFryrgZeF4xJ=izK}D;KB$-i+%PbA5qPeL9P;Lw1mFISbVm*+Y4{bV> z5KqZ)3m=&M{w8ay&K41p4_EP01ZH-F`UW%klcU-o_^b*QD_hIb(Txk@9bWkl^JF=9 z6S0DnCht!){O(*G5-7tF66VkxEV{VBQ`Y<@8w%PNQ`y0tzuNB=!!!}&7B*U5om~fo zH&loQU_x<*8i*CA(De#2CMutfbMGVtV6aOmbA|99mqe0{O4C@j?7?uI5XGT7AWV;B z-zw7vEO=)G#NYFvv5<}nwV2{Z>}#4r9!a+RkPN{WF;Je*;|3ZW7Orn&Bk(6p(KpfP zctOtf$coP@WoP1MOK;wxuxqR|{3XFOviRE!OlKphe^HNRgoR^lFz66>-y>meM9(wC z<$H*Oh5NjOBC; zj1DK%p7qKSo}cX@AHQBT7LIgA0K8fB5sef{V=CGb)q(!K{FV`y?_J8{ihfSlmDF~o zjA$B@m$s<1Ow4^C1;?=r;)SUKZh;CbXQUK>LV#X`LiFZ!*0a7l2<2%U%jR{2CTSW^ z6?;egIt8&-1v>rigP%#WAprz&z7zoyV#J5b1!8*hn^r66O7Ybre#k0@{h@qw0u+(TOjvuN>AO$0|&@et1q~ERcxaMP;&OSgfw8Tg^|tWct9s0oTYkn;?!fA- zTMTf$j)idl@DK@my7urd)e||eYk_G7nKl|~Ab~v&x!2>V_mcJt+3Xfl8O7L}N1!RA z@*FPY6EBK2^1&c77Jjp&3Vc3J*a^4bokLWY=_uQC;~U5r#ECz!?=T|&9;uPrMmsxz z6R77giLViKAJfL+&yv|RDvh~pZOF~@hv_!wy48Tzab+PvR2F`mma3EBDFPEKIXCu! zBt}GvDj+EbiHJdsypB8VG#2YcBhBB_z+RBJ`??P>n)17MOl5TBcjq}+j|w8W>01mBZcKXIm2?}wK9h9G?n;S7%HTPudziy*eTD-cImCJ@nOtD2YeiAKwc zbuP%JSeznC&TE0kXMU@AJVJU`LC6e(ry@=vtBeuZ>nGDojuThfh=l;dZG>KuQBwz9 znfsejyZ1cOmOtW4G=6CPWS~R*6eNp-n};ktJ=(AeeZGka+DH}tk8B!GToHelUNu}S zYYG<75Xnyo^)8+d`%h^|Oet}q#()VN34B|`%}Klw3fB)XY6nD9W+Qcr1B2M@Qg0yR zK?rw!pT)%G$9WfZZ=)^{XcnC&cdR>(%Oy!B^LN>q|1$lOOw!>2+_$*iR4 zP}}VcLJgAjhKZ>gU+Qjv5u+)K9Fl##r4;((bEE^uGsqe$;u6}JU6>z+uydG1) zX+Pu^Wg-DBLpUsPC`&seu{cUn98s|#0Zo&zpg}P#rX;12a5fa)G7NL8$yqfK9ndP6 zH>XMisTbbHqM|t^0+1O}%vF(!mb937ju$lq=LX9@cq!IU4Bqf0a#xRQ3?5-=E=BSI zi$3(%nXn=&@%1UjY%KrXF-u43wzH*kKc|LGlaO282O(xhWdOYl!sDS`x&AvSw2QeV zG7n$>>@lk$_D{Lv`?2WnC9{ntNiRZSdE8ogX(iDv*)|VGkh+fA2lapF*E#!-c#5?2 z4gWPf_#nq`QPCt`JT;W)aRS0<1*81Fk9g|RIt7u8!k9YU5A&Ximhs3+ zfXLz^8ZmGU{f?=GpI8Ji<%9T}fJhle&MO9cYfx=MXr5AdoMJ&pwbkg~56V56ykPAS(Xal+^7K zT*-;>!eT`MX_J0|+c=v4q`b1PFe|HUB)qADb zO@lI3N)u(*Ff|`D6nH=SPocCDw@BD?Uj;vxyLGrF3n5#bLW zJd|tHt;2WF-hQjG#fpB=o;#Skx*ZRm+FrC~`$UXbY;N3_F2X$w}E(66wRSp1#G;z&xWY^9Ka zPs7~xj;f7>?`RLH{T`T6rx-HXE@VFn=EQ!Oeft6)+3!9SrQTslGw`P2g1x?A$Yw!# zvcw7v;qDByUr^i)1G7X_tRvX3PryBZ^p1g-Y1F zHbJ;H=>b8A{$wSsw;)`fkjN8$WvMMgll%QI2sAKIqkih25z*AyB`-&*>Ij)B)?Xpv z1RI`M8qm>{Itbn3&>#V0pGPJ|SJV4Lo0LRVrp&muXb*?5NI$ztOIHU-{}N>hyx^q% zZ~ZBdPUA+fpd6Y%R-Z^P53!Q-@q!hObf0P`y@#RtM-q3-D)pLJVqgY*gi~WMdY#fy zmPXCVgoND!R0kZS@Rwn^p??x&hrK``Ap`PIn=X5DqyOT`($Xa0=>mgC-#P^4j5yJi zPM){?>JXH_`)5bzl60Z-Zz^ZjKy_g(5a*!@fb2K=4oFk})FRart40Rr2M3SwMRjCT z<2oA*(!fpWt3+vlGJx@JWh!?tBlneZHKMCfh#sV~mIrjQI82-$l3ClDSVp3rX0=^# znO@8xfNCgznC+5ppY3vE-ErX`C>1G1{!mNIfpCom{Z?=8D)Cx|5+*x;k{~N)M5DkB z3N2?EveYgO-AC0KSE3r0Y)JzVQ#r$SXR{QdrF9Y@56YSsotCu{iK8XcN1rXl3r>j>ea)g9#`|SF zFYS!Na&wf#8UYaKx!I^uW*zOJH}MuMnqZzVHVu)z@OMujZ>5;bH4M%`e?`tg14ZTC zyUO!xn^~C)CR7j4?fbmR1u)5$MJ%*4A_~t{ji7cpj%B8Vjtk3+oL#2Qf*I+9y(5Tg z=Om7!fA@J;>@^b;F@1WZkOVT6di3jf>d}Z@O_0jF0qC92n?!wrDUxDV1Lu;3aJ9*@ z2Z;w@OdBHY3_g=qITr8rQdxfk3!+KEn)aZ0%MlrnFHHz$f{=jT&&T3gLKTquV;TTN zRCDx`_%-NEWk|$IgcB70rPh>k>B0z{E=e)NXTTiWOno5nl(^a2nJADnDVGYVzQ6D~ zq#JAvTP%!-4T~AU9&yhINi;u^AVqc|;lJrAE8zL$>Olhq#;pDVM7H~2`<-?30&NLO zYf^RP(wY7M3yw^q-G4=Ge1kcgg9&fa@O42+DIVx>HIv|7W7H)){-f#MXTMUzJ-KGi zR5yI10U7TqqS2V&&CP^@B#9_u_p@)pb7$(^x$cC=)*hOS%@QNG142Tv37THE8g>mJ z8}zRb`J6961^8A8hPAL1>CaR1jVZg{>VzutB|y&3Qr(cK6W*vIQcn|v6gbCMtqt(` z!1C1?)8s5+EAx?2Qz|7GilWiz-_0yUfvYPIN;P4+q$uMau&3FI)D90RY59o6&QUZf z67J9e54^ua2mrio?MRIv8~R|7nfmn(zu`MIjDkL25R-o$Mnq{cTbD9<1o2kmM!&3n z>~L3ie@*lV1Z~SGm4>-zuu9;ZpHo@0p+dqC3Lq?0tDK#)8q=;lau`pQgf%UeV5o_9 zW;Xd)2m*EIAUBKNr_VzbH_H5OC31*}+6{Y(C%}Nx8^A`bdp8*+C!5)!4tv-PBcrFfUG^cAF7BIprCvoEuX(*w^3QFCtDJ4khvwPW4 zQBqO_pYZ9ZXC>rtX5A>GDrLF0xzmGbJ89lR?c04eNal2lYc6q%J&x_43SKw7qjZ_d zP+0ADE@BRXRuwHO+=gcyXsfZ7GG}|cZeE!e?feSQ%algg1(^L^Gx3L z50rv)iIdd#fgoB6MnE#O~GLL0{k`v1~b0*Zu7nv!S9 z_1RjtAzs{dE=G`#)2V8*BwfGaqwafELTkn*H$&;Fq-DgiBHSVtJHOG5Zs1$vCjQlo zpInK$exS2<0-ixUC#o!@>Ep0*!?jDS?d3mg-w6hJ}jzX!PQ1&J$_`62={eI*`D&KH*?^i_C zq;NKet4F9fX9&%p6n!C9z9≶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 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^ 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 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^ 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 014/328] 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 015/328] 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 016/328] 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 017/328] 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 018/328] 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 d01faf3a5c5f9d32bd861407db916f3b8da25c65 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 1 Nov 2015 17:53:38 -0500 Subject: [PATCH 019/328] 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 86b79b77af8d6f9e88b4c6131a9c46fabf887457 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Mon, 2 Nov 2015 20:00:11 -0500 Subject: [PATCH 020/328] 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 021/328] 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 022/328] 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 023/328] 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 024/328] 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 025/328] 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 026/328] 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 027/328] 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 028/328] 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 029/328] 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 030/328] 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 031/328] 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 032/328] 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 033/328] 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 034/328] 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 035/328] 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 036/328] 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 037/328] 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 038/328] 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 039/328] 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 040/328] 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 041/328] 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 042/328] 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 043/328] 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 044/328] 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 045/328] 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 046/328] 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 047/328] 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 048/328] 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 049/328] 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 050/328] 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 051/328] 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 052/328] 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 053/328] 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 054/328] 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 055/328] 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 056/328] 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 057/328] 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 058/328] 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 059/328] 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 060/328] 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 061/328] 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 062/328] 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 063/328] 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 064/328] 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 065/328] 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 066/328] 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 067/328] 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 068/328] 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 069/328] 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 070/328] 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 071/328] 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 072/328] 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 073/328] 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 074/328] 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 075/328] 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 076/328] 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 077/328] 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 078/328] 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 079/328] 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 080/328] 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 081/328] 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 082/328] 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 083/328] 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 084/328] 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 085/328] 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 086/328] 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 087/328] 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 088/328] 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 089/328] 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 090/328] 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 091/328] 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 092/328] 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 093/328] 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 094/328] 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 095/328] 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 096/328] 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 097/328] 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 098/328] 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 099/328] 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 100/328] 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 101/328] 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 102/328] 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 103/328] 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 104/328] 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 105/328] 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 106/328] 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 107/328] 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 108/328] 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 109/328] 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 110/328] 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 111/328] 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 112/328] 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 113/328] 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 114/328] 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 115/328] 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 116/328] 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 117/328] 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 118/328] 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 119/328] 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 120/328] 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 121/328] 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 122/328] 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 123/328] 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 124/328] 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 125/328] 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 126/328] 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 127/328] 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 128/328] 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 129/328] 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 130/328] 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 131/328] =?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 132/328] 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 133/328] 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 134/328] 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 135/328] 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 136/328] 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 137/328] 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 138/328] 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 139/328] 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 140/328] 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 141/328] 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 142/328] 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 143/328] 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 144/328] 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 145/328] 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 146/328] 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 147/328] 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 148/328] 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 149/328] 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 150/328] 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 151/328] 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 152/328] 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 153/328] 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 154/328] 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 155/328] 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 156/328] 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 157/328] 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 158/328] 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:

    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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 - 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 294/328] 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 295/328] 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 296/328] 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 297/328] 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 298/328] 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 304/328] 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 305/328] 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 306/328] 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 307/328] 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 308/328] 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 309/328] 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 310/328] 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 311/328] 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 312/328] 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 313/328] 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 314/328] 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 315/328] 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 316/328] 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 317/328] 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 318/328] 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 319/328] 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 320/328] 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 321/328] 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 322/328] 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 323/328] 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 324/328] 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 325/328] 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 326/328] 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 327/328] 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 328/328] 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