OSDN Git Service

a6a1014396ca6d3ab20ba179096a25436bd7b3ee
[nlite/nlite.git] / nlite / nlite_commentview.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3 using namespace std::tr1;
4
5 namespace nlite{
6
7         static const LPCTSTR LIVEURL_PART = TEXT("http://live.nicovideo.jp/watch/");
8         static const LPCTSTR ADDMYLIST_PART = TEXT("http://www.nicovideo.jp/mylist_add/video/");
9
10         static const UINT_PTR SELL_SPACE_LENGTH = 1;
11         //
12         //\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
13         ///////////////////////////////////////////////////////////////////
14
15         CChatReadEdit::CChatReadEdit(CCommentView &m_master):m_master(m_master){
16
17
18         }
19
20         BOOL CChatReadEdit::SetWindowText(const CChatData &chat){
21
22                 BOOL rslt = FALSE;
23                 try{
24                         
25                         tstring viewString(regex_replace(tstring(chat.chatBuf),nliteregex::TAGSTRING,nliteregex::NUTHINGSTRING));
26                         rslt = __super::SetWindowText(viewString.c_str());
27
28                         CHARFORMAT2 defaultFormat;
29                         this->GetDefaultCharFormat(defaultFormat);
30                         defaultFormat.dwMask |=  CFM_COLOR;
31                         if(chat.premium == 2 || chat.premium == 3){
32
33                                 defaultFormat.crTextColor = m_master.viewproperty.ownerStringColor;
34                         }
35                         
36                         else {
37
38                                 defaultFormat.crTextColor = m_master.viewproperty.baseStringColor;
39
40                         }
41
42                         BOOL rslt = this->SetDefaultCharFormat(defaultFormat);
43                         
44
45
46                         linkStringBeside(viewString,nliteregex::LILNKREGEX);
47                         
48                         
49
50                 } catch(std::exception &e){
51                         e;
52                         rslt =  FALSE;
53
54                 }
55
56                 return rslt;
57                 
58         }
59
60         VOID CChatReadEdit::linkStringBeside(const tstring &target,const nliteregex::tregex &re){
61
62                 match_results<tstring::const_iterator> regexRslt;
63                 tstring::const_iterator beginStr = target.begin();
64                 tstring::const_iterator endstr = target.end();
65                 CHARFORMAT2 cf;
66                 cf.cbSize = sizeof(cf);
67                 cf.dwMask = CFM_LINK;
68                 cf.dwEffects = CFE_LINK;
69                 INT_PTR basePosition = 0;
70                 while(regex_search(beginStr,endstr,regexRslt,re)){
71                         basePosition += regexRslt.position(0);
72                         this->SetSel(basePosition,basePosition + regexRslt.length());
73                         this->SetCharFormat(cf,SCF_SELECTION);
74                         basePosition += regexRslt.length();
75                                 
76                         beginStr = regexRslt[0].second;
77                 }
78
79         }
80
81         VOID CChatReadEdit::Reset(){
82
83                 __super::SetWindowText(TEXT(""));
84
85                 return;
86         }
87
88         HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
89
90
91                 this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE   | ES_READONLY,0,id);
92                 
93                 DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
94                 dwLangOptons &= ~IMF_DUALFONT;
95                 this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
96
97                 
98                 CFont defFont = ::AtlGetDefaultGuiFont();
99                 LOGFONT deflogFont;
100                 defFont.GetLogFont(&deflogFont);
101                 CHARFORMAT2 m_defCharFormat;
102                 this->GetDefaultCharFormat(m_defCharFormat);
103                 CDC cDC = this->GetDC();
104                 int picy = cDC.GetDeviceCaps(LOGPIXELSY);
105                 this->ReleaseDC(cDC.m_hDC);
106                 int point = -MulDiv(deflogFont.lfHeight,72,picy);
107                 int twips = point * 20;
108                 m_defCharFormat.yHeight = twips;
109                 m_defCharFormat.dwEffects ^= CFE_AUTOCOLOR;
110                 _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
111                 this->SetEventMask(eventMask);
112                 
113         this->SetDefaultCharFormat(m_defCharFormat);
114
115
116                 return *this;
117
118         }
119
120         CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
121         m_master(hMaster),
122         chatDispCtrl(hMaster)
123         {
124                 
125                 return;
126         }
127
128         
129
130         VOID CChatChildCtrls::Create(){
131
132                 this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK  | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
133
134         }
135
136         VOID CChatChildCtrls::AdjustRect(RECT &rc){
137
138                 rc.left += SELL_SPACE_LENGTH;
139                 rc.top += SELL_SPACE_LENGTH;
140                 rc.right -= SELL_SPACE_LENGTH;
141                 rc.bottom -= SELL_SPACE_LENGTH;
142
143                 return;
144         }
145
146         VOID CChatChildCtrls::Hide(HDWP hdwp){
147
148                 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
149
150         }
151         
152         VOID CChatChildCtrls::SetCtrl(HDWP hdwp,const RECT  &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
153
154                 
155                 chatDispCtrl.SetWindowText(comment);
156                 RECT chatRect = rc;
157                 
158                 
159                 AdjustRect(chatRect);
160
161                 COLORREF bkColor;
162
163                 if (comment.viewData.selectFlag == TRUE)
164                 {
165                         bkColor = m_master.viewproperty.selectBackColor;
166
167                 }
168                 else  
169                 {
170
171
172                         if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
173                         
174                                 bkColor = comment.viewData.backColor;
175
176                         }else if(comment.listenerData->originBkFlag == TRUE){
177
178                                 bkColor = comment.listenerData->bkColor;
179
180
181                         } else {
182
183                                 bkColor = m_master.viewproperty.backColor;
184
185
186
187                         }
188                 }
189
190
191                 chatDispCtrl.SetBackgroundColor(bkColor);
192
193                 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
194
195                 return;
196         }
197
198         UINT_PTR CChatChildCtrls::GetCtrlCount(){
199
200                 return 1;
201         }
202
203
204
205         ///
206         ///\83R\83\93\83X\83g\83\89\83N\83^
207         ///
208         CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
209                 
210                 return;
211         }
212
213
214
215         ///
216         ///\83R\83\93\83g\83\8d\81[\83\8b\82ð\95\\8e¦
217         ///
218         VOID CChatChildCtrlsList::ShowCntrls(){
219
220
221                 
222
223                 
224
225                 if(m_hMaster.commentlist.Size() > 0){
226
227
228
229                         RECT headerRect;
230                         RECT tmpRect;
231                         RECT listRect;
232                         m_hMaster.m_commentListWindow.GetClientRect(&listRect);
233                         m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
234                         headerRect.top = 0;
235                         headerRect.bottom = 0;
236                         
237                         UINT_PTR counter = 0;
238                         INT_PTR heightSum =0;
239
240                         auto ctrlsBegin = m_list.begin();
241                         auto ctrlsEnd = m_list.end();
242                         auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
243                         auto chatDataEnd = m_hMaster.commentlist.end();
244                         auto chatDataTmp = chatDataBegin;
245                         for(;chatDataBegin != chatDataEnd && heightSum < listRect.bottom;++chatDataBegin){
246                                 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
247                                 counter++;
248                                 heightSum += chatDataBegin->viewData.height;
249                         } 
250
251                         
252                 
253                         chatDataBegin = chatDataTmp;
254                         heightSum = 0;
255                         HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * (counter > m_list.size() ? counter : m_list.size()));
256                         for(;  chatDataBegin != chatDataEnd && counter > 0 ;++ctrlsBegin,++chatDataBegin,--counter){
257                         
258                                 
259                                 tmpRect = headerRect;
260                                 tmpRect.top += heightSum;
261                                 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
262
263                                 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
264
265                                 ctrlsBegin->SetCtrl(hdwp,tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
266
267                                 heightSum = tmpRect.bottom;
268
269                                 
270                         }
271                 
272                         for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
273
274                                 ctrlsBegin->Hide(hdwp);
275                         }
276
277                         ::EndDeferWindowPos(hdwp);
278                 }
279                 
280
281
282                 return;
283         }
284
285
286
287         VOID CChatChildCtrlsList::AllHide(){
288
289                 auto begin =m_list.begin();
290                 auto end = m_list.end();
291
292                 HDWP hdwp = ::BeginDeferWindowPos(CChatChildCtrls::GetCtrlCount() * m_list.size());
293                 for(;begin != end;++begin){
294                         begin->Hide(hdwp);
295                 }
296                 ::EndDeferWindowPos(hdwp);
297
298         }
299
300         ///
301         ///\8ag\92£\8f\88\97\9d
302         ///
303         CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
304
305                 
306                 CChatChildCtrls ctrls(m_hMaster);
307                 
308                 m_list.push_back(ctrls);
309                 m_list.back().Create();
310                 auto ite = (--m_list.end());
311         
312                 return ite;
313         }
314
315
316         //
317         //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
318         ///////////////////////////////////////////////////////
319
320         CCommentView::CCommentView(CNicoLiveStream &stream,CNicoVideoAuth &in_refAuth):
321         m_commentListWindow(*this),
322         stream(stream),
323         refAuth(in_refAuth)
324         ,chatChildCtrlsList(*this)
325
326         {
327
328                 LOGFONT lf = {0};
329                 lf.lfHeight = 10;
330                 lf.lfCharSet = SHIFTJIS_CHARSET;
331
332
333                 hHeaderFontNew = CreateFontIndirect(&lf);
334
335
336                 return;
337
338         }
339
340         CCommentView::~CCommentView(){
341
342
343                 DeleteObject(hHeaderFontNew);
344
345                 return;
346         }
347
348
349
350
351         VOID CCommentView::OnConnect(){
352                 m_commentListWindow.SetRedraw(FALSE);
353                 m_commentListWindow.ResetViewSellHeight();
354
355                 chatChildCtrlsList.AllHide();
356
357
358                 commentlist.OnConnect();
359
360                 SCROLLINFO vScrollInfo = {0};
361                 vScrollInfo.cbSize = sizeof(vScrollInfo);
362                 vScrollInfo.fMask = SIF_ALL;
363
364                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
365
366                 m_commentListWindow.SetRedraw(TRUE);
367                 m_commentListWindow.Invalidate();
368
369
370
371         }
372
373
374         UINT_PTR CCommentView::GetColumnHolSizeSum(){
375
376                 INT_PTR nMin = 0;
377                 INT_PTR nMax = 0;
378                 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
379
380                 return nMax;
381         }
382
383         VOID CCommentView::SetProperty(const CommentViewProperty &setProperty,const GeneralProperty &in_generalProperty){
384
385                 
386                 viewproperty = setProperty;
387                 generalProperty = in_generalProperty;
388                 m_commentListWindow.OnSetProperty();
389                 
390                 return;
391         }
392
393         CommentViewProperty &CCommentView::GetProperty(){
394
395                 return viewproperty;
396
397         }
398
399
400
401
402
403         HWND CCommentView::Create(HWND hWndParent){
404
405
406
407                 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
408
409                 PAINTSTRUCT ps;
410                 HDC hdc = m_header.BeginPaint(&ps);
411                 SIZE size;
412
413                 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
414
415                 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ñ")};
416                 UINT_PTR holizenSize[] = {0,0,100,0,0};
417
418                 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
419
420                         GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
421                         UINT_PTR holsize = holizenSize[index] + size.cx + 15;
422                         holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
423                 }
424
425                 SelectObject(hdc,hOld);
426
427                 m_header.EndPaint(&ps);
428
429
430                 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
431
432                 AddHeader(&headersinfo);
433
434                 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
435
436                 
437                 
438
439                 return rslt;
440         }
441
442
443
444
445         LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
446
447
448                 if(lParam->hwndFrom == m_header.m_hWnd){
449
450
451                         auto begin = commentlist.begin();
452
453                         auto end = commentlist.end();
454
455                         for(;begin != end;++begin){
456
457                                 begin->viewData.height = 0;
458
459                         }
460
461                         m_commentListWindow.SetRedraw(FALSE);
462                         SCROLLINFO vScrollInfo = {0};
463                         vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
464
465                         this->GetScrollInfo(SB_VERT,&vScrollInfo);
466                         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
467                         vScrollInfo.fMask = SIF_PAGE;
468                         this->SetScrollInfo(SB_VERT,&vScrollInfo);
469
470                         BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
471                         UINT_PTR commentCount = commentlist.Size();
472                         LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
473
474                         m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
475
476
477
478
479
480
481
482                         if(scrollFlag == TRUE){
483
484                                 this->m_commentListWindow.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
485                         }
486
487                         INT_PTR itemCount = m_header.GetItemCount();
488                         RECT itemSizeRect;
489
490                         INT_PTR nMax = 0;
491                         for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
492                                 m_header.GetItemRect(itemIndex,&itemSizeRect);
493                                 nMax += itemSizeRect.right - itemSizeRect.left;
494
495                         }
496                         INT_PTR nMin = 0;
497                         this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
498                         DecisionHorzSize();
499
500
501                         
502
503                         m_commentListWindow.SetRedraw(TRUE);
504                         
505                         m_commentListWindow.Invalidate();
506                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
507
508                 }
509
510                 return 0;
511         }
512
513         VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
514
515
516                 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
517
518                 return;
519         }
520
521
522         VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
523
524
525                 SCROLLINFO vScrollInfo = {0};
526
527
528                 vScrollInfo.fMask = SIF_ALL;
529
530                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
531                 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
532
533                 vScrollInfo.cbSize = sizeof(vScrollInfo);
534                 vScrollInfo.nMax = commentCountSum;
535                 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
536                 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
537
538
539                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
540
541
542
543
544                 if(scrollFlag == TRUE){
545                         this->PostMessage(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
546                 }
547
548
549                 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)){
550                         m_commentListWindow.Invalidate();
551                         
552                         this->PostMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
553                 }
554
555                 return;
556         }
557
558         static UCHAR getrgb(){
559
560                 UCHAR rgb = 192 + rand() % 64;
561                 return rgb;
562         }
563
564
565
566
567
568
569
570
571
572
573
574         LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
575                 ChangeSize(lParam);
576
577                 return 0;
578         }
579
580
581         VOID CCommentView::ChangeSize(const SIZE& client){
582
583                 SCROLLINFO hScrollInfo = {0};
584                 hScrollInfo.cbSize = sizeof(hScrollInfo);
585                 hScrollInfo.fMask = SIF_PAGE;
586                 hScrollInfo.nPage = client.cx;
587
588                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
589                 hScrollInfo.fMask = SIF_ALL;
590                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
591
592
593                 HDWP hDwp = BeginDeferWindowPos(2);
594
595
596                 INT_PTR movePos =  -1 * hScrollInfo.nPos;
597
598                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
599                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
600
601                 EndDeferWindowPos(hDwp);
602
603
604                 RECT bkRect;
605                 RECT headerRectSize;
606                 m_header.GetWindowRect(&headerRectSize);
607                 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
608                 bkRect.top = 0;
609                 bkRect.right = client.cx ;
610                 bkRect.bottom = client.cy;
611
612
613                 return;
614         }
615
616
617
618         LRESULT CCommentView::OnClickChatNo(UINT uMsg,WPARAM wParam,LPARAM lParam){
619                 
620                 
621                 ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
622                 wincheck(GetLastError());
623                 return 0;
624         }
625                 
626
627         LRESULT CCommentView::OnClickUserName(UINT uMsg,WPARAM wParam,LPARAM lParam){
628
629
630                 ::SendMessage(::GetAncestor(*this,GA_ROOT),uMsg,wParam,lParam);
631
632                 return 0;
633         }
634
635         LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
636
637                 return TRUE;
638         }
639
640
641         VOID CCommentView::OnDestroy(){
642                 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOrderArray),viewproperty.headerOrderArray);
643                 INT_PTR headerItemcount = m_header.GetItemCount();
644                 RECT headerItemRect;
645                 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
646
647                         m_header.GetItemRect(itemindex,&headerItemRect);
648                         viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
649                 }
650                 commentlist.OnDestroy();
651                 m_header.DestroyWindow();
652                 m_commentListWindow.DestroyWindow();
653                 return;
654
655         }
656
657         LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
658
659                 if(lParam->hwndFrom == m_header.m_hWnd){
660                         
661                         LPNMHEADER pNMHeader = (LPNMHEADER) lParam; 
662                         this->m_header.SetItem(pNMHeader->iItem,pNMHeader->pitem);
663                         
664                         m_commentListWindow.Invalidate();
665                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
666                         
667
668                 }
669
670                 return 0;
671         }
672
673         VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
674
675
676                 INT_PTR dy;
677                 SCROLLINFO hScrollInfo = {0};
678                 hScrollInfo.cbSize = sizeof(hScrollInfo);
679                 hScrollInfo.fMask = SIF_ALL;
680                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
681                 switch(loWParam){
682
683                 case SB_THUMBPOSITION:
684                 case SB_THUMBTRACK:
685                         dy = hiWParam - hScrollInfo.nPos;
686                         break;
687
688                 case SB_LINELEFT:
689                 case SB_PAGELEFT:
690
691                         dy = -1 * hScrollInfo.nPage;
692
693                         break;
694
695                 case SB_LINERIGHT:
696                 case SB_PAGERIGHT:
697
698                         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;
699
700                         break;
701
702                 default:
703                         dy = 0;
704                         break;
705
706                 }
707
708                 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
709
710
711                 if(dy != 0){
712                         hScrollInfo.nPos += dy;
713                         INT_PTR moveRange = -(hScrollInfo.nPos);
714
715                         HDWP hDwp = BeginDeferWindowPos(2);
716
717                         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
718                         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
719
720                         EndDeferWindowPos(hDwp);
721
722
723                         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
724                 }
725
726                 return;
727         }
728
729
730         VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
731
732                 INT_PTR dy;
733                 SCROLLINFO vScrollInfo = {0};
734                 vScrollInfo.fMask = SIF_ALL;
735
736
737                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
738
739                 switch(loWParam){
740
741
742                 case SB_THUMBPOSITION:
743                 case SB_THUMBTRACK:
744
745                         dy = hiWParam - vScrollInfo.nPos;
746
747                         break;
748
749                 case SB_LINEUP:
750
751                         dy = -1;
752                         break;
753
754                 case SB_LINEDOWN:
755
756                         dy = 1;
757
758                         break;
759
760                 case SB_PAGEUP:
761
762                         dy = -1 * vScrollInfo.nPage;
763
764                         break;
765
766                 case SB_PAGEDOWN:
767
768                         dy = vScrollInfo.nPage;
769
770                         break;
771
772
773                 case SB_TOP:
774
775                         dy = -vScrollInfo.nPos;
776
777                         break;
778
779                 case SB_BOTTOM:
780
781                         dy = vScrollInfo.nMax;
782
783                         break;
784
785                 default:
786
787                         dy = 0;
788
789                         break;
790
791                 }
792
793
794         
795
796                 if(dy != 0){
797
798                         vScrollInfo.nPos += dy;
799                         //              viewStartHeight = vScrollInfo.nPos;
800                         this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
801                         this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
802                         //this->SetScrollInfo(SB_VERT,&vScrollInfo);
803                         this->UpdateWindow();
804                         
805                         m_commentListWindow.Invalidate();
806                         this->m_commentListWindow.SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);        
807                 }
808
809
810
811                 return;
812         }
813
814         LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
815                 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);
816                 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTWINDOW);
817
818
819
820                 return 0;
821         }
822
823         VOID CCommentView::AddHeader(LPHEADERSINFO infos){
824
825
826                 m_header.SetFont(hHeaderFontNew);
827
828                 HDITEM item;
829                 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
830                 item.fmt = HDF_CENTER | HDF_STRING;
831
832
833                 for(UINT_PTR index = 0;index < infos->count ;++index){
834
835                         item.pszText = infos->columns[index];
836
837                         item.cxy =  infos->holizensize[index];
838                         m_header.AddItem(&item);
839                 }
840
841                 RECT itemRect;
842                 INT_PTR nMax = 0;
843                 UINT_PTR itemCount = m_header.GetItemCount();
844                 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
845
846                         m_header.GetItemRect(u_index,&itemRect);
847                         nMax += itemRect.right - itemRect.left;
848
849                 }
850
851                 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
852
853                 DecisionHorzSize();
854                 return;
855         }
856
857         VOID CCommentView::DecisionHorzSize(){
858
859                 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
860                 RECT bkWindowRect;
861                 this->GetClientRect(&bkWindowRect);
862                 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
863                 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
864
865                 EndDeferWindowPos(hWindowPosInfo);
866
867                 return;
868         }
869
870
871
872
873         //
874         //\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
875         ////////////////////////////////////////////////////////////////////
876
877         CCommentListWindow::CCommentListWindow(CCommentView &in_self):
878         self(in_self),
879         viewSellHeight(0)
880         {
881                 CFontHandle font = ::AtlGetDefaultGuiFont();
882                 LOGFONT logfont;
883                 font.GetLogFont(&logfont);
884                 logfont.lfUnderline = TRUE;
885                 
886                 linkFont.CreateFontIndirect(&logfont);
887         }
888
889         CCommentListWindow::~CCommentListWindow(){
890         }
891
892         VOID CCommentListWindow::OnSetProperty(){
893
894                 if(IsWindow() == TRUE)this->SetRedraw(FALSE);
895
896                 if(collLinePen.IsNull() == FALSE)collLinePen.DeleteObject();
897                 if(normalSellLinePen.IsNull() == FALSE)normalSellLinePen.DeleteObject();
898                 if(normalBkBrush.IsNull() == FALSE)normalBkBrush.DeleteObject();
899                 if(selectSellLinePen.IsNull() ==FALSE)selectSellLinePen.DeleteObject();
900                 if(selectBkBrush.IsNull() == FALSE)selectBkBrush.DeleteObject();
901
902                 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
903                 normalSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.normalSellLineColor);
904                 normalBkBrush.CreateSolidBrush(self.viewproperty.backColor);
905                 selectSellLinePen.CreatePen(PS_SOLID,1,self.viewproperty.selectSellLineColor);
906                 selectBkBrush.CreateSolidBrush(self.viewproperty.selectBackColor);
907
908
909                 if(IsWindow() == TRUE)this->SetRedraw(TRUE);
910         }
911
912
913         VOID CCommentListWindow::OnPaint(HDC in_hdc){
914
915                 this->self.refAuth.GetUserSession();
916                 RECT windowRect;
917                 RECT listRect = {0};
918                 RECT clientRect;
919
920                 self.GetClientRect(&clientRect);
921                 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
922
923                 this->GetWindowRect(&windowRect);
924                 windowRect.right -= windowRect.left;
925                 windowRect.bottom -= windowRect.top;
926                 windowRect.left = 0;
927                 windowRect.top = 0;
928
929
930                 CPaintDC pdc(*this);
931
932                 {
933                         CMemoryDC mdc(pdc,windowRect);
934                         mdc.SelectFont(AtlGetDefaultGuiFont());
935
936
937                         CCommentList &commentList = self.commentlist;
938
939                         BOOL selectFlag = FALSE;
940                         CCommentList::iterator selectData;
941                         RECT selectRect = {0};
942         
943
944
945                         if(commentList.Size() > 0){
946
947                                 listRect = windowRect;
948                                 listRect.right = self.GetColumnHolSizeSum();            
949
950                                 CCommentList::iterator chatData = commentList.GetShortCut();
951
952                         
953                                 
954                                 
955                                 mdc.FillRect(&listRect,this->normalBkBrush);
956                                 
957                                 CCommentList::iterator endData = commentList.end();
958                                 listRect.bottom = 0;
959                                 
960                                 RECT headerRects[COMMENTVIEW_HEADERITEMSIZE];
961                                 RECT colLineRects[COMMENTVIEW_HEADERITEMSIZE];
962                                 RECT selectHeaderRects[COMMENTVIEW_HEADERITEMSIZE];
963                                 
964                                 self.m_header.GetItemRect(CCommentView::NO,&headerRects[CCommentView::NO]);
965                                 self.m_header.GetItemRect(CCommentView::USERNAME,&headerRects[CCommentView::USERNAME]);
966                                 self.m_header.GetItemRect(CCommentView::COMMENT,&headerRects[CCommentView::COMMENT]);
967                                 self.m_header.GetItemRect(CCommentView::TIME,&headerRects[CCommentView::TIME]);
968                                 self.m_header.GetItemRect(CCommentView::INFO,&headerRects[CCommentView::INFO]);
969
970                                 memcpy(colLineRects,headerRects,sizeof(headerRects));
971
972                                 
973                                 
974                                 
975                 
976                                 headerRects[CCommentView::NO].left += SELL_SPACE_LENGTH;
977                                 headerRects[CCommentView::USERNAME].left += SELL_SPACE_LENGTH;
978                                 headerRects[CCommentView::COMMENT].left += SELL_SPACE_LENGTH;
979                                 headerRects[CCommentView::TIME].left += SELL_SPACE_LENGTH;
980                                 headerRects[CCommentView::INFO].left += SELL_SPACE_LENGTH;
981
982                                 headerRects[CCommentView::NO].right -= SELL_SPACE_LENGTH;
983                                 headerRects[CCommentView::USERNAME].right -= SELL_SPACE_LENGTH;
984                                 headerRects[CCommentView::COMMENT].right -= SELL_SPACE_LENGTH;
985                                 headerRects[CCommentView::TIME].right -= SELL_SPACE_LENGTH;
986                                 headerRects[CCommentView::INFO].right -= SELL_SPACE_LENGTH;
987
988                                 headerRects[CCommentView::NO].top = SELL_SPACE_LENGTH;
989                                 headerRects[CCommentView::USERNAME].top = SELL_SPACE_LENGTH;
990                                 headerRects[CCommentView::COMMENT].top = SELL_SPACE_LENGTH;
991                                 headerRects[CCommentView::TIME].top = SELL_SPACE_LENGTH;
992                                 headerRects[CCommentView::INFO].top = SELL_SPACE_LENGTH;
993
994                                 headerRects[CCommentView::NO].bottom = SELL_SPACE_LENGTH;
995                                 headerRects[CCommentView::USERNAME].bottom = SELL_SPACE_LENGTH;
996                                 headerRects[CCommentView::COMMENT].bottom = SELL_SPACE_LENGTH;
997                                 headerRects[CCommentView::TIME].bottom = SELL_SPACE_LENGTH;
998                                 headerRects[CCommentView::INFO].bottom = SELL_SPACE_LENGTH;
999
1000                                 INT_PTR listRectTop = listRect.top;
1001                                 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
1002                                         CalcItemHeight(*chatData);
1003
1004 //                                      dumpln(TEXT("height:%d"),chatData->viewData.height);
1005                                         listRect.bottom += chatData->viewData.height;
1006
1007                                         headerRects[CCommentView::NO].top = listRect.top + SELL_SPACE_LENGTH;
1008                                         headerRects[CCommentView::USERNAME].top = listRect.top + SELL_SPACE_LENGTH;
1009                                         headerRects[CCommentView::COMMENT].top = listRect.top + SELL_SPACE_LENGTH;
1010                                         headerRects[CCommentView::TIME].top = listRect.top + SELL_SPACE_LENGTH;
1011                                         headerRects[CCommentView::INFO].top = listRect.top + SELL_SPACE_LENGTH;
1012
1013                                         headerRects[CCommentView::NO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1014                                         headerRects[CCommentView::USERNAME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1015                                         headerRects[CCommentView::COMMENT].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1016                                         headerRects[CCommentView::TIME].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1017                                         headerRects[CCommentView::INFO].bottom = listRect.bottom - SELL_SPACE_LENGTH;
1018
1019                                         if(chatData->viewData.selectFlag == TRUE){
1020                                                 selectFlag = TRUE;
1021                                                 selectData = chatData;
1022                                                 selectRect = listRect;
1023                                                 memcpy(selectHeaderRects,headerRects,sizeof(headerRects));
1024                                         } else {
1025
1026                                                 
1027
1028
1029                                                 this->DrawItem(mdc,listRect,headerRects,*chatData);
1030                                         }
1031
1032
1033                                         listRect.top = listRect.bottom;
1034                                 }
1035
1036                                 viewSellHeight = listRect.bottom;
1037
1038
1039
1040                                 if(selectFlag == TRUE){
1041                                         this->DrawItem(mdc,selectRect,selectHeaderRects,*selectData);
1042                                 }
1043
1044                                         //\8d\80\96Ú\82Ì\8fc\90ü\82ð\95`\89æ
1045                                 mdc.SelectPen(collLinePen);
1046                                 mdc.MoveTo(colLineRects[CCommentView::NO].right,listRectTop);
1047                                 mdc.LineTo(colLineRects[CCommentView::NO].right,listRect.bottom);
1048                                 mdc.MoveTo(colLineRects[CCommentView::USERNAME].right,listRectTop);
1049                                 mdc.LineTo(colLineRects[CCommentView::USERNAME].right,listRect.bottom);
1050                                 mdc.MoveTo(colLineRects[CCommentView::COMMENT].right,listRectTop);
1051                                 mdc.LineTo(colLineRects[CCommentView::COMMENT].right,listRect.bottom);
1052                                 mdc.MoveTo(colLineRects[CCommentView::TIME].right,listRectTop);
1053                                 mdc.LineTo(colLineRects[CCommentView::TIME].right,listRect.bottom);
1054                                 mdc.MoveTo(colLineRects[CCommentView::INFO].right,listRectTop);
1055                                 mdc.LineTo(colLineRects[CCommentView::INFO].right,listRect.bottom);
1056
1057                         }
1058                         windowRect.left = listRect.right;
1059                         mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
1060
1061
1062
1063
1064                 }
1065                 
1066
1067                 
1068
1069                 return;
1070         }
1071
1072
1073         LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
1074
1075
1076
1077                 self.chatChildCtrlsList.ShowCntrls();
1078
1079
1080
1081                 return 0;
1082         }
1083
1084         VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
1085
1086
1087                 SCROLLINFO vScrollInfo = {0};
1088                 vScrollInfo.fMask = SIF_ALL;
1089
1090
1091                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1092                 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
1093                 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
1094
1095                 vScrollInfo.fMask = SIF_PAGE;
1096                 self.SetScrollInfo(SB_VERT,&vScrollInfo);
1097
1098
1099
1100                 if(scrollFlag == TRUE){
1101                         self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
1102                 }
1103
1104                 this->Invalidate();
1105                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1106
1107                 return;
1108         }
1109
1110
1111         UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
1112
1113                 RECT clientRect;
1114                 INT_PTR rslt = 0;
1115                 LONG height = 0;
1116                 this->GetClientRect(&clientRect);
1117
1118                 SCROLLINFO vScrollInfo = {0};
1119                 if(self.commentlist.empty() != TRUE){
1120
1121                         CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
1122                         CCommentList::reverse_iterator rend = self.commentlist.rend();
1123                         for(;rbegin != rend;++rbegin){
1124                                 CalcItemHeight(*rbegin);
1125                                 height += rbegin->viewData.height;
1126                                 rslt++;
1127                                 if(height > clientRect.bottom)goto overclientrect;
1128
1129                         }
1130                 }
1131                 /*
1132                 vScrollInfo.fMask = SIF_RANGE;
1133                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1134                 */
1135                 rslt = nMax+ 1;
1136
1137
1138 overclientrect:
1139
1140                 return rslt;
1141         }
1142
1143         VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,const RECT *headerRect,CChatData &chatData){
1144
1145
1146                 RECT noViewRect = headerRect[CCommentView::NO];                                                                         //\83R\83\81\94Ô\95\\8e¦\97Ì\88æ
1147                 RECT userNameViewRect = headerRect[CCommentView::USERNAME];                                                     //\83\86\81[\83U\96¼\95\\8e¦\97Ì\88æ
1148                 RECT chatViewRect = headerRect[CCommentView::COMMENT];                                                          //\83R\83\81\83\93\83g\95\\8e¦\97Ì\88æ
1149                 RECT timeViewRect = headerRect[CCommentView::TIME];                                                                     //\8e\9e\8aÔ\95\\8e¦\97Ì\88æ  
1150                 RECT infoViewRect  = headerRect[CCommentView::INFO];                                                                    //\83R\83\81\83\93\83g\8fî\95ñ\95\\8e¦\97Ì\88æ
1151
1152
1153                 //
1154                 //\83R\83\81\83\93\83g\8e\9e\8aÔ\95\\8e¦\97p\95\8e\9a\97ñ\8dì\90¬
1155                 //
1156                 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
1157
1158
1159                 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
1160                 TCHAR noString[sizeof(chatData.no) * 8]; 
1161                 TCHAR dateString[LENGTH_16];
1162                 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
1163                 else _tcscpy(noString,TEXT(""));
1164                 CNLiteString timeFormat;
1165
1166
1167                 if(beforeStartFlag == TRUE){
1168
1169                         timeFormat = TEXT("-");
1170                         chatTime = -chatTime;
1171                 }
1172                 tm ct = *gmtime(&chatTime);
1173                 if(ct.tm_hour != 0 ){
1174
1175                         timeFormat += TEXT("%H:%M:%S");
1176
1177                 } else {
1178
1179                         timeFormat += TEXT("%M:%S");
1180                 }
1181
1182                 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
1183
1184
1185                 COLORREF bkColor;                                                                                                       //\94w\8ci\90F
1186                 CPen originSellLinePen;                                                                                                 //\98g\90ü\95`\89æ\97p\83y\83\93
1187                 CBrush originBkBrush;                                                                                                           //\94w\8ci\95`\89æ\97p\83u\83\89\83V
1188                 
1189                 //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
1190                 if (chatData.viewData.selectFlag == TRUE)
1191                 {
1192                         bkColor = self.viewproperty.selectBackColor;
1193                         
1194                         dc.SelectBrush(this->selectBkBrush);
1195                         dc.SelectPen(this->selectSellLinePen);
1196                 }
1197                 else  
1198                 {
1199
1200                         if(chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR){
1201                                 dc.SelectPen(this->normalSellLinePen);
1202
1203                         } else {
1204
1205                                 originSellLinePen.CreatePen(PS_SOLID,1,chatData.viewData.sellLineColor);
1206                                 dc.SelectPen(originSellLinePen);
1207                         }
1208
1209                         
1210
1211                         if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR || chatData.listenerData->originBkFlag == TRUE){
1212                         
1213                                 if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1214                                         bkColor = chatData.viewData.backColor;
1215                                         originBkBrush.CreateSolidBrush(chatData.viewData.backColor);
1216                                 
1217                                 }else if(chatData.listenerData->originBkFlag == TRUE){
1218
1219                                         bkColor = chatData.listenerData->bkColor;
1220                                         originBkBrush.CreateSolidBrush(chatData.listenerData->bkColor);
1221                                         
1222                                 }
1223
1224                                 dc.SelectBrush(originBkBrush);
1225                         } else {
1226
1227                                 bkColor = self.viewproperty.backColor;
1228                                 dc.SelectBrush(this->normalBkBrush);
1229                                 dc.SelectBrush(this->normalBkBrush);
1230
1231
1232                         }
1233                 }
1234                 
1235                 //\94w\8ci\82Æ\98g\90ü\82ð\95`\89æ
1236                 
1237                 
1238                 dc.Rectangle(rc.left,rc.top  - 1,rc.right ,rc.bottom + 1);
1239                 dc.SetBkColor(bkColor);
1240                 
1241
1242                 //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
1243
1244
1245                 
1246                 
1247                 
1248                 dc.SelectFont(linkFont);
1249                 dc.SetTextColor(self.viewproperty.linkStringColor);
1250                 //\83e\83L\83X\83g\95`\89æ
1251                 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1252                 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1253
1254                 dc.SelectFont(::AtlGetDefaultGuiFont());
1255                 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1256                 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1257
1258                 return;
1259         }
1260
1261         VOID CCommentListWindow::ResetViewSellHeight(){
1262
1263                 viewSellHeight = 0;
1264
1265                 return;
1266         }
1267
1268
1269         VOID CCommentListWindow::ShowCurSel(){
1270
1271                 auto end = self.commentlist.end();
1272                 INT_PTR cursel = self.commentlist.GetCurSelNo();
1273                 if(cursel == -1)goto end;
1274
1275                 SCROLLINFO vScrollInfo;
1276                 vScrollInfo.cbSize = sizeof(vScrollInfo);
1277                 vScrollInfo.fMask = SIF_ALL;
1278                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1279                 
1280                 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1281                         self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1282                         self.commentlist.SetShortCut(self.GetScrollPos(SB_VERT));
1283                 }
1284
1285                 this->Invalidate();
1286
1287                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1288 end:
1289
1290                 return;
1291         }
1292
1293
1294
1295         VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1296                 
1297                 if(chatData.viewData.height == 0){
1298                         RECT drowSize;
1299                         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1300                 
1301                         drowSize.bottom = 0;
1302
1303                         CChatReadEdit cedit(self);
1304                 
1305                         cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1306                         cedit.Reset();
1307                         cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1308                         cedit.SetWindowText(chatData);
1309                         cedit.GetClientRect(&drowSize);
1310                         cedit.DestroyWindow();
1311                         drowSize.bottom += 12;
1312                         if(drowSize.bottom - drowSize.top > 120)drowSize.bottom = drowSize.top + 120;
1313                         chatData.viewData.height = drowSize.bottom - drowSize.top;
1314                 }
1315
1316                 return ;
1317         }
1318
1319
1320
1321         LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1322                 
1323                 //CComPtr<IUnknown> iu;
1324                 //::AtlAxCreateControlEx(TEXT("MSHTML:<HTML><BODY></BODY></HTML>"),*this,(IStream*)NULL,(IUnknown**)NULL,&iu,GUID_NULL);
1325
1326                 //iu->QueryInterface(DIID_DWebBrowserEvents2,&addToMyListWindow);
1327                 RECT rc = {0,0,300,200};
1328 //              addToMyListWindow.Create(m_hWnd, &rc,_T("Shell.Explorer.2"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN , 0);
1329
1330                 return 0;
1331         }
1332
1333         CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1334
1335                 INT_PTR heightSum = 0;
1336
1337                 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1338                 CCommentList::iterator end  = self.commentlist.end();
1339
1340
1341                 
1342                 for(; chatData != end ;(++chatData)){
1343                         CalcItemHeight(*chatData);
1344                         heightSum += chatData->viewData.height;
1345
1346                         
1347                         if(heightSum >= height)break;
1348                 }
1349                 
1350
1351
1352
1353                 return chatData;
1354         }
1355
1356
1357         BOOL CCommentListWindow::IsOnNoOrUserName(UINT_PTR index,const POINT &point){
1358
1359                 RECT rc = {0};
1360                 
1361                 self.m_header.GetItemRect(index,&rc);
1362                 BOOL rslt = FALSE;
1363
1364                 if((point.x >= rc.left && point.x <= rc.right) && (point.y < static_cast<INT_PTR>(viewSellHeight))){
1365
1366                         INT_PTR heightsum = 0;
1367                         auto clickData = self.commentlist.GetShortCut();
1368                         auto endData = self.commentlist.end();
1369                         for(;clickData != endData;++clickData){
1370
1371                                 heightsum += clickData->viewData.height;
1372
1373                                 if(heightsum > point.y){
1374                                         
1375                                         CDC cdc = this->GetDC();
1376                                         
1377                                         rc.top = heightsum -= clickData->viewData.height;
1378                                         RECT calcRect = {0};
1379                                         cdc.SelectFont(linkFont);
1380
1381
1382                                         if(index == CCommentView::USERNAME){
1383                                                 LPCTSTR viewStr = clickData->listenerData->userName.Length() == 0 ? clickData->listenerData->user_id : clickData->listenerData->userName;
1384                                                 cdc.DrawTextW(viewStr ,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1385                                         
1386                                         } else if(index == CCommentView::NO){
1387                                                 TCHAR viewStr[sizeof(UINT_PTR) * 8];
1388                                                 _stprintf(viewStr,TEXT("%d"),clickData->no);
1389                                                 cdc.DrawTextW(viewStr,_tcslen(viewStr),&calcRect,DT_CALCRECT);
1390
1391                                         }
1392                                         rc.bottom = rc.top +  calcRect.bottom - calcRect.top;
1393                                         rc.right = rc.right > rc.left + calcRect.right - calcRect.left ? rc.left + calcRect.right - calcRect.left : rc.right;
1394                                         rslt = (point.y >= rc.top && point.y <= rc.bottom && point.x >= rc.left && point.x <= rc.right);
1395                                         
1396                                         break;
1397
1398                                 }
1399                         }
1400                         
1401                 }
1402
1403                 return rslt;
1404
1405         }
1406
1407
1408         VOID CCommentListWindow::OnDestroy(){
1409
1410 //              this->addToMyListWindow.DestroyWindow();
1411
1412         }
1413
1414         VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1415
1416
1417
1418                 CCommentList::iterator ite;
1419                 this->SetFocus();
1420                 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1421
1422                 
1423                 if(self.commentlist.empty() == TRUE)goto end;
1424                 
1425                 ite = CalcClickLine(point.y);
1426                 self.commentlist.SetCurSel(ite);
1427                 
1428                 if(this->IsOnNoOrUserName(CCommentView::NO,point) == TRUE){
1429
1430                         ::SendMessage(self,UM_CLICK_CHATNO,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
1431
1432                 } else if(this->IsOnNoOrUserName(CCommentView::USERNAME,point) == TRUE){
1433
1434                         ::SendMessage(self,UM_CLICK_USERNAME,(WPARAM)&(*ite),(LPARAM)self.m_hWnd);
1435                 }
1436
1437
1438                 
1439
1440 end:
1441                 this->Invalidate();
1442                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1443
1444                 return;
1445         }
1446
1447
1448         VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1449
1450
1451
1452                 if(!(point.x > (INT_PTR)self.GetColumnHolSizeSum() || self.commentlist.empty() == TRUE)){
1453                 
1454                         auto end  = self.commentlist.end();
1455                         auto lineIte = CalcClickLine(point.y);
1456                         if( lineIte == end)goto  endlabel;
1457                 
1458                 
1459                         COLORREF bkColor;
1460                         if(lineIte->listenerData->originBkFlag == FALSE){
1461                                 CListenerColorCollector colorCollector;
1462                                 listenerList.BkColorCollect(colorCollector);
1463                                 UCHAR red;
1464                                 UCHAR green;
1465                                 UCHAR blue;
1466
1467                                 srand((unsigned int)time(NULL));
1468                                 do{
1469
1470                                         red = getrgb();
1471                                         green = getrgb();
1472                                         blue = getrgb();
1473                                         bkColor = PALETTERGB(red,green,blue);
1474
1475                                 }while(colorCollector.Find(bkColor));
1476
1477                                 lineIte->listenerData->originBkFlag = TRUE;
1478                                 lineIte->listenerData->SetBkColor(bkColor);
1479                         } else {
1480
1481
1482                                 lineIte->listenerData->originBkFlag = FALSE;
1483                         }
1484                 }
1485
1486
1487
1488
1489
1490 endlabel:
1491
1492
1493                 this->Invalidate(TRUE);
1494
1495                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1496                 return;
1497         }
1498
1499         LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1500
1501                 return TRUE;
1502         }
1503
1504         VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1505
1506                 INT_PTR dy = 0;
1507                 switch(vKey){
1508
1509                 case VK_DOWN:
1510                 case VK_RETURN:
1511                         dy = 1;
1512
1513                         break;
1514                 case VK_UP:
1515
1516                         dy = -1;
1517                         break;
1518                 default:
1519                         break;
1520
1521
1522                 }
1523
1524                 
1525                 
1526
1527                 auto cursel = self.commentlist.GetCurSel();
1528                 if((dy < 0 && cursel == self.commentlist.begin())  || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1529
1530                 
1531                 std::advance(cursel,dy);
1532                 self.commentlist.SetCurSel(cursel);
1533
1534                 this->ShowCurSel();
1535 end:
1536
1537                                         
1538                 return;
1539         }
1540
1541         LRESULT CCommentListWindow::OnSetCursor(HWND wparam,UINT loLparam,UINT hiLparam){
1542
1543                 
1544                 POINT mousePoint = {0};
1545         
1546                 GetCursorPos(&mousePoint);
1547                 ::ScreenToClient(*this,&mousePoint);
1548                 
1549                 if(/*static_cast<INT>(loLparam) == 1 &&*/( IsOnNoOrUserName(CCommentView::NO,mousePoint) || IsOnNoOrUserName(CCommentView::USERNAME,mousePoint))){
1550                         
1551                         
1552                         ::SetCursor(::LoadCursorW(NULL,IDC_HAND));
1553
1554                 } else {
1555
1556                         DefWindowProc ();
1557
1558                 }
1559                 
1560
1561                 
1562         
1563
1564                 return FALSE;
1565         }
1566
1567         LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1568
1569
1570                 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1571
1572
1573                 return 0;
1574         }
1575
1576
1577         LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1578
1579                 LRESULT rslt = 0;
1580
1581                 switch(lParam->code){
1582
1583                 case EN_LINK:
1584                         {
1585                                 ENLINK *lpenlk = (ENLINK *)lParam;
1586                                 if (lpenlk->msg == WM_LBUTTONDOWN) {
1587                                         CRichEditCtrl chatReadEdit = lpenlk->nmhdr.hwndFrom;
1588                                         chatReadEdit.SetSel(lpenlk->chrg);
1589                                         CString selTextBuf;
1590                                         chatReadEdit.GetSelText(selTextBuf);
1591                                         if(regex_match((LPCTSTR)selTextBuf,nliteregex::URL) == TRUE){
1592
1593                                                 
1594                                                 
1595
1596                                         } else if(regex_match((LPCTSTR)selTextBuf,nliteregex::VIDEOID) == TRUE){
1597                                                 
1598                                                 selTextBuf.Insert(0,ADDMYLIST_PART);
1599                                 
1600                                         } else if( regex_match((LPCTSTR)selTextBuf,nliteregex::LIVEID) == TRUE){
1601                                                 
1602                                                 selTextBuf.Insert(0,LIVEURL_PART);
1603                                                 
1604                                         }
1605                                         
1606                                         OpenURL(*this,self.generalProperty,selTextBuf,SW_SHOWNORMAL);
1607                                 }
1608                         }
1609                         break;
1610
1611                 case EN_MSGFILTER:
1612                         {
1613                                 auto pmf = (MSGFILTER *)lParam;
1614                                 if (pmf->msg == WM_LBUTTONDOWN || pmf->msg== WM_LBUTTONDBLCLK || pmf->msg == WM_MOUSEWHEEL){
1615
1616                                         RECT  windowrect;
1617                                         ::GetWindowRect(pmf->nmhdr.hwndFrom,&windowrect);
1618                                         _WTYPES_NS::CPoint point(windowrect.left +  LOWORD(pmf->lParam),windowrect.top + HIWORD(pmf->lParam));
1619                                         ::ScreenToClient(*this,&point);
1620
1621                                         switch(pmf->msg){
1622
1623                                         case WM_LBUTTONDOWN:
1624                                                 OnLButtonDown(pmf->wParam,point);
1625                                                 break;
1626
1627                                         case WM_LBUTTONDBLCLK:
1628                                                 OnLButtonDblClk(pmf->wParam,point);
1629                                                 break;
1630
1631                                         case WM_MOUSEWHEEL:
1632                                                 OnMouseWheel(LOWORD(pmf->wParam),HIWORD(pmf->wParam),point);
1633                                                 break;
1634
1635                                         default:
1636
1637                                                 break;
1638                                         }
1639                                         
1640                                 } 
1641
1642                                         
1643
1644                                 
1645             }
1646                         break;
1647
1648
1649                 default:
1650
1651                         break;
1652
1653                 }
1654
1655
1656                 return rslt;
1657         }
1658
1659         LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1660
1661                 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1662                 ::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);
1663                 return 0;
1664         }
1665
1666 }