From 5502a1481f89f10dfd714b759e068e89831a708f Mon Sep 17 00:00:00 2001 From: Mac User Date: Tue, 25 Dec 2012 15:41:17 +0200 Subject: [PATCH 1/6] Initial Commit --- iDNA.xcodeproj/project.pbxproj | 460 +++ iDNA/Document.h | 13 + iDNA/Document.m | 58 + iDNA/en.lproj/Credits.rtf | 29 + iDNA/en.lproj/Document.xib | 198 ++ iDNA/en.lproj/InfoPlist.strings | 2 + iDNA/en.lproj/MainMenu.xib | 4525 ++++++++++++++++++++++++++ iDNA/iDNA-Info.plist | 55 + iDNA/iDNA-Prefix.pch | 7 + iDNA/main.m | 14 + iDNATests/en.lproj/InfoPlist.strings | 2 + iDNATests/iDNATests-Info.plist | 22 + iDNATests/iDNATests.h | 13 + iDNATests/iDNATests.m | 32 + 14 files changed, 5430 insertions(+) create mode 100644 iDNA.xcodeproj/project.pbxproj create mode 100644 iDNA/Document.h create mode 100644 iDNA/Document.m create mode 100644 iDNA/en.lproj/Credits.rtf create mode 100644 iDNA/en.lproj/Document.xib create mode 100644 iDNA/en.lproj/InfoPlist.strings create mode 100644 iDNA/en.lproj/MainMenu.xib create mode 100644 iDNA/iDNA-Info.plist create mode 100644 iDNA/iDNA-Prefix.pch create mode 100644 iDNA/main.m create mode 100644 iDNATests/en.lproj/InfoPlist.strings create mode 100644 iDNATests/iDNATests-Info.plist create mode 100644 iDNATests/iDNATests.h create mode 100644 iDNATests/iDNATests.m diff --git a/iDNA.xcodeproj/project.pbxproj b/iDNA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6f69300 --- /dev/null +++ b/iDNA.xcodeproj/project.pbxproj @@ -0,0 +1,460 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6373D4FD1689E47B00EE7CDA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */; }; + 6373D5071689E47B00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5051689E47B00EE7CDA /* InfoPlist.strings */; }; + 6373D5091689E47B00EE7CDA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5081689E47B00EE7CDA /* main.m */; }; + 6373D50D1689E47B00EE7CDA /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 6373D50B1689E47B00EE7CDA /* Credits.rtf */; }; + 6373D5101689E47B00EE7CDA /* Document.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D50F1689E47B00EE7CDA /* Document.m */; }; + 6373D5131689E47B00EE7CDA /* Document.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5111689E47B00EE7CDA /* Document.xib */; }; + 6373D5161689E47C00EE7CDA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5141689E47C00EE7CDA /* MainMenu.xib */; }; + 6373D51E1689E47C00EE7CDA /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D51D1689E47C00EE7CDA /* SenTestingKit.framework */; }; + 6373D51F1689E47C00EE7CDA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */; }; + 6373D5271689E47C00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5251689E47C00EE7CDA /* InfoPlist.strings */; }; + 6373D52A1689E47C00EE7CDA /* iDNATests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5291689E47C00EE7CDA /* iDNATests.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6373D5201689E47C00EE7CDA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6373D4EF1689E47B00EE7CDA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6373D4F71689E47B00EE7CDA; + remoteInfo = iDNA; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6373D4F81689E47B00EE7CDA /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 6373D4FF1689E47B00EE7CDA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 6373D5001689E47B00EE7CDA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 6373D5011689E47B00EE7CDA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 6373D5041689E47B00EE7CDA /* iDNA-Info.plist */ = {isa = PBXFileReference; path = "iDNA-Info.plist"; sourceTree = ""; }; + 6373D5061689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6373D5081689E47B00EE7CDA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 6373D50A1689E47B00EE7CDA /* iDNA-Prefix.pch */ = {isa = PBXFileReference; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + 6373D50C1689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 6373D50E1689E47B00EE7CDA /* Document.h */ = {isa = PBXFileReference; path = Document.h; sourceTree = ""; }; + 6373D50F1689E47B00EE7CDA /* Document.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Document.m; sourceTree = ""; }; + 6373D5121689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Document.xib; sourceTree = ""; }; + 6373D5151689E47C00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 6373D51C1689E47C00EE7CDA /* iDNATests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iDNATests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6373D51D1689E47C00EE7CDA /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 6373D5241689E47C00EE7CDA /* iDNATests-Info.plist */ = {isa = PBXFileReference; path = "iDNATests-Info.plist"; sourceTree = ""; }; + 6373D5261689E47C00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6373D5281689E47C00EE7CDA /* iDNATests.h */ = {isa = PBXFileReference; path = iDNATests.h; sourceTree = ""; }; + 6373D5291689E47C00EE7CDA /* iDNATests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iDNATests.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6373D4F51689E47B00EE7CDA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D4FD1689E47B00EE7CDA /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6373D5181689E47C00EE7CDA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D51E1689E47C00EE7CDA /* SenTestingKit.framework in Frameworks */, + 6373D51F1689E47C00EE7CDA /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6373D4ED1689E47B00EE7CDA = { + isa = PBXGroup; + children = ( + 6373D5021689E47B00EE7CDA /* iDNA */, + 6373D5221689E47C00EE7CDA /* iDNATests */, + 6373D4FB1689E47B00EE7CDA /* Frameworks */, + 6373D4F91689E47B00EE7CDA /* Products */, + ); + sourceTree = ""; + }; + 6373D4F91689E47B00EE7CDA /* Products */ = { + isa = PBXGroup; + children = ( + 6373D4F81689E47B00EE7CDA /* iDNA.app */, + 6373D51C1689E47C00EE7CDA /* iDNATests.octest */, + ); + name = Products; + sourceTree = ""; + }; + 6373D4FB1689E47B00EE7CDA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */, + 6373D51D1689E47C00EE7CDA /* SenTestingKit.framework */, + 6373D4FE1689E47B00EE7CDA /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6373D4FE1689E47B00EE7CDA /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 6373D4FF1689E47B00EE7CDA /* AppKit.framework */, + 6373D5001689E47B00EE7CDA /* CoreData.framework */, + 6373D5011689E47B00EE7CDA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 6373D5021689E47B00EE7CDA /* iDNA */ = { + isa = PBXGroup; + children = ( + 6373D50E1689E47B00EE7CDA /* Document.h */, + 6373D50F1689E47B00EE7CDA /* Document.m */, + 6373D5111689E47B00EE7CDA /* Document.xib */, + 6373D5141689E47C00EE7CDA /* MainMenu.xib */, + 6373D5031689E47B00EE7CDA /* Supporting Files */, + ); + path = iDNA; + sourceTree = ""; + }; + 6373D5031689E47B00EE7CDA /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 6373D5041689E47B00EE7CDA /* iDNA-Info.plist */, + 6373D5051689E47B00EE7CDA /* InfoPlist.strings */, + 6373D5081689E47B00EE7CDA /* main.m */, + 6373D50A1689E47B00EE7CDA /* iDNA-Prefix.pch */, + 6373D50B1689E47B00EE7CDA /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 6373D5221689E47C00EE7CDA /* iDNATests */ = { + isa = PBXGroup; + children = ( + 6373D5281689E47C00EE7CDA /* iDNATests.h */, + 6373D5291689E47C00EE7CDA /* iDNATests.m */, + 6373D5231689E47C00EE7CDA /* Supporting Files */, + ); + path = iDNATests; + sourceTree = ""; + }; + 6373D5231689E47C00EE7CDA /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 6373D5241689E47C00EE7CDA /* iDNATests-Info.plist */, + 6373D5251689E47C00EE7CDA /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6373D4F71689E47B00EE7CDA /* iDNA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6373D52D1689E47C00EE7CDA /* Build configuration list for PBXNativeTarget "iDNA" */; + buildPhases = ( + 6373D4F41689E47B00EE7CDA /* Sources */, + 6373D4F51689E47B00EE7CDA /* Frameworks */, + 6373D4F61689E47B00EE7CDA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iDNA; + productName = iDNA; + productReference = 6373D4F81689E47B00EE7CDA /* iDNA.app */; + productType = "com.apple.product-type.application"; + }; + 6373D51B1689E47C00EE7CDA /* iDNATests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6373D5301689E47C00EE7CDA /* Build configuration list for PBXNativeTarget "iDNATests" */; + buildPhases = ( + 6373D5171689E47C00EE7CDA /* Sources */, + 6373D5181689E47C00EE7CDA /* Frameworks */, + 6373D5191689E47C00EE7CDA /* Resources */, + 6373D51A1689E47C00EE7CDA /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 6373D5211689E47C00EE7CDA /* PBXTargetDependency */, + ); + name = iDNATests; + productName = iDNATests; + productReference = 6373D51C1689E47C00EE7CDA /* iDNATests.octest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6373D4EF1689E47B00EE7CDA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = 6373D4F21689E47B00EE7CDA /* Build configuration list for PBXProject "iDNA" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 6373D4ED1689E47B00EE7CDA; + productRefGroup = 6373D4F91689E47B00EE7CDA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6373D4F71689E47B00EE7CDA /* iDNA */, + 6373D51B1689E47C00EE7CDA /* iDNATests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6373D4F61689E47B00EE7CDA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D5071689E47B00EE7CDA /* InfoPlist.strings in Resources */, + 6373D50D1689E47B00EE7CDA /* Credits.rtf in Resources */, + 6373D5131689E47B00EE7CDA /* Document.xib in Resources */, + 6373D5161689E47C00EE7CDA /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6373D5191689E47C00EE7CDA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D5271689E47C00EE7CDA /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6373D51A1689E47C00EE7CDA /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6373D4F41689E47B00EE7CDA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D5091689E47B00EE7CDA /* main.m in Sources */, + 6373D5101689E47B00EE7CDA /* Document.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6373D5171689E47C00EE7CDA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6373D52A1689E47C00EE7CDA /* iDNATests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 6373D5211689E47C00EE7CDA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6373D4F71689E47B00EE7CDA /* iDNA */; + targetProxy = 6373D5201689E47C00EE7CDA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 6373D5051689E47B00EE7CDA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 6373D5061689E47B00EE7CDA /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 6373D50B1689E47B00EE7CDA /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 6373D50C1689E47B00EE7CDA /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 6373D5111689E47B00EE7CDA /* Document.xib */ = { + isa = PBXVariantGroup; + children = ( + 6373D5121689E47B00EE7CDA /* en */, + ); + name = Document.xib; + sourceTree = ""; + }; + 6373D5141689E47C00EE7CDA /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 6373D5151689E47C00EE7CDA /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + 6373D5251689E47C00EE7CDA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 6373D5261689E47C00EE7CDA /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6373D52B1689E47C00EE7CDA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 6373D52C1689E47C00EE7CDA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + SDKROOT = macosx; + }; + name = Release; + }; + 6373D52E1689E47C00EE7CDA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 6373D52F1689E47C00EE7CDA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 6373D5311689E47C00EE7CDA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/Contents/MacOS/iDNA"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNATests/iDNATests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + 6373D5321689E47C00EE7CDA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/Contents/MacOS/iDNA"; + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNATests/iDNATests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6373D4F21689E47B00EE7CDA /* Build configuration list for PBXProject "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6373D52B1689E47C00EE7CDA /* Debug */, + 6373D52C1689E47C00EE7CDA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6373D52D1689E47C00EE7CDA /* Build configuration list for PBXNativeTarget "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6373D52E1689E47C00EE7CDA /* Debug */, + 6373D52F1689E47C00EE7CDA /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 6373D5301689E47C00EE7CDA /* Build configuration list for PBXNativeTarget "iDNATests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6373D5311689E47C00EE7CDA /* Debug */, + 6373D5321689E47C00EE7CDA /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 6373D4EF1689E47B00EE7CDA /* Project object */; +} diff --git a/iDNA/Document.h b/iDNA/Document.h new file mode 100644 index 0000000..dbd143d --- /dev/null +++ b/iDNA/Document.h @@ -0,0 +1,13 @@ +// +// Document.h +// iDNA +// +// Created by Mac User on 12/25/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import + +@interface Document : NSDocument + +@end diff --git a/iDNA/Document.m b/iDNA/Document.m new file mode 100644 index 0000000..ef367cb --- /dev/null +++ b/iDNA/Document.m @@ -0,0 +1,58 @@ +// +// Document.m +// iDNA +// +// Created by Mac User on 12/25/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import "Document.h" + +@implementation Document + +- (id)init +{ + self = [super init]; + if (self) { + // Add your subclass-specific initialization here. + // If an error occurs here, return nil. + } + return self; +} + +- (NSString *)windowNibName +{ + // Override returning the nib file name of the document + // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. + return @"Document"; +} + +- (void)windowControllerDidLoadNib:(NSWindowController *)aController +{ + [super windowControllerDidLoadNib:aController]; + // Add any code here that needs to be executed once the windowController has loaded the document's window. +} + +- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError +{ + /* + Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil. + You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. + */ + NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; + @throw exception; + return nil; +} + +- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError +{ + /* + Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning NO. + You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. + */ + NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil]; + @throw exception; + return YES; +} + +@end diff --git a/iDNA/en.lproj/Credits.rtf b/iDNA/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/iDNA/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/iDNA/en.lproj/Document.xib b/iDNA/en.lproj/Document.xib new file mode 100644 index 0000000..1618b7f --- /dev/null +++ b/iDNA/en.lproj/Document.xib @@ -0,0 +1,198 @@ + + + + 1070 + 11A511 + 1920 + 1138 + 566.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 1920 + + + NSTextField + NSTextFieldCell + NSWindowTemplate + NSView + NSCustomObject + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + Document + + + FirstResponder + + + 15 + 2 + {{133, 235}, {507, 413}} + 1886912512 + Window + NSWindow + View + + {94, 86} + + + 256 + + + + 256 + {{119, 195}, {269, 22}} + + + YES + + 67239424 + 138412032 + Your document contents here + + LucidaGrande + 18 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + {507, 413} + + + + {{0, 0}, {1440, 878}} + {94, 108} + {10000000000000, 10000000000000} + YES + + + NSApplication + + + + + + + window + + + + 18 + + + + delegate + + + + 17 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + 5 + + + + + + Window + + + 6 + + + + + + + + 20 + + + + + + + + 100020 + + + + + -3 + + + Application + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{133, 170}, {507, 413}} + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 100020 + + + 0 + IBCocoaFramework + YES + 3 + + diff --git a/iDNA/en.lproj/InfoPlist.strings b/iDNA/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/en.lproj/MainMenu.xib b/iDNA/en.lproj/MainMenu.xib new file mode 100644 index 0000000..a0c2024 --- /dev/null +++ b/iDNA/en.lproj/MainMenu.xib @@ -0,0 +1,4525 @@ + + + + 1070 + 11A511 + 1920 + 1138 + 566.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 1920 + + + NSMenu + NSMenuItem + NSCustomObject + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + iDNA + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + iDNA + + + + About iDNA + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide iDNA + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit iDNA + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + Ligature + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + iDNA Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + NSFontManager + + + + + + + terminate: + + + + 448 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 371 + + + + openDocument: + + + + 372 + + + + printDocument: + + + + 373 + + + + raiseBaseline: + + + + 425 + + + + lowerBaseline: + + + + 426 + + + + copyFont: + + + + 427 + + + + subscript: + + + + 428 + + + + superscript: + + + + 429 + + + + tightenKerning: + + + + 430 + + + + underline: + + + + 431 + + + + orderFrontColorPanel: + + + + 432 + + + + useAllLigatures: + + + + 433 + + + + loosenKerning: + + + + 434 + + + + pasteFont: + + + + 435 + + + + unscript: + + + + 436 + + + + useStandardKerning: + + + + 437 + + + + useStandardLigatures: + + + + 438 + + + + turnOffLigatures: + + + + 439 + + + + turnOffKerning: + + + + 440 + + + + capitalizeWord: + + + + 454 + + + + lowercaseWord: + + + + 455 + + + + uppercaseWord: + + + + 456 + + + + toggleAutomaticDashSubstitution: + + + + 460 + + + + orderFrontSubstitutionsPanel: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + toggleAutomaticSpellingCorrection: + + + + 466 + + + + performFindPanelAction: + + + + 467 + + + + performFindPanelAction: + + + + 468 + + + + performFindPanelAction: + + + + 469 + + + + pasteAsPlainText: + + + + 471 + + + + showHelp: + + + + 494 + + + + alignCenter: + + + + 517 + + + + pasteRuler: + + + + 518 + + + + toggleRuler: + + + + 519 + + + + alignRight: + + + + 520 + + + + copyRuler: + + + + 521 + + + + alignJustified: + + + + 522 + + + + alignLeft: + + + + 523 + + + + makeBaseWritingDirectionNatural: + + + + 524 + + + + makeBaseWritingDirectionLeftToRight: + + + + 525 + + + + makeBaseWritingDirectionRightToLeft: + + + + 526 + + + + makeTextWritingDirectionNatural: + + + + 527 + + + + makeTextWritingDirectionLeftToRight: + + + + 528 + + + + makeTextWritingDirectionRightToLeft: + + + + 529 + + + + addFontTrait: + + + + 420 + + + + addFontTrait: + + + + 421 + + + + modifyFont: + + + + 422 + + + + orderFrontFontPanel: + + + + 423 + + + + modifyFont: + + + + 424 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 374 + + + + + + + + 375 + + + + + + + + + 376 + + + + + + + + 387 + + + + + + + + + + + + + + + + + + + + + + + 388 + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + + + + + + + + 405 + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + + + + + + 411 + + + + + 412 + + + + + 413 + + + + + 414 + + + + + + + + + + + 415 + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 449 + + + + + + + + 450 + + + + + + + + + + 451 + + + + + 452 + + + + + 453 + + + + + 457 + + + + + 458 + + + + + 459 + + + + + 462 + + + + + 464 + + + + + 465 + + + + + 470 + + + + + 491 + + + + + + + + 492 + + + + + + + + 493 + + + + + 495 + + + + + + + + 496 + + + + + + + + + + + + + + + + + 497 + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + + + + 503 + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + + + + + + + + + + + + 508 + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 529 + + + + + ABAppCardController + NSWindowController + + id + id + id + id + id + id + id + id + + + + addCardViewField: + id + + + copy: + id + + + cut: + id + + + doDelete: + id + + + find: + id + + + paste: + id + + + saveChanges: + id + + + toggleCardEditingMode: + id + + + + ABCardView + NSButton + NSManagedObjectContext + NSSearchField + NSTextField + NSWindow + + + + mCardView + ABCardView + + + mEditButton + NSButton + + + mManagedObjectContext + NSManagedObjectContext + + + mSearchField + NSSearchField + + + mStatusTextField + NSTextField + + + mWindow + NSWindow + + + + IBProjectSource + ./Classes/ABAppCardController.h + + + + ABCardView + NSView + + id + id + + + + commitAndSave: + id + + + statusImageClicked: + id + + + + NSObjectController + NSImageView + NSView + ABNameFrameView + NSView + NSImage + ABImageView + + + + mBindingsController + NSObjectController + + + mBuddyStatusImage + NSImageView + + + mHeaderView + NSView + + + mNameView + ABNameFrameView + + + mNextKeyView + NSView + + + mUserImage + NSImage + + + mUserImageView + ABImageView + + + + IBProjectSource + ./Classes/ABCardView.h + + + + ABImageView + NSImageView + + id + id + id + id + + + + copy: + id + + + cut: + id + + + delete: + id + + + paste: + id + + + + IBProjectSource + ./Classes/ABImageView.h + + + + DVTAutoLayoutView + NSView + + IBProjectSource + ./Classes/DVTAutoLayoutView.h + + + + DVTBorderedView + DVTAutoLayoutView + + contentView + NSView + + + contentView + + contentView + NSView + + + + IBProjectSource + ./Classes/DVTBorderedView.h + + + + DVTDelayedMenuButton + NSButton + + IBProjectSource + ./Classes/DVTDelayedMenuButton.h + + + + DVTGradientImageButton + NSButton + + IBProjectSource + ./Classes/DVTGradientImageButton.h + + + + DVTImageAndTextCell + NSTextFieldCell + + IBProjectSource + ./Classes/DVTImageAndTextCell.h + + + + DVTImageAndTextColumn + NSTableColumn + + IBProjectSource + ./Classes/DVTImageAndTextColumn.h + + + + DVTOutlineView + NSOutlineView + + IBProjectSource + ./Classes/DVTOutlineView.h + + + + DVTSplitView + NSSplitView + + IBProjectSource + ./Classes/DVTSplitView.h + + + + DVTStackView + DVTAutoLayoutView + + IBProjectSource + ./Classes/DVTStackView.h + + + + DVTViewController + NSViewController + + IBProjectSource + ./Classes/DVTViewController.h + + + + HFController + NSObject + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFController.h + + + + HFRepresenterTextView + NSView + + selectAll: + id + + + selectAll: + + selectAll: + id + + + + IBProjectSource + ./Classes/HFRepresenterTextView.h + + + + IBEditor + NSObject + + id + id + id + + + + changeFont: + id + + + selectAll: + id + + + sizeSelectionToFit: + id + + + + IBProjectSource + ./Classes/IBEditor.h + + + + IDECapsuleListView + DVTStackView + + dataSource + id + + + dataSource + + dataSource + id + + + + IBProjectSource + ./Classes/IDECapsuleListView.h + + + + IDEDMArrayController + NSArrayController + + IBProjectSource + ./Classes/IDEDMArrayController.h + + + + IDEDMEditor + IDEEditor + + DVTBorderedView + NSView + IDEDMEditorSourceListController + DVTSplitView + + + + bottomToolbarBorderView + DVTBorderedView + + + sourceListSplitViewPane + NSView + + + sourceListViewController + IDEDMEditorSourceListController + + + splitView + DVTSplitView + + + + IBProjectSource + ./Classes/IDEDMEditor.h + + + + IDEDMEditorController + IDEViewController + + IBProjectSource + ./Classes/IDEDMEditorController.h + + + + IDEDMEditorSourceListController + IDEDMEditorController + + DVTBorderedView + IDEDMEditor + DVTImageAndTextColumn + DVTOutlineView + NSTreeController + + + + borderedView + DVTBorderedView + + + parentEditor + IDEDMEditor + + + primaryColumn + DVTImageAndTextColumn + + + sourceListOutlineView + DVTOutlineView + + + sourceListTreeController + NSTreeController + + + + IBProjectSource + ./Classes/IDEDMEditorSourceListController.h + + + + IDEDMHighlightImageAndTextCell + DVTImageAndTextCell + + IBProjectSource + ./Classes/IDEDMHighlightImageAndTextCell.h + + + + IDEDataModelBrowserEditor + IDEDMEditorController + + IDEDataModelPropertiesTableController + IDECapsuleListView + NSArrayController + IDEDataModelPropertiesTableController + IDEDataModelEntityContentsEditor + IDEDataModelPropertiesTableController + + + + attributesTableViewController + IDEDataModelPropertiesTableController + + + capsuleView + IDECapsuleListView + + + entityArrayController + NSArrayController + + + fetchedPropertiesTableViewController + IDEDataModelPropertiesTableController + + + parentEditor + IDEDataModelEntityContentsEditor + + + relationshipsTableViewController + IDEDataModelPropertiesTableController + + + + IBProjectSource + ./Classes/IDEDataModelBrowserEditor.h + + + + IDEDataModelConfigurationEditor + IDEDMEditorController + + IDECapsuleListView + IDEDataModelEditor + IDEDataModelConfigurationTableController + + + + capsuleListView + IDECapsuleListView + + + parentEditor + IDEDataModelEditor + + + tableController + IDEDataModelConfigurationTableController + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationEditor.h + + + + IDEDataModelConfigurationTableController + IDEDMEditorController + + NSArrayController + NSArrayController + IDEDataModelConfigurationEditor + XDTableView + + + + configurationsArrayController + NSArrayController + + + entitiesArrayController + NSArrayController + + + parentEditor + IDEDataModelConfigurationEditor + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelConfigurationTableController.h + + + + IDEDataModelDiagramEditor + IDEDMEditorController + + XDDiagramView + IDEDataModelEntityContentsEditor + + + + diagramView + XDDiagramView + + + parentEditor + IDEDataModelEntityContentsEditor + + + + IBProjectSource + ./Classes/IDEDataModelDiagramEditor.h + + + + IDEDataModelEditor + IDEDMEditor + + DVTDelayedMenuButton + DVTDelayedMenuButton + NSSegmentedControl + IDEDataModelConfigurationEditor + IDEDataModelEntityContentsEditor + IDEDataModelFetchRequestEditor + NSSegmentedControl + NSTabView + + + + addEntityButton + DVTDelayedMenuButton + + + addPropertyButton + DVTDelayedMenuButton + + + browserDiagramSegmentControl + NSSegmentedControl + + + configurationViewController + IDEDataModelConfigurationEditor + + + entityContentsViewController + IDEDataModelEntityContentsEditor + + + fetchRequestViewController + IDEDataModelFetchRequestEditor + + + hierarchySegmentControl + NSSegmentedControl + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEditor.h + + + + IDEDataModelEntityContentsEditor + IDEDMEditorController + + IDEDataModelBrowserEditor + IDEDataModelDiagramEditor + IDEDataModelEditor + NSTabView + + + + browserViewController + IDEDataModelBrowserEditor + + + diagramViewController + IDEDataModelDiagramEditor + + + parentEditor + IDEDataModelEditor + + + tabView + NSTabView + + + + IBProjectSource + ./Classes/IDEDataModelEntityContentsEditor.h + + + + IDEDataModelFetchRequestEditor + IDEDMEditorController + + NSArrayController + IDEDataModelEditor + IDECapsuleListView + + + + entityController + NSArrayController + + + parentEditor + IDEDataModelEditor + + + tableView + IDECapsuleListView + + + + IBProjectSource + ./Classes/IDEDataModelFetchRequestEditor.h + + + + IDEDataModelPropertiesTableController + IDEDMEditorController + + IDEDMArrayController + NSTableColumn + NSArrayController + IDEDataModelBrowserEditor + IDEDMHighlightImageAndTextCell + XDTableView + + + + arrayController + IDEDMArrayController + + + entitiesColumn + NSTableColumn + + + entityArrayController + NSArrayController + + + parentEditor + IDEDataModelBrowserEditor + + + propertyNameAndImageCell + IDEDMHighlightImageAndTextCell + + + tableView + XDTableView + + + + IBProjectSource + ./Classes/IDEDataModelPropertiesTableController.h + + + + IDEDocSetOutlineView + NSOutlineView + + IBProjectSource + ./Classes/IDEDocSetOutlineView.h + + + + IDEDocSetOutlineViewController + NSObject + + id + id + id + id + id + + + + getDocSetAction: + id + + + showProblemInfoForUpdate: + id + + + subscribeToPublisherAction: + id + + + unsubscribeFromPublisher: + id + + + updateDocSetAction: + id + + + + docSetOutlineView + IDEDocSetOutlineView + + + docSetOutlineView + + docSetOutlineView + IDEDocSetOutlineView + + + + IBProjectSource + ./Classes/IDEDocSetOutlineViewController.h + + + + IDEDocViewingPrefPaneController + IDEViewController + + id + id + id + id + id + id + id + id + id + + + + addSubscription: + id + + + checkForAndInstallUpdatesNow: + id + + + minimumFontSizeComboBoxAction: + id + + + minimumFontSizeEnabledAction: + id + + + showHelp: + id + + + showSubscriptionSheet: + id + + + subscriptionCancelAction: + id + + + toggleAutoCheckForAndInstallUpdates: + id + + + toggleDocSetInfo: + id + + + + DVTGradientImageButton + DVTGradientImageButton + DVTGradientImageButton + NSSplitView + NSView + NSView + DVTBorderedView + DVTBorderedView + NSButton + NSTextView + IDEDocSetOutlineViewController + NSComboBox + NSTextField + NSButton + NSTextField + NSWindow + NSButton + + + + _addButton + DVTGradientImageButton + + + _deleteButton + DVTGradientImageButton + + + _showInfoAreaButton + DVTGradientImageButton + + + _splitView + NSSplitView + + + _splitViewDocSetInfoSubview + NSView + + + _splitViewDocSetsListSubview + NSView + + + borderedViewAroundSplitView + DVTBorderedView + + + borderedViewBelowTable + DVTBorderedView + + + checkAndInstallNowButton + NSButton + + + docSetInfoTextView + NSTextView + + + docSetOutlineViewController + IDEDocSetOutlineViewController + + + minimumFontSizeControl + NSComboBox + + + noUpdatesAvailableMessage + NSTextField + + + showInfoButton + NSButton + + + subscriptionTextField + NSTextField + + + subscriptionWindow + NSWindow + + + validateAddSubscriptionButton + NSButton + + + + IBProjectSource + ./Classes/IDEDocViewingPrefPaneController.h + + + + IDEEditor + IDEViewController + + IBProjectSource + ./Classes/IDEEditor.h + + + + IDEViewController + DVTViewController + + IBProjectSource + ./Classes/IDEViewController.h + + + + IKImageView + + id + id + id + id + + + + copy: + id + + + crop: + id + + + cut: + id + + + paste: + id + + + + IBProjectSource + ./Classes/IKImageView.h + + + + NSDocument + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + + + NSDocumentController + + _openRecentDocument: + id + + + _openRecentDocument: + + _openRecentDocument: + id + + + + IBProjectSource + ./Classes/NSDocumentController.h + + + + QLPreviewBubble + NSObject + + id + id + + + + hide: + id + + + show: + id + + + + parentWindow + NSWindow + + + parentWindow + + parentWindow + NSWindow + + + + IBProjectSource + ./Classes/QLPreviewBubble.h + + + + QTMovieView + + id + id + id + id + id + + + + showAll: + id + + + showCustomButton: + id + + + toggleLoops: + id + + + zoomIn: + id + + + zoomOut: + id + + + + IBProjectSource + ./Classes/QTMovieView.h + + + + WebView + + id + id + id + id + + + + reloadFromOrigin: + id + + + resetPageZoom: + id + + + zoomPageIn: + id + + + zoomPageOut: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + XDDiagramView + NSView + + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + id + + + + _graphLayouterMenuItemAction: + id + + + _zoomPopUpButtonAction: + id + + + alignBottomEdges: + id + + + alignCentersHorizontallyInContainer: + id + + + alignCentersVerticallyInContainer: + id + + + alignHorizontalCenters: + id + + + alignLeftEdges: + id + + + alignRightEdges: + id + + + alignTopEdges: + id + + + alignVerticalCenters: + id + + + bringToFront: + id + + + collapseAllCompartments: + id + + + copy: + id + + + cut: + id + + + delete: + id + + + deleteBackward: + id + + + deleteForward: + id + + + deselectAll: + id + + + diagramZoomIn: + id + + + diagramZoomOut: + id + + + expandAllCompartments: + id + + + flipHorizontally: + id + + + flipVertically: + id + + + layoutGraphicsConcentrically: + id + + + layoutGraphicsHierarchically: + id + + + lock: + id + + + makeSameHeight: + id + + + makeSameWidth: + id + + + moveDown: + id + + + moveDownAndModifySelection: + id + + + moveLeft: + id + + + moveLeftAndModifySelection: + id + + + moveRight: + id + + + moveRightAndModifySelection: + id + + + moveUp: + id + + + moveUpAndModifySelection: + id + + + paste: + id + + + rollDownAllCompartments: + id + + + rollUpAllCompartments: + id + + + selectAll: + id + + + sendToBack: + id + + + sizeToFit: + id + + + toggleGridShown: + id + + + toggleHiddenGraphicsShown: + id + + + togglePageBreaksShown: + id + + + toggleRuler: + id + + + toggleSnapsToGrid: + id + + + unlock: + id + + + + _diagramController + IDEDataModelDiagramEditor + + + _diagramController + + _diagramController + IDEDataModelDiagramEditor + + + + IBProjectSource + ./Classes/XDDiagramView.h + + + + XDTableView + NSTableView + + showAllTableColumns: + id + + + showAllTableColumns: + + showAllTableColumns: + id + + + + IBProjectSource + ./Classes/XDTableView.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {9, 8} + {7, 2} + + + diff --git a/iDNA/iDNA-Info.plist b/iDNA/iDNA-Info.plist new file mode 100644 index 0000000..d77a77d --- /dev/null +++ b/iDNA/iDNA-Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + population + + CFBundleTypeIconFile + + CFBundleTypeName + DocumentType + CFBundleTypeOSTypes + + ???? + + CFBundleTypeRole + Editor + NSDocumentClass + Document + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + D-Unknown.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2012 __MyCompanyName__. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/iDNA/iDNA-Prefix.pch b/iDNA/iDNA-Prefix.pch new file mode 100644 index 0000000..24593cd --- /dev/null +++ b/iDNA/iDNA-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNA' target in the 'iDNA' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/main.m b/iDNA/main.m new file mode 100644 index 0000000..b6cad8e --- /dev/null +++ b/iDNA/main.m @@ -0,0 +1,14 @@ +// +// main.m +// iDNA +// +// Created by Mac User on 12/25/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/iDNATests/en.lproj/InfoPlist.strings b/iDNATests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNATests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNATests/iDNATests-Info.plist b/iDNATests/iDNATests-Info.plist new file mode 100644 index 0000000..aa54a7c --- /dev/null +++ b/iDNATests/iDNATests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + D-Unknown.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/iDNATests/iDNATests.h b/iDNATests/iDNATests.h new file mode 100644 index 0000000..0854963 --- /dev/null +++ b/iDNATests/iDNATests.h @@ -0,0 +1,13 @@ +// +// iDNATests.h +// iDNATests +// +// Created by Mac User on 12/25/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import + +@interface iDNATests : SenTestCase + +@end diff --git a/iDNATests/iDNATests.m b/iDNATests/iDNATests.m new file mode 100644 index 0000000..8fdcacd --- /dev/null +++ b/iDNATests/iDNATests.m @@ -0,0 +1,32 @@ +// +// iDNATests.m +// iDNATests +// +// Created by Mac User on 12/25/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import "iDNATests.h" + +@implementation iDNATests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in iDNATests"); +} + +@end From 86a2268aa5dac39fada251c41b9819d6b8738f9f Mon Sep 17 00:00:00 2001 From: Mac User Date: Sun, 30 Dec 2012 15:54:53 +0200 Subject: [PATCH 2/6] Load & Undo/Redo not ready yet --- iDNA.xcodeproj/project.pbxproj | 28 +- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 36623 bytes .../xcdebugger/Breakpoints.xcbkptlist | 5 + .../xcschemes/iDNA.xcscheme | 94 ++ .../xcschemes/xcschememanagement.plist | 27 + iDNA/Cell+Mutate.h | 15 + iDNA/Cell+Mutate.m | 36 + iDNA/Cell.h | 24 + iDNA/Cell.m | 101 ++ iDNA/Document.h | 53 +- iDNA/Document.m | 170 ++- iDNA/en.lproj/Document.xib | 1118 ++++++++++++++++- osx-project-3 | 1 + 14 files changed, 1620 insertions(+), 59 deletions(-) create mode 100644 iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/iDNA.xcscheme create mode 100644 iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iDNA/Cell+Mutate.h create mode 100644 iDNA/Cell+Mutate.m create mode 100644 iDNA/Cell.h create mode 100644 iDNA/Cell.m create mode 160000 osx-project-3 diff --git a/iDNA.xcodeproj/project.pbxproj b/iDNA.xcodeproj/project.pbxproj index 6f69300..57dc61c 100644 --- a/iDNA.xcodeproj/project.pbxproj +++ b/iDNA.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ 6373D51F1689E47C00EE7CDA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */; }; 6373D5271689E47C00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5251689E47C00EE7CDA /* InfoPlist.strings */; }; 6373D52A1689E47C00EE7CDA /* iDNATests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5291689E47C00EE7CDA /* iDNATests.m */; }; + 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5341689EC2F00EE7CDA /* Cell.m */; }; + 6373D5381689EC4A00EE7CDA /* Cell+Mutate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -36,21 +38,25 @@ 6373D4FF1689E47B00EE7CDA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 6373D5001689E47B00EE7CDA /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 6373D5011689E47B00EE7CDA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 6373D5041689E47B00EE7CDA /* iDNA-Info.plist */ = {isa = PBXFileReference; path = "iDNA-Info.plist"; sourceTree = ""; }; + 6373D5041689E47B00EE7CDA /* iDNA-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNA-Info.plist"; sourceTree = ""; }; 6373D5061689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 6373D5081689E47B00EE7CDA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 6373D50A1689E47B00EE7CDA /* iDNA-Prefix.pch */ = {isa = PBXFileReference; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + 6373D50A1689E47B00EE7CDA /* iDNA-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iDNA-Prefix.pch"; sourceTree = ""; }; 6373D50C1689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; - 6373D50E1689E47B00EE7CDA /* Document.h */ = {isa = PBXFileReference; path = Document.h; sourceTree = ""; }; + 6373D50E1689E47B00EE7CDA /* Document.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Document.h; sourceTree = ""; }; 6373D50F1689E47B00EE7CDA /* Document.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Document.m; sourceTree = ""; }; 6373D5121689E47B00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Document.xib; sourceTree = ""; }; 6373D5151689E47C00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 6373D51C1689E47C00EE7CDA /* iDNATests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iDNATests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; 6373D51D1689E47C00EE7CDA /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 6373D5241689E47C00EE7CDA /* iDNATests-Info.plist */ = {isa = PBXFileReference; path = "iDNATests-Info.plist"; sourceTree = ""; }; + 6373D5241689E47C00EE7CDA /* iDNATests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNATests-Info.plist"; sourceTree = ""; }; 6373D5261689E47C00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 6373D5281689E47C00EE7CDA /* iDNATests.h */ = {isa = PBXFileReference; path = iDNATests.h; sourceTree = ""; }; + 6373D5281689E47C00EE7CDA /* iDNATests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iDNATests.h; sourceTree = ""; }; 6373D5291689E47C00EE7CDA /* iDNATests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iDNATests.m; sourceTree = ""; }; + 6373D5331689EC0600EE7CDA /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Cell.h; path = ../../DNA/DNA/Cell.h; sourceTree = ""; }; + 6373D5341689EC2F00EE7CDA /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Cell.m; path = ../../DNA/DNA/Cell.m; sourceTree = ""; }; + 6373D5361689EC4200EE7CDA /* Cell+Mutate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Cell+Mutate.h"; path = "../../DNA/DNA/Cell+Mutate.h"; sourceTree = ""; }; + 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Cell+Mutate.m"; path = "../../DNA/DNA/Cell+Mutate.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -118,6 +124,10 @@ children = ( 6373D50E1689E47B00EE7CDA /* Document.h */, 6373D50F1689E47B00EE7CDA /* Document.m */, + 6373D5331689EC0600EE7CDA /* Cell.h */, + 6373D5341689EC2F00EE7CDA /* Cell.m */, + 6373D5361689EC4200EE7CDA /* Cell+Mutate.h */, + 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */, 6373D5111689E47B00EE7CDA /* Document.xib */, 6373D5141689E47C00EE7CDA /* MainMenu.xib */, 6373D5031689E47B00EE7CDA /* Supporting Files */, @@ -266,6 +276,8 @@ files = ( 6373D5091689E47B00EE7CDA /* main.m in Sources */, 6373D5101689E47B00EE7CDA /* Document.m in Sources */, + 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */, + 6373D5381689EC4A00EE7CDA /* Cell+Mutate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -379,9 +391,11 @@ 6373D52E1689E47C00EE7CDA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -390,9 +404,11 @@ 6373D52F1689E47C00EE7CDA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -445,6 +461,7 @@ 6373D52F1689E47C00EE7CDA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 6373D5301689E47C00EE7CDA /* Build configuration list for PBXNativeTarget "iDNATests" */ = { isa = XCConfigurationList; @@ -453,6 +470,7 @@ 6373D5321689E47C00EE7CDA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2d38afe --- /dev/null +++ b/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7acd24b70957afe2a8ca05251a1aaf70f6e418a1 GIT binary patch literal 36623 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 literal 0 HcmV?d00001 diff --git a/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..05301bc --- /dev/null +++ b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/iDNA.xcscheme b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/iDNA.xcscheme new file mode 100644 index 0000000..43c2b76 --- /dev/null +++ b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/iDNA.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..6f4afd9 --- /dev/null +++ b/iDNA.xcodeproj/xcuserdata/macuser.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + iDNA.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 6373D4F71689E47B00EE7CDA + + primary + + + 6373D51B1689E47C00EE7CDA + + primary + + + + + diff --git a/iDNA/Cell+Mutate.h b/iDNA/Cell+Mutate.h new file mode 100644 index 0000000..9aad411 --- /dev/null +++ b/iDNA/Cell+Mutate.h @@ -0,0 +1,15 @@ +// +// Cell+Mutate.h +// DNA +// +// Created by D_Unknown on 11/6/12. +// Copyright (c) 2012 D_Unknown. All rights reserved. +// + +#import "Cell.h" + +@interface Cell (Mutate) + +-(void) mutate:(int) x; + +@end diff --git a/iDNA/Cell+Mutate.m b/iDNA/Cell+Mutate.m new file mode 100644 index 0000000..1da9c88 --- /dev/null +++ b/iDNA/Cell+Mutate.m @@ -0,0 +1,36 @@ +// +// Cell+Mutate.m +// DNA +// +// Created by D_Unknown on 11/6/12. +// Copyright (c) 2012 D_Unknown. All rights reserved. +// + +#import "Cell+Mutate.h" + +@implementation Cell (Mutate) + +-(void) mutate:(int)x { + NSArray *nucleotides=[NSArray arrayWithObjects: @"A", @"T", @"G", @"C", nil]; //array of nucleotides + int DNALen = [DNA count]; + int NucsToMut=x*DNALen/100; + int rand_ind, rand_nuc; + NSMutableArray *mutated = [[NSMutableArray alloc] init]; + + for (int i=0; i + +@interface Cell : NSObject +{ + NSMutableArray *DNA; + NSArray *nucleotidesArray; + +} + +-(id) initWithLength:(int)DNALength; +-(NSString*) getDNAString; +-(int) hammingDistance:(Cell*) c; +-(Cell*) crossbreedWith:(Cell*) partner; +-(NSString*) getNucleotide; + +@end diff --git a/iDNA/Cell.m b/iDNA/Cell.m new file mode 100644 index 0000000..a21ad46 --- /dev/null +++ b/iDNA/Cell.m @@ -0,0 +1,101 @@ +// +// Cell.m +// DNA +// +// Created by D_Unknown on 11/6/12. +// Copyright (c) 2012 D_Unknown. All rights reserved. +// + +#import "Cell.h" + +@implementation Cell + +-(id) init { + self=[super init]; + if (self) { + DNA=[[NSMutableArray alloc] init]; + } + return self; +} + +-(id) initWithLength:(int)DNALength { + self = [super init]; + + if (self) { + nucleotidesArray = [NSArray arrayWithObjects: @"A", @"T", @"G", @"C", nil]; //array of nucleotides + DNA = [[NSMutableArray alloc] initWithCapacity:DNALength]; + + for(int i=0; iDNA count]; i++) + if([[self->DNA objectAtIndex:i] isNotEqualTo: [c->DNA objectAtIndex:i]]) + dist++; //++ hamming distance if nucleotides are not equal + return dist; +} + +-(Cell*) crossbreedWith:(Cell*) partner { + Cell *child=[[Cell alloc] init]; + NSInteger DNALength=[self->DNA count]; + int rand=arc4random()%3; + switch (rand) { + case 0: { + for (int i=0; iDNA addObject:[self->DNA objectAtIndex:i]]; + } + for (int i=DNALength/2; iDNA addObject:[partner->DNA objectAtIndex:i]]; + } + break; + } + + case 1: { + BOOL first=YES; + for (int i=0; iDNA addObject:[self->DNA objectAtIndex:i]]; + first=NO; + } + else { + [child->DNA addObject:[partner->DNA objectAtIndex:i]]; + first=YES; + } + } + break; + } + case 2: { + for (int i=0; iDNA addObject:[self->DNA objectAtIndex:i]]; + } + for (int i=DNALength*0.2; iDNA addObject:[partner->DNA objectAtIndex:i]]; + } + for (int i=DNALength*0.8; iDNA addObject:[self->DNA objectAtIndex:i]]; + } + break; + } + + } + + return child; +} + +@end diff --git a/iDNA/Document.h b/iDNA/Document.h index dbd143d..bcc8e31 100644 --- a/iDNA/Document.h +++ b/iDNA/Document.h @@ -2,12 +2,59 @@ // Document.h // iDNA // -// Created by Mac User on 12/25/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Created by D_unknown on 12/25/12. +// Copyright (c) 2012 D_unknown. All rights reserved. // #import +#import "Cell.h" +#import "Cell+Mutate.h" +@interface Document : NSDocument { + NSMutableArray *population; + Cell *goalDNA; + + NSInteger populationSize; + NSInteger DNALength; + NSInteger mutationRate; + + NSInteger generation; + NSInteger bestMatch; + BOOL paused; + BOOL stopped; + + IBOutlet NSTextField *popSizeField; + IBOutlet NSTextField *DNALenField; + IBOutlet NSTextField *mutRateField; -@interface Document : NSDocument + IBOutlet NSSlider *popSizeSlider; + IBOutlet NSSlider *DNALenSlider; + IBOutlet NSSlider *mutRateSlider; + + + IBOutlet NSTextField *genLabel; + IBOutlet NSTextField *bestMatchLabel; + IBOutlet NSProgressIndicator *bestMatchProg; + + IBOutlet NSTextField *goalDNAField; + + IBOutlet NSButton *startBut; + IBOutlet NSButton *loadBut; + IBOutlet NSButton *stopBut; +} + +- (IBAction)startEvolution:(id)sender; +- (IBAction)populationSizeChange:(id)sender; +- (IBAction)DNALengthChange:(id)sender; +- (IBAction)mutationRateChange:(id)sender; +- (IBAction)stopEvol:(id)sender; + + +- (void) evolution; +- (void) setPopSize; +- (void) setDNALen; +- (void) setMutRate; +- (void) setGen; +- (void) setBestMatch; +- (void) createGoal; @end diff --git a/iDNA/Document.m b/iDNA/Document.m index ef367cb..e630e87 100644 --- a/iDNA/Document.m +++ b/iDNA/Document.m @@ -2,21 +2,17 @@ // Document.m // iDNA // -// Created by Mac User on 12/25/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// Created by D_Unknown on 12/25/12. +// Copyright (c) 2012 D_unknown. All rights reserved. // #import "Document.h" @implementation Document -- (id)init +- (id) init { self = [super init]; - if (self) { - // Add your subclass-specific initialization here. - // If an error occurs here, return nil. - } return self; } @@ -31,6 +27,29 @@ - (void)windowControllerDidLoadNib:(NSWindowController *)aController { [super windowControllerDidLoadNib:aController]; // Add any code here that needs to be executed once the windowController has loaded the document's window. + populationSize=5000; + [self setPopSize]; + + DNALength=50; + [self setDNALen]; + + mutationRate=50; + [self setMutRate]; + + generation=0; + [self setGen]; + + bestMatch=0; + [self setBestMatch]; + + [self createGoal]; + + stopped=NO; + [stopBut setEnabled:NO]; + + //load not implemented yet + [loadBut setEnabled:NO]; + } - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError @@ -55,4 +74,141 @@ - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError * return YES; } + + +- (IBAction)startEvolution:(id)sender { + //set default generation and best match + generation=0; + [genLabel setStringValue:[NSString stringWithFormat:@"Generation: %i",generation]]; + + bestMatch=0; + [bestMatchLabel setStringValue:[NSString stringWithFormat:@"Best individual match - %i%%",bestMatch]]; + [bestMatchProg setDoubleValue:bestMatch]; + + //disable/enable textfield, sliders and buttons + [popSizeField setEnabled:NO]; + [popSizeSlider setEnabled:NO]; + [DNALenField setEnabled:NO]; + [DNALenSlider setEnabled:NO]; + [startBut setEnabled:NO]; + [stopBut setEnabled:YES]; + + //create population + population = [[NSMutableArray alloc] init]; + for(int i=0; i[obj2 hammingDistance:goalDNA]) + return (NSComparisonResult)NSOrderedDescending; + if ([obj1 hammingDistance:goalDNA]<[obj2 hammingDistance:goalDNA]) + return (NSComparisonResult)NSOrderedAscending; + return NSOrderedSame; + }]; + //find best match %, stop evolution if 100% + bestMatch=100-([[population objectAtIndex:0] hammingDistance:goalDNA]*100/DNALength); + [self setBestMatch]; + if(bestMatch==100) break; + + //crossbreed + int parent1, parent2; + for(int i=(populationSize/2); i - 1070 - 11A511 - 1920 - 1138 - 566.00 + 1060 + 10J869 + 1938 + 1038.35 + 461.00 com.apple.InterfaceBuilder.CocoaPlugin - 1920 + 1938 - NSTextField - NSTextFieldCell + NSProgressIndicator NSWindowTemplate - NSView + NSTextField NSCustomObject + NSBox + NSButton + NSButtonCell + NSView + NSSliderCell + NSTextFieldCell + NSSlider + NSUserDefaultsController com.apple.InterfaceBuilder.CocoaPlugin @@ -34,67 +41,462 @@ 15 2 - {{133, 235}, {507, 413}} + {{277, 186}, {507, 413}} 1886912512 - Window + iDNA NSWindow View - {94, 86} 256 - + - 256 - {{119, 195}, {269, 22}} + 268 + {{17, 376}, {101, 17}} + YES - - 67239424 - 138412032 - Your document contents here - + + 68288064 + 272630784 + Population size + LucidaGrande - 18 - 16 + 13 + 1044 - - + + 6 System controlColor 3 - MC42NjY2NjY2NjY3AA + MC42NjY2NjY2ODY1AA - + 6 System controlTextColor - + 3 MAA + + + 268 + {{17, 351}, {77, 17}} + + + + YES + + 68288064 + 272630784 + DNA length + + + + + + + + + 268 + {{17, 326}, {102, 17}} + + + + YES + + 68288064 + 272630784 + Mutation rate % + + + + + + + + + 268 + {{124, 323}, {41, 22}} + + + + YES + + -1804468671 + 272630784 + + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{124, 373}, {41, 22}} + + + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{124, 348}, {41, 22}} + + + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{171, 373}, {318, 21}} + + + + YES + + -2079981824 + 0 + + + 9999 + 3 + 5000 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{171, 347}, {318, 21}} + + + + YES + + -2079981824 + 0 + + + 100 + 1 + 50 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{171, 323}, {318, 21}} + + + + YES + + -2079981824 + 0 + + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{196, 287}, {154, 22}} + + + + YES + + 68288064 + 272630784 + Generation: + + LucidaGrande-Bold + 14 + 16 + + + + + + + + + 268 + {{158, 267}, {209, 17}} + + + + YES + + 68288064 + 272630784 + Best individual match - + + + + + + + + + 1292 + + {{18, 239}, {471, 20}} + + + + 16392 + 100 + + + + 268 + {{14, 12}, {132, 32}} + + + + YES + + 67239424 + 134217728 + Start evolution + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{359, 12}, {134, 32}} + + + + YES + + 67239424 + 134217728 + Load goal DNA + + + -2038284033 + 129 + + + 200 + 25 + + + + + 12 + + + + 274 + + + + 268 + {{197, 146}, {75, 19}} + + + + YES + + 68288064 + 272630784 + Goal DNA + + + + + + + + + 268 + {{17, 13}, {435, 125}} + + + + YES + + -1805517311 + 272629760 + + + + YES + + + + + + {{2, 2}, {469, 171}} + + + + + + {{17, 50}, {473, 175}} + + + + {0, 0} + + 67239424 + 0 + Goal DNA + + LucidaGrande + 14 + 16 + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 3 + 0 + 0 + NO + + + + 268 + {{14, 12}, {132, 32}} + + + + YES + + 67239424 + 134217728 + Start evolution + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{146, 12}, {68, 32}} + + + + YES + + 67239424 + 134217728 + Stop + + + -2038284033 + 129 + + + 200 + 25 + + {507, 413} + - {{0, 0}, {1440, 878}} + {{0, 0}, {1024, 746}} {94, 108} - {10000000000000, 10000000000000} - YES + {1e+13, 1e+13} NSApplication + + YES + @@ -106,6 +508,206 @@ 18 + + + startEvolution: + + + + 100082 + + + + populationSizeChange: + + + + 100083 + + + + populationSizeChange: + + + + 100084 + + + + DNALengthChange: + + + + 100087 + + + + DNALengthChange: + + + + 100088 + + + + mutationRateChange: + + + + 100089 + + + + mutationRateChange: + + + + 100091 + + + + popSizField + + + + 100092 + + + + mutRAteField + + + + 100094 + + + + popSizeSlider + + + + 100095 + + + + DNALenSlider + + + + 100096 + + + + mutaRateSlider + + + + 100097 + + + + popSizeField + + + + 100098 + + + + mutRateSlider + + + + 100099 + + + + goalDNAField + + + + 100100 + + + + mutRateField + + + + 100102 + + + + genLabel + + + + 100104 + + + + bestMatchLabel + + + + 100105 + + + + bestMatchProg + + + + 100106 + + + + startBut + + + + 100107 + + + + loadBut + + + + 100110 + + + + DNALenField + + + + 100111 + + + + stopBut + + + + 100115 + + + + stopEvol + + + + 100116 + + + + stopEvol: + + + + 100118 + delegate @@ -148,28 +750,271 @@ 6 - + + + + + + + + + + + + + + + + + - 20 - + -3 + + + Application + + + 100021 + - + - 100020 - - + 100022 + + - -3 - + 100023 + + + + + + + + 100024 + + + + + 100025 + + + + + + + + 100026 + + + + + 100027 + + + + + + + + 100028 + + + + + 100029 + + + + + + + + 100030 + + + + + 100031 + + + + + + + + 100032 + + + + + 100033 + + + + + + + + 100034 + + + + + 100035 + + + + + + + + 100036 + + + + + 100037 + + + + + + + + 100038 + + + + + 100040 + + + + + + + + 100041 + + + + + 100044 + + + + + + + + 100045 + + + + + 100048 + + + + + 100049 + + + + + + + + 100050 + + + + + 100051 + + + + + + + + 100052 + + + + + 100055 + + + + + + + + + 100056 + + + + + + + + 100057 + + + + + 100058 + + + + + + + + 100059 + + + + + 100060 + - Application + + + 100080 + + + + + + + + 100081 + + + + + 100112 + + + + + + + + 100113 + + @@ -177,8 +1022,43 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{133, 170}, {507, 413}} com.apple.InterfaceBuilder.CocoaPlugin @@ -187,9 +1067,159 @@ - 100020 + 100118 + + + + + Document + NSDocument + + id + id + id + id + id + + + + DNALengthChange: + id + + + mutationRateChange: + id + + + populationSizeChange: + id + + + startEvolution: + id + + + stopEvol: + id + + + + NSTextField + NSSlider + NSTextField + NSProgressIndicator + NSTextField + NSTextField + NSButton + NSTextField + NSSlider + NSTextField + NSSlider + NSButton + NSButton + + + + DNALenField + NSTextField + + + DNALenSlider + NSSlider + + + bestMatchLabel + NSTextField + + + bestMatchProg + NSProgressIndicator + + + genLabel + NSTextField + + + goalDNAField + NSTextField + + + loadBut + NSButton + + + mutRateField + NSTextField + + + mutRateSlider + NSSlider + + + popSizeField + NSTextField + + + popSizeSlider + NSSlider + + + startBut + NSButton + + + stopBut + NSButton + + + + IBProjectSource + ./Classes/Document.h + + + + NSDocument + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBProjectSource + ./Classes/NSDocument.h + + + - 0 IBCocoaFramework YES diff --git a/osx-project-3 b/osx-project-3 new file mode 160000 index 0000000..1fbc6d3 --- /dev/null +++ b/osx-project-3 @@ -0,0 +1 @@ +Subproject commit 1fbc6d3051c6e89b55ad48addbc6014f9d8fd832 From 0bb4b10f968c8774f690680c0a85db500d0b8746 Mon Sep 17 00:00:00 2001 From: Mac User Date: Sun, 6 Jan 2013 15:54:15 +0200 Subject: [PATCH 3/6] Load goal DNA is done --- iDNA.xcodeproj/project.pbxproj | 10 +- .../UserInterfaceState.xcuserstate | Bin 36623 -> 37843 bytes iDNA/Document.h | 4 +- iDNA/Document.m | 62 +++-- iDNA/en.lproj/Document.xib | 224 +++++++++++------- 5 files changed, 194 insertions(+), 106 deletions(-) diff --git a/iDNA.xcodeproj/project.pbxproj b/iDNA.xcodeproj/project.pbxproj index 57dc61c..2709093 100644 --- a/iDNA.xcodeproj/project.pbxproj +++ b/iDNA.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 6373D5271689E47C00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5251689E47C00EE7CDA /* InfoPlist.strings */; }; 6373D52A1689E47C00EE7CDA /* iDNATests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5291689E47C00EE7CDA /* iDNATests.m */; }; 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5341689EC2F00EE7CDA /* Cell.m */; }; - 6373D5381689EC4A00EE7CDA /* Cell+Mutate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -55,8 +54,6 @@ 6373D5291689E47C00EE7CDA /* iDNATests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iDNATests.m; sourceTree = ""; }; 6373D5331689EC0600EE7CDA /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Cell.h; path = ../../DNA/DNA/Cell.h; sourceTree = ""; }; 6373D5341689EC2F00EE7CDA /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Cell.m; path = ../../DNA/DNA/Cell.m; sourceTree = ""; }; - 6373D5361689EC4200EE7CDA /* Cell+Mutate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Cell+Mutate.h"; path = "../../DNA/DNA/Cell+Mutate.h"; sourceTree = ""; }; - 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Cell+Mutate.m"; path = "../../DNA/DNA/Cell+Mutate.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -126,8 +123,6 @@ 6373D50F1689E47B00EE7CDA /* Document.m */, 6373D5331689EC0600EE7CDA /* Cell.h */, 6373D5341689EC2F00EE7CDA /* Cell.m */, - 6373D5361689EC4200EE7CDA /* Cell+Mutate.h */, - 6373D5371689EC4A00EE7CDA /* Cell+Mutate.m */, 6373D5111689E47B00EE7CDA /* Document.xib */, 6373D5141689E47C00EE7CDA /* MainMenu.xib */, 6373D5031689E47B00EE7CDA /* Supporting Files */, @@ -277,7 +272,6 @@ 6373D5091689E47B00EE7CDA /* main.m in Sources */, 6373D5101689E47B00EE7CDA /* Document.m in Sources */, 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */, - 6373D5381689EC4A00EE7CDA /* Cell+Mutate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -347,7 +341,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -373,7 +367,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate index 7acd24b70957afe2a8ca05251a1aaf70f6e418a1..c0b925b37f5f268a19dad5d8eb298275764cfbdb 100644 GIT binary patch literal 37843 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 K=WN0M+R85%L5hh0 literal 36623 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 diff --git a/iDNA/Document.h b/iDNA/Document.h index bcc8e31..bbf84b7 100644 --- a/iDNA/Document.h +++ b/iDNA/Document.h @@ -8,7 +8,7 @@ #import #import "Cell.h" -#import "Cell+Mutate.h" + @interface Document : NSDocument { NSMutableArray *population; Cell *goalDNA; @@ -36,6 +36,7 @@ IBOutlet NSProgressIndicator *bestMatchProg; IBOutlet NSTextField *goalDNAField; + IBOutlet NSTextField *bestDNAField; IBOutlet NSButton *startBut; IBOutlet NSButton *loadBut; @@ -48,6 +49,7 @@ - (IBAction)DNALengthChange:(id)sender; - (IBAction)mutationRateChange:(id)sender; - (IBAction)stopEvol:(id)sender; +- (IBAction)loadGoal:(id)sender; - (void) evolution; diff --git a/iDNA/Document.m b/iDNA/Document.m index e630e87..cd56770 100644 --- a/iDNA/Document.m +++ b/iDNA/Document.m @@ -46,9 +46,6 @@ - (void)windowControllerDidLoadNib:(NSWindowController *)aController stopped=NO; [stopBut setEnabled:NO]; - - //load not implemented yet - [loadBut setEnabled:NO]; } @@ -77,13 +74,12 @@ - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError * - (IBAction)startEvolution:(id)sender { - //set default generation and best match + //set default generation, best match and best DNA generation=0; - [genLabel setStringValue:[NSString stringWithFormat:@"Generation: %i",generation]]; - + [self setGen]; bestMatch=0; - [bestMatchLabel setStringValue:[NSString stringWithFormat:@"Best individual match - %i%%",bestMatch]]; - [bestMatchProg setDoubleValue:bestMatch]; + [self setBestMatch]; + [bestDNAField setStringValue:@""]; //disable/enable textfield, sliders and buttons [popSizeField setEnabled:NO]; @@ -92,6 +88,7 @@ - (IBAction)startEvolution:(id)sender { [DNALenSlider setEnabled:NO]; [startBut setEnabled:NO]; [stopBut setEnabled:YES]; + [loadBut setEnabled:NO]; //create population population = [[NSMutableArray alloc] init]; @@ -106,10 +103,6 @@ - (IBAction)startEvolution:(id)sender { -(void) evolution { while(true) { if(stopped) break; - - //increment generation number - generation++; - [self setGen]; //sort by hamming distance to goal DNA [population sortUsingComparator:^(Cell *obj1, Cell *obj2) { @@ -119,11 +112,17 @@ -(void) evolution { return (NSComparisonResult)NSOrderedAscending; return NSOrderedSame; }]; - //find best match %, stop evolution if 100% + + //find best match %, show best DNA, stop evolution if 100% bestMatch=100-([[population objectAtIndex:0] hammingDistance:goalDNA]*100/DNALength); [self setBestMatch]; + [bestDNAField setStringValue:[[population objectAtIndex:0] getDNAString]]; if(bestMatch==100) break; - + + //increment generation number + generation++; + [self setGen]; + //crossbreed int parent1, parent2; for(int i=(populationSize/2); i[DNALenSlider maxValue]) { + NSAlert *sizeAlert = [NSAlert alertWithMessageText:@"Warning!" + defaultButton:@"OK" + alternateButton:nil + otherButton:nil + informativeTextWithFormat:@"Loaded goal DNA is longer than maximum length of %.0f characters. Loaded goal DNA was cut to %.0f characters.",[DNALenSlider maxValue],[DNALenSlider maxValue]]; + [sizeAlert beginSheetModalForWindow:[self windowForSheet] + modalDelegate:self + didEndSelector:nil + contextInfo:nil]; + DNALength = [DNALenSlider maxValue]; //set DNA max length + } + else { + DNALength = [string length]; //else if string length is OK, set DNA length as string length + } + [self setDNALen]; //set textfield and slider values + } +} + -(void) setPopSize { [popSizeField setIntValue:populationSize]; [popSizeSlider setIntValue:populationSize]; diff --git a/iDNA/en.lproj/Document.xib b/iDNA/en.lproj/Document.xib index 0d203a3..0545406 100644 --- a/iDNA/en.lproj/Document.xib +++ b/iDNA/en.lproj/Document.xib @@ -39,9 +39,9 @@ FirstResponder - 15 + 4111 2 - {{277, 186}, {507, 413}} + {{277, 186}, {507, 440}} 1886912512 iDNA NSWindow @@ -54,7 +54,7 @@ 268 - {{17, 376}, {101, 17}} + {{17, 403}, {101, 17}} @@ -92,7 +92,7 @@ 268 - {{17, 351}, {77, 17}} + {{17, 378}, {77, 17}} @@ -110,7 +110,7 @@ 268 - {{17, 326}, {102, 17}} + {{17, 353}, {102, 17}} @@ -128,7 +128,7 @@ 268 - {{124, 323}, {41, 22}} + {{124, 350}, {41, 22}} @@ -160,7 +160,7 @@ 268 - {{124, 373}, {41, 22}} + {{124, 400}, {41, 22}} @@ -179,7 +179,7 @@ 268 - {{124, 348}, {41, 22}} + {{124, 375}, {41, 22}} @@ -198,7 +198,7 @@ 268 - {{171, 373}, {318, 21}} + {{171, 400}, {318, 21}} @@ -221,7 +221,7 @@ 268 - {{171, 347}, {318, 21}} + {{171, 374}, {318, 21}} @@ -244,7 +244,7 @@ 268 - {{171, 323}, {318, 21}} + {{171, 350}, {318, 21}} @@ -267,7 +267,7 @@ 268 - {{196, 287}, {154, 22}} + {{196, 314}, {154, 22}} @@ -289,7 +289,7 @@ 268 - {{158, 267}, {209, 17}} + {{158, 294}, {209, 17}} @@ -308,7 +308,7 @@ 1292 - {{18, 239}, {471, 20}} + {{18, 266}, {471, 20}} @@ -321,7 +321,7 @@ {{14, 12}, {132, 32}} - + YES 67239424 @@ -343,7 +343,6 @@ {{359, 12}, {134, 32}} - YES 67239424 @@ -370,7 +369,7 @@ 268 - {{197, 146}, {75, 19}} + {{202, 174}, {65, 19}} @@ -388,30 +387,71 @@ 268 - {{17, 13}, {435, 125}} + {{17, 110}, {434, 56}} - + YES - -1805517311 + -2076049920 272629760 - + + LucidaGrande + 13 + 16 + YES + + + 268 + {{203, 83}, {63, 19}} + + + + YES + + 68288064 + 272630784 + Best DNA + + + + + + + + + 268 + {{18, 19}, {434, 56}} + + + + YES + + -2076049920 + 272629760 + + + + YES + + + + - {{2, 2}, {469, 171}} + {{2, 2}, {469, 199}} - {{17, 50}, {473, 175}} + {{17, 49}, {473, 203}} @@ -437,28 +477,6 @@ 0 NO - - - 268 - {{14, 12}, {132, 32}} - - - - YES - - 67239424 - 134217728 - Start evolution - - - -2038284033 - 129 - - - 200 - 25 - - 268 @@ -482,7 +500,7 @@ - {507, 413} + {507, 440} @@ -508,14 +526,6 @@ 18 - - - startEvolution: - - - - 100082 - populationSizeChange: @@ -660,14 +670,6 @@ 100106 - - - startBut - - - - 100107 - loadBut @@ -708,6 +710,38 @@ 100118 + + + bestDNAField + + + + 100125 + + + + startEvolution: + + + + 100126 + + + + startBut + + + + 100127 + + + + loadGoal: + + + + 100128 + delegate @@ -755,18 +789,17 @@ - - - + + @@ -954,8 +987,10 @@ 100055 - + + + @@ -990,19 +1025,6 @@ - - 100080 - - - - - - - - 100081 - - - 100112 @@ -1016,6 +1038,32 @@ + + 100119 + + + + + + + + 100120 + + + + + 100123 + + + + + + + + 100124 + + + @@ -1055,10 +1103,12 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{133, 170}, {507, 413}} com.apple.InterfaceBuilder.CocoaPlugin @@ -1067,7 +1117,7 @@ - 100118 + 100128 @@ -1076,6 +1126,7 @@ NSDocument id + id id id id @@ -1086,6 +1137,10 @@ DNALengthChange: id + + loadGoal: + id + mutationRateChange: id @@ -1106,6 +1161,7 @@ NSTextField NSSlider + NSTextField NSTextField NSProgressIndicator NSTextField @@ -1127,6 +1183,10 @@ DNALenSlider NSSlider + + bestDNAField + NSTextField + bestMatchLabel NSTextField From b3dfacc7e0d21f530f9d7f304e9c787f07453b24 Mon Sep 17 00:00:00 2001 From: Mac User Date: Sun, 6 Jan 2013 16:02:42 +0200 Subject: [PATCH 4/6] FINAL --- iDNA/Cell+Mutate.h | 15 --------------- iDNA/Cell+Mutate.m | 36 ------------------------------------ 2 files changed, 51 deletions(-) delete mode 100644 iDNA/Cell+Mutate.h delete mode 100644 iDNA/Cell+Mutate.m diff --git a/iDNA/Cell+Mutate.h b/iDNA/Cell+Mutate.h deleted file mode 100644 index 9aad411..0000000 --- a/iDNA/Cell+Mutate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Cell+Mutate.h -// DNA -// -// Created by D_Unknown on 11/6/12. -// Copyright (c) 2012 D_Unknown. All rights reserved. -// - -#import "Cell.h" - -@interface Cell (Mutate) - --(void) mutate:(int) x; - -@end diff --git a/iDNA/Cell+Mutate.m b/iDNA/Cell+Mutate.m deleted file mode 100644 index 1da9c88..0000000 --- a/iDNA/Cell+Mutate.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// Cell+Mutate.m -// DNA -// -// Created by D_Unknown on 11/6/12. -// Copyright (c) 2012 D_Unknown. All rights reserved. -// - -#import "Cell+Mutate.h" - -@implementation Cell (Mutate) - --(void) mutate:(int)x { - NSArray *nucleotides=[NSArray arrayWithObjects: @"A", @"T", @"G", @"C", nil]; //array of nucleotides - int DNALen = [DNA count]; - int NucsToMut=x*DNALen/100; - int rand_ind, rand_nuc; - NSMutableArray *mutated = [[NSMutableArray alloc] init]; - - for (int i=0; i Date: Sun, 6 Jan 2013 16:14:19 +0200 Subject: [PATCH 5/6] FINAL_2 --- .../UserInterfaceState.xcuserstate | Bin 37843 -> 37954 bytes iDNA/Cell.h | 5 +- iDNA/Cell.m | 75 +++++++++++++++--- 3 files changed, 70 insertions(+), 10 deletions(-) diff --git a/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate index c0b925b37f5f268a19dad5d8eb298275764cfbdb..d3a808dc9b4de9ff3cd341806f581371cfae7e12 100644 GIT binary patch delta 19179 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 KZ{g?g{Qn2DNA count]; i++) if([[self->DNA objectAtIndex:i] isNotEqualTo: [c->DNA objectAtIndex:i]]) - dist++; //++ hamming distance if nucleotides are not equal + dist++; //++ hamming distance if nucleotides are not equal return dist; } +//crossbreed with anoter cell -(Cell*) crossbreedWith:(Cell*) partner { - Cell *child=[[Cell alloc] init]; + Cell *child=[[Cell alloc] init]; //create a child cell NSInteger DNALength=[self->DNA count]; int rand=arc4random()%3; - switch (rand) { + switch (rand) { //choose 1 of 3 crossbreeed ways case 0: { for (int i=0; iDNA addObject:[self->DNA objectAtIndex:i]]; @@ -95,7 +100,59 @@ -(Cell*) crossbreedWith:(Cell*) partner { } - return child; + return child; +} + +//mutate cell +-(void) mutate:(int) percent { + int dnaLength = [DNA count]; + if (percent == 0) // if percent = 0, do nothing + return; + if (dnaLength != 100) // if DNA length isn't 100, recount + percent = percent * dnaLength / 100; + + // create an array of BOOL, where there are as many YES elems, as number of nucs we need to mutate + BOOL mas [dnaLength]; + int count = dnaLength; + while (count--) + mas [count] = count < percent? YES : NO; + + // shuffle BOOL array + count = dnaLength; + int tempIndex; // buffer to save index of changed elem + BOOL tempValue; // buffer to save value of changed elem + while (count--) { + tempIndex = arc4random() % dnaLength; // get random index + tempValue = mas [tempIndex]; // get value of BOOL at random index + mas [tempIndex] = mas [count]; // exchange elem at index "count" + mas [count] = tempValue; // whith elem at random index + } + + // mutation itself + count = dnaLength; + while (count--) + if (mas[count]) // if mas[count] = YES, mutate nuc + [DNA replaceObjectAtIndex:count withObject:[self getNewNucleotide:[DNA objectAtIndex:count]]]; +} + +//get new random nuc +-(const NSString*) getNewNucleotide:(NSString *)oldNuc { + int count; + for (count = 0; count < 4; count++) + if (nucleotides[count] == oldNuc) + break; // get nuc index from 0 to 3 in nucs array, save it in count + count = (count + 1 + arc4random() % 3) % 4; // change index to random index not equal to it + return nucleotides[count]; // return elem of nucs array at this index +} + +//create DNA from string +-(void) DNAFromString:(NSString*)source withMaxLen:(int) maxLen { + [self->DNA removeAllObjects]; + NSString *nuc; + for (int i=0; i<[source length]||iDNA addObject:nuc]; //add char to DNA string + } } @end From 202f9548746dfba2783dd4c0e2e7f023dc1d4ffb Mon Sep 17 00:00:00 2001 From: Mac User Date: Tue, 8 Jan 2013 16:46:40 +0200 Subject: [PATCH 6/6] FINAL_3 --- iDNA.xcodeproj/project.pbxproj | 12 ++++++------ .../UserInterfaceState.xcuserstate | Bin 37954 -> 38343 bytes iDNA/Cell.m | 10 +++++----- iDNA/Document.m | 6 ++++++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/iDNA.xcodeproj/project.pbxproj b/iDNA.xcodeproj/project.pbxproj index 2709093..fb5a3fb 100644 --- a/iDNA.xcodeproj/project.pbxproj +++ b/iDNA.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 6371230C169C67AC008678A2 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6371230B169C67AC008678A2 /* Cell.m */; }; 6373D4FD1689E47B00EE7CDA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */; }; 6373D5071689E47B00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5051689E47B00EE7CDA /* InfoPlist.strings */; }; 6373D5091689E47B00EE7CDA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5081689E47B00EE7CDA /* main.m */; }; @@ -18,7 +19,6 @@ 6373D51F1689E47C00EE7CDA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */; }; 6373D5271689E47C00EE7CDA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6373D5251689E47C00EE7CDA /* InfoPlist.strings */; }; 6373D52A1689E47C00EE7CDA /* iDNATests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5291689E47C00EE7CDA /* iDNATests.m */; }; - 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6373D5341689EC2F00EE7CDA /* Cell.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -32,6 +32,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 6371230A169C67AC008678A2 /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cell.h; sourceTree = ""; }; + 6371230B169C67AC008678A2 /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; 6373D4F81689E47B00EE7CDA /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6373D4FC1689E47B00EE7CDA /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 6373D4FF1689E47B00EE7CDA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -52,8 +54,6 @@ 6373D5261689E47C00EE7CDA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 6373D5281689E47C00EE7CDA /* iDNATests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iDNATests.h; sourceTree = ""; }; 6373D5291689E47C00EE7CDA /* iDNATests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iDNATests.m; sourceTree = ""; }; - 6373D5331689EC0600EE7CDA /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Cell.h; path = ../../DNA/DNA/Cell.h; sourceTree = ""; }; - 6373D5341689EC2F00EE7CDA /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Cell.m; path = ../../DNA/DNA/Cell.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -120,9 +120,9 @@ isa = PBXGroup; children = ( 6373D50E1689E47B00EE7CDA /* Document.h */, + 6371230A169C67AC008678A2 /* Cell.h */, + 6371230B169C67AC008678A2 /* Cell.m */, 6373D50F1689E47B00EE7CDA /* Document.m */, - 6373D5331689EC0600EE7CDA /* Cell.h */, - 6373D5341689EC2F00EE7CDA /* Cell.m */, 6373D5111689E47B00EE7CDA /* Document.xib */, 6373D5141689E47C00EE7CDA /* MainMenu.xib */, 6373D5031689E47B00EE7CDA /* Supporting Files */, @@ -271,7 +271,7 @@ files = ( 6373D5091689E47B00EE7CDA /* main.m in Sources */, 6373D5101689E47B00EE7CDA /* Document.m in Sources */, - 6373D5351689EC2F00EE7CDA /* Cell.m in Sources */, + 6371230C169C67AC008678A2 /* Cell.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA.xcodeproj/project.xcworkspace/xcuserdata/macuser.xcuserdatad/UserInterfaceState.xcuserstate index d3a808dc9b4de9ff3cd341806f581371cfae7e12..f4b23af615736c507cd8183e42b83f713a64ee17 100644 GIT binary patch literal 38343 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 literal 37954 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

ojeGPNLZ93#=Sagj=afN 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 count]; i++) if([[self->DNA objectAtIndex:i] isNotEqualTo: [c->DNA objectAtIndex:i]]) - dist++; //++ hamming distance if nucleotides are not equal + dist++; //++ hamming distance if nucleotides are not equal return dist; } @@ -97,7 +97,7 @@ -(Cell*) crossbreedWith:(Cell*) partner { } break; } - + } return child; diff --git a/iDNA/Document.m b/iDNA/Document.m index cd56770..bd8a382 100644 --- a/iDNA/Document.m +++ b/iDNA/Document.m @@ -193,6 +193,12 @@ - (IBAction)loadGoal:(id)sender { error:nil]; [goalDNA DNAFromString:string withMaxLen:[DNALenSlider maxValue]]; [goalDNAField setStringValue:[goalDNA getDNAString]]; + generation=0; + [self setGen]; + bestMatch=0; + [self setBestMatch]; + [bestDNAField setStringValue:@""]; + //if string is longer than max, alert about string cutting if([string length]>[DNALenSlider maxValue]) {