#include "stdafx.h"
#include "nlite_include.h"
+using namespace std::tr1;
+namespace nlite{
+ static const LPCTSTR LIVEURL_PART = TEXT("http://live.nicovideo.jp/watch/");
+ static const LPCTSTR ADDMYLIST_PART = TEXT("http://www.nicovideo.jp/mylist_add/video/");
+ static const UINT_PTR SELL_SPACE_LENGTH = 1;
+ //
+ //\83R\83\81\83\93\83g\83r\83\85\81[\93à\82Ì\83R\83\93\83g\83\8d\81[\83\8b\83N\83\89\83X
+ ///////////////////////////////////////////////////////////////////
-VOID CCommentView::CommentLineSet(LPCTSTR chat,UINT_PTR count){
+ CChatReadEdit::CChatReadEdit(CCommentView &m_master):m_master(m_master){
+
+
+ }
+
+ BOOL CChatReadEdit::SetWindowText(const CChatData &chat){
+
+ BOOL rslt = FALSE;
+ try{
+
+ tstring viewString(regex_replace(tstring(chat.chatBuf),nliteregex::TAGSTRING,nliteregex::text::NUTHINGSTRING));
+ rslt = __super::SetWindowText(viewString.c_str());
+
+ CHARFORMAT2 defaultFormat;
+ this->GetDefaultCharFormat(defaultFormat);
+ defaultFormat.dwMask |= CFM_COLOR;
+ if(chat.premium == 2 || chat.premium == 3){
+
+ defaultFormat.crTextColor = m_master.viewproperty.ownerStringColor;
+ }
+
+ else {
+
+ defaultFormat.crTextColor = m_master.viewproperty.baseStringColor;
+
+ }
+
+ BOOL rslt = this->SetDefaultCharFormat(defaultFormat);
+
+
+
+ linkStringBeside(viewString,nliteregex::LILNKREGEX);
+
+
+
+ } catch(std::exception &e){
+ e;
+ rslt = FALSE;
+
+ }
+
+ return rslt;
+
+ }
+
+ VOID CChatReadEdit::linkStringBeside(const tstring &target,const nliteregex::tregex &re){
+
+ match_results<tstring::const_iterator> regexRslt;
+ tstring::const_iterator beginStr = target.begin();
+ tstring::const_iterator endstr = target.end();
+ CHARFORMAT2 cf;
+ cf.cbSize = sizeof(cf);
+ cf.dwMask = CFM_LINK;
+ cf.dwEffects = CFE_LINK;
+ INT_PTR basePosition = 0;
+ while(regex_search(beginStr,endstr,regexRslt,re)){
+ basePosition += regexRslt.position(0);
+ this->SetSel(basePosition,basePosition + regexRslt.length());
+ this->SetCharFormat(cf,SCF_SELECTION);
+ basePosition += regexRslt.length();
+
+ beginStr = regexRslt[0].second;
+ }
+
+ }
+
+ VOID CChatReadEdit::Reset(){
+
+ __super::SetWindowText(TEXT(""));
+
+ return;
+ }
+
+ HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
+
+
+ this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY,0,id);
+
+ DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
+ dwLangOptons &= ~IMF_DUALFONT;
+ this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
+
+
+ CFont defFont = ::AtlGetDefaultGuiFont();
+ LOGFONT deflogFont;
+ defFont.GetLogFont(&deflogFont);
+ CHARFORMAT2 m_defCharFormat;
+ this->GetDefaultCharFormat(m_defCharFormat);
+ CDC cDC = this->GetDC();
+ int picy = cDC.GetDeviceCaps(LOGPIXELSY);
+ this->ReleaseDC(cDC.m_hDC);
+ int point = -MulDiv(deflogFont.lfHeight,72,picy);
+ int twips = point * 20;
+ m_defCharFormat.yHeight = twips;
+ m_defCharFormat.dwEffects ^= CFE_AUTOCOLOR;
+ _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
+ this->SetEventMask(eventMask);
+
+ this->SetDefaultCharFormat(m_defCharFormat);
+
+
+ return *this;
+
+ }
+
+ CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
+ m_master(hMaster),
+ chatDispCtrl(hMaster)
+ {
+
+ return;
+ }
+
+ VOID CChatChildCtrls::Create(){
+
+ this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
+
+ }
+
+ VOID CChatChildCtrls::AdjustRect(RECT &rc){
+
+ rc.left += SELL_SPACE_LENGTH;
+ rc.top += SELL_SPACE_LENGTH;
+ rc.right -= SELL_SPACE_LENGTH;
+ rc.bottom -= SELL_SPACE_LENGTH;
+
+ return;
+ }
+
+ VOID CChatChildCtrls::Hide(HDWP hdwp){
+
+ chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
+
+ }
- CDC cdc = listBox.GetDC();
+ VOID CChatChildCtrls::SetCtrl(HDWP hdwp,const RECT &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
+
+
+ chatDispCtrl.SetWindowText(comment);
+ RECT chatRect = rc;
+
+
+ AdjustRect(chatRect);
+
+ COLORREF bkColor;
+
+ if (comment.viewData.selectFlag == TRUE)
+ {
+ bkColor = m_master.viewproperty.selectBackColor;
+
+ }
+ else
+ {
+
+
+ if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
+
+ bkColor = comment.viewData.backColor;
+
+ }else if(comment.listenerData->bgcolor != ListenerData::INIT_COLOR){
+
+ bkColor = comment.listenerData->bgcolor;
+
+
+ } else {
+
+ bkColor = m_master.viewproperty.backColor;
+
+
+
+ }
+ }
+
+
+ chatDispCtrl.SetBackgroundColor(bkColor);
+
+ chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
+
+ return;
+ }
+
+ UINT_PTR CChatChildCtrls::GetCtrlCount(){
+
+ return 1;
+ }
+
+
+
+ ///
+ ///\83R\83\93\83X\83g\83\89\83N\83^
+ ///
+ CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
+
+ return;
+ }
+
+
+
+ ///
+ ///\83R\83\93\83g\83\8d\81[\83\8b\82ð\95\\8e¦
+ ///
+ VOID CChatChildCtrlsList::ShowCntrls(){
+
+
+
+
+
+
+ if(m_hMaster.commentlist.Size() > 0){
+
+
+
+ RECT headerRect;
+ RECT tmpRect;
+ RECT listRect;
+ m_hMaster.m_commentListWindow.GetClientRect(&listRect);
+ m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
+ headerRect.top = 0;
+ headerRect.bottom = 0;
+
+ UINT_PTR counter = 0;
+ INT_PTR heightSum =0;
+
+ auto ctrlsBegin = m_list.begin();
+ auto ctrlsEnd = m_list.end();
+ auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
+ auto chatDataEnd = m_hMaster.commentlist.end();
+ auto chatDataTmp = chatDataBegin;
+ for(;chatDataBegin != chatDataEnd && heightSum < listRect.bottom;++chatDataBegin){
+ m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
+ counter++;
+ heightSum += chatDataBegin->viewData.height;
+ }
+
+
+
+ chatDataBegin = chatDataTmp;
+ heightSum = 0;
+ HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * (counter > m_list.size() ? counter : m_list.size()));
+ for(; chatDataBegin != chatDataEnd && counter > 0 ;++ctrlsBegin,++chatDataBegin,--counter){
+
+
+ tmpRect = headerRect;
+ tmpRect.top += heightSum;
+ tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
+
+ if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
+
+ ctrlsBegin->SetCtrl(hdwp,tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
+
+ heightSum = tmpRect.bottom;
+
+
+ }
+
+ for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
+
+ ctrlsBegin->Hide(hdwp);
+ }
+
+ ::EndDeferWindowPos(hdwp);
+ }
+
+
+
+ return;
+ }
+
+
+
+ VOID CChatChildCtrlsList::AllHide(){
+
+ auto begin =m_list.begin();
+ auto end = m_list.end();
+
+ HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * m_list.size());
+ for(;begin != end;++begin){
+ begin->Hide(hdwp);
+ }
+ ::EndDeferWindowPos(hdwp);
+
+ }
+
+ ///
+ ///\8ag\92£\8f\88\97\9d
+ ///
+ CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
+
+
+ CChatChildCtrls ctrls(m_hMaster);
+
+ m_list.push_back(ctrls);
+ m_list.back().Create();
+ auto ite = (--m_list.end());
- RECT drowSize = {0};
- header.GetItemRect(COMMENT,&drowSize);
- drowSize.left += 2;
- drowSize.top += 2;
- drowSize.right -= 2;
- drowSize.bottom = 0;
+ return ite;
+ }
+
+
+ //
+ //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
+ ///////////////////////////////////////////////////////
+
+ CCommentView::CCommentView(CNicoLiveStream &stream,CNicoVideoAuth &in_refAuth):
+ m_commentListWindow(*this),
+ stream(stream),
+ refAuth(in_refAuth)
+ ,chatChildCtrlsList(*this)
+
+ {
+
+ LOGFONT lf = {0};
+ lf.lfHeight = 10;
+ lf.lfCharSet = SHIFTJIS_CHARSET;
+
+
+ hHeaderFontNew = CreateFontIndirect(&lf);
+
+
+ return;
+
+ }
+
+ CCommentView::~CCommentView(){
+
+
+ DeleteObject(hHeaderFontNew);
+
+ return;
+ }
+
+ VOID CCommentView::UpDateUI(){
+
+ this->chatChildCtrlsList.ShowCntrls();
+ this->m_commentListWindow.Invalidate();
+ return;
+ }
+
+
+ VOID CCommentView::OnConnect(){
+ m_commentListWindow.SetRedraw(FALSE);
+ m_commentListWindow.ResetViewSellHeight();
+
+ chatChildCtrlsList.AllHide();
+
+
+ commentlist.OnConnect();
+
+ SCROLLINFO vScrollInfo = {0};
+ vScrollInfo.cbSize = sizeof(vScrollInfo);
+ vScrollInfo.fMask = SIF_ALL;
+
+ this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
+
+ m_commentListWindow.SetRedraw(TRUE);
+ m_commentListWindow.Invalidate();
+
+
+
+ }
+
+
+ UINT_PTR CCommentView::GetColumnHolSizeSum(){
+
+ INT_PTR nMin = 0;
+ INT_PTR nMax = 0;
+ this->GetScrollRange(SB_HORZ,&nMin,&nMax);
+
+ return nMax;
+ }
+
+ VOID CCommentView::SetProperty(const CommentViewProperty &setProperty,const GeneralProperty &in_generalProperty){
+
+
+ viewproperty = setProperty;
+ generalProperty = in_generalProperty;
+ m_commentListWindow.OnSetProperty();
+
+ return;
+ }
+
+ CommentViewProperty &CCommentView::GetProperty(){
+
+ return viewproperty;
+
+ }
+
+
+
+
+
+ HWND CCommentView::Create(HWND hWndParent){
+
+
+
+ HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
+
+ PAINTSTRUCT ps;
+ HDC hdc = m_header.BeginPaint(&ps);
+ SIZE size;
+
+ HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
+
+ LPTSTR columns[] = {TEXT("\83R\83\81\94Ô"),TEXT("\83\86\81[\83U\81[\96¼"),TEXT("\83R\83\81\83\93\83g"),TEXT("\8e\9e\8aÔ"),TEXT("\8fî\95ñ")};
+ UINT_PTR holizenSize[] = {0,0,100,0,0};
+
+ for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
+
+ GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
+ UINT_PTR holsize = holizenSize[index] + size.cx + 15;
+ holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
+ }
+
+ SelectObject(hdc,hOld);
+
+ m_header.EndPaint(&ps);
+
+
+ HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
+
+ AddHeader(&headersinfo);
+
+ m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
+
+
+
+
+ return rslt;
+ }
+
+
+
+
+ LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
+
+
+ if(lParam->hwndFrom == m_header.m_hWnd){
+
+
+ auto begin = commentlist.begin();
+
+ auto end = commentlist.end();
+
+ for(;begin != end;++begin){
+
+ begin->viewData.height = 0;
+
+ }
+
+ m_commentListWindow.SetRedraw(FALSE);
+ SCROLLINFO vScrollInfo = {0};
+ vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
+
+ this->GetScrollInfo(SB_VERT,&vScrollInfo);
+ vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
+ vScrollInfo.fMask = SIF_PAGE;
+ this->SetScrollInfo(SB_VERT,&vScrollInfo);
+
+ BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
+ UINT_PTR commentCount = commentlist.Size();
+ LPNMHEADER lpNmHdr = (LPNMHEADER )lParam;
+
+ m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
+
+
+
+
+
+
+
+ if(scrollFlag == TRUE){
+
+ this->m_commentListWindow.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
+ }
+
+ INT_PTR itemCount = m_header.GetItemCount();
+ RECT itemSizeRect;
+
+ INT_PTR nMax = 0;
+ for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
+ m_header.GetItemRect(itemIndex,&itemSizeRect);
+ nMax += itemSizeRect.right - itemSizeRect.left;
+
+ }
+ INT_PTR nMin = 0;
+ this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
+ DecisionHorzSize();
+
+
+
+
+ m_commentListWindow.SetRedraw(TRUE);
+
+ m_commentListWindow.Invalidate();
+ this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+
+ }
+
+ return 0;
+ }
+
+ VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
+
+
+ commentlist.OnChatReceve(chat,stream.GetDefaultCommunity(),commnetCountSum,this->m_commentListWindow);
+
+ return;
+ }
+
+
+ VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
+
+
+ SCROLLINFO vScrollInfo = {0};
+
+
+ vScrollInfo.fMask = SIF_ALL;
+
+ this->GetScrollInfo(SB_VERT,&vScrollInfo);
+ BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
+
+ vScrollInfo.cbSize = sizeof(vScrollInfo);
+ vScrollInfo.nMax = commentCountSum;
+ vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
+ vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
+
+
+ this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
+
+
+
+
+ if(scrollFlag == TRUE){
+ this->PostMessage(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
+ }
+
+
+ if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)){
+ m_commentListWindow.Invalidate();
+
+ this->m_commentListWindow.PostMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+ }
+
+ return;
+ }
+
+ static UCHAR getrgb(){
+
+ UCHAR rgb = 192 + rand() % 64;
+ return rgb;
+ }
+
+
+
+
+
+
+
+
+
+
+
+ LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
+ ChangeSize(lParam);
+
+ return 0;
+ }
+
+
+ VOID CCommentView::ChangeSize(const SIZE& client){
+
+ SCROLLINFO hScrollInfo = {0};
+ hScrollInfo.cbSize = sizeof(hScrollInfo);
+ hScrollInfo.fMask = SIF_PAGE;
+ hScrollInfo.nPage = client.cx;
+
+ this->SetScrollInfo(SB_HORZ,&hScrollInfo);
+ hScrollInfo.fMask = SIF_ALL;
+ this->GetScrollInfo(SB_HORZ,&hScrollInfo);
+
+
+ HDWP hDwp = BeginDeferWindowPos(2);
+
+
+ INT_PTR movePos = -1 * hScrollInfo.nPos;
+
+ m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
+ m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);
+
+ EndDeferWindowPos(hDwp);
+
+
+ RECT bkRect;
+ RECT headerRectSize;
+ m_header.GetWindowRect(&headerRectSize);
+ bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
+ bkRect.top = 0;
+ bkRect.right = client.cx ;
+ bkRect.bottom = client.cy;
+
+
+ return;
+ }
+
+
+
+ LRESULT CCommentView::OnClickChatNo(UINT uMsg,WPARAM wParam,LPARAM lParam){
+
+
+ ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
+
+ return 0;
+ }
+
+
+ LRESULT CCommentView::OnClickUserName(UINT uMsg,WPARAM wParam,LPARAM lParam){
+
- SelectObject(cdc,AtlGetDefaultGuiFont());
- cdc.DrawTextW(chat,-1,&drowSize, DT_CALCRECT | DT_WORDBREAK);
- drowSize.top -= 2;
- drowSize.left -= 2;
- drowSize.right += 2;
- drowSize.bottom += 2;
+ ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
+
+ return 0;
+ }
+
+ LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
+
+ return TRUE;
+ }
+
+
+ VOID CCommentView::OnDestroy(){
+ m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
+ INT_PTR headerItemcount = m_header.GetItemCount();
+ RECT headerItemRect;
+ for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
+
+ m_header.GetItemRect(itemindex,&headerItemRect);
+ viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
+ }
+ commentlist.OnDestroy();
+ m_header.DestroyWindow();
+ m_commentListWindow.DestroyWindow();
+ return;
+
+ }
+
+ LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
+
+ if(lParam->hwndFrom == m_header.m_hWnd){
+
+ LPNMHEADER pNMHeader = (LPNMHEADER) lParam;
+ this->m_header.SetItem(pNMHeader->iItem,pNMHeader->pitem);
+
+ m_commentListWindow.Invalidate();
+ this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+
+
+ }
+
+ return 0;
+ }
+
+ VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
+
+
+ INT_PTR dy;
+ SCROLLINFO hScrollInfo = {0};
+ hScrollInfo.cbSize = sizeof(hScrollInfo);
+ hScrollInfo.fMask = SIF_ALL;
+ this->GetScrollInfo(SB_HORZ,&hScrollInfo);
+ switch(loWParam){
+
+ case SB_THUMBPOSITION:
+ case SB_THUMBTRACK:
+ dy = hiWParam - hScrollInfo.nPos;
+ break;
+
+ case SB_LINELEFT:
+ case SB_PAGELEFT:
+
+ dy = -1 * hScrollInfo.nPage;
+
+ break;
+
+ case SB_LINERIGHT:
+ case SB_PAGERIGHT:
+
+ dy = hScrollInfo.nPage + hScrollInfo.nPos > (UINT_PTR)hScrollInfo.nMax ? 0 :(UINT_PTR) (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) < hScrollInfo.nPage ? (hScrollInfo.nMax - ( hScrollInfo.nPage + hScrollInfo.nPos)) : hScrollInfo.nPage;
+
+ break;
+
+ default:
+ dy = 0;
+ break;
+
+ }
+
+ dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
+
+
+ if(dy != 0){
+ hScrollInfo.nPos += dy;
+ INT_PTR moveRange = -(hScrollInfo.nPos);
+
+ HDWP hDwp = BeginDeferWindowPos(2);
+
+ m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
+ m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);
+
+ EndDeferWindowPos(hDwp);
+
+
+ this->SetScrollInfo(SB_HORZ,&hScrollInfo);
+ }
+
+ return;
+ }
+
+
+ VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
+
+ INT_PTR dy;
+ SCROLLINFO vScrollInfo = {0};
+ vScrollInfo.fMask = SIF_ALL;
+
+
+ this->GetScrollInfo(SB_VERT,&vScrollInfo);
+
+ switch(loWParam){
+
+
+ case SB_THUMBPOSITION:
+ case SB_THUMBTRACK:
+
+ dy = hiWParam - vScrollInfo.nPos;
+
+ break;
+
+ case SB_LINEUP:
+
+ dy = -1;
+ break;
+
+ case SB_LINEDOWN:
+
+ dy = 1;
+
+ break;
+
+ case SB_PAGEUP:
+
+ dy = -1 * vScrollInfo.nPage;
+
+ break;
+
+ case SB_PAGEDOWN:
+
+ dy = vScrollInfo.nPage;
+
+ break;
+
+
+ case SB_TOP:
+
+ dy = -vScrollInfo.nPos;
+
+ break;
+
+ case SB_BOTTOM:
+
+ dy = vScrollInfo.nMax;
+
+ break;
+
+ default:
+
+ dy = 0;
+
+ break;
+
+ }
+
+
+
+
+ if(dy != 0){
+
+ vScrollInfo.nPos += dy;
+ // viewStartHeight = vScrollInfo.nPos;
+ this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
+ this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
+ //this->SetScrollInfo(SB_VERT,&vScrollInfo);
+ this->UpdateWindow();
+
+ m_commentListWindow.Invalidate();
+ this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+ }
+
+
+
+ return;
+ }
+
+ LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
+ m_header.Create(m_hWnd,0,WC_HEADER,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | HDS_BUTTONS | HDS_HOTTRACK |HDS_DRAGDROP | HDS_FULLDRAG ,0,commentViewConstant::HEADER_ID);
+ m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN , 0,commentViewConstant::LISTWINDOW);
+
+
+
+ return 0;
+ }
+
+ VOID CCommentView::AddHeader(LPHEADERSINFO infos){
+
+
+ m_header.SetFont(hHeaderFontNew);
+
+ HDITEM item;
+ item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
+ item.fmt = HDF_CENTER | HDF_STRING;
+
- listBox.SetItemHeight(listBox.GetCount() -1,drowSize.bottom - drowSize.top);
+ for(UINT_PTR index = 0;index < infos->count ;++index){
- return;
-}
+ item.pszText = infos->columns[index];
+ item.cxy = infos->holizensize[index];
+ m_header.AddItem(&item);
+ }
-VOID CCommentView::OnHeaderTrack(){
+ RECT itemRect;
+ INT_PTR nMax = 0;
+ UINT_PTR itemCount = m_header.GetItemCount();
+ for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
- Lock();
- INT_PTR curSel = listBox.GetCurSel();
- listBox.ShowWindow(SW_HIDE);
+ m_header.GetItemRect(u_index,&itemRect);
+ nMax += itemRect.right - itemRect.left;
- UINT_PTR commentCount = commentlist.Size();
- listBox.ResetContent();
- for(UINT_PTR index =0;index < commentCount;index++){
- listBox.AddString(NULL);
- CommentLineSet(commentlist.GetChatAt(index).chatBuf.c_str(),index);
+ }
+ this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
+
+ DecisionHorzSize();
+ return;
}
+ VOID CCommentView::DecisionHorzSize(){
+
+ HDWP hWindowPosInfo = BeginDeferWindowPos(2);
+ RECT bkWindowRect;
+ this->GetClientRect(&bkWindowRect);
+ m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
+ m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
+ EndDeferWindowPos(hWindowPosInfo);
- listBox.ShowWindow(SW_SHOW);
+ return;
+ }
- listBox.SetCurSel(curSel);
- Unlock();
-}
-VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR count){
-
+ //
+ //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\93à\95\94\83\8a\83X\83g\83N\83\89\83X
+ ////////////////////////////////////////////////////////////////////
+
+ CCommentListWindow::CCommentListWindow(CCommentView &in_self):
+ self(in_self),
+ viewSellHeight(0)
+ {
+ CFontHandle font = ::AtlGetDefaultGuiFont();
+ LOGFONT logfont;
+ font.GetLogFont(&logfont);
+ logfont.lfUnderline = TRUE;
+
+ linkFont.CreateFontIndirect(&logfont);
+ }
+
+ CCommentListWindow::~CCommentListWindow(){
+ }
- Lock();
- commentlist.OnChatReceve(chat,count);
- listBox.AddString(NULL);
- Unlock();
- CommentLineSet(chat->chatBuf,count);
+ VOID CCommentListWindow::OnSetProperty(){
+
+ if(IsWindow() == TRUE)this->SetRedraw(FALSE);
+
+ if(collLinePen.IsNull() == FALSE)collLinePen.DeleteObject();
+ if(normalSellLinePen.IsNull() == FALSE)normalSellLinePen.DeleteObject();
+ if(normalBkBrush.IsNull() == FALSE)normalBkBrush.DeleteObject();
+ if(selectSellLinePen.IsNull() ==FALSE)selectSellLinePen.DeleteObject();
+ if(selectBkBrush.IsNull() == FALSE)selectBkBrush.DeleteObject();
+
+ collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
+ normalSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.normalSellLineColor);
+ normalBkBrush.CreateSolidBrush(self.viewproperty.backColor);
+ selectSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.selectSellLineColor);
+ selectBkBrush.CreateSolidBrush(self.viewproperty.selectBackColor);
+
+
+ if(IsWindow() == TRUE)this->SetRedraw(TRUE);
+ }
+
+
+ VOID CCommentListWindow::OnPaint(HDC in_hdc){
+
+ this->self.refAuth.GetUserSession();
+ RECT windowRect;
+ RECT listRect = {0};
+ RECT clientRect;
+
+ self.GetClientRect(&clientRect);
+ clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
+
+ this->GetWindowRect(&windowRect);
+ windowRect.right -= windowRect.left;
+ windowRect.bottom -= windowRect.top;
+ windowRect.left = 0;
+ windowRect.top = 0;
+
+
+ CPaintDC pdc(*this);
+
+ {
+ CMemoryDC mdc(pdc,windowRect);
+ mdc.SelectFont(AtlGetDefaultGuiFont());
+
+
+ CCommentList &commentList = self.commentlist;
+
+ BOOL selectFlag = FALSE;
+ CCommentList::iterator selectData;
+ RECT selectRect = {0};
-}
-VOID CCommentView::OnChatReceveSettle(UINT_PTR commentCount,UINT_PTR commentCountSum){
+ if(commentList.Size() > 0){
+
+ listRect = windowRect;
+ listRect.right = self.GetColumnHolSizeSum();
+
+ CCommentList::iterator chatData = commentList.GetShortCut();
+
+
+
+
+ mdc.FillRect(&listRect,this->normalBkBrush);
+
+ CCommentList::iterator endData = commentList.end();
+ listRect.bottom = 0;
+
+ RECT headerRects[COMMENTVIEW_HEADERITEMSIZE];
+ RECT colLineRects[COMMENTVIEW_HEADERITEMSIZE];
+ RECT selectHeaderRects[COMMENTVIEW_HEADERITEMSIZE];
+
+ self.m_header.GetItemRect(CCommentView::NO,&headerRects[CCommentView::NO]);
+ self.m_header.GetItemRect(CCommentView::USERNAME,&headerRects[CCommentView::USERNAME]);
+ self.m_header.GetItemRect(CCommentView::COMMENT,&headerRects[CCommentView::COMMENT]);
+ self.m_header.GetItemRect(CCommentView::TIME,&headerRects[CCommentView::TIME]);
+ self.m_header.GetItemRect(CCommentView::INFO,&headerRects[CCommentView::INFO]);
+
+ memcpy(colLineRects,headerRects,sizeof(headerRects));
+
+
+
+
+
+ headerRects[CCommentView::NO].left += SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].left += SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].left += SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].left += SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].left += SELL_SPACE_LENGTH;
+
+ headerRects[CCommentView::NO].right -= SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].right -= SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].right -= SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].right -= SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].right -= SELL_SPACE_LENGTH;
+
+ headerRects[CCommentView::NO].top = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].top = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].top = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].top = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].top = SELL_SPACE_LENGTH;
+
+ headerRects[CCommentView::NO].bottom = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].bottom = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].bottom = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].bottom = SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].bottom = SELL_SPACE_LENGTH;
+
+ INT_PTR listRectTop = listRect.top;
+ for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
+ CalcItemHeight(*chatData);
+
+// dumpln(TEXT("height:%d"),chatData->viewData.height);
+ listRect.bottom += chatData->viewData.height;
+
+ headerRects[CCommentView::NO].top = listRect.top + SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].top = listRect.top + SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].top = listRect.top + SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].top = listRect.top + SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].top = listRect.top + SELL_SPACE_LENGTH;
+
+ headerRects[CCommentView::NO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
+ headerRects[CCommentView::USERNAME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
+ headerRects[CCommentView::COMMENT].bottom = listRect.bottom - SELL_SPACE_LENGTH;
+ headerRects[CCommentView::TIME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
+ headerRects[CCommentView::INFO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
+
+ if(chatData->viewData.selectFlag == TRUE){
+ selectFlag = TRUE;
+ selectData = chatData;
+ selectRect = listRect;
+ memcpy(selectHeaderRects,headerRects,sizeof(headerRects));
+ } else {
- return;
-}
+
-VOID CCommentView::OnDrawList(LPDRAWITEMSTRUCT lpDrawItemStruct){
+ this->DrawItem(mdc,listRect,headerRects,*chatData);
+ }
- RECT noViewRect;
- RECT userNameViewRect;
- RECT timeViewRect;
- RECT chatViewRect;
- RECT infoViewRect;
+ listRect.top = listRect.bottom;
+ }
+ viewSellHeight = listRect.bottom;
- CChatData &chatData = commentlist.GetChatAt(lpDrawItemStruct->itemID);
- time_t chatTime = (time_t)difftime(chatData.date,streamStatus.start_time);
- tm ct = *gmtime(&chatTime);
+ if(selectFlag == TRUE){
+ this->DrawItem(mdc,selectRect,selectHeaderRects,*selectData);
+ }
+
+ //\8d\80\96Ú\82Ì\8fc\90ü\82ð\95`\89æ
+ mdc.SelectPen(collLinePen);
+ mdc.MoveTo(colLineRects[CCommentView::NO].right,listRectTop);
+ mdc.LineTo(colLineRects[CCommentView::NO].right,listRect.bottom);
+ mdc.MoveTo(colLineRects[CCommentView::USERNAME].right,listRectTop);
+ mdc.LineTo(colLineRects[CCommentView::USERNAME].right,listRect.bottom);
+ mdc.MoveTo(colLineRects[CCommentView::COMMENT].right,listRectTop);
+ mdc.LineTo(colLineRects[CCommentView::COMMENT].right,listRect.bottom);
+ mdc.MoveTo(colLineRects[CCommentView::TIME].right,listRectTop);
+ mdc.LineTo(colLineRects[CCommentView::TIME].right,listRect.bottom);
+ mdc.MoveTo(colLineRects[CCommentView::INFO].right,listRectTop);
+ mdc.LineTo(colLineRects[CCommentView::INFO].right,listRect.bottom);
+
+ }
+ windowRect.left = listRect.right;
+ mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
+
+
+
+
+ }
+
- TCHAR noString[sizeof(chatData.no) * 8];
- TCHAR dateString[LENGTH_16];
- _stprintf(noString,TEXT("%u"),chatData.no);
- _tcsftime(dateString,ARRAY_LENGTH(dateString),ct.tm_hour != 0 ? TEXT("%H:%M:%S") : TEXT("%M:%S"),&ct);
+ return;
+ }
+
+
+ LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
+
+
+
+ self.chatChildCtrlsList.ShowCntrls();
-
-
- //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
- if ((lpDrawItemStruct->itemState) & (ODS_SELECTED))
- {
- SelectObject(lpDrawItemStruct->hDC,bkBurushSelect);
- SelectObject(lpDrawItemStruct->hDC,outLinePenSelect);
- SetBkColor(lpDrawItemStruct->hDC,RGB(255,240,240)) ;
+
+ return 0;
}
- else
- {
- SelectObject(lpDrawItemStruct->hDC,bkBurushNomal);
+
+ VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
+
+
+ SCROLLINFO vScrollInfo = {0};
+ vScrollInfo.fMask = SIF_ALL;
+
+
+ self.GetScrollInfo(SB_VERT,&vScrollInfo);
+ BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
+ vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
+
+ vScrollInfo.fMask = SIF_PAGE;
+ self.SetScrollInfo(SB_VERT,&vScrollInfo);
+
+
+
+ if(scrollFlag == TRUE){
+ self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
+ }
+
+ this->Invalidate();
+ this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+
+ return;
+ }
+
+
+ UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
+
+ RECT clientRect;
+ INT_PTR rslt = 0;
+ LONG height = 0;
+ this->GetClientRect(&clientRect);
+
+ SCROLLINFO vScrollInfo = {0};
+ if(self.commentlist.empty() != TRUE){
+
+ CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
+ CCommentList::reverse_iterator rend = self.commentlist.rend();
+ for(;rbegin != rend;++rbegin){
+ CalcItemHeight(*rbegin);
+ height += rbegin->viewData.height;
+ rslt++;
+ if(height > clientRect.bottom)goto overclientrect;
+
+ }
+ }
+ /*
+ vScrollInfo.fMask = SIF_RANGE;
+ self.GetScrollInfo(SB_VERT,&vScrollInfo);
+ */
+ rslt = nMax+ 1;
+
+
+overclientrect:
+
+ return rslt;
+ }
+
+ VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,const RECT *headerRect,CChatData &chatData){
+
+
+ RECT noViewRect = headerRect[CCommentView::NO]; //\83R\83\81\94Ô\95\\8e¦\97Ì\88æ
+ RECT userNameViewRect = headerRect[CCommentView::USERNAME]; //\83\86\81[\83U\96¼\95\\8e¦\97Ì\88æ
+ RECT chatViewRect = headerRect[CCommentView::COMMENT]; //\83R\83\81\83\93\83g\95\\8e¦\97Ì\88æ
+ RECT timeViewRect = headerRect[CCommentView::TIME]; //\8e\9e\8aÔ\95\\8e¦\97Ì\88æ
+ RECT infoViewRect = headerRect[CCommentView::INFO]; //\83R\83\81\83\93\83g\8fî\95ñ\95\\8e¦\97Ì\88æ
+
+
+ //
+ //\83R\83\81\83\93\83g\8e\9e\8aÔ\95\\8e¦\97p\95¶\8e\9a\97ñ\8dì\90¬
+ //
+ time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
+
+
+ BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
+ TCHAR noString[sizeof(chatData.no) * 8];
+ TCHAR dateString[LENGTH_16];
+ if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
+ else _tcscpy(noString,TEXT(""));
+ CNLiteString timeFormat;
+
+
+ if(beforeStartFlag == TRUE){
+
+ timeFormat = TEXT("-");
+ chatTime = -chatTime;
+ }
+ tm ct = *gmtime(&chatTime);
+ if(ct.tm_hour != 0 ){
+
+ timeFormat += TEXT("%H:%M:%S");
+
+ } else {
+
+ timeFormat += TEXT("%M:%S");
+ }
+
+ _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
+
+
+ COLORREF bkColor; //\94w\8ci\90F
+ CPen originSellLinePen; //\98g\90ü\95`\89æ\97p\83y\83\93
+ CBrush originBkBrush; //\94w\8ci\95`\89æ\97p\83u\83\89\83V
+
+ //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
+ if (chatData.viewData.selectFlag == TRUE)
+ {
+ bkColor = self.viewproperty.selectBackColor;
+
+ dc.SelectBrush(this->selectBkBrush);
+ dc.SelectPen(this->selectSellLinePen);
+ }
+ else
+ {
+
+ if(chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR){
+ dc.SelectPen(this->normalSellLinePen);
+
+ } else {
+
+ originSellLinePen.CreatePen(PS_SOLID,1,chatData.viewData.sellLineColor);
+ dc.SelectPen(originSellLinePen);
+ }
+
+
+
+ if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR || chatData.listenerData->bgcolor != ListenerData::INIT_COLOR){
+
+ if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
+ bkColor = chatData.viewData.backColor;
+ originBkBrush.CreateSolidBrush(chatData.viewData.backColor);
+
+ }else if(chatData.listenerData->bgcolor != ListenerData::INIT_COLOR){
+
+ bkColor = chatData.listenerData->bgcolor;
+ originBkBrush.CreateSolidBrush(chatData.listenerData->bgcolor);
+
+ }
+
+ dc.SelectBrush(originBkBrush);
+ } else {
+
+ bkColor = self.viewproperty.backColor;
+ dc.SelectBrush(this->normalBkBrush);
+ dc.SelectBrush(this->normalBkBrush);
+
+
+ }
+ }
+
+ //\94w\8ci\82Æ\98g\90ü\82ð\95`\89æ
+
+
+ dc.Rectangle(rc.left,rc.top - 1,rc.right ,rc.bottom + 1);
+ dc.SetBkColor(bkColor);
+
+
+ //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
+
+
+
+
+ CComBSTR &viewUserName = chatData.listenerData->name.Length() == 0 ? chatData.listenerData->user_id : chatData.listenerData->name;
+ dc.SelectFont(linkFont);
+ dc.SetTextColor(chatData.listenerData->nameColor != ListenerData::INIT_COLOR ? chatData.listenerData->nameColor : self.viewproperty.linkStringColor);
+ //\83e\83L\83X\83g\95`\89æ
+ dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
+
+
+ dc.DrawTextW(viewUserName,viewUserName.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
+ dc.SelectFont(::AtlGetDefaultGuiFont());
+ dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
+ dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
+
+ return;
+ }
+
+ VOID CCommentListWindow::ResetViewSellHeight(){
+
+ viewSellHeight = 0;
+
+ return;
+ }
+
+
+ VOID CCommentListWindow::ShowCurSel(){
+
+ auto end = self.commentlist.end();
+ INT_PTR cursel = self.commentlist.GetCurSelNo();
+ if(cursel == -1)goto end;
+
+ SCROLLINFO vScrollInfo;
+ vScrollInfo.cbSize = sizeof(vScrollInfo);
+ vScrollInfo.fMask = SIF_ALL;
+ self.GetScrollInfo(SB_VERT,&vScrollInfo);
+
+ if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
+ self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
+ self.commentlist.SetShortCut(self.GetScrollPos(SB_VERT));
+ }
+
+ this->Invalidate();
+
+ this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+end:
+
+ return;
+ }
+
+
+
+ VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
+
+ if(chatData.viewData.height == 0){
+ RECT drowSize;
+ self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
+
+ drowSize.bottom = 0;
+
+ CChatReadEdit cedit(self);
+
+ cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
+ cedit.Reset();
+ cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
+ cedit.SetWindowText(chatData);
+ cedit.GetClientRect(&drowSize);
+ cedit.DestroyWindow();
+ drowSize.bottom += 12;
+ if(drowSize.bottom - drowSize.top > 120)drowSize.bottom = drowSize.top + 120;
+ chatData.viewData.height = drowSize.bottom - drowSize.top;
+ }
+
+ return ;
+ }
+
+
+
+ LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
+
+ //CComPtr<IUnknown> iu;
+ //::AtlAxCreateControlEx(TEXT("MSHTML:<HTML><BODY></BODY></HTML>"),*this,(IStream*)NULL,(IUnknown**)NULL,&iu,GUID_NULL);
+
+ //iu->QueryInterface(DIID_DWebBrowserEvents2,&addToMyListWindow);
+ RECT rc = {0,0,300,200};
+// addToMyListWindow.Create(m_hWnd, &rc,_T("Shell.Explorer.2"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN , 0);
+
+ return 0;
+ }
+
+ CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
+
+ INT_PTR heightSum = 0;
+
+ CCommentList::iterator chatData = self.commentlist.GetShortCut();
+ CCommentList::iterator end = self.commentlist.end();
+
+
+
+ for(; chatData != end ;(++chatData)){
+ CalcItemHeight(*chatData);
+ heightSum += chatData->viewData.height;
+
- SelectObject(lpDrawItemStruct->hDC,outLinePenNomal);
- //\83e\83L\83X\83g\82Ì\94w\8ci\90F\82ð\8ew\92è
- SetBkColor(lpDrawItemStruct->hDC,viewproperty.backColor) ;
+ if(heightSum >= height)break;
+ }
+
+
+
+
+ return chatData;
}
+
+
+ BOOL CCommentListWindow::IsOnNoOrUserName(UINT_PTR index,const POINT &point){
+
+ RECT rc = {0};
-
- //\83e\83L\83X\83g\82Ì\83J\83\89\81[\82ð\90Ý\92è
- SetTextColor(lpDrawItemStruct->hDC,viewproperty.baseStringColor);
+ self.m_header.GetItemRect(index,&rc);
+ BOOL rslt = FALSE;
+
+ if((point.x >= rc.left && point.x <= rc.right) && (point.y < static_cast<INT_PTR>(viewSellHeight))){
+
+ INT_PTR heightsum = 0;
+ auto clickData = self.commentlist.GetShortCut();
+ auto endData = self.commentlist.end();
+ for(;clickData != endData;++clickData){
+
+ heightsum += clickData->viewData.height;
+
+ if(heightsum > point.y){
+
+ CDC cdc = this->GetDC();
+
+ rc.top = heightsum -= clickData->viewData.height;
+ RECT calcRect = {0};
+ cdc.SelectFont(linkFont);
+
+
+ if(index == CCommentView::USERNAME){
+ LPCTSTR viewStr = clickData->listenerData->name.Length() == 0 ? clickData->listenerData->user_id : clickData->listenerData->name;
+ cdc.DrawTextW(viewStr ,_tcslen(viewStr),&calcRect,DT_CALCRECT);
+
+ } else if(index == CCommentView::NO){
+ TCHAR viewStr[sizeof(UINT_PTR) * 8];
+ _stprintf(viewStr,TEXT("%d"),clickData->no);
+ cdc.DrawTextW(viewStr,_tcslen(viewStr),&calcRect,DT_CALCRECT);
+
+ }
+ rc.bottom = rc.top + calcRect.bottom - calcRect.top;
+ rc.right = rc.right > rc.left + calcRect.right - calcRect.left ? rc.left + calcRect.right - calcRect.left : rc.right;
+ rslt = (point.y >= rc.top && point.y <= rc.bottom && point.x >= rc.left && point.x <= rc.right);
+
+ break;
+
+ }
+ }
+
+ }
-
-
- Rectangle(lpDrawItemStruct->hDC,lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top,lpDrawItemStruct->rcItem.right,lpDrawItemStruct->rcItem.bottom);
+ return rslt;
+ }
+ VOID CCommentListWindow::OnDestroy(){
+// this->addToMyListWindow.DestroyWindow();
+ }
+ VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
- //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
- header.GetItemRect(NO,&noViewRect);
- header.GetItemRect(USERNAME,&userNameViewRect);
- header.GetItemRect(COMMENT,&chatViewRect);
- header.GetItemRect(TIME,&timeViewRect);
- header.GetItemRect(INFO,&infoViewRect);
- SelectObject(lpDrawItemStruct->hDC,colLinePen);
-
- MoveToEx(lpDrawItemStruct->hDC,noViewRect.right,lpDrawItemStruct->rcItem.top,NULL);
- LineTo(lpDrawItemStruct->hDC,noViewRect.right,lpDrawItemStruct->rcItem.bottom);
- MoveToEx(lpDrawItemStruct->hDC,userNameViewRect.right,lpDrawItemStruct->rcItem.top,NULL);
- LineTo(lpDrawItemStruct->hDC,userNameViewRect.right,lpDrawItemStruct->rcItem.bottom);
- MoveToEx(lpDrawItemStruct->hDC,chatViewRect.right,lpDrawItemStruct->rcItem.top,NULL);
- LineTo(lpDrawItemStruct->hDC,chatViewRect.right,lpDrawItemStruct->rcItem.bottom);
- MoveToEx(lpDrawItemStruct->hDC,timeViewRect.right,lpDrawItemStruct->rcItem.top,NULL);
- LineTo(lpDrawItemStruct->hDC,timeViewRect.right,lpDrawItemStruct->rcItem.bottom);
- MoveToEx(lpDrawItemStruct->hDC,infoViewRect.right,lpDrawItemStruct->rcItem.top,NULL);
- LineTo(lpDrawItemStruct->hDC,infoViewRect.right,lpDrawItemStruct->rcItem.bottom);
-
- noViewRect.left += 2;
- userNameViewRect.left += 2;
- timeViewRect.left += 2;
- chatViewRect.left += 2;
- infoViewRect.left += 2;
-
- noViewRect.right += 2;
- userNameViewRect.right += 2;
- timeViewRect.right += 2;
- chatViewRect.right += 2;
- infoViewRect.right += 2;
-
- noViewRect.top = lpDrawItemStruct->rcItem.top + 2;
- userNameViewRect.top = lpDrawItemStruct->rcItem.top + 2;
- timeViewRect.top = lpDrawItemStruct->rcItem.top + 2;
- chatViewRect.top = lpDrawItemStruct->rcItem.top + 2;
- infoViewRect.top = lpDrawItemStruct->rcItem.top + 2;
-
- noViewRect.bottom = lpDrawItemStruct->rcItem.bottom - 2;
- userNameViewRect.bottom = lpDrawItemStruct->rcItem.bottom - 2;
- timeViewRect.bottom = lpDrawItemStruct->rcItem.bottom - 2;
- chatViewRect.bottom = lpDrawItemStruct->rcItem.bottom - 2;
- infoViewRect.bottom = lpDrawItemStruct->rcItem.bottom - 2;
+ CCommentList::iterator ite;
+ this->SetFocus();
+ if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
+
+ if(self.commentlist.empty() == TRUE)goto end;
+
+ ite = CalcClickLine(point.y);
+ self.commentlist.SetCurSel(ite);
+
+ if(this->IsOnNoOrUserName(CCommentView::NO,point) == TRUE){
+ ::SendMessage(self,UM_CLICK_CHATNO,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
-
+ } else if(this->IsOnNoOrUserName(CCommentView::USERNAME,point) == TRUE){
- ::DrawText(lpDrawItemStruct->hDC,noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
+ ::SendMessage(self,UM_CLICK_USERNAME,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
+ }
- ::DrawText(lpDrawItemStruct->hDC,chatData.user_id.c_str(),chatData.user_id.length(),&userNameViewRect,DT_WORD_ELLIPSIS);
- ::DrawText(lpDrawItemStruct->hDC,chatData.chatBuf.c_str(),chatData.chatBuf.length(),&chatViewRect,DT_WORDBREAK);
+
- ::DrawText(lpDrawItemStruct->hDC,dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
+end:
+ this->Invalidate();
+ this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
- return;
-}
+ return;
+ }
+ VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
-VOID CCommentList::OnChatReceve(NicoLiveChat_P chatData_in, UINT_PTR count){
-
- CChatData chatData;
- chatData.SetChat(*chatData_in);
-
-
- chatList.push_back(chatData);
- return;
-}
+ if(!(point.x > (INT_PTR)self.GetColumnHolSizeSum() || self.commentlist.empty() == TRUE)){
+
+ auto end = self.commentlist.end();
+ auto lineIte = CalcClickLine(point.y);
+ if( lineIte == end)goto endlabel;
+
+
+ COLORREF bkColor;
+ if(lineIte->listenerData->bgcolor == ListenerData::INIT_COLOR){
+ CListenerColorCollector colorCollector;
+ listenerList.BkColorCollect(colorCollector);
+ UCHAR red;
+ UCHAR green;
+ UCHAR blue;
+
+ srand((unsigned int)time(NULL));
+ do{
+
+ red = getrgb();
+ green = getrgb();
+ blue = getrgb();
+ bkColor = PALETTERGB(red,green,blue);
+
+ }while(colorCollector.Find(bkColor));
+
+
+ lineIte->listenerData->SetBkColor(bkColor);
+ } else {
+
+
+ lineIte->listenerData->bgcolor = ListenerData::INIT_COLOR;
+ }
+ }
-VOID CChatData::SetChat(NicoLiveChat &chat_in){
-
-
- this->anonymity = _ttol(chat_in.anonymity);
- this->premium = _ttol(chat_in.premium);
- this->chatBuf = chat_in.chatBuf;
- this->no = _ttol(chat_in.no);
- if(_tcscmp(chat_in.locale,TEXT("jp")) == 0){
- this->locale = cuntry::jp;
- } else {
- this->locale = cuntry::unknown;
+
+endlabel:
+
+
+ this->Invalidate(TRUE);
+
+ this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
+ return;
}
- this->mail.reserve(chat_in.mailCount);
- for(UINT_PTR index = 0;index < chat_in.mailCount ;index++){
- this->mail.push_back(chat_in.mail[index]);
+ LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
+
+ return TRUE;
}
- this->name = chat_in.name;
-
- this->user_id = chat_in.user_id;
+ VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
+
+ INT_PTR dy = 0;
+ switch(vKey){
+
+ case VK_DOWN:
+ case VK_RETURN:
+ dy = 1;
+
+ break;
+ case VK_UP:
+
+ dy = -1;
+ break;
+ default:
+ break;
+
+
+ }
+
+
+
+
+ auto cursel = self.commentlist.GetCurSel();
+ if((dy < 0 && cursel == self.commentlist.begin()) || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
+
+
+ std::advance(cursel,dy);
+ self.commentlist.SetCurSel(cursel);
+
+ this->ShowCurSel();
+end:
+
+
+ return;
+ }
+
+ LRESULT CCommentListWindow::OnSetCursor(HWND wparam,UINT loLparam,UINT hiLparam){
+
+
+ POINT mousePoint = {0};
+ GetCursorPos(&mousePoint);
+ ::ScreenToClient(*this,&mousePoint);
+
+ if(( IsOnNoOrUserName(CCommentView::NO,mousePoint) || IsOnNoOrUserName(CCommentView::USERNAME,mousePoint))){
+
+
+ ::SetCursor(::LoadCursorW(NULL,IDC_HAND));
+
+ } else {
+ DefWindowProc ();
+
+ }
+
+
+
- this->vpos = _ttol(chat_in.vpos);
- this->thread = _ttol(chat_in.thread);
- this->date = _ttol(chat_in.date);
+
+ return FALSE;
+ }
+
+ LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
+
+
+ self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
+
+
+ return 0;
+ }
+
- return;
-}
+ LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
+
+ LRESULT rslt = 0;
+
+ switch(lParam->code){
+
+ case EN_LINK:
+ {
+ ENLINK *lpenlk = (ENLINK *)lParam;
+ if (lpenlk->msg == WM_LBUTTONDOWN) {
+ CRichEditCtrl chatReadEdit = lpenlk->nmhdr.hwndFrom;
+ chatReadEdit.SetSel(lpenlk->chrg);
+ CString selTextBuf;
+ chatReadEdit.GetSelText(selTextBuf);
+ if(regex_match((LPCTSTR)selTextBuf,nliteregex::URL) == TRUE){
+
+
+
+
+ } else if(regex_match((LPCTSTR)selTextBuf,nliteregex::VIDEOID) == TRUE){
+
+ selTextBuf.Insert(0,ADDMYLIST_PART);
+
+ } else if( regex_match((LPCTSTR)selTextBuf,nliteregex::LIVEID) == TRUE){
+
+ selTextBuf.Insert(0,LIVEURL_PART);
+
+ }
+
+ OpenURL(*this,self.generalProperty,selTextBuf,SW_SHOWNORMAL);
+ }
+ }
+ break;
+
+ case EN_MSGFILTER:
+ {
+ auto pmf = (MSGFILTER *)lParam;
+ if (pmf->msg == WM_LBUTTONDOWN || pmf->msg== WM_LBUTTONDBLCLK || pmf->msg == WM_MOUSEWHEEL){
+
+ RECT windowrect;
+ ::GetWindowRect(pmf->nmhdr.hwndFrom,&windowrect);
+ _WTYPES_NS::CPoint point(windowrect.left + LOWORD(pmf->lParam),windowrect.top + HIWORD(pmf->lParam));
+ ::ScreenToClient(*this,&point);
+ switch(pmf->msg){
+ case WM_LBUTTONDOWN:
+ OnLButtonDown(pmf->wParam,point);
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ OnLButtonDblClk(pmf->wParam,point);
+ break;
+
+ case WM_MOUSEWHEEL:
+ OnMouseWheel(LOWORD(pmf->wParam),HIWORD(pmf->wParam),point);
+ break;
+
+ default:
+
+ break;
+ }
+
+ }
+
+
+
+
+ }
+ break;
+
+
+ default:
+
+ break;
+
+ }
+
+
+ return rslt;
+ }
+
+ LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
+
+ auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
+ ::SetWindowPos(pReqResize->nmhdr.hwndFrom,NULL,0,0,pReqResize->rc.right - pReqResize->rc.left,pReqResize->rc.bottom - pReqResize->rc.top,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW);
+ return 0;
+ }
+}
\ No newline at end of file