JXBaseChatCell.m 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
  1. //
  2. // JXBaseChatCell.m
  3. // shiku_im
  4. //
  5. // Created by Apple on 16/10/11.
  6. // Copyright © 2016年 Reese. All rights reserved.
  7. //
  8. #import "JXBaseChatCell.h"
  9. #import "JXImageView.h"
  10. #import "roomData.h"
  11. #import "FLAnimatedImageView.h"
  12. #import "FLAnimatedImage.h"
  13. #define CER_HEIGHT 10 // 管理员边框和头像的距离
  14. static double g_timeSend=0;
  15. @implementation JXBaseChatCell
  16. //没有xib的初始化
  17. -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
  18. self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  19. _bubbleBg = [[UIButton alloc] init];
  20. [self.contentView addSubview:self.bubbleBg];
  21. [_bubbleBg addTarget:self action:@selector(didTouch:) forControlEvents:UIControlEventTouchUpInside];
  22. self.backgroundColor = HEXCOLOR(0xF2F2F2);;
  23. self.contentView.clipsToBounds = YES;
  24. [self creatBaseUI];
  25. [self creatUI];
  26. [g_notify addObserver:self selector:@selector(notifyDrawIsReceive:) name:kMsgDrawIsReceiveNotifaction object:nil];//
  27. [g_notify addObserver:self selector:@selector(updateLoadFileProgress:) name:kUploadFileProgressNotifaction object:nil];
  28. self.layer.masksToBounds = YES;
  29. //添加长按手势
  30. UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(doLongPress:)];
  31. longPress.minimumPressDuration = 1;
  32. [self.contentView addGestureRecognizer:longPress];
  33. return self;
  34. }
  35. //有xib的初始化
  36. - (void)awakeFromNib {
  37. [super awakeFromNib];
  38. // Initialization code
  39. _bubbleBg = [[UIButton alloc]init];
  40. [self.contentView addSubview:self.bubbleBg];
  41. [_bubbleBg addTarget:self action:@selector(didTouch:) forControlEvents:UIControlEventTouchUpInside];
  42. self.backgroundColor = [UIColor clearColor];
  43. [self creatBaseUI];
  44. [self creatUI];
  45. }
  46. //子类创建对应UI
  47. - (void)creatUI{
  48. }
  49. //子类根据数据显示界面
  50. -(void)setCellData{
  51. _readImage.hidden = YES;
  52. memberData *data = [[memberData alloc] init];
  53. data.roomId = self.room.roomId;
  54. data = [data getCardNameById:self.msg.fromUserId];
  55. JLBubbleManager *bubbleManager;
  56. if (_msg.isGroup) {
  57. memberData *data = [[memberData alloc] init];
  58. data.roomId = _room.roomId;
  59. data = [data getCardNameById:self.msg.fromUserId];
  60. if (data.gradeIndex.intValue <= 0) {
  61. bubbleManager = [JLBubbleManager sharedManager];
  62. bubbleManager.gradeIndex = @"0";
  63. }else {
  64. bubbleManager = [[JLBubbleManager sharedManager] fechGradeByGrade:data.gradeIndex];
  65. }
  66. bubbleManager = [[JLBubbleManager sharedManager] fechGradeByGrade:data.gradeIndex];
  67. NSLog(@"VIP%@---", bubbleManager.gradeIndex);
  68. }else {
  69. // 从朋友表里获取
  70. JXUserObject *user;
  71. if (_msg.isMySend) {
  72. user = [[JXUserObject sharedInstance] getUserById:MY_USER_ID];
  73. }else {
  74. user = [[JXUserObject sharedInstance] getUserById:_msg.fromUserId];
  75. }
  76. NSLog(@"user.gradeIndex%@-", user.gradeIndex);
  77. if(user.gradeIndex == nil){
  78. bubbleManager = [JLBubbleManager sharedManager];
  79. bubbleManager.gradeIndex = @"0";
  80. }else {
  81. bubbleManager = [[JLBubbleManager sharedManager] fechGradeByGrade:user.gradeIndex];
  82. }
  83. // NSLog(@"VIP%@---", user.gradeIndex);
  84. }
  85. NSLog(@"user.gradeIndex%@---", bubbleManager.gradeIndex);
  86. JXUserObject *allUser = [[JXUserObject alloc] init];
  87. allUser = [allUser getUserById:[NSString stringWithFormat:@"%ld",data.userId]];
  88. memberData *data1 = [_room getMember:MY_USER_ID];
  89. if (bubbleManager == nil) {
  90. if ([data.role intValue] != 1 && [data.role intValue] != 2) {
  91. self.nicknameLabel.text = [NSString stringWithFormat:@"%@",data.lordRemarkName.length > 0 ? data.lordRemarkName : allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  92. }else {
  93. NSString *roleName = [data.role intValue] == 1 ? @"群主":@"管理员";
  94. self.nicknameLabel.text = [NSString stringWithFormat:@"%@-%@",roleName,allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  95. NSString *nameStr=[NSString stringWithFormat:@"%@-%@",roleName,allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  96. self.nicknameLabel.text =nameStr;
  97. }
  98. } else {
  99. NSLog(@"%@--用户名:%@", data.role, data.userNickName);
  100. //角色 1创建者,2管理员,3成员,4隐身人,5监控人
  101. if ([data.role intValue] != 1 && [data.role intValue] != 2) {
  102. // 不是群主或者管理员
  103. if ([bubbleManager.gradeIndex intValue] <= 0) {
  104. self.nicknameLabel.text = [NSString stringWithFormat:@"%@",data.lordRemarkName.length > 0 ? data.lordRemarkName : allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  105. //self.nicknameLabel.text =allUser.userNickname;
  106. }else {
  107. //bubbleManager.name,
  108. NSString *str = [NSString stringWithFormat:@"%@",data.lordRemarkName.length > 0 ? data.lordRemarkName : allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  109. // 需要改变的区间(第一个参数,从第几位起,长度)
  110. // NSString *lastStr = [str componentsSeparatedByString:@"-"].lastObject;
  111. // NSRange rangeLastStr = [str rangeOfString:lastStr];
  112. // NSRange range1 = NSMakeRange(0, str.length - rangeLastStr.length -1);
  113. // // 改变文字颜色
  114. // NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:str];
  115. // [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range1];
  116. // 为label添加Attributed
  117. //[self.nicknameLabel setAttributedText:noteStr];
  118. self.nicknameLabel.text=str;
  119. }
  120. }else {
  121. NSString *roleName = [data.role intValue] == 1 ? @"群主":@"管理员";
  122. if ([bubbleManager.gradeIndex intValue] <= 0) {
  123. NSString *str = [NSString stringWithFormat:@"%@-%@",roleName,allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  124. // 需要改变的区间(第一个参数,从第几位起,长度)
  125. NSString *lastStr = [str componentsSeparatedByString:@"-"].lastObject;
  126. NSRange rangeLastStr = [str rangeOfString:lastStr];
  127. NSRange range1 = NSMakeRange(0, str.length - rangeLastStr.length -1);
  128. // 改变文字颜色
  129. NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:str];
  130. [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range1];
  131. // 为label添加Attributed
  132. [self.nicknameLabel setAttributedText:noteStr];
  133. } else {
  134. //bubbleManager.name,
  135. NSString *str = [NSString stringWithFormat:@"%@-%@",roleName,allUser.remarkName.length > 0 ? allUser.remarkName : data.userNickName.length > 0 ? data.userNickName : self.msg.fromUserName];
  136. // 需要改变的区间(第一个参数,从第几位起,长度)
  137. // NSString *lastStr = [str componentsSeparatedByString:@"-"].lastObject;
  138. // NSRange rangeLastStr = [str rangeOfString:lastStr];
  139. // NSRange range1 = NSMakeRange(0, str.length - rangeLastStr.length -1);
  140. // // 改变文字颜色
  141. // NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:str];
  142. // [noteStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range1];
  143. // 为label添加Attributed
  144. if (allUser.userId.length==0) {
  145. self.nicknameLabel.text=[NSString stringWithFormat:@"%@",data.userNickName];
  146. }else{
  147. self.nicknameLabel.text=[NSString stringWithFormat:@"%@",allUser.userId];
  148. }
  149. //[self.nicknameLabel setAttributedText:noteStr];
  150. }
  151. }
  152. }
  153. // if (!_room.allowSendCard && [data1.role intValue] != 1 && [data1.role intValue] != 2 && self.nicknameLabel.text.length > 0) {
  154. // self.nicknameLabel.text = [self.nicknameLabel.text substringToIndex:[self.nicknameLabel.text length]-1];
  155. // self.nicknameLabel.text = [self.nicknameLabel.text stringByAppendingString:@"*"];
  156. // }
  157. [self.nicknameLabel sizeToFit];
  158. // 根据字体得到NSString的尺寸
  159. CGSize size = CGSizeZero;
  160. if (_groupLevelNameArray.count>0) {
  161. size = [_groupLevelNameArray[[data.grade integerValue]] sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:SYSFONT(10.0),NSFontAttributeName,nil]];
  162. }
  163. _groupNameLabel.frame = CGRectMake(CGRectGetMaxX(_nicknameLabel.frame) + 5 , _nicknameLabel.frame.origin.y, size.width + 10, 12);
  164. _groupNameLabel.textAlignment = NSTextAlignmentCenter;
  165. self.groupNameLabel.text = [NSString stringWithFormat:@"%@", _groupLevelNameArray[[data.grade integerValue]]];
  166. if (self.msg.isGroup && !self.msg.isMySend) {
  167. self.nicknameLabel.hidden = NO;
  168. self.gradeIcon.hidden = NO;
  169. if (_groupLevelNameArray.count>0) {
  170. if (_isOpenIntegral == YES) {
  171. self.groupNameLabel.hidden = NO;
  172. }else{
  173. self.groupNameLabel.hidden = YES;
  174. }
  175. }else {
  176. self.groupNameLabel.hidden = YES;
  177. }
  178. // if (_isOpenIntegral == YES) {
  179. // self.groupNameLabel.hidden = NO;
  180. // }else{
  181. // self.groupNameLabel.hidden = YES;
  182. // }
  183. }else {
  184. self.nicknameLabel.hidden = YES;
  185. self.groupNameLabel.hidden = YES;
  186. self.gradeIcon.hidden = YES;
  187. }
  188. memberData *roleData = [_room getMember:self.msg.fromUserId];
  189. NSString *imageStr;
  190. if ([roleData.role intValue] == 1) {
  191. // imageStr = @"icon_certification_owner";
  192. imageStr = @"群主相框";
  193. }else if ([roleData.role intValue] == 2) {
  194. imageStr = @"icon_certification";
  195. }
  196. if ([bubbleManager.gradeIndex isEqualToString:@"0"]) {
  197. _cerImgView.hidden = YES;
  198. }else {
  199. _cerImgView.hidden = NO;
  200. }
  201. if (_msg.isGroup) {
  202. if ( [data.role intValue] == 1 ){
  203. _gradeIcon.image=[UIImage imageNamed:@"chatMang2"];
  204. }else if ( [data.role intValue] == 2){
  205. _gradeIcon.image=[UIImage imageNamed:@"chatManger"];
  206. }else{
  207. [_gradeIcon sd_setImageWithURL:[NSURL URLWithString:bubbleManager.rankUrl]];
  208. // _gradeIcon.image=[UIImage imageNamed:[NSString stringWithFormat:@"Vhead%d",[bubbleManager.grade intValue]]];
  209. }
  210. // 群主/管理员 头像
  211. // if ([bubbleManager.gradeIndex intValue] <= 0) {
  212. // //[_cerImgView sd_setImageWithURL:[NSURL URLWithString:@""]];
  213. // //[_gradeIcon sd_setImageWithURL:[NSURL URLWithString:@""]];
  214. // }else {
  215. // [_cerImgView sd_setImageWithURL:[NSURL URLWithString:bubbleManager.avatarUrl]];
  216. // [_gradeIcon sd_setImageWithURL:[NSURL URLWithString:bubbleManager.rankUrl]];
  217. // }
  218. }else {
  219. //_gradeIcon.image=[UIImage imageNamed:[NSString stringWithFormat:@"%d",[bubbleManager.grade intValue]]];
  220. [_gradeIcon sd_setImageWithURL:[NSURL URLWithString:bubbleManager.rankUrl]];
  221. // if ([bubbleManager.gradeIndex intValue] <= 0) {
  222. // // [_cerImgView sd_setImageWithURL:[NSURL URLWithString:@""]];
  223. // //[_gradeIcon sd_setImageWithURL:[NSURL URLWithString:@""]];
  224. // //_gradeIcon.image=[UIImage imageNamed:@"chatManger"];
  225. // //1
  226. // // _gradeIcon.image=[UIImage imageNamed:@"chatMang2"];
  227. // [_gradeIcon sd_setImageWithURL:[NSURL URLWithString:bubbleManager.rankUrl]];
  228. // }else {
  229. // [_cerImgView sd_setImageWithURL:[NSURL URLWithString:bubbleManager.avatarUrl]];
  230. // [_gradeIcon sd_setImageWithURL:[NSURL URLWithString:bubbleManager.rankUrl]];
  231. // }
  232. }
  233. if (self.msg.isGroup) {
  234. if ([roleData.role intValue] == 1 || [roleData.role intValue] == 2) {
  235. self.cerImgView.hidden = NO;
  236. _headImage.layer.masksToBounds = YES;
  237. }else {
  238. self.cerImgView.hidden = NO;
  239. _headImage.layer.masksToBounds = YES;
  240. }
  241. }
  242. // [self creatLongPressItems];
  243. NSArray *array = [self.msg fetchReadList];
  244. _readNum.text = [NSString stringWithFormat:@"%ld%@",array.count,Localized(@"JXLiveVC_countPeople")];
  245. }
  246. //创建子类通用UI
  247. -(void)creatBaseUI{
  248. self.userInteractionEnabled=YES;
  249. self.contentView.userInteractionEnabled=YES;
  250. _checkBox = [[QCheckBox alloc] initWithDelegate:self];
  251. _checkBox.frame = CGRectMake(13, INSETS, 22, 22);
  252. [self.contentView addSubview:_checkBox];
  253. //头像
  254. _headImage = [[UIImageView alloc] initWithFrame:CGRectMake(MAX_INSETS, INSETS,HEAD_SIZE , HEAD_SIZE)];
  255. _headImage.layer.cornerRadius = 5;
  256. _headImage.layer.masksToBounds = YES;
  257. [self.contentView addSubview:_headImage];
  258. _headImage.userInteractionEnabled = YES;
  259. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
  260. [_headImage addGestureRecognizer:tap];
  261. _cerImgView = [[UIImageView alloc] initWithFrame:CGRectMake(INSETS, INSETS, HEAD_SIZE, HEAD_SIZE)];
  262. //[self.contentView addSubview:_cerImgView];
  263. //已读人数
  264. _cerImgView.layer.cornerRadius=HEAD_SIZE/2;
  265. _cerImgView.layer.masksToBounds=YES;
  266. _readView = [[JXLabel alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
  267. _readView.backgroundColor = [UIColor clearColor];
  268. _readView.userInteractionEnabled = YES;
  269. _readView.delegate = self;
  270. _readView.didTouch = @selector(showReadPersons);
  271. [self.contentView addSubview:_readView];
  272. _readNum = [[JXLabel alloc] initWithFrame:CGRectMake(_readView.frame.size.width - 30, 0, 30, 15)];
  273. _readNum.textColor = [UIColor whiteColor];
  274. _readNum.layer.cornerRadius = 3.0;
  275. _readNum.layer.masksToBounds = YES;
  276. _readNum.backgroundColor = HEXCOLOR(0x7bd581);
  277. _readNum.text = @"10人";
  278. _readNum.font = [UIFont systemFontOfSize:11];
  279. _readNum.textAlignment = NSTextAlignmentCenter;
  280. [_readView addSubview:_readNum];
  281. _nicknameLabel = [[UILabel alloc] init];
  282. _nicknameLabel.textColor = [UIColor grayColor];
  283. _nicknameLabel.font = SYSFONT(16.0);
  284. _nicknameLabel.text = @"userName";
  285. [self.contentView addSubview:_nicknameLabel];
  286. //农民
  287. _gradeIcon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 46, 0)];
  288. _gradeIcon.image = [UIImage imageNamed:@"等级1"];
  289. [self.contentView addSubview:_gradeIcon];
  290. _groupNameLabel = [[UILabel alloc] init];
  291. _groupNameLabel.textColor = [UIColor whiteColor];
  292. _groupNameLabel.backgroundColor = [UIColor colorWithRed:31/255.0 green:160/255.0 blue:211/255.0 alpha:1];
  293. _groupNameLabel.layer.masksToBounds = YES;
  294. _groupNameLabel.layer.cornerRadius = 6;
  295. // _groupNameLabel.backgroundColor = [UIColor redColor];
  296. _groupNameLabel.font = SYSFONT(15.0);
  297. _groupNameLabel.text = @"11111";
  298. [self.contentView addSubview:_groupNameLabel];
  299. //等待
  300. _wait = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
  301. [self.contentView addSubview:_wait];
  302. // [_wait release];
  303. //发送失败
  304. _sendFailed = [[JXImageView alloc]init];
  305. _sendFailed.image = [UIImage imageNamed:@"im_send_fail_nor"];
  306. // _sendFailed.textColor = [UIColor redColor];
  307. // _sendFailed.userInteractionEnabled = YES;
  308. _sendFailed.backgroundColor = [UIColor clearColor];
  309. // _sendFailed.text = @"!";
  310. _sendFailed.delegate = self;
  311. _sendFailed.didTouch = @selector(showResendMenu);
  312. // _sendFailed.font = [UIFont boldSystemFontOfSize:35];
  313. // _sendFailed.textAlignment = NSTextAlignmentRight;
  314. _sendFailed.hidden = YES;
  315. [self.contentView addSubview:_sendFailed];
  316. // [_sendFailed release];
  317. }
  318. - (void) tapAction {
  319. _headImage.userInteractionEnabled = NO;
  320. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  321. _headImage.userInteractionEnabled = YES;
  322. });
  323. if ([_chatCellDelegate respondsToSelector:@selector(chatCellHeadIMG:audioPlayChangeIndexNum:)]) {
  324. [_chatCellDelegate chatCellHeadIMG:_msg audioPlayChangeIndexNum:0];
  325. }
  326. //[g_notify postNotificationName:kCellHeadImageNotification object:self.msg];
  327. }
  328. //发送失败,重新发送
  329. -(void)showResendMenu{
  330. [g_window endEditing:YES];
  331. if (self.chatCellDelegate && [self.chatCellDelegate respondsToSelector:@selector(chatCell:resendIndexNum:)]) {
  332. [self.chatCellDelegate chatCell:self resendIndexNum:self.indexNum];
  333. }
  334. // LXActionSheet* _menu = [[LXActionSheet alloc]
  335. // initWithTitle:nil
  336. // delegate:self
  337. // cancelButtonTitle:Localized(@"JX_Cencal")
  338. // destructiveButtonTitle:Localized(@"JXBaseChatCell_SendAngin")
  339. // otherButtonTitles:@[Localized(@"JX_Delete")]];
  340. // [g_window addSubview:_menu];
  341. // [_menu release];
  342. }
  343. //- (void)didClickOnButtonIndex:(LXActionSheet*)sender buttonIndex:(int)buttonIndex{
  344. //
  345. // if(buttonIndex == 0)
  346. // [g_notify postNotificationName:kCellResendMsgNotifaction object:[NSNumber numberWithInt:self.indexNum]];
  347. // if(buttonIndex == 1)
  348. // [g_notify postNotificationName:kCellDeleteMsgNotifaction object:[NSNumber numberWithInt:self.indexNum]];
  349. //}
  350. // 群组内几人查看点击
  351. - (void)showReadPersons {
  352. [g_notify postNotificationName:kCellShowReadPersonsNotifaction object:[NSNumber numberWithInt:self.indexNum]];
  353. }
  354. //展示发言时间
  355. -(void)isShowSendTime{
  356. //系统提示发送消息时间
  357. if(self.msg.isShowTime && [self.msg.type intValue] != kWCMessageTypeRemind){//超过15分钟则显示时间
  358. if(_timeLabel == nil){
  359. _timeLabel = [[UILabel alloc] initWithFrame:CGRectZero];
  360. _timeLabel.textColor = HEXCOLOR(0x999999);
  361. _timeLabel.font = g_factory.font12;
  362. _timeLabel.userInteractionEnabled = NO;
  363. _timeLabel.frame = CGRectMake(JX_SCREEN_WIDTH/2 -40-4, 10, 86+8, 19);
  364. _timeLabel.layer.cornerRadius = 3.f;
  365. _timeLabel.layer.masksToBounds = YES;
  366. _timeLabel.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.5];
  367. _timeLabel.textAlignment = NSTextAlignmentCenter;
  368. [self.contentView addSubview:_timeLabel];
  369. }
  370. _timeLabel.hidden = NO;
  371. NSDateFormatter* f=[[NSDateFormatter alloc]init];
  372. [f setDateFormat:@"MM-dd HH:mm"];
  373. _timeLabel.text = [f stringFromDate:self.msg.timeSend];
  374. g_timeSend = [self.msg.timeSend timeIntervalSince1970];
  375. }else{
  376. _timeLabel.hidden = YES;
  377. }
  378. }
  379. //获取头像
  380. -(void)setHeaderImage{
  381. if ([self.msg.type intValue] == kWCMessageTypeRemind || [self.msg.type intValue] == kWCMessageTypeRemind) {
  382. self.checkBox.hidden = YES;
  383. }else {
  384. if (self.isSelectMore) {
  385. self.checkBox.hidden = NO;
  386. }else {
  387. self.checkBox.hidden = YES;
  388. }
  389. }
  390. if([_msg.type intValue] != kWCMessageTypeRemind && ![_msg isPinbaMsg]){
  391. if ([_msg.type intValue] == kWCMessageTypePhoneAsk) {
  392. if (_msg.isMySend) {
  393. return;
  394. }
  395. }
  396. if(_msg.isMySend){//头像
  397. _headImage.frame = CGRectMake(JX_SCREEN_WIDTH-MAX_INSETS-HEAD_SIZE, INSETS, HEAD_SIZE, HEAD_SIZE);
  398. _cerImgView.frame = CGRectMake(_headImage.frame.origin.x-CER_HEIGHT/2, _headImage.frame.origin.y-CER_HEIGHT/2, _headImage.frame.size.width+CER_HEIGHT, _headImage.frame.size.height+CER_HEIGHT);
  399. _nicknameLabel.textAlignment = NSTextAlignmentRight;
  400. _nicknameLabel.frame = CGRectMake(JX_SCREEN_WIDTH-MAX_INSETS-HEAD_SIZE - 200 - 10, 6, 200, 12);
  401. if (_msg.isShowTime) {
  402. _headImage.frame = CGRectMake(JX_SCREEN_WIDTH-MAX_INSETS-HEAD_SIZE, INSETS + 40, HEAD_SIZE , HEAD_SIZE);
  403. _cerImgView.frame = CGRectMake(_headImage.frame.origin.x-CER_HEIGHT/2, _headImage.frame.origin.y-CER_HEIGHT/2, _headImage.frame.size.width+CER_HEIGHT, _headImage.frame.size.height+CER_HEIGHT);
  404. _nicknameLabel.frame = CGRectMake(JX_SCREEN_WIDTH-MAX_INSETS-HEAD_SIZE - 200 - 10, 6 + 40, 200, 12);
  405. }
  406. }else{
  407. if (self.isSelectMore) {
  408. if ([self.msg.type intValue] != kWCMessageTypeRemind) {
  409. _headImage.frame = CGRectMake(CGRectGetMaxX(_checkBox.frame) + 13, INSETS,HEAD_SIZE , HEAD_SIZE);
  410. }else {
  411. _headImage.frame = CGRectMake(MAX_INSETS, INSETS,HEAD_SIZE , HEAD_SIZE);
  412. }
  413. }else {
  414. _headImage.frame = CGRectMake(MAX_INSETS, INSETS,HEAD_SIZE , HEAD_SIZE);
  415. }
  416. _cerImgView.frame = CGRectMake(_headImage.frame.origin.x-CER_HEIGHT/2, _headImage.frame.origin.y-CER_HEIGHT/2, _headImage.frame.size.width+CER_HEIGHT, _headImage.frame.size.height+CER_HEIGHT);
  417. _gradeIcon.frame = CGRectMake(CGRectGetMaxX(_cerImgView.frame), _cerImgView.frame.origin.y, 60, 18);
  418. _nicknameLabel.textAlignment = NSTextAlignmentLeft;
  419. _nicknameLabel.frame = CGRectMake(CGRectGetMaxX(_gradeIcon.frame)+3, _cerImgView.frame.origin.y, 200, 12);
  420. if (_msg.isShowTime) {
  421. _headImage.frame = CGRectMake(_headImage.frame.origin.x, INSETS + 40, HEAD_SIZE , HEAD_SIZE);
  422. _cerImgView.frame = CGRectMake(_headImage.frame.origin.x-CER_HEIGHT/2, _headImage.frame.origin.y-CER_HEIGHT/2, _headImage.frame.size.width+CER_HEIGHT, _headImage.frame.size.height+CER_HEIGHT);
  423. _gradeIcon.frame = CGRectMake(CGRectGetMaxX(_cerImgView.frame), _cerImgView.frame.origin.y, 60, 18);
  424. _nicknameLabel.frame = CGRectMake(_nicknameLabel.frame.origin.x, _cerImgView.frame.origin.y, 200, 12);
  425. }
  426. }
  427. _checkBox.center = CGPointMake(_checkBox.center.x, _headImage.center.y);
  428. // if () {
  429. NSString *headUserId = _msg.fromUserId;
  430. // if (_msg.isMySend) {
  431. // if ([_msg.toUserId isEqualToString:ANDROID_USERID] || [_msg.toUserId isEqualToString:PC_USERID] || [_msg.toUserId isEqualToString:MAC_USERID]) {
  432. // headUserId = IOS_USERID;
  433. // }
  434. // }
  435. // if (self.isShowHead) {
  436. _headImage.image = nil;
  437. [g_server getHeadImageLarge:headUserId userName:_msg.fromUserName imageView:_headImage];
  438. // }else {
  439. // _headImage.image = [UIImage imageNamed:@"avatar_normal"];
  440. // }
  441. // }else{
  442. // [g_server getHeadImageSmall:[_msg.fromUserId longLongValue]-1 imageView:_headImage];
  443. // }
  444. }
  445. }
  446. //聊天框
  447. - (void)setBackgroundImage{
  448. //初步过滤不需要bgImage的cell
  449. if([_msg.type intValue] == kWCMessageTypeRemind||[_msg.type intValue] == kWCMessageTypeSuperDelete || [_msg isPinbaMsg] || [_msg.type intValue] == kWCMessageTypeSystemImage1 || [_msg.type intValue] == kWCMessageTypeSystemImage2){
  450. _readView.hidden = YES;
  451. return;
  452. }
  453. if (self.msg.isGroup && self.msg.showRead) {
  454. _readView.hidden = NO;
  455. }else {
  456. _readView.hidden = YES;
  457. }
  458. //依数据过滤不需要bgImage的cell
  459. if ([_msg.type intValue] == kWCMessageTypePhoneAsk || [_msg.type intValue] == kWCMessageTypeResumeAsk) {
  460. if (_msg.isMySend) {
  461. return;
  462. }
  463. }
  464. //送达已读图标
  465. int n = 26;
  466. int h = _bubbleBg.frame.size.height;
  467. if(self.msg.isMySend){
  468. _wait.frame = CGRectMake(_bubbleBg.frame.origin.x-n-INSETS, (h-n)/2+INSETS, n, n);
  469. _readView.frame = CGRectMake(_bubbleBg.frame.origin.x - _readView.frame.size.width - INSETS - 2, _bubbleBg.frame.origin.y + 2, _readView.frame.size.width, _readView.frame.size.height);
  470. _readNum.frame = CGRectMake(_readView.frame.size.width - 30, _readNum.frame.origin.y, _readNum.frame.size.width, _readNum.frame.size.height);
  471. }else{
  472. _wait.frame = CGRectMake(_bubbleBg.frame.origin.x+_bubbleBg.frame.size.width+INSETS, (h-n)/2+INSETS, n, n);
  473. _readView.frame = CGRectMake(_bubbleBg.frame.origin.x+_bubbleBg.frame.size.width+INSETS + 2, _bubbleBg.frame.origin.y + 2, _readView.frame.size.width, _readView.frame.size.height);
  474. _readNum.frame = CGRectMake(0, _readNum.frame.origin.y, _readNum.frame.size.width, _readNum.frame.size.height);
  475. }
  476. if (self.msg.isShowTime) {
  477. CGRect frame = _wait.frame;
  478. frame.origin.y = _wait.frame.origin.y + 40;
  479. _wait.frame = frame;
  480. }
  481. _sendFailed.frame = _wait.frame;
  482. // 阅后即焚标记(使用时才创建)
  483. if (!_burnImage) {
  484. _burnImage = [[JXImageView alloc] init];
  485. _burnImage.image = [UIImage imageNamed:@"burn_default"];
  486. _burnImage.hidden = YES;
  487. [self.contentView addSubview:_burnImage];
  488. }
  489. //送达
  490. if(self.msg.isMySend){
  491. [self drawSendOrReadImage];
  492. if (([_msg.type intValue] == kWCMessageTypeFile || [_msg.type intValue] == kWCMessageTypeImage || [_msg.type intValue] == kWCMessageTypeCustomFace || [_msg.type intValue] == kWCMessageTypeEmoji || [_msg.type intValue] == kWCMessageTypeVideo) && [self.msg.isSend intValue] == transfer_status_yes) {
  493. // 进度条发送时可能会出现进度条一直存在, 这里处理, 收到回执就隐藏进度条
  494. [self sendMessageToUser];
  495. }
  496. }else{
  497. //阅后即焚标记
  498. [self drawReadDelView:NO];
  499. if([self.msg.type intValue] != kWCMessageTypeVoice && [self.msg.type intValue] != kWCMessageTypeVideo && [self.msg.type intValue] != kWCMessageTypeFile && [self.msg.type intValue] != kWCMessageTypeLocation && [self.msg.type intValue] != kWCMessageTypeCard && [self.msg.type intValue] != kWCMessageTypeLink && [self.msg.type intValue] != kWCMessageTypeMergeRelay)
  500. _readImage.hidden = YES;
  501. _sendFailed.hidden = YES;
  502. }
  503. if (_msg.content.length>0 && [_msg.type intValue] == kWCMessageTypeShake) {
  504. } else {
  505. if ([_msg.type intValue] == kWCMessageTypeImage || [_msg.type intValue] == kWCMessageTypeCustomFace || [_msg.type intValue] == kWCMessageTypeEmoji || [_msg.type intValue] == kWCMessageTypeVideo || [_msg.type intValue] == kWCMessageTypeLocation || [_msg.type intValue] == kWCMessageTypeRedPacket || [_msg.type intValue] == kWCMessageTypeFile || [_msg.type intValue] == kWCMessageTypeCard || [_msg.type intValue] == kWCMessageTypeLink || [_msg.type intValue] == kWCMessageTypeGif || [_msg.type intValue] == kWCMessageTypeShake || [_msg.type intValue] == kWCMessageTypeMergeRelay || [_msg.type intValue] == kWCMessageTypeShare || [_msg.type intValue] == kWCMessageTypeTransfer) {
  506. return;
  507. }
  508. }
  509. JLBubbleManager *bubbleManager;
  510. if (_msg.isGroup) {
  511. memberData *data = [[memberData alloc] init];
  512. data.roomId = self.room.roomId;
  513. data = [data getCardNameById:_msg.fromUserId];
  514. if (data.bubbleFontId.length <= 0) {
  515. bubbleManager = [JLBubbleManager sharedManager];
  516. bubbleManager.id = @"0";
  517. }else {
  518. bubbleManager = [[JLBubbleManager sharedManager] fechGradeByBubbleFontId:data.bubbleFontId];
  519. }
  520. // NSLog(@"ID--%@---fromUserId%@--%@", data.bubbleFontId,self.msg.fromUserId,bubbleManager);
  521. }else {
  522. // 单聊
  523. // 从朋友表里获取
  524. JXUserObject *user;
  525. if (_msg.isMySend) {
  526. user = [[JXUserObject sharedInstance] getUserById:MY_USER_ID];
  527. }else {
  528. user = [[JXUserObject sharedInstance] getUserById:_msg.fromUserId];
  529. }
  530. bubbleManager = [[JLBubbleManager sharedManager] fechGradeByBubbleFontId:user.bubbleFontId];
  531. }
  532. if (bubbleManager == nil){
  533. if(_msg.isMySend){
  534. // chat_bg_white_press
  535. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_blue"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateNormal];
  536. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_blue_press"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateHighlighted];
  537. }else{
  538. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_white"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateNormal];
  539. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_white"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateHighlighted];
  540. }
  541. }else {
  542. if(_msg.isMySend){
  543. // UIImage *image = [[JLBubbleManager sharedManager] getBubblePath:bubbleManager.iosRightUrl BubbleType:(BubbleTyperight)];
  544. //[_bubbleBg setBackgroundImage:image forState:UIControlStateNormal];
  545. // [_bubbleBgImageView setImage:image];
  546. [_bubbleBg setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  547. _bubbleBg.titleLabel.font=[UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
  548. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_blue"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateNormal];
  549. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_blue_press"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateHighlighted];
  550. // chat_bg_blue_press chat_bg_blue
  551. }else{
  552. // UIImage *image = [[JLBubbleManager sharedManager] getBubblePath:bubbleManager.iosLeftUrl BubbleType:(BubbleTypeLeft)];
  553. // [_bubbleBg setBackgroundImage:image forState:UIControlStateNormal];
  554. //[_bubbleBgImageView setImage:image];
  555. [_bubbleBg setBackgroundImage:[[UIImage imageNamed:@"chat_bg_white"]stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch] forState:UIControlStateNormal];
  556. [_bubbleBg setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  557. _bubbleBg.titleLabel.font=[UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
  558. }
  559. }
  560. }
  561. //阅后即焚标记
  562. - (void)drawReadDelView:(BOOL)isSelected {
  563. // isSelected YES 文本倒计时状态 NO 文本未点击状态
  564. _burnImage.frame = CGRectMake(CGRectGetMaxX(_bubbleBg.frame)+(isSelected ? 11 : 6), _bubbleBg.frame.origin.y+(isSelected ? 22 : 14), 15, 15);
  565. if ([self.msg.type intValue] == kWCMessageTypeGif || [self.msg.type intValue] == kWCMessageTypeShake) {
  566. _burnImage.frame = CGRectMake(CGRectGetMaxX(_bubbleBg.frame)+(isSelected ? 11 : 6), 22+(isSelected ? 22 : 14), _burnImage.frame.size.width, _burnImage.frame.size.height);
  567. if (self.msg.isShowTime) {
  568. CGRect burnFrame = _burnImage.frame;
  569. burnFrame.origin.y = _burnImage.frame.origin.y + 40;
  570. _burnImage.frame = burnFrame;
  571. }
  572. }
  573. if (([_msg.type intValue] == kWCMessageTypeText || [_msg.type intValue] == kWCMessageTypeImage|| [_msg.type intValue] == kWCMessageTypeCustomFace|| [_msg.type intValue] == kWCMessageTypeEmoji || [_msg.type intValue] == kWCMessageTypeVoice || [_msg.type intValue] == kWCMessageTypeVideo)) {
  574. _burnImage.hidden = ![_msg.isReadDel boolValue];
  575. }else {
  576. _burnImage.hidden = YES;
  577. }
  578. if (self.isCourse) {
  579. _burnImage.hidden = YES;
  580. }
  581. }
  582. //下载
  583. //-(void)downloadFile:(JXImageView*)iv{
  584. // if([_msg.content length]<=0)
  585. // return;
  586. // if(_msg.isMySend && [[NSFileManager defaultManager] fileExistsAtPath:_msg.fileName] ){//如本地文件存在
  587. // if([[_msg.fileName pathExtension] isEqualToString:@"jpg"] && iv!=nil){
  588. // UIImage* p = [[UIImage alloc]initWithContentsOfFile:_msg.fileName];
  589. // iv.image = p;
  590. //// [p release];
  591. // }
  592. // return;
  593. // }
  594. //
  595. // NSString* ext = [[_msg.content lastPathComponent] pathExtension];
  596. // NSString *filepath = [myTempFilePath stringByAppendingPathComponent:[_msg.content lastPathComponent]];
  597. //
  598. // if( ![[NSFileManager defaultManager] fileExistsAtPath:filepath]){
  599. // [g_server addTask:_msg.content param:iv toView:self];
  600. // }
  601. // else{
  602. // [self doSaveOK];
  603. // if([ext isEqualToString:@"jpg"] && iv!=nil){
  604. // UIImage* p = [[UIImage alloc]initWithContentsOfFile:filepath];
  605. // iv.image = p;
  606. //// [p release];
  607. // }
  608. // }
  609. //
  610. // filepath = nil;
  611. // ext = nil;
  612. //}
  613. - (void)didServerResultSucces:(JXConnection *)task dict:(NSDictionary *)dict array:(NSArray *)array1{
  614. [self doSaveOK];
  615. }
  616. -(int) didServerResultFailed:(JXConnection*)aDownload dict:(NSDictionary*)dict{
  617. [self doSaveError];
  618. return hide_error;
  619. }
  620. -(int) didServerConnectError:(JXConnection*)aDownload error:(NSError *)error{
  621. [self doSaveError];
  622. return hide_error;
  623. }
  624. -(void) didServerConnectStart:(JXConnection*)aDownload{
  625. }
  626. -(void)doSaveError{
  627. NSLog(@"http失败");
  628. [_msg updateIsReceive:transfer_status_no];
  629. [self drawIsReceive];
  630. }
  631. -(void)doSaveOK{
  632. _msg.fileName = [myTempFilePath stringByAppendingPathComponent:[_msg.content lastPathComponent]];
  633. [_msg updateIsReceive:transfer_status_yes];
  634. [self setBackgroundImage];
  635. [self drawIsReceive];
  636. }
  637. //语音红点
  638. -(void)drawIsRead{
  639. if (self.msg.isMySend) {
  640. return;
  641. }
  642. if([self.msg.isRead boolValue]){
  643. if (_readImage == nil) {
  644. JXImageView * imageV = (JXImageView *) [self viewWithTag:131];
  645. imageV.hidden = YES;
  646. }else{
  647. _readImage.hidden = YES;
  648. }
  649. }
  650. else{
  651. if(_readImage==nil){
  652. _readImage=[[UIButton alloc]init];
  653. [_readImage setImage:[UIImage imageNamed:@"new_tips"] forState:UIControlStateNormal];
  654. _readImage.hidden = YES;
  655. [self.contentView addSubview:_readImage];
  656. }
  657. _readImage.frame = CGRectMake(_bubbleBg.frame.origin.x+_bubbleBg.frame.size.width+7, _bubbleBg.frame.origin.y+13, 10, 10);
  658. [_readImage setImage:[UIImage imageNamed:@"new_tips"] forState:UIControlStateNormal];
  659. _readImage.tag = 131;
  660. _readImage.hidden = YES;
  661. }
  662. }
  663. //改为消息已发送
  664. -(void)drawIsSend{
  665. int n = [self.msg.isSend intValue];
  666. _wait.hidden = n != transfer_status_ing;
  667. if(n){
  668. [_wait stopAnimating];
  669. if (self.msg.isGroup) {
  670. NSArray *array = [self.msg fetchReadList];
  671. _readNum.text = [NSString stringWithFormat:@"%ld%@",array.count,Localized(@"JXLiveVC_countPeople")];
  672. }else {
  673. if (self.msg.isMySend) {
  674. //送达
  675. [self drawSendOrReadImage];
  676. }
  677. }
  678. if (([_msg.type intValue] == kWCMessageTypeFile || [_msg.type intValue] == kWCMessageTypeImage || [_msg.type intValue] == kWCMessageTypeCustomFace || [_msg.type intValue] == kWCMessageTypeEmoji || [_msg.type intValue] == kWCMessageTypeVideo) && [self.msg.isRead intValue] == 0 && [self.msg.isSend intValue] == transfer_status_yes) {
  679. // 进度条发送时可能会出现进度条一直存在, 这里处理, 收到回执就隐藏进度条
  680. [self sendMessageToUser];
  681. }
  682. }
  683. else
  684. [_wait stopAnimating];
  685. // [_wait startAnimating];
  686. if(n == transfer_status_no){
  687. _sendFailed.hidden = NO;
  688. // _readImage.hidden = YES;
  689. }else{
  690. _sendFailed.hidden = YES;
  691. // _readImage.hidden = NO;
  692. }
  693. if (self.isCourse) {
  694. _sendFailed.hidden = YES;
  695. }
  696. }
  697. -(void)drawSendOrReadImage{
  698. //消息发送失败
  699. if([self.msg.isSend intValue] == transfer_status_no){
  700. _readImage.hidden = YES;
  701. _sendFailed.hidden = NO; //秀噶成 yes
  702. return;
  703. }
  704. //消息发送成功
  705. if([_msg.isSend intValue] == transfer_status_yes){
  706. _sendFailed.hidden = YES;
  707. //不显示的条件
  708. if ([self.msg.type intValue] == kWCMessageTypeRemind || self.msg.isGroup || !self.msg.isVisible || [_msg isPinbaMsg]) {
  709. _readImage.hidden = YES;
  710. return;
  711. }
  712. //判断是否要新建
  713. if (_readImage == nil) {
  714. _readImage = [[UIButton alloc]init];
  715. _readImage.hidden = YES;
  716. [self.contentView addSubview:_readImage];
  717. }
  718. [_readImage.titleLabel setFont:SYSFONT(12)];
  719. //设置图片
  720. _readImage.frame = CGRectMake(_bubbleBg.frame.origin.x-20-INSETS*0.5-10, _bubbleBg.frame.origin.y+2, 30, 12);
  721. _burnImage.frame = CGRectMake(_bubbleBg.frame.origin.x-20-INSETS*0.5+2, _bubbleBg.frame.origin.y+20, 15, 15);
  722. if ([self.msg.type intValue] == kWCMessageTypeGif || [self.msg.type intValue] == kWCMessageTypeShake) {
  723. // 新震动
  724. if (self.msg.content.length>0 && [self.msg.type intValue] == kWCMessageTypeShake) {
  725. _readImage.frame = CGRectMake(CGRectGetMinX(self.bubbleBg.frame)-_readImage.frame.size.width, 20, _readImage.frame.size.width, _readImage.frame.size.height);
  726. _burnImage.frame = CGRectMake(JX_SCREEN_WIDTH-HEAD_SIZE-imageItemHeight-INSETS*2 + 40 - 20 - INSETS * .5+2, 20+18, _burnImage.frame.size.width, _burnImage.frame.size.height);
  727. }else {
  728. _readImage.frame = CGRectMake(JX_SCREEN_WIDTH-HEAD_SIZE-imageItemHeight-INSETS*2 + 40 - 20 - INSETS * .5-10, 20, _readImage.frame.size.width, _readImage.frame.size.height);
  729. _burnImage.frame = CGRectMake(JX_SCREEN_WIDTH-HEAD_SIZE-imageItemHeight-INSETS*2 + 40 - 20 - INSETS * .5+2, 20+18, _burnImage.frame.size.width, _burnImage.frame.size.height);
  730. }
  731. if (self.msg.isShowTime) {
  732. CGRect frame = _readImage.frame;
  733. frame.origin.y = _readImage.frame.origin.y + 40;
  734. _readImage.frame = frame;
  735. CGRect burnFrame = _burnImage.frame;
  736. burnFrame.origin.y = _burnImage.frame.origin.y + 40;
  737. _burnImage.frame = burnFrame;
  738. }
  739. }
  740. if( [self.msg.isRead intValue] == 0){
  741. // _readImage.image = [UIImage imageNamed:@"send"];
  742. [_readImage setTitleColor:HEXCOLOR(0x666666) forState:UIControlStateNormal];
  743. [_readImage setTitle:@"未读" forState:UIControlStateNormal];
  744. }else{//HEXCOLOR(0xCCCCCC)
  745. [_readImage setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
  746. [_readImage setTitle:@"已读" forState:UIControlStateNormal];
  747. // _readImage.image = [UIImage imageNamed:@"read"];
  748. }
  749. [_readImage setImage:nil forState:UIControlStateNormal];
  750. _readImage.hidden = NO;
  751. if (([_msg.type intValue] == kWCMessageTypeText || [_msg.type intValue] == kWCMessageTypeImage || [_msg.type intValue] == kWCMessageTypeCustomFace || [_msg.type intValue] == kWCMessageTypeEmoji || [_msg.type intValue] == kWCMessageTypeVoice || [_msg.type intValue] == kWCMessageTypeVideo || [_msg.type intValue] == kWCMessageTypeReply)) {
  752. _burnImage.hidden = ![_msg.isReadDel boolValue];
  753. }else {
  754. _burnImage.hidden = YES;
  755. }
  756. }
  757. if (self.isCourse) {
  758. _sendFailed.hidden = YES;
  759. _readImage.hidden = YES;
  760. _burnImage.hidden = YES;
  761. }
  762. }
  763. - (void)sendMessageToUser {
  764. // 消息已经送达
  765. }
  766. - (void)drawReadPersons:(int)num{
  767. _readNum.text = [NSString stringWithFormat:@"%d%@",num,Localized(@"JXLiveVC_countPeople")];
  768. }
  769. -(void)drawIsReceive{
  770. int n = [_msg.isReceive intValue];
  771. _wait.hidden = n!=0;
  772. if(_wait.hidden)
  773. [_wait stopAnimating];
  774. else
  775. [_wait startAnimating];
  776. if(n == transfer_status_no){
  777. _sendFailed.hidden = NO;
  778. _readImage.hidden = YES;
  779. }else{
  780. _sendFailed.hidden = YES;
  781. _readImage.hidden = NO;
  782. }
  783. if (self.isCourse) {
  784. _sendFailed.hidden = YES;
  785. _readImage.hidden = YES;
  786. }
  787. }
  788. -(void)notifyDrawIsReceive:(NSNotification*)sender{
  789. if(sender.object == self.msg)
  790. [self drawIsReceive];
  791. }
  792. - (void)updateLoadFileProgress:(NSNotification *)noti {
  793. NSDictionary *dict = noti.object;
  794. NSProgress *progress = [dict objectForKey:@"uploadProgress"];
  795. self.fileDict = [dict objectForKey:@"file"];
  796. self.loadProgress = progress.fractionCompleted;
  797. NSLog(@"-------------- %f--- %@ --- %@",self.loadProgress,self.fileDict, self.msg.messageId);
  798. [self updateFileLoadProgress];
  799. }
  800. - (void)updateFileLoadProgress {
  801. }
  802. -(void)didTouch:(UIButton*)button{
  803. }
  804. //回应交换电话后更新按钮状态
  805. - (void)setAgreeRefuseBtnStatusAfterReply{
  806. }
  807. // 设置图片外框
  808. - (void)setMaskLayer:(UIImageView *)imageView {
  809. UIImage *maskImage = nil;
  810. if(self.msg.isMySend){
  811. maskImage = [[UIImage imageNamed:@"chat_bg_blue"] stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch];
  812. }else{
  813. maskImage = [[UIImage imageNamed:@"chat_bg_white"] stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch];
  814. }
  815. UIImageView *maskImageView = [[UIImageView alloc] initWithImage:maskImage];
  816. maskImageView.userInteractionEnabled = YES;
  817. maskImageView.frame = imageView.bounds;
  818. imageView.layer.mask = maskImageView.layer;
  819. }
  820. // 获取cell 高度
  821. + (float) getChatCellHeight:(JXMessageObject *)msg {
  822. return 0;
  823. }
  824. #pragma mark ------------------设置plasticPopupMenu位置---------------------
  825. - (void)doLongPress:(UILongPressGestureRecognizer *)longPress
  826. {
  827. if (self.isSelectMore) {
  828. return;
  829. }
  830. if(longPress.state == UIGestureRecognizerStateBegan)
  831. {
  832. [self creatLongPressItems];
  833. if (longPress.view == self.contentView) {
  834. CGPoint touchPoint = [longPress locationInView:self.contentView];
  835. BOOL iscontain = CGRectContainsPoint(self.headImage.frame, touchPoint);
  836. if (iscontain) {
  837. //@
  838. if ([self.msg.fromUserId isEqualToString:MY_USER_ID]) {
  839. return;
  840. }
  841. [g_notify postNotificationName:kCellLongGesHeadImageNotification object:self.msg];
  842. return;
  843. }
  844. }
  845. CGRect frame = [self.contentView convertRect:self.bubbleBg.frame toView:self.superview.superview.superview];
  846. UIView *view = self.superview.superview;
  847. CGFloat y = frame.origin.y;
  848. if (view.frame.origin.y > 0) {
  849. y = frame.origin.y - 64;
  850. }
  851. //判断是否自己发送的
  852. if (!self.msg.isMySend) {
  853. // [self.plasticPopupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y, self.bubbleBg.frame.size.width + 120, 35) animated:YES];
  854. [self.popupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y, self.bubbleBg.frame.size.width + 120, 35) animated:YES];
  855. }else{
  856. // [self.plasticPopupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y,(self.bubbleBg.frame.origin.x + self.bubbleBg.frame.size.width /2)*2, 35) animated:YES];
  857. [self.popupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y,(self.bubbleBg.frame.origin.x + self.bubbleBg.frame.size.width /2)*2, 35) animated:YES];
  858. }
  859. }
  860. }
  861. - (void)creatLongPressItems
  862. {
  863. if ([self.msg.type intValue] == kWCMessageTypeRemind || self.isSelectMore) {
  864. return;
  865. }
  866. NSMutableArray *items = [NSMutableArray array];
  867. if ([self.msg.type intValue] == kWCMessageTypeVoice) {
  868. NSString *playTitle;
  869. BOOL flag = [g_default boolForKey:kChatVCMessageAudioIsNotPlayback];
  870. if(!flag) {
  871. playTitle = @"听筒播放";
  872. }else {
  873. playTitle = @"扬声器播放";
  874. }
  875. QBPopupMenuItem *item9 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", playTitle] target:self action:@selector(audioPlayChangeAction)];
  876. [items addObject:item9];
  877. }
  878. if([_msg.fromUserId isEqualToString:g_server.myself.userId]){
  879. }else{
  880. QBPopupMenuItem *item4 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", @"特别关心"] target:self action:@selector(deleteAction)];
  881. [items addObject:item4];
  882. }
  883. if (self.isCourse) {
  884. QBPopupMenu *popupMenu = [[QBPopupMenu alloc] initWithItems:items];
  885. popupMenu.highlightedColor = [UIColor lightGrayColor];
  886. popupMenu.height = 35;
  887. self.popupMenu = popupMenu;
  888. // QBPlasticPopupMenu *plasticPopupMenu = [QBPlasticPopupMenu popupMenuWithItems:items];
  889. // plasticPopupMenu.height = 35;
  890. // self.plasticPopupMenu = plasticPopupMenu;
  891. return;
  892. }
  893. if (![self.msg.isReadDel boolValue]) {
  894. QBPopupMenuItem *item8 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ",Localized(@"JX_Reply")] target:self action:@selector(replyMsg)];
  895. [items addObject:item8];
  896. }
  897. if (([self.msg.type intValue] == kWCMessageTypeText || [self.msg.type intValue] == kWCMessageTypeReply) && ![self.msg.isReadDel boolValue]) {
  898. QBPopupMenuItem *item1 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Copy")] target:self action:@selector(myCopy)];
  899. [items addObject:item1];
  900. }
  901. if ([self.msg.type intValue] == kWCMessageTypeText || [self.msg.type intValue] == kWCMessageTypeReply || [self.msg.type intValue] == kWCMessageTypeImage || [self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji || [self.msg.type intValue] == kWCMessageTypeVoice || [self.msg.type intValue] == kWCMessageTypeLocation || [self.msg.type intValue] == kWCMessageTypeGif || [self.msg.type intValue] == kWCMessageTypeVideo || [self.msg.type intValue] == kWCMessageTypeAudio || [self.msg.type intValue] == kWCMessageTypeCard || [self.msg.type intValue] == kWCMessageTypeFile || [self.msg.type intValue] == kWCMessageTypeLink || [self.msg.type intValue] == kWCMessageTypeShare || [self.msg.type intValue] == kWCMessageTypeSystemImage1 || [self.msg.type intValue] == kWCMessageTypeSystemImage2) {
  902. if (![self.msg.isReadDel boolValue]) {
  903. QBPopupMenuItem *item2 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Relay")] target:self action:@selector(relayAction)];
  904. //[items addObject:item2];
  905. }
  906. if (self.isWithdraw) {
  907. // 自己发的5分钟之内可以撤回
  908. // NSDate * today = [NSDate date];
  909. // long long now = [today timeIntervalSince1970];
  910. // long distance = now - [self.msg.timeSend timeIntervalSince1970];
  911. // long distanceM = distance / 60;
  912. // if (distanceM < 5) {
  913. QBPopupMenuItem *item3 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Withdraw")] target:self action:@selector(withdrawAction)];
  914. [items addObject:item3];
  915. // }
  916. }
  917. }
  918. if ([self.msg.type intValue] == kWCMessageTypeImage || [self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji || [self.msg.type intValue] == kWCMessageTypeVideo || [self.msg.type intValue] == kWCMessageTypeFile || [self.msg.type intValue] == kWCMessageTypeVoice || [self.msg.type intValue] == kWCMessageTypeText || [self.msg.type intValue] == kWCMessageTypeReply) {
  919. if (([self.msg.type intValue] == kWCMessageTypeImage || [self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji) && ![self.msg.isReadDel boolValue]) {
  920. if ([self.msg.type intValue] == kWCMessageTypeImage) {
  921. } else {
  922. QBPopupMenuItem *item5 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_AddToTheExpression")] target:self action:@selector(favoritEmojiAction)];
  923. [items addObject:item5];
  924. }
  925. }
  926. // 收藏 除了11 和 12 都能收藏
  927. if (![self.msg.isReadDel boolValue]) {
  928. if([self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji) {
  929. } else {
  930. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Collection")] target:self action:@selector(favoritAction)];
  931. // [items addObject:item6];
  932. }
  933. }
  934. }
  935. if ([self.msg.type intValue] != kWCMessageTypeRemind) {
  936. QBPopupMenuItem *item7 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Multiselect")] target:self action:@selector(selectMoreAction)];
  937. [items addObject:item7];
  938. }
  939. if (self.msg.isMySend) {
  940. NSString *str;
  941. if (self.isShowRecordCourse && [self.msg.isReadDel intValue] != 1) {
  942. if (![self.chatCellDelegate getRecording]) {
  943. str = Localized(@"JX_StartRecording");
  944. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:str target:self action:@selector(recordAction)];
  945. // [items addObject:item6];
  946. }else if (self.indexNum >= [self.chatCellDelegate getRecordStarNum]) {
  947. str = Localized(@"JX_StopRecording");
  948. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", str] target:self action:@selector(recordAction)];
  949. // [items addObject:item6];
  950. }
  951. }
  952. }
  953. QBPopupMenu *popupMenu = [[QBPopupMenu alloc] initWithItems:items];
  954. popupMenu.highlightedColor = [UIColor lightGrayColor];
  955. popupMenu.height = 35;
  956. self.popupMenu = popupMenu;
  957. // QBPlasticPopupMenu *plasticPopupMenu = [QBPlasticPopupMenu popupMenuWithItems:items];
  958. // plasticPopupMenu.height = 35;
  959. // self.plasticPopupMenu = plasticPopupMenu;
  960. }
  961. //复制
  962. - (void)myCopy{
  963. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:myCopyIndexNum:)]) {
  964. [self.chatCellDelegate chatCell:self myCopyIndexNum:self.indexNum];
  965. }
  966. }
  967. // 转发
  968. - (void)relayAction {
  969. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:RelayIndexNum:)]) {
  970. [self.chatCellDelegate chatCell:self RelayIndexNum:self.indexNum];
  971. }
  972. }
  973. // 撤回
  974. - (void)withdrawAction {
  975. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:withdrawIndexNum:)]) {
  976. [self.chatCellDelegate chatCell:self withdrawIndexNum:self.indexNum];
  977. }
  978. }
  979. // 收藏
  980. - (void)favoritAction{
  981. int msgType = [self.msg.type intValue];
  982. CollectType collectType = 0;
  983. if (msgType == kWCMessageTypeImage) {
  984. collectType = CollectTypeImage;
  985. }else if (msgType == kWCMessageTypeVideo) {
  986. collectType = CollectTypeVideo;
  987. }else if (msgType == kWCMessageTypeFile) {
  988. collectType = CollectTypeFile;
  989. }else if (msgType == kWCMessageTypeVoice) {
  990. collectType = CollectTypeVoice;
  991. }else if (msgType == kWCMessageTypeText) {
  992. collectType = CollectTypeText;
  993. }else if (msgType == kWCMessageTypeCustomFace || msgType == kWCMessageTypeEmoji) {
  994. collectType = CollectTypeEmoji;
  995. }else {
  996. }
  997. if (collectType == 0) {
  998. return;
  999. }
  1000. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:favoritIndexNum:type:)]) {
  1001. [self.chatCellDelegate chatCell:self favoritIndexNum:self.indexNum type:collectType];
  1002. }
  1003. }
  1004. -(void)favoritEmojiAction{
  1005. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:favoritIndexNum:type:)]) {
  1006. [self.chatCellDelegate chatCell:self favoritIndexNum:self.indexNum type:CollectTypeEmoji];
  1007. }
  1008. }
  1009. // 回复
  1010. - (void)replyMsg {
  1011. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:replyIndexNum:)]) {
  1012. [self.chatCellDelegate chatCell:self replyIndexNum:self.indexNum];
  1013. }
  1014. }
  1015. // 删除
  1016. - (void)deleteAction {
  1017. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:deleteIndexNum:)]) {
  1018. [self.chatCellDelegate chatCell:self deleteIndexNum:self.indexNum];
  1019. }
  1020. }
  1021. // 多选
  1022. - (void)selectMoreAction {
  1023. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:selectMoreIndexNum:)]) {
  1024. [self.chatCellDelegate chatCell:self selectMoreIndexNum:self.indexNum];
  1025. }
  1026. }
  1027. // 多选选择
  1028. - (void)didSelectedCheckBox:(QCheckBox *)checkbox checked:(BOOL)checked{
  1029. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:checkBoxSelectIndexNum:isSelect:)]) {
  1030. [self.chatCellDelegate chatCell:self checkBoxSelectIndexNum:self.indexNum isSelect:checked];
  1031. }
  1032. }
  1033. // 录制
  1034. - (void)recordAction {
  1035. if ([self.chatCellDelegate getRecording]) {
  1036. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:stopRecordIndexNum:)]) {
  1037. [self.chatCellDelegate chatCell:self stopRecordIndexNum:self.indexNum];
  1038. }
  1039. }else {
  1040. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:startRecordIndexNum:)]) {
  1041. [self.chatCellDelegate chatCell:self startRecordIndexNum:self.indexNum];
  1042. }
  1043. }
  1044. [self creatLongPressItems];
  1045. }
  1046. // 语音播放转换
  1047. - (void)audioPlayChangeAction {
  1048. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:audioPlayChangeIndexNum:)]) {
  1049. [self.chatCellDelegate chatCell:self audioPlayChangeIndexNum:self.indexNum];
  1050. }
  1051. }
  1052. -(void)dealloc{
  1053. NSLog(@"JXBaseChatCell.delloc");
  1054. // [super dealloc];
  1055. // [_bubbleBg release];
  1056. _bubbleBg = nil;
  1057. }
  1058. @end