Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

First commit

  • Loading branch information...
commit 9c6d6a25df5a83a4cb41b4c518d10eaf18780e84 0 parents
Joe Hewitt joehewitt authored
Showing with 7,450 additions and 0 deletions.
  1. +13 −0 LICENSE
  2. +4 −0 README.mdown
  3. +11 −0 samples/T3Catalog/Classes/ImageTableViewCell.h
  4. +35 −0 samples/T3Catalog/Classes/ImageTableViewCell.m
  5. +8 −0 samples/T3Catalog/Classes/ImageTest1Controller.h
  6. +21 −0 samples/T3Catalog/Classes/ImageTest1Controller.m
  7. +7 −0 samples/T3Catalog/Classes/ImageTest2Controller.h
  8. +85 −0 samples/T3Catalog/Classes/ImageTest2Controller.m
  9. +6 −0 samples/T3Catalog/Classes/PhotoTest1Controller.h
  10. +210 −0 samples/T3Catalog/Classes/PhotoTest1Controller.m
  11. +6 −0 samples/T3Catalog/Classes/PhotoTest2Controller.h
  12. +210 −0 samples/T3Catalog/Classes/PhotoTest2Controller.m
  13. +7 −0 samples/T3Catalog/Classes/RootViewController.h
  14. +81 −0 samples/T3Catalog/Classes/RootViewController.m
  15. +31 −0 samples/T3Catalog/Classes/SamplePhotoSource.h
  16. +145 −0 samples/T3Catalog/Classes/SamplePhotoSource.m
  17. +9 −0 samples/T3Catalog/Classes/ScrollViewTestController.h
  18. +52 −0 samples/T3Catalog/Classes/ScrollViewTestController.m
  19. +12 −0 samples/T3Catalog/Classes/T3CatalogAppDelegate.h
  20. +20 −0 samples/T3Catalog/Classes/T3CatalogAppDelegate.m
  21. +8 −0 samples/T3Catalog/Classes/TextTest1Controller.h
  22. +24 −0 samples/T3Catalog/Classes/TextTest1Controller.m
  23. +7 −0 samples/T3Catalog/Classes/YouTubeTestController.h
  24. +21 −0 samples/T3Catalog/Classes/YouTubeTestController.m
  25. BIN  samples/T3Catalog/DefaultAlbum.png
  26. BIN  samples/T3Catalog/Icon.png
  27. +30 −0 samples/T3Catalog/Info.plist
  28. +272 −0 samples/T3Catalog/MainWindow.xib
  29. +195 −0 samples/T3Catalog/RootViewController.xib
  30. +448 −0 samples/T3Catalog/T3Catalog.xcodeproj/project.pbxproj
  31. +9 −0 samples/T3Catalog/T3Catalog_Prefix.pch
  32. +9 −0 samples/T3Catalog/main.m
  33. +157 −0 src/T3ActivityLabel.m
  34. +100 −0 src/T3ErrorView.m
  35. +492 −0 src/T3Global.m
  36. +135 −0 src/T3ImageView.m
  37. +366 −0 src/T3PaintedView.m
  38. +354 −0 src/T3Painter.m
  39. +244 −0 src/T3PhotoView.m
  40. +571 −0 src/T3PhotoViewController.m
  41. +293 −0 src/T3ScrollView.m
  42. +143 −0 src/T3ShinyLabel.m
  43. +52 −0 src/T3TableViewController.m
  44. +89 −0 src/T3ThumbView.m
  45. +121 −0 src/T3ThumbsTableViewCell.m
  46. +214 −0 src/T3ThumbsViewController.m
  47. +679 −0 src/T3URLCache.m
  48. +8 −0 src/T3URLImageRequest.m
  49. +39 −0 src/T3URLRequest.m
  50. +13 −0 src/T3UnclippedView.m
  51. +283 −0 src/T3ViewController.m
  52. +50 −0 src/T3YouTubeView.m
  53. +30 −0 src/Three20/T3ActivityLabel.h
  54. +15 −0 src/Three20/T3ErrorView.h
  55. +139 −0 src/Three20/T3Global.h
  56. +33 −0 src/Three20/T3ImageView.h
  57. +23 −0 src/Three20/T3Object.h
  58. +18 −0 src/Three20/T3PaintedView.h
  59. +57 −0 src/Three20/T3Painter.h
  60. +85 −0 src/Three20/T3PhotoSource.h
  61. +39 −0 src/Three20/T3PhotoView.h
  62. +44 −0 src/Three20/T3PhotoViewController.h
  63. +44 −0 src/Three20/T3ScrollView.h
  64. +24 −0 src/Three20/T3ShinyLabel.h
  65. +10 −0 src/Three20/T3TableViewController.h
  66. +15 −0 src/Three20/T3ThumbView.h
  67. +18 −0 src/Three20/T3ThumbsTableViewCell.h
  68. +12 −0 src/Three20/T3ThumbsViewController.h
  69. +157 −0 src/Three20/T3URLCache.h
  70. +15 −0 src/Three20/T3URLImageRequest.h
  71. +42 −0 src/Three20/T3URLRequest.h
  72. +8 −0 src/Three20/T3UnclippedView.h
  73. +195 −0 src/Three20/T3ViewController.h
  74. +11 −0 src/Three20/T3YouTubeView.h
  75. +17 −0 src/Three20/Three20.h
13 LICENSE
@@ -0,0 +1,13 @@
+Copyright 2008 Joe Hewitt
+
+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.
4 README.mdown
@@ -0,0 +1,4 @@
+Three20
+=======
+
+Three20 is an iPhone UI library.
11 samples/T3Catalog/Classes/ImageTableViewCell.h
@@ -0,0 +1,11 @@
+#import <UIKit/UIKit.h>
+
+@class T3ImageView;
+
+@interface ImageTableViewCell : UITableViewCell {
+ T3ImageView* imageView;
+}
+
+@property(nonatomic, copy) NSString* imageURL;
+
+@end
35 samples/T3Catalog/Classes/ImageTableViewCell.m
@@ -0,0 +1,35 @@
+#import "ImageTableViewCell.h"
+#import "T3ImageView.h"
+
+@implementation ImageTableViewCell
+
+- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
+ if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
+ self.indentationLevel = 1;
+ self.indentationWidth = 35;
+
+ imageView = [[T3ImageView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
+ imageView.defaultImage = [UIImage imageNamed:@"DefaultAlbum.png"];
+ [self addSubview:imageView];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [imageView release];
+ [super dealloc];
+}
+
+- (void)prepareForReuse {
+ imageView.url = nil;
+}
+
+- (NSString*)imageURL {
+ return imageView.url;
+}
+
+- (void)setImageURL:(NSString*)url {
+ imageView.url = url;
+}
+
+@end
8 samples/T3Catalog/Classes/ImageTest1Controller.h
@@ -0,0 +1,8 @@
+#import <UIKit/UIKit.h>
+
+@interface ImageTest1Controller : UIViewController {
+
+}
+
+@end
+
21 samples/T3Catalog/Classes/ImageTest1Controller.m
@@ -0,0 +1,21 @@
+
+#import "ImageTest1Controller.h"
+#import "Three20/Three20.h"
+
+@implementation ImageTest1Controller
+
+- (void)loadView {
+ self.view = [[[UIView alloc] init] autorelease];
+
+ T3ImageView* imageView = [[[T3ImageView alloc] initWithFrame:CGRectMake(30, 30, 0, 0)]
+ autorelease];
+ imageView.autoresizesToImage = YES;
+ imageView.url = @"http://farm4.static.flickr.com/3163/3110335722_7a906f9d8b_m.jpg";
+ [self.view addSubview:imageView];
+}
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+@end
7 samples/T3Catalog/Classes/ImageTest2Controller.h
@@ -0,0 +1,7 @@
+#import "Three20/Three20.h"
+
+@interface ImageTest2Controller : UITableViewController {
+ NSArray* imageURLs;
+}
+
+@end
85 samples/T3Catalog/Classes/ImageTest2Controller.m
@@ -0,0 +1,85 @@
+
+#import "ImageTest2Controller.h"
+#import "ImageTableViewCell.h"
+
+@implementation ImageTest2Controller
+
+- (void)viewDidLoad {
+ imageURLs = [[NSArray alloc] initWithObjects:
+ @"http://ecx.images-amazon.com/images/I/41WZ2SA9MXL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/61kJCUXbJcL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/51ew2Gt8XfL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/51HNJzq9L6L._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/61kf7tWTUoL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/51PrwPHighL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/617vLnxZ9jL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/4102AVDXS4L._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/41WT0H8RHHL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/511KZDNW1GL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/51ltArHi27L._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/415NG3SBHDL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/31TIYo%2BzR5L._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/519sCNd1qrL._SL160_AA115_.jpg",
+ @"http://ecx.images-amazon.com/images/I/51pLRnH5RKL._SL160_AA115_.jpg",
+ nil
+ ];
+}
+
+- (void)viewDidDisappear:(BOOL)animated {
+ [T3URLCache sharedCache].paused = NO;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return 70;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return 30;
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ ImageTableViewCell* cell = (ImageTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"image"];
+ if (cell == nil) {
+ cell = [[[ImageTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"image"] autorelease];
+ }
+
+ cell.imageURL = [imageURLs objectAtIndex:indexPath.row % imageURLs.count];
+ cell.text = [NSString stringWithFormat:@"Row %d", indexPath.row];
+ return cell;
+}
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// UIScrollViewDelegate
+
+- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
+ [T3URLCache sharedCache].paused = YES;
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
+ if (!decelerate) {
+ [T3URLCache sharedCache].paused = NO;
+ }
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
+ [T3URLCache sharedCache].paused = NO;
+}
+
+- (BOOL)scrollViewWillScrollToTop:(UIScrollView *)scrollView {
+ [T3URLCache sharedCache].paused = YES;
+ return YES;
+}
+
+- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
+ [T3URLCache sharedCache].paused = NO;
+}
+
+@end
+
6 samples/T3Catalog/Classes/PhotoTest1Controller.h
@@ -0,0 +1,6 @@
+#import "Three20/Three20.h"
+
+@interface PhotoTest1Controller : T3PhotoViewController {
+}
+
+@end
210 samples/T3Catalog/Classes/PhotoTest1Controller.m
@@ -0,0 +1,210 @@
+#import "PhotoTest1Controller.h"
+#import "SamplePhotoSource.h"
+
+@implementation PhotoTest1Controller
+
+- (void)viewDidLoad {
+ self.photoSource = [[SamplePhotoSource alloc] initWithPhotos:[[NSArray alloc] initWithObjects:
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ nil
+ ] delayed:YES];
+ self.photoSource.title = @"Flickr Photos";
+}
+
+@end
6 samples/T3Catalog/Classes/PhotoTest2Controller.h
@@ -0,0 +1,6 @@
+#import "Three20/Three20.h"
+
+@interface PhotoTest2Controller : T3ThumbsViewController {
+}
+
+@end
210 samples/T3Catalog/Classes/PhotoTest2Controller.m
@@ -0,0 +1,210 @@
+#import "PhotoTest2Controller.h"
+#import "SamplePhotoSource.h"
+
+@implementation PhotoTest2Controller
+
+- (void)viewDidLoad {
+ self.photoSource = [[SamplePhotoSource alloc] initWithPhotos:[[NSArray alloc] initWithObjects:
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3246/2957580101_33c799fc09_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3246/2957580101_d63ef56b15_t.jpg"
+ size:CGSizeMake(960, 1280)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3048/2942420409_20910290e9_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3048/2942420409_9c442b07ea_t.jpg"
+ size:CGSizeMake(1024, 684)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3239/2945308303_e692ebffe1_t.jpg"
+ size:CGSizeMake(683, 1024)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3160/2949948250_161a3914c1_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3160/2949948250_22eeaa085a_t.jpg"
+ size:CGSizeMake(1024, 678)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3017/2948109400_838ebc22ef_t.jpg"
+ size:CGSizeMake(1024, 681)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_b.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3290/2958486604_d217d02a6a_t.jpg"
+ size:CGSizeMake(2800, 1866)] autorelease],
+ [[[SamplePhoto alloc]
+ initWithURL:@"http://farm4.static.flickr.com/3280/2949707060_e639b539c5_o.jpg"
+ smallURL:@"http://farm4.static.flickr.com/3280/2949707060_8139284ba5_t.jpg"
+ size:CGSizeMake(800, 533)] autorelease],
+ nil
+ ] delayed:YES];
+ self.photoSource.title = @"Flickr Photos";
+}
+
+@end
7 samples/T3Catalog/Classes/RootViewController.h
@@ -0,0 +1,7 @@
+#import "Three20/Three20.h"
+
+@interface RootViewController : UITableViewController {
+ NSArray* controllers;
+}
+
+@end
81 samples/T3Catalog/Classes/RootViewController.m
@@ -0,0 +1,81 @@
+#import "RootViewController.h"
+#import "ImageTest1Controller.h"
+#import "ImageTest2Controller.h"
+#import "PhotoTest1Controller.h"
+#import "PhotoTest2Controller.h"
+#import "TextTest1Controller.h"
+#import "YouTubeTestController.h"
+#import "ScrollViewTestController.h"
+
+@implementation RootViewController
+
+- (void)pushControllerAtRow:(NSIndexPath*)indexPath animated:(BOOL)animated {
+ NSArray* section = [controllers objectAtIndex:indexPath.section*2+1];
+ Class controllerClass = [section objectAtIndex:indexPath.row*2+1];
+ UIViewController* controller = [[[controllerClass alloc] init] autorelease];
+ controller.title = [section objectAtIndex:indexPath.row*2];
+ [self.navigationController pushViewController:controller animated:animated];
+}
+
+- (void)viewDidLoad {
+ controllers = [[NSArray alloc] initWithObjects:
+ @"Images",
+ [[NSArray alloc] initWithObjects:
+ @"Simple Image", [ImageTest1Controller class],
+ @"Images in Table", [ImageTest2Controller class],
+ @"Photo Browser", [PhotoTest1Controller class],
+ @"Photo Thumbnails", [PhotoTest2Controller class],
+ nil],
+ @"Activity",
+ [[NSArray alloc] initWithObjects:
+ @"Shiny Label", [TextTest1Controller class],
+ nil],
+ @"Media",
+ [[NSArray alloc] initWithObjects:
+ @"YouTube Player", [YouTubeTestController class],
+ @"Scroll View", [ScrollViewTestController class],
+ nil],
+ nil];
+
+ [self pushControllerAtRow:[NSIndexPath indexPathForRow:1 inSection:2] animated:NO];
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return controllers.count/2;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)aSection {
+ NSArray* section = [controllers objectAtIndex:aSection*2+1];
+ return section.count/2;
+}
+
+- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
+ return [controllers objectAtIndex:section*2];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ static NSString *cellId = @"cell";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
+ if (cell == nil) {
+ cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellId] autorelease];
+ }
+
+ NSArray* section = [controllers objectAtIndex:indexPath.section*2+1];
+ cell.text = [section objectAtIndex:indexPath.row*2];
+
+ return cell;
+}
+
+ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ [self pushControllerAtRow:indexPath animated:YES];
+}
+
+- (void)didReceiveMemoryWarning {
+ [super didReceiveMemoryWarning];
+
+ // Empty out the image cache to free up memory
+ [[T3URLCache sharedCache] removeAll:NO];
+}
+
+@end
31 samples/T3Catalog/Classes/SamplePhotoSource.h
@@ -0,0 +1,31 @@
+#import "Three20/Three20.h"
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@interface SamplePhotoSource : NSObject <T3PhotoSource> {
+ id<T3PhotoSourceDelegate> delegate;
+ NSString* title;
+ NSMutableArray* photos;
+ NSArray* tempPhotos;
+ T3InvalidState isInvalid;
+ NSTimer* fakeLoadTimer;
+}
+
+- (id)initWithPhotos:(NSArray*)photos delayed:(BOOL)delayed;
+
+@end
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@interface SamplePhoto : NSObject<T3Photo> {
+ id<T3PhotoSource> photoSource;
+ NSString* thumbURL;
+ NSString* smallURL;
+ NSString* url;
+ CGSize size;
+ NSInteger index;
+}
+
+- (id)initWithURL:(NSString*)url smallURL:(NSString*)smallURL size:(CGSize)size;
+
+@end
145 samples/T3Catalog/Classes/SamplePhotoSource.m
@@ -0,0 +1,145 @@
+#import "SamplePhotoSource.h"
+
+@implementation SamplePhotoSource
+
+@synthesize title;
+
+- (id)initWithPhotos:(NSArray*)aPhotos delayed:(BOOL)delayed {
+ if (self = [super init]) {
+ tempPhotos = [aPhotos retain];
+
+ if (0 && delayed) {
+ isInvalid = T3Invalid;
+ } else {
+ [self performSelector:@selector(fakeLoadReady)];
+ }
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [fakeLoadTimer invalidate];
+ [photos release];
+ [tempPhotos release];
+ [super dealloc];
+}
+
+- (void)fakeLoadReady {
+ fakeLoadTimer = nil;
+ isInvalid = T3Valid;
+
+ photos = [[NSMutableArray alloc] initWithArray:tempPhotos];
+ [tempPhotos release];
+ tempPhotos = nil;
+
+ for (int i = 0; i < photos.count; ++i) {
+ id<T3Photo> photo = [photos objectAtIndex:i];
+ photo.photoSource = self;
+ photo.index = i;
+ }
+
+ [delegate photoSourceLoaded:self];
+ [delegate release];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// T3Object
+
+- (T3InvalidState)isInvalid {
+ return isInvalid;
+}
+
+- (void)setIsInvalid:(T3InvalidState)aState {
+ isInvalid = aState;
+}
+
+- (NSString*) viewURL {
+ return nil;
+}
+
++ (id<T3Object>)fromURL:(NSURL*)url {
+ return nil;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// T3PhotoSource
+
+- (NSUInteger)numberOfPhotos {
+ return photos.count;
+}
+
+- (NSUInteger)maxPhotoIndex {
+ return photos.count-1;
+}
+
+- (BOOL)loading {
+ return !!fakeLoadTimer;
+}
+
+- (id<T3Photo>)photoAtIndex:(NSUInteger)index {
+ if (index < photos.count) {
+ return [photos objectAtIndex:index];
+ } else {
+ return nil;
+ }
+}
+
+- (NSUInteger)indexOfPhoto:(id<T3Photo>)photo {
+ return [photos indexOfObject:photo];
+}
+
+- (void)loadPhotosFromIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex
+ delegate:(id<T3PhotoSourceDelegate>)aDelegate {
+ delegate = [aDelegate retain];
+ [delegate photoSourceLoading:self fromIndex:fromIndex toIndex:toIndex];
+
+ fakeLoadTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self
+ selector:@selector(fakeLoadReady) userInfo:nil repeats:NO];
+}
+
+@end
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation SamplePhoto
+
+@synthesize photoSource, thumbURL, smallURL, url, size, index;
+
+- (id)initWithURL:(NSString*)aURL smallURL:(NSString*)aSmallURL size:(CGSize)aSize {
+ if (self = [super init]) {
+ photoSource = nil;
+ url = [aURL copy];
+ smallURL = [aSmallURL copy];
+ thumbURL = [aSmallURL copy];
+ size = aSize;
+ index = NSIntegerMax;
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [url release];
+ [smallURL release];
+ [thumbURL release];
+ [super dealloc];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// T3Object
+
+- (T3InvalidState)isInvalid {
+ return T3Valid;
+}
+
+- (void)setIsInvalid:(T3InvalidState)aState {
+}
+
+- (NSString*) viewURL {
+ return nil;
+}
+
++ (id<T3Object>)fromURL:(NSURL*)url {
+ return nil;
+}
+
+@end
9 samples/T3Catalog/Classes/ScrollViewTestController.h
@@ -0,0 +1,9 @@
+#import "Three20/Three20.h"
+
+@interface ScrollViewTestController : T3ViewController
+ <T3ScrollViewDelegate, T3ScrollViewDataSource> {
+ T3ScrollView* _scrollView;
+ NSArray* colors;
+}
+
+@end
52 samples/T3Catalog/Classes/ScrollViewTestController.m
@@ -0,0 +1,52 @@
+#import "ScrollViewTestController.h"
+
+@implementation ScrollViewTestController
+
+- (void)dealloc {
+ [_scrollView release];
+ [colors release];
+ [super dealloc];
+}
+
+- (void)loadView {
+ self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
+
+ _scrollView = [[T3ScrollView alloc] initWithFrame:self.view.bounds];
+ _scrollView.delegate = self;
+ _scrollView.dataSource = self;
+ [self.view addSubview:_scrollView];
+
+ colors = [[NSArray arrayWithObjects:
+ [UIColor darkGrayColor],
+ [UIColor blueColor],
+ [UIColor redColor],
+ [UIColor yellowColor],
+ [UIColor orangeColor],
+ [UIColor cyanColor],
+ [UIColor purpleColor],
+ [UIColor brownColor],
+ [UIColor magentaColor],
+ [UIColor lightGrayColor],
+ nil
+ ] retain];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// T3ScrollViewDataSource
+
+- (NSInteger)numberOfItemsInScrollView:(T3ScrollView*)scrollView {
+ return 10;
+}
+
+- (UIView*)scrollView:(T3ScrollView*)scrollView pageAtIndex:(NSInteger)index {
+ UIView* pageView = [_scrollView dequeueReusablePage];
+ if (!pageView) {
+ pageView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
+ }
+
+ pageView.backgroundColor = [colors objectAtIndex:index];
+
+ return pageView;
+}
+
+@end
12 samples/T3Catalog/Classes/T3CatalogAppDelegate.h
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+@interface T3CatalogAppDelegate : NSObject <UIApplicationDelegate> {
+ IBOutlet UIWindow *window;
+ IBOutlet UINavigationController *navigationController;
+}
+
+@property (nonatomic, retain) UIWindow *window;
+@property (nonatomic, retain) UINavigationController *navigationController;
+
+@end
+
20 samples/T3Catalog/Classes/T3CatalogAppDelegate.m
@@ -0,0 +1,20 @@
+#import "T3CatalogAppDelegate.h"
+#import "RootViewController.h"
+
+@implementation T3CatalogAppDelegate
+
+@synthesize window;
+@synthesize navigationController;
+
+- (void)applicationDidFinishLaunching:(UIApplication *)application {
+ [window addSubview:[navigationController view]];
+ [window makeKeyAndVisible];
+}
+
+- (void)dealloc {
+ [navigationController release];
+ [window release];
+ [super dealloc];
+}
+
+@end
8 samples/T3Catalog/Classes/TextTest1Controller.h
@@ -0,0 +1,8 @@
+#import <UIKit/UIKit.h>
+
+@interface TextTest1Controller : UIViewController {
+
+}
+
+@end
+
24 samples/T3Catalog/Classes/TextTest1Controller.m
@@ -0,0 +1,24 @@
+
+#import "TextTest1Controller.h"
+#import "Three20/Three20.h"
+
+@implementation TextTest1Controller
+
+- (void)loadView {
+ self.view = [[[UIView alloc] init] autorelease];
+ self.view.backgroundColor = [UIColor blackColor];
+
+ T3ShinyLabel* label = [[[T3ShinyLabel alloc] initWithFrame:CGRectMake(0,150,320,100)] autorelease];
+ label.text = @"One Shiny Label";
+ label.font = [UIFont systemFontOfSize:25];
+ label.textAlignment = UITextAlignmentCenter;
+ label.contentMode = UIViewContentModeCenter;
+ [self.view addSubview:label];
+ [label startAnimating];
+}
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+@end
7 samples/T3Catalog/Classes/YouTubeTestController.h
@@ -0,0 +1,7 @@
+#import "Three20/Three20.h"
+
+@interface YouTubeTestController : T3ViewController <UIWebViewDelegate> {
+ T3YouTubeView* youTubeView;
+}
+
+@end
21 samples/T3Catalog/Classes/YouTubeTestController.m
@@ -0,0 +1,21 @@
+#import "YouTubeTestController.h"
+
+@implementation YouTubeTestController
+
+- (void)dealloc {
+ [youTubeView release];
+ [super dealloc];
+}
+
+- (void)loadView {
+ self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
+ self.view.backgroundColor = [UIColor redColor];
+
+ youTubeView = [[T3YouTubeView alloc] initWithURL:@"http://www.youtube.com/watch?v=g8thp78oXsg"];
+ youTubeView.center = self.view.center;
+ [self.view addSubview:youTubeView];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@end
BIN  samples/T3Catalog/DefaultAlbum.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
BIN  samples/T3Catalog/Icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 samples/T3Catalog/Info.plist
@@ -0,0 +1,30 @@
+<?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>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.facebook.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSMainNibFile</key>
+ <string>MainWindow</string>
+</dict>
+</plist>
272 samples/T3Catalog/MainWindow.xib
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.02">
+ <data>
+ <int key="IBDocument.SystemTarget">512</int>
+ <string key="IBDocument.SystemVersion">9F33</string>
+ <string key="IBDocument.InterfaceBuilderVersion">670</string>
+ <string key="IBDocument.AppKitVersion">949.34</string>
+ <string key="IBDocument.HIToolboxVersion">352.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ </object>
+ <object class="IBProxyObject" id="302016328">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ </object>
+ <object class="IBUICustomObject" id="664661524"/>
+ <object class="IBUIWindow" id="380026005">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">1316</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrameSize">{320, 480}</string>
+ <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"/>
+ </object>
+ <object class="IBUINavigationController" id="701001926">
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUINavigationBar" key="IBUINavigationBar" id="207850653">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{0, 0}</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <bool key="IBUIMultipleTouchEnabled">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="IBUIViewControllers">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUIViewController" id="619226028">
+ <object class="IBUINavigationItem" key="IBUINavigationItem" id="394667715">
+ <string key="IBUITitle">Three20 Catalog</string>
+ </object>
+ <reference key="IBUIParentViewController" ref="701001926"/>
+ <string key="IBUINibName">RootViewController</string>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ </object>
+ </object>
+ </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">delegate</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="664661524"/>
+ </object>
+ <int key="connectionID">4</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="664661524"/>
+ <reference key="destination" ref="380026005"/>
+ </object>
+ <int key="connectionID">5</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">navigationController</string>
+ <reference key="source" ref="664661524"/>
+ <reference key="destination" ref="701001926"/>
+ </object>
+ <int key="connectionID">15</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>
+ <object class="NSArray" key="object" id="957960031">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="380026005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="parent" ref="957960031"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="957960031"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="664661524"/>
+ <reference key="parent" ref="957960031"/>
+ <string key="objectName">T3Catalog App Delegate</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="302016328"/>
+ <reference key="parent" ref="957960031"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="701001926"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="207850653"/>
+ <reference ref="619226028"/>
+ </object>
+ <reference key="parent" ref="957960031"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="207850653"/>
+ <reference key="parent" ref="701001926"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="619226028"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="394667715"/>
+ </object>
+ <reference key="parent" ref="701001926"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="394667715"/>
+ <reference key="parent" ref="619226028"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>11.IBPluginDependency</string>
+ <string>13.CustomClassName</string>
+ <string>13.IBPluginDependency</string>
+ <string>2.IBAttributePlaceholdersKey</string>
+ <string>2.IBEditorWindowLastContentRect</string>
+ <string>2.IBPluginDependency</string>
+ <string>3.CustomClassName</string>
+ <string>3.IBPluginDependency</string>
+ <string>9.IBEditorWindowLastContentRect</string>
+ <string>9.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>RootViewController</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <object class="NSMutableDictionary">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <string>{{673, 376}, {320, 480}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>T3CatalogAppDelegate</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>{{547, 343}, {320, 480}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <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>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">15</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="571039202">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../../src/Three20/T3Global.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/RootViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">T3CatalogAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>navigationController</string>
+ <string>window</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>UINavigationController</string>
+ <string>UIWindow</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/T3CatalogAppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <reference key="sourceIdentifier" ref="571039202"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <reference key="sourceIdentifier" ref="571039202"/>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">T2Catalog.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
195 samples/T3Catalog/RootViewController.xib
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.02">
+ <data>
+ <int key="IBDocument.SystemTarget">512</int>
+ <string key="IBDocument.SystemVersion">9F33</string>
+ <string key="IBDocument.InterfaceBuilderVersion">670</string>
+ <string key="IBDocument.AppKitVersion">949.34</string>
+ <string key="IBDocument.HIToolboxVersion">352.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="372490531">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ </object>
+ <object class="IBProxyObject" id="500153577">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ </object>
+ <object class="IBUITableView" id="708052741">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrameSize">{320, 460}</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <int key="IBUISeparatorStyle">1</int>
+ <int key="IBUISectionIndexMinimumDisplayRowCount">0</int>
+ <bool key="IBUIShowsSelectionImmediatelyOnTouchBegin">YES</bool>
+ <float key="IBUIRowHeight">4.400000e+01</float>
+ <float key="IBUISectionHeaderHeight">2.700000e+01</float>
+ <float key="IBUISectionFooterHeight">2.700000e+01</float>
+ </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">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="708052741"/>
+ </object>
+ <int key="connectionID">5</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="708052741"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">6</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="708052741"/>
+ <reference key="destination" ref="372490531"/>
+ </object>
+ <int key="connectionID">7</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">tableView</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="708052741"/>
+ </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>
+ <object class="NSArray" key="object" id="360949347">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="372490531"/>
+ <reference key="parent" ref="360949347"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="500153577"/>
+ <reference key="parent" ref="360949347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="708052741"/>
+ <reference key="parent" ref="360949347"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>3.IBEditorWindowLastContentRect</string>
+ <string>3.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>RootViewController</string>
+ <string>UIResponder</string>
+ <string>{{555, 361}, {320, 460}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <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>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">8</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="107895730">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">../../src/Three20/T3Global.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/RootViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">tableView</string>
+ <string key="NS.object.0">UITableView</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UITableView</string>
+ <reference key="sourceIdentifier" ref="107895730"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <reference key="sourceIdentifier" ref="107895730"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <reference key="sourceIdentifier" ref="107895730"/>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">T3Catalog.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
448 samples/T3Catalog/T3Catalog.xcodeproj/project.pbxproj
@@ -0,0 +1,448 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1D3623260D0F684500981E51 /* T3CatalogAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* T3CatalogAppDelegate.m */; };
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; };
+ 2899E5600DE3E45000AC0155 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E55F0DE3E45000AC0155 /* RootViewController.xib */; };
+ 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; };
+ 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; };
+ BE5F25920EBA5F0400FD59A6 /* PhotoTest2Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = BE5F25910EBA5F0400FD59A6 /* PhotoTest2Controller.m */; };
+ BE5F266B0EBA684600FD59A6 /* T3ErrorView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE5F266A0EBA684600FD59A6 /* T3ErrorView.m */; };
+ BE5F28120EBE695100FD59A6 /* T3TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE5F28110EBE695100FD59A6 /* T3TableViewController.m */; };
+ BE617E130F20788000E4D5F1 /* T3YouTubeView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE617E120F20788000E4D5F1 /* T3YouTubeView.m */; };
+ BE80E0D40EAEAD3C00743358 /* T3ActivityLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0CB0EAEAD3C00743358 /* T3ActivityLabel.m */; };
+ BE80E0D60EAEAD3C00743358 /* T3Global.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0CD0EAEAD3C00743358 /* T3Global.m */; };
+ BE80E0D80EAEAD3C00743358 /* T3ImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0CF0EAEAD3C00743358 /* T3ImageView.m */; };
+ BE80E0DA0EAEAD3C00743358 /* T3PhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0D10EAEAD3C00743358 /* T3PhotoView.m */; };
+ BE80E0DB0EAEAD3C00743358 /* T3PhotoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0D20EAEAD3C00743358 /* T3PhotoViewController.m */; };
+ BE80E0DC0EAEAD3C00743358 /* T3ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E0D30EAEAD3C00743358 /* T3ViewController.m */; };
+ BE80E24A0EAEFF6100743358 /* SamplePhotoSource.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E2490EAEFF6100743358 /* SamplePhotoSource.m */; };
+ BE80E3710EAF0F3000743358 /* ImageTest2Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E3700EAF0F3000743358 /* ImageTest2Controller.m */; };
+ BE80E3750EAF0F6E00743358 /* ImageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E3740EAF0F6E00743358 /* ImageTableViewCell.m */; };
+ BE80E39D0EAF103200743358 /* DefaultAlbum.png in Resources */ = {isa = PBXBuildFile; fileRef = BE80E39C0EAF103200743358 /* DefaultAlbum.png */; };
+ BE80E3A70EAF108500743358 /* ImageTest1Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = BE80E3A60EAF108500743358 /* ImageTest1Controller.m */; };
+ BE80E3B60EAF116700743358 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = BE80E3B50EAF116700743358 /* Icon.png */; };
+ BE8C0F7D0F2018C600EB0E98 /* YouTubeTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE8C0F7C0F2018C600EB0E98 /* YouTubeTestController.m */; };
+ BEC82A720EB2B15A00F0BF5D /* T3PaintedView.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC82A710EB2B15A00F0BF5D /* T3PaintedView.m */; };
+ BED689BA0EB2A9BB00BE45B1 /* T3UnclippedView.m in Sources */ = {isa = PBXBuildFile; fileRef = BED689B90EB2A9BB00BE45B1 /* T3UnclippedView.m */; };
+ BEDFE7B20F173E81003D6D69 /* T3URLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = BEDFE7AF0F173E81003D6D69 /* T3URLRequest.m */; };
+ BEDFE7B30F173E81003D6D69 /* T3URLCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BEDFE7B10F173E81003D6D69 /* T3URLCache.m */; };
+ BEE0FDAA0EB2A16A0052C05F /* T3ThumbsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BE7314A50EB29D35001310D7 /* T3ThumbsViewController.m */; };
+ BEE0FDBF0EB2A2CA0052C05F /* T3ThumbsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BE7314A60EB29D35001310D7 /* T3ThumbsTableViewCell.m */; };
+ BEE0FDC40EB2A2F00052C05F /* T3ThumbView.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE0FDC30EB2A2F00052C05F /* T3ThumbView.m */; };
+ BEE0FDDB0EB2A6850052C05F /* PhotoTest1Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE0FDDA0EB2A6850052C05F /* PhotoTest1Controller.m */; };
+ BEE38E7C0EB2884400189902 /* T3ShinyLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE38E7B0EB2884400189902 /* T3ShinyLabel.m */; };
+ BEE38E810EB288BA00189902 /* TextTest1Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE38E800EB288BA00189902 /* TextTest1Controller.m */; };
+ BEF6EBE10F27FDBC00CF4096 /* T3ScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = BEF6EBE00F27FDBC00CF4096 /* T3ScrollView.m */; };
+ BEF6EC370F280CB300CF4096 /* ScrollViewTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = BEF6EC360F280CB300CF4096 /* ScrollViewTestController.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D3623240D0F684500981E51 /* T3CatalogAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = T3CatalogAppDelegate.h; sourceTree = "<group>"; };
+ 1D3623250D0F684500981E51 /* T3CatalogAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3CatalogAppDelegate.m; sourceTree = "<group>"; };
+ 1D6058910D05DD3D006BFB54 /* T3Catalog.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = T3Catalog.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 2899E55F0DE3E45000AC0155 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RootViewController.xib; sourceTree = "<group>"; };
+ 28A0AAE50D9B0CCF005BE974 /* T3Catalog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = T3Catalog_Prefix.pch; sourceTree = "<group>"; };
+ 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
+ 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = "<group>"; };
+ 28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = "<group>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ BE5F25900EBA5F0400FD59A6 /* PhotoTest2Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoTest2Controller.h; sourceTree = "<group>"; };
+ BE5F25910EBA5F0400FD59A6 /* PhotoTest2Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoTest2Controller.m; sourceTree = "<group>"; };
+ BE5F26650EBA683600FD59A6 /* T3ErrorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ErrorView.h; path = Three20/T3ErrorView.h; sourceTree = "<group>"; };
+ BE5F266A0EBA684600FD59A6 /* T3ErrorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ErrorView.m; sourceTree = "<group>"; };
+ BE5F28100EBE694300FD59A6 /* T3TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3TableViewController.h; path = Three20/T3TableViewController.h; sourceTree = "<group>"; };
+ BE5F28110EBE695100FD59A6 /* T3TableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3TableViewController.m; sourceTree = "<group>"; };
+ BE617E120F20788000E4D5F1 /* T3YouTubeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3YouTubeView.m; sourceTree = "<group>"; };
+ BE617E140F20788F00E4D5F1 /* T3YouTubeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3YouTubeView.h; path = Three20/T3YouTubeView.h; sourceTree = "<group>"; };
+ BE67FE1A0EB2AA3100D4361F /* T3UnclippedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3UnclippedView.h; path = Three20/T3UnclippedView.h; sourceTree = "<group>"; };
+ BE7314A50EB29D35001310D7 /* T3ThumbsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ThumbsViewController.m; sourceTree = "<group>"; };
+ BE7314A60EB29D35001310D7 /* T3ThumbsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ThumbsTableViewCell.m; sourceTree = "<group>"; };
+ BE7314AD0EB29D59001310D7 /* T3ThumbsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ThumbsViewController.h; path = Three20/T3ThumbsViewController.h; sourceTree = "<group>"; };
+ BE7314AE0EB29D59001310D7 /* T3ThumbsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ThumbsTableViewCell.h; path = Three20/T3ThumbsTableViewCell.h; sourceTree = "<group>"; };
+ BE80E0C00EAEAD3C00743358 /* T3ActivityLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ActivityLabel.h; path = Three20/T3ActivityLabel.h; sourceTree = "<group>"; };
+ BE80E0C20EAEAD3C00743358 /* T3Global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3Global.h; path = Three20/T3Global.h; sourceTree = "<group>"; };
+ BE80E0C40EAEAD3C00743358 /* T3ImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ImageView.h; path = Three20/T3ImageView.h; sourceTree = "<group>"; };
+ BE80E0C50EAEAD3C00743358 /* T3Object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3Object.h; path = Three20/T3Object.h; sourceTree = "<group>"; };
+ BE80E0C60EAEAD3C00743358 /* T3PhotoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3PhotoSource.h; path = Three20/T3PhotoSource.h; sourceTree = "<group>"; };
+ BE80E0C70EAEAD3C00743358 /* T3PhotoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3PhotoView.h; path = Three20/T3PhotoView.h; sourceTree = "<group>"; };
+ BE80E0C80EAEAD3C00743358 /* T3PhotoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3PhotoViewController.h; path = Three20/T3PhotoViewController.h; sourceTree = "<group>"; };
+ BE80E0C90EAEAD3C00743358 /* T3ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ViewController.h; path = Three20/T3ViewController.h; sourceTree = "<group>"; };
+ BE80E0CA0EAEAD3C00743358 /* Three20.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Three20.h; path = Three20/Three20.h; sourceTree = "<group>"; };
+ BE80E0CB0EAEAD3C00743358 /* T3ActivityLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ActivityLabel.m; sourceTree = "<group>"; };
+ BE80E0CD0EAEAD3C00743358 /* T3Global.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3Global.m; sourceTree = "<group>"; };
+ BE80E0CF0EAEAD3C00743358 /* T3ImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ImageView.m; sourceTree = "<group>"; };
+ BE80E0D10EAEAD3C00743358 /* T3PhotoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3PhotoView.m; sourceTree = "<group>"; };
+ BE80E0D20EAEAD3C00743358 /* T3PhotoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3PhotoViewController.m; sourceTree = "<group>"; };
+ BE80E0D30EAEAD3C00743358 /* T3ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ViewController.m; sourceTree = "<group>"; };
+ BE80E2480EAEFF6100743358 /* SamplePhotoSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SamplePhotoSource.h; sourceTree = "<group>"; };
+ BE80E2490EAEFF6100743358 /* SamplePhotoSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SamplePhotoSource.m; sourceTree = "<group>"; };
+ BE80E36F0EAF0F3000743358 /* ImageTest2Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageTest2Controller.h; sourceTree = "<group>"; };
+ BE80E3700EAF0F3000743358 /* ImageTest2Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageTest2Controller.m; sourceTree = "<group>"; };
+ BE80E3730EAF0F6E00743358 /* ImageTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageTableViewCell.h; sourceTree = "<group>"; };
+ BE80E3740EAF0F6E00743358 /* ImageTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageTableViewCell.m; sourceTree = "<group>"; };
+ BE80E39C0EAF103200743358 /* DefaultAlbum.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DefaultAlbum.png; sourceTree = "<group>"; };
+ BE80E3A50EAF108500743358 /* ImageTest1Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageTest1Controller.h; sourceTree = "<group>"; };
+ BE80E3A60EAF108500743358 /* ImageTest1Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageTest1Controller.m; sourceTree = "<group>"; };
+ BE80E3B50EAF116700743358 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
+ BE8C0F7B0F2018C600EB0E98 /* YouTubeTestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YouTubeTestController.h; sourceTree = "<group>"; };
+ BE8C0F7C0F2018C600EB0E98 /* YouTubeTestController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YouTubeTestController.m; sourceTree = "<group>"; };
+ BEC82A710EB2B15A00F0BF5D /* T3PaintedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3PaintedView.m; sourceTree = "<group>"; };
+ BEC82A730EB2B18200F0BF5D /* T3PaintedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3PaintedView.h; path = Three20/T3PaintedView.h; sourceTree = "<group>"; };
+ BED689B90EB2A9BB00BE45B1 /* T3UnclippedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3UnclippedView.m; sourceTree = "<group>"; };
+ BEDFE7AE0F173E81003D6D69 /* T3URLRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3URLRequest.h; path = Three20/T3URLRequest.h; sourceTree = "<group>"; };
+ BEDFE7AF0F173E81003D6D69 /* T3URLRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3URLRequest.m; sourceTree = "<group>"; };
+ BEDFE7B00F173E81003D6D69 /* T3URLCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3URLCache.h; path = Three20/T3URLCache.h; sourceTree = "<group>"; };
+ BEDFE7B10F173E81003D6D69 /* T3URLCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3URLCache.m; sourceTree = "<group>"; };
+ BEE0FDC30EB2A2F00052C05F /* T3ThumbView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ThumbView.m; sourceTree = "<group>"; };
+ BEE0FDC60EB2A3250052C05F /* T3ThumbView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ThumbView.h; path = Three20/T3ThumbView.h; sourceTree = "<group>"; };
+ BEE0FDD90EB2A6850052C05F /* PhotoTest1Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoTest1Controller.h; sourceTree = "<group>"; };
+ BEE0FDDA0EB2A6850052C05F /* PhotoTest1Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoTest1Controller.m; sourceTree = "<group>"; };
+ BEE38E7A0EB2883F00189902 /* T3ShinyLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ShinyLabel.h; path = Three20/T3ShinyLabel.h; sourceTree = "<group>"; };
+ BEE38E7B0EB2884400189902 /* T3ShinyLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ShinyLabel.m; sourceTree = "<group>"; };
+ BEE38E7F0EB288BA00189902 /* TextTest1Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTest1Controller.h; sourceTree = "<group>"; };
+ BEE38E800EB288BA00189902 /* TextTest1Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextTest1Controller.m; sourceTree = "<group>"; };
+ BEF6EBE00F27FDBC00CF4096 /* T3ScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = T3ScrollView.m; sourceTree = "<group>"; };
+ BEF6EBE60F27FDD000CF4096 /* T3ScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = T3ScrollView.h; path = Three20/T3ScrollView.h; sourceTree = "<group>"; };
+ BEF6EC350F280CB300CF4096 /* ScrollViewTestController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollViewTestController.h; sourceTree = "<group>"; };
+ BEF6EC360F280CB300CF4096 /* ScrollViewTestController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollViewTestController.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 1D3623240D0F684500981E51 /* T3CatalogAppDelegate.h */,
+ 1D3623250D0F684500981E51 /* T3CatalogAppDelegate.m */,
+ 28C286DF0D94DF7D0034E888 /* RootViewController.h */,
+ 28C286E00D94DF7D0034E888 /* RootViewController.m */,
+ BE80E3A50EAF108500743358 /* ImageTest1Controller.h */,
+ BE80E3A60EAF108500743358 /* ImageTest1Controller.m */,
+ BE80E36F0EAF0F3000743358 /* ImageTest2Controller.h */,
+ BE80E3700EAF0F3000743358 /* ImageTest2Controller.m */,
+ BE80E3730EAF0F6E00743358 /* ImageTableViewCell.h */,
+ BE80E3740EAF0F6E00743358 /* ImageTableViewCell.m */,
+ BEE0FDD90EB2A6850052C05F /* PhotoTest1Controller.h */,
+ BEE0FDDA0EB2A6850052C05F /* PhotoTest1Controller.m */,
+ BE5F25900EBA5F0400FD59A6 /* PhotoTest2Controller.h */,
+ BE5F25910EBA5F0400FD59A6 /* PhotoTest2Controller.m */,
+ BEE38E7F0EB288BA00189902 /* TextTest1Controller.h */,
+ BEE38E800EB288BA00189902 /* TextTest1Controller.m */,
+ BE8C0F7B0F2018C600EB0E98 /* YouTubeTestController.h */,
+ BE8C0F7C0F2018C600EB0E98 /* YouTubeTestController.m */,
+ BEF6EC350F280CB300CF4096 /* ScrollViewTestController.h */,
+ BEF6EC360F280CB300CF4096 /* ScrollViewTestController.m */,
+ BE80E2480EAEFF6100743358 /* SamplePhotoSource.h */,
+ BE80E2490EAEFF6100743358 /* SamplePhotoSource.m */,
+ );
+ path = Classes;
+ sourceTree = "<group>";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1D6058910D05DD3D006BFB54 /* T3Catalog.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
+ isa = PBXGroup;
+ children = (
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ BE4A53D80EAD22370061796A /* Three20 */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = CustomTemplate;
+ sourceTree = "<group>";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 28A0AAE50D9B0CCF005BE974 /* T3Catalog_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 2899E55F0DE3E45000AC0155 /* RootViewController.xib */,
+ 28AD735F0D9D9599002E5188 /* MainWindow.xib */,
+ BE80E3B50EAF116700743358 /* Icon.png */,
+ BE80E39C0EAF103200743358 /* DefaultAlbum.png */,
+ 8D1107310486CEB800E47090 /* Info.plist */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */,
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
+ 1D30AB110D05D00D00671497 /* Foundation.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ BE4A53D80EAD22370061796A /* Three20 */ = {
+ isa = PBXGroup;
+ children = (
+ BE80E0CA0EAEAD3C00743358 /* Three20.h */,
+ BE80E0C20EAEAD3C00743358 /* T3Global.h */,
+ BE80E0CD0EAEAD3C00743358 /* T3Global.m */,
+ BE80E0C50EAEAD3C00743358 /* T3Object.h */,
+ BE80E0C90EAEAD3C00743358 /* T3ViewController.h */,
+ BE80E0D30EAEAD3C00743358 /* T3ViewController.m */,
+ BE5F28100EBE694300FD59A6 /* T3TableViewController.h */,
+ BE5F28110EBE695100FD59A6 /* T3TableViewController.m */,
+ BEDFE7AE0F173E81003D6D69 /* T3URLRequest.h */,
+ BEDFE7AF0F173E81003D6D69 /* T3URLRequest.m */,
+ BEDFE7B00F173E81003D6D69 /* T3URLCache.h */,
+ BEDFE7B10F173E81003D6D69 /* T3URLCache.m */,
+ BE80E0C40EAEAD3C00743358 /* T3ImageView.h */,
+ BE80E0CF0EAEAD3C00743358 /* T3ImageView.m */,
+ BEF6EBE60F27FDD000CF4096 /* T3ScrollView.h */,
+ BEF6EBE00F27FDBC00CF4096 /* T3ScrollView.m */,
+ BEE38E7A0EB2883F00189902 /* T3ShinyLabel.h */,
+ BEE38E7B0EB2884400189902 /* T3ShinyLabel.m */,
+ BE80E0C00EAEAD3C00743358 /* T3ActivityLabel.h */,
+ BE80E0CB0EAEAD3C00743358 /* T3ActivityLabel.m */,
+ BE80E0C60EAEAD3C00743358 /* T3PhotoSource.h */,
+ BE7314AD0EB29D59001310D7 /* T3ThumbsViewController.h */,
+ BE7314A50EB29D35001310D7 /* T3ThumbsViewController.m */,
+ BE7314AE0EB29D59001310D7 /* T3ThumbsTableViewCell.h */,
+ BE7314A60EB29D35001310D7 /* T3ThumbsTableViewCell.m */,
+ BEE0FDC60EB2A3250052C05F /* T3ThumbView.h */,
+ BEE0FDC30EB2A2F00052C05F /* T3ThumbView.m */,
+ BE80E0C80EAEAD3C00743358 /* T3PhotoViewController.h */,
+ BE80E0D20EAEAD3C00743358 /* T3PhotoViewController.m */,
+ BE80E0C70EAEAD3C00743358 /* T3PhotoView.h */,
+ BE80E0D10EAEAD3C00743358 /* T3PhotoView.m */,
+ BE67FE1A0EB2AA3100D4361F /* T3UnclippedView.h */,
+ BED689B90EB2A9BB00BE45B1 /* T3UnclippedView.m */,
+ BEC82A730EB2B18200F0BF5D /* T3PaintedView.h */,
+ BEC82A710EB2B15A00F0BF5D /* T3PaintedView.m */,
+ BE5F26650EBA683600FD59A6 /* T3ErrorView.h */,
+ BE5F266A0EBA684600FD59A6 /* T3ErrorView.m */,
+ BE617E140F20788F00E4D5F1 /* T3YouTubeView.h */,
+ BE617E120F20788000E4D5F1 /* T3YouTubeView.m */,
+ );
+ name = Three20;
+ path = ../../src;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1D6058900D05DD3D006BFB54 /* PhotoBrowser */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "PhotoBrowser" */;
+ buildPhases = (
+ 1D60588D0D05DD3D006BFB54 /* Resources */,
+ 1D60588E0D05DD3D006BFB54 /* Sources */,
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = PhotoBrowser;
+ productName = PhotoBrowser;
+ productReference = 1D6058910D05DD3D006BFB54 /* T3Catalog.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "T3Catalog" */;
+ compatibilityVersion = "Xcode 3.1";
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ en,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 1D6058900D05DD3D006BFB54 /* PhotoBrowser */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1D60588D0D05DD3D006BFB54 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */,
+ 2899E5600DE3E45000AC0155 /* RootViewController.xib in Resources */,
+ BE80E39D0EAF103200743358 /* DefaultAlbum.png in Resources */,
+ BE80E3B60EAF116700743358 /* Icon.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1D60588E0D05DD3D006BFB54 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */,
+ 1D3623260D0F684500981E51 /* T3CatalogAppDelegate.m in Sources */,
+ 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */,
+ BE80E0D40EAEAD3C00743358 /* T3ActivityLabel.m in Sources */,
+ BE80E0D60EAEAD3C00743358 /* T3Global.m in Sources */,
+ BE80E0D80EAEAD3C00743358 /* T3ImageView.m in Sources */,
+ BE80E0DA0EAEAD3C00743358 /* T3PhotoView.m in Sources */,
+ BE80E0DB0EAEAD3C00743358 /* T3PhotoViewController.m in Sources */,
+ BE80E0DC0EAEAD3C00743358 /* T3ViewController.m in Sources */,
+ BE80E24A0EAEFF6100743358 /* SamplePhotoSource.m in Sources */,
+ BE80E3710EAF0F3000743358 /* ImageTest2Controller.m in Sources */,
+ BE80E3750EAF0F6E00743358 /* ImageTableViewCell.m in Sources */,
+ BE80E3A70EAF108500743358 /* ImageTest1Controller.m in Sources */,
+ BEE38E7C0EB2884400189902 /* T3ShinyLabel.m in Sources */,
+ BEE38E810EB288BA00189902 /* TextTest1Controller.m in Sources */,
+ BEE0FDAA0EB2A16A0052C05F /* T3ThumbsViewController.m in Sources */,
+ BEE0FDBF0EB2A2CA0052C05F /* T3ThumbsTableViewCell.m in Sources */,
+ BEE0FDC40EB2A2F00052C05F /* T3ThumbView.m in Sources */,
+ BEE0FDDB0EB2A6850052C05F /* PhotoTest1Controller.m in Sources */,
+ BED689BA0EB2A9BB00BE45B1 /* T3UnclippedView.m in Sources */,
+ BEC82A720EB2B15A00F0BF5D /* T3PaintedView.m in Sources */,
+ BE5F25920EBA5F0400FD59A6 /* PhotoTest2Controller.m in Sources */,
+ BE5F266B0EBA684600FD59A6 /* T3ErrorView.m in Sources */,
+ BE5F28120EBE695100FD59A6 /* T3TableViewController.m in Sources */,
+ BEDFE7B20F173E81003D6D69 /* T3URLRequest.m in Sources */,
+ BEDFE7B30F173E81003D6D69 /* T3URLCache.m in Sources */,
+ BE8C0F7D0F2018C600EB0E98 /* YouTubeTestController.m in Sources */,
+ BE617E130F20788000E4D5F1 /* T3YouTubeView.m in Sources */,
+ BEF6EBE10F27FDBC00CF4096 /* T3ScrollView.m in Sources */,
+ BEF6EC370F280CB300CF4096 /* ScrollViewTestController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1D6058940D05DD3E006BFB54 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Joe Hewitt";
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = T3Catalog_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ PRODUCT_NAME = T3Catalog;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "394697A6-6692-459E-85EF-70C5F4CCA7C6";
+ };
+ name = Debug;
+ };
+ 1D6058950D05DD3E006BFB54 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = T3Catalog_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ PRODUCT_NAME = T3Catalog;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Joe Hewitt";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ../../src;
+ ONLY_ACTIVE_ARCH = YES;
+ PREBINDING = NO;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "394697A6-6692-459E-85EF-70C5F4CCA7C6";
+ SDKROOT = iphoneos2.0;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ../../src;
+ PREBINDING = NO;
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = DefaultProfileUuid;
+ SDKROOT = iphoneos2.0;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "PhotoBrowser" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1D6058940D05DD3E006BFB54 /* Debug */,
+ 1D6058950D05DD3E006BFB54 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "T3Catalog" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
9 samples/T3Catalog/T3Catalog_Prefix.pch
@@ -0,0 +1,9 @@
+//
+// Prefix header for all source files of the 'T3Catalog' target in the 'T3Catalog' project
+//
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+ #import <UIKit/UIKit.h>
+// #import <Three20/Three20.h>
+#endif
9 samples/T3Catalog/main.m
@@ -0,0 +1,9 @@
+#import <UIKit/UIKit.h>
+
+int main(int argc, char *argv[]) {
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, argv, nil, nil);
+ [pool release];
+ return retVal;
+}
157 src/T3ActivityLabel.m
@@ -0,0 +1,157 @@
+#import "Three20/T3ActivityLabel.h"
+#import "Three20/T3PaintedView.h"
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static CGFloat kPadding = 15;
+static CGFloat kMargin = 9;
+static CGFloat kSpacing = 5;
+static CGFloat kBezelHeight = 50;
+static CGFloat kThinBezelHeight = 35;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation T3ActivityLabel
+
+@synthesize style, centered, centeredToScreen;
+
+- (id)initWithFrame:(CGRect)frame style:(T3ActivityLabelStyle)aStyle {
+ if (self = [super initWithFrame:frame]) {
+ style = aStyle;
+ centered = YES;
+ centeredToScreen = YES;
+
+ self.backgroundColor = [UIColor clearColor];
+
+ bezelView = [[T3PaintedView alloc] initWithFrame:CGRectZero];
+ if (style == T3ActivityLabelStyleBlackBezel || style == T3ActivityLabelStyleBlackThinBezel) {
+ bezelView.opaque = NO;
+ bezelView.background = T3BackgroundRoundedRect;
+ bezelView.fillColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7];
+ bezelView.strokeRadius = 10;
+ } else if (style == T3ActivityLabelStyleWhiteBezel) {
+ bezelView.opaque = NO;
+ bezelView.background = T3BackgroundRoundedRect;
+ bezelView.fillColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
+ bezelView.strokeColor = [UIColor colorWithRed:0.7 green:0.7 blue:0.7 alpha:1];
+ bezelView.strokeRadius = 10;
+ } else if (style == T3ActivityLabelStyleWhiteBox) {
+ bezelView.backgroundColor = [UIColor whiteColor];
+ self.backgroundColor = [UIColor whiteColor];
+ } else {
+ bezelView.backgroundColor = [UIColor clearColor];
+ }
+ [self addSubview:bezelView];
+
+ labelView = [[UILabel alloc] initWithFrame:
+ CGRectMake(frame.size.height+5,0,frame.size.width,frame.size.height)];
+ labelView.backgroundColor = [UIColor clearColor];
+ labelView.opaque = NO;
+ labelView.lineBreakMode = UILineBreakModeTailTruncation;
+
+ if (style == T3ActivityLabelStyleWhite) {
+ spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
+ UIActivityIndicatorViewStyleWhite];
+ labelView.font = [UIFont systemFontOfSize:17];
+ labelView.textColor = [UIColor whiteColor];
+ } else if (style == T3ActivityLabelStyleGray
+ || style == T3ActivityLabelStyleWhiteBox
+ || style == T3ActivityLabelStyleWhiteBezel) {
+ spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
+ UIActivityIndicatorViewStyleGray];
+ labelView.font = [UIFont systemFontOfSize:17];
+ labelView.textColor = [UIColor grayColor];
+ } else if (style == T3ActivityLabelStyleBlackBezel) {
+ spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
+ UIActivityIndicatorViewStyleWhiteLarge];
+ spinner.frame = CGRectMake(0, 0, 24, 24);
+ labelView.font = [UIFont boldSystemFontOfSize:17];
+ labelView.textColor = [UIColor whiteColor];
+ labelView.shadowColor = [UIColor colorWithWhite:0 alpha:0.3];
+ labelView.shadowOffset = CGSizeMake(1, 1);
+ } else if (style == T3ActivityLabelStyleBlackThinBezel) {
+ spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
+ UIActivityIndicatorViewStyleWhite];
+ spinner.frame = CGRectMake(0, 0, 20, 20);
+ labelView.font = [UIFont boldSystemFontOfSize:15];
+ labelView.textColor = [UIColor whiteColor];
+ labelView.shadowColor = [UIColor colorWithWhite:0 alpha:0.3];
+ labelView.shadowOffset = CGSizeMake(1, 1);
+ }
+
+ [bezelView addSubview:spinner];
+ [bezelView addSubview:labelView];
+ [spinner startAnimating];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [bezelView release];
+ [spinner release];
+ [labelView release];
+ [super dealloc];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// UIView
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ CGRect appFrame = [UIScreen mainScreen].applicationFrame;
+ CGSize captionSize = [labelView.text sizeWithFont:labelView.font];
+ CGFloat contentWidth = spinner.width + kSpacing + captionSize.width;
+
+ CGFloat bezelWidth, bezelHeight, y;
+
+ if (style == T3ActivityLabelStyleBlackThinBezel) {
+ bezelHeight = kThinBezelHeight;
+ } else {
+ bezelHeight = kBezelHeight;
+ }
+
+ if (!centered) {
+ bezelWidth = self.width - kMargin*2;
+ y = -10;
+ } else {
+ bezelWidth = kPadding + contentWidth + kPadding;
+ CGFloat maxBevelWidth = appFrame.size.width - kPadding*2;
+ if (bezelWidth > maxBevelWidth) {
+ bezelWidth = maxBevelWidth;
+ contentWidth = bezelWidth - (kSpacing + spinner.width);
+ }
+
+ y = centeredToScreen
+ ? floor(appFrame.size.height/2 - bezelHeight/2) - self.screenY
+ : floor(self.height/2 - bezelHeight/2);
+ }
+
+ CGFloat captionMaxWidth = (bezelWidth - (spinner.width + kSpacing)) - kPadding*2;
+ CGFloat captionWidth = captionSize.width;
+ if (captionWidth > captionMaxWidth) {
+ captionWidth = captionMaxWidth;
+ }
+
+ bezelView.frame = CGRectMake(floor(self.width/2 - bezelWidth/2), y,
+ bezelWidth, bezelHeight);
+
+ labelView.frame = CGRectMake(floor((bezelWidth/2 - contentWidth/2) + kPadding + spinner.width/2),
+ floor(bezelHeight/2 - captionSize.height/2), captionWidth, captionSize.height);
+
+ spinner.frame = CGRectMake(labelView.x - (spinner.width+kSpacing),
+ floor(bezelHeight/2 - spinner.height/2), spinner.width, spinner.height);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSString*)label {
+ return labelView.text;
+}
+
+- (void)setLabel:(NSString*)label {
+ labelView.text = label;
+ [self setNeedsLayout];
+}
+
+@end
100 src/T3ErrorView.m
@@ -0,0 +1,100 @@
+#import "Three20/T3ErrorView.h"
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static CGFloat kImageSize = 180;
+static CGFloat kHPadding = 20;
+static CGFloat kPadding = 20;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation T3ErrorView
+
+- (id)initWithTitle:(NSString*)title caption:(NSString*)caption image:(UIImage*)image {
+ if (self = [self initWithFrame:CGRectZero]) {
+ self.title = title;
+ self.caption = caption;
+ self.image = image;
+ }
+ return self;
+}
+
+- (id)initWithFrame:(CGRect)frame {
+ if (self = [super initWithFrame:frame]) {
+ imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
+ [self addSubview:imageView];
+
+ titleView = [[UILabel alloc] initWithFrame:CGRectZero];
+ titleView.opaque = NO;
+ titleView.backgroundColor = [UIColor clearColor];
+ titleView.textColor = RGBCOLOR(99, 109, 125);
+ titleView.font = [UIFont boldSystemFontOfSize:18];
+ titleView.textAlignment = UITextAlignmentCenter;
+ [self addSubview:titleView];
+
+ captionView = [[UILabel alloc] initWithFrame:CGRectZero];
+ captionView.opaque = NO;
+ captionView.backgroundColor = [UIColor clearColor];
+ captionView.textColor = RGBCOLOR(99, 109, 125);
+ captionView.font = [UIFont boldSystemFontOfSize:14];
+ captionView.textAlignment = UITextAlignmentCenter;
+ captionView.numberOfLines = 0;
+ [self addSubview:captionView];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [super dealloc];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// UIView
+
+- (void)layoutSubviews {
+ if (titleView.text.length) {
+ captionView.frame = CGRectMake(kHPadding, self.height - (20+kPadding), self.width-kHPadding*2, 20);
+ titleView.frame = CGRectMake(0, captionView.y-50, self.width, 50);
+ } else {
+ captionView.frame = CGRectMake(kHPadding, self.height - 40, self.width-kHPadding*2, 40);
+ titleView.frame = CGRectZero;
+ }
+
+ if (imageView.image) {
+ [imageView sizeToFit];
+
+ CGFloat textTop = titleView.height ? titleView.y : captionView.y;
+ imageView.frame = CGRectMake(self.width/2 - kImageSize/2, textTop - kImageSize,
+ kImageSize, kImageSize);
+ } else {
+ imageView.frame = CGRectZero;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (NSString*)title {
+ return titleView.text;
+}
+
+- (void)setTitle:(NSString*)title {
+ titleView.text = title;
+}
+
+- (NSString*)caption {
+ return captionView.text;
+}
+
+- (void)setCaption:(NSString*)caption {
+ captionView.text = caption;
+}
+
+- (UIImage*)image {
+ return imageView.image;
+}
+
+- (void)setImage:(UIImage*)image {
+ imageView.image = image;
+}
+
+@end
492 src/T3Global.m
@@ -0,0 +1,492 @@
+#import "Three20/T3Global.h"
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+const void* RetainNoOp(CFAllocatorRef allocator, const void *value) { return value; }
+void ReleaseNoOp(CFAllocatorRef allocator, const void *value) { }
+
+NSMutableArray* T3CreateNonRetainingArray() {
+ CFArrayCallBacks callbacks = kCFTypeArrayCallBacks;
+ callbacks.retain = RetainNoOp;
+ callbacks.release = ReleaseNoOp;
+ return (NSMutableArray*)CFArrayCreateMutable(nil, 0, &callbacks);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static int networkTaskCount = 0;
+
+void T3NetworkRequestStarted() {
+ if (networkTaskCount++ == 0) {
+ [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
+ }
+}
+
+void T3NetworkRequestStopped() {
+ if (--networkTaskCount == 0) {
+ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@implementation NSObject (T3Extensions)
+
+- (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3 {
+ NSMethodSignature *sig = [self methodSignatureForSelector:selector];
+ if (sig) {
+ NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
+ [invo setTarget:self];
+ [invo setSelector:selector];
+ [invo setArgument:&p1 atIndex:2];
+ [invo setArgument:&p2 atIndex:3];
+ [invo setArgument:&p3 atIndex:4];
+ [invo invoke];
+ if (sig.methodReturnLength) {
+ id anObject;
+ [invo getReturnValue:&anObject];
+ return anObject;
+ } else {
+ return nil;
+ }
+ } else {
+ return nil;
+ }
+}
+
+- (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
+ withObject:(id)p4 {
+ NSMethodSignature *sig = [self methodSignatureForSelector:selector];
+ if (sig) {
+ NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
+ [invo setTarget:self];
+ [invo setSelector:selector];
+ [invo setArgument:&p1 atIndex:2];
+ [invo setArgument:&p2 atIndex:3];
+ [invo setArgument:&p3 atIndex:4];
+ [invo setArgument:&p4 atIndex:5];
+ [invo invoke];
+ if (sig.methodReturnLength) {
+ id anObject;
+ [invo getReturnValue:&anObject];
+ return anObject;
+ } else {
+ return nil;
+ }
+ } else {
+ return nil;
+ }
+}
+
+- (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
+ withObject:(id)p4 withObject:(id)p5 {
+ NSMethodSignature *sig = [self methodSignatureForSelector:selector];
+ if (sig) {
+ NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
+ [invo setTarget:self];
+ [invo setSelector:selector];
+ [invo setArgument:&p1 atIndex:2];
+ [invo setArgument:&p2 atIndex:3];
+ [invo setArgument:&p3 atIndex:4];
+ [invo setArgument:&p4 atIndex:5];
+ [invo setArgument:&p5 atIndex:6];
+ [invo invoke];
+ if (sig.methodReturnLength) {
+ id anObject;
+ [invo getReturnValue:&anObject];
+ return anObject;
+ } else {
+ return nil;
+ }
+ } else {
+ return nil;
+ }
+}
+
+- (id)performSelector:(SEL)selector withObject:(id)p1 withObject:(id)p2 withObject:(id)p3
+ withObject:(id)p4 withObject:(id)p5 withObject:(id)p6 {
+ NSMethodSignature *sig = [self methodSignatureForSelector:selector];
+ if (sig) {
+ NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
+ [invo setTarget:self];
+ [invo setSelector:selector];
+ [invo setArgument:&p1 atIndex:2];
+ [invo setArgument:&p2 atIndex:3];
+ [invo setArgument:&p3 atIndex:4];
+ [invo setArgument:&p4 atIndex:5];
+ [invo setArgument:&p5 atIndex:6];
+ [invo setArgument:&p6 atIndex:7];
+ [invo invoke];
+ if (sig.methodReturnLength) {
+ id anObject;
+ [invo getReturnValue:&anObject];
+ return anObject;
+ } else {
+ return nil;
+ }
+ } else {