void ChatWidget::addChatInfo(UiMsgEv::ChatInfo *info,int group) { int type = info->m_chatType; if(type == UiMsgEv::MsgToUserPrivate && info->m_revId != m_userId){ //this is not for me return; } float fontSize = 30; float headWidth = 80; float rowHeight = 40; ccColor3B fHeadCC3,pHeadCC3,fContentCC3,pContentCC3; fHeadCC3 = ccGREEN; pHeadCC3 = ccWHITE; fContentCC3 = ccGREEN; pContentCC3 = ccBLUE; ccColor3B headColor,contentColor; if(type == UiMsgEv::MsgToUserPrivate) headColor = fHeadCC3; else headColor = pHeadCC3; if(type == UiMsgEv::MsgToUserPrivate) contentColor = fContentCC3; else contentColor = pContentCC3; float singleCharWidth = 16; float multiCharWidth = 30; float vscrollWidth = 10; float faceWidth = 60; float faceHeight = 60; float scrollWidth,scrollHeight; VerScrollWidget *scrollWidget = m_scrollWidgets[group]; scrollWidget->getAnchorSize(scrollWidth,scrollHeight); //16 is for ver scroll bar ChatWidgetLayer *layer = new ChatWidgetLayer(scrollWidth - 16); std::string head; head = info->m_senderNickName; if(head.empty()){ mailToNickName(info->m_senderMail,head); if(head.empty()) head = "Guest"; } head.insert(0,"["); /* blank for text edge */ head.append("]:"); #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) CCLabelTTF *headLabel = CCLabelTTF::create(head.data(),getSystemFont(),fontSize ,CCSizeMake(0,rowHeight),kCCTextAlignmentCenter); #else //android if width ==0 && height != 0 lead to crash,fixed in cc 3.0 CCLabelTTF *headLabel = CCLabelTTF::create(head.data(),getSystemFont(),fontSize ,CCSizeMake(0,0),kCCTextAlignmentCenter); #endif headLabel->setColor(headColor); FSizeLabelDelegate *headDele = new FSizeLabelDelegate(headLabel, CCSizeMake(headLabel->getTexture()->getContentSize().width,rowHeight)); layer->setHeadWidget(headDele); layer->setHeadWidth(headWidth); if(m_headCanClicked){ headDele->setCanTouch(true); headDele->setClickCB(this,callfuncND_selector(ChatWidget::onHeadClicked)); ChaterInfo *chater = new ChaterInfo; chater->m_id = info->m_senderId; chater->m_mail = info->m_senderMail; chater->m_nick = info->m_senderNickName; m_chaterMap.insert(std::make_pair(headDele->getName(),chater)); } std::string content = info->m_chatContent; std::vector<ChatInfoFmt> chats; chatStringSplit(content,chats); std::string labelcontent; //need detract ver scroll width scrollWidth -= vscrollWidth; float spaceLeft = scrollWidth - headLabel->getTexture()->getContentSize().width; for(unsigned int i = 0;i < chats.size();i++){ ChatInfoFmt &info = chats[i]; if(info.m_type == TypeChar){ if((spaceLeft - singleCharWidth) > 0){ labelcontent.append(info.m_str); spaceLeft -= singleCharWidth; }else{ #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,rowHeight),kCCTextAlignmentCenter); #else CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,0),kCCTextAlignmentCenter); #endif cLabel->setColor(contentColor); FSizeLabelDelegate *deleLabel = new FSizeLabelDelegate(cLabel,cLabel->getTexture()->getContentSize()); layer->addContentWidget(deleLabel); spaceLeft = scrollWidth - headWidth; labelcontent.clear(); } }else if(info.m_type == TypeUtfChar){ if((spaceLeft - multiCharWidth) > 0){ labelcontent.append(info.m_str); spaceLeft -= multiCharWidth; }else{ #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,rowHeight),kCCTextAlignmentCenter); #else CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,0),kCCTextAlignmentCenter); #endif cLabel->setColor(contentColor); FSizeLabelDelegate *deleLabel = new FSizeLabelDelegate(cLabel,cLabel->getTexture()->getContentSize()); layer->addContentWidget(deleLabel); spaceLeft = scrollWidth - headWidth; labelcontent.clear(); } }else if(info.m_type == TypeFacing){ if(!labelcontent.empty()){ #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,rowHeight),kCCTextAlignmentCenter); #else CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,0),kCCTextAlignmentCenter); #endif cLabel->setColor(contentColor); FSizeLabelDelegate *deleLabel = new FSizeLabelDelegate(cLabel,cLabel->getTexture()->getContentSize()); layer->addContentWidget(deleLabel); spaceLeft -= cLabel->getTexture()->getContentSize().width; labelcontent.clear(); } std::string animName,firstFrame; animName = info.m_str; firstFrame = animName; ResourceMgr::getInstance()->getFrameSpriteFirstFrame(firstFrame); if(firstFrame.empty()) continue; BasAnimSprite *animSprite = new BasAnimSprite(animName,firstFrame); animSprite->start(); FSizeSpriteDelegate *faceDele = new FSizeSpriteDelegate(animSprite,CCSizeMake(faceWidth,faceHeight)); layer->addContentWidget(faceDele); if((spaceLeft - faceWidth) > 0){ spaceLeft -= faceWidth; }else{ spaceLeft = scrollWidth - headWidth; } } } if(!labelcontent.empty()){ #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,rowHeight),kCCTextAlignmentCenter); #else CCLabelTTF *cLabel = CCLabelTTF::create(labelcontent.data(),getSystemFont(),fontSize, CCSizeMake(0,0),kCCTextAlignmentCenter); #endif cLabel->setColor(contentColor); FSizeLabelDelegate *deleLabel = new FSizeLabelDelegate(cLabel,cLabel->getTexture()->getContentSize()); layer->addContentWidget(deleLabel); } layer->exec(); scrollWidget->addFixedSizeWidget(layer); scrollWidget->layout(true); if(m_autoScroll) scrollWidget->scrollToEnd(true); }