OSDN Git Service

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