From c4048eeefe0bdf43e83cf95bdd0570eaec92a245 Mon Sep 17 00:00:00 2001 From: Joe Hewitt Date: Wed, 5 Aug 2009 20:04:38 -0700 Subject: [PATCH] * New class: TTPageControl - just like UIPageControl, but with stylable dots. * Fixed: infinite loop in TTTableViewController (thanks to Gary B. for fix) * Fixed: TTWebController back/forward buttons got out of sync (thanks to holtwick fix) * Fixed: TTTextStyle doesn't respect vertical alignment for multi-line text * Fixed: During TTNavigator-imposed delay, TTTableViewDataSource should appear to be loading * Fixed: diffstrings omits some strings from generated xml file --- diffstrings.py | 9 +- src/TTDefaultStyleSheet.m | 22 ++- src/TTModelViewController.m | 8 +- src/TTPageControl.m | 130 ++++++++++++++++++ src/TTPostController.m | 22 ++- src/TTStyle.m | 30 ++-- src/TTTableViewController.m | 7 +- src/TTTableViewDataSource.m | 48 +++++++ src/TTWebController.m | 6 +- .../de.lproj/Localizable.strings | Bin 3896 -> 2 bytes .../es.lproj/Localizable.strings | Bin 3856 -> 2 bytes .../fr.lproj/Localizable.strings | Bin 4024 -> 4096 bytes .../it.lproj/Localizable.strings | Bin 3854 -> 2 bytes .../ja.lproj/Localizable.strings | Bin 2 -> 2374 bytes src/Three20.xcodeproj/project.pbxproj | 8 ++ src/Three20/TTDefaultStyleSheet.h | 5 +- src/Three20/TTPageControl.h | 20 +++ src/Three20/TTTableViewDataSource.h | 9 ++ src/Three20/Three20.h | 1 + 19 files changed, 289 insertions(+), 36 deletions(-) create mode 100644 src/TTPageControl.m create mode 100644 src/Three20/TTPageControl.h diff --git a/diffstrings.py b/diffstrings.py index 5cd8378901..9c134d323e 100755 --- a/diffstrings.py +++ b/diffstrings.py @@ -262,7 +262,7 @@ def diff(self, localizedStrings): if source in localizedStrings.strings: target = localizedStrings.strings[source] translation.translated[sourceEnum] = True - + targetEnum = enumerateStringVariables(target) translation.strings[sourceEnum] = targetEnum @@ -322,7 +322,7 @@ def mergeReport(self, sourceStrings, translation): if sourceEnum in translation.strings: targetEnum = translation.strings[sourceEnum] target = denumerateStringVariables(targetEnum) - if target != self.strings[source]: + if source not in self.strings or target != self.strings[source]: updatedStrings.append(source) else: ignoredStrings.append(source) @@ -491,13 +491,14 @@ def __parse(self, filePath): def __invertSourceMap(self, sourceMap): sourceFileMap = {} - for source in self.strings: + for sourceEnum in self.strings: + source = denumerateStringVariables(sourceEnum) if source in sourceMap: sourcePaths = sourceMap[source] for sourcePath in sourcePaths: if sourcePath not in sourceFileMap: sourceFileMap[sourcePath] = [] - sourceFileMap[sourcePath].append(source) + sourceFileMap[sourcePath].append(sourceEnum) break for sourceName, sourceFileStrings in sourceFileMap.iteritems(): diff --git a/src/TTDefaultStyleSheet.m b/src/TTDefaultStyleSheet.m index 29ee1280ed..dea95f1db8 100644 --- a/src/TTDefaultStyleSheet.m +++ b/src/TTDefaultStyleSheet.m @@ -427,6 +427,14 @@ - (TTStyle*)photoStatusLabel { shadowOffset:CGSizeMake(0, -1) next:nil]]]; } +- (TTStyle*)pageDot:(UIControlState)state { + if (state == UIControlStateSelected) { + return [self pageDotWithColor:[UIColor whiteColor]]; + } else { + return [self pageDotWithColor:RGBCOLOR(77, 77, 77)]; + } +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // public colors @@ -653,6 +661,11 @@ - (UIColor*)toolbarButtonTextColorForState:(UIControlState)state { /////////////////////////////////////////////////////////////////////////////////////////////////// // public +- (TTStyle*)selectionFillStyle:(TTStyle*)next { + return [TTLinearGradientFillStyle styleWithColor1:RGBCOLOR(5,140,245) + color2:RGBCOLOR(1,93,230) next:next]; +} + - (TTStyle*)toolbarButtonForState:(UIControlState)state shape:(TTShape*)shape tintColor:(UIColor*)tintColor font:(UIFont*)font { UIColor* stateTintColor = [self toolbarButtonColorWithTintColor:tintColor forState:state]; @@ -677,9 +690,12 @@ - (TTStyle*)toolbarButtonForState:(UIControlState)state shape:(TTShape*)shape shadowOffset:CGSizeMake(0, -1) next:nil]]]]]]]]]]; } -- (TTStyle*)selectionFillStyle:(TTStyle*)next { - return [TTLinearGradientFillStyle styleWithColor1:RGBCOLOR(5,140,245) - color2:RGBCOLOR(1,93,230) next:next]; +- (TTStyle*)pageDotWithColor:(UIColor*)color { + return + [TTBoxStyle styleWithMargin:UIEdgeInsetsMake(0,0,0,10) padding:UIEdgeInsetsMake(6,6,0,0) next: + [TTShapeStyle styleWithShape:[TTRoundedRectangleShape shapeWithRadius:2.5] next: + [TTSolidFillStyle styleWithColor:color next:nil]]]; } + @end diff --git a/src/TTModelViewController.m b/src/TTModelViewController.m index d81af27e57..af22cd0a2c 100644 --- a/src/TTModelViewController.m +++ b/src/TTModelViewController.m @@ -110,6 +110,10 @@ - (void)updateViewStates { } } +- (void)createInterstitialModel { + self.model = [[[TTModel alloc] init] autorelease]; +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // NSObject @@ -235,7 +239,7 @@ - (void)modelDidEndUpdates:(id)model { [self createModel]; } if (!_model) { - self.model = [[[TTModel alloc] init] autorelease]; + [self createInterstitialModel]; } } return _model; @@ -308,7 +312,7 @@ - (void)reload { } - (void)reloadIfNeeded { - if ([self shouldReload]) { + if ([self shouldReload] && !self.model.isLoading) { [self reload]; } } diff --git a/src/TTPageControl.m b/src/TTPageControl.m new file mode 100644 index 0000000000..6243f0f0ad --- /dev/null +++ b/src/TTPageControl.m @@ -0,0 +1,130 @@ +#include "Three20/TTPageControl.h" +#include "Three20/TTStyleSheet.h" +#include "Three20/TTStyle.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation TTPageControl + +@synthesize numberOfPages = _numberOfPages, currentPage = _currentPage, dotStyle = _dotStyle; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (TTStyle*)normalDotStyle { + if (!_normalDotStyle) { + _normalDotStyle = [[[TTStyleSheet globalStyleSheet] styleWithSelector:_dotStyle + forState:UIControlStateNormal] retain]; + } + return _normalDotStyle; +} + +- (TTStyle*)currentDotStyle { + if (!_currentDotStyle) { + _currentDotStyle = [[[TTStyleSheet globalStyleSheet] styleWithSelector:_dotStyle + forState:UIControlStateSelected] retain]; + } + return _currentDotStyle; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (id)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _numberOfPages = 0; + _currentPage = 0; + _dotStyle = nil; + _normalDotStyle = nil; + _currentDotStyle = nil; + + self.backgroundColor = [UIColor clearColor]; + self.dotStyle = @"pageDot:"; + } + return self; +} + +- (void)dealloc { + TT_RELEASE_SAFELY(_dotStyle); + TT_RELEASE_SAFELY(_normalDotStyle); + TT_RELEASE_SAFELY(_currentDotStyle); + [super dealloc]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIView + +- (void)drawRect:(CGRect)rect { + TTStyleContext* context = [[[TTStyleContext alloc] init] autorelease]; + TTBoxStyle* boxStyle = [self.normalDotStyle firstStyleOfClass:[TTBoxStyle class]]; + + CGSize dotSize = [self.normalDotStyle addToSize:CGSizeZero context:context]; + CGRect contentRect = CGRectMake(0, 0, dotSize.width, dotSize.height); + + for (NSInteger i = 0; i < _numberOfPages; ++i) { + contentRect.origin.x += boxStyle.margin.left; + + context.frame = contentRect; + context.contentFrame = contentRect; + + if (i == _currentPage) { + [self.currentDotStyle draw:context]; + } else { + [self.normalDotStyle draw:context]; + } + contentRect.origin.x += dotSize.width + boxStyle.margin.right; + } +} + +- (CGSize)sizeThatFits:(CGSize)size { + TTStyleContext* context = [[[TTStyleContext alloc] init] autorelease]; + CGSize dotSize = [self.normalDotStyle addToSize:CGSizeZero context:context]; + + CGFloat margin = 0; + TTBoxStyle* boxStyle = [self.normalDotStyle firstStyleOfClass:[TTBoxStyle class]]; + if (boxStyle) { + margin = boxStyle.margin.right + boxStyle.margin.left; + } + + return CGSizeMake((dotSize.width * _numberOfPages) + (margin * (_numberOfPages-1)), + dotSize.height); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIControl + +- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { + if (self.touchInside) { + CGPoint point = [touch locationInView:self]; + self.currentPage = round(point.x / self.width); + [self sendActionsForControlEvents:UIControlEventValueChanged]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +- (void)setNumberOfPages:(NSInteger)numberOfPages { + if (numberOfPages != _numberOfPages) { + _numberOfPages = numberOfPages; + [self setNeedsDisplay]; + } +} + +- (void)setCurrentPage:(NSInteger)currentPage { + if (currentPage != _currentPage) { + _currentPage = currentPage; + [self setNeedsDisplay]; + } +} + +- (void)setDotStyle:(NSString*)dotStyle { + if (![dotStyle isEqualToString:_dotStyle]) { + [_dotStyle release]; + _dotStyle = [dotStyle copy]; + TT_RELEASE_SAFELY(_normalDotStyle); + TT_RELEASE_SAFELY(_currentDotStyle); + } +} + +@end diff --git a/src/TTPostController.m b/src/TTPostController.m index 126de7534c..2f411ba533 100644 --- a/src/TTPostController.m +++ b/src/TTPostController.m @@ -328,20 +328,16 @@ - (void)setOriginView:(UIView*)view { } - (void)post { - if (_textEditor.text.isEmptyOrWhitespace) { - [self cancel]; + BOOL shouldDismiss = [self willPostText:_textEditor.text]; + if ([_delegate respondsToSelector:@selector(postController:willPostText:)]) { + shouldDismiss = [_delegate postController:self willPostText:_textEditor.text]; + } + + if (shouldDismiss) { + [self dismissWithResult:nil animated:YES]; } else { - BOOL shouldDismiss = [self willPostText:_textEditor.text]; - if ([_delegate respondsToSelector:@selector(postController:willPostText:)]) { - shouldDismiss = [_delegate postController:self willPostText:_textEditor.text]; - } - - if (shouldDismiss) { - [self dismissWithResult:nil animated:YES]; - } else { - [self enableButtons:NO]; - [self showActivity:[self titleForActivity]]; - } + [self enableButtons:NO]; + [self showActivity:[self titleForActivity]]; } } diff --git a/src/TTStyle.m b/src/TTStyle.m index 027dcb380f..fbbeb14a90 100644 --- a/src/TTStyle.m +++ b/src/TTStyle.m @@ -510,13 +510,30 @@ + (TTTextStyle*)styleWithFont:(UIFont*)font color:(UIColor*)color /////////////////////////////////////////////////////////////////////////////////////////////////// // private +- (CGSize)sizeOfText:(NSString*)text withFont:(UIFont*)font size:(CGSize)size { + if (_numberOfLines == 1) { + return [text sizeWithFont:font]; + } else { + CGSize maxSize = CGSizeMake(size.width, CGFLOAT_MAX); + CGSize textSize = [text sizeWithFont:font constrainedToSize:maxSize + lineBreakMode:_lineBreakMode]; + if (_numberOfLines) { + CGFloat maxHeight = font.lineHeight * _numberOfLines; + if (textSize.height > maxHeight) { + textSize.height = maxHeight; + } + } + return textSize; + } +} + - (CGRect)rectForText:(NSString*)text forSize:(CGSize)size withFont:(UIFont*)font { CGRect rect = CGRectZero; if (_textAlignment == UITextAlignmentLeft && _verticalAlignment == UIControlContentVerticalAlignmentTop) { rect.size = size; } else { - CGSize textSize = [text sizeWithFont:font]; + CGSize textSize = [self sizeOfText:text withFont:font size:size]; if (size.width < textSize.width) { size.width = textSize.width; @@ -539,14 +556,6 @@ - (CGRect)rectForText:(NSString*)text forSize:(CGSize)size withFont:(UIFont*)fon return rect; } -- (CGSize)sizeOfText:(NSString*)text withFont:(UIFont*)font size:(CGSize)size { - if (_numberOfLines == 1) { - return [text sizeWithFont:font]; - } else { - return [text sizeWithFont:font constrainedToSize:size lineBreakMode:_lineBreakMode]; - } -} - - (void)drawText:(NSString*)text context:(TTStyleContext*)context { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); @@ -574,7 +583,8 @@ - (void)drawText:(NSString*)text context:(TTStyleContext*)context { baselineAdjustment:UIBaselineAdjustmentAlignCenters]; context.contentFrame = titleRect; } else { - rect.size = [text drawInRect:rect withFont:font lineBreakMode:_lineBreakMode + CGRect titleRect = [self rectForText:text forSize:rect.size withFont:font]; + rect.size = [text drawInRect:titleRect withFont:font lineBreakMode:_lineBreakMode alignment:_textAlignment]; context.contentFrame = rect; } diff --git a/src/TTTableViewController.m b/src/TTTableViewController.m index 7a48297500..90b8847147 100644 --- a/src/TTTableViewController.m +++ b/src/TTTableViewController.m @@ -28,6 +28,10 @@ @implementation TTTableViewController /////////////////////////////////////////////////////////////////////////////////////////////////// // private +- (void)createInterstitialModel { + self.dataSource = [[[TTTableViewInterstialDataSource alloc] init] autorelease]; +} + - (void)updateTableDelegate { if (!_tableView.delegate) { [_tableDelegate release]; @@ -44,7 +48,8 @@ - (void)addToOverlayView:(UIView*)view { CGRect frame = [self rectForOverlayView]; _tableOverlayView = [[UIView alloc] initWithFrame:frame]; _tableOverlayView.autoresizesSubviews = YES; - _tableOverlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _tableOverlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth + | UIViewAutoresizingFlexibleBottomMargin; NSInteger tableIndex = [_tableView.superview.subviews indexOfObject:_tableView]; if (tableIndex != NSNotFound) { [_tableView.superview addSubview:_tableOverlayView]; diff --git a/src/TTTableViewDataSource.m b/src/TTTableViewDataSource.m index 61293e1dff..2361f712b0 100644 --- a/src/TTTableViewDataSource.m +++ b/src/TTTableViewDataSource.m @@ -12,6 +12,9 @@ @implementation TTTableViewDataSource @synthesize model = _model; +/////////////////////////////////////////////////////////////////////////////////////////////////// +// class public + + (NSArray*)lettersForSectionsWithSearch:(BOOL)search summary:(BOOL)summary { NSMutableArray* titles = [NSMutableArray array]; if (search) { @@ -216,3 +219,48 @@ - (NSString*)subtitleForError:(NSError*)error { } @end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation TTTableViewInterstialDataSource + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// TTTableViewDataSource + +- (id)model { + return self; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// TTModel + +- (NSMutableArray*)delegates { + return nil; +} + +- (BOOL)isLoaded { + return NO; +} + +- (BOOL)isLoading { + return YES; +} + +- (BOOL)isLoadingMore { + return NO; +} + +- (BOOL)isOutdated { + return NO; +} + +- (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more { +} + +- (void)cancel { +} + +- (void)invalidate:(BOOL)erase { +} + +@end diff --git a/src/TTWebController.m b/src/TTWebController.m index 06f6e43252..17127b479f 100644 --- a/src/TTWebController.m +++ b/src/TTWebController.m @@ -158,6 +158,8 @@ - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)re navigationType:(UIWebViewNavigationType)navigationType { [_loadingURL release]; _loadingURL = [request.URL retain]; + _backButton.enabled = [_webView canGoBack]; + _forwardButton.enabled = [_webView canGoForward]; return YES; } @@ -180,7 +182,9 @@ - (void)webViewDidFinishLoad:(UIWebView*)webView { self.navigationItem.rightBarButtonItem = nil; } [_toolbar replaceItemWithTag:3 withItem:_refreshButton]; - [_webView canGoBack]; + + _backButton.enabled = [_webView canGoBack]; + _forwardButton.enabled = [_webView canGoForward]; } - (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error { diff --git a/src/Three20.bundle/de.lproj/Localizable.strings b/src/Three20.bundle/de.lproj/Localizable.strings index 83a39b86fbbae0a8c443bfd012eebe1cc7ce287f..46b134b197f35e75e0784bedbf94a8dd124693b1 100644 GIT binary patch literal 2 JcmezW4*&xG0sa60 literal 3896 zcmb_fZBG+H5T4KeicJ%Y5+g5(F=C7&NFq>bQi$PWTV7f?T5>HR{&7F5&$Dym?6r6F z5OcYQLPCzn|HsfW2# z)|#y1l{MLnpX>4t>s73YppEY{yg%@`#xgb4up@Vnn?uJK znu6R$wA45Ph3g?S&+rE6gKr}D(Y_q(7qWrR39tqHT9=pjHXLfB?(w%{S==%2ZATmd z$R|KWKN1_U808-56sIB@#Pt9?nS4xiJYAAu>PF9`_>Dr3wZ!<2z;_R%ZG2DhFy`k8 zqPl%QpJoWT>3^5sjd8e-)Jy1Dkx%&i_BT4yL{}4D(|ZCfJw!Hx#!$pLga3OmlV^}W zf;HtlV1Cc!b)xZUQVh%S1KL7SQ8OT;XNYMGoGG$t3Df_PX4vX7D$Tmj(O0aZvm$>- zKs|)F@|c|_tBc*fT!B7-AJcxaxZ`J7hx75b`g&|G)SokbTBSG9*LOh4tgh>1bzCN^ zgD%2qv7XXJ3@`BJknVlqVJ?-mtSh$RBX->$I>syL+lQw!{0^~KlCp_DRqmKyL?7-R z77ruH^=a`q%4XbV`A)<$E+RdOs{noMxa{XHcR8oYyn;baYjFc5XZNjvR=bKcyMp5s(J?iukAwdWBY0S?-b^cgl3}p4KdINh!_v zx-klQkuB_Yw4R-iH;raI^OjVNSlade?X>AWK~)grEY{d1dKVwZTeolLwL;kycuUq- zXBCIZVCUy~%_drE+>5o|gxBP1)T(c%19+1ioL=68cHZQ?z3eRSSM~;WPWMKcYP=n} zPIx+UkjSaZtAGh^6zhd^S|?iWI+~wQ{mZ)1273Ftyn&`$==9lW2>MN=^b+)CYBLRK zzjOK4ques5nCGf`&>lQLEUMY!vCKwA!1=G*R@KbBs_-<-FTx2J1K=YuVFSk2;}{Bb`tdXK0(3 zy;eMGDJ{(h)&i@i2YlI_d}6tSr}{v^Nhyn+!L-;(_UA0gy?MHM=@9sJ5@ejUGde2H zTjieBls~nm{y&c1-g#POdX(P<>O>3b%ZFoJZ ze#Pj~EmIB24*Wevmhm5r^B&4i#8GF-^k0GA%g(ot(}uQ%Sw^GBs#&~WzQZ=&^dbIJ a$zq&!N_!q$1~Y>bRTCN0f>-Z#lkx|Z?Kt!R diff --git a/src/Three20.bundle/es.lproj/Localizable.strings b/src/Three20.bundle/es.lproj/Localizable.strings index e4f52025956c39f5606884008ec92bdc7a4d43ac..46b134b197f35e75e0784bedbf94a8dd124693b1 100644 GIT binary patch literal 2 JcmezW4*&xG0sa60 literal 3856 zcmb_f+iuf95S?efViln2s=D&psXb9Ow;Ibtk`nb>vJYav&WE@)57EKgbI_9odpg&}VWbLvW6WrKTE=%wo5(!cH^us;?BR0)YyrP^ z2~g3G#6~PenFF2TR7AtL9)c&APl=A_OEOIT=$RD1Q;g>nJaeGz;(LaN@xDsXH0}HO zG&@dVeMfAsAN@a%(YS$*E%}VkAAh4VOZ2qiHM!^TV}^+4KpM*U=FptQ3@#vl1WT&% zXI>ZbCeipjDTd{2g|<*uQUPSlNMafTXNqiA!SsKm8MdZOYLji`F*$wY@<8t3!6AH@ z_K@WrKf~HvjJ?&=rg_kO&h%+zK14r10VT7!se3hXnXDc<2YZV3kv`&gjdu#^-V0W9 zsjPLKunQlt(`M)ruc7Z7Je}iri2ae2ee|Ykm;567aQCEq0%UM~Q9h2c9k*G26!DD9 zNRQ$wKp(p-d$`M8&uKF6VABi{VKf46feBvg*o(JI8(x!p5o63qPfHIvy1G3(cNqJ| z6o{NZr5PW4S&*-YkLsXTXhognE@`txo9=T|1u+(}#%|EJ_&DCCeLJre%C5khvAH_yI7|k+KF@15(Ng1HuJty& zCRd|Ye>2tX**V^)>-(6Wb`(3g@z3wAyvFKcPC-b)r4= z^<8-jO^?v&v(PQ*50R23=&RIr8q!|p@~uC)Wlk~g)b*c~wuydDd-ay8US?FC#r3;} zu$pV^a=h>L9$J@~P248CC*Kp#>ngRFSyGgocsC^&JlTG%mI!2vnT zZpKQ~xkP8uRTHyK$6h5Kvy_%%VRM!50dZ7!(+6ffz0_`9GKbN$6In7i98 zEowH<-n(;W&b-dt{{EH9nM~zCQc2_k{!(d#)q8n{CzUPfV|ON((u3Rts~Of^8DQmS zmZgS}`T@CARMU=ZW9JY%Idt*eR5BTd^#RszWk>eI|6O^9^)}YD-@<1fe|LD?UU@gR z(3Cm!X0S1Vr9^H6R$3flhwCd?&heMX1>~l(2;OB_zmPrrp8{KgZ@cmmpN2y{)OY;u zShgVhJVdDv8wnz|AJ*nMBT768JeUFC%noN1j^H`DF^jxkFKIfj;nNJY!8t(=nFbzFeydK7c@cHWD+jW(4R_0~VJgXC*?8RNagMQP+9ux}J8*P;tsuv1=d2 z*gKG7;&_2GzYY?3}7( zf*!1TG@2m?oYP)UZMlggbY)uVYAV6qYZ&6lJ61b*7+YX3Ry(uqgxXlgJbU2qU3mjb zx3K9qn=9;(!w!A1d0yV#%tFjjBj z*&AdHc5xDVDaSkZD|=4wmVN_Sz5&~9*So~C_8I!Ap_~hL2RpV4bR&Gm+KFV2I9fG)*B&N*-ZNsBJb{GX_$aH4;fQ&!Dl=CT(wyX)4I-s>~VtK~Inc{B`PUcPK3u}qLP3yHD L;~l5}I!%87iia?( diff --git a/src/Three20.bundle/ja.lproj/Localizable.strings b/src/Three20.bundle/ja.lproj/Localizable.strings index 46b134b197f35e75e0784bedbf94a8dd124693b1..5d4a0a3ac084f518b233822e5d19d9a31aa41ebf 100644 GIT binary patch literal 2374 zcma)7OKVd>6dpxf2>t;PddWg6s6B2gqJ2T7dDteUghET3-lUIsQi&!jO zsJl|dO~Iv5p$iw5f?M5MqziE=xDxAkW-^|+@kV60$()%p=kcA_(XW`AQq!uWmQ+=F z*a!HX)pS|Y1?*$kUBwquCmNSkZ+?9vF%nZ()G4f(N~kV1gRhPyoJ@5!?}RrEX=SXs zx&V1qX!1e%*w>)Df`4NHpO!W6B}e8f`bs}3PIqp1ERE4!8ly=%P9nXhDXXsS_aJYn z<%G2a+S4j{JeAXQ4i*&EHAmAneWCBPL*JkyPY>u3{`;vwSsJ2_Bhi?~%K+Ys-^bPt zQgY8IgmK9#v#JxqH3}IVg`!5nSXP96Q;=*>n$y@U>d2V;3V5r^MJG)GJss|-?a({g zqbIbzvP^Fu-=j3m0;#W7mpX26EeJV2nx{vnlWd+KxbDC)QN{VaEcMv{iBH zrIn@y{}VGe8tw5PP`o%}yVWf$&L4?|x&8azW^M+4%;1HaxBJOMUm}xIi#o!d_T5uy zaOd%rL5m*uv_PvHDJLhb4V>@s=JKGGX`2fo$(~dvEboju^gFee1L{0%st;HBB;`<9`$>771uwtmx@<+PGw&kSqqDdS zUa{uP+F?y(C3W`P(7IV(0I6(6AI<|!7$MGvZpZ59hGzP{YApsFlN_ z*AGj$hQ+_$#(k%E*qE>u;jyPIS+MAXcLDN+=dtk0G!{ +@end diff --git a/src/Three20/Three20.h b/src/Three20/Three20.h index f86679b532..67069a6f39 100644 --- a/src/Three20/Three20.h +++ b/src/Three20/Three20.h @@ -39,6 +39,7 @@ #import "Three20/TTLink.h" #import "Three20/TTTabBar.h" #import "Three20/TTButtonBar.h" +#import "Three20/TTPageControl.h" #import "Three20/TTTextEditor.h" #import "Three20/TTSearchTextField.h"