JXBaseChatCell.m 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258
  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 startAnimating];
  685. if(n == transfer_status_no){
  686. _sendFailed.hidden = NO;
  687. // _readImage.hidden = YES;
  688. }else{
  689. _sendFailed.hidden = YES;
  690. // _readImage.hidden = NO;
  691. }
  692. if (self.isCourse) {
  693. _sendFailed.hidden = YES;
  694. }
  695. }
  696. -(void)drawSendOrReadImage{
  697. //消息发送失败
  698. if([self.msg.isSend intValue] == transfer_status_no){
  699. _readImage.hidden = YES;
  700. _sendFailed.hidden = NO;
  701. return;
  702. }
  703. //消息发送成功
  704. if([self.msg.isSend intValue] == transfer_status_yes){
  705. _sendFailed.hidden = YES;
  706. //不显示的条件
  707. if ([self.msg.type intValue] == kWCMessageTypeRemind || self.msg.isGroup || !self.msg.isVisible || [_msg isPinbaMsg]) {
  708. _readImage.hidden = YES;
  709. return;
  710. }
  711. //判断是否要新建
  712. if (_readImage == nil) {
  713. _readImage = [[UIButton alloc]init];
  714. _readImage.hidden = YES;
  715. [self.contentView addSubview:_readImage];
  716. }
  717. [_readImage.titleLabel setFont:SYSFONT(12)];
  718. //设置图片
  719. _readImage.frame = CGRectMake(_bubbleBg.frame.origin.x-20-INSETS*0.5-10, _bubbleBg.frame.origin.y+2, 30, 12);
  720. _burnImage.frame = CGRectMake(_bubbleBg.frame.origin.x-20-INSETS*0.5+2, _bubbleBg.frame.origin.y+20, 15, 15);
  721. if ([self.msg.type intValue] == kWCMessageTypeGif || [self.msg.type intValue] == kWCMessageTypeShake) {
  722. // 新震动
  723. if (self.msg.content.length>0 && [self.msg.type intValue] == kWCMessageTypeShake) {
  724. _readImage.frame = CGRectMake(CGRectGetMinX(self.bubbleBg.frame)-_readImage.frame.size.width, 20, _readImage.frame.size.width, _readImage.frame.size.height);
  725. _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);
  726. }else {
  727. _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);
  728. _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);
  729. }
  730. if (self.msg.isShowTime) {
  731. CGRect frame = _readImage.frame;
  732. frame.origin.y = _readImage.frame.origin.y + 40;
  733. _readImage.frame = frame;
  734. CGRect burnFrame = _burnImage.frame;
  735. burnFrame.origin.y = _burnImage.frame.origin.y + 40;
  736. _burnImage.frame = burnFrame;
  737. }
  738. }
  739. if( [self.msg.isRead intValue] == 0){
  740. // _readImage.image = [UIImage imageNamed:@"send"];
  741. [_readImage setTitleColor:HEXCOLOR(0x666666) forState:UIControlStateNormal];
  742. [_readImage setTitle:@"未读" forState:UIControlStateNormal];
  743. }else{
  744. [_readImage setTitleColor:HEXCOLOR(0xCCCCCC) forState:UIControlStateNormal];
  745. [_readImage setTitle:@"已读" forState:UIControlStateNormal];
  746. // _readImage.image = [UIImage imageNamed:@"read"];
  747. }
  748. [_readImage setImage:nil forState:UIControlStateNormal];
  749. _readImage.hidden = NO;
  750. 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)) {
  751. _burnImage.hidden = ![_msg.isReadDel boolValue];
  752. }else {
  753. _burnImage.hidden = YES;
  754. }
  755. }
  756. if (self.isCourse) {
  757. _sendFailed.hidden = YES;
  758. _readImage.hidden = YES;
  759. _burnImage.hidden = YES;
  760. }
  761. }
  762. - (void)sendMessageToUser {
  763. // 消息已经送达
  764. }
  765. - (void)drawReadPersons:(int)num{
  766. _readNum.text = [NSString stringWithFormat:@"%d%@",num,Localized(@"JXLiveVC_countPeople")];
  767. }
  768. -(void)drawIsReceive{
  769. int n = [_msg.isReceive intValue];
  770. _wait.hidden = n!=0;
  771. if(_wait.hidden)
  772. [_wait stopAnimating];
  773. else
  774. [_wait startAnimating];
  775. if(n == transfer_status_no){
  776. _sendFailed.hidden = NO;
  777. _readImage.hidden = YES;
  778. }else{
  779. _sendFailed.hidden = YES;
  780. _readImage.hidden = NO;
  781. }
  782. if (self.isCourse) {
  783. _sendFailed.hidden = YES;
  784. _readImage.hidden = YES;
  785. }
  786. }
  787. -(void)notifyDrawIsReceive:(NSNotification*)sender{
  788. if(sender.object == self.msg)
  789. [self drawIsReceive];
  790. }
  791. - (void)updateLoadFileProgress:(NSNotification *)noti {
  792. NSDictionary *dict = noti.object;
  793. NSProgress *progress = [dict objectForKey:@"uploadProgress"];
  794. self.fileDict = [dict objectForKey:@"file"];
  795. self.loadProgress = progress.fractionCompleted;
  796. NSLog(@"-------------- %f--- %@ --- %@",self.loadProgress,self.fileDict, self.msg.messageId);
  797. [self updateFileLoadProgress];
  798. }
  799. - (void)updateFileLoadProgress {
  800. }
  801. -(void)didTouch:(UIButton*)button{
  802. }
  803. //回应交换电话后更新按钮状态
  804. - (void)setAgreeRefuseBtnStatusAfterReply{
  805. }
  806. // 设置图片外框
  807. - (void)setMaskLayer:(UIImageView *)imageView {
  808. UIImage *maskImage = nil;
  809. if(self.msg.isMySend){
  810. maskImage = [[UIImage imageNamed:@"chat_bg_blue"] stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch];
  811. }else{
  812. maskImage = [[UIImage imageNamed:@"chat_bg_white"] stretchableImageWithLeftCapWidth:stretch topCapHeight:stretch];
  813. }
  814. UIImageView *maskImageView = [[UIImageView alloc] initWithImage:maskImage];
  815. maskImageView.userInteractionEnabled = YES;
  816. maskImageView.frame = imageView.bounds;
  817. imageView.layer.mask = maskImageView.layer;
  818. }
  819. // 获取cell 高度
  820. + (float) getChatCellHeight:(JXMessageObject *)msg {
  821. return 0;
  822. }
  823. #pragma mark ------------------设置plasticPopupMenu位置---------------------
  824. - (void)doLongPress:(UILongPressGestureRecognizer *)longPress
  825. {
  826. if (self.isSelectMore) {
  827. return;
  828. }
  829. if(longPress.state == UIGestureRecognizerStateBegan)
  830. {
  831. [self creatLongPressItems];
  832. if (longPress.view == self.contentView) {
  833. CGPoint touchPoint = [longPress locationInView:self.contentView];
  834. BOOL iscontain = CGRectContainsPoint(self.headImage.frame, touchPoint);
  835. if (iscontain) {
  836. //@
  837. if ([self.msg.fromUserId isEqualToString:MY_USER_ID]) {
  838. return;
  839. }
  840. [g_notify postNotificationName:kCellLongGesHeadImageNotification object:self.msg];
  841. return;
  842. }
  843. }
  844. CGRect frame = [self.contentView convertRect:self.bubbleBg.frame toView:self.superview.superview.superview];
  845. UIView *view = self.superview.superview;
  846. CGFloat y = frame.origin.y;
  847. if (view.frame.origin.y > 0) {
  848. y = frame.origin.y - 64;
  849. }
  850. //判断是否自己发送的
  851. if (!self.msg.isMySend) {
  852. // [self.plasticPopupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y, self.bubbleBg.frame.size.width + 120, 35) animated:YES];
  853. [self.popupMenu showInView:self.superview.superview targetRect:CGRectMake(self.frame.origin.x, y, self.bubbleBg.frame.size.width + 120, 35) animated:YES];
  854. }else{
  855. // [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];
  856. [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];
  857. }
  858. }
  859. }
  860. - (void)creatLongPressItems
  861. {
  862. if ([self.msg.type intValue] == kWCMessageTypeRemind || self.isSelectMore) {
  863. return;
  864. }
  865. NSMutableArray *items = [NSMutableArray array];
  866. if ([self.msg.type intValue] == kWCMessageTypeVoice) {
  867. NSString *playTitle;
  868. BOOL flag = [g_default boolForKey:kChatVCMessageAudioIsNotPlayback];
  869. if(!flag) {
  870. playTitle = @"听筒播放";
  871. }else {
  872. playTitle = @"扬声器播放";
  873. }
  874. QBPopupMenuItem *item9 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", playTitle] target:self action:@selector(audioPlayChangeAction)];
  875. [items addObject:item9];
  876. }
  877. if([_msg.fromUserId isEqualToString:g_server.myself.userId]){
  878. }else{
  879. QBPopupMenuItem *item4 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", @"特别关心"] target:self action:@selector(deleteAction)];
  880. [items addObject:item4];
  881. }
  882. if (self.isCourse) {
  883. QBPopupMenu *popupMenu = [[QBPopupMenu alloc] initWithItems:items];
  884. popupMenu.highlightedColor = [UIColor lightGrayColor];
  885. popupMenu.height = 35;
  886. self.popupMenu = popupMenu;
  887. // QBPlasticPopupMenu *plasticPopupMenu = [QBPlasticPopupMenu popupMenuWithItems:items];
  888. // plasticPopupMenu.height = 35;
  889. // self.plasticPopupMenu = plasticPopupMenu;
  890. return;
  891. }
  892. if (![self.msg.isReadDel boolValue]) {
  893. QBPopupMenuItem *item8 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ",Localized(@"JX_Reply")] target:self action:@selector(replyMsg)];
  894. [items addObject:item8];
  895. }
  896. if (([self.msg.type intValue] == kWCMessageTypeText || [self.msg.type intValue] == kWCMessageTypeReply) && ![self.msg.isReadDel boolValue]) {
  897. QBPopupMenuItem *item1 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Copy")] target:self action:@selector(myCopy)];
  898. [items addObject:item1];
  899. }
  900. 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) {
  901. if (![self.msg.isReadDel boolValue]) {
  902. QBPopupMenuItem *item2 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Relay")] target:self action:@selector(relayAction)];
  903. //[items addObject:item2];
  904. }
  905. if (self.isWithdraw) {
  906. // 自己发的5分钟之内可以撤回
  907. // NSDate * today = [NSDate date];
  908. // long long now = [today timeIntervalSince1970];
  909. // long distance = now - [self.msg.timeSend timeIntervalSince1970];
  910. // long distanceM = distance / 60;
  911. // if (distanceM < 5) {
  912. QBPopupMenuItem *item3 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Withdraw")] target:self action:@selector(withdrawAction)];
  913. [items addObject:item3];
  914. // }
  915. }
  916. }
  917. 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) {
  918. if (([self.msg.type intValue] == kWCMessageTypeImage || [self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji) && ![self.msg.isReadDel boolValue]) {
  919. if ([self.msg.type intValue] == kWCMessageTypeImage) {
  920. } else {
  921. QBPopupMenuItem *item5 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_AddToTheExpression")] target:self action:@selector(favoritEmojiAction)];
  922. [items addObject:item5];
  923. }
  924. }
  925. // 收藏 除了11 和 12 都能收藏
  926. if (![self.msg.isReadDel boolValue]) {
  927. if([self.msg.type intValue] == kWCMessageTypeCustomFace || [self.msg.type intValue] == kWCMessageTypeEmoji) {
  928. } else {
  929. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Collection")] target:self action:@selector(favoritAction)];
  930. // [items addObject:item6];
  931. }
  932. }
  933. }
  934. if ([self.msg.type intValue] != kWCMessageTypeRemind) {
  935. QBPopupMenuItem *item7 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", Localized(@"JX_Multiselect")] target:self action:@selector(selectMoreAction)];
  936. [items addObject:item7];
  937. }
  938. if (self.msg.isMySend) {
  939. NSString *str;
  940. if (self.isShowRecordCourse && [self.msg.isReadDel intValue] != 1) {
  941. if (![self.chatCellDelegate getRecording]) {
  942. str = Localized(@"JX_StartRecording");
  943. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:str target:self action:@selector(recordAction)];
  944. // [items addObject:item6];
  945. }else if (self.indexNum >= [self.chatCellDelegate getRecordStarNum]) {
  946. str = Localized(@"JX_StopRecording");
  947. QBPopupMenuItem *item6 = [QBPopupMenuItem itemWithTitle:[NSString stringWithFormat:@" %@ ", str] target:self action:@selector(recordAction)];
  948. // [items addObject:item6];
  949. }
  950. }
  951. }
  952. QBPopupMenu *popupMenu = [[QBPopupMenu alloc] initWithItems:items];
  953. popupMenu.highlightedColor = [UIColor lightGrayColor];
  954. popupMenu.height = 35;
  955. self.popupMenu = popupMenu;
  956. // QBPlasticPopupMenu *plasticPopupMenu = [QBPlasticPopupMenu popupMenuWithItems:items];
  957. // plasticPopupMenu.height = 35;
  958. // self.plasticPopupMenu = plasticPopupMenu;
  959. }
  960. //复制
  961. - (void)myCopy{
  962. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:myCopyIndexNum:)]) {
  963. [self.chatCellDelegate chatCell:self myCopyIndexNum:self.indexNum];
  964. }
  965. }
  966. // 转发
  967. - (void)relayAction {
  968. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:RelayIndexNum:)]) {
  969. [self.chatCellDelegate chatCell:self RelayIndexNum:self.indexNum];
  970. }
  971. }
  972. // 撤回
  973. - (void)withdrawAction {
  974. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:withdrawIndexNum:)]) {
  975. [self.chatCellDelegate chatCell:self withdrawIndexNum:self.indexNum];
  976. }
  977. }
  978. // 收藏
  979. - (void)favoritAction{
  980. int msgType = [self.msg.type intValue];
  981. CollectType collectType = 0;
  982. if (msgType == kWCMessageTypeImage) {
  983. collectType = CollectTypeImage;
  984. }else if (msgType == kWCMessageTypeVideo) {
  985. collectType = CollectTypeVideo;
  986. }else if (msgType == kWCMessageTypeFile) {
  987. collectType = CollectTypeFile;
  988. }else if (msgType == kWCMessageTypeVoice) {
  989. collectType = CollectTypeVoice;
  990. }else if (msgType == kWCMessageTypeText) {
  991. collectType = CollectTypeText;
  992. }else if (msgType == kWCMessageTypeCustomFace || msgType == kWCMessageTypeEmoji) {
  993. collectType = CollectTypeEmoji;
  994. }else {
  995. }
  996. if (collectType == 0) {
  997. return;
  998. }
  999. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:favoritIndexNum:type:)]) {
  1000. [self.chatCellDelegate chatCell:self favoritIndexNum:self.indexNum type:collectType];
  1001. }
  1002. }
  1003. -(void)favoritEmojiAction{
  1004. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:favoritIndexNum:type:)]) {
  1005. [self.chatCellDelegate chatCell:self favoritIndexNum:self.indexNum type:CollectTypeEmoji];
  1006. }
  1007. }
  1008. // 回复
  1009. - (void)replyMsg {
  1010. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:replyIndexNum:)]) {
  1011. [self.chatCellDelegate chatCell:self replyIndexNum:self.indexNum];
  1012. }
  1013. }
  1014. // 删除
  1015. - (void)deleteAction {
  1016. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:deleteIndexNum:)]) {
  1017. [self.chatCellDelegate chatCell:self deleteIndexNum:self.indexNum];
  1018. }
  1019. }
  1020. // 多选
  1021. - (void)selectMoreAction {
  1022. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:selectMoreIndexNum:)]) {
  1023. [self.chatCellDelegate chatCell:self selectMoreIndexNum:self.indexNum];
  1024. }
  1025. }
  1026. // 多选选择
  1027. - (void)didSelectedCheckBox:(QCheckBox *)checkbox checked:(BOOL)checked{
  1028. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:checkBoxSelectIndexNum:isSelect:)]) {
  1029. [self.chatCellDelegate chatCell:self checkBoxSelectIndexNum:self.indexNum isSelect:checked];
  1030. }
  1031. }
  1032. // 录制
  1033. - (void)recordAction {
  1034. if ([self.chatCellDelegate getRecording]) {
  1035. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:stopRecordIndexNum:)]) {
  1036. [self.chatCellDelegate chatCell:self stopRecordIndexNum:self.indexNum];
  1037. }
  1038. }else {
  1039. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:startRecordIndexNum:)]) {
  1040. [self.chatCellDelegate chatCell:self startRecordIndexNum:self.indexNum];
  1041. }
  1042. }
  1043. [self creatLongPressItems];
  1044. }
  1045. // 语音播放转换
  1046. - (void)audioPlayChangeAction {
  1047. if ([self.chatCellDelegate respondsToSelector:@selector(chatCell:audioPlayChangeIndexNum:)]) {
  1048. [self.chatCellDelegate chatCell:self audioPlayChangeIndexNum:self.indexNum];
  1049. }
  1050. }
  1051. -(void)dealloc{
  1052. NSLog(@"JXBaseChatCell.delloc");
  1053. // [super dealloc];
  1054. // [_bubbleBg release];
  1055. _bubbleBg = nil;
  1056. }
  1057. @end