From b2becb1f025ae6a53ff3f2b826ceb1a715a78564 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 9 Oct 2015 14:35:02 -0400 Subject: [PATCH 001/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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 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

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

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

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

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

>bX`t*EGjdcJtI}t0s!snPldIh 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´g_&;~EKQB$n5Olk9ZGFu8LvelO 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 YA$p7weq8J$39zZD{PV0#$vW(R0C&H<_y7O^ diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json deleted file mode 100644 index 33a745102..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "first.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/first.imageset/first.pdf deleted file mode 100644 index 47d911dea647d55983671ead4d08b6f6b3600715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2465 zcmai03se(l7FLvisY+L#f-EBsK`11Xkc1=%MIujmB|xQ!>5vQ%APFP`Mlf5nSPOKE z2-^C>7DZkM!J;Da5{kfrC?Kvp3J41-3shFXvhuJqKo*oer*r0H{{P-P_x0cTzLzjD!bE z0qT;#Q7l4Gy%fMoXJaKT`@{5#R(MOqJPwQifv8iK6A%Ot9L14h2`38T!2s4PM=1!< zmL06}VYAA|ay#jZRs>HpA%X+eQW4rufWU%d1w5GTy!X#LeZsF_+~ccZmn3Fi)v^Z; zIG;?uU*yLLEYs61tjD>gXOFvSWsh{48xJvPNqKrIJtMdCz2cA2aC7TF?b@K`V!Lw- zE;zpH&ApqhoRjAHt}gK}>(qAc8dvrkD31*`<5<%C(&4_LqhQ3-GOf8~n^leG?+-@@^pjPa$J2gW@O)!b9hdTJ zTauyIJ&~rqeEZC1p9dWgx7{_WRc2=drMO=wcT7B{Zd58z`d)r_36r4V<6PGkCjpGfbnVMtm@;b}F!T?)Qav$_y7H5T;Mf!T}M zWxP9TNqrV?e5;b|pWd3^u2KAatk&3aDB@0 zZBaQNdCZ2#fblzYZnRCCjQ-GQWb-s8bX&<)?SxnUGdDYVFVk`xIf7@g3~$DX`H71_;r5OSZz1p`$_8y_9 z{;MJJ+n=>7Ewg;GnGHoz)&ID0z@F2!e$F7cWQ?d6s(!VY)_Gw})xCyMvsD={5i&H* zAIr_ACo8;Se6<*!-mm9Am79Iz^RVlc?%S5sg|E*SyIV{dd9{Mpf#d3cih5WKt=%ps zBEo)bt8EjmeCFYJRYU|b7d`p+-V|X2wOCYtyLP6t=!WH-kgdf0A};ytPfZiCwVPx{ z`g;zpe{8a4RQxQUwVU02<4X3w|9h;}XjhGWquqn{vVqq8g{*}BQF9=ybe_TM*!M=rFs1pN)yzctIXAoicsCe6>fit>wgZ#vp^hZOY0`J`rx zwdSK?GwR_xm9;5XjH|vf{O+Yg-)z;s*xt>;-vU`D-_SK<=~4eEVQkV~57{vyH6ebu>DqwE~Mx_A31Lg~$ zy`i52ew?GEluE%AN>ju*5z~dx2QQLP-G+E>o|En2+s&<^4*d zWD+<8PXs_Jp7_5Dpi(Gg3J?M;%Rn0{dcxQRh!ip+iHJ_e`!bM1MGxwI8Iedr+x>wI zq@&04fsADHfBccq^gpm8Q_u-~Uj|Z$YwSR(^_mzUb!}Xb2Cj`uqphg}v_Y%?Fs=;= zWq3s{hy)Tu!ji@RJsd$C+G{F6V2j1*Xk+7xo|LO7M2yb)(wc=%x-AclP9pLsbTF7m tf?*P!2EjJu5MD57P32Q4pdJ3tO_shCDT2=K;$ebx8ymcd$v!V9{2$sQiO>K5 diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json deleted file mode 100644 index 03bd9c927..000000000 --- a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "second.pdf" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf b/examples/CorePlotGallery/Plot Gallery-tvOS/Assets.xcassets/second.imageset/second.pdf deleted file mode 100644 index 401614e288b4b160471c2776bed6f09762af3e1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2423 zcmai02~-nz8dqq7rWU#)x2z)&iMWtV?gK$2a)?|BP!TbkV}J-Gl1wmy+3G9S0=uOY zwCjai6uBOPMMdNiN`VDYKwLQr2#W^`R93*Ua=0^)EGYY4=grIf|KIohziYnv{elnR zdN_hk6db<(+3RPcxs!iut8c(j0TLh=9mY931H^rhEE0|aXo!dh5Iv+ZFr+}9F+v#P zLSnfD0$f~hN>~92V{z)WJA&2)5rW!|I?;o?oI*%zejJiuY>hFLQwKlAa9O+PnPh#% zJp~JAfs-De6u@;{cREMs}D-sGib_4>50m8_|Uj-zC0m@Qx zJV+^5Da4Qxpf3sBtKZs<_aI$Cb1T+h<->yL^rfiGNelYkqgC3#SqVP_iy*_RPcbjH)xYf zvYdC-)D_t8c{=5%;$VJQxs_#61J*kuXMC?|&PbPo-7uSxoNr~&J94|gKk+03JGXXM zx4w~=^VUzWqQveu_ilRgPdgNNdnLZCH`=;w91}cP5ihdm*B_jI+rk=Pz2Lk!)XUu| zkls3P5&YHJ!t0kF+MUVBHOAx)a zy|JxHNd37z*~b5#%*0w_F|#4?erNP;pG`Fevoq2%?9Y>%Cmzv1(ks;aPIGaiy1mhU zr{7lB^Mem&`QK{b{uiDC zLD8muY(FNk{YdV|zO#o_VB%);8|~Bh(Z4p?GM}g-HN2;q7~YNl-lD~HZ$taYw$Fzbn6c?c5eo=@`i>()el#qwB)hI-gp0 ztsw@dh-I5NJkk)RCoBC`L8ffKfY)=oG=#4LA9TO6eA}9~@a6dupB+=S{%s&NY}^0GY`hAqod)uxXHitrN%bWOJohV>t?!&Z#d4y^7J@=Oh`HV zee**4j>xRUd)|D0^I-B#<`m1-5PO{)!v(q?ecFYqr_8Q{+z7#n0uFbq%_?hZ-Ck(6NRn=vDS7Nb1Xxx_)9`!i- zGR>av*PJ+P_AGO*a_$FbtCCISg5PK44p&W#t$)+HVcxpR9LAL%_Pv$p`0tO*sYZD0 zCG3-ipr4WoVbjpw%Nf^r^rnWcDcjumgBPEjO;NM6QtZ8wU#0rjHx5zs%CahF4$W*U zxu!q8kYP+>v!BNPVIRJUGIWU@7qVvx2VZDw4gV8%z%bjpF#aF(W|PmliwlakuRq>= zhaCRc^R!7T)#Twb0{!Tns=CxGcGX|leErg`f3|v0eBXxHU&6Sj-_>zOL!!d+j5Xt* zPS;rWd^zEF{5d5%)nNK=)zFJ8Uc=aQKD%UK)_TNes1Gh{SD*Mb_@O` z7*zs9Uq~Vq?v|^8FcM-yLGMKzR3YFB0z@CFM2X-dio%Gu6&MJj=I?uS7sA3AdE^p8 zE49$PjJzPIJwfn;jso7X2#jynr3dO@p5QAK1O9wqKLC=PkQjj~p#n|-5O`ihbTzzu zL{}2QEe28pJYfVZRW56FL`LvO&|C^1Th{0}hQMW$Ng$QPpnzlwnMnf=kVy8(y==L% zLMa>r0gELdT Date: Fri, 30 Oct 2015 21:42:21 -0400 Subject: [PATCH 014/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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/290] 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 7b10f6e5604504c087358b3e70b91f20dbe1e509 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 10 Nov 2015 19:53:31 -0500 Subject: [PATCH 021/290] 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 f9016bc82a0906c9b24f1bf32cc747095387a5a9 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 12:39:41 -0500 Subject: [PATCH 022/290] 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 8ae516d6c76e9996cd62bf95d62edb6a281e9d97 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 22 Nov 2015 17:05:26 -0500 Subject: [PATCH 023/290] 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 024/290] 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 025/290] 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 026/290] 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 027/290] 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 028/290] 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 029/290] 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 030/290] 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 031/290] 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 032/290] 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 033/290] 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 7325c0bcf4cef311fcbd08c7a506f7e611412ecd Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Thu, 14 Jan 2016 22:26:57 -0500 Subject: [PATCH 034/290] 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 0b1f36e00fff7a1aa2df6b65117a85bdbf33aafa Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sat, 16 Jan 2016 20:26:34 -0500 Subject: [PATCH 035/290] 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 7eff4abf0040c8f451e7f077f6272f37f83117f0 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Fri, 22 Jan 2016 18:39:36 -0500 Subject: [PATCH 036/290] 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 c3cfe44fc10534a6024aacc23a01b765e3ba65be Mon Sep 17 00:00:00 2001 From: gmercier Date: Mon, 15 Feb 2016 08:30:59 +0100 Subject: [PATCH 037/290] 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 038/290] 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 039/290] 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 040/290] 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 041/290] 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 042/290] 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 043/290] 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 044/290] 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 045/290] 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 046/290] 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 047/290] 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 bf19acfc1d8cf5138748ad22fd97114372d9a4d7 Mon Sep 17 00:00:00 2001 From: malte bargholz Date: Mon, 14 Mar 2016 10:15:35 +0100 Subject: [PATCH 048/290] 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 049/290] 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 050/290] 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 07b8ff34c9efabcd3312efcdbf3cac42be94a325 Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 10:10:58 -0400 Subject: [PATCH 051/290] 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 28be465a8bdcd76241ada94dd857877eb19876aa Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Sun, 20 Mar 2016 12:49:36 -0400 Subject: [PATCH 052/290] 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 053/290] 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 054/290] 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 055/290] 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 056/290] 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 057/290] 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 058/290] 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 220257a996d60cda483322ca44f51a8149fdc89d Mon Sep 17 00:00:00 2001 From: Eric Skroch Date: Tue, 22 Mar 2016 21:02:11 -0400 Subject: [PATCH 059/290] 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 060/290] 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 061/290] 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 062/290] 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 063/290] 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 064/290] 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 065/290] 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 066/290] 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 067/290] 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 068/290] 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 069/290] 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 070/290] 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 071/290] 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 072/290] 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 073/290] 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 074/290] 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 075/290] 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 076/290] 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 077/290] 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 078/290] 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 079/290] 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 080/290] 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 081/290] 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 082/290] 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 083/290] 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 084/290] 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 085/290] 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 086/290] 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 087/290] 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 088/290] 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 089/290] 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 090/290] 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 091/290] 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 092/290] 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 093/290] =?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 094/290] 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 095/290] 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 096/290] 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 097/290] 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 098/290] 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 099/290] 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 100/290] 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 101/290] 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 102/290] 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 103/290] 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 104/290] 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 105/290] 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 106/290] 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 107/290] 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 108/290] 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 109/290] 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 110/290] 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 111/290] 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 112/290] 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 113/290] 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 114/290] 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 115/290] 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 116/290] 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 117/290] 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 118/290] 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 119/290] 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 120/290] 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 256/290] 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 257/290] 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 258/290] 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 259/290] 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 260/290] 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 266/290] 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 267/290] 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 268/290] 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 269/290] 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 270/290] 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 271/290] 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 272/290] 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 273/290] 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 274/290] 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 275/290] 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 276/290] 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 277/290] 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 278/290] 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 279/290] 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 280/290] 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 281/290] 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 282/290] 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 283/290] 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 284/290] 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 285/290] 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 286/290] 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 287/290] 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 288/290] 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 289/290] 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 290/290] 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