From 96b1e67ce41afb40aebf1d422294f4aed9293fa5 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 08:48:43 -0400 Subject: [PATCH 01/29] no message --- myLauncher/Classes/AppDelegate.h | 4 +- .../Classes/MyLauncher/MyLauncherItem.h | 16 +- .../Classes/MyLauncher/MyLauncherView.m | 6 +- .../MyLauncher.xcodeproj/project.pbxproj | 173 +++++++++++++++++- .../MyLauncherTests-Info.plist | 22 +++ .../MyLauncherTests-Prefix.pch | 8 + myLauncher/MyLauncherTests/MyLauncherTests.h | 13 ++ myLauncher/MyLauncherTests/MyLauncherTests.m | 32 ++++ .../en.lproj/InfoPlist.strings | 2 + 9 files changed, 261 insertions(+), 15 deletions(-) create mode 100644 myLauncher/MyLauncherTests/MyLauncherTests-Info.plist create mode 100644 myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch create mode 100644 myLauncher/MyLauncherTests/MyLauncherTests.h create mode 100644 myLauncher/MyLauncherTests/MyLauncherTests.m create mode 100644 myLauncher/MyLauncherTests/en.lproj/InfoPlist.strings diff --git a/myLauncher/Classes/AppDelegate.h b/myLauncher/Classes/AppDelegate.h index ae3b870..4434024 100644 --- a/myLauncher/Classes/AppDelegate.h +++ b/myLauncher/Classes/AppDelegate.h @@ -28,8 +28,8 @@ UINavigationController *navigationController; } -@property (nonatomic, retain) UIWindow *window; -@property (nonatomic, retain) UINavigationController *navigationController; +@property (nonatomic, strong) UIWindow *window; +@property (nonatomic, strong) UINavigationController *navigationController; @end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherItem.h b/myLauncher/Classes/MyLauncher/MyLauncherItem.h index 1cd406d..adb5230 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherItem.h @@ -32,14 +32,14 @@ BOOL titleBoundToBottom; } -@property (nonatomic, assign) id delegate; -@property (nonatomic, retain) NSString *title; -@property (nonatomic, retain) NSString *image; -@property (nonatomic, retain) NSString *iPadImage; -@property (nonatomic, retain) NSString *controllerStr; -@property (nonatomic, retain) NSString *controllerTitle; -@property (nonatomic, retain) UIButton *closeButton; -@property (nonatomic, retain) CustomBadge *badge; +@property (nonatomic, unsafe_unretained) id delegate; +@property (nonatomic, strong) NSString *title; +@property (nonatomic, strong) NSString *image; +@property (nonatomic, strong) NSString *iPadImage; +@property (nonatomic, strong) NSString *controllerStr; +@property (nonatomic, strong) NSString *controllerTitle; +@property (nonatomic, strong) UIButton *closeButton; +@property (nonatomic, strong) CustomBadge *badge; -(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *)targetControllerStr deletable:(BOOL)_deletable; -(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)_deletable; diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index 161d3c0..ca516d3 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -82,9 +82,9 @@ -(BOOL)itemMovable:(MyLauncherItem *)itemToSearch; -(void)savePages; -(void)saveToUserDefaults:(id)object key:(NSString *)key; -(UIDeviceOrientation)currentLayoutOrientation; -@property (nonatomic, retain) NSTimer *itemHoldTimer; -@property (nonatomic, retain) NSTimer *movePagesTimer; -@property (nonatomic, retain) MyLauncherItem *draggingItem; +@property (nonatomic, strong) NSTimer *itemHoldTimer; +@property (nonatomic, strong) NSTimer *movePagesTimer; +@property (nonatomic, strong) MyLauncherItem *draggingItem; @end @implementation MyLauncherView diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index e97119d..f5ed671 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -28,6 +28,11 @@ 7DA45DCD1316B0C700D5FA85 /* itemImage-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DA45DCB1316B0C700D5FA85 /* itemImage-iPad.png */; }; 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */; }; 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; + E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */; }; + E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; + E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; + E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E30C17341599E5EB0073DA67 /* InfoPlist.strings */; }; + E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -64,6 +69,13 @@ 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CustomBadge.m; path = MyLauncher/CustomBadge.m; sourceTree = ""; }; 7DF382D913326D0100738192 /* Icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iPad.png"; path = "imgs/Icon-iPad.png"; sourceTree = ""; }; 8D1107310486CEB800E47090 /* MyLauncher-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MyLauncher-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + E30C172C1599E5EB0073DA67 /* MyLauncherTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MyLauncherTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + E30C17331599E5EB0073DA67 /* MyLauncherTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MyLauncherTests-Info.plist"; sourceTree = ""; }; + E30C17351599E5EB0073DA67 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + E30C17371599E5EB0073DA67 /* MyLauncherTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLauncherTests.h; sourceTree = ""; }; + E30C17381599E5EB0073DA67 /* MyLauncherTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLauncherTests.m; sourceTree = ""; }; + E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -77,6 +89,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E30C17281599E5EB0073DA67 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */, + E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */, + E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -135,6 +157,7 @@ isa = PBXGroup; children = ( 1D6058910D05DD3D006BFB54 /* MyLauncher.app */, + E30C172C1599E5EB0073DA67 /* MyLauncherTests.octest */, ); name = Products; sourceTree = ""; @@ -145,6 +168,7 @@ 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, + E30C17311599E5EB0073DA67 /* MyLauncherTests */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); @@ -179,6 +203,7 @@ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765FC0DF74451002DB57D /* CoreGraphics.framework */, + E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */, ); name = Frameworks; sourceTree = ""; @@ -192,6 +217,26 @@ name = "Images@iPad"; sourceTree = ""; }; + E30C17311599E5EB0073DA67 /* MyLauncherTests */ = { + isa = PBXGroup; + children = ( + E30C17371599E5EB0073DA67 /* MyLauncherTests.h */, + E30C17381599E5EB0073DA67 /* MyLauncherTests.m */, + E30C17321599E5EB0073DA67 /* Supporting Files */, + ); + path = MyLauncherTests; + sourceTree = ""; + }; + E30C17321599E5EB0073DA67 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + E30C17331599E5EB0073DA67 /* MyLauncherTests-Info.plist */, + E30C17341599E5EB0073DA67 /* InfoPlist.strings */, + E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -212,6 +257,24 @@ productReference = 1D6058910D05DD3D006BFB54 /* MyLauncher.app */; productType = "com.apple.product-type.application"; }; + E30C172B1599E5EB0073DA67 /* MyLauncherTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = E30C173D1599E5EB0073DA67 /* Build configuration list for PBXNativeTarget "MyLauncherTests" */; + buildPhases = ( + E30C17271599E5EB0073DA67 /* Sources */, + E30C17281599E5EB0073DA67 /* Frameworks */, + E30C17291599E5EB0073DA67 /* Resources */, + E30C172A1599E5EB0073DA67 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MyLauncherTests; + productName = MyLauncherTests; + productReference = E30C172C1599E5EB0073DA67 /* MyLauncherTests.octest */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -232,6 +295,7 @@ projectRoot = ""; targets = ( 1D6058900D05DD3D006BFB54 /* MyLauncher */, + E30C172B1599E5EB0073DA67 /* MyLauncherTests */, ); }; /* End PBXProject section */ @@ -252,8 +316,32 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E30C17291599E5EB0073DA67 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + E30C172A1599E5EB0073DA67 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 1D60588E0D05DD3D006BFB54 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -272,20 +360,40 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E30C17271599E5EB0073DA67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXVariantGroup section */ + E30C17341599E5EB0073DA67 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + E30C17351599E5EB0073DA67 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MyLauncher_Prefix.pch; INFOPLIST_FILE = "MyLauncher-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; PRODUCT_NAME = MyLauncher; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -295,11 +403,12 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MyLauncher_Prefix.pch; INFOPLIST_FILE = "MyLauncher-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.2; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; PRODUCT_NAME = MyLauncher; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -333,6 +442,58 @@ }; name = Release; }; + E30C173B1599E5EB0073DA67 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MyLauncherTests/MyLauncherTests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + E30C173C1599E5EB0073DA67 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MyLauncherTests/MyLauncherTests-Prefix.pch"; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -354,6 +515,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + E30C173D1599E5EB0073DA67 /* Build configuration list for PBXNativeTarget "MyLauncherTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E30C173B1599E5EB0073DA67 /* Debug */, + E30C173C1599E5EB0073DA67 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/myLauncher/MyLauncherTests/MyLauncherTests-Info.plist b/myLauncher/MyLauncherTests/MyLauncherTests-Info.plist new file mode 100644 index 0000000..99bdd1a --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.desjardins.mobile.lanceur.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch b/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch new file mode 100644 index 0000000..fc0182f --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'MyLauncherTests' target in the 'MyLauncherTests' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/myLauncher/MyLauncherTests/MyLauncherTests.h b/myLauncher/MyLauncherTests/MyLauncherTests.h new file mode 100644 index 0000000..00218e7 --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherTests.h @@ -0,0 +1,13 @@ +// +// MyLauncherTests.h +// MyLauncherTests +// +// Created by Nicolas Desjardins on 2012-06-26. +// +// + +#import + +@interface MyLauncherTests : SenTestCase + +@end diff --git a/myLauncher/MyLauncherTests/MyLauncherTests.m b/myLauncher/MyLauncherTests/MyLauncherTests.m new file mode 100644 index 0000000..f3eb7d2 --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherTests.m @@ -0,0 +1,32 @@ +// +// MyLauncherTests.m +// MyLauncherTests +// +// Created by Nicolas Desjardins on 2012-06-26. +// +// + +#import "MyLauncherTests.h" + +@implementation MyLauncherTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in MyLauncherTests"); +} + +@end diff --git a/myLauncher/MyLauncherTests/en.lproj/InfoPlist.strings b/myLauncher/MyLauncherTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/myLauncher/MyLauncherTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + From 112dcf927f4fa0be672d6f8526f9303177781bc7 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 09:59:00 -0400 Subject: [PATCH 02/29] no message --- .../Classes/MyLauncher/MyLauncherView.m | 17 +-- .../MyLauncher/MyLauncherViewController.h | 4 +- .../MyLauncher/MyLauncherViewController.m | 6 +- .../MyLauncher/MyLauncherViewControllerItem.h | 42 ++++++ ...rItem.m => MyLauncherViewControllerItem.m} | 123 +++------------- .../Classes/{MyLauncher => }/MyLauncherItem.h | 17 +-- myLauncher/Classes/MyLauncherItem.m | 135 ++++++++++++++++++ myLauncher/Classes/RootViewController.m | 26 ++-- .../MyLauncher.xcodeproj/project.pbxproj | 20 ++- 9 files changed, 238 insertions(+), 152 deletions(-) create mode 100644 myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h rename myLauncher/Classes/MyLauncher/{MyLauncherItem.m => MyLauncherViewControllerItem.m} (65%) rename myLauncher/Classes/{MyLauncher => }/MyLauncherItem.h (67%) create mode 100644 myLauncher/Classes/MyLauncherItem.m diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index ca516d3..19cba0e 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -20,6 +20,7 @@ #import "MyLauncherView.h" + struct NItemLocation { NSInteger page; NSInteger sindex; @@ -435,7 +436,7 @@ -(void)itemTouchedDown:(MyLauncherItem *)item { if (!self.draggingItem && [self itemMovable:item]) { - self.draggingItem = (MyLauncherItem*)item; + self.draggingItem = (MyLauncherItem*)item; [self.draggingItem setDragging:YES]; [self.pagesScrollView addSubview:self.draggingItem]; dragging = YES; @@ -677,7 +678,7 @@ -(void)endEditing } else { - for (MyLauncherItem* item in itemPage) + for (MyLauncherItem* item in itemPage) item.transform = CGAffineTransformIdentity; } } @@ -706,7 +707,7 @@ -(void)animateItems NSInteger animatingItems = 0; for (NSArray* itemPage in self.pages) { - for (MyLauncherItem* item in itemPage) + for (MyLauncherItem* item in itemPage) { item.closeButton.hidden = !editing; if (item != self.draggingItem && [self itemMovable:item]) @@ -798,15 +799,7 @@ -(void)savePages for(MyLauncherItem *item in page) { - NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; - [itemToSave setObject:item.title forKey:@"title"]; - [itemToSave setObject:item.image forKey:@"image"]; - [itemToSave setObject:item.iPadImage forKey:@"iPadImage"]; - [itemToSave setObject:[NSString stringWithFormat:@"%d", [item deletable]] forKey:@"deletable"]; - [itemToSave setObject:item.controllerStr forKey:@"controller"]; - [itemToSave setObject:item.controllerTitle forKey:@"controllerTitle"]; - [itemToSave setObject:[NSNumber numberWithInt:2] forKey:@"myLauncherViewItemVersion"]; - + NSDictionary *itemToSave = [item itemToSave]; [pageToSave addObject:itemToSave]; } [pagesToSave addObject:pageToSave]; diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index d523d6b..7906e66 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -20,7 +20,7 @@ #import #import "MyLauncherView.h" -#import "MyLauncherItem.h" +#import "MyLauncherViewControllerItem.h" @interface MyLauncherViewController : UIViewController { } @@ -32,7 +32,7 @@ -(BOOL)hasSavedLauncherItems; -(void)clearSavedLauncherItems; --(void)launcherViewItemSelected:(MyLauncherItem*)item; +-(void)launcherViewItemSelected:(MyLauncherView*)item; -(void)closeView; @end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index 6b1d649..a3a1fc0 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -119,7 +119,7 @@ -(BOOL)hasSavedLauncherItems { return ([self retrieveFromUserDefaults:@"myLauncherView"] != nil); } --(void)launcherViewItemSelected:(MyLauncherItem*)item { +-(void)launcherViewItemSelected:(MyLauncherViewControllerItem*)item { if (![self appControllers] || [self launcherNavigationController]) { return; } @@ -250,7 +250,7 @@ -(NSMutableArray *)savedLauncherItems { NSNumber *version; if ((version = [item objectForKey:@"myLauncherViewItemVersion"])) { if ([version intValue] == 2) { - [savedPage addObject:[[MyLauncherItem alloc] + [savedPage addObject:[[MyLauncherViewControllerItem alloc] initWithTitle:[item objectForKey:@"title"] iPhoneImage:[item objectForKey:@"image"] iPadImage:[item objectForKey:@"iPadImage"] @@ -259,7 +259,7 @@ -(NSMutableArray *)savedLauncherItems { deletable:[[item objectForKey:@"deletable"] boolValue]]]; } } else { - [savedPage addObject:[[MyLauncherItem alloc] + [savedPage addObject:[[MyLauncherViewControllerItem alloc] initWithTitle:[item objectForKey:@"title"] image:[item objectForKey:@"image"] target:[item objectForKey:@"controller"] diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h new file mode 100644 index 0000000..8f3ef83 --- /dev/null +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h @@ -0,0 +1,42 @@ +// +// MyLauncherViewControllerItem.h +// @rigoneri +// +// Copyright 2010 Rodrigo Neri +// Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "MyLauncherItem.h" + + +@interface MyLauncherViewControllerItem : MyLauncherItem + + +@property (nonatomic, strong) NSString *title; +@property (nonatomic, strong) NSString *image; +@property (nonatomic, strong) NSString *iPadImage; +@property (nonatomic, strong) NSString *controllerStr; +@property (nonatomic, strong) NSString *controllerTitle; + + + +-(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *)targetControllerStr deletable:(BOOL)_deletable; +-(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)_deletable; + + + +@end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m similarity index 65% rename from myLauncher/Classes/MyLauncher/MyLauncherItem.m rename to myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 5f4b624..1960b02 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -1,9 +1,10 @@ // -// MyLauncherItem.m +// MyLauncherViewControllerItem.m // @rigoneri // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,19 +19,18 @@ // limitations under the License. // -#import "MyLauncherItem.h" +#import "MyLauncherViewControllerItem.h" #import "CustomBadge.h" -@implementation MyLauncherItem +@implementation MyLauncherViewControllerItem + -@synthesize delegate = _delegate; @synthesize title = _title; @synthesize image = _image; @synthesize iPadImage = _iPadImage; -@synthesize closeButton = _closeButton; @synthesize controllerStr = _controllerStr; @synthesize controllerTitle = _controllerTitle; -@synthesize badge = _badge; + #pragma mark - Lifecycle @@ -62,6 +62,18 @@ -(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NS return self; } +-(NSDictionary*)itemToSave { + NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; + [itemToSave setObject:_title forKey:@"title"]; + [itemToSave setObject:_image forKey:@"image"]; + [itemToSave setObject:_iPadImage forKey:@"iPadImage"]; + [itemToSave setObject:[NSString stringWithFormat:@"%d", deletable] forKey:@"deletable"]; + [itemToSave setObject:_controllerStr forKey:@"controller"]; + [itemToSave setObject:_controllerTitle forKey:@"controllerTitle"]; + [itemToSave setObject:[NSNumber numberWithInt:2] forKey:@"myLauncherViewItemVersion"]; + + return itemToSave; +} #pragma mark - Layout -(void)layoutItem @@ -123,105 +135,6 @@ -(void)layoutItem #pragma mark - Touch --(void)closeItem:(id)sender -{ - [UIView animateWithDuration:0.1 - delay:0 - options:UIViewAnimationOptionCurveEaseIn - animations:^{ - self.alpha = 0; - self.transform = CGAffineTransformMakeScale(0.00001, 0.00001); - } - completion:nil]; - - [[self delegate] didDeleteItem:self]; -} - -- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event -{ - [super touchesBegan:touches withEvent:event]; - [[self nextResponder] touchesBegan:touches withEvent:event]; -} -- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent *)event -{ - [super touchesMoved:touches withEvent:event]; - [[self nextResponder] touchesMoved:touches withEvent:event]; -} - -- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event -{ - [super touchesEnded:touches withEvent:event]; - [[self nextResponder] touchesEnded:touches withEvent:event]; -} - -#pragma mark - Setters and Getters - --(void)setFrame:(CGRect)frame -{ - [super setFrame:frame]; -} - --(void)setDragging:(BOOL)flag -{ - if(dragging == flag) - return; - - dragging = flag; - - [UIView animateWithDuration:0.1 - delay:0 - options:UIViewAnimationOptionCurveEaseIn - animations:^{ - if(dragging) { - self.transform = CGAffineTransformMakeScale(1.4, 1.4); - self.alpha = 0.7; - } - else { - self.transform = CGAffineTransformIdentity; - self.alpha = 1; - } - } - completion:nil]; -} - --(BOOL)dragging -{ - return dragging; -} - --(BOOL)deletable -{ - return deletable; -} - --(BOOL)titleBoundToBottom -{ - return titleBoundToBottom; -} - --(void)setTitleBoundToBottom:(BOOL)bind -{ - titleBoundToBottom = bind; - [self layoutItem]; -} - --(NSString *)badgeText { - return self.badge.badgeText; -} - --(void)setBadgeText:(NSString *)text { - if (text && [text length] > 0) { - [self setBadge:[CustomBadge customBadgeWithString:text]]; - } else { - [self setBadge:nil]; - } - [self layoutItem]; -} - --(void)setCustomBadge:(CustomBadge *)customBadge { - [self setBadge:customBadge]; - [self layoutItem]; -} @end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h similarity index 67% rename from myLauncher/Classes/MyLauncher/MyLauncherItem.h rename to myLauncher/Classes/MyLauncherItem.h index adb5230..e89157b 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,9 +19,8 @@ // limitations under the License. // -#import - -@class CustomBadge; +#import +#import "CustomBadge.h" @protocol MyLauncherItemDelegate -(void)didDeleteItem:(id)item; @@ -33,16 +33,11 @@ } @property (nonatomic, unsafe_unretained) id delegate; -@property (nonatomic, strong) NSString *title; -@property (nonatomic, strong) NSString *image; -@property (nonatomic, strong) NSString *iPadImage; -@property (nonatomic, strong) NSString *controllerStr; -@property (nonatomic, strong) NSString *controllerTitle; -@property (nonatomic, strong) UIButton *closeButton; @property (nonatomic, strong) CustomBadge *badge; +@property (nonatomic, strong) UIButton *closeButton; + +-(NSDictionary*)itemToSave; --(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *)targetControllerStr deletable:(BOOL)_deletable; --(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)_deletable; -(void)layoutItem; -(void)setDragging:(BOOL)flag; -(BOOL)dragging; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m new file mode 100644 index 0000000..161ef3b --- /dev/null +++ b/myLauncher/Classes/MyLauncherItem.m @@ -0,0 +1,135 @@ +// +// MyLauncherItem.h +// @rigoneri +// +// Copyright 2010 Rodrigo Neri +// Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "MyLauncherItem.h" + +@implementation MyLauncherItem + +@synthesize delegate = _delegate; +@synthesize badge = _badge; +@synthesize closeButton = _closeButton; + +-(NSDictionary*)itemToSave {return nil;} + +-(void)layoutItem {} + +-(void)closeItem:(id)sender +{ + [UIView animateWithDuration:0.1 + delay:0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + self.alpha = 0; + self.transform = CGAffineTransformMakeScale(0.00001, 0.00001); + } + completion:nil]; + + [[self delegate] didDeleteItem:self]; +} + +- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event +{ + [super touchesBegan:touches withEvent:event]; + [[self nextResponder] touchesBegan:touches withEvent:event]; +} + +- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent *)event +{ + [super touchesMoved:touches withEvent:event]; + [[self nextResponder] touchesMoved:touches withEvent:event]; +} + +- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event +{ + [super touchesEnded:touches withEvent:event]; + [[self nextResponder] touchesEnded:touches withEvent:event]; +} + +#pragma mark - Setters and Getters + +-(void)setFrame:(CGRect)frame +{ + [super setFrame:frame]; +} + +-(void)setDragging:(BOOL)flag +{ + if(dragging == flag) + return; + + dragging = flag; + + [UIView animateWithDuration:0.1 + delay:0 + options:UIViewAnimationOptionCurveEaseIn + animations:^{ + if(dragging) { + self.transform = CGAffineTransformMakeScale(1.4, 1.4); + self.alpha = 0.7; + } + else { + self.transform = CGAffineTransformIdentity; + self.alpha = 1; + } + } + completion:nil]; +} + +-(BOOL)dragging +{ + return dragging; +} + +-(BOOL)deletable +{ + return deletable; +} + +-(BOOL)titleBoundToBottom +{ + return titleBoundToBottom; +} + +-(void)setTitleBoundToBottom:(BOOL)bind +{ + titleBoundToBottom = bind; + [self layoutItem]; +} + +-(NSString *)badgeText { + return _badge.badgeText; +} + +-(void)setBadgeText:(NSString *)text { + if (text && [text length] > 0) { + [self setBadge:[CustomBadge customBadgeWithString:text]]; + } else { + [self setBadge:nil]; + } + [self layoutItem]; +} + +-(void)setCustomBadge:(CustomBadge *)customBadge { + [self setBadge:customBadge]; + [self layoutItem]; +} + +@end diff --git a/myLauncher/Classes/RootViewController.m b/myLauncher/Classes/RootViewController.m index b6e97fe..462e64a 100644 --- a/myLauncher/Classes/RootViewController.m +++ b/myLauncher/Classes/RootViewController.m @@ -19,7 +19,7 @@ // #import "RootViewController.h" -#import "MyLauncherItem.h" +#import "MyLauncherViewControllerItem.h" #import "CustomBadge.h" #import "ItemViewController.h" @@ -41,43 +41,43 @@ -(void)loadView { [self.launcherView setPages:[NSMutableArray arrayWithObjects: [NSMutableArray arrayWithObjects: - [[MyLauncherItem alloc] initWithTitle:@"Item 1" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 1" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 1 View" deletable:NO], - [[MyLauncherItem alloc] initWithTitle:@"Item 2" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 2" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 2 View" deletable:NO], - [[MyLauncherItem alloc] initWithTitle:@"Item 3" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 3" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 3 View" deletable:YES], - [[MyLauncherItem alloc] initWithTitle:@"Item 4" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 4" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 4 View" deletable:NO], - [[MyLauncherItem alloc] initWithTitle:@"Item 5" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 5" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 5 View" deletable:YES], - [[MyLauncherItem alloc] initWithTitle:@"Item 6" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 6" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 6 View" deletable:NO], - [[MyLauncherItem alloc] initWithTitle:@"Item 7" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 7" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" @@ -85,19 +85,19 @@ -(void)loadView deletable:NO], nil], [NSMutableArray arrayWithObjects: - [[MyLauncherItem alloc] initWithTitle:@"Item 8" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 8" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 8 View" deletable:NO], - [[MyLauncherItem alloc] initWithTitle:@"Item 9" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 9" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 9 View" deletable:YES], - [[MyLauncherItem alloc] initWithTitle:@"Item 10" + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 10" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" @@ -116,11 +116,11 @@ -(void)loadView } // Set badge text for a MyLauncherItem using it's setBadgeText: method - [(MyLauncherItem *)[[[self.launcherView pages] objectAtIndex:0] objectAtIndex:0] setBadgeText:@"4"]; + [(MyLauncherViewControllerItem *)[[[self.launcherView pages] objectAtIndex:0] objectAtIndex:0] setBadgeText:@"4"]; // Alternatively, you can import CustomBadge.h as above and setCustomBadge: as below. // This will allow you to change colors, set scale, and remove the shine and/or frame. - [(MyLauncherItem *)[[[self.launcherView pages] objectAtIndex:0] objectAtIndex:1] setCustomBadge:[CustomBadge customBadgeWithString:@"2" withStringColor:[UIColor blackColor] withInsetColor:[UIColor whiteColor] withBadgeFrame:YES withBadgeFrameColor:[UIColor blackColor] withScale:0.8 withShining:NO]]; + [(MyLauncherViewControllerItem *)[[[self.launcherView pages] objectAtIndex:0] objectAtIndex:1] setCustomBadge:[CustomBadge customBadgeWithString:@"2" withStringColor:[UIColor blackColor] withInsetColor:[UIColor whiteColor] withBadgeFrame:YES withBadgeFrameColor:[UIColor blackColor] withScale:0.8 withShining:NO]]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index f5ed671..5e8d5ba 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ 0F2C05881207A88D009D2ED9 /* launcher.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F2C05871207A88D009D2ED9 /* launcher.png */; }; 0F93B7E71213AE4500BA0DB9 /* close.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F93B7E61213AE4500BA0DB9 /* close.png */; }; 0F975C2E122B0E8300F678EB /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C2D122B0E8300F678EB /* RootViewController.m */; }; - 0F975C99122B4FAE00F678EB /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C90122B4FAE00F678EB /* MyLauncherItem.m */; }; + 0F975C99122B4FAE00F678EB /* MyLauncherViewControllerItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */; }; 0F975C9A122B4FAE00F678EB /* MyLauncherPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */; }; 0F975C9B122B4FAE00F678EB /* MyLauncherScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C94122B4FAE00F678EB /* MyLauncherScrollView.m */; }; 0F975C9C122B4FAE00F678EB /* MyLauncherView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C96122B4FAE00F678EB /* MyLauncherView.m */; }; @@ -33,6 +33,8 @@ E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E30C17341599E5EB0073DA67 /* InfoPlist.strings */; }; E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; + E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; + E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -44,8 +46,8 @@ 0F93B7E61213AE4500BA0DB9 /* close.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = close.png; path = imgs/close.png; sourceTree = ""; }; 0F975C2C122B0E8300F678EB /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 0F975C2D122B0E8300F678EB /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; - 0F975C8F122B4FAE00F678EB /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherItem.h; path = MyLauncher/MyLauncherItem.h; sourceTree = ""; }; - 0F975C90122B4FAE00F678EB /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = MyLauncherItem.m; path = MyLauncher/MyLauncherItem.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 0F975C8F122B4FAE00F678EB /* MyLauncherViewControllerItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherViewControllerItem.h; path = MyLauncher/MyLauncherViewControllerItem.h; sourceTree = ""; }; + 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = MyLauncherViewControllerItem.m; path = MyLauncher/MyLauncherViewControllerItem.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 0F975C91122B4FAE00F678EB /* MyLauncherPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherPageControl.h; path = MyLauncher/MyLauncherPageControl.h; sourceTree = ""; }; 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherPageControl.m; path = MyLauncher/MyLauncherPageControl.m; sourceTree = ""; }; 0F975C93122B4FAE00F678EB /* MyLauncherScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherScrollView.h; path = MyLauncher/MyLauncherScrollView.h; sourceTree = ""; }; @@ -76,6 +78,8 @@ E30C17371599E5EB0073DA67 /* MyLauncherTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLauncherTests.h; sourceTree = ""; }; E30C17381599E5EB0073DA67 /* MyLauncherTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLauncherTests.m; sourceTree = ""; }; E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; + E30C17401599F29B0073DA67 /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherItem.h; sourceTree = ""; }; + E30C17411599F29B0073DA67 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherItem.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -143,8 +147,10 @@ 0F975C98122B4FAE00F678EB /* MyLauncherViewController.m */, 0F975C95122B4FAE00F678EB /* MyLauncherView.h */, 0F975C96122B4FAE00F678EB /* MyLauncherView.m */, - 0F975C8F122B4FAE00F678EB /* MyLauncherItem.h */, - 0F975C90122B4FAE00F678EB /* MyLauncherItem.m */, + E30C17401599F29B0073DA67 /* MyLauncherItem.h */, + E30C17411599F29B0073DA67 /* MyLauncherItem.m */, + 0F975C8F122B4FAE00F678EB /* MyLauncherViewControllerItem.h */, + 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */, 0F975C93122B4FAE00F678EB /* MyLauncherScrollView.h */, 0F975C94122B4FAE00F678EB /* MyLauncherScrollView.m */, 0F975C91122B4FAE00F678EB /* MyLauncherPageControl.h */, @@ -351,12 +357,13 @@ 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */, 0F1328EE120637BC00C7C87C /* ItemViewController.m in Sources */, 0F975C2E122B0E8300F678EB /* RootViewController.m in Sources */, - 0F975C99122B4FAE00F678EB /* MyLauncherItem.m in Sources */, + 0F975C99122B4FAE00F678EB /* MyLauncherViewControllerItem.m in Sources */, 0F975C9A122B4FAE00F678EB /* MyLauncherPageControl.m in Sources */, 0F975C9B122B4FAE00F678EB /* MyLauncherScrollView.m in Sources */, 0F975C9C122B4FAE00F678EB /* MyLauncherView.m in Sources */, 0F975C9D122B4FAE00F678EB /* MyLauncherViewController.m in Sources */, 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, + E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -365,6 +372,7 @@ buildActionMask = 2147483647; files = ( E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, + E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 4e6cf7191b0e28b69d2de1415dddb7293c6d7a38 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 10:44:33 -0400 Subject: [PATCH 03/29] no message --- .../MyLauncher/MyLauncherViewController.h | 2 ++ .../MyLauncher/MyLauncherViewController.m | 17 ++++++++++------- .../MyLauncher/MyLauncherViewControllerItem.h | 1 + .../MyLauncher/MyLauncherViewControllerItem.m | 8 ++++++++ myLauncher/Classes/MyLauncherItem.h | 4 ++++ myLauncher/Classes/MyLauncherItem.m | 2 ++ 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index 7906e66..9145136 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -35,4 +35,6 @@ -(void)launcherViewItemSelected:(MyLauncherView*)item; -(void)closeView; +-(void)launchSelectedItemViewController:(UIViewController*)itemViewController withTopTitle:(NSString*)title; + @end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index a3a1fc0..a2b1ea0 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -19,6 +19,7 @@ // #import "MyLauncherViewController.h" +#import "MyLauncherItem.h" @interface MyLauncherViewController () -(NSMutableArray *)savedLauncherItems; @@ -119,15 +120,17 @@ -(BOOL)hasSavedLauncherItems { return ([self retrieveFromUserDefaults:@"myLauncherView"] != nil); } --(void)launcherViewItemSelected:(MyLauncherViewControllerItem*)item { +-(void)launcherViewItemSelected:(MyLauncherItem*)item { + [item selected:self]; +} + +-(void)launchSelectedItemViewController:(UIViewController*)itemViewController withTopTitle:(NSString*)title { if (![self appControllers] || [self launcherNavigationController]) { return; } - Class viewCtrClass = [[self appControllers] objectForKey:[item controllerStr]]; - UIViewController *controller = [[viewCtrClass alloc] init]; - [self setLauncherNavigationController:[[UINavigationController alloc] initWithRootViewController:controller]]; - [[self.launcherNavigationController topViewController] setTitle:item.controllerTitle]; + [self setLauncherNavigationController:[[UINavigationController alloc] initWithRootViewController:itemViewController]]; + [[self.launcherNavigationController topViewController] setTitle:title]; [self.launcherNavigationController setDelegate:self]; if(self.view.frame.size.width == 480) @@ -135,12 +138,12 @@ -(void)launcherViewItemSelected:(MyLauncherViewControllerItem*)item { if(self.view.frame.size.width == 1024) self.launcherNavigationController.view.frame = CGRectMake(0, 0, 1024, 768); - [controller.navigationItem setLeftBarButtonItem: + [itemViewController.navigationItem setLeftBarButtonItem: [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"launcher"] style:UIBarButtonItemStyleBordered target:self action:@selector(closeView)]]; - + UIView *viewToLaunch = [[self.launcherNavigationController topViewController] view]; [self.parentViewController.view addSubview:[self.launcherNavigationController view]]; diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h index 8f3ef83..41c158e 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h @@ -22,6 +22,7 @@ #import #import "MyLauncherItem.h" +#import "MyLauncherViewController.h" @interface MyLauncherViewControllerItem : MyLauncherItem diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 1960b02..ac75c56 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -62,6 +62,14 @@ -(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NS return self; } +-(void)selected:(MyLauncherViewController*)parent { + + Class viewCtrClass = [[parent appControllers] objectForKey:_controllerStr]; + UIViewController *controller = [[viewCtrClass alloc] init]; + + [parent launchSelectedItemViewController:controller withTopTitle:_controllerTitle]; +} + -(NSDictionary*)itemToSave { NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; [itemToSave setObject:_title forKey:@"title"]; diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h index e89157b..48f839e 100644 --- a/myLauncher/Classes/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -22,6 +22,8 @@ #import #import "CustomBadge.h" +@class MyLauncherViewController; + @protocol MyLauncherItemDelegate -(void)didDeleteItem:(id)item; @end @@ -38,6 +40,8 @@ -(NSDictionary*)itemToSave; +-(void)selected:(MyLauncherViewController*)parent; + -(void)layoutItem; -(void)setDragging:(BOOL)flag; -(BOOL)dragging; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m index 161ef3b..1a8cd25 100644 --- a/myLauncher/Classes/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncherItem.m @@ -27,6 +27,8 @@ @implementation MyLauncherItem @synthesize badge = _badge; @synthesize closeButton = _closeButton; +-(void)selected:(MyLauncherViewController*)parent {} + -(NSDictionary*)itemToSave {return nil;} -(void)layoutItem {} From 97b1c821b40cfd137ae73b2d5b29b36af3bedbf4 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 13:00:55 -0400 Subject: [PATCH 04/29] no message --- .../MyLauncher/MyLauncherViewController.h | 1 + .../MyLauncher/MyLauncherViewController.m | 1 + .../MyLauncher/MyLauncherViewControllerItem.h | 1 - .../MyLauncher/MyLauncherViewControllerItem.m | 10 ++---- myLauncher/Classes/MyLauncherGenericItem.h | 33 +++++++++++++++++++ myLauncher/Classes/MyLauncherGenericItem.m | 25 ++++++++++++++ myLauncher/Classes/MyLauncherItem.h | 3 ++ myLauncher/Classes/MyLauncherItem.m | 12 +++++++ .../MyLauncher.xcodeproj/project.pbxproj | 8 +++++ 9 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 myLauncher/Classes/MyLauncherGenericItem.h create mode 100644 myLauncher/Classes/MyLauncherGenericItem.m diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index 9145136..7a05758 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index a2b1ea0..a165c94 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h index 41c158e..52717c0 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h @@ -21,7 +21,6 @@ #import #import "MyLauncherItem.h" - #import "MyLauncherViewController.h" @interface MyLauncherViewControllerItem : MyLauncherItem diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index ac75c56..084fe89 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -45,19 +45,13 @@ -(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *) -(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)_deletable { - if((self = [super init])) - { - dragging = NO; - deletable = _deletable; - + if((self = [super initWithDeletable:_deletable])) + { [self setTitle:title]; [self setImage:image]; [self setIPadImage:iPadImage]; [self setControllerStr:targetControllerStr]; [self setControllerTitle:targetTitle]; - - [self setCloseButton:[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]]; - self.closeButton.hidden = YES; } return self; } diff --git a/myLauncher/Classes/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncherGenericItem.h new file mode 100644 index 0000000..df27372 --- /dev/null +++ b/myLauncher/Classes/MyLauncherGenericItem.h @@ -0,0 +1,33 @@ +// +// MyLauncherGenericItem.h +// +// Copyright 2012 Nicolas Desjardins +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "MyLauncherItem.h" + +@protocol MyLauncherGenericItemDelegate + +-(void)start; + +@end + +@interface MyLauncherGenericItem : MyLauncherItem + +@property (nonatomic, strong) NSString *title; +@property (nonatomic, strong) UIImage *image; +@property (nonatomic, strong) id delegte; + +@end diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m new file mode 100644 index 0000000..425a26a --- /dev/null +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -0,0 +1,25 @@ +// +// MyLauncherGenericItem.h +// +// Copyright 2012 Nicolas Desjardins +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import "MyLauncherGenericItem.h" + +@implementation MyLauncherGenericItem + + + +@end diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h index 48f839e..712c1dd 100644 --- a/myLauncher/Classes/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -38,6 +38,9 @@ @property (nonatomic, strong) CustomBadge *badge; @property (nonatomic, strong) UIButton *closeButton; + +-(id)initWithDeletable:(BOOL)_deletable; + -(NSDictionary*)itemToSave; -(void)selected:(MyLauncherViewController*)parent; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m index 1a8cd25..08e8a5d 100644 --- a/myLauncher/Classes/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncherItem.m @@ -27,6 +27,18 @@ @implementation MyLauncherItem @synthesize badge = _badge; @synthesize closeButton = _closeButton; +-(id)initWithDeletable:(BOOL)_deletable { + if((self = [super init])) + { + dragging = NO; + deletable = _deletable; + + [self setCloseButton:[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]]; + self.closeButton.hidden = YES; + } + return self; +} + -(void)selected:(MyLauncherViewController*)parent {} -(NSDictionary*)itemToSave {return nil;} diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 5e8d5ba..9b4bcd3 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; + E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; + E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -80,6 +82,8 @@ E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; E30C17401599F29B0073DA67 /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherItem.h; sourceTree = ""; }; E30C17411599F29B0073DA67 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherItem.m; sourceTree = ""; }; + E30C1744159A04A10073DA67 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItem.h; sourceTree = ""; }; + E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItem.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -149,6 +153,8 @@ 0F975C96122B4FAE00F678EB /* MyLauncherView.m */, E30C17401599F29B0073DA67 /* MyLauncherItem.h */, E30C17411599F29B0073DA67 /* MyLauncherItem.m */, + E30C1744159A04A10073DA67 /* MyLauncherGenericItem.h */, + E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */, 0F975C8F122B4FAE00F678EB /* MyLauncherViewControllerItem.h */, 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */, 0F975C93122B4FAE00F678EB /* MyLauncherScrollView.h */, @@ -364,6 +370,7 @@ 0F975C9D122B4FAE00F678EB /* MyLauncherViewController.m in Sources */, 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */, + E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -373,6 +380,7 @@ files = ( E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */, + E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 57beec25f5eedb8f16725c07ac5527bdeed38090 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 13:48:36 -0400 Subject: [PATCH 05/29] no message --- .../MyLauncher/MyLauncherViewControllerItem.h | 1 - .../MyLauncher/MyLauncherViewControllerItem.m | 14 ++++- myLauncher/Classes/MyLauncherGenericItem.h | 5 +- myLauncher/Classes/MyLauncherGenericItem.m | 18 ++++++ myLauncher/Classes/MyLauncherItem.h | 1 + myLauncher/Classes/MyLauncherItem.m | 57 ++++++++++++++++++- myLauncher/Classes/OpenWebURLItem.h | 14 +++++ myLauncher/Classes/OpenWebURLItem.m | 17 ++++++ myLauncher/Classes/RootViewController.m | 14 ++--- .../MyLauncher.xcodeproj/project.pbxproj | 8 +++ 10 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 myLauncher/Classes/OpenWebURLItem.h create mode 100644 myLauncher/Classes/OpenWebURLItem.m diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h index 52717c0..956cbc7 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.h @@ -26,7 +26,6 @@ @interface MyLauncherViewControllerItem : MyLauncherItem -@property (nonatomic, strong) NSString *title; @property (nonatomic, strong) NSString *image; @property (nonatomic, strong) NSString *iPadImage; @property (nonatomic, strong) NSString *controllerStr; diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 084fe89..72ed0df 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -25,7 +25,6 @@ @implementation MyLauncherViewControllerItem -@synthesize title = _title; @synthesize image = _image; @synthesize iPadImage = _iPadImage; @synthesize controllerStr = _controllerStr; @@ -56,6 +55,17 @@ -(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NS return self; } +-(UIImage*)icon { + UIImage *image = nil; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad && [self iPadImage]) { + image = [UIImage imageNamed:self.iPadImage]; + } else { + image = [UIImage imageNamed:self.image]; + } + + return image; +} + -(void)selected:(MyLauncherViewController*)parent { Class viewCtrClass = [[parent appControllers] objectForKey:_controllerStr]; @@ -66,7 +76,7 @@ -(void)selected:(MyLauncherViewController*)parent { -(NSDictionary*)itemToSave { NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; - [itemToSave setObject:_title forKey:@"title"]; + [itemToSave setObject:self.title forKey:@"title"]; [itemToSave setObject:_image forKey:@"image"]; [itemToSave setObject:_iPadImage forKey:@"iPadImage"]; [itemToSave setObject:[NSString stringWithFormat:@"%d", deletable] forKey:@"deletable"]; diff --git a/myLauncher/Classes/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncherGenericItem.h index df27372..155729d 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.h +++ b/myLauncher/Classes/MyLauncherGenericItem.h @@ -28,6 +28,9 @@ @property (nonatomic, strong) NSString *title; @property (nonatomic, strong) UIImage *image; -@property (nonatomic, strong) id delegte; +@property (nonatomic, strong) id genericDelegate; + + +-(id)initWithDelegate:(id)genericDelegate deletable:(BOOL)_deletable; @end diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m index 425a26a..faf6ade 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -20,6 +20,24 @@ @implementation MyLauncherGenericItem +-(id)initWithDelegate:(id)genericDelegate deletable:(BOOL)_deletable { + if((self = [super initWithDeletable:_deletable])) + { + _genericDelegate = genericDelegate; + } + return self; +} +-(NSDictionary*)itemToSave {return [[NSDictionary alloc] init];} + + +-(void)selected:(MyLauncherViewController*)parent { + + [_genericDelegate start]; +} + +-(UIImage*)icon { + return [UIImage imageNamed:@"icon.png"]; +} @end diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h index 712c1dd..10ffe6f 100644 --- a/myLauncher/Classes/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -34,6 +34,7 @@ BOOL titleBoundToBottom; } +@property (nonatomic, strong) NSString *title; @property (nonatomic, unsafe_unretained) id delegate; @property (nonatomic, strong) CustomBadge *badge; @property (nonatomic, strong) UIButton *closeButton; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m index 08e8a5d..5bbc6d7 100644 --- a/myLauncher/Classes/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncherItem.m @@ -23,6 +23,7 @@ @implementation MyLauncherItem +@synthesize title = _title; @synthesize delegate = _delegate; @synthesize badge = _badge; @synthesize closeButton = _closeButton; @@ -43,7 +44,61 @@ -(void)selected:(MyLauncherViewController*)parent {} -(NSDictionary*)itemToSave {return nil;} --(void)layoutItem {} +-(void)layoutItem +{ + UIImage *image = [self icon]; + if(!image) + return; + + for(id subview in [self subviews]) + [subview removeFromSuperview]; + + + UIImageView *itemImage = [[UIImageView alloc] initWithImage:image]; + CGFloat itemImageX = (self.bounds.size.width/2) - (itemImage.bounds.size.width/2); + CGFloat itemImageY = (self.bounds.size.height/2) - (itemImage.bounds.size.height/2); + itemImage.frame = CGRectMake(itemImageX, itemImageY, itemImage.bounds.size.width, itemImage.bounds.size.height); + [self addSubview:itemImage]; + CGFloat itemImageWidth = itemImage.bounds.size.width; + + if(self.badge) { + self.badge.frame = CGRectMake((itemImageX + itemImageWidth) - (self.badge.bounds.size.width - 6), + itemImageY-6, self.badge.bounds.size.width, self.badge.bounds.size.height); + [self addSubview:self.badge]; + } + + if(deletable) + { + self.closeButton.frame = CGRectMake(itemImageX-10, itemImageY-10, 30, 30); + [self.closeButton setImage:[UIImage imageNamed:@"close"] forState:UIControlStateNormal]; + self.closeButton.backgroundColor = [UIColor clearColor]; + [self.closeButton addTarget:self action:@selector(closeItem:) forControlEvents:UIControlEventTouchUpInside]; + [self addSubview:self.closeButton]; + } + + CGFloat itemLabelY = itemImageY + itemImage.bounds.size.height; + CGFloat itemLabelHeight = self.bounds.size.height - itemLabelY; + + if (titleBoundToBottom) + { + itemLabelHeight = 34; + itemLabelY = (self.bounds.size.height + 6) - itemLabelHeight; + } + + UILabel *itemLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, itemLabelY, self.bounds.size.width, itemLabelHeight)]; + itemLabel.backgroundColor = [UIColor clearColor]; + itemLabel.font = [UIFont boldSystemFontOfSize:11]; + itemLabel.textColor = COLOR(46, 46, 46); + itemLabel.textAlignment = UITextAlignmentCenter; + itemLabel.lineBreakMode = UILineBreakModeTailTruncation; + itemLabel.text = self.title; + itemLabel.numberOfLines = 2; + [self addSubview:itemLabel]; +} + +-(UIImage*)icon { + return nil; +} -(void)closeItem:(id)sender { diff --git a/myLauncher/Classes/OpenWebURLItem.h b/myLauncher/Classes/OpenWebURLItem.h new file mode 100644 index 0000000..b4a20b3 --- /dev/null +++ b/myLauncher/Classes/OpenWebURLItem.h @@ -0,0 +1,14 @@ +// +// OpenWebURLItem.h +// MyLauncher +// +// Created by Nicolas Desjardins on 2012-06-26. +// +// + +#import +#import "MyLauncherGenericItem.h" + +@interface OpenWebURLItem : NSObject + +@end diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m new file mode 100644 index 0000000..ba3590e --- /dev/null +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -0,0 +1,17 @@ +// +// OpenWebURLItem.m +// MyLauncher +// +// Created by Nicolas Desjardins on 2012-06-26. +// +// + +#import "OpenWebURLItem.h" + +@implementation OpenWebURLItem + +-(void)start { + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; +} + +@end diff --git a/myLauncher/Classes/RootViewController.m b/myLauncher/Classes/RootViewController.m index 462e64a..aa31652 100644 --- a/myLauncher/Classes/RootViewController.m +++ b/myLauncher/Classes/RootViewController.m @@ -20,6 +20,8 @@ #import "RootViewController.h" #import "MyLauncherViewControllerItem.h" +#import "MyLauncherGenericItem.h" +#import "OpenWebURLItem.h" #import "CustomBadge.h" #import "ItemViewController.h" @@ -39,14 +41,12 @@ -(void)loadView if(![self hasSavedLauncherItems]) { - [self.launcherView setPages:[NSMutableArray arrayWithObjects: + OpenWebURLItem *urlItem = [[OpenWebURLItem alloc] init]; + + [self.launcherView setPages:[NSMutableArray arrayWithObjects: [NSMutableArray arrayWithObjects: - [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 1" - iPhoneImage:@"itemImage" - iPadImage:@"itemImage-iPad" - target:@"ItemViewController" - targetTitle:@"Item 1 View" - deletable:NO], + [[MyLauncherGenericItem alloc] initWithDelegate:urlItem + deletable:NO], [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 2" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 9b4bcd3..28d7d9f 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; + E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; + E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -84,6 +86,8 @@ E30C17411599F29B0073DA67 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherItem.m; sourceTree = ""; }; E30C1744159A04A10073DA67 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItem.h; sourceTree = ""; }; E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItem.m; sourceTree = ""; }; + E30C1748159A22950073DA67 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; + E30C1749159A22950073DA67 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -120,6 +124,8 @@ 0F975C2D122B0E8300F678EB /* RootViewController.m */, 0F1328EC120637BC00C7C87C /* ItemViewController.h */, 0F1328ED120637BC00C7C87C /* ItemViewController.m */, + E30C1748159A22950073DA67 /* OpenWebURLItem.h */, + E30C1749159A22950073DA67 /* OpenWebURLItem.m */, ); path = Classes; sourceTree = ""; @@ -371,6 +377,7 @@ 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */, E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, + E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -381,6 +388,7 @@ E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */, E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, + E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 51b17be4b6f5e6b8214daaf4342955f8c079564c Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 14:17:40 -0400 Subject: [PATCH 06/29] no message --- .../MyLauncher/MyLauncherViewControllerItem.m | 15 +++++----- myLauncher/Classes/MyLauncherGenericItem.h | 3 +- myLauncher/Classes/MyLauncherGenericItem.m | 7 +++-- myLauncher/Classes/MyLauncherItem.h | 8 +++--- myLauncher/Classes/MyLauncherItem.m | 27 +++++++++--------- myLauncher/Classes/OpenWebURLItem.m | 4 +++ myLauncher/Classes/RootViewController.m | 3 +- myLauncher/Google-icon-iPad.png | Bin 0 -> 7543 bytes myLauncher/Google-icon.png | Bin 0 -> 5294 bytes myLauncher/Google-icon128.png | Bin 0 -> 16084 bytes myLauncher/Google-icon@2x.png | Bin 0 -> 15109 bytes .../MyLauncher.xcodeproj/project.pbxproj | 24 ++++++++++++++++ 12 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 myLauncher/Google-icon-iPad.png create mode 100644 myLauncher/Google-icon.png create mode 100644 myLauncher/Google-icon128.png create mode 100644 myLauncher/Google-icon@2x.png diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 72ed0df..98ef706 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -33,20 +33,19 @@ @implementation MyLauncherViewControllerItem #pragma mark - Lifecycle --(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *)targetControllerStr deletable:(BOOL)_deletable { +-(id)initWithTitle:(NSString *)title image:(NSString *)image target:(NSString *)targetControllerStr deletable:(BOOL)deletable { return [self initWithTitle:title iPhoneImage:image iPadImage:image target:targetControllerStr targetTitle:title - deletable:_deletable]; + deletable:deletable]; } --(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)_deletable { +-(id)initWithTitle:(NSString *)title iPhoneImage:(NSString *)image iPadImage:(NSString *)iPadImage target:(NSString *)targetControllerStr targetTitle:(NSString *)targetTitle deletable:(BOOL)deletable { - if((self = [super initWithDeletable:_deletable])) + if((self = [super initWithTitle:title deletable:deletable])) { - [self setTitle:title]; [self setImage:image]; [self setIPadImage:iPadImage]; [self setControllerStr:targetControllerStr]; @@ -79,7 +78,7 @@ -(NSDictionary*)itemToSave { [itemToSave setObject:self.title forKey:@"title"]; [itemToSave setObject:_image forKey:@"image"]; [itemToSave setObject:_iPadImage forKey:@"iPadImage"]; - [itemToSave setObject:[NSString stringWithFormat:@"%d", deletable] forKey:@"deletable"]; + [itemToSave setObject:[NSString stringWithFormat:@"%d", _deletable] forKey:@"deletable"]; [itemToSave setObject:_controllerStr forKey:@"controller"]; [itemToSave setObject:_controllerTitle forKey:@"controllerTitle"]; [itemToSave setObject:[NSNumber numberWithInt:2] forKey:@"myLauncherViewItemVersion"]; @@ -116,7 +115,7 @@ -(void)layoutItem [self addSubview:self.badge]; } - if(deletable) + if(_deletable) { self.closeButton.frame = CGRectMake(itemImageX-10, itemImageY-10, 30, 30); [self.closeButton setImage:[UIImage imageNamed:@"close"] forState:UIControlStateNormal]; @@ -128,7 +127,7 @@ -(void)layoutItem CGFloat itemLabelY = itemImageY + itemImage.bounds.size.height; CGFloat itemLabelHeight = self.bounds.size.height - itemLabelY; - if (titleBoundToBottom) + if (_titleBoundToBottom) { itemLabelHeight = 34; itemLabelY = (self.bounds.size.height + 6) - itemLabelHeight; diff --git a/myLauncher/Classes/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncherGenericItem.h index 155729d..0f4a18e 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.h +++ b/myLauncher/Classes/MyLauncherGenericItem.h @@ -21,6 +21,7 @@ @protocol MyLauncherGenericItemDelegate -(void)start; +-(UIImage*)icon; @end @@ -31,6 +32,6 @@ @property (nonatomic, strong) id genericDelegate; --(id)initWithDelegate:(id)genericDelegate deletable:(BOOL)_deletable; +-(id)initWithTitle:(NSString*)title delegate:(id)genericDelegate deletable:(BOOL)deletable; @end diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m index faf6ade..f2ca343 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -20,8 +20,8 @@ @implementation MyLauncherGenericItem --(id)initWithDelegate:(id)genericDelegate deletable:(BOOL)_deletable { - if((self = [super initWithDeletable:_deletable])) +-(id)initWithTitle:(NSString*)title delegate:(id)genericDelegate deletable:(BOOL)deletable { + if((self = [super initWithTitle:title deletable:deletable])) { _genericDelegate = genericDelegate; } @@ -37,7 +37,8 @@ -(void)selected:(MyLauncherViewController*)parent { } -(UIImage*)icon { - return [UIImage imageNamed:@"icon.png"]; + return [_genericDelegate icon]; + } @end diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h index 10ffe6f..d8dcd75 100644 --- a/myLauncher/Classes/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -29,9 +29,9 @@ @end @interface MyLauncherItem : UIControl { - BOOL dragging; - BOOL deletable; - BOOL titleBoundToBottom; + BOOL _dragging; + BOOL _deletable; + BOOL _titleBoundToBottom; } @property (nonatomic, strong) NSString *title; @@ -40,7 +40,7 @@ @property (nonatomic, strong) UIButton *closeButton; --(id)initWithDeletable:(BOOL)_deletable; +-(id)initWithTitle:(NSString*)title deletable:(BOOL)deletable; -(NSDictionary*)itemToSave; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m index 5bbc6d7..0c646c7 100644 --- a/myLauncher/Classes/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncherItem.m @@ -28,12 +28,13 @@ @implementation MyLauncherItem @synthesize badge = _badge; @synthesize closeButton = _closeButton; --(id)initWithDeletable:(BOOL)_deletable { +-(id)initWithTitle:(NSString*)title deletable:(BOOL)deletable { if((self = [super init])) { - dragging = NO; - deletable = _deletable; - + _dragging = NO; + _deletable = deletable; + _title = title; + [self setCloseButton:[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]]; self.closeButton.hidden = YES; } @@ -67,7 +68,7 @@ -(void)layoutItem [self addSubview:self.badge]; } - if(deletable) + if(_deletable) { self.closeButton.frame = CGRectMake(itemImageX-10, itemImageY-10, 30, 30); [self.closeButton setImage:[UIImage imageNamed:@"close"] forState:UIControlStateNormal]; @@ -79,7 +80,7 @@ -(void)layoutItem CGFloat itemLabelY = itemImageY + itemImage.bounds.size.height; CGFloat itemLabelHeight = self.bounds.size.height - itemLabelY; - if (titleBoundToBottom) + if (_titleBoundToBottom) { itemLabelHeight = 34; itemLabelY = (self.bounds.size.height + 6) - itemLabelHeight; @@ -141,16 +142,16 @@ -(void)setFrame:(CGRect)frame -(void)setDragging:(BOOL)flag { - if(dragging == flag) + if(_dragging == flag) return; - dragging = flag; + _dragging = flag; [UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{ - if(dragging) { + if(_dragging) { self.transform = CGAffineTransformMakeScale(1.4, 1.4); self.alpha = 0.7; } @@ -164,22 +165,22 @@ -(void)setDragging:(BOOL)flag -(BOOL)dragging { - return dragging; + return _dragging; } -(BOOL)deletable { - return deletable; + return _deletable; } -(BOOL)titleBoundToBottom { - return titleBoundToBottom; + return _titleBoundToBottom; } -(void)setTitleBoundToBottom:(BOOL)bind { - titleBoundToBottom = bind; + _titleBoundToBottom = bind; [self layoutItem]; } diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index ba3590e..fc03346 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -14,4 +14,8 @@ -(void)start { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; } +-(UIImage*)icon { + return [UIImage imageNamed:@"google-icon.png"]; +} + @end diff --git a/myLauncher/Classes/RootViewController.m b/myLauncher/Classes/RootViewController.m index aa31652..c7ffc0b 100644 --- a/myLauncher/Classes/RootViewController.m +++ b/myLauncher/Classes/RootViewController.m @@ -45,7 +45,8 @@ -(void)loadView [self.launcherView setPages:[NSMutableArray arrayWithObjects: [NSMutableArray arrayWithObjects: - [[MyLauncherGenericItem alloc] initWithDelegate:urlItem + [[MyLauncherGenericItem alloc] initWithTitle:@"google" + delegate:urlItem deletable:NO], [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 2" iPhoneImage:@"itemImage" diff --git a/myLauncher/Google-icon-iPad.png b/myLauncher/Google-icon-iPad.png new file mode 100644 index 0000000000000000000000000000000000000000..1f940f48e5ce214686479144209d475739ba4799 GIT binary patch literal 7543 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 N002ovPDHLkV1f&oV@d!3 literal 0 HcmV?d00001 diff --git a/myLauncher/Google-icon.png b/myLauncher/Google-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6189cc12a13d1049a146ce246787eb4d50f1c78f GIT binary patch literal 5294 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/myLauncher/Google-icon128.png b/myLauncher/Google-icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..f03f57fc87f92ff42ae3a243017c1c07971f4d34 GIT binary patch literal 16084 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 literal 0 HcmV?d00001 diff --git a/myLauncher/Google-icon@2x.png b/myLauncher/Google-icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f832f9bf150aaa4444ede56549f869b6be195a56 GIT binary patch literal 15109 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 literal 0 HcmV?d00001 diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 28d7d9f..1a9857e 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -39,6 +39,14 @@ E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; + E30C1753159A33260073DA67 /* Google-icon128.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1752159A33260073DA67 /* Google-icon128.png */; }; + E30C1754159A33260073DA67 /* Google-icon128.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1752159A33260073DA67 /* Google-icon128.png */; }; + E30C1756159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; + E30C1757159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; + E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; + E30C175A159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; + E30C175C159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; + E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -88,6 +96,10 @@ E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItem.m; sourceTree = ""; }; E30C1748159A22950073DA67 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; E30C1749159A22950073DA67 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; + E30C1752159A33260073DA67 /* Google-icon128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon128.png"; sourceTree = ""; }; + E30C1755159A33C20073DA67 /* Google-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon.png"; sourceTree = ""; }; + E30C1758159A33C80073DA67 /* Google-icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon-iPad.png"; sourceTree = ""; }; + E30C175B159A33D20073DA67 /* Google-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -133,6 +145,7 @@ 0F1328E91206371D00C7C87C /* Images@1x */ = { isa = PBXGroup; children = ( + E30C1755159A33C20073DA67 /* Google-icon.png */, 0F975CCC122B524500F678EB /* Icon.png */, 0F1328EA1206374800C7C87C /* itemImage.png */, ); @@ -142,6 +155,7 @@ 0F2C053E12068241009D2ED9 /* Images@2x */ = { isa = PBXGroup; children = ( + E30C175B159A33D20073DA67 /* Google-icon@2x.png */, 0F975CCD122B524500F678EB /* Icon@2x.png */, 0F2C054712068283009D2ED9 /* itemImage@2x.png */, ); @@ -205,6 +219,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + E30C1752159A33260073DA67 /* Google-icon128.png */, 0F93B7E61213AE4500BA0DB9 /* close.png */, 0F2C05871207A88D009D2ED9 /* launcher.png */, 7DA45DC81316AD6E00D5FA85 /* Images@iPad */, @@ -229,6 +244,7 @@ 7DA45DC81316AD6E00D5FA85 /* Images@iPad */ = { isa = PBXGroup; children = ( + E30C1758159A33C80073DA67 /* Google-icon-iPad.png */, 7DF382D913326D0100738192 /* Icon-iPad.png */, 7DA45DCB1316B0C700D5FA85 /* itemImage-iPad.png */, ); @@ -331,6 +347,10 @@ 0F975CCF122B524500F678EB /* Icon@2x.png in Resources */, 7DA45DCD1316B0C700D5FA85 /* itemImage-iPad.png in Resources */, 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */, + E30C1753159A33260073DA67 /* Google-icon128.png in Resources */, + E30C1756159A33C20073DA67 /* Google-icon.png in Resources */, + E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */, + E30C175C159A33D20073DA67 /* Google-icon@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -339,6 +359,10 @@ buildActionMask = 2147483647; files = ( E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */, + E30C1754159A33260073DA67 /* Google-icon128.png in Resources */, + E30C1757159A33C20073DA67 /* Google-icon.png in Resources */, + E30C175A159A33C80073DA67 /* Google-icon-iPad.png in Resources */, + E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 6426292692a833fbd02b97a05b6673825bbbe647 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 26 Jun 2012 15:09:03 -0400 Subject: [PATCH 07/29] no message --- .../MyLauncher/MyLauncherViewController.m | 17 +++++++++++++++++ .../MyLauncher/MyLauncherViewControllerItem.m | 11 +++++------ myLauncher/Classes/MyLauncherGenericItem.h | 3 --- myLauncher/Classes/MyLauncherGenericItem.m | 13 ++++++++++--- myLauncher/Classes/MyLauncherItem.h | 2 +- myLauncher/Classes/MyLauncherItem.m | 11 ++++++++++- 6 files changed, 43 insertions(+), 14 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index a165c94..4ca1b5d 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -21,6 +21,7 @@ #import "MyLauncherViewController.h" #import "MyLauncherItem.h" +#import "MyLauncherGenericItem.h" @interface MyLauncherViewController () -(NSMutableArray *)savedLauncherItems; @@ -261,6 +262,22 @@ -(NSMutableArray *)savedLauncherItems { target:[item objectForKey:@"controller"] targetTitle:[item objectForKey:@"controllerTitle"] deletable:[[item objectForKey:@"deletable"] boolValue]]]; + } else if ([version intValue] == 3) { + BOOL notGeneric = ![item objectForKey:@"genericDelegate"]; + if (notGeneric) { + [savedPage addObject:[[MyLauncherViewControllerItem alloc] + initWithTitle:[item objectForKey:@"title"] + iPhoneImage:[item objectForKey:@"image"] + iPadImage:[item objectForKey:@"iPadImage"] + target:[item objectForKey:@"controller"] + targetTitle:[item objectForKey:@"controllerTitle"] + deletable:[[item objectForKey:@"deletable"] boolValue]]]; + } else { + [savedPage addObject:[[MyLauncherGenericItem alloc] + initWithTitle:[item objectForKey:@"title"] + delegate:[item objectForKey:@"genericDelegate"] + deletable:[[item objectForKey:@"deletable"] boolValue]]]; + } } } else { [savedPage addObject:[[MyLauncherViewControllerItem alloc] diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 98ef706..72df7ea 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -73,18 +73,17 @@ -(void)selected:(MyLauncherViewController*)parent { [parent launchSelectedItemViewController:controller withTopTitle:_controllerTitle]; } --(NSDictionary*)itemToSave { - NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; - [itemToSave setObject:self.title forKey:@"title"]; +-(NSMutableDictionary*)itemToSave { + NSMutableDictionary *itemToSave = [super itemToSave]; + [itemToSave setObject:_image forKey:@"image"]; [itemToSave setObject:_iPadImage forKey:@"iPadImage"]; - [itemToSave setObject:[NSString stringWithFormat:@"%d", _deletable] forKey:@"deletable"]; [itemToSave setObject:_controllerStr forKey:@"controller"]; [itemToSave setObject:_controllerTitle forKey:@"controllerTitle"]; - [itemToSave setObject:[NSNumber numberWithInt:2] forKey:@"myLauncherViewItemVersion"]; - + return itemToSave; } + #pragma mark - Layout -(void)layoutItem diff --git a/myLauncher/Classes/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncherGenericItem.h index 0f4a18e..f9604ef 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.h +++ b/myLauncher/Classes/MyLauncherGenericItem.h @@ -27,11 +27,8 @@ @interface MyLauncherGenericItem : MyLauncherItem -@property (nonatomic, strong) NSString *title; -@property (nonatomic, strong) UIImage *image; @property (nonatomic, strong) id genericDelegate; - -(id)initWithTitle:(NSString*)title delegate:(id)genericDelegate deletable:(BOOL)deletable; @end diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m index f2ca343..f984aca 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -20,6 +20,9 @@ @implementation MyLauncherGenericItem +@synthesize genericDelegate = _genericDelegate; + + -(id)initWithTitle:(NSString*)title delegate:(id)genericDelegate deletable:(BOOL)deletable { if((self = [super initWithTitle:title deletable:deletable])) { @@ -28,9 +31,6 @@ -(id)initWithTitle:(NSString*)title delegate:(id) return self; } --(NSDictionary*)itemToSave {return [[NSDictionary alloc] init];} - - -(void)selected:(MyLauncherViewController*)parent { [_genericDelegate start]; @@ -38,7 +38,14 @@ -(void)selected:(MyLauncherViewController*)parent { -(UIImage*)icon { return [_genericDelegate icon]; +} + +-(NSMutableDictionary*)itemToSave { + NSMutableDictionary *itemToSave = [super itemToSave]; + + [itemToSave setObject:_genericDelegate forKey:@"genericDelegate"]; + return itemToSave; } @end diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncherItem.h index d8dcd75..d8515ca 100644 --- a/myLauncher/Classes/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncherItem.h @@ -42,7 +42,7 @@ -(id)initWithTitle:(NSString*)title deletable:(BOOL)deletable; --(NSDictionary*)itemToSave; +-(NSMutableDictionary*)itemToSave; -(void)selected:(MyLauncherViewController*)parent; diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncherItem.m index 0c646c7..93c3624 100644 --- a/myLauncher/Classes/MyLauncherItem.m +++ b/myLauncher/Classes/MyLauncherItem.m @@ -43,7 +43,14 @@ -(id)initWithTitle:(NSString*)title deletable:(BOOL)deletable { -(void)selected:(MyLauncherViewController*)parent {} --(NSDictionary*)itemToSave {return nil;} +-(NSMutableDictionary*)itemToSave { + NSMutableDictionary *itemToSave = [[NSMutableDictionary alloc] init]; + [itemToSave setObject:self.title forKey:@"title"]; + [itemToSave setObject:[NSString stringWithFormat:@"%d", _deletable] forKey:@"deletable"]; + [itemToSave setObject:[NSNumber numberWithInt:3] forKey:@"myLauncherViewItemVersion"]; + + return itemToSave; +} -(void)layoutItem { @@ -202,4 +209,6 @@ -(void)setCustomBadge:(CustomBadge *)customBadge { [self layoutItem]; } + + @end From aadf12504cbd37e9517d7d7314280449e0265f20 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Thu, 28 Jun 2012 10:53:15 -0400 Subject: [PATCH 08/29] no message --- myLauncher/Classes/AppDelegate.m | 3 ++- myLauncher/Classes/OpenWebURLItem.m | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/myLauncher/Classes/AppDelegate.m b/myLauncher/Classes/AppDelegate.m index 0e8d075..ee248ab 100644 --- a/myLauncher/Classes/AppDelegate.m +++ b/myLauncher/Classes/AppDelegate.m @@ -37,7 +37,8 @@ - (void)applicationDidFinishLaunching:(UIApplication*)application [[RootViewController alloc] init]]; navigationController.navigationBar.tintColor = COLOR(2, 100, 162); - [window addSubview:navigationController.view]; + + [window setRootViewController:navigationController]; [window makeKeyAndVisible]; [window layoutSubviews]; } diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index fc03346..2ca581e 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -15,7 +15,7 @@ -(void)start { } -(UIImage*)icon { - return [UIImage imageNamed:@"google-icon.png"]; + return [UIImage imageNamed:@"Google-icon.png"]; } @end From f7ac9e7fbd1edad993677b762778785090beba72 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 08:34:28 -0400 Subject: [PATCH 09/29] no message --- myLauncher/Classes/MyLauncher/MyLauncherView.m | 5 ++++- .../Classes/MyLauncher/MyLauncherViewController.m | 10 ++++++++-- myLauncher/Classes/MyLauncherGenericItem.m | 2 ++ myLauncher/Classes/OpenWebURLItem.h | 2 +- myLauncher/Classes/OpenWebURLItem.m | 2 ++ 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index 19cba0e..2031a85 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -800,7 +800,10 @@ -(void)savePages for(MyLauncherItem *item in page) { NSDictionary *itemToSave = [item itemToSave]; - [pageToSave addObject:itemToSave]; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:itemToSave]; + if (data) { + [pageToSave addObject:itemToSave]; + } } [pagesToSave addObject:pageToSave]; } diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index 4ca1b5d..9e7d392 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -305,8 +305,14 @@ -(void)clearSavedLauncherItems { -(id)retrieveFromUserDefaults:(NSString *)key { NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; - if (standardUserDefaults) - return [standardUserDefaults objectForKey:key]; + if (standardUserDefaults) { + NSData *data = [standardUserDefaults objectForKey:key]; + if (data) { + NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + return dic; + } + + } return nil; } diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m index f984aca..1acb139 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -48,4 +48,6 @@ -(NSMutableDictionary*)itemToSave { return itemToSave; } + + @end diff --git a/myLauncher/Classes/OpenWebURLItem.h b/myLauncher/Classes/OpenWebURLItem.h index b4a20b3..093f384 100644 --- a/myLauncher/Classes/OpenWebURLItem.h +++ b/myLauncher/Classes/OpenWebURLItem.h @@ -9,6 +9,6 @@ #import #import "MyLauncherGenericItem.h" -@interface OpenWebURLItem : NSObject +@interface OpenWebURLItem : NSObject @end diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index 2ca581e..1c5d358 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -18,4 +18,6 @@ -(UIImage*)icon { return [UIImage imageNamed:@"Google-icon.png"]; } + + @end From f0761b3c09331c7c31f8cc015a26954cbb072fff Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 11:01:41 -0400 Subject: [PATCH 10/29] no message --- myLauncher/Classes/AppDelegate.m | 3 +- .../Classes/MyLauncher/MyLauncherView.m | 3 +- .../MyLauncher/MyLauncherViewController.m | 42 ++++++++++-------- myLauncher/Classes/MyLauncherGenericItem.m | 3 +- myLauncher/Classes/OpenWebURLItem.h | 5 +++ myLauncher/Classes/OpenWebURLItem.m | 26 ++++++++++- myLauncher/Classes/RootViewController.m | 3 +- myLauncher/Google-icon128.png | Bin 16084 -> 0 bytes .../MyLauncher.xcodeproj/project.pbxproj | 7 +-- 9 files changed, 59 insertions(+), 33 deletions(-) delete mode 100644 myLauncher/Google-icon128.png diff --git a/myLauncher/Classes/AppDelegate.m b/myLauncher/Classes/AppDelegate.m index ee248ab..30eeae1 100644 --- a/myLauncher/Classes/AppDelegate.m +++ b/myLauncher/Classes/AppDelegate.m @@ -37,10 +37,9 @@ - (void)applicationDidFinishLaunching:(UIApplication*)application [[RootViewController alloc] init]]; navigationController.navigationBar.tintColor = COLOR(2, 100, 162); - [window setRootViewController:navigationController]; [window makeKeyAndVisible]; - [window layoutSubviews]; + //[window layoutSubviews]; } @end \ No newline at end of file diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index 2031a85..b4b2d77 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -800,8 +800,7 @@ -(void)savePages for(MyLauncherItem *item in page) { NSDictionary *itemToSave = [item itemToSave]; - NSData *data = [NSKeyedArchiver archivedDataWithRootObject:itemToSave]; - if (data) { + if (itemToSave) { [pageToSave addObject:itemToSave]; } } diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m index 9e7d392..539ba58 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.m @@ -240,6 +240,25 @@ -(void)navigationController:(UINavigationController *)navigationController didSh #pragma mark - myLauncher caching +- (void)processVersion3Item:(NSDictionary *)item savedPage:(NSMutableArray *)savedPage { + BOOL notGeneric = ![item objectForKey:@"genericDelegate"]; + if (notGeneric) { + [savedPage addObject:[[MyLauncherViewControllerItem alloc] + initWithTitle:[item objectForKey:@"title"] + iPhoneImage:[item objectForKey:@"image"] + iPadImage:[item objectForKey:@"iPadImage"] + target:[item objectForKey:@"controller"] + targetTitle:[item objectForKey:@"controllerTitle"] + deletable:[[item objectForKey:@"deletable"] boolValue]]]; + } else { + id delegate = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData*)[item objectForKey:@"genericDelegate"]]; + [savedPage addObject:[[MyLauncherGenericItem alloc] + initWithTitle:[item objectForKey:@"title"] + delegate:delegate + deletable:[[item objectForKey:@"deletable"] boolValue]]]; + } +} + -(NSMutableArray *)savedLauncherItems { NSArray *savedPages = (NSArray *)[self retrieveFromUserDefaults:@"myLauncherView"]; @@ -263,21 +282,7 @@ -(NSMutableArray *)savedLauncherItems { targetTitle:[item objectForKey:@"controllerTitle"] deletable:[[item objectForKey:@"deletable"] boolValue]]]; } else if ([version intValue] == 3) { - BOOL notGeneric = ![item objectForKey:@"genericDelegate"]; - if (notGeneric) { - [savedPage addObject:[[MyLauncherViewControllerItem alloc] - initWithTitle:[item objectForKey:@"title"] - iPhoneImage:[item objectForKey:@"image"] - iPadImage:[item objectForKey:@"iPadImage"] - target:[item objectForKey:@"controller"] - targetTitle:[item objectForKey:@"controllerTitle"] - deletable:[[item objectForKey:@"deletable"] boolValue]]]; - } else { - [savedPage addObject:[[MyLauncherGenericItem alloc] - initWithTitle:[item objectForKey:@"title"] - delegate:[item objectForKey:@"genericDelegate"] - deletable:[[item objectForKey:@"deletable"] boolValue]]]; - } + [self processVersion3Item:item savedPage:savedPage]; } } else { [savedPage addObject:[[MyLauncherViewControllerItem alloc] @@ -306,10 +311,9 @@ -(id)retrieveFromUserDefaults:(NSString *)key { NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; if (standardUserDefaults) { - NSData *data = [standardUserDefaults objectForKey:key]; - if (data) { - NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:data]; - return dic; + NSDictionary *dic = [standardUserDefaults objectForKey:key]; + if (dic) { + return dic; } } diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncherGenericItem.m index 1acb139..f52546f 100644 --- a/myLauncher/Classes/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncherGenericItem.m @@ -43,7 +43,8 @@ -(UIImage*)icon { -(NSMutableDictionary*)itemToSave { NSMutableDictionary *itemToSave = [super itemToSave]; - [itemToSave setObject:_genericDelegate forKey:@"genericDelegate"]; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_genericDelegate]; + [itemToSave setObject:data forKey:@"genericDelegate"]; return itemToSave; } diff --git a/myLauncher/Classes/OpenWebURLItem.h b/myLauncher/Classes/OpenWebURLItem.h index 093f384..6d1f9eb 100644 --- a/myLauncher/Classes/OpenWebURLItem.h +++ b/myLauncher/Classes/OpenWebURLItem.h @@ -11,4 +11,9 @@ @interface OpenWebURLItem : NSObject +@property(strong, nonatomic) NSString *url; +@property(strong, nonatomic) UIImage *icon; + +-(id) initWithURL:(NSString*)url andIcon:(UIImage*)icon; + @end diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index 1c5d358..d2cd0fe 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -10,14 +10,36 @@ @implementation OpenWebURLItem +@synthesize url = _url; +@synthesize icon = _icon; + +-(id)initWithURL:(NSString*)url andIcon:(UIImage*)icon { + if (self = [super init]) { + _url = url; + _icon = icon; + } + return self; +} + -(void)start { - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:_url]]; } -(UIImage*)icon { - return [UIImage imageNamed:@"Google-icon.png"]; + return _icon; } +- (id)initWithCoder:(NSCoder*)coder { + _url = [coder decodeObjectForKey:@"URL"]; + _icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + return self; +} +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:_url forKey:@"URL"]; + + NSData *data = UIImagePNGRepresentation(_icon); + [coder encodeObject:data forKey:@"icon"]; +} @end diff --git a/myLauncher/Classes/RootViewController.m b/myLauncher/Classes/RootViewController.m index c7ffc0b..fad23d0 100644 --- a/myLauncher/Classes/RootViewController.m +++ b/myLauncher/Classes/RootViewController.m @@ -41,7 +41,8 @@ -(void)loadView if(![self hasSavedLauncherItems]) { - OpenWebURLItem *urlItem = [[OpenWebURLItem alloc] init]; + + OpenWebURLItem *urlItem = [[OpenWebURLItem alloc] initWithURL:@"http://google.com" andIcon:[UIImage imageNamed:@"Google-icon.png"]]; [self.launcherView setPages:[NSMutableArray arrayWithObjects: [NSMutableArray arrayWithObjects: diff --git a/myLauncher/Google-icon128.png b/myLauncher/Google-icon128.png deleted file mode 100644 index f03f57fc87f92ff42ae3a243017c1c07971f4d34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16084 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 diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 1a9857e..be1b8a1 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -39,8 +39,6 @@ E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; - E30C1753159A33260073DA67 /* Google-icon128.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1752159A33260073DA67 /* Google-icon128.png */; }; - E30C1754159A33260073DA67 /* Google-icon128.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1752159A33260073DA67 /* Google-icon128.png */; }; E30C1756159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1757159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; @@ -96,7 +94,6 @@ E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItem.m; sourceTree = ""; }; E30C1748159A22950073DA67 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; E30C1749159A22950073DA67 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; - E30C1752159A33260073DA67 /* Google-icon128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon128.png"; sourceTree = ""; }; E30C1755159A33C20073DA67 /* Google-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon.png"; sourceTree = ""; }; E30C1758159A33C80073DA67 /* Google-icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon-iPad.png"; sourceTree = ""; }; E30C175B159A33D20073DA67 /* Google-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon@2x.png"; sourceTree = ""; }; @@ -219,7 +216,6 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - E30C1752159A33260073DA67 /* Google-icon128.png */, 0F93B7E61213AE4500BA0DB9 /* close.png */, 0F2C05871207A88D009D2ED9 /* launcher.png */, 7DA45DC81316AD6E00D5FA85 /* Images@iPad */, @@ -347,7 +343,6 @@ 0F975CCF122B524500F678EB /* Icon@2x.png in Resources */, 7DA45DCD1316B0C700D5FA85 /* itemImage-iPad.png in Resources */, 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */, - E30C1753159A33260073DA67 /* Google-icon128.png in Resources */, E30C1756159A33C20073DA67 /* Google-icon.png in Resources */, E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */, E30C175C159A33D20073DA67 /* Google-icon@2x.png in Resources */, @@ -359,7 +354,6 @@ buildActionMask = 2147483647; files = ( E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */, - E30C1754159A33260073DA67 /* Google-icon128.png in Resources */, E30C1757159A33C20073DA67 /* Google-icon.png in Resources */, E30C175A159A33C80073DA67 /* Google-icon-iPad.png in Resources */, E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */, @@ -570,6 +564,7 @@ E30C173C1599E5EB0073DA67 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; From 55197a2b7a2196e45ab0643abb58ef472f938105 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 11:26:13 -0400 Subject: [PATCH 11/29] no message --- myLauncher/Classes/AppDelegate.m | 3 ++- myLauncher/Classes/MyLauncher/MyLauncherView.h | 1 + myLauncher/Classes/MyLauncher/MyLauncherView.m | 1 + myLauncher/Classes/OpenWebURLItem.h | 17 ++++++++++++++--- myLauncher/Classes/OpenWebURLItem.m | 17 ++++++++++++++--- myLauncher/Classes/RootViewController.m | 10 +++++++++- 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/myLauncher/Classes/AppDelegate.m b/myLauncher/Classes/AppDelegate.m index 30eeae1..3ea70e4 100644 --- a/myLauncher/Classes/AppDelegate.m +++ b/myLauncher/Classes/AppDelegate.m @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -39,7 +40,7 @@ - (void)applicationDidFinishLaunching:(UIApplication*)application [window setRootViewController:navigationController]; [window makeKeyAndVisible]; - //[window layoutSubviews]; + } @end \ No newline at end of file diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.h b/myLauncher/Classes/MyLauncher/MyLauncherView.h index 1c5b99a..c895418 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.h @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index b4b2d77..500c9c4 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/myLauncher/Classes/OpenWebURLItem.h b/myLauncher/Classes/OpenWebURLItem.h index 6d1f9eb..8ce3e7c 100644 --- a/myLauncher/Classes/OpenWebURLItem.h +++ b/myLauncher/Classes/OpenWebURLItem.h @@ -1,9 +1,20 @@ // -// OpenWebURLItem.h -// MyLauncher +// MyLauncherGenericItem.h +// @rigoneri // -// Created by Nicolas Desjardins on 2012-06-26. +// Copyright 2012 Nicolas Desjardins // +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // #import diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index d2cd0fe..3c1b949 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -1,9 +1,20 @@ // -// OpenWebURLItem.m -// MyLauncher +// MyLauncherGenericItem.m +// @rigoneri // -// Created by Nicolas Desjardins on 2012-06-26. +// Copyright 2012 Nicolas Desjardins // +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // #import "OpenWebURLItem.h" diff --git a/myLauncher/Classes/RootViewController.m b/myLauncher/Classes/RootViewController.m index fad23d0..e2cdca2 100644 --- a/myLauncher/Classes/RootViewController.m +++ b/myLauncher/Classes/RootViewController.m @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -41,7 +42,6 @@ -(void)loadView if(![self hasSavedLauncherItems]) { - OpenWebURLItem *urlItem = [[OpenWebURLItem alloc] initWithURL:@"http://google.com" andIcon:[UIImage imageNamed:@"Google-icon.png"]]; [self.launcherView setPages:[NSMutableArray arrayWithObjects: @@ -49,36 +49,42 @@ -(void)loadView [[MyLauncherGenericItem alloc] initWithTitle:@"google" delegate:urlItem deletable:NO], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 2" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 2 View" deletable:NO], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 3" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 3 View" deletable:YES], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 4" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 4 View" deletable:NO], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 5" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 5 View" deletable:YES], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 6" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 6 View" deletable:NO], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 7" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" @@ -93,12 +99,14 @@ -(void)loadView target:@"ItemViewController" targetTitle:@"Item 8 View" deletable:NO], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 9" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" target:@"ItemViewController" targetTitle:@"Item 9 View" deletable:YES], + [[MyLauncherViewControllerItem alloc] initWithTitle:@"Item 10" iPhoneImage:@"itemImage" iPadImage:@"itemImage-iPad" From 842c623274bd87956e4450a24c6afe1238535ca0 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 13:05:06 -0400 Subject: [PATCH 12/29] format --- myLauncher/Classes/OpenWebURLItem.m | 1 - 1 file changed, 1 deletion(-) diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m index 3c1b949..9fc078e 100644 --- a/myLauncher/Classes/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -52,5 +52,4 @@ - (void)encodeWithCoder:(NSCoder*)coder { NSData *data = UIImagePNGRepresentation(_icon); [coder encodeObject:data forKey:@"icon"]; } - @end From d7504d9f076fc0478f92926fbdd425361ab19868 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 13:21:51 -0400 Subject: [PATCH 13/29] test --- myLauncher/Classes/MyLauncher/MyLauncherViewController.h | 1 + 1 file changed, 1 insertion(+) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index 7a05758..37a19d6 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -30,6 +30,7 @@ @property (nonatomic, strong) MyLauncherView *launcherView; @property (nonatomic, strong) NSMutableDictionary *appControllers; + -(BOOL)hasSavedLauncherItems; -(void)clearSavedLauncherItems; From 1945dae1faba228f4de0656834ebb3a4f5fff276 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 13:23:43 -0400 Subject: [PATCH 14/29] test2 --- myLauncher/Classes/MyLauncher/MyLauncherViewController.h | 1 - 1 file changed, 1 deletion(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index 37a19d6..7a05758 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -30,7 +30,6 @@ @property (nonatomic, strong) MyLauncherView *launcherView; @property (nonatomic, strong) NSMutableDictionary *appControllers; - -(BOOL)hasSavedLauncherItems; -(void)clearSavedLauncherItems; From ec929863dca575065c9d675b4e051a367e17a0fc Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Fri, 29 Jun 2012 13:31:00 -0400 Subject: [PATCH 15/29] test3 --- myLauncher/Classes/MyLauncher/MyLauncherViewController.h | 1 + 1 file changed, 1 insertion(+) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h index 7a05758..27453ac 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewController.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewController.h @@ -38,4 +38,5 @@ -(void)launchSelectedItemViewController:(UIViewController*)itemViewController withTopTitle:(NSString*)title; + @end From 32a176403b028a8c546016d0300b5a81a26761fa Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 08:48:41 -0400 Subject: [PATCH 16/29] pmove generic item file --- .../MyLauncher.xcodeproj/project.pbxproj | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index be1b8a1..ce6ee2d 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -33,10 +33,6 @@ E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E30C17341599E5EB0073DA67 /* InfoPlist.strings */; }; E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; - E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; - E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17411599F29B0073DA67 /* MyLauncherItem.m */; }; - E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; - E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */; }; E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; E30C1756159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; @@ -45,6 +41,8 @@ E30C175A159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; E30C175C159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; + E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; + E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -57,7 +55,7 @@ 0F975C2C122B0E8300F678EB /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 0F975C2D122B0E8300F678EB /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 0F975C8F122B4FAE00F678EB /* MyLauncherViewControllerItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherViewControllerItem.h; path = MyLauncher/MyLauncherViewControllerItem.h; sourceTree = ""; }; - 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = MyLauncherViewControllerItem.m; path = MyLauncher/MyLauncherViewControllerItem.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = MyLauncherViewControllerItem.m; path = MyLauncher/MyLauncherViewControllerItem.m; sourceTree = ""; }; 0F975C91122B4FAE00F678EB /* MyLauncherPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherPageControl.h; path = MyLauncher/MyLauncherPageControl.h; sourceTree = ""; }; 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherPageControl.m; path = MyLauncher/MyLauncherPageControl.m; sourceTree = ""; }; 0F975C93122B4FAE00F678EB /* MyLauncherScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherScrollView.h; path = MyLauncher/MyLauncherScrollView.h; sourceTree = ""; }; @@ -88,15 +86,15 @@ E30C17371599E5EB0073DA67 /* MyLauncherTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLauncherTests.h; sourceTree = ""; }; E30C17381599E5EB0073DA67 /* MyLauncherTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLauncherTests.m; sourceTree = ""; }; E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; - E30C17401599F29B0073DA67 /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherItem.h; sourceTree = ""; }; - E30C17411599F29B0073DA67 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherItem.m; sourceTree = ""; }; - E30C1744159A04A10073DA67 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItem.h; sourceTree = ""; }; - E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItem.m; sourceTree = ""; }; E30C1748159A22950073DA67 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; E30C1749159A22950073DA67 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; E30C1755159A33C20073DA67 /* Google-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon.png"; sourceTree = ""; }; E30C1758159A33C80073DA67 /* Google-icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon-iPad.png"; sourceTree = ""; }; E30C175B159A33D20073DA67 /* Google-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon@2x.png"; sourceTree = ""; }; + E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherItem.h; path = MyLauncher/MyLauncherItem.h; sourceTree = ""; }; + E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherItem.m; path = MyLauncher/MyLauncherItem.m; sourceTree = ""; }; + E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherGenericItem.m; path = MyLauncher/MyLauncherGenericItem.m; sourceTree = ""; }; + E3CCD6A015A31E2F005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = ../../../../bitbucket/iOSLauncher/LanceurMobile/LanceurMobile/MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -162,16 +160,16 @@ 0F975B02122AFC3B00F678EB /* MyLauncher */ = { isa = PBXGroup; children = ( + E3CCD6A015A31E2F005FC746 /* MyLauncherGenericItem.h */, + E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */, + E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */, + E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */, 7DC0590D1397988B00E0EAA9 /* CustomBadge.h */, 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */, 0F975C97122B4FAE00F678EB /* MyLauncherViewController.h */, 0F975C98122B4FAE00F678EB /* MyLauncherViewController.m */, 0F975C95122B4FAE00F678EB /* MyLauncherView.h */, 0F975C96122B4FAE00F678EB /* MyLauncherView.m */, - E30C17401599F29B0073DA67 /* MyLauncherItem.h */, - E30C17411599F29B0073DA67 /* MyLauncherItem.m */, - E30C1744159A04A10073DA67 /* MyLauncherGenericItem.h */, - E30C1745159A04A10073DA67 /* MyLauncherGenericItem.m */, 0F975C8F122B4FAE00F678EB /* MyLauncherViewControllerItem.h */, 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */, 0F975C93122B4FAE00F678EB /* MyLauncherScrollView.h */, @@ -393,9 +391,9 @@ 0F975C9C122B4FAE00F678EB /* MyLauncherView.m in Sources */, 0F975C9D122B4FAE00F678EB /* MyLauncherViewController.m in Sources */, 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, - E30C17421599F29B0073DA67 /* MyLauncherItem.m in Sources */, - E30C1746159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */, + E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */, + E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -404,8 +402,6 @@ buildActionMask = 2147483647; files = ( E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, - E30C17431599F29B0073DA67 /* MyLauncherItem.m in Sources */, - E30C1747159A04A10073DA67 /* MyLauncherGenericItem.m in Sources */, E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From aa6bd59e3b6cd2454026fdd09915312de4243091 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 08:49:04 -0400 Subject: [PATCH 17/29] generic item file move --- myLauncher/Classes/MyLauncher/CustomBadge.m | 5 ----- 1 file changed, 5 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/CustomBadge.m b/myLauncher/Classes/MyLauncher/CustomBadge.m index 6771b17..7b8f240 100644 --- a/myLauncher/Classes/MyLauncher/CustomBadge.m +++ b/myLauncher/Classes/MyLauncher/CustomBadge.m @@ -111,10 +111,6 @@ + (CustomBadge*) customBadgeWithString:(NSString *)badgeString withStringColor:( return [[self alloc] initWithString:badgeString withStringColor:stringColor withInsetColor:insetColor withBadgeFrame:badgeFrameYesNo withBadgeFrameColor:frameColor withScale:scale withShining:shining]; } - - - - // Draws the Badge with Quartz -(void) drawRoundedRectWithContext:(CGContextRef)context withRect:(CGRect)rect { @@ -211,7 +207,6 @@ -(void) drawFrameWithContext:(CGContextRef)context withRect:(CGRect)rect CGContextStrokePath(context); } - - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); From d5aabdcacb205cabd76a1e0b8fb0939441827248 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 08:49:24 -0400 Subject: [PATCH 18/29] no message --- myLauncher/Classes/{ => MyLauncher}/MyLauncherGenericItem.h | 0 myLauncher/Classes/{ => MyLauncher}/MyLauncherGenericItem.m | 0 myLauncher/Classes/{ => MyLauncher}/MyLauncherItem.h | 0 myLauncher/Classes/{ => MyLauncher}/MyLauncherItem.m | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename myLauncher/Classes/{ => MyLauncher}/MyLauncherGenericItem.h (100%) rename myLauncher/Classes/{ => MyLauncher}/MyLauncherGenericItem.m (100%) rename myLauncher/Classes/{ => MyLauncher}/MyLauncherItem.h (100%) rename myLauncher/Classes/{ => MyLauncher}/MyLauncherItem.m (100%) diff --git a/myLauncher/Classes/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h similarity index 100% rename from myLauncher/Classes/MyLauncherGenericItem.h rename to myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h diff --git a/myLauncher/Classes/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m similarity index 100% rename from myLauncher/Classes/MyLauncherGenericItem.m rename to myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m diff --git a/myLauncher/Classes/MyLauncherItem.h b/myLauncher/Classes/MyLauncher/MyLauncherItem.h similarity index 100% rename from myLauncher/Classes/MyLauncherItem.h rename to myLauncher/Classes/MyLauncher/MyLauncherItem.h diff --git a/myLauncher/Classes/MyLauncherItem.m b/myLauncher/Classes/MyLauncher/MyLauncherItem.m similarity index 100% rename from myLauncher/Classes/MyLauncherItem.m rename to myLauncher/Classes/MyLauncher/MyLauncherItem.m From 370c6e584b086b812fb10085ddd2dd096cb13bae Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 09:08:23 -0400 Subject: [PATCH 19/29] no message --- myLauncher/MyLauncher.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index ce6ee2d..3be7a78 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -94,7 +94,7 @@ E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherItem.h; path = MyLauncher/MyLauncherItem.h; sourceTree = ""; }; E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherItem.m; path = MyLauncher/MyLauncherItem.m; sourceTree = ""; }; E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherGenericItem.m; path = MyLauncher/MyLauncherGenericItem.m; sourceTree = ""; }; - E3CCD6A015A31E2F005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = ../../../../bitbucket/iOSLauncher/LanceurMobile/LanceurMobile/MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; + E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -160,7 +160,7 @@ 0F975B02122AFC3B00F678EB /* MyLauncher */ = { isa = PBXGroup; children = ( - E3CCD6A015A31E2F005FC746 /* MyLauncherGenericItem.h */, + E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */, E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */, E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */, E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */, From 5210024db8a60073b84063eb39d4cfa721b80c30 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 09:32:09 -0400 Subject: [PATCH 20/29] no message --- .../Classes/{ => MyLauncher}/OpenWebURLItem.h | 0 .../Classes/{ => MyLauncher}/OpenWebURLItem.m | 0 myLauncher/MyLauncher.xcodeproj/project.pbxproj | 14 ++++++-------- 3 files changed, 6 insertions(+), 8 deletions(-) rename myLauncher/Classes/{ => MyLauncher}/OpenWebURLItem.h (100%) rename myLauncher/Classes/{ => MyLauncher}/OpenWebURLItem.m (100%) diff --git a/myLauncher/Classes/OpenWebURLItem.h b/myLauncher/Classes/MyLauncher/OpenWebURLItem.h similarity index 100% rename from myLauncher/Classes/OpenWebURLItem.h rename to myLauncher/Classes/MyLauncher/OpenWebURLItem.h diff --git a/myLauncher/Classes/OpenWebURLItem.m b/myLauncher/Classes/MyLauncher/OpenWebURLItem.m similarity index 100% rename from myLauncher/Classes/OpenWebURLItem.m rename to myLauncher/Classes/MyLauncher/OpenWebURLItem.m diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 3be7a78..2a22c2d 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -33,8 +33,6 @@ E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E30C17341599E5EB0073DA67 /* InfoPlist.strings */; }; E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; - E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; - E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C1749159A22950073DA67 /* OpenWebURLItem.m */; }; E30C1756159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1757159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; @@ -43,6 +41,7 @@ E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; + E3CCD6E915A32B0D005FC746 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -86,8 +85,6 @@ E30C17371599E5EB0073DA67 /* MyLauncherTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLauncherTests.h; sourceTree = ""; }; E30C17381599E5EB0073DA67 /* MyLauncherTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLauncherTests.m; sourceTree = ""; }; E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; - E30C1748159A22950073DA67 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; - E30C1749159A22950073DA67 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; E30C1755159A33C20073DA67 /* Google-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon.png"; sourceTree = ""; }; E30C1758159A33C80073DA67 /* Google-icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon-iPad.png"; sourceTree = ""; }; E30C175B159A33D20073DA67 /* Google-icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon@2x.png"; sourceTree = ""; }; @@ -95,6 +92,8 @@ E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherItem.m; path = MyLauncher/MyLauncherItem.m; sourceTree = ""; }; E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherGenericItem.m; path = MyLauncher/MyLauncherGenericItem.m; sourceTree = ""; }; E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; + E3CCD6E715A32B0D005FC746 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenWebURLItem.h; path = MyLauncher/OpenWebURLItem.h; sourceTree = ""; }; + E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenWebURLItem.m; path = MyLauncher/OpenWebURLItem.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -131,8 +130,6 @@ 0F975C2D122B0E8300F678EB /* RootViewController.m */, 0F1328EC120637BC00C7C87C /* ItemViewController.h */, 0F1328ED120637BC00C7C87C /* ItemViewController.m */, - E30C1748159A22950073DA67 /* OpenWebURLItem.h */, - E30C1749159A22950073DA67 /* OpenWebURLItem.m */, ); path = Classes; sourceTree = ""; @@ -160,6 +157,8 @@ 0F975B02122AFC3B00F678EB /* MyLauncher */ = { isa = PBXGroup; children = ( + E3CCD6E715A32B0D005FC746 /* OpenWebURLItem.h */, + E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */, E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */, E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */, E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */, @@ -391,9 +390,9 @@ 0F975C9C122B4FAE00F678EB /* MyLauncherView.m in Sources */, 0F975C9D122B4FAE00F678EB /* MyLauncherViewController.m in Sources */, 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, - E30C174A159A22960073DA67 /* OpenWebURLItem.m in Sources */, E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */, E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */, + E3CCD6E915A32B0D005FC746 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -402,7 +401,6 @@ buildActionMask = 2147483647; files = ( E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, - E30C174B159A22960073DA67 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From fec7225b9ae193e59bef7c9ee0513e46f655b80c Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Tue, 3 Jul 2012 09:51:03 -0400 Subject: [PATCH 21/29] no message --- myLauncher/Classes/MyLauncher/OpenWebURLItem.h | 1 - myLauncher/Classes/MyLauncher/OpenWebURLItem.m | 1 - myLauncher/Classes/RootViewController.h | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/OpenWebURLItem.h b/myLauncher/Classes/MyLauncher/OpenWebURLItem.h index 8ce3e7c..bf5bc91 100644 --- a/myLauncher/Classes/MyLauncher/OpenWebURLItem.h +++ b/myLauncher/Classes/MyLauncher/OpenWebURLItem.h @@ -1,6 +1,5 @@ // // MyLauncherGenericItem.h -// @rigoneri // // Copyright 2012 Nicolas Desjardins // diff --git a/myLauncher/Classes/MyLauncher/OpenWebURLItem.m b/myLauncher/Classes/MyLauncher/OpenWebURLItem.m index 9fc078e..fcb1481 100644 --- a/myLauncher/Classes/MyLauncher/OpenWebURLItem.m +++ b/myLauncher/Classes/MyLauncher/OpenWebURLItem.m @@ -1,6 +1,5 @@ // // MyLauncherGenericItem.m -// @rigoneri // // Copyright 2012 Nicolas Desjardins // diff --git a/myLauncher/Classes/RootViewController.h b/myLauncher/Classes/RootViewController.h index 1c79a0c..6681c39 100644 --- a/myLauncher/Classes/RootViewController.h +++ b/myLauncher/Classes/RootViewController.h @@ -4,6 +4,7 @@ // // Copyright 2010 Rodrigo Neri // Copyright 2011 David Jarrett +// Copyright 2012 Nicolas Desjardins // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From e21ff7808486aafc58f610f05e6b79a45db22989 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Wed, 4 Jul 2012 12:13:18 -0400 Subject: [PATCH 22/29] no message --- .../MyLauncher.xcodeproj/project.pbxproj | 64 ++++++++++++++-- myLauncher/MyLauncherTests/MyLauncherTests.m | 32 -------- ...MyLauncherTests.h => OpenWebURLItemTest.h} | 2 +- .../MyLauncherTests/OpenWebURLItemTest.m | 70 ++++++++++++++++++ .../NSNotificationCenter+OCMAdditions.h | 15 ++++ myLauncher/OCMock/OCMArg.h | 33 +++++++++ myLauncher/OCMock/OCMConstraint.h | 64 ++++++++++++++++ myLauncher/OCMock/OCMock.h | 10 +++ myLauncher/OCMock/OCMockObject.h | 43 +++++++++++ myLauncher/OCMock/OCMockRecorder.h | 32 ++++++++ myLauncher/libOCMock.a | Bin 0 -> 454368 bytes 11 files changed, 326 insertions(+), 39 deletions(-) delete mode 100644 myLauncher/MyLauncherTests/MyLauncherTests.m rename myLauncher/MyLauncherTests/{MyLauncherTests.h => OpenWebURLItemTest.h} (77%) create mode 100644 myLauncher/MyLauncherTests/OpenWebURLItemTest.m create mode 100644 myLauncher/OCMock/NSNotificationCenter+OCMAdditions.h create mode 100644 myLauncher/OCMock/OCMArg.h create mode 100644 myLauncher/OCMock/OCMConstraint.h create mode 100644 myLauncher/OCMock/OCMock.h create mode 100644 myLauncher/OCMock/OCMockObject.h create mode 100644 myLauncher/OCMock/OCMockRecorder.h create mode 100644 myLauncher/libOCMock.a diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 2a22c2d..4b0de6d 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -28,11 +28,13 @@ 7DA45DCD1316B0C700D5FA85 /* itemImage-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DA45DCB1316B0C700D5FA85 /* itemImage-iPad.png */; }; 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */; }; 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; + E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; + E30AA30F15A4993100B6078B /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E30AA30715A4993100B6078B /* libOCMock.a */; }; E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */; }; E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E30C17341599E5EB0073DA67 /* InfoPlist.strings */; }; - E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* MyLauncherTests.m */; }; + E30C17391599E5EB0073DA67 /* OpenWebURLItemTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E30C17381599E5EB0073DA67 /* OpenWebURLItemTest.m */; }; E30C1756159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1757159A33C20073DA67 /* Google-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1755159A33C20073DA67 /* Google-icon.png */; }; E30C1759159A33C80073DA67 /* Google-icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C1758159A33C80073DA67 /* Google-icon-iPad.png */; }; @@ -78,12 +80,19 @@ 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CustomBadge.m; path = MyLauncher/CustomBadge.m; sourceTree = ""; }; 7DF382D913326D0100738192 /* Icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iPad.png"; path = "imgs/Icon-iPad.png"; sourceTree = ""; }; 8D1107310486CEB800E47090 /* MyLauncher-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MyLauncher-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + E30AA30715A4993100B6078B /* libOCMock.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libOCMock.a; sourceTree = ""; }; + E30AA30915A4993100B6078B /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+OCMAdditions.h"; sourceTree = ""; }; + E30AA30A15A4993100B6078B /* OCMArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMArg.h; sourceTree = ""; }; + E30AA30B15A4993100B6078B /* OCMConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMConstraint.h; sourceTree = ""; }; + E30AA30C15A4993100B6078B /* OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMock.h; sourceTree = ""; }; + E30AA30D15A4993100B6078B /* OCMockObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockObject.h; sourceTree = ""; }; + E30AA30E15A4993100B6078B /* OCMockRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockRecorder.h; sourceTree = ""; }; E30C172C1599E5EB0073DA67 /* MyLauncherTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MyLauncherTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; E30C17331599E5EB0073DA67 /* MyLauncherTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MyLauncherTests-Info.plist"; sourceTree = ""; }; E30C17351599E5EB0073DA67 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - E30C17371599E5EB0073DA67 /* MyLauncherTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyLauncherTests.h; sourceTree = ""; }; - E30C17381599E5EB0073DA67 /* MyLauncherTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyLauncherTests.m; sourceTree = ""; }; + E30C17371599E5EB0073DA67 /* OpenWebURLItemTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItemTest.h; sourceTree = ""; }; + E30C17381599E5EB0073DA67 /* OpenWebURLItemTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItemTest.m; sourceTree = ""; }; E30C173A1599E5EB0073DA67 /* MyLauncherTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MyLauncherTests-Prefix.pch"; sourceTree = ""; }; E30C1755159A33C20073DA67 /* Google-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon.png"; sourceTree = ""; }; E30C1758159A33C80073DA67 /* Google-icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Google-icon-iPad.png"; sourceTree = ""; }; @@ -114,6 +123,7 @@ E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */, E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */, E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */, + E30AA30F15A4993100B6078B /* libOCMock.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -226,6 +236,8 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + E30AA30715A4993100B6078B /* libOCMock.a */, + E30AA30815A4993100B6078B /* OCMock */, 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765FC0DF74451002DB57D /* CoreGraphics.framework */, @@ -244,11 +256,24 @@ name = "Images@iPad"; sourceTree = ""; }; + E30AA30815A4993100B6078B /* OCMock */ = { + isa = PBXGroup; + children = ( + E30AA30915A4993100B6078B /* NSNotificationCenter+OCMAdditions.h */, + E30AA30A15A4993100B6078B /* OCMArg.h */, + E30AA30B15A4993100B6078B /* OCMConstraint.h */, + E30AA30C15A4993100B6078B /* OCMock.h */, + E30AA30D15A4993100B6078B /* OCMockObject.h */, + E30AA30E15A4993100B6078B /* OCMockRecorder.h */, + ); + path = OCMock; + sourceTree = ""; + }; E30C17311599E5EB0073DA67 /* MyLauncherTests */ = { isa = PBXGroup; children = ( - E30C17371599E5EB0073DA67 /* MyLauncherTests.h */, - E30C17381599E5EB0073DA67 /* MyLauncherTests.m */, + E30C17371599E5EB0073DA67 /* OpenWebURLItemTest.h */, + E30C17381599E5EB0073DA67 /* OpenWebURLItemTest.m */, E30C17321599E5EB0073DA67 /* Supporting Files */, ); path = MyLauncherTests; @@ -400,7 +425,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E30C17391599E5EB0073DA67 /* MyLauncherTests.m in Sources */, + E30C17391599E5EB0073DA67 /* OpenWebURLItemTest.m in Sources */, + E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -500,8 +526,21 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + OTHER_LDFLAGS = ( + "-force_load", + "\"$(SRCROOT)/libOCMock.a\"", + "-ObjC", + ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = octest; }; @@ -522,8 +561,21 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "MyLauncherTests/MyLauncherTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + OTHER_LDFLAGS = ( + "-force_load", + "\"$(SRCROOT)/libOCMock.a\"", + "-ObjC", + ); PRODUCT_NAME = "$(TARGET_NAME)"; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = octest; diff --git a/myLauncher/MyLauncherTests/MyLauncherTests.m b/myLauncher/MyLauncherTests/MyLauncherTests.m deleted file mode 100644 index f3eb7d2..0000000 --- a/myLauncher/MyLauncherTests/MyLauncherTests.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// MyLauncherTests.m -// MyLauncherTests -// -// Created by Nicolas Desjardins on 2012-06-26. -// -// - -#import "MyLauncherTests.h" - -@implementation MyLauncherTests - -- (void)setUp -{ - [super setUp]; - - // Set-up code here. -} - -- (void)tearDown -{ - // Tear-down code here. - - [super tearDown]; -} - -- (void)testExample -{ - STFail(@"Unit tests are not implemented yet in MyLauncherTests"); -} - -@end diff --git a/myLauncher/MyLauncherTests/MyLauncherTests.h b/myLauncher/MyLauncherTests/OpenWebURLItemTest.h similarity index 77% rename from myLauncher/MyLauncherTests/MyLauncherTests.h rename to myLauncher/MyLauncherTests/OpenWebURLItemTest.h index 00218e7..4222fe1 100644 --- a/myLauncher/MyLauncherTests/MyLauncherTests.h +++ b/myLauncher/MyLauncherTests/OpenWebURLItemTest.h @@ -8,6 +8,6 @@ #import -@interface MyLauncherTests : SenTestCase +@interface OpenWebURLItemTest : SenTestCase @end diff --git a/myLauncher/MyLauncherTests/OpenWebURLItemTest.m b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m new file mode 100644 index 0000000..cd77e66 --- /dev/null +++ b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m @@ -0,0 +1,70 @@ +// +// MyLauncherTests.m +// MyLauncherTests +// +// Created by Nicolas Desjardins on 2012-06-26. +// +// + +#import "OpenWebURLItemTest.h" +#import "OpenWebURLItem.h" +#import "OCMockObject.h" + + +@interface OpenWebURLItemTest(){ + UIImage *icon; + OpenWebURLItem *webItem; +} + +@end + +@implementation OpenWebURLItemTest + +- (void)setUp +{ + [super setUp]; + icon = [UIImage imageNamed:@"Icon.png"]; + webItem = [[OpenWebURLItem alloc] initWithURL:@"http://TestURL.org" andIcon:icon]; +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testEncoding +{ + NSCoder *coder; + + id mock = [OCMockObject partialMockForObject:coder]; + + +// NSMutableData *data = [[NSMutableData alloc] init]; +// coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; + [webItem encodeWithCoder:mock]; + + +// NSCoder *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; +// NSString *url = [decoder decodeObjectForKey:@"URL"]; +// STAssertEqualObjects(url, @"http://TestURL.org", @"The URL"); + + //_icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; +} + + +- (void)testDecoding +{ + + NSMutableData *data = [[NSMutableData alloc] init]; + NSCoder *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; + OpenWebURLItem *decodedWebItem = [webItem initWithCoder:decoder]; + + STAssertEqualObjects([decodedWebItem url], @"http://TestURL.org", @"The URL"); + + //_icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + +} + +@end diff --git a/myLauncher/OCMock/NSNotificationCenter+OCMAdditions.h b/myLauncher/OCMock/NSNotificationCenter+OCMAdditions.h new file mode 100644 index 0000000..ab4832b --- /dev/null +++ b/myLauncher/OCMock/NSNotificationCenter+OCMAdditions.h @@ -0,0 +1,15 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2009 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import + +@class OCMockObserver; + + +@interface NSNotificationCenter(OCMAdditions) + +- (void)addMockObserver:(OCMockObserver *)notificationObserver name:(NSString *)notificationName object:(id)notificationSender; + +@end diff --git a/myLauncher/OCMock/OCMArg.h b/myLauncher/OCMock/OCMArg.h new file mode 100644 index 0000000..669c094 --- /dev/null +++ b/myLauncher/OCMock/OCMArg.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2009-2010 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import + +@interface OCMArg : NSObject + +// constraining arguments + ++ (id)any; ++ (void *)anyPointer; ++ (id)isNil; ++ (id)isNotNil; ++ (id)isNotEqual:(id)value; ++ (id)checkWithSelector:(SEL)selector onObject:(id)anObject; +#if NS_BLOCKS_AVAILABLE ++ (id)checkWithBlock:(BOOL (^)(id))block; +#endif + +// manipulating arguments + ++ (id *)setTo:(id)value; + +// internal use only + ++ (id)resolveSpecialValues:(NSValue *)value; + +@end + +#define OCMOCK_ANY [OCMArg any] +#define OCMOCK_VALUE(variable) [NSValue value:&variable withObjCType:@encode(__typeof__(variable))] diff --git a/myLauncher/OCMock/OCMConstraint.h b/myLauncher/OCMock/OCMConstraint.h new file mode 100644 index 0000000..3ae1264 --- /dev/null +++ b/myLauncher/OCMock/OCMConstraint.h @@ -0,0 +1,64 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2007-2010 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import + + +@interface OCMConstraint : NSObject + ++ (id)constraint; +- (BOOL)evaluate:(id)value; + +// if you are looking for any, isNil, etc, they have moved to OCMArg + +// try to use [OCMArg checkWith...] instead of the constraintWith... methods below + ++ (id)constraintWithSelector:(SEL)aSelector onObject:(id)anObject; ++ (id)constraintWithSelector:(SEL)aSelector onObject:(id)anObject withValue:(id)aValue; + + +@end + +@interface OCMAnyConstraint : OCMConstraint +@end + +@interface OCMIsNilConstraint : OCMConstraint +@end + +@interface OCMIsNotNilConstraint : OCMConstraint +@end + +@interface OCMIsNotEqualConstraint : OCMConstraint +{ + @public + id testValue; +} + +@end + +@interface OCMInvocationConstraint : OCMConstraint +{ + @public + NSInvocation *invocation; +} + +@end + +#if NS_BLOCKS_AVAILABLE + +@interface OCMBlockConstraint : OCMConstraint +{ + BOOL (^block)(id); +} + +- (id)initWithConstraintBlock:(BOOL (^)(id))block; + +@end + +#endif + + +#define CONSTRAINT(aSelector) [OCMConstraint constraintWithSelector:aSelector onObject:self] +#define CONSTRAINTV(aSelector, aValue) [OCMConstraint constraintWithSelector:aSelector onObject:self withValue:(aValue)] diff --git a/myLauncher/OCMock/OCMock.h b/myLauncher/OCMock/OCMock.h new file mode 100644 index 0000000..e18de58 --- /dev/null +++ b/myLauncher/OCMock/OCMock.h @@ -0,0 +1,10 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import +#import +#import +#import +#import diff --git a/myLauncher/OCMock/OCMockObject.h b/myLauncher/OCMock/OCMockObject.h new file mode 100644 index 0000000..ebd2ba3 --- /dev/null +++ b/myLauncher/OCMock/OCMockObject.h @@ -0,0 +1,43 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2004-2008 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import + +@interface OCMockObject : NSProxy +{ + BOOL isNice; + BOOL expectationOrderMatters; + NSMutableArray *recorders; + NSMutableArray *expectations; + NSMutableArray *rejections; + NSMutableArray *exceptions; +} + ++ (id)mockForClass:(Class)aClass; ++ (id)mockForProtocol:(Protocol *)aProtocol; ++ (id)partialMockForObject:(NSObject *)anObject; + ++ (id)niceMockForClass:(Class)aClass; ++ (id)niceMockForProtocol:(Protocol *)aProtocol; + ++ (id)observerMock; + +- (id)init; + +- (void)setExpectationOrderMatters:(BOOL)flag; + +- (id)stub; +- (id)expect; +- (id)reject; + +- (void)verify; + +// internal use only + +- (id)getNewRecorder; +- (BOOL)handleInvocation:(NSInvocation *)anInvocation; +- (void)handleUnRecordedInvocation:(NSInvocation *)anInvocation; + +@end diff --git a/myLauncher/OCMock/OCMockRecorder.h b/myLauncher/OCMock/OCMockRecorder.h new file mode 100644 index 0000000..b11a253 --- /dev/null +++ b/myLauncher/OCMock/OCMockRecorder.h @@ -0,0 +1,32 @@ +//--------------------------------------------------------------------------------------- +// $Id$ +// Copyright (c) 2004-2010 by Mulle Kybernetik. See License file for details. +//--------------------------------------------------------------------------------------- + +#import + +@interface OCMockRecorder : NSProxy +{ + id signatureResolver; + NSInvocation *recordedInvocation; + NSMutableArray *invocationHandlers; +} + +- (id)initWithSignatureResolver:(id)anObject; + +- (BOOL)matchesInvocation:(NSInvocation *)anInvocation; +- (void)releaseInvocation; + +- (id)andReturn:(id)anObject; +- (id)andReturnValue:(NSValue *)aValue; +- (id)andThrow:(NSException *)anException; +- (id)andPost:(NSNotification *)aNotification; +- (id)andCall:(SEL)selector onObject:(id)anObject; +#if NS_BLOCKS_AVAILABLE +- (id)andDo:(void (^)(NSInvocation *))block; +#endif +- (id)andForwardToRealObject; + +- (NSArray *)invocationHandlers; + +@end diff --git a/myLauncher/libOCMock.a b/myLauncher/libOCMock.a new file mode 100644 index 0000000000000000000000000000000000000000..dae5ac185ab50396f7b11c191326ce6ca7ca4c59 GIT binary patch literal 454368 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 Date: Wed, 4 Jul 2012 13:57:14 -0400 Subject: [PATCH 23/29] no message --- .../MyLauncher.xcodeproj/project.pbxproj | 12 ++++++ .../MyLauncherGenericItemTest.h | 13 +++++++ .../MyLauncherGenericItemTest.m | 14 +++++++ .../MyLauncherTests/OpenWebURLItemTest.m | 38 ++++++++----------- 4 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 myLauncher/MyLauncherTests/MyLauncherGenericItemTest.h create mode 100644 myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 4b0de6d..9e64eb2 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -30,6 +30,10 @@ 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; E30AA30F15A4993100B6078B /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E30AA30715A4993100B6078B /* libOCMock.a */; }; + E30AA31115A4AFC400B6078B /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; + E30AA31215A4AFC400B6078B /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F975CCD122B524500F678EB /* Icon@2x.png */; }; + E30AA31315A4AFC400B6078B /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F975CCC122B524500F678EB /* Icon.png */; }; + E30AA31615A4BB3300B6078B /* MyLauncherGenericItemTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E30AA31515A4BB3300B6078B /* MyLauncherGenericItemTest.m */; }; E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */; }; E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; @@ -87,6 +91,8 @@ E30AA30C15A4993100B6078B /* OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMock.h; sourceTree = ""; }; E30AA30D15A4993100B6078B /* OCMockObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockObject.h; sourceTree = ""; }; E30AA30E15A4993100B6078B /* OCMockRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockRecorder.h; sourceTree = ""; }; + E30AA31415A4BB3300B6078B /* MyLauncherGenericItemTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItemTest.h; sourceTree = ""; }; + E30AA31515A4BB3300B6078B /* MyLauncherGenericItemTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyLauncherGenericItemTest.m; sourceTree = ""; }; E30C172C1599E5EB0073DA67 /* MyLauncherTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MyLauncherTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; E30C172D1599E5EB0073DA67 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; E30C17331599E5EB0073DA67 /* MyLauncherTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MyLauncherTests-Info.plist"; sourceTree = ""; }; @@ -274,6 +280,8 @@ children = ( E30C17371599E5EB0073DA67 /* OpenWebURLItemTest.h */, E30C17381599E5EB0073DA67 /* OpenWebURLItemTest.m */, + E30AA31415A4BB3300B6078B /* MyLauncherGenericItemTest.h */, + E30AA31515A4BB3300B6078B /* MyLauncherGenericItemTest.m */, E30C17321599E5EB0073DA67 /* Supporting Files */, ); path = MyLauncherTests; @@ -375,6 +383,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E30AA31115A4AFC400B6078B /* Icon-iPad.png in Resources */, + E30AA31215A4AFC400B6078B /* Icon@2x.png in Resources */, + E30AA31315A4AFC400B6078B /* Icon.png in Resources */, E30C17361599E5EB0073DA67 /* InfoPlist.strings in Resources */, E30C1757159A33C20073DA67 /* Google-icon.png in Resources */, E30C175A159A33C80073DA67 /* Google-icon-iPad.png in Resources */, @@ -427,6 +438,7 @@ files = ( E30C17391599E5EB0073DA67 /* OpenWebURLItemTest.m in Sources */, E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */, + E30AA31615A4BB3300B6078B /* MyLauncherGenericItemTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.h b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.h new file mode 100644 index 0000000..39758ff --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.h @@ -0,0 +1,13 @@ +// +// MyLauncherGenericItemTest.h +// MyLauncher +// +// Created by Nicolas Desjardins on 2012-07-04. +// +// + +#import + +@interface MyLauncherGenericItemTest : SenTestCase + +@end diff --git a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m new file mode 100644 index 0000000..9d72d57 --- /dev/null +++ b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m @@ -0,0 +1,14 @@ +// +// MyLauncherGenericItemTest.m +// MyLauncher +// +// Created by Nicolas Desjardins on 2012-07-04. +// +// + +#import "MyLauncherGenericItemTest.h" +#import + +@implementation MyLauncherGenericItemTest + +@end diff --git a/myLauncher/MyLauncherTests/OpenWebURLItemTest.m b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m index cd77e66..5b1df92 100644 --- a/myLauncher/MyLauncherTests/OpenWebURLItemTest.m +++ b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m @@ -8,7 +8,7 @@ #import "OpenWebURLItemTest.h" #import "OpenWebURLItem.h" -#import "OCMockObject.h" +#import @interface OpenWebURLItemTest(){ @@ -23,7 +23,8 @@ @implementation OpenWebURLItemTest - (void)setUp { [super setUp]; - icon = [UIImage imageNamed:@"Icon.png"]; + NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"Icon" ofType:@"png"]; + icon = [UIImage imageWithContentsOfFile:path]; webItem = [[OpenWebURLItem alloc] initWithURL:@"http://TestURL.org" andIcon:icon]; } @@ -36,35 +37,26 @@ - (void)tearDown - (void)testEncoding { - NSCoder *coder; - - id mock = [OCMockObject partialMockForObject:coder]; - - -// NSMutableData *data = [[NSMutableData alloc] init]; -// coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; - [webItem encodeWithCoder:mock]; - - -// NSCoder *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; -// NSString *url = [decoder decodeObjectForKey:@"URL"]; -// STAssertEqualObjects(url, @"http://TestURL.org", @"The URL"); + id mockCoder = [OCMockObject mockForClass:[NSCoder class]]; + [[mockCoder expect] encodeObject:@"http://TestURL.org" forKey:@"URL"]; + [[mockCoder expect] encodeObject:UIImagePNGRepresentation(icon) forKey:@"icon"]; + [webItem encodeWithCoder:mockCoder]; - //_icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + [mockCoder verify]; } - - (void)testDecoding { + id mockDecoder = [OCMockObject mockForClass:[NSCoder class]]; - NSMutableData *data = [[NSMutableData alloc] init]; - NSCoder *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; - OpenWebURLItem *decodedWebItem = [webItem initWithCoder:decoder]; - - STAssertEqualObjects([decodedWebItem url], @"http://TestURL.org", @"The URL"); + [[[mockDecoder stub] andReturn:@"http://TestURL.org"] decodeObjectForKey:@"URL"]; + [[[mockDecoder stub] andReturn:UIImagePNGRepresentation(icon)] decodeObjectForKey:@"icon"]; - //_icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + OpenWebURLItem *decodedWebItem = [webItem initWithCoder:mockDecoder]; + STAssertEqualObjects([decodedWebItem url], @"http://TestURL.org", @"The URL"); + STAssertNotNil([decodedWebItem icon], @"The icon not nil"); + STAssertEqualObjects([[decodedWebItem icon] class], [UIImage class], @"The icon not nil"); } @end From 38068e79cf30a8ca7356b25b5c3a4fc379b0e89d Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Wed, 4 Jul 2012 15:01:54 -0400 Subject: [PATCH 24/29] no message --- .../MyLauncher/MyLauncherGenericItem.h | 8 +---- .../MyLauncher/MyLauncherGenericItem.m | 1 - .../Classes/MyLauncherGenericItemDelegate.h | 16 ++++++++++ .../MyLauncher.xcodeproj/project.pbxproj | 24 +++++++++++++-- .../MyLauncherGenericItemTest.m | 29 +++++++++++++++++++ .../MyLauncherTests-Prefix.pch | 2 ++ .../MyLauncherTests/OpenWebURLItemTest.m | 1 + 7 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 myLauncher/Classes/MyLauncherGenericItemDelegate.h diff --git a/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h index f9604ef..8dfb536 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.h @@ -17,13 +17,7 @@ // #import "MyLauncherItem.h" - -@protocol MyLauncherGenericItemDelegate - --(void)start; --(UIImage*)icon; - -@end +#import "MyLauncherGenericItemDelegate.h" @interface MyLauncherGenericItem : MyLauncherItem diff --git a/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m index f52546f..7a31854 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherGenericItem.m @@ -32,7 +32,6 @@ -(id)initWithTitle:(NSString*)title delegate:(id) } -(void)selected:(MyLauncherViewController*)parent { - [_genericDelegate start]; } diff --git a/myLauncher/Classes/MyLauncherGenericItemDelegate.h b/myLauncher/Classes/MyLauncherGenericItemDelegate.h new file mode 100644 index 0000000..4a38a9f --- /dev/null +++ b/myLauncher/Classes/MyLauncherGenericItemDelegate.h @@ -0,0 +1,16 @@ +// +// MyLauncherGenericItemDelegate.h +// MyLauncher +// +// Created by Nicolas Desjardins on 2012-07-04. +// +// + +#import + +@protocol MyLauncherGenericItemDelegate + +-(void)start; +-(UIImage*)icon; + +@end diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index 9e64eb2..ed51056 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -48,6 +48,15 @@ E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; E3CCD6E915A32B0D005FC746 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; + E3D4A9F415A4C0F20001541B /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; + E3D4A9F715A4C1EC0001541B /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; + E3D4A9F815A4C2270001541B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; + E3D4A9F915A4C2360001541B /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */; }; + E3D4A9FA15A4C2390001541B /* MyLauncherViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C98122B4FAE00F678EB /* MyLauncherViewController.m */; }; + E3D4A9FB15A4C23B0001541B /* MyLauncherView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C96122B4FAE00F678EB /* MyLauncherView.m */; }; + E3D4A9FC15A4C23E0001541B /* MyLauncherViewControllerItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C90122B4FAE00F678EB /* MyLauncherViewControllerItem.m */; }; + E3D4A9FD15A4C2410001541B /* MyLauncherScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C94122B4FAE00F678EB /* MyLauncherScrollView.m */; }; + E3D4A9FE15A4C2440001541B /* MyLauncherPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -109,6 +118,7 @@ E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; E3CCD6E715A32B0D005FC746 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenWebURLItem.h; path = MyLauncher/OpenWebURLItem.h; sourceTree = ""; }; E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenWebURLItem.m; path = MyLauncher/OpenWebURLItem.m; sourceTree = ""; }; + E3D4A9F615A4C1760001541B /* MyLauncherGenericItemDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItemDelegate.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -126,6 +136,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E3D4A9F815A4C2270001541B /* CoreGraphics.framework in Frameworks */, E30C172E1599E5EB0073DA67 /* SenTestingKit.framework in Frameworks */, E30C172F1599E5EB0073DA67 /* UIKit.framework in Frameworks */, E30C17301599E5EB0073DA67 /* Foundation.framework in Frameworks */, @@ -191,6 +202,7 @@ 0F975C94122B4FAE00F678EB /* MyLauncherScrollView.m */, 0F975C91122B4FAE00F678EB /* MyLauncherPageControl.h */, 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */, + E3D4A9F615A4C1760001541B /* MyLauncherGenericItemDelegate.h */, ); name = MyLauncher; sourceTree = ""; @@ -439,6 +451,14 @@ E30C17391599E5EB0073DA67 /* OpenWebURLItemTest.m in Sources */, E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */, E30AA31615A4BB3300B6078B /* MyLauncherGenericItemTest.m in Sources */, + E3D4A9F415A4C0F20001541B /* MyLauncherGenericItem.m in Sources */, + E3D4A9F715A4C1EC0001541B /* MyLauncherItem.m in Sources */, + E3D4A9F915A4C2360001541B /* CustomBadge.m in Sources */, + E3D4A9FA15A4C2390001541B /* MyLauncherViewController.m in Sources */, + E3D4A9FB15A4C23B0001541B /* MyLauncherView.m in Sources */, + E3D4A9FC15A4C23E0001541B /* MyLauncherViewControllerItem.m in Sources */, + E3D4A9FD15A4C2410001541B /* MyLauncherScrollView.m in Sources */, + E3D4A9FE15A4C2440001541B /* MyLauncherPageControl.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -543,7 +563,7 @@ "\"$(SRCROOT)\"", ); INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", @@ -578,7 +598,7 @@ "\"$(SRCROOT)\"", ); INFOPLIST_FILE = "MyLauncherTests/MyLauncherTests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", diff --git a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m index 9d72d57..6bee771 100644 --- a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m +++ b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m @@ -6,9 +6,38 @@ // // +#import "MyLauncherGenericItemDelegate.h" #import "MyLauncherGenericItemTest.h" +#import "MyLauncherViewController.h" +#import "MyLauncherGenericItem.h" + #import @implementation MyLauncherGenericItemTest +- (void)setUp +{ + [super setUp]; + +} + +- (void)tearDown +{ + // Tear-down code here. + [super tearDown]; +} + +- (void)testSelected +{ + id mockGenericDelegate = [OCMockObject mockForProtocol:@protocol(MyLauncherGenericItemDelegate)]; + [(id)[mockGenericDelegate expect] start]; + + MyLauncherGenericItem *genericItem = [[MyLauncherGenericItem alloc] initWithTitle:@"My Title" delegate:mockGenericDelegate deletable:YES]; + + id mockParentController = [OCMockObject mockForClass:[MyLauncherViewController class]]; + [genericItem selected:mockParentController]; + + [mockGenericDelegate verify]; +} + @end diff --git a/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch b/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch index fc0182f..4ad3b90 100644 --- a/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch +++ b/myLauncher/MyLauncherTests/MyLauncherTests-Prefix.pch @@ -6,3 +6,5 @@ #import #import #endif + +#define COLOR(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1] \ No newline at end of file diff --git a/myLauncher/MyLauncherTests/OpenWebURLItemTest.m b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m index 5b1df92..de82f41 100644 --- a/myLauncher/MyLauncherTests/OpenWebURLItemTest.m +++ b/myLauncher/MyLauncherTests/OpenWebURLItemTest.m @@ -55,6 +55,7 @@ - (void)testDecoding OpenWebURLItem *decodedWebItem = [webItem initWithCoder:mockDecoder]; STAssertEqualObjects([decodedWebItem url], @"http://TestURL.org", @"The URL"); + STAssertNotNil([decodedWebItem icon], @"The icon not nil"); STAssertEqualObjects([[decodedWebItem icon] class], [UIImage class], @"The icon not nil"); } From 5f27a000ed1f7ce41145cd3248908391d38a1d3a Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Thu, 5 Jul 2012 07:51:30 -0400 Subject: [PATCH 25/29] no message --- .../MyLauncherGenericItemDelegate.h | 0 .../Classes/{MyLauncher => }/OpenWebURLItem.h | 0 .../Classes/{MyLauncher => }/OpenWebURLItem.m | 6 +++++- .../MyLauncher.xcodeproj/project.pbxproj | 20 +++++++++---------- .../MyLauncherGenericItemTest.m | 16 +++++++++++++++ 5 files changed, 31 insertions(+), 11 deletions(-) rename myLauncher/Classes/{ => MyLauncher}/MyLauncherGenericItemDelegate.h (100%) rename myLauncher/Classes/{MyLauncher => }/OpenWebURLItem.h (100%) rename myLauncher/Classes/{MyLauncher => }/OpenWebURLItem.m (82%) diff --git a/myLauncher/Classes/MyLauncherGenericItemDelegate.h b/myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h similarity index 100% rename from myLauncher/Classes/MyLauncherGenericItemDelegate.h rename to myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h diff --git a/myLauncher/Classes/MyLauncher/OpenWebURLItem.h b/myLauncher/Classes/OpenWebURLItem.h similarity index 100% rename from myLauncher/Classes/MyLauncher/OpenWebURLItem.h rename to myLauncher/Classes/OpenWebURLItem.h diff --git a/myLauncher/Classes/MyLauncher/OpenWebURLItem.m b/myLauncher/Classes/OpenWebURLItem.m similarity index 82% rename from myLauncher/Classes/MyLauncher/OpenWebURLItem.m rename to myLauncher/Classes/OpenWebURLItem.m index fcb1481..b43a51d 100644 --- a/myLauncher/Classes/MyLauncher/OpenWebURLItem.m +++ b/myLauncher/Classes/OpenWebURLItem.m @@ -41,7 +41,9 @@ -(UIImage*)icon { - (id)initWithCoder:(NSCoder*)coder { _url = [coder decodeObjectForKey:@"URL"]; - _icon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + UIImage *tmpicon = [UIImage imageWithData:[coder decodeObjectForKey:@"icon"]]; + _icon = [UIImage imageWithCGImage:[tmpicon CGImage] scale:[coder decodeFloatForKey:@"scale"] orientation:UIImageOrientationUp]; + return self; } @@ -50,5 +52,7 @@ - (void)encodeWithCoder:(NSCoder*)coder { NSData *data = UIImagePNGRepresentation(_icon); [coder encodeObject:data forKey:@"icon"]; + + [coder encodeFloat:[_icon scale] forKey:@"scale"]; } @end diff --git a/myLauncher/MyLauncher.xcodeproj/project.pbxproj b/myLauncher/MyLauncher.xcodeproj/project.pbxproj index ed51056..a84cf79 100755 --- a/myLauncher/MyLauncher.xcodeproj/project.pbxproj +++ b/myLauncher/MyLauncher.xcodeproj/project.pbxproj @@ -28,7 +28,8 @@ 7DA45DCD1316B0C700D5FA85 /* itemImage-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DA45DCB1316B0C700D5FA85 /* itemImage-iPad.png */; }; 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */; }; 7DF382DA13326D0100738192 /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; - E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; + E305A4CE15A5B6ED009B71E6 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E305A4CC15A5B6ED009B71E6 /* OpenWebURLItem.m */; }; + E305A4CF15A5B71A009B71E6 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E305A4CC15A5B6ED009B71E6 /* OpenWebURLItem.m */; }; E30AA30F15A4993100B6078B /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E30AA30715A4993100B6078B /* libOCMock.a */; }; E30AA31115A4AFC400B6078B /* Icon-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DF382D913326D0100738192 /* Icon-iPad.png */; }; E30AA31215A4AFC400B6078B /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0F975CCD122B524500F678EB /* Icon@2x.png */; }; @@ -47,7 +48,6 @@ E30C175D159A33D20073DA67 /* Google-icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E30C175B159A33D20073DA67 /* Google-icon@2x.png */; }; E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; - E3CCD6E915A32B0D005FC746 /* OpenWebURLItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */; }; E3D4A9F415A4C0F20001541B /* MyLauncherGenericItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */; }; E3D4A9F715A4C1EC0001541B /* MyLauncherItem.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */; }; E3D4A9F815A4C2270001541B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; @@ -93,6 +93,9 @@ 7DC0590E1397988B00E0EAA9 /* CustomBadge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CustomBadge.m; path = MyLauncher/CustomBadge.m; sourceTree = ""; }; 7DF382D913326D0100738192 /* Icon-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon-iPad.png"; path = "imgs/Icon-iPad.png"; sourceTree = ""; }; 8D1107310486CEB800E47090 /* MyLauncher-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "MyLauncher-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; + E305A4C915A5B582009B71E6 /* MyLauncherGenericItemDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItemDelegate.h; path = MyLauncher/MyLauncherGenericItemDelegate.h; sourceTree = ""; }; + E305A4CC15A5B6ED009B71E6 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenWebURLItem.m; sourceTree = ""; }; + E305A4CD15A5B6ED009B71E6 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenWebURLItem.h; sourceTree = ""; }; E30AA30715A4993100B6078B /* libOCMock.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libOCMock.a; sourceTree = ""; }; E30AA30915A4993100B6078B /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+OCMAdditions.h"; sourceTree = ""; }; E30AA30A15A4993100B6078B /* OCMArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMArg.h; sourceTree = ""; }; @@ -116,9 +119,6 @@ E3A83CC6159E2F6C006CCA39 /* MyLauncherItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherItem.m; path = MyLauncher/MyLauncherItem.m; sourceTree = ""; }; E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MyLauncherGenericItem.m; path = MyLauncher/MyLauncherGenericItem.m; sourceTree = ""; }; E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MyLauncherGenericItem.h; path = MyLauncher/MyLauncherGenericItem.h; sourceTree = ""; }; - E3CCD6E715A32B0D005FC746 /* OpenWebURLItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpenWebURLItem.h; path = MyLauncher/OpenWebURLItem.h; sourceTree = ""; }; - E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OpenWebURLItem.m; path = MyLauncher/OpenWebURLItem.m; sourceTree = ""; }; - E3D4A9F615A4C1760001541B /* MyLauncherGenericItemDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLauncherGenericItemDelegate.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -153,6 +153,8 @@ 0F975B02122AFC3B00F678EB /* MyLauncher */, 1D3623240D0F684500981E51 /* AppDelegate.h */, 1D3623250D0F684500981E51 /* AppDelegate.m */, + E305A4CD15A5B6ED009B71E6 /* OpenWebURLItem.h */, + E305A4CC15A5B6ED009B71E6 /* OpenWebURLItem.m */, 0F975C2C122B0E8300F678EB /* RootViewController.h */, 0F975C2D122B0E8300F678EB /* RootViewController.m */, 0F1328EC120637BC00C7C87C /* ItemViewController.h */, @@ -184,8 +186,7 @@ 0F975B02122AFC3B00F678EB /* MyLauncher */ = { isa = PBXGroup; children = ( - E3CCD6E715A32B0D005FC746 /* OpenWebURLItem.h */, - E3CCD6E815A32B0D005FC746 /* OpenWebURLItem.m */, + E305A4C915A5B582009B71E6 /* MyLauncherGenericItemDelegate.h */, E3CCD6C815A32447005FC746 /* MyLauncherGenericItem.h */, E3CCD68415A31C92005FC746 /* MyLauncherGenericItem.m */, E3A83CC5159E2F6C006CCA39 /* MyLauncherItem.h */, @@ -202,7 +203,6 @@ 0F975C94122B4FAE00F678EB /* MyLauncherScrollView.m */, 0F975C91122B4FAE00F678EB /* MyLauncherPageControl.h */, 0F975C92122B4FAE00F678EB /* MyLauncherPageControl.m */, - E3D4A9F615A4C1760001541B /* MyLauncherGenericItemDelegate.h */, ); name = MyLauncher; sourceTree = ""; @@ -440,7 +440,7 @@ 7DC0590F1397988B00E0EAA9 /* CustomBadge.m in Sources */, E3A83CC7159E2F6C006CCA39 /* MyLauncherItem.m in Sources */, E3CCD6A215A31E3E005FC746 /* MyLauncherGenericItem.m in Sources */, - E3CCD6E915A32B0D005FC746 /* OpenWebURLItem.m in Sources */, + E305A4CF15A5B71A009B71E6 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -449,7 +449,6 @@ buildActionMask = 2147483647; files = ( E30C17391599E5EB0073DA67 /* OpenWebURLItemTest.m in Sources */, - E30AA30615A491EA00B6078B /* OpenWebURLItem.m in Sources */, E30AA31615A4BB3300B6078B /* MyLauncherGenericItemTest.m in Sources */, E3D4A9F415A4C0F20001541B /* MyLauncherGenericItem.m in Sources */, E3D4A9F715A4C1EC0001541B /* MyLauncherItem.m in Sources */, @@ -459,6 +458,7 @@ E3D4A9FC15A4C23E0001541B /* MyLauncherViewControllerItem.m in Sources */, E3D4A9FD15A4C2410001541B /* MyLauncherScrollView.m in Sources */, E3D4A9FE15A4C2440001541B /* MyLauncherPageControl.m in Sources */, + E305A4CE15A5B6ED009B71E6 /* OpenWebURLItem.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m index 6bee771..815687b 100644 --- a/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m +++ b/myLauncher/MyLauncherTests/MyLauncherGenericItemTest.m @@ -30,6 +30,7 @@ - (void)tearDown - (void)testSelected { id mockGenericDelegate = [OCMockObject mockForProtocol:@protocol(MyLauncherGenericItemDelegate)]; + [(id)[mockGenericDelegate expect] start]; MyLauncherGenericItem *genericItem = [[MyLauncherGenericItem alloc] initWithTitle:@"My Title" delegate:mockGenericDelegate deletable:YES]; @@ -40,4 +41,19 @@ - (void)testSelected [mockGenericDelegate verify]; } +-(void) testItemToSave +{ + id mockGenericDelegate = [OCMockObject mockForProtocol:@protocol(MyLauncherGenericItemDelegate)]; + + MyLauncherGenericItem *genericItem = [[MyLauncherGenericItem alloc] initWithTitle:@"My Title" delegate:mockGenericDelegate deletable:YES]; + + NSDictionary *itemsToSave = [genericItem itemToSave]; + + NSData* savedData = [itemsToSave objectForKey:@"genericDelegate"]; + + MyLauncherGenericItem *unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:savedData]; + STAssertEqualObjects(mockGenericDelegate, unarchived, @""); + +} + @end From 13b8dcc30bd4cd8fc0f3ea1963e7f0f82b747080 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Thu, 5 Jul 2012 10:40:52 -0400 Subject: [PATCH 26/29] no message --- myLauncher/Classes/MyLauncher/MyLauncherView.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.h b/myLauncher/Classes/MyLauncher/MyLauncherView.h index c895418..e31632c 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.h @@ -61,6 +61,8 @@ -(void)setPages:(NSMutableArray *)pages numberOfImmovableItems:(NSInteger)items; -(void)setPages:(NSMutableArray *)pages numberOfImmovableItems:(NSInteger)items animated:(BOOL)animated; +-(void)layoutItems; + -(void)viewDidAppear:(BOOL)animated; -(void)setCurrentOrientation:(UIInterfaceOrientation)newOrientation; -(void)layoutLauncher; From ceb903ee3bc20bdfa32e9dfdcdc2212871186875 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Thu, 5 Jul 2012 13:49:16 -0400 Subject: [PATCH 27/29] no message --- myLauncher/Classes/MyLauncher/MyLauncherView.h | 3 +-- myLauncher/Classes/MyLauncher/MyLauncherView.m | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.h b/myLauncher/Classes/MyLauncher/MyLauncherView.h index e31632c..bbb575c 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.h @@ -61,13 +61,12 @@ -(void)setPages:(NSMutableArray *)pages numberOfImmovableItems:(NSInteger)items; -(void)setPages:(NSMutableArray *)pages numberOfImmovableItems:(NSInteger)items animated:(BOOL)animated; --(void)layoutItems; - -(void)viewDidAppear:(BOOL)animated; -(void)setCurrentOrientation:(UIInterfaceOrientation)newOrientation; -(void)layoutLauncher; -(void)layoutLauncherAnimated:(BOOL)animated; -(int)maxItemsPerPage; -(int)maxPages; +-(void)saveChanges; @end diff --git a/myLauncher/Classes/MyLauncher/MyLauncherView.m b/myLauncher/Classes/MyLauncher/MyLauncherView.m index 500c9c4..ddc7cc1 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherView.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherView.m @@ -789,6 +789,9 @@ -(BOOL)itemMovable:(MyLauncherItem *)itemToSearch } #pragma mark - myLauncher caching +-(void)saveChanges { + [self savePages]; +} -(void)savePages { From d449cb33d17e182c7a125e1dd4f06cdc0af5f510 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Mon, 9 Jul 2012 08:35:35 -0400 Subject: [PATCH 28/29] no message --- myLauncher/Classes/MyLauncher/MyLauncherItem.h | 2 +- myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherItem.h b/myLauncher/Classes/MyLauncher/MyLauncherItem.h index d8515ca..bc1c07d 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherItem.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherItem.h @@ -30,7 +30,6 @@ @interface MyLauncherItem : UIControl { BOOL _dragging; - BOOL _deletable; BOOL _titleBoundToBottom; } @@ -38,6 +37,7 @@ @property (nonatomic, unsafe_unretained) id delegate; @property (nonatomic, strong) CustomBadge *badge; @property (nonatomic, strong) UIButton *closeButton; +@property (nonatomic) BOOL deletable; -(id)initWithTitle:(NSString*)title deletable:(BOOL)deletable; diff --git a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m index 72df7ea..a3e3b55 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m +++ b/myLauncher/Classes/MyLauncher/MyLauncherViewControllerItem.m @@ -29,7 +29,7 @@ @implementation MyLauncherViewControllerItem @synthesize iPadImage = _iPadImage; @synthesize controllerStr = _controllerStr; @synthesize controllerTitle = _controllerTitle; - +@synthesize deletable = _deletable; #pragma mark - Lifecycle From a0e627c6dc19392ced039a716ed32cb8edc07763 Mon Sep 17 00:00:00 2001 From: Nicolas Desjardins Date: Mon, 9 Jul 2012 10:20:46 -0400 Subject: [PATCH 29/29] no message --- myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h b/myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h index 4a38a9f..fc1d4ae 100644 --- a/myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h +++ b/myLauncher/Classes/MyLauncher/MyLauncherGenericItemDelegate.h @@ -12,5 +12,7 @@ -(void)start; -(UIImage*)icon; +-(int)itemId; +-(int)version; @end