JXBaseChatCell.m 55 KB

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