Skip to content
Browse files

Initial commit

  • Loading branch information...
0 parents commit 590af5f168ed056f46c343d0bd6674ec44dfbed2 @RVLVR committed Jul 17, 2011
Showing with 8,240 additions and 0 deletions.
  1. +422 −0 REVClusterMap.xcodeproj/project.pbxproj
  2. +7 −0 REVClusterMap.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. +5,757 −0 ...ap.xcodeproj/project.xcworkspace/xcuserdata/andyjacobs.xcuserdatad/UserInterfaceState.xcuserstate
  4. +10 −0 ...rMap.xcodeproj/project.xcworkspace/xcuserdata/andyjacobs.xcuserdatad/WorkspaceSettings.xcsettings
  5. +5 −0 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
  6. +76 −0 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcschemes/REVClusterMap.xcscheme
  7. +22 −0 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcschemes/xcschememanagement.plist
  8. +16 −0 REVClusterMap/MyClass.h
  9. +14 −0 REVClusterMap/MyClass.m
  10. +19 −0 REVClusterMap/REVClusterAnnotationView.h
  11. +46 −0 REVClusterMap/REVClusterAnnotationView.m
  12. +53 −0 REVClusterMap/REVClusterMap-Info.plist
  13. +20 −0 REVClusterMap/REVClusterMap-Prefix.pch
  14. +29 −0 REVClusterMap/REVClusterMap/REVAnnotationsCollection.h
  15. +53 −0 REVClusterMap/REVClusterMap/REVAnnotationsCollection.m
  16. +28 −0 REVClusterMap/REVClusterMap/REVClusterBlock.h
  17. +69 −0 REVClusterMap/REVClusterMap/REVClusterBlock.m
  18. +27 −0 REVClusterMap/REVClusterMap/REVClusterManager.h
  19. +159 −0 REVClusterMap/REVClusterMap/REVClusterManager.m
  20. +17 −0 REVClusterMap/REVClusterMap/REVClusterMap.h
  21. +32 −0 REVClusterMap/REVClusterMap/REVClusterMapView.h
  22. +232 −0 REVClusterMap/REVClusterMap/REVClusterMapView.m
  23. +29 −0 REVClusterMap/REVClusterMap/REVClusterPin.h
  24. +24 −0 REVClusterMap/REVClusterMap/REVClusterPin.m
  25. +21 −0 REVClusterMap/REVClusterMapAppDelegate.h
  26. +78 −0 REVClusterMap/REVClusterMapAppDelegate.m
  27. +18 −0 REVClusterMap/REVMapViewController.h
  28. +126 −0 REVClusterMap/REVMapViewController.m
  29. BIN REVClusterMap/Recources/Default-ipad-Landscape.png
  30. BIN REVClusterMap/Recources/Default-iphone.png
  31. BIN REVClusterMap/Recources/Default@2x-iphone.png
  32. BIN REVClusterMap/Recources/Icon-72.png
  33. BIN REVClusterMap/Recources/Icon.png
  34. BIN REVClusterMap/Recources/Icon@2x.png
  35. BIN REVClusterMap/Recources/assets/cluster.png
  36. BIN REVClusterMap/Recources/assets/cluster@2x.png
  37. BIN REVClusterMap/Recources/assets/pinpoint.png
  38. BIN REVClusterMap/Recources/assets/pinpoint@2x.png
  39. +2 −0 REVClusterMap/en.lproj/InfoPlist.strings
  40. +18 −0 REVClusterMap/iPad/REVClusterMapAppDelegate_iPad.h
  41. +20 −0 REVClusterMap/iPad/REVClusterMapAppDelegate_iPad.m
  42. +362 −0 REVClusterMap/iPad/en.lproj/MainWindow_iPad.xib
  43. +18 −0 REVClusterMap/iPhone/REVClusterMapAppDelegate_iPhone.h
  44. +20 −0 REVClusterMap/iPhone/REVClusterMapAppDelegate_iPhone.m
  45. +372 −0 REVClusterMap/iPhone/en.lproj/MainWindow_iPhone.xib
  46. +19 −0 REVClusterMap/main.m
422 REVClusterMap.xcodeproj/project.pbxproj
@@ -0,0 +1,422 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 8281F7A213D3404D00BB4FA9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8281F7A113D3404D00BB4FA9 /* UIKit.framework */; };
+ 8281F7A413D3404D00BB4FA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8281F7A313D3404D00BB4FA9 /* Foundation.framework */; };
+ 8281F7A613D3404D00BB4FA9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8281F7A513D3404D00BB4FA9 /* CoreGraphics.framework */; };
+ 8281F7AC13D3404D00BB4FA9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7AA13D3404D00BB4FA9 /* InfoPlist.strings */; };
+ 8281F7AF13D3404D00BB4FA9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7AE13D3404D00BB4FA9 /* main.m */; };
+ 8281F7B213D3404D00BB4FA9 /* REVClusterMapAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7B113D3404D00BB4FA9 /* REVClusterMapAppDelegate.m */; };
+ 8281F7B613D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7B513D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.m */; };
+ 8281F7B913D3404D00BB4FA9 /* MainWindow_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7B713D3404D00BB4FA9 /* MainWindow_iPhone.xib */; };
+ 8281F7BD13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7BC13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.m */; };
+ 8281F7C013D3404D00BB4FA9 /* MainWindow_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7BE13D3404D00BB4FA9 /* MainWindow_iPad.xib */; };
+ 8281F7D213D3412600BB4FA9 /* REVAnnotationsCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7C813D3412600BB4FA9 /* REVAnnotationsCollection.m */; };
+ 8281F7D313D3412600BB4FA9 /* REVClusterBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7CA13D3412600BB4FA9 /* REVClusterBlock.m */; };
+ 8281F7D413D3412600BB4FA9 /* REVClusterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7CC13D3412600BB4FA9 /* REVClusterManager.m */; };
+ 8281F7D513D3412600BB4FA9 /* REVClusterMapView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7CF13D3412600BB4FA9 /* REVClusterMapView.m */; };
+ 8281F7D613D3412600BB4FA9 /* REVClusterPin.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7D113D3412600BB4FA9 /* REVClusterPin.m */; };
+ 8281F7D813D3413B00BB4FA9 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8281F7D713D3413B00BB4FA9 /* MapKit.framework */; };
+ 8281F7DB13D3414E00BB4FA9 /* REVMapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7DA13D3414E00BB4FA9 /* REVMapViewController.m */; };
+ 8281F7E413D3418D00BB4FA9 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7DF13D3418D00BB4FA9 /* Icon.png */; };
+ 8281F7E613D3418D00BB4FA9 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7E113D3418D00BB4FA9 /* Icon@2x.png */; };
+ 8281F7E813D341D700BB4FA9 /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7E713D341D700BB4FA9 /* Icon-72.png */; };
+ 8281F7EC13D342DB00BB4FA9 /* Default-ipad-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7E913D342DB00BB4FA9 /* Default-ipad-Landscape.png */; };
+ 8281F7ED13D342DB00BB4FA9 /* Default-iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7EA13D342DB00BB4FA9 /* Default-iphone.png */; };
+ 8281F7EE13D342DB00BB4FA9 /* Default@2x-iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7EB13D342DB00BB4FA9 /* Default@2x-iphone.png */; };
+ 8281F7F413D34A8900BB4FA9 /* cluster.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7F013D34A8900BB4FA9 /* cluster.png */; };
+ 8281F7F513D34A8900BB4FA9 /* cluster@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7F113D34A8900BB4FA9 /* cluster@2x.png */; };
+ 8281F7F613D34A8900BB4FA9 /* pinpoint.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7F213D34A8900BB4FA9 /* pinpoint.png */; };
+ 8281F7F713D34A8900BB4FA9 /* pinpoint@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8281F7F313D34A8900BB4FA9 /* pinpoint@2x.png */; };
+ 8281F7FD13D34BAE00BB4FA9 /* REVClusterAnnotationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8281F7FC13D34BAE00BB4FA9 /* REVClusterAnnotationView.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 8281F79D13D3404D00BB4FA9 /* REVClusterMap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = REVClusterMap.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8281F7A113D3404D00BB4FA9 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 8281F7A313D3404D00BB4FA9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 8281F7A513D3404D00BB4FA9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 8281F7A913D3404D00BB4FA9 /* REVClusterMap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "REVClusterMap-Info.plist"; sourceTree = "<group>"; };
+ 8281F7AB13D3404D00BB4FA9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 8281F7AD13D3404D00BB4FA9 /* REVClusterMap-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "REVClusterMap-Prefix.pch"; sourceTree = "<group>"; };
+ 8281F7AE13D3404D00BB4FA9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 8281F7B013D3404D00BB4FA9 /* REVClusterMapAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = REVClusterMapAppDelegate.h; sourceTree = "<group>"; };
+ 8281F7B113D3404D00BB4FA9 /* REVClusterMapAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = REVClusterMapAppDelegate.m; sourceTree = "<group>"; };
+ 8281F7B413D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = REVClusterMapAppDelegate_iPhone.h; path = iPhone/REVClusterMapAppDelegate_iPhone.h; sourceTree = "<group>"; };
+ 8281F7B513D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = REVClusterMapAppDelegate_iPhone.m; path = iPhone/REVClusterMapAppDelegate_iPhone.m; sourceTree = "<group>"; };
+ 8281F7B813D3404D00BB4FA9 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = iPhone/en.lproj/MainWindow_iPhone.xib; sourceTree = "<group>"; };
+ 8281F7BB13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = REVClusterMapAppDelegate_iPad.h; path = iPad/REVClusterMapAppDelegate_iPad.h; sourceTree = "<group>"; };
+ 8281F7BC13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = REVClusterMapAppDelegate_iPad.m; path = iPad/REVClusterMapAppDelegate_iPad.m; sourceTree = "<group>"; };
+ 8281F7BF13D3404D00BB4FA9 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = iPad/en.lproj/MainWindow_iPad.xib; sourceTree = "<group>"; };
+ 8281F7C713D3412600BB4FA9 /* REVAnnotationsCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVAnnotationsCollection.h; sourceTree = "<group>"; };
+ 8281F7C813D3412600BB4FA9 /* REVAnnotationsCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVAnnotationsCollection.m; sourceTree = "<group>"; };
+ 8281F7C913D3412600BB4FA9 /* REVClusterBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterBlock.h; sourceTree = "<group>"; };
+ 8281F7CA13D3412600BB4FA9 /* REVClusterBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVClusterBlock.m; sourceTree = "<group>"; };
+ 8281F7CB13D3412600BB4FA9 /* REVClusterManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterManager.h; sourceTree = "<group>"; };
+ 8281F7CC13D3412600BB4FA9 /* REVClusterManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVClusterManager.m; sourceTree = "<group>"; };
+ 8281F7CD13D3412600BB4FA9 /* REVClusterMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterMap.h; sourceTree = "<group>"; };
+ 8281F7CE13D3412600BB4FA9 /* REVClusterMapView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterMapView.h; sourceTree = "<group>"; };
+ 8281F7CF13D3412600BB4FA9 /* REVClusterMapView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVClusterMapView.m; sourceTree = "<group>"; };
+ 8281F7D013D3412600BB4FA9 /* REVClusterPin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterPin.h; sourceTree = "<group>"; };
+ 8281F7D113D3412600BB4FA9 /* REVClusterPin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVClusterPin.m; sourceTree = "<group>"; };
+ 8281F7D713D3413B00BB4FA9 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };
+ 8281F7D913D3414E00BB4FA9 /* REVMapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVMapViewController.h; sourceTree = "<group>"; };
+ 8281F7DA13D3414E00BB4FA9 /* REVMapViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVMapViewController.m; sourceTree = "<group>"; };
+ 8281F7DF13D3418D00BB4FA9 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
+ 8281F7E113D3418D00BB4FA9 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = "<group>"; };
+ 8281F7E713D341D700BB4FA9 /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = "<group>"; };
+ 8281F7E913D342DB00BB4FA9 /* Default-ipad-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-ipad-Landscape.png"; sourceTree = "<group>"; };
+ 8281F7EA13D342DB00BB4FA9 /* Default-iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-iphone.png"; sourceTree = "<group>"; };
+ 8281F7EB13D342DB00BB4FA9 /* Default@2x-iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x-iphone.png"; sourceTree = "<group>"; };
+ 8281F7F013D34A8900BB4FA9 /* cluster.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cluster.png; sourceTree = "<group>"; };
+ 8281F7F113D34A8900BB4FA9 /* cluster@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cluster@2x.png"; sourceTree = "<group>"; };
+ 8281F7F213D34A8900BB4FA9 /* pinpoint.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pinpoint.png; sourceTree = "<group>"; };
+ 8281F7F313D34A8900BB4FA9 /* pinpoint@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pinpoint@2x.png"; sourceTree = "<group>"; };
+ 8281F7FB13D34BAE00BB4FA9 /* REVClusterAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REVClusterAnnotationView.h; sourceTree = "<group>"; };
+ 8281F7FC13D34BAE00BB4FA9 /* REVClusterAnnotationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REVClusterAnnotationView.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8281F79A13D3404D00BB4FA9 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8281F7D813D3413B00BB4FA9 /* MapKit.framework in Frameworks */,
+ 8281F7A213D3404D00BB4FA9 /* UIKit.framework in Frameworks */,
+ 8281F7A413D3404D00BB4FA9 /* Foundation.framework in Frameworks */,
+ 8281F7A613D3404D00BB4FA9 /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 8281F79213D3404D00BB4FA9 = {
+ isa = PBXGroup;
+ children = (
+ 8281F7D713D3413B00BB4FA9 /* MapKit.framework */,
+ 8281F7A713D3404D00BB4FA9 /* REVClusterMap */,
+ 8281F7A013D3404D00BB4FA9 /* Frameworks */,
+ 8281F79E13D3404D00BB4FA9 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 8281F79E13D3404D00BB4FA9 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F79D13D3404D00BB4FA9 /* REVClusterMap.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 8281F7A013D3404D00BB4FA9 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7A113D3404D00BB4FA9 /* UIKit.framework */,
+ 8281F7A313D3404D00BB4FA9 /* Foundation.framework */,
+ 8281F7A513D3404D00BB4FA9 /* CoreGraphics.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 8281F7A713D3404D00BB4FA9 /* REVClusterMap */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7C613D3412600BB4FA9 /* REVClusterMap */,
+ 8281F7B013D3404D00BB4FA9 /* REVClusterMapAppDelegate.h */,
+ 8281F7B113D3404D00BB4FA9 /* REVClusterMapAppDelegate.m */,
+ 8281F7D913D3414E00BB4FA9 /* REVMapViewController.h */,
+ 8281F7DA13D3414E00BB4FA9 /* REVMapViewController.m */,
+ 8281F7FB13D34BAE00BB4FA9 /* REVClusterAnnotationView.h */,
+ 8281F7FC13D34BAE00BB4FA9 /* REVClusterAnnotationView.m */,
+ 8281F7B313D3404D00BB4FA9 /* iPhone */,
+ 8281F7BA13D3404D00BB4FA9 /* iPad */,
+ 8281F7A813D3404D00BB4FA9 /* Supporting Files */,
+ 8281F7DC13D3418D00BB4FA9 /* Recources */,
+ );
+ path = REVClusterMap;
+ sourceTree = "<group>";
+ };
+ 8281F7A813D3404D00BB4FA9 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7A913D3404D00BB4FA9 /* REVClusterMap-Info.plist */,
+ 8281F7AA13D3404D00BB4FA9 /* InfoPlist.strings */,
+ 8281F7AD13D3404D00BB4FA9 /* REVClusterMap-Prefix.pch */,
+ 8281F7AE13D3404D00BB4FA9 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ 8281F7B313D3404D00BB4FA9 /* iPhone */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7B413D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.h */,
+ 8281F7B513D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.m */,
+ 8281F7B713D3404D00BB4FA9 /* MainWindow_iPhone.xib */,
+ );
+ name = iPhone;
+ sourceTree = "<group>";
+ };
+ 8281F7BA13D3404D00BB4FA9 /* iPad */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7BB13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.h */,
+ 8281F7BC13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.m */,
+ 8281F7BE13D3404D00BB4FA9 /* MainWindow_iPad.xib */,
+ );
+ name = iPad;
+ sourceTree = "<group>";
+ };
+ 8281F7C613D3412600BB4FA9 /* REVClusterMap */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7C713D3412600BB4FA9 /* REVAnnotationsCollection.h */,
+ 8281F7C813D3412600BB4FA9 /* REVAnnotationsCollection.m */,
+ 8281F7C913D3412600BB4FA9 /* REVClusterBlock.h */,
+ 8281F7CA13D3412600BB4FA9 /* REVClusterBlock.m */,
+ 8281F7CB13D3412600BB4FA9 /* REVClusterManager.h */,
+ 8281F7CC13D3412600BB4FA9 /* REVClusterManager.m */,
+ 8281F7CD13D3412600BB4FA9 /* REVClusterMap.h */,
+ 8281F7CE13D3412600BB4FA9 /* REVClusterMapView.h */,
+ 8281F7CF13D3412600BB4FA9 /* REVClusterMapView.m */,
+ 8281F7D013D3412600BB4FA9 /* REVClusterPin.h */,
+ 8281F7D113D3412600BB4FA9 /* REVClusterPin.m */,
+ );
+ path = REVClusterMap;
+ sourceTree = "<group>";
+ };
+ 8281F7DC13D3418D00BB4FA9 /* Recources */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7EF13D34A8900BB4FA9 /* assets */,
+ 8281F7E913D342DB00BB4FA9 /* Default-ipad-Landscape.png */,
+ 8281F7EA13D342DB00BB4FA9 /* Default-iphone.png */,
+ 8281F7EB13D342DB00BB4FA9 /* Default@2x-iphone.png */,
+ 8281F7DF13D3418D00BB4FA9 /* Icon.png */,
+ 8281F7E113D3418D00BB4FA9 /* Icon@2x.png */,
+ 8281F7E713D341D700BB4FA9 /* Icon-72.png */,
+ );
+ path = Recources;
+ sourceTree = "<group>";
+ };
+ 8281F7EF13D34A8900BB4FA9 /* assets */ = {
+ isa = PBXGroup;
+ children = (
+ 8281F7F013D34A8900BB4FA9 /* cluster.png */,
+ 8281F7F113D34A8900BB4FA9 /* cluster@2x.png */,
+ 8281F7F213D34A8900BB4FA9 /* pinpoint.png */,
+ 8281F7F313D34A8900BB4FA9 /* pinpoint@2x.png */,
+ );
+ path = assets;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8281F79C13D3404D00BB4FA9 /* REVClusterMap */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 8281F7C313D3404D00BB4FA9 /* Build configuration list for PBXNativeTarget "REVClusterMap" */;
+ buildPhases = (
+ 8281F79913D3404D00BB4FA9 /* Sources */,
+ 8281F79A13D3404D00BB4FA9 /* Frameworks */,
+ 8281F79B13D3404D00BB4FA9 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = REVClusterMap;
+ productName = REVClusterMap;
+ productReference = 8281F79D13D3404D00BB4FA9 /* REVClusterMap.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 8281F79413D3404D00BB4FA9 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ ORGANIZATIONNAME = REVOLVER;
+ };
+ buildConfigurationList = 8281F79713D3404D00BB4FA9 /* Build configuration list for PBXProject "REVClusterMap" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 8281F79213D3404D00BB4FA9;
+ productRefGroup = 8281F79E13D3404D00BB4FA9 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8281F79C13D3404D00BB4FA9 /* REVClusterMap */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8281F79B13D3404D00BB4FA9 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8281F7AC13D3404D00BB4FA9 /* InfoPlist.strings in Resources */,
+ 8281F7B913D3404D00BB4FA9 /* MainWindow_iPhone.xib in Resources */,
+ 8281F7C013D3404D00BB4FA9 /* MainWindow_iPad.xib in Resources */,
+ 8281F7E413D3418D00BB4FA9 /* Icon.png in Resources */,
+ 8281F7E613D3418D00BB4FA9 /* Icon@2x.png in Resources */,
+ 8281F7E813D341D700BB4FA9 /* Icon-72.png in Resources */,
+ 8281F7EC13D342DB00BB4FA9 /* Default-ipad-Landscape.png in Resources */,
+ 8281F7ED13D342DB00BB4FA9 /* Default-iphone.png in Resources */,
+ 8281F7EE13D342DB00BB4FA9 /* Default@2x-iphone.png in Resources */,
+ 8281F7F413D34A8900BB4FA9 /* cluster.png in Resources */,
+ 8281F7F513D34A8900BB4FA9 /* cluster@2x.png in Resources */,
+ 8281F7F613D34A8900BB4FA9 /* pinpoint.png in Resources */,
+ 8281F7F713D34A8900BB4FA9 /* pinpoint@2x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8281F79913D3404D00BB4FA9 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8281F7AF13D3404D00BB4FA9 /* main.m in Sources */,
+ 8281F7B213D3404D00BB4FA9 /* REVClusterMapAppDelegate.m in Sources */,
+ 8281F7B613D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPhone.m in Sources */,
+ 8281F7BD13D3404D00BB4FA9 /* REVClusterMapAppDelegate_iPad.m in Sources */,
+ 8281F7D213D3412600BB4FA9 /* REVAnnotationsCollection.m in Sources */,
+ 8281F7D313D3412600BB4FA9 /* REVClusterBlock.m in Sources */,
+ 8281F7D413D3412600BB4FA9 /* REVClusterManager.m in Sources */,
+ 8281F7D513D3412600BB4FA9 /* REVClusterMapView.m in Sources */,
+ 8281F7D613D3412600BB4FA9 /* REVClusterPin.m in Sources */,
+ 8281F7DB13D3414E00BB4FA9 /* REVMapViewController.m in Sources */,
+ 8281F7FD13D34BAE00BB4FA9 /* REVClusterAnnotationView.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 8281F7AA13D3404D00BB4FA9 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 8281F7AB13D3404D00BB4FA9 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 8281F7B713D3404D00BB4FA9 /* MainWindow_iPhone.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 8281F7B813D3404D00BB4FA9 /* en */,
+ );
+ name = MainWindow_iPhone.xib;
+ sourceTree = "<group>";
+ };
+ 8281F7BE13D3404D00BB4FA9 /* MainWindow_iPad.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 8281F7BF13D3404D00BB4FA9 /* en */,
+ );
+ name = MainWindow_iPad.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 8281F7C113D3404D00BB4FA9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvmgcc42;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 8281F7C213D3404D00BB4FA9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_VERSION = com.apple.compilers.llvmgcc42;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 8281F7C413D3404D00BB4FA9 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "REVClusterMap/REVClusterMap-Prefix.pch";
+ INFOPLIST_FILE = "REVClusterMap/REVClusterMap-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ 8281F7C513D3404D00BB4FA9 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "REVClusterMap/REVClusterMap-Prefix.pch";
+ INFOPLIST_FILE = "REVClusterMap/REVClusterMap-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 8281F79713D3404D00BB4FA9 /* Build configuration list for PBXProject "REVClusterMap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8281F7C113D3404D00BB4FA9 /* Debug */,
+ 8281F7C213D3404D00BB4FA9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 8281F7C313D3404D00BB4FA9 /* Build configuration list for PBXNativeTarget "REVClusterMap" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8281F7C413D3404D00BB4FA9 /* Debug */,
+ 8281F7C513D3404D00BB4FA9 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 8281F79413D3404D00BB4FA9 /* Project object */;
+}
7 REVClusterMap.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:REVClusterMap.xcodeproj">
+ </FileRef>
+</Workspace>
5,757 ...proj/project.xcworkspace/xcuserdata/andyjacobs.xcuserdatad/UserInterfaceState.xcuserstate
5,757 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
10 ...deproj/project.xcworkspace/xcuserdata/andyjacobs.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+ <true/>
+ <key>IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges</key>
+ <true/>
+</dict>
+</plist>
5 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ type = "1"
+ version = "1.0">
+</Bucket>
76 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcschemes/REVClusterMap.xcscheme
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8281F79C13D3404D00BB4FA9"
+ BuildableName = "REVClusterMap.app"
+ BlueprintName = "REVClusterMap"
+ ReferencedContainer = "container:REVClusterMap.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ displayScaleIsEnabled = "NO"
+ displayScale = "1.00"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8281F79C13D3404D00BB4FA9"
+ BuildableName = "REVClusterMap.app"
+ BlueprintName = "REVClusterMap"
+ ReferencedContainer = "container:REVClusterMap.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ displayScaleIsEnabled = "NO"
+ displayScale = "1.00"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8281F79C13D3404D00BB4FA9"
+ BuildableName = "REVClusterMap.app"
+ BlueprintName = "REVClusterMap"
+ ReferencedContainer = "container:REVClusterMap.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
22 REVClusterMap.xcodeproj/xcuserdata/andyjacobs.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SchemeUserState</key>
+ <dict>
+ <key>REVClusterMap.xcscheme</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>SuppressBuildableAutocreation</key>
+ <dict>
+ <key>8281F79C13D3404D00BB4FA9</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ </dict>
+</dict>
+</plist>
16 REVClusterMap/MyClass.h
@@ -0,0 +1,16 @@
+//
+// MyClass.h
+// REVClusterMap
+//
+// Created by Andy Jacobs on 17/07/11.
+// Copyright 2011 REVOLVER. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface REVClusterAnnotationView : MKAnnotationView {
+
+}
+
+@end
14 REVClusterMap/MyClass.m
@@ -0,0 +1,14 @@
+//
+// MyClass.m
+// REVClusterMap
+//
+// Created by Andy Jacobs on 17/07/11.
+// Copyright 2011 REVOLVER. All rights reserved.
+//
+
+#import "REVClusterAnnotationView.h"
+
+
+@implementation REVClusterAnnotationView
+
+@end
19 REVClusterMap/REVClusterAnnotationView.h
@@ -0,0 +1,19 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+
+@interface REVClusterAnnotationView : MKAnnotationView <MKAnnotation> {
+ UILabel *label;
+}
+- (void) setClusterText:(NSString *)text;
+@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
+@end
46 REVClusterMap/REVClusterAnnotationView.m
@@ -0,0 +1,46 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterAnnotationView.h"
+
+
+@implementation REVClusterAnnotationView
+
+@synthesize coordinate;
+
+- (id) initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
+ if ( self )
+ {
+ label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 26, 26)];
+ [self addSubview:label];
+ label.textColor = [UIColor whiteColor];
+ label.backgroundColor = [UIColor clearColor];
+ label.font = [UIFont boldSystemFontOfSize:11];
+ label.textAlignment = UITextAlignmentCenter;
+ label.shadowColor = [UIColor blackColor];
+ label.shadowOffset = CGSizeMake(0,-1);
+ }
+ return self;
+}
+
+- (void) setClusterText:(NSString *)text
+{
+ label.text = text;
+}
+
+- (void) dealloc
+{
+ [label release], label = nil;
+ [super dealloc];
+}
+
+@end
53 REVClusterMap/REVClusterMap-Info.plist
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>Icon.png</string>
+ <string>Icon@2x.png</string>
+ <string>Icon-72.png</string>
+ </array>
+ <key>CFBundleIdentifier</key>
+ <string>be.REVOLVER.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow_iPhone</string>
+ <key>NSMainNibFile~ipad</key>
+ <string>MainWindow_iPad</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UIStatusBarHidden</key>
+ <true/>
+</dict>
+</plist>
20 REVClusterMap/REVClusterMap-Prefix.pch
@@ -0,0 +1,20 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_3_0
+#warning "This project uses features only available in iPhone SDK 3.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
29 REVClusterMap/REVClusterMap/REVAnnotationsCollection.h
@@ -0,0 +1,29 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+
+@interface REVAnnotationsCollection : NSObject {
+ NSMutableArray *collection;
+
+ double xSum;
+ double ySum;
+}
+
+@property (nonatomic,readonly) NSMutableArray *collection;
+
+@property double xSum;
+@property double ySum;
+
+- (void) addObject:(id<MKAnnotation>)annotation;
+- (id) objectAtIndex:(NSUInteger)index;
+- (NSUInteger) count;
+@end
53 REVClusterMap/REVClusterMap/REVAnnotationsCollection.m
@@ -0,0 +1,53 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+#import "REVAnnotationsCollection.h"
+
+
+@implementation REVAnnotationsCollection
+
+@synthesize xSum,ySum;
+@synthesize collection;
+
+
+- (id) init
+{
+ self = [super init];
+ if( self )
+ {
+ collection = [[NSMutableArray alloc] init];
+ xSum = 0;
+ ySum = 0;
+ }
+ return self;
+}
+
+- (void) addObject:(id<MKAnnotation>)annotation;
+{
+ [collection addObject:annotation];
+ MKMapPoint mapPoint = MKMapPointForCoordinate( [annotation coordinate] );
+ xSum += mapPoint.x;
+ ySum += mapPoint.y;
+}
+- (id) objectAtIndex:(NSUInteger)index
+{
+ return [collection objectAtIndex:index];
+}
+- (NSUInteger) count
+{
+ return [collection count];
+}
+
+
+-(void)dealloc
+{
+ [collection release], collection = nil;
+ [super dealloc];
+}
+@end
28 REVClusterMap/REVClusterMap/REVClusterBlock.h
@@ -0,0 +1,28 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+#import "REVAnnotationsCollection.h"
+
+@interface REVClusterBlock : NSObject {
+ REVAnnotationsCollection *annotationsCollection;
+
+ MKMapRect blockRect;
+}
+
+@property MKMapRect blockRect;
+
+- (void) addAnnotation:(id<MKAnnotation>)annotation;
+- (id<MKAnnotation>) getClusteredAnnotation;
+- (id<MKAnnotation>) getAnnotationForIndex:(NSInteger)index;
+- (NSInteger) count;
+
+@end
69 REVClusterMap/REVClusterMap/REVClusterBlock.m
@@ -0,0 +1,69 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterMap.h"
+
+@implementation REVClusterBlock
+
+@synthesize blockRect;
+
+- (void) addAnnotation:(id<MKAnnotation>)annotation
+{
+ if( !annotationsCollection )
+ {
+ annotationsCollection = [[REVAnnotationsCollection alloc] init];
+ }
+
+ [annotationsCollection addObject:annotation];
+}
+- (id<MKAnnotation>) getAnnotationForIndex:(NSInteger)index
+{
+ return [annotationsCollection objectAtIndex:index];
+}
+
+- (id<MKAnnotation>) getClusteredAnnotation
+{
+ if( [self count] == 1 )
+ {
+ return [self getAnnotationForIndex:0];
+ } else if ( [self count] > 1 )
+ {
+
+ double x = [annotationsCollection xSum] / [annotationsCollection count];
+ double y = [annotationsCollection ySum] / [annotationsCollection count];
+
+ CLLocationCoordinate2D location = MKCoordinateForMapPoint(MKMapPointMake(x, y));
+
+ REVClusterPin *pin = [[[REVClusterPin alloc] init] autorelease];
+ pin.coordinate = location;
+ pin.nodes = [annotationsCollection collection];
+ return pin;
+
+ }
+ return nil;
+}
+
+- (NSInteger) count
+{
+ return [annotationsCollection count];
+}
+
+- (NSString*) description
+{
+ return [NSString stringWithFormat:@"%i annotations",[self count]];
+}
+
+- (void) dealloc
+{
+ [annotationsCollection release], annotationsCollection = nil;
+ [super dealloc];
+}
+
+@end
27 REVClusterMap/REVClusterMap/REVClusterManager.h
@@ -0,0 +1,27 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+#import "REVClusterBlock.h"
+#import "REVClusterPin.h"
+
+@interface REVClusterManager : NSObject {
+
+}
+
++ (NSArray *) clusterForMapView:(MKMapView *)mapView forAnnotations:(NSArray *)pins ;
++ (NSArray *) clusterAnnotationsForMapView:(MKMapView *)mapView forAnnotations:(NSArray *)pins blocks:(NSUInteger)blocks minClusterLevel:(NSUInteger)minClusterLevel;
+
++ (BOOL) clusterAlreadyExistsForMapView:(MKMapView *)mapView andBlockCluster:(REVClusterBlock *)cluster;
+- (NSInteger)getGlobalTileNumberFromMapView:(MKMapView *)mapView forLocalTileNumber:(NSInteger)tileNumber;
++ (MKPolygon *)polygonForMapRect:(MKMapRect)mapRect;
+
+@end
159 REVClusterMap/REVClusterMap/REVClusterManager.m
@@ -0,0 +1,159 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterManager.h"
+
+
+#define BASE_RADIUS .5 // = 1 mile
+#define MINIMUM_LATITUDE_DELTA 0.20
+#define BLOCKS 4
+
+#define MINIMUM_CLUSTER_LEVEL 100000
+
+@implementation REVClusterManager
+
+
++ (NSArray *) clusterAnnotationsForMapView:(MKMapView *)mapView forAnnotations:(NSArray *)pins blocks:(NSUInteger)blocks minClusterLevel:(NSUInteger)minClusterLevel
+{
+ NSMutableArray *visibleAnnotations = [NSMutableArray array];
+
+ double tileX = mapView.visibleMapRect.origin.x;
+ double tileY = mapView.visibleMapRect.origin.y;
+ float tileWidth = mapView.visibleMapRect.size.width/BLOCKS;
+ float tileHeight = mapView.visibleMapRect.size.height/BLOCKS;
+
+ MKMapRect mapRect = MKMapRectWorld;
+ NSUInteger maxWidthBlocks = round(mapRect.size.width / tileWidth);
+
+ float zoomLevel = maxWidthBlocks / BLOCKS;
+
+ float tileStartX = floorf(tileX/tileWidth)*tileWidth;
+ float tileStartY = floorf(tileY/tileHeight)*tileHeight;
+
+ MKMapRect visibleMapRect = MKMapRectMake(tileStartX, tileStartY, tileWidth*(BLOCKS+1), tileHeight*(BLOCKS+1));
+
+ for (id<MKAnnotation> point in pins)
+ {
+ MKMapPoint mapPoint = MKMapPointForCoordinate(point.coordinate);
+ if( MKMapRectContainsPoint(visibleMapRect,mapPoint) )
+ {
+ if( ![mapView.annotations containsObject:point] )
+ {
+ [visibleAnnotations addObject:point];
+ }
+ }
+ }
+
+ if( zoomLevel > minClusterLevel )
+ {
+ return visibleAnnotations;
+ }
+
+ NSMutableArray *clusteredBlocks = [NSMutableArray array];
+ int i = 0;
+ int length = (BLOCKS+1)*(BLOCKS+1);
+ for ( ; i < length ; i ++ )
+ {
+ REVClusterBlock *block = [[REVClusterBlock alloc] init];
+ [clusteredBlocks addObject:block];
+ [block release];
+ }
+
+ for (REVClusterPin *pin in visibleAnnotations)
+ {
+ MKMapPoint mapPoint = MKMapPointForCoordinate(pin.coordinate);
+
+ double localPointX = mapPoint.x - tileStartX;
+ double localPointY = mapPoint.y - tileStartY;
+
+ int localTileNumberX = floor( localPointX / tileWidth );
+ int localTileNumberY = floor( localPointY / tileHeight );
+ int localTileNumber = localTileNumberX + (localTileNumberY * (BLOCKS+1));
+
+ [(REVClusterBlock *)[clusteredBlocks objectAtIndex:localTileNumber] addAnnotation:pin];
+ }
+
+ //create New Pins
+ NSMutableArray *newPins = [NSMutableArray array];
+ for ( REVClusterBlock *block in clusteredBlocks )
+ {
+ if( [block count] > 0 )
+ {
+ if( ![REVClusterManager clusterAlreadyExistsForMapView:mapView andBlockCluster:block] )
+ {
+ [newPins addObject:[block getClusteredAnnotation]];
+ }
+ }
+ }
+ return newPins;
+}
+
++ (BOOL) clusterAlreadyExistsForMapView:(MKMapView *)mapView andBlockCluster:(REVClusterBlock *)cluster
+{
+ for ( REVClusterPin *pin in mapView.annotations )
+ {
+ if( [[pin nodes] count] > 0 )
+ {
+ MKMapPoint point1 = MKMapPointForCoordinate([pin coordinate]);
+ MKMapPoint point2 = MKMapPointForCoordinate([[cluster getClusteredAnnotation] coordinate]);
+
+ if( MKMapPointEqualToPoint(point1,point2) )
+ {
+ return YES;
+ }
+ }
+ }
+ return NO;
+}
+
++ (NSArray *) clusterForMapView:(MKMapView *)mapView forAnnotations:(NSArray *)pins
+{
+ return [self clusterAnnotationsForMapView:mapView forAnnotations:pins blocks:BLOCKS minClusterLevel:MINIMUM_CLUSTER_LEVEL];
+}
+
++ (MKPolygon *)polygonForMapRect:(MKMapRect)mapRect
+{
+ MKMapPoint mapRectPoints[5]={
+ MKMapPointMake(mapRect.origin.x, mapRect.origin.y),
+ MKMapPointMake(mapRect.origin.x+mapRect.size.width, mapRect.origin.y),
+ MKMapPointMake(mapRect.origin.x+mapRect.size.width, mapRect.origin.y+mapRect.size.height),
+ MKMapPointMake(mapRect.origin.x, mapRect.origin.y+mapRect.size.height),
+
+ MKMapPointMake(mapRect.origin.x, mapRect.origin.y)
+ };
+ return [MKPolygon polygonWithPoints:mapRectPoints count:5];
+}
+
+- (NSInteger)getGlobalTileNumberFromMapView:(MKMapView *)mapView forLocalTileNumber:(NSInteger)tileNumber
+{
+ double tileX = mapView.visibleMapRect.origin.x;
+ double tileY = mapView.visibleMapRect.origin.y;
+ double tileWidth = mapView.visibleMapRect.size.width/BLOCKS;
+ double tileHeight = mapView.visibleMapRect.size.height/BLOCKS;
+
+
+ MKMapRect mapRect = MKMapRectWorld;
+ NSUInteger maxWidthBlocks = round(mapRect.size.width / tileWidth);
+ NSUInteger maxHeightBlocks = round(mapRect.size.height / tileHeight);
+
+ double tileStartX = floor((tileX/mapRect.size.width) * maxWidthBlocks)*tileWidth;
+ double tileStartY = floor((tileY/mapRect.size.height) * maxHeightBlocks)*tileHeight;
+
+ double currentTileX = tileStartX + (tileWidth * (tileNumber % (BLOCKS+1)));
+ double currentTileY = tileStartY + (tileHeight * floor(tileNumber/(BLOCKS+1)));
+
+ NSInteger g = round((currentTileY / tileHeight) * maxWidthBlocks);
+ g += round(currentTileX / tileWidth);
+
+ return g;
+
+}
+
+@end
17 REVClusterMap/REVClusterMap/REVClusterMap.h
@@ -0,0 +1,17 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+#import "REVClusterMapView.h"
+#import "REVAnnotationsCollection.h"
+#import "REVClusterManager.h"
+#import "REVClusterBlock.h"
+#import "REVClusterPin.h"
32 REVClusterMap/REVClusterMap/REVClusterMapView.h
@@ -0,0 +1,32 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+
+@interface REVClusterMapView : MKMapView <MKMapViewDelegate> {
+
+ NSUInteger blocks;
+ NSUInteger minimumClusterLevel;
+
+ NSArray *annotationsCopy;
+
+ double zoomLevel;
+
+}
+/// The number of divisions made depending on the visible rect. default is 4, maximum is 1024, minimum is 2 (lower is less accurate but faster), The actual count of divisions is this value to the power of 2.
+@property (nonatomic,assign) NSUInteger blocks;
+/// The maximum level when clustering is active in the Mapview. default value is 100000, maximum is 419430
+@property (nonatomic,assign) NSUInteger minimumClusterLevel;
+
+/** Specifies the receiver’s delegate object. */
+@property(nonatomic,assign) id<MKMapViewDelegate> delegate;
+
+@end
232 REVClusterMap/REVClusterMap/REVClusterMapView.m
@@ -0,0 +1,232 @@
+
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterMapView.h"
+#import "REVClusterManager.h"
+
+@interface REVClusterMapView (Private)
+- (BOOL) mapViewDidZoom;
+@end
+
+@implementation REVClusterMapView
+
+@synthesize minimumClusterLevel;
+@synthesize blocks;
+@synthesize delegate;
+
+
+- (id) initWithFrame:(CGRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self)
+ {
+ annotationsCopy = nil;
+
+ self.minimumClusterLevel = 100000;
+ self.blocks = 4;
+
+ super.delegate = self;
+
+ zoomLevel = self.visibleMapRect.size.width * self.visibleMapRect.size.height;
+ }
+ return self;
+}
+
+
+
+-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
+{
+ if( [delegate respondsToSelector:@selector(mapView:viewForOverlay:)] )
+ {
+ return [delegate mapView:mapView viewForOverlay:overlay];
+ }
+ return nil;
+}
+
+- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
+{
+ if( [delegate respondsToSelector:@selector(mapView:viewForAnnotation:)] )
+ {
+ return [delegate mapView:mapView viewForAnnotation:annotation];
+ }
+ return nil;
+}
+
+
+- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
+{
+ if( [delegate respondsToSelector:@selector(mapView:regionWillChangeAnimated:)] )
+ {
+ [delegate mapView:mapView regionWillChangeAnimated:animated];
+ }
+}
+
+- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView
+{
+ if( [delegate respondsToSelector:@selector(mapViewWillStartLoadingMap:)] )
+ {
+ [delegate mapViewWillStartLoadingMap:mapView];
+ }
+}
+- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
+{
+ if( [delegate respondsToSelector:@selector(mapViewDidFinishLoadingMap:)] )
+ {
+ [delegate mapViewDidFinishLoadingMap:mapView];
+ }
+}
+- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
+{
+ if( [delegate respondsToSelector:@selector(mapViewDidFailLoadingMap:withError:)] )
+ {
+ [delegate mapViewDidFailLoadingMap:mapView withError:error];
+ }
+}
+- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
+{
+ if( [delegate respondsToSelector:@selector(mapView:didAddAnnotationViews:)] )
+ {
+ [delegate mapView:mapView didAddAnnotationViews:views];
+ }
+}
+
+- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
+{
+ if( [delegate respondsToSelector:@selector(mapView:annotationView:calloutAccessoryControlTapped:)] )
+ {
+ [delegate mapView:mapView annotationView:view calloutAccessoryControlTapped:control];
+ }
+}
+
+- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
+{
+ if( [delegate respondsToSelector:@selector(mapView:didSelectAnnotationView:)] )
+ {
+ [delegate mapView:mapView didSelectAnnotationView:view];
+ }
+}
+- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
+{
+ if( [delegate respondsToSelector:@selector(mapView:didDeselectAnnotationView:)] )
+ {
+ [delegate mapView:mapView didDeselectAnnotationView:view];
+ }
+}
+
+- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView
+{
+ if( [delegate respondsToSelector:@selector(mapViewWillStartLocatingUser:)] )
+ {
+ [delegate mapViewWillStartLocatingUser:mapView];
+ }
+}
+- (void)mapViewDidStopLocatingUser:(MKMapView *)mapView
+{
+ if( [delegate respondsToSelector:@selector(mapViewDidStopLocatingUser:)] )
+ {
+ [delegate mapViewDidStopLocatingUser:mapView];
+ }
+}
+- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
+{
+ if( [delegate respondsToSelector:@selector(mapView:didUpdateUserLocation:)] )
+ {
+ [delegate mapView:mapView didUpdateUserLocation:userLocation];
+ }
+}
+- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
+{
+ if( [delegate respondsToSelector:@selector(mapView:didFailToLocateUserWithError:)] )
+ {
+ [delegate mapView:mapView didFailToLocateUserWithError:error];
+ }
+}
+
+- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState
+ fromOldState:(MKAnnotationViewDragState)oldState
+{
+ if( [delegate respondsToSelector:@selector(mapView:annotationView:didChangeDragState:fromOldState:)] )
+ {
+ [delegate mapView:mapView annotationView:view didChangeDragState:newState fromOldState:oldState];
+ }
+}
+
+// Called after the provided overlay views have been added and positioned in the map.
+- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews
+{
+ if( [delegate respondsToSelector:@selector(mapView:didAddOverlayViews:)] )
+ {
+ [delegate mapView:mapView didAddOverlayViews:overlayViews];
+ }
+}
+
+- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
+{
+
+ if( [self mapViewDidZoom] )
+ {
+ [super removeAnnotations:self.annotations];
+ self.showsUserLocation = self.showsUserLocation;
+ }
+
+ NSArray *add = [REVClusterManager clusterAnnotationsForMapView:self forAnnotations:annotationsCopy blocks:self.blocks minClusterLevel:self.minimumClusterLevel];
+ //NSLog(@"count:: %i",[add count]);
+ [super addAnnotations:add];
+
+ if( [delegate respondsToSelector:@selector(mapView:regionDidChangeAnimated:)] )
+ {
+ [delegate mapView:mapView regionDidChangeAnimated:animated];
+ }
+}
+
+- (BOOL) mapViewDidZoom
+{
+
+ if( zoomLevel == self.visibleMapRect.size.width * self.visibleMapRect.size.height )
+ {
+ zoomLevel = self.visibleMapRect.size.width * self.visibleMapRect.size.height;
+ return NO;
+ }
+ zoomLevel = self.visibleMapRect.size.width * self.visibleMapRect.size.height;
+ return YES;
+}
+
+- (void) addAnnotations:(NSArray *)annotations
+{
+ [annotationsCopy release];
+ annotationsCopy = [annotations copy];
+
+ NSArray *add = [REVClusterManager clusterAnnotationsForMapView:self forAnnotations:annotations blocks:self.blocks minClusterLevel:self.minimumClusterLevel];
+
+ [super addAnnotations:add];
+}
+
+
+- (void) setMaximumClusterLevel:(NSUInteger)value
+{
+ if ( value > 419430 )
+ minimumClusterLevel = 419430;
+ else
+ minimumClusterLevel = round(value);
+}
+
+- (void) setBlocks:(NSUInteger)value
+{
+ if( value > 1024 )
+ blocks = 1024;
+ else if ( value < 2 )
+ blocks = 2;
+ else
+ blocks = round(value);
+
+}
+
+@end
29 REVClusterMap/REVClusterMap/REVClusterPin.h
@@ -0,0 +1,29 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <Foundation/Foundation.h>
+#import <MapKit/MapKit.h>
+
+@interface REVClusterPin : NSObject <MKAnnotation> {
+ CLLocationCoordinate2D coordinate;
+ NSString *title;
+ NSString *subtitle;
+
+ NSArray *nodes;
+
+}
+@property(nonatomic, retain) NSArray *nodes;
+@property(nonatomic, assign) CLLocationCoordinate2D coordinate;
+@property(nonatomic, copy) NSString *title;
+@property(nonatomic, copy) NSString *subtitle;
+
+- (NSUInteger) nodeCount;
+
+@end
24 REVClusterMap/REVClusterMap/REVClusterPin.m
@@ -0,0 +1,24 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterPin.h"
+
+
+@implementation REVClusterPin
+@synthesize title,coordinate,subtitle;
+@synthesize nodes;
+
+- (NSUInteger) nodeCount
+{
+ if( nodes )
+ return [nodes count];
+ return 0;
+}
+@end
21 REVClusterMap/REVClusterMapAppDelegate.h
@@ -0,0 +1,21 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <UIKit/UIKit.h>
+#import "REVMapViewController.h"
+@interface REVClusterMapAppDelegate : NSObject <UIApplicationDelegate> {
+ REVMapViewController *viewController;
+}
+
+@property (nonatomic,retain) REVMapViewController *viewController;
+
+@property (nonatomic, retain) IBOutlet UIWindow *window;
+
+@end
78 REVClusterMap/REVClusterMapAppDelegate.m
@@ -0,0 +1,78 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterMapAppDelegate.h"
+
+
+@implementation REVClusterMapAppDelegate
+
+
+@synthesize window=_window;
+@synthesize viewController;
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ [self.window makeKeyAndVisible];
+
+ viewController = [[REVMapViewController alloc] init];
+ [self.window addSubview:viewController.view];
+
+
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ /*
+ Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+ */
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ /*
+ Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ */
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ /*
+ Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+ */
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ /*
+ Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ */
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ /*
+ Called when the application is about to terminate.
+ Save data if appropriate.
+ See also applicationDidEnterBackground:.
+ */
+}
+
+- (void)dealloc
+{
+ [viewController release];
+ [_window release];
+ [super dealloc];
+}
+
+@end
18 REVClusterMap/REVMapViewController.h
@@ -0,0 +1,18 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <UIKit/UIKit.h>
+#import "REVClusterMapView.h"
+
+@interface REVMapViewController : UIViewController <MKMapViewDelegate> {
+ REVClusterMapView *_mapView;
+}
+
+@end
126 REVClusterMap/REVMapViewController.m
@@ -0,0 +1,126 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVMapViewController.h"
+#import "REVClusterMap.h"
+#import "REVClusterAnnotationView.h"
+
+#define BASE_RADIUS .5 // = 1 mile
+#define MINIMUM_LATITUDE_DELTA 0.20
+#define BLOCKS 4
+
+#define MINIMUM_ZOOM_LEVEL 100000
+
+@implementation REVMapViewController
+
+
+- (void)dealloc
+{
+ [_mapView release], _mapView = nil;
+ [super dealloc];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ // Releases the view if it doesn't have a superview.
+ [super didReceiveMemoryWarning];
+
+ // Release any cached data, images, etc that aren't in use.
+}
+
+#pragma mark - View lifecycle
+
+
+// Implement loadView to create a view hierarchy programmatically, without using a nib.
+- (void)loadView
+{
+ [super loadView];
+
+ CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];
+
+ _mapView = [[REVClusterMapView alloc] initWithFrame:viewBounds];
+ _mapView.delegate = self;
+ [self.view addSubview:_mapView];
+
+ CLLocationCoordinate2D coordinate;
+ coordinate.latitude = 51.22;
+ coordinate.longitude = 4.39625;
+ _mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 5000, 5000);
+
+ NSMutableArray *pins = [NSMutableArray array];
+
+ for(int i=0;i<5000;i++) {
+ CGFloat latDelta = rand()*0.125/RAND_MAX - 0.02;
+ CGFloat lonDelta = rand()*0.130/RAND_MAX - 0.08;
+
+ CGFloat lat = 51.21992;
+ CGFloat lng = 4.39625;
+
+
+ CLLocationCoordinate2D newCoord = {lat+latDelta, lng+lonDelta};
+ REVClusterPin *pin = [[REVClusterPin alloc] init];
+ pin.title = [NSString stringWithFormat:@"Pin %i",i+1];;
+ pin.subtitle = [NSString stringWithFormat:@"Pin %i subtitle",i+1];
+ pin.coordinate = newCoord;
+ [pins addObject:pin];
+ [pin release];
+ }
+
+ [_mapView addAnnotations:pins];
+
+}
+
+- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
+{
+ REVClusterPin *pin = (REVClusterPin *)annotation;
+
+ MKAnnotationView *annView;
+
+ if( [pin nodeCount] > 0 ){
+ annView = (REVClusterAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"cluster"];
+
+ if( !annView )
+ annView = (REVClusterAnnotationView*)[[[REVClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"cluster"] autorelease];
+
+ annView.image = [UIImage imageNamed:@"cluster.png"];
+ [(REVClusterAnnotationView*)annView setClusterText:[NSString stringWithFormat:@"%i",[pin nodeCount]]];
+ annView.canShowCallout = YES;
+ } else {
+ annView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"pin"];
+
+ if( !annView )
+ annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pin"] autorelease];
+
+ annView.image = [UIImage imageNamed:@"pinpoint.png"];
+ annView.canShowCallout = YES;
+ }
+ return annView;
+}
+
+- (void)viewDidUnload
+{
+ [super viewDidUnload];
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+}
+
+- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
+{
+ [_mapView removeAnnotations:_mapView.annotations];
+ _mapView.frame = self.view.bounds;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ // Return YES for supported orientations
+ return YES;
+}
+
+@end
BIN REVClusterMap/Recources/Default-ipad-Landscape.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/Default-iphone.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/Default@2x-iphone.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/Icon-72.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/Icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/Icon@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/assets/cluster.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/assets/cluster@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/assets/pinpoint.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN REVClusterMap/Recources/assets/pinpoint@2x.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 REVClusterMap/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
18 REVClusterMap/iPad/REVClusterMapAppDelegate_iPad.h
@@ -0,0 +1,18 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <UIKit/UIKit.h>
+#import "REVClusterMapAppDelegate.h"
+
+@interface REVClusterMapAppDelegate_iPad : REVClusterMapAppDelegate {
+
+}
+
+@end
20 REVClusterMap/iPad/REVClusterMapAppDelegate_iPad.m
@@ -0,0 +1,20 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterMapAppDelegate_iPad.h"
+
+@implementation REVClusterMapAppDelegate_iPad
+
+- (void)dealloc
+{
+ [super dealloc];
+}
+
+@end
362 REVClusterMap/iPad/en.lproj/MainWindow_iPad.xib
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1024</int>
+ <string key="IBDocument.SystemVersion">10D573</string>
+ <string key="IBDocument.InterfaceBuilderVersion">786</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">460.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">112</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="2"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBProxyObject" id="606714003">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBUIWindow" id="62075450">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">292</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUILabel" id="348798989">
+ <reference key="NSNextResponder" ref="62075450"/>
+ <int key="NSvFlags">301</int>
+ <string key="NSFrame">{{284, 501}, {200, 22}}</string>
+ <reference key="NSSuperview" ref="62075450"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <string key="IBUIText">My Universal App on iPad</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MCAwIDAAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">1</int>
+ <float key="IBUIMinimumFontSize">10</float>
+ </object>
+ </object>
+ <string key="NSFrameSize">{768, 1024}</string>
+ <reference key="NSSuperview"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAxIDEAA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIResizesToFullScreen">YES</bool>
+ </object>
+ <object class="IBUICustomObject" id="250404236">
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="250404236"/>
+ <reference key="destination" ref="62075450"/>
+ </object>
+ <int key="connectionID">7</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="250404236"/>
+ </object>
+ <int key="connectionID">8</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="606714003"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="62075450"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="348798989"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="250404236"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="348798989"/>
+ <reference key="parent" ref="62075450"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>11.IBPluginDependency</string>
+ <string>2.IBEditorWindowLastContentRect</string>
+ <string>2.IBPluginDependency</string>
+ <string>6.CustomClassName</string>
+ <string>6.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>UIApplication</string>
+ <string>UIResponder</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>{{202, 84}, {783, 772}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>REVClusterMapAppDelegate_iPad</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">11</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">REVClusterMapAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">window</string>
+ <string key="NS.object.0">UIWindow</string>
+ </object>
+ <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <string key="NS.key.0">window</string>
+ <object class="IBToOneOutletInfo" key="NS.object.0">
+ <string key="name">window</string>
+ <string key="candidateClassName">UIWindow</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Shared/REVClusterMapAppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">REVClusterMapAppDelegate_iPad</string>
+ <string key="superclassName">REVClusterMapAppDelegate</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">iPad/REVClusterMapAppDelegate_iPad.h</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIApplication</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIApplication.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIResponder</string>
+ <string key="superclassName">NSObject</string>
+ <reference key="sourceIdentifier" ref="786211723"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIWindow</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIWindow.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+ <integer value="1024" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="3100" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../REVClusterMap.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <string key="IBCocoaTouchPluginVersion">112</string>
+ </data>
+</archive>
18 REVClusterMap/iPhone/REVClusterMapAppDelegate_iPhone.h
@@ -0,0 +1,18 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import <UIKit/UIKit.h>
+#import "REVClusterMapAppDelegate.h"
+
+@interface REVClusterMapAppDelegate_iPhone : REVClusterMapAppDelegate {
+
+}
+
+@end
20 REVClusterMap/iPhone/REVClusterMapAppDelegate_iPhone.m
@@ -0,0 +1,20 @@
+//
+//
+// ___ _____ ______ __ _ _________
+// / _ \/ __/ | / / __ \/ /| | / / __/ _ \
+// / , _/ _/ | |/ / /_/ / /_| |/ / _// , _/
+// /_/|_/___/ |___/\____/____/___/___/_/|_|
+//
+// Created by Bart Claessens. bart (at) revolver . be
+//
+
+#import "REVClusterMapAppDelegate_iPhone.h"
+
+@implementation REVClusterMapAppDelegate_iPhone
+
+- (void)dealloc
+{
+ [super dealloc];
+}
+
+@end
372 REVClusterMap/iPhone/en.lproj/MainWindow_iPhone.xib
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1024</int>
+ <string key="IBDocument.SystemVersion">10D573</string>
+ <string key="IBDocument.InterfaceBuilderVersion">786</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">460.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">112</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="2"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="450319686">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUICustomObject" id="987256611">
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIWindow" id="380026005">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">1316</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUILabel" id="723173800">
+ <reference key="NSNextResponder&