From bd3001d28578a68b853cf952b456ef2a5f0394ac Mon Sep 17 00:00:00 2001 From: Alex Ovseyenko Date: Fri, 1 Feb 2013 17:45:31 +0400 Subject: [PATCH 1/3] first commit --- iDNA/iDNA.xcodeproj/project.pbxproj | 344 ++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 17696 bytes .../xcdebugger/Breakpoints.xcbkptlist | 20 + .../alex.xcuserdatad/xcschemes/iDNA.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + iDNA/iDNA/.DS_Store | Bin 0 -> 6148 bytes iDNA/iDNA/AppDelegate.h | 44 + iDNA/iDNA/AppDelegate.m | 163 + iDNA/iDNA/Cell.h | 41 + iDNA/iDNA/Cell.m | 203 ++ iDNA/iDNA/Population.h | 25 + iDNA/iDNA/Population.m | 80 + iDNA/iDNA/PreferencesController.h | 25 + iDNA/iDNA/PreferencesController.m | 63 + iDNA/iDNA/en.lproj/Credits.rtf | 29 + iDNA/iDNA/en.lproj/InfoPlist.strings | 2 + iDNA/iDNA/en.lproj/Localizable.strings | 7 + iDNA/iDNA/en.lproj/MainMenu.xib | 3080 +++++++++++++++++ iDNA/iDNA/iDNA-Info.plist | 34 + iDNA/iDNA/iDNA-Prefix.pch | 7 + iDNA/iDNA/main.m | 14 + iDNA/iDNA/ru.lproj/Credits.rtf | 29 + iDNA/iDNA/ru.lproj/InfoPlist.strings | 2 + iDNA/iDNA/ru.lproj/Localizable.strings | 7 + iDNA/iDNA/ru.lproj/MainMenu.xib | 3075 ++++++++++++++++ 26 files changed, 7409 insertions(+) create mode 100644 iDNA/iDNA.xcodeproj/project.pbxproj create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/iDNA.xcscheme create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iDNA/iDNA/.DS_Store create mode 100755 iDNA/iDNA/AppDelegate.h create mode 100755 iDNA/iDNA/AppDelegate.m create mode 100755 iDNA/iDNA/Cell.h create mode 100755 iDNA/iDNA/Cell.m create mode 100755 iDNA/iDNA/Population.h create mode 100755 iDNA/iDNA/Population.m create mode 100644 iDNA/iDNA/PreferencesController.h create mode 100644 iDNA/iDNA/PreferencesController.m create mode 100755 iDNA/iDNA/en.lproj/Credits.rtf create mode 100755 iDNA/iDNA/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/en.lproj/Localizable.strings create mode 100755 iDNA/iDNA/en.lproj/MainMenu.xib create mode 100755 iDNA/iDNA/iDNA-Info.plist create mode 100755 iDNA/iDNA/iDNA-Prefix.pch create mode 100755 iDNA/iDNA/main.m create mode 100755 iDNA/iDNA/ru.lproj/Credits.rtf create mode 100755 iDNA/iDNA/ru.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/ru.lproj/Localizable.strings create mode 100755 iDNA/iDNA/ru.lproj/MainMenu.xib diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d778eff --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -0,0 +1,344 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + FA03ADBA16BBF68A001FD807 /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA03ADB916BBF68A001FD807 /* PreferencesController.m */; }; + FA43D70616AFDFBD00CDECCF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA43D70516AFDFBD00CDECCF /* Cocoa.framework */; }; + FA43D71016AFDFBD00CDECCF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA43D70E16AFDFBD00CDECCF /* InfoPlist.strings */; }; + FA43D71216AFDFBD00CDECCF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FA43D71116AFDFBD00CDECCF /* main.m */; }; + FA43D71616AFDFBD00CDECCF /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = FA43D71416AFDFBD00CDECCF /* Credits.rtf */; }; + FA43D71916AFDFBD00CDECCF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FA43D71816AFDFBD00CDECCF /* AppDelegate.m */; }; + FA43D71C16AFDFBD00CDECCF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA43D71A16AFDFBD00CDECCF /* MainMenu.xib */; }; + FA43D72616AFE04500CDECCF /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = FA43D72316AFE04500CDECCF /* Cell.m */; }; + FA43D72716AFE04500CDECCF /* Population.m in Sources */ = {isa = PBXBuildFile; fileRef = FA43D72516AFE04500CDECCF /* Population.m */; }; + FA43D72D16AFE45100CDECCF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA43D72F16AFE45100CDECCF /* Localizable.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + FA03ADB816BBF68A001FD807 /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; sourceTree = ""; }; + FA03ADB916BBF68A001FD807 /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = ""; }; + FA43D70116AFDFBD00CDECCF /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FA43D70516AFDFBD00CDECCF /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + FA43D70816AFDFBD00CDECCF /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + FA43D70916AFDFBD00CDECCF /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + FA43D70A16AFDFBD00CDECCF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + FA43D70D16AFDFBD00CDECCF /* iDNA-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNA-Info.plist"; sourceTree = ""; }; + FA43D70F16AFDFBD00CDECCF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + FA43D71116AFDFBD00CDECCF /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FA43D71316AFDFBD00CDECCF /* iDNA-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + FA43D71516AFDFBD00CDECCF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + FA43D71716AFDFBD00CDECCF /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + FA43D71816AFDFBD00CDECCF /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + FA43D71B16AFDFBD00CDECCF /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + FA43D72216AFE04500CDECCF /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cell.h; sourceTree = ""; }; + FA43D72316AFE04500CDECCF /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; + FA43D72416AFE04500CDECCF /* Population.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Population.h; sourceTree = ""; }; + FA43D72516AFE04500CDECCF /* Population.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Population.m; sourceTree = ""; }; + FA43D72816AFE16F00CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/MainMenu.xib; sourceTree = ""; }; + FA43D72916AFE16F00CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + FA43D72A16AFE16F00CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = ru; path = ru.lproj/Credits.rtf; sourceTree = ""; }; + FA43D72E16AFE45100CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + FA43D73016AFE45600CDECCF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FA43D6FE16AFDFBD00CDECCF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FA43D70616AFDFBD00CDECCF /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + FA43D6F616AFDFBD00CDECCF = { + isa = PBXGroup; + children = ( + FA43D70B16AFDFBD00CDECCF /* iDNA */, + FA43D70416AFDFBD00CDECCF /* Frameworks */, + FA43D70216AFDFBD00CDECCF /* Products */, + ); + sourceTree = ""; + }; + FA43D70216AFDFBD00CDECCF /* Products */ = { + isa = PBXGroup; + children = ( + FA43D70116AFDFBD00CDECCF /* iDNA.app */, + ); + name = Products; + sourceTree = ""; + }; + FA43D70416AFDFBD00CDECCF /* Frameworks */ = { + isa = PBXGroup; + children = ( + FA43D70516AFDFBD00CDECCF /* Cocoa.framework */, + FA43D70716AFDFBD00CDECCF /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + FA43D70716AFDFBD00CDECCF /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + FA43D70816AFDFBD00CDECCF /* AppKit.framework */, + FA43D70916AFDFBD00CDECCF /* CoreData.framework */, + FA43D70A16AFDFBD00CDECCF /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + FA43D70B16AFDFBD00CDECCF /* iDNA */ = { + isa = PBXGroup; + children = ( + FA03ADB816BBF68A001FD807 /* PreferencesController.h */, + FA03ADB916BBF68A001FD807 /* PreferencesController.m */, + FA43D71716AFDFBD00CDECCF /* AppDelegate.h */, + FA43D71816AFDFBD00CDECCF /* AppDelegate.m */, + FA43D72216AFE04500CDECCF /* Cell.h */, + FA43D72316AFE04500CDECCF /* Cell.m */, + FA43D72416AFE04500CDECCF /* Population.h */, + FA43D72516AFE04500CDECCF /* Population.m */, + FA43D71A16AFDFBD00CDECCF /* MainMenu.xib */, + FA43D72F16AFE45100CDECCF /* Localizable.strings */, + FA43D70C16AFDFBD00CDECCF /* Supporting Files */, + ); + path = iDNA; + sourceTree = ""; + }; + FA43D70C16AFDFBD00CDECCF /* Supporting Files */ = { + isa = PBXGroup; + children = ( + FA43D70D16AFDFBD00CDECCF /* iDNA-Info.plist */, + FA43D70E16AFDFBD00CDECCF /* InfoPlist.strings */, + FA43D71116AFDFBD00CDECCF /* main.m */, + FA43D71316AFDFBD00CDECCF /* iDNA-Prefix.pch */, + FA43D71416AFDFBD00CDECCF /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FA43D70016AFDFBD00CDECCF /* iDNA */ = { + isa = PBXNativeTarget; + buildConfigurationList = FA43D71F16AFDFBD00CDECCF /* Build configuration list for PBXNativeTarget "iDNA" */; + buildPhases = ( + FA43D6FD16AFDFBD00CDECCF /* Sources */, + FA43D6FE16AFDFBD00CDECCF /* Frameworks */, + FA43D6FF16AFDFBD00CDECCF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iDNA; + productName = iDNA; + productReference = FA43D70116AFDFBD00CDECCF /* iDNA.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FA43D6F816AFDFBD00CDECCF /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = alex; + }; + buildConfigurationList = FA43D6FB16AFDFBD00CDECCF /* Build configuration list for PBXProject "iDNA" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ru, + ); + mainGroup = FA43D6F616AFDFBD00CDECCF; + productRefGroup = FA43D70216AFDFBD00CDECCF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FA43D70016AFDFBD00CDECCF /* iDNA */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FA43D6FF16AFDFBD00CDECCF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA43D71016AFDFBD00CDECCF /* InfoPlist.strings in Resources */, + FA43D71616AFDFBD00CDECCF /* Credits.rtf in Resources */, + FA43D71C16AFDFBD00CDECCF /* MainMenu.xib in Resources */, + FA43D72D16AFE45100CDECCF /* Localizable.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FA43D6FD16AFDFBD00CDECCF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA43D71216AFDFBD00CDECCF /* main.m in Sources */, + FA43D71916AFDFBD00CDECCF /* AppDelegate.m in Sources */, + FA43D72616AFE04500CDECCF /* Cell.m in Sources */, + FA43D72716AFE04500CDECCF /* Population.m in Sources */, + FA03ADBA16BBF68A001FD807 /* PreferencesController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + FA43D70E16AFDFBD00CDECCF /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + FA43D70F16AFDFBD00CDECCF /* en */, + FA43D72916AFE16F00CDECCF /* ru */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + FA43D71416AFDFBD00CDECCF /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + FA43D71516AFDFBD00CDECCF /* en */, + FA43D72A16AFE16F00CDECCF /* ru */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + FA43D71A16AFDFBD00CDECCF /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + FA43D71B16AFDFBD00CDECCF /* en */, + FA43D72816AFE16F00CDECCF /* ru */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + FA43D72F16AFE45100CDECCF /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + FA43D72E16AFE45100CDECCF /* ru */, + FA43D73016AFE45600CDECCF /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FA43D71D16AFDFBD00CDECCF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + 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_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + FA43D71E16AFDFBD00CDECCF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + FA43D72016AFDFBD00CDECCF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + 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; + }; + FA43D72116AFDFBD00CDECCF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + 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; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FA43D6FB16AFDFBD00CDECCF /* Build configuration list for PBXProject "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FA43D71D16AFDFBD00CDECCF /* Debug */, + FA43D71E16AFDFBD00CDECCF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FA43D71F16AFDFBD00CDECCF /* Build configuration list for PBXNativeTarget "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FA43D72016AFDFBD00CDECCF /* Debug */, + FA43D72116AFDFBD00CDECCF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FA43D6F816AFDFBD00CDECCF /* Project object */; +} diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2d38afe --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..3c674160d3543b14484ce47e3ddc58ec87032848 GIT binary patch literal 17696 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

`Sq)#J&~#VeD7ZFsWRcAWf7eOH-xk(t*-)>1gR# z>3C_SbfVNPog-Z!?T{{(Qt49ZGU+;Lr*yk?r*yaUF6jf(N2Q0QPe_kQpOZc>eNpyRy$QQ1=2GTAy= zr);}yr);;u_XvhQTy%YKyoD*IjbM;wlm$EC#S z^#m$dvkL!qA9JeHHU0i3}&bWhdZ^V5R_etERai7P1AxCmX&dS5&5ps!KE?3D@ zCY{E}UPAO4FEBh$r%6O$x znWR)H`ziC32Bk?^ptLIsl>?OHl{1u1Wu0=CvQar(IbXR@xk$N0$t$l?u2$ZxT%%m4 z+@Rd3+@-urxmS6&@__PQ>P+NtL2XQ)yIMl}=?)6{zg0Le&7(Ak|3KIMsMnrK(0X zMKw(|Lp4{mP_jf5dRg_V>bUBZ>YL>L z$-|SYlIJ8hCwr3TCi{}xlIJJ4CwC+-PF|ACC$CH1ki0SZj^xhdt;su*cPH;j-k*F= z^1*QRewzaxEf zdRO|x>BrMQNI#kWVfx4EXVSk*Kb!u8no-B7rE0l4L7k*dQTJ2lsP$@-+N!px9qJPG zIQ2aBYV{%YVfD-Echv8y-&22}{#^a7`mFi~^-typQ5k(QWEqMKWkym)d4@k@OU5xMs8VVBX>+uBTBFvY&DRdn7HfxTM`%ZC zCuyf?Yqc}A4cgh-X01oNSi4$#qjrOKhxRV*KJ7i)L)r(mk7ys$KC69KdrJGc_Dk*8 z+CMTQGov$OGvhMjGaE8nGZ$wr&AdAE+RPg=S7+XwxhC`W%&nQbGM~(RA@j@3vpTsh zTW8bRbq-yB-EiFuol{q@YtYTsHS1b+KHWTByKa$giSAb2dfi6dCS8|qn{KD>PTgMJ z-MWLiL%Iia&*+}j9o40nyueq9+5pNdwury?48-Wv-f2G zniG*D$%)R1&8f?2&GF{=bLQt9%XvTNbk0{f-{zdn`7!6`TsAj6SCSi@8=D)KtH@2u zEzBLB+md^0?xx&bxp(DF$*aq2%UhIpb>6DH+w!*M-IMoF-lKVs=RK8oB=42H<9V;= zy_xrR-n)6H^1jXcMIWx0>gD4^oRA&>)+I$ z)PJo1RDW9kmHtQl&-&l==MC6E4AF)JgW8}s*bIe+frcT5V#6rISi^WjrJ>qTV{jT~ z8~g^|u)=VIVYT6A!>xu*hAzW4!w$o4!(E1Z4UZb0GrVqi-|(T~6T@eQFAU!s&KZ6& z{AT#Wh>a4X+?Zm_Hd>4YMu%~Laj*7&3GXXCHN^Co19G{u`zOxY%j zsleng4KNKh4L6N6jWLZgO)yoNrkiG&e5QG(cGDu$5)*G)Wm;{z$+X6F)bxhwEz`TE z4@@7KJ~3mn#2jUgF{{k!<_xpWoMYCTO=gR^%sj(zUp5~zzh-{N{J!}^^T*~>mL$l(j7+m>qzSuYn649b&7Smwbt5bonvjaF19YSF1N0* z-eA4Oy4JeEdb@R#b*FWo^?vJNo7$$e<=Oh%ifkin6KykXE?c8*j;+Nu*XFnJwq>?! zY}eUV+E&?C+itQQvb|#uvzzRN_G0@;d!@bFUTdFapJQKWUu3`9eyx3leWiW9eWQJo zz01DMzQcadexLn*`$LX&N1ns%$amNs106#g#g0DcSo@3_ZtZ(&?vdZDIJTiCa-qwt2pn+n&7!5qVg-`oN5JNQ|+ G;r{@u48NEF literal 0 HcmV?d00001 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..033cb31 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,20 @@ + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/iDNA.xcscheme b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/iDNA.xcscheme new file mode 100644 index 0000000..27bbff2 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/iDNA.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0c5b14c --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + iDNA.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FA43D70016AFDFBD00CDECCF + + primary + + + + + diff --git a/iDNA/iDNA/.DS_Store b/iDNA/iDNA/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + +@class Cell; +@class PreferencesController; + +@interface AppDelegate : NSObject { + PreferencesController *preferences; + + NSInteger populationSize; + NSInteger DNALength; + NSInteger mutationRate; + BOOL paused; +} + +@property Cell* DNA; // goal DNA + +@property (assign) IBOutlet NSWindow *window; +@property (weak) IBOutlet NSTextField *populationSizeTextField; +@property (weak) IBOutlet NSTextField *DNALengthTextField; +@property (weak) IBOutlet NSTextField *mutationRateTextField; +@property (weak) IBOutlet NSTextField *goalDNATextField; +@property (weak) IBOutlet NSTextField *generationLabel; +@property (weak) IBOutlet NSTextField *bestMatchLabel; +@property (weak) IBOutlet NSButton *startEvolutionButton; +@property (weak) IBOutlet NSButton *pauseButton; +@property (weak) IBOutlet NSSlider *populationSizeSlider; +@property (weak) IBOutlet NSSlider *DNALengthSlider; +@property (weak) IBOutlet NSSlider *mutationRateSlider; +@property (weak) IBOutlet NSButton *loadDNAButton; + +- (IBAction)startEvolution:(id)sender; +- (IBAction)pauseClick:(id)sender; +- (IBAction)saveAs:(id)sender; +- (IBAction)openFile:(id)sender; + +@end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m new file mode 100755 index 0000000..f66ee0d --- /dev/null +++ b/iDNA/iDNA/AppDelegate.m @@ -0,0 +1,163 @@ +// +// AppDelegate.m +// iDNA +// +// Created by alex on 17/12/2012. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import "AppDelegate.h" +#import "Cell.h" +#import "Population.h" +#import "PreferencesController.h" + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + [self setValue:[NSNumber numberWithLong:[preferences populationSize]] forKey:@"populationSize"]; + [self setValue:[NSNumber numberWithLong:[preferences DNALength]] forKey:@"DNALength"]; + [self setValue:[NSNumber numberWithLong:[preferences mutationRate]] forKey:@"mutationRate"]; +} + +-(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"MSG_EXIT", @"") defaultButton:NSLocalizedString(@"BTN_YES", @"")alternateButton:NSLocalizedString(@"BTN_NO", @"") otherButton:nil informativeTextWithFormat:@""]; + + NSInteger answer = [alert runModal]; + + if (answer == NSAlertAlternateReturn) return NSTerminateCancel; + + return NSTerminateNow; +} + +-(id)init { + if (self = [super init]) { + preferences = [[PreferencesController alloc] init]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDNAChange:) name:DNAChangeNotification object:nil]; + + _DNA = [[Cell alloc] init]; + [self addObserver:self forKeyPath:@"populationSize" options:0 context:nil]; + [self addObserver:self forKeyPath:@"DNALength" options:0 context:nil]; + [self addObserver:self forKeyPath:@"mutationRate" options:0 context:nil]; + + paused = NO; + } + + return self; +} + +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([keyPath isEqualToString:@"populationSize"]) { + [preferences setPopulationSize:[[self valueForKey:@"populationSize"] intValue]]; + } else if ([keyPath isEqualToString:@"DNALength"]) { + [_DNA populateForSize:[[self valueForKey:@"DNALength"] intValue]]; + [preferences setDNALength:[[self valueForKey:@"DNALength"] intValue]]; + } else if ([keyPath isEqualToString:@"mutationRate"]) { + [preferences setMutationRate:[[self valueForKey:@"mutationRate"] intValue]]; + } else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + +-(void)handleDNAChange:(NSNotification *)n +{ + [_goalDNATextField setStringValue:[_DNA asString]]; +} + +- (IBAction)startEvolution:(id)sender +{ + [self setStateOfUIElements:FALSE]; + + [self performSelectorInBackground:@selector(evolutionJob) withObject:nil]; + +} + +-(void)evolutionJob +{ + Population *population = [[Population alloc] initPopulationWithSize:[[self valueForKey:@"populationSize"] intValue] andSizeDNA:[[self valueForKey:@"DNALength"] intValue] andGoalDNA:_DNA]; + + int i = 1; + int evolutionResult = -1; + int bestMatch = 999; + int l = [[self valueForKey:@"DNALength"] intValue]; + paused = NO; + + while (true) { + [_generationLabel setStringValue:[NSString stringWithFormat:@"Generation: %d", i]]; + + evolutionResult = [population evolution:[[self valueForKey:@"mutationRate"] intValue]]; + if (bestMatch > evolutionResult) { + bestMatch = evolutionResult; + [_bestMatchLabel setStringValue:[NSString stringWithFormat:NSLocalizedString(@"BEST_MATCH", ""), 100-bestMatch*100/l]]; + } + + // для отладки + /* + [_goalDNATextField setStringValue:[[_DNA asString] stringByAppendingFormat:@"\r\n%@ - %d (%d)", [[population bestMatch] asString], [[population bestMatch] hammingDistance:_DNA], evolutionResult]]; + */ + + if (paused || !bestMatch) { + [self setStateOfUIElements:TRUE]; + break; + } + + i++; + } +} + +-(void)setStateOfUIElements:(BOOL)newState +{ + [_pauseButton setEnabled:!newState]; + [_startEvolutionButton setEnabled:newState]; + [_populationSizeSlider setEnabled:newState]; + [_populationSizeTextField setEnabled:newState]; + [_DNALengthSlider setEnabled:newState]; + [_DNALengthTextField setEnabled:newState]; + [_mutationRateSlider setEnabled:newState]; + [_mutationRateTextField setEnabled:newState]; + [_loadDNAButton setEnabled:newState]; +} + +- (IBAction)pauseClick:(id)sender +{ + paused = YES; +} + +- (IBAction)saveAs:(id)sender +{ + NSSavePanel *panel = [NSSavePanel savePanel]; + if ([panel runModal] == NSOKButton) { + NSError *error; + + [[[self DNA] asString] writeToURL:[panel URL] atomically:YES encoding:NSUTF8StringEncoding error:&error]; + + if (error.code) { + NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"ERROR_SAVE", @"") defaultButton:NSLocalizedString(@"BTN_CLOSE", @"") alternateButton:nil otherButton:nil informativeTextWithFormat:@""]; + [alert runModal]; + } + } +} + +- (IBAction)openFile:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + if ([panel runModal] == NSOKButton) { + NSError *error; + + NSString *string = [NSString stringWithContentsOfURL:[panel URL] encoding:NSUTF8StringEncoding error:&error]; + // ставим правильное значение длины ДНК + [self setValue:[NSNumber numberWithInt:(int)string.length] forKey:@"DNALength"]; + // пишем новое ДНК в соотв. поле + [_DNA populateWithString:string]; + + if (error.code) { + NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"ERROR_OPEN", @"") defaultButton:NSLocalizedString(@"BTN_CLOSE", @"") alternateButton:nil otherButton:nil informativeTextWithFormat:@""]; + [alert runModal]; + } + } +} + +@end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h new file mode 100755 index 0000000..ccd68dc --- /dev/null +++ b/iDNA/iDNA/Cell.h @@ -0,0 +1,41 @@ +// +// Cell.h +// DNAProject +// +// Created by alex on 31/10/2012. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import + +extern NSString *const DNAChangeNotification; + +@interface Cell : NSObject { + NSArray *DNAElements; // A, T, G и C +} + +@property NSMutableArray *DNA; +@property Cell *rootCell; +@property int hammingDistanceToRootCell; + + +-(id) init; +-(id) initWithSize: (NSInteger) size; +-(id) initWithSize: (NSInteger) size andRootCell:(Cell*)cell; +-(id) initWithString: (NSString*) string; +-(void) populateForSize: (NSInteger) size; +-(void) populateWithString: (NSString*) string; +-(int) hammingDistance: (Cell*) cell; +-(NSString*) asString; +-(NSComparisonResult)compareWithCell:(Cell*) cell; +-(id)combineWith:(Cell*) cell withWay:(int)n; + ++(id) copyCell: (Cell*) cell; + +@end + +@interface Cell (mutator) + +-(void) mutate: (NSInteger)X; + +@end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m new file mode 100755 index 0000000..315ea60 --- /dev/null +++ b/iDNA/iDNA/Cell.m @@ -0,0 +1,203 @@ +// +// Cell.m +// DNAProject +// +// Created by alex on 31/10/2012. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import "Cell.h" + +NSString *const DNAChangeNotification = @"DNAChangeNotification"; + +@implementation Cell (mutator) + +-(void) mutate: (NSInteger)X +{ + // количество ячеек, которые нужно заменить + int n = (int)floor([[self DNA] count]*X/100); + NSMutableArray *exists = [[NSMutableArray alloc] init]; + + for (int i = 0; i < n; i++) { + // следим, чтобы не воткнуть новый элемент в уже измененную ячейку + int k = arc4random()%[[self DNA] count]; + while ([exists containsObject:[NSNumber numberWithInteger:k]]) { + k = arc4random()%[[self DNA] count]; + } + // добавляем номер ячейки в список измененных + [exists addObject:[NSNumber numberWithInteger:k]]; + + // запоминаем, что у нас на этом месте стояло + NSString *prev = [[self DNA] objectAtIndex:k]; + // и заменяем на другой(!) элемент + while ([prev isEqualToString:[[self DNA] objectAtIndex:k]]) { + [[self DNA] replaceObjectAtIndex:k withObject:[DNAElements objectAtIndex:arc4random()%4]]; + } + } + + // сбрасываем закэшированное значение расстояния до goalDNA + self.hammingDistanceToRootCell = -1; +} + +@end + + +@implementation Cell + +-(id) init +{ + if (self = [super init]) { + DNAElements = [[NSArray alloc] initWithObjects:@"A", @"T", @"G", @"C", nil]; + _DNA = [[NSMutableArray alloc] init]; + _hammingDistanceToRootCell = -1; + } + return self; +} + +-(id)initWithSize:(NSInteger)size +{ + if (self = [self init]) { + [self populateForSize:size]; + } + return self; +} + +-(id)initWithSize:(NSInteger)size andRootCell:(Cell *)cell +{ + if (self = [self initWithSize:size]) { + _rootCell = cell; + } + return self; +} + +-(id)initWithString:(NSString *)string +{ + if (self = [self init]) { + [self populateWithString:string]; + } + return self; +} + +-(void)populateForSize:(NSInteger)size +{ + [_DNA removeAllObjects]; + + // заполняем массив DNA случайными элементами + for (int i = 0; i < size; i++) { + [_DNA addObject:[DNAElements objectAtIndex:arc4random()%4]]; + } + //NSLog(@"%@", _DNA); + + // говорим всем, что значение поменялось + [[NSNotificationCenter defaultCenter] postNotificationName:DNAChangeNotification object:self]; +} + +-(void)populateWithString:(NSString*)string +{ + [_DNA removeAllObjects]; + + for (int i = 0; i < string.length; i++) { + [_DNA addObject:[string substringWithRange:NSMakeRange(i, 1)]]; + } + + // говорим всем, что значение поменялось + [[NSNotificationCenter defaultCenter] postNotificationName:DNAChangeNotification object:self]; +} + + +-(int) hammingDistance:(Cell *)cell +{ + int result = 0; + + // проверяем, а не с goalDNA мы сравниваем, если да, то пытаемся возвратить закэшированное значение + if (self == _rootCell || cell == _rootCell) { + if (_hammingDistanceToRootCell > -1) { + //NSLog(@"return cached value (%d)", _hammingDistanceToRootCell); + return _hammingDistanceToRootCell; + } + } + + for (int i = 0; i < _DNA.count; i++) { + if (![[_DNA objectAtIndex:i] isEqualToString: [[cell DNA] objectAtIndex:i]]) { + result++; + } + } + + // если сравниваем с goalDNA, то кэшируем полученное значение + if (self == _rootCell || cell == _rootCell) { + //NSLog(@"store value (%d) in cache", result); + _hammingDistanceToRootCell = result; + } + + return result; +} + + +-(NSString*) asString +{ + return [[_DNA valueForKey:@"description"] componentsJoinedByString:@""]; +} + +-(NSComparisonResult)compareWithCell:(Cell*) cell +{ + int distance1 = [_rootCell hammingDistance:self]; + int distance2 = [_rootCell hammingDistance:cell]; + + if (distance1 < distance2) { + return NSOrderedAscending; + } else + if (distance1 > distance2) { + return NSOrderedDescending; + } else + return NSOrderedSame; + + // сравнение имеет смысл только с goalDNA + //return [[[NSNumber alloc] initWithInt:[_rootCell hammingDistance:self]] compare:[[NSNumber alloc] initWithInt:[_rootCell hammingDistance:cell]]]; +} + +-(id)combineWith:(Cell *)cell withWay:(int)n +{ + Cell *newCell = [Cell copyCell:self]; + + if (n == 1) { // 50% первого ДНК + 50% второго ДНК + + int size1 = (int)_DNA.count/2; // середина нашего массива + int size2 = (int)cell.DNA.count/2; // середина другого массива + // если число элементов нечетное, то чуточку подправляем... + if (size2 < _DNA.count-size1) { + size2 = (int)_DNA.count-size1; + } + + [newCell.DNA replaceObjectsInRange:NSMakeRange(size1, _DNA.count-size1) withObjectsFromArray:cell.DNA range:NSMakeRange(0, size2)]; + + } else if (n == 2) { // 1% первого ДНК + 1% второго ДНК + 1% первого ДНК + ... и т.д. (в лекции было сказано, что можно просто по одной штучке менять) + + int i = 1; + while (i < newCell.DNA.count) { + if (i >= cell.DNA.count) break; + [newCell.DNA replaceObjectAtIndex:i withObject:[cell.DNA objectAtIndex:i]]; + i += 2; + } + + } else if (n == 3) { // 20% первого ДНК + 60% второго ДНК + 20% первого ДНК + int size20 = (int)_DNA.count/5; // 20% нашего массива + int size60 = (int)cell.DNA.count*0.6f; // 60% чужого массива + + [newCell.DNA replaceObjectsInRange:NSMakeRange(size20, size60) withObjectsFromArray:cell.DNA range:NSMakeRange(0, size60)]; // - тут автоматически должно остаться 20% исходного массива в конце + } + + return newCell; +} + ++(id) copyCell:(Cell *) cell +{ + Cell *result = [[Cell alloc] initWithSize:[[cell DNA] count]]; + NSMutableArray *dest = [result DNA]; + NSMutableArray *source = [cell DNA]; + for (int i = 0; i < source.count; i++) { + [dest replaceObjectAtIndex:i withObject: [source objectAtIndex:i]]; + } + return result; +} + +@end diff --git a/iDNA/iDNA/Population.h b/iDNA/iDNA/Population.h new file mode 100755 index 0000000..ca72c5d --- /dev/null +++ b/iDNA/iDNA/Population.h @@ -0,0 +1,25 @@ +// +// Population.h +// iDNA +// +// Created by alex on 12/20/12. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import + +@class Cell; + +@interface Population : NSObject { + NSMutableArray *elements; +} + +@property Cell *goalDNA; +@property Cell *bestMatch; // для отладки + +-(id)initPopulationWithSize:(NSInteger)populationSize andSizeDNA:(NSInteger)sizeDNA andGoalDNA:(Cell*)goalDNA; +-(int)evolution: (NSInteger)mutation; + +-(NSMutableArray*)getElements; + +@end diff --git a/iDNA/iDNA/Population.m b/iDNA/iDNA/Population.m new file mode 100755 index 0000000..539442c --- /dev/null +++ b/iDNA/iDNA/Population.m @@ -0,0 +1,80 @@ +// +// Population.m +// iDNA +// +// Created by alex on 12/20/12. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import "Population.h" +#import "Cell.h" + +@implementation Population + +-(id)init +{ + if (self = [super init]) { + elements = [[NSMutableArray alloc] init]; + } + return self; +} + +-(id)initPopulationWithSize:(NSInteger)populationSize andSizeDNA:(NSInteger)sizeDNA andGoalDNA:(Cell *)goalDNA +{ + if (self = [self init]) { + _goalDNA = goalDNA; + for (int i = 0; i < populationSize; i++) { + [elements addObject:[[Cell alloc] initWithSize:sizeDNA andRootCell:_goalDNA]]; + } + } + return self; +} + +-(int)evolution:(NSInteger)mutation +{ + [elements sortUsingSelector:@selector(compareWithCell:)]; + /* + for (Cell* cell in elements) { + NSLog(@"%d", [cell hammingDistance:_goalDNA]); + } + */ + + int result = [[elements objectAtIndex:0] hammingDistance:_goalDNA]; + + _bestMatch = [elements objectAtIndex:0]; + + // ищем половину списка + int size = (int)elements.count/2; + int middle = size; // запомним реальную половину списка + + // нам проще скрестить четное кол-во элементов, пусть один остается неизменным + if (size % 2) { + size--; + } + + int i = 0; + while (i < size/2) { + Cell *cell1 = [elements objectAtIndex:i]; + Cell *cell2 = [elements objectAtIndex:size-(i+1)]; // - второй берем с обратной стороны + + // комбинируем, выбирая случайный способ (1, 2 или 3) + Cell *newCell = [cell1 combineWith:cell2 withWay:(1+arc4random()%3)]; + + // замещаем вторую половину наших элементов на свежескомбинированные элементы + [elements replaceObjectAtIndex:middle+i withObject:newCell]; + i++; + } + + for (Cell *cell in elements) { + [cell mutate:mutation]; + } + + return result; +} + +-(NSMutableArray*)getElements +{ + return elements; +} + +@end diff --git a/iDNA/iDNA/PreferencesController.h b/iDNA/iDNA/PreferencesController.h new file mode 100644 index 0000000..a3bf3e8 --- /dev/null +++ b/iDNA/iDNA/PreferencesController.h @@ -0,0 +1,25 @@ +// +// PreferencesController.h +// iDNA +// +// Created by alex on 01/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import + +extern NSString *const PrefPopulationSize; +extern NSString *const PrefDNALength; +extern NSString *const PrefMutationRate; + +@interface PreferencesController : NSObject + +-(void)setPopulationSize:(NSInteger)value; +-(void)setDNALength:(NSInteger)value; +-(void)setMutationRate:(NSInteger)value; + +-(NSInteger)populationSize; +-(NSInteger)DNALength; +-(NSInteger)mutationRate; + +@end diff --git a/iDNA/iDNA/PreferencesController.m b/iDNA/iDNA/PreferencesController.m new file mode 100644 index 0000000..56d40ea --- /dev/null +++ b/iDNA/iDNA/PreferencesController.m @@ -0,0 +1,63 @@ +// +// PreferencesController.m +// iDNA +// +// Created by alex on 01/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import "PreferencesController.h" + +extern NSString *const PrefPopulationSize = @"PrefPopulationSize"; +extern NSString *const PrefDNALength = @"PrefDNALength"; +extern NSString *const PrefMutationRate = @"PrefMutationRate"; + + +@implementation PreferencesController + +-(id)init +{ + if (self = [super init]) { + NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary]; + + // -1 означает, что нужно взять случайное значение + [defaultValues setObject:[NSNumber numberWithInt:-1] forKey:PrefPopulationSize]; + [defaultValues setObject:[NSNumber numberWithInt:-1] forKey:PrefDNALength]; + [defaultValues setObject:[NSNumber numberWithInt:-1] forKey:PrefMutationRate]; + + [[NSUserDefaults standardUserDefaults]registerDefaults:defaultValues]; + } + return self; +} + +-(void)setPopulationSize:(NSInteger)value +{ + [[NSUserDefaults standardUserDefaults] setInteger:value forKey:PrefPopulationSize]; +} +-(void)setDNALength:(NSInteger)value +{ + [[NSUserDefaults standardUserDefaults] setInteger:value forKey:PrefDNALength]; +} +-(void)setMutationRate:(NSInteger)value +{ + [[NSUserDefaults standardUserDefaults] setInteger:value forKey:PrefMutationRate]; +} + +-(NSInteger)populationSize +{ + NSInteger result = [[NSUserDefaults standardUserDefaults] integerForKey:PrefPopulationSize]; + return result < 0? 1+arc4random()%100 : result; +} +-(NSInteger)DNALength +{ + NSInteger result = [[NSUserDefaults standardUserDefaults] integerForKey:PrefDNALength]; + return result < 0? 1+arc4random()%100 : result; +} +-(NSInteger)mutationRate +{ + NSInteger result = [[NSUserDefaults standardUserDefaults] integerForKey:PrefMutationRate]; + return result < 0? 1+arc4random()%100 : result; +} + + +@end diff --git a/iDNA/iDNA/en.lproj/Credits.rtf b/iDNA/iDNA/en.lproj/Credits.rtf new file mode 100755 index 0000000..46576ef --- /dev/null +++ b/iDNA/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/iDNA/en.lproj/InfoPlist.strings b/iDNA/iDNA/en.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/en.lproj/Localizable.strings b/iDNA/iDNA/en.lproj/Localizable.strings new file mode 100644 index 0000000..9ef53d6 --- /dev/null +++ b/iDNA/iDNA/en.lproj/Localizable.strings @@ -0,0 +1,7 @@ +"BEST_MATCH" = "Best individual match - %d%%"; +"MSG_EXIT" = "Do you really want to exit?"; +"BTN_YES" = "Yes"; +"BTN_NO" = "No"; +"ERROR_SAVE" = "Error save file"; +"ERROR_OPEN" = "Error open file"; +"BTN_CLOSE" = "Close"; \ No newline at end of file diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib new file mode 100755 index 0000000..ef5d648 --- /dev/null +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -0,0 +1,3080 @@ + + + + 1080 + 12C3012 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2844 + + + IBNSLayoutConstraint + NSBox + NSButton + NSButtonCell + NSCustomObject + NSMenu + NSMenuItem + NSNumberFormatter + NSProgressIndicator + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + 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 + + + + Open… + o + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + iDNA Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {598, 428}} + 1954021376 + iDNA + NSWindow + + + + + 256 + + + + 268 + {{17, 391}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Population Size + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 366}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + DNA length + + _NS:1535 + + + + + NO + + + + 268 + {{17, 341}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Mutation rate % + + _NS:1535 + + + + + NO + + + + 268 + {{124, 388}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 268 + {{124, 363}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{124, 338}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{179, 388}, {401, 21}} + + + + _NS:9 + YES + + 67108864 + 0 + + _NS:9 + + 100 + 1 + 8.3140727796052616 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{179, 363}, {401, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 0.0 + 0.0 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{179, 338}, {401, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 0.0 + 0.0 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{236, 308}, {126, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413120 + Generation: 0 + + LucidaGrande-Bold + 13 + 2072 + + _NS:1535 + + + + + NO + + + + 268 + {{199, 283}, {200, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Best individual match - ??? + + _NS:1535 + + + + + NO + + + + 268 + {{20, 254}, {558, 20}} + + + + _NS:9 + {250, 250} + 16397 + 100 + + + + 12 + + + + 274 + + + + 268 + {{231, 147}, {100, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Goal DNA + + _NS:1535 + + + + + NO + + + + 268 + {{18, 14}, {526, 120}} + + + + _NS:9 + {250, 750} + YES + + -1805647871 + 272629760 + + + _NS:9 + + YES + + + + NO + + + {{1, 1}, {562, 172}} + + + + _NS:11 + + + {{17, 68}, {564, 174}} + + + + _NS:9 + {0, 0} + + 67108864 + 0 + Box + + LucidaGrande + 11 + 3100 + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 0 + NO + + + + 268 + {{14, 24}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Start evolution + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{146, 24}, {77, 32}} + + + + YES + _NS:9 + YES + + 603979776 + 134217728 + Pause + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{481, 24}, {103, 32}} + + + _NS:9 + YES + + 67108864 + 134217728 + Load DNA + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {598, 428} + + + + + {{0, 0}, {1280, 778}} + {10000000000000, 10000000000000} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + openDocument: + + + + 374 + + + + showHelp: + + + + 493 + + + + window + + + + 532 + + + + DNALengthTextField + + + + 815 + + + + populationSizeTextField + + + + 817 + + + + mutationRateTextField + + + + 818 + + + + goalDNATextField + + + + 841 + + + + startEvolution: + + + + 842 + + + + generationLabel + + + + 843 + + + + bestMatchLabel + + + + 844 + + + + startEvolutionButton + + + + 857 + + + + pauseButton + + + + 858 + + + + populationSizeSlider + + + + 859 + + + + DNALengthSlider + + + + 860 + + + + mutationRateSlider + + + + 861 + + + + pauseClick: + + + + 862 + + + + saveAs: + + + + 863 + + + + openFile: + + + + 864 + + + + loadDNAButton + + + + 865 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 825 + + + + value: self.DNALength + + + + + + value: self.DNALength + value + self.DNALength + 2 + + + 834 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 837 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 822 + + + + value: self.DNALength + + + + + + value: self.DNALength + value + self.DNALength + 2 + + + 833 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 840 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + 56 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + 75 + + + + + 72 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 371 + + + + + + + + 372 + + + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 12 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 20 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 31 + + 1000 + + 3 + 9 + 3 + + + + 3 + 0 + + 3 + 1 + + 103 + + 1000 + + 3 + 9 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 188 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 155 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 9 + 40 + 2 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 124 + + 1000 + + 3 + 9 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 9 + 40 + 2 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + 420 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 536 + + + + + + 7 + 0 + + 0 + 1 + + 106 + + 1000 + + 3 + 9 + 1 + + + + + + 537 + + + + + 538 + + + + + 539 + + + + + 540 + + + + + + + + 541 + + + + + 542 + + + + + 544 + + + + + + + + 545 + + + + + 548 + + + + + 549 + + + + + 550 + + + + + 551 + + + + + + 7 + 0 + + 0 + 1 + + 50 + + 1000 + + 3 + 9 + 1 + + + + + + 552 + + + + + + + + 556 + + + + + + + + 557 + + + + + + + + 559 + + + + + 561 + + + + + + + + 562 + + + + + + + + 565 + + + + + 577 + + + + + + 7 + 0 + + 0 + 1 + + 397 + + 1000 + + 3 + 9 + 1 + + + + + + 578 + + + + + 584 + + + + + + + + 586 + + + + + 589 + + + + + 590 + + + + + 592 + + + + + + + + 594 + + + + + 597 + + + + + 598 + + + + + 599 + + + + + 611 + + + + + 612 + + + + + 616 + + + + + 618 + + + + + 621 + + + + + 622 + + + + + 624 + + + + + 628 + + + + + 629 + + + + + 630 + + + + + 631 + + + + + 632 + + + + + + 7 + 0 + + 0 + 1 + + 120 + + 1000 + + 9 + 40 + 1 + + + + + + 633 + + + + + 645 + + + + + 663 + + + + + + 7 + 0 + + 0 + 1 + + 194 + + 1000 + + 3 + 9 + 1 + + + + + + 664 + + + + + 665 + + + + + 668 + + + + + 671 + + + + + 672 + + + + + + 674 + + + + + 676 + + + + + 677 + + + + + 678 + + + + + 679 + + + + + 680 + + + + + 3 + 0 + + 3 + 1 + + 7 + + 1000 + + 3 + 9 + 3 + + + + 4 + 0 + + 4 + 1 + + 11 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 16 + + 1000 + + 8 + 29 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 16 + + 1000 + + 8 + 29 + 3 + + + + + + + + 682 + + + + + 686 + + + + + 687 + + + + + + 7 + 0 + + 0 + 1 + + 94 + + 1000 + + 3 + 9 + 1 + + + + + + 688 + + + + + 693 + + + + + 694 + + + + + 696 + + + + + + 8 + 0 + + 0 + 1 + + 120 + + 1000 + + 9 + 40 + 1 + + + + + + 697 + + + + + + 699 + + + + + 702 + + + + + 703 + + + + + 704 + + + + + 705 + + + + + 783 + + + + + 784 + + + + + 785 + + + + + 801 + + + + + + + + 802 + + + + + 803 + + + + + 804 + + + + + 805 + + + + + 806 + + + + + + + + 807 + + + + + 808 + + + + + 809 + + + + + 810 + + + + + + + + 811 + + + + + 812 + + + + + 813 + + + + + 819 + + + + + 853 + + + + + 854 + + + + + 855 + + + + + 856 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 865 + + + + + AppDelegate + NSObject + + id + id + id + id + + + + openFile: + id + + + pauseClick: + id + + + saveAs: + id + + + startEvolution: + id + + + + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + NSButton + NSSlider + NSTextField + NSButton + NSSlider + NSTextField + NSButton + NSWindow + + + + DNALengthSlider + NSSlider + + + DNALengthTextField + NSTextField + + + bestMatchLabel + NSTextField + + + generationLabel + NSTextField + + + goalDNATextField + NSTextField + + + loadDNAButton + NSButton + + + mutationRateSlider + NSSlider + + + mutationRateTextField + NSTextField + + + pauseButton + NSButton + + + populationSizeSlider + NSSlider + + + populationSizeTextField + NSTextField + + + startEvolutionButton + NSButton + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/iDNA/iDNA/iDNA-Info.plist b/iDNA/iDNA/iDNA-Info.plist new file mode 100755 index 0000000..2595762 --- /dev/null +++ b/iDNA/iDNA/iDNA-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + mixtline.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2012 alex. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/iDNA/iDNA/iDNA-Prefix.pch b/iDNA/iDNA/iDNA-Prefix.pch new file mode 100755 index 0000000..24593cd --- /dev/null +++ b/iDNA/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/iDNA/main.m b/iDNA/iDNA/main.m new file mode 100755 index 0000000..6055e33 --- /dev/null +++ b/iDNA/iDNA/main.m @@ -0,0 +1,14 @@ +// +// main.m +// iDNA +// +// Created by alex on 17/12/2012. +// Copyright (c) 2012 alex. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/iDNA/iDNA/ru.lproj/Credits.rtf b/iDNA/iDNA/ru.lproj/Credits.rtf new file mode 100755 index 0000000..46576ef --- /dev/null +++ b/iDNA/iDNA/ru.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/iDNA/ru.lproj/InfoPlist.strings b/iDNA/iDNA/ru.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/ru.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/ru.lproj/Localizable.strings b/iDNA/iDNA/ru.lproj/Localizable.strings new file mode 100644 index 0000000..a3859a3 --- /dev/null +++ b/iDNA/iDNA/ru.lproj/Localizable.strings @@ -0,0 +1,7 @@ +"BEST_MATCH" = "Лучшее совпадение - %d%%"; +"MSG_EXIT" = "Вы действительно хотите выйти из приложения?"; +"BTN_YES" = "Да"; +"BTN_NO" = "Нет"; +"ERROR_SAVE" = "Ошибка записи файла"; +"ERROR_OPEN" = "Ошибка открытия файла"; +"BTN_CLOSE" = "Закрыть"; \ No newline at end of file diff --git a/iDNA/iDNA/ru.lproj/MainMenu.xib b/iDNA/iDNA/ru.lproj/MainMenu.xib new file mode 100755 index 0000000..441baf1 --- /dev/null +++ b/iDNA/iDNA/ru.lproj/MainMenu.xib @@ -0,0 +1,3075 @@ + + + + 1080 + 12C3012 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2844 + + + IBNSLayoutConstraint + NSBox + NSButton + NSButtonCell + NSCustomObject + NSMenu + NSMenuItem + NSNumberFormatter + NSProgressIndicator + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + 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 + + + + + Файл + + 1048576 + 2147483647 + + + submenuAction: + + Файл + + + + Открыть… + o + 1048576 + 2147483647 + + + + + + Сохранить… + s + 1048576 + 2147483647 + + + + + + + + + Помощь + + 2147483647 + + + submenuAction: + + Помощь + + + + iDNA Помощь + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {598, 428}} + 1954021376 + iDNA + NSWindow + + + + + 256 + + + + 268 + {{17, 391}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Популяция + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 366}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Размер ДНК + + _NS:1535 + + + + + NO + + + + 268 + {{17, 341}, {112, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + % мутаций + + _NS:1535 + + + + + NO + + + + 268 + {{124, 388}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 268 + {{124, 363}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{124, 338}, {50, 22}} + + + + _NS:9 + YES + + -1804599231 + -1874852864 + + + + + + + + + + -∞ + + +∞ + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + _NS:9 + + YES + + + + NO + + + + 268 + {{179, 388}, {401, 21}} + + + + _NS:9 + YES + + 67108864 + 0 + + _NS:9 + + 100 + 1 + 8.3140727796052616 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{179, 363}, {401, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 0.0 + 0.0 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{179, 338}, {401, 21}} + + + + _NS:9 + YES + + -2080374784 + 0 + + _NS:9 + + 100 + 0.0 + 0.0 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{196, 308}, {206, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413120 + Количество циклов: 0 + + LucidaGrande-Bold + 13 + 2072 + + _NS:1535 + + + + + NO + + + + 268 + {{199, 283}, {200, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Лучшее совпадение - ??? + + _NS:1535 + + + + + NO + + + + 268 + {{20, 254}, {558, 20}} + + + + _NS:9 + {250, 250} + 16397 + 100 + + + + 12 + + + + 274 + + + + 268 + {{231, 147}, {100, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Целевой ДНК + + _NS:1535 + + + + + NO + + + + 268 + {{18, 14}, {526, 120}} + + + + _NS:9 + {250, 750} + YES + + -1805647871 + 272629760 + + + _NS:9 + + YES + + + + NO + + + {{1, 1}, {562, 172}} + + + + _NS:11 + + + {{17, 68}, {564, 174}} + + + + _NS:9 + {0, 0} + + 67108864 + 0 + Box + + LucidaGrande + 11 + 3100 + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 0 + NO + + + + 268 + {{14, 24}, {146, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Начать эволюцию + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{165, 24}, {77, 32}} + + + + YES + _NS:9 + YES + + 603979776 + 134217728 + Пауза + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{449, 24}, {135, 32}} + + + + _NS:9 + YES + + 603979776 + 134217728 + Загрузить ДНК + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {598, 428} + + + + + {{0, 0}, {1280, 778}} + {10000000000000, 10000000000000} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + saveDocument: + + + + 362 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + openDocument: + + + + 374 + + + + showHelp: + + + + 493 + + + + window + + + + 532 + + + + DNALengthTextField + + + + 815 + + + + populationSizeTextField + + + + 817 + + + + mutationRateTextField + + + + 818 + + + + goalDNATextField + + + + 841 + + + + startEvolution: + + + + 842 + + + + generationLabel + + + + 843 + + + + bestMatchLabel + + + + 844 + + + + startEvolutionButton + + + + 857 + + + + pauseButton + + + + 858 + + + + populationSizeSlider + + + + 859 + + + + DNALengthSlider + + + + 860 + + + + mutationRateSlider + + + + 861 + + + + pauseClick: + + + + 862 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 825 + + + + value: self.DNALength + + + + + + value: self.DNALength + value + self.DNALength + 2 + + + 834 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 837 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 822 + + + + value: self.DNALength + + + + + + value: self.DNALength + value + self.DNALength + 2 + + + 833 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 840 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + 56 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + 75 + + + + + 72 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 371 + + + + + + + + 372 + + + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 171 + + 1000 + + 3 + 9 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 20 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 31 + + 1000 + + 3 + 9 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 103 + + 1000 + + 3 + 9 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 188 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 155 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 9 + 40 + 2 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 124 + + 1000 + + 3 + 9 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 9 + 40 + 2 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + 420 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 536 + + + + + + 7 + 0 + + 0 + 1 + + 106 + + 1000 + + 3 + 9 + 1 + + + + + + 537 + + + + + 538 + + + + + 539 + + + + + 540 + + + + + + + + 541 + + + + + 542 + + + + + 544 + + + + + + + + 545 + + + + + 548 + + + + + 549 + + + + + 550 + + + + + 551 + + + + + + 7 + 0 + + 0 + 1 + + 50 + + 1000 + + 3 + 9 + 1 + + + + + + 552 + + + + + + + + 556 + + + + + + + + 557 + + + + + + + + 561 + + + + + + + + 562 + + + + + + + + 565 + + + + + 577 + + + + + + 7 + 0 + + 0 + 1 + + 397 + + 1000 + + 3 + 9 + 1 + + + + + + 578 + + + + + 584 + + + + + + + + 586 + + + + + 589 + + + + + 592 + + + + + + + + 594 + + + + + 597 + + + + + 598 + + + + + 611 + + + + + 616 + + + + + 618 + + + + + 621 + + + + + 622 + + + + + 624 + + + + + 628 + + + + + 629 + + + + + 630 + + + + + 631 + + + + + 632 + + + + + + 7 + 0 + + 0 + 1 + + 200 + + 1000 + + 3 + 9 + 1 + + + + + + 633 + + + + + 663 + + + + + + 7 + 0 + + 0 + 1 + + 194 + + 1000 + + 3 + 9 + 1 + + + + + + 664 + + + + + 665 + + + + + 668 + + + + + 672 + + + + + + 674 + + + + + 676 + + + + + 677 + + + + + 678 + + + + + 679 + + + + + 680 + + + + + 3 + 0 + + 3 + 1 + + 7 + + 1000 + + 3 + 9 + 3 + + + + 4 + 0 + + 4 + 1 + + 11 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 16 + + 1000 + + 8 + 29 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 16 + + 1000 + + 8 + 29 + 3 + + + + + + + + 682 + + + + + 686 + + + + + 687 + + + + + + 7 + 0 + + 0 + 1 + + 94 + + 1000 + + 3 + 9 + 1 + + + + + + 688 + + + + + 693 + + + + + 694 + + + + + 696 + + + + + + 8 + 0 + + 0 + 1 + + 120 + + 1000 + + 9 + 40 + 1 + + + + + + 697 + + + + + + 699 + + + + + 702 + + + + + 703 + + + + + 704 + + + + + 705 + + + + + 783 + + + + + 784 + + + + + 785 + + + + + 801 + + + + + + 7 + 0 + + 0 + 1 + + 134 + + 1000 + + 3 + 9 + 1 + + + + + + 802 + + + + + 803 + + + + + 804 + + + + + 805 + + + + + 806 + + + + + + + + 807 + + + + + 809 + + + + + 810 + + + + + + + + 811 + + + + + 812 + + + + + 813 + + + + + 819 + + + + + 853 + + + + + 854 + + + + + 855 + + + + + 856 + + + + + 863 + + + + + 864 + + + + + 865 + + + + + 867 + + + + + 868 + + + + + 869 + + + + + 872 + + + + + 873 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 873 + + + + + AppDelegate + NSObject + + id + id + + + + pauseClick: + id + + + startEvolution: + id + + + + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + NSSlider + NSTextField + NSButton + NSSlider + NSTextField + NSButton + NSWindow + + + + DNALengthSlider + NSSlider + + + DNALengthTextField + NSTextField + + + bestMatchLabel + NSTextField + + + generationLabel + NSTextField + + + goalDNATextField + NSTextField + + + mutationRateSlider + NSSlider + + + mutationRateTextField + NSTextField + + + pauseButton + NSButton + + + populationSizeSlider + NSSlider + + + populationSizeTextField + NSTextField + + + startEvolutionButton + NSButton + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + From 10c3151579f361517dc2c000e82048d413a91cfb Mon Sep 17 00:00:00 2001 From: Alex Ovseyenko Date: Tue, 5 Feb 2013 19:13:38 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A7=D0=B5=D1=80=D0=B5=D0=B7=20=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D0=B8=D0=B8...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 48 +- .../UserInterfaceState.xcuserstate | Bin 17696 -> 24152 bytes .../xcdebugger/Breakpoints.xcbkptlist | 6 +- iDNA/iDNA/AppDelegate.h | 3 + iDNA/iDNA/AppDelegate.m | 22 + iDNA/iDNA/MouseView.h | 15 + iDNA/iDNA/MouseView.m | 57 ++ iDNA/iDNA/RandomWindowController.h | 19 + iDNA/iDNA/RandomWindowController.m | 48 ++ iDNA/iDNA/en.lproj/RandomWindowController.xib | 797 ++++++++++++++++++ 10 files changed, 1008 insertions(+), 7 deletions(-) create mode 100644 iDNA/iDNA/MouseView.h create mode 100644 iDNA/iDNA/MouseView.m create mode 100644 iDNA/iDNA/RandomWindowController.h create mode 100644 iDNA/iDNA/RandomWindowController.m create mode 100644 iDNA/iDNA/en.lproj/RandomWindowController.xib diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index d778eff..ef67ce9 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -8,6 +8,9 @@ /* Begin PBXBuildFile section */ FA03ADBA16BBF68A001FD807 /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA03ADB916BBF68A001FD807 /* PreferencesController.m */; }; + FA40EB4C16C12A5A00DE3FB2 /* RandomWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA40EB4A16C12A5A00DE3FB2 /* RandomWindowController.m */; }; + FA40EB4E16C12A9E00DE3FB2 /* RandomWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA40EB5016C12A9E00DE3FB2 /* RandomWindowController.xib */; }; + FA40EB5816C13F7000DE3FB2 /* MouseView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA40EB5716C13F7000DE3FB2 /* MouseView.m */; }; FA43D70616AFDFBD00CDECCF /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA43D70516AFDFBD00CDECCF /* Cocoa.framework */; }; FA43D71016AFDFBD00CDECCF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA43D70E16AFDFBD00CDECCF /* InfoPlist.strings */; }; FA43D71216AFDFBD00CDECCF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FA43D71116AFDFBD00CDECCF /* main.m */; }; @@ -22,6 +25,11 @@ /* Begin PBXFileReference section */ FA03ADB816BBF68A001FD807 /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; sourceTree = ""; }; FA03ADB916BBF68A001FD807 /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = ""; }; + FA40EB4916C12A5A00DE3FB2 /* RandomWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandomWindowController.h; sourceTree = ""; }; + FA40EB4A16C12A5A00DE3FB2 /* RandomWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RandomWindowController.m; sourceTree = ""; }; + FA40EB5116C12AA000DE3FB2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/RandomWindowController.xib; sourceTree = ""; }; + FA40EB5616C13F7000DE3FB2 /* MouseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseView.h; sourceTree = ""; }; + FA40EB5716C13F7000DE3FB2 /* MouseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MouseView.m; sourceTree = ""; }; FA43D70116AFDFBD00CDECCF /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; FA43D70516AFDFBD00CDECCF /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; FA43D70816AFDFBD00CDECCF /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -58,6 +66,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + FA40EB5416C13E7C00DE3FB2 /* RandomPanel */ = { + isa = PBXGroup; + children = ( + FA40EB4916C12A5A00DE3FB2 /* RandomWindowController.h */, + FA40EB4A16C12A5A00DE3FB2 /* RandomWindowController.m */, + FA40EB5016C12A9E00DE3FB2 /* RandomWindowController.xib */, + FA40EB5616C13F7000DE3FB2 /* MouseView.h */, + FA40EB5716C13F7000DE3FB2 /* MouseView.m */, + ); + name = RandomPanel; + sourceTree = ""; + }; + FA40EB5516C13E9D00DE3FB2 /* DNA */ = { + isa = PBXGroup; + children = ( + FA43D72216AFE04500CDECCF /* Cell.h */, + FA43D72316AFE04500CDECCF /* Cell.m */, + FA43D72416AFE04500CDECCF /* Population.h */, + FA43D72516AFE04500CDECCF /* Population.m */, + ); + name = DNA; + sourceTree = ""; + }; FA43D6F616AFDFBD00CDECCF = { isa = PBXGroup; children = ( @@ -97,14 +128,12 @@ FA43D70B16AFDFBD00CDECCF /* iDNA */ = { isa = PBXGroup; children = ( + FA40EB5516C13E9D00DE3FB2 /* DNA */, + FA40EB5416C13E7C00DE3FB2 /* RandomPanel */, FA03ADB816BBF68A001FD807 /* PreferencesController.h */, FA03ADB916BBF68A001FD807 /* PreferencesController.m */, FA43D71716AFDFBD00CDECCF /* AppDelegate.h */, FA43D71816AFDFBD00CDECCF /* AppDelegate.m */, - FA43D72216AFE04500CDECCF /* Cell.h */, - FA43D72316AFE04500CDECCF /* Cell.m */, - FA43D72416AFE04500CDECCF /* Population.h */, - FA43D72516AFE04500CDECCF /* Population.m */, FA43D71A16AFDFBD00CDECCF /* MainMenu.xib */, FA43D72F16AFE45100CDECCF /* Localizable.strings */, FA43D70C16AFDFBD00CDECCF /* Supporting Files */, @@ -180,6 +209,7 @@ FA43D71616AFDFBD00CDECCF /* Credits.rtf in Resources */, FA43D71C16AFDFBD00CDECCF /* MainMenu.xib in Resources */, FA43D72D16AFE45100CDECCF /* Localizable.strings in Resources */, + FA40EB4E16C12A9E00DE3FB2 /* RandomWindowController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -195,12 +225,22 @@ FA43D72616AFE04500CDECCF /* Cell.m in Sources */, FA43D72716AFE04500CDECCF /* Population.m in Sources */, FA03ADBA16BBF68A001FD807 /* PreferencesController.m in Sources */, + FA40EB4C16C12A5A00DE3FB2 /* RandomWindowController.m in Sources */, + FA40EB5816C13F7000DE3FB2 /* MouseView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ + FA40EB5016C12A9E00DE3FB2 /* RandomWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + FA40EB5116C12AA000DE3FB2 /* en */, + ); + name = RandomWindowController.xib; + sourceTree = ""; + }; FA43D70E16AFDFBD00CDECCF /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate index 3c674160d3543b14484ce47e3ddc58ec87032848..c377ab722d6754cbc812c9c880c3384045f57145 100644 GIT binary patch literal 24152 zcmd6P2Y6IP*YM1(n?kbL)J?L<~FXutp#aFTwKoMEw3?X8ab=B8n>&EqE7Yug;dV{2M#C)ShZ%GkE%78!td zui55DjQ~850Dlkw0zo230?8l+sDK)1fEMV09+*Hj7z`>vB^Uy#z)&y@3R5q)__j14r~NZfvwn_ zDyT|o2vtQ5rAAX@s5;6{ji(x@Myi#%gX*B}q~=odsJp5AsE4SPR2Q|0+Cpumc2GO1 z-PB%cKlL*88g-aDMtwwmOnpL~rM{#tQ$J8YQa@2wXr7kP9<(RzMSIhIXdl{_4y1$V za9Tmf(ebpJ*3hYR7Hy^r=`wl{J(36!Fh^eh_D zbLjc>ee?o)5&bZ|oL)_Dq&Lx<=^gY=dKbNy-bcSczet~?KcqjRKc+vSPtl*!pV6o3 zGxX>57xee^CHgY`1N|dIGdv?xmzHBm^#%8hEtc~r@ma-$*k?bgT96O$!#7<@JU_013?0oiqb~(F(eT-er zu4Ol}Pq91Lo$LYjCH5fuGW!a9h<%lPn?1^Y$bQ6r%znb2V!ve1vFF)u*~{z??2qj4 z>^1fe_B#6~$8ZuZh0}66E|oKJnOqi^%jI!4E}tvnin#&YK(2zTxzXGhZX8$3 zP2eVS4O}BPg=^)ea?`jD?oRGL?tbn8ZUMKPTfsfXt>jj5k8`WJHQbZjQ`}Z=8@HF+ z$GyP4$nED2a4&HOxp%mCxg*?B?iBYa_ZfGZyTD!KzT>{n9$ZzGJ`A4@n=1k3=T%mxM{eB??J|BvR5>k|0Tx zBuSDb>5}Xru}$p_4ab28@C07K8~6g*&;b?d$@UqJ5#+O5<5k7hHq+@3!s-*!%w)~;Z zt&<%sHMMqIb8UO0y{XNGIS538giRnAgaA1R1z{i@C_n^a5r=prK_18xc_HsjKnbEi zG>9Psk%M>;gZdyJBt-+spm-EUJ`H08EcH!w&C?26YZ~p<(kRj}u(i(KYOm|TURg8F z+T7IE+T74UbbGZlr}xm@9#&hlscD8(1DTt}SfDZ*jj5^(Q-M)cptD-_=@xx{hCZ!Y zD(}Hs)KowS>ZonC+ndUo>&O67dIJ}Sb_4m4rur%E_M$pMiu&>O_SR}?B_r81ad+|-(w&Rq=O8QIYM0YCPKww;#a$a@P@gywPr>a>5w&SK*d0(MRYAmi%26m;z;JX7 zeTbnq3d1lMjY5WzWIkjjr8VR14b@U9`BgEodD?)Qsr3_T+L~KOlZO1ddh*TOYOkr5 zs)Xsgc+71fhqTo<)VIwLx>XQU-&R#`pC$tA0VaZQTP`;cHoK#KLeotk2tyL#*V`Qe z1CrMY>Kp9kHEk2Cr9ozggSZwoO>N>x9i=rhn%mn(n_F6J_69qdhh5$1;iBOfFj1gk zH5dzOz&KC~>VO@L2NRG2MW9HeL{TUj#h_Rew;9xfNrZOspd2)TX3zqrpm<~?R171O zn}BwpSI{A3sFwQK?Bm)eOt821ns`tT;haobL55dX(^^L;B232hf-qNs#6p`m_z~iV z$k~EK_xfFEZ>n!6(&SH?ZT9gs?G0^CKq6h0-A(0!H|1y}3_sZ3(rR~*FEwq%y>g6b zaMGocNREpbGr=s7&ZK$Z*Nqu?<&d@I2!q(wSGOZqygA})kLk(j(u2YP|+0&B+% zs3>c1t08jil(DtIDPYH3ocY{4ZwiY}Ko&(RL43vqo)`Go+|6V}Zgy-zS zJQLl}5yon>R}gV+n&AA}GjJj))zU!szC;>o+w6o1-P;T8&5ic9)*0eLzbt5~S5QCX z>l)N+;9Zcg5xfrG0B?e~z}w(3cn9U6T$G2*$bziMwh(Whpot1m2yJG&CG5)}t|BCz2Ar?HW{?AlG9 zg}I*PPbb_jL=-m|aHQ+mkin%y!MC)JYpAd7w!Xv?sA^S?=JwXw9>F*R&I8$c@HzMb zoCRNkbEpvYM@6U@m8=I}fv<^y{1#k5rDy;#iREYzQV+KhTU5~8P)Dd9Qr=qMNI2Jp zv$DR??r5uNY#H6ZzRqrLXee?x+J)tb{Y%GgD`TBl(^^9os&#Np(*$C3;{MXDqI(_P z`yC_x#ZTZ0_<1<-D;#aDgda<4P%;6md zgOU8u&U_C72!R)*APpJFLJsnvoTy*dqLen*I@RKs8%!da6VjuRNaT%X!69g>vriv5 z-u3Q{XJ|C4L}O6}8dWXT3?sy{tBD$NV@?sAy2omg@weBuwYS=x;s(7y>RRXx`#>Kw z1PwzYh=TzA$Woqw{v&$fsX{~D4VsfyFbD=$OT!7u8)78V$2sEin)=o*7y`2XO&=#l z7z+K-a5S{C-ZsE2wnUJYk=-p)a2&=Edd9*y7!Ui7tm}3#i9ii+b1^s?gQ^jzmJS|I z1U^%vX&^*ynAq%S(+qJCv!tnMuusYyOqM5bC5w=fnD{30woLMc6?_rXX`Zl$w3SDziS2%T$@YZo?B(zS2 zePJ4m69R^DH4gho^4V%{AZ$C;jsU7dW5lUt!mJ?!D#$`~!EDg|Rb;LlqRU|}8jpNQ zc;IwTo!)7hNf5w{)R{B8RXnu90+7%JZ7?5AMD<;;5cWrt&}3v7?eqo8n;rFnIsT`{ zE;^T3UKi{EaF76dAS_1>sIdzUh83s@%|nLa<_4nVnur1GZ3E#jIO?x95RL}ruo^WJ z8#o84#kq|G^E+WJYUy!C;CR^d@9Y$8hAnUkY=sW+9&ATbP%D~>5W>Vx%@%CAZ?|Qr zRZXt#dku z3BiCNRX=lBhe7u@jdTyZmuRHE#4EoGO(O~fpi$zi7J}3+_#j+_rlXD?3k)BIONi3| zA3-xZ;Zk&mFj85Q(?{>Nj@3dGK`alk7TaLW=_Jet>Z}$X=$%-AVd&2RrEcrWUVGNx6V+DCWvr^xxJ03%eMMjmv&eyXa_V) z)B~e$iypYuq)6?&|IWMvBs8(BF`n zUGUkzaq4q~Q}>{|38!vzaq0_#6uyY&-&oI=;2ZyzQ{RMd!MEXI_zrv*9zpk@dr=p9 z60Jv1p{-7@v$nZWUDMLiKrD`n2HoprP+Oa8n`_j=iY%^mKLI}^{0rZM@52w^Npv5& zA3cB;tb-rHkKsvp3N1v7&;qnX@Gs>q_oB?+IL_XB!v+zDC9=rUf5y1h`nnz?CiwI> zqHW@|^>7AJ?^6kLk%&8}$YQN&np#7m=-!=0VxJX=^Cfx^`3^Q@xQ6>RydbEIZ{W9R zF?y&AUWDJFhtVU#yn~A@1KZmg>YMED(1iSlg=o^r?#(WUKf<3t!kRV6;A;2SilsR87+Q%|p*5(Jh|Y-S=Eefzs5Q5a zw2~;x-df&F*pZlmZpzszn@ejPZ6!_3)0#vAxb$dQO$(Wcp#AN2mCY@s_Nn#;*Gq)V zv0~U?^e+L#F)(=|*(u41%X* zNENdZR0tuy(4&Vlsc=dmlBJjbL@B8#!GEG+(GzH`)7{zZTs$hCI4@LRDuGHw>(BU zy-D35I3Ai?k8)&ryJMo#(%#l4SU#{`Abb;Aov!3x&AIb=FH26PJGIOfk#<&r z_BOQrX12MvmZADnWguZ4RYVn2B~&TeiFTo<(KG9)0n|XMoEn67qvy~bw3pb^s+!h% zA(C<#HrANDX$PFr;X*uM2YBoBE zUPkJX-J=y#2Gh2?y)~b@N0f#W)cw>0)B@l|ErflkMbu(qfLoiJ+eG>bDU|_aotZY;GU!@CxYtqZsSW52^d@?%S7bs0`=K|H-)%&G-|m)Qmp|Z)7R0!~ZHCmdWR5Ff z6mfB*(7R+{M-WLMkR&;^PY{engd}3BlsZ7YR4wgGn71c{a?2XJFF_Y|P;lJ;X?Lds zO}#=Ls+Pw50}Nf%s{-_Y($&RyuTyXKaQs{7I5LQnd`IB!cc~-j1p43xcOR$TcjM9z zsFUbD^gdFT6NVPmy$kLs>hxc_eonfcBpzs9v(k-;&r#nB`r|zH74Q9n*iJ>X-pP^ZFj=0r1v|ZkxYhPLr*aZxUEK5_NQhkB8nTd(bm>g-Eg|*YLzn#CP%ZZH&8_wx^kVm3 z5t}}h_@1fhWILgoT(p#y0a+*Qhra5h{n6L13}{tN14%8J9RdVb*I-&sSdb1u-*nQU z=v$I<6k=@G(+E0>_*!%%3`G~vaPozYAzv;cL%FL*Uph(Xkw8bH@6ZLIMor`|B@xVgc$OCW! zRdqTsx_mdfKV95|qXhkQ1IGY*pqo=i52mX?!dkk5uB3;cpV2Sq>RNgzVWM*MD`6X_ zkrQ@w$m-Wlwl+5k`Ens~=%gZHT;UN(%@1s9nBjD?Ng9vvj#IA-j$VMxQdl{WulcV@rB-nN#s-0jSR zkRMKMOW)(_PwWeQKbXG;>BR>Ndp}q#{&20$BlJ?jeokM7UWQ?xZq-e%0Q1+7KyyP}EzSE|Zch1smzi_XYd`%K zNZ3LjpkJa7(l67m(1++(>DTDj={M*%F_dE%iXqu{498G`VFZSe7%DN0!Y~@cm@Ocl zJ`Bp~cj+VaQTiBtoIWAwdSRb37LCG`5>s)QO2AYhrut)Qs8jVD2$NWd_)TsR0xySi zSC?cch*l5n-V77HE$3c?qoBE!oO7|J~9M_ z+xVP2=@s>NkPU?HA%=*OA`aj6cK7H>TC{*9UmZnFW%W(jK{DqhNSTu`dj(}eG$V%43}W|G^WA?_3=N5cB-XmqOo`WHFPsl zMSF`th`+{1Zhii7YLqy4ZvKQjjnt*h6I}FiP5meOcaX4wzC!;@|3Y7-f2DuJFbTsH z4AmHFG1Oyd+(2KW|Ddnae=>j}`qqSDIffH4bYM6W!+VKQx{)nnI3bS1LMnR1_}h`_ zZf)<5LxrutGJ8|I5FhtO=p`al-7bVZf$yylN=1YuWnO(-W_arWyZ1B$MXb7N>FtT{ zd+7Sl(1(iX3FqG)^gUGmXXqnE^r_X-%G*eDr*r1yC$R>JiDvo|MZm-`u}mC8R6rVr z=@@2Un7NKgU=o>lCKW*Xcn)XcOAEY-qHVOklYF$ZBd z7{dw-E7vjY%v5F?GabVr7!Jj7IEGHI`@hUmvjmnx7*;taWOU7BE;Cya42O}y zbusra_hL8#!;$|FEVYn%(49UHF%P>pEM-;-EVYbzlv&QKU>?J8G=^g^tj2IGhBfP% zRm|heYGw`7iQza5YcV9|hOEkj|2-@2}cBI?r&H*(I*7Us#`47H7HW)XJU;p8Q< z3E7*8o?&*o)8u*P#alAbe&zt&&?hPL@pZ)7KI?bG6K4-pQ&SKbvVKas;7*4^k6&ZR`^MpvL zggzuSukA_9GhZ{`^d{29zfIsW^Mm_Pt}wsdk~F_F*9d8@W7vjayOT82yGg@Bkh-QP zv(GXt?@kt0!g^ph6~k#gWMRG8K5nR4DeLFn5Wt51OR}(GY&ff6erJh$KLf)%Fzj%S z?aqHg7B-fRbH|jxCb~DIusTA9zinc%de#6>vZ)x}g&{%y~=9ADc%g(X+e6npq2m7?W*WSB8PjXWfkeTf`Q-52lQ*AauCtb`e|24q>aEzmW0!bFkFlw8Pmg<>}%f;nK2!Dy}nyyZfF*EB}+E0 zg*l5vS@SodtYg=^k7E=21R*E88N;QW>=q0kC6l<}!?W8(Z);h#bl~mqw$#&w;veT` zl8eoDvCk7iuurqku)Eo3+2=4^j^PRniMC&f;i~oQ9(FIgk9~oC5yQtZT#ex-49ReJ z38qKo795E&PI;@HgsJV0?x;#^v5+^J+2htx~oq^k>b zWlie@dv_geH{_djcjbIsk(R3phYTe7CeW+h+Js6NaqPrtyTub14PRs5aOGgwH!@oH|k_BOpvnMd@!fthU+j~{|{mLy4}2lt9#%a%W-Z( z&UtXe8f}wGIZw`u^XB?+KAbNn<@`7q=g$Rjfm{$5%!P1r44=X9Sqz`Ya4&{0V7MQ{ zmoR)8!$TOphT$6+zJ=jo3<*aa#qhWQGK>r76kG%s$tk%gE}DzsV!1djp6kmcaEV+J zhVNncA%4n3#oiKzvdZ>YaR*hc9tH+A&Jn<3)eQ!V|^76J9fnIq!dS1sNDx4Dw6 z87cX7CiEQLm71h_M$?_kcW7)v4F=iRZq<~N3OlkJ)9BEY)zl8G7^ZINZs^sg!dBvX ztkbH~)sDK!nu-~u>b_A^T0gFp6#r_RNxf;pSqV)+b33X27YgXqxgNa#7S_pGeqtX}*NQ?ju)&i*3K1J%;;(?ZVR#g&Dx9?(Y;+Q9d%pK5!YrsIh@v1Yj+63E}ltqU#!U@%6F=z1=Cg21xHR* zSMMNx6{&!0m_h28N%em1mxNH-|XU;N}N0xOpIk zo6p^YNVe*IVb_zmdM8ONA)XC*rS%p^16o`0D|Xe|EBi%xCYJJH8uV<*X^z8};OvgDx$d zlyLV1k6b6Wfz0J^1C7U8-IO%_s9;N(IAvxlKRVG9VR{b zegone?wmmJn=<2h?kfV7kem4HzX(vTI-%}8Ganv)NMs6K8Ud-x(Dw#;iMw*sLH^AB zLckG6^*0QE7rg6-@IJi%t)|Qe@PPzqFs3L>(E?CLobuNrHrM)( z>d>X@$$IDv1=+iH8S;ka3B-V>W>|Dq3prM9v>GfbqseSlna$=@ReoApfl-@k zHrn!CwemdTXA3wmrXo9;-%0XPP;Wi^6@QIu9j@h^&)-LaYW^PnUQ9({D!PlmpML;T zF_@H1697Ur4T&-8YwfON2|0$@)8;JRY$H``85IvYa@eym=_L+@Q+|BzLQ^yslMdoj^fH}g;MTlgn2rNWdEQ|XxM*OS`e zxAD7#L2u`G@H;W3#*_wA+O_=C{4@M+OzAMC$CN=Bb^PD(xDApVrX&@yZ8J!!>R)%X z5TCEYPHJw2gYe|s?Z56V;&2v@#fUj100t?CIFDqwSY$u{^3A633V(=y6;niom@t(_ zs3J>H} zHK3w^`0b=8sSs;!J)ww*^i)Pg$B=fRWQJfJU(ir9!9jitXM|(&;zi>5^^ub679>RS zO51De>uL&Hg(6Osg`Ckn7T-4^@n+XAbmQtuNV;+NLW;^$tWmc*Fn|(1SE`2Sf=N3`T-+k-+4|Ok?AZtuzb6w30Wlft> zmyxN>kbWbo%j@Kb8t6lW%C&bRp(HFZKN4EPV5$gHC0!Cu!egooQ-j@Xq{Lgak;VVT zbdtnR#7U0c{}+;wVx5a5KoU$+_mV(K5T*uTYG9WnL?Xum?~vpAL#EZ&wN0#=Xs@3z zv5n;M4>;F{d=WKoH)Beak{AI-lq4Ec6_~2*lEg|#8R8I3Rs9PXA~5GdNm9W4CnPG8 zjt(NJ=@8gX($jMKSC05&WOI<@o=M7?WTTIw+0K;oac42w%Vbq=>{LmzMB)wqPo$C> zZ=z%*xstpg&XP%|o{^LLfRaHf$OO5}FU%jTCo5wWWVbevTuP-Pd#^@vHB|;XmYv4V zC3}0z$R$*dv8%`>RGs7+s`X^&>p8N|wU2#~Tt#(|TtoFL`#Spp`#YCSE|8kfZRQSf zr@3EwiUbin@4?G>1s~6=c>|x#7xAO`G5lC^nNuC{A}8{b_y)d-$NU^}k<)zsUgBLX zBv&~R$A@3WujP01ukb%fc!^0;BpD`|BAF#Yk_D1Ak}k1EO}RQRB~MMp5z0`hmwmPoQK?_uZP~F$fMe0w#NdG6&|ZRR(o`Ltn=95 zvB%?OkJmlk^myCj9gmMaPJ4Xran|E&k8eFLdVKHkho{st)HB92#WTY*$Fsz<+;gyJ zrRQ+Zk)ESHt39W9-r+gN^C8dWo?V{LdG7ao+w)z|qn;-`-}gM}1-$xrNxfuVfnLF0 za<2%lWG}s!(aYqO?v?9h_Og2Adlh;)yzci}>-D79Hm@CCySxr~z3X+<>$ul@ULSaU z==HJJDX$A&-+5i~`oZfbub;iHdi~~g&D+B}&|B+m^B(Jcm-l_%8@zXUzvz9y`=IwL z-miMU?tR?*J?{^^KlJ|C`;_-*-e31&`pEiZ^r`7HsZU#wCcWpzpiBANzjkd*1hJ-*2UP(jsZKv`%`5bdGeZ zbeHr~Kh{s}m*r>m8|XL4uflJL-x$9-zk0uBzv+G*elz`M`7QNZ>$l183BM=(cKGe` zd&cisze9c({eJNKQ^v?RnMBq{<}34)`O6ftXqiT4lBLTsW!W;TEMHbAE0UGSDrG}u z!(}676J^t6Gh`jInX*|jESn>nCwoM;RQ9NBg>0qlaoHMKmu#JEx9nxv+p>3LM`Xuj zCuFB&pUKY1zL0$>J1@H=`_-TF5B8V)hxse~BmJZNll(RQI)8(Is=viQ-@nkm*uT_& zfPbz3UHa`j z0nY@y9q?hm>447z&IX(dxESz#z~z7+1Fi&I4}^hqAR8zPj0%hij0@}=m>8HGs0!2s z<^<*iS^{l>1%dqoivvpo2Lw(HoD=v!;KIN~fe!^f61XaGbzo=U+Q9XJ8v|bs{4(&@ zAX!jYP(+Y2C^{%ENFS6Ilo6B_lowG&g8o(A`1z1T6_#8ni5EdC-QS z9YMQ-o(Xz3==q?%L9YhA9`t6=+d=OH9SJ%XbSmiUU}k3;Jwjpd&*b`w-hCLIuFYLvz17QclUI{xK_HNkG zu#dt%3HvnceAw4v--cZZ`y=ena2QU9hlfXmE5oD1W5ZS9+HifiF}z>+gz$#&rQxf? z4~4%OekuG91yE25R>3Pg6f#AyLaqo?C=^KwjY6j|DAE;~ifl!WB3IF0F+?#!F-kE; zQLC^kCMfC^t%_NSdldI69#AY)EK)32Jf>KsSgq((tW~_K_)_s}gghcXA~hl{A|oOz zqF+RAggL?*F*u?!qAFro#E6Jd5o038MvRM?60tPmnTWR|E=5w2y2$>KLn4Poj))u` zSshsu>4-#;b0X(O-V=FW{M7|Sw zB=T6~iOAED7b7o4{t$U3@|Vb8m7LN;>812hN|iEYq%v9=tL&>xR3#O^#}eYKdx%S`f7|YJ1cx zQOBdcjrub>ELs~~7+oGcD7rFwbo8X?DbdrSQ8bR88@(WUVf3Qt<qW4Abk3JavO7!9A6VV?;e-wQx`m^W@(U+rtjJ^{6Tl62~I0F?E7!whb9HWiV z#~5QWVzOg$W6UuFV}`}pV)fV#a6@)iEW6zH+F68p4iu7e~a^u zONlFttBIQ)H!p5s+~T-L;+Dm&h+7-CA#QWrlX2VPcEp{FSH>5`JK|CNg7`)8563T! zUmm|Qes%nl@!R5e#y=DPT>Ren7vm4aAC7-F{%HJ(zPi3See?QS`sVlT>btG)j=sD4 z?oJ3vh)W;=RYFR_vV?UB8xl4pY)K4Cj7f}3?3j7g@X%%sAk(xib&gOi3PjYt}uRGl;DAsJdyHL%J!6@@WKdGRKQqd|_B~vL>N>z+1UX`dyQKhLeRsB?XDyynM)n8Sis#e{tTBCYR zbwqVa^^NLV)dkges$W#sRDY@|HKUfO1Jyz5V6|KwuhytZ0TkI(&Qjadh3aB;nYvs( zSUplbMm<(NPTj0-Q%_Uhp`N9lt)8czuYN?mM7>n~sCvD6gLLqt_TUW=*lCOjE9@ z&{S!vHRCjP%|y*)O`~S2W}0S(=5EdXnuVIhnx&fMnw6TzHCr@KYM#<;)9ll{pm|Yq zKyz4gQuDFqQ_UI8S z3hfZ>Q0;K-IIUefQ9DW7sBP9x*LG;{(jx5~?IP_G?K16h?c>@`?K#VwR-5}jyU8Sx@H%Zr^YtpsoT6G<|yL4DLM|ZdG9^GQyBf4d}<+_!+&AP3+ z?Yf=1XLWmYFX;B`-qsz~y`wv#JEi+n_nGdD?mOMDy5Dtw=>F70J+1fA`{@Jp!TM0W zLLaG5(5LBb`h0zXzQ2BuzEWSMAEvkK$LlBP>-AIhGxT@rXX$6_=js>hAJ#9?KdS#m z|BHb#um*|2%iv@1GlUx=4bg@;LxLgMpfZd$++%pwaLyQDR2#F5ImSGr)mUKcZyaQ- zG7dM6GLA7$HntcY#;L{*<6TBeAHZsVh@EQ`e<#Ox>KiBlWq|7g9e+J#7Le z-qhFB&s1zGF_oGIm`0lJGGWtP(|pr?rUj-&riV>SP0LLyO{+~^ruC*xrY)werlY14 zrVmUXnNFEbo4zoeGktBkVEW$lgXxOts_A#r^)#49r%BUfX#r`$X$@&J(mK*+rlGX6 zX_wP}OuLeHHGNpRJ$*uYeR@NNIwLEiUq)_*C8H~2TgHxzT^YMGJu-tbLo!1%6`445 zVdkRDhccIBevx@8^M}lzGJnY`%^IFHGHZ0!*sQHtd$V51+MjhWTalfVoszB2)@3is zUX{H%yEA)T_QmYqvae-d?+5!0={K%lUBB`D>ifOk@4bE>^!u>iCpns&?3}`!qMVYP zvYdfAgK|dYjLE6Vsm&RmQ=c1Zewn9?vz|dZhP)sxj1)j?%lcf=H8$CNbaiK4Y|8=_vP-- zJ(zna_x0SPxhHZz$o(+)liW{pf6Y_osq?Dxs`DE1rsd7eTafo)-r~H6^Ood2p4XYT zE^kBL=DaO=Pv^am_iEnpyif8z%{!gyl9Pc~0CWAhyIJo9|>z2=9^OU#d&SD06sSDQDPcbNB> zUo#&uA2XjYzi&QiK4U&>K5zcoe8K#k`4MT<%cUWdxkY$eLZp(v~hb&7h%PcD_D=q6STP@F64qD!_ykj|PIbr$0a@z8R z<(%a!%eR(`mY*$uT0O17R;4xC8f%TWCRlY=qczQ%Va>MYSPQL#tYfSbtdp#b))uS7 zdZ%@kb+&b`b-wjp>qFMZty`>5TX$QZv+l9(vmUa(Zhgyo*m}fz%=)qQOY8U6Yc|%# z+dOPuwm!BXo7@&|i?Bu6Vr(h4R9lX%#5TY-$X00^Y8!4FZ<}bFWNWl_*|yns+McmJ zXWMIg!SE9Jijx4Q~s9xt@+#YcjkXt01D&<(FMr`>H=MXu^_D=qoAOmtf0K0qM)i^bivqy z+Jf-~6AKm>>@WDX;HQG03$7J<6iN&I3xf*fh04O1!uZ0(!sJ3@VOn8!VNqduVMSq8 z;qbz-g|&s_3+oFf7q%646wWPtpy)!;_eEEWx#B*>0mV_p>SA57u{fNq<_hvlFE{*l3^wG zl1U|vB`qcGCDThfN@kYaSMor~!ji=$mrJgff>NrKEv+w|TG~;1S1B&NyY$}D2TB)~ zK2rKv>AKRVO81oRFFja#sPxU!!=*<`kCmP*{jBt>(#xg4mHC#*$^y$m%EHPb%9Ld> rW$|T+WhrIqvaGUxWw~XRvSnqP%eIz1Ehf$=O8k_V#ZTAYvfcj&7Y7FB delta 9823 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 diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 882a6a7..7028c5c 100755 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -10,9 +10,11 @@ @class Cell; @class PreferencesController; +@class RandomWindowController; @interface AppDelegate : NSObject { PreferencesController *preferences; + RandomWindowController *randomPanel; NSInteger populationSize; NSInteger DNALength; @@ -23,6 +25,7 @@ @property Cell* DNA; // goal DNA @property (assign) IBOutlet NSWindow *window; +@property (weak) IBOutlet NSWindow *randomPanel; @property (weak) IBOutlet NSTextField *populationSizeTextField; @property (weak) IBOutlet NSTextField *DNALengthTextField; @property (weak) IBOutlet NSTextField *mutationRateTextField; diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index f66ee0d..fd2083b 100755 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -10,6 +10,7 @@ #import "Cell.h" #import "Population.h" #import "PreferencesController.h" +#import "RandomWindowController.h" @implementation AppDelegate @@ -69,10 +70,31 @@ -(void)handleDNAChange:(NSNotification *)n - (IBAction)startEvolution:(id)sender { + randomPanel = [[RandomWindowController alloc] initWithWindowNibName:@"RandomWindowController"]; + + [NSApp beginSheet: [randomPanel window] + modalForWindow: [self window] + modalDelegate: randomPanel + didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) + contextInfo: nil]; + + [NSApp runModalForWindow: [randomPanel window]]; + + [NSApp endSheet: [randomPanel window]]; + //[[randomPanel window] orderOut: self]; + + /* [self setStateOfUIElements:FALSE]; [self performSelectorInBackground:@selector(evolutionJob) withObject:nil]; + */ +} + +- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + NSLog(@"finish"); + [sheet orderOut:self]; } -(void)evolutionJob diff --git a/iDNA/iDNA/MouseView.h b/iDNA/iDNA/MouseView.h new file mode 100644 index 0000000..68c3f14 --- /dev/null +++ b/iDNA/iDNA/MouseView.h @@ -0,0 +1,15 @@ +// +// MouseView.h +// iDNA +// +// Created by alex on 05/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import + +@interface MouseView : NSView { + NSPoint p; +} + +@end diff --git a/iDNA/iDNA/MouseView.m b/iDNA/iDNA/MouseView.m new file mode 100644 index 0000000..adcff76 --- /dev/null +++ b/iDNA/iDNA/MouseView.m @@ -0,0 +1,57 @@ +// +// MouseView.m +// iDNA +// +// Created by alex on 05/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import "MouseView.h" + +@implementation MouseView + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + p = NSMakePoint(0, 0); + } + + return self; +} + +- (void)drawRect:(NSRect)dirtyRect +{ + [[NSColor blackColor] set]; + [NSBezierPath strokeRect:[self bounds]]; +} + +- (void)mouseMoved:(NSEvent *)theEvent +{ + NSPoint realPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + int rand = (realPoint.x - p.x)*(realPoint.y - p.y); + p = NSMakePoint(realPoint.x, realPoint.y); + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + NSDictionary *d = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:rand] forKey:@"random"]; + [nc postNotificationName:@"RandomGeneration" object:self userInfo:d]; +} + +- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent +{ + return YES; +} + +-(void)viewDidMoveToWindow +{ + NSTrackingArea *trackingArea = [[NSTrackingArea alloc] + initWithRect:[self frame] + options:NSTrackingMouseMoved+NSTrackingActiveInKeyWindow + owner:self + userInfo:nil]; + [self addTrackingArea:trackingArea]; + [self becomeFirstResponder]; + +} + +@end diff --git a/iDNA/iDNA/RandomWindowController.h b/iDNA/iDNA/RandomWindowController.h new file mode 100644 index 0000000..0926068 --- /dev/null +++ b/iDNA/iDNA/RandomWindowController.h @@ -0,0 +1,19 @@ +// +// RandomWindowController.h +// iDNA +// +// Created by alex on 05/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import + +@interface RandomWindowController : NSWindowController + +@property (weak) IBOutlet NSProgressIndicator *progressBar; +@property (weak) IBOutlet NSView *view; +@property NSNumber *random; + +- (IBAction)onExit:(id)sender; + +@end diff --git a/iDNA/iDNA/RandomWindowController.m b/iDNA/iDNA/RandomWindowController.m new file mode 100644 index 0000000..0ddcaee --- /dev/null +++ b/iDNA/iDNA/RandomWindowController.m @@ -0,0 +1,48 @@ +// +// RandomWindowController.m +// iDNA +// +// Created by alex on 05/02/2013. +// Copyright (c) 2013 alex. All rights reserved. +// + +#import "RandomWindowController.h" + +@implementation RandomWindowController + +- (id)initWithWindow:(NSWindow *)window +{ + self = [super initWithWindow:window]; + if (self) { + // + } + + return self; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self selector:@selector(handleRandomChange:) name:@"RandomGeneration" object:nil]; +} + +- (IBAction)onExit:(id)sender +{ + [NSApp stopModal]; +} + +-(void)handleRandomChange:(NSNotification *)notification +{ + NSNumber *number = [[notification userInfo] objectForKey: @"random"]; + [[self progressBar] incrementBy:1]; + + [_random initWithLong:[_random integerValue] + [number integerValue]]; + + if ([[self progressBar] doubleValue] >= 100) { + [NSApp stopModal]; + } +} + +@end diff --git a/iDNA/iDNA/en.lproj/RandomWindowController.xib b/iDNA/iDNA/en.lproj/RandomWindowController.xib new file mode 100644 index 0000000..a777e3c --- /dev/null +++ b/iDNA/iDNA/en.lproj/RandomWindowController.xib @@ -0,0 +1,797 @@ + + + + 1080 + 12C3012 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSCustomView + NSProgressIndicator + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + RandomWindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {484, 336}} + 544735232 + Random Generation + NSWindow + + + + + 256 + + + + 268 + {{17, 282}, {450, 34}} + + + + _NS:9 + {250, 750} + YES + + 67108864 + 138674176 + Please move mouse over View to generate very-very random value + + LucidaGrande + 13 + 16 + + _NS:9 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + YES + + + + 268 + {{20, 266}, {444, 20}} + + + + _NS:9 + {250, 250} + 16397 + 100 + + + + 268 + + + + 268 + {{17, 88}, {410, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + View + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + + + NO + + + {{20, 56}, {444, 193}} + + + + _NS:9 + MouseView + + + + 268 + {{387, 13}, {82, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Exit + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {484, 336} + + + + + {{0, 0}, {1280, 778}} + {10000000000000, 10000000000000} + YES + + + + + + + window + + + + 3 + + + + progressBar + + + + 31 + + + + view + + + + 32 + + + + onExit + + + + 45 + + + + onExit: + + + + 46 + + + + delegate + + + + 4 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + 6 + 0 + + 6 + 1 + + 21 + + 1000 + + 3 + 9 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 56 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 87 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 51 + + 1000 + + 3 + 9 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + 5 + + + + + + 8 + 0 + + 0 + 1 + + 34 + + 1000 + + 3 + 9 + 1 + + + + + + 6 + + + + + 7 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + + 13 + + + + + 14 + + + + + 16 + + + + + 17 + + + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + + + 18 + + + + + 19 + + + + + 22 + + + + + 24 + + + + + + + + 25 + + + + + 26 + + + + + 29 + + + + + 30 + + + + + 33 + + + + + 39 + + + + + + + + 40 + + + + + 41 + + + + + 42 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 46 + + + + + MouseView + NSView + + IBProjectSource + ./Classes/MouseView.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + RandomWindowController + NSWindowController + + onExit: + id + + + onExit: + + onExit: + id + + + + NSProgressIndicator + NSView + + + + progressBar + NSProgressIndicator + + + view + NSView + + + + IBProjectSource + ./Classes/RandomWindowController.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + + From 02ef91e58b8995fdd0700b30665c1009a086681c Mon Sep 17 00:00:00 2001 From: Alex Ovseyenko Date: Wed, 6 Feb 2013 15:01:39 +0400 Subject: [PATCH 3/3] FINISH --- iDNA/iDNA.xcodeproj/project.pbxproj | 2 + .../UserInterfaceState.xcuserstate | Bin 24152 -> 24641 bytes iDNA/iDNA/AppDelegate.m | 23 +- iDNA/iDNA/MouseView.m | 3 +- iDNA/iDNA/RandomWindowController.h | 2 + iDNA/iDNA/RandomWindowController.m | 12 +- iDNA/iDNA/en.lproj/Localizable.strings | 3 +- iDNA/iDNA/ru.lproj/Localizable.strings | 3 +- iDNA/iDNA/ru.lproj/MainMenu.xib | 61 +- iDNA/iDNA/ru.lproj/RandomWindowController.xib | 774 ++++++++++++++++++ 10 files changed, 852 insertions(+), 31 deletions(-) create mode 100644 iDNA/iDNA/ru.lproj/RandomWindowController.xib diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index ef67ce9..ed16ede 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ FA43D72A16AFE16F00CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = ru; path = ru.lproj/Credits.rtf; sourceTree = ""; }; FA43D72E16AFE45100CDECCF /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; FA43D73016AFE45600CDECCF /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + FAF14E1816C26DCC00A50E9A /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/RandomWindowController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -237,6 +238,7 @@ isa = PBXVariantGroup; children = ( FA40EB5116C12AA000DE3FB2 /* en */, + FAF14E1816C26DCC00A50E9A /* ru */, ); name = RandomWindowController.xib; sourceTree = ""; diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/UserInterfaceState.xcuserstate index c377ab722d6754cbc812c9c880c3384045f57145..bb06a0b452e3501b778c45a6db8d046d4520edec 100644 GIT binary patch literal 24641 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 diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index fd2083b..1af2405 100755 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -37,6 +37,7 @@ -(id)init { preferences = [[PreferencesController alloc] init]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDNAChange:) name:DNAChangeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleFinishRandomGeneration:) name:@"FinishRandomGeneration" object:nil]; _DNA = [[Cell alloc] init]; [self addObserver:self forKeyPath:@"populationSize" options:0 context:nil]; @@ -79,22 +80,20 @@ - (IBAction)startEvolution:(id)sender contextInfo: nil]; [NSApp runModalForWindow: [randomPanel window]]; - [NSApp endSheet: [randomPanel window]]; - //[[randomPanel window] orderOut: self]; - - /* - [self setStateOfUIElements:FALSE]; - - [self performSelectorInBackground:@selector(evolutionJob) withObject:nil]; - */ } -- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +-(void)handleFinishRandomGeneration:(NSNotification*)notification { - NSLog(@"finish"); + NSLog(@"finish random generation"); + + NSNumber *number = [[notification userInfo] objectForKey: @"random"]; + + // абсолютно ненужное действие, но требуется по условиям задания + srandom(number); - [sheet orderOut:self]; + [self setStateOfUIElements:FALSE]; + [self performSelectorInBackground:@selector(evolutionJob) withObject:nil]; } -(void)evolutionJob @@ -108,7 +107,7 @@ -(void)evolutionJob paused = NO; while (true) { - [_generationLabel setStringValue:[NSString stringWithFormat:@"Generation: %d", i]]; + [_generationLabel setStringValue:[NSString stringWithFormat:NSLocalizedString(@"GENERATION", ""), i]]; evolutionResult = [population evolution:[[self valueForKey:@"mutationRate"] intValue]]; if (bestMatch > evolutionResult) { diff --git a/iDNA/iDNA/MouseView.m b/iDNA/iDNA/MouseView.m index adcff76..b735f62 100644 --- a/iDNA/iDNA/MouseView.m +++ b/iDNA/iDNA/MouseView.m @@ -32,9 +32,8 @@ - (void)mouseMoved:(NSEvent *)theEvent int rand = (realPoint.x - p.x)*(realPoint.y - p.y); p = NSMakePoint(realPoint.x, realPoint.y); - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *d = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:rand] forKey:@"random"]; - [nc postNotificationName:@"RandomGeneration" object:self userInfo:d]; + [[NSNotificationCenter defaultCenter] postNotificationName:@"RandomGeneration" object:self userInfo:d]; } - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent diff --git a/iDNA/iDNA/RandomWindowController.h b/iDNA/iDNA/RandomWindowController.h index 0926068..317046a 100644 --- a/iDNA/iDNA/RandomWindowController.h +++ b/iDNA/iDNA/RandomWindowController.h @@ -16,4 +16,6 @@ - (IBAction)onExit:(id)sender; +- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; + @end diff --git a/iDNA/iDNA/RandomWindowController.m b/iDNA/iDNA/RandomWindowController.m index 0ddcaee..ea62a57 100644 --- a/iDNA/iDNA/RandomWindowController.m +++ b/iDNA/iDNA/RandomWindowController.m @@ -24,8 +24,7 @@ - (void)windowDidLoad { [super windowDidLoad]; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self selector:@selector(handleRandomChange:) name:@"RandomGeneration" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRandomChange:) name:@"RandomGeneration" object:nil]; } - (IBAction)onExit:(id)sender @@ -45,4 +44,13 @@ -(void)handleRandomChange:(NSNotification *)notification } } +- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + NSDictionary *d = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:_random] forKey:@"random"]; + [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishRandomGeneration" object:self userInfo:d]; +} + + @end diff --git a/iDNA/iDNA/en.lproj/Localizable.strings b/iDNA/iDNA/en.lproj/Localizable.strings index 9ef53d6..764a46a 100644 --- a/iDNA/iDNA/en.lproj/Localizable.strings +++ b/iDNA/iDNA/en.lproj/Localizable.strings @@ -4,4 +4,5 @@ "BTN_NO" = "No"; "ERROR_SAVE" = "Error save file"; "ERROR_OPEN" = "Error open file"; -"BTN_CLOSE" = "Close"; \ No newline at end of file +"BTN_CLOSE" = "Close"; +"GENERATION" = "Generation: %d"; \ No newline at end of file diff --git a/iDNA/iDNA/ru.lproj/Localizable.strings b/iDNA/iDNA/ru.lproj/Localizable.strings index a3859a3..1413fe1 100644 --- a/iDNA/iDNA/ru.lproj/Localizable.strings +++ b/iDNA/iDNA/ru.lproj/Localizable.strings @@ -4,4 +4,5 @@ "BTN_NO" = "Нет"; "ERROR_SAVE" = "Ошибка записи файла"; "ERROR_OPEN" = "Ошибка открытия файла"; -"BTN_CLOSE" = "Закрыть"; \ No newline at end of file +"BTN_CLOSE" = "Закрыть"; +"GENERATION" = "Количество циклов: %d"; \ No newline at end of file diff --git a/iDNA/iDNA/ru.lproj/MainMenu.xib b/iDNA/iDNA/ru.lproj/MainMenu.xib index 441baf1..159fbb7 100755 --- a/iDNA/iDNA/ru.lproj/MainMenu.xib +++ b/iDNA/iDNA/ru.lproj/MainMenu.xib @@ -3,12 +3,12 @@ 1080 12C3012 - 2844 + 3084 1187.34 625.00 com.apple.InterfaceBuilder.CocoaPlugin - 2844 + 3084 IBNSLayoutConstraint @@ -810,11 +810,10 @@ {{449, 24}, {135, 32}} - _NS:9 YES - 603979776 + 67108864 134217728 Загрузить ДНК @@ -875,14 +874,6 @@ 495 - - - saveDocument: - - - - 362 - hide: @@ -1035,6 +1026,30 @@ 862 + + + loadDNAButton + + + + 874 + + + + openFile: + + + + 875 + + + + saveAs: + + + + 876 + value: self.populationSize @@ -2962,7 +2977,7 @@ - 873 + 876 @@ -2970,14 +2985,24 @@ AppDelegate NSObject + id id + id id + + openFile: + id + pauseClick: id + + saveAs: + id + startEvolution: id @@ -2989,11 +3014,13 @@ NSTextField NSTextField NSTextField + NSButton NSSlider NSTextField NSButton NSSlider NSTextField + NSWindow NSButton NSWindow @@ -3018,6 +3045,10 @@ goalDNATextField NSTextField + + loadDNAButton + NSButton + mutationRateSlider NSSlider @@ -3038,6 +3069,10 @@ populationSizeTextField NSTextField + + randomPanel + NSWindow + startEvolutionButton NSButton diff --git a/iDNA/iDNA/ru.lproj/RandomWindowController.xib b/iDNA/iDNA/ru.lproj/RandomWindowController.xib new file mode 100644 index 0000000..94802c1 --- /dev/null +++ b/iDNA/iDNA/ru.lproj/RandomWindowController.xib @@ -0,0 +1,774 @@ + + + + 1080 + 12C3012 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSCustomView + NSProgressIndicator + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + RandomWindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {484, 336}} + 544735232 + Генерация случайности + NSWindow + + + + + 256 + + + + 268 + {{16, 293}, {450, 34}} + + + + _NS:9 + {250, 750} + YES + + 67108864 + 138674176 + Пожалуйста, подергайте мышкой над нижевыделенным "Пространством" + + LucidaGrande + 13 + 16 + + _NS:9 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + YES + + + + 268 + {{20, 266}, {444, 20}} + + + + _NS:9 + {250, 250} + 16397 + 100 + + + + 268 + + + + 268 + {{17, 88}, {410, 17}} + + + + _NS:1535 + YES + + 68157504 + 138413056 + Пространство + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + + + NO + + + {{20, 56}, {444, 193}} + + + + _NS:9 + MouseView + + + + 268 + {{405, 13}, {64, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Выход + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + {484, 336} + + + + + {{0, 0}, {1280, 778}} + {10000000000000, 10000000000000} + YES + + + + + + + window + + + + 3 + + + + progressBar + + + + 31 + + + + view + + + + 32 + + + + onExit + + + + 45 + + + + onExit: + + + + 46 + + + + delegate + + + + 4 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + + + + + + 2 + + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 56 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 87 + + 1000 + + 3 + 9 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 9 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 19 + + 1000 + + 3 + 9 + 3 + + + + + + + + + + 5 + + + + + + 7 + 0 + + 0 + 1 + + 444 + + 1000 + + 3 + 9 + 1 + + + + + + 6 + + + + + 12 + + + + + + 13 + + + + + 16 + + + + + 17 + + + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + + + 18 + + + + + 19 + + + + + 22 + + + + + 24 + + + + + + + + 25 + + + + + 26 + + + + + 29 + + + + + 30 + + + + + 33 + + + + + 39 + + + + + + + + 40 + + + + + 41 + + + + + 47 + + + + + 48 + + + + + 49 + + + + + 50 + + + + + 51 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 51 + + + + + MouseView + NSView + + IBProjectSource + ./Classes/MouseView.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + RandomWindowController + NSWindowController + + onExit: + id + + + onExit: + + onExit: + id + + + + NSProgressIndicator + NSView + + + + progressBar + NSProgressIndicator + + + view + NSView + + + + IBProjectSource + ./Classes/RandomWindowController.h + + + + + 0 + IBCocoaFramework + YES + 3 + YES + +