From 3825786412c1de9f296e83a474bacb3ef08bd5d3 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 13 Sep 2012 17:19:31 +0200 Subject: [PATCH] Add image in chat message --- Classes/ChatRoomViewController.h | 9 +- Classes/ChatRoomViewController.m | 41 +++- Classes/LinphoneUI/UIChatRoomCell.h | 3 +- Classes/LinphoneUI/UIChatRoomCell.m | 46 ++-- Classes/LinphoneUI/UIChatRoomCell.xib | 178 ++++++++++----- Classes/en.lproj/ChatRoomViewController.xib | 212 +++++++++++------ Classes/fr.lproj/ChatRoomViewController.xib | 211 +++++++++++------ Resources/chat_field.9.png | Bin 1801 -> 1553 bytes Resources/chat_field.9@2x.png | Bin 3047 -> 2510 bytes Resources/chat_send_default.png | Bin 5101 -> 2087 bytes Resources/chat_send_disabled.png | Bin 2879 -> 1954 bytes Resources/chat_send_over.png | Bin 4533 -> 1349 bytes linphone.ldb/Contents.plist | 17 +- .../{3 => 9}/ChatRoomViewController.xib | 216 ++++++++++++------ linphone.xcodeproj/project.pbxproj | 43 +++- 15 files changed, 659 insertions(+), 317 deletions(-) rename linphone.ldb/Resources/Classes/ChatRoomViewController/{3 => 9}/ChatRoomViewController.xib (86%) diff --git a/Classes/ChatRoomViewController.h b/Classes/ChatRoomViewController.h index a93f3275e..c1a10d0b7 100644 --- a/Classes/ChatRoomViewController.h +++ b/Classes/ChatRoomViewController.h @@ -22,11 +22,12 @@ #import "UIToggleButton.h" #import "UICompositeViewController.h" #import "ChatRoomTableViewController.h" +#import "HPGrowingTextView.h" #import "ChatModel.h" #include "linphonecore.h" -@interface ChatRoomViewController : UIViewController { +@interface ChatRoomViewController : UIViewController { @private LinphoneChatRoom *chatRoom; NSString *_remoteAddress; @@ -35,14 +36,16 @@ @property (nonatomic, retain) IBOutlet ChatRoomTableViewController* tableController; @property (nonatomic, retain) IBOutlet UIToggleButton *editButton; -@property (nonatomic, retain) IBOutlet UITextView* messageField; +@property (nonatomic, retain) IBOutlet HPGrowingTextView* messageField; @property (nonatomic, retain) IBOutlet UIButton* sendButton; @property (nonatomic, retain) IBOutlet UILabel *addressLabel; @property (nonatomic, retain) IBOutlet UIImageView *avatarImage; @property (nonatomic, retain) IBOutlet UIView *headerView; @property (nonatomic, retain) IBOutlet UIView *footerView; @property (nonatomic, retain) IBOutlet UIView *chatView; -@property (nonatomic, retain) IBOutlet UIImageView *fieldBackgroundImage; +@property (nonatomic, retain) IBOutlet UIView *messageView; +@property (nonatomic, retain) IBOutlet UIImageView *messageBackgroundImage; +@property (nonatomic, retain) IBOutlet UIImageView *footerBackgroundImage; @property (nonatomic, copy) NSString *remoteAddress; - (IBAction)onBackClick:(id)event; diff --git a/Classes/ChatRoomViewController.m b/Classes/ChatRoomViewController.m index 8fe55b620..399230f5f 100644 --- a/Classes/ChatRoomViewController.m +++ b/Classes/ChatRoomViewController.m @@ -34,7 +34,9 @@ @synthesize headerView; @synthesize footerView; @synthesize chatView; -@synthesize fieldBackgroundImage; +@synthesize messageView; +@synthesize messageBackgroundImage; +@synthesize footerBackgroundImage; #pragma mark - Lifecycle Functions @@ -58,7 +60,9 @@ [avatarImage release]; [headerView release]; [footerView release]; - [fieldBackgroundImage release]; + [messageView release]; + [messageBackgroundImage release]; + [footerBackgroundImage release]; [super dealloc]; } @@ -92,6 +96,13 @@ static UICompositeViewDescription *compositeDescription = nil; // Set selected+over background: IB lack ! [editButton setImage:[UIImage imageNamed:@"chat_ok_over.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)]; + + messageField.minNumberOfLines = 1; + messageField.maxNumberOfLines = ([LinphoneManager runningOnIpad])?10:3; + messageField.delegate = self; + messageField.font = [UIFont systemFontOfSize:18.0f]; + messageField.contentInset = UIEdgeInsetsZero; + messageField.backgroundColor = [UIColor clearColor]; } @@ -118,8 +129,11 @@ static UICompositeViewDescription *compositeDescription = nil; [editButton setOff]; [[tableController tableView] reloadData]; - [fieldBackgroundImage setImage:[TUNinePatchCache imageOfSize:[fieldBackgroundImage bounds].size + [messageBackgroundImage setImage:[TUNinePatchCache imageOfSize:[messageBackgroundImage bounds].size forNinePatchNamed:@"chat_field"]]; + + [footerBackgroundImage setImage:[TUNinePatchCache imageOfSize:[footerBackgroundImage bounds].size + forNinePatchNamed:@"chat_background"]]; } - (void)viewWillDisappear:(BOOL)animated { @@ -278,12 +292,25 @@ static void message_status(LinphoneChatMessage* msg,LinphoneChatMessageState sta #pragma mark - UITextFieldDelegate Functions -- (BOOL)textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; - return YES; +- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height { + int diff = height - growingTextView.bounds.size.height; + + CGRect footerRect = [footerView frame]; + footerRect.origin.y -= diff; + footerRect.size.height += diff; + [footerView setFrame:footerRect]; + + CGRect tableRect = [tableController.view frame]; + tableRect.size.height -= diff; + [tableController.view setFrame:tableRect]; + + [messageBackgroundImage setImage:[TUNinePatchCache imageOfSize:[messageBackgroundImage bounds].size + forNinePatchNamed:@"chat_field"]]; + + [footerBackgroundImage setImage:[TUNinePatchCache imageOfSize:[footerBackgroundImage bounds].size + forNinePatchNamed:@"chat_background"]]; } - #pragma mark - Action Functions - (IBAction)onBackClick:(id)event { diff --git a/Classes/LinphoneUI/UIChatRoomCell.h b/Classes/LinphoneUI/UIChatRoomCell.h index bb76a3c5d..3350c8718 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.h +++ b/Classes/LinphoneUI/UIChatRoomCell.h @@ -26,9 +26,10 @@ @property (nonatomic, retain) ChatModel *chat; @property (nonatomic, retain) IBOutlet UIView *innerView; -@property (nonatomic, retain) IBOutlet UIView *messageView; +@property (nonatomic, retain) IBOutlet UIView *bubbleView; @property (nonatomic, retain) IBOutlet UIImageView* backgroundImage; @property (nonatomic, retain) IBOutlet UILabel *messageLabel; +@property (nonatomic, retain) IBOutlet UIImageView *messageImageView; @property (nonatomic, retain) IBOutlet UIButton *deleteButton; @property (nonatomic, retain) IBOutlet UILabel *dateLabel; @property (nonatomic, retain) IBOutlet UIImageView* statusImage; diff --git a/Classes/LinphoneUI/UIChatRoomCell.m b/Classes/LinphoneUI/UIChatRoomCell.m index d432f37f8..e0bc54616 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.m +++ b/Classes/LinphoneUI/UIChatRoomCell.m @@ -26,8 +26,9 @@ @implementation UIChatRoomCell @synthesize innerView; -@synthesize messageView; +@synthesize bubbleView; @synthesize backgroundImage; +@synthesize messageImageView; @synthesize messageLabel; @synthesize deleteButton; @synthesize dateLabel; @@ -40,6 +41,8 @@ static const CGFloat CELL_MAX_WIDTH = 320.0f; static const CGFloat CELL_MESSAGE_X_MARGIN = 26.0f; static const CGFloat CELL_MESSAGE_Y_MARGIN = 36.0f; static const CGFloat CELL_FONT_SIZE = 17.0f; +static const CGFloat CELL_IMAGE_HEIGHT = 50.0f; +static const CGFloat CELL_IMAGE_WIDTH = 50.0f; static UIFont *CELL_FONT = nil; #pragma mark - Lifecycle Functions @@ -57,8 +60,9 @@ static UIFont *CELL_FONT = nil; - (void)dealloc { [backgroundImage release]; [innerView release]; - [messageView release]; + [bubbleView release]; [messageLabel release]; + [messageImageView release]; [deleteButton release]; [dateLabel release]; [statusImage release]; @@ -88,7 +92,16 @@ static UIFont *CELL_FONT = nil; [LinphoneLogger logc:LinphoneLoggerWarning format:"Cannot update chat room cell: null chat"]; return; } - [messageLabel setText:[chat message]]; + if(true/*Change when image will be supported */) { + [messageLabel setHidden:FALSE]; + [messageLabel setText:[chat message]]; + + [messageImageView setHidden:TRUE]; + } else { + [messageLabel setHidden:TRUE]; + + [messageImageView setHidden:FALSE]; + } // Date NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; @@ -131,16 +144,21 @@ static UIFont *CELL_FONT = nil; } } -+ (CGSize)viewSize:(NSString*)message width:(int)width { - if(CELL_FONT == nil) { - CELL_FONT = [UIFont systemFontOfSize:CELL_FONT_SIZE]; ++ (CGSize)viewSize:(ChatModel*)chat width:(int)width { + CGSize messageSize; + if(true/*Change when image will be supported */) { + if(CELL_FONT == nil) { + CELL_FONT = [UIFont systemFontOfSize:CELL_FONT_SIZE]; + } + messageSize = [[chat message] sizeWithFont: CELL_FONT + constrainedToSize: CGSizeMake(width - CELL_MESSAGE_X_MARGIN, 10000.0f) + lineBreakMode: UILineBreakModeTailTruncation]; + } else { + messageSize = CGSizeMake(CELL_IMAGE_WIDTH, CELL_IMAGE_HEIGHT); } - CGSize messageSize = [message sizeWithFont: CELL_FONT - constrainedToSize: CGSizeMake(width - CELL_MESSAGE_X_MARGIN, 10000.0f) - lineBreakMode: UILineBreakModeTailTruncation]; messageSize.height += CELL_MESSAGE_Y_MARGIN; if(messageSize.height < CELL_MIN_HEIGHT) - messageSize.height = CELL_MIN_HEIGHT; + messageSize.height = CELL_MIN_HEIGHT; messageSize.width += CELL_MESSAGE_X_MARGIN; if(messageSize.width < CELL_MIN_WIDTH) messageSize.width = CELL_MIN_WIDTH; @@ -148,7 +166,7 @@ static UIFont *CELL_FONT = nil; } + (CGFloat)height:(ChatModel*)chat width:(int)width { - return [UIChatRoomCell viewSize:[chat message] width:width].height; + return [UIChatRoomCell viewSize:chat width:width].height; } @@ -159,7 +177,7 @@ static UIFont *CELL_FONT = nil; if(chat != nil) { // Resize inner CGRect innerFrame; - innerFrame.size = [UIChatRoomCell viewSize:[chat message] width:[self frame].size.width]; + innerFrame.size = [UIChatRoomCell viewSize:chat width:[self frame].size.width]; if([[chat direction] intValue]) { // Inverted innerFrame.origin.x = 0.0f; innerFrame.origin.y = 0.0f; @@ -169,7 +187,7 @@ static UIFont *CELL_FONT = nil; } [innerView setFrame:innerFrame]; - CGRect messageFrame = [messageView frame]; + CGRect messageFrame = [bubbleView frame]; messageFrame.origin.y = ([innerView frame].size.height - messageFrame.size.height)/2; if([[chat direction] intValue]) { // Inverted [backgroundImage setImage:[TUNinePatchCache imageOfSize:[backgroundImage bounds].size @@ -180,7 +198,7 @@ static UIFont *CELL_FONT = nil; forNinePatchNamed:@"chat_bubble_outgoing"]]; messageFrame.origin.y -= 5; } - [messageView setFrame:messageFrame]; + [bubbleView setFrame:messageFrame]; } } diff --git a/Classes/LinphoneUI/UIChatRoomCell.xib b/Classes/LinphoneUI/UIChatRoomCell.xib index 647825af5..cda2cfccd 100644 --- a/Classes/LinphoneUI/UIChatRoomCell.xib +++ b/Classes/LinphoneUI/UIChatRoomCell.xib @@ -56,42 +56,68 @@ 274 - + 274 + + + + 274 + {294, 104} + + + + _NS:9 + 1 + NO + IBCocoaTouchFramework + + + + 274 + {294, 104} + + + + _NS:9 + + 3 + MCAwAA + + NO + YES + 7 + NO + IBCocoaTouchFramework + They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety. + + 3 + MC4zMzMzMzMzMzMzAA + + + 0 + 10 + 0 + + 1 + 17 + + + Helvetica + 17 + 16 + + NO + + {294, 104} - + _NS:9 - - 3 - MCAwAA - - NO + YES - 7 - NO IBCocoaTouchFramework - They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety. - - 3 - MC4zMzMzMzMzMzMzAA - - - 0 - 10 - 0 - - 1 - 17 - - - Helvetica - 17 - 16 - - NO @@ -133,7 +159,6 @@ {{284, 104}, {10, 10}} - _NS:9 NO IBCocoaTouchFramework @@ -182,7 +207,7 @@ {{13, 13}, {294, 114}} - + _NS:9 YES @@ -205,7 +230,6 @@ {100, 100} - _NS:9 IBCocoaTouchFramework @@ -216,7 +240,6 @@ {100, 100} - _NS:9 IBCocoaTouchFramework @@ -248,14 +271,6 @@ 13 - - - messageLabel - - - - 17 - deleteButton @@ -264,14 +279,6 @@ 19 - - - messageView - - - - 21 - dateLabel @@ -296,6 +303,30 @@ 27 + + + messageLabel + + + + 17 + + + + bubbleView + + + + 30 + + + + messageImageView + + + + 31 + onDeleteClick: @@ -357,19 +388,13 @@ 16 - + - messageView - - - 15 - - - messageLabel + bubbleView 18 @@ -389,6 +414,28 @@ status + + 29 + + + + + + + messageView + + + 28 + + + messageImageView + + + 15 + + + messageLabel + @@ -404,6 +451,8 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -412,7 +461,7 @@ - 27 + 31 @@ -432,11 +481,12 @@ UIImageView + UIView UILabel UIButton UIView + UIImageView UILabel - UIView UIImageView @@ -444,6 +494,10 @@ backgroundImage UIImageView + + bubbleView + UIView + dateLabel UILabel @@ -456,14 +510,14 @@ innerView UIView + + messageImageView + UIImageView + messageLabel UILabel - - messageView - UIView - statusImage UIImageView diff --git a/Classes/en.lproj/ChatRoomViewController.xib b/Classes/en.lproj/ChatRoomViewController.xib index 5bae93e66..3bde993df 100644 --- a/Classes/en.lproj/ChatRoomViewController.xib +++ b/Classes/en.lproj/ChatRoomViewController.xib @@ -18,7 +18,6 @@ IBUITableView IBUITableViewController IBUITapGestureRecognizer - IBUITextView IBUIView @@ -158,13 +157,31 @@ 266 + + + 274 + {320, 59} + + + + _NS:9 + + 1 + MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA + + NO + IBCocoaTouchFramework + + NSImage + chat_background.png + + - 257 + 297 {{250, 0}, {70, 59}} - _NS:9 NO @@ -202,57 +219,50 @@ 16 - + - 258 + 274 + + + + 274 + {250, 59} + + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + chat_field.png + + + + + 274 + {{10, 10}, {230, 39}} + + + + _NS:9 + + IBCocoaTouchFramework + + {250, 59} - + _NS:9 - NO + IBCocoaTouchFramework - - NSImage - chat_field.png - - - - - 258 - {{10, 10}, {230, 39}} - - - - _NS:9 - YES - YES - - Enter your message here - - IBCocoaTouchFramework - YES - NO - This is a message - - 2 - IBCocoaTouchFramework - - - 1 - 18 - - - Helvetica - 18 - 16 - {{0, 357}, {320, 59}} - + _NS:9 IBCocoaTouchFramework @@ -426,14 +436,6 @@ 44 - - - fieldBackgroundImage - - - - 48 - footerView @@ -458,13 +460,37 @@ 54 + + + footerBackgroundImage + + + + 67 + messageField - + - 57 + 64 + + + + messageBackgroundImage + + + + 69 + + + + messageView + + + + 70 @@ -650,37 +676,53 @@ 14 - - + + footerView - - 21 - - - fieldBackgroundImage - 15 sendButton - - 55 - - - messageField - 58 listTapGestureRecognizer + + 66 + + + footerBackgroundImage + + + 68 + + + + + + + messageView + + + 21 + + + messageBackgroundImage + + + 63 + + + messageField + @@ -703,9 +745,12 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + HPGrowingTextView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -716,7 +761,7 @@ - 62 + 70 @@ -765,10 +810,12 @@ UIImageView UIView UIToggleButton - UIImageView + UIImageView UIView UIView - UITextView + UIImageView + HPGrowingTextView + UIView UIButton ChatRoomTableViewController @@ -789,8 +836,8 @@ editButton UIToggleButton - - fieldBackgroundImage + + footerBackgroundImage UIImageView @@ -801,9 +848,17 @@ headerView UIView + + messageBackgroundImage + UIImageView + messageField - UITextView + HPGrowingTextView + + + messageView + UIView sendButton @@ -819,6 +874,14 @@ ./Classes/ChatRoomViewController.h + + HPGrowingTextView + UIView + + IBProjectSource + ./Classes/HPGrowingTextView.h + + UIToggleButton UIButton @@ -842,6 +905,7 @@ {131, 131} {320, 88} {320, 88} + {640, 117} {320, 88} {320, 88} {500, 117} diff --git a/Classes/fr.lproj/ChatRoomViewController.xib b/Classes/fr.lproj/ChatRoomViewController.xib index 4998f284e..29e39e959 100644 --- a/Classes/fr.lproj/ChatRoomViewController.xib +++ b/Classes/fr.lproj/ChatRoomViewController.xib @@ -18,7 +18,6 @@ IBUITapGestureRecognizer IBUITableViewController IBUITableView - IBUITextView IBUIButton @@ -153,9 +152,27 @@ 266 + + + 274 + {320, 59} + + + _NS:9 + + 1 + MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA + + NO + IBCocoaTouchFramework + + NSImage + chat_background.png + + - 257 + 297 {{250, 0}, {70, 59}} _NS:9 @@ -195,54 +212,52 @@ 16 - + - 258 + 274 + + + + 274 + {250, 59} + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + chat_field.png + + + + + 274 + {{10, 10}, {230, 39}} + + + _NS:9 + + IBCocoaTouchFramework + + {250, 59} - + _NS:9 - NO - IBCocoaTouchFramework - - NSImage - chat_field.png - - - - - 258 - {{10, 10}, {230, 39}} - - - _NS:9 - YES - YES - - Entrez votre message ici + + 3 + MQA + + 2 + IBCocoaTouchFramework - YES - NO - This is a message - - 2 - IBCocoaTouchFramework - - - 1 - 18 - - - Helvetica - 18 - 16 - {{0, 357}, {320, 59}} - + _NS:9 IBCocoaTouchFramework @@ -409,14 +424,6 @@ 44 - - - fieldBackgroundImage - - - - 48 - footerView @@ -441,13 +448,37 @@ 54 + + + footerBackgroundImage + + + + 67 + messageField - + - 57 + 64 + + + + messageBackgroundImage + + + + 69 + + + + messageView + + + + 70 @@ -633,37 +664,53 @@ 14 - - + + footerView - - 21 - - - fieldBackgroundImage - 15 sendButton - - 55 - - - messageField - 58 listTapGestureRecognizer + + 66 + + + footerBackgroundImage + + + 68 + + + + + + + messageView + + + 21 + + + messageBackgroundImage + + + 63 + + + messageField + @@ -686,9 +733,12 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + HPGrowingTextView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -699,7 +749,7 @@ - 62 + 70 @@ -748,10 +798,12 @@ UIImageView UIView UIToggleButton - UIImageView + UIImageView UIView UIView - UITextView + UIImageView + HPGrowingTextView + UIView UIButton ChatRoomTableViewController @@ -772,8 +824,8 @@ editButton UIToggleButton - - fieldBackgroundImage + + footerBackgroundImage UIImageView @@ -784,9 +836,17 @@ headerView UIView + + messageBackgroundImage + UIImageView + messageField - UITextView + HPGrowingTextView + + + messageView + UIView sendButton @@ -802,6 +862,14 @@ ./Classes/ChatRoomViewController.h + + HPGrowingTextView + UIView + + IBProjectSource + ./Classes/HPGrowingTextView.h + + UIToggleButton UIButton @@ -825,6 +893,7 @@ {131, 131} {320, 88} {320, 88} + {640, 117} {320, 88} {320, 88} {500, 117} diff --git a/Resources/chat_field.9.png b/Resources/chat_field.9.png index 3303c1d284fa33feea759391fddbed2b1d8938e7..0b8b3e91f962dd11f8758dbdb04b174ced084cd5 100644 GIT binary patch delta 1536 zcmV+b2LJhq4v`FyBYyw}VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru+zAa11qR62up$5e1)fPnK~#9!?cLi_+g20?;D2q&M+}%6mqR+VX`2oM zSLs{uFnO9hOx~io$dE~s&`y~&K+Pcz#MnmKs~47p5Du0>N`LI|e;EbhF_K1^pS4et z1$U<)qAx}6{KK!`9q=*|edB)nVF@k(R7*u(4Wj$fJWyq;oambmy9f*~1JV7#z!Nd> zM8v=o5d%*|3_KBiD}m=!9?{ovm+ZOY9}EB#BC>Vf?LTWBx3$yl@qd9RXVr2EYpYEW zku6nyCNlmi+kdeZ-l!@>1pBQMeZKt$1>>V$tDsbLqXoXVISC@Vxtc40Uf;uqvvXWn z2ah)&VY#^=VJ1_BU1a=~cF$k#=;?>qu^ zY`uZU8^5Fued@r6JN#q&t;$6QvojSa0AtKxC&30*d4Hl@`s%70ZPr={fYVRs&_Wfz zZ~mGpa3Yef4=*Cvec#gVr#8O-Zcy1>$B6=O%wX)#7{dxrlyQZ()&c;mwNc=G-^XmN zg8z=&*nQv9wbf>-(79<3y8U_w>uXIw3>?RS69hio;(=$CC(5R}Cj%dD#u)g%kCnwb zwqNgHZGW|iOad<=XrFbqYGoH92F7vVy6&~mC!6&|lwJ74${tqtFl*KaYGoJgv(DCh zt@>jK zsH(>+yyG}S2kwX{+X^2xDI!y7=KLh$%rFH)jS^bWZ>C%C(5TUABHyf2EE6>1eW?|(r%BAS4_1F)I(;aTB{CcMBaRBZ+eZ(@HF z(d5?n)GO`cH`HGr4+!S|IA%vQndI_*`OgJDEb4CZg<%z*EqbC!Z_t{3%&ptfS6!hVBYw1T-cm$(=3_j5W20fTc%dWx)cgqpcM8daantX2I~yT8l<~2Cb9RYX`dWF}9qqC(1qS!ya4R zIypt7K67J^!}pu8*?!YDS1rlGaeo_*k!TPvxg%D1qU>swV(p-pk5PhIs@I5O%QGQ_$zef23uy@!-y;e@soWBgbP4VWH#+Kl5#<&9!QF5IV88VN|NOg$&41=ZH!T9UkU)c zdi84T!xvl!r=1=?o}FvA?|Fg6ohZ*L50r~87V9-B6dd@z9eW?^>+9*8^hx~-52b>G z=0c58C;Eas&%gE0rXI8-qUm?*3Qt7S$M6ym-LneMCOr|G^hCraJrS`4E89T6%qi5b`EWCtkfHgpkF?3SaLH zgb=dW{OHLUhFSPfc!r_y48u@(hG8f?!!Q({VHgU}FwFl__>iR~ijjrT_8X;tcc;$xFTD@0E|7_vSNm|{$d|2I+<@FtjA0{Q8$w=mbY&J^> znG(jUqf}b<4-)dn@`kMK9?A91?X$&yQH4)9zN~NWiCf5v=epu5JkQeV zSHLx{xdqARa)0vY%BB=b^=C;xvGC@AhuNYek|`-ZT!ioY5(I&iN+l_m%a%%|LI`;! z#wGlOV{i>O0vAQqb7gI7Pl}bsY$`nF>f3t<>V)^A<07insvI95OTAv#G@DInG#dIR zA>`%2BLm#3)oR)`+yEdy9Q6I7{Px${bcHw7{ljWZN`HZ`PX^JA;O%x>y4|kk^XJdf z>-9AFoe=Uej7I=&bvhmG8g2lPAL482RRP{Pbf#P3PtPx9BNmtPgX}mdPL7K?IXRKR zU?8Wbr*d|7MhKZA@Cv{&xCZCo9t!S#wGZUuT5P()XT7Spu4iS(-3BMeg$##7xwyEH z%gakb$bSrgU+3rN+O>YauR8!EeN{=n5j&9K<<<0r-%msKiar5OWMs!hTwPts_4T!U z`SL|>Zf*!6Qv_ZCI0pIQ9I8E}Z?#&wy^kj|((Vl=7XHbB`zcq+Uej}Sv=pPVJP3hpeJQ{cq709?rE z*r;O>LMCVQld@6i(cYuVqxj-^S}L1=sPNIpv%*K+S@7lg-6JJ@yQSNC+*xpkL3Kx~ zVSlPRU#MZ2*}W)Zq=$1TwkWzNzHl<_6r|qnsWH)Af)ze$4srJ&e7DoqEd+!gZRhn( zfwD8q%*7uS9z_?=(zNh7R|{{tfH17^=E1-?aFE?(-U|PC{%(Y480Kw+hkHhNIGM?N z`c1mghkWC(!ed?#1`ZO75T2EtVcw>#AAc1dE&ct2yPg*QxY@B!^TV*hM|}>6gTxX! zC47g%Gt4{YafSa$_(n%d9p$nW-h8+}j$1WwC*kM{k1yO%c!rrj;VbpF+(dW`tnhfu z9|jJxedy>4PvIG6K7}vWT1x8cNSCefQQzam!0m%9g=d&K68`ZVzI@!2YvpB>%YRmQ z{BanNdyB#|%v=j!sy6J4Hep!d@vWUOF4e%zc!t6=%pAA$L8Y#wK96+S3J;0HxKIN( z<7o=dFmo)tU#=;shmkH@;mraT;~1)gZtSO|+okXfGq1vXrKWNN6&|Z*gn@zo>`-`y znOortO8A0rm$DAS3XjF`!oa{!+lLgMVdhwPJgIL-cnqxYqq|%@1_M8B9e?m`Ifi+s zJoS1kgikx}e|D^Sj1}H&6*UeFT-l2AeRzg>XX!&1z{q)e)tg3y$G`}`ggvXmz`EBP zyGix4&LyrGW)6gZyu?-f$dQ8QOO(gJZbX3{WukBjo+Q$FD?AsmWSF;Y=ff7Ugp;3C z2abIsp7PiVKf2ZPIBLgL`G0F|R|fr)Czq*a7-lxrecUqDCu$D=QMp-t*j73UD?E0D zjiOvGN$lWA@?J?!mGIn%f{@wr*drtR=o9+0(}DiTyy*M#l*7OZf4|psG!-TN?&zkn&Q?#guKmGQ+P8joA+fsb|66z$RrM1;fuwhOn*Y4{%Cn)SG=IA z-;=-JNb<_AnZ?cj2${`>k|?g)H>_%NaV|TDSy|nVOG(K-slQfu&+}vwT-Vjo@9Zb! z4O%2sH%Fi-PNLhSdB?K$hLe-}YlSZq3i4b6zbHrP ztZeMWZ~_a`<~0?RkilyCC*ym^ZC3GLKYh@HY==S>`@&Et;07*qoM6N<$f_1l>H~;_u diff --git a/Resources/chat_field.9@2x.png b/Resources/chat_field.9@2x.png index 614626e89f8d76a8a0f03afcb230095b4ae785fb..d852551142db93c3998176bbc4a2dc9c555b41c0 100644 GIT binary patch literal 2510 zcmZ9O2~<f{4}$_gx#)KuYp;aq4Oe5i(=aB%`_%7eyXlp$dr^OfQ?_7wi(PXKK1MA2g+o!VS`Nu4ZooXbh%#MF@F>H~aw6l3Cj z>yRzmZ_uaXma~R_rtZOm2Rp(}#@tw-+ynq+l`Ona>ANILuc&yRc^jS{xJYt{hbQ&N zr?+YPr>l00&H19i>1xsYxgQ+AAzeSd6WREBPA_Ji7C;TqWb!1bJcsCFf_E8`zv}6A zq4rF?`RJ9Zn;EAuvhK9u2R`8_@Vc8iIVD%a)Hg+nda&5+=Ycu zLe^Ov^m?uvB`8ls5Seu)#PYH`wqJ572RvI4mkVzyMG0J*v{7EW;@kec$JZLM#W*Uu zEp2J?34u4T8Wnb8lhi2(NoSZzHp{~39&c4ZGfNVPKk!sl1B7o)z_(4KL5}_;8f+1m7m4Cc*-j2#C-u<=4MbYmL&59T~ zr*OYst~(>CSwvt45o?ho&{X3@@e*(>q^crWc-^~S9(Epsnvm2__R=#q5%O`~m1OcE zlEHaGkNI^rdSt^kpj|Q+bV0q5J;34e;{t{3fLHZs!-UnP@%eo#vr)X;&N0Us*$gw2 ztt%$hMp~fhK-Hg)jMwsH0@fxM6S;#?>6u78o3Q=n{6^iC!YKEN){!SW=Q2Oh`ny9B zpe3@Fgk_N`NqMXW>O|{3;v-9*yQd~Uw3aPDi{TX)OCR;e`i{!Cws5b}yMT!3Qs=4^Z?&y;2^w`&pQG#?^V0zqJ zVl`72B2nnSIDe+nch8-k1vlHCngIEl&f8=yejFurj>Hq1&uuUQ+LoeH5|_!7{S*%e zGw>v7+ca*B!yltc_y+AXtsY5hL={Vrei)dlGaz1Y9(#2mOi+uh-R~ex zt3+MJKZ;u*q6#8+@*#Fm>n=7v*b67Isd313JEUrhno_3J1lO(yDPDTE%0}mqY0O~= zv*&Q!O`S6ep?|gMHL-h)A?re5oHo7H-7^e9*>k ze?jB?n3@e3`&G43I$cnC`c3`2*NKZbi#%`6AHOhHJ`5xRxkwe5R(VSkhle{7=w+e% zk%AY*gdtgP0_G|=UUm4NcfAme>s-Ew_-ew%d`-D$ho>8^LOw*1}z zZb^3n#FyDP=fu;**g$O6OoxBD2P1YhnbG@4Jyz$Nr#+jz z^6yUFrBghQ+rLwm#}8%U_;w9L9IY*Q=-HC~InodZ{dT~gGGf=Wdi9ZF@r)>K#ec!E z^FemP;{zp9+oJx6UmwGaANVY9NuZcx5nicW3dr12k|!6!b6IM_B%LdD(KuNw%3r@}j^Fw>eQ zzRAGNKOjJ3xv9b4WT=qC(w*A1{G#Y#F7Ltb$0$8HZvnXW%3mUCY{*(3)hfaau2u}D zd-L3HAI%(DTwGjE3(U4L!rC%fm2)PMkMsF`h1qkrPsH5#BfiWP&ih+hvS+Vv;qXj0 zwKQthYne{CyGJjM8YA`}CmO8u_xIx|+Hl>K$Mj)13xR$Be&Q2I}~-3V4Y2Mzp>*FT$a|J8pq(6^xY_;H_u1=F{nK($MI1hId9J&3?NC=gP5 W`3Cwn%iVD21>BB#I8_}DzVsL3=BS+j literal 3047 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 diff --git a/Resources/chat_send_default.png b/Resources/chat_send_default.png index 1bee48a2f35c00afa3662d87d143bce80cf9948a..c4f4dfd1fb1aa0b829762836545019c441ff7a8d 100644 GIT binary patch literal 2087 zcmaJ?c{CgN7FN$vTZ@LqP8UlX#@LE!s5UA=NJ(p{*n%LjC2FfQWooU~&>)u9Oxuxa z?1ZA$6r%}BtF@~V8BtX2Lt@f@-#PEyd%kOl|^k~;ANM}&$>fC5rH8V0u& zpOTO{c1*+Bu1inAG{7J>$he7>X%g;4AW;09xN#m9V}kVqn)#|_)>)+ge9r$3(?2GC z!zk656Mw8*o>qZOd7mRNgEQ0= zbYZU5-tuu3?&4`*lT7xmoW6R&&~oA3yEZj{n*~>mY^2682qH3>) zTmmQ}n3Tf&iYBfXT_I!8p!_PjhTc3(VePoM<7A{og~h-DN+=8^5;YCRKFZNg6+Xg9 z9Wb@%w_KGe#^O(j-p|h}zMEsPYP#-p&Hk8LxOGshd6Ra6S1Y5L_ik<*onYD5A_JrY zz<{H`FM9r*MYe&nsq(M(N;rXXUt#JWQi9IT=N*$sgAD;~m7^O~``1T;H%KNM?H6BN zCVuFJn<^jT!opvhDfOvZHBLlnG2WC56q=tUes>G)l3hlQOiTrrg!CskgiPGm`L$Nn z`Y8ZptnU%=MkW0yMVB~+D5#E(y5b6}uyN(QtfUkd+*D+8x%hur15AAyVbqG6MgXsd zPnDwpbaqrjxlh|!*SC4*gQZs>-S*0`%4wBJ?^5~LO3qFDq~ z-u0iDd&pFB(2#y zFIzE0zuH@uJS9-_pz-{QqK}KcDw|%XLqqM02sc-sp>wq48;s8X)fmwB2jYAodArnl zt!k;&i+(-92k8Z)o#_}s{+2!pecqxghyK!wO0LA4U!b90ZEp65^;f7|ZKWjWhxgs; zB$Fq09&=a6Uwp_9E4(%z{^E8psH_FY%qqAtwAQ>o_;pE48*dw(a?P{vr~$ z(mz-fuJe=@2xs_BE@U%M`q+ZCXCLkiQ|z*NH5#@N@)cev@A$>9%{n_hIoEGg8Iamr zIUG0ofz<{cV_mZ{;MM`@41TRXBB?(ba1{7J{J}@bU7GByT`Otkx?Kj8{G{xjx{5TbztMS$8I31&AyQ$nX*pi`hN>WtHhz0Zz3^WxCWHY%T zg-R+a0ZNw@L8T|IWqMvkgvOHHoDS9(oWnv3A>1og)znLkyt_$$?Ge~0H{DGOS-oGh z7-tYS@3(eywib%vAsQ(W*3+L3jhO4=iVAtS?7%66SR~o4?Cm70tU>!vtM^96X5OCI z@h8%1R2Pjlk^Wajx#{WKtL3C2&K3Zw*U{N&I4hqc3lNcFuJ3p6pitfxIq4$xdhjhB zZ##a!`{lJIzRdTqpn6zsX;){W9VFSrN={B@S6nIsnjX1(8L;o0M_ypLo`rji+SvRR zAJ81OGy~p(kK~=qfU15wZV+T~r`Bco_Ll|cQ*s$LHWUSALSN$r+x&Uk^24*piDw=L z_Y*9eTBIqXL&)c{aw}u)*RufTpgxl2XALiV2z;)GHctN75bI2ow%)Ro$F#OD;q5Jl z$Jtf_JjBQ5bl(ZTB3U;Fv>x}rr>T}tw*GClN~I z@w-w4%nX~0&_&o0yvtwY^}2$s0BvYZV>I_Xk=OD1vxce{3xB|v+wtq3Ego9-&{}Kl z=;0|d*EOKTlWE)WHGdBmh|C>;PRSb^m$m2q{@J?=p9p5IZ;cR&H_b(rf}~dj{Ws&m zW~qg7UN2#(3~rv^Kb%sT8(A@0@Q@HVAv$0PRcauV0zum>+EC2ui literal 5101 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 diff --git a/linphone.ldb/Contents.plist b/linphone.ldb/Contents.plist index 15280059c..dc3f49742 100644 --- a/linphone.ldb/Contents.plist +++ b/linphone.ldb/Contents.plist @@ -212,17 +212,17 @@ backup - 3 + 9 class BLWrapperHandle name - Classes/ChatRoomViewController/3/ChatRoomViewController.xib + Classes/ChatRoomViewController/9/ChatRoomViewController.xib change date - 2012-09-13T13:08:20Z + 2012-09-13T15:15:40Z changed values class @@ -232,7 +232,7 @@ flags 0 hash - c2184e590274d82e838a91d16b383b3d + 1d0ac99cbad123783bcb35b0d4031cdb name ChatRoomViewController.xib @@ -386,6 +386,9 @@ snapshots + + old objects + change date 2001-01-01T00:00:00Z @@ -435,16 +438,14 @@ - old objects - snapshots versions en - 3 + 9 fr - 3 + 9 diff --git a/linphone.ldb/Resources/Classes/ChatRoomViewController/3/ChatRoomViewController.xib b/linphone.ldb/Resources/Classes/ChatRoomViewController/9/ChatRoomViewController.xib similarity index 86% rename from linphone.ldb/Resources/Classes/ChatRoomViewController/3/ChatRoomViewController.xib rename to linphone.ldb/Resources/Classes/ChatRoomViewController/9/ChatRoomViewController.xib index 5bae93e66..7ab91d369 100644 --- a/linphone.ldb/Resources/Classes/ChatRoomViewController/3/ChatRoomViewController.xib +++ b/linphone.ldb/Resources/Classes/ChatRoomViewController/9/ChatRoomViewController.xib @@ -18,7 +18,6 @@ IBUITableView IBUITableViewController IBUITapGestureRecognizer - IBUITextView IBUIView @@ -158,13 +157,31 @@ 266 + + + 274 + {320, 59} + + + + _NS:9 + + 1 + MSAwLjI4MzE1ODM3MjYgMC4wNTY3ODY4OTE2MQA + + NO + IBCocoaTouchFramework + + NSImage + chat_background.png + + - 257 + 297 {{250, 0}, {70, 59}} - _NS:9 NO @@ -202,57 +219,56 @@ 16 - + - 258 + 274 + + + + 274 + {250, 59} + + + + _NS:9 + NO + IBCocoaTouchFramework + + NSImage + chat_field.png + + + + + 274 + {{10, 10}, {230, 39}} + + + + _NS:9 + + IBCocoaTouchFramework + + {250, 59} - + _NS:9 - NO - IBCocoaTouchFramework - - NSImage - chat_field.png - - - - - 258 - {{10, 10}, {230, 39}} - - - - _NS:9 - YES - YES - - Enter your message here + + 3 + MQA + + 2 + IBCocoaTouchFramework - YES - NO - This is a message - - 2 - IBCocoaTouchFramework - - - 1 - 18 - - - Helvetica - 18 - 16 - {{0, 357}, {320, 59}} - + _NS:9 IBCocoaTouchFramework @@ -426,14 +442,6 @@ 44 - - - fieldBackgroundImage - - - - 48 - footerView @@ -458,13 +466,37 @@ 54 + + + footerBackgroundImage + + + + 67 + messageField - + - 57 + 64 + + + + messageBackgroundImage + + + + 69 + + + + messageView + + + + 70 @@ -650,37 +682,53 @@ 14 - - + + footerView - - 21 - - - fieldBackgroundImage - 15 sendButton - - 55 - - - messageField - 58 listTapGestureRecognizer + + 66 + + + footerBackgroundImage + + + 68 + + + + + + + messageView + + + 21 + + + messageBackgroundImage + + + 63 + + + messageField + @@ -703,9 +751,12 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + HPGrowingTextView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -716,7 +767,7 @@ - 62 + 70 @@ -765,10 +816,12 @@ UIImageView UIView UIToggleButton - UIImageView + UIImageView UIView UIView - UITextView + UIImageView + HPGrowingTextView + UIView UIButton ChatRoomTableViewController @@ -789,8 +842,8 @@ editButton UIToggleButton - - fieldBackgroundImage + + footerBackgroundImage UIImageView @@ -801,9 +854,17 @@ headerView UIView + + messageBackgroundImage + UIImageView + messageField - UITextView + HPGrowingTextView + + + messageView + UIView sendButton @@ -819,6 +880,14 @@ ./Classes/ChatRoomViewController.h + + HPGrowingTextView + UIView + + IBProjectSource + ./Classes/HPGrowingTextView.h + + UIToggleButton UIButton @@ -842,6 +911,7 @@ {131, 131} {320, 88} {320, 88} + {640, 117} {320, 88} {320, 88} {500, 117} diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index 889b7ff35..60e1d94c3 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -377,7 +377,6 @@ D34BD65215C13DB60070C209 /* chat_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D38327F11580FE3A00FA0D23 /* chat_default.png */; }; D34BD65315C13DB60070C209 /* chat_edit_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3EA53FF159852080037DC6B /* chat_edit_default.png */; }; D34BD65415C13DB60070C209 /* chat_edit_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3EA5400159852080037DC6B /* chat_edit_over.png */; }; - D34BD65515C13DB60070C209 /* chat_field.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DA15A58C440096EA4E /* chat_field.png */; }; D34BD65615C13DB60070C209 /* chat_ok_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DB15A58C440096EA4E /* chat_ok_default.png */; }; D34BD65715C13DB60070C209 /* chat_ok_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DC15A58C440096EA4E /* chat_ok_over.png */; }; D34BD65815C13DB60070C209 /* chat_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D38327FF158100E400FA0D23 /* chat_over.png */; }; @@ -968,7 +967,6 @@ D3ACB09C15C6D59500E15894 /* dialer_alt_back_default~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ACB09915C6D59500E15894 /* dialer_alt_back_default~ipad.png */; }; D3ACB09D15C6D59500E15894 /* dialer_alt_back_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ACB09A15C6D59500E15894 /* dialer_alt_back_over~ipad.png */; }; D3ACB09E15C6D59500E15894 /* dialer_alt_back_over~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ACB09A15C6D59500E15894 /* dialer_alt_back_over~ipad.png */; }; - D3B9A3DF15A58C450096EA4E /* chat_field.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DA15A58C440096EA4E /* chat_field.png */; }; D3B9A3E115A58C450096EA4E /* chat_ok_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DB15A58C440096EA4E /* chat_ok_default.png */; }; D3B9A3E315A58C450096EA4E /* chat_ok_over.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DC15A58C440096EA4E /* chat_ok_over.png */; }; D3B9A3E515A58C450096EA4E /* chat_send_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3B9A3DD15A58C440096EA4E /* chat_send_default.png */; }; @@ -1079,6 +1077,14 @@ D3ED3EA81587334E006C0DE4 /* HistoryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EA51587334C006C0DE4 /* HistoryTableViewController.m */; }; D3ED3EB81587392C006C0DE4 /* HistoryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EB615873929006C0DE4 /* HistoryViewController.m */; }; D3ED3EB91587392C006C0DE4 /* HistoryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED3EB615873929006C0DE4 /* HistoryViewController.m */; }; + D3ED40191602172200BF332B /* HPGrowingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED40161602172200BF332B /* HPGrowingTextView.m */; }; + D3ED401A1602172200BF332B /* HPGrowingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED40161602172200BF332B /* HPGrowingTextView.m */; }; + D3ED401B1602172200BF332B /* HPTextViewInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED40181602172200BF332B /* HPTextViewInternal.m */; }; + D3ED401C1602172200BF332B /* HPTextViewInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = D3ED40181602172200BF332B /* HPTextViewInternal.m */; }; + D3ED40241602257400BF332B /* chat_background.9.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ED40221602257400BF332B /* chat_background.9.png */; }; + D3ED40251602257400BF332B /* chat_background.9.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ED40221602257400BF332B /* chat_background.9.png */; }; + D3ED40261602257400BF332B /* chat_background.9@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ED40231602257400BF332B /* chat_background.9@2x.png */; }; + D3ED40271602257400BF332B /* chat_background.9@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D3ED40231602257400BF332B /* chat_background.9@2x.png */; }; D3F26BF115986B73005F9CAB /* IncomingCallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F26BEF15986B71005F9CAB /* IncomingCallViewController.m */; }; D3F26BF215986B73005F9CAB /* IncomingCallViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D3F26BEF15986B71005F9CAB /* IncomingCallViewController.m */; }; D3F26BF715986DAD005F9CAB /* history_ok_default.png in Resources */ = {isa = PBXBuildFile; fileRef = D3F26BF515986DAD005F9CAB /* history_ok_default.png */; }; @@ -2013,6 +2019,13 @@ D3ED3EA51587334C006C0DE4 /* HistoryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryTableViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; D3ED3EB515873928006C0DE4 /* HistoryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryViewController.h; sourceTree = ""; }; D3ED3EB615873929006C0DE4 /* HistoryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = HistoryViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + D3ED40151602172200BF332B /* HPGrowingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPGrowingTextView.h; sourceTree = ""; }; + D3ED40161602172200BF332B /* HPGrowingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPGrowingTextView.m; sourceTree = ""; }; + D3ED40171602172200BF332B /* HPTextViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HPTextViewInternal.h; sourceTree = ""; }; + D3ED40181602172200BF332B /* HPTextViewInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HPTextViewInternal.m; sourceTree = ""; }; + D3ED401D1602223B00BF332B /* chat_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = chat_background.png; path = Resources/chat_background.png; sourceTree = ""; }; + D3ED40221602257400BF332B /* chat_background.9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = chat_background.9.png; path = Resources/chat_background.9.png; sourceTree = ""; }; + D3ED40231602257400BF332B /* chat_background.9@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "chat_background.9@2x.png"; path = "Resources/chat_background.9@2x.png"; sourceTree = ""; }; D3F26BEE15986B71005F9CAB /* IncomingCallViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomingCallViewController.h; sourceTree = ""; }; D3F26BEF15986B71005F9CAB /* IncomingCallViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomingCallViewController.m; sourceTree = ""; }; D3F26BF515986DAD005F9CAB /* history_ok_default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = history_ok_default.png; path = Resources/history_ok_default.png; sourceTree = ""; }; @@ -2765,6 +2778,9 @@ D3EA5402159852080037DC6B /* chat_add_over.png */, D3F795DB15A5831C0077328B /* chat_back_default.png */, D3F795DC15A5831C0077328B /* chat_back_over.png */, + D3ED40221602257400BF332B /* chat_background.9.png */, + D3ED40231602257400BF332B /* chat_background.9@2x.png */, + D3ED401D1602223B00BF332B /* chat_background.png */, D389363715A6D53200A3A3AA /* chat_bubble_incoming.9.png */, D3A8BB7715A6CC3200F96BE5 /* chat_bubble_incoming.png */, D389363815A6D53200A3A3AA /* chat_bubble_outgoing.9.png */, @@ -3125,6 +3141,7 @@ D3807FB615C28940005BE9BC /* DCRoundSwitch */, D32B9DFA15A2F131000B6DEC /* FastAddressBook.h */, D32B9DFB15A2F131000B6DEC /* FastAddressBook.m */, + D3ED40141602172200BF332B /* GrowingTextView */, D3807FC715C2894A005BE9BC /* InAppSettingsKit */, D3B90E1115C2CB5700F64F8C /* NinePatch.xcodeproj */, D326483615887D5200930C67 /* OrderedDictionary.h */, @@ -3248,6 +3265,18 @@ name = Products; sourceTree = ""; }; + D3ED40141602172200BF332B /* GrowingTextView */ = { + isa = PBXGroup; + children = ( + D3ED40151602172200BF332B /* HPGrowingTextView.h */, + D3ED40161602172200BF332B /* HPGrowingTextView.m */, + D3ED40171602172200BF332B /* HPTextViewInternal.h */, + D3ED40181602172200BF332B /* HPTextViewInternal.m */, + ); + name = GrowingTextView; + path = Utils/GrowingTextView; + sourceTree = ""; + }; D3F7997E15BD31EC0018C273 /* TPMultiLayoutViewController */ = { isa = PBXGroup; children = ( @@ -3568,7 +3597,6 @@ D38187AD15FE340100C3EDCA /* ChatRoomViewController.xib in Resources */, D3F795DD15A5831C0077328B /* chat_back_default.png in Resources */, D3F795DF15A5831C0077328B /* chat_back_over.png in Resources */, - D3B9A3DF15A58C450096EA4E /* chat_field.png in Resources */, D3B9A3E115A58C450096EA4E /* chat_ok_default.png in Resources */, D3B9A3E315A58C450096EA4E /* chat_ok_over.png in Resources */, D3B9A3E515A58C450096EA4E /* chat_send_default.png in Resources */, @@ -3815,6 +3843,8 @@ D381884415FE447200C3EDCA /* ChatViewController.xib in Resources */, D381885415FE448400C3EDCA /* UICallBar.xib in Resources */, D381885615FE448400C3EDCA /* UICallBar~ipad.xib in Resources */, + D3ED40241602257400BF332B /* chat_background.9.png in Resources */, + D3ED40261602257400BF332B /* chat_background.9@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3907,7 +3937,6 @@ D34BD65215C13DB60070C209 /* chat_default.png in Resources */, D34BD65315C13DB60070C209 /* chat_edit_default.png in Resources */, D34BD65415C13DB60070C209 /* chat_edit_over.png in Resources */, - D34BD65515C13DB60070C209 /* chat_field.png in Resources */, D34BD65615C13DB60070C209 /* chat_ok_default.png in Resources */, D34BD65715C13DB60070C209 /* chat_ok_over.png in Resources */, D34BD65815C13DB60070C209 /* chat_over.png in Resources */, @@ -4264,6 +4293,8 @@ D381884515FE447200C3EDCA /* ChatViewController.xib in Resources */, D381885515FE448400C3EDCA /* UICallBar.xib in Resources */, D381885715FE448400C3EDCA /* UICallBar~ipad.xib in Resources */, + D3ED40251602257400BF332B /* chat_background.9.png in Resources */, + D3ED40271602257400BF332B /* chat_background.9@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4386,6 +4417,8 @@ D380800515C28A7A005BE9BC /* UILinphone.m in Sources */, D380801315C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */, D378AB2A15DCDB4A0098505D /* ContactDetailsImagePickerController.m in Sources */, + D3ED40191602172200BF332B /* HPGrowingTextView.m in Sources */, + D3ED401B1602172200BF332B /* HPTextViewInternal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4476,6 +4509,8 @@ D380800615C28A7A005BE9BC /* UILinphone.m in Sources */, D380801415C299D0005BE9BC /* ColorSpaceUtilites.m in Sources */, D378AB2B15DCDB4A0098505D /* ContactDetailsImagePickerController.m in Sources */, + D3ED401A1602172200BF332B /* HPGrowingTextView.m in Sources */, + D3ED401C1602172200BF332B /* HPTextViewInternal.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };